commit fd02cc3e127575c723acc42ec2713ad09796bdb3 Author: cpi Date: Wed Apr 29 23:48:00 2020 +0800 launcher deot diff --git a/.cpirc b/.cpirc new file mode 100644 index 0000000..28838b1 --- /dev/null +++ b/.cpirc @@ -0,0 +1,27 @@ +SCREEN=`cat /sys/class/graphics/fb0/modes` + +XORG_CONF="~/launcher/.xorg.conf" +if [ -f /home/cpi/.lima ] +then +XORG_CONF="~/launcher/.xorg_lima.conf" +fi + +if [ -f /tmp/autologin ] +then + rm -f /tmp/autologin + mpd ~/.mpd.conf + if [[ $SCREEN =~ .*320.* ]] + then + while : + do + startx /home/cpi/launcher/.xinitrc -- -xf86config $XORG_CONF -nocursor > /tmp/x.log 2>&1 + sleep 1 + done + else + while : + do + startx /home/cpi/launcher/.xinitrc hdmi -- -xf86config $XORG_CONF > /tmp/x.log 2>&1 + sleep 1 + done + fi +fi diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..007206a --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +retroarch-core-options.cfg +*.lpl +*.swp +.bsv +*.pyc +sys.py/.powerlevel +sys.py/.buttonslayout +sys.py/.lang +*.cfg +**/Jobs/* +!**/Jobs/.gitkeep +!**/Jobs/00_lowpower.sh +!**/Jobs/00_lowpower.alias +.done +bios +bios/* +screenshots +screenshots/* +.pcsx +.pcsx/* +*.log +.DS_Store +sys.py/.* +sys.py/*.db diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..9a1f2ab --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "sys.py/pyaria2_rpc"] + path = sys.py/pyaria2_rpc + url = https://github.com/cuu/pyaria2_rpc.git diff --git a/.twm/Bach b/.twm/Bach new file mode 100644 index 0000000..2407db7 --- /dev/null +++ b/.twm/Bach @@ -0,0 +1,38 @@ +#define Bach_width 51 +#define Bach_height 60 +static unsigned char Bach_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0xfe, + 0xf3, 0x07, 0x00, 0xf8, 0x00, 0x80, 0xff, 0xff, 0x1f, 0x00, 0xf8, 0x00, + 0xe0, 0xff, 0xff, 0x3f, 0x00, 0xf8, 0x00, 0xf0, 0xff, 0xff, 0x7f, 0x00, + 0xf8, 0x00, 0xf8, 0xff, 0xff, 0xff, 0x00, 0xf8, 0x00, 0xf8, 0xff, 0xff, + 0xff, 0x01, 0xf8, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x01, 0xf8, 0x00, 0xfe, + 0xff, 0xff, 0xff, 0x03, 0xf8, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x07, 0xf8, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x07, 0xf8, 0x80, 0xff, 0xff, 0xff, 0xbf, + 0x07, 0xf8, 0x80, 0xff, 0xff, 0xff, 0x7f, 0x0f, 0xf8, 0x80, 0xff, 0xff, + 0xff, 0x3f, 0x0f, 0xf8, 0xc0, 0xff, 0xff, 0xff, 0x3f, 0x06, 0xf8, 0xc0, + 0xff, 0xff, 0xff, 0x3f, 0x0e, 0xf8, 0xc0, 0xff, 0xff, 0xff, 0x7f, 0x1e, + 0xf8, 0xc0, 0xff, 0xff, 0xff, 0x7f, 0x1c, 0xf8, 0xc0, 0xff, 0xff, 0xff, + 0x7f, 0x3c, 0xf8, 0xc0, 0xff, 0xff, 0xff, 0x1f, 0x3c, 0xf8, 0xc0, 0xff, + 0xff, 0xf8, 0x0f, 0x38, 0xf8, 0xc0, 0xff, 0xff, 0xc7, 0x23, 0x38, 0xf8, + 0xe0, 0xff, 0xff, 0xc3, 0x01, 0x38, 0xf8, 0xe0, 0xff, 0xff, 0xf9, 0x03, + 0x38, 0xf8, 0xe0, 0xff, 0xff, 0xff, 0x3b, 0x18, 0xf8, 0xc0, 0xff, 0xfb, + 0xff, 0x33, 0x00, 0xf8, 0xc0, 0xff, 0xff, 0xff, 0xf7, 0x30, 0xf8, 0xe0, + 0xff, 0xfd, 0xff, 0xe7, 0x00, 0xf8, 0xe0, 0xff, 0xfd, 0xff, 0x6f, 0x30, + 0xf8, 0xc0, 0xff, 0xfc, 0xff, 0x67, 0x00, 0xf8, 0x80, 0xff, 0xfc, 0x7f, + 0xc0, 0x00, 0xf8, 0xc0, 0xff, 0xf8, 0xff, 0x41, 0x00, 0xf8, 0xc0, 0xff, + 0xf8, 0xff, 0x03, 0x00, 0xf8, 0x80, 0x7c, 0xf8, 0xff, 0x07, 0x00, 0xf8, + 0x00, 0x7e, 0xf8, 0xff, 0x43, 0x00, 0xf8, 0x00, 0x7e, 0xf8, 0x0f, 0x00, + 0x00, 0xf8, 0x00, 0x37, 0xf0, 0xff, 0x07, 0x00, 0xf8, 0x00, 0x63, 0xf0, + 0xff, 0x01, 0x00, 0xf8, 0x00, 0x27, 0xf0, 0xff, 0x07, 0x00, 0xf8, 0x00, + 0x06, 0xe0, 0xff, 0x0f, 0x00, 0xf8, 0x00, 0x02, 0x40, 0xff, 0x0f, 0x00, + 0xf8, 0x00, 0x00, 0x90, 0xf1, 0x07, 0x00, 0xf8, 0x00, 0x00, 0x30, 0xff, + 0x01, 0x00, 0xf8, 0x00, 0x00, 0xf0, 0x7e, 0x00, 0x00, 0xf8, 0x00, 0x00, + 0xf0, 0x7b, 0x00, 0x00, 0xf8, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xf8, + 0x00, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0xf8, 0x00, 0x00, 0xe0, 0xff, 0x01, + 0x00, 0xf8, 0x00, 0x00, 0xe0, 0xff, 0x0f, 0x00, 0xf8, 0x00, 0x00, 0xc0, + 0xff, 0x0f, 0x00, 0xf8, 0x00, 0x00, 0xc0, 0xff, 0x07, 0x00, 0xf8, 0x00, + 0x00, 0x80, 0xff, 0x03, 0x00, 0xf8, 0x00, 0x00, 0x80, 0xff, 0x00, 0x00, + 0xf8, 0x00, 0x00, 0x80, 0xff, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x7f, + 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0xf8, 0x00, 0x00, + 0x00, 0x1f, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0xf8}; diff --git a/.twm/Escher b/.twm/Escher new file mode 100644 index 0000000..8b74048 --- /dev/null +++ b/.twm/Escher @@ -0,0 +1,62 @@ +#define Escher_width 101 +#define Escher_height 54 +static unsigned char Escher_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x01, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x01, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7e, 0x07, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x7f, 0x06, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0x0f, 0x06, 0x00, 0x00, 0x00, 0xe0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x1f, 0x02, 0x00, 0x00, 0x00, 0xe0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x03, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xbf, 0x80, 0x7f, 0x00, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x03, 0xfe, 0xff, 0x0f, + 0x00, 0x00, 0xe0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xe0, 0xff, 0xff, + 0x7f, 0x00, 0x00, 0xe0, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x3f, 0xfc, 0x7f, + 0x7f, 0xfc, 0x03, 0x00, 0xe0, 0xf8, 0x07, 0x00, 0x00, 0xc0, 0x87, 0xff, + 0x6f, 0x5f, 0xee, 0x0f, 0x00, 0xe0, 0xf8, 0x1f, 0x00, 0x00, 0xf0, 0xf1, + 0xff, 0xf9, 0xe9, 0xfc, 0x3e, 0x00, 0xe0, 0xf8, 0x3f, 0x00, 0x00, 0x3c, + 0xf8, 0xaf, 0xe8, 0x1d, 0xe0, 0x70, 0x00, 0xe0, 0xf8, 0x7f, 0x00, 0x00, + 0x3e, 0xbf, 0xac, 0x88, 0x1f, 0x00, 0x3e, 0x00, 0xe0, 0xf0, 0x0f, 0x00, + 0x00, 0x97, 0x3f, 0xac, 0xc2, 0x81, 0x01, 0xbf, 0x03, 0xe0, 0xf0, 0x1f, + 0x00, 0xc0, 0xe7, 0xa3, 0x00, 0xca, 0x15, 0x80, 0xc7, 0x07, 0xe0, 0xe0, + 0x1f, 0x00, 0x80, 0xf1, 0x02, 0x4a, 0x88, 0x50, 0x80, 0xe3, 0x0c, 0xe0, + 0xc0, 0x1f, 0x1c, 0x00, 0x3c, 0x08, 0x28, 0x55, 0x20, 0xc0, 0xf1, 0x3f, + 0xe0, 0xc0, 0x1f, 0xf0, 0x80, 0x0f, 0x68, 0x51, 0x50, 0xb4, 0xe0, 0xb1, + 0x7e, 0xe0, 0x80, 0x1f, 0xc0, 0xff, 0x03, 0x80, 0x54, 0x29, 0x00, 0xe8, + 0xb9, 0xfc, 0xe0, 0x00, 0x3f, 0x82, 0x3f, 0x28, 0x15, 0x00, 0x20, 0x2a, + 0xe0, 0xb9, 0xe7, 0xe1, 0x00, 0x3e, 0x0a, 0x20, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0xe2, 0x79, 0xb3, 0xe3, 0x00, 0x3e, 0x80, 0x00, 0x40, 0x08, 0x80, + 0x40, 0x01, 0xe0, 0xf9, 0xb8, 0xe3, 0x00, 0x3e, 0x01, 0x00, 0x50, 0x08, + 0x00, 0x08, 0x40, 0xe0, 0xf9, 0xff, 0xe1, 0x00, 0x3e, 0x01, 0x00, 0x00, + 0x00, 0x50, 0x81, 0xf0, 0xc3, 0xf9, 0xee, 0xe0, 0x00, 0x1e, 0x02, 0x08, + 0x0a, 0x01, 0x00, 0x20, 0xf0, 0xc7, 0xfb, 0x7f, 0xe2, 0x00, 0x0f, 0x02, + 0xbc, 0x03, 0x00, 0x0a, 0x00, 0xf0, 0xc1, 0xfb, 0xbf, 0xe3, 0x80, 0x07, + 0xf0, 0xff, 0xc3, 0x02, 0x80, 0x41, 0xf1, 0x81, 0xf7, 0xf7, 0xe1, 0x80, + 0x07, 0x3c, 0xc0, 0xbf, 0x5c, 0x09, 0x40, 0xf0, 0x83, 0xff, 0x7f, 0xe0, + 0xc0, 0x13, 0x00, 0x00, 0xf8, 0x0f, 0x80, 0x92, 0xf0, 0x0f, 0x0f, 0x3e, + 0xe0, 0xe0, 0x1f, 0x00, 0x00, 0xe3, 0x5f, 0x21, 0x16, 0xe0, 0x2f, 0xfe, + 0x17, 0xe0, 0xf0, 0x1f, 0x00, 0x80, 0x01, 0xfe, 0x27, 0x0e, 0xe0, 0x27, + 0xf8, 0x10, 0xe0, 0xf0, 0x07, 0x00, 0x80, 0x1b, 0xf0, 0x07, 0xe8, 0x8a, + 0x15, 0x02, 0x00, 0xe0, 0xf8, 0x03, 0x00, 0x80, 0x1f, 0x80, 0xff, 0x6a, + 0x00, 0xc0, 0x01, 0x00, 0xe0, 0xf8, 0x0f, 0x00, 0x80, 0x0f, 0x00, 0xf8, + 0x3f, 0xfe, 0x7f, 0x00, 0x00, 0xe0, 0xf8, 0x07, 0x00, 0x00, 0x47, 0x00, + 0x00, 0x1c, 0xfc, 0x0f, 0x00, 0x00, 0xe0, 0xf8, 0x01, 0x00, 0x00, 0x3f, + 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xf8, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x08, 0x00, 0x00, 0x00, 0xe0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x07, 0x00, 0x00, 0x00, 0xe0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x07, 0x00, 0x00, 0x00, + 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x03, 0x00, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x01, 0x00, + 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0}; diff --git a/.twm/Linux64 b/.twm/Linux64 new file mode 100644 index 0000000..a225f00 --- /dev/null +++ b/.twm/Linux64 @@ -0,0 +1,46 @@ +#define Linux64_width 64 +#define Linux64_height 64 +static unsigned char Linux64_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0xf8, 0x1f, 0xfc, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x01, + 0xc0, 0xff, 0x00, 0x00, 0x00, 0x80, 0x7f, 0x00, 0x00, 0xfe, 0x01, 0x00, + 0x00, 0xc0, 0x1f, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, + 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xc0, 0x1f, 0x00, + 0x00, 0xf8, 0x01, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0xfc, 0x01, 0x00, + 0x00, 0x80, 0x7f, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, + 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x7f, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0x01, 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x03, + 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x03, 0xc0, 0x7f, 0x00, 0x00, + 0x00, 0x00, 0xfc, 0x07, 0xc0, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x07, + 0xe0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0f, 0xe0, 0x3f, 0x00, 0x00, + 0x00, 0x00, 0xf8, 0x0f, 0xe0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0f, + 0xf0, 0x3f, 0x00, 0x00, 0xe0, 0x01, 0xf0, 0x1f, 0xf0, 0x3f, 0xe0, 0x00, + 0xf8, 0x01, 0xf0, 0x1f, 0xf0, 0x3f, 0xf0, 0x01, 0xfc, 0x03, 0xf0, 0x1f, + 0xf0, 0x3f, 0xf8, 0x03, 0xfe, 0x03, 0xf0, 0x1f, 0xf8, 0x7f, 0x18, 0x07, + 0x0f, 0x07, 0xf0, 0x3f, 0xf8, 0x7f, 0x08, 0x07, 0x47, 0x0e, 0xf0, 0x3f, + 0xf8, 0x7f, 0x08, 0x06, 0x07, 0x0e, 0xf0, 0x3f, 0xf8, 0x7f, 0x88, 0x06, + 0x07, 0x0e, 0xf0, 0x3f, 0xf8, 0x7f, 0x08, 0x06, 0x06, 0x0e, 0xf0, 0x3f, + 0xf8, 0x7f, 0x08, 0xfe, 0x04, 0x0e, 0xf0, 0x3f, 0xf8, 0x7f, 0x18, 0x7c, + 0x06, 0x0e, 0xf0, 0x3f, 0xf8, 0xff, 0x30, 0xff, 0x9f, 0x07, 0xf0, 0x3f, + 0xf8, 0xff, 0x90, 0xff, 0x7f, 0x03, 0xf0, 0x3f, 0xf0, 0xff, 0xc0, 0xff, + 0xff, 0x03, 0xe0, 0x1f, 0xf0, 0xff, 0xc0, 0xff, 0xff, 0x07, 0xe0, 0x1f, + 0xf0, 0xff, 0xe0, 0xff, 0xff, 0x07, 0xe0, 0x1f, 0xf0, 0xff, 0xe0, 0xff, + 0x7f, 0x06, 0xe0, 0x1f, 0xe0, 0xff, 0xe0, 0xff, 0x9f, 0x07, 0xe0, 0x0f, + 0xe0, 0xff, 0xe0, 0xff, 0xcf, 0x07, 0xc0, 0x0f, 0xe0, 0xff, 0xc1, 0xff, + 0xf3, 0x01, 0xc0, 0x0f, 0xc0, 0xff, 0x01, 0x7f, 0x7c, 0x0c, 0xc0, 0x07, + 0xc0, 0xff, 0x19, 0x80, 0x9f, 0x0f, 0x80, 0x07, 0x80, 0xff, 0x39, 0xfc, + 0xc7, 0x0f, 0x00, 0x03, 0x80, 0xff, 0x78, 0x78, 0xf0, 0x1f, 0x00, 0x03, + 0x00, 0x7f, 0xf8, 0x00, 0xf8, 0x1f, 0x80, 0x01, 0x00, 0x3e, 0xf8, 0x03, + 0xfe, 0x3f, 0x80, 0x01, 0x00, 0x3e, 0xf8, 0xff, 0xff, 0x3f, 0xc0, 0x00, + 0x00, 0x1c, 0xf8, 0xff, 0xff, 0x7f, 0x60, 0x00, 0x00, 0x18, 0xfc, 0xff, + 0xff, 0x7f, 0x30, 0x00, 0x00, 0x30, 0xfc, 0xff, 0xff, 0xff, 0x18, 0x00, + 0x00, 0x60, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x00, 0x00, 0xc0, 0xff, 0xff, + 0xff, 0xff, 0x06, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, + 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, + 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, + 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/.twm/am b/.twm/am new file mode 100644 index 0000000..e8d28a1 --- /dev/null +++ b/.twm/am @@ -0,0 +1,14 @@ +#define am_width 32 +#define am_height 32 +static unsigned char am_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, + 0x63, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0x7f, 0x1f, 0x00, 0x7c, + 0x63, 0x3f, 0x00, 0x7e, 0x63, 0x7f, 0x00, 0x7f, 0x63, 0xff, 0x80, 0x7f, + 0x63, 0xff, 0xc1, 0x7f, 0x00, 0xff, 0xe3, 0x7f, 0x00, 0xff, 0xf7, 0x7f, + 0x00, 0xef, 0xff, 0x7b, 0x00, 0xcf, 0xff, 0x79, 0x00, 0x8f, 0xff, 0x78, + 0x00, 0x0f, 0x7f, 0x78, 0x00, 0x0f, 0x3e, 0x78, 0x00, 0x0f, 0x1c, 0x78, + 0x00, 0x0f, 0x08, 0x78, 0x00, 0x0f, 0x00, 0x78, 0x00, 0x0f, 0x00, 0x78, + 0x00, 0x0f, 0x00, 0x78, 0x00, 0x0f, 0x00, 0x78, 0x00, 0x0f, 0x00, 0x78, + 0x00, 0x0e, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/.twm/amule b/.twm/amule new file mode 100644 index 0000000..e924a85 --- /dev/null +++ b/.twm/amule @@ -0,0 +1,52 @@ +#define Untitled_width 57 +#define Untitled_height 73 +static unsigned char Untitled_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xf0, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xf0, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x1f, 0x00, 0xf8, 0x07, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0xf8, + 0x03, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0xfc, 0x03, 0x00, 0x00, 0x00, + 0x00, 0xfc, 0x01, 0xfc, 0x03, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x07, 0xfc, + 0x03, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x4f, 0xfe, 0x03, 0x00, 0x00, 0x00, + 0x00, 0xf8, 0xdf, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x9f, 0xff, + 0x01, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x9f, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x1f, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x8e, 0x0f, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0f, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x3f, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0x7e, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x3e, + 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0xce, 0x1f, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xce, 0xff, + 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x3f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, + 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, + 0xff, 0xff, 0x01, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0xc0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x03, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, + 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x80, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x01, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x80, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x01, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x01, 0x00, + 0x00, 0x1f, 0xfe, 0xff, 0xff, 0x40, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x3f, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x7f, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x7f, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xf8, 0xff, 0x07, 0xff, + 0xfb, 0xff, 0x7f, 0x00, 0xf8, 0x3f, 0x00, 0x00, 0x00, 0xfe, 0x3f, 0x00, + 0xf0, 0x01, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; diff --git a/.twm/close b/.twm/close new file mode 100644 index 0000000..f31e5f7 --- /dev/null +++ b/.twm/close @@ -0,0 +1,5 @@ +#define close_width 11 +#define close_height 11 +static unsigned char close_bits[] = { + 0x00, 0x00, 0x06, 0x03, 0x8e, 0x03, 0xdc, 0x01, 0xf8, 0x00, 0x70, 0x00, + 0xf8, 0x00, 0xdc, 0x01, 0x8e, 0x03, 0x06, 0x03, 0x00, 0x00}; diff --git a/.twm/ff b/.twm/ff new file mode 100644 index 0000000..60c1357 --- /dev/null +++ b/.twm/ff @@ -0,0 +1,14 @@ +#define ff_width 32 +#define ff_height 32 +static unsigned char ff_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, + 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1f, + 0xe0, 0xff, 0x3f, 0x1f, 0xf0, 0xff, 0x3f, 0x03, 0xf0, 0xff, 0x3f, 0x1f, + 0xf0, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, + 0xf0, 0xff, 0x0f, 0x00, 0xf0, 0xff, 0x0f, 0x00, 0xf0, 0xff, 0x0f, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/.twm/fullsize b/.twm/fullsize new file mode 100644 index 0000000..51c4d39 --- /dev/null +++ b/.twm/fullsize @@ -0,0 +1,5 @@ +#define fullsize_width 11 +#define fullsize_height 11 +static unsigned char fullsize_bits[] = { + 0x00, 0x00, 0xfc, 0x01, 0xfe, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0xfc, 0x01, 0x00, 0x00}; diff --git a/.twm/iconify b/.twm/iconify new file mode 100644 index 0000000..30cf9f6 --- /dev/null +++ b/.twm/iconify @@ -0,0 +1,5 @@ +#define icon_width 11 +#define icon_height 11 +static unsigned char icon_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x01, 0x02, 0x02, 0x02, 0x02, + 0xfe, 0x03, 0xfc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/.twm/moose b/.twm/moose new file mode 100644 index 0000000..99eb881 --- /dev/null +++ b/.twm/moose @@ -0,0 +1,28 @@ +#define moose_width 45 +#define moose_height 49 +static unsigned char moose_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf8, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, 0x00, + 0x00, 0xfc, 0xff, 0x07, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0x00, + 0x00, 0x1f, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0x00, 0x00, + 0x00, 0x07, 0xf1, 0x03, 0x00, 0x00, 0x00, 0x87, 0x71, 0x00, 0x00, 0x00, + 0x00, 0xb7, 0x70, 0x00, 0x00, 0x00, 0x00, 0x57, 0x70, 0x00, 0x00, 0x00, + 0x00, 0xe7, 0x71, 0x00, 0x00, 0x00, 0x00, 0xaf, 0x71, 0x00, 0x00, 0x00, + 0x00, 0x3f, 0x78, 0x00, 0x00, 0x00, 0x80, 0xff, 0x7f, 0x00, 0x00, 0x00, + 0xc0, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xe0, 0xff, 0x7f, 0x00, 0x00, 0x00, + 0xf8, 0xff, 0xf1, 0x00, 0x00, 0x00, 0xfc, 0x7f, 0xf0, 0x51, 0x00, 0x00, + 0xbe, 0x3f, 0xe0, 0xff, 0x03, 0x00, 0x3e, 0x3f, 0xc0, 0xff, 0x07, 0x00, + 0x1e, 0x3d, 0xc0, 0xff, 0x0f, 0x00, 0x9e, 0x3c, 0xc0, 0xff, 0x1f, 0x08, + 0x5e, 0x3e, 0xc0, 0xff, 0xff, 0x07, 0x7c, 0x3e, 0xe0, 0xff, 0xff, 0x01, + 0xf8, 0x3f, 0xf0, 0xff, 0x7f, 0x00, 0xf0, 0x1f, 0xf8, 0xff, 0x3f, 0x00, + 0xe0, 0x0f, 0xff, 0xff, 0x3f, 0x00, 0x80, 0x87, 0xff, 0xff, 0x1f, 0x00, + 0x00, 0xc0, 0xe3, 0xff, 0x1f, 0x00, 0x00, 0xc0, 0xfb, 0xff, 0x1f, 0x00, + 0x00, 0xc0, 0x7d, 0xf8, 0x0f, 0x00, 0x00, 0xe0, 0x3c, 0xf8, 0x07, 0x00, + 0x00, 0xf8, 0x0c, 0xf8, 0x07, 0x00, 0x00, 0xfc, 0x1c, 0x98, 0x03, 0x00, + 0x00, 0xdc, 0x1c, 0x98, 0x03, 0x00, 0x00, 0xf8, 0x3c, 0x38, 0x07, 0x00, + 0x00, 0x70, 0x3c, 0x78, 0x1f, 0x00, 0x00, 0x00, 0x6c, 0xf8, 0xfe, 0x00, + 0x00, 0x00, 0x6e, 0xf0, 0xfd, 0x00, 0x00, 0x00, 0x3e, 0xb0, 0xfb, 0x00, + 0x00, 0x00, 0x0c, 0xe0, 0x79, 0x00, 0x00, 0x00, 0x00, 0x60, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/.twm/mozilla b/.twm/mozilla new file mode 100644 index 0000000..82a0580 --- /dev/null +++ b/.twm/mozilla @@ -0,0 +1,14 @@ +#define mozilla_width 32 +#define mozilla_height 32 +static unsigned char mozilla_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x3f, 0x02, 0xf0, 0xff, 0x7f, + 0x01, 0xe2, 0xff, 0xff, 0xd9, 0xc4, 0xff, 0xff, 0xd9, 0x88, 0xff, 0xff, + 0x5b, 0x16, 0xff, 0xff, 0x2f, 0x76, 0xfc, 0xff, 0x4f, 0xe4, 0xe0, 0xff, + 0x19, 0xff, 0x87, 0xff, 0x31, 0xf8, 0x1f, 0xfe, 0xe3, 0xff, 0x7f, 0xf8, + 0x83, 0xff, 0xff, 0xe1, 0x07, 0xff, 0xff, 0xc7, 0x0d, 0xfe, 0xff, 0x87, + 0x0d, 0xfc, 0xff, 0x83, 0x09, 0xf0, 0xff, 0x81, 0x01, 0xe0, 0xff, 0x81, + 0x01, 0xc0, 0xff, 0x93, 0x01, 0x00, 0xff, 0xb3, 0x01, 0x00, 0xfc, 0xbf, + 0x01, 0x20, 0xe0, 0xbf, 0x03, 0x00, 0x00, 0x9c, 0x07, 0x00, 0x04, 0x80, + 0x1f, 0x00, 0x18, 0x80, 0xff, 0x03, 0x40, 0xc1, 0xff, 0x3b, 0x00, 0xc0, + 0x3f, 0xe0, 0x03, 0xe0, 0x01, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x1c, 0xf8, + 0x02, 0x80, 0xff, 0x7f, 0xfc, 0xff, 0xff, 0x3f}; diff --git a/.twm/resize b/.twm/resize new file mode 100644 index 0000000..a956e79 --- /dev/null +++ b/.twm/resize @@ -0,0 +1,5 @@ +#define resize_width 11 +#define resize_height 11 +static unsigned char resize_bits[] = { + 0x00, 0x00, 0xfc, 0x00, 0x02, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, + 0x02, 0x03, 0x02, 0x03, 0xfc, 0x03, 0xf8, 0x01, 0x00, 0x00}; diff --git a/.twm/torrent b/.twm/torrent new file mode 100644 index 0000000..e17a145 --- /dev/null +++ b/.twm/torrent @@ -0,0 +1,27 @@ +#define torrent_width 48 +#define torrent_height 48 +static unsigned char torrent_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0xe0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0x80, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x01, + 0xe0, 0xff, 0xff, 0xff, 0xff, 0x03, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x07, + 0xe0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x07, + 0x00, 0x00, 0x00, 0x00, 0xfc, 0x03, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x01, + 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; diff --git a/.twm/tv b/.twm/tv new file mode 100644 index 0000000..d275228 --- /dev/null +++ b/.twm/tv @@ -0,0 +1,14 @@ +#define Untitled_width 32 +#define Untitled_height 32 +static unsigned char Untitled_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x1c, 0x00, + 0x00, 0x36, 0x3e, 0x00, 0x00, 0x32, 0x33, 0x00, 0x00, 0x26, 0x1b, 0x00, + 0x00, 0x6c, 0x19, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0xf0, 0x07, 0x00, + 0x80, 0xff, 0xff, 0x00, 0xc0, 0xff, 0xff, 0x03, 0xe0, 0x01, 0xe0, 0x07, + 0xe0, 0x00, 0xc0, 0x07, 0xe0, 0x0c, 0xc6, 0x07, 0xe0, 0x0c, 0xc6, 0x07, + 0xe0, 0x00, 0xc0, 0x07, 0xe0, 0x00, 0xc0, 0x07, 0xe0, 0x00, 0xc0, 0x07, + 0xe0, 0xf0, 0xc3, 0x07, 0xe0, 0xe0, 0xc1, 0x07, 0xe0, 0x00, 0x20, 0x06, + 0xe0, 0x01, 0x20, 0x06, 0xe0, 0xff, 0x3f, 0x06, 0xe0, 0xff, 0xff, 0x07, + 0xc0, 0xff, 0xff, 0x03, 0x80, 0xff, 0xff, 0x00, 0x00, 0x03, 0x20, 0x00, + 0x00, 0x03, 0x60, 0x00, 0x80, 0x03, 0x60, 0x00, 0x00, 0x01, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; diff --git a/.twm/xlogo32 b/.twm/xlogo32 new file mode 100644 index 0000000..f1721de --- /dev/null +++ b/.twm/xlogo32 @@ -0,0 +1,14 @@ +#define xlogo32_width 32 +#define xlogo32_height 32 +static unsigned char xlogo32_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfc, 0x03, 0x00, 0x20, 0xf8, 0x07, 0x00, 0x30, 0xf8, 0x07, 0x00, 0x18, + 0xf0, 0x0f, 0x00, 0x0c, 0xe0, 0x1f, 0x00, 0x06, 0xc0, 0x3f, 0x00, 0x06, + 0xc0, 0x3f, 0x00, 0x03, 0x80, 0x7f, 0x80, 0x01, 0x00, 0xff, 0xc0, 0x00, + 0x00, 0xfe, 0x61, 0x00, 0x00, 0xfe, 0x31, 0x00, 0x00, 0xfc, 0x33, 0x00, + 0x00, 0xf8, 0x1b, 0x00, 0x00, 0xf0, 0x0d, 0x00, 0x00, 0xf0, 0x0e, 0x00, + 0x00, 0x60, 0x1f, 0x00, 0x00, 0xb0, 0x3f, 0x00, 0x00, 0x98, 0x7f, 0x00, + 0x00, 0x98, 0x7f, 0x00, 0x00, 0x0c, 0xff, 0x00, 0x00, 0x06, 0xfe, 0x01, + 0x00, 0x03, 0xfc, 0x03, 0x80, 0x01, 0xfc, 0x03, 0xc0, 0x00, 0xf8, 0x07, + 0xc0, 0x00, 0xf0, 0x0f, 0x60, 0x00, 0xe0, 0x1f, 0x30, 0x00, 0xe0, 0x1f, + 0x18, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x00}; diff --git a/.twmrc b/.twmrc new file mode 100644 index 0000000..cf316be --- /dev/null +++ b/.twmrc @@ -0,0 +1,140 @@ +#--------------------------------- +# CPI # PROJ. : twmrc +# # FILE : .twmrc +# + # VER. : 20170828.0718UTC +# + # EMAIL : hal@clockworkpi.com +# +++ # HOST : clockworkpi.com +#--------------------------------- + +NoGrabServer +RestartPreviousState +DecorateTransients +RandomPlacement +BorderWidth 1 +NoHighlight +OpaqueMove +MenuBorderWidth 1 +NoMenuShadows + +NoDefaults +LeftTitleButton "~/launcher/.twm/close" = f.delete +RightTitleButton "~/launcher/.twm/iconify" = f.iconify +RightTitleButton "~/launcher/.twm/resize" = f.resize +RightTitleButton "~/launcher/.twm/fullsize" = f.fullzoom + +TitleFont "-adobe-helvetica-bold-r-normal--*-100-*-*-*-*-*-*" +ResizeFont "-adobe-helvetica-bold-r-normal--*-100-*-*-*-*-*-*" +MenuFont "-misc-fixed-medium-r-semicondensed-*-*-120-*-*-c-*-iso8859-8" +IconFont "-adobe-helvetica-bold-r-normal--*-100-*-*-*-*-*-*" +IconManagerFont "-adobe-helvetica-bold-r-normal--*-100-*-*-*" + +Color +{ + BorderColor "grey30" + DefaultBackground "rgb:5/5/5" + DefaultForeground "gray80" + TitleBackground "rgb:5/5/5" + TitleForeground "gray80" + MenuBackground "rgb:5/5/5" + MenuForeground "gray80" + MenuTitleBackground "gray80" + MenuTitleForeground "rgb:5/5/5" + MenuBorderColor "gray60" + IconBackground "rgb:4/4/4" + IconForeground "gray80" + IconBorderColor "gray70" + IconManagerBackground "rgb:5/5/5" + IconManagerForeground "gray80" +} + +Cursors +{ + Menu "hand2" +} + +ForceIcons +Icons +{ + "Chrome" "~/launcher/.twm/chrome.xbm" + "xterm" "~/launcher/.twm/xlogo32" +} + + +MoveDelta 3 +Function "move-or-lower" { f.move f.deltastop f.lower } +Function "move-or-raise" { f.move f.deltastop f.raise } +Function "move-or-iconify" { f.move f.deltastop f.iconify } + + +Button1 = : root : f.menu "main" +Button3 = : root : f.menu "exec" +Button1 = m : window|icon : f.function "move-or-raise" +Button2 = m : window|icon : f.iconify +Button3 = m : window|icon : f.resize +Button1 = : title : f.function "move-or-raise" +Button2 = : title : f.raiselower +Button1 = : icon : f.function "move-or-iconify" +Button2 = : icon : f.iconify +Button1 = : iconmgr : f.iconify +Button2 = : iconmgr : f.iconify + + +NoTitle +{ + "gkrellm" +} + + +menu "main" +{ + "CLOCKWORKPI" f.title + "Raise" f.raise + "Lower" f.lower + "Focus" f.focus + "Unfocus" f.unfocus + "-------------" f.nop + "Show Iconmgr" f.showiconmgr + "Hide Iconmgr" f.hideiconmgr + "Kill" f.destroy + "-------------" f.nop + "Restart" f.restart + "Exit" ("gray80":"#773333") f.menu "exit" +} + +menu "exit" +{ + "Are you sure ?" ("gray80":"#773333") f.title + "No" f.nop + "Yes" f.quit +} + +menu "exec" +{ + ":: Applications ::" f.title + "Xterm" ("gray80":"#334455") f.exec "exec /usr/bin/xterm &" + "Xterm Orange" ("gray80":"#aa5522") f.exec "exec /usr/bin/xterm -fg '#dc8700' &" + "Xmag" f.exec "exec /usr/bin/xmag &" + "Gkrellm" f.exec "/usr/bin/gkrellm &" + "XClock" f.exec "exec /usr/bin/xclock &" + "XFig" f.exec "exec /usr/bin/xfig -nosplash &" + "Wicd client" f.exec "exec /usr/bin/wicd-client -n &" + "xpdf" f.exec "exec /usr/bin/xpdf &" +} + +WindowRing +{ + "xterm" + "xpdf" +} + +"r" = m | c: all : f.exec "exec /usr/bin/xterm -fg '#dc8700' &" +"s" = m | c: all : f.exec "exec /usr/bin/alsamixergui &" +"t" = m | c: all : f.exec "exec /usr/bin/xterm +sb &" +"w" = m | c: all : f.exec "exec /usr/bin/wicd-client -n &" + +"i" = m | s: all : f.iconify +"x" = m | s: all : f.delete + +"F12" = m : all : f.fullzoom +"Tab" = m : all : f.warpring "next" + diff --git a/.xinitrc b/.xinitrc new file mode 100644 index 0000000..f181134 --- /dev/null +++ b/.xinitrc @@ -0,0 +1,25 @@ +session=${1:-gameshell} + +case $session in +hdmi ) + exec ~/launcher/aria2c --conf-path=/home/cpi/launcher/aria2.conf & + feh --bg-center ~/launcher/sys.py/gameshell/wallpaper/desktopbg.jpg + cd ~/launcher/sys.py/ ; python appinstaller.py > /tmp/appinstaller.log & cd ~/ + exec ~/launcher/load.sh & + exec ~/launcher/sys.py/gsnotify/gsnotify-arm daemon & + exec /usr/bin/twm -f ~/launcher/.twmrc + #exec ~/launcher/dwm-mod + ;; +gameshell ) + exec ~/launcher/aria2c --conf-path=/home/cpi/launcher/aria2.conf & + feh --bg-center ~/launcher/sys.py/gameshell/wallpaper/loading.png + cd ~/launcher/sys.py/ ; python appinstaller.py > /tmp/appinstaller.log & cd ~/ + exec ~/launcher/load.sh & + exec ~/launcher/sys.py/gsnotify/gsnotify-arm & + #exec awesome -c ~/launcher/awesome/rc.lua + exec ~/launcher/dwm-mod -w + ;; +*) + exec $1;; +esac + diff --git a/.xorg.conf b/.xorg.conf new file mode 100644 index 0000000..fa95690 --- /dev/null +++ b/.xorg.conf @@ -0,0 +1,7 @@ +Section "Device" + Identifier "Allwinner A10/A13 FBDEV" + Driver "fbturbo" + Option "fbdev" "/dev/fb0" + + Option "SwapbuffersWait" "true" +EndSection diff --git a/.xorg_lima.conf b/.xorg_lima.conf new file mode 100644 index 0000000..8c4fac2 --- /dev/null +++ b/.xorg_lima.conf @@ -0,0 +1,7 @@ +Section "Device" + Identifier "Allwinner A10/A13 FBDEV" + Driver "modesetting" + Option "fbdev" "/dev/fb0" + + Option "SwapbuffersWait" "true" +EndSection diff --git a/CPI/version.json b/CPI/version.json new file mode 100644 index 0000000..e958701 --- /dev/null +++ b/CPI/version.json @@ -0,0 +1,3 @@ +{ + "gitversion":"" +} diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/Menu/GameShell/10_Settings/.Airplane.deot/__init__.py b/Menu/GameShell/10_Settings/.Airplane.deot/__init__.py new file mode 100644 index 0000000..81d9bc2 --- /dev/null +++ b/Menu/GameShell/10_Settings/.Airplane.deot/__init__.py @@ -0,0 +1,285 @@ +# -*- coding: utf-8 -*- + +import pygame +#import math +import commands + +#from beeprint import pp +from libs.roundrects import aa_round_rect +#import gobject +#from wicd import misc +## local UI import +from UI.constants import Width,Height,ICON_TYPES +from UI.page import Page,PageSelector +from UI.label import Label +from UI.util_funcs import midRect +from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB +from UI.scroller import ListScroller +from UI.icon_pool import MyIconPool +from UI.icon_item import IconItem +from UI.multi_icon_item import MultiIconItem +from UI.lang_manager import MyLangManager +from UI.skin_manager import MySkinManager +from UI.multilabel import MultiLabel + +class AirplanePage(Page): + _FootMsg = ["Nav","","Rescue","Back","Toggle"] + _MyList = [] + _ListFontObj = MyLangManager.TrFont("varela13") + + _AList = {} + + _Scrolled = 0 + + _BGwidth = 320 + _BGheight = 240-24-20 + + _DrawOnce = False + _Scroller = None + + _EasingDur = 30 + + _airwire_y = 0 + _dialog_index = 0 + + def __init__(self): + Page.__init__(self) + self._Icons = {} + + def GenList(self): + + self._MyList = [] + + + + def Init(self): + if self._Screen != None: + if self._Screen._CanvasHWND != None and self._CanvasHWND == None: + self._HWND = self._Screen._CanvasHWND + self._CanvasHWND = pygame.Surface( (self._Screen._Width,self._BGheight) ) + + self._PosX = self._Index*self._Screen._Width + self._Width = self._Screen._Width ## equal to screen width + self._Height = self._Screen._Height + + + """ + airwire = IconItem() + airwire._ImgSurf = MyIconPool._Icons["airwire"] + airwire._MyType = ICON_TYPES["STAT"] + airwire._Parent = self + airwire.Adjust(0,0,5,43,0) + self._Icons["airwire"] = airwire + + GS = IconItem() + GS._ImgSurf = MyIconPool._Icons["GS"] + GS._MyType = ICON_TYPES["STAT"] + GS._Parent = self + GS.Adjust(0,0,72,95,0) + self._Icons["GS"] = GS + """ + + DialogBoxs = MultiIconItem() + DialogBoxs._ImgSurf = MyIconPool._Icons["DialogBoxs"] + DialogBoxs._MyType = ICON_TYPES["STAT"] + DialogBoxs._Parent = self + DialogBoxs._IconWidth = 180 + DialogBoxs._IconHeight = 80 + DialogBoxs.Adjust(0,0,180,320,0) + self._Icons["DialogBoxs"] = DialogBoxs + + + """ + bgpng = MultiIconItem() + bgpng._ImgSurf = MyIconPool._Icons["about_bg"] + bgpng._MyType = ICON_TYPES["STAT"] + bgpng._Parent = self + bgpng.Adjust(0,0,self._BGwidth,self._BGheight,0) + self._Icons["bg"] = bgpng + """ + + + self.GenList() + + self._Scroller = ListScroller() + self._Scroller._Parent = self + self._Scroller._PosX = self._Width - 10 + self._Scroller._PosY = 2 + self._Scroller.Init() + self._Scroller.SetCanvasHWND(self._HWND) + + self.OnLoadCb() + + def ScrollDown(self): + dis = 10 + if abs(self._Scrolled) < (self._BGheight - self._Height)/2 + 0: + self._PosY -= dis + self._Scrolled -= dis + + def ScrollUp(self): + dis = 10 + if self._PosY < 0: + self._PosY += dis + self._Scrolled += dis + + def ToggleModeAni(self): ## with animation + out = commands.getstatusoutput('sudo rfkill list | grep yes | cut -d " " -f3') + if "yes" in out[1]: + data = self.EasingData(0,43) + for _,v in enumerate(data): + self._airwire_y -= v + self._dialog_index = 2 + pygame.time.delay(40) + + self._Screen.Draw() + self._Screen.SwapAndShow() + + commands.getstatusoutput("sudo rfkill unblock all") + self._Screen._TitleBar._InAirPlaneMode = False + + else: + data = self.EasingData(0,43) + data.reverse() + for _,v in enumerate(data): + self._airwire_y += v + self._dialog_index = 3 + pygame.time.delay(40) + self._Screen.Draw() + self._Screen.SwapAndShow() + + commands.getstatusoutput("sudo rfkill block all") + self._Screen._TitleBar._InAirPlaneMode = True + + + def ToggleMode(self): + out = commands.getstatusoutput('sudo rfkill list | grep yes | cut -d " " -f3') + print out + if "yes" in out[1]: + self._Screen._MsgBox.SetText("TurningOn") + self._Screen._MsgBox.Draw() + commands.getstatusoutput("sudo rfkill unblock all") + self._Screen._TitleBar._InAirPlaneMode = False + + else: + self._Screen._MsgBox.SetText("TurningOff") + self._Screen._MsgBox.Draw() + commands.getstatusoutput("sudo rfkill block all") + self._Screen._TitleBar._InAirPlaneMode = True + + def UnBlockAll(self): + self._Screen._MsgBox.SetText("TurningOn") + self._Screen._MsgBox.Draw() + commands.getstatusoutput("sudo rfkill unblock all") + self._Screen._TitleBar._InAirPlaneMode = False + + + def OnLoadCb(self): + self._Scrolled = 0 + self._PosY = 0 + self._DrawOnce = False + out = commands.getstatusoutput('sudo rfkill list | grep yes | cut -d " " -f3') + if "yes" in out[1]: + self._Screen._TitleBar._InAirPlaneMode = True + self._airwire_y = 50+43 + self._dialog_index = 1 + else: + self._airwire_y = 50 + self._dialog_index = 0 + self._Screen._TitleBar._InAirPlaneMode = False + + + def OnReturnBackCb(self): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + def KeyDown(self,event): + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if IsKeyStartOrA(event.key): + self.ToggleModeAni() + """ + self.ToggleMode() + self._Screen.SwapAndShow() + + pygame.time.delay(1000) + + self._Screen.Draw() + self._Screen.SwapAndShow() + """ + """ + if event.key == CurKeys["Up"]: + self.ScrollUp() + self._Screen.Draw() + self._Screen.SwapAndShow() + if event.key == CurKeys["Down"]: + self.ScrollDown() + self._Screen.Draw() + self._Screen.SwapAndShow() + """ + + if event.key == CurKeys["X"]: + self.UnBlockAll() + self._Screen.SwapAndShow() + pygame.time.delay(1000) + self._Screen.Draw() + self._Screen.SwapAndShow() + + + def Draw(self): + self.ClearCanvas() + + self._Icons["DialogBoxs"].NewCoord(70,58) + #self._Icons["airwire"].NewCoord(80,self._airwire_y) + + self._Icons["DialogBoxs"]._IconIndex = self._dialog_index + + self._Icons["DialogBoxs"].DrawTopLeft() + #self._Icons["airwire"].Draw() + + #self._Icons["GS"].NewCoord(98,118) + #self._Icons["GS"].Draw() + + self.DrawCross(10,10) + self.DrawCross(self._Screen._Width-20,10) + self.DrawCross(10,self._Screen._Height-20) + self.DrawCross(self._Screen._Width-20,self._Screen._Height-20) + + if self._HWND != None: + self._HWND.fill(MySkinManager.GiveColor("White")) + + self._HWND.blit(self._CanvasHWND,(self._PosX,self._PosY,self._Width, self._Height ) ) + +# self._Scroller.UpdateSize(self._BGheight,abs(self._Scrolled)*3) +# self._Scroller.Draw() + + + + +class APIOBJ(object): + + _Page = None + def __init__(self): + pass + def Init(self,main_screen): + self._Page = AirplanePage() + self._Page._Screen = main_screen + self._Page._Name ="Airplane Mode" + self._Page.Init() + + def API(self,main_screen): + if main_screen !=None: + main_screen.PushPage(self._Page) + main_screen.Draw() + main_screen.SwapAndShow() + +OBJ = APIOBJ() +def Init(main_screen): + OBJ.Init(main_screen) +def API(main_screen): + OBJ.API(main_screen) + + diff --git "a/Menu/GameShell/10_Settings/.Brightness.stock/Icon\r" "b/Menu/GameShell/10_Settings/.Brightness.stock/Icon\r" new file mode 100644 index 0000000..e69de29 diff --git a/Menu/GameShell/10_Settings/.Brightness.stock/__init__.py b/Menu/GameShell/10_Settings/.Brightness.stock/__init__.py new file mode 100644 index 0000000..5f8fd9a --- /dev/null +++ b/Menu/GameShell/10_Settings/.Brightness.stock/__init__.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- + +## local UI import +import pages +import myvars + +def Init(main_screen): + pages.InitBrightnessPage(main_screen) + +def API(main_screen): + + if main_screen !=None: + main_screen.PushCurPage() + main_screen.SetCurPage(myvars.BrightnessPage) + main_screen.Draw() + main_screen.SwapAndShow() + diff --git a/Menu/GameShell/10_Settings/.Brightness.stock/brightness_page.py b/Menu/GameShell/10_Settings/.Brightness.stock/brightness_page.py new file mode 100644 index 0000000..8b56473 --- /dev/null +++ b/Menu/GameShell/10_Settings/.Brightness.stock/brightness_page.py @@ -0,0 +1,186 @@ +# -*- coding: utf-8 -*- + +import pygame + + +#import math + +## local UI import +from UI.constants import Width,Height,ICON_TYPES +from UI.page import Page,PageSelector +from UI.label import Label +from UI.icon_item import IconItem +from UI.util_funcs import midRect +from UI.keys_def import CurKeys, IsKeyMenuOrB +from UI.slider import Slider +from UI.icon_pool import MyIconPool +from UI.multi_icon_item import MultiIconItem +from config import BackLight +import myvars + +class BSlider(Slider): + + + OnChangeCB = None + _BGpng = None + _BGwidth = 179 + _BGheight = 153 + + _NeedleSurf = None + _Scale = None + _Parent = None + _Icons = {} + + def __init__(self): + Slider.__init__(self) + self._Icons = {} + def Init(self): + self._Width = self._Parent._Width + self._Height = self._Parent._Height + + bgpng = IconItem() + bgpng._ImgSurf = MyIconPool.GiveIconSurface("light") + bgpng._MyType = ICON_TYPES["STAT"] + bgpng._Parent = self + bgpng.Adjust(0,0,self._BGwidth,self._BGheight,0) + self._Icons["bg"] = bgpng + ##self._NeedleSurf = pygame.Surface( (38,12),pygame.SRCALPHA ) + + scale = MultiIconItem() + scale._MyType = ICON_TYPES["STAT"] + scale._Parent = self + scale._ImgSurf = MyIconPool.GiveIconSurface("scale") + scale._IconWidth = 82 + scale._IconHeight = 63 + scale.Adjust(0,0,82,63,0) + self._Icons["scale"] = scale + + def SetValue(self,brt): + self._Value = brt + + def Further(self): + self._Value+=1 + if self._Value > 9: + self._Value = 9 + + if self.OnChangeCB != None: + if callable(self.OnChangeCB): + self.OnChangeCB(self._Value) + + def StepBack(self): + self._Value-=1 + + if self._Value < 1: + self._Value = 1 + + if self.OnChangeCB != None: + if callable(self.OnChangeCB): + self.OnChangeCB(self._Value) + + def Draw(self): + + self._Icons["bg"].NewCoord(self._Width/2,self._Height/2 +11 ) + self._Icons["bg"].Draw() + + self._Icons["scale"].NewCoord(self._Width/2,self._Height/2 ) + + icon_idx = self._Value - 1 + if icon_idx < 0: + icon_idx = 0 + + self._Icons["scale"]._IconIndex = icon_idx + self._Icons["scale"].Draw() + """ + pygame.draw.line(self._CanvasHWND,(255,0,0), (posx,self._PosY),(self._Width,self._PosY),3) ## range line + pygame.draw.line(self._CanvasHWND,(0,0,255), (self._PosX,self._PosY),(posx,self._PosY),3) ## range line + + pygame.draw.circle(self._CanvasHWND,(255,255,255),( posx, self._PosY),7,0) + pygame.draw.circle(self._CanvasHWND,(0,0,0) ,( posx, self._PosY),7,1)## outer border + """ + + + +class BrightnessPage(Page): + + _MySlider = None + _FootMsg = ["Nav","","","Back","Enter"] + + + def Init(self): + self._CanvasHWND = self._Screen._CanvasHWND + self._Width = self._Screen._Width + self._Height = self._Screen._Height + + self._MySlider = BSlider() +# self._MySlider._Width = Width - 20 +# self._MySlider._Height = 30 +# self._MySlider._PosX = (self._Width - self._MySlider._Width)/2 +# self._MySlider._PosY = 40 + self._MySlider._Parent = self + self._MySlider.SetCanvasHWND(self._CanvasHWND) + self._MySlider.OnChangeCB = self.WhenSliderDrag + self._MySlider.Init() + + brt = self.ReadBackLight() + + self._MySlider.SetValue( brt) + + + def ReadBackLight(self): + try: + f = open(BackLight) + except IOError: + return 0 + else: + with f: + content = f.readlines() + content = [x.strip() for x in content] + return int(content[0]) + + return 0 + + def OnLoadCb(self): + brt = self.ReadBackLight() + + self._MySlider.SetValue( brt) + + def SetBackLight(self,newbrt): + try: + f = open(BackLight,'w') + except IOError: + print("Open write %s failed %d" % (BackLight,newbrt)) + return False + else: + with f: + f.write(str(newbrt)) + return True + + def WhenSliderDrag(self,value): ##value + self.SetBackLight(value) + + def KeyDown(self,event): + + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Right"]: + self._MySlider.Further() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Left"]: + self._MySlider.StepBack() + self._Screen.Draw() + self._Screen.SwapAndShow() + + def Draw(self): + self.ClearCanvas() + + self._MySlider.Draw() + + + + + diff --git a/Menu/GameShell/10_Settings/.Brightness.stock/myvars.py b/Menu/GameShell/10_Settings/.Brightness.stock/myvars.py new file mode 100644 index 0000000..caa03de --- /dev/null +++ b/Menu/GameShell/10_Settings/.Brightness.stock/myvars.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- + +import os +import sys + +SoundPage = None diff --git a/Menu/GameShell/10_Settings/.Brightness.stock/pages.py b/Menu/GameShell/10_Settings/.Brightness.stock/pages.py new file mode 100644 index 0000000..643adb9 --- /dev/null +++ b/Menu/GameShell/10_Settings/.Brightness.stock/pages.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- + +from brightness_page import BrightnessPage + +import myvars + +def InitBrightnessPage(main_screen): + + myvars.BrightnessPage = BrightnessPage() + + myvars.BrightnessPage._Screen = main_screen + myvars.BrightnessPage._Name = "Brightness" + myvars.BrightnessPage.Init() diff --git a/Menu/GameShell/10_Settings/.LauncherGo.stock/__init__.py b/Menu/GameShell/10_Settings/.LauncherGo.stock/__init__.py new file mode 100644 index 0000000..7480ac0 --- /dev/null +++ b/Menu/GameShell/10_Settings/.LauncherGo.stock/__init__.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +import os +import pygame +#import math +#mport subprocess +#from beeprint import pp +from libs.roundrects import aa_round_rect + +## local UI import +from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB +from UI.util_funcs import ArmSystem +from UI.lang_manager import MyLangManager +from UI.confirm_page import ConfirmPage + +class SwitchToLauncherGoConfirmPage(ConfirmPage): + + def KeyDown(self,event): + + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if IsKeyStartOrA(event.key): + self._Screen._MsgBox.SetText("Rebooting to LauncherGo") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + pygame.time.delay(300) + ArmSystem("sed -i s/launcher/launchergo/g ~/.bashrc" ) + ArmSystem("sudo reboot") + + +class APIOBJ(object): + + _Page = None + + def __init__(self): + pass + def Init(self,main_screen): + self._Page = SwitchToLauncherGoConfirmPage() + self._Page._Screen = main_screen + self._Page._Name ="Switch To LauncherGo" + self._Page.Init() + + def API(self,main_screen): + if main_screen !=None: + main_screen.PushPage(self._Page) + main_screen.Draw() + main_screen.SwapAndShow() + +OBJ = APIOBJ() +def Init(main_screen): + OBJ.Init(main_screen) +def API(main_screen): + OBJ.API(main_screen) diff --git "a/Menu/GameShell/10_Settings/.Sound.stock/Icon\r" "b/Menu/GameShell/10_Settings/.Sound.stock/Icon\r" new file mode 100644 index 0000000..e69de29 diff --git a/Menu/GameShell/10_Settings/.Sound.stock/__init__.py b/Menu/GameShell/10_Settings/.Sound.stock/__init__.py new file mode 100644 index 0000000..db9da3e --- /dev/null +++ b/Menu/GameShell/10_Settings/.Sound.stock/__init__.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- + +## local UI import +import pages +import myvars + +def Init(main_screen): + pages.InitSoundPage(main_screen) + +def API(main_screen): + + if main_screen !=None: + main_screen.PushCurPage() + main_screen.SetCurPage(myvars.SoundPage) + main_screen.Draw() + main_screen.SwapAndShow() + diff --git a/Menu/GameShell/10_Settings/.Sound.stock/myvars.py b/Menu/GameShell/10_Settings/.Sound.stock/myvars.py new file mode 100644 index 0000000..caa03de --- /dev/null +++ b/Menu/GameShell/10_Settings/.Sound.stock/myvars.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- + +import os +import sys + +SoundPage = None diff --git a/Menu/GameShell/10_Settings/.Sound.stock/pages.py b/Menu/GameShell/10_Settings/.Sound.stock/pages.py new file mode 100644 index 0000000..41754d8 --- /dev/null +++ b/Menu/GameShell/10_Settings/.Sound.stock/pages.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- + +from sound_page import SoundPage + +import myvars + +def InitSoundPage(main_screen): + + myvars.SoundPage = SoundPage() + + myvars.SoundPage._Screen = main_screen + myvars.SoundPage._Name = "Sound Volume" + myvars.SoundPage.Init() diff --git a/Menu/GameShell/10_Settings/.Sound.stock/sound_page.py b/Menu/GameShell/10_Settings/.Sound.stock/sound_page.py new file mode 100644 index 0000000..2a3c026 --- /dev/null +++ b/Menu/GameShell/10_Settings/.Sound.stock/sound_page.py @@ -0,0 +1,170 @@ +# -*- coding: utf-8 -*- + +import pygame + +#from libs.roundrects import aa_round_rect + +import alsaaudio + +## local UI import +from UI.constants import Width,Height,ICON_TYPES +from UI.page import Page,PageSelector +from UI.icon_item import IconItem +from UI.label import Label +from UI.util_funcs import midRect +from UI.keys_def import CurKeys, IsKeyMenuOrB +from UI.slider import Slider +from UI.multi_icon_item import MultiIconItem + + +from UI.icon_pool import MyIconPool + +import myvars + +class SoundSlider(Slider): + OnChangeCB = None + + _BGpng = None + _BGwidth = 192 + _BGheight = 173 + + _NeedleSurf = None + _Scale = None + _Parent = None + + snd_segs = [ [0,20],[21,40],[41,50],[51,60],[61,70],[71,85],[86,90],[91,95],[96,100] ] + + + def __init__(self): + Slider.__init__(self) + + def Init(self): + self._Width = self._Parent._Width + self._Height = self._Parent._Height + + self._BGpng = IconItem() + self._BGpng._ImgSurf = MyIconPool.GiveIconSurface("vol") + self._BGpng._MyType = ICON_TYPES["STAT"] + self._BGpng._Parent = self + self._BGpng.Adjust(0,0,self._BGwidth,self._BGheight,0) + + ##self._NeedleSurf = pygame.Surface( (38,12),pygame.SRCALPHA ) + + self._Scale = MultiIconItem() + self._Scale._MyType = ICON_TYPES["STAT"] + self._Scale._Parent = self + self._Scale._ImgSurf = MyIconPool.GiveIconSurface("scale") + self._Scale._IconWidth = 82 + self._Scale._IconHeight = 63 + self._Scale.Adjust(0,0,82,63,0) + + def SetValue(self,vol):#pct 0-100 + for i,v in enumerate(self.snd_segs): + if vol >= v[0] and vol <= v[1]: + self._Value = i # self._Value : 0 - 8 + break + + def Further(self): + self._Value+=1 + + if self._Value > len(self.snd_segs)-1: + self._Value = len(self.snd_segs) -1 + + vol = self.snd_segs[self._Value][0] + (self.snd_segs[self._Value][1] - self.snd_segs[self._Value][0])/2 + + if self.OnChangeCB != None: + if callable(self.OnChangeCB): + self.OnChangeCB( vol ) + + def StepBack(self): + self._Value-=1 + + if self._Value < 0: + self._Value = 0 + + vol = self.snd_segs[self._Value][0] + (self.snd_segs[self._Value][1] - self.snd_segs[self._Value][0])/2 + + if self.OnChangeCB != None: + if callable(self.OnChangeCB): + self.OnChangeCB( vol ) + + def Draw(self): + + self._BGpng.NewCoord(self._Width/2,self._Height/2 ) + self._BGpng.Draw() + + self._Scale.NewCoord(self._Width/2,self._Height/2) + + self._Scale._IconIndex = self._Value + + self._Scale.Draw() + + + +class SoundPage(Page): + + _MySlider = None + _FootMsg = ["Nav","","","Back","Enter"] + + def Init(self): + self._CanvasHWND = self._Screen._CanvasHWND + self._Width = self._Screen._Width + self._Height = self._Screen._Height + + self._MySlider = SoundSlider() + + self._MySlider._Parent = self + self._MySlider.SetCanvasHWND(self._CanvasHWND) + + self._MySlider.OnChangeCB = self.WhenSliderDrag + + self._MySlider.Init() + + try: + m = alsaaudio.Mixer() + self._MySlider.SetValue(m.getvolume()[0]) + except Exception,e: + print(str(e)) + self._MySlider.SetValue(0) + + + def OnLoadCb(self): + try: + m = alsaaudio.Mixer() + self._MySlider.SetValue(m.getvolume()[0]) + except Exception,e: + print(str(e)) + + def WhenSliderDrag(self,value): ##value 0-100 + if value < 0 or value > 100: + return + + m = alsaaudio.Mixer() + m.setvolume(int(value)) + + def KeyDown(self,event): + + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Right"]: + self._MySlider.Further() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Left"]: + self._MySlider.StepBack() + self._Screen.Draw() + self._Screen.SwapAndShow() + + def Draw(self): + self.ClearCanvas() + + self._MySlider.Draw() + + + + + diff --git a/Menu/GameShell/10_Settings/.Storage.deot/__init__.py b/Menu/GameShell/10_Settings/.Storage.deot/__init__.py new file mode 100644 index 0000000..22dafa6 --- /dev/null +++ b/Menu/GameShell/10_Settings/.Storage.deot/__init__.py @@ -0,0 +1,145 @@ +# -*- coding: utf-8 -*- + +import pygame +import os + + +## local UI import +from UI.page import Page +from UI.skin_manager import MySkinManager +from UI.constants import ICON_TYPES,Width,Height +from UI.icon_item import IconItem +from UI.icon_pool import MyIconPool +from UI.label import Label +from UI.util_funcs import midRect + +class StoragePage(Page): + + _Icons = {} + _BGpng = None + _BGwidth = 96 + _BGheight = 73 + _BGlabel = None + _FreeLabel = None + + _GBmsg = "%.1fGB of %.1fGB Used" + _DskUsg = None + + _TextColor = MySkinManager.GiveColor('Text') + _FootMsg = ["Nav.","","","Back",""] + + def __init__(self): + Page.__init__(self) + + self._Icons = {} + + + def DiskUsage(self): + statvfs = os.statvfs('/') + + total_space = (statvfs.f_frsize * statvfs.f_blocks)/1024.0/1024.0/1024.0 + + avail_space = ( statvfs.f_frsize * statvfs.f_bavail) / 1024.0 / 1024.0/ 1024.0 + + return avail_space,total_space + + def Init(self): + + self._DskUsg = self.DiskUsage() + + self._CanvasHWND = self._Screen._CanvasHWND + self._Width = self._Screen._Width + self._Height = self._Screen._Height + + self._GBLabel = Label() + self._GBLabel.SetCanvasHWND(self._CanvasHWND) + self._GBLabel.Init(self._GBmsg % (self._DskUsg[1]-self._DskUsg[0], self._DskUsg[1]),MySkinManager.GiveFont("varela11") ) + self._GBLabel.SetColor(self._TextColor) + + self._PctLabel = Label() + self._PctLabel.SetCanvasHWND(self._CanvasHWND) + + usage_percent = (self._DskUsg[0]/self._DskUsg[1] )*100.0 + + + self._PctLabel.Init("%d%%"% int(usage_percent),MySkinManager.GiveFont("EurostileBold30")) + self._PctLabel.SetColor( self._TextColor ) + + self._FreeLabel = Label() + self._FreeLabel.SetCanvasHWND(self._CanvasHWND) + self._FreeLabel.Init("FREE",MySkinManager.GiveFont("varela12")) + self._FreeLabel.SetColor(self._PctLabel._Color) + + + def OnLoadCb(self): + pass + + def Draw(self): + self.ClearCanvas() + + self._PctLabel.NewCoord(32,102- 33) + self._PctLabel.Draw() + + self._FreeLabel.NewCoord(33 ,130-25) + self._FreeLabel.Draw() + + self._GBLabel.NewCoord(145,103-29) + self._GBLabel.Draw() + + #bgcolor = (238,238,238), fgcolor = (126,206,244) + + usage_percent = (self._DskUsg[0]/self._DskUsg[1] ) + if usage_percent < 0.1: + usage_percent = 0.1 + + rect_ = pygame.Rect(144,118-25, 283-144,139-117) + + pygame.draw.rect(self._CanvasHWND,MySkinManager.GiveColor('Text'), rect_, 1) + + + rect2 = pygame.Rect(144,118-25,int((283-144)*(1.0-usage_percent)),139-117) + + rect2.left = rect_.left + rect2.top = rect_.top + + pygame.draw.rect(self._CanvasHWND,MySkinManager.GiveColor('Text'),rect2, 0) + + sep_rect = pygame.Rect(129,99-25,2,42) + + pygame.draw.rect(self._CanvasHWND,MySkinManager.GiveColor('Inactive'),sep_rect, 0) + + ##4 cross + self.DrawCross(10,10) + self.DrawCross(self._Screen._Width-20,10) + self.DrawCross(10,self._Screen._Height-20) + self.DrawCross(self._Screen._Width-20,self._Screen._Height-20) + + +class APIOBJ(object): + + _StoragePage = None + def __init__(self): + pass + def Init(self,main_screen): + self._StoragePage = StoragePage() + + self._StoragePage._Screen = main_screen + self._StoragePage._Name ="Storage" + self._StoragePage.Init() + + + def API(self,main_screen): + if main_screen !=None: + main_screen.PushPage(self._StoragePage) + main_screen.Draw() + main_screen.SwapAndShow() + + + +OBJ = APIOBJ() +def Init(main_screen): + OBJ.Init(main_screen) +def API(main_screen): + OBJ.API(main_screen) + + diff --git a/Menu/GameShell/10_Settings/.list_page.py.stock b/Menu/GameShell/10_Settings/.list_page.py.stock new file mode 100644 index 0000000..954e1ad --- /dev/null +++ b/Menu/GameShell/10_Settings/.list_page.py.stock @@ -0,0 +1,155 @@ +# -*- coding: utf-8 -*- + +import pygame +import sys + +from libs.roundrects import aa_round_rect + +## local UI import +from UI.constants import Width,Height +from UI.page import Page,PageSelector +from UI.label import Label +from UI.util_funcs import midRect,FileExists +from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB +from UI.scroller import ListScroller +from UI.skin_manager import MySkinManager +from UI.lang_manager import MyLangManager +from UI.info_page_selector import InfoPageSelector + +from list_item import ListItem + +import myvars + +class ListPage(Page): + + _Icons = {} + _Selector=None + + _FootMsg = ["Nav","","","Back","Enter"] + _MyList = [] + _ListFontObj = MyLangManager.TrFont("varela15") + + _Scroller = None + + def __init__(self): + Page.__init__(self) + self._Icons = {} + self._CanvasHWND = None + self._MyList = [] + + def Init(self): + self._PosX = self._Index * self._Screen._Width + self._Width = self._Screen._Width + self._Height = self._Screen._Height + + self._CanvasHWND = self._Screen._CanvasHWND + + ps = InfoPageSelector() + ps._Parent = self + ps._PosX = 2 + self._Ps = ps + self._PsIndex = 0 + + # "" pkgname, label + alist = [["","Airplane","Airplane Mode"], + ["","PowerOptions","Power Options"], + ["","Wifi","Wi-Fi"], + ["","Bluetooth","Bluetooth"], + ["","Sound","Sound Volume"], + ["","Brightness","BackLight Brightness"], + ["","Storage",""], + ["","Time","Timezone"], + ["","Languages","Languages"], + ["","Notification","Notification"], + ["","Update", "Update Launcher"], + ["","Cores", "Retroarch cores manager"], + ["","About", "About"], + ["","PowerOFF","Power OFF"], + ["","ButtonsLayout","Buttons Layout"], + ["","Skins","Theme Manager"], + #["","LauncherGo","Switch to LauncherGo"], + ["","Lima","GPU Driver Switch"], + ["","GateWay","Network Gateway Switch"]] + + start_x = 0 + start_y = 0 + + + sys.path.append(myvars.basepath)# add self as import path + for i,v in enumerate(alist): + li = ListItem() + li._Parent = self + li._PosX = start_x + li._PosY = start_y + i*ListItem._Height + li._Width = Width + li._Fonts["normal"] = self._ListFontObj + + if v[2] != "": + li.Init(v[2]) + else: + li.Init(v[1]) + + #if v[1] == "Wifi" or v[1] == "Sound" or v[1] == "Brightness" or v[1] == "Storage" or v[1] == "Update" or v[1] == "About" or v[1] == "PowerOFF" or v[1] == "HelloWorld": + if FileExists(myvars.basepath+"/"+ v[1]): + li._LinkObj = __import__(v[1]) + init_cb = getattr(li._LinkObj,"Init",None) + if init_cb != None: + if callable(init_cb): + li._LinkObj.Init(self._Screen) + + self._MyList.append(li) + + self._Scroller = ListScroller() + self._Scroller._Parent = self + self._Scroller._PosX = self._Width - 10 + self._Scroller._PosY = 2 + self._Scroller.Init() + + def Click(self): + cur_li = self._MyList[self._PsIndex] + if cur_li._LinkObj != None: + api_cb = getattr(cur_li._LinkObj,"API",None) + if api_cb != None: + if callable(api_cb): + cur_li._LinkObj.API(self._Screen) + + + def KeyDown(self,event): + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Up"]: + self.ScrollUp() + self._Screen.Draw() + self._Screen.SwapAndShow() + if event.key == CurKeys["Down"]: + self.ScrollDown() + self._Screen.Draw() + self._Screen.SwapAndShow() + + + if IsKeyStartOrA(event.key): + self.Click() + + def Draw(self): + self.ClearCanvas() + + if len(self._MyList) * ListItem._Height > self._Height: + self._Ps._Width = self._Width - 11 + + self._Ps.Draw() + + for i in self._MyList: + i.Draw() + + self._Scroller.UpdateSize( len(self._MyList)*ListItem._Height, self._PsIndex*ListItem._Height) + self._Scroller.Draw() + else: + self._Ps._Width = self._Width + self._Ps.Draw() + for i in self._MyList: + i.Draw() + + diff --git a/Menu/GameShell/10_Settings/About/__init__.py b/Menu/GameShell/10_Settings/About/__init__.py new file mode 100644 index 0000000..4a5c0c3 --- /dev/null +++ b/Menu/GameShell/10_Settings/About/__init__.py @@ -0,0 +1,398 @@ +# -*- coding: utf-8 -*- + +import pygame +#import math +import subprocess + +#from beeprint import pp +from libs.roundrects import aa_round_rect +#import gobject +#from wicd import misc +## local UI import +from UI.constants import Width,Height,ICON_TYPES +from UI.page import Page,PageSelector +from UI.label import Label +from UI.util_funcs import midRect,FileExists +from UI.keys_def import CurKeys, IsKeyMenuOrB +from UI.scroller import ListScroller +from UI.icon_pool import MyIconPool +from UI.multi_icon_item import MultiIconItem +from UI.multilabel import MultiLabel +from UI.lang_manager import MyLangManager +from UI.skin_manager import MySkinManager + +from config import VERSION + +class InfoPageListItem(object): + _PosX = 0 + _PosY = 0 + _Width = 0 + _Height = 20 + + _Labels = {} + _Icons = {} + _Fonts = {} + + _LinkObj = None + + def __init__(self): + self._Labels = {} + self._Icons = {} + self._Fonts = {} + + def SetSmallText(self,text): + + l = MultiLabel() + l.SetCanvasHWND(self._Parent._CanvasHWND) + l.Init(text,self._Fonts["small"]) + + self._Labels["Small"] = l + + #if self._Labels["Small"]._Width > self._Width: + # self._Width = self._Labels["Small"]._Width + if self._Labels["Small"]._Height >= self._Height: + self._Height = self._Labels["Small"]._Height+10 + + def Init(self,text): + + #self._Fonts["normal"] = fonts["veramono12"] + + l = Label() + l._PosX = 10 + l.SetCanvasHWND(self._Parent._CanvasHWND) + + l.Init(text,self._Fonts["normal"]) + self._Labels["Text"] = l + + def Draw(self): + + self._Labels["Text"]._PosY = self._PosY + self._Labels["Text"].Draw() + + if "Small" in self._Labels: + self._Labels["Small"]._PosX = self._Labels["Text"]._Width + 16 + self._Labels["Small"]._PosY = self._PosY + self._Labels["Small"].Draw() + + + + +class AboutPage(Page): + _FootMsg = ["Nav.","","","Back",""] + _MyList = [] + _ListFontObj = MyLangManager.TrFont("varela13") + + _AList = {} + + _Scrolled = 0 + + _BGwidth = 320 + _BGheight = 300 + + _DrawOnce = False + _Scroller = None + + def __init__(self): + Page.__init__(self) + self._Icons = {} + + def Uname(self): + + out = {} + out["key"]="uname" + out["label"]= "Kernel:" + st = subprocess.check_output(["uname","-srmo"]) + st = st.strip("\n") + st = st.strip("\t") + out["value"] = st + self._AList["uname"] = out + + return + + def CpuMhz(self): + + try: + with open("/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq") as f: + content = f.readlines() + content = [x.strip() for x in content] + + except: + print("open %s failed" % "/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq") + content = ["0"] + + mhz = int(content[0]) / 1000.0 + + cpuscalemhz = {} + cpuscalemhz["key"] = "cpuscalemhz" + cpuscalemhz["label"] = "CPU Mhz:" + cpuscalemhz["value"] = str(mhz) + self._AList["cpuscalemhz"] = cpuscalemhz + + return + + def CpuInfo(self): + last_processor = 0 + with open("/proc/cpuinfo") as f: + for line in f: + if line.startswith("processor"): + parts = line.split(":") + cur_processor_number = int( parts[1].strip()) + if cur_processor_number > last_processor: + last_processor = cur_processor_number + + if line.startswith("model name"): + parts = line.split(":") +# print( parts[1].strip() ) + processor = {} + processor["key"]="processor" + processor["label"] = "Processor:" + processor["value"] = parts[1].strip() + + self._AList["processor"] = processor + + if line.startswith("cpu MHz"): + parts = line.split(":") +# print(parts[1].strip() ) + cpumhz = {} + cpumhz["key"] = "cpumhz" + cpumhz["label"] = "CPU MHz:" + cpumhz["value"] = parts[1].strip() + + self._AList["cpumhz"] = cpumhz + if line.startswith("cpu cores"): + parts = line.split(":") +# print(parts[1].strip() ) + cpucores = {} + cpucores["key"] = "cpucores" + cpucores["label"] = "CPU cores:" + cpucores["value"] = parts[1].strip() + self._AList["cpucores"] = cpucores + if line.startswith("Features"): + parts = line.split(":") +# print(parts[1].strip() ) + f_ = {} + f_["key"] = "features" + f_["label"] = "Features:" + f_["value"] = parts[1].strip() + self._AList["features"] = f_ + + if line.startswith("flags"): + parts = line.split(":") +# print(parts[1].strip() ) + flags = {} + flags["key"] = "flags" + flags["label"] = "Flags:" + flags["value"] = parts[1].strip() + self._AList["flags"] = flags + + + if last_processor > 0: + arm_cores = {} + arm_cores["key"]= "armcores" + arm_cores["label"] = "CPU cores:" + arm_cores["value"] = str(last_processor + 1) + self._AList["armcores"] = arm_cores + + def MemInfo(self): + + with open("/proc/meminfo") as f: + for line in f: + if line.startswith("MemTotal"): + parts = line.split(":") + parts[1] = parts[1].replace("kB","") + print( parts[1].strip() ) + + memory = {} + memory["key"] = "memory" + memory["label"] = "Memory:" + memory["value"] = str( int(parts[1].strip())/1000.0) +" MB" + self._AList["memory"] = memory + break + + def LauncherVersion(self): + launcher_version = {} + launcher_version["key"] = "launcher_ver" + launcher_version["label"] = "Launcher:" + launcher_version["value"] = VERSION + self._AList["launcher_ver"] = launcher_version + + def OsImageVersion(self): + if FileExists("/etc/clockworkpi_os_image_version"): + try: + with open("/etc/clockworkpi_os_image_version") as f: + content = f.readlines() + content = [x.strip() for x in content] + + except: + print("open %s failed" % "/etc/clockworkpi_os_image_version") + content = None + + if content != None and len(content) > 0: + os_image_ver = {} + os_image_ver["key"] = "os_image_ver" + os_image_ver["label"] = "OS Image:" + os_image_ver["value"] = content[0][:12] + self._AList["os_image_ver"] = os_image_ver + + def GenList(self): + + self._MyList = [] + + start_x = 0 + start_y = 10 + last_height = 0 + + for i,u in enumerate( ["processor","armcores","cpuscalemhz","features","memory","uname","launcher_ver","os_image_ver"] ): + #for i,u in enumerate( ["processor","cpucores","cpumhz","flags","memory","uname"] ): + if u not in self._AList: + continue + + v = self._AList[u] + + li = InfoPageListItem() + li._Parent = self + li._PosX = start_x + li._PosY = start_y + last_height + li._Width = Width + li._Fonts["normal"] = self._ListFontObj + li._Fonts["small"] = MySkinManager.GiveFont("varela12") + + if self._AList[u]["label"] != "": + li.Init( self._AList[u]["label"] ) + else: + li.Init( self._AList[u]["key"] ) + + li._Flag = self._AList[u]["key"] + + li.SetSmallText( self._AList[u]["value"] ) + + last_height += li._Height + + self._MyList.append(li) + + def Init(self): + if self._Screen != None: + if self._Screen._CanvasHWND != None and self._CanvasHWND == None: + self._HWND = self._Screen._CanvasHWND + self._CanvasHWND = pygame.Surface( (self._Screen._Width,self._BGheight+50) ) + + self._PosX = self._Index*self._Screen._Width + self._Width = self._Screen._Width ## equal to screen width + self._Height = self._Screen._Height + + bgpng = MultiIconItem() + bgpng._ImgSurf = MyIconPool.GiveIconSurface("about_bg") + bgpng._MyType = ICON_TYPES["STAT"] + bgpng._Parent = self + bgpng.Adjust(0,0,self._BGwidth,self._BGheight,0) + + self._Icons["bg"] = bgpng + + self.CpuInfo() + self.MemInfo() + self.CpuMhz() + self.Uname() + + self.LauncherVersion() + self.OsImageVersion() + + self.GenList() + + self._Scroller = ListScroller() + self._Scroller._Parent = self + self._Scroller._PosX = self._Width - 10 + self._Scroller._PosY = 2 + self._Scroller.Init() + self._Scroller.SetCanvasHWND(self._HWND) + + def ScrollDown(self): + dis = 10 + if abs(self._Scrolled) < (self._BGheight - self._Height)/2 + 100: + self._PosY -= dis + self._Scrolled -= dis + + def ScrollUp(self): + dis = 10 + if self._PosY < 0: + self._PosY += dis + self._Scrolled += dis + + + def OnLoadCb(self): + self._Scrolled = 0 + self._PosY = 0 + self._DrawOnce = False + + def OnReturnBackCb(self): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + def KeyDown(self,event): + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Up"]: + self.ScrollUp() + self._Screen.Draw() + self._Screen.SwapAndShow() + if event.key == CurKeys["Down"]: + self.ScrollDown() + self._Screen.Draw() + self._Screen.SwapAndShow() + + + def Draw(self): + + if self._DrawOnce == False: + self.ClearCanvas() + #self._Ps.Draw() + + for i in self._MyList: + i.Draw() + + self._DrawOnce = True + + self._Icons["bg"].DrawRect((230,0,82,184),(228,0,82,184)) + + y = self._MyList[len(self._MyList)-1]._PosY+30 + + self._Icons["bg"].DrawRect(( (self._Width-191)/2,y,191,68),(65,232,191,68)) + + if self._HWND != None: + self._HWND.fill(MySkinManager.GiveColor("White")) + + self._HWND.blit(self._CanvasHWND,(self._PosX,self._PosY,self._Width, self._Height ) ) + + self._Scroller.UpdateSize(self._BGheight,abs(self._Scrolled)*3) + self._Scroller.Draw() + + + + +class APIOBJ(object): + + _Page = None + def __init__(self): + pass + def Init(self,main_screen): + self._Page = AboutPage() + self._Page._Screen = main_screen + self._Page._Name ="About" + self._Page.Init() + + def API(self,main_screen): + if main_screen !=None: + main_screen.PushPage(self._Page) + main_screen.Draw() + main_screen.SwapAndShow() + +OBJ = APIOBJ() +def Init(main_screen): + OBJ.Init(main_screen) +def API(main_screen): + OBJ.API(main_screen) + + diff --git "a/Menu/GameShell/10_Settings/Airplane/Icon\r" "b/Menu/GameShell/10_Settings/Airplane/Icon\r" new file mode 100644 index 0000000..e69de29 diff --git a/Menu/GameShell/10_Settings/Airplane/__init__.py b/Menu/GameShell/10_Settings/Airplane/__init__.py new file mode 100644 index 0000000..3338d90 --- /dev/null +++ b/Menu/GameShell/10_Settings/Airplane/__init__.py @@ -0,0 +1,279 @@ +# -*- coding: utf-8 -*- + +import pygame +#import math +import commands + +#from beeprint import pp +from libs.roundrects import aa_round_rect +#import gobject +#from wicd import misc +## local UI import +from UI.constants import Width,Height,ICON_TYPES +from UI.page import Page,PageSelector +from UI.label import Label +from UI.util_funcs import midRect +from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB +from UI.scroller import ListScroller +from UI.icon_pool import MyIconPool +from UI.icon_item import IconItem +from UI.multi_icon_item import MultiIconItem +from UI.lang_manager import MyLangManager + +from UI.multilabel import MultiLabel + +class AirplanePage(Page): + _FootMsg = ["Nav","","Rescue","Back","Toggle"] + _MyList = [] + _ListFontObj = MyLangManager.TrFont("varela13") + + _AList = {} + + _Scrolled = 0 + + _BGwidth = 320 + _BGheight = 240-24-20 + + _DrawOnce = False + _Scroller = None + + _EasingDur = 30 + + _airwire_y = 0 + _dialog_index = 0 + + def __init__(self): + Page.__init__(self) + self._Icons = {} + + def GenList(self): + + self._MyList = [] + + + + def Init(self): + if self._Screen != None: + if self._Screen._CanvasHWND != None and self._CanvasHWND == None: + self._HWND = self._Screen._CanvasHWND + self._CanvasHWND = pygame.Surface( (self._Screen._Width,self._BGheight) ) + + self._PosX = self._Index*self._Screen._Width + self._Width = self._Screen._Width ## equal to screen width + self._Height = self._Screen._Height + + + + airwire = IconItem() + airwire._ImgSurf = MyIconPool.GiveIconSurface("airwire") + airwire._MyType = ICON_TYPES["STAT"] + airwire._Parent = self + airwire.Adjust(0,0,5,43,0) + self._Icons["airwire"] = airwire + + GS = IconItem() + GS._ImgSurf = MyIconPool.GiveIconSurface("GS") + GS._MyType = ICON_TYPES["STAT"] + GS._Parent = self + GS.Adjust(0,0,72,95,0) + self._Icons["GS"] = GS + + DialogBoxs = MultiIconItem() + DialogBoxs._ImgSurf = MyIconPool.GiveIconSurface("DialogBoxs") + DialogBoxs._MyType = ICON_TYPES["STAT"] + DialogBoxs._Parent = self + DialogBoxs._IconWidth = 134 + DialogBoxs._IconHeight = 93 + DialogBoxs.Adjust(0,0,134,372,0) + self._Icons["DialogBoxs"] = DialogBoxs + + + """ + bgpng = MultiIconItem() + bgpng._ImgSurf = MyIconPool.GiveIconSurface("about_bg") + bgpng._MyType = ICON_TYPES["STAT"] + bgpng._Parent = self + bgpng.Adjust(0,0,self._BGwidth,self._BGheight,0) + self._Icons["bg"] = bgpng + """ + + + self.GenList() + + self._Scroller = ListScroller() + self._Scroller._Parent = self + self._Scroller._PosX = self._Width - 10 + self._Scroller._PosY = 2 + self._Scroller.Init() + self._Scroller.SetCanvasHWND(self._HWND) + + self.OnLoadCb() + + def ScrollDown(self): + dis = 10 + if abs(self._Scrolled) < (self._BGheight - self._Height)/2 + 0: + self._PosY -= dis + self._Scrolled -= dis + + def ScrollUp(self): + dis = 10 + if self._PosY < 0: + self._PosY += dis + self._Scrolled += dis + + def ToggleModeAni(self): ## with animation + out = commands.getstatusoutput('sudo rfkill list | grep yes | cut -d " " -f3') + if "yes" in out[1]: + data = self.EasingData(0,43) + for _,v in enumerate(data): + self._airwire_y -= v + self._dialog_index = 2 + pygame.time.delay(40) + + self._Screen.Draw() + self._Screen.SwapAndShow() + + commands.getstatusoutput("sudo rfkill unblock all") + self._Screen._TitleBar._InAirPlaneMode = False + + else: + data = self.EasingData(0,43) + data.reverse() + for _,v in enumerate(data): + self._airwire_y += v + self._dialog_index = 3 + pygame.time.delay(40) + self._Screen.Draw() + self._Screen.SwapAndShow() + + commands.getstatusoutput("sudo rfkill block all") + self._Screen._TitleBar._InAirPlaneMode = True + + + def ToggleMode(self): + out = commands.getstatusoutput('sudo rfkill list | grep yes | cut -d " " -f3') + print out + if "yes" in out[1]: + self._Screen._MsgBox.SetText("TurningOn") + self._Screen._MsgBox.Draw() + commands.getstatusoutput("sudo rfkill unblock all") + self._Screen._TitleBar._InAirPlaneMode = False + + else: + self._Screen._MsgBox.SetText("TurningOff") + self._Screen._MsgBox.Draw() + commands.getstatusoutput("sudo rfkill block all") + self._Screen._TitleBar._InAirPlaneMode = True + + def UnBlockAll(self): + self._Screen._MsgBox.SetText("TurningOn") + self._Screen._MsgBox.Draw() + commands.getstatusoutput("sudo rfkill unblock all") + self._Screen._TitleBar._InAirPlaneMode = False + + + def OnLoadCb(self): + self._Scrolled = 0 + self._PosY = 0 + self._DrawOnce = False + out = commands.getstatusoutput('sudo rfkill list | grep yes | cut -d " " -f3') + if "yes" in out[1]: + self._Screen._TitleBar._InAirPlaneMode = True + self._airwire_y = 50+43 + self._dialog_index = 1 + else: + self._airwire_y = 50 + self._dialog_index = 0 + self._Screen._TitleBar._InAirPlaneMode = False + + + def OnReturnBackCb(self): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + def KeyDown(self,event): + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if IsKeyStartOrA(event.key): + self.ToggleModeAni() + """ + self.ToggleMode() + self._Screen.SwapAndShow() + + pygame.time.delay(1000) + + self._Screen.Draw() + self._Screen.SwapAndShow() + """ + """ + if event.key == CurKeys["Up"]: + self.ScrollUp() + self._Screen.Draw() + self._Screen.SwapAndShow() + if event.key == CurKeys["Down"]: + self.ScrollDown() + self._Screen.Draw() + self._Screen.SwapAndShow() + """ + + if event.key == CurKeys["X"]: + self.UnBlockAll() + self._Screen.SwapAndShow() + pygame.time.delay(1000) + self._Screen.Draw() + self._Screen.SwapAndShow() + + + def Draw(self): + self.ClearCanvas() + + self._Icons["DialogBoxs"].NewCoord(145,23) + self._Icons["airwire"].NewCoord(80,self._airwire_y) + + self._Icons["DialogBoxs"]._IconIndex = self._dialog_index + + self._Icons["DialogBoxs"].DrawTopLeft() + self._Icons["airwire"].Draw() + + self._Icons["GS"].NewCoord(98,118) + self._Icons["GS"].Draw() + + if self._HWND != None: + self._HWND.fill((255,255,255)) + + self._HWND.blit(self._CanvasHWND,(self._PosX,self._PosY,self._Width, self._Height ) ) + +# self._Scroller.UpdateSize(self._BGheight,abs(self._Scrolled)*3) +# self._Scroller.Draw() + + + + +class APIOBJ(object): + + _Page = None + def __init__(self): + pass + def Init(self,main_screen): + self._Page = AirplanePage() + self._Page._Screen = main_screen + self._Page._Name ="Airplane Mode" + self._Page.Init() + + def API(self,main_screen): + if main_screen !=None: + main_screen.PushPage(self._Page) + main_screen.Draw() + main_screen.SwapAndShow() + +OBJ = APIOBJ() +def Init(main_screen): + OBJ.Init(main_screen) +def API(main_screen): + OBJ.API(main_screen) + + diff --git a/Menu/GameShell/10_Settings/Bluetooth/__init__.py b/Menu/GameShell/10_Settings/Bluetooth/__init__.py new file mode 100644 index 0000000..4a943ab --- /dev/null +++ b/Menu/GameShell/10_Settings/Bluetooth/__init__.py @@ -0,0 +1,813 @@ +# -*- coding: utf-8 -*- +import re +import pygame +#import math +import commands +import dbus +from beeprint import pp +from libs.roundrects import aa_round_rect + +from libs.DBUS import bus, adapter,devices + +#import gobject +#from wicd import misc +## local UI import +from UI.constants import Width,Height,ICON_TYPES +from UI.page import Page,PageSelector +from UI.label import Label +from UI.util_funcs import midRect +from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB +from UI.scroller import ListScroller +from UI.icon_pool import MyIconPool +from UI.icon_item import IconItem +from UI.multi_icon_item import MultiIconItem +from UI.skin_manager import MySkinManager +from UI.confirm_page import ConfirmPage +from UI.info_page_list_item import InfoPageListItem + +from UI.multilabel import MultiLabel +from UI.lang_manager import MyLangManager +from UI.keyboard import Keyboard + +from net_item import NetItem + +from agent import BleAgent,BleAgentPairPage + +class BleForgetConfirmPage(ConfirmPage): + + _ConfirmText = MyLangManager.Tr("ConfirmForgetQ") + + def KeyDown(self,event): + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if IsKeyStartOrA(event.key): + self.SnapMsg(MyLangManager.Tr("Deleting")) + self._Screen.Draw() + self._Screen.SwapAndShow() + + try: + #self._Parent._Adapter.RemoveDevice() + print("try to RemoveDevice") + except Exception,e: + print(str(e)) + + pygame.time.delay(400) + + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + + def Draw(self): + #self.ClearCanvas() + self.DrawBG() + for i in self._MyList: + i.Draw() + + self.Reset() + + +class BleInfoPageSelector(PageSelector): + _BackgroundColor = MySkinManager.GiveColor('Front') + + def __init__(self): + self._PosX = 0 + self._PosY = 0 + self._Height = 0 + + def AnimateDraw(self,x2,y2): + pass + + def Draw(self): + idx = self._Parent._PsIndex + if idx < len( self._Parent._MyList): + x = self._PosX+2 + y = self._Parent._MyList[idx]._PosY+1 + h = self._Parent._MyList[idx]._Height -3 + + self._PosX = x + self._PosY = y + self._Height = h + + aa_round_rect(self._Parent._CanvasHWND, + (x,y,self._Width-4,h),self._BackgroundColor,4,0,self._BackgroundColor) + +class BleInfoPage(Page): + _FootMsg = ["Nav","Forget","Disconnect","Back",""] + _MyList = [] + _ListFontObj = MyLangManager.TrFont("varela15") + _ListSmFontObj = MySkinManager.GiveFont("varela12") # small font + _ListSm2FontObj= MySkinManager.GiveFont("varela11") + + _AList = {} + _Path = "" + def Init(self): + if self._Screen != None: + if self._Screen._CanvasHWND != None and self._CanvasHWND == None: + self._CanvasHWND = self._Screen._CanvasHWND + + self._PosX = self._Index*self._Screen._Width + self._Width = self._Screen._Width ## equal to screen width + self._Height = self._Screen._Height + + ps = BleInfoPageSelector() + ps._Parent = self + self._Ps = ps + self._PsIndex = 0 + + #_AList is an object + self.GenList() + + self._Scroller = ListScroller() + self._Scroller._Parent = self + self._Scroller._PosX = 2 + self._Scroller._PosY = 2 + self._Scroller.Init() + + self._ConfirmPage1 = BleForgetConfirmPage() + self._ConfirmPage1._Screen = self._Screen + self._ConfirmPage1._Name = "ConfirmForget" + self._ConfirmPage1._Parent = self + self._ConfirmPage1.Init() + + def GenList(self): + if self._AList== None: + return + self._MyList = [] + self._PsIndex = 0 + start_x = 0 + start_y = 0 + + for i,v in enumerate( self._AList): + #print(i,v) # (0, dbus.String(u'AddressType')) + + li = InfoPageListItem() + li._Parent = self + li._PosX = start_x + li._PosY = start_y + i*InfoPageListItem._Height + li._Width = Width + li._Fonts["normal"] = self._ListFontObj + + if v == "UUIDs": + li._Fonts["small"] = self._ListSm2FontObj + else: + li._Fonts["small"] = self._ListSmFontObj + + li.Init( str(v) ) + li._Flag = v + + if v =="UUIDs": + if len(self._AList[v]) > 1: + pp(self._AList[v][0]) + sm_text = str(self._AList[v][0]) + else: + sm_text = "" + else: + sm_text = str(self._AList[v]) + + if sm_text == "0": + sm_text="No" + elif sm_text == "1": + sm_text="Yes" + + sm_text = sm_text[:20] + li.SetSmallText(sm_text) + + li._PosX = 2 + self._MyList.append(li) + + def TryToForget(self): + global adapter + proxy_obj = bus.get_object("org.bluez", self._Path) + dev = dbus.Interface(proxy_obj, "org.bluez.Device1") + + self._Screen._MsgBox.SetText("Forgeting") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + + try: + adapter.RemoveDevice(dev) + except Exception,e: + err_name = e.get_dbus_name() + if err_name == "org.freedesktop.DBus.Error.NoReply": + self._Screen._MsgBox.SetText("DBus noreply") + else: + self._Screen._MsgBox.SetText("Forget failed") + + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + + pygame.time.delay(500) + + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + def TryToDisconnect(self): + global bus + + if "Connected" in self._AList: + if self._AList["Connected"] == 0: + return + + proxy_obj = bus.get_object("org.bluez", self._Path) + dev = dbus.Interface(proxy_obj, "org.bluez.Device1") + + self._Screen._FootBar.UpdateNavText("Disconnecting") + self._Screen._MsgBox.SetText("Disconnecting") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + + try: + dev.Disconnect() + except Exception,e: + err_name = e.get_dbus_name() + if err_name == "org.freedesktop.DBus.Error.NoReply": + self._Screen._MsgBox.SetText("DBus noreply") + else: + self._Screen._MsgBox.SetText("Disconnect failed") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + + pygame.time.delay(500) + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + self._Screen._FootBar.ResetNavText() + + + def Click(self): + if self._PsIndex >= len(self._MyList): + return + + cur_li = self._MyList[self._PsIndex] + print(cur_li._Flag) + if cur_li._Flag in self._AList: + print(self._AList[ cur_li._Flag ]) + + def OnLoadCb(self): + if self._AList != None: + if "Connected" in self._AList: + if self._AList["Connected"] == 1: + self._FootMsg[1] = "Disconnect" + else: + self._FootMsg[1] = "" + + self.GenList() + + def OnReturnBackCb(self): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + def KeyDown(self,event): + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Up"]: + self.ScrollUp() + self._Screen.Draw() + self._Screen.SwapAndShow() + if event.key == CurKeys["Down"]: + self.ScrollDown() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if IsKeyStartOrA(event.key): + self.Click() + + if event.key == CurKeys["X"]: + self.TryToDisconnect() + + if event.key == CurKeys["Y"]: + self.TryToForget() + + + def Draw(self): + if len(self._MyList) == 0: + return + + self.ClearCanvas() + + if len(self._MyList) * InfoPageListItem._Height > self._Height: + self._Ps._Width = self._Width - 10 + self._Ps._PosX = 9 + self._Ps.Draw() + for i in self._MyList: + i.Draw() + + self._Scroller.UpdateSize(len(self._MyList)*InfoPageListItem._Height, self._PsIndex*InfoPageListItem._Height) + self._Scroller.Draw() + + else: + self._Ps._Width = self._Width + self._Ps.Draw() + for i in self._MyList: + i.Draw() + + + + +class BleListSelector(PageSelector): + _BackgroundColor = MySkinManager.GiveColor('Front') + + def __init__(self): + self._PosX = 0 + self._PosY = 0 + self._Height = 0 + + def AnimateDraw(self,x2,y2): + pass + + def Draw(self): + idx = self._Parent._PsIndex + if idx < len( self._Parent._MyList): + x = self._Parent._MyList[idx]._PosX+2 + y = self._Parent._MyList[idx]._PosY+1 + h = self._Parent._MyList[idx]._Height -3 + + self._PosX = x + self._PosY = y + self._Height = h + + aa_round_rect(self._Parent._CanvasHWND, + (x,y,self._Width-4,h),self._BackgroundColor,4,0,self._BackgroundColor) + +class BleListMessageBox(Label): + _Parent = None + + def Draw(self): + my_text = self._FontObj.render( self._Text,True,self._Color) + w = my_text.get_width() + h = my_text.get_height() + x = (self._Parent._Width - w)/2 + y = (self._Parent._Height - h)/2 + padding = 10 + pygame.draw.rect(self._CanvasHWND,MySkinManager.GiveColor('White'),(x-padding,y-padding, w+padding*2,h+padding*2)) + + pygame.draw.rect(self._CanvasHWND,MySkinManager.GiveColor('Black'),(x-padding,y-padding, w+padding*2,h+padding*2),1) + + self._CanvasHWND.blit(my_text,(x,y,w,h)) + + + +class BluetoothPage(Page): + _MyList = [] + #Wicd dbus part + _Adapter = None + _Dbus = None + _Devices = None + + _BlePassword = "" + _Connecting = False + _Scanning = False + + _PrevState = None + _Selector = None + + _ShowingMessageBox = False + _MsgBox = None + _ConnectTry = 0 + _BlockCb = None + + _LastStatusMsg = "" + _FootMsg = ["Nav","Info","Scan","Back","TryConnect"] + _Scroller = None + _ListFontObj = MyLangManager.TrFont("notosanscjk15") + + _InfoPage = None + + _ADAPTER_DEV = "hci0" + + _Offline = False + + _Leader = None + + def __init__(self): + Page.__init__(self) + self._MyList = [] + self._CanvasHWND = None + + def ShowBox(self,msg): + + self._MsgBox._Text = msg + self._ShowingMessageBox = True + self._Screen.Draw() + self._MsgBox.Draw() + self._Screen.SwapAndShow() + + def HideBox(self): + self.Draw() + self._ShowingMessageBox = False + self._Screen.SwapAndShow() + + def Init(self): + + self._PosX = self._Index * self._Screen._Width + self._Width = self._Screen._Width + self._Height = self._Screen._Height + + #self._CanvasHWND = pygame.Surface((self._Width,self._Height)) + self._CanvasHWND = self._Screen._CanvasHWND + + ps = BleListSelector() + ps._Parent = self + ps._Width = Width - 12 + + self._Ps = ps + self._PsIndex = 0 + + msgbox = BleListMessageBox() + msgbox._CanvasHWND = self._CanvasHWND + msgbox.Init(" ",MyLangManager.TrFont("veramono12")) + msgbox._Parent = self + + self._MsgBox = msgbox + + self._Scroller = ListScroller() + self._Scroller._Parent = self + self._Scroller._PosX = 2 + self._Scroller._PosY = 2 + self._Scroller.Init() + + self.GenNetworkList() + + self._InfoPage = BleInfoPage() + self._InfoPage._Screen = self._Screen + self._InfoPage._Name = "BluetoothInfo" + self._InfoPage.Init() + + def print_normal(self,address, properties): + print("[ " + address + " ]") + + for key in properties.keys(): + value = properties[key] + if type(value) is dbus.String: + value = unicode(value).encode('ascii', 'replace') + if (key == "Class"): + print(" %s = 0x%06x" % (key, value)) + else: + print(" %s = %s" % (key, value)) + + print() + + properties["Logged"] = True + + def skip_dev(self,old_dev, new_dev): + if not "Logged" in old_dev: + return False + if "Name" in old_dev: + return True + if not "Name" in new_dev: + return True + return False + + def DbusPropertiesChanged(self, interface, changed, invalidated, path): + global devices + print("DbusPropertiesChanged") + if interface != "org.bluez.Device1": + return + + if path in devices: + dev = devices[path] + + if self.skip_dev(dev, changed): + return + devices[path] = dict(devices[path].items() + changed.items()) + else: + devices[path] = changed + + if "Address" in devices[path]: + address = devices[path]["Address"] + else: + address = "" + + self._Devices = devices + self.print_normal(address, devices[path]) + + self.RefreshDevices() + self.GenNetworkList() + self._Screen.Draw() + self._Screen.SwapAndShow() + + def ShutDownConnecting(self): + print("Bluetooth Shutdown connecting...") + + def AbortedAndReturnToUpLevel(self): + self.HideBox() + self._Screen._FootBar.ResetNavText() + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + + def CheckIfBluetoothConnecting(self): + return True + + def TryConnect(self): + global bus + + if self._PsIndex >= len(self._MyList): + return + + cur_li = self._MyList[self._PsIndex] + print(cur_li._Path) + + if "Connected" in cur_li._Atts: + if cur_li._Atts["Connected"] == 1: + return + + proxy_obj = bus.get_object("org.bluez", cur_li._Path) + dev = dbus.Interface(proxy_obj, "org.bluez.Device1") + + self._Screen._FootBar.UpdateNavText("Connecting") + self.ShowBox(MyLangManager.Tr("Connecting")) + + self._Leader._MyAgent.device_obj = dev + self._Leader._MyAgent.dev_path = cur_li._Path + + try: + dev.Pair(reply_handler=self._Leader._MyAgent.pair_reply, + error_handler=self._Leader._MyAgent.pair_error,timeout=60000) + except Exception,e: + print(str(e)) + + + #self.HideBox() + #self._Screen._FootBar.ResetNavText() + + def RefreshDevices(self): + global devices + devices = {} + try: + proxy_obj = bus.get_object("org.bluez", "/") + manager = dbus.Interface(proxy_obj,"org.freedesktop.DBus.ObjectManager") + objects = manager.GetManagedObjects() + for path, interfaces in objects.iteritems(): + if "org.bluez.Device1" in interfaces: + devices[path] = interfaces["org.bluez.Device1"] ## like /org/bluez/hci0/dev_xx_xx_xx_yy_yy_yy + except Exception,e: + print(str(e)) + devices={} + + self._Devices = devices + + + def GenNetworkList(self): + self._MyList = [] + start_x = 0 + start_y = 0 + + counter = 0 + for i,v in enumerate(self._Devices): + if "Name" in self._Devices[v]: + if len(self._Devices[v]["Name"]) < 2: + continue + if re.match("[0-9a-f]{2}([-:]?)[0-9a-f]{2}(\\1[0-9a-f]{2}){4}$", self._Devices[v]["Name"].lower()): ## skip xx:xx:xx:xx:xx + continue + else: + continue + + ni = NetItem() + ni._Parent = self + ni._PosX = start_x + ni._PosY = start_y + counter* NetItem._Height + ni._Width = Width + ni._FontObj = self._ListFontObj + + ni.Init(v,self._Devices[v]) + + counter += 1 + self._MyList.append(ni) + + self._PsIndex = 0 + + def Rescan(self): + if self._Screen._CurrentPage != self: + return + + self._Scanning = True + self.ShowBox(MyLangManager.Tr("BluetoothScanning")) + self._Screen._FootBar.UpdateNavText("Scanning") + + proxy_obj = self._Dbus.get_object("org.bluez", "/org/bluez/" + self._ADAPTER_DEV) + adapter_props = dbus.Interface(proxy_obj,"org.freedesktop.DBus.Properties") + discoverying = adapter_props.Get("org.bluez.Adapter1", "Discovering") + print("discoverying", discoverying) + + + if self._Adapter!= None: + try: + self._Adapter.StopDiscovery() + except Exception,e: + print(str(e)) + + try: + self._Adapter.StartDiscovery() + except Exception,e: + err_name = e.get_dbus_name() + if err_name == "org.freedesktop.DBus.Error.NoReply": + print("start discovery timeout") + else: + print("start discovery unknown err: ", str(e)) + + def OnReturnBackCb(self): + self.RefreshDevices() + self.GenNetworkList() + + def OnLoadCb(self): + self._Offline = False + if self._Screen._TitleBar._InAirPlaneMode == False: + out = commands.getstatusoutput("hcitool dev | grep hci0 |cut -f3") ## bluetooth maybe dead after airplane mode + if len(out[1]) < 17: + self._Offline = True + print("Bluetooth OnLoadCb ,can not find hci0 alive,try to reboot") + else: + self.RefreshDevices() + self.GenNetworkList() + else: + self._Offline = True + + def KeyDown(self,event): + + if IsKeyMenuOrB(event.key): + if self._Offline == True: + self.AbortedAndReturnToUpLevel() + return + + if self._Adapter != None: + try: + self._Adapter.StopDiscovery() + except Exception,e: + print(str(e)) + + _connecting = self.CheckIfBluetoothConnecting() + if _connecting: + self.ShutDownConnecting() + self.ShowBox(MyLangManager.Tr("ShutDownConnecting")) + self.AbortedAndReturnToUpLevel() + else: + self.AbortedAndReturnToUpLevel() + else: + self.HideBox() + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + self._Screen._FootBar.ResetNavText() + + if event.key == CurKeys["Up"]: + self.ScrollUp() + self._Screen.Draw() + self._Screen.SwapAndShow() + if event.key == CurKeys["Down"]: + self.ScrollDown() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["X"]: + if self._Offline == False: + self.Rescan() + + if event.key == CurKeys["Y"]: + if len(self._MyList) == 0: + return + if self._Offline == True: + return + + self._InfoPage._AList = self._MyList[self._PsIndex]._Atts + self._InfoPage._Path = self._MyList[self._PsIndex]._Path + self._Screen.PushPage(self._InfoPage) + self._Screen.Draw() + self._Screen.SwapAndShow() + + if IsKeyStartOrA(event.key): + if self._Offline == False: + self.TryConnect() + + def Draw(self): + self.ClearCanvas() + if len(self._MyList) == 0: + return + + if len(self._MyList) * NetItem._Height > self._Height: + self._Ps._Width = self._Width - 11 + self._Ps.Draw() + + for i in self._MyList: + i.Draw() + + self._Scroller.UpdateSize( len(self._MyList)*NetItem._Height, self._PsIndex*NetItem._Height) + self._Scroller.Draw() + else: + self._Ps._Width = self._Width + self._Ps.Draw() + + for i in self._MyList: + i.Draw() + + + +BUS_NAME = 'org.bluez' +AGENT_INTERFACE = 'org.bluez.Agent1' +AGENT_PATH = "/gameshell/bleagent" + +class APIOBJ(object): + + _Page = None + _PairPage = None + _Page3 = None + _Prompts = {} # string key,string value + _PromptType = None + _MyAgent = None + + def __init__(self): + self._Prompts["PIN"]="" + self._Prompts["PASS"]="" + + def OnKbdReturnBackCb(self): + if self._PromptType == None: + return + else: + if self._PromptType in self._Prompts: + inputed = "".join(self._Page3._Textarea._MyWords) + self._Prompts[self._PromptType] = inputed + + self._PromptType = None ##clear + + + def Ask(self,prompt,prompt_type=None): + + self._Screen.PushPage(self._Page3) + self._Page3.SetPassword("") + self._Page3._Name = prompt + self._Page3._Caller = self + + self._Screen.Draw() + self._Screen.SwapAndShow() + + if prompt_type != None: + self._PromptType = prompt_type + + def RegisterMyAgent(self): + global AGENT_PATH, bus,devices,adapter + + capability = "KeyboardDisplay" + self._MyAgent = BleAgent(bus, AGENT_PATH) + self._MyAgent._Leader = self + + obj = bus.get_object(BUS_NAME, "/org/bluez"); + manager = dbus.Interface(obj, "org.bluez.AgentManager1") + manager.RegisterAgent(AGENT_PATH, capability) + print("BleAgent %s registered" % AGENT_PATH) + + def Init(self,main_screen): + global bus,devices,adapter + + self._Page = BluetoothPage() + self._Page._Dbus = bus + self._Page._Devices = devices + self._Page._Adapter = adapter + + self._Page._Screen = main_screen + self._Page._Name ="Bluetooth" + + self._Page._Leader = self + + self._Page.Init() + + self._PairPage = BleAgentPairPage() + self._PairPage._Screen = main_screen + self._PairPage._Name = "Bluetooth" + self._PairPage.Init() + + self._Page3= Keyboard() + self._Page3._Name = "Enter" + self._Page3._Screen = main_screen + self._Page3.Init() + + bus.add_signal_receiver(self._Page.DbusPropertiesChanged, + dbus_interface = "org.freedesktop.DBus.Properties", + signal_name = "PropertiesChanged", + arg0 = "org.bluez.Device1", + path_keyword = "path") + + self.RegisterMyAgent() + + def API(self,main_screen): + if main_screen !=None: + main_screen.PushPage(self._Page) + main_screen.Draw() + main_screen.SwapAndShow() + +OBJ = APIOBJ() +def Init(main_screen): + OBJ.Init(main_screen) +def API(main_screen): + OBJ.API(main_screen) diff --git a/Menu/GameShell/10_Settings/Bluetooth/agent.py b/Menu/GameShell/10_Settings/Bluetooth/agent.py new file mode 100644 index 0000000..f49e012 --- /dev/null +++ b/Menu/GameShell/10_Settings/Bluetooth/agent.py @@ -0,0 +1,224 @@ +# -*- coding: utf-8 -*- + +import pygame +#import math +#import commands +import dbus +#from beeprint import pp +from libs.roundrects import aa_round_rect +from UI.page import Page,PageSelector +from UI.keys_def import CurKeys, IsKeyMenuOrB +from libs.DBUS import bus, adapter,devices + + +BUS_NAME = 'org.bluez' +AGENT_INTERFACE = 'org.bluez.Agent1' +AGENT_PATH = "/gameshell/bleagent" + +class Rejected(dbus.DBusException): + _dbus_error_name = "org.bluez.Error.Rejected" + +class BleAgent(dbus.service.Object): + device_obj = None + _Leader = None + dev_path = "" + + def set_trusted(self,path): + global BUS_NAME + props = dbus.Interface(bus.get_object(BUS_NAME, path), + "org.freedesktop.DBus.Properties") + props.Set("org.bluez.Device1", "Trusted", True) + + def dev_connect(self,path): + global BUS_NAME + dev = dbus.Interface(bus.get_object(BUS_NAME, path), + "org.bluez.Device1") + + print("dev_connect %s" % path) + try: + dev.Connect() + except Exception,e: + print(str(e)) + + @dbus.service.method(AGENT_INTERFACE,in_signature="", out_signature="") + def Release(self): + print("Agent release") + + + @dbus.service.method(AGENT_INTERFACE,in_signature="os", out_signature="") + def AuthorizeService(self, device, uuid): + print("AuthorizeService (%s, %s)" % (device, uuid)) ## directly authrized + return + + @dbus.service.method(AGENT_INTERFACE,in_signature="o", out_signature="s") + def RequestPinCode(self, device): + print("RequestPinCode (%s)" % (device)) + set_trusted(device) + return "0000" + + @dbus.service.method(AGENT_INTERFACE,in_signature="o", out_signature="u") + def RequestPasskey(self, device): + print("RequestPasskey (%s)" % (device)) + set_trusted(device) + passkey = "000000" + return dbus.UInt32(passkey) + + @dbus.service.method(AGENT_INTERFACE,in_signature="ouq", out_signature="") + def DisplayPasskey(self, device, passkey, entered): + print("DisplayPasskey (%s, %06u entered %u)" % (device, passkey, entered)) + self._Leader._PairPage.ShowPassKey(device,passkey,entered) + + @dbus.service.method(AGENT_INTERFACE,in_signature="os", out_signature="") + def DisplayPinCode(self, device, pincode): + print("DisplayPinCode (%s, %s)" % (device, pincode)) + self._Leader._PairPage.ShowPinCode(device,pincode) + + @dbus.service.method(AGENT_INTERFACE,in_signature="ou", out_signature="") + def RequestConfirmation(self, device, passkey): + print("RequestConfirmation (%s, %06d)" % (device, passkey)) + set_trusted(device) + return + + @dbus.service.method(AGENT_INTERFACE,in_signature="o", out_signature="") + def RequestAuthorization(self, device): + print("RequestAuthorization (%s)" % (device)) + + return + + @dbus.service.method(AGENT_INTERFACE,in_signature="", out_signature="") + def Cancel(self): + print("Cancel") + + + def pair_reply(self): + print("Device paired under Agent") + self.set_trusted(self.dev_path) + self.dev_connect(self.dev_path) + + self._Leader._PairPage._dev_obj = self.device_obj + self._Leader._PairPage.PairReplyCb() + + def pair_error(self,error): + global adapter + err_msg = "" + err_name = error.get_dbus_name() + print(err_name) + if err_name == "org.freedesktop.DBus.Error.NoReply" and self.device_obj: + err_msg = "Timed out. Cancelling pairing" + print(err_msg) + self.device_obj.CancelPairing() + elif err_name == "org.bluez.Error.AuthenticationCanceled": + err_msg = "Authentication Canceled" + elif err_name == "org.bluez.Error.ConnectionAttemptFailed": + err_msg = "Page Timeout" + elif err_name == "org.bluez.Error.AlreadyExists": + err_msg ="Already Exists" + try: + adapter.RemoveDevice(self.device_obj) + except Exception,e: + print("pair_error forget err:",str(e)) + + elif err_name == "org.bluez.Error.AuthenticationFailed": + err_msg = "Authentication Failed" + else: + err_msg = "Pair error" + print( err_name,str(error) ) + + self.device_obj = None + self._Leader._PairPage.PairErrorCb(err_msg) + +class BleAgentPairPage(Page): + + ##show pin/password + ##show prompt + _Pin = "" + _Pass = "" + _dev_obj = None + _FootMsg = ["Nav","","","Back",""] + + def Init(self): + self._PosX = self._Index * self._Screen._Width + self._Width = self._Screen._Width + self._Height = self._Screen._Height + + #self._CanvasHWND = pygame.Surface((self._Width,self._Height)) + self._CanvasHWND = self._Screen._CanvasHWND + + def ShowPinCode(self,device,pincode): + print("ShowPinCode %s %s" % (device,pincode)) + if self._Screen.CurPage() != self: + self._Screen.PushPage(self) + self.ClearCanvas() + self._Screen.Draw() + self._Screen.SwapAndShow() + + self._Pin = "%s" % pincode + txt = self.Pin + if len(self._Pin) > 0: + txt = "Pin code: %s" % self._Pin + self._Screen._MsgBox.SetText(txt) + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + + def ShowPassKey(self,device,passkey,entered): + print("ShowPassKey %06u %u" % (passkey,entered)) + if self._Screen.CurPage() != self: + self._Screen.PushPage(self) + self.ClearCanvas() + self._Screen.Draw() + self._Screen.SwapAndShow() + + self._Pass = "%06u" % passkey + if len(self._Pass) > 0: + txt = "Pair code: %s" % self._Pass + self._Screen._MsgBox.SetText(txt) + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + + def PairReplyCb(self): + self.ClearCanvas() + self._Screen.Draw() + self._Screen.SwapAndShow() + + self._Screen._MsgBox.SetText("Device paired") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + pygame.time.delay(1500) + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + self._Screen._FootBar.ResetNavText() + + def PairErrorCb(self,error=None): + self.ClearCanvas() + self._Screen.Draw() + self._Screen.SwapAndShow() + + self._Screen._MsgBox.SetText(error) + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + pygame.time.delay(1500) + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + self._Screen._FootBar.ResetNavText() + + def KeyDown(self,event): + if IsKeyMenuOrB(event.key): + if self._dev_obj != None: + try: + self._dev_obj.CancelPairing() + except Exception,e: + print(str(e)) + + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + + def Draw(self): + pass + #self.ClearCanvas() + + + diff --git a/Menu/GameShell/10_Settings/Bluetooth/net_item.py b/Menu/GameShell/10_Settings/Bluetooth/net_item.py new file mode 100644 index 0000000..cc37882 --- /dev/null +++ b/Menu/GameShell/10_Settings/Bluetooth/net_item.py @@ -0,0 +1,128 @@ +# -*- coding: utf-8 -*- + +import pygame + +## local UI import +from UI.page import Page +from UI.label import Label +from UI.icon_item import IconItem +from UI.multi_icon_item import MultiIconItem +from UI.icon_pool import MyIconPool +from UI.skin_manager import MySkinManager + + +class NetItemMultiIcon(MultiIconItem): + _CanvasHWND = None + _Parent = None + _Width = 18 + _Height = 18 + + def Draw(self): + self._CanvasHWND.blit(self._ImgSurf,(self._PosX,self._PosY+(self._Parent._Height-self._Height)/2,self._Width,self._Height), + (0,self._IconIndex*self._IconHeight,self._IconWidth,self._IconHeight)) + +class NetItemIcon(IconItem): + + _CanvasHWND = None + _Parent = None + _Width = 18 + _Height = 18 + + def Draw(self): + self._CanvasHWND.blit(self._ImgSurf,(self._PosX,self._PosY+(self._Parent._Height-self._Height)/2,self._Width,self._Height)) + + +class NetItem(object): + _PosX = 0 + _PosY = 0 + _Width = 0 + _Height = 30 + + _Atts = {} + + _Channel="" # '10' + _Stren = "" ## 19% + + _Parent = None + _IsActive = False + + _Icons = {} ## wifi strength and security icons + _Labels = {} + _FontObj = None + + _RSSI = 0 + _MacAddr="" + _Path = "" #/org/bluez/hci0/dev_34_88_5D_97_FF_26 + + def __init__(self): + self._Labels = {} + self._Icons = {} + + def SetActive(self,act): + self._IsActive = act + + def Init(self, path, object): + self._Path = path + self._Atts = object + + is_active=False + if "Address" in object: + self._MacAddr = object["Address"] + + if "Connected" in object: + if object["Connected"] == 1: + is_active=True + + if is_active: + self.SetActive(is_active) + + + name_label = Label() + name_label._PosX = 12 + name_label._CanvasHWND = self._Parent._CanvasHWND + + mac_addr = self._MacAddr + + if "Name" in object: + if len(object["Name"]) > 3: + mac_addr = object["Name"] + + if "RSSI" in object: + print(object["RSSI"]) + self._RSSI = int(object["RSSI"]) + + mac_addr = mac_addr[:34] + + name_label.Init(mac_addr,self._FontObj) + + self._Labels["mac_addr"] = name_label + + done_icon = NetItemIcon() + done_icon._ImgSurf = MyIconPool.GiveIconSurface("done") + done_icon._CanvasHWND = self._Parent._CanvasHWND + done_icon._Parent = self + + self._Icons["done"] = done_icon + ## reuse the resource from TitleBar + #pp(theString) + + + def Connect(self,notworkentry=None): + """ Execute connection. """ + #dev = dbus.Interface(bus.get_object("org.bluez", "/org/bluez/hci0/dev_"+"34_88_5D_97_FF_26"), "org.bluez.Device1") + proxy_obj = self._Parent._Dbus.get_object("org.bluez",self._Path) + dev = self._Parent._Dbus.Interface(proxy_obj, "org.bluez.Device1") + dev.Connect() + + def Draw(self): + #pygame.draw.line(self._Parent._CanvasHWND,(169,169,169),(self._PosX,self._PosY),(self._PosX+self._Width,self._PosY),1) + for i in self._Labels: + self._Labels[i]._PosY = self._PosY + (self._Height - self._Labels[i]._Height)/2 + self._Labels[i].Draw() + + if self._IsActive: + self._Icons["done"].NewCoord(320-22,self._PosY) + self._Icons["done"].Draw() + + pygame.draw.line(self._Parent._CanvasHWND,MySkinManager.GiveColor('Line'), + (self._PosX,self._PosY+self._Height-1),(self._PosX+self._Width,self._PosY+self._Height-1),1) diff --git "a/Menu/GameShell/10_Settings/Brightness/Icon\r" "b/Menu/GameShell/10_Settings/Brightness/Icon\r" new file mode 100644 index 0000000..e69de29 diff --git a/Menu/GameShell/10_Settings/Brightness/__init__.py b/Menu/GameShell/10_Settings/Brightness/__init__.py new file mode 100644 index 0000000..5f8fd9a --- /dev/null +++ b/Menu/GameShell/10_Settings/Brightness/__init__.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- + +## local UI import +import pages +import myvars + +def Init(main_screen): + pages.InitBrightnessPage(main_screen) + +def API(main_screen): + + if main_screen !=None: + main_screen.PushCurPage() + main_screen.SetCurPage(myvars.BrightnessPage) + main_screen.Draw() + main_screen.SwapAndShow() + diff --git a/Menu/GameShell/10_Settings/Brightness/brightness_page.py b/Menu/GameShell/10_Settings/Brightness/brightness_page.py new file mode 100644 index 0000000..2d65fb2 --- /dev/null +++ b/Menu/GameShell/10_Settings/Brightness/brightness_page.py @@ -0,0 +1,187 @@ +# -*- coding: utf-8 -*- + +import pygame + + +#import math + +## local UI import +from UI.constants import Width,Height,ICON_TYPES +from UI.page import Page,PageSelector +from UI.label import Label +from UI.icon_item import IconItem +from UI.util_funcs import midRect +from UI.keys_def import CurKeys, IsKeyMenuOrB +from UI.slider import Slider +from UI.icon_pool import MyIconPool +from UI.multi_icon_item import MultiIconItem +from UI.skin_manager import MySkinManager + + +from config import BackLight + + +import myvars + +class BSlider(Slider): + + + OnChangeCB = None + _Parent = None + _Icons = {} + + def __init__(self): + Slider.__init__(self) + self._Icons = {} + def Init(self): + self._Width = self._Parent._Width + self._Height = self._Parent._Height + + self._BrightnessLabel = Label() + self._BrightnessLabel.SetCanvasHWND(self._CanvasHWND) + self._BrightnessLabel.Init("BRIGHT",MySkinManager.GiveFont("EurostileBold13")) + self._BrightnessLabel.SetColor(MySkinManager.GiveColor('Text')) + + + def SetValue(self,brt): + self._Value = brt + + def Further(self): + self._Value+=1 + if self._Value > 9: + self._Value = 9 + + if self.OnChangeCB != None: + if callable(self.OnChangeCB): + self.OnChangeCB(self._Value) + + def StepBack(self): + self._Value-=1 + + if self._Value < 1: + self._Value = 1 + + if self.OnChangeCB != None: + if callable(self.OnChangeCB): + self.OnChangeCB(self._Value) + + def Draw(self): + start_x = 82 + start_y = self._Parent._Screen._Height/2-5 + height = 30 + width = 4 + padding = 15 + seg = self._Value-1 + + for i in range(0,9): + rect = pygame.Rect(start_x+i*(width+padding),start_y,width,height) + if i > seg: + pygame.draw.rect(self._CanvasHWND,MySkinManager.GiveColor('Text'),rect, 1) + #aa_round_rect(self._CanvasHWND,rect, MySkinManager.GiveColor('Text'),1,1, MySkinManager.GiveColor('White')) + else: + pygame.draw.rect(self._CanvasHWND,MySkinManager.GiveColor('Text'),rect, 0) + #aa_round_rect(self._CanvasHWND,rect, MySkinManager.GiveColor('Text'),1,0, MySkinManager.GiveColor('White')) + + self._BrightnessLabel.NewCoord(118,self._Parent._Screen._Height/2-30) + self._BrightnessLabel.Draw(True) + + minus_box_rect = pygame.Rect(start_x- (4+6)*4,start_y,6*4,30) + pygame.draw.rect(self._CanvasHWND,MySkinManager.GiveColor('Text'),minus_box_rect, 0) + + minus_rect = pygame.Rect(start_x-8*4,start_y+14,2*4,2) + pygame.draw.rect(self._CanvasHWND,MySkinManager.GiveColor('White'),minus_rect, 0) + + plus_box_rect = pygame.Rect(start_x + 39*4 +4*4,start_y,6*4,30) + pygame.draw.rect(self._CanvasHWND,MySkinManager.GiveColor('Text'),plus_box_rect, 0) + + cross1_rect = pygame.Rect(start_x+39*4+4*4+2*4,start_y+14,2*4,2) + pygame.draw.rect(self._CanvasHWND,MySkinManager.GiveColor('White'),cross1_rect, 0) + cross2_rect = pygame.Rect(start_x+39*4+4*4+2*4+3,start_y+14-3,2,2*4) + pygame.draw.rect(self._CanvasHWND,MySkinManager.GiveColor('White'),cross2_rect, 0) + + + +class BrightnessPage(Page): + + _MySlider = None + _FootMsg = ["Nav","","","Back","Enter"] + + + def Init(self): + self._CanvasHWND = self._Screen._CanvasHWND + self._Width = self._Screen._Width + self._Height = self._Screen._Height + + self._MySlider = BSlider() +# self._MySlider._Width = Width - 20 +# self._MySlider._Height = 30 +# self._MySlider._PosX = (self._Width - self._MySlider._Width)/2 +# self._MySlider._PosY = 40 + self._MySlider._Parent = self + self._MySlider.SetCanvasHWND(self._CanvasHWND) + self._MySlider.OnChangeCB = self.WhenSliderDrag + self._MySlider.Init() + + brt = self.ReadBackLight() + + self._MySlider.SetValue( brt) + + + def ReadBackLight(self): + try: + f = open(BackLight) + except IOError: + return 0 + else: + with f: + content = f.readlines() + content = [x.strip() for x in content] + return int(content[0]) + + return 0 + + def OnLoadCb(self): + brt = self.ReadBackLight() + + self._MySlider.SetValue( brt) + + def SetBackLight(self,newbrt): + try: + f = open(BackLight,'w') + except IOError: + print("Open write %s failed %d" % (BackLight,newbrt)) + return False + else: + with f: + f.write(str(newbrt)) + return True + + def WhenSliderDrag(self,value): ##value + self.SetBackLight(value) + + def KeyDown(self,event): + + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Right"]: + self._MySlider.Further() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Left"]: + self._MySlider.StepBack() + self._Screen.Draw() + self._Screen.SwapAndShow() + + def Draw(self): + self.ClearCanvas() + + self._MySlider.Draw() + + + + + diff --git a/Menu/GameShell/10_Settings/Brightness/myvars.py b/Menu/GameShell/10_Settings/Brightness/myvars.py new file mode 100644 index 0000000..caa03de --- /dev/null +++ b/Menu/GameShell/10_Settings/Brightness/myvars.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- + +import os +import sys + +SoundPage = None diff --git a/Menu/GameShell/10_Settings/Brightness/pages.py b/Menu/GameShell/10_Settings/Brightness/pages.py new file mode 100644 index 0000000..643adb9 --- /dev/null +++ b/Menu/GameShell/10_Settings/Brightness/pages.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- + +from brightness_page import BrightnessPage + +import myvars + +def InitBrightnessPage(main_screen): + + myvars.BrightnessPage = BrightnessPage() + + myvars.BrightnessPage._Screen = main_screen + myvars.BrightnessPage._Name = "Brightness" + myvars.BrightnessPage.Init() diff --git "a/Menu/GameShell/10_Settings/ButtonsLayout/Icon\r" "b/Menu/GameShell/10_Settings/ButtonsLayout/Icon\r" new file mode 100644 index 0000000..e69de29 diff --git a/Menu/GameShell/10_Settings/ButtonsLayout/__init__.py b/Menu/GameShell/10_Settings/ButtonsLayout/__init__.py new file mode 100644 index 0000000..70ad3da --- /dev/null +++ b/Menu/GameShell/10_Settings/ButtonsLayout/__init__.py @@ -0,0 +1,267 @@ +# -*- coding: utf-8 -*- + +import pygame +import commands +import shutil +import os + +from libs.roundrects import aa_round_rect +from UI.constants import Width,Height,ICON_TYPES +from UI.page import Page,PageSelector +from UI.label import Label +from UI.util_funcs import midRect +from UI.keys_def import CurKeys, GetButtonsLayoutMode, SetButtonsLayoutMode, IsKeyStartOrA, IsKeyMenuOrB +from UI.scroller import ListScroller +from UI.icon_pool import MyIconPool +from UI.icon_item import IconItem +from UI.multi_icon_item import MultiIconItem +from UI.multilabel import MultiLabel +from UI.confirm_page import ConfirmPage + +class UpdateConfirmPage(ConfirmPage): + _ConfirmText = "Apply to RetroArch?" + _RetroArchConf = "/home/cpi/.config/retroarch/retroarch.cfg" + _LayoutMode = "Unknown" + + def ModifyRetroArchConf(self,keys): + + try: + with open(self._RetroArchConf, mode="r") as f: + confarr = f.readlines() + except: + return "retroarch.cfg cannot open." + + bka = bkb = bkx = bky = False + try: + for i, ln in enumerate(confarr): + lnk = ln.split("=")[0].strip() + if lnk == "input_player1_a": + confarr[i] = "input_player1_a = \"" + keys[0] + "\"\n" + bka = True + if lnk == "input_player1_b": + confarr[i] = "input_player1_b = \"" + keys[1] + "\"\n" + bkb = True + if lnk == "input_player1_x": + confarr[i] = "input_player1_x = \"" + keys[2] + "\"\n" + bkx = True + if lnk == "input_player1_y": + confarr[i] = "input_player1_y = \"" + keys[3] + "\"\n" + bky = True + except: + return "retroarch.cfg cannot parse." + + if bka and bkb and bkx and bky: + None + else: + return "retroarch.cfg validation error." + + try: + with open(self._RetroArchConf, mode="w") as f: + confarr = f.writelines(confarr) + except: + return "retroarch.cfg cannot write." + + return "Completed! Your RA keymap: " + self._LayoutMode.upper() + + def KeyDown(self,event): + + def finalizeWithDialog(msg): + self._Screen._MsgBox.SetText(msg) + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + return + + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if IsKeyStartOrA(event.key): + + if self._LayoutMode == "xbox": + keymap = ["j","k","u","i"] + elif self._LayoutMode == "snes": + keymap = ["k","j","i","u"] + else: + finalizeWithDialog("Internal error.") + return + print("mode: " + self._LayoutMode) + + if not os.path.isfile(self._RetroArchConf): + finalizeWithDialog("retroarch.cfg was not found.") + return + + try: + shutil.copyfile(self._RetroArchConf, self._RetroArchConf + ".blbak") + except: + finalizeWithDialog("Cannot create .blbak") + return + + finalizeWithDialog(self.ModifyRetroArchConf(keymap)) + return + + def OnReturnBackCb(self): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + def Draw(self): + self.ClearCanvas() + self.DrawBG() + for i in self._MyList: + i.Draw() + + self.Reset() + +class ButtonsLayoutPage(Page): + _FootMsg = ["Nav.","","UpdateRetroArch","Back","Toggle"] + _MyList = [] + + _AList = {} + + _Scrolled = 0 + + _BGwidth = 320 + _BGheight = 240-24-20 + + _DrawOnce = False + _Scroller = None + _ConfirmPage = None + + _EasingDur = 30 + + _dialog_index = 0 + + def __init__(self): + Page.__init__(self) + self._Icons = {} + + def GenList(self): + + self._MyList = [] + + + + def Init(self): + if self._Screen != None: + if self._Screen._CanvasHWND != None and self._CanvasHWND == None: + self._HWND = self._Screen._CanvasHWND + self._CanvasHWND = pygame.Surface( (self._Screen._Width,self._BGheight) ) + + self._PosX = self._Index*self._Screen._Width + self._Width = self._Screen._Width ## equal to screen width + self._Height = self._Screen._Height + + DialogBoxs = MultiIconItem() + DialogBoxs._ImgSurf = MyIconPool.GiveIconSurface("buttonslayout") + DialogBoxs._MyType = ICON_TYPES["STAT"] + DialogBoxs._Parent = self + DialogBoxs._IconWidth = 300 + DialogBoxs._IconHeight = 150 + DialogBoxs.Adjust(0,0,134,372,0) + self._Icons["DialogBoxs"] = DialogBoxs + + self.GenList() + self._Scroller = ListScroller() + self._Scroller._Parent = self + self._Scroller._PosX = self._Width - 10 + self._Scroller._PosY = 2 + self._Scroller.Init() + self._Scroller.SetCanvasHWND(self._HWND) + + self._ConfirmPage = UpdateConfirmPage() + self._ConfirmPage._LayoutMode = GetButtonsLayoutMode() + self._ConfirmPage._Screen = self._Screen + self._ConfirmPage._Name = "Overwrite RA conf" + self._ConfirmPage._Parent = self + self._ConfirmPage.Init() + + + def ScrollDown(self): + dis = 10 + if abs(self._Scrolled) < (self._BGheight - self._Height)/2 + 0: + self._PosY -= dis + self._Scrolled -= dis + + def ScrollUp(self): + dis = 10 + if self._PosY < 0: + self._PosY += dis + self._Scrolled += dis + + def ToggleMode(self): + + if GetButtonsLayoutMode() == "xbox": + SetButtonsLayoutMode("snes") + + self._dialog_index = 1 + self._Screen.Draw() + self._Screen.SwapAndShow() + else: + SetButtonsLayoutMode("xbox") + + self._dialog_index = 0 + self._Screen.Draw() + self._Screen.SwapAndShow() + + def OnLoadCb(self): + self._Scrolled = 0 + self._PosY = 0 + self._DrawOnce = False + + self._dialog_index = 0 if GetButtonsLayoutMode() == "xbox" else 1 + + def OnReturnBackCb(self): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + def KeyDown(self,event): + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if IsKeyStartOrA(event.key): + self.ToggleMode() + + if event.key == CurKeys["X"]: + self._ConfirmPage._LayoutMode = GetButtonsLayoutMode() + self._Screen.PushPage(self._ConfirmPage) + self._Screen.Draw() + self._Screen.SwapAndShow() + + def Draw(self): + self.ClearCanvas() + + self._Icons["DialogBoxs"].NewCoord(0,30) + self._Icons["DialogBoxs"]._IconIndex = self._dialog_index + self._Icons["DialogBoxs"].DrawTopLeft() + + if self._HWND != None: + self._HWND.fill((255,255,255)) + self._HWND.blit(self._CanvasHWND,(self._PosX,self._PosY,self._Width, self._Height ) ) + +class APIOBJ(object): + + _Page = None + def __init__(self): + pass + def Init(self,main_screen): + self._Page = ButtonsLayoutPage() + self._Page._Screen = main_screen + self._Page._Name ="Buttons Layout" + self._Page.Init() + + def API(self,main_screen): + if main_screen !=None: + main_screen.PushPage(self._Page) + main_screen.Draw() + main_screen.SwapAndShow() + +OBJ = APIOBJ() +def Init(main_screen): + OBJ.Init(main_screen) +def API(main_screen): + OBJ.API(main_screen) + diff --git a/Menu/GameShell/10_Settings/Cores/__init__.py b/Menu/GameShell/10_Settings/Cores/__init__.py new file mode 100644 index 0000000..045317f --- /dev/null +++ b/Menu/GameShell/10_Settings/Cores/__init__.py @@ -0,0 +1,252 @@ +# -*- coding: utf-8 -*- + +import os +import platform +import pygame +import glob +#import math +import commands + +#from beeprint import pp +from libs.roundrects import aa_round_rect +#import gobject +#from wicd import misc +## local UI import +from UI.constants import Width,Height,ICON_TYPES +from UI.page import Page,PageSelector +from UI.label import Label +from UI.util_funcs import midRect,FileExists,IsExecutable,ArmSystem,CmdClean +from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB +from UI.scroller import ListScroller +from UI.icon_pool import MyIconPool +from UI.icon_item import IconItem +from UI.confirm_page import ConfirmPage +from UI.multi_icon_item import MultiIconItem +from UI.lang_manager import MyLangManager +from UI.multilabel import MultiLabel +from UI.info_page_list_item import InfoPageListItem +from UI.info_page_selector import InfoPageSelector +from UI.skin_manager import MySkinManager + + +class DeleteCoreConfirmPage(ConfirmPage): + + _ConfirmText = MyLangManager.Tr("Awaiting Input") + _FootMsg = ["Nav","","","Cancel","OK"] + CallbackA = None + + def KeyDown(self,event): + + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if IsKeyStartOrA(event.key): + self._Screen._MsgBox.SetText("Applying") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + + pygame.time.delay(638) + + self.CallbackA() + + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + +class CoresPage(Page): + _FootMsg = ["Nav","Del","Scan","Back",""] + _MyList = [] + _ListFontObj = MyLangManager.TrFont("varela13") + + _AList = {} + + _Scrolled = 0 + + _BGwidth = 320 + _BGheight = 240-24-20 + + _DrawOnce = False + _Scroller = None + + _EasingDur = 30 + + _CORES_PATH = "%s/.config/retroarch/cores" % os.path.expanduser('~') + + _Config =None + _AllowedExts = [".so",".bin"] + _HiddenSos = ["GBA.BIOS","gba_bios.bin"] + + def __init__(self): + Page.__init__(self) + self._Icons = {} + + if "arm" in platform.machine(): + pass + + def GenList(self): + + self._MyList = [] + ## map ini to self._AList + files_path = glob.glob(self._CORES_PATH+"/*") + + start_x = 10 + start_y = 0 + counter = 0 + for i,v in enumerate( files_path): + if os.path.basename(v) in self._HiddenSos: + continue + + filename, file_extension = os.path.splitext(v) + + alias_file = filename+file_extension + ".alias" + + if file_extension in self._AllowedExts: + li = InfoPageListItem() + li._Parent = self + li._PosX = start_x + li._PosY = start_y + counter*InfoPageListItem._Height + li._Width = Width-10 + li._Fonts["normal"] = self._ListFontObj + li._Fonts["small"] = MySkinManager.GiveFont("varela12") + li._ReadOnly = True + + if os.path.isfile(alias_file): + fp = open(alias_file, "r") + alias = fp.read() + alias = alias.strip() + label_text = alias.decode("utf8") + li.Init( label_text ) + fp.close() + else: + li.Init( os.path.basename(v) ) + li._Flag = v + ##li.SetSmallText( v ) + + self._MyList.append(li) + counter += 1 + + def Init(self): + if self._Screen != None: + if self._Screen._CanvasHWND != None and self._CanvasHWND == None: + self._CanvasHWND = self._Screen._CanvasHWND + + self._PosX = self._Index*self._Screen._Width + self._Width = self._Screen._Width ## equal to screen width + self._Height = self._Screen._Height + + ps = InfoPageSelector() + ps._PosX = 11 + ps._Parent = self + ps._Width = self._Width-10 + self._Ps = ps + self._PsIndex = 0 + + self._Scroller = ListScroller() + self._Scroller._Parent = self + self._Scroller._PosX = 2 + self._Scroller._PosY = 2 + self._Scroller.Init() + + self._ConfirmBox = DeleteCoreConfirmPage() + self._ConfirmBox._Screen = self._Screen + self._ConfirmBox._Name = "Confirm to Delete?" + self._ConfirmBox._Parent = self + self._ConfirmBox.Init() + + def ReScan(self): + self.GenList() + self.RefreshPsIndex() + + def ConfirmBoxCallbackA(self): + if len(self._MyList) == 0: + return + + cur_li = self._MyList[self._PsIndex] + + os.system("rm %s" % CmdClean(cur_li._Flag)) + self.GenList() + self.RefreshPsIndex() + + def OnLoadCb(self): + self._Scrolled = 0 + self._PosY = 0 + self._DrawOnce = False + self.GenList() + + def OnReturnBackCb(self): + pass + + def KeyDown(self,event): + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["X"]: #Scan current + self.ReScan() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Y"]: #del + if len(self._MyList) == 0: + return + + self._ConfirmBox.CallbackA = self.ConfirmBoxCallbackA + + self._Screen.PushPage(self._ConfirmBox) + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Up"]: + self.ScrollUp() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Down"]: + self.ScrollDown() + self._Screen.Draw() + self._Screen.SwapAndShow() + + + + def Draw(self): + self.ClearCanvas() + + if len(self._MyList) > 0: + self._Ps.Draw() + for i in self._MyList: + i.Draw() + + self._Scroller.UpdateSize( len(self._MyList)*InfoPageListItem._Height, + self._PsIndex*InfoPageListItem._Height) + self._Scroller.Draw() + + + + +class APIOBJ(object): + + _Page = None + def __init__(self): + pass + def Init(self,main_screen): + self._Page = CoresPage() + self._Page._Screen = main_screen + self._Page._Name ="Retroarch cores manager" + self._Page.Init() + + def API(self,main_screen): + if main_screen !=None: + main_screen.PushPage(self._Page) + main_screen.Draw() + main_screen.SwapAndShow() + +OBJ = APIOBJ() +def Init(main_screen): + OBJ.Init(main_screen) +def API(main_screen): + OBJ.API(main_screen) + + diff --git a/Menu/GameShell/10_Settings/GateWay/__init__.py b/Menu/GameShell/10_Settings/GateWay/__init__.py new file mode 100644 index 0000000..8a5bc0a --- /dev/null +++ b/Menu/GameShell/10_Settings/GateWay/__init__.py @@ -0,0 +1,349 @@ +# -*- coding: utf-8 -*- +import os +import pygame +import platform +import commands +#import glob +#from beeprint import pp +from libs.roundrects import aa_round_rect + +## local UI import +from UI.constants import Width,Height,ICON_TYPES,RESTARTUI +from UI.page import Page,PageSelector +from UI.label import Label +from UI.util_funcs import midRect,FileExists +from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB +from UI.scroller import ListScroller +from UI.icon_pool import MyIconPool +from UI.icon_item import IconItem +from UI.multilabel import MultiLabel +from UI.skin_manager import MySkinManager +from UI.lang_manager import MyLangManager +from UI.info_page_list_item import InfoPageListItem +from UI.info_page_selector import InfoPageSelector + +from libs.DBUS import is_wifi_connected_now +import config + +class ListPageSelector(InfoPageSelector): + def Draw(self): + idx = self._Parent._PsIndex + + if idx < len(self._Parent._MyList): + x = self._Parent._MyList[idx]._PosX+2 ## ++ + y = self._Parent._MyList[idx]._PosY+1 + h = self._Parent._MyList[idx]._Height -3 + + self._PosX = x + self._PosY = y + self._Height = h + + aa_round_rect(self._Parent._CanvasHWND, + (x,y,self._Width-4,h),self._BackgroundColor,4,0,self._BackgroundColor) + + +class PageListItem(InfoPageListItem): + _PosX = 0 + _PosY = 0 + _Width = 0 + _Height = 30 + + _Labels = {} + _Icons = {} + _Fonts = {} + + _LinkObj = None + + _Active = False + _Value = "" + + def Draw(self): + + self._Labels["Text"]._PosY = self._PosY+ (self._Height- self._Labels["Text"]._Height)/2 + + if self._Active == True: + self._Parent._Icons["done"].NewCoord( self._Parent._Width-30,self._PosY+5) + self._Parent._Icons["done"].Draw() + + self._Labels["Text"].Draw(self._Active) + + if "Small" in self._Labels: + self._Labels["Small"]._PosX = self._Width - self._Labels["Small"]._Width -10 + self._Labels["Small"]._PosY = self._PosY + (self._Height- self._Labels["Small"]._Height)/2 + self._Labels["Small"].Draw() + + pygame.draw.line(self._Parent._CanvasHWND,MySkinManager.GiveColor('Line'),(self._PosX,self._PosY+self._Height-1),(self._PosX+self._Width,self._PosY+self._Height-1),1) + +class GateWayPage(Page): + _FootMsg = ["Nav","Clear All","","Back","Select"] + _MyList = [] + _ListFont = MyLangManager.TrFont("notosanscjk15") + + _AList = {} + + _Scrolled = 0 + + _BGwidth = 320 + _BGheight = 240-24-20 + + _DrawOnce = False + _Scroller = None + _InfoPage = None + + def __init__(self): + Page.__init__(self) + self._Icons = {} + + def GenList(self): + + self._MyList = [] + + start_x = 0 + start_y = 0 + last_height = 0 + + drivers = [["usb0","USB Ethernet"], + ["wlan0","Wi-Fi"]] + + + for i,u in enumerate( drivers ): + #print(i,u) + li = PageListItem() + li._Parent = self + li._PosX = start_x + li._PosY = start_y + last_height + li._Width = Width + li._Fonts["normal"] = self._ListFont + li._Active = False + li._Value = u[0] + li.Init( u[1] ) + + last_height += li._Height + + self._MyList.append(li) + + def Init(self): + if self._Screen != None: + if self._Screen._CanvasHWND != None and self._CanvasHWND == None: + self._HWND = self._Screen._CanvasHWND + self._CanvasHWND = pygame.Surface( (self._Screen._Width,self._BGheight) ) + + self._PosX = self._Index*self._Screen._Width + self._Width = self._Screen._Width ## equal to screen width + self._Height = self._Screen._Height + + done = IconItem() + done._ImgSurf = MyIconPool.GiveIconSurface("done") + done._MyType = ICON_TYPES["STAT"] + done._Parent = self + self._Icons["done"] = done + + ps = ListPageSelector() + ps._Parent = self + self._Ps = ps + self._PsIndex = 0 + + self.GenList() + + self._Scroller = ListScroller() + self._Scroller._Parent = self + self._Scroller._PosX = self._Width - 10 + self._Scroller._PosY = 2 + self._Scroller.Init() + self._Scroller.SetCanvasHWND(self._HWND) + + def Click(self): + if len(self._MyList) == 0: + return + + cur_li = self._MyList[self._PsIndex] + if cur_li._Active == True: + out = commands.getstatusoutput("sudo ip route | grep default | cut -d \" \" -f3") + if len(out[1]) > 7: + self._Screen._MsgBox.SetText(out[1]) + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + return + + print(cur_li._Value) + + if "arm" in platform.machine(): + for i in self._MyList: + i._Active = False + + self._Screen._MsgBox.SetText("Applying") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + + cur_li._Active = self.ApplyGateWay(cur_li._Value) + + pygame.time.delay(1000) + self._Screen.Draw() + self._Screen.SwapAndShow() + else: + self._Screen._MsgBox.SetText("Do it in GameShell") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + + def ClearAllGateways(self): + self._Screen._MsgBox.SetText("Cleaning up") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + os.system("sudo ip route del 0/0") + pygame.time.delay(800) + + for i in self._MyList: + i._Active = False + + self._Screen.Draw() + self._Screen.SwapAndShow() + + def ApplyGateWay(self,gateway): + os.system("sudo ip route del 0/0") + if gateway== "usb0": + out = commands.getstatusoutput("sudo ifconfig usb0 | grep inet | tr -s \" \"| cut -d \" \" -f3") + if len(out[1]) > 7: + if "error" not in out[1]: + parts = out[1].split(".") + if len(parts) == 4:##IPv4 + tp3 = int(parts[3]) + tmp = tp3 + if tp3 == 0: + tmp = int(parts[3]) + 1 + elif tp3 == 1: + tmp = int(parts[3]) + 1 + elif tp3 > 1: + tmp = int(parts[3]) - 1 + + parts[3] = str(tmp) + ipaddress = ".".join(parts) + os.system("sudo route add default gw "+ipaddress) + return True + else: + if is_wifi_connected_now(): + os.system("sudo dhclient wlan0") + return True + else: + self._Screen._MsgBox.SetText("Wi-Fi is not connected") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + return False + + return False + + + def OnLoadCb(self): + self._Scrolled = 0 + self._PosY = 0 + self._DrawOnce = False + + ## grep Driver /etc/xorg.conf | tr -s " " | cut -d " " -f3 + ## "fbturbo" + ## "modesetting" + thedrv = "" + + if "arm" in platform.machine(): + out = commands.getstatusoutput("sudo ip route | grep default") + if len(out[1]) > 7: + if "usb0" in out[1]: + thedrv = "usb0" + elif "wlan0" in out[1]: + thedrv = "wlan0" + + for i in self._MyList: + i._Active = False + + if thedrv != "": + for i in self._MyList: + if thedrv in i._Value: + i._Active = True + ## if usb0 and wlan0 all actived, clear all + + def OnReturnBackCb(self): + pass + """ + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + """ + def KeyDown(self,event): + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if IsKeyStartOrA(event.key): + self.Click() + + if event.key == CurKeys["Y"]: + self.ClearAllGateways() + + if event.key == CurKeys["Up"]: + self.ScrollUp() + self._Screen.Draw() + self._Screen.SwapAndShow() + if event.key == CurKeys["Down"]: + self.ScrollDown() + self._Screen.Draw() + self._Screen.SwapAndShow() + + + def Draw(self): + + self.ClearCanvas() + if len(self._MyList) == 0: + return + + else: + if len(self._MyList) * PageListItem._Height > self._Height: + self._Ps._Width = self._Width - 11 + self._Ps.Draw() + for i in self._MyList: + if i._PosY > self._Height + self._Height/2: + break + if i._PosY < 0: + continue + i.Draw() + self._Scroller.UpdateSize( len(self._MyList)*PageListItem._Height, self._PsIndex*PageListItem._Height) + self._Scroller.Draw() + + else: + self._Ps._Width = self._Width + self._Ps.Draw() + for i in self._MyList: + if i._PosY > self._Height + self._Height/2: + break + if i._PosY < 0: + continue + i.Draw() + + if self._HWND != None: + self._HWND.fill(MySkinManager.GiveColor("White")) + + self._HWND.blit(self._CanvasHWND,(self._PosX,self._PosY,self._Width, self._Height ) ) + + +class APIOBJ(object): + + _Page = None + def __init__(self): + pass + def Init(self,main_screen): + self._Page = GateWayPage() + self._Page._Screen = main_screen + self._Page._Name ="Gateway switch" + self._Page.Init() + + def API(self,main_screen): + if main_screen !=None: + main_screen.PushPage(self._Page) + main_screen.Draw() + main_screen.SwapAndShow() + +OBJ = APIOBJ() +def Init(main_screen): + OBJ.Init(main_screen) +def API(main_screen): + OBJ.API(main_screen) + + diff --git a/Menu/GameShell/10_Settings/Languages/__init__.py b/Menu/GameShell/10_Settings/Languages/__init__.py new file mode 100644 index 0000000..49ab84e --- /dev/null +++ b/Menu/GameShell/10_Settings/Languages/__init__.py @@ -0,0 +1,309 @@ +# -*- coding: utf-8 -*- +import os +import pygame +#import math +#mport subprocess +import glob +#from beeprint import pp +from libs.roundrects import aa_round_rect + +## local UI import +from UI.constants import Width,Height,ICON_TYPES,RESTARTUI +from UI.page import Page,PageSelector +from UI.label import Label +from UI.util_funcs import midRect +from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB +from UI.scroller import ListScroller +from UI.icon_pool import MyIconPool +from UI.icon_item import IconItem +from UI.multilabel import MultiLabel +from UI.skin_manager import MySkinManager +from UI.lang_manager import MyLangManager +from UI.info_page_list_item import InfoPageListItem +from UI.info_page_selector import InfoPageSelector + +import config + +class ListPageSelector(InfoPageSelector): + def Draw(self): + idx = self._Parent._PsIndex + + if idx < len(self._Parent._MyList): + x = self._Parent._MyList[idx]._PosX+2 ## ++ + y = self._Parent._MyList[idx]._PosY+1 + h = self._Parent._MyList[idx]._Height -3 + + self._PosX = x + self._PosY = y + self._Height = h + + aa_round_rect(self._Parent._CanvasHWND, + (x,y,self._Width-4,h),self._BackgroundColor,4,0,self._BackgroundColor) + + +class PageListItem(InfoPageListItem): + _PosX = 0 + _PosY = 0 + _Width = 0 + _Height = 30 + + _Labels = {} + _Icons = {} + _Fonts = {} + + _LinkObj = None + + _Active = False + _Value = "" + + def Draw(self): + + self._Labels["Text"]._PosY = self._PosY+ (self._Height- self._Labels["Text"]._Height)/2 + + if self._Active == True: + self._Parent._Icons["done"].NewCoord( self._Parent._Width-30,self._PosY+5) + self._Parent._Icons["done"].Draw() + + self._Labels["Text"].Draw(self._Active) + + if "Small" in self._Labels: + self._Labels["Small"]._PosX = self._Width - self._Labels["Small"]._Width -10 + self._Labels["Small"]._PosY = self._PosY + (self._Height- self._Labels["Small"]._Height)/2 + self._Labels["Small"].Draw() + + pygame.draw.line(self._Parent._CanvasHWND,MySkinManager.GiveColor('Line'),(self._PosX,self._PosY+self._Height-1),(self._PosX+self._Width,self._PosY+self._Height-1),1) + +class LanguagesPage(Page): + _FootMsg = ["Nav","","","Back","Select"] + _MyList = [] + _ListFont = MyLangManager.TrFont("notosanscjk15") + + _AList = {} + + _Scrolled = 0 + + _BGwidth = 320 + _BGheight = 240-24-20 + + _DrawOnce = False + _Scroller = None + _InfoPage = None + + def __init__(self): + Page.__init__(self) + self._Icons = {} + + def GenList(self): + + self._MyList = [] + + start_x = 0 + start_y = 0 + last_height = 0 + + files_path = [os.path.basename(x) for x in sorted(glob.glob('langs/*.ini'))] + + for i,u in enumerate( files_path ): + #print(i,u) + li = PageListItem() + li._Parent = self + li._PosX = start_x + li._PosY = start_y + last_height + li._Width = Width + li._Fonts["normal"] = self._ListFont + li._Active = False + li._Value = u.decode("utf8") + lang_name = u.split("_")[1] + lang_name = lang_name.split(".")[0] + + li.Init( lang_name.decode("utf8") ) + + last_height += li._Height + + self._MyList.append(li) + + def Init(self): + if self._Screen != None: + if self._Screen._CanvasHWND != None and self._CanvasHWND == None: + self._HWND = self._Screen._CanvasHWND + self._CanvasHWND = pygame.Surface( (self._Screen._Width,self._BGheight) ) + + self._PosX = self._Index*self._Screen._Width + self._Width = self._Screen._Width ## equal to screen width + self._Height = self._Screen._Height + + done = IconItem() + done._ImgSurf = MyIconPool.GiveIconSurface("done") + done._MyType = ICON_TYPES["STAT"] + done._Parent = self + self._Icons["done"] = done + + ps = ListPageSelector() + ps._Parent = self + self._Ps = ps + self._PsIndex = 0 + + self.GenList() + + self._Scroller = ListScroller() + self._Scroller._Parent = self + self._Scroller._PosX = self._Width - 10 + self._Scroller._PosY = 2 + self._Scroller.Init() + self._Scroller.SetCanvasHWND(self._HWND) + + + def ScrollDown(self): + if len(self._MyList) == 0: + return + self._PsIndex +=1 + if self._PsIndex >= len(self._MyList): + self._PsIndex = len(self._MyList) -1 + + cur_li = self._MyList[self._PsIndex] + if cur_li._PosY +cur_li._Height > self._Height: + for i in range(0,len(self._MyList)): + self._MyList[i]._PosY -= self._MyList[i]._Height + + def ScrollUp(self): + if len(self._MyList) == 0: + return + self._PsIndex -= 1 + if self._PsIndex < 0: + self._PsIndex = 0 + cur_li = self._MyList[self._PsIndex] + if cur_li._PosY < 0: + for i in range(0, len(self._MyList)): + self._MyList[i]._PosY += self._MyList[i]._Height + + + def Click(self): + if len(self._MyList) == 0: + return + + cur_li = self._MyList[self._PsIndex] + if cur_li._Active == True: + return + + for i in self._MyList: + i._Active = False + + cur_li._Active = True + print(cur_li._Value) + with open(".lang","w") as f: + f.write(cur_li._Value) + + self._Screen._MsgBox.SetText("Applying") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + + MyLangManager.UpdateLang() + + pygame.event.post( pygame.event.Event(RESTARTUI, message="")) ##Restart Launcher + + pygame.time.delay(1000) + + self._Screen.Draw() + self._Screen.SwapAndShow() + + def OnLoadCb(self): + self._Scrolled = 0 + self._PosY = 0 + self._DrawOnce = False + with open(".lang", "r") as f: + thelang = f.read() + + thelang = thelang.strip() + + if thelang == "": + thelang = "English" + + for i in self._MyList: + if thelang in i._Value: + i._Active = True + + def OnReturnBackCb(self): + pass + """ + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + """ + def KeyDown(self,event): + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if IsKeyStartOrA(event.key): + self.Click() + + if event.key == CurKeys["Up"]: + self.ScrollUp() + self._Screen.Draw() + self._Screen.SwapAndShow() + if event.key == CurKeys["Down"]: + self.ScrollDown() + self._Screen.Draw() + self._Screen.SwapAndShow() + + + def Draw(self): + + self.ClearCanvas() + if len(self._MyList) == 0: + return + + else: + if len(self._MyList) * PageListItem._Height > self._Height: + self._Ps._Width = self._Width - 11 + self._Ps.Draw() + for i in self._MyList: + if i._PosY > self._Height + self._Height/2: + break + if i._PosY < 0: + continue + i.Draw() + self._Scroller.UpdateSize( len(self._MyList)*PageListItem._Height, self._PsIndex*PageListItem._Height) + self._Scroller.Draw() + + else: + self._Ps._Width = self._Width + self._Ps.Draw() + for i in self._MyList: + if i._PosY > self._Height + self._Height/2: + break + if i._PosY < 0: + continue + i.Draw() + + if self._HWND != None: + self._HWND.fill(MySkinManager.GiveColor("White")) + + self._HWND.blit(self._CanvasHWND,(self._PosX,self._PosY,self._Width, self._Height ) ) + + +class APIOBJ(object): + + _Page = None + def __init__(self): + pass + def Init(self,main_screen): + self._Page = LanguagesPage() + self._Page._Screen = main_screen + self._Page._Name ="Languages" + self._Page.Init() + + def API(self,main_screen): + if main_screen !=None: + main_screen.PushPage(self._Page) + main_screen.Draw() + main_screen.SwapAndShow() + +OBJ = APIOBJ() +def Init(main_screen): + OBJ.Init(main_screen) +def API(main_screen): + OBJ.API(main_screen) + + diff --git a/Menu/GameShell/10_Settings/Lima/__init__.py b/Menu/GameShell/10_Settings/Lima/__init__.py new file mode 100644 index 0000000..ca198f6 --- /dev/null +++ b/Menu/GameShell/10_Settings/Lima/__init__.py @@ -0,0 +1,302 @@ +# -*- coding: utf-8 -*- +import os +import pygame +import platform +#import commands +import glob +#from beeprint import pp +from libs.roundrects import aa_round_rect + +## local UI import +from UI.constants import Width,Height,ICON_TYPES,RESTARTUI +from UI.page import Page,PageSelector +from UI.label import Label +from UI.util_funcs import midRect,FileExists,ArmSystem +from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB +from UI.scroller import ListScroller +from UI.icon_pool import MyIconPool +from UI.icon_item import IconItem +from UI.multilabel import MultiLabel +from UI.skin_manager import MySkinManager +from UI.lang_manager import MyLangManager +from UI.info_page_list_item import InfoPageListItem +from UI.info_page_selector import InfoPageSelector + +import config + +class ListPageSelector(InfoPageSelector): + def Draw(self): + idx = self._Parent._PsIndex + + if idx < len(self._Parent._MyList): + x = self._Parent._MyList[idx]._PosX+2 ## ++ + y = self._Parent._MyList[idx]._PosY+1 + h = self._Parent._MyList[idx]._Height -3 + + self._PosX = x + self._PosY = y + self._Height = h + + aa_round_rect(self._Parent._CanvasHWND, + (x,y,self._Width-4,h),self._BackgroundColor,4,0,self._BackgroundColor) + + +class PageListItem(InfoPageListItem): + _PosX = 0 + _PosY = 0 + _Width = 0 + _Height = 30 + + _Labels = {} + _Icons = {} + _Fonts = {} + + _LinkObj = None + + _Active = False + _Value = "" + + def Draw(self): + + self._Labels["Text"]._PosY = self._PosY+ (self._Height- self._Labels["Text"]._Height)/2 + + if self._Active == True: + self._Parent._Icons["done"].NewCoord( self._Parent._Width-30,self._PosY+5) + self._Parent._Icons["done"].Draw() + + self._Labels["Text"].Draw(self._Active) + + if "Small" in self._Labels: + self._Labels["Small"]._PosX = self._Width - self._Labels["Small"]._Width -10 + self._Labels["Small"]._PosY = self._PosY + (self._Height- self._Labels["Small"]._Height)/2 + self._Labels["Small"].Draw() + + pygame.draw.line(self._Parent._CanvasHWND,MySkinManager.GiveColor('Line'),(self._PosX,self._PosY+self._Height-1),(self._PosX+self._Width,self._PosY+self._Height-1),1) + +class GPUDriverPage(Page): + _FootMsg = ["Nav","","","Back","Select"] + _MyList = [] + _ListFont = MyLangManager.TrFont("notosanscjk12") + + _AList = {} + + _Scrolled = 0 + + _BGwidth = 320 + _BGheight = 240-24-20 + + _DrawOnce = False + _Scroller = None + _InfoPage = None + + def __init__(self): + Page.__init__(self) + self._Icons = {} + + def GenList(self): + + self._MyList = [] + + start_x = 0 + start_y = 0 + last_height = 0 + + drivers = [["fbturbo","FBTURBO driver (Software Rendering)"], + ["modesetting","LIMA driver (Experimental GPU Rendering)"]] + + + for i,u in enumerate( drivers ): + #print(i,u) + li = PageListItem() + li._Parent = self + li._PosX = start_x + li._PosY = start_y + last_height + li._Width = Width + li._Fonts["normal"] = self._ListFont + li._Active = False + li._Value = u[0] + li.Init( u[1] ) + + last_height += li._Height + + self._MyList.append(li) + + def Init(self): + if self._Screen != None: + if self._Screen._CanvasHWND != None and self._CanvasHWND == None: + self._HWND = self._Screen._CanvasHWND + self._CanvasHWND = pygame.Surface( (self._Screen._Width,self._BGheight) ) + + self._PosX = self._Index*self._Screen._Width + self._Width = self._Screen._Width ## equal to screen width + self._Height = self._Screen._Height + + done = IconItem() + done._ImgSurf = MyIconPool.GiveIconSurface("done") + done._MyType = ICON_TYPES["STAT"] + done._Parent = self + self._Icons["done"] = done + + ps = ListPageSelector() + ps._Parent = self + self._Ps = ps + self._PsIndex = 0 + + self.GenList() + + self._Scroller = ListScroller() + self._Scroller._Parent = self + self._Scroller._PosX = self._Width - 10 + self._Scroller._PosY = 2 + self._Scroller.Init() + self._Scroller.SetCanvasHWND(self._HWND) + + def Click(self): + if self._PsIndex > len(self._MyList) -1: + return + + cur_li = self._MyList[self._PsIndex] + if cur_li._Active == True: + return + + print(cur_li._Value) + + if "arm" in platform.machine(): + for i in self._MyList: + i._Active = False + + cur_li._Active = True + self._Screen._MsgBox.SetText("Applying") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + + if "modesetting" in cur_li._Value: ## enable lima + os.system("touch %s/.lima" % os.path.expanduser('~') ) + ArmSystem("sudo mv /usr/lib/xorg/modules/drivers/modesetting_drv.so.lima /usr/lib/xorg/modules/drivers/modesetting_drv.so") + ArmSystem("sudo sed -i '/^#.*lima/s/^#//' /etc/ld.so.conf.d/00-arm-linux-gnueabihf.conf") + ArmSystem("sudo ldconfig") + else: #disable lima + os.system("rm %s/.lima" % os.path.expanduser('~') ) + ArmSystem("sudo mv /usr/lib/xorg/modules/drivers/modesetting_drv.so /usr/lib/xorg/modules/drivers/modesetting_drv.so.lima") + ArmSystem("sudo sed -i 's/^[^#]*lima/#&/' /etc/ld.so.conf.d/00-arm-linux-gnueabihf.conf") + ArmSystem("sudo ldconfig") + + pygame.time.delay(800) + os.system("sudo reboot") + + else: + self._Screen._MsgBox.SetText("Do it in GameShell") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + + def OnLoadCb(self): + self._Scrolled = 0 + self._PosY = 0 + self._DrawOnce = False + + ## grep Driver /etc/xorg.conf | tr -s " " | cut -d " " -f3 + ## "fbturbo" + ## "modesetting" + thedrv = "" + + if "arm" in platform.machine(): + if FileExists("%s/.lima" % os.path.expanduser('~')): + thedrv = "modesetting" + else: + thedrv = "fbturbo" + + if thedrv == "": + thedrv = "fbturbo" + + for i in self._MyList: + i._Active = False + + for i in self._MyList: + if thedrv in i._Value: + i._Active = True + + def OnReturnBackCb(self): + pass + """ + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + """ + def KeyDown(self,event): + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if IsKeyStartOrA(event.key): + self.Click() + + if event.key == CurKeys["Up"]: + self.ScrollUp() + self._Screen.Draw() + self._Screen.SwapAndShow() + if event.key == CurKeys["Down"]: + self.ScrollDown() + self._Screen.Draw() + self._Screen.SwapAndShow() + + + def Draw(self): + + self.ClearCanvas() + if len(self._MyList) == 0: + return + + else: + if len(self._MyList) * PageListItem._Height > self._Height: + self._Ps._Width = self._Width - 11 + self._Ps.Draw() + for i in self._MyList: + if i._PosY > self._Height + self._Height/2: + break + if i._PosY < 0: + continue + i.Draw() + self._Scroller.UpdateSize( len(self._MyList)*PageListItem._Height, self._PsIndex*PageListItem._Height) + self._Scroller.Draw() + + else: + self._Ps._Width = self._Width + self._Ps.Draw() + for i in self._MyList: + if i._PosY > self._Height + self._Height/2: + break + if i._PosY < 0: + continue + i.Draw() + + if self._HWND != None: + self._HWND.fill(MySkinManager.GiveColor("White")) + + self._HWND.blit(self._CanvasHWND,(self._PosX,self._PosY,self._Width, self._Height ) ) + + +class APIOBJ(object): + + _Page = None + def __init__(self): + pass + def Init(self,main_screen): + self._Page = GPUDriverPage() + self._Page._Screen = main_screen + self._Page._Name ="GPU Driver Switch" + self._Page.Init() + + def API(self,main_screen): + if main_screen !=None: + main_screen.PushPage(self._Page) + main_screen.Draw() + main_screen.SwapAndShow() + +OBJ = APIOBJ() +def Init(main_screen): + OBJ.Init(main_screen) +def API(main_screen): + OBJ.API(main_screen) + + diff --git a/Menu/GameShell/10_Settings/Notification/__init__.py b/Menu/GameShell/10_Settings/Notification/__init__.py new file mode 100644 index 0000000..d2bdc6a --- /dev/null +++ b/Menu/GameShell/10_Settings/Notification/__init__.py @@ -0,0 +1,264 @@ +# -*- coding: utf-8 -*- + +import os +import platform +import pygame +import glob +#import math +import commands + +#from beeprint import pp +from libs.roundrects import aa_round_rect +#import gobject +#from wicd import misc +## local UI import +from UI.constants import Width,Height,ICON_TYPES +from UI.page import Page,PageSelector +from UI.label import Label +from UI.util_funcs import midRect,FileExists,IsExecutable +from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB +from UI.scroller import ListScroller +from UI.icon_pool import MyIconPool +from UI.icon_item import IconItem +from UI.multi_icon_item import MultiIconItem +from UI.lang_manager import MyLangManager +from UI.multilabel import MultiLabel +from UI.info_page_list_item import InfoPageListItem +from UI.info_page_selector import InfoPageSelector +from UI.skin_manager import MySkinManager + +class NotifyJobListItem(InfoPageListItem): + + _CanvasHWND = None + + def Init(self,text): + + #self._Fonts["normal"] = fonts["veramono12"] + self._CanvasHWND = self._Parent._CanvasHWND + + l = Label() + l._PosX = 10 + l.SetCanvasHWND(self._Parent._CanvasHWND) + + l.Init(text,self._Fonts["normal"]) + self._Labels["Text"] = l + + done_icon = IconItem() + done_icon._ImgSurf = MyIconPool.GiveIconSurface("done") + done_icon._CanvasHWND = self._Parent._CanvasHWND + done_icon._Parent = self + + self._Icons["done"] = done_icon + + def Draw(self): + if self._ReadOnly == False: + self._Labels["Text"].SetColor(MySkinManager.GiveColor("ReadOnlyText")) + else: + self._Labels["Text"].SetColor(MySkinManager.GiveColor("Text")) + + + self._Labels["Text"]._PosX = self._Labels["Text"]._PosX + self._PosX + self._Labels["Text"]._PosY = self._PosY + (self._Height - self._Labels["Text"]._Height)/2 + self._Labels["Text"].Draw() + self._Labels["Text"]._PosX = self._Labels["Text"]._PosX - self._PosX + + if "Small" in self._Labels: + self._Labels["Small"]._PosX = self._Width - self._Labels["Small"]._Width-5 + + self._Labels["Small"]._PosY = self._PosY + (self._Height - self._Labels["Small"]._Height)/2 + self._Labels["Small"].Draw() + + if self._ReadOnly: + self._Icons["done"].NewCoord(self._Width - 25,5) + self._Icons["done"].Draw() + + pygame.draw.line(self._Parent._CanvasHWND,MySkinManager.GiveColor('Line'),(self._PosX,self._PosY+self._Height-1),(self._PosX+self._Width,self._PosY+self._Height-1),1) + + +class NotificationPage(Page): + _FootMsg = ["Nav","","","Back","Toggle"] + _MyList = [] + _ListFontObj = MyLangManager.TrFont("varela13") + + _AList = {} + + _Scrolled = 0 + + _BGwidth = 320 + _BGheight = 240-24-20 + + _DrawOnce = False + _Scroller = None + + _EasingDur = 30 + + _GSNOTIFY_JOBS = "gsnotify/Jobs" + _GSNOTIFY_SOCKET="/tmp/gsnotify.sock" + _Config =None + _AllowedExts = [".sh",".lsp",".lua",".bin",".py",".js"] + + def __init__(self): + Page.__init__(self) + self._Icons = {} + + if "arm" in platform.machine(): + os.system( "git config --global core.filemode false" ) + + def GenList(self): + + self._MyList = [] + ## map ini to self._AList + files_path = glob.glob(self._GSNOTIFY_JOBS+"/*") + + + start_x = 10 + start_y = 0 + counter = 0 + for i,v in enumerate( files_path): + filename, file_extension = os.path.splitext(v) + alias_file = filename + ".alias" + + if file_extension in self._AllowedExts: + li = NotifyJobListItem() + li._Parent = self + li._PosX = start_x + li._PosY = start_y + counter*InfoPageListItem._Height + li._Width = Width-10 + li._Fonts["normal"] = self._ListFontObj + li._Fonts["small"] = MySkinManager.GiveFont("varela12") + + if IsExecutable(v): + li._ReadOnly = True + + if os.path.isfile(alias_file): + fp = open(alias_file, "r") + alias = fp.read() + alias = alias.strip() + label_text = alias.decode("utf8") + li.Init( label_text ) + fp.close() + else: + li.Init( os.path.basename(v) ) + li._Flag = v + ##li.SetSmallText( v ) + + self._MyList.append(li) + counter += 1 + + def Init(self): + if self._Screen != None: + if self._Screen._CanvasHWND != None and self._CanvasHWND == None: + self._CanvasHWND = self._Screen._CanvasHWND + + self._PosX = self._Index*self._Screen._Width + self._Width = self._Screen._Width ## equal to screen width + self._Height = self._Screen._Height + + ps = InfoPageSelector() + ps._PosX = 11 + ps._Parent = self + ps._Width = self._Width-10 + self._Ps = ps + self._PsIndex = 0 + + self._Scroller = ListScroller() + self._Scroller._Parent = self + self._Scroller._PosX = 2 + self._Scroller._PosY = 2 + self._Scroller.Init() + + def Click(self): + if len(self._MyList) == 0: + return + + cur_li = self._MyList[self._PsIndex] + #print("Click ",cur_li._Flag) + if IsExecutable(cur_li._Flag): + os.system("chmod -x "+cur_li._Flag) + else: + os.system("chmod +x "+cur_li._Flag) + + self.GenList() + + + def OnLoadCb(self): + self._Scrolled = 0 + self._PosY = 0 + self._DrawOnce = False + self.GenList() + + def OnReturnBackCb(self): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + def KeyDown(self,event): + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if IsKeyStartOrA(event.key): + + self._Screen._MsgBox.SetText("Applying") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + + pygame.time.delay(638) + + self.Click() + + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Up"]: + self.ScrollUp() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Down"]: + self.ScrollDown() + self._Screen.Draw() + self._Screen.SwapAndShow() + + + + def Draw(self): + self.ClearCanvas() + self._Ps.Draw() + + if len(self._MyList) > 0: + for i in self._MyList: + i.Draw() + + self._Scroller.UpdateSize( len(self._MyList)*InfoPageListItem._Height, + self._PsIndex*InfoPageListItem._Height) + self._Scroller.Draw() + + + + +class APIOBJ(object): + + _Page = None + def __init__(self): + pass + def Init(self,main_screen): + self._Page = NotificationPage() + self._Page._Screen = main_screen + self._Page._Name ="Notify" + self._Page.Init() + + def API(self,main_screen): + if main_screen !=None: + main_screen.PushPage(self._Page) + main_screen.Draw() + main_screen.SwapAndShow() + +OBJ = APIOBJ() +def Init(main_screen): + OBJ.Init(main_screen) +def API(main_screen): + OBJ.API(main_screen) + + diff --git a/Menu/GameShell/10_Settings/PowerOFF/__init__.py b/Menu/GameShell/10_Settings/PowerOFF/__init__.py new file mode 100644 index 0000000..d55fdbd --- /dev/null +++ b/Menu/GameShell/10_Settings/PowerOFF/__init__.py @@ -0,0 +1,90 @@ +# -*- coding: utf-8 -*- + +import pygame + +#UI lib +from UI.constants import RUNSYS +from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB +from UI.confirm_page import ConfirmPage +from UI.lang_manager import MyLangManager +from UI.skin_manager import MySkinManager + +import config + +class PowerOffConfirmPage(ConfirmPage): + + _ConfirmText = MyLangManager.Tr("Confirm Power OFF?") + + def CheckBattery(self): + try: + f = open(config.Battery) + except IOError: + print( "PowerOFF open %s failed" % config.Battery) + return 0 + else: + with f: + bat_uevent = {} + content = f.readlines() + content = [x.strip() for x in content] + for i in content: + pis = i.split("=") + if len(pis) > 1: + bat_uevent[pis[0]] = pis[1] + + if "POWER_SUPPLY_CAPACITY" in bat_uevent: + cur_cap = int(bat_uevent["POWER_SUPPLY_CAPACITY"]) + else: + cur_cap = 0 + + return cur_cap + + return 0 + + def KeyDown(self,event): + + if IsKeyMenuOrB(event.key): + + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if IsKeyStartOrA(event.key): + if self.CheckBattery() < 20: + cmdpath = "feh --bg-center %s;" % MySkinManager.GiveWallpaper("gameover.png") + else: + cmdpath = "feh --bg-center %s;" % MySkinManager.GiveWallpaper("seeyou.png") + + cmdpath += "sleep 3;" + + #cmdpath += "echo 'halt -p' > /tmp/halt_cmd" + + cmdpath += "sudo halt -p" + pygame.event.post( pygame.event.Event(RUNSYS, message=cmdpath)) + + + +class APIOBJ(object): + + _StoragePage = None + def __init__(self): + pass + def Init(self,main_screen): + self._Page = PowerOffConfirmPage() + + self._Page._Screen = main_screen + self._Page._Name ="Power OFF" + self._Page.Init() + + + def API(self,main_screen): + if main_screen !=None: + main_screen.PushPage(self._Page) + main_screen.Draw() + main_screen.SwapAndShow() + +OBJ = APIOBJ() +def Init(main_screen): + OBJ.Init(main_screen) +def API(main_screen): + OBJ.API(main_screen) + diff --git a/Menu/GameShell/10_Settings/PowerOptions/__init__.py b/Menu/GameShell/10_Settings/PowerOptions/__init__.py new file mode 100644 index 0000000..e80e68c --- /dev/null +++ b/Menu/GameShell/10_Settings/PowerOptions/__init__.py @@ -0,0 +1,555 @@ +# -*- coding: utf-8 -*- +import os +import pygame +#import math +#mport subprocess + +#from beeprint import pp +from libs.roundrects import aa_round_rect +#import gobject +#from wicd import misc +## local UI import +from UI.constants import Width,Height,ICON_TYPES,POWEROPT +from UI.page import Page,PageSelector +from UI.label import Label +from UI.util_funcs import midRect +from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB +from UI.scroller import ListScroller +from UI.icon_pool import MyIconPool +from UI.icon_item import IconItem +from UI.multilabel import MultiLabel +from UI.skin_manager import MySkinManager +from UI.lang_manager import MyLangManager + +import config + +class ListPageSelector(PageSelector): + _BackgroundColor = MySkinManager.GiveColor('Front') + + def __init__(self): + self._PosX = 0 + self._PosY = 0 + self._Height = 0 + self._Width = Width + + def AnimateDraw(self,x2,y2): + pass + + def Draw(self): + idx = self._Parent._PsIndex + + if idx < len(self._Parent._MyList): + x = self._Parent._MyList[idx]._PosX+2 + y = self._Parent._MyList[idx]._PosY+1 + h = self._Parent._MyList[idx]._Height -3 + + self._PosX = x + self._PosY = y + self._Height = h + + aa_round_rect(self._Parent._CanvasHWND, + (x,y,self._Width-4,h),self._BackgroundColor,4,0,self._BackgroundColor) + + +class PageListItem(object): + _PosX = 0 + _PosY = 0 + _Width = 0 + _Height = 30 + + _Labels = {} + _Icons = {} + _Fonts = {} + + _LinkObj = None + + _Active = False + _Value = "" + + def __init__(self): + self._Labels = {} + self._Icons = {} + self._Fonts = {} + + def SetSmallText(self,text): + + l = Label() + l._PosX = 40 + l.SetCanvasHWND(self._Parent._CanvasHWND) + l.Init(text,self._Fonts["small"]) + self._Labels["Small"] = l + + def Init(self,text): + + l = Label() + l._PosX = 10 + l.SetCanvasHWND(self._Parent._CanvasHWND) + text = MyLangManager.Tr(text) + l.Init(text,self._Fonts["normal"]) + self._Labels["Text"] = l + + def Draw(self): + + self._Labels["Text"]._PosY = self._PosY+ (self._Height- self._Labels["Text"]._Height)/2 + + if self._Active == True: + self._Parent._Icons["done"].NewCoord( self._Parent._Width-30,self._PosY+5) + self._Parent._Icons["done"].Draw() + + self._Labels["Text"].Draw(self._Active) + + if "Small" in self._Labels: + self._Labels["Small"]._PosX = self._Width - self._Labels["Small"]._Width -10 + self._Labels["Small"]._PosY = self._PosY + (self._Height- self._Labels["Small"]._Height)/2 + self._Labels["Small"].Draw() + + pygame.draw.line(self._Parent._CanvasHWND,MySkinManager.GiveColor('Line'),(self._PosX,self._PosY+self._Height-1),(self._PosX+self._Width,self._PosY+self._Height-1),1) + + +class InfoPage(Page): + _FootMsg = ["Nav","","","Back",""] + _MyList = [] + _ListFontObj = MyLangManager.TrFont("varela15") + _AList = {} + + _Time1 = 40 + _Time2 = 120 + _Time3 = 300 + + def ConvertSecToMin(self, secs): + sec_str = "" + min_str = "" + if secs > 60: + m = int(secs/60) + s = secs % 60 + if m > 1: + min_str = ("%d "+MyLangManager.Tr("minutes")+" ") % m + else: + min_str = ("%d "+MyLangManager.Tr("minute")+" ") % m + + if s == 1: + sec_str = ("%d "+MyLangManager.Tr("second")) % s + elif s > 1: + sec_str = ("%d "+MyLangManager.Tr("seconds")) % s + elif secs > 0: + if secs > 1: + sec_str = ("%d "+MyLangManager.Tr("seconds")) % secs + else: + sec_str = ("%d "+MyLangManager.Tr("second")) % secs + + elif secs == 0: + sec_str = MyLangManager.Tr("Never") + + return min_str + sec_str + + def RefreshList(self): + ## after GenList ,reuse + self._AList["time1"]["value"] = self.ConvertSecToMin(self._Time1) + self._AList["time2"]["value"] = self.ConvertSecToMin(self._Time2) + self._AList["time3"]["value"] = self.ConvertSecToMin(self._Time3) + + for i,v in enumerate( self._AList ): + self._MyList[i].SetSmallText( self._AList[v]["value"] ) + + def GenList(self): + + time1 = {} + time1["key"] = "time1" + if self._Time1 == 0: + time1["value"] = MyLangManager.Tr("Never") + else: + time1["value"] = "%d secs" % self._Time1 + time1["label"] = "Screen dimming" + + time2 = {} + time2["key"] = "time2" + if self._Time2 == 0: + time2["value"] = MyLangManager.Tr("Never") + else: + time2["value"] = "%d secs" % self._Time2 + + time2["label"] = "Screen OFF" + + time3 = {} + time3["key"] = "time3" + + if self._Time3 == 0: + time3["value"] = MyLangManager.Tr("Never") + else: + time3["value"] = "%d secs" % self._Time3 + time3["label"] = "Power OFF" + + self._AList["time1"] = time1 + self._AList["time2"] = time2 + self._AList["time3"] = time3 + + self._MyList = [] + + start_x = 0 + start_y = 0 + + for i,v in enumerate( self._AList): + #print(v) + li = PageListItem() + li._Parent = self + li._PosX = start_x + li._PosY = start_y + i*PageListItem._Height + li._Width = Width + li._Fonts["normal"] = self._ListFontObj + li._Fonts["small"] = MyLangManager.TrFont("varela12") + + if self._AList[v]["label"] != "": + li.Init( self._AList[v]["label"] ) + else: + li.Init( self._AList[v]["key"] ) + + li._Flag = self._AList[v]["key"] + + li.SetSmallText( self._AList[v]["value"] ) + + self._MyList.append(li) + + def Init(self): + if self._Screen != None: + if self._Screen._CanvasHWND != None and self._CanvasHWND == None: + self._CanvasHWND = self._Screen._CanvasHWND + + self._PosX = self._Index*self._Screen._Width + self._Width = self._Screen._Width ## equal to screen width + self._Height = self._Screen._Height + + ps = ListPageSelector() + ps._Parent = self + self._Ps = ps + self._PsIndex = 0 + + self.GenList() + + + def ScrollUp(self): + if len(self._MyList) == 0: + return + self._PsIndex -= 1 + if self._PsIndex < 0: + self._PsIndex = 0 + cur_li = self._MyList[self._PsIndex] + if cur_li._PosY < 0: + for i in range(0, len(self._MyList)): + self._MyList[i]._PosY += self._MyList[i]._Height + + + def ScrollDown(self): + if len(self._MyList) == 0: + return + self._PsIndex +=1 + if self._PsIndex >= len(self._MyList): + self._PsIndex = len(self._MyList) -1 + + cur_li = self._MyList[self._PsIndex] + if cur_li._PosY +cur_li._Height > self._Height: + for i in range(0,len(self._MyList)): + self._MyList[i]._PosY -= self._MyList[i]._Height + + def Click(self): + cur_li = self._MyList[self._PsIndex] + print(cur_li._Flag) + + + def OnLoadCb(self): + self.RefreshList() + + def OnReturnBackCb(self): + pass + """ + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + """ + + def KeyDown(self,event): + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Up"]: + self.ScrollUp() + self._Screen.Draw() + self._Screen.SwapAndShow() + if event.key == CurKeys["Down"]: + self.ScrollDown() + self._Screen.Draw() + self._Screen.SwapAndShow() + + def Draw(self): + self.ClearCanvas() + self._Ps.Draw() + + for i in self._MyList: + i.Draw() + +class PowerOptionsPage(Page): + _FootMsg = ["Nav","Detail","","Back","Select"] + _MyList = [] + _ListFont = MyLangManager.TrFont("notosanscjk15") + + _AList = {} + + _Scrolled = 0 + + _BGwidth = 320 + _BGheight = 240-24-20 + + _DrawOnce = False + _Scroller = None + _InfoPage = None + + def __init__(self): + Page.__init__(self) + self._Icons = {} + + def GenList(self): + + self._MyList = [] + + start_x = 0 + start_y = 0 + last_height = 0 + + + supersaving = {} + supersaving["key"] = "super" + supersaving["label"] = "Power saving" + supersaving["value"] = "supersaving" + + powersaving = {} + powersaving["key"] = "saving" + powersaving["label"] = "Balanced" + powersaving["value"] = "powersaving" + + balance_saving = {} + balance_saving["key"] = "balance" + balance_saving["label"] = "Performance" + balance_saving["value"] = "balance_saving" + + server_saving = {} + server_saving["key"] = "server" + server_saving["label"] = "Server" + server_saving["value"] = "server" + + + self._AList["supersaving"] = supersaving + self._AList["powersaving"] = powersaving + self._AList["server"] = server_saving + self._AList["balance_saving"] = balance_saving + + for i,u in enumerate( ["supersaving","powersaving","server","balance_saving"] ): + if u not in self._AList: + continue + + v = self._AList[u] + + li = PageListItem() + li._Parent = self + li._PosX = start_x + li._PosY = start_y + last_height + li._Width = Width + li._Fonts["normal"] = self._ListFont + li._Active = False + li._Value = self._AList[u]["value"] + + if self._AList[u]["label"] != "": + li.Init( self._AList[u]["label"] ) + else: + li.Init( self._AList[u]["key"] ) + + last_height += li._Height + + self._MyList.append(li) + + def Init(self): + if self._Screen != None: + if self._Screen._CanvasHWND != None and self._CanvasHWND == None: + self._HWND = self._Screen._CanvasHWND + self._CanvasHWND = pygame.Surface( (self._Screen._Width,self._BGheight) ) + + self._PosX = self._Index*self._Screen._Width + self._Width = self._Screen._Width ## equal to screen width + self._Height = self._Screen._Height + + done = IconItem() + done._ImgSurf = MyIconPool.GiveIconSurface("done") + done._MyType = ICON_TYPES["STAT"] + done._Parent = self + self._Icons["done"] = done + + ps = ListPageSelector() + ps._Parent = self + self._Ps = ps + self._PsIndex = 0 + + self.GenList() + + self._Scroller = ListScroller() + self._Scroller._Parent = self + self._Scroller._PosX = self._Width - 10 + self._Scroller._PosY = 2 + self._Scroller.Init() + self._Scroller.SetCanvasHWND(self._HWND) + + self._InfoPage = InfoPage() + self._InfoPage._Screen = self._Screen + self._InfoPage._Name = "Power option detail" + self._InfoPage.Init() + + def Click(self): + if len(self._MyList) == 0: + return + + cur_li = self._MyList[self._PsIndex] + if cur_li._Active == True: + return + + for i in self._MyList: + i._Active = False + + cur_li._Active = True + print(cur_li._Value) + with open(".powerlevel","w") as f: + f.write(cur_li._Value) + + config.PowerLevel = cur_li._Value + + if config.PowerLevel!= "supersaving": + os.system("sudo iw wlan0 set power_save off > /dev/null") + else: + os.system("sudo iw wlan0 set power_save on > /dev/null") + + self._Screen._MsgBox.SetText("Applying") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + + pygame.event.post( pygame.event.Event(POWEROPT, message="")) + + pygame.time.delay(1000) + + self._Screen.Draw() + self._Screen.SwapAndShow() + + def OnLoadCb(self): + self._Scrolled = 0 + self._PosY = 0 + self._DrawOnce = False + with open(".powerlevel", "r") as f: + powerlevel = f.read() + + powerlevel = powerlevel.strip() + + if powerlevel == "": + powerlevel = "balance_saving" + + for i in self._MyList: + if i._Value == powerlevel: + i._Active = True + + def OnReturnBackCb(self): + pass + """ + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + """ + def KeyDown(self,event): + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if IsKeyStartOrA(event.key): + self.Click() + + if event.key == CurKeys["Up"]: + self.ScrollUp() + self._Screen.Draw() + self._Screen.SwapAndShow() + if event.key == CurKeys["Down"]: + self.ScrollDown() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Y"]: + cur_li = self._MyList[self._PsIndex] + time1 = config.PowerLevels[cur_li._Value][0] + time2 = config.PowerLevels[cur_li._Value][1] + time3 = config.PowerLevels[cur_li._Value][2] + + self._InfoPage._Time1 = time1 + self._InfoPage._Time2 = time2 + self._InfoPage._Time3 = time3 + + self._Screen.PushPage(self._InfoPage) + self._Screen.Draw() + self._Screen.SwapAndShow() + + def Draw(self): + + self.ClearCanvas() + if len(self._MyList) == 0: + return + + else: + if len(self._MyList) * PageListItem._Height > self._Height: + self._Ps._Width = self._Width - 11 + self._Ps.Draw() + for i in self._MyList: + if i._PosY > self._Height + self._Height/2: + break + if i._PosY < 0: + continue + i.Draw() + self._Scroller.UpdateSize( len(self._MyList)*PageListItem._Height, self._PsIndex*PageListItem._Height) + self._Scroller.Draw() + + else: + self._Ps._Width = self._Width + self._Ps.Draw() + for i in self._MyList: + if i._PosY > self._Height + self._Height/2: + break + if i._PosY < 0: + continue + i.Draw() + + if self._HWND != None: + self._HWND.fill(MySkinManager.GiveColor("White")) + + self._HWND.blit(self._CanvasHWND,(self._PosX,self._PosY,self._Width, self._Height ) ) + + + + + +class APIOBJ(object): + + _Page = None + def __init__(self): + pass + def Init(self,main_screen): + self._Page = PowerOptionsPage() + self._Page._Screen = main_screen + self._Page._Name ="Power Options" + self._Page.Init() + + def API(self,main_screen): + if main_screen !=None: + main_screen.PushPage(self._Page) + main_screen.Draw() + main_screen.SwapAndShow() + +OBJ = APIOBJ() +def Init(main_screen): + OBJ.Init(main_screen) +def API(main_screen): + OBJ.API(main_screen) + + diff --git a/Menu/GameShell/10_Settings/Skins/__init__.py b/Menu/GameShell/10_Settings/Skins/__init__.py new file mode 100644 index 0000000..33fe53c --- /dev/null +++ b/Menu/GameShell/10_Settings/Skins/__init__.py @@ -0,0 +1,294 @@ +# -*- coding: utf-8 -*- +import os +import pygame +#import commands +import glob +#from beeprint import pp +from libs.roundrects import aa_round_rect + +## local UI import +from UI.constants import Width,Height,ICON_TYPES,RESTARTUI +from UI.page import Page,PageSelector +from UI.label import Label +from UI.util_funcs import midRect,FileExists +from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB +from UI.scroller import ListScroller +from UI.icon_pool import MyIconPool +from UI.icon_item import IconItem +from UI.multilabel import MultiLabel +from UI.skin_manager import MySkinManager +from UI.lang_manager import MyLangManager +from UI.info_page_list_item import InfoPageListItem +from UI.info_page_selector import InfoPageSelector + +import config + +class ListPageSelector(InfoPageSelector): + def Draw(self): + idx = self._Parent._PsIndex + + if idx < len(self._Parent._MyList): + x = self._Parent._MyList[idx]._PosX+2 ## ++ + y = self._Parent._MyList[idx]._PosY+1 + h = self._Parent._MyList[idx]._Height -3 + + self._PosX = x + self._PosY = y + self._Height = h + + aa_round_rect(self._Parent._CanvasHWND, + (x,y,self._Width-4,h),self._BackgroundColor,4,0,self._BackgroundColor) + + +class PageListItem(InfoPageListItem): + _PosX = 0 + _PosY = 0 + _Width = 0 + _Height = 30 + + _Labels = {} + _Icons = {} + _Fonts = {} + + _LinkObj = None + + _Active = False + _Value = "" + + def Draw(self): + + self._Labels["Text"]._PosY = self._PosY+ (self._Height- self._Labels["Text"]._Height)/2 + + if self._Active == True: + self._Parent._Icons["done"].NewCoord( self._Parent._Width-30,self._PosY+5) + self._Parent._Icons["done"].Draw() + + self._Labels["Text"].Draw(self._Active) + + if "Small" in self._Labels: + self._Labels["Small"]._PosX = self._Width - self._Labels["Small"]._Width -10 + self._Labels["Small"]._PosY = self._PosY + (self._Height- self._Labels["Small"]._Height)/2 + self._Labels["Small"].Draw() + + pygame.draw.line(self._Parent._CanvasHWND,MySkinManager.GiveColor('Line'),(self._PosX,self._PosY+self._Height-1),(self._PosX+self._Width,self._PosY+self._Height-1),1) + +class SkinsPage(Page): + _FootMsg = ["Nav","","Scan","Back","Select"] + _MyList = [] + _ListFont = MyLangManager.TrFont("notosanscjk15") + + _AList = {} + + _Scrolled = 0 + + _BGwidth = 320 + _BGheight = 240-24-20 + + _DrawOnce = False + _Scroller = None + _InfoPage = None + + def __init__(self): + Page.__init__(self) + self._Icons = {} + + def GenList(self): + self._MyList = [] + + start_x = 0 + start_y = 0 + last_height = 0 + + + skins = [["../skin/default","Default"]] + files_path = glob.glob("/home/cpi/skins/*") + + for i ,v in enumerate(files_path): + if os.path.isdir(v): + bname = os.path.basename(v) + print(v,bname) + skins.append([v,bname]) + + for i,u in enumerate( skins ): + #print(i,u) + li = PageListItem() + li._Parent = self + li._PosX = start_x + li._PosY = start_y + last_height + li._Width = Width + li._Fonts["normal"] = self._ListFont + li._Active = False + li._Value = u[0] + li.Init( u[1] ) + + last_height += li._Height + + self._MyList.append(li) + + def Init(self): + if self._Screen != None: + if self._Screen._CanvasHWND != None and self._CanvasHWND == None: + self._HWND = self._Screen._CanvasHWND + self._CanvasHWND = pygame.Surface( (self._Screen._Width,self._BGheight) ) + + self._PosX = self._Index*self._Screen._Width + self._Width = self._Screen._Width ## equal to screen width + self._Height = self._Screen._Height + + done = IconItem() + done._ImgSurf = MyIconPool.GiveIconSurface("done") + done._MyType = ICON_TYPES["STAT"] + done._Parent = self + self._Icons["done"] = done + + ps = ListPageSelector() + ps._Parent = self + self._Ps = ps + self._PsIndex = 0 + + self.GenList() + + self._Scroller = ListScroller() + self._Scroller._Parent = self + self._Scroller._PosX = self._Width - 10 + self._Scroller._PosY = 2 + self._Scroller.Init() + self._Scroller.SetCanvasHWND(self._HWND) + + def Click(self): + if len(self._MyList) == 0: + return + + cur_li = self._MyList[self._PsIndex] + if cur_li._Active == True: + return + + print(cur_li._Value) + + for i in self._MyList: + i._Active = False + + cur_li._Active = True + self._Screen._MsgBox.SetText("Applying") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + + if "../skin/default" in cur_li._Value: + os.system("rm %s/.gameshell_skin" % os.path.expanduser('~') ) + else: + os.system("echo %s > %s/.gameshell_skin" % (cur_li._Value,os.path.expanduser('~') )) + + pygame.time.delay(700) + pygame.event.post( pygame.event.Event(RESTARTUI, message="")) + + def OnLoadCb(self): + self._Scrolled = 0 + self._PosY = 0 + self._DrawOnce = False + + for i in self._MyList: + i._Active = False + + for i in self._MyList: + if config.SKIN in i._Value: + i._Active = True + + def OnReturnBackCb(self): + pass + """ + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + """ + def KeyDown(self,event): + + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if IsKeyStartOrA(event.key): + self.Click() + + if event.key == CurKeys["Up"]: + self.ScrollUp() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Down"]: + self.ScrollDown() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["X"]: + self.GenList() + + for i in self._MyList: + i._Active = False + + for i in self._MyList: + if config.SKIN in i._Value: + i._Active = True + + self._Screen.Draw() + self._Screen.SwapAndShow() + + def Draw(self): + + self.ClearCanvas() + if len(self._MyList) == 0: + return + + else: + if len(self._MyList) * PageListItem._Height > self._Height: + self._Ps._Width = self._Width - 11 + self._Ps.Draw() + for i in self._MyList: + if i._PosY > self._Height + self._Height/2: + break + if i._PosY < 0: + continue + i.Draw() + self._Scroller.UpdateSize( len(self._MyList)*PageListItem._Height, self._PsIndex*PageListItem._Height) + self._Scroller.Draw() + + else: + self._Ps._Width = self._Width + self._Ps.Draw() + for i in self._MyList: + if i._PosY > self._Height + self._Height/2: + break + if i._PosY < 0: + continue + i.Draw() + + if self._HWND != None: + self._HWND.fill(MySkinManager.GiveColor("White")) + + self._HWND.blit(self._CanvasHWND,(self._PosX,self._PosY,self._Width, self._Height ) ) + + +class APIOBJ(object): + + _Page = None + def __init__(self): + pass + def Init(self,main_screen): + self._Page = SkinsPage() + self._Page._Screen = main_screen + self._Page._Name ="Skin selection" + self._Page.Init() + + def API(self,main_screen): + if main_screen !=None: + main_screen.PushPage(self._Page) + main_screen.Draw() + main_screen.SwapAndShow() + +OBJ = APIOBJ() +def Init(main_screen): + OBJ.Init(main_screen) +def API(main_screen): + OBJ.API(main_screen) + + diff --git "a/Menu/GameShell/10_Settings/Sound/Icon\r" "b/Menu/GameShell/10_Settings/Sound/Icon\r" new file mode 100644 index 0000000..e69de29 diff --git a/Menu/GameShell/10_Settings/Sound/__init__.py b/Menu/GameShell/10_Settings/Sound/__init__.py new file mode 100644 index 0000000..db9da3e --- /dev/null +++ b/Menu/GameShell/10_Settings/Sound/__init__.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- + +## local UI import +import pages +import myvars + +def Init(main_screen): + pages.InitSoundPage(main_screen) + +def API(main_screen): + + if main_screen !=None: + main_screen.PushCurPage() + main_screen.SetCurPage(myvars.SoundPage) + main_screen.Draw() + main_screen.SwapAndShow() + diff --git a/Menu/GameShell/10_Settings/Sound/myvars.py b/Menu/GameShell/10_Settings/Sound/myvars.py new file mode 100644 index 0000000..caa03de --- /dev/null +++ b/Menu/GameShell/10_Settings/Sound/myvars.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- + +import os +import sys + +SoundPage = None diff --git a/Menu/GameShell/10_Settings/Sound/pages.py b/Menu/GameShell/10_Settings/Sound/pages.py new file mode 100644 index 0000000..76122bd --- /dev/null +++ b/Menu/GameShell/10_Settings/Sound/pages.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- + +from sound_page import SoundPage + +import myvars + +def InitSoundPage(main_screen): + + myvars.SoundPage = SoundPage() + + myvars.SoundPage._Screen = main_screen + myvars.SoundPage._Name = "Sound volume" + myvars.SoundPage.Init() diff --git a/Menu/GameShell/10_Settings/Sound/sound_page.py b/Menu/GameShell/10_Settings/Sound/sound_page.py new file mode 100644 index 0000000..af6af38 --- /dev/null +++ b/Menu/GameShell/10_Settings/Sound/sound_page.py @@ -0,0 +1,167 @@ +# -*- coding: utf-8 -*- + +import pygame + +#from libs.roundrects import aa_round_rect + +import alsaaudio + +## local UI import +from UI.constants import Width,Height,ICON_TYPES +from UI.page import Page,PageSelector +from UI.icon_item import IconItem +from UI.label import Label +from UI.util_funcs import midRect +from UI.keys_def import CurKeys, IsKeyMenuOrB +from UI.slider import Slider +from UI.multi_icon_item import MultiIconItem +from UI.skin_manager import MySkinManager + +from UI.icon_pool import MyIconPool + +from libs.roundrects import aa_round_rect + +import myvars + +class SoundSlider(Slider): + OnChangeCB = None + + _Parent = None + _VolumeLabel =None + + def __init__(self): + Slider.__init__(self) + + def Init(self): + self._Width = self._Parent._Width + self._Height = self._Parent._Height + + self._VolumeLabel = Label() + self._VolumeLabel.SetCanvasHWND(self._CanvasHWND) + self._VolumeLabel.Init("VOLUME",MySkinManager.GiveFont("EurostileBold13")) + self._VolumeLabel.SetColor(MySkinManager.GiveColor('Text')) + + def SetValue(self,vol):#pct 0-100 + if vol >= 0 and vol <= 100: + self._Value = vol + + def Further(self): + self._Value+=5 + + if self._Value > 100: + self._Value = 100 + + if self.OnChangeCB != None: + if callable(self.OnChangeCB): + self.OnChangeCB( self._Value ) + + def StepBack(self): + self._Value-=5 + + if self._Value < 0: + self._Value = 0 + + if self.OnChangeCB != None: + if callable(self.OnChangeCB): + self.OnChangeCB( self._Value ) + + def Draw(self): + start_x = 82 + start_y = self._Parent._Screen._Height/2-5 + height = 30 + width = 4 + seg = self._Value / 5 + + for i in range(0, 20): + rect = pygame.Rect(start_x+i*(width*2),start_y,width,height) + if i > seg: + pygame.draw.rect(self._CanvasHWND,MySkinManager.GiveColor('Text'),rect, 1) + #aa_round_rect(self._CanvasHWND,rect, MySkinManager.GiveColor('Text'),1,1, MySkinManager.GiveColor('White')) + else: + pygame.draw.rect(self._CanvasHWND,MySkinManager.GiveColor('Text'),rect, 0) + #aa_round_rect(self._CanvasHWND,rect, MySkinManager.GiveColor('Text'),1,0, MySkinManager.GiveColor('White')) + + self._VolumeLabel.NewCoord(118,self._Parent._Screen._Height/2-30) + self._VolumeLabel.Draw(True) + + minus_box_rect = pygame.Rect(start_x- (4+6)*4,start_y,6*4,30) + pygame.draw.rect(self._CanvasHWND,MySkinManager.GiveColor('Text'),minus_box_rect, 0) + + minus_rect = pygame.Rect(start_x-8*4,start_y+14,2*4,2) + pygame.draw.rect(self._CanvasHWND,MySkinManager.GiveColor('White'),minus_rect, 0) + + plus_box_rect = pygame.Rect(start_x + 39*4 +4*4,start_y,6*4,30) + pygame.draw.rect(self._CanvasHWND,MySkinManager.GiveColor('Text'),plus_box_rect, 0) + + cross1_rect = pygame.Rect(start_x+39*4+4*4+2*4,start_y+14,2*4,2) + pygame.draw.rect(self._CanvasHWND,MySkinManager.GiveColor('White'),cross1_rect, 0) + cross2_rect = pygame.Rect(start_x+39*4+4*4+2*4+3,start_y+14-3,2,2*4) + pygame.draw.rect(self._CanvasHWND,MySkinManager.GiveColor('White'),cross2_rect, 0) + +class SoundPage(Page): + + _MySlider = None + _FootMsg = ["Nav","","","Back","Enter"] + + def Init(self): + self._CanvasHWND = self._Screen._CanvasHWND + self._Width = self._Screen._Width + self._Height = self._Screen._Height + + self._MySlider = SoundSlider() + + self._MySlider._Parent = self + self._MySlider.SetCanvasHWND(self._CanvasHWND) + + self._MySlider.OnChangeCB = self.WhenSliderDrag + + self._MySlider.Init() + + try: + m = alsaaudio.Mixer() + self._MySlider.SetValue(m.getvolume()[0]) + except Exception,e: + print(str(e)) + self._MySlider.SetValue(0) + + + def OnLoadCb(self): + try: + m = alsaaudio.Mixer() + self._MySlider.SetValue(m.getvolume()[0]) + except Exception,e: + print(str(e)) + + def WhenSliderDrag(self,value): ##value 0-100 + if value < 0 or value > 100: + return + + m = alsaaudio.Mixer() + m.setvolume(int(value)) + + def KeyDown(self,event): + + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Right"]: + self._MySlider.Further() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Left"]: + self._MySlider.StepBack() + self._Screen.Draw() + self._Screen.SwapAndShow() + + def Draw(self): + self.ClearCanvas() + + self._MySlider.Draw() + + + + + diff --git "a/Menu/GameShell/10_Settings/Storage/Icon\r" "b/Menu/GameShell/10_Settings/Storage/Icon\r" new file mode 100644 index 0000000..e69de29 diff --git a/Menu/GameShell/10_Settings/Storage/__init__.py b/Menu/GameShell/10_Settings/Storage/__init__.py new file mode 100644 index 0000000..0af1f8a --- /dev/null +++ b/Menu/GameShell/10_Settings/Storage/__init__.py @@ -0,0 +1,138 @@ +# -*- coding: utf-8 -*- + +import pygame +import os + + +## local UI import +from UI.page import Page +from UI.skin_manager import MySkinManager +from UI.constants import ICON_TYPES,Width,Height +from UI.icon_item import IconItem +from UI.icon_pool import MyIconPool +from UI.label import Label +from UI.util_funcs import midRect + +from libs.roundrects import aa_round_rect + +class StoragePage(Page): + + _Icons = {} + _BGpng = None + _BGwidth = 96 + _BGheight = 73 + _BGlabel = None + _FreeLabel = None + + _BGmsg = "%.1fGB of %.1fGB Used" + _DskUsg = None + + _HighColor = MySkinManager.GiveColor('High') + _FootMsg = ["Nav.","","","Back",""] + + def __init__(self): + Page.__init__(self) + + self._Icons = {} + + + def DiskUsage(self): + statvfs = os.statvfs('/') + + total_space = (statvfs.f_frsize * statvfs.f_blocks)/1024.0/1024.0/1024.0 + + avail_space = ( statvfs.f_frsize * statvfs.f_bavail) / 1024.0 / 1024.0/ 1024.0 + + return avail_space,total_space + + def Init(self): + + self._DskUsg = self.DiskUsage() + + self._CanvasHWND = self._Screen._CanvasHWND + self._Width = self._Screen._Width + self._Height = self._Screen._Height + + self._BGpng = IconItem() + self._BGpng._ImgSurf = MyIconPool.GiveIconSurface("icon_sd") + self._BGpng._MyType = ICON_TYPES["STAT"] + self._BGpng._Parent = self + + self._BGpng.AddLabel(self._BGmsg % (self._DskUsg[1]-self._DskUsg[0], self._DskUsg[1]), MySkinManager.GiveFont("varela15")) + self._BGpng.Adjust(0,0,self._BGwidth,self._BGheight,0) + + + self._BGlabel = Label() + self._BGlabel.SetCanvasHWND(self._CanvasHWND) + + usage_percent = (self._DskUsg[0]/self._DskUsg[1] )*100.0 + + self._BGlabel.Init("%d%%"% int(usage_percent),MySkinManager.GiveFont("varela25")) + self._BGlabel.SetColor( self._HighColor ) + + self._FreeLabel = Label() + self._FreeLabel.SetCanvasHWND(self._CanvasHWND) + self._FreeLabel.Init("Free",MySkinManager.GiveFont("varela13")) + self._FreeLabel.SetColor(self._BGlabel._Color) + + + def OnLoadCb(self): + pass + + def Draw(self): + self.ClearCanvas() + + self._BGpng.NewCoord(self._Width/2,self._Height/2-10) + self._BGpng.Draw() + self._BGlabel.NewCoord(self._Width/2-28,self._Height/2-30) + self._BGlabel.Draw() + + self._FreeLabel.NewCoord(self._BGlabel._PosX+10 ,self._Height/2) + self._FreeLabel.Draw() + + #bgcolor = (238,238,238), fgcolor = (126,206,244) + #aa_round_rect + usage_percent = (self._DskUsg[0]/self._DskUsg[1] ) + if usage_percent < 0.1: + usage_percent = 0.1 + + rect_ = midRect(self._Width/2,self._Height-30,170,17, Width,Height) + + aa_round_rect(self._CanvasHWND, rect_, MySkinManager.GiveColor('Line'), 5, 0, MySkinManager.GiveColor('Line')) + + + rect2 = midRect(self._Width/2,self._Height-30,int(170*(1.0-usage_percent)),17, Width,Height) + + rect2.left = rect_.left + rect2.top = rect_.top + + aa_round_rect(self._CanvasHWND,rect2, MySkinManager.GiveColor('Front'),5,0,MySkinManager.GiveColor('Front')) + +class APIOBJ(object): + + _StoragePage = None + def __init__(self): + pass + def Init(self,main_screen): + self._StoragePage = StoragePage() + + self._StoragePage._Screen = main_screen + self._StoragePage._Name ="Storage" + self._StoragePage.Init() + + + def API(self,main_screen): + if main_screen !=None: + main_screen.PushPage(self._StoragePage) + main_screen.Draw() + main_screen.SwapAndShow() + + + +OBJ = APIOBJ() +def Init(main_screen): + OBJ.Init(main_screen) +def API(main_screen): + OBJ.API(main_screen) + + diff --git a/Menu/GameShell/10_Settings/Time/__init__.py b/Menu/GameShell/10_Settings/Time/__init__.py new file mode 100644 index 0000000..a4b97c9 --- /dev/null +++ b/Menu/GameShell/10_Settings/Time/__init__.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- + +import pygame + +## local UI import +import pages +import myvars + +def Init(main_screen): + pages.InitTimezoneListPage(main_screen) + +def API(main_screen): + if main_screen !=None: + main_screen.PushCurPage() + main_screen.SetCurPage(myvars.TimezoneListPage) + main_screen.Draw() + main_screen.SwapAndShow() + + diff --git a/Menu/GameShell/10_Settings/Time/list_item.py b/Menu/GameShell/10_Settings/Time/list_item.py new file mode 100644 index 0000000..7463b0f --- /dev/null +++ b/Menu/GameShell/10_Settings/Time/list_item.py @@ -0,0 +1,112 @@ +# -*- coding: utf-8 -*- + +import pygame +from libs.roundrects import aa_round_rect + +## local UI import +from UI.constants import ICON_TYPES +from UI.page import Page +from UI.label import Label +from UI.icon_item import IconItem +from UI.util_funcs import midRect +from UI.skin_manager import MySkinManager + +# a item for List +# - - - - - - - - - - - -- +# | Icon Text..... > | +# ------------------------ + +import myvars # icons_path + +class ListItemIcon(IconItem): + + _CanvasHWND = None + _Parent = None + _Width = 18 + _Height = 18 + + def Draw(self): + self._CanvasHWND.blit(self._ImgSurf,(self._PosX,self._PosY+(self._Parent._Height-self._Height)/2,self._Width,self._Height)) + + +class ListItemLabel(Label): + + _ActiveColor = MySkinManager.GiveColor('Active') + _Active = False + def Draw(self): + + self._FontObj.set_bold(self._Active) + + my_text = self._FontObj.render( self._Text,True,self._Color) + self._CanvasHWND.blit(my_text,(self._PosX,self._PosY,self._Width,self._Height)) + + +class ListItem(object): + _PosX = 0 + _PosY = 0 + _Width = 0 + _Height = 30 + + _Labels = {} + _Icons = {} + _Fonts = {} + _MyType = ICON_TYPES["EXE"] + _LinkObj = None + _Path = "" + _Active = False + _Parent = None + + _Text = "" + def __init__(self): + self._Labels = {} + self._Icons = {} + self._Fonts = {} + + + def Init(self,text): + + self._Text = text + + l = ListItemLabel() + l._PosX = 22 + l.SetCanvasHWND(self._Parent._CanvasHWND) + + if self._MyType == ICON_TYPES["DIR"]: + l.Init(text,self._Fonts["normal"]) + self._Path = text + else: + l.Init(text,self._Fonts["normal"]) + self._Path = text + + + self._Labels["Text"] = l + + + def NewCoord(self,x,y): + self._PosX = x + self._PosY = y + + def Draw(self): + + if self._MyType == ICON_TYPES["DIR"] and self._Path != "[..]": + self._Parent._Icons["sys"]._IconIndex = 0 + self._Parent._Icons["sys"].NewCoord(self._PosX+12,self._PosY+ (self._Height - self._Parent._Icons["sys"]._Height)/2+self._Parent._Icons["sys"]._Height/2) + self._Parent._Icons["sys"].Draw() + + if self._MyType == ICON_TYPES["FILE"]: + self._Parent._Icons["sys"]._IconIndex = 1 + self._Parent._Icons["sys"].NewCoord(self._PosX+12,self._PosY+ (self._Height - self._Parent._Icons["sys"]._Height)/2+self._Parent._Icons["sys"]._Height/2) + self._Parent._Icons["sys"].Draw() + + if self._Active == True: + self._Labels["Text"]._Active = True + else: + self._Labels["Text"]._Active = False + + + self._Labels["Text"]._PosY = self._PosY + (self._Height - self._Labels["Text"]._Height)/2 + + pygame.draw.line(self._Parent._CanvasHWND,MySkinManager.GiveColor('Line'),(self._PosX,self._PosY+self._Height-1),(self._PosX+self._Width,self._PosY+self._Height-1),1) + + self._Labels["Text"].Draw() + diff --git a/Menu/GameShell/10_Settings/Time/logger.py b/Menu/GameShell/10_Settings/Time/logger.py new file mode 100644 index 0000000..d272470 --- /dev/null +++ b/Menu/GameShell/10_Settings/Time/logger.py @@ -0,0 +1,16 @@ +import logzero + +def get_logger(): + # Set a custom formatter + log_format = '%(color)s[%(levelname)1.1s ' \ + '%(asctime)s.%(msecs)03d %(module)s:%(lineno)d]' \ + '%(end_color)s %(message)s' + formatter = logzero.LogFormatter(fmt=log_format) + logzero.setup_default_logger(formatter=formatter) + + logzero.logfile( + 'logzero.log', + maxBytes=1e6, + backupCount=3 + ) + return logzero.logger \ No newline at end of file diff --git a/Menu/GameShell/10_Settings/Time/myvars.py b/Menu/GameShell/10_Settings/Time/myvars.py new file mode 100644 index 0000000..991ece9 --- /dev/null +++ b/Menu/GameShell/10_Settings/Time/myvars.py @@ -0,0 +1,5 @@ + + +TimePage = None +TimezoneListPage = None + diff --git a/Menu/GameShell/10_Settings/Time/pages.py b/Menu/GameShell/10_Settings/Time/pages.py new file mode 100644 index 0000000..d73abfb --- /dev/null +++ b/Menu/GameShell/10_Settings/Time/pages.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- + +from timezone_lib_list_page import TimezoneListPage +import myvars + +def InitTimePage(main_screen): + myvars.TimePage = None + +def InitTimezoneListPage(main_screen): + myvars.TimezoneListPage = TimezoneListPage() + myvars.TimezoneListPage._Screen = main_screen + myvars.TimezoneListPage._Name = "Timezone Selection" + myvars.TimezoneListPage.Init() diff --git a/Menu/GameShell/10_Settings/Time/timezone_lib_list_page.py b/Menu/GameShell/10_Settings/Time/timezone_lib_list_page.py new file mode 100644 index 0000000..4297ce9 --- /dev/null +++ b/Menu/GameShell/10_Settings/Time/timezone_lib_list_page.py @@ -0,0 +1,304 @@ +# -*- coding: utf-8 -*- + +import os +import subprocess +import pygame + +from libs.roundrects import aa_round_rect + +## local UI import +from UI.constants import Width,Height,ICON_TYPES +from UI.page import Page,PageSelector +from UI.label import Label +from UI.icon_item import IconItem +from UI.util_funcs import midRect +from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB +from UI.multi_icon_item import MultiIconItem +from UI.icon_pool import MyIconPool +from UI.scroller import ListScroller +from UI.skin_manager import MySkinManager +from UI.lang_manager import MyLangManager +from list_item import ListItem + + +import myvars + + +class TimeLibStack: + def __init__(self): + self.stack = list() + + def Push(self,data): + if data not in self.stack: + self.stack.append(data) + return True + return False + + def Pop(self): + if len(self.stack)<=0: + return None,False + return self.stack.pop(),True + + def Last(self): + idx = len(self.stack) -1 + if idx < 0: + return "/usr/share/zoneinfo/posix" + else: + return self.stack[ idx ] + + def Length(self): + return len(self.stack) + +class ListPageSelector(PageSelector): + _BackgroundColor = MySkinManager.GiveColor('Front') + + def __init__(self): + self._PosX = 0 + self._PosY = 0 + self._Height = 0 + self._Width = Width + + def AnimateDraw(self,x2,y2): + pass + + def Draw(self): + idx = self._Parent._PsIndex + + if idx < len(self._Parent._MyList): + x = self._Parent._MyList[idx]._PosX+2 + y = self._Parent._MyList[idx]._PosY+1 + h = self._Parent._MyList[idx]._Height -3 + + self._PosX = x + self._PosY = y + self._Height = h + + aa_round_rect(self._Parent._CanvasHWND, + (x,y,self._Width-4,h),self._BackgroundColor,4,0,self._BackgroundColor) + + + +class TimezoneListPage(Page): + + _Icons = {} + _Selector=None + _FootMsg = ["Nav","","","Back","Select"] + _MyList = [] + _SwapMyList = [] + _ListFont = MyLangManager.TrFont("notosanscjk15") + _MyStack = None + + _Scroller = None + + _BGpng = None + _BGwidth = 56 + _BGheight = 70 + + def __init__(self): + Page.__init__(self) + self._Icons = {} + self._CanvasHWND = None + self._MyList = [] + self._SwapMyList = [] + self._MyStack = TimeLibStack() + + def buildDirectoryList(self, path): + elements = [ + { + 'name': f, + 'file_path': os.path.join(path, f), + 'is_file': os.path.isfile(os.path.join(path, f)) + } + for f in os.listdir(path) + ] + return elements + + def SyncList(self,path): + + alist = self.buildDirectoryList(path) + if not alist: + print("buildDirectoryList empty") + return + + self._MyList = [] + self._SwapMyList = [] + + start_x = 0 + start_y = 0 + hasparent = 0 + if self._MyStack.Length() > 0: + hasparent = 1 + li = ListItem() + li._Parent = self + li._PosX = start_x + li._PosY = start_y + li._Width = Width + li._Fonts["normal"] = self._ListFont + li._MyType = ICON_TYPES["DIR"] + li.Init("[..]") + self._MyList.append(li) + + for i,v in enumerate(sorted(alist)): + li = ListItem() + li._Parent = self + li._PosX = start_x + li._PosY = start_y + (i+hasparent)*ListItem._Height + li._Width = Width + li._Fonts["normal"] = self._ListFont + li._MyType = ICON_TYPES["FILE"] + + if not v['is_file']: + li._MyType = ICON_TYPES["DIR"] + else: + li._MyType = ICON_TYPES["FILE"] + + li.Init( v['name'] ) + li._Path = v["file_path"] + + + self._MyList.append(li) + + for i in self._MyList: + self._SwapMyList.append(i) + + def Init(self): + self._PosX = self._Index * self._Screen._Width + self._Width = self._Screen._Width + self._Height = self._Screen._Height + + self._CanvasHWND = self._Screen._CanvasHWND + + ps = ListPageSelector() + ps._Parent = self + self._Ps = ps + self._PsIndex = 0 + + self.SyncList("/usr/share/zoneinfo/posix") + + icon_for_list = MultiIconItem() + icon_for_list._ImgSurf = MyIconPool.GiveIconSurface("sys") + icon_for_list._MyType = ICON_TYPES["STAT"] + icon_for_list._Parent = self + + icon_for_list.Adjust(0,0,18,18,0) + self._Icons["sys"] = icon_for_list + + + self._BGpng = IconItem() + self._BGpng._ImgSurf = MyIconPool.GiveIconSurface("empty") + self._BGpng._MyType = ICON_TYPES["STAT"] + self._BGpng._Parent = self + self._BGpng.AddLabel("No timezones found on system!", MyLangManager.TrFont("varela22")) + self._BGpng.SetLableColor(MySkinManager.GiveColor('Disabled')) + self._BGpng.Adjust(0,0,self._BGwidth,self._BGheight,0) + + + self._Scroller = ListScroller() + self._Scroller._Parent = self + self._Scroller._PosX = self._Width - 10 + self._Scroller._PosY = 2 + self._Scroller.Init() + + def Click(self): + if len(self._MyList) == 0: + return + + cur_li = self._MyList[self._PsIndex] + + if cur_li._MyType == ICON_TYPES["DIR"]: + if cur_li._Path == "[..]": + self._MyStack.Pop() + self.SyncList( self._MyStack.Last() ) + self._PsIndex = 0 + else: + self._MyStack.Push( self._MyList[self._PsIndex]._Path ) + self.SyncList( self._MyStack.Last() ) + self._PsIndex = 0 + + if cur_li._MyType == ICON_TYPES["FILE"]: ## set the current timezone + subprocess.call(['sudo', 'cp', cur_li._Path, '/etc/localtime']) + #copyfile(cur_li._Path, '/etc/localtime') + print("add" , cur_li._Path) + + self._Screen.Draw() + self._Screen.SwapAndShow() + + def Rescan(self): + self.SyncList("/usr/share/zoneinfo/posix") + self._PsIndex = 0 + + def KeyDown(self,event): + + if IsKeyMenuOrB(event.key): + + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Up"]: + self.ScrollUp() + self._Screen.Draw() + self._Screen.SwapAndShow() + if event.key == CurKeys["Down"]: + self.ScrollDown() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Right"]: + self.FScrollDown(Step=5) + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Left"]: + self.FScrollUp(Step=5) + self._Screen.Draw() + self._Screen.SwapAndShow() + + if IsKeyStartOrA(event.key): + self.Click() + + def Draw(self): + self.ClearCanvas() + + if len(self._MyList) == 0: + self._BGpng.NewCoord(self._Width/2,self._Height/2) + self._BGpng.Draw() + return + + else: + if len(self._MyList) * ListItem._Height > self._Height: + self._Ps._Width = self._Width - 11 + + self._Ps.Draw() + for i in self._MyList: + if False: + i._Active = True + else: + i._Active = False + + if i._PosY > self._Height + self._Height/2: + break + + if i._PosY < 0: + continue + + i.Draw() + + self._Scroller.UpdateSize( len(self._MyList)*ListItem._Height, self._PsIndex*ListItem._Height) + self._Scroller.Draw() + else: + self._Ps._Width = self._Width + self._Ps.Draw() + for i in self._MyList: + if False: + i._Active = True + else: + i._Active = False + + if i._PosY > self._Height + self._Height/2: + break + + if i._PosY < 0: + continue + + i.Draw() diff --git a/Menu/GameShell/10_Settings/Update/__init__.py b/Menu/GameShell/10_Settings/Update/__init__.py new file mode 100644 index 0000000..8588cd2 --- /dev/null +++ b/Menu/GameShell/10_Settings/Update/__init__.py @@ -0,0 +1,334 @@ +# -*- coding: utf-8 -*- + +import pygame +import os +import requests +import validators +import gobject + + +## local UI import +from UI.page import Page +from UI.constants import ICON_TYPES,Width,Height,RUNEVT,RUNSH +from UI.icon_item import IconItem +from UI.icon_pool import MyIconPool +from UI.label import Label +from UI.util_funcs import midRect,CmdClean,get_git_revision_short_hash +from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB +from UI.confirm_page import ConfirmPage +from UI.download import Download +from UI.download_process_page import DownloadProcessPage +from UI.skin_manager import MySkinManager +from UI.lang_manager import MyLangManager + +from UI.info_page_list_item import InfoPageListItem + +from libs.roundrects import aa_round_rect +from libs.DBUS import is_wifi_connected_now + +import config + +LauncherLoc = "/home/cpi/launcher" + +class UpdateDownloadPage(DownloadProcessPage): + _MD5 = "" + + def GObjectUpdateProcessInterval(self): + if self._Screen.CurPage() == self: + if self._Downloader.isFinished(): + if self._Downloader.isSuccessful(): + print("Success!") + # Do something with obj.get_dest() + filename = self._Downloader.get_dest() + + if filename.endswith(".tar.gz"): + #/home/cpi/apps/[launcher] + cmdpath = "tar zxf " + CmdClean(filename) + " -C /home/cpi/ ;rm -rf "+ filename + pygame.event.post( pygame.event.Event(RUNEVT, message=cmdpath)) + + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + else: + print("Download failed with the following exceptions:") + for e in self._Downloader.get_errors(): + print(unicode(e)) + + try: + self._Downloader.stop() + except: + pass + + filename = self._Downloader.get_dest() + print(filename) + os.system("rm -rf %s" % CmdClean(filename)) + + self._Screen._MsgBox.SetText("DownloadFailed") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + return False + else: + self._Value = self._Downloader.get_progress() + print("Progress: %d%%" % (self._Value)) + self._Screen.Draw() + self._Screen.SwapAndShow() + return True + else: + return False + + def StartDownload(self,url,dst_dir): + if validators.url(url) and os.path.isdir(dst_dir): + self._URL = url + self._DST_DIR = dst_dir + else: + self._Screen._MsgBox.SetText("Invaid") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + return + + self._Downloader = Download(url,dst_dir,None) + if self._MD5 != None: + if len(self._MD5) == 32: + self._Downloader.add_hash_verification('md5' ,self._MD5) ## hashlib provide algorithms + + self._Downloader.start() + + self._DownloaderTimer = gobject.timeout_add(100, self.GObjectUpdateProcessInterval) + + + +class UpdateConfirmPage(ConfirmPage): + _ConfirmText = "Confirm Update ?" + + _DownloadPage = None + + _URL = "" + _MD5 = "" + _Version = "" + _GIT = False + + def KeyDown(self,event): + global LauncherLoc + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if IsKeyStartOrA(event.key): + if self._GIT == True: + cmdpath = "%s/update.sh %s" % (LauncherLoc,self._Version) + pygame.event.post( pygame.event.Event(RUNSH, message=cmdpath)) + return + + if self._DownloadPage == None: + self._DownloadPage = UpdateDownloadPage() + self._DownloadPage._Screen = self._Screen + self._DownloadPage._Name = "Downloading" + self._DownloadPage.Init() + + self._DownloadPage._MD5 = self._MD5 + self._Screen.PushPage(self._DownloadPage) + self._Screen.Draw() + self._Screen.SwapAndShow() + + if self._URL != None and validators.url(self._URL): + self._DownloadPage.StartDownload(self._URL, "/tmp") + else: + print "error url %s " % self._URL + + + def OnReturnBackCb(self): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + def Draw(self): + self.ClearCanvas() + self.DrawBG() + for i in self._MyList: + i.Draw() + + self.Reset() + + +class UpdatePage(Page): + _Icons = {} + _FootMsg = ["Nav","","Check Update","Back",""] + + _ListFontObj = MyLangManager.TrFont("varela15") + _ConfirmPage = None + _AList = {} + _MyList = [] + def __init__(self): + Page.__init__(self) + self._Icons = {} + + def GenList(self): + + start_x = 0 + start_y = 0 + + for i,v in enumerate( self._AList): + li = InfoPageListItem() + li._Parent = self + li._PosX = start_x + li._PosY = start_y + i*InfoPageListItem._Height + li._Width = Width + li._Fonts["normal"] = self._ListFontObj + li._Fonts["small"] = MySkinManager.GiveFont("varela12") + + if self._AList[v]["label"] != "": + li.Init( self._AList[v]["label"] ) + else: + li.Init( self._AList[v]["key"] ) + + li._Flag = self._AList[v]["key"] + + li.SetSmallText( self._AList[v]["value"] ) + + self._MyList.append(li) + + def Init(self): + self._CanvasHWND = self._Screen._CanvasHWND + self._Width = self._Screen._Width + self._Height = self._Screen._Height + + self._ConfirmPage = UpdateConfirmPage() + self._ConfirmPage._Screen = self._Screen + self._ConfirmPage._Name = "Update Confirm" + self._ConfirmPage._Parent = self + self._ConfirmPage.Init() + + it = {} + it["key"] = "version" + it["label"] = "Version" + it["value"] = config.VERSION + self._AList["version"] = it + + self.GenList() + + def CheckUpdate(self): + global LauncherLoc + self._Screen._MsgBox.SetText("CheckingUpdate") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + + try: + r = requests.get(config.UPDATE_URL, verify=False, timeout=8) + except: + print("requests get error") + return + else: + if r.status_code == requests.codes.ok: + try: + json_ = r.json() + + if "version" in json_ and "updatepath" in json_ and "md5sum" in json_: + if config.VERSION != json_["version"]: + + self._ConfirmPage._URL = json_["updatepath"] + self._ConfirmPage._MD5 = json_["md5sum"] + self._ConfirmPage._GIT = False + + self._Screen.PushPage(self._ConfirmPage) + + self._Screen.Draw() + self._ConfirmPage.SnapMsg(MyLangManager.Tr("ConfirmUpdateToFQ") % json_["version"] ) + self._Screen.SwapAndShow() + + elif "gitversion" in json_: ### just use git to run update + cur_dir = os.getcwd() + os.chdir(LauncherLoc) + current_git_version = get_git_revision_short_hash() + current_git_version = current_git_version.strip("\n") + current_git_version = current_git_version.strip("\t") + os.chdir(cur_dir) + if current_git_version != json_["gitversion"]: + self._ConfirmPage._URL = None + self._ConfirmPage._MD5 = None + self._ConfirmPage._GIT = True + self._ConfirmPage._Version = json_["gitversion"] + + self._Screen.PushPage(self._ConfirmPage) + + self._Screen.Draw() + self._ConfirmPage.SnapMsg(MyLangManager.Tr("UpdateToFQ") % json_["gitversion"] ) + self._Screen.SwapAndShow() + else: + self._Screen.Draw() + self._Screen._MsgBox.SetText("LauncherIsUpToDate") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + pygame.time.delay(765) + + return True + except Exception, e: + print("r.json() error %s" % str(e)) + + else: + print(" requests get error %d ", r.status_code) + + + return False + + def OnLoadCb(self): + pass + + def KeyDown(self,event): + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["X"]: + if is_wifi_connected_now(): + if self.CheckUpdate() == True: + self._Screen.Draw() + self._Screen.SwapAndShow() + else: + self._Screen.Draw() + self._Screen._MsgBox.SetText("CheckingUpdateFailed") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + else: + self._Screen.Draw() + self._Screen._MsgBox.SetText("CheckWifiConnection") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + + def Draw(self): + self.ClearCanvas() +# self._Ps.Draw() + + for i in self._MyList: + i.Draw() + + +class APIOBJ(object): + + _UpdatePage = None + def __init__(self): + pass + def Init(self,main_screen): + self._UpdatePage = UpdatePage() + + self._UpdatePage._Screen = main_screen + self._UpdatePage._Name = "Update Launcher" + self._UpdatePage.Init() + + def API(self,main_screen): + if main_screen !=None: + main_screen.PushPage(self._UpdatePage) + main_screen.Draw() + main_screen.SwapAndShow() + + + +OBJ = APIOBJ() +def Init(main_screen): + OBJ.Init(main_screen) +def API(main_screen): + OBJ.API(main_screen) + + diff --git a/Menu/GameShell/10_Settings/Wifi/__init__.py b/Menu/GameShell/10_Settings/Wifi/__init__.py new file mode 100644 index 0000000..7718143 --- /dev/null +++ b/Menu/GameShell/10_Settings/Wifi/__init__.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- + +## local UI import +import pages +import myvars +""" +try: + from icons import preload +except: + print("No icons package") +""" + +def Init(main_screen): + pages.InitPasswordPage(main_screen) + pages.InitScanPage(main_screen) + myvars.PasswordPage._Caller = myvars.ScanPage + +def API(main_screen): + + if main_screen != None: + main_screen.PushCurPage() + main_screen.SetCurPage(myvars.ScanPage) + main_screen.Draw() + main_screen.SwapAndShow() + + diff --git a/Menu/GameShell/10_Settings/Wifi/myvars.py b/Menu/GameShell/10_Settings/Wifi/myvars.py new file mode 100644 index 0000000..987456c --- /dev/null +++ b/Menu/GameShell/10_Settings/Wifi/myvars.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- + + +ScanPage = None +PasswordPage = None diff --git a/Menu/GameShell/10_Settings/Wifi/net_item.py b/Menu/GameShell/10_Settings/Wifi/net_item.py new file mode 100644 index 0000000..d01b22b --- /dev/null +++ b/Menu/GameShell/10_Settings/Wifi/net_item.py @@ -0,0 +1,196 @@ +# -*- coding: utf-8 -*- + +import pygame + +## local UI import +from UI.page import Page +from UI.label import Label +from UI.icon_item import IconItem +from UI.multi_icon_item import MultiIconItem +from UI.icon_pool import MyIconPool +from UI.skin_manager import MySkinManager +from UI.widget import Widget + +class NetItemMultiIcon(MultiIconItem): + _CanvasHWND = None + _Parent = None + _Width = 18 + _Height = 18 + + def Draw(self): + self._CanvasHWND.blit(self._ImgSurf,(self._PosX,self._PosY+(self._Parent._Height-self._Height)/2,self._Width,self._Height), + (0,self._IconIndex*self._IconHeight,self._IconWidth,self._IconHeight)) + +class NetItemIcon(IconItem): + + _CanvasHWND = None + _Parent = None + _Width = 18 + _Height = 18 + + def Draw(self): + self._CanvasHWND.blit(self._ImgSurf,(self._PosX,self._PosY+(self._Parent._Height-self._Height)/2,self._Width,self._Height)) + + +class NetItem(Widget): + _Height = 30 + + _Bssid="" # 50:3A:A0:51:18:3C + _Essid="" # MERCURY_EB88 + + ## extra infomations + _dhcphostname = "GameShell" + _ip = None #eg 192.168.31.141 + _dns_domain = None + _gateway = None #eg 192.168.31.1 + _use_global_dns = 0 ## eg 0 == False, 1 == True + _netmask = None ##eg 255.255.255.0 + _usedhcphostname= 0 + _bitrate = "auto" + _allow_lower_bitrates = 0 + _dns3 = None + _dns2 = None ## eg 1.1.1.1 + _dns1 = None ## eg 8.8.8.8 + _use_settings_globally = 0 + _use_static_dns = 0 # eg: 1 == True + _search_domain = None + + _Encrypt="" # WPA2 + _Channel="" # '10' + _Stren = "" ## 19% + _NetId = 0 ## 0-n + _Mode = "" ## Master or AdHoc + _Parent = None + _IsActive = False + + _Icons = {} ## wifi strength and security icons + _Labels = {} + _FontObj = None + + def __init__(self): + self._Labels = {} + self._Icons = {} + + def SetActive(self,act): + self._IsActive = act + + def UpdateStrenLabel(self, strenstr): ## strenstr should be 'number',eg:'90' + self._Stren = self._Parent._Daemon.FormatSignalForPrinting(strenstr) + self._Labels["stren"]._Text = self._Stren + + def Init(self, i, is_active): + # Pick which strength measure to use based on what the daemon says + # gap allocates more space to the first module + if self._Parent._Daemon.GetSignalDisplayType() == 0: + strenstr = 'quality' + gap = 4 # Allow for 100% + else: + strenstr = 'strength' + gap = 7 # -XX dbm = 7 + self._NetId = i + # All of that network property stuff + self._Stren = self._Parent._Daemon.FormatSignalForPrinting( + str(self._Parent._Wireless.GetWirelessProperty(self._NetId, strenstr))) + + self._Essid = self._Parent._Wireless.GetWirelessProperty(self._NetId, 'essid') + self._Bssid = self._Parent._Wireless.GetWirelessProperty(self._NetId, 'bssid') + + if self._Parent._Wireless.GetWirelessProperty(self._NetId, 'encryption'): + self._Encrypt = \ + self._Parent._Wireless.GetWirelessProperty(self._NetId, 'encryption_method') + else: + self._Encrypt = 'Unsecured' + + self._Mode = \ + self._Parent._Wireless.GetWirelessProperty(self._NetId, 'mode') # Master, Ad-Hoc + self._Channel = self._Parent._Wireless.GetWirelessProperty(self._NetId, 'channel') + theString = ' %-*s %25s %9s %17s %6s %4s' % \ + (gap, self._Stren, self._Essid, self._Encrypt, self._Bssid, self._Mode, + self._Channel) + + if is_active: + theString = ">> "+theString[1:] + self.SetActive(is_active) + + + + essid_label = Label() + essid_label._PosX = 36 + #essid_label._PosY = self._PosY + (self._Height - self._FontObj.render(self._Essid,True,(83,83,83)).get_height())/2 + essid_label._CanvasHWND = self._Parent._CanvasHWND + + if len(self._Essid) > 19: + essid_ = self._Essid[:20] + else: + essid_ = self._Essid + + essid_label.Init(essid_,self._FontObj) + self._Labels["essid"] = essid_label + + stren_label = Label() + #stren_label._PosY = self._PosY + (self._Height - self._FontObj.render(self._Stren,True,(83,83,83)).get_height())/2 + stren_label._CanvasHWND = self._Parent._CanvasHWND + + stren_label.Init(self._Stren,self._FontObj) + stren_label._PosX = self._Width - 23 - stren_label.Width() - 2 + self._Labels["stren"] = stren_label + + + lock_icon = NetItemIcon() + lock_icon._ImgSurf = MyIconPool.GiveIconSurface("lock") + lock_icon._CanvasHWND = self._Parent._CanvasHWND + lock_icon._Parent = self + self._Icons["lock"] = lock_icon + + done_icon = NetItemIcon() + done_icon._ImgSurf = MyIconPool.GiveIconSurface("done") + done_icon._CanvasHWND = self._Parent._CanvasHWND + done_icon._Parent = self + + self._Icons["done"] = done_icon + + + ## reuse the resource from TitleBar + nimt = NetItemMultiIcon() + nimt._ImgSurf = self._Parent._Screen._TitleBar._Icons["wifistatus"]._ImgSurf + nimt._CanvasHWND = self._Parent._CanvasHWND + nimt._Parent = self + self._Icons["wifistatus"] = nimt + + #pp(theString) + + + def Connect(self,notworkentry=None): + """ Execute connection. """ + self._Parent._Wireless.ConnectWireless(self._NetId) + + + def Draw(self): + #pygame.draw.line(self._Parent._CanvasHWND,(169,169,169),(self._PosX,self._PosY),(self._PosX+self._Width,self._PosY),1) + for i in self._Labels: + self._Labels[i]._PosY = self._PosY + (self._Height - self._Labels[i]._Height)/2 + self._Labels[i].Draw() + + if self._IsActive: + self._Icons["done"].NewCoord(14,self._PosY) + self._Icons["done"].Draw() + + if self._Encrypt != "Unsecured": + self._Icons["lock"].NewCoord( self._Width -23 - self._Labels["stren"].Width() - 2 - 18, self._PosY) + self._Icons["lock"].Draw() + + ge = self._Parent._Screen._TitleBar.GetWifiStrength( self._Stren.replace('%','')) + + if ge > 0: + self._Icons["wifistatus"]._IconIndex = ge + self._Icons["wifistatus"].NewCoord(self._Width-23,self._PosY) + self._Icons["wifistatus"].Draw() + + else: + self._Icons["wifistatus"]._IconIndex = 0 + self._Icons["wifistatus"].NewCoord(self._Width-23,self._PosY) + self._Icons["wifistatus"].Draw() + + pygame.draw.line(self._Parent._CanvasHWND,MySkinManager.GiveColor('Line'),(self._PosX,self._PosY+self._Height-1),(self._PosX+self._Width,self._PosY+self._Height-1),1) + + diff --git a/Menu/GameShell/10_Settings/Wifi/pages.py b/Menu/GameShell/10_Settings/Wifi/pages.py new file mode 100644 index 0000000..881eb3f --- /dev/null +++ b/Menu/GameShell/10_Settings/Wifi/pages.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- + + +#import dbus +#import dbus.service +#from wicd import misc +##misc.to_bool +##misc.misc.noneToString +##misc.to_unicode +##misc.Noneify +#from wicd.translations import _ +#from wicd import wpath +#from wicd import dbusmanager + + +## local UI import +from libs.DBUS import bus,daemon,wireless,wired + +from UI.keyboard import Keyboard +from wifi_list import WifiList + +import myvars + + +def InitScanPage(main_screen): + global wireless + global daemon + global bus + + myvars.ScanPage = WifiList() + myvars.ScanPage._Name = "Scan wifi" + + myvars.ScanPage._Wireless = wireless + myvars.ScanPage._Daemon = daemon + myvars.ScanPage._Dbus = bus + + + myvars.ScanPage._Screen = main_screen + myvars.ScanPage.Init() + + + if daemon != None: + #Bind signals + myvars.ScanPage._Dbus.add_signal_receiver(myvars.ScanPage.DbusScanFinishedSig, 'SendEndScanSignal', + 'org.wicd.daemon.wireless') + myvars.ScanPage._Dbus.add_signal_receiver(myvars.ScanPage.DbusScanStarted, 'SendStartScanSignal', + 'org.wicd.daemon.wireless') + # + myvars.ScanPage._Dbus.add_signal_receiver(myvars.ScanPage.DbusDaemonStatusChangedSig, 'StatusChanged', + 'org.wicd.daemon') + myvars.ScanPage._Dbus.add_signal_receiver(myvars.ScanPage.DbusConnectResultsSent, 'ConnectResultsSent', + 'org.wicd.daemon') + +def InitPasswordPage(main_screen): + + myvars.PasswordPage = Keyboard() + myvars.PasswordPage._Name = "Enter wifi password" + + myvars.PasswordPage._Screen = main_screen + myvars.PasswordPage.Init() + diff --git a/Menu/GameShell/10_Settings/Wifi/wifi_list.py b/Menu/GameShell/10_Settings/Wifi/wifi_list.py new file mode 100644 index 0000000..c5882d7 --- /dev/null +++ b/Menu/GameShell/10_Settings/Wifi/wifi_list.py @@ -0,0 +1,738 @@ +# -*- coding: utf-8 -*- + +import pygame + +from beeprint import pp +from libs.roundrects import aa_round_rect +import gobject +from wicd import misc +## local UI import +from UI.constants import Width,Height +from UI.page import Page,PageSelector +from UI.label import Label +from UI.util_funcs import midRect,SwapAndShow +from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB +from UI.scroller import ListScroller +from UI.confirm_page import ConfirmPage +from UI.skin_manager import MySkinManager +from UI.lang_manager import MyLangManager + +from UI.info_page_list_item import InfoPageListItem +from UI.info_page_selector import InfoPageSelector + +from libs.DBUS import is_wifi_connected_now + +from net_item import NetItem + +import myvars + +class WifiDisconnectConfirmPage(ConfirmPage): + + _ConfirmText = MyLangManager.Tr("ConfirmDisconnectQ") + + def KeyDown(self,event): + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if IsKeyStartOrA(event.key): + self.SnapMsg(MyLangManager.Tr("Disconnecting")) + self._Screen.Draw() + self._Screen.SwapAndShow() + + self._Parent._Daemon.Disconnect() + + pygame.time.delay(400) + + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + + def Draw(self): + #self.ClearCanvas() + self.DrawBG() + for i in self._MyList: + i.Draw() + + self.Reset() + +class WifiInfoPage(Page): + _FootMsg = ["Nav","","","Back",""] + _MyList = [] + _ListFontObj = MyLangManager.TrFont("varela15") + + _Wireless = None + _Daemon = None + + _AList = {} + _NetworkId = -1 + + def GenList(self): + + self._MyList = [] + if self._NetworkId != -1: + self._AList["ip"]["value"] = "Not Connected" + + if self._Wireless.GetCurrentNetworkID(self._Wireless.GetIwconfig()) == self._NetworkId: + ip = self._Wireless.GetWirelessIP('') + + if ip is not None: + self._AList["ip"]["value"] = ip + + self._AList["bssid"]["value"] = self._Wireless.GetWirelessProperty(self._NetworkId,"bssid") + + start_x = 0 + start_y = 0 + + for i,v in enumerate( self._AList): + li = InfoPageListItem() + li._Parent = self + li._PosX = start_x + li._PosY = start_y + i*InfoPageListItem._Height + li._Width = Width + li._Fonts["normal"] = self._ListFontObj + li._Fonts["small"] = MyLangManager.TrFont("varela12") + + if self._AList[v]["label"] != "": + li.Init( self._AList[v]["label"] ) + else: + li.Init( self._AList[v]["key"] ) + + li._Flag = self._AList[v]["key"] + + li.SetSmallText( self._AList[v]["value"] ) + + self._MyList.append(li) + + def Init(self): + if self._Screen != None: + if self._Screen._CanvasHWND != None and self._CanvasHWND == None: + self._CanvasHWND = self._Screen._CanvasHWND + + self._PosX = self._Index*self._Screen._Width + self._Width = self._Screen._Width ## equal to screen width + self._Height = self._Screen._Height + + ps = InfoPageSelector() + ps._Parent = self + ps._PosX = 2 + self._Ps = ps + self._PsIndex = 0 + + ip = {} + ip["key"] = "ip" + ip["label"] = "IP" + ip["value"] = "Not Connected" + + bssid = {} + bssid["key"] = "bssid" + bssid["label"] = "BSSID" + bssid["value"] = "" + + self._AList["ip"] = ip + self._AList["bssid"] = bssid + + self.GenList() + + self._DisconnectConfirmPage = WifiDisconnectConfirmPage() + self._DisconnectConfirmPage._Screen = self._Screen + self._DisconnectConfirmPage._Name = "Confirm Disconnect" + self._DisconnectConfirmPage._Parent = self + self._DisconnectConfirmPage.Init() + + def Click(self): + cur_li = self._MyList[self._PsIndex] + print(cur_li._Flag) + + def TryDisconnect(self): + if self._Wireless.GetCurrentNetworkID(self._Wireless.GetIwconfig()) == self._NetworkId \ + and self._Wireless.GetWirelessIP('') is not None: + self._Screen.PushPage(self._DisconnectConfirmPage) + self._Screen.Draw() + self._Screen.SwapAndShow() + else: + return + + def OnLoadCb(self): + if self._Wireless.GetCurrentNetworkID(self._Wireless.GetIwconfig()) == self._NetworkId \ + and self._Wireless.GetWirelessIP('') is not None: + self._FootMsg[2] = "Disconnect" + else: + self._FootMsg[2] = "" + + self.GenList() + + def OnReturnBackCb(self): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + def KeyDown(self,event): + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Up"]: + self.ScrollUp() + self._Screen.Draw() + self._Screen.SwapAndShow() + if event.key == CurKeys["Down"]: + self.ScrollDown() + self._Screen.Draw() + self._Screen.SwapAndShow() + + + if IsKeyStartOrA(event.key): + self.Click() + + if event.key == CurKeys["X"]: + self.TryDisconnect() + + def Draw(self): + self.ClearCanvas() + self._Ps.Draw() + + for i in self._MyList: + i.Draw() + + + + +class WifiListSelector(PageSelector): + _BackgroundColor = MySkinManager.GiveColor('Front') + + def __init__(self): + pass + + def AnimateDraw(self,x2,y2): + pass + + + def Draw(self): + idx = self._Parent._PsIndex + if idx < len( self._Parent._MyList): + x = self._Parent._MyList[idx]._PosX+11 + y = self._Parent._MyList[idx]._PosY+1 + h = self._Parent._MyList[idx]._Height -3 + + self._PosX = x + self._PosY = y + self._Height = h + + aa_round_rect(self._Parent._CanvasHWND, + (x,y,self._Width,h),self._BackgroundColor,4,0,self._BackgroundColor) + + +class WifiListMessageBox(Label): + _Parent = None + + def Draw(self): + my_text = self._FontObj.render( self._Text,True,self._Color) + w = my_text.get_width() + h = my_text.get_height() + x = (self._Parent._Width - w)/2 + y = (self._Parent._Height - h)/2 + padding = 10 + pygame.draw.rect(self._CanvasHWND,MySkinManager.GiveColor('White'),(x-padding,y-padding, w+padding*2,h+padding*2)) + + pygame.draw.rect(self._CanvasHWND,MySkinManager.GiveColor('Black'),(x-padding,y-padding, w+padding*2,h+padding*2),1) + + self._CanvasHWND.blit(my_text,(x,y,w,h)) + +class WifiList(Page): + _MyList = [] + #Wicd dbus part + _Wireless = None + _Daemon = None + _Dbus = None + _WifiPassword = "" + _Connecting = False + _Scanning = False + + _PrevWicdState = None + + _Selector = None + + _ShowingMessageBox = False + _MsgBox = None + _ConnectTry = 0 + _BlockingUI = False + _BlockCb = None + + _LastStatusMsg = "" + _FootMsg = ["Nav","Info","Scan","Back","Enter"] + _EncMethods = None + _Scroller = None + _ListFontObj = MyLangManager.TrFont("notosanscjk15") + + _InfoPage = None + _CurBssid = "" + + def __init__(self): + Page.__init__(self) + self._MyList = [] + self._CanvasHWND = None + + def ShowBox(self,msg): + + self._MsgBox._Text = msg + self._ShowingMessageBox = True + self._Screen.Draw() + self._MsgBox.Draw() + self._Screen.SwapAndShow() + + def HideBox(self): + self.Draw() + self._ShowingMessageBox = False + self._Screen.SwapAndShow() + + def GenNetworkList(self): + self._MyList = [] + start_x = 0 + start_y = 0 + + for network_id in range(0,self._Wireless.GetNumberOfNetworks()): + is_active = \ + self._Wireless.GetCurrentSignalStrength("") != 0 and \ + self._Wireless.GetCurrentNetworkID(self._Wireless.GetIwconfig()) == network_id \ + and self._Wireless.GetWirelessIP('') is not None + + ni = NetItem() + ni._Parent = self + ni._PosX = start_x + ni._PosY = start_y + network_id* NetItem._Height + ni._Width = Width + ni._FontObj = self._ListFontObj + #ni._Bssid = self._Wireless.GetWirelessProperty(network_id,"bssid") + + ni.Init(network_id,is_active) + self._MyList.append(ni) + + self._PsIndex = 0 + + def Disconnect(self): + self._Connecting= False + self._Daemon.Disconnect() + ## force to disconnect + def ShutDownConnecting(self): + print("Shutdownconnecting...",self._ConnectTry) + self._Daemon.CancelConnect() + self._Daemon.SetForcedDisconnect(True) + self._Connecting = False + + def Rescan(self,sync=False): + print("start Rescan") + if self._Wireless != None: + self._Wireless.Scan(sync) + +## dbus signal functions + def DbusScanFinishedSig(self): + + if self._Screen._CurrentPage != self: + return + self.ResetPageSelector() + + self.UpdateNetList(force_check=True) + + self._Scanning = False + self.HideBox() + self._BlockingUI = False + print("dbus says scan finished") + + def DbusScanStarted(self): + if self._Screen._CurrentPage !=self: + return + + self._Scanning = True + self.ShowBox(MyLangManager.Tr("Wifi scanning")) + self._BlockingUI = True + print("dbus says start scan...") + + + def UpdateNetList(self,state=None,info=None,force_check=False,firstrun=False): + + if self._Daemon == None: + return + + if not state: + state,trash = self._Daemon.GetConnectionStatus() + print("state") + pp(state) + print("Trash: ") + pp(trash) + + if force_check or self._PrevWicdState != state: + self.GenNetworkList() ## refresh the network list + + if info != None: + if len(info) > 3: + _id = int(info[3]) + if _id < len(self._MyList): + self._MyList[_id].UpdateStrenLabel( str(info[2])) + + self._PrevWicdState = state + + def SetConnectingStatus(self,fast): + + wireless_connecting = self._Wireless.CheckIfWirelessConnecting() + + """ + if self._ConnectTry > 5000: + #wicd itself will take a very long time to try to connect ,will not block forever,just make it faster to dropout + self.ShutDownConnecting() + self._ConnectTry = 0 + self._BlockingUI = False + return False + """ + + if wireless_connecting: + + if not fast: + iwconfig = self._Wireless.GetIwconfig() + else: + iwconfig = '' + essid = self._Wireless.GetCurrentNetwork(iwconfig) + stat = self._Wireless.CheckWirelessConnectingMessage() + if self._LastStatusMsg != "%s: %s"%(essid,stat): + print("%s: %s" %(essid,stat)) + self._LastStatusMsg = "%s: %s"%(essid,stat) + self.ShowBox(self._LastStatusMsg) + + self._Screen._FootBar.UpdateNavText(self._LastStatusMsg) + SwapAndShow() + #self._ConnectTry+=1 + + return True + else: + self._Connecting = False + return self._Connecting + + def UpdateStatus(self): + print("UpdateStatus") + wireless_connecting = self._Wireless.CheckIfWirelessConnecting() + fast = not self._Daemon.NeedsExternalCalls() + + self._Connecting = wireless_connecting + + if self._Connecting: + gobject.timeout_add(250,self.SetConnectingStatus,fast) + else: + if not fast: + iwconfig = self._Wireless.GetIwconfig() + else: + iwconfig = '' + + if self.CheckForWireless(iwconfig,self._Wireless.GetWirelessIP(''),None): + return True + else: + print("Not Connected") + return True + + def DbusDaemonStatusChangedSig(self,state=None,info=None): + if self._Screen._CurrentPage != self: + return + + print("in DbusDaemonStatusChangedSig") + """ + dbus.UInt32(2L) + ['192.168.31.141', 'TP-LINK4G', '88', '0', '72.2 Mb/s'] + """ +# pp(info) + self.UpdateNetList(state,info) + if info != None: + self._Screen.Draw() + self._Screen.SwapAndShow() + + + def DbusConnectResultsSent(self,result): + print(" in DbusConnectResultsSent") + """ + in DbusConnectResultsSent + 'dhcp_failed' + dbus says start scan... + + """ + if result != None: + print(result) + + self._Connecting = False + self._BlockingUI = False + if self._BlockCb != None: + self._BlockCb() + self._BlockCb = None + + self._Screen._FootBar.ResetNavText() + + def CheckForWireless(self,iwconfig,wireless_ip,set_status): + if not wireless_ip: + return False + network = self._Wireless.GetCurrentNetwork(iwconfig) + if not network: + return False + network = misc.to_unicode(network) + if daemon.GetSignalDisplayType() == 0: + strength = self._Wireless.GetCurrentSignalStrength(iwconfig) + else: + strength = self._Wireless.GetCurrentDBMStrength(iwconfig) + + if strength is None: + return False + strength = misc.to_unicode(self._Daemon.FormatSignalForPrinting(strength)) + ip = misc.to_unicode(wireless_ip) + + print(_('Connected to $A at $B (IP: $C)').replace + ('$A', network).replace + ('$B', strength).replace + ('$C', ip)) + + return True + + def ConfigWireless(self,password): + + netid = self._PsIndex + + for i,v in enumerate(self._MyList): + if v._Bssid == self._CurBssid: + netid = i + break + + print(netid," ", password) + """ + self._Wireless.SetWirelessProperty(netid,"dhcphostname","GameShell") + self._Wireless.SetWirelessProperty(netid,"ip","None") + self._Wireless.SetWirelessProperty(netid,"dns_domain","None") + self._Wireless.SetWirelessProperty(netid,"gateway","None") + self._Wireless.SetWirelessProperty(netid,"use_global_dns",0) + self._Wireless.SetWirelessProperty(netid,"netmask","None") + self._Wireless.SetWirelessProperty(netid,"usedhcphostname",0) ## set 1 to use hostname above + self._Wireless.SetWirelessProperty(netid,"bitrate","auto") + self._Wireless.SetWirelessProperty(netid,"allow_lower_bitrates",0) + self._Wireless.SetWirelessProperty(netid,"dns3","None") + self._Wireless.SetWirelessProperty(netid,"dns2","None") + self._Wireless.SetWirelessProperty(netid,"dns1","None") + self._Wireless.SetWirelessProperty(netid,"use_settings_globally",0) + self._Wireless.SetWirelessProperty(netid,"use_static_dns",0) + self._Wireless.SetWirelessProperty(netid,"search_domain","None") + """ + self._Wireless.SetWirelessProperty(netid,"enctype","wpa-psk") + self._Wireless.SetWirelessProperty(netid,"apsk",password) + self._Wireless.SetWirelessProperty(netid,"automatic",1) + + self.ShowBox(MyLangManager.Tr("Connecting")) + + self._MyList[netid].Connect() + print("after Connect") + self.UpdateStatus() + + def GetWirelessEncrypt(self,network_id): + results = [] + activeID = -1 + for x,enc_type in enumerate(self._EncMethods): + if enc_type["type"] == self._Wireless.GetWirelessProperty(network_id,"enctype"): + activeID = x + break + + if activeID == -1: + return results + + for type_ in ['required','optional']: + fields = self._EncMethods[activeID][type_] + for field in fields: + try: + text = field[1].lower().replace(' ','_') + except KeyError: + text = field[1].replace(' ','_') + + value = self._Wireless.GetWirelessProperty(network_id, field[0]) + results.append({text:value}) + """ + [{'preshared_key': 'blah blah blah',},] + + or nothing + [{'identity': None,},{'password': None,},] + + """ + return results + + def AbortedAndReturnToUpLevel(self): + self.HideBox() + self._Screen._FootBar.ResetNavText() + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + def OnKbdReturnBackCb(self): + password_inputed = "".join(myvars.PasswordPage._Textarea._MyWords) + if is_wifi_connected_now() == False: + self.ConfigWireless(password_inputed) + else: + for i in range(0,10): + if is_wifi_connected_now() == True: + self.ShowBox(MyLangManager.Tr("Launching")) + self._Daemon.Disconnect() + self._Daemon.SetForcedDisconnect(True) + self._Connecting = False + else: + break + + pygame.time.delay(100) + + if is_wifi_connected_now() == False: + self.ConfigWireless(password_inputed) + else: + self.ShowBox(MyLangManager.Tr("Disconnect first")) + + def OnReturnBackCb(self): + pass + + + def KeyDown(self,event): + +# if self._BlockingUI == True: +# print("UI blocking ...") +# return + + if IsKeyMenuOrB(event.key): + if self._Wireless != None: + wireless_connecting = self._Wireless.CheckIfWirelessConnecting() + if wireless_connecting: + self.ShutDownConnecting() + self.ShowBox(MyLangManager.Tr("ShutDownConnecting")) + self._BlockingUI=True + self._BlockCb = self.AbortedAndReturnToUpLevel + else: + self.AbortedAndReturnToUpLevel() + else: + self.HideBox() + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Up"]: + self.ScrollUp() + self._Screen.Draw() + self._Screen.SwapAndShow() + if event.key == CurKeys["Down"]: + self.ScrollDown() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if IsKeyStartOrA(event.key): ## enter to set password,enter is B on GM + if len(self._MyList) == 0: + return + + self._CurBssid = self._MyList[self._PsIndex]._Bssid + + wicd_wirelss_encrypt_pwd = self.GetWirelessEncrypt(self._PsIndex) + if self._MyList[self._PsIndex]._IsActive: + self.ShowBox( self._Wireless.GetWirelessIP('') ) + else: + self._Screen.PushCurPage() + self._Screen.SetCurPage( myvars.PasswordPage ) + + thepass = "" + for i in wicd_wirelss_encrypt_pwd: + if "preshared_key" in i: + if i["preshared_key"] != None: + if len(str(i["preshared_key"])) > 0: + thepass = str(i["preshared_key"]) + break + + myvars.PasswordPage.SetPassword(thepass) + self._Screen.Draw() + self._Screen.SwapAndShow() + + """ + try: + self._Screen.Draw() + self._Screen.SwapAndShow() + except Exception as e: + print(e) + exit(-1) + """ + if event.key == CurKeys["X"]: + self.Rescan(False) + + if event.key == CurKeys["Y"]: + if len(self._MyList) == 0: + return + + self._InfoPage._NetworkId = self._PsIndex + self._InfoPage._Wireless = self._Wireless + self._InfoPage._Daemon = self._Daemon + + self._Screen.PushPage(self._InfoPage) + self._Screen.Draw() + self._Screen.SwapAndShow() + + + def Init(self): + + self._PosX = self._Index * self._Screen._Width + self._Width = self._Screen._Width + self._Height = self._Screen._Height + + #self._CanvasHWND = pygame.Surface((self._Width,self._Height)) + self._CanvasHWND = self._Screen._CanvasHWND + + ps = WifiListSelector() + ps._Parent = self + ps._Width = Width - 12 + + self._Ps = ps + self._PsIndex = 0 + + msgbox = WifiListMessageBox() + msgbox._CanvasHWND = self._CanvasHWND + msgbox.Init(" ",MyLangManager.TrFont("veramono12")) + msgbox._Parent = self + + self._MsgBox = msgbox + + self._EncMethods = misc.LoadEncryptionMethods() # load predefined templates from /etc/wicd/... + + """ + { + 'fields': [], + 'name': 'WPA 1/2 (Passphrase)', + 'optional': [], + 'protected': [ + ['apsk', 'Preshared_Key'], + ], + 'required': [ + ['apsk', 'Preshared_Key'], + ], + 'type': 'wpa-psk', + }, + """ + + self.UpdateNetList(force_check=True,firstrun=True) + + self._Scroller = ListScroller() + self._Scroller._Parent = self + self._Scroller._PosX = 2 + self._Scroller._PosY = 2 + self._Scroller.Init() + + + self._InfoPage = WifiInfoPage() + self._InfoPage._Screen = self._Screen + self._InfoPage._Name = MyLangManager.Tr("Wifi info") + self._InfoPage.Init() + + def Draw(self): + self.ClearCanvas() + + if len(self._MyList) == 0: + return + + self._Ps.Draw() + for i in self._MyList: + i.Draw() + + + self._Scroller.UpdateSize( len(self._MyList)*NetItem._Height, self._PsIndex*NetItem._Height) + self._Scroller.Draw() diff --git a/Menu/GameShell/10_Settings/__init__.py b/Menu/GameShell/10_Settings/__init__.py new file mode 100644 index 0000000..76b04b0 --- /dev/null +++ b/Menu/GameShell/10_Settings/__init__.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- + +import pygame +from pygame.locals import * +from sys import exit +import os +import sys + +from datetime import datetime + +import base64 +from beeprint import pp + + +## local UI import +import pages +import myvars + +def Init(main_screen): + pages.InitListPage(main_screen) + +def API(main_screen): + + if main_screen !=None: + main_screen.PushCurPage() + main_screen.SetCurPage(myvars.ListPage) + main_screen.Draw() + main_screen.SwapAndShow() + diff --git a/Menu/GameShell/10_Settings/list_item.py b/Menu/GameShell/10_Settings/list_item.py new file mode 100644 index 0000000..27c7fa6 --- /dev/null +++ b/Menu/GameShell/10_Settings/list_item.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- + +import pygame + + + +## local UI import +from UI.page import Page +from UI.label import Label +from UI.lang_manager import MyLangManager +from UI.skin_manager import MySkinManager + +# a item for List +# - - - - - - - - - - - -- +# | Icon Text..... > | +# ------------------------ + +import myvars # icons_path + + +class ListItem(object): + _PosX = 0 + _PosY = 0 + _Width = 0 + _Height = 30 + + _Labels = {} + _Icons = {} + _Fonts = {} + + _LinkObj = None + + def __init__(self): + self._Labels = {} + self._Icons = {} + self._Fonts = {} + + def Init(self,text): + + #self._Fonts["normal"] = fonts["veramono12"] + + l = Label() + l._PosX = 16 + l.SetCanvasHWND(self._Parent._CanvasHWND) + text = MyLangManager.Tr(text) + l.Init(text,self._Fonts["normal"]) + self._Labels["Text"] = l + + + def Draw(self): + + self._Labels["Text"]._PosY = self._PosY + (self._Height - self._Labels["Text"]._Height)/2 + self._Labels["Text"].Draw() + + pygame.draw.line(self._Parent._CanvasHWND,MySkinManager.GiveColor('Line'),(self._PosX,self._PosY+self._Height-1),(self._PosX+self._Width,self._PosY+self._Height-1),1) + + diff --git a/Menu/GameShell/10_Settings/list_page.py b/Menu/GameShell/10_Settings/list_page.py new file mode 100644 index 0000000..c386d48 --- /dev/null +++ b/Menu/GameShell/10_Settings/list_page.py @@ -0,0 +1,155 @@ +# -*- coding: utf-8 -*- + +import pygame +import sys + +from libs.roundrects import aa_round_rect + +## local UI import +from UI.constants import Width,Height +from UI.page import Page,PageSelector +from UI.label import Label +from UI.util_funcs import midRect,FileExists +from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB +from UI.scroller import ListScroller +from UI.skin_manager import MySkinManager +from UI.lang_manager import MyLangManager +from UI.info_page_selector import InfoPageSelector + +from list_item import ListItem + +import myvars + +class ListPage(Page): + + _Icons = {} + _Selector=None + + _FootMsg = ["Nav","","","Back","Enter"] + _MyList = [] + _ListFontObj = MyLangManager.TrFont("varela15") + + _Scroller = None + + def __init__(self): + Page.__init__(self) + self._Icons = {} + self._CanvasHWND = None + self._MyList = [] + + def Init(self): + self._PosX = self._Index * self._Screen._Width + self._Width = self._Screen._Width + self._Height = self._Screen._Height + + self._CanvasHWND = self._Screen._CanvasHWND + + ps = InfoPageSelector() + ps._Parent = self + ps._PosX = 2 + self._Ps = ps + self._PsIndex = 0 + + # "" pkgname, label + alist = [["","Airplane","Airplane Mode"], + ["","PowerOptions","Power Options"], + ["","Wifi","Wi-Fi"], + ["","Bluetooth","Bluetooth"], + ["","Sound","Sound Volume"], + ["","Brightness","BackLight Brightness"], + ["","Storage",""], + ["","Time","Timezone"], + ["","Languages","Languages"], + ["","Notification","Notification"], + ["","Update", "Update Launcher"], + ["","Cores", "Retroarch cores manager"], + ["","About", "About"], + ["","PowerOFF","Power OFF"], + ["","ButtonsLayout","Buttons Layout"], + #["","Skins","Theme Manager"], + #["","LauncherGo","Switch to LauncherGo"], + ["","Lima","GPU Driver Switch"], + ["","GateWay","Network Gateway Switch"]] + + start_x = 0 + start_y = 0 + + + sys.path.append(myvars.basepath)# add self as import path + for i,v in enumerate(alist): + li = ListItem() + li._Parent = self + li._PosX = start_x + li._PosY = start_y + i*ListItem._Height + li._Width = Width + li._Fonts["normal"] = self._ListFontObj + + if v[2] != "": + li.Init(v[2]) + else: + li.Init(v[1]) + + #if v[1] == "Wifi" or v[1] == "Sound" or v[1] == "Brightness" or v[1] == "Storage" or v[1] == "Update" or v[1] == "About" or v[1] == "PowerOFF" or v[1] == "HelloWorld": + if FileExists(myvars.basepath+"/"+ v[1]): + li._LinkObj = __import__(v[1]) + init_cb = getattr(li._LinkObj,"Init",None) + if init_cb != None: + if callable(init_cb): + li._LinkObj.Init(self._Screen) + + self._MyList.append(li) + + self._Scroller = ListScroller() + self._Scroller._Parent = self + self._Scroller._PosX = self._Width - 10 + self._Scroller._PosY = 2 + self._Scroller.Init() + + def Click(self): + cur_li = self._MyList[self._PsIndex] + if cur_li._LinkObj != None: + api_cb = getattr(cur_li._LinkObj,"API",None) + if api_cb != None: + if callable(api_cb): + cur_li._LinkObj.API(self._Screen) + + + def KeyDown(self,event): + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Up"]: + self.ScrollUp() + self._Screen.Draw() + self._Screen.SwapAndShow() + if event.key == CurKeys["Down"]: + self.ScrollDown() + self._Screen.Draw() + self._Screen.SwapAndShow() + + + if IsKeyStartOrA(event.key): + self.Click() + + def Draw(self): + self.ClearCanvas() + + if len(self._MyList) * ListItem._Height > self._Height: + self._Ps._Width = self._Width - 11 + + self._Ps.Draw() + + for i in self._MyList: + i.Draw() + + self._Scroller.UpdateSize( len(self._MyList)*ListItem._Height, self._PsIndex*ListItem._Height) + self._Scroller.Draw() + else: + self._Ps._Width = self._Width + self._Ps.Draw() + for i in self._MyList: + i.Draw() + + diff --git a/Menu/GameShell/10_Settings/myvars.py b/Menu/GameShell/10_Settings/myvars.py new file mode 100644 index 0000000..a16dc6e --- /dev/null +++ b/Menu/GameShell/10_Settings/myvars.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- + +from sys import exit +import os +import sys + + +basepath = os.path.dirname(os.path.realpath(__file__)) + +icons_path = basepath+"/icons" + +ListPage = None diff --git a/Menu/GameShell/10_Settings/pages.py b/Menu/GameShell/10_Settings/pages.py new file mode 100644 index 0000000..b459b32 --- /dev/null +++ b/Menu/GameShell/10_Settings/pages.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- + +from list_page import ListPage + +import myvars + +def InitListPage(main_screen): + + myvars.ListPage = ListPage() + + myvars.ListPage._Screen = main_screen + myvars.ListPage._Name = "Setting List" + myvars.ListPage.Init() diff --git a/Menu/GameShell/21_Warehouse/__init__.py b/Menu/GameShell/21_Warehouse/__init__.py new file mode 100644 index 0000000..0dc4d25 --- /dev/null +++ b/Menu/GameShell/21_Warehouse/__init__.py @@ -0,0 +1,1188 @@ +# -*- coding: utf-8 -*- +import os +import pygame +import platform +#import commands +import glob +import json +import gobject +import sqlite3 +#from beeprint import pp +from libs.roundrects import aa_round_rect +from shutil import copyfile,rmtree + +## local UI import +from UI.constants import Width,Height,ICON_TYPES,RESTARTUI +from UI.page import Page,PageSelector +from UI.label import Label +from UI.util_funcs import midRect,FileExists,ArmSystem +from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB +from UI.scroller import ListScroller +from UI.icon_pool import MyIconPool +from UI.icon_item import IconItem +from UI.multilabel import MultiLabel +from UI.skin_manager import MySkinManager +from UI.lang_manager import MyLangManager +from UI.info_page_list_item import InfoPageListItem +from UI.info_page_selector import InfoPageSelector +from UI.yes_cancel_confirm_page import YesCancelConfirmPage +from UI.keyboard import Keyboard + +from UI.download import Download + +import config + +class RPCStack: + def __init__(self): + self.stack = list() + + def Push(self,data): + if data not in self.stack: + self.stack.append(data) + return True + return False + + def Pop(self): + if len(self.stack)<=0: + return None,False + return self.stack.pop(),True + + def Last(self): + idx = len(self.stack) -1 + if idx < 0: + return None + else: + return self.stack[ idx ] + + def Length(self): + return len(self.stack) + +class LoadHousePage(Page): + _FootMsg = ["Nav.","","","Back","Cancel"] + _Value = 0 + _URL = None + _ListFontObj = MyLangManager.TrFont("varela18") + _URLColor = MySkinManager.GiveColor('URL') + _TextColor = MySkinManager.GiveColor('Text') + _Caller=None + _img = None + _Downloader=None + _DownloaderTimer=-1 + def __init__(self): + Page.__init__(self) + self._Icons = {} + self._CanvasHWND = None + + def Init(self): + self._PosX = self._Index * self._Screen._Width + self._Width = self._Screen._Width + self._Height = self._Screen._Height + + self._CanvasHWND = self._Screen._CanvasHWND + self._LoadingLabel = Label() + self._LoadingLabel.SetCanvasHWND(self._CanvasHWND) + self._LoadingLabel.Init("Loading",self._ListFontObj) + self._LoadingLabel.SetColor(self._TextColor ) + + def OnLoadCb(self): + if self._URL is None: + return + self._img = None + self.ClearCanvas() + self._Screen.Draw() + self._Screen.SwapAndShow() + + filename = self._URL.split("/")[-1].strip() + local_dir = self._URL.split("raw.githubusercontent.com") + + if len(local_dir) >1: + menu_file = local_dir[1] + local_menu_file = "%s/aria2download%s" % (os.path.expanduser('~'),menu_file ) + + if FileExists(local_menu_file): + #load json + with open(local_menu_file) as json_file: + try: + local_menu_json = json.load(json_file) + self._Caller._MyStack.Push(local_menu_json["list"]) + except: + pass + + self.Leave() + + else: + self._Downloader = Download(self._URL,"/tmp",None) + self._Downloader.start() + self._DownloaderTimer = gobject.timeout_add(400, self.GObjectUpdateProcessInterval) + + + def GObjectUpdateProcessInterval(self): + ret = True + if self._Screen.CurPage() == self: + if self._Downloader._stop == True: + ret = False + + dst_filename = self._Downloader.get_dest() + if self._Downloader.isFinished(): + if self._Downloader.isSuccessful(): + filename = self._URL.split("/")[-1].strip() + local_dir = self._URL.split("raw.githubusercontent.com") + menu_file = local_dir[1] + local_menu_file = "%s/aria2download%s" % (os.path.expanduser('~'),menu_file ) + + dl_file = os.path.join("/tmp",filename) + if not os.path.exists(os.path.dirname(local_menu_file)): + os.makedirs(os.path.dirname(local_menu_file)) + + copyfile(dl_file, local_menu_file) + with open(local_menu_file) as json_file: + try: + local_menu_json = json.load(json_file) + self._Caller._MyStack.Push(local_menu_json["list"]) + except: + pass + + ret = False + + self.Leave() + else: + self._Screen._MsgBox.SetText("Fetch house failed") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + ret = False + return ret + else: + return False + + def Leave(self): + if self._DownloaderTimer != -1: + gobject.source_remove(self._DownloaderTimer) + self._DownloaderTimer = -1 + + if self._Downloader != None: + try: + self._Downloader.stop() + except: + print("user canceled ") + + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + self._URL = None + + def KeyDown(self,event): + if IsKeyMenuOrB(event.key): + self.Leave() + + def Draw(self): + self.ClearCanvas() + self._LoadingLabel.NewCoord( (Width-self._LoadingLabel._Width)/2,(Height-44)/2) + self._LoadingLabel.Draw() + + if self._img is not None: + self._CanvasHWND.blit(self._img,midRect(Width/2, + (Height-44)/2, + pygame.Surface.get_width(self._img),pygame.Surface.get_height(self._img),Width,Height-44)) + + +class ImageDownloadProcessPage(Page): + _FootMsg = ["Nav.","","","Back",""] + _Value = 0 + _URL = None + _ListFontObj = MyLangManager.TrFont("varela13") + _URLColor = MySkinManager.GiveColor('URL') + _TextColor = MySkinManager.GiveColor('Text') + _img = None + _Downloader=None + _DownloaderTimer=-1 + def __init__(self): + Page.__init__(self) + self._Icons = {} + self._CanvasHWND = None + + def Init(self): + self._PosX = self._Index * self._Screen._Width + self._Width = self._Screen._Width + self._Height = self._Screen._Height + + self._CanvasHWND = self._Screen._CanvasHWND + self._LoadingLabel = Label() + self._LoadingLabel.SetCanvasHWND(self._CanvasHWND) + self._LoadingLabel.Init("Loading",self._ListFontObj) + self._LoadingLabel.SetColor(self._TextColor ) + + def OnLoadCb(self): + if self._URL is None: + return + self._img = None + self.ClearCanvas() + self._Screen.Draw() + self._Screen.SwapAndShow() + + filename = self._URL.split("/")[-1].strip() + local_dir = self._URL.split("raw.githubusercontent.com") + + if len(local_dir) >1: + menu_file = local_dir[1] + local_menu_file = "%s/aria2download%s" % (os.path.expanduser('~'),menu_file ) + + if FileExists(local_menu_file): + self._img = pygame.image.load(local_menu_file).convert_alpha() + self._Screen.Draw() + self._Screen.SwapAndShow() + else: + self._Downloader = Download(self._URL,"/tmp",None) + self._Downloader.start() + self._DownloaderTimer = gobject.timeout_add(300, self.GObjectUpdateProcessInterval) + + + def GObjectUpdateProcessInterval(self): + ret = True + if self._Screen.CurPage() == self: + if self._Downloader._stop == True: + ret = False + + dst_filename = self._Downloader.get_dest() + if self._Downloader.isFinished(): + if self._Downloader.isSuccessful(): + filename = self._URL.split("/")[-1].strip() + local_dir = self._URL.split("raw.githubusercontent.com") + menu_file = local_dir[1] + local_menu_file = "%s/aria2download%s" % (os.path.expanduser('~'),menu_file ) + + dl_file = os.path.join("/tmp",filename) + if not os.path.exists(os.path.dirname(local_menu_file)): + os.makedirs(os.path.dirname(local_menu_file)) + + copyfile(dl_file, local_menu_file) + ret = False + + #print("dest ",dst_filename) + if FileExists(dst_filename): + try: + #print("load and draw") + self._img = pygame.image.load(dst_filename).convert_alpha() + self._Screen.Draw() + self._Screen.SwapAndShow() + except Exception as ex: + print(ex) + + return ret + else: + return False + + + def KeyDown(self,event): + if IsKeyMenuOrB(event.key): + gobject.source_remove(self._DownloaderTimer) + self._DownloaderTimer = -1 + + if self._Downloader != None: + try: + self._Downloader.stop() + except: + print("user canceled ") + + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + self._URL = None + + def Draw(self): + self.ClearCanvas() + self._LoadingLabel.NewCoord( (Width-self._LoadingLabel._Width)/2,(Height-44)/2) + self._LoadingLabel.Draw() + + if self._img is not None: + self._CanvasHWND.blit(self._img,midRect(Width/2, + (Height-44)/2, + pygame.Surface.get_width(self._img),pygame.Surface.get_height(self._img),Width,Height-44)) + + +class Aria2DownloadProcessPage(Page): + _FootMsg = ["Nav.","","Pause","Back","Cancel"] + _DownloaderTimer = -1 + _Value = 0 + _GID = None + + _PngSize = {} + + _FileNameLabel = None + _SizeLabel = None + + _URLColor = MySkinManager.GiveColor('URL') + _TextColor = MySkinManager.GiveColor('Text') + + def __init__(self): + Page.__init__(self) + self._Icons = {} + self._CanvasHWND = None + + def Init(self): + self._PosX = self._Index * self._Screen._Width + self._Width = self._Screen._Width + self._Height = self._Screen._Height + + self._CanvasHWND = self._Screen._CanvasHWND + + bgpng = IconItem() + bgpng._ImgSurf = MyIconPool.GiveIconSurface("rom_download") + bgpng._MyType = ICON_TYPES["STAT"] + bgpng._Parent = self + bgpng.Adjust(0,0,self._PngSize["bg"][0],self._PngSize["bg"][1],0) + self._Icons["bg"] = bgpng + + + self._FileNameLabel = Label() + self._FileNameLabel.SetCanvasHWND(self._CanvasHWND) + self._FileNameLabel.Init("", MyLangManager.TrFont("varela12")) + + self._SizeLabel = Label() + self._SizeLabel.SetCanvasHWND(self._CanvasHWND) + self._SizeLabel.Init("0/0Kb",MyLangManager.TrFont("varela12")) + self._SizeLabel.SetColor( self._URLColor ) + + @property + def GObjectUpdateProcessInterval(self): + downloaded = 0 + if self._Screen.CurPage() == self and self._GID is not None: + self._Value = config.RPC.tellStatus(self._GID) + + downloaded = 0 + total = 0 + + if self._Value["status"] == "waiting": + self._FileNameLabel.SetText("waiting to download...") + if self._Value["status"] == "paused": + self._FileNameLabel.SetText("download paused...") + if self._Value["status"] == "error": + self._FileNameLabel.SetText("download errors,cancel it please") + + if self._Value["status"] == "active": + downloaded = self._Value["completedLength"] + total = self._Value["totalLength"] + + downloaded = downloaded / 1000.0 / 1000.0 + total = total / 1000.0 / 1000.0 + + self._SizeLabel.SetText("%.2f" % downloaded+"/"+"%.2f" % total+"Mb") + + print("Progress: %d%%" % (self._Value)) + self._Screen.Draw() + self._Screen.SwapAndShow() + return True + + + def CheckDownload(self,aria2_gid): + self._GID = aria2_gid + self._DownloaderTimer = gobject.timeout_add(234, self.GObjectUpdateProcessInterval) + + def KeyDown(self,event): + if IsKeyMenuOrB(event.key): + gobject.source_remove(self._DownloaderTimer) + self._DownloaderTimer = -1 + + #if self._Downloader != None: + # try: + # self._Downloader.stop() + # except: + # print("user canceled ") + + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + def Draw(self): + self.ClearCanvas() + + self._Icons["bg"].NewCoord(self._Width/2,self._Height/2-20) + self._Icons["bg"].Draw() + + percent = self._Value + if percent < 10: + percent = 10 + + + rect_ = midRect(self._Width/2,self._Height/2+33,170,17, Width,Height) + aa_round_rect(self._CanvasHWND,rect_,MySkinManager.GiveColor('TitleBg'),5,0,MySkinManager.GiveColor('TitleBg')) + + rect2 = midRect(self._Width/2,self._Height/2+33,int(170*(percent/100.0)),17, Width,Height) + rect2.left = rect_.left + rect2.top = rect_.top + aa_round_rect(self._CanvasHWND,rect2,MySkinManager.GiveColor('Front'),5,0,MySkinManager.GiveColor('Front')) + + rect3 = midRect(self._Width/2,self._Height/2+53,self._FileNameLabel._Width, self._FileNameLabel._Height,Width,Height) + + rect4 = midRect(self._Width/2,self._Height/2+70,self._SizeLabel._Width, self._SizeLabel._Height,Width,Height) + + self._FileNameLabel.NewCoord(rect3.left,rect3.top) + self._SizeLabel.NewCoord(rect4.left, rect4.top) + + self._FileNameLabel.Draw() + self._SizeLabel.Draw() + + +def dict_factory(cursor, row): + d = {} + for idx, col in enumerate(cursor.description): + d[col[0]] = row[idx] + return d + +class GameStoreListItem(InfoPageListItem): + _Type = None #source,dir,launcher,pico8 + _CanvasHWND = None + def Init(self,text): + + #self._Fonts["normal"] = fonts["veramono12"] + + l = Label() + l._PosX = 10 + l.SetCanvasHWND(self._Parent._CanvasHWND) + + l.Init(text,self._Fonts["normal"]) + self._Labels["Text"] = l + + add_icon = IconItem() + add_icon._ImgSurf = MyIconPool.GiveIconSurface("add") + add_icon._CanvasHWND = self._CanvasHWND + add_icon._Parent = self + add_icon.Init(0,0,MyIconPool.Width("add"),MyIconPool.Height("add"),0) + + ware_icon = IconItem() + ware_icon._ImgSurf = MyIconPool.GiveIconSurface("ware") + ware_icon._CanvasHWND = self._CanvasHWND + ware_icon._Parent = self + ware_icon.Init(0,0,MyIconPool.Width("ware"),MyIconPool.Height("ware"),0) + + app_icon = IconItem() + app_icon._ImgSurf = MyIconPool.GiveIconSurface("app") + app_icon._CanvasHWND = self._CanvasHWND + app_icon._Parent = self + app_icon.Init(0,0,MyIconPool.Width("app"),MyIconPool.Height("app"),0) + + appdling_icon = IconItem() + appdling_icon._ImgSurf = MyIconPool.GiveIconSurface("appdling") + appdling_icon._CanvasHWND = self._CanvasHWND + appdling_icon._Parent = self + appdling_icon.Init(0,0,MyIconPool.Width("appdling"),MyIconPool.Height("appdling"),0) + + blackheart_icon = IconItem() + blackheart_icon._ImgSurf = MyIconPool.GiveIconSurface("blackheart") + blackheart_icon._Width = MyIconPool.Width("blackheart") + blackheart_icon._Height = MyIconPool.Height("blackheart") + blackheart_icon._CanvasHWND = self._CanvasHWND + blackheart_icon._Parent = self + + self._Icons["add"] = add_icon + self._Icons["ware"] = ware_icon + self._Icons["app"] = app_icon + self._Icons["appdling"] = appdling_icon + self._Icons["blackheart"] = blackheart_icon + + + def Draw(self): + if self._ReadOnly == True: + self._Labels["Text"].SetColor(MySkinManager.GiveColor("ReadOnlyText")) + else: + self._Labels["Text"].SetColor(MySkinManager.GiveColor("Text")) + + padding = 17 + + if self._Type == None: + padding = 0 + + + if self._Type == "source" or self._Type == "dir": + self._Icons["ware"].NewCoord( 4, (self._Height - self._Icons["ware"]._Height)/2 ) + self._Icons["ware"].DrawTopLeft() + + if self._Type == "launcher" or self._Type == "pico8" or self._Type == "tic80": + _icon = "app" + if self._ReadOnly == True: + _icon = "appdling" + + self._Icons[_icon].NewCoord( 4, (self._Height - self._Icons[_icon]._Height)/2) + self._Icons[_icon].DrawTopLeft() + + if self._Type == "add_house": + self._Icons["add"].NewCoord( 4, (self._Height - self._Icons["add"]._Height)/2) + self._Icons["add"].DrawTopLeft() + + + self._Labels["Text"]._PosX = self._Labels["Text"]._PosX + self._PosX + padding + self._Labels["Text"]._PosY = self._PosY + (self._Height - self._Labels["Text"]._Height)/2 + self._Labels["Text"].Draw() + self._Labels["Text"]._PosX = self._Labels["Text"]._PosX - self._PosX - padding + + if "Small" in self._Labels: + self._Labels["Small"]._PosX = self._Width - self._Labels["Small"]._Width-5 + + self._Labels["Small"]._PosY = self._PosY + (self._Height - self._Labels["Small"]._Height)/2 + self._Labels["Small"].Draw() + + + pygame.draw.line(self._Parent._CanvasHWND,MySkinManager.GiveColor('Line'),(self._PosX,self._PosY+self._Height-1),(self._PosX+self._Width,self._PosY+self._Height-1),1) + + +class GameStorePage(Page): + _FootMsg = ["Nav","Update","Up","Back","Select"] + _MyList = [] + _ListFont12 = MyLangManager.TrFont("notosanscjk12") + _ListFont15 = MyLangManager.TrFont("varela15") + + _AList = {} + + _Scrolled = 0 + + _BGwidth = 320 + _BGheight = 240-24-20 + + _DrawOnce = False + _Scroller = None + _InfoPage = None + _Downloading = None + _aria2_db = "aria2tasks.db" + _warehouse_db = "warehouse.db" + _GobjTimer = -1 + + _Scrolled_cnt = 0 + + def __init__(self): + Page.__init__(self) + self._Icons = {} + self._MyStack = RPCStack() + #title file type + ## Two level url , only github.com + + repos = [ + {"title":"github.com/clockworkpi/warehouse","file":"https://raw.githubusercontent.com/clockworkpi/warehouse/master/index.json","type":"source"} + ] + self._MyStack.Push(repos) + + def GObjectUpdateProcessInterval(self): + ret = True + dirty = False + for x in self._MyList: + if x._Type == "launcher" or x._Type == "pico8" or x._Type == "tic80": + percent = config.RPC.getPercent(x._Value["file"]) + if percent is not None: + x.SetSmallText(str(percent)+"%") + dirty = True + else: + x.SetSmallText("") + + if self._Screen.CurPage() == self and dirty == True: + self._Screen.Draw() + self._Screen.SwapAndShow() + + return ret + + def SyncWarehouse(self): + try: + conn = sqlite3.connect(self._warehouse_db) + conn.row_factory = dict_factory + c = conn.cursor() + ret = c.execute("SELECT * FROM warehouse").fetchall() + conn.close() + return ret + except Exception as ex: + print(ex) + return None + return None + + def SyncTasks(self): + try: + conn = sqlite3.connect(self._aria2_db) + conn.row_factory = dict_factory + c = conn.cursor() + ret = c.execute("SELECT * FROM tasks").fetchall() + conn.close() + return ret + except Exception as ex: + print(ex) + return None + return None + + def SyncList(self): + + self._MyList = [] + + start_x = 0 + start_y = 0 + last_height = 0 + + repos = [] + stk = self._MyStack.Last() + stk_lev = self._MyStack.Length() + repos.extend(stk) + add_new_house = [ + {"title":"Add new warehouse...","file":"master/index.json","type":"add_house","status":"complete"} + ] + + if stk_lev == 1: # on top + ware_menu= self.SyncWarehouse() + if ware_menu != None and len(ware_menu) > 0: + #print(ware_menu) + repos.extend(ware_menu ) + + tasks_menu= self.SyncTasks() + if tasks_menu != None and len(tasks_menu) > 0: + #print(tasks_menu) + repos.extend(tasks_menu ) + + #print(repos) + repos.extend(add_new_house) + + for i,u in enumerate( repos ): + #print(i,u) + li = GameStoreListItem() + li._CanvasHWND = self._CanvasHWND + li._Parent = self + li._PosX = start_x + li._PosY = start_y + last_height + li._Width = Width + li._Fonts["normal"] = self._ListFont15 + li._Fonts["small"] = self._ListFont12 + li._Active = False + li._ReadOnly = True + li._Value = u + li._Type = u["type"] + li.Init( u["title"] ) + + if stk_lev >1: + remote_file_url = u["file"] + menu_file = remote_file_url.split("raw.githubusercontent.com")[1] + local_menu_file = "%s/aria2download%s" % (os.path.expanduser('~'),menu_file ) + + if FileExists(local_menu_file): + li._ReadOnly = False + else: + li._ReadOnly = True + elif stk_lev == 1: + if "status" in u: + if u["status"] == "complete": + li._ReadOnly = False + + if u["type"]=="source": + li._ReadOnly = False + + last_height += li._Height + + if li._Type == "launcher" or li._Type == "pico8" or li._Type == "tic80": + li.SetSmallText("") + + self._MyList.append(li) + + self.RefreshPsIndex() + + + def Init(self): + if self._Screen != None: + if self._Screen._CanvasHWND != None and self._CanvasHWND == None: + self._HWND = self._Screen._CanvasHWND + self._CanvasHWND = pygame.Surface( (self._Screen._Width,self._BGheight) ) + + self._PosX = self._Index*self._Screen._Width + self._Width = self._Screen._Width ## equal to screen width + self._Height = self._Screen._Height + + done = IconItem() + done._ImgSurf = MyIconPool.GiveIconSurface("done") + done._MyType = ICON_TYPES["STAT"] + done._Parent = self + self._Icons["done"] = done + + ps = InfoPageSelector() + ps._Parent = self + self._Ps = ps + self._PsIndex = 0 + + self.SyncList() + + self._Scroller = ListScroller() + self._Scroller._Parent = self + self._Scroller._PosX = self._Width - 10 + self._Scroller._PosY = 2 + self._Scroller.Init() + self._Scroller.SetCanvasHWND(self._CanvasHWND) + + self._remove_page = YesCancelConfirmPage() + self._remove_page._Screen = self._Screen + self._remove_page._StartOrA_Event = self.RemoveGame + + self._remove_page._Name ="Are you sure?" + self._remove_page.Init() + + self._Keyboard = Keyboard() + self._Keyboard._Name = "Enter warehouse addr" + self._Keyboard._FootMsg = ["Nav.","Add","ABC","Backspace","Enter"] + self._Keyboard._Screen = self._Screen + self._Keyboard.Init() + self._Keyboard.SetPassword("github.com/clockworkpi/warehouse") + self._Keyboard._Caller = self + + self._PreviewPage = ImageDownloadProcessPage() + self._PreviewPage._Screen = self._Screen + self._PreviewPage._Name = "Preview" + self._PreviewPage.Init() + + self._LoadHousePage = LoadHousePage() + self._LoadHousePage._Screen = self._Screen + self._LoadHousePage._Name = "Warehouse" + self._LoadHousePage._Caller = self + self._LoadHousePage.Init() + + + def ResetHouse(self): + if self._PsIndex > len(self._MyList) -1: + return + cur_li = self._MyList[self._PsIndex] + if cur_li._Value["type"] == "source": + remote_file_url = cur_li._Value["file"] + menu_file = remote_file_url.split("raw.githubusercontent.com")[1] #assume master branch + local_menu_file = "%s/aria2download%s" % (os.path.expanduser('~'),menu_file ) + local_menu_file_path = os.path.dirname(local_menu_file) + print(local_menu_file_path) + local_jsons = glob.glob(local_menu_file_path+"/**/*.json") + try: + if os.path.exists(local_menu_file): + os.remove(local_menu_file) + if os.path.exists(local_menu_file+".aria2"): + os.remove(local_menu_file+".aria2") + + for x in local_jsons: + os.remove(x) + + except Exception as ex: + print(ex) + + self._Screen._MsgBox.SetText("Done") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + + def LoadHouse(self): + if self._PsIndex > len(self._MyList) -1: + return + cur_li = self._MyList[self._PsIndex] + if cur_li._Value["type"] == "source" or cur_li._Value["type"] == "dir": + + self._LoadHousePage._URL = cur_li._Value["file"] + self._Screen.PushPage(self._LoadHousePage) + self._Screen.Draw() + self._Screen.SwapAndShow() + + + def PreviewGame(self): + if self._PsIndex > len(self._MyList) -1: + return + cur_li = self._MyList[self._PsIndex] + if cur_li._Value["type"] == "launcher" or cur_li._Value["type"] == "pico8" or cur_li._Value["type"] == "tic80": + if "shots" in cur_li._Value: + print(cur_li._Value["shots"]) + self._PreviewPage._URL = cur_li._Value["shots"] + self._Screen.PushPage(self._PreviewPage) + self._Screen.Draw() + self._Screen.SwapAndShow() + + + def RemoveGame(self): + if self._PsIndex > len(self._MyList) -1: + return + + cur_li = self._MyList[self._PsIndex] + #if cur_li._Active == True: + # return + print("Remove cur_li._Value",cur_li._Value) + + if cur_li._Value["type"] == "source": + print("remove a source") + try: + conn = sqlite3.connect(self._warehouse_db) + conn.row_factory = dict_factory + c = conn.cursor() + c.execute("DELETE FROM warehouse WHERE file = '%s'" % cur_li._Value["file"] ) + conn.commit() + conn.close() + except Exception as ex: + print(ex) + elif cur_li._Value["type"] == "launcher" or cur_li._Value["type"] == "pico8" or cur_li._Value["type"] == "tic80": + remote_file_url = cur_li._Value["file"] + menu_file = remote_file_url.split("raw.githubusercontent.com")[1] + local_menu_file = "%s/aria2download%s" % (os.path.expanduser('~'),menu_file ) + local_menu_file_path = os.path.dirname(local_menu_file) + + gid,ret = config.RPC.urlDownloading(remote_file_url) + if ret == True: + config.RPC.remove(gid) + + try: + if os.path.exists(local_menu_file): + os.remove(local_menu_file) + if os.path.exists(local_menu_file+".aria2"): + os.remove(local_menu_file+".aria2") + if os.path.exists( os.path.join(local_menu_file_path,cur_li._Value["title"])): + rmtree(os.path.join(local_menu_file_path,cur_li._Value["title"]) ) + + except Exception as ex: + print(ex) + + def Click(self): + if self._PsIndex > len(self._MyList) -1: + return + + cur_li = self._MyList[self._PsIndex] + #if cur_li._Active == True: + # return + + print("cur_li._Value",cur_li._Value) + + if cur_li._Value["type"] == "source" or cur_li._Value["type"] == "dir": + remote_file_url = cur_li._Value["file"] + menu_file = remote_file_url.split("raw.githubusercontent.com")[1] #assume master branch + local_menu_file = "%s/aria2download%s" % (os.path.expanduser('~'),menu_file ) + print(local_menu_file) + if FileExists( local_menu_file ) == False: + self.LoadHouse() + else: + #read the local_menu_file, push into stack,display menu + self._Downloading = None + try: + with open(local_menu_file) as json_file: + local_menu_json = json.load(json_file) + print(local_menu_json) + self._MyStack.Push(local_menu_json["list"]) + + self.SyncList() + self._Screen.Draw() + self._Screen.SwapAndShow() + except Exception as ex: + print(ex) + self._Screen._MsgBox.SetText("Open house failed ") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + + elif cur_li._Value["type"] == "add_house": + print("show keyboard to add ware house") + self._Screen.PushCurPage() + self._Screen.SetCurPage( self._Keyboard ) + else: + #download the game probably + remote_file_url = cur_li._Value["file"] + menu_file = remote_file_url.split("raw.githubusercontent.com")[1] + local_menu_file = "%s/aria2download%s" % (os.path.expanduser('~'),menu_file ) + + if FileExists( local_menu_file ) == False: + gid,ret = config.RPC.urlDownloading(remote_file_url) + if ret == False: + gid = config.RPC.addUri( remote_file_url, options={"out": menu_file}) + self._Downloading = gid + print("stack length ",self._MyStack.Length()) + """ + if self._MyStack.Length() > 1:## not on the top list page + try: + conn = sqlite3.connect(self._aria2_db) + c = conn.cursor() + c.execute("INSERT INTO tasks(gid,title,file,type,status,fav) VALUES ('"+gid+"','"+cur_li._Value["title"]+"','"+cur_li._Value["file"]+"','"+cur_li._Value["type"]+"','active','0')") + + conn.commit() + conn.close() + except Exception as ex: + print("SQLITE3 ",ex) + """ + else: + print(config.RPC.tellStatus(gid,["status","totalLength","completedLength"])) + + self._Screen._MsgBox.SetText("Getting the game now") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + + pygame.time.delay(800) + self._Screen._TitleBar.Redraw() + + else: + print("file downloaded")# maybe check it if is installed,then execute it + if cur_li._Value["type"]=="launcher" and cur_li._ReadOnly == False: + local_menu_file_path = os.path.dirname(local_menu_file) + game_sh = os.path.join( local_menu_file_path, cur_li._Value["title"],cur_li._Value["title"]+".sh") + #game_sh = reconstruct_broken_string( game_sh) + print("run game: ",game_sh, os.path.exists( game_sh)) + self._Screen.RunEXE(game_sh) + + if cur_li._Value["type"]=="pico8" and cur_li._ReadOnly == False: + if os.path.exists("/home/cpi/games/PICO-8/pico-8/pico8") == True: + game_sh = "/home/cpi/launcher/Menu/GameShell/50_PICO-8/PICO-8.sh" + self._Screen.RunEXE(game_sh) + else: + self._Screen._MsgBox.SetText("Purchase pico8") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + pygame.time.delay(800) + + if cur_li._Value["type"]=="tic80" and cur_li._ReadOnly == False: + game_sh = "/home/cpi/apps/Menu/51_TIC-80/TIC-80.sh" + self._Screen.RunEXE(game_sh) + + def OnAria2CompleteCb(self,gid): + print("OnAria2CompleteCb ", gid) + self.SyncList() + self._Screen.Draw() + self._Screen.SwapAndShow() + + def raw_github_com(self,_url):#eg: github.com/clockworkpi/warehouse + if _url.startswith("github.com")== False: + return False + parts = _url.split("/") + if len(parts) != 3: + return False + return "/".join(["https://raw.githubusercontent.com",parts[1],parts[2],"master/index.json"]) + + def OnKbdReturnBackCb(self): + inputed = "".join(self._Keyboard._Textarea._MyWords).strip() + inputed = inputed.replace("http://","") + inputed = inputed.replace("https://","") + + if inputed.endswith(".git"): + inputed = inputed[:len(inputed)-4] + if inputed.endswith("/"): + inputed = inputed[:len(inputed)-1] + + print("last: ",inputed) + try: + conn = sqlite3.connect(self._warehouse_db) + conn.row_factory = dict_factory + c = conn.cursor() + ret = c.execute("SELECT * FROM warehouse WHERE title='%s'" % inputed ).fetchone() + if ret != None: + self._Screen._MsgBox.SetText("Warehouse existed!") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + else: + if "github.com/clockworkpi/warehouse" in inputed: + self._Screen._MsgBox.SetText("Warehouse existed!") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + else: + valid_url= self.raw_github_com(inputed) + + if valid_url == False: + self._Screen._MsgBox.SetText("Warehouse url error!") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + else: + sql_insert = """ INSERT INTO warehouse(title,file,type) VALUES( + '%s', + '%s', + 'source');""" % (inputed,valid_url) + + c.execute(sql_insert) + conn.commit() + self.SyncList() + self._Screen.Draw() + self._Screen.SwapAndShow() + conn.close() + except Exception as ex: + print(ex) + + def OnLoadCb(self): + self._Scrolled = 0 + self._PosY = 0 + self._DrawOnce = False + #sync + print("OnLoadCb") + if self._MyStack.Length() == 1: + self._FootMsg[2] = "Remove" + self._FootMsg[1] = "Update" + else: + self._FootMsg[2] = "Remove" + self._FootMsg[1] = "Preview" + + self._GobjTimer = gobject.timeout_add(500, self.GObjectUpdateProcessInterval) + + self.SyncList() + + def OnReturnBackCb(self): + if self._MyStack.Length() == 1: + self._FootMsg[2] = "Remove" + self._FootMsg[1] = "Update" + else: + self._FootMsg[2] = "Remove" + self._FootMsg[1] = "Preview" + + self.SyncList() + self.RestoreScrolled() + + self._Screen.Draw() + self._Screen.SwapAndShow() + + """ + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + """ + + def ScrollDown(self): + if len(self._MyList) == 0: + return + self._PsIndex += 1 + if self._PsIndex >= len(self._MyList): + self._PsIndex = len(self._MyList)-1 + + cur_li = self._MyList[self._PsIndex] + if cur_li._PosY+cur_li._Height > self._Height: + for i in range(0, len(self._MyList)): + self._MyList[i]._PosY -= self._MyList[i]._Height + + self._Scrolled_cnt -= self._MyList[i]._Height + + def ScrollUp(self): + if len(self._MyList) == 0: + return + self._PsIndex -= 1 + if self._PsIndex < 0: + self._PsIndex = 0 + cur_li = self._MyList[self._PsIndex] + if cur_li._PosY < 0: + for i in range(0, len(self._MyList)): + self._MyList[i]._PosY += self._MyList[i]._Height + + self._Scrolled_cnt += self._MyList[i]._Height + + def KeyDown(self,event): + if IsKeyMenuOrB(event.key): + + if self._MyStack.Length() > 1: + self._MyStack.Pop() + if self._MyStack.Length() == 1: + self._FootMsg[2] = "Remove" + self._FootMsg[1] = "Update" + else: + self._FootMsg[2] = "Remove" + self._FootMsg[1] = "Preview" + if self._MyStack.Length() == 2: + self._FootMsg[2] = "" + self._FootMsg[1] = "" + + self.SyncList() + self._Screen.Draw() + self._Screen.SwapAndShow() + + elif self._MyStack.Length() == 1: + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + gobject.source_remove(self._GobjTimer) + + if IsKeyStartOrA(event.key): + self.Click() + + if self._MyStack.Length() == 1: + self._FootMsg[2] = "Remove" + self._FootMsg[1] = "Update" + else: + self._FootMsg[2] = "Remove" + self._FootMsg[1] = "Preview" + if self._MyStack.Length() == 2: + self._FootMsg[2] = "" + self._FootMsg[1] = "" + + + self._Screen.Draw() + self._Screen.SwapAndShow() + + + if event.key == CurKeys["X"]: + #print(self._MyStack.Length() ) + if self._PsIndex <= len(self._MyList) -1: + cur_li = self._MyList[self._PsIndex] + if cur_li._Type != "dir": + if self._MyStack.Length() == 1 and self._PsIndex == 0: + pass + #predefined source + else: + self._Screen.PushPage(self._remove_page) + self._remove_page._StartOrA_Event = self.RemoveGame + self._Screen.Draw() + self._Screen.SwapAndShow() + return + + self.SyncList() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Y"]: + if self._MyStack.Length() == 1: + self.ResetHouse() + else: + self.PreviewGame() + + if event.key == CurKeys["Up"]: + self.ScrollUp() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Down"]: + self.ScrollDown() + self._Screen.Draw() + self._Screen.SwapAndShow() + + def RestoreScrolled(self): + for i in range(0, len(self._MyList)): + self._MyList[i]._PosY += self._Scrolled_cnt + + def Draw(self): + + self.ClearCanvas() + if len(self._MyList) == 0: + return + + else: + if len(self._MyList) * self._MyList[0]._Height > self._Height: + self._Ps._Width = self._Width - 11 + self._Ps.Draw() + for i in self._MyList: + if i._PosY > self._Height + self._Height/2: + break + if i._PosY < 0: + continue + i.Draw() + self._Scroller.UpdateSize( len(self._MyList)*self._MyList[0]._Height, self._PsIndex*self._MyList[0]._Height) + self._Scroller.Draw() + + else: + self._Ps._Width = self._Width + self._Ps.Draw() + for i in self._MyList: + if i._PosY > self._Height + self._Height/2: + break + if i._PosY < 0: + continue + i.Draw() + + if self._HWND != None: + self._HWND.fill(MySkinManager.GiveColor("White")) + + self._HWND.blit(self._CanvasHWND,(self._PosX,self._PosY,self._Width, self._Height ) ) + +class APIOBJ(object): + + _Page = None + def __init__(self): + pass + def Init(self,main_screen): + self._Page = GameStorePage() + self._Page._Screen = main_screen + self._Page._Name ="Warehouse" + self._Page.Init() + + def API(self,main_screen): + if main_screen !=None: + main_screen.PushPage(self._Page) + main_screen.Draw() + main_screen.SwapAndShow() + +OBJ = APIOBJ() +def Init(main_screen): + OBJ.Init(main_screen) +def API(main_screen): + OBJ.API(main_screen) + diff --git a/Menu/GameShell/30_RetroArch.sh b/Menu/GameShell/30_RetroArch.sh new file mode 100755 index 0000000..44f0c2a --- /dev/null +++ b/Menu/GameShell/30_RetroArch.sh @@ -0,0 +1 @@ +retroarch diff --git a/Menu/GameShell/31_CaveStory.sh b/Menu/GameShell/31_CaveStory.sh new file mode 100755 index 0000000..aed9656 --- /dev/null +++ b/Menu/GameShell/31_CaveStory.sh @@ -0,0 +1 @@ +retroarch -L /home/cpi/apps/emulators/nxengine_libretro.so /home/cpi/games/nxengine/cavestory/data diff --git a/Menu/GameShell/32_ChocoDM/action.config b/Menu/GameShell/32_ChocoDM/action.config new file mode 100644 index 0000000..706a84f --- /dev/null +++ b/Menu/GameShell/32_ChocoDM/action.config @@ -0,0 +1,6 @@ +ROM=/home/cpi/games/ChocoDM +ROM_SO= +EXT=wad +LAUNCHER=chocolate-doom -iwad +TITLE=ChocoDM +SO_URL= diff --git a/Menu/GameShell/50_PICO-8/PICO-8.sh b/Menu/GameShell/50_PICO-8/PICO-8.sh new file mode 100755 index 0000000..54cc66f --- /dev/null +++ b/Menu/GameShell/50_PICO-8/PICO-8.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +#SDL_VIDEODRIVER=x11 DISPLAY=:0 ./pico-8/pico8_dyn -splore -draw_rect 32,0,256,240 +cd /home/cpi/games/PICO-8/pico-8 +SDL_VIDEODRIVER=x11 DISPLAY=:0 ./pico8_dyn -splore -draw_rect 32,0,256,240 diff --git a/Menu/GameShell/50_PICO-8/Post-Up.sh b/Menu/GameShell/50_PICO-8/Post-Up.sh new file mode 100755 index 0000000..e8c38e0 --- /dev/null +++ b/Menu/GameShell/50_PICO-8/Post-Up.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +mkdir ~/.lexaloffle + +cp -rf pico-8 ~/.lexaloffle + +mkdir ~/.lexaloffle/pico-8/carts + +ln -s ~/.lexaloffle/pico-8/carts/ ~/games/PICO-8/carts + +touch .done + diff --git a/Menu/GameShell/50_PICO-8/compkginfo.json b/Menu/GameShell/50_PICO-8/compkginfo.json new file mode 100644 index 0000000..50ee2ac --- /dev/null +++ b/Menu/GameShell/50_PICO-8/compkginfo.json @@ -0,0 +1,8 @@ +{ +"GameDir":"/home/cpi/games/PICO-8/", +"InstallDir":"pico-8", +"NotFoundMsg":["Please purchase the PICO-8 \n|None|varela16", +"and copy it to the \"~/games/PICO-8\"|None|varela16"], +"MD5":{"pico-8_0.1.11g_raspi.zip":"a3f2995cf117499f880bd964d6a0e1f2","pico-8_0.1.11g_amd64.zip":"6726141c784afd4a41be6b7414c1b932","pico-8_0.1.12_raspi.zip":"08eda95570e63089a2b9f5531503431e","pico-8_0.1.12c_raspi.zip":"1a62b0d7d4e4be65f89f23ec9757cb66","pico-8_0.1.12c2_raspi.zip":"7a878795472fa39304e9a10128c1f712","pico-8.zip":"whatever it takes"}, +"Post-Up":"bash Post-Up.sh" +} diff --git a/Menu/GameShell/50_PICO-8/pico-8/config.txt b/Menu/GameShell/50_PICO-8/pico-8/config.txt new file mode 100644 index 0000000..3bd6672 --- /dev/null +++ b/Menu/GameShell/50_PICO-8/pico-8/config.txt @@ -0,0 +1,99 @@ +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - +// Configuration for pico-8 +// +// config.txt is read on startup and saved on exit. +// To generate the default config.txt, delete this file. +// +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +// :: Video Settings + +window_size 0 0 // window width, height +screen_size 0 0 // screen width, height (stretched to window) +show_fps 0 // Draw frames per second in the corner + + +// :: Window Settings + +windowed 0 // 1 to start up in windowed mode +window_position -1 -1 // x and y position of window, or -1, -1 to let the window manager decide +frameless 0 // 1 to use a window with no frame +fullscreen_method 0 // 0 maximized window (linux) 1 borderless desktop-sized window 2 fullscreen + + +// :: System Settings + +foreground_sleep_ms 1 // number of milliseconds to sleep each frame. Try 10 to conserve battery power + +background_sleep_ms 20 // number of milliseconds to sleep each frame when running in the background + +sessions 4 // number of times program has been run + +// (scancode) hold this key down and left-click to simulate right-click +rmb_key 0 // 0 for none 226 for LALT + +// 0:off 1: ignore SDL_TEXTINPUT and use SDL_GetKeyboardState instead (mapped to a US layout) +emulate_textinput 1 + +// Desktop for saving screenshots etc. Defaults to $HOME/Desktop +desktop_path + + + +// :: Audio Settings + +sound_volume 256 // 0..256 +music_volume 256 // 0..256 +mix_buffer_size 1024 // usually 1024. Try 2048 if you get choppy sound + + +// :: + +version 0.1.11g + + +// Location of pico-8's root folder +root_path /home/cpi/.lexaloffle/pico-8/carts/ + + +// Location of cartridge save data +cdata_path /home/cpi/.lexaloffle/pico-8/cdata/ + + +// Specify which player index joystick control begins at (0..7) +joystick_index 0 + + +// Custom keyboard scancodes for buttons. player0 0..6, player1 0..5 +button_keys 0 0 0 0 13 14 0 0 0 0 0 0 0 + +// Play notes as they are plotted in frequency mode +live_notes 0 + +// iff 1: when using keyboard cursor, snap to closest pixel / map cel +cursor_snap 0 + +// maximum length of gif in seconds (1..120, default 8) +gif_len 8 + +// 0 classic 1 dark blue background in code editor +gui_theme 0 + +// scale of screenshots and gifs // 2 means 256x256 +screenshot_scale 3 +gif_scale 2 + +// when 1 can enter glyphs using shift-A..Z +shift_glyphs 1 + +// 0 for off. 1 to notify whenever unsaved changes are backed up +show_backup_messages 1 + +// 0 for off. 1 to allow control of a cart's framerate due to host machine's cpu capacity (recommended) +host_framerate_control 1 + +// filter splore content +// 0 for no filter (18+) 1 medium (13+) 2 maximum (kid-friendly) +content_filter 1 + diff --git a/Menu/GameShell/50_PICO-8/pico-8/log.txt b/Menu/GameShell/50_PICO-8/pico-8/log.txt new file mode 100644 index 0000000..3f783a2 --- /dev/null +++ b/Menu/GameShell/50_PICO-8/pico-8/log.txt @@ -0,0 +1,90 @@ +codo_init + platform: Linux + Found config.txt + + 01 window_size 0 0 // window width, height + 02 screen_size 0 0 // screen width, height (stretched to window) + 03 show_fps 0 // Draw frames per second in the corner + 04 windowed 0 // 1 to start up in windowed mode + 05 window_position -1 -1 // x and y position of window, or -1, -1 to let the window manager decide + new window position: -1, -1 + 06 frameless 0 // 1 to use a window with no frame + 07 fullscreen_method 1 // 0 maximized window (linux) 1 borderless desktop-sized window 2 fullscreen + 08 foreground_sleep_ms 1 // number of milliseconds to sleep each frame. Try 10 to conserve battery power + 09 background_sleep_ms 20 // number of milliseconds to sleep each frame when running in the background + 10 sessions 3 // number of times program has been run + 11 rmb_key 0 // 0 for none 226 for LALT + 12 emulate_textinput 1 + 13 desktop_path + 14 sound_volume 256 // 0..256 + 15 music_volume 256 // 0..256 + 16 mix_buffer_size 1024 // usually 1024. Try 2048 if you get choppy sound + 17 version 0.1.11g + 18 root_path /home/cpi/.lexaloffle/pico-8/carts/ + 19 cdata_path /home/cpi/.lexaloffle/pico-8/cdata/ + 20 joystick_index 0 + 21 button_keys 0 0 0 0 0 0 0 0 0 0 0 0 0 + 22 live_notes 0 + 23 cursor_snap 0 + 24 gif_len 8 + 25 gui_theme 0 + 26 screenshot_scale 3 + 27 gif_scale 2 + 28 shift_glyphs 1 + 29 show_backup_messages 1 + 30 host_framerate_control 1 + 31 content_filter 1 + + codo_system_init + Compiled against SDL version: 2.0.7 + Linked against SDL version: 2.0.5 + Built-in video drivers: 0 x11 1 wayland 2 dummy + Current video driver: x11 + Built-in render drivers: + Renderer opengl: + Flags: 0x0000000E ( | | ) + Texture formats (1): ARGB8888 + Renderer opengles2: + Flags: 0x0000000E ( | | ) + Texture formats (4): ARGB8888, ABGR8888, RGB888, BGR888 + Renderer software: + Flags: 0x00000009 ( | ) + Texture formats (8): ARGB8888, ABGR8888, RGBA8888, BGRA8888, RGB888, BGR888, RGB565, RGB555 + codo_reset_timer + codo_gui_init + codo_keys_init + codo_text_init + codo_video_init + codo_mouse_init + codo_joystick_init + Reading controller mappings: /home/cpi/.lexaloffle/pico-8/sdl_controllers.txt + searching for joysticks + found 0 joysticks + ok +ok +codo_load_pod: /home/cpi/apps/Menu/50_PICO-8/pico8.dat ok +codo_set_screen 128 128 8 100 + set pixel_perfect 1 + window size: 640 480 +codo_plat_pi: forcing fullscreen mode +Current renderer: + Renderer opengl: + Flags: 0x0000000A ( | ) + Texture formats (5): ARGB8888, YV12, IYUV, 0x3231564e, 0x3132564e + Max Texture Size: 8192x8192 +codo_sound_init mix_buffer_size: 1024 +codo_sound_init +SDL_INIT_AUDIO ok +SDL_OpenAudio ok +Built-in audio drivers: 0 pulseaudio 1 alsa 2 sndio 3 dsp 4 disk 5 dummy +Current audio driver: alsa +codo_exit + cmusic_stop + codo_main_exit + codo_config_save + codo_sound_exit + codo_video_exit + codo_joystick_exit + codo_system_exit + codo_items_created: 1023 +ok diff --git a/Menu/GameShell/50_PICO-8/pico-8/sdl_controllers.txt b/Menu/GameShell/50_PICO-8/pico-8/sdl_controllers.txt new file mode 100644 index 0000000..d6719d7 --- /dev/null +++ b/Menu/GameShell/50_PICO-8/pico-8/sdl_controllers.txt @@ -0,0 +1 @@ +// add SDL2 game controller mappings to this file diff --git a/Menu/GameShell/90_Reload UI.sh b/Menu/GameShell/90_Reload UI.sh new file mode 100755 index 0000000..8c3cbfc --- /dev/null +++ b/Menu/GameShell/90_Reload UI.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +exit 0 diff --git a/Menu/GameShell/97_Music Player/__init__.py b/Menu/GameShell/97_Music Player/__init__.py new file mode 100644 index 0000000..86c5bfe --- /dev/null +++ b/Menu/GameShell/97_Music Player/__init__.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- + +import pygame + +## local UI import +import pages +import myvars + +def Init(main_screen): + pages.InitPoller() + + pages.InitListPage(main_screen) + pages.InitMusicLibPage(main_screen) + pages.InitSpectrumPage(main_screen) + +def API(main_screen): + + if main_screen !=None: + main_screen.PushCurPage() + main_screen.SetCurPage(myvars.PlayListPage) + main_screen.Draw() + main_screen.SwapAndShow() + + diff --git a/Menu/GameShell/97_Music Player/list_item.py b/Menu/GameShell/97_Music Player/list_item.py new file mode 100644 index 0000000..23ba788 --- /dev/null +++ b/Menu/GameShell/97_Music Player/list_item.py @@ -0,0 +1,134 @@ +# -*- coding: utf-8 -*- + +import pygame +from libs.roundrects import aa_round_rect + +## local UI import +from UI.constants import ICON_TYPES +from UI.page import Page +from UI.label import Label +from UI.icon_item import IconItem +from UI.util_funcs import midRect +from UI.skin_manager import MySkinManager + +# a item for List +# - - - - - - - - - - - -- +# | Icon Text..... > | +# ------------------------ + +import myvars # icons_path + +class ListItemIcon(IconItem): + + _CanvasHWND = None + _Parent = None + _Width = 18 + _Height = 18 + + def Draw(self): + self._CanvasHWND.blit(self._ImgSurf,(self._PosX,self._PosY+(self._Parent._Height-self._Height)/2,self._Width,self._Height)) + + +class ListItemLabel(Label): + + _ActiveColor = MySkinManager.GiveColor('Active') + _Active = False + def Draw(self): + + self._FontObj.set_bold(self._Active) + + """ + if self._Active == True: + my_text = self._FontObj.render( self._Text,True,self._ActiveColor) + else: + my_text = self._FontObj.render( self._Text,True,self._Color) + """ + + my_text = self._FontObj.render( self._Text,True,self._Color) + self._CanvasHWND.blit(my_text,(self._PosX,self._PosY,self._Width,self._Height)) + + +class ListItem(object): + _PosX = 0 + _PosY = 0 + _Width = 0 + _Height = 30 + + _Labels = {} + _Icons = {} + _Fonts = {} + _MyType = ICON_TYPES["EXE"] + _LinkObj = None + _Path = "" + _Active = False + _Playing = False ## play or pause + _PlayingProcess = 0 # 0 - 100 + _Parent = None + + _Text = "" + def __init__(self): + self._Labels = {} + self._Icons = {} + self._Fonts = {} + + + def Init(self,text): + + #self._Fonts["normal"] = fonts["veramono12"] + self._Text = text + + l = ListItemLabel() + l._PosX = 22 + l.SetCanvasHWND(self._Parent._CanvasHWND) + + if self._MyType == ICON_TYPES["DIR"]: + l.Init(text,self._Fonts["normal"]) + self._Path = text + else: + l.Init(text,self._Fonts["normal"]) + self._Path = text + + + self._Labels["Text"] = l + + + def NewCoord(self,x,y): + self._PosX = x + self._PosY = y + + def Draw(self): + + if self._MyType == ICON_TYPES["DIR"] and self._Path != "[..]": + self._Parent._Icons["sys"]._IconIndex = 0 + self._Parent._Icons["sys"].NewCoord(self._PosX+12,self._PosY+ (self._Height - self._Parent._Icons["sys"]._Height)/2+self._Parent._Icons["sys"]._Height/2) + self._Parent._Icons["sys"].Draw() + + if self._MyType == ICON_TYPES["FILE"]: + self._Parent._Icons["sys"]._IconIndex = 1 + self._Parent._Icons["sys"].NewCoord(self._PosX+12,self._PosY+ (self._Height - self._Parent._Icons["sys"]._Height)/2+self._Parent._Icons["sys"]._Height/2) + self._Parent._Icons["sys"].Draw() + + if self._Active == True: + self._Labels["Text"]._Active = True + else: + self._Labels["Text"]._Active = False + + + self._Labels["Text"]._PosY = self._PosY + (self._Height - self._Labels["Text"]._Height)/2 + + pygame.draw.line(self._Parent._CanvasHWND,MySkinManager.GiveColor('Line'),(self._PosX,self._PosY+self._Height-1),(self._PosX+self._Width,self._PosY+self._Height-1),1) + + if self._Playing == True: + self._Labels["Text"]._Active =True + self._Labels["Text"].Draw() + #_rect = midRect(10,self._PosY+15,10,10,self._Parent._Width,self._Parent._Height) + #aa_round_rect(self._Parent._CanvasHWND,_rect,(0,0,0),3,0,(0,0,0)) + #pygame.draw.polygon(self._Parent._CanvasHWND, (0,0,0), [[6, self._PosY+7], [11, self._PosY+14],[6, self._PosY+21]], 2) + + if self._PlayingProcess > 0: + seek_posx = int(self._Width * self._PlayingProcess/100.0) + pygame.draw.line(self._Parent._CanvasHWND,MySkinManager.GiveColor('Active'),(self._PosX,self._PosY+self._Height-2),(self._PosX+seek_posx,self._PosY+self._Height-2),2) + + else: + self._Labels["Text"].Draw() + diff --git a/Menu/GameShell/97_Music Player/mpd_spectrum_page.py b/Menu/GameShell/97_Music Player/mpd_spectrum_page.py new file mode 100644 index 0000000..92bf899 --- /dev/null +++ b/Menu/GameShell/97_Music Player/mpd_spectrum_page.py @@ -0,0 +1,420 @@ +# -*- coding: utf-8 -*- + +import os +import time +import pygame + +import numpy +import math + +import gobject + +from beeprint import pp + +## local UI import +from UI.constants import Width,Height,ICON_TYPES +from UI.page import Page,PageSelector +from UI.label import Label +from UI.util_funcs import midRect +from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB +from UI.icon_item import IconItem +from UI.icon_pool import MyIconPool +from UI.skin_manager import MySkinManager +from UI.lang_manager import MyLangManager + +from threading import Thread + +from list_item import ListItem + +import myvars + +class PIFI(object): + _MPD_FIFO = "/tmp/mpd.fifo" + _SAMPLE_SIZE = 1024 + _SAMPLING_RATE = 44100 + _FIRST_SELECTED_BIN = 5 + _NUMBER_OF_SELECTED_BINS = 1024 + + _samples_buffer = None + + def __init__(self): + self.sampleSize = self._SAMPLE_SIZE + self.samplingRate = self._SAMPLING_RATE + + def GetSpectrum(self,fifoFile,trim_by=4,log_scale=False,div_by=100): + try: + rawSamples = os.read(fifoFile,self.sampleSize) # will return empty lines (non-blocking) + if len(rawSamples) < 1: +# print("Read error") + pass + else: + self._samples_buffer = rawSamples + except Exception,e: + pass + + if self._samples_buffer == None: + return "" + + data = numpy.fromstring(self._samples_buffer, dtype=numpy.int16) + + data = data * numpy.hanning(len(data)) + + left,right = numpy.split(numpy.abs(numpy.fft.fft(data)),2) + spec_y = numpy.add(left,right[::-1]) + + if log_scale: + spec_y=numpy.multiply(20,numpy.log10(spec_y)) + if trim_by: + i=int((self.sampleSize/2)/trim_by) + spec_y=spec_y[:i] + if div_by: + spec_y=spec_y/float(div_by) + + return spec_y + + +class MPDSpectrumPage(Page): + + _Icons = {} + _Selector=None + _FootMsg = ["Nav","","","Back",""] + _MyList = [] + _ListFont = MyLangManager.TrFont("veramono12") + _SongFont = MyLangManager.TrFont("notosanscjk12") + _PIFI = None + _FIFO = None + _Color = MySkinManager.GiveColor('Front') + _GobjectIntervalId = -1 + _Queue = None + _KeepReading = True + _ReadingThread = None + + _BGpng = None + _BGwidth = 320 + _BGheight = 200 + + _SheepHead = None + _SheepHeadW = 69 + _SheepHeadH = 66 + + _SheepBody = None + _SheepBodyW = 105 + _SheepBodyH = 81 + + _RollCanvas = None + _RollW = 180 + _RollH = 18 + + _freq_count = 0 + _head_dir = 0 + + _Neighbor = None + + + _bby = [] + _bbs = [] + _capYPositionArray = [] + _frames = 0 + read_retry = 0 + _queue_data = [] + _vis_values = [] + + def __init__(self): + Page.__init__(self) + self._Icons = {} + self._CanvasHWND = None + self._MyList = [] + self._PIFI = PIFI() + + def Init(self): + self._PosX = self._Index * self._Screen._Width + self._Width = self._Screen._Width + self._Height = self._Screen._Height + + self._CanvasHWND = self._Screen._CanvasHWND + self._RollCanvas = pygame.Surface(( self._RollW,self._RollH)) + + """ + self._BGpng = IconItem() + self._BGpng._ImgSurf = MyIconPool.GiveIconSurface("sheep_bg") + self._BGpng._MyType = ICON_TYPES["STAT"] + self._BGpng._Parent = self + self._BGpng.Adjust(0,0,self._BGwidth,self._BGheight,0) + + self._SheepHead = IconItem() + self._SheepHead._ImgSurf = MyIconPool.GiveIconSurface("sheep_head") + self._SheepHead._MyType = ICON_TYPES["STAT"] + self._SheepHead._Parent = self + self._SheepHead.Adjust(0,0,self._SheepHeadW,self._SheepHeadH,0) + + self._SheepBody = IconItem() + self._SheepBody._ImgSurf = MyIconPool.GiveIconSurface("sheep_body") + self._SheepBody._MyType = ICON_TYPES["STAT"] + self._SheepBody._Parent = self + self._SheepBody.Adjust(0,0,self._SheepBodyW,self._SheepBodyH,0) + """ + + self._cwp_png = IconItem() + self._cwp_png._ImgSurf = MyIconPool.GiveIconSurface("tape") + self._cwp_png._MyType = ICON_TYPES["STAT"] + self._cwp_png._Parent = self + self._cwp_png.Adjust(0,0,79,79,0) + + + self._song_title = Label() + self._song_title.SetCanvasHWND(self._RollCanvas) + self._song_title.Init("Untitled",self._SongFont,MySkinManager.GiveColor('White')) + + + self._title = Label() + self._title.SetCanvasHWND(self._CanvasHWND) + self._title.Init("Title:",self._ListFont,MySkinManager.GiveColor('White')) + + self._time = Label() + self._time.SetCanvasHWND(self._CanvasHWND) + self._time.Init("Time:",self._ListFont,MySkinManager.GiveColor('White')) + + + self._time2 = Label() + self._time2.SetCanvasHWND(self._CanvasHWND) + self._time2.Init("00:00-00:00", self._ListFont, + MySkinManager.GiveColor('White')) + + + self.Start() + + def Start(self): + + if self._Screen.CurPage() != self: + return + + try: + self._FIFO = os.open(self._PIFI._MPD_FIFO, os.O_RDONLY | os.O_NONBLOCK) + + t = Thread(target=self.GetSpectrum) + t.daemon = True # thread dies with the program + t.start() + self._ReadingThread = t + + except IOError: + print("open %s failed"%self._PIFI._MPD_FIFO) + self._FIFO = None + return + + + def GetSpectrum(self): + while self._KeepReading and self._FIFO != None: + raw_samples = self._PIFI.GetSpectrum(self._FIFO) + if len(raw_samples) < 1: + #print("sleeping... 0.01") + time.sleep(0.01) + self.read_retry+=1 + if self.read_retry > 20: + os.close(self._FIFO) + self._FIFO = os.open(self._PIFI._MPD_FIFO, os.O_RDONLY | os.O_NONBLOCK) + self.read_retry = 0 + + self.Playing() + + else: + self.read_retry = 0 + self._queue_data = raw_samples + self.Playing() + + + def Playing(self): + + self._Screen.Draw() + self._Screen.SwapAndShow() + + + def ClearCanvas(self): + self._CanvasHWND.fill(MySkinManager.GiveColor('Black')) + + def SgsSmooth(self): + passes = 1 + points = 3 + origs = self._bby[:] + for p in range(0,passes): + pivot = int(points/2.0) + + for i in range(0,pivot): + self._bby[i] = origs[i] + self._bby[ len(origs) -i -1 ] = origs[ len(origs) -i -1 ] + + smooth_constant = 1.0/(2.0*pivot+1.0) + for i in range(pivot, len(origs)-pivot): + _sum = 0.0 + for j in range(0,(2*pivot)+1): + _sum += (smooth_constant * origs[i+j-pivot]) +j -pivot + + self._bby[i] = _sum + + if p < (passes - 1): + origs = self._bby[:] + + def OnLoadCb(self): + if self._Neighbor != None: + pass + + if self._KeepReading == False: + self._KeepReading = True + + if self._FIFO == None: + self.Start() + + + def KeyDown(self,event): + if IsKeyMenuOrB(event.key): + try: + os.close(self._FIFO) + self._FIFO = None + + except Exception, e: + print(e) + + self._KeepReading = False + self._ReadingThread.join() + self._ReadingThread = None + + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + + def Draw(self): + self.ClearCanvas() + self._frames+=1 + + bw = 10 + gap = 2 + margin_bottom = 72 + + spects = None + meterNum = self._Width / float(bw +gap ) ## 320/12= 26 + meter_left = meterNum - int(meterNum) + meter_left = meter_left*int(bw+gap) + margin_left = meter_left / 2 + gap + meterNum = int(meterNum) + + self._cwp_png.NewCoord(43,159) + self._cwp_png.Draw() + + if self._Neighbor != None: + if self._Neighbor._CurSongName != "": + self._song_title.SetText(self._Neighbor._CurSongName) + if self._Neighbor._CurSongTime != "": + times = self._Neighbor._CurSongTime + times_ = times.split(":") + if len(times_)> 1: + cur = int(times_[0]) + end = int(times_[1]) + if cur > 3600: + cur_text = time.strftime('%H:%M:%S', time.gmtime(cur)) + else: + cur_text = time.strftime('%M:%S', time.gmtime(cur)) + + if end > 3600: + end_text = time.strftime('%H:%M:%S', time.gmtime(end)) + else: + end_text = time.strftime('%M:%S', time.gmtime(end)) + else: + cur_text = "" + end_text = times + + self._time2.SetText(cur_text+"-"+end_text) + + + self._title.NewCoord(90,167) + self._title.Draw() + + self._time.NewCoord(90,140) + self._time.Draw() + + self._time2.NewCoord(135,140) + self._time2.Draw() + + if self._RollCanvas != None: +# self._RollCanvas.fill((111,22,33)) + self._RollCanvas.fill(MySkinManager.GiveColor('Black')) + if self._song_title._Width > self._RollW: + if (self._song_title._PosX + self._song_title._Width) > self._RollW and self._frames % 30 == 0: + self._song_title._PosX -= 1 + elif (self._song_title._PosX + self._song_title._Width) <= self._RollW and self._frames % 30 == 0: + self._song_title._PosX = 0 + else: + self._song_title._PosX = 0 + + self._song_title.Draw() + + self._CanvasHWND.blit(self._RollCanvas,(135,165,self._RollW,self._RollH)) + + + try: + spects = self._queue_data + if len(spects) == 0: + return +# print("spects:",spects) + + step = int( round( len( spects ) / meterNum) ) +# print(len(spects)) + self._bbs = [] + a = numpy.logspace(0, 1, num=meterNum,endpoint=True) + + for i in range(0,meterNum): + index = int(a[i] * step) + total = 0 + + value = spects[index] + self._bbs.append(value) + + if len(self._bby) < len(self._bbs): + self._bby = self._bbs + elif len(self._bby) == len(self._bbs): + for i in range(0,len(self._bbs)): + self._bby[i] = (self._bby[i]+self._bbs[i])/2 + + self.SgsSmooth() + + for i in range(0,meterNum): + value = self._bby[ i ] + if math.isnan(value) or math.isinf(value): + value = 0 + + value = value/32768.0 + value = value * 123 + value = value % (self._Height-gap-margin_bottom) + + if len(self._vis_values) < len(self._bby): + self._vis_values.append(value) + elif len(self._vis_values) == len(self._bby): + if self._vis_values[i] < value: + self._vis_values[i] = value + + + except Exception,e: + print(e) + return + else: # got line + if len(self._vis_values) == 0: + return + + for i in range(0,meterNum): + value = self._vis_values[i] + + if len(self._capYPositionArray) < round(meterNum): + self._capYPositionArray.append(value) + + if value < self._capYPositionArray[i]: + self._capYPositionArray[i]-=0.5 + else: + self._capYPositionArray[i] = value + + pygame.draw.rect(self._CanvasHWND,MySkinManager.GiveColor('White'),(i*(bw+gap)+margin_left,self._Height-gap-self._capYPositionArray[i]-margin_bottom,bw,gap),0) + + pygame.draw.rect(self._CanvasHWND,MySkinManager.GiveColor('White'),(i*(bw+gap)+margin_left,self._Height-value-gap-margin_bottom,bw,value+gap),0) + + self._vis_values[i] -= 2 + + + diff --git a/Menu/GameShell/97_Music Player/music_lib_list_page.py b/Menu/GameShell/97_Music Player/music_lib_list_page.py new file mode 100644 index 0000000..9202710 --- /dev/null +++ b/Menu/GameShell/97_Music Player/music_lib_list_page.py @@ -0,0 +1,328 @@ +# -*- coding: utf-8 -*- +import os +import pygame + +from libs.roundrects import aa_round_rect + +## local UI import +from UI.constants import Width,Height,ICON_TYPES +from UI.page import Page,PageSelector +from UI.label import Label +from UI.icon_item import IconItem +from UI.util_funcs import midRect +from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB +from UI.multi_icon_item import MultiIconItem +from UI.icon_pool import MyIconPool +from UI.scroller import ListScroller +from UI.skin_manager import MySkinManager +from UI.lang_manager import MyLangManager + +from list_item import ListItem + + +import myvars + + +class MusicLibStack: + def __init__(self): + self.stack = list() + + def Push(self,data): + if data not in self.stack: + self.stack.append(data) + return True + return False + + def Pop(self): + if len(self.stack)<=0: + return None,False + return self.stack.pop(),True + + def Last(self): + idx = len(self.stack) -1 + if idx < 0: + return "/" + else: + return self.stack[ idx ] + + def Length(self): + return len(self.stack) + +class ListPageSelector(PageSelector): + _BackgroundColor = MySkinManager.GiveColor('Front') + + def __init__(self): + self._PosX = 0 + self._PosY = 0 + self._Height = 0 + self._Width = Width + + def AnimateDraw(self,x2,y2): + pass + + def Draw(self): + idx = self._Parent._PsIndex + + if idx < len(self._Parent._MyList): + x = self._Parent._MyList[idx]._PosX+2 + y = self._Parent._MyList[idx]._PosY+1 + h = self._Parent._MyList[idx]._Height -3 + + self._PosX = x + self._PosY = y + self._Height = h + + aa_round_rect(self._Parent._CanvasHWND, + (x,y,self._Width-4,h),self._BackgroundColor,4,0,self._BackgroundColor) + + + +class MusicLibListPage(Page): + + _Icons = {} + _Selector=None + _FootMsg = ["Nav","","Scan","Back","Add to Playlist"] + _MyList = [] + _SwapMyList = [] + _ListFont = MyLangManager.TrFont("notosanscjk15") + _MyStack = None + + _Scroller = None + + _BGpng = None + _BGwidth = 56 + _BGheight = 70 + + def __init__(self): + Page.__init__(self) + self._Icons = {} + self._CanvasHWND = None + self._MyList = [] + self._SwapMyList = [] + self._MyStack = MusicLibStack() + + def SyncList(self,path): + if myvars.Poller == None: + return + + alist = myvars.Poller.listfiles(path) + if alist == False: + print("listfiles return false") + return + + self._MyList = [] + self._SwapMyList = [] + + start_x = 0 + start_y = 0 + hasparent = 0 + if self._MyStack.Length() > 0: + hasparent = 1 + li = ListItem() + li._Parent = self + li._PosX = start_x + li._PosY = start_y + li._Width = Width + li._Fonts["normal"] = self._ListFont + li._MyType = ICON_TYPES["DIR"] + li._Parent = self + li.Init("[..]") + self._MyList.append(li) + + for i,v in enumerate(sorted(alist)): + li = ListItem() + li._Parent = self + li._PosX = start_x + li._PosY = start_y + (i+hasparent)*ListItem._Height + li._Width = Width + li._Fonts["normal"] = self._ListFont + li._MyType = ICON_TYPES["FILE"] + li._Parent = self + + if "directory" in v: + li._MyType = ICON_TYPES["DIR"] + dir_base_name = os.path.basename(v["directory"]) + li.Init( dir_base_name ) + li._Path = v["directory"] + elif "file" in v: + bname = os.path.basename(v["file"]) + li.Init( bname ) + li._Path = v["file"] + + else: + li.Init("NoName") + + self._MyList.append(li) + + for i in self._MyList: + self._SwapMyList.append(i) + + def Init(self): + self._PosX = self._Index * self._Screen._Width + self._Width = self._Screen._Width + self._Height = self._Screen._Height + + self._CanvasHWND = self._Screen._CanvasHWND + + ps = ListPageSelector() + ps._Parent = self + self._Ps = ps + self._PsIndex = 0 + + self.SyncList("/") + + icon_for_list = MultiIconItem() + icon_for_list._ImgSurf = MyIconPool.GiveIconSurface("sys") + icon_for_list._MyType = ICON_TYPES["STAT"] + icon_for_list._Parent = self + + icon_for_list.Adjust(0,0,18,18,0) + self._Icons["sys"] = icon_for_list + + + self._BGpng = IconItem() + self._BGpng._ImgSurf = MyIconPool.GiveIconSurface("empty") + self._BGpng._MyType = ICON_TYPES["STAT"] + self._BGpng._Parent = self + self._BGpng.AddLabel(MyLangManager.Tr("Please upload data over Wi-Fi"), MyLangManager.TrFont("varela22")) + self._BGpng.SetLableColor(MySkinManager.GiveColor('Disabled')) + self._BGpng.Adjust(0,0,self._BGwidth,self._BGheight,0) + + + self._Scroller = ListScroller() + self._Scroller._Parent = self + self._Scroller._PosX = self._Width - 10 + self._Scroller._PosY = 2 + self._Scroller.Init() + + def Click(self): + self.RefreshPsIndex() + if len(self._MyList) == 0: + return + + cur_li = self._MyList[self._PsIndex] + + if cur_li._MyType == ICON_TYPES["DIR"]: + if cur_li._Path == "[..]": + self._MyStack.Pop() + self.SyncList( self._MyStack.Last() ) + self._PsIndex = 0 + else: + self._MyStack.Push( self._MyList[self._PsIndex]._Path ) + self.SyncList( self._MyStack.Last() ) + self._PsIndex = 0 + + if cur_li._MyType == ICON_TYPES["FILE"]: ## add to playlist only + myvars.Poller.addfile(cur_li._Path) + myvars.PlayListPage.SyncList() + print("add" , cur_li._Path) + + self._Screen.Draw() + self._Screen.SwapAndShow() + + def Rescan(self): + self.SyncList("/") + self._PsIndex = 0 + + def KeyDown(self,event): + + if IsKeyMenuOrB(event.key) or event.key == CurKeys["Left"]: + + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Up"]: + self.ScrollUp() + self._Screen.Draw() + self._Screen.SwapAndShow() + if event.key == CurKeys["Down"]: + self.ScrollDown() + self._Screen.Draw() + self._Screen.SwapAndShow() + + """ + if event.key == CurKeys["Right"]: + self.FScrollDown(Step=5) + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Left"]: + self.FScrollUp(Step=5) + self._Screen.Draw() + self._Screen.SwapAndShow() + """ + + if event.key == CurKeys["X"]: + self.Rescan() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if IsKeyStartOrA(event.key): + self.Click() + + def Draw(self): + self.ClearCanvas() + + + """ + start_x = 0 + start_y = 0 + counter = 0 + + self._MyList = [] + + for i,v in enumerate(self._SwapMyList): + if myvars.PlayListPage.InPlayList(v._Path): + v._Active = True + else: + v._Active = False + + if v._Active == False: + v.NewCoord(start_x, start_y+counter* ListItem._Height) + counter+=1 + self._MyList.append(v) + """ + + if len(self._MyList) == 0: + self._BGpng.NewCoord(self._Width/2,self._Height/2) + self._BGpng.Draw() + return + + else: + if len(self._MyList) * ListItem._Height > self._Height: + self._Ps._Width = self._Width - 11 + + self._Ps.Draw() + for i in self._MyList: + if myvars.PlayListPage.InPlayList(i._Path): + i._Active = True + else: + i._Active = False + + if i._PosY > self._Height + self._Height/2: + break + + if i._PosY < 0: + continue + + i.Draw() + + self._Scroller.UpdateSize( len(self._MyList)*ListItem._Height, self._PsIndex*ListItem._Height) + self._Scroller.Draw() + else: + self._Ps._Width = self._Width + self._Ps.Draw() + for i in self._MyList: + if myvars.PlayListPage.InPlayList(i._Path): + i._Active = True + else: + i._Active = False + + if i._PosY > self._Height + self._Height/2: + break + + if i._PosY < 0: + continue + + i.Draw() diff --git a/Menu/GameShell/97_Music Player/myvars.py b/Menu/GameShell/97_Music Player/myvars.py new file mode 100644 index 0000000..d327570 --- /dev/null +++ b/Menu/GameShell/97_Music Player/myvars.py @@ -0,0 +1,8 @@ + + +Poller = None # MPD Poller +PlayListPage = None +MusicLibListPage = None + +SpectrumPage = None + diff --git a/Menu/GameShell/97_Music Player/pages.py b/Menu/GameShell/97_Music Player/pages.py new file mode 100644 index 0000000..b9b042f --- /dev/null +++ b/Menu/GameShell/97_Music Player/pages.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- + +from libs.MPD import poller + +from play_list_page import PlayListPage +from music_lib_list_page import MusicLibListPage +from mpd_spectrum_page import MPDSpectrumPage +import myvars + +from config import MPD_socket + +def InitPoller(): + try: + myvars.Poller = poller.MPDPoller(host=MPD_socket) + myvars.Poller.connect() + except: + myvars.Poller = None + + +def InitMusicLibPage(main_screen): + myvars.MusicLibListPage = MusicLibListPage() + myvars.MusicLibListPage._Screen = main_screen + myvars.MusicLibListPage._Name = "Music Library" + myvars.MusicLibListPage.Init() + +def InitListPage(main_screen): + + myvars.PlayListPage = PlayListPage() + + myvars.PlayListPage._Screen = main_screen + myvars.PlayListPage._Name = "Play List" + myvars.PlayListPage.Init() + +def InitSpectrumPage(main_screen): + myvars.SpectrumPage = MPDSpectrumPage() + myvars.SpectrumPage._Screen = main_screen + myvars.SpectrumPage._Name = "GameShell RTA" + myvars.SpectrumPage.Init() diff --git a/Menu/GameShell/97_Music Player/play_list_page.py b/Menu/GameShell/97_Music Player/play_list_page.py new file mode 100644 index 0000000..52710a9 --- /dev/null +++ b/Menu/GameShell/97_Music Player/play_list_page.py @@ -0,0 +1,328 @@ +# -*- coding: utf-8 -*- +import os +import pygame +import gobject + +from libs.roundrects import aa_round_rect + +## local UI import +from UI.constants import Width,Height,ICON_TYPES +from UI.page import Page,PageSelector +from UI.icon_item import IconItem +from UI.label import Label +from UI.util_funcs import midRect +from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB +from UI.icon_pool import MyIconPool +from UI.skin_manager import MySkinManager +from UI.lang_manager import MyLangManager + +from UI.scroller import ListScroller + +from list_item import ListItem + +import myvars + +class ListPageSelector(PageSelector): + _BackgroundColor = MySkinManager.GiveColor('Front') + + def __init__(self): + self._PosX = 0 + self._PosY = 0 + self._Height = 0 + self._Width = Width + + def AnimateDraw(self,x2,y2): + pass + + def Draw(self): + idx = self._Parent._PsIndex + if idx > (len(self._Parent._MyList)-1): + idx = len(self._Parent._MyList) + if idx > 0: + idx -=1 + elif idx == 0: #Nothing + return + + x = self._Parent._MyList[idx]._PosX+2 + y = self._Parent._MyList[idx]._PosY+1 + h = self._Parent._MyList[idx]._Height -3 + + self._PosX = x + self._PosY = y + self._Height = h + + aa_round_rect(self._Parent._CanvasHWND, + (x,y,self._Width-4,h),self._BackgroundColor,4,0,self._BackgroundColor) + + + +class PlayListPage(Page): + + _Icons = {} + _Selector=None + _FootMsg = ["Nav","Remove","RTA","Back","Play/Pause"] + _MyList = [] + _ListFont = MyLangManager.TrFont("notosanscjk15") + + _Scroller = None + _CurSongTime="0:0" + + _BGpng = None + _BGwidth = 75 + _BGheight = 70 + + _Scrolled = 0 + + _CurSongName = "" + + def __init__(self): + self._Icons = {} + Page.__init__(self) + self._CanvasHWND = None + self._MyList = [] + + def SyncList(self): + self._MyList = [] + start_x = 0 + start_y = 0 + if myvars.Poller == None: + return + + play_list = myvars.Poller.playlist() + for i,v in enumerate(play_list): + li = ListItem() + li._Parent = self + li._PosX = start_x + li._PosY = start_y + i*ListItem._Height + li._Width = Width + li._Fonts["normal"] = self._ListFont + + if "title" in v: + if isinstance(v["title"], (list,)): + li.Init(" | ".join(v["title"])) + else: + li.Init( v["title"]) + + if "file" in v: + li._Path = v["file"] + + elif "file" in v: + li.Init(os.path.basename(v["file"])) + li._Path = v["file"] + else: + li.Init("NoName") + + li._Labels["Text"]._PosX = 7 + self._MyList.append(li) + + + self.SyncPlaying() + + def GObjectInterval(self): ## 250 ms + self.SyncPlaying() + + if self._Screen.CurPage() == self: + self._Screen.Draw() + self._Screen.SwapAndShow() + + return True + + def SyncPlaying(self): + if myvars.Poller == None: + return + + current_song = myvars.Poller.poll() + + + for i ,v in enumerate(self._MyList): + self._MyList[i]._Playing = False + self._MyList[i]._PlayingProcess = 0 + + if current_song != None: + if "song" in current_song: + posid = int(current_song["song"]) + if posid < len(self._MyList): # out of index + self._CurSongName = self._MyList[posid]._Text + + if "state" in current_song: + if current_song["state"] == "stop": + self._MyList[posid]._Playing = False + else: + self._MyList[posid]._Playing = True + if "time" in current_song: + self._CurSongTime = current_song["time"] + times_ = current_song["time"].split(":") + if len(times_)> 1: + cur = float(times_[0]) + end = float(times_[1]) + pros = int((cur/end)*100.0) + self._MyList[posid]._PlayingProcess = pros + + + def InPlayList(self,path): + for i,v in enumerate(self._MyList): + if v._Path == path: + return True + + def Init(self): + self._PosX = self._Index * self._Screen._Width + self._Width = self._Screen._Width + self._Height = self._Screen._Height + + self._CanvasHWND = self._Screen._CanvasHWND + + ps = ListPageSelector() + ps._Parent = self + self._Ps = ps + self._PsIndex = 0 + + self.SyncList() + gobject.timeout_add(850,self.GObjectInterval) + + self._BGpng = IconItem() + self._BGpng._ImgSurf = MyIconPool.GiveIconSurface("heart") + self._BGpng._MyType = ICON_TYPES["STAT"] + self._BGpng._Parent = self + self._BGpng.AddLabel(MyLangManager.Tr("my favorite music"), MyLangManager.TrFont("varela18")) + self._BGpng.SetLableColor(MySkinManager.GiveColor('Disabled')) + self._BGpng.Adjust(0,0,self._BGwidth,self._BGheight,0) + + self._Scroller = ListScroller() + self._Scroller._Parent = self + self._Scroller._PosX = self._Width - 10 + self._Scroller._PosY = 2 + self._Scroller.Init() + + + def ScrollUp(self): + if len(self._MyList) == 0: + return + self._PsIndex -= 1 + if self._PsIndex < 0: + self._PsIndex = 0 + cur_li = self._MyList[self._PsIndex] + if cur_li._PosY < 0: + for i in range(0, len(self._MyList)): + self._MyList[i]._PosY += self._MyList[i]._Height + self._Scrolled +=1 + + def ScrollDown(self): + if len(self._MyList) == 0: + return + self._PsIndex +=1 + if self._PsIndex >= len(self._MyList): + self._PsIndex = len(self._MyList) -1 + + cur_li = self._MyList[self._PsIndex] + if cur_li._PosY +cur_li._Height > self._Height: + for i in range(0,len(self._MyList)): + self._MyList[i]._PosY -= self._MyList[i]._Height + self._Scrolled -=1 + + def SyncScroll(self):# show where it left + if self._Scrolled == 0: + return + + if self._PsIndex < len(self._MyList): + cur_li = self._MyList[self._PsIndex] + if self._Scrolled > 0: + if cur_li._PosY < 0: + for i in range(0, len(self._MyList)): + self._MyList[i]._PosY += self._Scrolled * self._MyList[i]._Height + elif self._Scrolled < 0: + if cur_li._PosY +cur_li._Height > self._Height: + for i in range(0,len(self._MyList)): + self._MyList[i]._PosY += self._Scrolled * self._MyList[i]._Height + + def Click(self): + self.RefreshPsIndex() + if len(self._MyList) == 0: + return + + cur_li = self._MyList[self._PsIndex] + play_pos_id = myvars.Poller.play(self._PsIndex) + + self.SyncPlaying() + + self._Screen.Draw() + self._Screen.SwapAndShow() + + def OnReturnBackCb(self): # return from music_lib_list_page + self.SyncList() + self.SyncScroll() + + def KeyDown(self,event): + if IsKeyMenuOrB(event.key): + if myvars.Poller != None: + myvars.Poller.stop() + self._CurSongTime="" + self._CurSongName="" + + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Up"]: + self.ScrollUp() + self._Screen.Draw() + self._Screen.SwapAndShow() + if event.key == CurKeys["Down"]: + self.ScrollDown() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Right"]:#add + self._Screen.PushCurPage() + self._Screen.SetCurPage(myvars.MusicLibListPage) + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Y"]:# del selected songs + myvars.Poller.delete(self._PsIndex) + self.SyncList() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if IsKeyStartOrA(event.key): + self.Click() + + if event.key == CurKeys["X"]: # start spectrum + myvars.SpectrumPage._Neighbor = self + self._Screen.PushPage(myvars.SpectrumPage) + self._Screen.Draw() + self._Screen.SwapAndShow() + + def Draw(self): + self.ClearCanvas() + + if len(self._MyList) == 0: + self._BGpng.NewCoord(self._Width/2,self._Height/2) + self._BGpng.Draw() + return + else: + if len(self._MyList) * ListItem._Height > self._Height: + self._Ps._Width = self._Width - 11 + self._Ps.Draw() + for i in self._MyList: + if i._PosY > self._Height + self._Height/2: + break + + if i._PosY < 0: + continue + + i.Draw() + self._Scroller.UpdateSize( len(self._MyList)*ListItem._Height, self._PsIndex*ListItem._Height) + self._Scroller.Draw() + else: + self._Ps._Width = self._Width + self._Ps.Draw() + for i in self._MyList: + + if i._PosY > self._Height + self._Height/2: + break + + if i._PosY < 0: + continue + + i.Draw() + diff --git a/Menu/GameShell/98_TinyCloud/__init__.py b/Menu/GameShell/98_TinyCloud/__init__.py new file mode 100644 index 0000000..89f2363 --- /dev/null +++ b/Menu/GameShell/98_TinyCloud/__init__.py @@ -0,0 +1,247 @@ +# -*- coding: utf-8 -*- +import pygame +import validators +import commands + +from UI.constants import Width,Height,ICON_TYPES +from UI.simple_name_space import SimpleNamespace +from UI.page import Page +from UI.label import Label +from UI.icon_item import IconItem +from UI.icon_pool import MyIconPool +from UI.keys_def import CurKeys, IsKeyMenuOrB +from UI.skin_manager import MySkinManager +from UI.lang_manager import MyLangManager + +from libs.DBUS import is_wifi_connected_now,get_wifi_ip + +class TinyCloudPage(Page): + _FootMsg = ["Nav","","","Back",""] + _MyList = [] + + _ListFontObj = MyLangManager.TrFont("varela13") + + _AList = {} + _Labels = {} + + _Coords = {} + + _URLColor = MySkinManager.GiveColor('URL') + _TextColor = MySkinManager.GiveColor('Text') + _Scrolled = 0 + + _PngSize = {} + + _DrawOnce = False + _Scroller = None + _Scrolled = 0 + + def __init__(self): + Page.__init__(self) + self._Icons = {} + + def OnLoadCb(self): + self._Scrolled = 0 + self._PosY = 0 + self._DrawOnce = False + + def SetCoords(self): + + self._Coords["forID"] = SimpleNamespace() + self._Coords["forID"].x = 15 + self._Coords["forID"].y = 11 + + self._Coords["forKey"] = SimpleNamespace() + self._Coords["forKey"].x = 71 + self._Coords["forKey"].y = self._Coords["forID"].y + + self._Coords["key_and_pass"] = SimpleNamespace() + self._Coords["key_and_pass"].x = 36 # 141 + self._Coords["key_and_pass"].y = self._Coords["forID"].y + + self._Coords["forssh"] = SimpleNamespace() + self._Coords["forssh"].x = self._Coords["forID"].x + self._Coords["forssh"].y = 36 + + self._Coords["ssh_addr"] = SimpleNamespace() + self._Coords["ssh_addr"].x = self._Coords["forID"].x + self._Coords["ssh_addr"].y = 54 + + self._Coords["forwin"] = SimpleNamespace() + self._Coords["forwin"].x = self._Coords["forID"].x + self._Coords["forwin"].y = 80 + + self._Coords["samba_games"] = SimpleNamespace() + self._Coords["samba_games"].x = self._Coords["forID"].x + self._Coords["samba_games"].y = 97 + + self._Coords["samba_music"] = SimpleNamespace() + self._Coords["samba_music"].x = self._Coords["samba_games"].x + self._Coords["samba_music"].y = 115 + + self._Coords["for_airplay"] = SimpleNamespace() + self._Coords["for_airplay"].x = self._Coords["forID"].x + self._Coords["for_airplay"].y = 140 + + self._Coords["airplay_name"] = SimpleNamespace() + self._Coords["airplay_name"].x = 68 + self._Coords["airplay_name"].y = self._Coords["for_airplay"].y + + self._Coords["for-usb-eth"] = SimpleNamespace() + self._Coords["for-usb-eth"].x = self._Coords["forID"].x + self._Coords["for-usb-eth"].y = 163 + + self._Coords["usb-eth-addr"] = SimpleNamespace() + self._Coords["usb-eth-addr"].x = 112 + self._Coords["usb-eth-addr"].y = self._Coords["for-usb-eth"].y + + self._Coords["bg"] = SimpleNamespace() + self._Coords["bg"].x = self._Width/2 + self._Coords["bg"].y = self._Height/2 + + self._Coords["online"] = SimpleNamespace() + self._Coords["online"].x = 266 + self._Coords["online"].y = 99 + + def SetLabels(self): + if is_wifi_connected_now(): + self._IP = get_wifi_ip() + print("TinyCould : %s" % self._IP) + try: + if validators.ip_address.ipv4(self._IP) == False: + self._IP = "xxx.xxx.xxx.xxx" + except: + print("ip error %s " % self._IP) + self._IP = "xxx.xxx.xxx.xxx" + + else: + self._IP = "xxx.xxx.xxx.xxx" + + hostname = commands.getstatusoutput("hostname")[1] + if hostname == "": + hostname = "clockworkpi" + + labels = \ + [["forssh","For ssh and scp:",self._ListFontObj,self._TextColor], + ["ssh_addr","ssh cpi@%s" % self._IP, self._ListFontObj,self._URLColor], + ["forwin", "For Windows network:", self._ListFontObj, self._TextColor], + ["samba_games", "\\\\%s\games" % self._IP, self._ListFontObj,self._URLColor], + ["samba_music", "\\\\%s\music" % self._IP, self._ListFontObj,self._URLColor], + ["forID", "ID:", self._ListFontObj, self._TextColor], + ["forKey", "Key:", self._ListFontObj, self._TextColor], + ["key_and_pass", "cpi", self._ListFontObj, self._URLColor], + ["for_airplay", "Airplay:", self._ListFontObj, self._TextColor], + ["airplay_name",hostname, self._ListFontObj, self._URLColor], + ["for-usb-eth","USB-Ethernet:", self._ListFontObj, self._TextColor], + ["usb-eth-addr","192.168.10.1", self._ListFontObj, self._URLColor]] + + for i in labels: + l = Label() + l.SetCanvasHWND(self._CanvasHWND) + l.Init(i[1],i[2]) + l.SetColor(i[3]) + self._Labels[ i[0] ] = l + + self.SetCoords() ## + + def Init(self): + + + if self._Screen != None: + if self._Screen._CanvasHWND != None and self._CanvasHWND == None: + self._HWND = self._Screen._CanvasHWND + self._CanvasHWND = pygame.Surface( (self._Screen._Width,self._Screen._Height) ) + + self._PosX = self._Index*self._Screen._Width + self._Width = self._Screen._Width ## equal to screen width + self._Height = self._Screen._Height + + self._PngSize["bg"] = (253,114) + self._PngSize["online"] = (75,122) + + bgpng = IconItem() + bgpng._ImgSurf = MyIconPool.GiveIconSurface("needwifi_bg") + bgpng._MyType = ICON_TYPES["STAT"] + bgpng._Parent = self + bgpng.Adjust(0,0,self._PngSize["bg"][0],self._PngSize["bg"][1],0) + + self._Icons["bg"] = bgpng + + onlinepng = IconItem() + onlinepng._ImgSurf = MyIconPool.GiveIconSurface("online") + onlinepng._MyType = ICON_TYPES["STAT"] + onlinepng._Parent = self + onlinepng.Adjust(0,0,self._PngSize["online"][0], self._PngSize["online"][1],0) + + self._Icons["online"] = onlinepng + + self.SetLabels() + + def KeyDown(self,event): + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + def Draw(self): + if self._DrawOnce == False: + self.ClearCanvas() + + if is_wifi_connected_now(): + + self._Icons["online"].NewCoord(self._Coords["online"].x, self._Coords["online"].y) + self._Icons["online"].Draw() + + self.SetLabels() + + for i in self._Labels: + if i in self._Coords: + self._Labels[i].NewCoord( self._Coords[i].x, self._Coords[i].y) + self._Labels[i].Draw() + + self._Labels["key_and_pass"].NewCoord( 103,self._Coords["key_and_pass"].y) + self._Labels["key_and_pass"].Draw() + + else: + self._Labels["for-usb-eth"].NewCoord(self._Coords["for-usb-eth"].x+55, self._Coords["for-usb-eth"].y) + self._Labels["for-usb-eth"].Draw() + + self._Labels["usb-eth-addr"].NewCoord(self._Coords["usb-eth-addr"].x+55, self._Coords["usb-eth-addr"].y) + self._Labels["usb-eth-addr"].Draw() + + self._Icons["bg"].NewCoord(self._Coords["bg"].x, self._Coords["bg"].y) + self._Icons["bg"].Draw() + + + self._DrawOnce = True + + if self._HWND != None: + self._HWND.fill(MySkinManager.GiveColor('White')) + self._HWND.blit(self._CanvasHWND,(self._PosX,self._PosY,self._Width, self._Height ) ) + + + +class APIOBJ(object): + + _Page = None + def __init__(self): + pass + def Init(self,main_screen): + self._Page = TinyCloudPage() + self._Page._Screen = main_screen + self._Page._Name ="Tiny cloud" + self._Page.Init() + + def API(self,main_screen): + if main_screen !=None: + main_screen.PushPage(self._Page) + main_screen.Draw() + main_screen.SwapAndShow() + +OBJ = APIOBJ() +def Init(main_screen): + OBJ.Init(main_screen) +def API(main_screen): + OBJ.API(main_screen) + + diff --git a/Menu/GameShell/99_PowerOFF/__init__.py b/Menu/GameShell/99_PowerOFF/__init__.py new file mode 100644 index 0000000..740d0aa --- /dev/null +++ b/Menu/GameShell/99_PowerOFF/__init__.py @@ -0,0 +1,95 @@ +# -*- coding: utf-8 -*- + +import pygame + +#UI lib +from UI.constants import RUNSYS +from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB +from UI.confirm_page import ConfirmPage +from UI.lang_manager import MyLangManager +from UI.skin_manager import MySkinManager + +import config + +class PowerOffConfirmPage(ConfirmPage): + + _ConfirmText = MyLangManager.Tr("Awaiting Input") + _FootMsg = ["Nav","","Reboot","Cancel","Shutdown"] + + def CheckBattery(self): + try: + f = open(config.Battery) + except IOError: + print( "PowerOFF open %s failed" % config.Battery) + return 0 + else: + with f: + bat_uevent = {} + content = f.readlines() + content = [x.strip() for x in content] + for i in content: + pis = i.split("=") + if len(pis) > 1: + bat_uevent[pis[0]] = pis[1] + + if "POWER_SUPPLY_CAPACITY" in bat_uevent: + cur_cap = int(bat_uevent["POWER_SUPPLY_CAPACITY"]) + else: + cur_cap = 0 + + return cur_cap + + return 0 + + def KeyDown(self,event): + + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if IsKeyStartOrA(event.key): + if self.CheckBattery() < 20: + cmdpath = "feh --bg-center %s;" % MySkinManager.GiveWallpaper("gameover.png") + else: + cmdpath = "feh --bg-center %s;" % MySkinManager.GiveWallpaper("seeyou.png") + + cmdpath += "sleep 3;" + + #cmdpath += "echo 'halt -p' > /tmp/halt_cmd" + + cmdpath += "sudo halt -p" + pygame.event.post( pygame.event.Event(RUNSYS, message=cmdpath)) + + if event.key == CurKeys["X"]: + cmdpath = "feh --bg-center %s;" % MySkinManager.GiveWallpaper("seeyou.png") + cmdpath += "sleep 3;" + cmdpath += "sudo reboot" + pygame.event.post( pygame.event.Event(RUNSYS, message=cmdpath)) + + +class APIOBJ(object): + + _StoragePage = None + def __init__(self): + pass + def Init(self,main_screen): + self._Page = PowerOffConfirmPage() + + self._Page._Screen = main_screen + self._Page._Name ="Power OFF" + self._Page.Init() + + + def API(self,main_screen): + if main_screen !=None: + main_screen.PushPage(self._Page) + main_screen.Draw() + main_screen.SwapAndShow() + +OBJ = APIOBJ() +def Init(main_screen): + OBJ.Init(main_screen) +def API(main_screen): + OBJ.API(main_screen) + diff --git a/README.md b/README.md new file mode 100644 index 0000000..30e6b0e --- /dev/null +++ b/README.md @@ -0,0 +1,94 @@ +# GameShell launcher +This is the launcher for GameShell based on 320x240 resolution and D-Pad layout. +![Screenshot](https://github.com/clockworkpi/GameShellDocs/blob/master/screenshot.png) + +# Create the necessary user and group +* User name: cpi +* Password: cpi +* Group ID: 31415 with group name: cpifav + +``` +sudo adduser cpi +sudo groupadd cpifav -g 31415 +sudo adduser cpi cpifav +``` + +# Directory structure +``` +/home/cpi/ +├── apps +│   ├── emulators +│   └── launcher <-Here we are +│   ├── Menu +│   ├── sys.py +│   └── truetype +├── games +│   ├── FreeDM +│   ├── MAME +│   └── nxengine +└── music +``` +## Create the necessary directories +``` +mkdir -p /home/cpi/apps/emulators +mkdir -p /home/cpi/games +mkdir -p /home/cpi/music +``` + +# Dependent packages +* validators, numpy, requests, python-mpd2, beeprint, python-pycurl, python-alsaaudio, python-pygame, python-gobject, python-xlib, python-wicd +* wicd (For Wi-Fi) +* mpd (For music player) + +## Install dependent packages +``` +sudo apt-get -y install mpd ncmpcpp git libuser +sudo apt-get -y install python-wicd wicd wicd-curses python-pycurl python-alsaaudio python-pygame python-gobject python-xlib + +sudo apt-get -y install python-pip +sudo pip install validators numpy requests python-mpd2 beeprint +``` + +### With pip install and virtualenv + +``` +mkvirtualenv launcher +pip install -r requirements.txt +``` + +# Create “.mpd_cpi.conf” config + +vim ~/.mpd_cpi.conf + +``` +music_directory "/home/cpi/music" +playlist_directory "/home/cpi/music/playlists" +db_file "/home/cpi/music/tag_cache" +log_file "/tmp/mpd.log" +pid_file "/tmp/mpd.pid" +state_file "/home/cpi/music/mpd_state" +sticker_file "/home/cpi/music/sticker.sql" +user "cpi" +bind_to_address "/tmp/mpd.socket" +auto_update "yes" +auto_update_depth "3" +input { + plugin "curl" +} + +audio_output { + type "alsa" + name "My ALSA Device" +} + +audio_output { + type "fifo" + name "my_fifo" + path "/tmp/mpd.fifo" + format "44100:16:2" +} + +filesystem_charset "UTF-8" +``` + + diff --git a/aria2.conf b/aria2.conf new file mode 100644 index 0000000..602592e --- /dev/null +++ b/aria2.conf @@ -0,0 +1,18 @@ +max-connection-per-server=5 +enable-rpc=true +rpc-allow-origin-all=true +rpc-listen-all=true +log-level=error +log=/tmp/aria.log +dir=/home/cpi/aria2download +daemon=true +allow-overwrite=true +split=1 +max-concurrent-downloads=100 +disk-cache=15M +timeout=600 +retry-wait=30 +max-tries=50 +save-session-interval=10 +disable-ipv6=true +save-session=/home/cpi/aria2download/aria.session.txt diff --git a/aria2c b/aria2c new file mode 100755 index 0000000..39c0d6a Binary files /dev/null and b/aria2c differ diff --git a/awesome/rc.lua b/awesome/rc.lua new file mode 100644 index 0000000..196347d --- /dev/null +++ b/awesome/rc.lua @@ -0,0 +1,499 @@ +-- Standard awesome library +local gears = require("gears") +local awful = require("awful") +require("awful.autofocus") +-- Widget and layout library +local wibox = require("wibox") +-- Theme handling library +local beautiful = require("beautiful") +-- Notification library +local naughty = require("naughty") +local menubar = require("menubar") +local hotkeys_popup = require("awful.hotkeys_popup").widget + +-- Load Debian menu entries +-- require("debian.menu") + +local capi = { screen = screen, + client = client } +local ipairs = ipairs + +-- {{{ Error handling +-- Check if awesome encountered an error during startup and fell back to +-- another config (This code will only ever execute for the fallback config) +if awesome.startup_errors then + naughty.notify({ preset = naughty.config.presets.critical, + title = "Oops, there were errors during startup!", + text = awesome.startup_errors,timeout=3 }) +end + +-- Handle runtime errors after startup +do + local in_error = false + awesome.connect_signal("debug::error", function (err) + -- Make sure we don't go into an endless error loop + if in_error then return end + in_error = true + + naughty.notify({ preset = naughty.config.presets.critical, + title = "Oops, an error happened!", + text = tostring(err),timeout=3 }) + in_error = false + end) +end +-- }}} + +theme_base = "/home/cpi/launcher/awesome" +-- Themes define colours, icons, font and wallpapers. +beautiful.init(theme_base .. "/themes/default/theme.lua") + +-- This is used later as the default terminal and editor to run. +terminal = "xterm" +editor = os.getenv("EDITOR") or "editor" +editor_cmd = terminal .. " -e " .. editor + +-- Default modkey. +-- Usually, Mod4 is the key with a logo between Control and Alt. +-- If you do not like this or do not have such a key, +-- I suggest you to remap Mod4 to another key using xmodmap or other tools. +-- However, you can use another modifier like Mod1, but it may interact with others. +modkey = "Mod4" + +-- Table of layouts to cover with awful.layout.inc, order matters. +awful.layout.layouts = { + awful.layout.suit.floating, + awful.layout.suit.tile, + awful.layout.suit.tile.left, + awful.layout.suit.tile.bottom, + awful.layout.suit.tile.top, + awful.layout.suit.fair, + awful.layout.suit.fair.horizontal, +-- awful.layout.suit.spiral, +-- awful.layout.suit.spiral.dwindle, + --awful.layout.suit.max, + --awful.layout.suit.max.fullscreen, + awful.layout.suit.magnifier, + awful.layout.suit.corner.nw, + -- awful.layout.suit.corner.ne, + -- awful.layout.suit.corner.sw, + -- awful.layout.suit.corner.se, +} +-- }}} + +-- {{{ Helper functions + +local function tableHasKey(table,key) + return table[key] ~= nil +end + +local function client_menu_toggle_fn() + local instance = nil + + return function () + if instance and instance.wibox.visible then + instance:hide() + instance = nil + else + instance = awful.menu.clients({ theme = { width = 250 } }) + end + end +end +-- }}} + +-- {{{ Menu +-- Create a launcher widget and a main menu +myawesomemenu = { + { "edit config", editor_cmd .. " " .. awesome.conffile }, + { "restart", awesome.restart }, + { "quit", function() awesome.quit() end} +} + +mymenu = { + { "xterm" , "xterm"}, + { "xclock", "xclock"} +} + +mymainmenu = awful.menu({ items = { { "awesome", myawesomemenu, beautiful.awesome_icon }, + { "MyStuff", mymenu }, + { "open terminal", terminal } + } + }) + +mylauncher = awful.widget.launcher({ image = beautiful.awesome_icon, + menu = mymainmenu }) + +-- Menubar configuration +menubar.utils.terminal = terminal -- Set the terminal for applications that require it +-- }}} + +-- Keyboard map indicator and switcher +mykeyboardlayout = awful.widget.keyboardlayout() + +-- Create a textclock widget +mytextclock = wibox.widget.textclock() + +-- Create a wibox for each screen and add it +local taglist_buttons = awful.util.table.join( + awful.button({ }, 1, function(t) t:view_only() end), + awful.button({ modkey }, 1, function(t) + if client.focus then + client.focus:move_to_tag(t) + end + end), + awful.button({ }, 3, awful.tag.viewtoggle), + awful.button({ modkey }, 3, function(t) + if client.focus then + client.focus:toggle_tag(t) + end + end), + awful.button({ }, 4, function(t) awful.tag.viewnext(t.screen) end), + awful.button({ }, 5, function(t) awful.tag.viewprev(t.screen) end) + ) + +local tasklist_buttons = awful.util.table.join( + awful.button({ }, 1, function (c) + if c == client.focus then + c.minimized = true + else + -- Without this, the following + -- :isvisible() makes no sense + c.minimized = false + if not c:isvisible() and c.first_tag then + c.first_tag:view_only() + end + -- This will also un-minimize + -- the client, if needed + client.focus = c + c:raise() + end + end), + awful.button({ }, 3, client_menu_toggle_fn()), + awful.button({ }, 4, function () + awful.client.focus.byidx(1) + end), + awful.button({ }, 5, function () + awful.client.focus.byidx(-1) + end)) + + +local function set_wallpaper(s) + -- Wallpaper + if beautiful.wallpaper then + local wallpaper = beautiful.wallpaper + local wallpaperpc = beautiful.wallpaperpc + -- If wallpaper is a function, call it with the screen + if type(wallpaper) == "function" then + wallpaper = wallpaper(s) + end + + -- wallpaper only in PC + if s.geometry.width > 320 then + gears.wallpaper.centered(wallpaperpc, s, 1) + end + + end +end + + +local function get_screen(s) + return s and screen[s] +end + +function awful.widget.tasklist.filter.currenttags_without_gs(c, screen) + screen = get_screen(screen) + -- Only print client on the same screen as this widget + if get_screen(c.screen) ~= screen then return false end + -- Include sticky client too + if c.sticky then return true end + local tags = screen.tags + for _, t in ipairs(tags) do + if t.selected then + local ctags = c:tags() + for _, v in ipairs(ctags) do + if v == t then + if c.class:lower() == "run.py" or c.class:lower() == "gsnotify-arm" or c.class:lower() == "main" then + return false + else + return true + end + end + end + end + end + return false +end + + + +screen.connect_signal("property::geometry", set_wallpaper) + + +awful.screen.connect_for_each_screen(function(s) + -- Wallpaper + set_wallpaper(s) + -- Each screen has its own tag table. + awful.tag({ "GameShell" }, s, awful.layout.layouts[1]) + + -- Create a promptbox for each screen + s.mypromptbox = awful.widget.prompt() + -- Create an imagebox widget which will contains an icon indicating which layout we're using. + -- We need one layoutbox per screen. + s.mylayoutbox = awful.widget.layoutbox(s) + s.mylayoutbox:buttons(awful.util.table.join( + awful.button({ }, 1, function () awful.layout.inc( 1) end), + awful.button({ }, 3, function () awful.layout.inc(-1) end), + awful.button({ }, 4, function () awful.layout.inc( 1) end), + awful.button({ }, 5, function () awful.layout.inc(-1) end))) + -- Create a taglist widget + s.mytaglist = awful.widget.taglist(s, awful.widget.taglist.filter.all, taglist_buttons) + + -- Create a tasklist widget + s.mytasklist = awful.widget.tasklist(s, awful.widget.tasklist.filter.currenttags_without_gs, tasklist_buttons) + + -- Create the wibox + if s.geometry.width > 320 then + s.mywibox = awful.wibar({ position = "bottom", screen = s,visible=true }) + else + s.mywibox = awful.wibar({ position = "bottom", screen = s,visible=false }) + end + + -- Add widgets to the wibox + s.mywibox:setup { + layout = wibox.layout.align.horizontal, + { -- Left widgets + layout = wibox.layout.fixed.horizontal, + mylauncher, + s.mytaglist, + s.mypromptbox, + }, + s.mytasklist, -- Middle widget + { -- Right widgets + layout = wibox.layout.fixed.horizontal, + mykeyboardlayout, + wibox.widget.systray(), + mytextclock, + s.mylayoutbox, + }, + } +end) +-- }}} + +-- {{{ Mouse bindings +root.buttons(awful.util.table.join( + awful.button({ }, 3, function () mymainmenu:toggle() end), + awful.button({ }, 4, awful.tag.viewnext), + awful.button({ }, 5, awful.tag.viewprev) +)) +-- }}} + +-- Bind all key numbers to tags. +-- Be careful: we use keycodes to make it works on any keyboard layout. +-- This should map on the top row of your keyboard, usually 1 to 9. +clientbuttons = awful.util.table.join( + awful.button({ }, 1, function (c) client.focus = c; c:raise() end), + awful.button({ modkey }, 1, awful.mouse.client.move), + awful.button({ modkey }, 3, awful.mouse.client.resize)) + + + +function titlebar_add_with_settings(c) + awful.titlebar.add(c, { modkey = modkey, height = 16, font = "Terminus 6"}) +end + +-- {{{ Rules +-- Rules to apply to new clients (through the "manage" signal). +awful.rules.rules = { + -- All clients will match this rule. + { rule = { }, + properties = { + size_hints_honor = false, + border_width = 0, + border_color = beautiful.border_normal, + focus = awful.client.focus.filter, + raise = true, + keys = clientkeys, + buttons = clientbuttons, + screen = awful.screen.preferred, + placement = awful.placement.no_overlap+awful.placement.no_offscreen + --placement = awful.placement.no_overlap+awful.placement.centered+awful.placement.no_offscreen + + } + }, + + { rule_any = {type = { "normal", "dialog"} + }, properties = { titlebars_enabled = true } + }, + + -- Floating clients. + { rule_any = { + instance = { + "DTA", -- Firefox addon DownThemAll. + "copyq", -- Includes session name in class. + }, + class = { + "Arandr", + "Gpick", + "Kruler", + "MessageWin", -- kalarm. + "Sxiv", + "Wpa_gui", + "pinentry", + "veromix", + "xtightvncviewer", + "xclock" + }, + + name = { + "Event Tester", -- xev. + }, + role = { + "AlarmWindow", -- Thunderbird's calendar. + "pop-up", -- e.g. Google Chrome's (detached) Developer Tools. + } + }, properties = { ontop=false,floating = true,titlebars_enabled=false }}, + + +} +-- }}} + + +local gs_class = {"run.py","gsnotify","gsnotify-arm","retroarch","GSPLauncher","main"} + +-- {{{ Signals +-- Signal function to execute when a new client appears. +client.connect_signal("manage", function (c) + -- Set the windows at the slave, + -- i.e. put it at the end of others instead of setting it master. + -- if not awesome.startup then awful.client.setslave(c) end + + if awesome.startup and + not c.size_hints.user_position + and not c.size_hints.program_position then + -- Prevent clients from being unreachable after screen count changes. + awful.placement.no_offscreen(c) + end + + c.ontop=false + c.above=false + c.below=true + c.fullscreen=false + + if tableHasKey(c,"class") and c.class:lower() == "gsnotify-arm" then + -- naughty.notify({text = "launched!",timeout = 2,position = "top_center"}) + c.ontop = true + c.above = true + c.focusable=false + c.type = "notification" + c.floating = true + c:raise() + end + + for s in capi.screen do + if s.geometry.width > 320 then + for _,v in pairs(gs_class) do + if tableHasKey(c,"class") and c.class:lower() == v then + awful.titlebar.hide(c) + if v ~= "gsnotify-arm" then + awful.placement.centered(c) + end + break + end + end + + -- centered bg with offset of tasklist_bar's height + -- c.y= c.y + s.mywibox.height + + else + -- hide all titlebars in GS + awful.titlebar.hide(c) + + end + + end + +end) + +-- Add a titlebar if titlebars_enabled is set to true in the rules. +client.connect_signal("request::titlebars", function(c) + -- buttons for the titlebar + local buttons = awful.util.table.join( + awful.button({ }, 1, function() + client.focus = c + c:raise() + awful.mouse.client.move(c) + end), + awful.button({ }, 3, function() + client.focus = c + c:raise() + awful.mouse.client.resize(c) + end) + ) + + awful.titlebar(c) : setup { + { -- Left + awful.titlebar.widget.closebutton(c), + -- buttons = buttons, + layout = wibox.layout.fixed.horizontal + }, + { -- Middle + { -- Title + align = "left", + widget = awful.titlebar.widget.titlewidget(c) + }, + buttons = buttons, + layout = wibox.layout.flex.horizontal + }, + { -- Right + align="right", + awful.titlebar.widget.floatingbutton (c), + awful.titlebar.widget.maximizedbutton(c), +-- awful.titlebar.widget.stickybutton (c), +-- awful.titlebar.widget.ontopbutton (c), +-- awful.titlebar.widget.closebutton (c), + layout = wibox.layout.fixed.horizontal() + }, + layout = wibox.layout.align.horizontal + } + + +end) + +-- Enable sloppy focus, so that focus follows mouse. + +client.connect_signal("focus", + function(c) + c.border_color = beautiful.border_normal + + end) +client.connect_signal("unfocus", function(c) c.border_color = beautiful.border_normal end) +-- }}} + +client.disconnect_signal("request::activate", awful.ewmh.activate) +function awful.ewmh.activate(c) + if tableHasKey(c,"class") == false then + return + end + + if c:isvisible() then + if c.class:lower() ~= "gsnotify-arm" then + client.focus = c + end + + if c.class:lower() == "retroarch" then + c:lower() + end + + end +end +client.connect_signal("request::activate", awful.ewmh.activate) + + +client.connect_signal("property::fullscreen", function (c) + c.fullscreen = false + c.ontop = false + c.focus=false + c:lower() + +end) + + diff --git a/awesome/themes/default/README b/awesome/themes/default/README new file mode 100644 index 0000000..1ddb349 --- /dev/null +++ b/awesome/themes/default/README @@ -0,0 +1,3 @@ +Background images: + Mikael Eriksson + Licensed under CC-BY-SA-3.0 diff --git a/awesome/themes/default/background.png b/awesome/themes/default/background.png new file mode 100644 index 0000000..22e67fe Binary files /dev/null and b/awesome/themes/default/background.png differ diff --git a/awesome/themes/default/background_white.png b/awesome/themes/default/background_white.png new file mode 100644 index 0000000..22e67fe Binary files /dev/null and b/awesome/themes/default/background_white.png differ diff --git a/awesome/themes/default/layouts/cornerne.png b/awesome/themes/default/layouts/cornerne.png new file mode 100644 index 0000000..8cfa09c Binary files /dev/null and b/awesome/themes/default/layouts/cornerne.png differ diff --git a/awesome/themes/default/layouts/cornernew.png b/awesome/themes/default/layouts/cornernew.png new file mode 100644 index 0000000..7f6d554 Binary files /dev/null and b/awesome/themes/default/layouts/cornernew.png differ diff --git a/awesome/themes/default/layouts/cornernw.png b/awesome/themes/default/layouts/cornernw.png new file mode 100644 index 0000000..1cb50a4 Binary files /dev/null and b/awesome/themes/default/layouts/cornernw.png differ diff --git a/awesome/themes/default/layouts/cornernww.png b/awesome/themes/default/layouts/cornernww.png new file mode 100644 index 0000000..86a36d8 Binary files /dev/null and b/awesome/themes/default/layouts/cornernww.png differ diff --git a/awesome/themes/default/layouts/cornerse.png b/awesome/themes/default/layouts/cornerse.png new file mode 100644 index 0000000..70d5731 Binary files /dev/null and b/awesome/themes/default/layouts/cornerse.png differ diff --git a/awesome/themes/default/layouts/cornersew.png b/awesome/themes/default/layouts/cornersew.png new file mode 100644 index 0000000..cdf602e Binary files /dev/null and b/awesome/themes/default/layouts/cornersew.png differ diff --git a/awesome/themes/default/layouts/cornersw.png b/awesome/themes/default/layouts/cornersw.png new file mode 100644 index 0000000..f23f19a Binary files /dev/null and b/awesome/themes/default/layouts/cornersw.png differ diff --git a/awesome/themes/default/layouts/cornersww.png b/awesome/themes/default/layouts/cornersww.png new file mode 100644 index 0000000..7f13d5b Binary files /dev/null and b/awesome/themes/default/layouts/cornersww.png differ diff --git a/awesome/themes/default/layouts/dwindle.png b/awesome/themes/default/layouts/dwindle.png new file mode 100644 index 0000000..0ec7a35 Binary files /dev/null and b/awesome/themes/default/layouts/dwindle.png differ diff --git a/awesome/themes/default/layouts/dwindlew.png b/awesome/themes/default/layouts/dwindlew.png new file mode 100644 index 0000000..8457892 Binary files /dev/null and b/awesome/themes/default/layouts/dwindlew.png differ diff --git a/awesome/themes/default/layouts/fairh.png b/awesome/themes/default/layouts/fairh.png new file mode 100644 index 0000000..3c2d36b Binary files /dev/null and b/awesome/themes/default/layouts/fairh.png differ diff --git a/awesome/themes/default/layouts/fairhw.png b/awesome/themes/default/layouts/fairhw.png new file mode 100644 index 0000000..410e292 Binary files /dev/null and b/awesome/themes/default/layouts/fairhw.png differ diff --git a/awesome/themes/default/layouts/fairv.png b/awesome/themes/default/layouts/fairv.png new file mode 100644 index 0000000..ad99f4b Binary files /dev/null and b/awesome/themes/default/layouts/fairv.png differ diff --git a/awesome/themes/default/layouts/fairvw.png b/awesome/themes/default/layouts/fairvw.png new file mode 100644 index 0000000..1a4ee27 Binary files /dev/null and b/awesome/themes/default/layouts/fairvw.png differ diff --git a/awesome/themes/default/layouts/floating.png b/awesome/themes/default/layouts/floating.png new file mode 100644 index 0000000..bf74990 Binary files /dev/null and b/awesome/themes/default/layouts/floating.png differ diff --git a/awesome/themes/default/layouts/floatingw.png b/awesome/themes/default/layouts/floatingw.png new file mode 100644 index 0000000..7aecb06 Binary files /dev/null and b/awesome/themes/default/layouts/floatingw.png differ diff --git a/awesome/themes/default/layouts/fullscreen.png b/awesome/themes/default/layouts/fullscreen.png new file mode 100644 index 0000000..d02f6fc Binary files /dev/null and b/awesome/themes/default/layouts/fullscreen.png differ diff --git a/awesome/themes/default/layouts/fullscreenw.png b/awesome/themes/default/layouts/fullscreenw.png new file mode 100644 index 0000000..5c35bfa Binary files /dev/null and b/awesome/themes/default/layouts/fullscreenw.png differ diff --git a/awesome/themes/default/layouts/magnifier.png b/awesome/themes/default/layouts/magnifier.png new file mode 100644 index 0000000..2ea2792 Binary files /dev/null and b/awesome/themes/default/layouts/magnifier.png differ diff --git a/awesome/themes/default/layouts/magnifierw.png b/awesome/themes/default/layouts/magnifierw.png new file mode 100644 index 0000000..5cd5e16 Binary files /dev/null and b/awesome/themes/default/layouts/magnifierw.png differ diff --git a/awesome/themes/default/layouts/max.png b/awesome/themes/default/layouts/max.png new file mode 100644 index 0000000..8d20844 Binary files /dev/null and b/awesome/themes/default/layouts/max.png differ diff --git a/awesome/themes/default/layouts/maxw.png b/awesome/themes/default/layouts/maxw.png new file mode 100644 index 0000000..85f5ce3 Binary files /dev/null and b/awesome/themes/default/layouts/maxw.png differ diff --git a/awesome/themes/default/layouts/spiral.png b/awesome/themes/default/layouts/spiral.png new file mode 100644 index 0000000..ca41814 Binary files /dev/null and b/awesome/themes/default/layouts/spiral.png differ diff --git a/awesome/themes/default/layouts/spiralw.png b/awesome/themes/default/layouts/spiralw.png new file mode 100644 index 0000000..d128461 Binary files /dev/null and b/awesome/themes/default/layouts/spiralw.png differ diff --git a/awesome/themes/default/layouts/tile.png b/awesome/themes/default/layouts/tile.png new file mode 100644 index 0000000..db1ce15 Binary files /dev/null and b/awesome/themes/default/layouts/tile.png differ diff --git a/awesome/themes/default/layouts/tilebottom.png b/awesome/themes/default/layouts/tilebottom.png new file mode 100644 index 0000000..73a72fe Binary files /dev/null and b/awesome/themes/default/layouts/tilebottom.png differ diff --git a/awesome/themes/default/layouts/tilebottomw.png b/awesome/themes/default/layouts/tilebottomw.png new file mode 100644 index 0000000..64aa289 Binary files /dev/null and b/awesome/themes/default/layouts/tilebottomw.png differ diff --git a/awesome/themes/default/layouts/tileleft.png b/awesome/themes/default/layouts/tileleft.png new file mode 100644 index 0000000..829475a Binary files /dev/null and b/awesome/themes/default/layouts/tileleft.png differ diff --git a/awesome/themes/default/layouts/tileleftw.png b/awesome/themes/default/layouts/tileleftw.png new file mode 100644 index 0000000..24c3941 Binary files /dev/null and b/awesome/themes/default/layouts/tileleftw.png differ diff --git a/awesome/themes/default/layouts/tiletop.png b/awesome/themes/default/layouts/tiletop.png new file mode 100644 index 0000000..1964d4d Binary files /dev/null and b/awesome/themes/default/layouts/tiletop.png differ diff --git a/awesome/themes/default/layouts/tiletopw.png b/awesome/themes/default/layouts/tiletopw.png new file mode 100644 index 0000000..d2eee79 Binary files /dev/null and b/awesome/themes/default/layouts/tiletopw.png differ diff --git a/awesome/themes/default/layouts/tilew.png b/awesome/themes/default/layouts/tilew.png new file mode 100644 index 0000000..4451a66 Binary files /dev/null and b/awesome/themes/default/layouts/tilew.png differ diff --git a/awesome/themes/default/submenu.png b/awesome/themes/default/submenu.png new file mode 100644 index 0000000..b2778e2 Binary files /dev/null and b/awesome/themes/default/submenu.png differ diff --git a/awesome/themes/default/taglist/squarefw.png b/awesome/themes/default/taglist/squarefw.png new file mode 100644 index 0000000..5b4f194 Binary files /dev/null and b/awesome/themes/default/taglist/squarefw.png differ diff --git a/awesome/themes/default/taglist/squarew.png b/awesome/themes/default/taglist/squarew.png new file mode 100644 index 0000000..f9725dd Binary files /dev/null and b/awesome/themes/default/taglist/squarew.png differ diff --git a/awesome/themes/default/theme.lua b/awesome/themes/default/theme.lua new file mode 100644 index 0000000..c1cde9f --- /dev/null +++ b/awesome/themes/default/theme.lua @@ -0,0 +1,109 @@ +--------------------------- +-- Default awesome theme -- +--------------------------- + +local theme = {} + +theme.font = "sans 8" + +theme.bg_normal = "#222222" +theme.bg_focus = "#535d6c" +theme.bg_urgent = "#ff0000" +theme.bg_minimize = "#444444" +theme.bg_systray = theme.bg_normal + +theme.fg_normal = "#aaaaaa" +theme.fg_focus = "#ffffff" +theme.fg_urgent = "#ffffff" +theme.fg_minimize = "#ffffff" + +theme.useless_gap = 0 +theme.border_width = 1 +theme.border_normal = "#000000" +theme.border_focus = "#535d6c" +theme.border_marked = "#91231c" + +-- There are other variable sets +-- overriding the default one when +-- defined, the sets are: +-- taglist_[bg|fg]_[focus|urgent|occupied|empty] +-- tasklist_[bg|fg]_[focus|urgent] +-- titlebar_[bg|fg]_[normal|focus] +-- tooltip_[font|opacity|fg_color|bg_color|border_width|border_color] +-- mouse_finder_[color|timeout|animate_timeout|radius|factor] +-- Example: +--theme.taglist_bg_focus = "#ff0000" + +-- Display the taglist squares +theme.taglist_squares_sel = "/usr/share/awesome/themes/default/taglist/squarefw.png" +theme.taglist_squares_unsel = "/usr/share/awesome/themes/default/taglist/squarew.png" + +-- Variables set for theming the menu: +-- menu_[bg|fg]_[normal|focus] +-- menu_[border_color|border_width] +theme.menu_submenu_icon = "/usr/share/awesome/themes/default/submenu.png" +theme.menu_height = 15 +theme.menu_width = 100 + +-- You can add as many variables as +-- you wish and access them by using +-- beautiful.variable in your rc.lua +--theme.bg_widget = "#cc0000" + +-- Define the image to load +theme.titlebar_close_button_normal = "/usr/share/awesome/themes/default/titlebar/close_normal.png" +theme.titlebar_close_button_focus = "/usr/share/awesome/themes/default/titlebar/close_focus.png" + +theme.titlebar_minimize_button_normal = "/usr/share/awesome/themes/default/titlebar/minimize_normal.png" +theme.titlebar_minimize_button_focus = "/usr/share/awesome/themes/default/titlebar/minimize_focus.png" + +theme.titlebar_ontop_button_normal_inactive = "/usr/share/awesome/themes/default/titlebar/ontop_normal_inactive.png" +theme.titlebar_ontop_button_focus_inactive = "/usr/share/awesome/themes/default/titlebar/ontop_focus_inactive.png" +theme.titlebar_ontop_button_normal_active = "/usr/share/awesome/themes/default/titlebar/ontop_normal_active.png" +theme.titlebar_ontop_button_focus_active = "/usr/share/awesome/themes/default/titlebar/ontop_focus_active.png" + +theme.titlebar_sticky_button_normal_inactive = "/usr/share/awesome/themes/default/titlebar/sticky_normal_inactive.png" +theme.titlebar_sticky_button_focus_inactive = "/usr/share/awesome/themes/default/titlebar/sticky_focus_inactive.png" +theme.titlebar_sticky_button_normal_active = "/usr/share/awesome/themes/default/titlebar/sticky_normal_active.png" +theme.titlebar_sticky_button_focus_active = "/usr/share/awesome/themes/default/titlebar/sticky_focus_active.png" + +theme.titlebar_floating_button_normal_inactive = "/usr/share/awesome/themes/default/titlebar/floating_normal_inactive.png" +theme.titlebar_floating_button_focus_inactive = "/usr/share/awesome/themes/default/titlebar/floating_focus_inactive.png" +theme.titlebar_floating_button_normal_active = "/usr/share/awesome/themes/default/titlebar/floating_normal_active.png" +theme.titlebar_floating_button_focus_active = "/usr/share/awesome/themes/default/titlebar/floating_focus_active.png" + +theme.titlebar_maximized_button_normal_inactive = "/usr/share/awesome/themes/default/titlebar/maximized_normal_inactive.png" +theme.titlebar_maximized_button_focus_inactive = "/usr/share/awesome/themes/default/titlebar/maximized_focus_inactive.png" +theme.titlebar_maximized_button_normal_active = "/usr/share/awesome/themes/default/titlebar/maximized_normal_active.png" +theme.titlebar_maximized_button_focus_active = "/usr/share/awesome/themes/default/titlebar/maximized_focus_active.png" + +theme.wallpaper = "~/launcher/sys.py/gameshell/wallpaper/loading.png" +theme.wallpaperpc = "~/launcher/sys.py/gameshell/wallpaper/desktopbg.jpg" + +-- You can use your own layout icons like this: +theme.layout_fairh = "/usr/share/awesome/themes/default/layouts/fairhw.png" +theme.layout_fairv = "/usr/share/awesome/themes/default/layouts/fairvw.png" +theme.layout_floating = "/usr/share/awesome/themes/default/layouts/floatingw.png" +theme.layout_magnifier = "/usr/share/awesome/themes/default/layouts/magnifierw.png" +theme.layout_max = "/usr/share/awesome/themes/default/layouts/maxw.png" +theme.layout_fullscreen = "/usr/share/awesome/themes/default/layouts/fullscreenw.png" +theme.layout_tilebottom = "/usr/share/awesome/themes/default/layouts/tilebottomw.png" +theme.layout_tileleft = "/usr/share/awesome/themes/default/layouts/tileleftw.png" +theme.layout_tile = "/usr/share/awesome/themes/default/layouts/tilew.png" +theme.layout_tiletop = "/usr/share/awesome/themes/default/layouts/tiletopw.png" +theme.layout_spiral = "/usr/share/awesome/themes/default/layouts/spiralw.png" +theme.layout_dwindle = "/usr/share/awesome/themes/default/layouts/dwindlew.png" +theme.layout_cornernw = "/usr/share/awesome/themes/default/layouts/cornernww.png" +theme.layout_cornerne = "/usr/share/awesome/themes/default/layouts/cornernew.png" +theme.layout_cornersw = "/usr/share/awesome/themes/default/layouts/cornersww.png" +theme.layout_cornerse = "/usr/share/awesome/themes/default/layouts/cornersew.png" + +theme.awesome_icon = "/usr/share/awesome/icons/awesome16.png" + +-- Define the icon theme for application icons. If not set then the icons +-- from /usr/share/icons and /usr/share/icons/hicolor will be used. +theme.icon_theme = nil + +return theme + +-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80 diff --git a/awesome/themes/default/titlebar/close_focus.png b/awesome/themes/default/titlebar/close_focus.png new file mode 100644 index 0000000..e4763b6 Binary files /dev/null and b/awesome/themes/default/titlebar/close_focus.png differ diff --git a/awesome/themes/default/titlebar/close_normal.png b/awesome/themes/default/titlebar/close_normal.png new file mode 100644 index 0000000..7702839 Binary files /dev/null and b/awesome/themes/default/titlebar/close_normal.png differ diff --git a/awesome/themes/default/titlebar/floating_focus_active.png b/awesome/themes/default/titlebar/floating_focus_active.png new file mode 100644 index 0000000..80c1b4a Binary files /dev/null and b/awesome/themes/default/titlebar/floating_focus_active.png differ diff --git a/awesome/themes/default/titlebar/floating_focus_inactive.png b/awesome/themes/default/titlebar/floating_focus_inactive.png new file mode 100644 index 0000000..a96f00c Binary files /dev/null and b/awesome/themes/default/titlebar/floating_focus_inactive.png differ diff --git a/awesome/themes/default/titlebar/floating_normal_active.png b/awesome/themes/default/titlebar/floating_normal_active.png new file mode 100644 index 0000000..b9c70ca Binary files /dev/null and b/awesome/themes/default/titlebar/floating_normal_active.png differ diff --git a/awesome/themes/default/titlebar/floating_normal_inactive.png b/awesome/themes/default/titlebar/floating_normal_inactive.png new file mode 100644 index 0000000..55cbc0c Binary files /dev/null and b/awesome/themes/default/titlebar/floating_normal_inactive.png differ diff --git a/awesome/themes/default/titlebar/maximized_focus_active.png b/awesome/themes/default/titlebar/maximized_focus_active.png new file mode 100644 index 0000000..dad461d Binary files /dev/null and b/awesome/themes/default/titlebar/maximized_focus_active.png differ diff --git a/awesome/themes/default/titlebar/maximized_focus_inactive.png b/awesome/themes/default/titlebar/maximized_focus_inactive.png new file mode 100644 index 0000000..3cc46fe Binary files /dev/null and b/awesome/themes/default/titlebar/maximized_focus_inactive.png differ diff --git a/awesome/themes/default/titlebar/maximized_normal_active.png b/awesome/themes/default/titlebar/maximized_normal_active.png new file mode 100644 index 0000000..0bbbf6a Binary files /dev/null and b/awesome/themes/default/titlebar/maximized_normal_active.png differ diff --git a/awesome/themes/default/titlebar/maximized_normal_inactive.png b/awesome/themes/default/titlebar/maximized_normal_inactive.png new file mode 100644 index 0000000..5f1e98f Binary files /dev/null and b/awesome/themes/default/titlebar/maximized_normal_inactive.png differ diff --git a/awesome/themes/default/titlebar/minimize_focus.png b/awesome/themes/default/titlebar/minimize_focus.png new file mode 100644 index 0000000..1b2629f Binary files /dev/null and b/awesome/themes/default/titlebar/minimize_focus.png differ diff --git a/awesome/themes/default/titlebar/minimize_normal.png b/awesome/themes/default/titlebar/minimize_normal.png new file mode 100644 index 0000000..55d804f Binary files /dev/null and b/awesome/themes/default/titlebar/minimize_normal.png differ diff --git a/awesome/themes/default/titlebar/ontop_focus_active.png b/awesome/themes/default/titlebar/ontop_focus_active.png new file mode 100644 index 0000000..d79c8e2 Binary files /dev/null and b/awesome/themes/default/titlebar/ontop_focus_active.png differ diff --git a/awesome/themes/default/titlebar/ontop_focus_inactive.png b/awesome/themes/default/titlebar/ontop_focus_inactive.png new file mode 100644 index 0000000..03aef5a Binary files /dev/null and b/awesome/themes/default/titlebar/ontop_focus_inactive.png differ diff --git a/awesome/themes/default/titlebar/ontop_normal_active.png b/awesome/themes/default/titlebar/ontop_normal_active.png new file mode 100644 index 0000000..e09f32d Binary files /dev/null and b/awesome/themes/default/titlebar/ontop_normal_active.png differ diff --git a/awesome/themes/default/titlebar/ontop_normal_inactive.png b/awesome/themes/default/titlebar/ontop_normal_inactive.png new file mode 100644 index 0000000..9917b9e Binary files /dev/null and b/awesome/themes/default/titlebar/ontop_normal_inactive.png differ diff --git a/awesome/themes/default/titlebar/sticky_focus_active.png b/awesome/themes/default/titlebar/sticky_focus_active.png new file mode 100644 index 0000000..8019463 Binary files /dev/null and b/awesome/themes/default/titlebar/sticky_focus_active.png differ diff --git a/awesome/themes/default/titlebar/sticky_focus_inactive.png b/awesome/themes/default/titlebar/sticky_focus_inactive.png new file mode 100644 index 0000000..6d7fe40 Binary files /dev/null and b/awesome/themes/default/titlebar/sticky_focus_inactive.png differ diff --git a/awesome/themes/default/titlebar/sticky_normal_active.png b/awesome/themes/default/titlebar/sticky_normal_active.png new file mode 100644 index 0000000..0d003ef Binary files /dev/null and b/awesome/themes/default/titlebar/sticky_normal_active.png differ diff --git a/awesome/themes/default/titlebar/sticky_normal_inactive.png b/awesome/themes/default/titlebar/sticky_normal_inactive.png new file mode 100644 index 0000000..f1e8789 Binary files /dev/null and b/awesome/themes/default/titlebar/sticky_normal_inactive.png differ diff --git a/bluetooth_firmware.sh b/bluetooth_firmware.sh new file mode 100755 index 0000000..dc9ef66 --- /dev/null +++ b/bluetooth_firmware.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +FIRM=`cat /proc/driver/brcmf_fw` + +if [[ $FIRM =~ .*a0.* ]] +then + brcm_patchram_plus --patchram /lib/firmware/brcm/bcm43438a0.hcd --enable_hci --bd_addr B0:F1:EC:2D:07:5B --no2bytes --tosleep 5000 /dev/ttyS1 & +else + brcm_patchram_plus --patchram /lib/firmware/brcm/bcm43438a1.hcd --enable_hci --bd_addr B0:F1:EC:2D:07:5B --no2bytes --tosleep 5000 /dev/ttyS1 & +fi diff --git a/dwm-mod b/dwm-mod new file mode 100755 index 0000000..51af04c Binary files /dev/null and b/dwm-mod differ diff --git a/load.sh b/load.sh new file mode 100755 index 0000000..c3a78c9 --- /dev/null +++ b/load.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +BASENAME=`dirname "$0"` + +cd $BASENAME/sys.py + +python run.py + + diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..b63bd2e --- /dev/null +++ b/requirements.txt @@ -0,0 +1,10 @@ +pycurl +pygame +#gobject +xlib +pyalsaaudio +dbus-python +#wicd - not pip installable yet +#beeprint - causes bugs +validators +python-mpd diff --git a/skin/DEOT/Menu/GameShell/20_Retro Games/BeetleVB.png b/skin/DEOT/Menu/GameShell/20_Retro Games/BeetleVB.png new file mode 100644 index 0000000..255f476 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/20_Retro Games/BeetleVB.png differ diff --git a/skin/DEOT/Menu/GameShell/20_Retro Games/Coleco.png b/skin/DEOT/Menu/GameShell/20_Retro Games/Coleco.png new file mode 100644 index 0000000..0cbffd0 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/20_Retro Games/Coleco.png differ diff --git a/skin/DEOT/Menu/GameShell/20_Retro Games/Drastic+.png b/skin/DEOT/Menu/GameShell/20_Retro Games/Drastic+.png new file mode 100644 index 0000000..a8fcd94 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/20_Retro Games/Drastic+.png differ diff --git a/skin/DEOT/Menu/GameShell/20_Retro Games/FBA.png b/skin/DEOT/Menu/GameShell/20_Retro Games/FBA.png new file mode 100644 index 0000000..ca82e63 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/20_Retro Games/FBA.png differ diff --git a/skin/DEOT/Menu/GameShell/20_Retro Games/Fceux+.png b/skin/DEOT/Menu/GameShell/20_Retro Games/Fceux+.png new file mode 100644 index 0000000..f69ea6e Binary files /dev/null and b/skin/DEOT/Menu/GameShell/20_Retro Games/Fceux+.png differ diff --git a/skin/DEOT/Menu/GameShell/20_Retro Games/Fuse.png b/skin/DEOT/Menu/GameShell/20_Retro Games/Fuse.png new file mode 100644 index 0000000..7dd5350 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/20_Retro Games/Fuse.png differ diff --git a/skin/DEOT/Menu/GameShell/20_Retro Games/GGEAR.png b/skin/DEOT/Menu/GameShell/20_Retro Games/GGEAR.png new file mode 100644 index 0000000..807ee99 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/20_Retro Games/GGEAR.png differ diff --git a/skin/DEOT/Menu/GameShell/20_Retro Games/GPSP.png b/skin/DEOT/Menu/GameShell/20_Retro Games/GPSP.png new file mode 100644 index 0000000..fdd3c7e Binary files /dev/null and b/skin/DEOT/Menu/GameShell/20_Retro Games/GPSP.png differ diff --git a/skin/DEOT/Menu/GameShell/20_Retro Games/LYNX.png b/skin/DEOT/Menu/GameShell/20_Retro Games/LYNX.png new file mode 100644 index 0000000..dfea5a8 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/20_Retro Games/LYNX.png differ diff --git a/skin/DEOT/Menu/GameShell/20_Retro Games/MAME alt.png b/skin/DEOT/Menu/GameShell/20_Retro Games/MAME alt.png new file mode 100644 index 0000000..ca82e63 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/20_Retro Games/MAME alt.png differ diff --git a/skin/DEOT/Menu/GameShell/20_Retro Games/MAME.png b/skin/DEOT/Menu/GameShell/20_Retro Games/MAME.png new file mode 100644 index 0000000..c7dd4ed Binary files /dev/null and b/skin/DEOT/Menu/GameShell/20_Retro Games/MAME.png differ diff --git a/skin/DEOT/Menu/GameShell/20_Retro Games/MGBA alt.png b/skin/DEOT/Menu/GameShell/20_Retro Games/MGBA alt.png new file mode 100644 index 0000000..116763e Binary files /dev/null and b/skin/DEOT/Menu/GameShell/20_Retro Games/MGBA alt.png differ diff --git a/skin/DEOT/Menu/GameShell/20_Retro Games/MGBA.png b/skin/DEOT/Menu/GameShell/20_Retro Games/MGBA.png new file mode 100644 index 0000000..8f9f29d Binary files /dev/null and b/skin/DEOT/Menu/GameShell/20_Retro Games/MGBA.png differ diff --git a/skin/DEOT/Menu/GameShell/20_Retro Games/MGBAalt.png b/skin/DEOT/Menu/GameShell/20_Retro Games/MGBAalt.png new file mode 100644 index 0000000..116763e Binary files /dev/null and b/skin/DEOT/Menu/GameShell/20_Retro Games/MGBAalt.png differ diff --git a/skin/DEOT/Menu/GameShell/20_Retro Games/Mednafen.png b/skin/DEOT/Menu/GameShell/20_Retro Games/Mednafen.png new file mode 100644 index 0000000..9e2371f Binary files /dev/null and b/skin/DEOT/Menu/GameShell/20_Retro Games/Mednafen.png differ diff --git a/skin/DEOT/Menu/GameShell/20_Retro Games/MednafenVB.png b/skin/DEOT/Menu/GameShell/20_Retro Games/MednafenVB.png new file mode 100644 index 0000000..c2f45c7 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/20_Retro Games/MednafenVB.png differ diff --git a/skin/DEOT/Menu/GameShell/20_Retro Games/NESTOPIA alt.png b/skin/DEOT/Menu/GameShell/20_Retro Games/NESTOPIA alt.png new file mode 100644 index 0000000..a6e0dc7 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/20_Retro Games/NESTOPIA alt.png differ diff --git a/skin/DEOT/Menu/GameShell/20_Retro Games/NESTOPIA.png b/skin/DEOT/Menu/GameShell/20_Retro Games/NESTOPIA.png new file mode 100644 index 0000000..06956a8 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/20_Retro Games/NESTOPIA.png differ diff --git a/skin/DEOT/Menu/GameShell/20_Retro Games/NESTOPIAalt.png b/skin/DEOT/Menu/GameShell/20_Retro Games/NESTOPIAalt.png new file mode 100644 index 0000000..06956a8 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/20_Retro Games/NESTOPIAalt.png differ diff --git a/skin/DEOT/Menu/GameShell/20_Retro Games/Ohboy+.png b/skin/DEOT/Menu/GameShell/20_Retro Games/Ohboy+.png new file mode 100644 index 0000000..ff323e2 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/20_Retro Games/Ohboy+.png differ diff --git a/skin/DEOT/Menu/GameShell/20_Retro Games/PCSX.png b/skin/DEOT/Menu/GameShell/20_Retro Games/PCSX.png new file mode 100644 index 0000000..e6408e5 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/20_Retro Games/PCSX.png differ diff --git a/skin/DEOT/Menu/GameShell/20_Retro Games/Pcsx+.png b/skin/DEOT/Menu/GameShell/20_Retro Games/Pcsx+.png new file mode 100644 index 0000000..68fd25e Binary files /dev/null and b/skin/DEOT/Menu/GameShell/20_Retro Games/Pcsx+.png differ diff --git a/skin/DEOT/Menu/GameShell/20_Retro Games/PicoDrive+.png b/skin/DEOT/Menu/GameShell/20_Retro Games/PicoDrive+.png new file mode 100644 index 0000000..253050f Binary files /dev/null and b/skin/DEOT/Menu/GameShell/20_Retro Games/PicoDrive+.png differ diff --git a/skin/DEOT/Menu/GameShell/20_Retro Games/PicoDrive.png b/skin/DEOT/Menu/GameShell/20_Retro Games/PicoDrive.png new file mode 100644 index 0000000..f9ee178 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/20_Retro Games/PicoDrive.png differ diff --git a/skin/DEOT/Menu/GameShell/20_Retro Games/PocketSNES+.png b/skin/DEOT/Menu/GameShell/20_Retro Games/PocketSNES+.png new file mode 100644 index 0000000..35789e5 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/20_Retro Games/PocketSNES+.png differ diff --git a/skin/DEOT/Menu/GameShell/20_Retro Games/Quake II.png b/skin/DEOT/Menu/GameShell/20_Retro Games/Quake II.png new file mode 100644 index 0000000..ba9e225 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/20_Retro Games/Quake II.png differ diff --git a/skin/DEOT/Menu/GameShell/20_Retro Games/SCUMMVM.png b/skin/DEOT/Menu/GameShell/20_Retro Games/SCUMMVM.png new file mode 100644 index 0000000..f37f915 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/20_Retro Games/SCUMMVM.png differ diff --git a/skin/DEOT/Menu/GameShell/20_Retro Games/SFC9X.png b/skin/DEOT/Menu/GameShell/20_Retro Games/SFC9X.png new file mode 100644 index 0000000..1f70629 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/20_Retro Games/SFC9X.png differ diff --git a/skin/DEOT/Menu/GameShell/20_Retro Games/UAE+.png b/skin/DEOT/Menu/GameShell/20_Retro Games/UAE+.png new file mode 100644 index 0000000..f71aafa Binary files /dev/null and b/skin/DEOT/Menu/GameShell/20_Retro Games/UAE+.png differ diff --git a/skin/DEOT/Menu/GameShell/20_Retro Games/Wswan.png b/skin/DEOT/Menu/GameShell/20_Retro Games/Wswan.png new file mode 100644 index 0000000..fe4d06b Binary files /dev/null and b/skin/DEOT/Menu/GameShell/20_Retro Games/Wswan.png differ diff --git a/skin/DEOT/Menu/GameShell/20_Retro Games/gpSP+.png b/skin/DEOT/Menu/GameShell/20_Retro Games/gpSP+.png new file mode 100644 index 0000000..0ee0c3b Binary files /dev/null and b/skin/DEOT/Menu/GameShell/20_Retro Games/gpSP+.png differ diff --git a/skin/DEOT/Menu/GameShell/20_Retro Games/id.png b/skin/DEOT/Menu/GameShell/20_Retro Games/id.png new file mode 100644 index 0000000..223f3ac Binary files /dev/null and b/skin/DEOT/Menu/GameShell/20_Retro Games/id.png differ diff --git a/skin/DEOT/Menu/GameShell/20_Retro Games/mupen64+.png b/skin/DEOT/Menu/GameShell/20_Retro Games/mupen64+.png new file mode 100644 index 0000000..8047992 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/20_Retro Games/mupen64+.png differ diff --git a/skin/DEOT/Menu/GameShell/20_Retro Games/mupen64.png b/skin/DEOT/Menu/GameShell/20_Retro Games/mupen64.png new file mode 100644 index 0000000..8047992 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/20_Retro Games/mupen64.png differ diff --git a/skin/DEOT/Menu/GameShell/21_Indie Games/2048.png b/skin/DEOT/Menu/GameShell/21_Indie Games/2048.png new file mode 100644 index 0000000..804d5ef Binary files /dev/null and b/skin/DEOT/Menu/GameShell/21_Indie Games/2048.png differ diff --git a/skin/DEOT/Menu/GameShell/21_Indie Games/Abbaye.png b/skin/DEOT/Menu/GameShell/21_Indie Games/Abbaye.png new file mode 100644 index 0000000..e7d22ab Binary files /dev/null and b/skin/DEOT/Menu/GameShell/21_Indie Games/Abbaye.png differ diff --git a/skin/DEOT/Menu/GameShell/21_Indie Games/GSPLauncher.png b/skin/DEOT/Menu/GameShell/21_Indie Games/GSPLauncher.png new file mode 100644 index 0000000..861a60e Binary files /dev/null and b/skin/DEOT/Menu/GameShell/21_Indie Games/GSPLauncher.png differ diff --git a/skin/DEOT/Menu/GameShell/21_Indie Games/Hurrican.png b/skin/DEOT/Menu/GameShell/21_Indie Games/Hurrican.png new file mode 100644 index 0000000..0a1c541 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/21_Indie Games/Hurrican.png differ diff --git a/skin/DEOT/Menu/GameShell/21_Indie Games/No.909.png b/skin/DEOT/Menu/GameShell/21_Indie Games/No.909.png new file mode 100644 index 0000000..2952bb8 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/21_Indie Games/No.909.png differ diff --git a/skin/DEOT/Menu/GameShell/21_Indie Games/NyanCat.png b/skin/DEOT/Menu/GameShell/21_Indie Games/NyanCat.png new file mode 100644 index 0000000..8cc9f33 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/21_Indie Games/NyanCat.png differ diff --git a/skin/DEOT/Menu/GameShell/21_Indie Games/OpenTyrian.png b/skin/DEOT/Menu/GameShell/21_Indie Games/OpenTyrian.png new file mode 100644 index 0000000..ab674d5 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/21_Indie Games/OpenTyrian.png differ diff --git a/skin/DEOT/Menu/GameShell/21_Indie Games/Planet-Busters.png b/skin/DEOT/Menu/GameShell/21_Indie Games/Planet-Busters.png new file mode 100644 index 0000000..58ba750 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/21_Indie Games/Planet-Busters.png differ diff --git a/skin/DEOT/Menu/GameShell/59_D.E.O.T. Extra/MAIL.png b/skin/DEOT/Menu/GameShell/59_D.E.O.T. Extra/MAIL.png new file mode 100644 index 0000000..fd37af6 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/59_D.E.O.T. Extra/MAIL.png differ diff --git a/skin/DEOT/Menu/GameShell/59_D.E.O.T. Extra/MANUAL.png b/skin/DEOT/Menu/GameShell/59_D.E.O.T. Extra/MANUAL.png new file mode 100644 index 0000000..08e3346 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/59_D.E.O.T. Extra/MANUAL.png differ diff --git a/skin/DEOT/Menu/GameShell/59_D.E.O.T. Extra/OPERATION.png b/skin/DEOT/Menu/GameShell/59_D.E.O.T. Extra/OPERATION.png new file mode 100644 index 0000000..bccb664 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/59_D.E.O.T. Extra/OPERATION.png differ diff --git a/skin/DEOT/Menu/GameShell/60_Utils/BatMon.png b/skin/DEOT/Menu/GameShell/60_Utils/BatMon.png new file mode 100644 index 0000000..22d3443 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/60_Utils/BatMon.png differ diff --git a/skin/DEOT/Menu/GameShell/60_Utils/Bean.png b/skin/DEOT/Menu/GameShell/60_Utils/Bean.png new file mode 100644 index 0000000..521958a Binary files /dev/null and b/skin/DEOT/Menu/GameShell/60_Utils/Bean.png differ diff --git a/skin/DEOT/Menu/GameShell/60_Utils/Clockspeed.png b/skin/DEOT/Menu/GameShell/60_Utils/Clockspeed.png new file mode 100644 index 0000000..521958a Binary files /dev/null and b/skin/DEOT/Menu/GameShell/60_Utils/Clockspeed.png differ diff --git a/skin/DEOT/Menu/GameShell/60_Utils/DEOT Settings.png b/skin/DEOT/Menu/GameShell/60_Utils/DEOT Settings.png new file mode 100644 index 0000000..7d802a6 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/60_Utils/DEOT Settings.png differ diff --git a/skin/DEOT/Menu/GameShell/60_Utils/DinguxCommander.png b/skin/DEOT/Menu/GameShell/60_Utils/DinguxCommander.png new file mode 100644 index 0000000..521958a Binary files /dev/null and b/skin/DEOT/Menu/GameShell/60_Utils/DinguxCommander.png differ diff --git a/skin/DEOT/Menu/GameShell/60_Utils/EmptyMail.png b/skin/DEOT/Menu/GameShell/60_Utils/EmptyMail.png new file mode 100644 index 0000000..521958a Binary files /dev/null and b/skin/DEOT/Menu/GameShell/60_Utils/EmptyMail.png differ diff --git a/skin/DEOT/Menu/GameShell/60_Utils/Kernel.png b/skin/DEOT/Menu/GameShell/60_Utils/Kernel.png new file mode 100644 index 0000000..521958a Binary files /dev/null and b/skin/DEOT/Menu/GameShell/60_Utils/Kernel.png differ diff --git a/skin/DEOT/Menu/GameShell/60_Utils/Resize.png b/skin/DEOT/Menu/GameShell/60_Utils/Resize.png new file mode 100644 index 0000000..521958a Binary files /dev/null and b/skin/DEOT/Menu/GameShell/60_Utils/Resize.png differ diff --git a/skin/DEOT/Menu/GameShell/60_Utils/Retroarch Update.png b/skin/DEOT/Menu/GameShell/60_Utils/Retroarch Update.png new file mode 100644 index 0000000..ce13655 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/60_Utils/Retroarch Update.png differ diff --git a/skin/DEOT/Menu/GameShell/60_Utils/Samplerbox.png b/skin/DEOT/Menu/GameShell/60_Utils/Samplerbox.png new file mode 100644 index 0000000..210053c Binary files /dev/null and b/skin/DEOT/Menu/GameShell/60_Utils/Samplerbox.png differ diff --git a/skin/DEOT/Menu/GameShell/60_Utils/SwapFile.png b/skin/DEOT/Menu/GameShell/60_Utils/SwapFile.png new file mode 100644 index 0000000..521958a Binary files /dev/null and b/skin/DEOT/Menu/GameShell/60_Utils/SwapFile.png differ diff --git a/skin/DEOT/Menu/GameShell/CaveStory alt.png b/skin/DEOT/Menu/GameShell/CaveStory alt.png new file mode 100644 index 0000000..ebeb378 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/CaveStory alt.png differ diff --git a/skin/DEOT/Menu/GameShell/CaveStory.png b/skin/DEOT/Menu/GameShell/CaveStory.png new file mode 100644 index 0000000..4b11a04 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/CaveStory.png differ diff --git a/skin/DEOT/Menu/GameShell/ChocoDM alt.png b/skin/DEOT/Menu/GameShell/ChocoDM alt.png new file mode 100644 index 0000000..d3fd5d7 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/ChocoDM alt.png differ diff --git a/skin/DEOT/Menu/GameShell/ChocoDM.png b/skin/DEOT/Menu/GameShell/ChocoDM.png new file mode 100644 index 0000000..f63e021 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/ChocoDM.png differ diff --git a/skin/DEOT/Menu/GameShell/D.E.O.T. Extra.png b/skin/DEOT/Menu/GameShell/D.E.O.T. Extra.png new file mode 100644 index 0000000..7d802a6 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/D.E.O.T. Extra.png differ diff --git a/skin/DEOT/Menu/GameShell/Indie Games.png b/skin/DEOT/Menu/GameShell/Indie Games.png new file mode 100644 index 0000000..fd37af6 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/Indie Games.png differ diff --git a/skin/DEOT/Menu/GameShell/Love2D.png b/skin/DEOT/Menu/GameShell/Love2D.png new file mode 100644 index 0000000..c3ec1e8 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/Love2D.png differ diff --git a/skin/DEOT/Menu/GameShell/LowResNX alt.png b/skin/DEOT/Menu/GameShell/LowResNX alt.png new file mode 100644 index 0000000..c6ada69 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/LowResNX alt.png differ diff --git a/skin/DEOT/Menu/GameShell/LowResNX.png b/skin/DEOT/Menu/GameShell/LowResNX.png new file mode 100644 index 0000000..567d92d Binary files /dev/null and b/skin/DEOT/Menu/GameShell/LowResNX.png differ diff --git a/skin/DEOT/Menu/GameShell/Music Player.png b/skin/DEOT/Menu/GameShell/Music Player.png new file mode 100644 index 0000000..08e3346 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/Music Player.png differ diff --git a/skin/DEOT/Menu/GameShell/PICO-8.png b/skin/DEOT/Menu/GameShell/PICO-8.png new file mode 100644 index 0000000..64df2d0 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/PICO-8.png differ diff --git a/skin/DEOT/Menu/GameShell/PowerOFF.png b/skin/DEOT/Menu/GameShell/PowerOFF.png new file mode 100644 index 0000000..187ce88 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/PowerOFF.png differ diff --git a/skin/DEOT/Menu/GameShell/Reload UI.png b/skin/DEOT/Menu/GameShell/Reload UI.png new file mode 100644 index 0000000..781cb73 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/Reload UI.png differ diff --git a/skin/DEOT/Menu/GameShell/Retro Games.png b/skin/DEOT/Menu/GameShell/Retro Games.png new file mode 100644 index 0000000..be9c7cb Binary files /dev/null and b/skin/DEOT/Menu/GameShell/Retro Games.png differ diff --git a/skin/DEOT/Menu/GameShell/RetroArch.png b/skin/DEOT/Menu/GameShell/RetroArch.png new file mode 100644 index 0000000..ce13655 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/RetroArch.png differ diff --git a/skin/DEOT/Menu/GameShell/Settings.png b/skin/DEOT/Menu/GameShell/Settings.png new file mode 100644 index 0000000..040dd51 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/Settings.png differ diff --git a/skin/DEOT/Menu/GameShell/Sleep.png b/skin/DEOT/Menu/GameShell/Sleep.png new file mode 100644 index 0000000..3b654f5 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/Sleep.png differ diff --git a/skin/DEOT/Menu/GameShell/TIC-80.png b/skin/DEOT/Menu/GameShell/TIC-80.png new file mode 100644 index 0000000..22953e1 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/TIC-80.png differ diff --git a/skin/DEOT/Menu/GameShell/TinyCloud.png b/skin/DEOT/Menu/GameShell/TinyCloud.png new file mode 100644 index 0000000..fbd56a3 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/TinyCloud.png differ diff --git a/skin/DEOT/Menu/GameShell/Utils.png b/skin/DEOT/Menu/GameShell/Utils.png new file mode 100644 index 0000000..67df9ce Binary files /dev/null and b/skin/DEOT/Menu/GameShell/Utils.png differ diff --git a/skin/DEOT/Menu/GameShell/Warehouse.png b/skin/DEOT/Menu/GameShell/Warehouse.png new file mode 100644 index 0000000..bccb664 Binary files /dev/null and b/skin/DEOT/Menu/GameShell/Warehouse.png differ diff --git a/skin/DEOT/background.png b/skin/DEOT/background.png new file mode 100644 index 0000000..ae52adb Binary files /dev/null and b/skin/DEOT/background.png differ diff --git a/skin/DEOT/config.ini b/skin/DEOT/config.ini new file mode 100644 index 0000000..68fd1df --- /dev/null +++ b/skin/DEOT/config.ini @@ -0,0 +1,12 @@ +[Colors] +High = #33A6FF +Text = #2A8C79 +ReadOnlyText = #828282 +Front = #15463C +URL = #33A6FF +Line = #15463C +TitleBg = #0B1016 +Active = #AF5A00 +Disabled = #CCCCCC +White = #0B1016 +Black = #000000 \ No newline at end of file diff --git a/skin/DEOT/sys.py/gameshell/blank.png b/skin/DEOT/sys.py/gameshell/blank.png new file mode 100644 index 0000000..fcabc8c Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/blank.png differ diff --git a/skin/DEOT/sys.py/gameshell/footbar_icons/footbar.png b/skin/DEOT/sys.py/gameshell/footbar_icons/footbar.png new file mode 100644 index 0000000..24789f6 Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/footbar_icons/footbar.png differ diff --git a/skin/DEOT/sys.py/gameshell/icons/DialogBoxs.png b/skin/DEOT/sys.py/gameshell/icons/DialogBoxs.png new file mode 100644 index 0000000..787faee Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/icons/DialogBoxs.png differ diff --git a/skin/DEOT/sys.py/gameshell/icons/GS.png b/skin/DEOT/sys.py/gameshell/icons/GS.png new file mode 100644 index 0000000..3a5877c Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/icons/GS.png differ diff --git a/skin/DEOT/sys.py/gameshell/icons/_L.png b/skin/DEOT/sys.py/gameshell/icons/_L.png new file mode 100644 index 0000000..f872581 Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/icons/_L.png differ diff --git a/skin/DEOT/sys.py/gameshell/icons/_R.png b/skin/DEOT/sys.py/gameshell/icons/_R.png new file mode 100644 index 0000000..348e2cf Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/icons/_R.png differ diff --git a/skin/DEOT/sys.py/gameshell/icons/about_bg.png b/skin/DEOT/sys.py/gameshell/icons/about_bg.png new file mode 100644 index 0000000..4c0e235 Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/icons/about_bg.png differ diff --git a/skin/DEOT/sys.py/gameshell/icons/airwire.png b/skin/DEOT/sys.py/gameshell/icons/airwire.png new file mode 100644 index 0000000..b443c96 Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/icons/airwire.png differ diff --git a/skin/DEOT/sys.py/gameshell/icons/blueselector.png b/skin/DEOT/sys.py/gameshell/icons/blueselector.png new file mode 100644 index 0000000..56994bf Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/icons/blueselector.png differ diff --git a/skin/DEOT/sys.py/gameshell/icons/buttonslayout.png b/skin/DEOT/sys.py/gameshell/icons/buttonslayout.png new file mode 100644 index 0000000..4ce4191 Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/icons/buttonslayout.png differ diff --git a/skin/DEOT/sys.py/gameshell/icons/done.png b/skin/DEOT/sys.py/gameshell/icons/done.png new file mode 100644 index 0000000..6a7727f Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/icons/done.png differ diff --git a/skin/DEOT/sys.py/gameshell/icons/empty.png b/skin/DEOT/sys.py/gameshell/icons/empty.png new file mode 100644 index 0000000..eafc21c Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/icons/empty.png differ diff --git a/skin/DEOT/sys.py/gameshell/icons/heart.png b/skin/DEOT/sys.py/gameshell/icons/heart.png new file mode 100644 index 0000000..e0b38f1 Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/icons/heart.png differ diff --git a/skin/DEOT/sys.py/gameshell/icons/icon_sd.png b/skin/DEOT/sys.py/gameshell/icons/icon_sd.png new file mode 100644 index 0000000..72e3163 Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/icons/icon_sd.png differ diff --git a/skin/DEOT/sys.py/gameshell/icons/light.png b/skin/DEOT/sys.py/gameshell/icons/light.png new file mode 100644 index 0000000..2f4382d Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/icons/light.png differ diff --git a/skin/DEOT/sys.py/gameshell/icons/lock.png b/skin/DEOT/sys.py/gameshell/icons/lock.png new file mode 100644 index 0000000..89c46d5 Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/icons/lock.png differ diff --git a/skin/DEOT/sys.py/gameshell/icons/needwifi_bg.png b/skin/DEOT/sys.py/gameshell/icons/needwifi_bg.png new file mode 100644 index 0000000..8d52f04 Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/icons/needwifi_bg.png differ diff --git a/skin/DEOT/sys.py/gameshell/icons/online.png b/skin/DEOT/sys.py/gameshell/icons/online.png new file mode 100644 index 0000000..7c38972 Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/icons/online.png differ diff --git a/skin/DEOT/sys.py/gameshell/icons/pico8_md5_err.png b/skin/DEOT/sys.py/gameshell/icons/pico8_md5_err.png new file mode 100644 index 0000000..29574db Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/icons/pico8_md5_err.png differ diff --git a/skin/DEOT/sys.py/gameshell/icons/pico8_notfound.png b/skin/DEOT/sys.py/gameshell/icons/pico8_notfound.png new file mode 100644 index 0000000..f3936ff Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/icons/pico8_notfound.png differ diff --git a/skin/DEOT/sys.py/gameshell/icons/rom_download.png b/skin/DEOT/sys.py/gameshell/icons/rom_download.png new file mode 100644 index 0000000..6ae3b0a Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/icons/rom_download.png differ diff --git a/skin/DEOT/sys.py/gameshell/icons/roundcorners.png b/skin/DEOT/sys.py/gameshell/icons/roundcorners.png new file mode 100644 index 0000000..cd8fce6 Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/icons/roundcorners.png differ diff --git a/skin/DEOT/sys.py/gameshell/icons/scale.png b/skin/DEOT/sys.py/gameshell/icons/scale.png new file mode 100644 index 0000000..f7e2dd4 Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/icons/scale.png differ diff --git a/skin/DEOT/sys.py/gameshell/icons/sheep_bg.png b/skin/DEOT/sys.py/gameshell/icons/sheep_bg.png new file mode 100644 index 0000000..f373475 Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/icons/sheep_bg.png differ diff --git a/skin/DEOT/sys.py/gameshell/icons/sheep_body.png b/skin/DEOT/sys.py/gameshell/icons/sheep_body.png new file mode 100644 index 0000000..148ff46 Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/icons/sheep_body.png differ diff --git a/skin/DEOT/sys.py/gameshell/icons/sheep_head.png b/skin/DEOT/sys.py/gameshell/icons/sheep_head.png new file mode 100644 index 0000000..615246b Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/icons/sheep_head.png differ diff --git a/skin/DEOT/sys.py/gameshell/icons/star.png b/skin/DEOT/sys.py/gameshell/icons/star.png new file mode 100644 index 0000000..dcc5a4a Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/icons/star.png differ diff --git a/skin/DEOT/sys.py/gameshell/icons/sys.png b/skin/DEOT/sys.py/gameshell/icons/sys.png new file mode 100644 index 0000000..2321dee Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/icons/sys.png differ diff --git a/skin/DEOT/sys.py/gameshell/icons/tape.png b/skin/DEOT/sys.py/gameshell/icons/tape.png new file mode 100644 index 0000000..9177266 Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/icons/tape.png differ diff --git a/skin/DEOT/sys.py/gameshell/icons/vol.png b/skin/DEOT/sys.py/gameshell/icons/vol.png new file mode 100644 index 0000000..aed502a Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/icons/vol.png differ diff --git a/skin/DEOT/sys.py/gameshell/titlebar_icons/battery_unknown.png b/skin/DEOT/sys.py/gameshell/titlebar_icons/battery_unknown.png new file mode 100644 index 0000000..a1f4db7 Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/titlebar_icons/battery_unknown.png differ diff --git a/skin/DEOT/sys.py/gameshell/titlebar_icons/bluetooth.png b/skin/DEOT/sys.py/gameshell/titlebar_icons/bluetooth.png new file mode 100644 index 0000000..5bfce49 Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/titlebar_icons/bluetooth.png differ diff --git a/skin/DEOT/sys.py/gameshell/titlebar_icons/soundvolume.png b/skin/DEOT/sys.py/gameshell/titlebar_icons/soundvolume.png new file mode 100644 index 0000000..413e321 Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/titlebar_icons/soundvolume.png differ diff --git a/skin/DEOT/sys.py/gameshell/titlebar_icons/wifi.png b/skin/DEOT/sys.py/gameshell/titlebar_icons/wifi.png new file mode 100644 index 0000000..1b48d83 Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/titlebar_icons/wifi.png differ diff --git a/skin/DEOT/sys.py/gameshell/titlebar_icons/withcharging.png b/skin/DEOT/sys.py/gameshell/titlebar_icons/withcharging.png new file mode 100644 index 0000000..5672188 Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/titlebar_icons/withcharging.png differ diff --git a/skin/DEOT/sys.py/gameshell/titlebar_icons/without_charging.png b/skin/DEOT/sys.py/gameshell/titlebar_icons/without_charging.png new file mode 100644 index 0000000..48338ae Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/titlebar_icons/without_charging.png differ diff --git a/skin/DEOT/sys.py/gameshell/wallpaper/desktopbg.jpg b/skin/DEOT/sys.py/gameshell/wallpaper/desktopbg.jpg new file mode 100644 index 0000000..9be7a20 Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/wallpaper/desktopbg.jpg differ diff --git a/skin/DEOT/sys.py/gameshell/wallpaper/gameover.png b/skin/DEOT/sys.py/gameshell/wallpaper/gameover.png new file mode 100644 index 0000000..971022c Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/wallpaper/gameover.png differ diff --git a/skin/DEOT/sys.py/gameshell/wallpaper/loading.png b/skin/DEOT/sys.py/gameshell/wallpaper/loading.png new file mode 100644 index 0000000..e06064b Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/wallpaper/loading.png differ diff --git a/skin/DEOT/sys.py/gameshell/wallpaper/seeyou.png b/skin/DEOT/sys.py/gameshell/wallpaper/seeyou.png new file mode 100644 index 0000000..971022c Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/wallpaper/seeyou.png differ diff --git a/skin/DEOT/sys.py/gameshell/wallpaper/updating.png b/skin/DEOT/sys.py/gameshell/wallpaper/updating.png new file mode 100644 index 0000000..88a92c1 Binary files /dev/null and b/skin/DEOT/sys.py/gameshell/wallpaper/updating.png differ diff --git a/skin/DEOT/truetype/EurostileMN-ExtendedBold.pfb.ttf b/skin/DEOT/truetype/EurostileMN-ExtendedBold.pfb.ttf new file mode 100644 index 0000000..e9188fb Binary files /dev/null and b/skin/DEOT/truetype/EurostileMN-ExtendedBold.pfb.ttf differ diff --git a/skin/DEOT/truetype/EurostileMN-Medium.pfb.ttf b/skin/DEOT/truetype/EurostileMN-Medium.pfb.ttf new file mode 100644 index 0000000..50349ba Binary files /dev/null and b/skin/DEOT/truetype/EurostileMN-Medium.pfb.ttf differ diff --git a/skin/DEOT/truetype/NotoSansCJK-Regular.ttf b/skin/DEOT/truetype/NotoSansCJK-Regular.ttf new file mode 100644 index 0000000..271526f Binary files /dev/null and b/skin/DEOT/truetype/NotoSansCJK-Regular.ttf differ diff --git a/skin/DEOT/truetype/NotoSansMono-Regular.ttf b/skin/DEOT/truetype/NotoSansMono-Regular.ttf new file mode 100644 index 0000000..fd2546d Binary files /dev/null and b/skin/DEOT/truetype/NotoSansMono-Regular.ttf differ diff --git a/skin/DEOT/truetype/VarelaRound-Regular.ttf b/skin/DEOT/truetype/VarelaRound-Regular.ttf new file mode 100644 index 0000000..50349ba Binary files /dev/null and b/skin/DEOT/truetype/VarelaRound-Regular.ttf differ diff --git a/skin/DEOT/truetype/VeraMono.ttf b/skin/DEOT/truetype/VeraMono.ttf new file mode 100644 index 0000000..50349ba Binary files /dev/null and b/skin/DEOT/truetype/VeraMono.ttf differ diff --git a/skin/default/Menu/GameShell/20_Retro Games/Coleco.png b/skin/default/Menu/GameShell/20_Retro Games/Coleco.png new file mode 100644 index 0000000..066c818 Binary files /dev/null and b/skin/default/Menu/GameShell/20_Retro Games/Coleco.png differ diff --git a/skin/default/Menu/GameShell/20_Retro Games/Fuse.png b/skin/default/Menu/GameShell/20_Retro Games/Fuse.png new file mode 100644 index 0000000..112c7d7 Binary files /dev/null and b/skin/default/Menu/GameShell/20_Retro Games/Fuse.png differ diff --git a/skin/default/Menu/GameShell/20_Retro Games/GGEAR.png b/skin/default/Menu/GameShell/20_Retro Games/GGEAR.png new file mode 100644 index 0000000..23b92f0 Binary files /dev/null and b/skin/default/Menu/GameShell/20_Retro Games/GGEAR.png differ diff --git a/skin/default/Menu/GameShell/20_Retro Games/GPSP.png b/skin/default/Menu/GameShell/20_Retro Games/GPSP.png new file mode 100644 index 0000000..deafec9 Binary files /dev/null and b/skin/default/Menu/GameShell/20_Retro Games/GPSP.png differ diff --git a/skin/default/Menu/GameShell/20_Retro Games/LYNX.png b/skin/default/Menu/GameShell/20_Retro Games/LYNX.png new file mode 100644 index 0000000..289b69c Binary files /dev/null and b/skin/default/Menu/GameShell/20_Retro Games/LYNX.png differ diff --git a/skin/default/Menu/GameShell/20_Retro Games/MAME.png b/skin/default/Menu/GameShell/20_Retro Games/MAME.png new file mode 100644 index 0000000..0f800d7 Binary files /dev/null and b/skin/default/Menu/GameShell/20_Retro Games/MAME.png differ diff --git a/skin/default/Menu/GameShell/20_Retro Games/MGBA.png b/skin/default/Menu/GameShell/20_Retro Games/MGBA.png new file mode 100644 index 0000000..4e2dda6 Binary files /dev/null and b/skin/default/Menu/GameShell/20_Retro Games/MGBA.png differ diff --git a/skin/default/Menu/GameShell/20_Retro Games/NESTOPIA.png b/skin/default/Menu/GameShell/20_Retro Games/NESTOPIA.png new file mode 100644 index 0000000..086e694 Binary files /dev/null and b/skin/default/Menu/GameShell/20_Retro Games/NESTOPIA.png differ diff --git a/skin/default/Menu/GameShell/20_Retro Games/Pcsx+.png b/skin/default/Menu/GameShell/20_Retro Games/Pcsx+.png new file mode 100644 index 0000000..d05300d Binary files /dev/null and b/skin/default/Menu/GameShell/20_Retro Games/Pcsx+.png differ diff --git a/skin/default/Menu/GameShell/20_Retro Games/PicoDrive+.png b/skin/default/Menu/GameShell/20_Retro Games/PicoDrive+.png new file mode 100644 index 0000000..03ff9a8 Binary files /dev/null and b/skin/default/Menu/GameShell/20_Retro Games/PicoDrive+.png differ diff --git a/skin/default/Menu/GameShell/20_Retro Games/PocketSNES+.png b/skin/default/Menu/GameShell/20_Retro Games/PocketSNES+.png new file mode 100644 index 0000000..0a43e69 Binary files /dev/null and b/skin/default/Menu/GameShell/20_Retro Games/PocketSNES+.png differ diff --git a/skin/default/Menu/GameShell/20_Retro Games/SFC9X.png b/skin/default/Menu/GameShell/20_Retro Games/SFC9X.png new file mode 100644 index 0000000..7c38fdc Binary files /dev/null and b/skin/default/Menu/GameShell/20_Retro Games/SFC9X.png differ diff --git a/skin/default/Menu/GameShell/20_Retro Games/UAE+.png b/skin/default/Menu/GameShell/20_Retro Games/UAE+.png new file mode 100644 index 0000000..413ad01 Binary files /dev/null and b/skin/default/Menu/GameShell/20_Retro Games/UAE+.png differ diff --git a/skin/default/Menu/GameShell/20_Retro Games/gpSP+.png b/skin/default/Menu/GameShell/20_Retro Games/gpSP+.png new file mode 100644 index 0000000..deafec9 Binary files /dev/null and b/skin/default/Menu/GameShell/20_Retro Games/gpSP+.png differ diff --git a/skin/default/Menu/GameShell/20_Retro Games/mupen64+.png b/skin/default/Menu/GameShell/20_Retro Games/mupen64+.png new file mode 100644 index 0000000..8eec6f1 Binary files /dev/null and b/skin/default/Menu/GameShell/20_Retro Games/mupen64+.png differ diff --git a/skin/default/Menu/GameShell/21_Indie Games/2048.png b/skin/default/Menu/GameShell/21_Indie Games/2048.png new file mode 100644 index 0000000..ac58de0 Binary files /dev/null and b/skin/default/Menu/GameShell/21_Indie Games/2048.png differ diff --git a/skin/default/Menu/GameShell/21_Indie Games/Hurrican.png b/skin/default/Menu/GameShell/21_Indie Games/Hurrican.png new file mode 100644 index 0000000..42f1eff Binary files /dev/null and b/skin/default/Menu/GameShell/21_Indie Games/Hurrican.png differ diff --git a/skin/default/Menu/GameShell/21_Indie Games/No.909.png b/skin/default/Menu/GameShell/21_Indie Games/No.909.png new file mode 100644 index 0000000..673244d Binary files /dev/null and b/skin/default/Menu/GameShell/21_Indie Games/No.909.png differ diff --git a/skin/default/Menu/GameShell/21_Indie Games/NyanCat.png b/skin/default/Menu/GameShell/21_Indie Games/NyanCat.png new file mode 100644 index 0000000..028a752 Binary files /dev/null and b/skin/default/Menu/GameShell/21_Indie Games/NyanCat.png differ diff --git a/skin/default/Menu/GameShell/21_Indie Games/Planet-Busters.png b/skin/default/Menu/GameShell/21_Indie Games/Planet-Busters.png new file mode 100644 index 0000000..7581b14 Binary files /dev/null and b/skin/default/Menu/GameShell/21_Indie Games/Planet-Busters.png differ diff --git a/skin/default/Menu/GameShell/CaveStory.png b/skin/default/Menu/GameShell/CaveStory.png new file mode 100644 index 0000000..5faa2ee Binary files /dev/null and b/skin/default/Menu/GameShell/CaveStory.png differ diff --git a/skin/default/Menu/GameShell/ChocoDM.png b/skin/default/Menu/GameShell/ChocoDM.png new file mode 100644 index 0000000..1d6a9e3 Binary files /dev/null and b/skin/default/Menu/GameShell/ChocoDM.png differ diff --git a/skin/default/Menu/GameShell/Indie Games.png b/skin/default/Menu/GameShell/Indie Games.png new file mode 100644 index 0000000..deecb6b Binary files /dev/null and b/skin/default/Menu/GameShell/Indie Games.png differ diff --git a/skin/default/Menu/GameShell/Love2D.png b/skin/default/Menu/GameShell/Love2D.png new file mode 100644 index 0000000..1f125d8 Binary files /dev/null and b/skin/default/Menu/GameShell/Love2D.png differ diff --git a/skin/default/Menu/GameShell/LowResNX.png b/skin/default/Menu/GameShell/LowResNX.png new file mode 100644 index 0000000..15d2e68 Binary files /dev/null and b/skin/default/Menu/GameShell/LowResNX.png differ diff --git a/skin/default/Menu/GameShell/Music Player.png b/skin/default/Menu/GameShell/Music Player.png new file mode 100644 index 0000000..1d397ad Binary files /dev/null and b/skin/default/Menu/GameShell/Music Player.png differ diff --git a/skin/default/Menu/GameShell/PICO-8.png b/skin/default/Menu/GameShell/PICO-8.png new file mode 100644 index 0000000..4c437bb Binary files /dev/null and b/skin/default/Menu/GameShell/PICO-8.png differ diff --git a/skin/default/Menu/GameShell/PowerOFF.png b/skin/default/Menu/GameShell/PowerOFF.png new file mode 100644 index 0000000..3b05b4e Binary files /dev/null and b/skin/default/Menu/GameShell/PowerOFF.png differ diff --git a/skin/default/Menu/GameShell/Reload UI.png b/skin/default/Menu/GameShell/Reload UI.png new file mode 100644 index 0000000..28c504a Binary files /dev/null and b/skin/default/Menu/GameShell/Reload UI.png differ diff --git a/skin/default/Menu/GameShell/Retro Games.png b/skin/default/Menu/GameShell/Retro Games.png new file mode 100644 index 0000000..2733820 Binary files /dev/null and b/skin/default/Menu/GameShell/Retro Games.png differ diff --git a/skin/default/Menu/GameShell/RetroArch.png b/skin/default/Menu/GameShell/RetroArch.png new file mode 100644 index 0000000..b7bd33e Binary files /dev/null and b/skin/default/Menu/GameShell/RetroArch.png differ diff --git a/skin/default/Menu/GameShell/Settings.png b/skin/default/Menu/GameShell/Settings.png new file mode 100644 index 0000000..3e194ac Binary files /dev/null and b/skin/default/Menu/GameShell/Settings.png differ diff --git a/skin/default/Menu/GameShell/Sleep.png b/skin/default/Menu/GameShell/Sleep.png new file mode 100644 index 0000000..b2d7dd1 Binary files /dev/null and b/skin/default/Menu/GameShell/Sleep.png differ diff --git a/skin/default/Menu/GameShell/TIC-80.png b/skin/default/Menu/GameShell/TIC-80.png new file mode 100644 index 0000000..ef1aab4 Binary files /dev/null and b/skin/default/Menu/GameShell/TIC-80.png differ diff --git a/skin/default/Menu/GameShell/TinyCloud.png b/skin/default/Menu/GameShell/TinyCloud.png new file mode 100644 index 0000000..9ba0dff Binary files /dev/null and b/skin/default/Menu/GameShell/TinyCloud.png differ diff --git a/skin/default/Menu/GameShell/Utils.png b/skin/default/Menu/GameShell/Utils.png new file mode 100644 index 0000000..b9a7f7d Binary files /dev/null and b/skin/default/Menu/GameShell/Utils.png differ diff --git a/skin/default/Menu/GameShell/Warehouse.png b/skin/default/Menu/GameShell/Warehouse.png new file mode 100644 index 0000000..f658b28 Binary files /dev/null and b/skin/default/Menu/GameShell/Warehouse.png differ diff --git a/skin/default/Menu/GameShell/freeDM.png b/skin/default/Menu/GameShell/freeDM.png new file mode 100644 index 0000000..bf4d479 Binary files /dev/null and b/skin/default/Menu/GameShell/freeDM.png differ diff --git a/skin/default/sys.py/gameshell/blank.png b/skin/default/sys.py/gameshell/blank.png new file mode 100644 index 0000000..077c8a6 Binary files /dev/null and b/skin/default/sys.py/gameshell/blank.png differ diff --git a/skin/default/sys.py/gameshell/footbar_icons/footbar.png b/skin/default/sys.py/gameshell/footbar_icons/footbar.png new file mode 100644 index 0000000..954e2de Binary files /dev/null and b/skin/default/sys.py/gameshell/footbar_icons/footbar.png differ diff --git a/skin/default/sys.py/gameshell/icons/DialogBoxs.png b/skin/default/sys.py/gameshell/icons/DialogBoxs.png new file mode 100644 index 0000000..e38d227 Binary files /dev/null and b/skin/default/sys.py/gameshell/icons/DialogBoxs.png differ diff --git a/skin/default/sys.py/gameshell/icons/GS.png b/skin/default/sys.py/gameshell/icons/GS.png new file mode 100644 index 0000000..68b8aff Binary files /dev/null and b/skin/default/sys.py/gameshell/icons/GS.png differ diff --git a/skin/default/sys.py/gameshell/icons/_L.png b/skin/default/sys.py/gameshell/icons/_L.png new file mode 100644 index 0000000..58a2e95 Binary files /dev/null and b/skin/default/sys.py/gameshell/icons/_L.png differ diff --git a/skin/default/sys.py/gameshell/icons/_R.png b/skin/default/sys.py/gameshell/icons/_R.png new file mode 100644 index 0000000..d26a910 Binary files /dev/null and b/skin/default/sys.py/gameshell/icons/_R.png differ diff --git a/skin/default/sys.py/gameshell/icons/about_bg.png b/skin/default/sys.py/gameshell/icons/about_bg.png new file mode 100644 index 0000000..1fc0ee3 Binary files /dev/null and b/skin/default/sys.py/gameshell/icons/about_bg.png differ diff --git a/skin/default/sys.py/gameshell/icons/add.png b/skin/default/sys.py/gameshell/icons/add.png new file mode 100644 index 0000000..4ffcda7 Binary files /dev/null and b/skin/default/sys.py/gameshell/icons/add.png differ diff --git a/skin/default/sys.py/gameshell/icons/airwire.png b/skin/default/sys.py/gameshell/icons/airwire.png new file mode 100644 index 0000000..625d004 Binary files /dev/null and b/skin/default/sys.py/gameshell/icons/airwire.png differ diff --git a/skin/default/sys.py/gameshell/icons/app.png b/skin/default/sys.py/gameshell/icons/app.png new file mode 100644 index 0000000..3d3c2db Binary files /dev/null and b/skin/default/sys.py/gameshell/icons/app.png differ diff --git a/skin/default/sys.py/gameshell/icons/appdling.png b/skin/default/sys.py/gameshell/icons/appdling.png new file mode 100644 index 0000000..c4ab447 Binary files /dev/null and b/skin/default/sys.py/gameshell/icons/appdling.png differ diff --git a/skin/default/sys.py/gameshell/icons/blackheart.png b/skin/default/sys.py/gameshell/icons/blackheart.png new file mode 100644 index 0000000..2540295 Binary files /dev/null and b/skin/default/sys.py/gameshell/icons/blackheart.png differ diff --git a/skin/default/sys.py/gameshell/icons/blueselector.png b/skin/default/sys.py/gameshell/icons/blueselector.png new file mode 100644 index 0000000..82e285b Binary files /dev/null and b/skin/default/sys.py/gameshell/icons/blueselector.png differ diff --git a/skin/default/sys.py/gameshell/icons/buttonslayout.png b/skin/default/sys.py/gameshell/icons/buttonslayout.png new file mode 100644 index 0000000..99a2531 Binary files /dev/null and b/skin/default/sys.py/gameshell/icons/buttonslayout.png differ diff --git a/skin/default/sys.py/gameshell/icons/done.png b/skin/default/sys.py/gameshell/icons/done.png new file mode 100644 index 0000000..ceeadbf Binary files /dev/null and b/skin/default/sys.py/gameshell/icons/done.png differ diff --git a/skin/default/sys.py/gameshell/icons/empty.png b/skin/default/sys.py/gameshell/icons/empty.png new file mode 100644 index 0000000..7d8beb5 Binary files /dev/null and b/skin/default/sys.py/gameshell/icons/empty.png differ diff --git a/skin/default/sys.py/gameshell/icons/heart.png b/skin/default/sys.py/gameshell/icons/heart.png new file mode 100644 index 0000000..f9c6673 Binary files /dev/null and b/skin/default/sys.py/gameshell/icons/heart.png differ diff --git a/skin/default/sys.py/gameshell/icons/icon_sd.png b/skin/default/sys.py/gameshell/icons/icon_sd.png new file mode 100644 index 0000000..555d2d9 Binary files /dev/null and b/skin/default/sys.py/gameshell/icons/icon_sd.png differ diff --git a/skin/default/sys.py/gameshell/icons/light.png b/skin/default/sys.py/gameshell/icons/light.png new file mode 100644 index 0000000..f581a7b Binary files /dev/null and b/skin/default/sys.py/gameshell/icons/light.png differ diff --git a/skin/default/sys.py/gameshell/icons/lock.png b/skin/default/sys.py/gameshell/icons/lock.png new file mode 100644 index 0000000..1e9ac7a Binary files /dev/null and b/skin/default/sys.py/gameshell/icons/lock.png differ diff --git a/skin/default/sys.py/gameshell/icons/needwifi_bg.png b/skin/default/sys.py/gameshell/icons/needwifi_bg.png new file mode 100644 index 0000000..0a58c6b Binary files /dev/null and b/skin/default/sys.py/gameshell/icons/needwifi_bg.png differ diff --git a/skin/default/sys.py/gameshell/icons/online.png b/skin/default/sys.py/gameshell/icons/online.png new file mode 100644 index 0000000..8be6bc4 Binary files /dev/null and b/skin/default/sys.py/gameshell/icons/online.png differ diff --git a/skin/default/sys.py/gameshell/icons/pico8_md5_err.png b/skin/default/sys.py/gameshell/icons/pico8_md5_err.png new file mode 100644 index 0000000..8b281a1 Binary files /dev/null and b/skin/default/sys.py/gameshell/icons/pico8_md5_err.png differ diff --git a/skin/default/sys.py/gameshell/icons/pico8_notfound.png b/skin/default/sys.py/gameshell/icons/pico8_notfound.png new file mode 100644 index 0000000..f4f39af Binary files /dev/null and b/skin/default/sys.py/gameshell/icons/pico8_notfound.png differ diff --git a/skin/default/sys.py/gameshell/icons/rom_download.png b/skin/default/sys.py/gameshell/icons/rom_download.png new file mode 100644 index 0000000..a704d0f Binary files /dev/null and b/skin/default/sys.py/gameshell/icons/rom_download.png differ diff --git a/skin/default/sys.py/gameshell/icons/roundcorners.png b/skin/default/sys.py/gameshell/icons/roundcorners.png new file mode 100644 index 0000000..cd8fce6 Binary files /dev/null and b/skin/default/sys.py/gameshell/icons/roundcorners.png differ diff --git a/skin/default/sys.py/gameshell/icons/scale.png b/skin/default/sys.py/gameshell/icons/scale.png new file mode 100644 index 0000000..f7e2dd4 Binary files /dev/null and b/skin/default/sys.py/gameshell/icons/scale.png differ diff --git a/skin/default/sys.py/gameshell/icons/sheep_bg.png b/skin/default/sys.py/gameshell/icons/sheep_bg.png new file mode 100644 index 0000000..f373475 Binary files /dev/null and b/skin/default/sys.py/gameshell/icons/sheep_bg.png differ diff --git a/skin/default/sys.py/gameshell/icons/sheep_body.png b/skin/default/sys.py/gameshell/icons/sheep_body.png new file mode 100644 index 0000000..148ff46 Binary files /dev/null and b/skin/default/sys.py/gameshell/icons/sheep_body.png differ diff --git a/skin/default/sys.py/gameshell/icons/sheep_head.png b/skin/default/sys.py/gameshell/icons/sheep_head.png new file mode 100644 index 0000000..615246b Binary files /dev/null and b/skin/default/sys.py/gameshell/icons/sheep_head.png differ diff --git a/skin/default/sys.py/gameshell/icons/star.png b/skin/default/sys.py/gameshell/icons/star.png new file mode 100644 index 0000000..7910226 Binary files /dev/null and b/skin/default/sys.py/gameshell/icons/star.png differ diff --git a/skin/default/sys.py/gameshell/icons/sys.png b/skin/default/sys.py/gameshell/icons/sys.png new file mode 100644 index 0000000..aac76d3 Binary files /dev/null and b/skin/default/sys.py/gameshell/icons/sys.png differ diff --git a/skin/default/sys.py/gameshell/icons/tape.png b/skin/default/sys.py/gameshell/icons/tape.png new file mode 100644 index 0000000..f802820 Binary files /dev/null and b/skin/default/sys.py/gameshell/icons/tape.png differ diff --git a/skin/default/sys.py/gameshell/icons/vol.png b/skin/default/sys.py/gameshell/icons/vol.png new file mode 100644 index 0000000..49b56fe Binary files /dev/null and b/skin/default/sys.py/gameshell/icons/vol.png differ diff --git a/skin/default/sys.py/gameshell/icons/ware.png b/skin/default/sys.py/gameshell/icons/ware.png new file mode 100644 index 0000000..fbc955c Binary files /dev/null and b/skin/default/sys.py/gameshell/icons/ware.png differ diff --git a/skin/default/sys.py/gameshell/titlebar_icons/battery_unknown.png b/skin/default/sys.py/gameshell/titlebar_icons/battery_unknown.png new file mode 100644 index 0000000..24f681a Binary files /dev/null and b/skin/default/sys.py/gameshell/titlebar_icons/battery_unknown.png differ diff --git a/skin/default/sys.py/gameshell/titlebar_icons/bluetooth.png b/skin/default/sys.py/gameshell/titlebar_icons/bluetooth.png new file mode 100644 index 0000000..439166b Binary files /dev/null and b/skin/default/sys.py/gameshell/titlebar_icons/bluetooth.png differ diff --git a/skin/default/sys.py/gameshell/titlebar_icons/dlstatus18.png b/skin/default/sys.py/gameshell/titlebar_icons/dlstatus18.png new file mode 100644 index 0000000..0b3eab4 Binary files /dev/null and b/skin/default/sys.py/gameshell/titlebar_icons/dlstatus18.png differ diff --git a/skin/default/sys.py/gameshell/titlebar_icons/soundvolume.png b/skin/default/sys.py/gameshell/titlebar_icons/soundvolume.png new file mode 100644 index 0000000..0d3229b Binary files /dev/null and b/skin/default/sys.py/gameshell/titlebar_icons/soundvolume.png differ diff --git a/skin/default/sys.py/gameshell/titlebar_icons/wifi.png b/skin/default/sys.py/gameshell/titlebar_icons/wifi.png new file mode 100644 index 0000000..bc1e2c6 Binary files /dev/null and b/skin/default/sys.py/gameshell/titlebar_icons/wifi.png differ diff --git a/skin/default/sys.py/gameshell/titlebar_icons/withcharging.png b/skin/default/sys.py/gameshell/titlebar_icons/withcharging.png new file mode 100644 index 0000000..3b109a3 Binary files /dev/null and b/skin/default/sys.py/gameshell/titlebar_icons/withcharging.png differ diff --git a/skin/default/sys.py/gameshell/titlebar_icons/without_charging.png b/skin/default/sys.py/gameshell/titlebar_icons/without_charging.png new file mode 100644 index 0000000..ae46cd2 Binary files /dev/null and b/skin/default/sys.py/gameshell/titlebar_icons/without_charging.png differ diff --git a/skin/default/truetype/NotoSansCJK-Regular.ttf b/skin/default/truetype/NotoSansCJK-Regular.ttf new file mode 100644 index 0000000..271526f Binary files /dev/null and b/skin/default/truetype/NotoSansCJK-Regular.ttf differ diff --git a/skin/default/truetype/NotoSansMono-Regular.ttf b/skin/default/truetype/NotoSansMono-Regular.ttf new file mode 100644 index 0000000..fd2546d Binary files /dev/null and b/skin/default/truetype/NotoSansMono-Regular.ttf differ diff --git a/skin/default/truetype/VarelaRound-Regular.ttf b/skin/default/truetype/VarelaRound-Regular.ttf new file mode 100644 index 0000000..54fa9f9 Binary files /dev/null and b/skin/default/truetype/VarelaRound-Regular.ttf differ diff --git a/skin/default/truetype/VeraMono.ttf b/skin/default/truetype/VeraMono.ttf new file mode 100644 index 0000000..139f0b4 Binary files /dev/null and b/skin/default/truetype/VeraMono.ttf differ diff --git a/sys.py/UI/.above_all_patch.py.deot b/sys.py/UI/.above_all_patch.py.deot new file mode 100644 index 0000000..ab272bb --- /dev/null +++ b/sys.py/UI/.above_all_patch.py.deot @@ -0,0 +1,135 @@ +# -*- coding: utf-8 -*- + +import pygame + +from libs.roundrects import aa_round_rect + +import alsaaudio + +## local package import +from constants import ICON_TYPES,icon_ext,icon_width,icon_height,RUNEVT +from icon_item import IconItem +from page import Page,PageStack +from title_bar import TitleBar +from foot_bar import FootBar +from constants import Width,Height,bg_color +from util_funcs import midRect +from keys_def import CurKeys +from label import Label +from skin_manager import MySkinManager +from lang_manager import MyLangManager +from widget import Widget + + +class AboveAllPatch(Widget): + _PosX =Width/2 + _PosY =Height/2 + _Width =50 + _Height=120 + + _Text ="" + _FontObj= MyLangManager.TrFont("veramono20") + _Parent =None + _Color = MySkinManager.GiveColor('Text') + _ValColor = MySkinManager.GiveColor('Text') + _CanvasHWND = None + _TextSurf = None + _Icons = {} + _Value = 0 + + def __init__(self): + self._Icons = {} + + def Init(self): + pass + + def SetCanvasHWND(self,_canvashwnd): + self._CanvasHWND = _canvashwnd + + def Draw(self): + start_rect = midRect(self._PosX,self._PosY,self._Width,self._Height,Width,Height) + aa_round_rect(self._CanvasHWND,start_rect, self._Color,3,0, self._Color) + + if self._Value > 10: + vol_height = int(self._Height * (float( self._Value)/100.0)) + dheight = self._Height - vol_height + + vol_rect = pygame.Rect(self._PosX-self._Width/2, self._PosY-self._Height/2+dheight, self._Width, vol_height) + + aa_round_rect(self._CanvasHWND,vol_rect, self._ValColor,3,0, self._ValColor) + + else: + vol_height = 10 + dheight = self._Height - vol_height + vol_rect = pygame.Rect(self._PosX-self._Width/2, self._PosY-self._Height/2+dheight, self._Width, vol_height) + + aa_round_rect(self._CanvasHWND,vol_rect, self._ValColor,3,0, self._ValColor) + + +class SoundPatch(AboveAllPatch): + +# _Segs = [0,15,29, 45,55,65, 75,90,100] + snd_segs = [ [0,20],[21,40],[41,50],[51,60],[61,70],[71,85],[86,90],[91,95],[96,100] ] + _Needle = 0 + + def Init(self): + self.SetCanvasHWND(self._Parent._CanvasHWND) + + def VolumeUp(self): + m = alsaaudio.Mixer() + vol = m.getvolume()[0] + + # print("VolumeUp vol %d " % vol) + for i,v in enumerate(self.snd_segs): + if vol >= v[0] and vol <= v[1]: + self._Needle = i + break + + self._Needle += 1 + + if self._Needle > len(self.snd_segs) -1: + self._Needle = len(self.snd_segs) -1 + +# print("Set volume %d" % self.snd_segs[self._Needle][1] ) + m.setvolume( self.snd_segs[self._Needle][0] + (self.snd_segs[self._Needle][1] - self.snd_segs[self._Needle][0])/2 ) ## prefer bigger one + + self._Value = self.snd_segs[self._Needle][1] + +# print( self._Value) + return self._Value + + def VolumeDown(self): + m = alsaaudio.Mixer() + vol = m.getvolume()[0] + + for i,v in enumerate(self.snd_segs): + if vol >= v[0] and vol <= v[1]: + self._Needle = i + break + + self._Needle -= 1 + if self._Needle < 0: + self._Needle = 0 + + vol = self.snd_segs[self._Needle][0] ## prefer smaller one + + if vol < 0: + vol = 0 + m.setvolume(vol) + +# print(vol) + + self._Value = vol + return vol + + + def Draw(self): + # 200 total width + # h = 40 + for i in range(0,self._Needle+1): + #w = 10,h = 40 + vol_rect = pygame.Rect(80+i*20, self._Height/2+20,10, 40) + + pygame.draw.rect(self._CanvasHWND,self._ValColor,vol_rect,0) + #aa_round_rect(self._CanvasHWND,vol_rect,self._ValColor,3,0,self._ValColor) + diff --git a/sys.py/UI/.scroller.py b/sys.py/UI/.scroller.py new file mode 100644 index 0000000..9361ffd --- /dev/null +++ b/sys.py/UI/.scroller.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +import pygame + +from util_funcs import midRect + +from libs.roundrects import aa_round_rect + +from skin_manager import MySkinManager + +class ListScroller(object): + _PosX = 0 + _PosY = 0 + _Width = 7 + _Height = 0 + _MinHeight = 6 ## tested + _Parent = None + _Color = MySkinManager.GiveColor('Front') + + _StartX = 0 + _StartY = 0 + _EndX = 0 + _EndY = 0 + _Value = 0 + _CanvasHWND = None + + def __init__(self): + pass + + def Init(self): + self.SetCanvasHWND(self._Parent._CanvasHWND) + + def SetCanvasHWND(self,canvas): + self._CanvasHWND = canvas + + def AnimateDraw(self,x2,y2): + pass + + def UpdateSize(self,bigheight,dirtyheight): + bodyheight = float(self._Parent._Height) / float(bigheight) + if bodyheight > 1: + bodyheight = 1 ## 100% + + margin = 4 + self._Height = bodyheight * self._Parent._Height - margin ## Draw body + + if self._Height < self._MinHeight: + self._Height = self._MinHeight + + self._StartX = self._Width/2 + self._StartY = margin/2+self._Height/2 + + self._EndX = self._Width/2 + self._EndY = self._Parent._Height - margin/2 - self._Height/2 + + process = float(dirtyheight) / float(bigheight) + value = process* (self._EndY - self._StartY) + + self._Value = int(value) + + def Draw(self): + + start_rect = midRect(self._PosX+self._StartX,self._StartY+self._Value,self._Width,self._Height,self._Parent._Width,self._Parent._Height) + aa_round_rect(self._CanvasHWND,start_rect, self._Color,3,0, self._Color) diff --git a/sys.py/UI/.skin_manager.py b/sys.py/UI/.skin_manager.py new file mode 100644 index 0000000..7064d4e --- /dev/null +++ b/sys.py/UI/.skin_manager.py @@ -0,0 +1,165 @@ +# -*- coding: utf-8 -*- + +import pygame +import config +import ConfigParser + +from util_funcs import FileExists + +class CaseConfigParser(ConfigParser.SafeConfigParser): + def optionxform(self, optionstr): + return optionstr + +class SkinManager(object): + """ + _HighColor = pygame.Color(51,166,255) # #33a6ff + _TextColor = pygame.Color(83,83,83) # #535353 + _FrontColor = pygame.Color(131,199,219) ## light blue,#83c7db + _URLColor = pygame.Color(51,166,255) ## blue more #33a6ff + _LineColor = pygame.Color(169,169,169) # #a9a9a9 + _TitleBgColor = pygame.Color(228,228,228) # #e4e4e4 + _ActiveColor = pygame.Color(175,90,0) ## light brown #af5a00 + """ + + _Colors = {} + _Config = None + _Fonts = {} + DefaultSkin = "../skin/default" + + def __init__(self): + self.Init() + + def ConvertToRGB(self,hexstr): + + h = hexstr.lstrip('#') + return tuple(int(h[i:i+2], 16) for i in (0, 2 ,4)) + + def Init(self): + if not SkinManager._Colors: + self.SetColors() + if not SkinManager._Fonts: + self.SetFonts() + + def SetFonts(self): + if not pygame.font.get_init(): + pygame.font.init() + + skinpath = config.SKIN+"/truetype" + fonts_path = {} + fonts_path["varela"] = "%s/VarelaRound-Regular.ttf" % skinpath + print(fonts_path["varela"]) + fonts_path["veramono"] = "%s/VeraMono.ttf" % skinpath + fonts_path["noto"] = "%s/NotoSansMono-Regular.ttf" % skinpath + fonts_path["notocjk"] = "%s/NotoSansCJK-Regular.ttf" % skinpath + + for i in range(10,29): + self._Fonts["varela%d"%i] = pygame.font.Font(fonts_path["varela"],i) + + self._Fonts["varela34"] = pygame.font.Font(fonts_path["varela"],34) + self._Fonts["varela40"] = pygame.font.Font(fonts_path["varela"],40) + self._Fonts["varela120"] = pygame.font.Font(fonts_path["varela"],120) + + for i in range(10,26): + self._Fonts["veramono%d"%i] = pygame.font.Font(fonts_path["veramono"],i) + + for i in range(10,28): + self._Fonts["notosansmono%d"%i] = pygame.font.Font(fonts_path["noto"],i) + + for i in range(10,28): + self._Fonts["notosanscjk%d"%i] = pygame.font.Font(fonts_path["notocjk"],i) + + self._Fonts["arial"] = pygame.font.SysFont("arial",16) + + def SetColors(self): + Colors = {} + Colors["High"] = pygame.Color(51, 166, 255) + Colors["Text"] = pygame.Color(83, 83, 83) + Colors["ReadOnlyText"] = pygame.Color(130,130,130) + Colors["Front"] = pygame.Color(131, 199, 219) + Colors["URL"] = pygame.Color(51, 166, 255) + Colors["Line"] = pygame.Color(169, 169, 169) + Colors["TitleBg"] = pygame.Color(228, 228, 228) + Colors["Active"] = pygame.Color(175, 90, 0) + Colors["Disabled"] = pygame.Color(204, 204, 204) + Colors["White"] = pygame.Color(255, 255, 255) + Colors["Black"] = pygame.Color(0, 0, 0) + + SkinManager._Colors = Colors + + self._Config = CaseConfigParser() + + fname = config.SKIN+"/config.ini" + + try: + self._Config.read(fname) + except Exception, e: + print("read skin config.cfg error %s" % str(e)) + return + else: + if "Colors" in self._Config.sections(): + colour_opts = self._Config.options("Colors") +# print(colour_opts) + for i in SkinManager._Colors: + if i in colour_opts: + try: + SkinManager._Colors[i] = self.ConvertToRGB( + self._Config.get("Colors", i)) + except Exception, e: + print("error in ConvertToRGB %s" % str(e)) + continue + + def GiveFont(self,name): + return SkinManager._Fonts[name] + + def GiveColor(self,name): + if name in SkinManager._Colors: + return SkinManager._Colors[name] + else: + return pygame.Color(255,0,0) + + def GiveIcon(self,orig_file_or_dir): ## return is string,not Surface + #doing a wrapper for items under /home/cpi/apps/Menu/*, to be like Menu/GameShell/* + if orig_file_or_dir.startswith("/home/cpi/apps/Menu"): + orig_file_or_dir = orig_file_or_dir.replace("/home/cpi/apps/Menu/","../Menu/GameShell/") + + if orig_file_or_dir.startswith(".."): + ret = orig_file_or_dir.replace("..",config.SKIN) + if FileExists(ret) == False: + ret = orig_file_or_dir.replace("..",self.DefaultSkin) + else: + ret = config.SKIN+"/sys.py/"+orig_file_or_dir + if FileExists(ret) == False: + ret = self.DefaultSkin+"/sys.py/"+orig_file_or_dir + + if FileExists( ret ): + return ret + else: ## if not existed both in default or custom skin ,return where it is + return orig_file_or_dir + + def GiveWallpaper(self,png_name): + #first SKIN/wallpapers/xxxx.png + #second ../skin/default/wallpapers/xxxx.png + #finnal gameshell/wallpaper/xxxx.png + #loading.png,seeyou.png,updating.png,gameover.png,desktopbg.png + wlp = "/wallpaper/" + if FileExists(config.SKIN+wlp+png_name): + return config.SKIN+wlp+png_name + elif FileExists(self.DefaultSkin+wlp+png_name): + return self.DefaultSkin+wlp+png_name + else: + return "gameshell/wallpaper/"+png_name + + + +##global MySkinManager Handler +MySkinManager = None + +def InitMySkinManager(): + global MySkinManager + if MySkinManager == None: + MySkinManager = SkinManager() + + +InitMySkinManager() + + diff --git a/sys.py/UI/.slider.py b/sys.py/UI/.slider.py new file mode 100644 index 0000000..864ce0e --- /dev/null +++ b/sys.py/UI/.slider.py @@ -0,0 +1,40 @@ + + +class Slider(object): + _PosX = 0 + _PosY = 0 + _Width = 0 + _Height = 0 + + _Value = 0 + _CanvasHWND = None + + _Range = [] + + def __init__(self): + self._Range = [0,255] + + def Init(self): + self._Value = 0 + + def SetValue(self,v): + self._Value = int(v) + + def SetRange(self,m1,m2): + if m1 >= m2: + return + + self._Range[0] = m1 + self._Range[1] = m2 + + + def SetCanvasHWND(self,cav): + self._CanvasHWND = cav + + def KeyDown(self): + pass + + def Draw(self): + pass + + diff --git a/sys.py/UI/CommercialSoftwarePackage/__init__.py b/sys.py/UI/CommercialSoftwarePackage/__init__.py new file mode 100644 index 0000000..d4c1f0a --- /dev/null +++ b/sys.py/UI/CommercialSoftwarePackage/__init__.py @@ -0,0 +1,371 @@ +# -*- coding: utf-8 -*- + +""" +Package /home/cpi/games/xxx/yyy.zip ,only support in zip + +com_pkg_info /home/cpi/launcher/Menu/GameShell/xxxx/compkginfo.json +use https://jsonlint.com/ to validate first in case syntax err + +``` +{ +"NotFoundMsg":["Please Go to \n|None|varela14|True", +"https://www.lexaloffle.com/pico-8.php|URL|None|True|True", +"buy a pico-8 raspi and put zip into \n/home/cpi/games/PICO-8"] + +"MD5":{"pico-8_0.1.11g_raspi.zip":"a3f2995cf117499f880bd964d6a0e1f2","pico-8_0.1.11g_amd64.zip":"6726141c784afd4a41be6b7414c1b932"} +} + +``` + +""" + +import pygame +#import validators +import os +import commands +from UI.constants import Width,Height,ICON_TYPES,RUNEVT,RESTARTUI +#from UI.simple_name_space import SimpleNamespace +from UI.page import Page +from UI.label import Label +from UI.icon_item import IconItem +from UI.icon_pool import MyIconPool +from UI.keys_def import CurKeys,IsKeyMenuOrB,IsKeyStartOrA +from UI.skin_manager import MySkinManager +from UI.lang_manager import MyLangManager +from UI.text_bulletinboard import Textbulletinboard,Text +from UI.util_funcs import FileExists + + +class NotFoundPage(Page): + _FootMsg = ["Nav","","","Back",""] + _BG = "pico8_notfound" + _Leader = None + _Padding = pygame.Rect(0,12,0,6) + def Init(self): + self._PosX = self._Index*self._Screen._Width + self._Width = self._Screen._Width + self._Height = self._Screen._Height + + self._CanvasHWND = self._Screen._CanvasHWND + + self._BGpng = IconItem() + self._BGpng._ImgSurf = MyIconPool.GiveIconSurface(self._BG) + self._BGpng._MyType = ICON_TYPES["STAT"] + self._BGpng._Parent = self + #print( MyIconPool.Width(self._BG),MyIconPool.Height(self._BG) ) + self._BGpng.Adjust(0,0,MyIconPool.Width(self._BG),MyIconPool.Height(self._BG),0) + + self._Board = Textbulletinboard() + + self._Board._PosX = 4 + self._Board._PosY = 100 + self._Board._Width= self._Width - 4*2 + self._Board._Height = 200 + self._Board._CanvasHWND = self._CanvasHWND + self._Board._Align = "Center" + self._Board._RowPitch =28 + self._Board.Init() + + if self._Leader!= None and self._Leader._ComPkgInfo != None: + if "NotFoundMsg" in self._Leader._ComPkgInfo: + d = [] + for i, v in enumerate(self._Leader._ComPkgInfo["NotFoundMsg"]): + Color = None + Font = None + Bold = False + Und = False + Txt = "" + parts = v.split("|") + if len(parts) > 0: + Txt = parts[0] + + if len(parts) == 2: + if parts[1] != "None": + Color = MySkinManager.GiveColor(parts[1]) + elif len(parts) == 3: + if parts[1] != "None": + Color = MySkinManager.GiveColor(parts[1]) + if parts[2] != "None": + Font = MyLangManager.TrFont(parts[2]) + elif len(parts) == 4: + if parts[1] != "None": + Color = MySkinManager.GiveColor(parts[1]) + if parts[2] != "None": + Font = MyLangManager.TrFont(parts[2]) + if parts[3] == "True": + Bold = True + elif len(parts) == 5: + if parts[1] != "None": + Color = MySkinManager.GiveColor(parts[1]) + if parts[2] != "None": + Font = MyLangManager.TrFont(parts[2]) + if parts[3] == "True": + Bold = True + if parts[4] == "True": + Und = True + + a = Text(Txt,Color,Font,Bold,Und) + d = d + a.Words() + + self._Board.SetAndBlitText(d) + + def KeyDown(self,event): + if event.key == CurKeys["A"] or event.key == CurKeys["Menu"]: + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + return + + def Draw(self): + self.ClearCanvas() + if self._BGpng != None: + self._BGpng.NewCoord((self._Width-self._BGpng._Width)/2,self._Padding.y ) + self._BGpng.DrawTopLeft() + self._Board._PosY = self._BGpng._Height+self._Padding.y+self._Padding.h + else: + self._Board._PosY = self._Padding.y + + self._Board.Draw() + + +class HashErrPage(Page): + _FootMsg = ["Nav","","","Cancel","Continue"] + _BG ="pico8_md5_err" + + _Leader = None + _Padding = pygame.Rect(0,12,0,6) + + def Init(self): + self._PosX = self._Index*self._Screen._Width + self._Width = self._Screen._Width + self._Height = self._Screen._Height + + self._CanvasHWND = self._Screen._CanvasHWND + + self._BGpng = IconItem() + self._BGpng._ImgSurf = MyIconPool.GiveIconSurface(self._BG) + self._BGpng._MyType = ICON_TYPES["STAT"] + self._BGpng._Parent = self + self._BGpng.Adjust(0,0,MyIconPool.Width(self._BG),MyIconPool.Height(self._BG),0) + + self._Board = Textbulletinboard() + + self._Board._PosX = 4 + self._Board._PosY = self._Height/2 - 30 + self._Board._Width= self._Width - 4*2 + self._Board._Height = 100 + self._Board._CanvasHWND = self._CanvasHWND + self._Board._RowPitch =28 + self._Board._Align = "Center" + self._Board.Init() + + if self._Leader!= None and self._Leader._ComPkgInfo != None: + if "HashErrMsg" in self._Leader._ComPkgInfo: + d = [] + for i, v in enumerate(self._Leader._ComPkgInfo["HashErrMsg"]): + Color = None + Font = None + Bold = False + Und = False + Txt = "" + parts = v.split("|") + if len(parts) > 0: + Txt = parts[0] + + if len(parts) == 2: + if parts[1] != "None": + Color = MySkinManager.GiveColor(parts[1]) + elif len(parts) == 3: + if parts[1] != "None": + Color = MySkinManager.GiveColor(parts[1]) + if parts[2] != "None": + Font = MyLangManager.TrFont(parts[2]) + elif len(parts) == 4: + if parts[1] != "None": + Color = MySkinManager.GiveColor(parts[1]) + if parts[2] != "None": + Font = MyLangManager.TrFont(parts[2]) + if parts[3] == "True": + Bold = True + elif len(parts) == 5: + if parts[1] != "None": + Color = MySkinManager.GiveColor(parts[1]) + if parts[2] != "None": + Font = MyLangManager.TrFont(parts[2]) + if parts[3] == "True": + Bold = True + if parts[4] == "True": + Und = True + + a = Text(Txt,Color,Font,Bold,Und) + d = d + a.Words() + + self._Board.SetAndBlitText(d) + + else: + a = Text("MD5 check Failed!\n",None,MyLangManager.TrFont("varela16")) + b = Text("Do you want to continue?",None,MyLangManager.TrFont("varela16")) + self._Board.SetAndBlitText(a.Words()+b.Words()) + + def KeyDown(self,event): + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + return + + if IsKeyStartOrA(event.key): + self._Leader.InstallPackage(self._Screen) + return + + def OnLoadCb(self): + pass + + def Draw(self): + self.ClearCanvas() + if self._BGpng != None: + self._BGpng.NewCoord((self._Width-self._BGpng._Width)/2,self._Padding.y) + self._BGpng.DrawTopLeft() + self._Board._PosY = self._BGpng._Height+self._Padding.y+self._Padding.h + else: + self._Board._PosY = self._Padding.y + + self._Board.Draw() + + +class MyCommercialSoftwarePackage(object): + _ComPkgInfo = None + _Done = "" + _InvokeDir = "" + + def __init__(self): + pass + + def CheckPackage(self,main_screen):##detect zip files + ret = False + json_config = self._ComPkgInfo + if not json_config: + return ret + + cur_dir = os.getcwd() + + if FileExists(json_config["GameDir"]): + os.chdir(json_config["GameDir"]) + else: + os.system( "mkdir %s" % json_config["GameDir"] ) + + if "MD5" in json_config: + for i,v in enumerate(json_config["MD5"]): + if FileExists(v): + ret = True + break + + os.chdir(cur_dir) + return ret + + def InstallPackage(self,main_screen): + main_screen._MsgBox.SetText("Installing the package") + main_screen._MsgBox.Draw() + main_screen.SwapAndShow() + json_config = self._ComPkgInfo + cur_dir = os.getcwd() + + os.chdir(json_config["GameDir"]) + for i,v in enumerate(json_config["MD5"]): + if FileExists(v): + os.system("unzip -o %s" %v) ## auto overwrite + + if "Post-Up" in json_config: + if FileExists(self._InvokeDir): + os.chdir(self._InvokeDir) + + os.system(json_config["Post-Up"]) + + + os.chdir(cur_dir) + pygame.time.delay(1000) + + main_screen._MsgBox.SetText("Package Installed") + main_screen._MsgBox.Draw() + main_screen.SwapAndShow() + pygame.time.delay(500) + + pygame.event.post( pygame.event.Event(RESTARTUI, message="")) + + def VerifyPackage(self,main_screen): + ## do unzip and check md5sum once + + main_screen._MsgBox.SetText("Verify the package") + main_screen._MsgBox.Draw() + main_screen.SwapAndShow() + pygame.time.delay(400) + + Checked = False + + json_config = self._ComPkgInfo + if json_config == None: + return + + if "MD5" in json_config: + for i,v in enumerate(json_config["MD5"]): + #print(i,v) + if FileExists( os.path.join(json_config["GameDir"], v )): + print( os.path.join(json_config["GameDir"],v )) + out = commands.getstatusoutput("md5sum %s" % os.path.join(json_config["GameDir"],v)) + ret = out[1] + ret = ret.split(" ") + print(ret) + if ret[0] == json_config["MD5"][v]: + print("md5 is ok") + Checked = True + + return Checked + + return Checked + + def Init(self,main_screen): + self._Page1 = NotFoundPage() + self._Page1._Name = "Not Found" + self._Page1._Screen = main_screen + self._Page1._Leader = self + self._Page1.Init() + + self._Page2 = HashErrPage() + self._Page2._Name = "Md5sum check failed" + self._Page2._Screen = main_screen + self._Page2._Leader = self + self._Page2.Init() + + + def API(self,main_screen): + if main_screen !=None: + if self._Done != "": + #try to check if the installed package still there, if not ,remove the done flag file + if FileExists(os.path.join(self._ComPkgInfo["GameDir"],self._ComPkgInfo["InstallDir"] )) == False: + done_file = os.path.join( os.path.dirname(self._Done),".done") + if FileExists(done_file): + os.remove(done_file) + + main_screen._MsgBox.SetText("Starting") + main_screen._MsgBox.Draw() + main_screen.SwapAndShow() + pygame.time.delay(300) + #### + + pygame.event.post( pygame.event.Event(RUNEVT, message=self._Done)) + #### + else: + #print(self._ComPkgInfo) + #if FileExists( os.path.join(self._ComPkgInfo["GameDir"],self._ComPkgInfo["InstallDir"] )) == False: + if self.CheckPackage(main_screen) == False: + main_screen.PushPage(self._Page1) + main_screen.Draw() + main_screen.SwapAndShow() + else: + if self.VerifyPackage(main_screen) == False: + main_screen.PushPage(self._Page2) + main_screen.Draw() + main_screen.SwapAndShow() + else: + self.InstallPackage(main_screen) + diff --git a/sys.py/UI/Emulator/__init__.py b/sys.py/UI/Emulator/__init__.py new file mode 100644 index 0000000..fdf2935 --- /dev/null +++ b/sys.py/UI/Emulator/__init__.py @@ -0,0 +1,115 @@ +# -*- coding: utf-8 -*- + +import pygame +from pygame.locals import * +from sys import exit +import os +import sys + + +## local UI import +from UI.delete_confirm_page import DeleteConfirmPage +from UI.icon_pool import MyIconPool +from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB +from UI.lang_manager import MyLangManager + +from rom_list_page import RomListPage +from fav_list_page import FavListPage + +class FavDeleteConfirmPage(DeleteConfirmPage): + + def KeyDown(self,event): + + if IsKeyMenuOrB(event.key): + + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + + if IsKeyStartOrA(event.key): + try: + #self._FileName + stats = os.stat(self._FileName) + os.chown(self._FileName, stats.st_uid,stats.st_uid) ## normally uid and gid should be the same + except: + print("error in FavDeleteConfirmPage chown ") + + self.SnapMsg(MyLangManager.Tr("Deleteing")) + self._Screen.Draw() + self._Screen.SwapAndShow() + self.Reset() + + pygame.time.delay(300) + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + print(self._FileName) + + +class MyEmulator(object): + + _Icons = {} + RomListPage = None + FavListPage = None + _Emulator = None + + _FavGID = 31415 + _FavGname = "cpifav" + + def __init__(self): + self._Icons = {} + + def load_icons(self): + """ + basepath = os.path.dirname(os.path.realpath(__file__)) + files = os.listdir(basepath+"/icons") + for i in files: + if os.path.isfile(basepath+"/"+i) and i.endswith(".png"): + keyname = i.split(".")[0] + self._Icons[keyname] = pygame.image.load(basepath+"/"+i).convert_alpha() + """ + self._Icons["sys"] = MyIconPool.GiveIconSurface("sys") + + + def InitDeleteConfirmPage(self,main_screen): + self.DeleteConfirmPage = DeleteConfirmPage() + self.DeleteConfirmPage._Screen = main_screen + self.DeleteConfirmPage._Name = "DeleteConfirm" + self.DeleteConfirmPage.Init() + + self.FavDeleteConfirmPage = FavDeleteConfirmPage() + self.FavDeleteConfirmPage._Screen = main_screen + self.FavDeleteConfirmPage._Name = "DeleteConfirm" + self.FavDeleteConfirmPage.Init() + + def InitFavListPage(self,main_screen): + self.FavListPage = FavListPage() + self.FavListPage._Screen = main_screen + self.FavListPage._Name = "FavouriteGames" + self.FavListPage._Emulator = self._Emulator + self.FavListPage._Parent = self + + self.FavListPage.Init() + + def InitRomListPage(self,main_screen): + self.RomListPage = RomListPage() + self.RomListPage._Screen = main_screen + self.RomListPage._Name = self._Emulator["TITLE"] + self.RomListPage._Emulator = self._Emulator + self.RomListPage._Parent = self + self.RomListPage.Init() + + def Init(self,main_screen): + self.load_icons() + self.InitDeleteConfirmPage(main_screen) + self.InitRomListPage(main_screen) + self.InitFavListPage(main_screen) + + def API(self,main_screen): + if main_screen !=None: + main_screen.PushCurPage() + main_screen.SetCurPage(self.RomListPage) + main_screen.Draw() + main_screen.SwapAndShow() diff --git a/sys.py/UI/Emulator/fav_list_page.py b/sys.py/UI/Emulator/fav_list_page.py new file mode 100644 index 0000000..d49191e --- /dev/null +++ b/sys.py/UI/Emulator/fav_list_page.py @@ -0,0 +1,481 @@ +# -*- coding: utf-8 -*- + +import os +import pygame +import glob +import time +from libs.roundrects import aa_round_rect + +## local UI import +from UI.constants import Width,Height,ICON_TYPES,RUNEVT +from UI.page import Page,PageSelector +from UI.label import Label +from UI.icon_item import IconItem +from UI.util_funcs import midRect,CmdClean,FileExists +from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB +from UI.multi_icon_item import MultiIconItem +from UI.icon_pool import MyIconPool +from UI.scroller import ListScroller +from UI.skin_manager import MySkinManager +from UI.lang_manager import MyLangManager + +from rom_so_confirm_page import RomSoConfirmPage + +from list_item import ListItem + + +class FavStack: + _Emulator = None + + def __init__(self): + self.stack = list() + + def Push(self,data): + if data not in self.stack: + self.stack.append(data) + return True + return False + + def Pop(self): + if len(self.stack)<=0: + return None,False + return self.stack.pop(),True + + def Last(self): + idx = len(self.stack) -1 + if idx < 0:## empty stack,return root path + return self._Emulator["ROM"] + else: + return self.stack[ idx ] + + def Length(self): + return len(self.stack) + +class ListPageSelector(PageSelector): + _BackgroundColor = MySkinManager.GiveColor('Front') + + def __init__(self): + self._PosX = 0 + self._PosY = 0 + self._Height = 0 + self._Width = Width-12 + + def AnimateDraw(self,x2,y2): + pass + + def Draw(self): + idx = self._Parent._PsIndex + if idx > (len(self._Parent._MyList)-1): + idx = len(self._Parent._MyList) + if idx > 0: + idx -=1 + elif idx == 0:##nothing in _MyList + return + + self._Parent._PsIndex = idx #sync PsIndex + + x = self._Parent._MyList[idx]._PosX+2 + y = self._Parent._MyList[idx]._PosY+1 + h = self._Parent._MyList[idx]._Height -3 + + self._PosX = x + self._PosY = y + self._Height = h + + aa_round_rect(self._Parent._CanvasHWND, + (x,y,self._Width-4,h),self._BackgroundColor,4,0,self._BackgroundColor) + + + +class FavListPage(Page): + + _Icons = {} + _Selector=None + _FootMsg = ["Nav","Remove","Scan","","Run"] + _MyList = [] + _ListFont = MyLangManager.TrFont("notosanscjk15") + _MyStack = None + _Emulator = None + _Parent = None + _Scroller = None + _Scrolled = 0 + _BGwidth = 75 + _BGheight = 73 + _RomSoConfirmDownloadPage = None + + + def __init__(self): + Page.__init__(self) + self._Icons = {} + self._CanvasHWND = None + self._MyList = [] + self._MyStack = FavStack() + self._Emulator = {} + + def GeneratePathList(self,path): + if os.path.isdir(path) == False: + return False + + + files_path = glob.glob(path+"/*") + + ret = [] + + for i ,v in enumerate(files_path): + dirmap = {} + if os.path.isdir(v) and self._Emulator["FILETYPE"] == "dir": ## like DOSBOX + gameshell_bat = self._Emulator["EXT"][0] + if FileExists(v+"/"+gameshell_bat): + stats = os.stat(v) + if stats.st_gid != self._Parent._FavGID: ## only favs + continue + try: + dirmap["gamedir"] = v.decode("utf8","ignore") + except: + dirmap["gamedir"] = v.decode("ascii","ignore") + + ret.append(dirmap) + if os.path.isfile(v) and self._Emulator["FILETYPE"] == "file": + stats = os.stat(v) + if stats.st_gid != self._Parent._FavGID: ## only favs + continue + bname = os.path.basename(v) ### filter extension + if len(bname)> 1: + pieces = bname.split(".") + if len(pieces) > 1: + if pieces[ len(pieces)-1 ].lower() in self._Emulator["EXT"]: + try: + dirmap["file"] = v.decode("utf8","ignore") + except: + dirmap["file"] = v.decode("ascii","ignore") + + ret.append(dirmap) + +# else: +# print("not file or dir") + + + return ret + + def SyncList(self,path): + + alist = self.GeneratePathList(path) + + if alist == False: + print("listfiles return false") + return +# print("fav list alist: ") +# print(alist) + + self._MyList = [] + start_x = 0 + start_y = 0 + hasparent = 0 + if self._MyStack.Length() > 0: + hasparent = 1 + li = ListItem() + li._Parent = self + li._PosX = start_x + li._PosY = start_y + li._Width = Width + li._Fonts["normal"] = self._ListFont + li._MyType = ICON_TYPES["DIR"] + li._Parent = self + li.Init("[..]") + self._MyList.append(li) + + for i,v in enumerate(sorted(alist)): + li = ListItem() + li._Parent = self + li._PosX = start_x + li._PosY = start_y + (i+hasparent)*ListItem._Height + li._Width = Width + li._Fonts["normal"] = self._ListFont + li._MyType = ICON_TYPES["FILE"] + li._Parent = self + if "directory" in v: + li._MyType = ICON_TYPES["DIR"] + li.Init(v["directory"]) + elif "file" in v: + li.Init(v["file"]) + + elif "gamedir" in v: + li.Init(v["gamedir"]) + else: + li.Init("NoName") + + self._MyList.append(li) + + + + def Init(self): + self._PosX = self._Index * self._Screen._Width + self._Width = self._Screen._Width + self._Height = self._Screen._Height + + self._CanvasHWND = self._Screen._CanvasHWND + + ps = ListPageSelector() + ps._Parent = self + self._Ps = ps + self._PsIndex = 0 + + self.SyncList(self._Emulator["ROM"]) + + self._MyStack._Emulator = self._Emulator + + icon_for_list = MultiIconItem() + icon_for_list._ImgSurf = self._Parent._Icons["sys"] + icon_for_list._MyType = ICON_TYPES["STAT"] + icon_for_list._Parent = self + icon_for_list.Adjust(0,0,18,18,0) + + self._Icons["sys"] = icon_for_list + + + bgpng = IconItem() + bgpng._ImgSurf = MyIconPool.GiveIconSurface("star") + bgpng._MyType = ICON_TYPES["STAT"] + bgpng._Parent = self + bgpng.AddLabel(MyLangManager.Tr("MyFavGames"), MyLangManager.TrFont("varela18")) + bgpng.SetLableColor(MySkinManager.GiveColor('Disabled')) + bgpng.Adjust(0,0,self._BGwidth,self._BGheight,0) + + self._Icons["bg"] = bgpng + + self._Scroller = ListScroller() + self._Scroller._Parent = self + self._Scroller._PosX = self._Width - 10 + self._Scroller._PosY = 2 + self._Scroller.Init() + + rom_so_confirm_page = RomSoConfirmPage() + rom_so_confirm_page._Screen = self._Screen + rom_so_confirm_page._Name = "Download Confirm" + rom_so_confirm_page._Parent = self + rom_so_confirm_page.Init() + + self._RomSoConfirmDownloadPage = rom_so_confirm_page + + def ScrollUp(self): + if len(self._MyList) == 0: + return + + tmp = self._PsIndex + self._PsIndex -= self._ScrollStep + + if self._PsIndex < 0: + self._PsIndex = 0 + dy = tmp - self._PsIndex + cur_li = self._MyList[self._PsIndex] + if cur_li._PosY < 0: + for i in range(0, len(self._MyList)): + self._MyList[i]._PosY += self._MyList[i]._Height*dy + self._Scrolled +=dy + + def ScrollDown(self): + if len(self._MyList) == 0: + return + tmp = self._PsIndex + self._PsIndex +=self._ScrollStep + if self._PsIndex >= len(self._MyList): + self._PsIndex = len(self._MyList) -1 + + dy = self._PsIndex - tmp + cur_li = self._MyList[self._PsIndex] + if cur_li._PosY +cur_li._Height > self._Height: + for i in range(0,len(self._MyList)): + self._MyList[i]._PosY -= self._MyList[i]._Height*dy + self._Scrolled -= dy + + def SyncScroll(self): + ## + if self._Scrolled == 0: + return + + if self._PsIndex < len(self._MyList): + cur_li = self._MyList[self._PsIndex] + if self._Scrolled > 0: + if cur_li._PosY < 0: + for i in range(0, len(self._MyList)): + self._MyList[i]._PosY += self._Scrolled * self._MyList[i]._Height + elif self._Scrolled < 0: + if cur_li._PosY +cur_li._Height > self._Height: + for i in range(0,len(self._MyList)): + self._MyList[i]._PosY += self._Scrolled * self._MyList[i]._Height + + def Click(self): + + if len(self._MyList) == 0: + return + + if self._PsIndex > len(self._MyList) - 1: + return + + cur_li = self._MyList[self._PsIndex] + + if cur_li._MyType == ICON_TYPES["DIR"]: + return + + if cur_li._MyType == ICON_TYPES["FILE"]: + self._Screen._MsgBox.SetText("Launching") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + if self._Emulator["FILETYPE"] == "dir": + path = cur_li._Path +"/"+self._Emulator["EXT"][0] + else: + path = cur_li._Path + + print("Run ",path) + + if self._Emulator["FILETYPE"] == "dir": + escaped_path = CmdClean(path) + else: + escaped_path = CmdClean(path) + + custom_config = "" + if self._Emulator["RETRO_CONFIG"] != "" and len(self._Emulator["RETRO_CONFIG"]) > 5: + custom_config = " -c " + self._Emulator["RETRO_CONFIG"] + + cmdpath = " ".join( (self._Emulator["LAUNCHER"],self._Emulator["ROM_SO"], custom_config, escaped_path)) + + if self._Emulator["ROM_SO"] =="": #empty means No needs for rom so + pygame.event.post( pygame.event.Event(RUNEVT, message=cmdpath)) + else: + if FileExists(self._Emulator["ROM_SO"].split(" ")[0]): + pygame.event.post( pygame.event.Event(RUNEVT, message=cmdpath)) + else: + self._Screen.PushPage(self._RomSoConfirmDownloadPage) + self._Screen.Draw() + self._Screen.SwapAndShow() + + return + + self._Screen.Draw() + self._Screen.SwapAndShow() + + def ReScan(self): + if self._MyStack.Length() == 0: + self.SyncList(self._Emulator["ROM"]) + else: + self.SyncList( self._MyStack.Last() ) + + idx = self._PsIndex + if idx > (len(self._MyList)-1): + idx = len(self._MyList) + if idx > 0: + idx -=1 + elif idx == 0:##nothing in _MyList + pass + + self._PsIndex = idx ## sync PsIndex + + self.SyncScroll() + + + def OnReturnBackCb(self): + self.ReScan() + self._Screen.Draw() + self._Screen.SwapAndShow() + + def OnLoadCb(self): + self.ReScan() + self._Screen.Draw() + self._Screen.SwapAndShow() + + def SpeedScroll(self, thekey): + if self._Screen._LastKey == thekey: + self._ScrollStep+=1 + if self._ScrollStep >=5: + self._ScrollStep = 5 + else: + self._ScrollStep = 1 + + cur_time = time.time() + + if cur_time - self._Screen._LastKeyDown > 0.3: + self._ScrollStep = 1 + + def KeyDown(self,event): + + if IsKeyMenuOrB(event.key) or event.key == CurKeys["Left"]: + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + + if event.key == CurKeys["Up"]: + self.SpeedScroll(event.key) + self.ScrollUp() + self._Screen.Draw() + self._Screen.SwapAndShow() + if event.key == CurKeys["Down"]: + self.SpeedScroll(event.key) + self.ScrollDown() + self._Screen.Draw() + self._Screen.SwapAndShow() + + + if IsKeyStartOrA(event.key): + self.Click() + + + if event.key == CurKeys["X"]: #Scan current + self.ReScan() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Y"]: #del + if len(self._MyList) == 0: + return + + cur_li = self._MyList[self._PsIndex] + if cur_li.IsFile(): + """ + #self._Parent.FavDeleteConfirmPage.SetFileName(cur_li._Path) + #self._Parent.FavDeleteConfirmPage.SetTrashDir(self._Emulator["ROM"])## Fav delete,return to ROM dir,not .Trash + #self._Screen.PushCurPage() + #self._Screen.SetCurPage(self._Parent.FavDeleteConfirmPage) + #self._Screen.Draw() + #self._Screen.SwapAndShow() + """ + + #delete directly without confirm dialog + stats = os.stat(cur_li._Path) + os.chown(cur_li._Path, stats.st_uid,stats.st_uid) ## normally uid and gid should be the same + self._Screen._MsgBox.SetText("Deleting") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + pygame.time.delay(600) + self.ReScan() + self._Screen.Draw() + self._Screen.SwapAndShow() + + def Draw(self): + self.ClearCanvas() + + if len(self._MyList) == 0: + self._Icons["bg"].NewCoord(self._Width/2,self._Height/2) + self._Icons["bg"].Draw() + else: + if len(self._MyList) * ListItem._Height > self._Height: + self._Ps._Width = self._Width - 10 + self._Ps.Draw() + + for i in self._MyList: + if i._PosY > self._Height + self._Height/2: + break + + if i._PosY < 0: + continue + + i.Draw() + + self._Scroller.UpdateSize( len(self._MyList)*ListItem._Height, self._PsIndex*ListItem._Height) + self._Scroller.Draw() + + else: + self._Ps._Width = self._Width + self._Ps.Draw() + for i in self._MyList: + i.Draw() diff --git a/sys.py/UI/Emulator/list_item.py b/sys.py/UI/Emulator/list_item.py new file mode 100644 index 0000000..e51464d --- /dev/null +++ b/sys.py/UI/Emulator/list_item.py @@ -0,0 +1,117 @@ +# -*- coding: utf-8 -*- + +import pygame +#from beeprint import pp +import os + +## local UI import +from UI.constants import ICON_TYPES +from UI.page import Page +from UI.label import Label +from UI.icon_item import IconItem +from UI.util_funcs import midRect +from UI.skin_manager import MySkinManager + +# a item for List +# - - - - - - - - - - - -- +# | Icon Text..... > | +# ------------------------ + + +class ListItemIcon(IconItem): + + _CanvasHWND = None + _Parent = None + _Width = 18 + _Height = 18 + + def Draw(self): + self._CanvasHWND.blit(self._ImgSurf,(self._PosX,self._PosY+(self._Parent._Height-self._Height)/2,self._Width,self._Height)) + +class ListItem(object): + _PosX = 0 + _PosY = 0 + _Width = 0 + _Height = 32 + + _Labels = {} + _Icons = {} + _Fonts = {} + _MyType = ICON_TYPES["EXE"] + _LinkObj = None + _Path = "" + _Active = False + _Playing = False ## play or pause + _Parent = None + + def __init__(self): + self._Labels = {} + self._Icons = {} + self._Fonts = {} + + def IsFile(self): + if self._MyType == ICON_TYPES["FILE"]: + return True + + return False + def IsDir(self): + if self._MyType == ICON_TYPES["DIR"]: + return True + + return False + + def Init(self,text): + + #self._Fonts["normal"] = fonts["veramono12"] + + l = Label() + l._PosX = 20 + l.SetCanvasHWND(self._Parent._CanvasHWND) + + if self._MyType == ICON_TYPES["DIR"] or self._MyType == ICON_TYPES["FILE"]: + self._Path = text + + label_text = os.path.basename(text) + alias_file = os.path.splitext(text)[0] + ".alias" + if os.path.isfile(alias_file.encode("utf8")): + fp = open(alias_file.encode("utf8"), "r") + alias = fp.read() + fp.close() + label_text = alias.decode("utf8") + + if self._MyType == ICON_TYPES["DIR"]: + l.Init(label_text,self._Fonts["normal"]) + else: + l.Init(label_text,self._Fonts["normal"]) + + + self._Labels["Text"] = l + + + + def Draw(self): + if self._Path != "[..]": + self._Labels["Text"]._PosX = 23 + else: + self._Labels["Text"]._PosX = 3 + + self._Labels["Text"]._PosY = self._PosY + (self._Height - self._Labels["Text"]._Height)/2 + self._Labels["Text"].Draw() + + """ + if self._Active == True: + pass + """ + if self._MyType == ICON_TYPES["DIR"] and self._Path != "[..]": + self._Parent._Icons["sys"]._IconIndex = 0 + self._Parent._Icons["sys"].NewCoord(self._PosX+12,self._PosY+ (self._Height - self._Parent._Icons["sys"]._Height)/2+self._Parent._Icons["sys"]._Height/2) + self._Parent._Icons["sys"].Draw() + + if self._MyType == ICON_TYPES["FILE"]: + self._Parent._Icons["sys"]._IconIndex = 1 + self._Parent._Icons["sys"].NewCoord(self._PosX+12,self._PosY+ (self._Height - self._Parent._Icons["sys"]._Height)/2+self._Parent._Icons["sys"]._Height/2) + self._Parent._Icons["sys"].Draw() + + pygame.draw.line(self._Parent._CanvasHWND,MySkinManager.GiveColor('Line'),(self._PosX,self._PosY+self._Height-1),(self._PosX+self._Width,self._PosY+self._Height-1),1) + + diff --git a/sys.py/UI/Emulator/rom_list_page.py b/sys.py/UI/Emulator/rom_list_page.py new file mode 100644 index 0000000..6ba45ff --- /dev/null +++ b/sys.py/UI/Emulator/rom_list_page.py @@ -0,0 +1,531 @@ +# -*- coding: utf-8 -*- + +import os +import pygame + +import glob +import re +import shutil +import gobject +import validators +#from pySmartDL import SmartDL +import time + +from libs.roundrects import aa_round_rect + +## local UI import +from UI.constants import Width,Height,ICON_TYPES,RUNEVT +from UI.page import Page,PageSelector +from UI.label import Label +from UI.icon_item import IconItem +from UI.util_funcs import midRect,CmdClean,FileExists +from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB +from UI.multi_icon_item import MultiIconItem +from UI.icon_pool import MyIconPool +from UI.scroller import ListScroller +from UI.skin_manager import MySkinManager +from UI.lang_manager import MyLangManager + +from rom_so_confirm_page import RomSoConfirmPage + +from UI.Emulator.list_item import ListItem +import config + +class RomStack: + _Emulator = None + + def __init__(self): + self.stack = list() + + def Push(self,data): + if data not in self.stack: + self.stack.append(data) + return True + return False + + def Pop(self): + if len(self.stack)<=0: + return None,False + return self.stack.pop(),True + + def Last(self): + idx = len(self.stack) -1 + if idx < 0:## empty stack,return root path + return self._Emulator["ROM"] + else: + return self.stack[ idx ] + + def Length(self): + return len(self.stack) + +class ListPageSelector(PageSelector): + _BackgroundColor = MySkinManager.GiveColor('Front') + + def __init__(self): + self._PosX = 0 + self._PosY = 0 + self._Height = 0 + self._Width = Width-12 + + def AnimateDraw(self,x2,y2): + pass + + def Draw(self): + idx = self._Parent._PsIndex + if idx > (len(self._Parent._MyList)-1): + idx = len(self._Parent._MyList) + if idx > 0: + idx -=1 + elif idx == 0:##nothing in _MyList + return + + self._Parent._PsIndex = idx ## sync PsIndex + + x = self._Parent._MyList[idx]._PosX+2 + y = self._Parent._MyList[idx]._PosY+1 + h = self._Parent._MyList[idx]._Height -3 + + self._PosX = x + self._PosY = y + self._Height = h + + aa_round_rect(self._Parent._CanvasHWND, + (x,y,self._Width-4,h),self._BackgroundColor,4,0,self._BackgroundColor) + + + +class RomListPage(Page): + + _Icons = {} + _Selector=None + _FootMsg = ["Nav","Del","Scan","Back","Run","AddFav"] + _MyList = [] + _ListFont = MyLangManager.TrFont("notosanscjk15") + _MyStack = None + _Emulator = None + _Parent = None + + _Scroller = None + + _Scrolled = 0 + + _BGwidth = 56 + _BGheight = 70 + + _RomSoConfirmDownloadPage = None + + + def __init__(self): + Page.__init__(self) + + self._Icons = {} + self._CanvasHWND = None + self._MyList = [] + self._MyStack = RomStack() + self._Emulator = {} + + def GeneratePathList(self,path): + if os.path.isdir(path) == False: + return False + + + files_path = glob.glob(path+"/*") + + ret = [] + + for i ,v in enumerate(files_path): + dirmap = {} + if os.path.isdir(v) and self._Emulator["FILETYPE"] == "dir": ## like DOSBOX + gameshell_bat = self._Emulator["EXT"][0] + + stats = os.stat(v) + if stats.st_gid == self._Parent._FavGID: ##skip fav roms + continue + + if FileExists(v+"/"+gameshell_bat): + try: + dirmap["gamedir"] = v.decode("utf8","ignore") + except: + dirmap["gamedir"] = v.decode("ascii","ignore") + + ret.append(dirmap) + if os.path.isfile(v) and self._Emulator["FILETYPE"] == "file": + stats = os.stat(v) + if stats.st_gid == self._Parent._FavGID: ##skip fav roms + continue + + bname = os.path.basename(v) ### filter extension + if len(bname)> 1: + is_excluded = False + for exclude_ext in self._Emulator["EXCLUDE"]:## only compares filename endswith ext in EXCLUDE,splited by , + if len(exclude_ext) > 1 and bname.endswith(exclude_ext): + is_excluded = True + break + + if not is_excluded: + pieces = bname.split(".") + if len(pieces) > 1: + if pieces[ len(pieces)-1 ].lower() in self._Emulator["EXT"]: + try: + dirmap["file"] = v.decode("utf8","ignore") + except: + dirmap["file"] = v.decode("ascii","ignore") + + ret.append(dirmap) +# else: +# print("not file or dir") + + + return ret + + def SyncList(self,path): + + alist = self.GeneratePathList(path) + + if alist == False: + print("listfiles return false") + return + + self._MyList = [] + start_x = 0 + start_y = 0 + hasparent = 0 + if self._MyStack.Length() > 0: + hasparent = 1 + li = ListItem() + li._Parent = self + li._PosX = start_x + li._PosY = start_y + li._Width = Width + li._Fonts["normal"] = self._ListFont + li._MyType = ICON_TYPES["DIR"] + li._Parent = self + li.Init("[..]") + self._MyList.append(li) + + for i,v in enumerate(sorted(alist)): + li = ListItem() + li._Parent = self + li._PosX = start_x + li._PosY = start_y + (i+hasparent)*ListItem._Height + li._Width = Width + li._Fonts["normal"] = self._ListFont + li._MyType = ICON_TYPES["FILE"] + + li._Parent = self + + if "directory" in v: + li._MyType = ICON_TYPES["DIR"] + li.Init(v["directory"]) + elif "file" in v: + li.Init(v["file"]) + elif "gamedir" in v: + li.Init(v["gamedir"]) + else: + li.Init("NoName") + + + self._MyList.append(li) + + + def Init(self): + self._PosX = self._Index * self._Screen._Width + self._Width = self._Screen._Width + self._Height = self._Screen._Height + + self._CanvasHWND = self._Screen._CanvasHWND + + ps = ListPageSelector() + ps._Parent = self + self._Ps = ps + self._PsIndex = 0 + + self.SyncList(self._Emulator["ROM"]) + + ### will also mkdir of the ***ROM self + try: + os.makedirs(self._Emulator["ROM"]+"/.Trash") + except OSError: + if not os.path.isdir(self._Emulator["ROM"]+"/.Trash"): + raise + + + try: + os.makedirs(self._Emulator["ROM"]+"/.Fav") + except OSError: + if not os.path.isdir(self._Emulator["ROM"]+"/.Fav"): + raise + + self._MyStack._Emulator = self._Emulator + + icon_for_list = MultiIconItem() + icon_for_list._ImgSurf = self._Parent._Icons["sys"] + icon_for_list._MyType = ICON_TYPES["STAT"] + icon_for_list._Parent = self + + icon_for_list.Adjust(0,0,18,18,0) + + self._Icons["sys"] = icon_for_list + + + bgpng = IconItem() + bgpng._ImgSurf = MyIconPool.GiveIconSurface("empty") + bgpng._MyType = ICON_TYPES["STAT"] + bgpng._Parent = self + bgpng.AddLabel(MyLangManager.Tr("Please upload data over Wi-Fi"), MyLangManager.TrFont("varela22")) + bgpng.SetLableColor(MySkinManager.GiveColor('Disabled')) + bgpng.Adjust(0,0,self._BGwidth,self._BGheight,0) + + self._Icons["bg"] = bgpng + + self._Scroller = ListScroller() + self._Scroller._Parent = self + self._Scroller._PosX = self._Width - 10 + self._Scroller._PosY = 2 + self._Scroller.Init() + + rom_so_confirm_page = RomSoConfirmPage() + rom_so_confirm_page._Screen = self._Screen + rom_so_confirm_page._Name = "Download Confirm" + rom_so_confirm_page._Parent = self + rom_so_confirm_page.Init() + + self._RomSoConfirmDownloadPage = rom_so_confirm_page + + def ScrollUp(self): + if len(self._MyList) == 0: + return + + tmp = self._PsIndex + self._PsIndex -= self._ScrollStep + + if self._PsIndex < 0: + self._PsIndex = 0 + dy = tmp - self._PsIndex + cur_li = self._MyList[self._PsIndex] + if cur_li._PosY < 0: + for i in range(0, len(self._MyList)): + self._MyList[i]._PosY += self._MyList[i]._Height*dy + self._Scrolled +=dy + + def ScrollDown(self): + if len(self._MyList) == 0: + return + tmp = self._PsIndex + self._PsIndex +=self._ScrollStep + if self._PsIndex >= len(self._MyList): + self._PsIndex = len(self._MyList) -1 + + dy = self._PsIndex - tmp + cur_li = self._MyList[self._PsIndex] + if cur_li._PosY +cur_li._Height > self._Height: + for i in range(0,len(self._MyList)): + self._MyList[i]._PosY -= self._MyList[i]._Height*dy + self._Scrolled -= dy + + def SyncScroll(self): + ## + if self._Scrolled == 0: + return + + if self._PsIndex < len(self._MyList): + cur_li = self._MyList[self._PsIndex] + if self._Scrolled > 0: + if cur_li._PosY < 0: + for i in range(0, len(self._MyList)): + self._MyList[i]._PosY += self._Scrolled * self._MyList[i]._Height + elif self._Scrolled < 0: + if cur_li._PosY +cur_li._Height > self._Height: + for i in range(0,len(self._MyList)): + self._MyList[i]._PosY += self._Scrolled * self._MyList[i]._Height + + def Click(self): + if len(self._MyList) == 0: + return + + if self._PsIndex > len(self._MyList) - 1: + return + + cur_li = self._MyList[self._PsIndex] + + if cur_li._MyType == ICON_TYPES["DIR"]: + if cur_li._Path == "[..]": + self._MyStack.Pop() + self.SyncList( self._MyStack.Last() ) + self._PsIndex = 0 + else: + self._MyStack.Push( self._MyList[self._PsIndex]._Path ) + self.SyncList( self._MyStack.Last() ) + self._PsIndex = 0 + + if cur_li._MyType == ICON_TYPES["FILE"]: + self._Screen._MsgBox.SetText("Launching") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + + if self._Emulator["FILETYPE"] == "dir": + path = cur_li._Path +"/"+self._Emulator["EXT"][0] + else: + path = cur_li._Path + + print("Run ",path) + + if self._Emulator["FILETYPE"] == "dir": + escaped_path = CmdClean(path) + else: + escaped_path = CmdClean(path) + + custom_config = "" + if self._Emulator["RETRO_CONFIG"] != "" and len(self._Emulator["RETRO_CONFIG"]) > 5: + custom_config = " -c " + self._Emulator["RETRO_CONFIG"] + + cmdpath = " ".join( (self._Emulator["LAUNCHER"],self._Emulator["ROM_SO"], custom_config, escaped_path)) + + if self._Emulator["ROM_SO"] =="": #empty means No needs for rom so + pygame.event.post( pygame.event.Event(RUNEVT, message=cmdpath)) + else: + if FileExists(self._Emulator["ROM_SO"].split(" ")[0]): + pygame.event.post( pygame.event.Event(RUNEVT, message=cmdpath)) + else: + self._Screen.PushPage(self._RomSoConfirmDownloadPage) + self._Screen.Draw() + self._Screen.SwapAndShow() + + return + + self._Screen.Draw() + self._Screen.SwapAndShow() + + def ReScan(self): + if self._MyStack.Length() == 0: + self.SyncList(self._Emulator["ROM"]) + else: + self.SyncList( self._MyStack.Last() ) + + + idx = self._PsIndex + if idx > (len(self._MyList)-1): + idx = len(self._MyList) + if idx > 0: + idx -=1 + elif idx == 0:##nothing in _MyList + pass + + self._PsIndex = idx ## sync PsIndex + + self.SyncScroll() + + def OnReturnBackCb(self): + self.ReScan() + self._Screen.Draw() + self._Screen.SwapAndShow() + + def SpeedScroll(self, thekey): + if self._Screen._LastKey == thekey: + self._ScrollStep+=1 + if self._ScrollStep >=5: + self._ScrollStep = 5 + else: + self._ScrollStep = 1 + + cur_time = time.time() + + if cur_time - self._Screen._LastKeyDown > 0.3: + self._ScrollStep = 1 + + def KeyDown(self,event): + + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Right"]: + self._Screen.PushCurPage() + self._Screen.SetCurPage(self._Parent.FavListPage) + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Up"]: + self.SpeedScroll(event.key) + self.ScrollUp() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Down"]: + self.SpeedScroll(event.key) + self.ScrollDown() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if IsKeyStartOrA(event.key): + self.Click() + + if event.key == CurKeys["Select"]: + if len(self._MyList) == 0: + return + + cur_li = self._MyList[self._PsIndex] + if cur_li.IsFile(): + # remove any dup first + + try: + os.system("chgrp " + self._Parent._FavGname +" "+ CmdClean(cur_li._Path)) + except: + pass + + self._Screen._MsgBox.SetText("AddFavList") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + + pygame.time.delay(600) + self.ReScan() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["X"]: #Scan current + self.ReScan() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Y"]: #del + if len(self._MyList) == 0: + return + + cur_li = self._MyList[self._PsIndex] + if cur_li.IsFile(): + + self._Parent.DeleteConfirmPage.SetFileName(cur_li._Path) + self._Parent.DeleteConfirmPage.SetTrashDir(self._Emulator["ROM"]+"/.Trash") + + self._Screen.PushCurPage() + self._Screen.SetCurPage(self._Parent.DeleteConfirmPage) + self._Screen.Draw() + self._Screen.SwapAndShow() + + def Draw(self): + self.ClearCanvas() + if len(self._MyList) == 0: + self._Icons["bg"].NewCoord(self._Width/2,self._Height/2) + self._Icons["bg"].Draw() + else: + if len(self._MyList) * ListItem._Height > self._Height: + self._Ps._Width = self._Width - 10 + self._Ps.Draw() + + for i in self._MyList: + if i._PosY > self._Height + self._Height/2: + break + + if i._PosY < 0: + continue + i.Draw() + + self._Scroller.UpdateSize( len(self._MyList)*ListItem._Height, self._PsIndex*ListItem._Height) + self._Scroller.Draw() + + else: + self._Ps._Width = self._Width + self._Ps.Draw() + for i in self._MyList: + i.Draw() diff --git a/sys.py/UI/Emulator/rom_so_confirm_page.py b/sys.py/UI/Emulator/rom_so_confirm_page.py new file mode 100644 index 0000000..34db516 --- /dev/null +++ b/sys.py/UI/Emulator/rom_so_confirm_page.py @@ -0,0 +1,122 @@ + +# -*- coding: utf-8 -*- + +import os +import pygame + +import glob +import shutil +import gobject +import validators +#from pySmartDL import SmartDL + +from libs.roundrects import aa_round_rect + +from UI.confirm_page import ConfirmPage +from UI.download_process_page import DownloadProcessPage +from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB +from UI.multilabel import MultiLabel +from UI.lang_manager import MyLangManager + +import config + +class RomSoConfirmPage(ConfirmPage): + _ListFont = MyLangManager.TrFont("veramono18") + + _ConfirmText = MyLangManager.Tr("SetupGameEngineAutoQ") + + _MyDownloadPage = None + + def CheckBattery(self): + try: + f = open(config.Battery) + except IOError: + print( "RomSoConfirmPage open %s failed" % config.Battery) + return 6 + else: + with f: + bat_uevent = {} + content = f.readlines() + content = [x.strip() for x in content] + for i in content: + pis = i.split("=") + if len(pis) > 1: + bat_uevent[pis[0]] = pis[1] + + if "POWER_SUPPLY_CAPACITY" in bat_uevent: + cur_cap = int(bat_uevent["POWER_SUPPLY_CAPACITY"]) + else: + cur_cap = 0 + + return cur_cap + + return 0 + + def Init(self): + self._PosX = self._Index * self._Screen._Width + self._Width = self._Screen._Width + self._Height = self._Screen._Height + + self._CanvasHWND = self._Screen._CanvasHWND + + li = MultiLabel() + li.SetCanvasHWND(self._CanvasHWND) + li._Width = 160 + li.Init(self._ConfirmText,self._ListFont) + + li._PosX = (self._Width - li._Width)/2 + li._PosY = (self._Height - li._Height)/2 + + self._BGPosX = li._PosX-20 + self._BGPosY = li._PosY-20 + self._BGWidth = li._Width+40 + self._BGHeight = li._Height+40 + + self._MyList.append(li) + + def SnapMsg(self,msg): + self._MyList[0].SetText(msg) + self._Screen.Draw() + self._Screen.SwapAndShow() + self._MyList[0].SetText(self._ConfirmText) + + def OnReturnBackCb(self): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + def KeyDown(self,event): + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if IsKeyStartOrA(event.key): + if self.CheckBattery() < 5: + self.SnapMsg(MyLangManager.Tr("BATOver5Pct")) + else: + if self._MyDownloadPage == None: + self._MyDownloadPage = DownloadProcessPage() + self._MyDownloadPage._Screen = self._Screen + self._MyDownloadPage._Name = "Downloading" + self._MyDownloadPage.Init() + + self._Screen.PushPage(self._MyDownloadPage) + self._Screen.Draw() + self._Screen.SwapAndShow() + + if config.CurKeySet == "PC": + so_url = self._Parent._Emulator["SO_URL"] ## [rom/fav]_list_page is _Parent + so_url = so_url.replace("armhf","x86_64") + print(so_url) + self._MyDownloadPage.StartDownload(so_url,os.path.dirname(self._Parent._Emulator["ROM_SO"])) + else: + self._MyDownloadPage.StartDownload(self._Parent._Emulator["SO_URL"], + os.path.dirname(self._Parent._Emulator["ROM_SO"])) + + + def Draw(self): + self.ClearCanvas() + self.DrawBG() + for i in self._MyList: + i.Draw() diff --git a/sys.py/UI/__init__.py b/sys.py/UI/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/sys.py/UI/above_all_patch.py b/sys.py/UI/above_all_patch.py new file mode 100644 index 0000000..55e172a --- /dev/null +++ b/sys.py/UI/above_all_patch.py @@ -0,0 +1,134 @@ +# -*- coding: utf-8 -*- + +import pygame + +from libs.roundrects import aa_round_rect + +import alsaaudio + +## local package import +from constants import ICON_TYPES,icon_ext,icon_width,icon_height,RUNEVT +from icon_item import IconItem +from page import Page,PageStack +from title_bar import TitleBar +from foot_bar import FootBar +from constants import Width,Height +from util_funcs import midRect +from keys_def import CurKeys +from label import Label +from skin_manager import MySkinManager +from lang_manager import MyLangManager +from widget import Widget + + +class AboveAllPatch(Widget): + _PosX =Width/2 + _PosY =Height/2 + _Width =50 + _Height=120 + + _Text ="" + _FontObj= MyLangManager.TrFont("veramono20") + _Parent =None + _Color = MySkinManager.GiveColor('Text') + _ValColor = MySkinManager.GiveColor('URL') + _CanvasHWND = None + _TextSurf = None + _Icons = {} + _Value = 0 + + def __init__(self): + self._Icons = {} + + def Init(self): + pass + + def SetCanvasHWND(self,_canvashwnd): + self._CanvasHWND = _canvashwnd + + def Draw(self): + start_rect = midRect(self._PosX,self._PosY,self._Width,self._Height,Width,Height) + aa_round_rect(self._CanvasHWND,start_rect, self._Color,3,0, self._Color) + + if self._Value > 10: + vol_height = int(self._Height * (float( self._Value)/100.0)) + dheight = self._Height - vol_height + + vol_rect = pygame.Rect(self._PosX-self._Width/2, self._PosY-self._Height/2+dheight, self._Width, vol_height) + + aa_round_rect(self._CanvasHWND,vol_rect, self._ValColor,3,0, self._ValColor) + + else: + vol_height = 10 + dheight = self._Height - vol_height + vol_rect = pygame.Rect(self._PosX-self._Width/2, self._PosY-self._Height/2+dheight, self._Width, vol_height) + + aa_round_rect(self._CanvasHWND,vol_rect, self._ValColor,3,0, self._ValColor) + + +class SoundPatch(AboveAllPatch): + +# _Segs = [0,15,29, 45,55,65, 75,90,100] + snd_segs = [ [0,20],[21,40],[41,50],[51,60],[61,70],[71,85],[86,90],[91,95],[96,100] ] + _Needle = 0 + + def Init(self): + self.SetCanvasHWND(self._Parent._CanvasHWND) + + def VolumeUp(self): + m = alsaaudio.Mixer() + vol = m.getvolume()[0] + + # print("VolumeUp vol %d " % vol) + for i,v in enumerate(self.snd_segs): + if vol >= v[0] and vol <= v[1]: + self._Needle = i + break + + self._Needle += 1 + + if self._Needle > len(self.snd_segs) -1: + self._Needle = len(self.snd_segs) -1 + +# print("Set volume %d" % self.snd_segs[self._Needle][1] ) + m.setvolume( self.snd_segs[self._Needle][0] + (self.snd_segs[self._Needle][1] - self.snd_segs[self._Needle][0])/2 ) ## prefer bigger one + + self._Value = self.snd_segs[self._Needle][1] + +# print( self._Value) + return self._Value + + def VolumeDown(self): + m = alsaaudio.Mixer() + vol = m.getvolume()[0] + + for i,v in enumerate(self.snd_segs): + if vol >= v[0] and vol <= v[1]: + self._Needle = i + break + + self._Needle -= 1 + if self._Needle < 0: + self._Needle = 0 + + vol = self.snd_segs[self._Needle][0] ## prefer smaller one + + if vol < 0: + vol = 0 + m.setvolume(vol) + +# print(vol) + + self._Value = vol + return vol + + + def Draw(self): + # 200 total width + # h = 40 + for i in range(0,self._Needle+1): + #w = 10,h = 40 + vol_rect = pygame.Rect(80+i*20, self._Height/2+20,10, 40) + + aa_round_rect(self._CanvasHWND,vol_rect,MySkinManager.GiveColor("Front"),3,0,MySkinManager.GiveColor("Front")) + diff --git a/sys.py/UI/confirm_page.py b/sys.py/UI/confirm_page.py new file mode 100644 index 0000000..db36a66 --- /dev/null +++ b/sys.py/UI/confirm_page.py @@ -0,0 +1,139 @@ +# -*- coding: utf-8 -*- + +import pygame +import os + +from libs.roundrects import aa_round_rect + +#UI lib +from constants import Width,Height,ICON_TYPES +from page import Page,PageSelector +from label import Label +from util_funcs import midRect +from keys_def import CurKeys +from skin_manager import MySkinManager +from lang_manager import MyLangManager + + +class ListPageSelector(PageSelector): + _BackgroundColor = MySkinManager.GiveColor('Front') + + def __init__(self): + self._Width = Width + + def AnimateDraw(self,x2,y2): + pass + + def Draw(self): + idx = self._Parent._PsIndex + if idx > (len(self._Parent._MyList)-1): + idx = len(self._Parent._MyList) + if idx > 0: + idx -=1 + elif idx == 0: #Nothing + return + + x = self._Parent._MyList[idx]._PosX+2 + y = self._Parent._MyList[idx]._PosY+1 + h = self._Parent._MyList[idx]._Height -3 + + self._PosX = x + self._PosY = y + self._Height = h + + aa_round_rect(self._Parent._CanvasHWND, + (x,y,self._Width-4,h),self._BackgroundColor,4,0,self._BackgroundColor) + + + +class ConfirmPage(Page): + + _Icons = {} + _Selector=None + _FootMsg = ["Nav","","","Cancel","Yes"] + _MyList = [] + _ListFont = MyLangManager.TrFont("veramono20") + _MyStack = None + _FileName = "" + _TrashDir = "" + _ConfirmText = MyLangManager.Tr("ConfirmQ") + _BGPosX = 0 + _BGPosY = 0 + _BGWidth = 0 + _BGHeight = 0 + _Parent = None + + def __init__(self): + Page.__init__(self) + self._Icons = {} + self._CanvasHWND = None + self._MyList = [] + + def Reset(self): + self._MyList[0].SetText(self._ConfirmText) + self._MyList[0]._PosX = (self._Width - self._MyList[0]._Width)/2 + self._MyList[0]._PosY = (self._Height - self._MyList[0]._Height)/2 + + self._BGPosX = self._MyList[0]._PosX-10 + self._BGPosY = self._MyList[0]._PosY-10 + self._BGWidth = self._MyList[0]._Width+20 + self._BGHeight = self._MyList[0]._Height+20 + + + def SnapMsg(self,msg): + self._MyList[0].SetText(msg) + self._MyList[0]._PosX = (self._Width - self._MyList[0]._Width)/2 + self._MyList[0]._PosY = (self._Height - self._MyList[0]._Height)/2 + + self._BGPosX = self._MyList[0]._PosX-10 + self._BGPosY = self._MyList[0]._PosY-10 + self._BGWidth = self._MyList[0]._Width+20 + self._BGHeight = self._MyList[0]._Height+20 + + def Init(self): + self._PosX = self._Index * self._Screen._Width + self._Width = self._Screen._Width + self._Height = self._Screen._Height + + self._CanvasHWND = self._Screen._CanvasHWND + + ps = ListPageSelector() + ps._Parent = self + self._Ps = ps + self._PsIndex = 0 + + li = Label() + li.SetCanvasHWND(self._CanvasHWND) + li.Init(self._ConfirmText,self._ListFont) + + li._PosX = (self._Width - li._Width)/2 + li._PosY = (self._Height - li._Height)/2 + + self._BGPosX = li._PosX-10 + self._BGPosY = li._PosY-10 + self._BGWidth = li._Width+20 + self._BGHeight = li._Height+20 + + self._MyList.append(li) + + def KeyDown(self,event): + + if event.key == CurKeys["Menu"] or event.key == CurKeys["A"]: + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + def DrawBG(self): + _rect = pygame.Rect(self._BGPosX,self._BGPosY,self._BGWidth,self._BGHeight) + + pygame.draw.rect(self._CanvasHWND,MySkinManager.GiveColor('White'),_rect,0) + pygame.draw.rect(self._CanvasHWND,MySkinManager.GiveColor('Text'),_rect,1) + + def Draw(self): + #self.ClearCanvas() + + self.DrawBG() + for i in self._MyList: + i.Draw() + + self.Reset() diff --git a/sys.py/UI/constants.py b/sys.py/UI/constants.py new file mode 100644 index 0000000..ebf0e40 --- /dev/null +++ b/sys.py/UI/constants.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- + +import pygame +from pygame.locals import * +#from sys import exit +#import os +#import sys + +#from datetime import datetime + +#import base64 +#from beeprint import pp + +#UI lib +from skin_manager import MySkinManager + + +Width = 320 +Height = 240 +bg_color = MySkinManager.GiveColor('White') + +icon_width = 80 +icon_height = 80 +icon_ext = ".sh" + + +ICON_TYPES={"Commercial":8,"Emulator":7,"FILE":6,"STAT":5,"NAV":4,"LETTER":3,"FUNC":2,"DIR":1,"EXE":0,"None":-1} # FUNC is like UI widget's function,DIR contains child page,EXE just execute a binary + +## H=horizontal ,V=vertical S=Single Line +#SLeft start from left, single line +#SCenter star from center ,single line +ALIGN = {"HLeft":0,"HCenter":1,"HRight":2,"VMiddle":3,"SLeft":4,"VCenter":5,"SCenter":6} + +DT = pygame.time.Clock().tick(30) # fps in ms,eg:50 + +RUNSH = pygame.USEREVENT+1 +#update_titlebar_event = pygame.event.Event(GMEVT, message="titlebar") +RUNEVT = pygame.USEREVENT+2 +RUNSYS = pygame.USEREVENT+3 +LOWLIGHT = pygame.USEREVENT+4 ## when dim screen backlight +FOOTMSG = pygame.USEREVENT+5 ## +POWEROPT = pygame.USEREVENT+6 +RESTARTUI = pygame.USEREVENT+7 ##restart launcher diff --git a/sys.py/UI/counter_screen.py b/sys.py/UI/counter_screen.py new file mode 100644 index 0000000..36bcd69 --- /dev/null +++ b/sys.py/UI/counter_screen.py @@ -0,0 +1,115 @@ +# -*- coding: utf-8 -*- + +import pygame +import gobject +import commands +## local package import +from constants import Width,Height,RUNSYS +from label import Label + +from full_screen import FullScreen +from skin_manager import MySkinManager +from lang_manager import MyLangManager + +import config + +class CounterScreen(FullScreen): + + _CounterFont = MyLangManager.TrFont("varela120") + _TextFont1 = MyLangManager.TrFont("varela15") + _TextFont2 = MyLangManager.TrFont("varela12") + + _TopLabel = None + _BottomLabel = None + _NumberLabel = None + + _BGColor = MySkinManager.GiveColor('Black') + _FGColor = MySkinManager.GiveColor('White') + + _Counting = False + _Number = 10 + _GobjectIntervalId = -1 + + _inter_counter = 0 + + def GObjectInterval(self): + + self._inter_counter+=1 + + if self._Number == 0: + self._Counting = False + print("do the real shutdown") + + if config.CurKeySet != "PC": + cmdpath = "feh --bg-center gameshell/wallpaper/seeyou.png;" + cmdpath += "sleep 3;" + cmdpath += "sudo halt -p" + pygame.event.post( pygame.event.Event(RUNSYS, message=cmdpath))\ + + return False + + if self._inter_counter >=2: + self._Number -= 1 + if self._Number < 0: + self._Number = 0 + print("sub Number %d " % self._Number) + self._inter_counter = 0 + + self.Draw() + self.SwapAndShow() + + + + return self._Counting + + def StartCounter(self): + if self._Counting == True: + return + + self._Number = 10 + self._Counting = True + + self._GobjectIntervalId = gobject.timeout_add(500,self.GObjectInterval) + + def StopCounter(self): + if self._Counting == False: + return + self._Counting = False + self._Number = 10 + self._inter_counter = 0 + + if self._GobjectIntervalId != -1: + gobject.source_remove(self._GobjectIntervalId) + self._GobjectIntervalId = -1 + + return + + def Init(self): + self._CanvasHWND = pygame.Surface((self._Width,self._Height)) + self._TopLabel = Label() + self._TopLabel.SetCanvasHWND(self._CanvasHWND) + self._TopLabel.Init("System shutdown in", self._TextFont1, self._FGColor) + + self._BottomLabel = Label() + self._BottomLabel.SetCanvasHWND(self._CanvasHWND) + self._BottomLabel.Init("Press any key to stop countdown", self._TextFont2, self._FGColor) + + self._NumberLabel = Label() + self._NumberLabel.SetCanvasHWND(self._CanvasHWND) + self._NumberLabel.Init(str(self._Number), self._CounterFont, self._FGColor) + + def Draw(self): + self._CanvasHWND.fill( self._BGColor ) + + self._TopLabel.NewCoord(Width/2, 15) + self._TopLabel.DrawCenter() + + self._BottomLabel.NewCoord(Width/2, Height-15) + self._BottomLabel.DrawCenter() + + self._NumberLabel.NewCoord(Width/2,Height/2) + self._NumberLabel.SetText(str(self._Number)) + self._NumberLabel.DrawCenter() + + + diff --git a/sys.py/UI/createby_clockworkpi.py b/sys.py/UI/createby_clockworkpi.py new file mode 100644 index 0000000..3a3f3c5 --- /dev/null +++ b/sys.py/UI/createby_clockworkpi.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +createby_clockworkpi_b64="AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEBAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wEBAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wEBAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wEBAf8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AQEB/wEBAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8BAQH/AQEB/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wEBAf8BAQH/AQEB/wEBAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8BAQH/AQEB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8EAAH/BAAB/wIAAf8CAAH/AgAB/wEBAf8CAAH/AgAB/wQAAf8CAAH/AgAB/wIAAf8BAQH/AQEB/wEBAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8CAAH/AgAB/wIAAf8CAAH/AQEB/wEBAf8BAQD/AQEA/wEBAP8BAQH/AQEB/wIAAf8CAAP/AgAD/wEAAv8AAAL/AAAC/wAAAv8AAAL/AAAA/wEBAf8BAQH/AAAA/wEAAP8BAAD/AQAA/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AQEB/wEBAf8BAQH/AgAB/wQAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8DAQL/AwEC/wMBAv8DAQL/AwEC/wMBAv8DAQL/AwEC/wQCA/8EAgP/BAID/wQCA/8EAgP/BAID/wQCA/8EAgP/BAID/wQCA/8EAgP/BAID/wQCA/8EAgP/BAID/wQCA/8EAgP/BAID/wQCA/8EAgP/BAID/wQCA/8EAgP/BAID/wQCA/8EAgP/BAID/wQCA/8EAgP/BAID/wQCA/8EAgP/BAID/wQCA/8EAgP/BAID/wQCA/8EAgP/BAID/wQCA/8EAgP/BAID/wQCA/8EAgP/BAID/wQCA/8EAgP/BAID/wQCA/8EAgP/BAID/wQCA/8EAgP/BAID/wQCA/8EAgP/BAID/wQCA/8EAgP/BAID/wQCA/8EAgP/BAID/wQCA/8EAgP/BAID/wQCA/8EAgP/BAID/wQCA/8EAgP/BAID/wQCA/8EAgP/BAID/wQCA/8EAgP/BAID/wQCA/8EAgP/BAID/wQCA/8EAgP/BAID/wQCA/8EAgP/BAID/wQCA/8EAgP/BAID/wQCA/8EAgP/BAID/wQCA/8EAgP/BAID/wQCA/8EAgP/BAID/wQCA/8EAgP/BAID/wQCA/8EAgP/AwMD/wMDA/8EAgP/BgID/wcBA/8HAQP/BgID/wQCA/8DAwP/AwUE/wUDBP8HAwT/CAIE/wYCA/8DAQT/AQED/wIAAf8CAAH/AQEB/wAAAP8AAAL/AAAC/wAAAP8AAAD/AQAA/wEAAP8BAAD/AQAA/wAAAP8AAAD/AAAC/wAAAP8BAQD/AgEA/wQAAP8GAAD/BQEC/wQAAf8CAQD/AQEA/wIEAP8BAwD/AAIA/wEBAP8DAQL/BQAE/wUABv8EAAX/AwAE/wEABP8BAAX/AQAF/wABBf8AAQP/AQED/wEBAf8CAAH/BAAA/wQAAP8EAAD/AgAB/wEBAf8BAQP/AQED/wAAAv8BAAL/AAAA/wAAAP8AAQD/AAEA/wAAAP8AAAD/AAAA/wAAAP8AAAL/AAAC/wABAP8AAQD/AAEA/wAAAP8EAAD/BQAA/wUBAP8FAQD/AwIA/wMCAP8FAQD/BQEA/wYCA/8GAgP/BgID/wYCA/8EAgX/BAIF/wQCBf8EAgX/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wYCA/8GAgP/BgID/wMBAv8CAgL/BAID/wMDA/8EAgP/AwMD/wUDBP8EBAT/BAID/wMDA/8EAgP/AwMD/wQCA/8DAwP/BAID/wMDA/8EAgP/AwMD/wQCA/8DAwP/BAID/wMDA/8EAgP/AwMD/wQCA/8DAwP/BAID/wMDA/8EAgP/AwMD/wQCA/8DAwP/BAID/wMDA/8EAgP/AwMD/wQCA/8DAwP/BAID/wMDA/8EAgP/AwMD/wQCA/8DAwP/BAID/wMDA/8EAgP/AwMD/wQCA/8DAwP/BAID/wMDA/8EAgP/AwMD/wQCA/8DAwP/BAID/wMDA/8EAgP/AwMD/wQCA/8DAwP/BAID/wMDA/8EAgP/AwMD/wQCA/8DAwP/BAID/wMDA/8EAgP/AwMD/wQCA/8DAwP/BAID/wMDA/8EAgP/AwMD/wQCA/8DAwP/BAID/wMDA/8EAgP/AwMD/wQCA/8DAwP/BAID/wMDA/8EAgP/AwMD/wQCA/8DAwP/BAID/wMDA/8EAgP/AwMD/wQCA/8DAwP/BAID/wMDA/8EAgP/AwMD/wQCA/8DAwP/BAID/wMDA/8EAgP/AwMD/wQCA/8DAwP/BAID/wMDA/8DAwP/AwMD/wMDA/8EAgP/BwED/wcBA/8GAgP/AwMD/wIEA/8ABAP/AwMD/wYCA/8HAQP/BgID/wMDBf8CAgT/AgAB/wIAAf8BAQH/AQEB/wEBA/8BAQP/AQEB/wEBAf8CAQD/AgEA/wIBAP8CAQD/AQEB/wEBAf8AAQP/AAIB/wICAP8DAgD/BgAA/wkAAf8HAQP/BgID/wMCAP8DAwH/BAYB/wMFAP8CBAD/AgIA/wUBAv8FAAT/BgAG/wQABf8DAAT/AgAF/wEABv8BAAb/AAEF/wABBf8BAQP/AgAB/wUBAP8FAQD/BgAA/wYAAP8FAQD/AwEC/wICBP8CAgT/AgIE/wMBBP8CAgL/AQEB/wACAP8AAgD/AQEA/wEBAP8CAgL/AgIC/wEBA/8BAQP/AQEB/wACAf8AAgH/AAIB/wUBAv8GAAD/BQEA/wQDAf8EAwH/BAMB/wQDAf8GAgH/CAQF/wgEBf8IBAX/BgQF/wYEB/8FBQf/BgQH/wYEB/8GBAX/BgQF/wgEBf8GBAX/CAQF/wYEBf8IBAX/BgQF/wgEBf8GBAX/CAQF/wYEBf8IBAX/BgQF/wgEBf8GBAX/CAQF/wYEBf8IBAX/BgQF/wgEBf8GBAX/CAQF/wYEBf8IBAX/BgQF/wgEBf8GBAX/CAQF/wYEBf8IBAX/BgQF/wgEBf8GBAX/CAQF/wYEBf8IBAX/BgQF/wgEBf8GBAX/CAQF/wYEBf8IBAX/BgQF/wgEBf8GBAX/CAQF/wYEBf8IBAX/BgQF/wgEBf8GBAX/CAQF/wYEBf8IBAX/BgQF/wgEBf8GBAX/CAQF/wYEBf8IBAX/BgQF/wgEBf8GBAX/CAQF/wYEBf8IBAX/BgQF/wgEBf8GBAX/CAQF/wYEBf8IBAX/BgQF/wgEBf8GBAX/CAQF/wYEBf8IBAX/BgQF/wgEBf8GBAX/CAQF/wYEBf8IBAX/BgQF/wgEBf8GBAX/CAQF/wYEBf8IBAX/BgQF/wgEBf8GBAX/CAQF/wYEBf8IBAX/BgQF/wgEBf8GBAX/CAQF/wYEBf8IBAX/BgQF/wgEBf8GBAX/CAQF/wYEBf8IBAX/BQME/wcDBP8FAwT/AQED/wABA/8BAQP/AAED/wEBA/8AAQP/AAAC/wAAAv8BAQP/AAED/wEBA/8AAQP/AQED/wABA/8BAQP/AAED/wEBA/8AAQP/AQED/wABA/8BAQP/AAED/wEBA/8AAQP/AQED/wABA/8BAQP/AAED/wEBA/8AAQP/AQED/wABA/8BAQP/AAED/wEBA/8AAQP/AQED/wABA/8BAQP/AAED/wEBA/8AAQP/AQED/wABA/8BAQP/AAED/wEBA/8AAQP/AQED/wABA/8BAQP/AAED/wEBA/8AAQP/AQED/wABA/8BAQP/AAED/wEBA/8AAQP/AQED/wABA/8BAQP/AAED/wEBA/8AAQP/AQED/wABA/8BAQP/AAED/wEBA/8AAQP/AQED/wABA/8BAQP/AAED/wEBA/8AAQP/AQED/wABA/8BAQP/AAED/wEBA/8AAQP/AQED/wABA/8BAQP/AAED/wEBA/8AAQP/AQED/wABA/8BAQP/AAED/wEBA/8AAQP/AQED/wABA/8BAQP/AAED/wEBA/8AAQP/AQED/wABA/8BAQP/AAED/wEBA/8AAQP/AQED/wABA/8BAQP/AAED/wABA/8AAQP/AAED/wEBA/8CAAP/AgAD/wIAA/8AAQP/AAID/wADA/8AAAL/AAAC/wMAAv8CAAP/AAED/wABA/8BAQH/AgAB/wEBAf8CAgL/AgIE/wICBP8CAgL/AgIC/wMCAP8DAgD/AwIA/wMCAP8CAgL/AgIC/wECBP8BAwL/AwMB/wMCAP8HAQP/CAIE/wgCBP8GAgP/BAID/wQEAv8GCAX/BAYD/wQEAv8EAwH/BgID/wcBA/8FAAT/BQAG/wYBB/8EAgf/AwII/wMCCP8EAwj/BAMI/wUDBv8FAwT/BgIB/wcBAf8JAQD/BwIA/wYBAP8FAQD/AwIA/wICAv8CAgT/AgIE/wICAv8BAQH/AQEA/wEBAP8BAQD/AQEA/wICAv8CAgL/AgAD/wEBA/8BAQH/AAIB/wACAf8AAgH/AQEB/wIAAf8BAQH/AQEB/wICAv8CAgL/AgIC/wMBAv8DAQL/AwEC/wMBBP8CAgT/AgIE/wECBP8CAgT/AgIE/wICBP8CAgT/AwEE/wICBP8DAQT/AgIE/wMBBP8CAgT/AwEE/wICBP8DAQT/AgIE/wMBBP8CAgT/AwEE/wICBP8DAQT/AgIE/wMBBP8CAgT/AwEE/wICBP8DAQT/AgIE/wMBBP8CAgT/AwEE/wICBP8DAQT/AgIE/wMBBP8CAgT/AwEE/wICBP8DAQT/AgIE/wMBBP8CAgT/AwEE/wICBP8DAQT/AgIE/wMBBP8CAgT/AwEE/wICBP8DAQT/AgIE/wMBBP8CAgT/AwEE/wICBP8DAQT/AgIE/wMBBP8CAgT/AwEE/wICBP8DAQT/AgIE/wMBBP8CAgT/AwEE/wICBP8DAQT/AgIE/wMBBP8CAgT/AwEE/wICBP8DAQT/AgIE/wMBBP8CAgT/AwEE/wICBP8DAQT/AgIE/wMBBP8CAgT/AwEE/wICBP8DAQT/AgIE/wMBBP8CAgT/AwEE/wICBP8DAQT/AgIE/wMBBP8CAgT/AwEE/wICBP8DAQT/AgIE/wMBBP8CAgT/AwEE/wICBP8DAQT/AgIE/wMBBP8CAgT/AwEE/wICBP8DAQT/AgIE/wMBBP8DAwX/BAIF/wMDBf8DAwX/AgIC/wICBP8CAgL/AgIE/wEBAf8BAQP/AQEB/wICBP8CAgL/AgIE/wICAv8CAgT/AgIC/wICBP8CAgL/AgIE/wICAv8CAgT/AgIC/wICBP8CAgL/AgIE/wICAv8CAgT/AgIC/wICBP8CAgL/AgIE/wICAv8CAgT/AgIC/wICBP8CAgL/AgIE/wICAv8CAgT/AgIC/wICBP8CAgL/AgIE/wICAv8CAgT/AgIC/wICBP8CAgL/AgIE/wICAv8CAgT/AgIC/wICBP8CAgL/AgIE/wICAv8CAgT/AgIC/wICBP8CAgL/AgIE/wICAv8CAgT/AgIC/wICBP8CAgL/AgIE/wICAv8CAgT/AgIC/wICBP8CAgL/AgIE/wICAv8CAgT/AgIC/wICBP8CAgL/AgIE/wICAv8CAgT/AgIC/wICBP8CAgL/AgIE/wICAv8CAgT/AgIC/wICBP8CAgL/AgIE/wICAv8CAgT/AgIC/wICBP8CAgL/AgIE/wICAv8CAgT/AgIC/wICBP8CAgL/AgIE/wICAv8CAgT/AgIC/wICBP8CAgL/AgIE/wICAv8CAgT/AgIC/wICBP8BAwL/AQIE/wEDAv8BAgT/AgIC/wMBBP8DAQL/AwEE/wICAv8ABAX/AAUD/wECBP8CAgL/BQAE/wQCA/8CAwX/AAQD/wEBAf8CAAH/AgAB/wEBAf8BAQP/AQED/wEBAf8CAgL/AgEA/wIBAP8CAQD/AgEA/wEBAf8CAgL/AQIE/wECBP8CAgL/AgIC/wUBAv8HAQP/BwED/wYCA/8DAQL/AwMD/wQGBf8EBAL/BAMB/wUBAP8FAQD/BgID/wQCA/8DAQL/AQED/wEBA/8BAgb/AQIG/wECBv8BAgT/AgIE/wMBAv8FAQL/BQEC/wYAAv8FAQL/BQEC/wMBAv8CAgT/AgIE/wICBP8BAQP/AQEB/wEBAf8BAQD/AAAA/wAAAP8AAAD/AQEB/wEBAf8BAAL/AQAC/wAAAP8AAAD/AAAA/wAAAP8BAQH/AQEB/wEBAf8CAgL/AgIC/wICAv8CAgL/AwIA/wQCA/8EAgP/BAID/wQCA/8DAwP/AwMD/wMDA/8DAwP/BAIF/wQCA/8EAgX/BAID/wQCBf8EAgP/BAIF/wQCA/8EAgX/BAID/wQCBf8EAgP/BAIF/wQCA/8EAgX/BAID/wQCBf8EAgP/BAIF/wQCA/8EAgX/BAID/wQCBf8EAgP/BAIF/wQCA/8EAgX/BAID/wQCBf8EAgP/BAIF/wQCA/8EAgX/BAID/wQCBf8EAgP/BAIF/wQCA/8EAgX/BAID/wQCBf8EAgP/BAIF/wQCA/8EAgX/BAID/wQCBf8EAgP/BAIF/wQCA/8EAgX/BAID/wQCBf8EAgP/BAIF/wQCA/8EAgX/BAID/wQCBf8EAgP/BAIF/wQCA/8EAgX/BAID/wQCBf8EAgP/BAIF/wQCA/8EAgX/BAID/wQCBf8EAgP/BAIF/wQCA/8EAgX/BAID/wQCBf8EAgP/BAIF/wQCA/8EAgX/BAID/wQCBf8EAgP/BAIF/wQCA/8EAgX/BAID/wQCBf8EAgP/BAIF/wQCA/8EAgX/BAID/wQCBf8EAgP/BAIF/wQCA/8EAgX/BAID/wQCBf8EAgP/BAIF/wQCA/8DAQT/BAID/wQCBf8EAgP/BAIF/wQCA/8FAwb/BQME/wEAAP8BAAD/AQAA/wEAAP8BAAD/AgEA/wIAAf8DAgD/AgAB/wIBAP8CAAH/AgEA/wIAAf8CAQD/AgAB/wIBAP8CAAH/AgEA/wIAAf8CAQD/AgAB/wIBAP8CAAH/AgEA/wIAAf8CAQD/AgAB/wIBAP8CAAH/AgEA/wIAAf8CAQD/AgAB/wIBAP8CAAH/AgEA/wIAAf8CAQD/AgAB/wIBAP8CAAH/AgEA/wIAAf8CAQD/AgAB/wIBAP8CAAH/AgEA/wIAAf8CAQD/AgAB/wIBAP8CAAH/AgEA/wIAAf8CAQD/AgAB/wIBAP8CAAH/AgEA/wIAAf8CAQD/AgAB/wIBAP8CAAH/AgEA/wIAAf8CAQD/AgAB/wIBAP8CAAH/AgEA/wIAAf8CAQD/AgAB/wIBAP8CAAH/AgEA/wIAAf8CAQD/AgAB/wIBAP8CAAH/AgEA/wIAAf8CAQD/AgAB/wIBAP8CAAH/AgEA/wIAAf8CAQD/AgAB/wIBAP8CAAH/AgEA/wIAAf8CAQD/AgAB/wIBAP8CAAH/AgEA/wIAAf8CAQD/AgAB/wIBAP8CAAH/AgEA/wIAAf8CAQD/AgAB/wIBAP8CAAH/AQEA/wEBAf8CAQD/BQAB/wUAAP8FAAH/AgEA/wEDAv8BAwD/AgAB/wQAAP8FAAH/BAAA/wACAf8AAgD/BAMB/wQDAf8EAgP/AwEC/wICBP8CAgT/AgIC/wICAv8CAgD/AgIA/wMCAP8DAgD/AgIC/wICAv8BAgT/AgMF/wIDBf8CAgL/BgID/wcDBP8HAwT/BgID/wQCBf8EBAb/BAQG/wMDA/8GAgP/BgIB/wcDAv8GBQH/BQcC/wMIAv8FCgb/BQoG/wUJCP8ECAf/BAgJ/wMHCP8FBgj/BQYK/wMCB/8DAgf/AwIH/wMCCP8CAQn/AQEJ/wACC/8AAgv/BAMI/wQEBv8DAwP/AwMD/wMDAf8DAwH/AwMB/wMDAf8DAQL/AwEC/wMBBP8DAQT/BAID/wQCA/8EAwH/BAMB/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8EAAD/BQEA/wUBAP8FAQD/BQEA/wUBAP8FAQD/AwIA/wMCAP8FAQL/BQEA/wUBAv8FAQD/BQEC/wUBAP8FAQL/BQEA/wUBAv8FAQD/BQEC/wUBAP8FAQL/BQEA/wUBAv8FAQD/BQEC/wUBAP8FAQL/BQEA/wUBAv8FAQD/BQEC/wUBAP8FAQL/BQEA/wUBAv8FAQD/BQEC/wUBAP8FAQL/BQEA/wUBAv8FAQD/BQEC/wUBAP8FAQL/BQEA/wUBAv8FAQD/BQEC/wUBAP8FAQL/BQEA/wUBAv8FAQD/BQEC/wUBAP8FAQL/BQEA/wUBAv8FAQD/BQEC/wUBAP8FAQL/BQEA/wUBAv8FAQD/BQEC/wUBAP8FAQL/BQEA/wUBAv8FAQD/BQEC/wUBAP8FAQL/BQEA/wUBAv8FAQD/BQEC/wUBAP8FAQL/BQEA/wUBAv8FAQD/BQEC/wUBAP8FAQL/BQEA/wUBAv8FAQD/BQEC/wUBAP8FAQL/BQEA/wUBAv8FAQD/BQEC/wUBAP8FAQL/BQEA/wUBAv8FAQD/BQEC/wUBAP8FAQL/BQEA/wUBAv8FAQD/BQEC/wUBAP8FAQL/BQEA/wYCA/8GAgH/BgID/wUBAP8FAQL/BAAA/wQAAf8EAAD/EgAA/xIAAP8SAAD/EgAA/xEAAP8RAAD/EQAA/xIAAP8SAAD/EgAA/xIAAP8SAAD/EgAA/xIAAP8SAAD/EgAA/xIAAP8SAAD/EgAA/xIAAP8SAAD/EgAA/xIAAP8SAAD/EgAA/xIAAP8SAAD/EgAA/xIAAP8SAAD/EgAA/xIAAP8SAAD/EgAA/xIAAP8SAAD/EgAA/xIAAP8SAAD/EgAA/xIAAP8SAAD/EgAA/xIAAP8SAAD/EgAA/xIAAP8SAAD/EgAA/xIAAP8SAAD/EgAA/xIAAP8SAAD/EgAA/xIAAP8SAAD/EgAA/xIAAP8SAAD/EgAA/xIAAP8SAAD/EgAA/xIAAP8SAAD/EgAA/xIAAP8SAAD/EgAA/xIAAP8SAAD/EgAA/xIAAP8SAAD/EgAA/xIAAP8SAAD/EgAA/xIAAP8SAAD/EgAA/xIAAP8SAAD/EgAA/xIAAP8SAAD/EgAA/xIAAP8SAAD/EgAA/xIAAP8SAAD/EgAA/xIAAP8SAAD/EgAA/xIAAP8SAAD/EgAA/xIAAP8SAAD/EgAA/xIAAP8SAAD/EgAA/xIAAP8SAAD/EgAA/xIAAP8SAAD/EgAA/xIAAP8QAAD/EAAA/xIAAP8TAAD/FAAA/xMAAP8SAAD/DgAA/w8BAP8SAAD/EwAA/xQAAP8RAAD/DAEA/woCAP8GAAD/BQEA/wQAAf8CAAH/AQED/wEBA/8BAQH/AQEB/wEBAf8BAQD/AgEA/wIBAP8BAQH/AQEB/wABA/8AAQP/AQIE/wEBA/8DAQL/BgID/wYCA/8DAQL/AgIE/wICBP8CAgT/AwEE/wUBAv8FAQD/BAMA/wQHAP8ACwD/AAwA/wAKAP8BCAD/AQgB/wAHAP8ABQP/AAMC/wACA/8AAAT/AQAF/wEABv8BAAb/AQAI/wEACv8AAAz/AAAN/wAADP8BAgf/AgIE/wICAv8BAQH/AQEA/wEBAP8BAQD/AQEA/wIAAf8CAAH/AgAD/wIAA/8CAAH/BQEC/wUBAP8GAAD/DQEB/w8AAP8PAAD/EQAA/xEAAP8RAAD/EgAA/xIAAP8TAAD/EwAA/xMAAP8TAAD/EwAA/xMAAP8TAAD/EgAA/xMAAP8TAAD/EwAA/xMAAP8TAAD/EwAA/xMAAP8TAAD/EwAA/xMAAP8TAAD/EwAA/xMAAP8TAAD/EwAA/xMAAP8TAAD/EwAA/xMAAP8TAAD/EwAA/xMAAP8TAAD/EwAA/xMAAP8TAAD/EwAA/xMAAP8TAAD/EwAA/xMAAP8TAAD/EwAA/xMAAP8TAAD/EwAA/xMAAP8TAAD/EwAA/xMAAP8TAAD/EwAA/xMAAP8TAAD/EwAA/xMAAP8TAAD/EwAA/xMAAP8TAAD/EwAA/xMAAP8TAAD/EwAA/xMAAP8TAAD/EwAA/xMAAP8TAAD/EwAA/xMAAP8TAAD/EwAA/xMAAP8TAAD/EwAA/xMAAP8TAAD/EwAA/xMAAP8TAAD/EwAA/xMAAP8TAAD/EwAA/xMAAP8TAAD/EwAA/xMAAP8TAAD/EwAA/xMAAP8TAAD/EwAA/xMAAP8TAAD/EwAA/xMAAP8TAAD/EwAA/xMAAP8TAAD/EwAA/xMAAP8TAAD/EwAA/xMAAP8TAAD/EwAA/xMAAP8TAAD/EwAA/xMAAP8TAAD/FAAB/xQAAf8UAAH/FAAB/xQAAf8UAAH/FAAB/xUBAv8yAQX/MQAE/zAAA/8vAAL/LwAC/y4AAf8uAAH/LgAB/y8AAv8vAAL/LwAC/y8AAv8vAAL/LwAC/y8AAv8vAAL/LwAC/y8AAv8vAAL/LwAC/y8AAv8vAAL/LwAC/y8AAv8vAAL/LwAC/y8AAv8vAAL/LwAC/y8AAv8vAAL/LwAC/y8AAv8vAAL/LwAC/y8AAv8vAAL/LwAC/y8AAv8vAAL/LwAC/y8AAv8vAAL/LwAC/y8AAv8vAAL/LwAC/y8AAv8vAAL/LwAC/y8AAv8vAAL/LwAC/y8AAv8vAAL/LwAC/y8AAv8vAAL/LwAC/y8AAv8vAAL/LwAC/y8AAv8vAAL/LwAC/y8AAv8vAAL/LwAC/y8AAv8vAAL/LwAC/y8AAv8vAAL/LwAC/y8AAv8vAAL/LwAC/y8AAv8vAAL/LwAC/y8AAv8vAAL/LwAC/y8AAv8vAAL/LwAC/y8AAv8vAAL/LwAC/y8AAv8vAAL/LwAC/y8AAv8vAAL/LwAC/y8AAv8vAAL/LwAC/y8AAv8vAAL/LwAC/y8AAv8vAAL/LwAC/y8AAv8vAAL/LwAC/y8AAv8vAAL/LwAC/y8AAv8tAAL/LQAB/y0AAf8tAAL/LQAC/y8AAv8wAAL/LwAC/y0AAv8rAAH/KgAC/y0AAv8vAAL/MAAC/y0AAv8oAAH/IAQD/w0AAP8GAgH/BQEC/wMBAv8CAgT/AgIE/wICBP8DAwP/AgIC/wICAv8CAgD/AgIA/wICAv8CAgL/AgMF/wIDBf8ABAX/AgMF/wQCA/8HAwT/BQQC/wQCA/8DAwX/AgMF/wMCB/8EAgX/BgID/wcDAv8DBgD/AAoA/wAOAP8ADwD/AA0A/wMLAP8DCQD/AggA/wEGAP8CBAH/AgIC/wMBBP8GAQX/BgEH/wcAB/8HAAj/BwAK/wYADP8GAA7/BAEM/wMCB/8CAwX/AgIC/wICAv8CAgD/AgIA/wICAv8CAgL/AgIE/wICBP8DAQT/AwEE/wUBAv8GAAL/BwEB/w0AAP8hAQT/JwAA/yoAAv8rAAD/KwAA/y0AAP8tAAD/LQAA/y8AAf8vAAH/MAAB/zAAAf8wAAH/MAAB/y8AAf8vAAH/MAAB/zAAAf8wAAH/MAAB/zAAAf8wAAH/MAAB/zAAAf8wAAH/MAAB/zAAAf8wAAH/MAAB/zAAAf8wAAH/MAAB/zAAAf8wAAH/MAAB/zAAAf8wAAH/MAAB/zAAAf8wAAH/MAAB/zAAAf8wAAH/MAAB/zAAAf8wAAH/MAAB/zAAAf8wAAH/MAAB/zAAAf8wAAH/MAAB/zAAAf8wAAH/MAAB/zAAAf8wAAH/MAAB/zAAAf8wAAH/MAAB/zAAAf8wAAH/MAAB/zAAAf8wAAH/MAAB/zAAAf8wAAH/MAAB/zAAAf8wAAH/MAAB/zAAAf8wAAH/MAAB/zAAAf8wAAH/MAAB/zAAAf8wAAH/MAAB/zAAAf8wAAH/MAAB/zAAAf8wAAH/MAAB/zAAAf8wAAH/MAAB/zAAAf8wAAH/MAAB/zAAAf8wAAH/MAAB/zAAAf8wAAH/MAAB/zAAAf8wAAH/MAAB/zAAAf8wAAH/MAAB/zAAAf8wAAH/MAAB/zAAAf8wAAH/MAAB/zAAAf8wAAH/MAAB/zAAAf8wAAH/MAAB/zAAAf8wAAH/MAAB/zAAAf8wAAH/MQAC/zIAA/8zAQT/MwEE/6NWXP+jVlz/o1Zc/6JVW/+jVlz/o1Zc/6RXXf+kV13/o1Zc/6NWXP+jVlz/o1Zc/6NWXP+jVlz/o1Zc/6NWXP+jVlz/o1Zc/6NWXP+jVlz/o1Zc/6NWXP+jVlz/o1Zc/6NWXP+jVlz/o1Zc/6NWXP+jVlz/o1Zc/6NWXP+jVlz/o1Zc/6NWXP+jVlz/o1Zc/6NWXP+jVlz/o1Zc/6NWXP+jVlz/o1Zc/6NWXP+jVlz/o1Zc/6NWXP+jVlz/o1Zc/6NWXP+jVlz/o1Zc/6NWXP+jVlz/o1Zc/6NWXP+jVlz/o1Zc/6NWXP+jVlz/o1Zc/6NWXP+jVlz/o1Zc/6NWXP+jVlz/o1Zc/6NWXP+jVlz/o1Zc/6NWXP+jVlz/o1Zc/6NWXP+jVlz/o1Zc/6NWXP+jVlz/o1Zc/6NWXP+jVlz/o1Zc/6NWXP+jVlz/o1Zc/6NWXP+jVlz/o1Zc/6NWXP+jVlz/o1Zc/6NWXP+jVlz/o1Zc/6NWXP+jVlz/o1Zc/6NWXP+jVlz/o1Zc/6NWXP+jVlz/o1Zc/6NWXP+jVlz/o1Zc/6NWXP+jVlz/o1Zc/6NWXP+jVlz/o1Zc/6NWXP+iV1v/oldb/6JXXP+iV1z/o1Zc/6NWXP+jVlz/oldc/55XW/+fWFz/oldc/6NWXP+jVlz/oldc/5xaXP+QYGD/zLi5/8K8vP/CvL7/wb2+/7+9wP++vsD/vr7A/7+/wf++vr7/vr6+/76+vP++vrz/vr6+/76+vv+9vsD/vr/B/7u/wP+9vsD/v72+/8K+vf/Av73/vr68/72/vv+9vsD/v77D/8C+w//Cvr//v766/7rCtf+1x6//rsus/6zOqf+tzKr/sMus/7HKrf+yya//tMez/7bEs/+4wrn/u8C6/7+/vf/Avr//w73B/8W7w//Fu8b/xrrI/8a5yv/Du8j/wL/E/76/wf+/v7//v7+//7+/vf+/v73/v7+//7+/v/+/v8H/v7/B/8C+wf/AvsH/w72//8O9v//FvL3/zri6/5JgY/+dW1//oFlf/6BXXv+iV1z/pFdd/6RXXf+jWFz/o1hc/6RYXP+kWFz/pldc/6dWXP+mV1z/pFhc/6RYXP+kWFz/pFhc/6ZXXP+kWFz/pldc/6RYXP+mV1z/pFhc/6ZXXP+kWFz/pldc/6RYXP+mV1z/pFhc/6ZXXP+kWFz/pldc/6RYXP+mV1z/pFhc/6ZXXP+kWFz/pldc/6RYXP+mV1z/pFhc/6ZXXP+kWFz/pldc/6RYXP+mV1z/pFhc/6ZXXP+kWFz/pldc/6RYXP+mV1z/pFhc/6ZXXP+kWFz/pldc/6RYXP+mV1z/pFhc/6ZXXP+kWFz/pldc/6RYXP+mV1z/pFhc/6ZXXP+kWFz/pldc/6RYXP+mV1z/pFhc/6ZXXP+kWFz/pldc/6RYXP+mV1z/pFhc/6ZXXP+kWFz/pldc/6RYXP+mV1z/pFhc/6ZXXP+kWFz/pldc/6RYXP+mV1z/pFhc/6ZXXP+kWFz/pldc/6RYXP+mV1z/pFhc/6ZXXP+kWFz/pldc/6RYXP+mV1z/pFhc/6ZXXP+kWFz/pldc/6RYXP+mV1z/pFhc/6ZXXP+kWFz/pldc/6RYXP+mV1z/pFhc/6ZXXP+kWFz/pldc/6RYXP+mV1z/pFhc/6dYXf+kWFz/pldc/6RYXP+lVlv/o1db/6ZXXP+kWFz/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/t1BU/7dQVP+3UFT/tVBU/7VQVP+3UFT/t1BU/7dQVP+1UFT/tFFU/7RRVP+3UFT/t1BU/7dQVP+1UFT/r1NU/59bWv/UuLf/xr2+/8S+wP/Dv8D/wb/C/8G/wv/AwML/wMDC/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/Awv+/wML/v8DC/8DAwP/BwL7/w7+8/8HAvP/Awbz/v8HA/7/Awv/Av8T/wcDF/8C+v//Aw7z/uMWz/7LNrv89aDv/N243/y9wMP8xczP/L2wx/z94Q/8xYjP/M103/7TVuP+txLD/tsS3/7vCu//AwMD/xL3E/8e7x//Kucn/y7jL/8i6yf/Bv8T/v8DC/8DAwP/AwMD/wb/A/8G/wP/AwMD/wMDA/8DAwv/AwML/wb/C/8G/wv/EvsD/xr3A/8e9vv/Vt7f/nlpb/65UVv+vUFT/s1BV/7ZOVf+0TFP/tk9T/7RPU/+1UFT/tVFT/7hPU/+4T1P/uU9T/7lPU/+3UFP/t1BT/7dQVP+3UFT/uE9U/7dQVP+4T1T/t1BU/7hPVP+3UFT/uE9U/7dQVP+4T1T/t1BU/7hPVP+3UFT/uE9U/7dQVP+4T1T/t1BU/7hPVP+3UFT/uE9U/7dQVP+4T1T/t1BU/7hPVP+3UFT/uE9U/7dQVP+4T1T/t1BU/7hPVP+3UFT/uE9U/7dQVP+4T1T/t1BU/7hPVP+3UFT/uE9U/7dQVP+4T1T/t1BU/7hPVP+3UFT/uE9U/7dQVP+4T1T/t1BU/7hPVP+3UFT/uE9U/7dQVP+4T1T/t1BU/7hPVP+3UFT/uE9U/7dQVP+4T1T/t1BU/7hPVP+3UFT/uE9U/7dQVP+4T1T/t1BU/7hPVP+3UFT/uE9U/7dQVP+4T1T/t1BU/7hPVP+3UFT/uE9U/7dQVP+4T1T/t1BU/7hPVP+3UFT/uE9U/7dQVP+4T1T/t1BU/7hPVP+3UFT/uE9U/7dQVP+4T1T/t1BU/7hPVP+3UFT/uE9U/7dQVP+4T1T/t1BU/7hPVP+3UFT/uE9U/7dQVP+4T1T/t1BU/7hPVP+3UFT/uE9U/7dQVP+4T1T/t1BU/7hPVP+3UFT/uE9U/7dQVP/CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8BMTf/ATE//v0xP/8BMT//ATE//wExP/79MT/++TU//v0xP/8BMT//CS0//wktP/75NT/+5T0//plhW/9i2tf/Hvbz/xr2+/8S+wP/DvsL/wb/C/8DAwv/AwML/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8DC/7/Awv+/wML/wMDA/8HAvv/DwLv/wcC7/8DBvP+/wb7/vcHC/7/AxP/BwMX/wL6//77DvP+1x7H/rc+q/zdsNv8wcjL/Mn42/y57Nf8qcS//N3g+/zdwPf9CcUf/qc6t/6bCqf+0x7T/usS5/7/BvP/Dv77/x7zC/8q6xP/LusT/yLvE/8O+wv+/wML/wMDA/8DAwP/Bv8D/wb/A/8DAwP/AwMD/wMDC/8DAwv/Bv8L/wb/C/8S+wP/Gvb7/yLy8/9i2tf+mWFj/uVFS/7tNUP+/TFH/wEtR/8BJTf/ATE//v01N/79NTf+/TU3/wktN/8NLTf/FSk3/w0tN/8JLTf/ATE3/wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/FS0r/w0xI/8NLSv/CTEr/w0tK/8NLSv/DS0r/wkxK/8BNSv/CTEr/w0tK/8NLSv/DS0r/v05K/7pPSf+mV1L/2La0/8e9vP/Gvb7/xL7A/8O+wv/Bv8L/wMDC/7/Awv+/wcD/v8HA/8DAwP/AwMD/wMDA/8DAwP/AwML/wMDC/7/Awv/AwMD/wcC8/8PAu//BwLv/wMG7/73Cvv+9wcL/v8DF/8HAxv/AvsH/vsO8/7LJrf+p06X/MHEx/y10MP+Y157/mNKg/5nOoP+dy6T/oMim/5q7nv+9177/tci0/7nGtf+8xLX/wMK1/8PBtf/Gv7X/x761/8i+tf/Hvrn/wcC+/7/Awv/AwMD/wMDA/8G/wP/Bv8D/wMDA/8DAwP+/wML/v8DC/8DAwv/Bv8L/xL7A/8a9vv/IvLz/2bW1/6dYVP+6UU3/vk5M/8NNTf/GS03/xEpJ/8RMS//DTUv/wkxK/8JMSP/FS0j/xUtI/8ZKSP/FS0j/w0xI/8JMSP/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/w0tK/8NLSv/DS0r/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xkpI/8ZLRv/GS0b/xUtG/8VLRv/FS0j/xUtI/8VLSP/DTEj/w0xI/8NMSP/FS0j/xUtI/8VLSP+/TEf/uk9H/6dXUP/ZtrT/yLy8/8e9vv/Evr7/w77C/8DAwv/AwML/v8DC/7/BwP+/wcD/wMDA/8DAwP/AwMD/wMDA/8DAwv/AwML/v8DC/8DAwP/BwLz/w8C7/8HBuf/Awbv/vcK+/73Bwv/Av8X/wr/G/8C+wf++w7z/scqs/6bVof8sdCv/LHUs/57Uov+l0qv/r9e0/7HSs/+7177/uc+6/7HCsv+wvq//u8a4/73Ftv+/w7X/v8G0/8HCtP/DwbT/xMC0/8TAt//AwL7/v8DC/8DAwP/AwMD/wb/A/8G/wP/AwMD/wMDA/7/Awv+/wML/wMDC/8G/wP/EvsD/x72+/8i8vP/ZtrT/p1hT/7pRS/++TUn/xExL/8ZKSP/FSEb/xUtI/8NMSP/DTEb/w0xG/8ZLRv/HSkb/x0pG/8ZLRv/FS0b/w0xI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8ZKSP/GSkj/x0pI/8dKSP/GSkj/xkpI/8ZKSP/GSkj/xkpI/8VLSP/FS0j/xUtI/8ZKSv/GSkr/xkpK/8FLSf+7Tkn/p1ZS/9m2tP/IvLz/x72+/8a9vv/DvsL/wMDC/8DAwv+/wML/v8DC/7/Awv/AwMD/wMDA/8DAwP/AwMD/wMDC/8DAwv+/wMT/v8DC/8HAvv/DwLv/wcG5/8DBu/+/wcD/v8DE/8G+x//Evsj/wr3D/77DvP+xyqz/pdaf/yt1KP8sdin/o9Of/6zPp/+ty6n/qcKl/7PGsP+9zrz/tcG1/8bSyP+8xr7/u8W9/7rDvv+7wb3/vcHA/73BwP+/wcD/v8HA/7/Awv+/wML/wMDA/8G/wP/Bv8D/wb/A/8DAwv/AwML/v8DC/73Bwv+/wML/wMDA/8S+wP/Hvb7/yry8/9m2tP+mV1L/uVBK/75NSf/GTEv/x0lK/8dHSP/GSkj/w0xI/8NMSP/FS0j/x0pI/8lJSP/JSUj/x0pI/8VLSP/DS0r/xUtK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/JSUr/yUlK/8dJSv/HSUr/x0lK/8dJSv/HSUr/xkpK/8ZKSv/GSkr/x0lK/8dJSv/HSUz/w0tK/71NS/+pVlL/27W0/8q8vP/IvL7/xr2+/8O+wv/AwML/wMDC/7/Awv+/wML/v8DC/8DAwP/AwMD/wMDA/8DAwP/AwML/v8DC/73BxP+/wML/wcC+/8HAvP/BwLv/wMG7/7/BwP+/wMX/wb7J/8W9yv/DvMT/wMO8/7LKqv+l1p7/KXYm/yx2Kf+p1aL/uNOw/7PKrf+zx67/r76r/7fDtf+tt6//vcO//73Dwf+9w8P/usPC/7rCxP+8wcT/vMHE/73BxP+9wcT/v8DC/7/Awv/Bv8D/wb/A/8G/wP/Bv8D/wMDC/7/Awv+/wML/vcHC/7/Awv/AwMD/xL7A/8e9vv/KvLz/27W0/6dYU/+6UU3/v0tL/8dLTf/KR0z/yEZI/8dJSv/FS0r/xUtK/8VLSv/JSUr/ykhK/8pISv/JSUr/xkpM/8VKTP/GSkz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/ykdM/8xHTP/MR0z/yUhM/8lITP/JSEz/yUhM/8lITP/JSEz/xkhL/8ZIS//KR0z/ykdM/8lITf/FSkz/v01N/6tVVP/btbT/yry8/8i8vv/Gvb7/w77C/8DAwv/AwML/v8DC/7/Awv+/wML/wMDA/8DAwP/AwMD/wMDA/8DAwv+/wML/vcHE/73BxP/AwMD/wcC8/8HAu//Awbz/v8DC/7/Axf/Dvcv/x7zM/8a6xP/Cwbz/ssqq/6bVnv8pdiT/LHYp/53Hmf+0zbD/scSu/8TVw/+6xrr/xMvE/7/EwP/AxMP/vcHC/73Bwv+/wML/v8DC/8DAwv/AwML/wb/A/8DAwP+/wML/v8DC/8G/wP/Bv8D/wb/A/8G/wP/AwML/v8DC/7/Awv+9wcL/v8DC/8DAwP/Dv8D/xr2+/8q8vP/btbT/qFdU/7xQTv/CSkz/yEpO/8xGTf/LRkv/yUhM/8ZKTP/FSUv/xUlL/8lGS//LRkv/y0ZL/8lGS//GSEz/xUhM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/KR03/ykdN/8pHTf/KR03/ykdN/8pHTf/KR03/ykdN/8pHTf/KR03/ykdN/8pHTf/KR03/ykdN/8pHTf/KR03/ykdN/8pHTf/KR03/ykdN/8pHTf/KR03/ykdN/8pHTf/KR03/ykdN/8pHTf/KR03/ykdN/8pHTf/KR03/ykdN/8pHTf/JSE3/ykdN/8lITf/KR03/yUhN/8pHTf/JSE3/ykdN/8lITf/KR03/yUhN/8pHTf/JSE3/ykdN/8lITf/KR03/yUhN/8pHTf/JSE3/ykdN/8lITf/KR03/yUhN/8pHTf/JSE3/ykdN/8lITf/KR03/yUhN/8pHTf/JSE3/ykdN/8lITf/KR03/yUhN/8pHTf/JSE3/ykdN/8lITf/KR03/yUhN/8pHTf/JSE3/ykdN/8lITf/KR03/yUhN/8pHTf/JSE3/ykdN/8lITf/KR03/yUhN/8pHTf/JSE3/ykdN/8lITf/KR03/yUhN/8pHTf/JSE3/ykdN/8pHTf/KR03/ykdN/8pHTf/KR03/ykdN/8pHTf/KR03/ykdN/8pHTf/KR03/ykdN/8lITf/KR03/yUhN/8pHTf/KR03/zEZN/8pHTf/JSE3/yUhN/8pHTf/KR03/ykdN/8lITf/GSEz/xkhM/8pHTf/JSE3/yUhN/8VKTf/ATE3/rVVU/9y0tP/KvLz/x72+/8S+vv/Bv8L/wMDC/8DAwv+/wML/wMDC/8DAwv/AwMD/wMDA/8DAwP/AwMD/wMDC/7/Awv+9wcT/vcHC/7/BwP/AwL7/wMG8/8DAvv/AwML/wL/F/8O9yf/Fvcr/xrrG/8TAv/+3xq//qdOj/yx0KP8qdyf/otmg/7LYr/+hwJ7/ttO0/6K/o/+vx7H/u8vA/7nEvP+4xbv/ucW7/73Evf+/wbz/wMG8/8C/u//Evr7/w7/A/8G/wP/AwML/wb/A/8G/wP/Bv8D/wb/A/8DAwv/AwML/v8DC/73Bwv+/wML/wMDA/8O/wP/Gvb7/yry8/9y0tf+pVVX/vE5P/8JJTv/ISVD/ykdN/8pES//JSE3/xkhM/8ZITP/GSEz/yUZM/8tFTP/LRUz/yUZM/8ZHTv/GR07/yEZO/8hGTv/JRk7/yEZO/8lGTv/IRk7/yUZO/8lGTv/JRk7/yUZO/8lGTv/JRk7/yUZO/8lGTv/JRk7/yUZO/8lGTv/JRk7/yUZO/8lGTv/JRk7/yUZO/8lGTv/JRk7/yUZO/8lGTv/JRk7/yUZO/8lGTv/JRk7/yUZO/8lGTv/JRk7/yUZO/8lGTv/JRk7/yUZO/8lGTv/JRk7/yUZO/8lGTv/JRk7/yUZO/8lGTv/JRk7/yUZO/8lGTv/JRk7/yUZO/8hGTv/JRk7/yEZO/8lGTv/IRk7/yUZO/8hGTv/JRk7/yEZO/8lGTv/IRk7/yUZO/8hGTv/JRk7/yEZO/8lGTv/IRk7/yUZO/8hGTv/JRk7/yEZO/8lGTv/IRk7/yUZO/8hGTv/JRk7/yEZO/8lGTv/IRk7/yUZO/8hGTv/JRk7/yEZO/8lGTv/IRk7/yUZO/8hGTv/JRk7/yEZO/8lGTv/IRk7/yUZO/8hGTv/JRk7/yEZO/8lGTv/IRk7/yUZO/8hGTv/JRk7/yEZO/8lGTv/IRk7/yUZO/8hGTv/JRk7/yEZO/8lGTv/IRk7/yUZO/8hGTv/JRk7/yEZO/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8ZITP/IR0z/xkhM/8hHTP/GSEz/yEdM/8ZITP/IR0z/xkhM/8hHTP/GSEz/yEdM/8ZITP/IR0z/xkhM/8hHTP/GSEz/yEdM/8ZITP/IR0z/xkhM/8hHTP/GSEz/yEdM/8ZITP/IR0z/xkhM/8hHTP/GSEz/yEdM/8ZITP/IR0z/xkhM/8hHTP/GSEz/yEdM/8ZITP/IR0z/xkhM/8hHTP/GSEz/yEdM/8ZITP/IR0z/xkhM/8hHTP/GSEz/yEdM/8ZITP/IR0z/xkhM/8hHTP/GSEz/yEdM/8ZITP/IR0z/xkhM/8hHTP/GSEz/yEdM/8ZITP/IR0z/yEdM/8lITf/JSE3/yUhN/8lITf/JSE3/yUhN/8lITf/JSE3/yklO/8lITf/JSE3/xkhM/8hHTP/GSEz/yEdM/8hHTP/IR0z/yEdM/8ZITP/GSEz/yEdM/8hHTP/IR0z/yEdM/8dJTf/GSEz/xkhM/8VITP/FSEz/w0tN/8JLTf+vU1T/3bO1/8q8vP/Hvb7/w7++/8DAwv+/wML/wMDC/8DAwv/Bv8D/wb/A/8G/wP/Bv8D/wMDA/8DAwP/AwML/wMDC/7/Awv+/wcD/vcK+/73Cvv/AwMD/w77C/8O+wv/Bv8L/xMLH/7e0u//TydT/u7S7/8LJwf+52Lj/Kmgn/yt9Kf8oeib/Lngp/y9qKP84cDH/MHMw/ypnLv+t1bL/qMaq/0FkQ/8/YUD/t822/7PAr//Cxrf/xcO3/762tP/BuLv/w7/A/8C+v//Avr//wMDA/8LAwf/CwMH/wsDB/8DAwP+/wcD/v8HA/73BwP+/wcD/w7/A/8e8wP/Lu77/3bO3/61UVv+/TE//wktP/8VKT//GSEz/yEdM/8hHTP/IR0z/yUhN/8lITf/JSEz/ykdM/8lGS//IR0v/yEdM/8ZITP/IR0z/xkhM/8hHTP/GSEz/yEdM/8ZITP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEdM/8hHTP/IR0z/yEZO/8hGTv/IRk7/yEZO/8hGTv/IRk7/yEZO/8hGTv/IRk7/yEZO/8hGTv/IRk7/yEZO/8hGTv/IRk7/yEZO/8hGTv/IRk7/yEZO/8hGTv/IRk7/yEZO/8hGTv/IRk7/yEZO/8hGTv/IRk7/yEZO/8hGTv/IRk7/yEZO/8hGTv/IR0z/xkhM/8hHTP/GSEz/yEdM/8ZITP/IR0z/xkhM/8hHTP/GSEz/yEdM/8ZITP/IR0z/xkhM/8hHTP/GSEz/yEdM/8ZITP/IR0z/xkhM/8hHTP/GSEz/yEdM/8ZITP/IR0z/xkhM/8hHTP/GSEz/yEdM/8ZITP/IR0z/xkhM/8hHTP/GSEz/yEdM/8ZITP/IR0z/xkhM/8hHTP/GSEz/yEdM/8ZITP/IR0z/xkhM/8hHTP/GSEz/yEdM/8ZITP/IR0z/xkhM/8hHTP/GSEz/yEdM/8ZITP/IR0z/xkhM/8hHTP/GSEz/yEdM/8ZITP/IR0z/xkhM/8hHTP/GSEz/x0ZL/8dGSv/HRkv/x0ZK/8dGS//HRkr/x0ZL/8dGSv/HRkv/x0ZK/8dGS//HRkr/x0ZL/8dGSv/HRkv/x0ZK/8dGS//HRkr/x0ZL/8dGSv/HRkv/x0ZK/8dGS//HRkr/x0ZL/8dGSv/HRkv/x0ZK/8dGS//HRkr/x0ZL/8dGSv/GSEz/xkhL/8ZITP/GSEv/xkhM/8ZIS//GSEz/xkhL/8ZITP/GSEv/xkhM/8ZIS//GSEz/xkhL/8ZITP/GSEv/xkhM/8ZIS//GSEz/xkhL/8ZITP/GSEv/xkhM/8ZIS//GSEz/xkhL/8ZITP/GSEv/xkhM/8ZIS//GSEz/xkhL/8ZITP/GSEv/xkhM/8ZIS//GSEz/xkhL/8ZITP/GSEv/xkhM/8ZIS//GSEz/xkhL/8ZITP/GSEv/xkhM/8ZIS//GSEz/xkhL/8ZITP/GSEv/xkhM/8ZIS//GSEz/xkhL/8ZITP/GSEv/xkhM/8ZIS//GSEz/xkhL/8ZITP/GSEv/yEdM/8hHS//IR0z/yEdL/8hHTP/IR0v/yEdM/8hHS//JSE3/yUhM/8ZITP/GSEv/xkhM/8ZIS//GSEz/xkhL/8ZITP/GSEv/xkhM/8ZIS//IR0z/yEdL/8hHTP/IR0v/xUdL/8ZIS//FSEz/xUlL/8RJTP/CSkv/wkpM/7BSU//fsrX/yry8/8a9vv/Dv77/v8DC/73Bwv/AwML/wMDC/8O/wP/Dv8D/wb/A/8DAwP/AwMD/wMDA/8DAwv/AwML/wMDA/7/BwP+8wsD/vMLA/8DAwv/DvsT/w77C/8G/wP/Jycn/w8PF/8C4w/+7tr3/vsC9/6fBpv85dTf/IXMf/yN5IP8reyb/OHUv/z55N/8xeDL/NHY4/6bRpv+r0aj/P3Q8/ztwOP+327X/pr+h/7DAo/+6wq3/vbm2/9fO0//HwcP/w8HC/8LAwf/AwMD/wb/A/8C+v//Avr//vr6+/8DAwP+/wcD/vcHA/7/BwP/Dv8D/x7zA/8u6wP/fsrf/rFJU/79LTP/BSk7/wkpM/8RHS//FR0r/x0ZL/8dGSv/HRkv/x0ZK/8dGSv/HRkr/x0ZK/8dGSv/HRkr/x0ZK/8dGS//FR0r/xUdL/8VHSv/FR0v/xUdK/8VHS//FR0r/x0ZL/8dGSv/HRkv/x0ZK/8dGS//HRkr/x0ZL/8dGS//HRkv/x0ZL/8dGS//HRkv/x0ZL/8dGS//HRkv/x0ZL/8dGS//HRkv/x0ZL/8dGS//HRkv/x0ZL/8dGS//HRkv/x0ZL/8dGS//HRkv/x0ZL/8dGS//HRkv/x0ZL/8dGS//HRkv/x0ZL/8dGS//HRkv/x0ZL/8dGS//HRkv/x0ZL/8VHS//FR0r/xUdL/8VHSv/FR0v/xUdK/8VHS//FR0r/xUdL/8VHSv/FR0v/xUdK/8VHS//FR0r/xUdL/8VHSv/FR0v/xUdK/8VHS//FR0r/xUdL/8VHSv/FR0v/xUdK/8VHS//FR0r/xUdL/8VHSv/FR0v/xUdK/8VHS//FR0r/xUdL/8VHSv/FR0v/xUdK/8VHS//FR0r/xUdL/8VHSv/FR0v/xUdK/8VHS//FR0r/xUdL/8VHSv/FR0v/xUdK/8VHS//FR0r/xUdL/8VHSv/FR0v/xUdK/8VHS//FR0r/xUdL/8VHSv/FR0v/xUdK/8VHS//FR0r/xUdL/8VHSv/HRkr/x0dI/8dGSv/HR0j/x0ZK/8dHSP/HRkr/x0dI/8dGSv/HR0j/x0ZK/8dHSP/HRkr/x0dI/8dGSv/HR0j/x0ZK/8dHSP/HRkr/x0dI/8dGSv/HR0j/x0ZK/8dHSP/HRkr/x0dI/8dGSv/HR0j/x0ZK/8dHSP/HRkr/x0dI/8dGSv/HR0j/x0ZK/8dHSP/HRkr/x0dI/8dGSv/HR0j/x0ZK/8dHSP/HRkr/x0dI/8dGSv/HR0j/x0ZK/8dHSP/HRkr/x0dI/8dGSv/HR0j/x0ZK/8dHSP/HRkr/x0dI/8dGSv/HR0j/x0ZK/8dHSP/HRkr/x0dI/8dGSv/HR0j/x0ZK/8dHSP/HRkr/x0dI/8dGSv/HR0j/x0ZK/8dHSP/HRkr/x0dI/8dGSv/HR0j/x0ZK/8dHSP/HRkr/x0dI/8dGSv/HR0j/x0ZK/8dHSP/HRkr/x0dI/8dGSv/HR0j/x0ZK/8dHSP/HRkr/x0dI/8dGSv/HR0j/x0ZK/8dHSP/IRUr/yEZI/8hFSv/IRkj/yEVK/8hGSP/IRUr/yEZI/8hHS//HR0j/x0ZK/8dHSP/FR0r/xUdI/8VHSv/FR0j/x0ZK/8dHSP/HRkr/x0dI/8dGSv/HR0j/x0ZK/8dHSP/HRkr/xUdI/8VJS//FSUn/xElL/8JKSf/CSkv/sFJS/9+ztP/KvLz/xr2+/8HAvv+/wML/vcHC/8DAwv/AwML/w7/A/8O/wP/Bv8D/wMDA/8DAwP+/wcD/wMDC/8DAwv+/wML/vcHA/7rDwP+8wsD/wMDC/8G/xP/Bv8L/wMDA/7a4tf/Hycj/ubS6/8fFyv/Bxr//s9Cx/5fZkv+R4I3/oOic/5zYmP+lz53/qdCk/5vKnv+Ywpr/u9m1/6bMnf8payH/Jm8g/6LXn/+izJ7/t96x/7rVtP+wt7D/ubS6/8S/w//Bv8D/wL6//7+/v//Bv8D/wsDB/8LAwf/BwcH/wMDA/7/BwP+9wcD/v8HA/8O/wP/HvMD/y7rA/92zt/+tUVL/v0tL/8FKTP/CSkv/xUlL/8VHSP/HRkr/yEZI/8hFSv/IRkj/x0dI/8dHSP/HR0j/x0dI/8hGSP/HR0j/x0ZK/8dHSP/HRkr/x0dI/8dGSv/HR0j/x0ZK/8dHSP/HRkr/x0dI/8dGSv/HR0j/x0ZK/8dHSP/HRkr/x0dI/8dHSP/HR0j/x0dI/8dHSP/HR0j/x0dI/8dHSP/HR0j/x0dI/8dHSP/HR0j/x0dI/8dHSP/HR0j/x0dI/8dHSP/HR0j/x0dI/8dHSP/HR0j/x0dI/8dHSP/HR0j/x0dI/8dHSP/HR0j/x0dI/8dHSP/HR0j/x0dI/8dHSP/HR0j/yEhJ/8hISf/IR0v/yEhJ/8hHS//ISEn/yEdL/8hISf/IR0v/yEhJ/8hHS//ISEn/yEdL/8hISf/IR0v/yEhJ/8hHS//ISEn/yEdL/8hISf/IR0v/yEhJ/8hHS//ISEn/yEdL/8hISf/IR0v/yEhJ/8hHS//ISEn/yEdL/8hISf/IR0v/yEhJ/8hHS//ISEn/yEdL/8hISf/IR0v/yEhJ/8hHS//ISEn/yEdL/8hISf/IR0v/yEhJ/8hHS//ISEn/yEdL/8hISf/IR0v/yEhJ/8hHS//ISEn/yEdL/8hISf/IR0v/yEhJ/8hHS//ISEn/yEdL/8hISf/IR0v/yEhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/xkhJ/8ZISf/GSEn/xkhJ/8VJSf/FSUn/xUlJ/8VJSf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/FSUn/xUlJ/8RKSf/DS0r/w0tK/8JMSv+vVFP/3bO0/8q8vP/Gvb7/wcC+/7/BwP+9wcL/wMDC/8DAwv/Dv8D/wb/A/8G/wP/AwMD/v8HA/7/BwP/AwML/wMDC/7/Awv+9wcL/usPA/7rDwP+/wMT/wb/C/8G/wP/AwL7/tru1/8PIwv+5t7r/xsbG/7K9r/+mxqH/lNiN/47bif+j257/o8qe/7PKrf+8zrj/vNHA/8DVwv+2yq7/oMiU/yNyGf82kDD/l9+V/5zam/+d2Zn/kb+O/8LSxf/S0tT/w8HE/8LAwf/CwMH/wMDA/8G/wP/Avr//wL6//8C+v//AwMD/v8HA/73BwP+/wcD/w7/A/8a9wP/Ku8D/3bO3/61TU/+/S0v/wkxM/8NLTP/FS0r/xUlJ/8hISf/JSUr/yUlK/8lJSv/HSUr/x0lK/8dJSv/HSUr/yUlK/8lJSv/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xkhJ/8ZISf/GSEn/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/x0lK/8dJSv/HSUr/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUpM/8VKTP/FSkz/xUpM/8ZKTP/GSkz/xkpM/8ZKTP/FSkz/xUpM/8VKTP/FSkz/w0tM/8NLTP/DS0z/xExN/8NLTP/DS0z/xUpM/8VKTP/FSkz/xUpM/8VKTP/FSkz/xUpM/8NLTP/CSkv/wUtL/79LS//ATEz/v01M/65UU//ctLT/yLy8/8S+vv/BwL7/v8HA/73BwP/AwML/wMDC/8O/wP/Bv8D/wcC+/8DAvv+/wcD/v8HA/8DAwP/AwML/v8DC/73Bwv+5xMD/usPA/73BxP/AwML/wMDA/7/BvP/Ey8P/t762/7u7u//CxL//tMGv/57DmP9EjTz/Jm8e/6bLn/+3xq//ycvA/8C6uv+8tb3/vL2//62+q/+w36n/Jn4a/xR8Df8ifCL/Inck/yh+J/8zdjH/s820/7e7uv/Bv8D/wb/A/8G/wP/AwMD/wMDA/8DAwP/Avr//wL6//8DAwP+/wcD/vcHA/7/BwP/Bv8D/xr3A/8q7wP/cs7f/rFRT/71NS/++TEv/v0tL/8FLS//CSkv/xkpK/8ZKSv/GSkr/xkpK/8VLSv/FS0r/xEpJ/8RKSf/FSUn/xUlJ/8RJS//ESUv/xElL/8RJS//ESUv/xElL/8RJS//ESUv/xElL/8RJS//ESUv/xElL/8RJS//ESUv/xElL/8RKSf/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/FS0r/xUtK/8VLSv/CS03/wkxM/8JLTf/CTEz/wktN/8JMTP/CS03/wkxM/8JLTf/CTEz/wktN/8JMTP/CS03/wkxM/8JLTf/CTEz/wktN/8JMTP/CS03/wkxM/8JLTf/CTEz/wktN/8JMTP/CS03/wkxM/8JLTf/CTEz/wktN/8JMTP/CS03/wkxM/8JLTf/ATEz/wktN/8BMTP/CS03/wExM/8JLTf/ATEz/wktN/8BMTP/CS03/wExM/8JLTf/ATEz/wktN/8BMTP/CS03/wExM/8JLTf/ATEz/wktN/8BMTP/CS03/wExM/8JLTf/ATEz/wktN/8BMTP/CS03/wExM/8JLTf/ATEz/wktN/8BMTP/CS03/wExM/8JLTf/ATEz/wktN/8BMTP/CS03/wExM/8JLTf/ATEz/wktN/8BMTP/CS03/wExM/8JLTf/ATEz/wktN/8BMTP/CS03/wExM/8JLTf/ATEz/wktN/8BMTP/CS03/wExM/8JLTf/ATEz/wktN/8BMTf/CS03/wExN/8JLTf/CS03/wktN/8JLTf/CS03/wktN/8JLTf/ATE3/wktN/8BMTf/ATE3/v01N/8BMTf/ATE3/wExN/8BMTf/ATE//wExN/8JLT//ATE3/wktP/8BMTf/CS0//wExN/75LTv+9TUz/vUxO/7tNTP+8Tk//q1VW/9u0tf/Hvbz/xL6+/8HAvv+/wcD/v8HA/8DAwv/Bv8L/wb/A/8G/wP/AwL7/wMC+/7/BwP+/wcD/wMDA/8DAwP+/wMT/vcHC/7nDwv+5xMD/vcHC/7/Awv/AwMD/v8G8/73HvP+tt6z/xMbD/8HGv/+9zLf/q9Kl/zJ9Kv8daxX/pdSd/7bOrP++yLD/tbWt/9DGzv/Lxsz/tsSz/7Dcq/80iyz/FX8Q/x9+Iv8nhCv/GXkY/yNwIv+427r/qbSs/729u/+/vb7/wL6//8DAwP/BwcH/wcHB/8LAwf/CwMH/wMDA/8DAwP+/wcD/v8HA/8G/wP/EvsD/yLzA/9u0t/+pVVX/uk5M/7tNTv+9TUz/vktO/79LTP/CS03/wkxM/8NLTf/CTEz/wUpM/79LS//BSkz/wUtL/8FKTP/BSkz/wUpM/79LTP/BSkz/v0tM/8FKTP+/S0z/wUpM/79LTP/BSkz/v0tM/8FKTP+/S0z/wUpM/79LTP/BSkz/v0tM/8JLTf/ATEz/wkxM/8BMTP/CTEz/wExM/8JMTP/ATEz/wkxM/8BMTP/CTEz/wExM/8JMTP/ATEz/wkxM/8BMTP/CTEz/wExM/8JMTP/ATEz/wkxM/8BMTP/CTEz/wExM/8JMTP/ATEz/wkxM/8BMTP/CTEz/wExM/8JMTP/ATEz/wkxM/8BMTP/CS03/wExM/8JLTf/ATEz/wktN/8BMTP/CS03/wExM/8JLTf/ATEz/wktN/8BMTP/CS03/wExM/8JLTf/ATEz/wktN/8BMTP/CS03/wExM/8JLTf/ATEz/wktN/8BMTP/CS03/wExM/8JLTf/ATEz/wktN/8BMTP/CS03/wExM/8JLTf/ATEz/wktN/8BMTP/CS03/wExM/8JLTf/ATEz/wktN/8BMTP/CS03/wExM/8JLTf/ATEz/wktN/8BMTP/CS03/wExM/8JLTf/ATEz/wktN/8BMTP/CS03/wExM/8JLTf/ATEz/wktN/8BMTP/CS03/wExM/71MUv+9TFD/vUxS/71MUP+9TFL/vUxQ/71MUv+9TFD/vUxS/71MUP+9TFL/vUxQ/71MUv+9TFD/vUxS/71MUP+9TFL/vUxQ/71MUv+9TFD/vUxS/71MUP+9TFL/vUxQ/71MUv+9TFD/vUxS/71MUP+9TFL/vUxQ/71MUv+9TFD/vUxS/7tNUP+9TFL/u01Q/71MUv+7TVD/vUxS/7tNUP+9TFL/u01Q/71MUv+7TVD/vUxS/7tNUP+9TFL/u01Q/71MUv+7TVD/vUxS/7tNUP+9TFL/u01Q/71MUv+7TVD/vUxS/7tNUP+9TFL/u01Q/71MUv+7TVD/vUxS/7tNUP+9TFL/u01Q/71MUv+7TVD/vUxS/7tNUP+9TFL/u01Q/71MUv+7TVD/vUxS/7tNUP+9TFL/u01Q/71MUv+7TVD/vUxS/7tNUP+9TFL/u01Q/71MUv+7TVD/vUxS/7tNUP+9TFL/u01Q/71MUv+7TVD/vUxS/7tNUP+9TFL/u0xS/71MUv+7TFL/vUxS/71MUv+9TFL/vUxS/71MUv+9TFL/vk1T/7xNU/++TVP/vE1T/7xNU/+7TlP/vE1T/7xNU/+8TVP/u0xS/7tMU/+7TFL/vUtT/7tMUv+9S1P/vE1T/75MVP+8TVP/u0xT/7pNUv+6TVP/uE5S/7lOVP+oVlr/2La3/8a+vP/Dv77/wcC+/7/BwP+/wcD/wMDC/8G/wv/Bv8D/wb/A/8DAvv/AwL7/v8HA/7/BwP/AwMD/wMDA/7/AxP+9wcL/usPC/7rDwP+/wML/wMDC/8DAwP+/wbz/t8G2/7fBtv/HycT/ur+4/7TDrv+exZj/Lnkm/yiCIP8mdRr/MnMj/zhpKP9ScUX/sL2r/73Duf+4wLH/ocGc/xppGP8mhSf/j+KQ/4rciv8uiSr/G2oZ/6vYr/+5zr3/vcK8/8G/wP/CwMH/wMDA/8DAwP+/v7//wL6//8C+v//AwMD/wMDA/7/BwP+/wcD/wb/A/8S+wP/HvMD/2bW5/6dXWv+4T1P/uU5U/7tOU/+8TVT/vUxS/75NU/++TVH/vktS/71MUP+9TFL/u01Q/71MUv+9TFD/vUxS/75NU/++TVP/vE1T/75NU/+8TVP/vk1T/7xNU/++TVP/vE1T/75NU/+8TVP/vk1T/7xNU/++TVP/vE1T/75NU/+8TVP/vkxU/7xNVP++TFT/vE1U/75MVP+8TVT/vkxU/7xNVP++TFT/vE1U/75MVP+8TVT/vkxU/7xNVP++TFT/vE1U/75MVP+8TVT/vkxU/7xNVP++TFT/vE1U/75MVP+8TVT/vkxU/7xNVP++TFT/vE1U/75MVP+8TVT/vkxU/7xNU/++TVP/vE5R/75NU/+8TlH/vk1T/7xOUf++TVP/vE5R/75NU/+8TlH/vk1T/7xOUf++TVP/vE5R/75NU/+8TlH/vk1T/7xOUf++TVP/vE5R/75NU/+8TlH/vk1T/7xOUf++TVP/vE5R/75NU/+8TlH/vk1T/7xOUf++TVP/vE5R/75NU/+8TlH/vk1T/7xOUf++TVP/vE5R/75NU/+8TlH/vk1T/7xOUf++TVP/vE5R/75NU/+8TlH/vk1T/7xOUf++TVP/vE5R/75NU/+8TlH/vk1T/7xOUf++TVP/vE5R/75NU/+8TlH/vk1T/7xOUf++TVP/vE5R/75NU/+8TlH/qlRX/6pUV/+qVFf/qlRX/6pUV/+qVFf/qlRX/6pUV/+qVFf/qlRX/6pUV/+qVFf/qlRX/6pUV/+qVFf/qlRX/6pUV/+qVFf/qlRX/6pUV/+qVFf/qlRX/6pUV/+qVFf/qlRX/6pUV/+qVFf/qlRX/6pUV/+qVFf/qlRX/6pUV/+rVVj/qlVY/6tVWP+qVVj/q1VY/6pVWP+rVVj/qlVY/6tVWP+qVVj/q1VY/6pVWP+rVVj/qlVY/6tVWP+qVVj/q1VY/6pVWP+rVVj/qlVY/6tVWP+qVVj/q1VY/6pVWP+rVVj/qlVY/6tVWP+qVVj/q1VY/6pVWP+rVVj/qlVY/6tVWP+qVVj/q1VY/6pVWP+rVVj/qlVY/6tVWP+qVVj/q1VY/6pVWP+rVVj/qlVY/6tVWP+qVVj/q1VY/6pVWP+rVVj/qlVY/6tVWP+qVVj/q1VY/6pVWP+rVVj/qlVY/6tVWP+qVVj/q1VY/6pVWP+rVVj/qlVY/6tVWP+qVVj/q1VY/6pVWP+rVVj/qlVY/6tVWP+qVVj/q1VY/6pVWP+rVVj/qlVY/6xWWf+qVVj/qlVY/6hWWP+qVVj/qlVY/6pVWv+qVVr/qlVa/6pVWv+rVFr/qlVa/6tUWv+qVVr/qlVa/6pVWv+qVVr/qFZa/6hWWv+nV1r/p1da/5pcXf/SuLn/xr68/8O/vv/AwL7/v8HA/7/BwP/Bv8L/wb/C/8G/wP/Bv8D/wMC+/8DAvv+/wcD/v8HA/8G/wP/Bv8D/wMDC/73Bwv+6w8D/usPA/7/Awv/AwMD/wMDA/7/BvP+4wLX/v8m+/77Au/+7wLn/wNG+/6HIm/8teCb/G3cU/yd8Hv8yfCX/MWki/0NrN/+rxKT/s8Kv/8DLvf+tzKz/Nn05/x11If+f6J//j9eN/y6CKv8ueyv/odGh/6rCqv+8wbv/wL6//8DAwP/AwMD/wMDA/8DAwP/CwMH/wsDB/8DAwP/AwMD/v8HA/7/BwP/AwMD/w7/A/8a9wP/Ut7v/mV1f/6ZXWv+oWFv/qFZa/6pVWv+qU1n/qlRX/6pUV/+qVFf/qlRX/6pUV/+pVFf/qlRX/6pUV/+rVVj/q1VY/6tVWP+qVVj/q1VY/6pVWP+rVVj/qlVY/6tVWP+qVVj/q1VY/6pVWP+rVVj/qlVY/6tVWP+qVVj/q1VY/6pVWv+rVFz/qlVc/6tUXP+qVVz/q1Rc/6pVXP+rVFz/qlVc/6tUXP+qVVz/q1Rc/6pVXP+rVFz/qlVc/6tUXP+qVVz/q1Rc/6pVXP+rVFz/qlVc/6tUXP+qVVz/q1Rc/6pVXP+rVFz/qlVc/6tUXP+qVVz/q1Rc/6pVXP+rVFz/qlVc/6tUWv+qVVj/q1VY/6pVWP+rVVj/qlVY/6tVWP+qVVj/q1VY/6pVWP+rVVj/qlVY/6tVWP+qVVj/q1VY/6pVWP+rVVj/qlVY/6tVWP+qVVj/q1VY/6pVWP+rVVj/qlVY/6tVWP+qVVj/q1VY/6pVWP+rVVj/qlVY/6tVWP+qVVj/q1VY/6pVWP+rVVj/qlVY/6tVWP+qVVj/q1VY/6pVWP+rVVj/qlVY/6tVWP+qVVj/q1VY/6pVWP+rVVj/qlVY/6tVWP+qVVj/q1VY/6pVWP+rVVj/qlVY/6tVWP+qVVj/q1VY/6pVWP+rVVj/qlVY/6tVWP+qVVj/q1VY/6pVWP/ctLL/3LSy/9y0sv/ctLL/3LSy/9y0sv/ctLL/3LSy/9y0sv/ctLL/3LSy/9y0sv/ctLL/3LSy/9y0sv/ctLL/3LSy/9y0sv/ctLL/3LSy/9y0sv/ctLL/3LSy/9y0sv/ctLL/3LSy/9y0sv/ctLL/3LSy/9y0sv/ctLL/3LSy/9y0sv/btbL/3LSy/9u1sv/ctLL/27Wy/9y0sv/btbL/3LSy/9u1sv/ctLL/27Wy/9y0sv/btbL/3LSy/9u1sv/ctLL/27Wy/9y0sv/btbL/3LSy/9u1sv/ctLL/27Wy/9y0sv/btbL/3LSy/9u1sv/ctLL/27Wy/9y0sv/btbL/3LSy/9u1sv/ctLL/27Wy/9y0sv/btbL/3LSy/9u1sv/ctLL/27Wy/9y0sv/btbL/3LSy/9u1sv/ctLL/27Wy/9y0sv/btbL/3LSy/9u1sv/ctLL/27Wy/9y0sv/btbL/3LSy/9u1sv/ctLL/27Wy/9y0sv/btbL/3LSy/9u1sv/ctLL/27Wy/9y0sv/btbL/3LSy/9u1sv/ctLL/27Wy/9y0sv/btbL/3LSy/9u1sv/btbL/2bay/9u1sv/btbL/27Wy/9u1sv/btbL/27Wy/9y0sv/btbL/3LSy/9u1sv/btbL/27Wy/9u1sv/ZtrL/2bay/9i3sv/Yt7L/1Li0/8q8u//Ev7z/wcC+/8DAvv+/wcD/v8DC/8G/wv/Bv8L/wb/A/8G/wP/AwL7/v8G+/7/BwP+/wcD/wb/A/8G/wP/Bv8L/v8DC/7zCwP+8wsD/wMDC/8G/wP/Bv8D/v8G8/7zDu//Ey8P/urq4/7e8tv/B0sD/pcyg/y13KP8fcxv/lNeQ/6HSmv+w0ab/qcOg/7nTtv+yzLP/t8y7/6rPsP8scTL/MoM2/yZpJP81eDH/KXYk/ypxJf+n06D/r8ap/7zBuv/Avr//wMDA/7/BwP+/wcD/wMDA/8G/wP/Bv8D/wb/A/8DAwP+/wcD/v8HA/8DAwP/Bv8D/xL7A/8q8vP/SuLf/2La0/9m2tP/btbT/27Wy/9y0sv/ctLL/3LSy/9y0sv/ctLL/3LSy/9u1sv/ctLL/3LSy/9y0sv/ctLL/3LSy/9u1sv/ctLL/27Wy/9y0sv/btbL/3LSy/9u1sv/ctLL/27Wy/9y0sv/btbL/3LSy/9u1sv/ctLL/27Wy/9y0tP/btLX/3LS1/9u0tf/ctLX/27S1/9y0tf/btLX/3LS1/9u0tf/ctLX/27S1/9y0tf/btLX/3LS1/9u0tf/ctLX/27S1/9y0tf/btLX/3LS1/9u0tf/ctLX/27S1/9y0tf/btLX/3LS1/9u0tf/ctLX/27S1/9y0tf/btbT/3LSy/9u1sv/ctLL/27Wy/9y0sv/btbL/3LSy/9u1sv/ctLL/27Wy/9y0sv/btbL/3LSy/9u1sv/ctLL/27Wy/9y0sv/btbL/3LSy/9u1sv/ctLL/27Wy/9y0sv/btbL/3LSy/9u1sv/ctLL/27Wy/9y0sv/btbL/3LSy/9u1sv/ctLL/27Wy/9y0sv/btbL/3LSy/9u1sv/ctLL/27Wy/9y0sv/btbL/3LSy/9u1sv/ctLL/27Wy/9y0sv/btbL/3LSy/9u1sv/ctLL/27Wy/9y0sv/btbL/3LSy/9u1sv/ctLL/27Wy/9y0sv/btbL/3LSy/9u1sv/ctLL/27Wy/8q8uf/Kvbf/yry5/8q9t//KvLn/yr23/8q8uf/Kvbf/yry5/8q9t//KvLn/yr23/8q8uf/Kvbf/yry5/8q9t//KvLn/yr23/8q8uf/Kvbf/yry5/8q9t//KvLn/yr23/8q8uf/Kvbf/yry5/8q9t//KvLn/yr23/8q8uf/Kvbf/yry5/8i9t//KvLn/yL23/8q8uf/Ivbf/yry5/8i9t//KvLn/yL23/8q8uf/Ivbf/yry5/8i9t//KvLn/yL23/8q8uf/Ivbf/yry5/8i9t//KvLn/yL23/8q8uf/Ivbf/yry5/8i9t//KvLn/yL23/8q8uf/Ivbf/yry5/8i9t//KvLn/yL23/8q8uf/Ivbf/yry5/8i9t//KvLn/yL23/8q8uf/Ivbf/yry5/8i9t//KvLn/yL23/8q8uf/Ivbf/yry5/8i9t//KvLn/yL23/8q8uf/Ivbf/yry5/8i9t//KvLn/yL23/8q8uf/Ivbf/yry5/8i9t//KvLn/yL23/8q8uf/Ivbf/yry5/8q9t//KvLn/yr23/8q8uf/Kvbf/yry5/8q9t//KvLn/yL23/8i9uf/Ivbf/yL25/8i9t//Ivbn/yL23/8i9uf/Ivbf/yry5/8i9t//KvLn/yL23/8i9uf/Ivbf/yL25/8i9t//Hvrn/x763/8e+uf/Gv7n/xL+8/8O/vP/AwL7/wMDA/7/Awv+/wML/wb/C/8G/wv/Bv8D/wMDA/7/Bvv+/wb7/v8HA/7/BwP/AwMD/wb/A/8G/wv/AwMD/vMK+/7zCvv/AwML/wb/C/8G/wP/AwL7/u8C5/7zDvP/Gxsb/u726/7LAsf+dw5z/LXUr/zF+Lv+l2qb/rs+w/7nMuP+0xbP/tMy2/7DJs/+zyLn/pMSs/zZxO/8tcC3/NGsx/0N5P/8wbiv/PnY3/7LWqv+yxKr/vsG6/8G/wP/AwMD/v8HA/7/BwP+/wcD/wMDA/8G/wP/Bv8D/wMDA/8DAwP+/wcD/wMDA/8G/wP/EvsD/xr2+/8a+u//Gv7n/x727/8i9uf/KvLn/yry5/8q8uf/Kvbf/yry5/8q9t//KvLn/yL25/8q8uf/KvLn/yry5/8q8uf/KvLn/yry5/8q8uf/KvLn/yry5/8q8uf/KvLn/yry5/8q8uf/KvLn/yry5/8i9uf/KvLn/yL25/8q8uf/Ivbn/yry7/8i9u//KvLv/yL27/8q8u//Ivbv/yry7/8i9u//KvLv/yL27/8q8u//Ivbv/yry7/8i9u//KvLv/yL27/8q8u//Ivbv/yry7/8i9u//KvLv/yL27/8q8u//Ivbv/yry7/8i9u//KvLv/yL27/8q8u//Ivbv/yry7/8i9u//KvLn/yL23/8q8uf/Ivbf/yry5/8i9t//KvLn/yL23/8q8uf/Ivbf/yry5/8i9t//KvLn/yL23/8q8uf/Ivbf/yry5/8i9t//KvLn/yL23/8q8uf/Ivbf/yry5/8i9t//KvLn/yL23/8q8uf/Ivbf/yry5/8i9t//KvLn/yL23/8q8uf/Ivbf/yry5/8i9t//KvLn/yL23/8q8uf/Ivbf/yry5/8i9t//KvLn/yL23/8q8uf/Ivbf/yry5/8i9t//KvLn/yL23/8q8uf/Ivbf/yry5/8i9t//KvLn/yL23/8q8uf/Ivbf/yry5/8i9t//KvLn/yL23/8q8uf/Ivbf/xr2+/8a+vP/Gvb7/xr68/8a9vv/Gvrz/xr2+/8a+vP/Gvb7/xr68/8a9vv/Gvrz/xr2+/8a+vP/Gvb7/xr68/8a9vv/Gvrz/xr2+/8a+vP/Gvb7/xr68/8a9vv/Gvrz/xr2+/8a+vP/Gvb7/xr68/8a9vv/Gvrz/xr2+/8a+vP/Gvb7/xL+8/8a9vv/Ev7z/xr2+/8S/vP/Gvb7/xL+8/8a9vv/Ev7z/xr2+/8S/vP/Gvb7/xL+8/8a9vv/Ev7z/xr2+/8S/vP/Gvb7/xL+8/8a9vv/Ev7z/xr2+/8S/vP/Gvb7/xL+8/8a9vv/Ev7z/xr2+/8S/vP/Gvb7/xL+8/8a9vv/Ev7z/xr2+/8S/vP/Gvb7/xL+8/8a9vv/Ev7z/xr2+/8S/vP/Gvb7/xL+8/8a9vv/Ev7z/xr2+/8S/vP/Gvb7/xL+8/8a9vv/Ev7z/xr2+/8S/vP/Gvb7/xL+8/8a9vv/Ev7z/xr2+/8S/vP/Gvb7/xL+8/8a9vv/Ev7z/xr2+/8S/vP/Gvb7/xr68/8a9vv/Gvrz/xr2+/8a+vP/Gvb7/xr68/8a9vv/Ev7z/xL6+/8S/vP/Evr7/xL+8/8S+vv/Ev7z/xL6+/8S/vP/Gvb7/xL+8/8a9vv/Ev7z/xL6+/8S/vP/Evr7/xL+8/8S+vv/Ev7z/w7++/8O/vv/Dv77/wcC+/8DAwP+/wcD/v8DC/7/Awv/Bv8L/wb/C/8G/wP/AwMD/v8HA/73BwP+9wcD/v8HA/8DAwP/Bv8D/wb/A/8DAwP+9wr7/vcK+/8G/wv/DvsL/w7/A/8DAvv/Cx8H/srez/8TCxf/DxcT/vcm9/6zQrP8yeDD/IGgf/6TMqf+qwLP/tcPD/7vHx/+0xLn/vMq9/8TOxv+3ybn/qNGl/67eqv+jyJ//nr6Z/7HWrf+gwp3/tsqx/7vGtv/Awbz/wb/A/8DAwP+/wcD/vcHA/7/BwP/AwMD/wb/A/8G/wP/AwMD/wMDA/7/BwP/AwMD/wb/A/8O/wP/Dv8D/w7/A/8O/vv/EvsD/xL6+/8a9vv/Gvb7/xr2+/8a+vP/Gvb7/xr68/8a9vv/Evr7/xr2+/8a9vv/Gvb7/xr2+/8a9vv/Gvb7/xr2+/8a9vv/Gvb7/xr2+/8a9vv/Gvb7/xr2+/8a9vv/Gvb7/xL6+/8a9vv/Evr7/xr2+/8S+vv/Gvb7/xL6+/8a9vv/Evr7/xr2+/8S+vv/Gvb7/xL6+/8a9vv/Evr7/xr2+/8S+vv/Gvb7/xL6+/8a9vv/Evr7/xr2+/8S+vv/Gvb7/xL6+/8a9vv/Evr7/xr2+/8S+vv/Gvb7/xL6+/8a9vv/Evr7/xr2+/8S+vv/Gvb7/xL6+/8a9vv/Ev7z/xr2+/8S/vP/Gvb7/xL+8/8a9vv/Ev7z/xr2+/8S/vP/Gvb7/xL+8/8a9vv/Ev7z/xr2+/8S/vP/Gvb7/xL+8/8a9vv/Ev7z/xr2+/8S/vP/Gvb7/xL+8/8a9vv/Ev7z/xr2+/8S/vP/Gvb7/xL+8/8a9vv/Ev7z/xr2+/8S/vP/Gvb7/xL+8/8a9vv/Ev7z/xr2+/8S/vP/Gvb7/xL+8/8a9vv/Ev7z/xr2+/8S/vP/Gvb7/xL+8/8a9vv/Ev7z/xr2+/8S/vP/Gvb7/xL+8/8a9vv/Ev7z/xr2+/8S/vP/Gvb7/xL+8/8a9vv/Ev7z/xr2+/8S/vP/Dv8D/w7/A/8O/wP/Dv8D/w7/A/8O/wP/Dv8D/w7/A/8O/wP/Dv8D/w7/A/8O/wP/Dv8D/w7/A/8O/wP/Dv8D/w7/A/8O/wP/Dv8D/w7/A/8O/wP/Dv8D/w7/A/8O/wP/Dv8D/w7/A/8O/wP/Dv8D/w7/A/8O/wP/Dv8D/w7/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/w7/A/8O/wP/Dv8D/w7/A/8O/wP/Dv8D/w7/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8HAvv/AwL7/v8HA/7/BwP+/wML/wMDC/8G/wv/Bv8L/wb/C/8DAwP+/wcD/vcHA/73BwP+/wcD/wMDA/8G/wP/Bv8D/wMDA/73Cvv+9wcD/wb/C/8O+wv/Dv8D/wcC+/8jNyf+5vrr/uri9/8TExv+1v7b/ocOi/0aJQv8nbSf/r9K0/7XEv/+9yM7/wcrR/7K9uf+2wbn/vsW+/7DDr/+Xw5L/pdae/77etf+xz6v/ut64/6rJp/+vwav/wMi9/8HAvv/Bv8D/wMDA/7/BwP+9wcD/v8HA/8DAwP/Bv8D/wb/A/8DAwP/AwMD/v8HA/8DAwP/AwMD/wb/A/8G/wP/Bv8L/wMDC/8G/wv/Bv8L/w77C/8O+wv/Dv8D/w7/A/8O/wP/Dv8D/wb/A/8G/wv/Bv8L/wb/C/8O+wv/DvsL/w77C/8O+wv/DvsL/w77C/8O+wv/DvsL/w77C/8O+wv/DvsL/w77C/8O+wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8G/wv/Bv8L/wb/C/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwMD/wMC+/8DAvv+/wcD/vcHA/7/Awv/Av8T/wb/E/8O+wv/Bv8L/wMDC/7/BwP+9wcD/vcHA/7/BwP/AwMD/wb/A/8DAwv+/wcD/vMK+/7zCwP/AwML/wb/C/8O/wP/BwL7/t7y4/8XKxv+6uL3/ycjN/7C6sf+lx6b/ldiR/5jblP+oyar/sb61/7nDxf+7wsj/tsLA/7TDvP+6yr3/rc+u/zt9Nv8uciX/nc2R/5vGkP84cjX/RXpE/7DJrP+9xbj/wcC8/8G/wP+/wcD/vcHA/73BwP+/wcD/wMDA/8G/wP/Bv8D/wMDA/8DAwP+/wcD/v8HA/8DAwP/Bv8D/wb/A/7/Awv+/wMT/wL/E/8C/xP/Bv8L/wb/C/8G/wv/Bv8L/wMDC/8DAwv/AwML/wL/E/8C/xP/Av8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Av8T/wL/E/8C/xP/Av8T/wL/E/8C/xP/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/7/Awv/AwML/v8DC/8DAwv+/wML/wMDC/7/Awv/AwML/v8DC/8DAwv+/wML/wMDC/7/Awv/AwML/v8DC/8DAwv+/wML/wMDC/7/Awv/AwML/v8DC/8DAwv+/wML/wMDC/7/Awv/AwML/v8DC/8DAwv+/wML/wMDC/7/Awv+/wML/v8DC/7/Awv+/wML/v8DC/7/Awv+/wML/v8DC/7/Awv+/wML/v8DC/7/Awv+/wML/v8DC/7/Awv+/wML/v8DC/7/Awv+/wML/v8DC/7/Awv+/wML/v8DC/7/Awv+/wML/v8DC/7/Awv+/wML/v8DC/7/Awv+/wML/v8DC/7/Awv+/wML/v8DC/7/Awv+/wML/v8DC/7/Awv+/wML/v8DC/7/Awv+/wML/v8DC/7/Awv+/wML/v8DC/7/Awv+/wML/v8DC/7/Awv+/wML/v8DC/7/Awv+/wML/v8DC/7/Awv+/wML/v8DC/7/Awv+/wML/v8DC/7/Awv+/wML/v8DC/7/Awv+/wML/v8DC/7/Awv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv+/wML/wMDC/7/Awv+/wML/v8DC/7/Awv+/wML/wMDC/7/Awv/AwML/v8DC/7/Awv+/wML/v8DC/7/Awv+/wML/v8DC/7/Awv+/wML/v8DC/7/BwP/AwL7/v8G+/73BwP+9wcL/v8DE/8C/xP/Bv8T/w77E/8G/wv/AwML/v8HA/73BwP+9wcD/v8HA/8DAwP/Bv8D/wMDC/7/Awv+8wsD/vMLA/8DAwv/Bv8L/w77C/8HAvv+2u7f/xcrG/7m0uv/Jx8r/vce+/7TTsf+Z25T/mOCU/7DgrP+z1bL/tNC5/6rAs//F1M3/t8a//7LHtv+izKT/L3kq/yZ2Hf+q4pv/qN2Z/yBpGv8paij/rsus/7zEt//AwL7/wb/A/7/BwP+9wcD/vcHA/7/BwP/AwMD/wb/A/8G/wP/AwMD/wMDA/7/BwP+/wcD/v8HA/8DAwP/AwMD/wMHD/8DBw//AwcX/wcHD/8HBw//BwcP/wcHD/8HBw//BwcP/wMHD/8DBw//AwcP/wMHF/8DBxf/BwMX/wcDF/8HAxf/BwcP/wcDF/8HBw//BwMX/wcHD/8HAxf/BwcP/wcDF/8HBw//BwMX/wMHD/8HAxf/AwcP/wMHF/8DBw//AwcP/wMHD/8HBw//AwcP/wcHD/8DBw//BwcP/wMHD/8HBw//AwcP/wcHD/8DBw//BwcP/wMHD/8HBw//AwcP/wcHD/8DBw//BwcP/wMHD/8HBw//AwcP/wcHD/8DBw//BwcP/wMHD/8HBw//AwcP/wcHD/8DBw//BwcP/wMHD/8DBw//AwcP/wMHD/8DBw//AwcP/wMHD/8DBw//AwcP/wMHD/8DBw//AwcP/wMHD/8DBw//AwcP/wMHD/8DBw//AwcP/wMHD/8DBw//AwcP/wMHD/8DBw//AwcP/wMHD/8DBw//AwcP/wMHD/8DBw//AwcP/wMHD/8DBw//AwcP/wMHD/8DBw//AwcP/wMHD/8DBw//AwcP/wMHD/8DBw//AwcP/wMHD/8DBw//AwcP/wMHD/8DBw//AwcP/wMHD/8DBw//AwcP/wMHD/8DBw//AwcP/wMHD/8DBw//AwcP/wMHD/8DBw//AwcP/wMHD/8DBw//AwcP/wMHD/8DBw//Bv8D/wMDA/8G/wP/AwMD/wb/A/8DAwP/Bv8D/wMDA/8G/wP/AwMD/wb/A/8DAwP/Bv8D/wMDA/8G/wP/AwMD/wb/A/8DAwP/Bv8D/wMDA/8G/wP/AwMD/wb/A/8DAwP/Bv8D/wMDA/8G/wP/AwMD/wb/A/8DAwP/Bv8D/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8DAwP/Bv8D/wMDA/8DAwP/AwMD/wMDA/8DAwP/Bv8D/wMDA/8G/wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/Bvv+/wb7/vcHA/73Bwv+/wMT/wL/E/8G/xP/DvsT/wb/C/8DAwv+/wcD/vcHA/73BwP+/wcD/wMDC/8G/wv/Av8T/v8DC/7rDwP+8wsD/wMDC/8G/wv/DvsL/wcC+/8jNyf+/xMD/vbi+/7u5vP+7wrr/p8ak/zl7NP8idRv/IXAU/yRvGv8xdC3/P3FA/6nArP+xvrX/tMu7/6vYsf8fbB7/LH8l/5vXjf+i3JL/Nokv/zN9MP+qzKv/usS7/8HBv//Bv8D/v8HA/73BwP+9wcD/v8HA/8DAwP/Bv8D/wb/A/8DAwP/AwMD/v8HA/7/BwP+/wcD/wMDA/8DAwP/AwsH/wMLB/8HBw//CwMH/wsDB/8LAwf/CwMH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcP/wcHD/8LAw//CwMP/wsDD/8LAwf/CwMP/wsDB/8LAw//CwMH/wsDD/8LAwf/CwMP/wsDB/8LAw//BwcH/wsDD/8HBwf/BwcP/wcHD/8HBw//BwMX/wsDF/8HAxf/CwMX/wcDF/8LAxf/BwMX/wsDF/8HAxf/CwMX/wcDF/8LAxf/BwMX/wsDF/8HAxf/CwMX/wcDF/8LAxf/BwMX/wsDF/8HAxf/CwMX/wcDF/8LAxf/BwMX/wsDF/8HAxf/CwMX/wcDF/8LAxf/BwcP/wcHD/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wMDA/8DAwP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMC+/7/Bvv+9wcL/vcHC/8C/xP/BvsX/w77F/8O+xf/Bv8T/wb/E/8G/wv/AwML/vcHA/73BwP/AwMD/wb/C/8G/wv+/wML/vMLA/7zCwP+/wML/wb/C/8O+wv/BwL7/v8S+/7G2sv/Nzc//u7u7/8DIu/+52bT/KGwh/yuCIf8qiBr/JYIX/yZ/If8ucSz/t9S2/7bGuf+yy7j/o9Gq/yl6Lf8jeR7/ltmJ/6Dkkf8YchD/G20Z/7fduP+2wrj/wMK//8LAwf+/wcD/vcHA/7/BwP+/wcD/wMDA/8G/wP/Bv8D/wMDA/8DAwP+/wcD/v8HA/7/BwP/AwMD/wMDA/7/BwP+/wcD/wMDA/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wb/C/8G/wv/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8DAwP/AwMD/wb/C/8G/wv/Bv8T/wb/C/8G/xP/Bv8L/wb/E/8G/wv/Bv8T/wb/C/8G/xP/Bv8L/wb/E/8G/wv/Bv8T/wb/C/8G/xP/Bv8L/wb/E/8G/wv/Bv8T/wb/C/8G/xP/Bv8L/wb/E/8G/wv/Bv8T/wb/C/8G/xP/Bv8L/wb/E/8G/wv/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP+/wcD/wMDA/8DAwP/AwMD/wMDA/8G/wP/Bv8D/wb/A/8G/wP/BwL7/wMC+/7zAwf++v8P/w7zE/8a6xv/Du8j/wrzI/8K8yP/Du8b/xrrE/8O8w/++v8H/vMC//8DAwP/Dv8D/w7/A/8G/wP+/wcD/v8HA/7/Awv/AwML/wb/C/8HAvv++w7z/v8a//7zAv//Axb//ucSz/7HRqP8tdiX/In4Z/4vjff+Y8Iz/G3YZ/zJ6Mf+qzKn/scSw/63Osf+i16n/H3El/xl2G/83hiv/Knsc/x6BF/8keiP/os2i/7zNvf+8wb3/wMDA/8DAwP+/wcD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8HA/7/BwP+/wcD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwv/AwMD/wMDC/8DAwP/AwML/wMDA/8DAwv/AwMD/wMDC/8DAwP/AwML/wMDA/8DAwv/AwMD/wMDC/8DAwP/AwML/wMDA/8DAwv/AwMD/wMDC/8DAwP/AwML/wMDA/8DAwv/AwMD/wMDC/8DAwP/AwML/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8HA/7/BwP/AwMD/wMDA/8DAwP/AwMD/wb/A/8G/wP/Dv8D/w7/A/8C+v/++wL//ucLB/7vAw//DvMT/xbvG/8C9xv++vsj/vr7I/8C9xv/Fu8b/w7zE/7vAw/+5wsH/vsC//8C+v//Bv8D/wb/A/8HAvv/AwMD/v8DC/7/Awv/Bv8L/wcC+/77DvP+/xr7/u8G9/7/Gv/+5xLP/r9On/yt2I/8gfxn/jeeF/4Tefv8kgSb/K3ct/6/Rrv+xxLD/sM6y/5nKnf89hkH/Kn4p/yJuFP8mehj/F3oQ/y6GL/+j0aP/sMOw/73Evf/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP+/wcD/v8HA/7/BwP+/wcD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wb/A/8G/wP/Bv8D/wb/A/8O/wP/Bv8D/vsC//7nCwf+0xMH/tcTB/7zAw/+/wMT/ucPE/7jExP+4xMT/ucPE/7/AxP+8wMP/tcTB/7TEwf+5wsH/vMC//8DAwP/Bv8D/wcC+/8G/wP+/wML/v8DC/8G/wv/BwL7/v8G8/8DFv/+8wL//vsTA/7jDs/+x0aj/LHUk/yB/G/8hgyD/IoYk/xd3Hf8nci3/qcqt/66+sf+70L3/sdOy/47Dj/+n5J//ot2N/5Tagf8piCL/HXMc/57Mnf/B1L7/vcS9/8HBwf/AwMD/wMDA/7+/v//AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/BwP+/wcD/v8HA/7/BwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/Bv8D/wb/A/8G/wP/Bv8D/w7/A/8G/wP+/wML/usPC/7bFwv+4xMD/v8HA/8DCv/+7xL//uca9/7rFv/+7xL//wMK//7/BwP+4xMD/tsXC/7rDwv+9wcL/wMDA/8G/wP/Dv77/wb/A/7/Awv+/wMT/wb/C/8G/wP/Awbz/wsTB/76/wf+/w8L/uMO1/7HRqv8tdCb/I3we/yV7JP8XbBn/IXYl/zp8Pv+vyLL/w83F/7jGuf+ivKH/os2f/6zjov+c1or/jNV8/zGPLv8fdB//ocye/7DCrP++w73/wcHB/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8HA/7/BwP+/wcD/v8HA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wb/A/8G/wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8G/wP/Bv8D/wb/A/8G/wP/Dv8D/w77C/8G/xP/Av8T/vMLA/7/Bvv/Gvrv/yL25/8TAtf/BwrT/w8G1/8TAtf/Ivbn/xr67/7/Bvv+8wsD/wL/E/8G/xP/Bv8L/wb/A/8S+vv/Dv8D/v8DE/7/AxP/AwML/wb/A/8LBv//Dw8P/v77D/7/DxP+4wrf/sdGs/zB0K/8teCX/rOCi/6jXoP+h257/mceY/7zKuf/ExsH/sLqy/7PNtP9IekX/M3Ut/ydwH/8jdx//Gnsc/yh7K/+33bT/vcq5/73CvP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP+/wcD/v8HA/7/BwP+/wcD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/Bv8D/wb/A/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wb/A/8G/wP/Bv8D/wb/A/8O/wP/DvsL/xL3E/8S+wv/BwL7/xb26/865tP/St7D/0Lis/8+6qf/Puav/0Lis/9K3sP/OubT/xb26/8HAvv/EvsL/xL3E/8G/wv/Bv8D/xL6+/8S+wP/Av8T/v8DF/8C/xP/Bv8L/wsDB/8TCw//AvcT/wcLG/7jCuf+y0K7/MXMs/y53Jv+azpD/qtmi/6Tfn/+h0Z//tse1/77Avf+1urb/yNnH/zdgNP8tZSj/PHo3/ytzKf8sfy3/MHcz/6fGpv+4wrf/vsC9/7+/v//AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/BwP+/wcD/v8HA/7/BwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/Bv8D/wb/A/8O/wP/Dv8D/w7/A/8S+wP/GvcL/x7zA/8a8uv/MubP/2bKt/9+up//erqD/3q+d/96vn//erqD/366n/9myrf/MubP/xry6/8e8wP/EvsL/wb/A/8G/wP/EvsD/xL7C/8C/xP+/wMX/wL/E/8G/wv/EwMH/xsHF/8K8xv/Cwcb/usG6/7LPsP8zcS7/Knol/y+BLP8meiT/FW0W/zuAPf+syK//ys/L/7+9vv+ur6r/wc69/7DEqf+30ar/pcqX/6XXnP+dy5r/u9G6/7rBuv+/wb7/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8HA/7/BwP+/wcD/v8HA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/BwP+/wcD/v8HA/7/BwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8G/wP/Bv8D/w7/A/8O/wP/Dv8D/w7/A/8O/wP/Evr7/xr24/9C3sP/hr6j/6amf/+uomP/sqJX/7KiV/+uomP/pqZ//4a+o/9C3sP/Gvbj/xL6+/8G/wP/AwMD/wMDA/8a9wP/EvsL/wL/E/7/Axf/Av8T/wb/E/8W/w//HwcX/wrzG/8LBx/+6wbr/ss+x/zRxLv8qeiX/Ingh/yd/KP8geCL/M3g3/6rIrP+1urT/y8fG/8rExP++v7n/t8Cv/7/Ns/+yzaT/qNCc/6/Wqf+rwK3/u8S//8DCwf/BwcH/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP+/wcD/v8HA/7/BwP+/wcD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8HA/7/BwP+/wcD/v8HA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAvv/AwMD/wMC+/8DAwP/AwL7/wMDA/8DAvv/AwMD/wMC+/8DAwP/AwL7/wMDA/8DAvv/AwMD/wMC+/8DAwP/AwL7/wMDA/8DAvv/AwMD/wMC+/8DAwP/AwL7/wMDA/8DAvv/AwMD/wMC+/8DAwP/AwL7/wMDA/8DAvv/AwMD/wMC+/8DAwP/AwL7/wMDA/8DAvv/AwMD/wMC+/8DAwP/AwL7/wMDA/8DAvv/AwMD/wMC+/8DAwP/AwL7/wMDA/8DAvv/AwMD/wMC+/8DAwP/AwL7/wMDA/8DAvv/AwMD/wMC+/8DAwP/AwL7/wMDA/8DAvv/AwMD/wMC+/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wb/A/8G/wP/Bv8D/wb/A/8O/wP/Bv8D/vcK+/8DDvP/Fwbb/0bmt/+Suov/wppn/9aSR//ijj//4o4//9aSR//Cmmf/krqL/0bmt/8XBtv/Aw7z/vMK+/73BwP/AwMD/xr3A/8S+wv/Av8T/v8DF/8C/xf/Bv8T/y8XJ/8S9xP/CvMj/wsHH/7K5sv+gvZ//quek/5Lcjf+O0Yz/nduc/5zYnP+o1qf/usy2/8HCuv/DwLn/xcW7/8TLu/+6zLL/qsmn/6LNn/8/dzb/N2oy/7XRuv+zvrr/vcHA/8DAwP+/v7//v7+//7+/v//AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/BwP+/wcD/v8HA/7/BwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwv/AwMD/wMDC/8DAwP/AwML/wMDA/8DAwv/AwMD/wMDC/8DAwP/AwML/wMDA/8DAwv/AwMD/wMDC/8DAwP/AwML/wMDA/8DAwv/AwMD/wMDC/8DAwP/AwML/wMDA/8DAwv/AwMD/wMDC/8DAwP/AwML/wMDA/8DAwv/AwMD/wMDC/8DAwP/AwML/wMDA/8DAwv/AwMD/wMDC/8DAwP/AwML/wMDA/8DAwv/AwMD/wMDC/8DAwP/AwML/wMDA/8DAwv/AwMD/wMDC/8DAwP/AwML/wMDA/8DAwv/AwMD/wMDC/8DAwP/AwML/wMDA/8DAwv/AwMD/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/CwMH/wsDB/8LAwf/CwMH/wsDB/8LAwf/CwMH/wsDB/8LAwf/CwMH/wsDB/8LAwf/CwMH/wsDB/8LAwf/CwMH/wsDB/8LAwf/CwMH/wsDB/8LAwf/CwMH/wsDB/8LAwf/CwMH/wsDB/8LAwf/CwMH/wsDB/8LAwf/CwMH/wsDB/8LAwf/CwMH/wsDB/8LAwf/CwMH/wsDB/8LAwf/CwMH/wsDB/8LAwf/CwMH/wsDB/8LAwf/CwMH/wsDB/8LAwf/CwMH/wsDB/8LAwf/CwMH/wsDB/8LAwf/CwMH/wsDB/8LAwf/CwMH/wsDB/8LAwf/CwMH/wsDB/8LAwf/CwMH/wsDB/8LAwf/CwMH/wsDB/8LAwf/CwMH/wsDB/8LAwf/CwMH/wsDB/8LAwf/CwMH/wsDB/8LAwf/CwMH/wsDB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/CwMH/wsDB/8LAwf/CwMH/xMDB/8HBv/+9xL3/vcW6/8XBtf/Ruqz/6Kyh//Wjlf/7oI7//p+L//6fi//7oI7/9aOX/+etof/Tuaz/xMK1/77Euv+7xb3/vcHA/8G/wP/EvsD/xL7C/8C/xP+/wMX/wL/F/8G/xP/Au7//u7a8/8O9yf/Gxcv/xMvE/7TRsv+Z15T/gsx9/53gmf+b2Zj/otqb/5/LmP+4z7P/s7us/8bJvv+8v7T/sLen/7jHsv+31Lb/ps+l/0h5Qf8+ajf/sci0/8XQzP++wsH/wcHB/8HBwf/AwMD/wMDA/8DAwP+/v7//v7+//8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8HA/7/BwP+/wcD/v8HA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8HA/7/BwP/AwMD/wMDA/8DAwP/AwMD/wb/A/8G/wP/Dv8D/wcC+/77Dvf/Aw7r/x7+0/9O3q//qqqD/96CW//2dj///m4z//5uM//2djf/3oJb/6aug/9S2q//GwLT/wcK6/77Dvf+/wcD/wb/C/8S+wP/EvsL/wL/E/7/Axf/Av8T/wb/E/8jGyf+/vcD/xcLL/7q7wP+5w7v/n7yd/0WGQv8qfib/KoMn/xtyFP8mdxj/RIQ2/6PMoP+xybP/ydfK/6yzrP/R0c//v8G8/7S8sf+7yrX/qL2e/6u+ov/I0sf/s7e2/77Av/+/v7//wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP+/wcD/v8HA/7/BwP+/wcD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP+/wcD/v8HA/8DAwP/AwMD/wMDA/8DAwP/Bv8D/wb/A/8O/wP/BwL7/wsG9/8TBuv/IvrT/1Las/+ipov/0oZn/+J6T//uej//9nY//+J6T//Shmf/oqaL/1Las/8i+tP/Ewbr/wcG//8DAwP/Bv8L/xL7A/8O+wv+/wMT/v8DF/8C/xP/Bv8L/wsDB/7u7vf/FxMr/tbm8/8DKwf+ryqj/LG8o/xl0F/8dfxz/JIkf/xZ0Bv8wfCH/ntCb/6vJr//A0MP/wsfD/8K+v/++urn/wcO+/8TMwf/Ezbr/w8y7/7/Evv+3u7r/v7+//7+/v/+/v7//wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/BwP+/wcD/v8HA/7/BwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/wMDC/8DAwv/AwML/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP/AwMD/wMDA/8G/wP/Bv8D/wb/A/8O/wP/Hvr//yb29/8u8t//Ut7H/46yn/+yln//upJv/8KOZ//Gjmf/upJv/7KWf/+Osp//Ut7H/y7y3/8m9vf/HvsH/w77C/8G/wv/Dv8D/wb/C/7/AxP+/wMX/wb/E/8G/wv++vr7/ury7/8TFyf+2urv/wcvA/7bWsf8qcCf/JYAj/4foi/+F54T/IoIW/yx9Hv+f1Zn/tNGy/7C7rf++u7b/vbaw/8LCuP/EzsX/tMS3/6++q/+wvaz/sru2/8vR0f/Bw8L/wsLC/8HBwf/AwMD/wMDA/8DAwP+/v7//v7+//8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8HA/7/BwP+/wcD/v8HA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/BwP+/wcD/v8HA/7/BwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/8DAwP/AwMD/wb/A/8G/wP/Bv8D/w7/A/8e+w//JvcH/yb68/8+6tf/bsq7/4a6q/+Cupf/hr6T/46+k/+Cupf/hrqr/27Ku/8+6tf/Jvrz/yb3B/8e+w//DvsL/wb/C/8G/wP/Bv8L/v8DE/7/AxP/Bv8T/wb/A/8PFwv+/w8L/v8PG/7W7uf+0v7H/qMih/x5mGv8XdRX/huWJ/4XlhP8aexD/K38h/5DLi/+v0az/vci4/83Kw//Qx8L/yMW+/7jFvP+uwrb/vc+5/8LRvv+3wrz/wMbG/8HCxP/BwcH/wcHB/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP+/wcD/v8HA/7/BwP+/wcD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8HA/7/BwP+/wcD/v8HA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/wMDA/8DAwP/AwMD/wMDA/8G/wP/Bv8L/w77E/8S/w//Bwb//xL+7/826tP/QubH/zbut/8y8rP/NvKz/zbut/9C5sf/NurT/xL+7/8HBv//Ev8P/w77E/8O+wv/Bv8L/wb/A/8DAwv+/wMT/v8DE/8G/xP/Bv8D/ur+7/7zCvv+5v7//wcfF/7rFt/+y1a3/NoAz/yeHJf8UdBL/NJQw/x98FP8meR3/OXo6/0NtRf+htJ7/x8jA/7yxtf/EvsL/vcfG/7fLv/+3ya//sL+o/7K8tP+6vr//vr/B/7+/v/+/v7//v7+//8DAwP/AwMD/wMDA/8HBwf/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/BwP+/wcD/v8HA/7/BwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP+/wcD/v8HA/7/BwP+/wcD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wb/A/8G/wP/Bv8D/wb/A/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8HA/7/BwP+/wcD/v8HA/7/BwP+/wcD/v8HA/7/BwP/AwMD/wMDA/8DAwP/AwMD/wb/A/8G/wv/AvsP/wL/E/73BwP+/wbz/w764/8W+tv/DwbX/wcK0/8HCtP/DwbX/xb62/8O+uP+/wbz/vcHA/8C/xP/AvsP/wb/E/8G/wv/AwMD/wMDA/7/AxP+/wMT/wb/C/8G/wP++wL//v8PC/7m6vv/Hy8r/ucG2/7DLqv86eDX/I3Me/yx/J/8ldR7/K3Yj/zF0Lf83azr/QGND/8HSwP+/wLv/zsDN/8zBz/+0vr3/sMez/6/Opf+vyaL/vsi9/7/Awv/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8HA/7/BwP+/wcD/v8HA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/BwP+/wcD/v8HA/7/BwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/Bv8D/wb/A/8G/wP/Bv8D/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwv/AwML/v8HA/8DAvv/BwL7/wcC8/8HAu//Awbv/wMG7/8HAu//BwLz/wcC+/8DAvv+/wcD/wMDC/8C/xP/Av8T/wMDC/8DAwP/AwMD/v8HA/7/Awv/AwML/wb/C/8XAxP+8t73/zMXN/8S/xf+3ubb/ucq3/6zRqP+r3KX/o9mf/6bZof+l06X/udy7/6K7qP+3xLv/t7y4/8K7w//TwNb/zb7R/7K9tf+myKX/QXg1/zhqLf+/zrv/ube6/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP+/wcD/v8HA/7/BwP+/wcD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDC/8DAwv/AwMD/wMDA/8DAwP/AwMD/wMC+/8DAvv/AwL7/wMC+/8DAwP/AwMD/wMDA/8DAwP/AwML/wMDC/8C/xP/Av8T/wMDA/8DAvv+/wcD/v8HA/7/BwP/AwML/xcDE/8S+wv/EusP/w77E/8TJxf/Azr//ss2u/6TLnv+r2qT/o9Ke/6zQqv+qwqr/ws3F/9jc3f+2trj/z8fS/7+tw//Ivcv/wMrB/6nIpv9DeTv/Omsz/7bHtf/MzM7/wcHB/8HBwf/BwcH/wcHB/8DAwP/AwMD/wMDA/7+/v//AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/BwP+/wcD/v8HA/7/BwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwML/wMDC/8DAwP/AwMD/wMDA/8DAwP/AwL7/wMC+/8DAvv/AwL7/wMDA/8DAwP/AwMD/wMDA/8DAwv/Av8T/wL/F/8C/xf/AwML/wMDA/7/Bvv+9wr7/vcK+/7/Bvv+/v73/zMvJ/8G/wv+2uLf/t8O5/6zErP+my6L/rd6m/zV1K/81dSv/qdmd/7DQp/+su6j/u8C6/66ysf++v8P/0c/U/76+wP+1vLX/uMu4/6HAof+lw6f/w9PJ/7C2tv+9v77/v7+//8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8HA/7/BwP+/wcD/v8HA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwv/AwML/wMDA/8DAwP/AwMD/wMDA/8DAvv/AwL7/wMC+/8DAvv/AwMD/wMDA/8DAwP/AwMD/wMDC/8C/xP/Av8X/wL/F/8DAwv+/wcD/v8G+/73Cvv+9wr7/vcK8/7W3sv/Awr3/xsjF/7O6s/+8zr7/t9a3/5O/jv+j3pr/JXQb/yl4Hf+j4Zb/q9ah/77Vuf+/yb7/w8nF/8bKyf+7wLr/tby0/7/Gvv/CzMP/ws3F/8LPxv+5xMD/sru4/72/vv+/v7//v7+//8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP+/wcD/v8HA/7/BwP+/wcD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDC/8DAwv/AwMD/wMDA/8DAwP/AwMD/wMC+/8DAvv/AwL7/wMC+/8DAwP/AwMD/wMDA/8DAwP/AwML/wL/E/8C/xf/Av8X/wMDC/7/BwP+/wb7/vcK+/7zDvP+9wrz/xMnC/7O4sf/Izcb/r7uv/73Vv/+u0q7/QXI7/zJ0Kv8sgyT/J4Ef/yhxIv8mXSP/sdOy/7rLu/+vtq//vb+8/7W9sv+7w7b/xc3A/7m8tf+4tLX/uri7/7e5tv/N0sz/wcPC/8HBwf/BwcH/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/BwP+/wcD/v8HA/7/BwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwML/wMDC/8DAwP/AwMD/wMDA/8DAwP/AwL7/wMC+/8DAvv/AwL7/wMDA/8DAwP/AwMD/wMDA/8DAwv/AwML/wL/F/8C/xP/AwML/v8G+/73Cvv+9wr7/vMO8/73CvP/Gy8T/tLew/8vQyv+xu7D/scey/6LEof8+bjr/LW8l/yB6GP8ifhv/LXUr/zpvOf+u0bD/tsm2/8DFv//ExcD/yM7C/8HJuv+6wrP/t7qx/8rEyP/QydD/vsC9/8HGwP/Bw8D/wcHB/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8HA/7/BwP+/wcD/v8HA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwv+/wMT/v8DC/7/BwP+/wbz/vcK8/73CvP+9wr7/vcK+/7S1sP+3uLP/xsbE/8HGwP+6y7v/t9S2/6fRo/+j3pr/Knse/zKDJ/+e1Zv/sdew/7LMsf+tu6r/xsnC/769uP+ztq3/vMS3/7vHuf++yL3/wsLE/7q6vP+yvbX/tMC2/7zBvf+/v7//v7+//7+/v//AwMD/wMDA/8DAwP/BwcH/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP+/wcD/v8HA/7/BwP+/wcD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/Awv+/wcD/v8G8/7/BvP+9wrz/vcK8/7/Bvv/AwL7/xMDB/87Iyv+8trr/x8XI/7nDu/+ou6j/u9u2/57SlP8oeRz/K3of/6jUo/+yyrL/s8Sx/77Juf+3vbP/xMW9/8XGwf/GycL/tby0/7rBuv/Av8T/u7zA/7/Mxf+4xbz/vcK+/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/BwP+/wcD/v8HA/7/BwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP+/wcD/vcHA/73Cvv+9wrv/vcK7/7/BvP+/wbz/wMC+/8O/wP/Iv8T/wrW//9PF0v+6sLv/yMbL/7nDu/+yyLH/qtmj/yN5GP8qfiD/q86m/7zHuf++xrv/wMu9/7G9r/+9xbj/t7a0/83Hyf/FwcL/x8LG/8nBzv+6t8D/ucLB/73IxP+/wcD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8HA/7/BwP+/wcD/v8HA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/BwP+9wr7/vMO8/73Cu/+9w7n/v8G8/8DAvv/Bv8D/xL7C/8y/yf/FtcL/0b7R/8Cyw//Hv8z/t7i6/7TCs/+dyJr/Jn0f/yh7If+uy6z/ubu2/7i9t/+2wLf/tcO0/7/Jvv/U0NH/wre//8W6wv/Ivsb/vrm//8TDyP/Fycz/tbm6/7/BwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP+/wcD/v8HA/7/BwP+/wcD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8HA/73Cvv+9wrz/v8K7/7/Cuf/Awbz/wMC+/8O/wP/GvcL/ybzG/8e1xf/Puc7/zr3Q/8/E1P/AwcX/ydfK/6rTqf8kcyD/LHkr/7XRuP/Fycr/wcfF/7nDu/+5x7r/vMO7/7mtt//Qvs7/zcLI/8HAvP/GzsP/vMa7/7O1tP/Gxsj/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/BwP+/wcD/v8HA/7/BwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8HA/7/Bvv+/wrv/wMG7/8DBvP/BwL7/w7/A/8S+wv/Owcv/zLzJ/8m4yv/Lvs//vLnC/7G3tf+9z7//ocqi/y1wKf84eTf/ob2m/7zFwv+zubf/usC8/7i/uP+/v7//y7rK/9vK2v+7t7j/s76u/7TNr/+owaT/uMK6/8DBw//AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8HA/7/BwP+/wcD/v8HA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwML/wMDA/8DBvP/Awbz/wMG8/8DAvv/Bv8D/w77C/8S+wv/HvcX/xLrF/8XCyf+4vr7/tMa6/7TVuP+t2Kv/pNec/6HQmv+82bv/xNTH/664sP/Fx8T/vLi5/87EzP/VxNb/xbvG/7O/tf+ryqv/Q3NB/z5sPv++18T/sr25/73BwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP+/wcD/v8HA/7/BwP+/wcD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDC/8G/xP/Bv8T/wb/A/8HAvv/AwL7/wMC+/8DAvv/AwMD/vry9/8G/wP/BwcP/v8XD/7jKvv+517//lMGY/5zOmf+w46j/rN6j/6DMm/+kxqX/tca2/87Qzf+8tbz/zsLO/72xv/+/vsP/ucq6/6vOrf8/cT7/MmEz/7bPvP+8x8P/vcHA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/BwP+/wcD/v8HA/7/BwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/Bv8L/w77F/8O+xf/DvsL/wb/A/8DAwP/AwL7/v8G+/7/BvP/ExsH/wcbA/8DHwP+uvrP/qcaw/6DKpv8+d0D/QoVC/ydtJP8tdif/Lnco/z96Ov+mw6X/vce//7i1vP/Fv8n/y8vN/8XKxP+0wLL/sMav/67Nrf+vzLD/vsvB/77Cwf+/wcD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8HA/7/BwP+/wcD/v8HA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8G/wv/DvsX/w77F/8G/xP/Av8T/v8DC/7/BwP+9wr7/vcK8/7vAuf+6v7j/wsfA/7LAs/+7177/r96y/yRpKP8odir/K3op/yZ6Iv8ifBz/HGYX/7PZtP+6xb3/wb/E/8rFy//Awr3/qbGm/8vTxv+/yrz/sMGv/8PRwv+4vrr/wsPF/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP+/wcD/v8HA/7/BwP+/wcD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwL7/wb/A/8S+wP/DvsL/v8DF/7zBx/+8wcX/vMHE/73Cvv+/wbz/v8G8/8LBvf/Ev7z/w8S8/7fGsf+p0qb/KnYu/yN7J/+L3Yn/me2V/xZ2FP8tfy3/ps6r/7fDuf/Evr7/x7+9/73At/+7w7b/v8K7/73CvP+9xL3/vcS9/8DCwf/BwcH/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAvv/BwL7/xL6+/8O/wP+8wcX/usHJ/7rBx/+8wcX/v8HA/7/BvP+/wbz/wsG9/8a+vP/Fwrv/uMat/6jUo/8meSn/Hn8i/5Hlj/+J34T/IYMe/yZ7KP+o0q7/tsK4/8jAvv/CuLb/wcG3/7/Ct//Bwr3/wcHB/77Cwf+9wcL/wMDC/7+/wf/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMC+/8HAvv/Ev7z/w7++/73Axf+6wcf/vMDJ/73Axf+/wcD/v8G+/7/BvP/Bwr3/w7+8/8HFt/+0yaj/pNec/yB9Iv8Ygh3/JIIk/ymEJ/8UdhH/IXQi/6PNqf+zv7X/zMfE/83CwP/Fvrb/wr+4/8K+vf/Bv8L/vMLC/7zBxP/Av8T/wb/E/8DAwv/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwL7/wcC+/8O/vP/Bv8D/vMHF/7rByf+8wMn/vcDF/7/BwP+/wbz/v8K7/8DDvP/Bwbn/v8a2/7HLpv+h15n/H34g/xiDG/8ifCL/GG4V/xt2F/8zgDL/p8+t/8TRyP+/vrz/tKyq/8K9t//Cvbf/wr69/7+/wf+6w8L/usLE/8G/xP/DvsT/wb/C/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAvv/AwL7/wMDA/73Bwv+5wsf/uMPJ/7rByf+9wcT/v8G+/7/Cuf+/wrf/wMO4/8HBt/+/xrT/ssuk/6TYmv8ifCL/HIAe/5rplv+b5JP/luSO/47RjP+u0LX/usnE/7K2tf/ExML/wcK6/8HCuv/Bwb//vcHA/7jEwP+5w8L/w77C/8W8wf/Bv8D/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMC+/8DAvv+/wML/vMHE/7jDyf+4w8n/vMHH/7/AxP/Awbz/wMG5/7/Ct//Aw7j/wcG3/8LGt/+1yKj/ptWe/yZ6Jf8gfyP/idOE/53klv+Z55H/mNmV/6rMs/+4xML/s7e4/9PS0P/Bwrz/wMG7/8DAwP+9wcL/uMTC/7rDwv/DvsL/xr3C/8G/wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwL7/wMC+/8DAwv+/wMT/usHJ/7rByf+/v8f/wMDC/8HAvP/Bwbn/v8K5/8DDuv/Dv7z/xMS8/7jGr/+r0qb/LXYv/yR8KP8sfir/KHgj/xJrDf85gzj/qcyu/8nSz/+/ubv/saeo/8W9uv/Dvrv/w73B/8C9xP+8wcf/vMHH/8G+x//Ev8b/wb/C/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAvv/AwL7/wMC+/7/Awv+6wcf/usHJ/7+/x//Bv8T/wcC+/8HAvP+/wbz/wcG//8a8xP/JwMP/vsG4/7PMr/82bzj/LnUx/ytxK/8zeTD/JnMh/zV2NP+oxa//tbq9/8zGyv/PxMj/xcC8/8TBvP/CwMH/vcHC/7bFwv+2xcL/vcHA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMC+/7/BvP+9wrv/usS8/7jExP+5wsf/vcDH/8C/x//Bv8T/wb/E/8C/xf+/ucP/1cTX/8Ktvv/Vxs3/wMO4/6rKpf+q2Kn/qtCn/6bNof+izpn/rtOq/7HAu/+/wc3/xMTM/8DAwv/JzMP/w8u8/7O/sf+txLD/Sm5U/z9jR/+/0bn/t76s/7/BvP/AwMD/v7+//7+/v/+/v7//wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwL7/v8G8/73Duf+6xLv/uMTC/7nDxf+9wMf/wL/H/8G+xf/BvsX/wsDL/7+4yP/Rvdb/x63G/9S8zP/At7j/ssSs/6bFo/+y0bH/v+G8/6fRof+u0Kv/wMzK/7u6yP+8usX/vb2//7C2rP+7xrX/vM26/6zIr/9LdFT/PmhE/7LLq//D0bj/wMO8/8HBwf/BwcH/wMDA/8DAwP/AwMD/v7+//7+/v//AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAvv/Awbz/wMG7/7/BvP+8wsL/vcDF/8G+x//Dvcf/w77E/8G/xP/Cwsr/vrrJ/8y61P/Sudb/2L/U/8m+xP/K2Mf/sNKx/6LNoP+Qx47/K24p/zxyPv+qvrL/x8bO/9LG0P/Nwsb/0dHJ/7vBs/+yva//ucq6/6K+qP+lw6v/wNjA/627qv+8wbv/v7+//8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMC+/8DBvP/Awbz/wMC+/73BxP+/wMX/wb7F/8O+xP/Dv8D/wMDA/8XJzP/Dwcz/x7rO/9C81f/Is8b/u7K3/7/Qvv+kyKT/pNSg/6Xmov8qeyz/MXY3/7DNuf+5ur7/w7a9/8a6vP+/wbb/tb2w/73HvP/AzML/vc/B/73Swf+2yLj/ssCz/7zBvf+/v7//v7+//8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwL7/wMC+/7/Bvv+9wcD/vMHF/73Axf/Bv8T/w7/A/8HAvP+/wrv/ucO7/73Bwv/EvMf/z8HQ/8W4wv/BwLz/vNK7/67Xq/+azJH/oN+Y/yR5JP8lcCv/tNa9/7i+vP/FvL//ycTB/7K9r/+1xrT/ws/F/7TAtv+vu7H/s7+z/7G9sf/M08v/wcPA/8LCwv/BwcH/wMDA/8DAwP/AwMD/v7+//7+/v//AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAvv/AwL7/v8G+/73Bwv+8wcX/vcDF/8G/xP/Dv8D/wcC7/73Dt/+zv7P/uMO7/8PDxf/Iw8f/yMTD/8jQwf+bvZj/m86W/6rjn/+W3oz/JYMj/x5yJP+x2rr/vMe//8bAwP/Au7f/xdLB/7rNuv+2w7n/s7y3/8TJw//Kz8n/vcK8/8LHwf/Bw8D/wcHB/8HBwf/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMC+/8DAvv/AwL7/v8HA/73BxP+/wMX/w77E/8S+wP/BwLv/vcO3/7nKuv+6zL7/v8jD/7S7tP+2wbH/q8Oj/0JzPP9DhT3/ImoY/y+EJv8YhBf/JYQq/6LRp/+suq3/xLy5/8nCvP+zu6z/usi5/7/Gv//DxcT/wsLE/7q6vP+6u73/vb7A/7+/v/+/v7//v7+//7+/v//AwMD/wMDA/8DAwP/BwcH/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMC+/8DAvv/AwL7/vcHC/7/AxP/Bv8T/w7/A/8HAvP+9wrv/tcG3/7fEuv+9yb//sb6t/8LWuv+226//KWYj/zB5KP8yfCf/JHkb/xeDFP8jhCf/otGn/7vHu//MxML/x7m5/8bFwP/HysP/ubu4/77Av//BwcP/vbzB/8fGy/+/v8H/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/Bv8D/wb/A/8G/wP/Bv8D/wcC+/8DAvv+9wcD/vMLA/73Bwv+/wML/wMDC/8G/wP+8urv/wsO+/8DDuv+7ybL/r82n/6naov8qbiX/Mnss/5nVjf+k55j/G30W/x54IP+t2rP/sru2/8i9xf/Pu8f/z7vG/8i9wf/Awbz/vMO8/7vBv/+8wMH/wMDA/8DAvv/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8G/wP/Bv8D/wb/C/8G/wv/Bv8D/wMC+/73Cvv+8wr7/vMLA/73Bwv/Av8T/w77E/8bAxP/IwsL/vL21/7PBqv+nx6D/o9Sd/ytuJ/80eC//oNeW/5bYjv8sjif/HXof/6vasP+ruK7/xL/F/8W1wv/NuMn/yLvF/8DAvv+6w77/usPC/73BxP/AwMD/wcC+/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wb/A/8G/wP/Bv8L/wb/C/8DAwP/AwMD/vcK+/73Cvv+9wcD/vcHC/8C/xP/Bv8T/u7a8/768vf+/wrv/v8y7/7nUtf+t16n/PXQ7/zZ0Nf81czT/KXgp/wt4C/8RdxP/ot2l/63JsP/H0sr/xMPI/8O7yP/CvMj/vcDF/7rCxf+8wMn/v7/J/8G+xf/Bv8L/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/Bv8D/wb/A/8G/wv/Bv8L/wMDA/7/BwP+/wb7/v8G+/7/Bvv+/wcD/wb/C/8G/xP/Bv8T/w8PF/8DFwf+5xbn/rcOs/5y7m/9AaT//NWc2/zBpNP8kbSb/K48s/zWTNf+WzZb/p8So/6+/tP+stbT/vr7G/7+/yf+9wMf/vcDH/73Ayf+/v8n/wb7F/8G/xP/AwML/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8G/wP/Bv8D/wb/C/8DAwv+/wML/v8HA/7/Bvv/AwL7/wcC+/8HAvv/Bv8D/wb/C/769wv+8vcH/usDA/7bBu/+9zcD/zN/M/6zEqv+617n/r9Ky/5vPn/+T3ZL/ktaN/6vOpv/B0sD/vMe//8XOzf+9wMX/v8DF/8C/xP/AwML/wMDC/8DAwv/Bv8L/wb/C/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wb/A/8G/wP/Bv8L/wMDC/7/Awv+/wML/wMDA/8HAvv/Dv7z/w7+8/8O/vv/Bv8D/xcbK/7/Dxv+8wcX/sLi6/7G6t/+5w7v/sLit/7zGu/+0xLf/rsqx/6XRoP+q1KT/qrih/8DDvP+1ubj/wMbG/77Cxf/AwcP/wb/A/8O/vP/Awbv/wMG7/8DAvv/AwL7/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/Bv8D/wb/A/8G/wv/AwML/v8DE/8DAwv/Bv8D/xL6+/8a+vP/Gvrz/w7++/8G/wP+6u7//t7zA/77Fy/+9wsj/wsXK/8XEyf/Dvb//xb/D/765wP/ExsX/vcq2/8XRu//Lw8D/yr3E/7+6wP+6u8D/v8DE/8DAwP/Ev7v/xMC1/8DCtP+/w7T/v8K5/8DBvP/AwL7/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8G/wP/Bv8D/wb/C/8G/wv/Av8T/wMDC/8O/wP/Evr7/x728/8a+u//Evr7/wb/A/8LDx/+5vsT/vMDJ/7e6w//Avcj/xLzH/8m8xv/Lu8j/yLrL/8vBzP+7urb/urew/9HAxv/Dsb3/ycHM/7++xP++v8P/v7+//8a+u//EwLX/vcWu/7zFsP+9w7f/v8G8/8DAvv/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wb/A/8G/wP/Bv8L/wb/C/8G/xP/Bv8T/w77C/8S+vv/Hvbz/xr67/8S+vv/Dv8D/wsHG/7i7wv/JzNX/tbXB/8zG1P/Hu8n/x7fE/828zP/Et8n/ysTQ/7WztP/Nycb/wra6/8i9xf/BwMb/vL/G/7K3u/+5ur7/yMLC/8nJv/+1w6r/wNK4/7G7sP/BxsL/v8HA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/Bv8D/wb/A/8G/wv/Bv8L/wb/E/8O+xP/DvsL/xL6+/8a+vP/Gvrz/xL6+/8O/wP/Cwcb/urm//8XDzv+5tsH/yMLO/8C2wf/Et8H/vrK8/8C4xf/HxM3/u7u7/8nIxv/Bu73/ysPK/8HCx//FytD/z9TY/7/Dxv+0s7H/usC0/6G6mv+zzq3/uMm5/7W7t/+/wcD/wMDA/8DAwP/AwMD/v7+//8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8G/wP/Bv8D/wb/C/8G/wv/DvsT/w77E/8O+wv/Dv77/w7+8/8O/vP/Dv77/wb/A/8G/wv+9usH/wr/G/8TByP/Lyc7/xMLF/9PS0P/Fw8T/w8HG/8jHzP/DxcT/wsTD/727vP/DwcT/sbK3/73Cxv+prrH/v8XD/8jLxP+5yLP/T3ZH/0l1RP+ivKP/w9DH/7/EwP/BwcH/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wb/A/8G/wP/Bv8L/w77C/8S9xP/EvsL/w7/A/8G/wP/AwL7/wMC+/8DAvv/Bv8D/yMPH/8a/xv/DvMP/xMLF/7u9uv+xuLD/wcy+/7O+sP+1vbL/uL+3/7vFvf+4wrr/v8a//8bLx/+1ubz/xcbK/7m9vv/DyML/vcW4/7XMr/81aC3/L2cq/6nKq/+5ybz/vsO//8HBwf/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/Bv8D/wb/A/8G/wv/DvsL/xL7C/8S+wv/AwMD/vcHA/7zCvv+8wr7/v8HA/8G/wv/Cu8L/x77D/8S7wP/FxML/ucG2/7XGs/+40rf/t9Kz/7rOsv+4y6//uM63/7PJtP+6zbn/usi5/7i9uf+9vbv/0NHM/8LFvP+ttqX/sc2n/zd0L/83eTL/tdmz/6m6qP+8wbv/v7+//8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8G/wP/Bv8D/wb/C/8O+wv/EvsL/w77C/7/BwP+8wsD/ucS+/7nEwP+8wsL/wMDC/8G3v//HvML/yb/A/8XEv/++y7n/vNa5/5W+lv+cypv/qdSe/6POmP+gy53/n8qd/6DGnf+evJr/xtPB/8PGvf+6u7X/u761/7jDtf+007H/JWgh/yVpIP+u0an/tMGw/7vAuv+/v7//wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wb/A/8G/wP/Bv8L/w77C/8S+wv/DvsL/vcHA/7nEwP+2xcD/tsXA/7rDwv/AwML/y8LH/83Bxf/MwsH/ubmv/7LErP+kyKL/QHVB/0OEQv8scyP/LHYh/yp0Jf84gDT/OX00/0V5O/+tx6L/rrqm/8fKwf+8vrn/ucS+/7LSuv8vdDP/On06/7XSs/+7w7b/v8G+/8DAwP/AwMD/wMDA/8HBwf/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/Bv8D/wb/A/8G/wv/Bv8L/xL7C/8O+wv+/wcD/usPA/7bFwP+2xcL/usPC/8DAwP/Bu73/xLu8/8nEwP+6vLH/w9W7/7bdsf8pair/LXos/y55JP8weyb/J3Ei/zN7Mf8naSL/MGMq/7nUsf+7x7P/wMO8/7m7uv/Axsb/s8q6/zJmOP8/cUD/ssWv/8LFvv/AwL7/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8G/wv/DvsL/w77C/8DAvv+9wr7/usPC/7rDwv+/wML/wMC+/8DDvP/Cxbz/vsC7/77Gu/+3xrH/qtGk/yx2J/8peSL/ndiU/6rZo/+Zx5j/stuz/6PGpv+yzLP/vMi6/7q9tv/BwL7/w7/A/8G/wv+9wr7/uMa5/7bHt/+9wrv/wMG8/8DAvv/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8O+wv/DvsL/wcC8/7/BvP+9wcL/vcHE/8DAwv/AwL7/vcO5/7/HvP+7wrv/vMa9/7jFtP+r0KT/Kngk/yl5IP+jz5z/tc6w/6zCrf+8zsD/s8C5/8DJxv/BxcT/ysrI/8HAvv/BwL7/wcC+/8DBvP+/wbz/vMO7/7zEt/+8xLn/v8G+/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/w77C/8O/wP/BwLz/wMG8/7/Awv+/wMT/wb/C/8HAvv+/wrn/wMa8/7zBvf++xb7/ucS2/67Opf8sdyX/LHcl/6/Pqv/AzMD/vMXA/7zCwv+2ub7/v8DF/7GytP/BwcH/v8G8/73Duf+8xLf/uca0/7bIsv+zyq7/scyr/7XJsP+8w7v/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/Bv8L/w7/A/8HAvP/Awbz/v8DC/7/AxP/Bv8L/wb/A/7/Cu//Axb7/vsC//7/Dwv+7w7j/r82p/y51J/8tdif/qMql/7jEuP+8xcD/ub+//8HFyP/Jys7/t7i6/8fHx/+/wbz/v8K5/7zEt/+6xbX/tsiy/7XJsP+yy63/tcmw/7zDu//AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8G/wv/Bv8D/wcC8/8DBvP+/wML/wL/E/8O+xP/Dv8D/wMG8/8LEv/+/v8H/wsLE/7/Cu/+zzKz/MXMr/y12J/+s2KX/ss+w/7fPt/+0xrb/vsvC/73Gwf+3vLj/u7u5/8HAvv/Dv77/w7++/8O/vv/BwL7/wMC+/7/Cu/+/wbz/wMC+/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wb/C/8G/wP/BwLz/wcC8/8DAwv/Av8T/xL3E/8S+wv/BwL7/w8PB/8C+w//Dwcb/wMG8/7TLr/8zciz/LHck/5zblP+c0pb/nsyb/6HHoP+kwqb/obmj/8PRwv+8xLn/v8G8/8HAvv/EvsL/xrzE/8e7xf/Hu8X/xrzF/8S9xP/Bv8L/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/Bv8L/wb/A/8HAvP/BwLz/wMDC/8G+xf/GvMX/xL3E/8G/wP/Dw8P/wL3E/8PAx//BwL7/tsqx/zVwLv8neiD/JXwd/yZ7Hv8teCb/Pn87/0B3QP9JdEf/qMqn/6S8ov+4x7T/vMS5/8G/wP/EvcT/x7vH/8i6yf/Iusn/xrzH/8O+wv/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8G/wv/Bv8D/wcC8/8HAvP/Bv8T/wb7F/8a8xf/GvMT/wb/A/8PDw//Avcb/xcDH/8G/wP+3ybH/NnEx/yl5Iv8lfB7/JXsg/ydxIv83eDb/KmAs/zBdMv+12bX/sM2v/7XItP+5xbn/v8G+/8G/wv/EvcX/xrzH/8a8x//EvcX/wb/C/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDC/8G/wP/BwLz/wcC8/8G/xP/DvsX/x7vF/8a8xP/GxMX/wcHB/8K/yP/Fwsn/ube4/6i6pP+s5KX/ktuM/5rbm/+g1qL/odCm/6nOrf+uzLT/sMm2/7TJuv+2yLr/tsa7/6i0qv/Jz8v/v8PC/7e5uP/Hycj/uLy7/8LHw//AwsH/wcHB/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwML/wMDA/8O/vP/Dv7z/wb/C/8O+xf/Hu8X/xrzE/727vP+4uLj/v77E/8bFy//Lycr/u8+2/53Vlv+Hy4L/pdSm/6vOsP+vyLP/tce7/7jFvv+4w7//uca//7nGvf+/z8T/vs7B/7O/s/+1wbX/t8W2/7TFs/+90Lz/usu7/77Dvf/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwv/AwMD/w7+8/8O/vP/Bv8L/w77E/8a8xf/GvMT/yMfF/72/vv/Cw8j/uLm+/7+/vf+ku5//SYRC/zV3L/+r0ar/tMm2/7jEuv+8wr7/vcHA/7rAvv+6xb3/t8e6/6u+qv+yya//ts2z/7PMrv9MZ0b/PFo0/7HWq/+y0K7/usS5/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDC/8DAwP/Dv7z/w7+8/8G/wv/DvsT/xrzF/8S+wv/CwsD/ub66/8LGyf+1ubz/xMnD/7DJq/8ubSb/KWsj/6zOq/+5x7r/vcK8/8DAwP/Bv8L/vr6+/7zDvP+5xbn/wtPA/7XJsP+wwqj/tMis/1JqSP9JZT//vd6z/6jDov+6xLn/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwML/wMDA/8O/vP/Dv7z/wb/C/8O+xP/EvcT/w77C/7q8t/+3vrf/wsjI/7a8vP/FzMT/utW0/y5wJv82ei//rM6p/7rGuP/Awbz/xb/B/8a9wv/Eu8D/wb/A/77Au/+/xL3/ztTK/7e6r/+7vrP/wsa4/7O8q/+7ybL/use1/73CvP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwv/AwMD/w7+8/8O/vP/Bv8L/w77E/8S9xP/Dv8D/vsO8/73Hvv++x8T/s766/7TAtP+oyKP/HmUX/yduIP+rz6n/usa4/8DBvP/GvcD/yLvE/8a7w//EvsL/v72+/7Ozsf/FxcP/ycXE/8W/v//Pysf/w8K9/7W4r//CyL7/v8G+/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDC/8DAwP/Dv7z/w7+8/8G/wv/DvsT/xL7C/8O/wP+5wLj/u8e9/7fCvP+8ycL/t8W2/6/Sqv80fSz/NH0u/6rQqf+6yLv/v8G+/8S+wv/Hu8X/x7vH/8W+xv/AvsP/0dLU/7y+vf+9u77/xL/D/766u//Ew8H/x8nE/7O4sv+/wb7/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwML/wMDA/8HAvP/BwL7/wb/C/8O+xP/EvsL/wcC+/73Fuv++yr7/tb65/8PMx/+0wrP/qcyk/zN8K/8mcR//qdKm/7XKt/+4xLr/vsC//8K9w//EvcX/xcDH/8G/xP+2trj/ysvN/769wv/CwMX/xsbI/7i6uf+9wr7/wsfB/7/Bvv/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/Awv+/wML/v8G+/8DAvv/DvsL/w77C/8G/wP+/wbz/u8O2/8DKv/+8vr3/ury7/8bQxf+qyqX/Mncn/yZwG/+j1J3/pcSi/7rUu/+7zb//rLex/8vP0P+xr7L/x8LG/8XDxv+wsLL/zs/T/8DEx/+0urr/xszI/7e8tf/Axrz/v8G+/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8DC/7/Awv+9wcD/v8HA/8O+wv/DvsL/wcC+/7/Cu/+5xLb/usK3/8nHyv+9u77/ucC4/6XFoP8zdif/MH8j/6Lilv+e1Jb/mc6Y/5/Mof+myav/rsOw/8bNxf+/vrz/z8vM/8jIyv+3vb3/tsG9/7jFvv+5xbv/xMrA/8DDuv/AwL7/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP+/wML/v8HA/73Cvv+/wb7/w77C/8O+wv/Bv8D/v8G8/73Iuv+vt6z/x8XI/8XDxv/ByMH/sM+t/zV4K/8Zbwr/GnIM/y2IIf8rhyT/LoIq/zJ1MP8yYDH/ssat/8XIv/+5uLb/vb+8/7zJwP+1yrv/TmVT/0VWRv/DyMH/wsG9/8DAvv/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/Awv+/wcD/vcK+/7/Bvv/DvsL/w77C/8G/wP+/wbz/w87A/7e/tP+9u77/xMLF/7e+t/+iwZ//Rok8/x91Ev8jexX/JIEZ/xJxDf8gdhv/MXcv/z5uOv+0y6//t72x/83Oyf+9v7r/scG2/7LJt/9QaVb/T2FR/8zRyv+4t7X/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8DC/7/BwP+9wr7/v8G+/8O+wv/DvsL/wb/A/7/BvP+1v7T/xMvD/7u5vv/Hxcr/tbu3/6jHp/+V143/kN+E/6TmnP+j35//nNic/6PZpf+jzqP/or+h/8bTwf+4u7D/wsO7/8vQyf+wvbP/sMK2/7TIvP+tvbL/vsW9/8DCvf/AwL7/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP+/wML/v8HA/73Cvv+/wb7/w77C/8O+wv/Bv8D/v8G8/7O9sv/FzMT/uLa7/8bEyf/Bx8P/tdKz/5fZj/+U44r/j86I/5fMlP+k1qX/p9Gr/7PRt/+5zLn/vMS3/8HCuv+0s67/xMXA/8DJxP+4xb7/v87H/7nJvv+vu63/wsq//7/Bvv/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/BwP+/wcD/vcK+/7/Bvv/DvsL/w77C/8G/wP+/wb7/wszB/77Fvf+9u8D/t7S7/73Cvv+mw6T/NXct/yN2Gv8+jTT/L3gp/zBtMf9BckP/osOm/73Ovv/Cxb7/urS0/9nQ0//Aur7/vr3D/77Dxv+zvrr/usq//77PvP+wvav/vcK8/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8HA/7/Bvv+9wr7/v8G+/8O+wv/DvsL/wb/C/7/Bvv+6xLn/sLew/87L0v+4tbz/xMnF/7vYuv8naSH/LYEj/yFxGP8odSP/MXcx/zhxPP+t0rD/qb+q/8nMxf/Fv7//vbK4/8/Fzf/Av8X/vsPG/7/Ixf+zvrb/usW3/8HJvP+/wb7/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP+/wcD/v8G+/73Cvv+/wb7/w77C/8O+wv/Bv8L/v8G+/7fBuP/DysP/v7zD/726wf/Jzcz/qcao/zN1Lf8mdRz/lNuN/6Hknf8pbyn/OXk8/6LUo/+vzq7/vMS1/8TAvf/HvsH/xb/D/73BwP+5xMD/usPA/73Bwv/EvcX/xrzF/8O+wv/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/BwP+/wb7/vcK+/7/Bvv/DvsL/w77C/8O+wv+/wb7/u8K6/7vCu//HxMv/vLnA/7u/vv+lwqT/NnUu/zCBJf+R2on/jtaK/y57Lf8rciz/mdKb/6PHof+7xrX/xMC9/8e8wv/EvsL/vcHA/7rDwP+6w8L/wL/F/8i6y//Kucn/w77E/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8HA/7/Bvv+9wr7/v8G+/8O+wv/DvsL/w77C/7/Bvv+/xr7/r7av/8S/xv/Ev8b/w8jE/7LPsP86ejD/GnAP/yiCHv8wiij/HHUZ/yx7LP+p5Kr/sNSu/8HMvP/CvLz/yLvE/8i6x//BvsX/vcDF/73BxP/Av8T/xrzF/8e8xP/DvsL/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP+/wcD/v8G+/73Cvv+/wb7/w77C/8O+xP/DvsL/wMC+/8fOxv+4v7j/vbi//8XAx/+4vbn/or+g/0iIPv8echL/I3kY/yZ7Hv8peCf/OXw5/5XGl/+nxKj/u8O4/8K8vv/Iu8T/yLrH/8O9yf/Avsn/v8DF/8C/xP/EvsL/xL7A/8G/wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/BwP+/wb7/vcK+/7/Bvv/DvsT/w77E/8O+wv/AwL7/tr21/8XKxP+9uL//y8bN/7W6tv+oxab/mdmN/5Lehv+j4Jr/qNuj/6DNov+my6z/u9TB/7/Mw//DxcD/xL6+/8a9wv/GvMT/w73J/8G+yf/Bvsn/wb7F/8O/wP/Dv7z/wb/A/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8HA/7/Bvv+9wr7/v8G+/8O+xP/DvsT/w77C/8DAvv+yubH/xcrE/7u2vf/Lxs3/wcbC/7bRsv+c3JD/l+OJ/5bVjv+j2Z//otGj/7PbuP+oxq7/rL6w/8XNwv/Bwrz/w7++/8O/wP/Av8X/v8DF/7/Axf/Av8T/w7++/8O/vP/BwL7/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP+/wcD/v8G+/73Cvv+/wb7/w77E/8O+xP/DvsL/wMC+/8fOxv/Axb//wbzC/7y3vf+9v7r/pcCf/zh4LP8edBH/KIAa/yh/Hv8edBn/LHsq/y5vL/9GdEX/r8ir/7zEtf+/wrv/v8G8/7rDvv+5xL7/ucS+/73Cvv/Evr7/xr2+/8G/wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/BwP+/wcD/v8G+/7/Bvv/Bv8L/w77E/8O/wP/AwL7/vsO8/6+0rf/Mys3/ube6/8LIvv+92LX/K24f/yuBHv8mfBv/J3we/yV7IP8qfCr/M3Yz/zdnN/+607b/ucS0/7/Auv+/wLv/usS7/7nFu/+6xLv/vcK7/8S/vP/Gvb7/wb/A/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDC/8DAwP/AwL7/wMC+/8DAwv/Bv8L/w7/A/8LBvf+9w7n/vMS5/7zBvf+/xL7/u8Sz/7HQpv8wdST/Knkg/5/WnP+s2qz/m8qg/7Hduf+gxab/r8iz/7rGuv+8vbj/xMC//8S+vv/BwL7/wMG8/8DBu//Awbn/w8C5/8PAu//BwL7/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwML/wMDA/8DAvv/AwL7/v8DC/8DAwv/Dv8D/wsG9/7/Cuf+8xLn/u8G9/77Fvf+5xbH/sdCk/y52JP8tdiT/osmd/7TKs/+rwaz/u867/7DAs/++ysD/w8XC/8vJyv/Fv8H/xL7A/8S+wP/Bv8D/wMC+/7/BvP+/wrv/v8G8/8DAvv/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8G/wP/Bv8D/wcC+/8DAvv+/wML/wMDC/8O/wP/Cwb//v8K7/7zDu/+7wb//vsW+/7nEs/+x0Kb/LnUl/y52JP+x0aD/w86w/77Irf+8xq7/t76s/77EuP+xsqz/wL+9/8S/w//Bv8T/wb/E/7/Axf+8wcT/ucPE/7bExP+4xML/vcHA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wb/A/8HAvv/BwL7/wcC+/8DAwv/AwML/w77C/8LAwf+/wbz/vMK+/7vBwf++xMD/u8O0/7HQp/8wdCf/MHUk/6jJlP+2xKD/vseo/7nCp//BybL/yc2+/7i7sP/HyMP/wMDA/8C/xP/Av8X/v8DF/7zBxf+4w8X/tcXF/7bExP+9wcL/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/BwL7/w7++/8O/vv/BwL7/wMDC/8DAwv/DvsL/wsDB/7/Bvv+8wsD/vMDD/7/DxP+8wrj/s86r/zFzK/8udSX/rNWd/7TNo/+7z6r/tsen/77Msv+8yLL/tcCw/7rBuf+/wb7/wMDA/8G/wv/Bv8T/v8DC/7zCwv+4xMD/ucTA/73BwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8O/vv/Dv77/w7+8/8HAvv/AwML/wL/E/8O+wv/Ev8P/v8HA/73Bwv+8v8T/wcLG/77Buv+1za3/NHEs/y12Jf+e25j/odKa/6LOm/+iyZz/ocSc/5y5mv+91b3/tsi4/7jDu/+9wcD/w77C/8S9xP/DvsL/wMDC/73Bwv+9wcD/v8HA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/w7++/8O/vP/Dv7z/wcC+/8DAwv/Av8T/w77E/8S/w/+/wcD/vcHC/76+xv/Cwcf/v8C7/7fLr/81cC7/J3kl/yN6Kf8heSv/JXcv/zaBQP84eT//QHhJ/6DOqv+dv6f/sce7/7nDwv/Bv8T/xL3F/8a8x//GvMX/xL3F/8O+xP/Bv8L/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAvv/BwL7/w7+8/8O/vP/BwL7/wMDC/8C/xP/DvsT/xL/D/8DAwv+/wML/v73I/8PAx//Av73/uMqw/zhuMP8qdyf/K3ww/yh6Mv8kbyz/M3k7/ydjL/8uYTb/sdi5/6zIsv+1xbv/vcHC/8O+xP/GvMX/x7vF/8e8xP/HvML/xL7C/8G/wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMC+/8HAvv/BwLz/wcC8/8HAvv/AwML/wL/E/8S9xP/DvsL/xMTG/8DBw//Avcj/yMPK/725uP+quqD/seWl/5nWkP+ozp//ss2q/67Ipf+wyan/uMyx/7jFsf+6wLL/vby3/8a9vv/HvMD/yLzA/8i8wP/Hvbz/xr67/8TAt//DwLn/wcC+/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wcC+/8HAvP/BwLz/wcC+/8DAwv/Av8T/xL3E/8S+wv+9vb3/ubm7/7+8xf/Iw8r/zMjF/7zMsf+d1JP/jMWA/73Trf+2u6f/u8Ou/8TNuP+1uaj/vsCz/9jTzf/Hvbz/yrvC/8i7wv/HvML/xL7A/8O/vP/Bwbn/wMK1/8DCt//Awbz/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwL7/wMC+/8HAvP/BwL7/wMDC/8G/xP/EvcT/xL7C/8fHx/++vsD/wr/G/7q4vf/BwLv/p7qc/02GQf86eC//pMOZ/7rMsv+xxar/ts2z/73Puf+zwbD/uL+3/7i6uf/BvsX/wb7J/7+/yf+8wMn/usLF/7nDwv+5xL7/usS8/7/Bvv/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAvv/AwL7/wcC8/8HAvv/AwML/wb/E/8S9xP/EvsL/w8PD/7y+vf/Ew8j/ubm7/8fKwf+vyaT/L28l/yhsH/+p0KP/udO2/6TBo/+vzLD/utS7/7XKt//E0cf/vcbD/73Ax/+9v8v/vMDM/7nCy/+4w8f/tsTE/7bFwP+5xL7/vcHA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMC+/8DAvv/BwL7/wb/A/8DAwv/Bv8T/xL7C/8O/wP+5u7j/t7y4/8DExf+2vLj/w86+/7bXrP8rciL/L30p/5/Pn/+iw6b/tda5/6nKrf9DX0b/QllF/7HBtv+5wr//vcDF/7+/yf+9wMn/vMHH/7rCxP+5xMD/ucW7/7rEu/+/wb7/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwL7/wMC+/8HAvv/Bv8D/wMDC/8G/xP/EvsL/w7/A/7zBvf+7xb3/u8TB/7O+tv+0w67/pcyd/x1rFf8gdRr/o9qj/7beuf+t067/m76d/09uT/9IYkn/rsCw/8bRyf+9wcT/wL/F/8G+x//BvsX/wMDC/7/Bvv+8w7v/vcK7/7/Bvv/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8G/wP/Bv8D/w7++/8G/wP/AwML/wb/E/8O+wv/BwL7/vMO8/73IwP+2w7z/vMzB/7TLsf+q1qP/LYQm/ymEJP+Y15H/nM2W/ztlM/9Nc0T/qcmg/7TPrP+4y7X/sr6y/73BwP/Bv8T/xrzH/8e7x//HvMT/xL7A/8HAvP/Awbz/wMC+/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/Dv77/w7/A/8G/xP/Bv8T/w77E/8DAwP+9w7//vcjA/7C9s/+8z7z/q8mn/5/Sl/8pgiT/GnsU/5zllP+i2pn/OWsw/0pyPv+lxZz/sMmp/7nKt/+2wLf/v8HA/8O+xP/Hu8X/yLvF/8i7xP/HvML/xL7A/8G/wP/Bv8D/wMDA/8G/wP/Bv8D/wcC+/8DAvv+/wb7/vcHA/7/BwP+/wcD/wMDA/8G/wP/Bv8D/wb/A/8DAvv+/wb7/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/BwP+/wcD/v8HA/7/BwP+8wr7/vcK+/8G/wP/EvsD/xL3E/8O+xf/Bvsf/v8DF/77Dxv/BysX/sb2v/7jPsv+mzJ3/mdWP/yuCJP8dfBj/KHsh/yVpHv+k3J//r9qs/6vIqv+8z7z/tL+5/7S4uf/AvsP/w73B/8S+wv/EvsL/xrzE/8S9xP/EvcT/wb/E/8G/xP/Bv8L/xL7A/8S+vv/Ev7z/wcC8/7zDvP+5xL7/usPA/7zCwv/Bv8L/w77C/8S+wP/Dv77/v8G8/73CvP+/wb7/v8HA/7/BwP+/wcD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8HA/7/BwP+/wcD/vcHA/7rDvv+8wr7/wb/A/8S+wv/GvMT/xL3F/8C/x/+9wMf/s7i8/73Dv/+7xrb/wda3/7Lapv+k4Jr/LH8n/yR9H/8wgCv/PoQ7/5fRlv+j0qb/pseo/67Dsv/Aycb/ycjN/8a8xP/HvMT/xL7C/8S/w//Ev8P/xL/F/8G/xP/AwML/wL/E/8G/wv/EvsD/xr2+/8S/vP/BwLv/usS8/7jFvv+4xMD/usPC/8G/xP/EvsL/xr3A/8O/vv+/wbz/vMO8/7/Bvv+/wcD/v8HA/7/BwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP+/wcD/v8HA/7/BwP+9wcD/vMLA/73BwP/Bv8D/xL7C/8a8xP/EvcX/wL/H/73Ax//Axcn/wMbE/77Guf+xwaf/psec/5rOkP8eZxj/I3Ag/5DPif+Nx4r/OXA5/zZqOv+l0qn/ttO3/7G5rv/Aurz/yrvC/8q6xP/EvcX/wb7F/8O+xP/Bv8L/v8G+/73Cvv+9wcD/wMDA/8S+vv/Gvrz/xL+8/8HAvP+8wr7/ucS+/7nEwP+8wsL/wb/C/8S+wv/GvcD/w7++/7/BvP+8w7z/v8G+/7/BwP+/wcD/v8HA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/BwP+/wcD/v8HA/73BwP+8wsD/vcHA/8O/wP/EvsD/xr3C/8O+xP+/wMX/vMHF/73Cxf+5vbz/wMO8/6+7p/+0zqv/rNak/zRwMP89ezr/rdyo/7Tfsv81Zjf/O28//6LTpP+py6b/usW0/7+6tv/Ku8D/yrrE/8S8yf/Bvsn/wb/E/8DAvv+9wrv/vMO7/7zDvP+9wrz/w7+8/8S/vP/Ev7z/wcC8/7zCvv+5xMD/ucPC/7zCwv/Bv8L/xL7C/8a9wP/Dv77/v8G8/7zDvP+/wcD/v8HA/7/BwP+/wcD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8HA/7/BwP+/wcD/v8HA/73Bwv/AwML/w7/A/8a9wP/EvsD/w77C/73Bwv+8wcT/uL3A/7i5u//HyMP/v8K3/8XUvf+uzKj/OGY3/y1bLP+jwKH/ttO1/5zGoP+czaD/RXVD/z1iN//C0rj/ysy//8e/vP/IvcP/yLvM/8W9zP/BwMX/vsO9/73FuP+6xbf/ucW5/7rEuf/Awbn/xL+7/8S/vP/BwLz/vcK+/7rDwP+6w8L/vcHC/8G/wv/EvsL/xr3A/8O/vv+/wbz/vMO8/7/BwP+/wcD/v8HA/7/BwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP+/wcD/v8HA/7/BwP+/wcD/v8DC/8DAwv/EvsD/xr3A/8S+vv/BwL7/vcHA/7rDwv/CyMj/vb7A/8bCw/++vbj/v8W3/6e5of9Yeln/RmdI/7jLuP+7zb3/ttS4/7LYs/9AZzr/PmE3/7PKrf+5xrL/vcO1/8HAvP/HvMr/xb3K/77Cwf+6xLn/vMS3/7rFtf+2x7X/uMa1/7/Ct//DwLn/xL+8/8HAvv+9wcD/usPC/7rDwv+9wcL/wb/C/8S+wP/Gvb7/w7++/7/BvP+8wr7/v8HA/7/BwP+/wcD/v8HA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/BwP+/wcD/v8HA/7/BwP/AwML/wb/C/8S+wP/Gvb7/xL+8/8DBvP+8wr7/usO+/77ExP+8vL7/v7m9/8S7vP/Gw77/v8W5/7PJtP+ov6v/s8C3/7XAuP+ntaT/vNC3/7DIpv+407D/s9Kz/6jFqf+zyrD/uca1/8G/wv/Bv8T/ucW5/7bHtf+9w7f/vMS1/7PJsv+zyrD/vMW0/8HBt//Dv7z/w7++/7/Awv+8wsL/vMLC/73Bwv/Bv8D/xL7A/8S+vv/Dv77/v8G+/7zCvv+/wcD/v8HA/7/BwP+/wcD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8HA/7/BwP+/wcD/v8HA/8DAwv/Bv8D/xL6+/8S/vP/DwLv/wMG7/7zDu/+6xLz/vsTC/8LCxP/HvML/zsHI/8O5uv+zsq7/w8/D/7DAs/+5xL7/uL66/7/Evf/IzsD/q7eh/7vNtf+pxaz/rM+x/6rQqf+uza3/ucW5/7zDu/+1yLL/tcmw/7zEuf+6xbf/scuu/6/Nq/+5x7D/v8O1/8PAu//Dv8D/v8DC/73BxP+9wcL/v8DC/8O/wP/EvsD/xL6+/8HAvv+/wb7/vMK+/7/BwP+/wcD/v8HA/7/BwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP+/wcD/v8HA/7/BwP+/wcD/wMDA/8O/wP/Ev7z/xL+7/8PAuf/Awbn/vMO7/7rEvP/AxMP/vLq9/9PGzf++r7b/z8PH/8K8vP+4v7f/vMi+/73Gwf++xMD/v8G+/7/Au/++v7n/vMK4/7jGuf+vzbH/K2Et/zFoMf+y1bX/utK6/6/Jpv+80bL/r7mw/7vJvP9EaET/Qmc8/7bKrv+8xbT/w8K9/8K+v//BwMX/vMDD/73Bwv+/wML/w7/A/8S+vv/Evr7/wcC+/7/BwP+8wsD/v8HA/7/BwP+/wcD/v8HA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/BwP+/wcD/v8HA/7/BwP/AwMD/wcC+/8S/vP/Ev7v/w8C5/8DBuf+8w7v/usS8/7/Dwv++ub3/0MHI/8Oyuv/NvsP/vLa2/7i9tv+wurH/vMa+/73Dv/++v8H/v73A/8O9wf/Cvr//vcK+/7HLsv9GhEX/MHYu/5fImf+kzaP/mcSP/7DQp/+6yLv/r8Gz/0BrQP87aTj/ss2q/7jFsf/Cw73/w7/A/8LBxv/Awcb/vcHE/7/Awv/Dv77/xL6+/8S+vv/BwL7/v8HA/7zCwP+/wcD/v8HA/7/BwP+/wcD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8HA/7/BwP+/wcD/v8HA/7/Bvv/BwL7/xL+8/8S/u//DwLn/wMG5/7zDu/+8w7z/vsC//7+6vv/NvsX/0L/H/9HFx//FwL3/zNTJ/7zIvP+6xrr/ucO7/72+wP/BvMP/xbvG/8S8x//AwML/scmx/yJfGv8veCb/peGl/5zXnf9Agzz/Q3pA/6W8qP+/1MP/Pm48/zlvNf+w0Kf/uMew/8HEvf/DvsL/wcDG/7+/x/+9wcT/v8DC/8O/vv/Ev7z/xL+8/8HAvv+/wcD/vMLC/7/BwP+/wcD/v8HA/7/BwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP+/wcD/v8HA/7/BwP+/wcD/v8G+/8DAvv/Dv7z/xL+7/8PAu//Awbv/vcK8/7zCvv/Cw8X/xcDE/8i7wv/Ov8T/w7m4/7a2rv/AzL7/r8Cu/7fFuP+4wrr/vb7A/8C9xv/Gu8v/xrvJ/8C/xP+yyrL/MHAk/zJ+JP+a25f/ltuY/yN5Iv8lbyT/qsus/7PPtv84cjf/NXEx/6zTpv+1ya7/wcS9/8C+wf/Bvsf/v77G/7/Axf+/wML/w7++/8S/vP/Ev7z/wcC+/7/BwP+8wsL/v8HA/7/BwP+/wcD/v8HA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/BwP+/wcD/v8HA/7/BwP+9wr7/v8G+/8O/vP/Ev7z/w7+8/8DBvP+9wr7/vcHA/729v//DvsT/xbi//8zAxP/Cvbn/v8K3/7/Ru/+60Lv/t8O1/7vCu/+9wcL/wL/F/8S8yf/EvMf/vcHE/7DNsf9AhTX/LX4h/43PiP+X3Zf/JYUk/yqCK/+v3rD/msOb/zFyLv8ucSr/qNSh/7PKrf/Axrz/wsDD/8PAyf/Avsn/v8DF/8DAwv/Dv7z/xL+7/8S/vP/BwL7/v8DC/7zCwv+/wcD/v8HA/7/BwP+/wcD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8HA/7/BwP+/wcD/vcHA/7zCvv+9wr7/wcC8/8S/vP/Dv7z/wcC+/73BwP+9wcL/u7q//8K9w//HvML/yb/A/8fEvf/I0cD/obqd/6rEqf+3w7X/vMG7/77Cwf/BwMX/w77F/8C+w/+5xMD/q9Cv/yRyHv8idxn/nduY/6DjnP8YeRL/FHQS/57bn/+a0Jz/LHYr/yx0KP+l1p//scyt/7/HvP/Bv8T/wr/K/8C+yf/Av8X/wMDC/8O/vP/Ev7v/xL+8/8O/vv+/wML/vcHC/7/Awv+/wcD/v8HA/7/BwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP+/wcD/v8HA/7/BwP+9wcD/vMK+/73Cvv/BwL7/w7++/8O/vv/Bv8D/v8DE/7/Axf/FxMr/yMPK/8vAyP+9tLX/vLyy/7G+qv9Nakv/V3RW/7nDuP/AwL7/wcG//8LAwf/Bv8D/vMLA/7PHvP+l067/K4Eq/yB6Gv+e3Jv/od+c/yaBGv8piR7/m+Sb/5Tbmf8pfCr/Kncn/6TXn/+xzKv/vsW9/8C+w//Cv8r/v73I/8C/xf/AwML/w7+8/8S/u//Ev7z/w7++/7/Awv+9wcL/v8DC/7/BwP+/wcD/v8HA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/BwP+/wcD/v8HA/7/BwP+8wr7/vcK+/8DAvv/Dv77/w7/A/8G/wv/Av8T/v8DF/767wv/BvMP/y8LH/723t//MzcX/w9C+/z5XOv9JYUf/vMO7/8G/wP/DvsL/w7/A/8DAvv+6xLz/scm7/6HUq/8jeyT/GHgU/5vjl/+V3o//G30O/yCGFv+K4ov/leaZ/yp8Kv8udCv/pdWh/67Mqv+8xrv/wMDC/8PAyf/DwMn/wL/F/8DAwv/Dv77/w7+8/8O/vP/BwL7/v8DC/7/Awv+/wcD/v8HA/7/BwP+/wcD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8HA/7/Bvv+/wbz/wMC+/8HAvv/Bv8D/wb/C/8G/xP/BvsX/wb7F/8G/xP/Bv8L/wcC+/7/BvP+9w7n/uca1/7rFt//Awbz/w77C/8O9x//DvsX/w7++/73Cu/+zyLf/o9Sn/yR8Jf8jih//GHQR/x+CGP8bkRb/F48U/xyBGf8dcRv/M3cu/zBmKv+13K//utW2/7C8rv/Cx8H/w8HE/8bBx//AvsP/wL7B/8HAvv/BwL7/wMC+/8DAvv/AwMD/v8HA/7/Bvv+/wb7/wMC+/8DAvv/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwL7/v8G+/7/BvP/AwL7/wMC+/8G/wv/Bv8L/w77E/8O+xP/Bv8T/wb/C/8DAwP+/wb7/v8G8/73Cu/+9w7n/vcK7/8DBvP/Bv8L/wL/H/8C/x//AwL7/vMS5/7XHt/+n0an/Imwf/yuCI/8xgiX/KIAc/xqBFP8bghf/KX4j/0aKP/9Bdzv/RG4+/6nMpP+1zrH/tcOy/8PIwv/CwMH/v7q+/8K9wf/Bv8D/wMDA/8DAvv+/wb7/v8G+/8DAvv/AwL7/v8G+/7/Bvv/AwL7/wMC+/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAvv+/wb7/v8G8/8DAvv/AwL7/wb/C/8G/wv/Bv8T/wb/E/8G/xP/Bv8L/wMDA/7/Bvv+/wbz/vcK7/7zEuf+8xLn/v8K7/73Cvv+5w8T/ucPE/7zDvP+5xbn/tce7/67MsP+o16D/otWS/6XNkf+iy4//rOOg/6rgov+dx5f/mr+U/6HIm/+ZvpP/u9m3/7bNs/+6xrj/v8G+/8G/wv+/usD/wb/C/8G/wP/AwMD/wMC+/7/Bvv+/wb7/wMC+/8DAvv+/wb7/v8G+/8DAvv/AwL7/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/Bvv+/wbz/wMC+/8DAwP/Bv8L/wb/C/8G/xP/Bv8L/wb/C/8DAwP+/wb7/vcK8/73Cu/+8xLn/usW3/7rFt/+9w7f/vMO7/7jExP+4w8X/vMLA/7rEvP+zx77/rMy0/53JlP+s2pz/rtOd/6zRnf+o2J7/mciU/7/evv/C3MH/uNiz/7fXsv+vyKv/rb6r/7rBuf+6vLn/xMLF/8jDyf/Bv8L/wb/A/8DAwP/AwL7/v8G+/7/Bvv/AwL7/wMC+/7/Bvv+/wb7/wMC+/8DAvv/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8G+/7/Bvv+/wcD/v8HA/8DAwv/AwML/wMDC/8DAwv/AwML/v8HA/7/Bvv+9wrz/vMS5/7rFt/+5xrX/uca0/7zFtP+9w7n/vMHF/73Ayf/Bvsf/vcHE/7LHwv+l0LT/LHEu/zODLv8mcR//K3gm/yd6KP8ndC7/mdKl/6TNq/+hwKH/ts+y/6y9qv+5xbf/xMnD/7+/v/+/vcD/wbzC/8G/wv/Bv8D/wMDA/7/Bvv+/wb7/v8G+/8DAwP/AwMD/v8G+/7/Bvv/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP+/wb7/v8G+/7/BwP+/wcD/wMDC/8DAwv/AwML/wMDA/7/BwP+/wb7/vcK8/7zDu/+6xLn/uca1/7jHtP+5xrT/usW0/7zEuf+9wcT/wL7J/8O+xf+/wMT/ssfA/6PSsv8ndy7/Gncc/yN8Iv8thy//HHoi/yJ2K/+n4rL/oMeo/7XPtv/H2Mb/u8e5/8bNxf/DxcL/wsDD/765v//CvcP/wb/C/8DAwP+/wcD/v8G+/7/Bvv+/wb7/wMDA/8DAwP+/wb7/v8G+/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/Bvv+/wb7/v8HA/7/BwP/AwMD/wMDA/8DAwP/AwMD/v8HA/7/Bvv+9wrz/vMS5/7rFt/+5xrX/uMe0/7jHtP+5xrT/usS5/73BwP/AwML/w7+8/7/Cu/+1x7v/pdGu/yt4Mv8shTH/kuCU/4TQhv8vfzb/KGos/63Rq/+8z7n/uMa3/7nDuv+yubL/vb+8/7KytP/Ewsf/wr3D/8/K0P/CwMP/wMDA/7/BwP+/wb7/v8G+/7/Bvv/AwMD/wMDA/7/Bvv+/wb7/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDC/8DAwv/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8G+/7/Bvv+/wcD/v8HA/8DAwP/AwMD/wMDA/8DAwP+/wb7/vcK8/73Cu/+6xLn/usW3/7jHtP+4x7T/tsiy/7jHtP+6xLn/v8HA/8O+wv/Gvrz/w8C5/7nFuf+qz63/Lnwx/xBtEv+i8Z7/h9SG/yx7LP84djX/qMSc/7vEr/++xLr/ub66/8DCwf/Nzc//uri9/83L0P+9uL7/wsDD/8HBw//BwcH/v8G+/7/Bvv+/wb7/v8G+/8DAwP/AwMD/v8G+/7/Bvv/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwML/wMDC/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP+/wb7/v8G+/7/BwP+/wcD/wMDA/8DAwP/AwMD/wMDA/8HDwP+8wbv/wMW+/664rf/BzL7/wtG+/0dWQ/9UZlD/t8ax/77Gu//FwMf/y7rK/823xP/JuL7/v8C6/63Pqv8sfCf/HoQW/yF+E/8phBv/GnYR/y13Iv+szpv/u8is/7/Cu//AwML/wMDC/8G/xP/Bv8T/w77E/8C+wf/AvsH/wMDC/8DAwP+/wb7/v8G+/7/Bvv+/wb7/wMDA/8DAwP+/wb7/v8G+/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/Bvv+/wb7/v8HA/7/BwP/AwMD/wMDA/8DAwP/AwMD/wcG//8LEv//Gy8T/usK3/7vGuP+0wbD/UmFO/1loU/+2wq7/vsG2/8O8w//Hucj/zLjE/8m6v/+/wLv/sM2u/yhsH/8mfBn/Knob/zJ+I/8peB//OXgx/6vKof/Byrn/wMC+/8G/xP/Bv8T/wsDF/8S/xf/Bv8T/wb/C/8G/wv/AwMD/wMDA/7/Bvv+/wb7/v8G+/7/Bvv/AwMD/wMDA/7/Bvv+/wb7/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8G+/7/Bvv+/wb7/v8G+/8DAwP/AwMD/wb/A/8DAwP+7u7n/vsC7/77DvP+9xbr/v8e6/8bRwf+otaT/tcCv/7/Csf/BwbX/v7+9/76+vv/Cvrv/wL+6/7jCuv+yyrT/sdup/6rXnv+uz6L/q8uk/6jQq/+ewKf/w9LP/7y/xv/BvsX/w77E/8G/xP/Bv8T/wb/C/8G/wv/Bv8L/wMDC/8DAwP/AwMD/wMDA/8DAwP+/wb7/v8G+/7/Bvv+/wb7/v8G+/7/Bvv/AwL7/wMC+/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP+/wb7/v8G+/7/Bvv+/wb7/wMDA/8DAwP/Bv8D/wb/A/8XEwv/CwsD/u724/7vAuf+0urD/usK1/8POwP/K0ML/xcO0/8bEuP++w73/vcK+/8DBu/+8wrj/t8S7/7PKtv+vz6b/osGV/7zPsf+svqj/uNG8/7jQw/+1vsf/u7rK/8G+x//Bv8T/wb/E/8C+wf/AvsH/wb/C/8DAwv/AwML/wMDA/8DAwP/AwMD/wMDA/7/Bvv+/wb7/v8G+/7/Bvv+/wb7/v8G+/8DAvv/AwL7/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/Bvv+/wb7/wMC+/8DAvv/Bv8D/wb/A/8O/wP/Bv8D/wb/A/7+/vf/Bwr3/xsnC/7/Cu/+1u7H/wsi+/7S3rP/DxLb/w8O5/8DCwf/AwML/w7++/8C/u/+5xLz/tc+2/zxnMv9OfD7/q9Cd/6jJnv+u1Kv/tdO5/6u2sv/KytL/wsDF/8LAw//Bv8L/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8G+/7/Bvv+9wrz/vcK8/7/Bvv+/wb7/wMC+/8DAvv/AwL7/wMC+/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAvv/AwL7/wMC+/8DAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8G+/7/Bvv/AwL7/wMC+/8G/wP/Bv8D/w7/A/8O/wP/Avr//uri5/8LBv//DxL//ysvG/8THwP/S1c7/xci//8LCuP/Dwr3/wcHD/8G/xP/Dvb3/v765/7fEuv+v0LH/LWgo/0CDNv+Z0o7/oNOY/57VnP+kz6T/scKw/8jKx//BwcH/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP+/wb7/v8G8/73CvP+9wrz/v8G+/7/Bvv/AwL7/wMC+/8DAvv/AwL7/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMC+/8DAvv/AwL7/wMC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP+/wb7/v8G+/8DAvv/AwL7/wb/A/8G/wP/DvsL/w77C/8/LzP/Bvb7/x8PC/7Kxrf+9vrn/trmy/73Auf+9wLn/wcK8/8HCvf/Bv8T/w77C/8PAuf+9wbL/sMax/6TTqf8oeS3/Hnsi/yR1Jv8qdiz/LHgw/0R/Rf+pxKP/tr+u/77Au/++wL3/v8G+/7/Bvv+/wb7/v8G+/7/Bvv+/wb7/wMDA/8DAwP/AwMD/wMDA/7/Bvv+/wbz/vcK8/73Cu/+/wbz/v8G8/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/7/Bvv+/wb7/wMC+/8DAvv/Bv8D/wb/A/8O+wv/Dv8D/w7/A/7y4t//Qz83/u7q2/83Oyf/Cxb7/uL22/73Cu/+8wbr/vsC7/77Av//Bwr3/xMS4/77Fs/+yyLH/pNWo/xt0JP8njDD/F2oc/zV+N/8pcS//LWYv/8Dbuv+6w7L/vMG6/77Avf+/wb7/v8G+/8DCvf/Awr3/wMK//8DCv//Bwb//wcG//8HBwf/Bwb//wMK9/8DCvf/Aw7z/vsO9/7/BvP+/wb7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wcC+/8HAvv/BwL7/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/v8HA/73BwP+/wcD/wMDA/8G/wP/Bv8D/wb/A/8G/wP/DwcL/uLe1/8bHwv+/wrv/tbqz/73Fuv+8xrv/v8m+/7rBuf+8w7v/usW3/7vDtP++wrH/vcSy/7bIsv+o0qr/Kn4w/yaCK/+LzIr/p9ej/5/Mof+pyqv/usu5/7e9s//Awr3/wcK9/8HCvf/Bwr3/wcK9/8HCvf/Bwr3/wcK9/8DBvP/Awbz/wMC+/8DBvP/Awbz/v8G8/7/BvP+/wbz/wMC+/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wP/Bv8L/wb/A/8G/wv/Bv8D/wb/C/8G/wP/Bv8L/wb/A/8G/wv/Bv8D/wb/C/8G/wP/Bv8L/wb/A/8G/wv/Bv8D/wb/C/8G/wP/Bv8L/wb/A/8G/wv/Bv8D/wb/C/8G/wP/Bv8L/wb/A/8G/wv/Bv8D/wb/C/8G/wP/Bv8L/wb/A/8G/wv/Bv8D/wb/C/8G/wP/Bv8L/wb/A/8G/wv/Bv8D/wb/C/8G/wP/Bv8L/wb/A/8G/wv/Bv8D/wb/C/8G/wP/Bv8L/wb/A/8G/wv/Bv8D/wb/C/8G/wP/Bv8L/wb/A/8G/wv/Bv8D/wb/C/8G/wP/Bv8L/wb/A/8G/wv/Bv8D/wb/C/8G/wP/Bv8L/wb/A/8G/wv/Bv8D/wb/C/8G/wP/Bv8L/wb/A/8G/wv/Bv8D/wb/C/8G/wP/Bv8L/wb/A/8G/wv/Bv8D/wb/C/8G/wP/Bv8L/wb/A/8G/wv/Bv8D/wb/C/8G/wP/Bv8L/wb/A/8G/wv/Bv8D/wb/C/8G/wP/Bv8L/wb/A/8G/wv/Bv8D/wb/C/8G/wP/Bv8L/wb/A/8G/wv/Bv8D/wb/C/8G/wP/Bv8L/wMDA/8DAwv/AwMD/wMDC/8DAwP/AwML/wMDA/8DAwv/AwMD/wMDC/8DAwP/AwML/wMDA/8DAwv/AwMD/wMDC/7/BwP+/wML/vcHA/7/Awv/AwMD/wb/C/8G/wP/Bv8L/wb/A/8PBwv/Bwb//vb+6/7/Evf/Ey8P/wcvA/7vHu/+yvrL/vcS9/7/Gvv+7x7n/uca0/73EtP+9xLT/tsSz/6jNq/8mcSz/InAl/6/eqv+407D/vM+5/7nHuv+1v7f/tbq2/7+/vf+/v73/v7+9/7+/vf+/v73/v7+9/7+/vf+/v73/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwL7/wMC+/8DAvv/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8C/xP/Av8T/wL/E/8C/xP/Av8T/wL/E/8C/xP/Av8T/wL/E/8C/xP/Av8T/wL/E/8C/xP/Av8T/wL/E/8C/xP/Av8T/wMDC/8C/xP/AwML/wL/E/8DAwv/Av8T/wMDC/8C/xP/AwML/wL/E/8DAwv/Av8T/wMDC/8C/xP/AwML/wL/E/8DAwv/Av8T/wMDC/8C/xP/AwML/wL/E/8DAwv/Av8T/wMDC/8C/xP/AwML/wL/E/8DAwv/Av8T/wMDC/8C/xP/AwML/wL/E/8DAwv/Av8T/wMDC/8C/xP/AwML/wL/E/8DAwv/Av8T/wMDC/8C/xP/AwML/wL/E/8DAwv/Av8T/wMDC/8C/xP/AwML/wL/E/8DAwv/Av8T/wMDC/8C/xP/AwML/wL/E/8DAwv/Av8T/wMDC/8C/xP/AwML/wL/E/8DAwv/Av8T/wMDC/8C/xP/AwML/wL/E/8DAwv/Av8T/wMDC/8C/xP/AwML/wL/E/8DAwv/Av8T/wMDC/8C/xP/AwML/wL/E/8DAwv/Av8T/wMDC/8C/xP/AwML/wL/E/8DAwv/Av8T/wMDC/8C/xP/AwML/wL/E/8DAwv/Av8T/wMDC/8C/xP/AwML/wL/E/8DAwv/Av8T/wMDC/8C/xP/AwML/wL/E/8DAwv/Av8T/wMDC/8C/xP/AwML/wL/E/7/Awv+/wMT/v8DC/7/AxP+/wML/v8DE/7/Awv+/wMT/v8DC/7/AxP+/wML/v8DE/7/Awv+/wMT/v8DC/7/AxP+/wML/wL/E/8DAwv/Bv8T/wb/C/8G/xP/Bv8L/vr7A/8vLy//Awr//uL23/7rEvP+0wLb/t8S6/8XQyP+7v77/vsLB/7vFvP+6xrj/wMa6/77Gu/+5xr3/rc22/zp5Qv8paS3/u9u2/6m2ov+7vLT/vby6/7m+uv/IzMv/wMDA/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wP/Bv8D/wb/A/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Bv8T/wb/E/8G/xP/Av8T/wL/E/8C/xP/Av8T/wL/E/8C/xP/Av8T/wL/E/8C/xP/Av8T/wL/E/8C/xP/Av8T/wL/E/8C/xP/Av8T/v8DE/7/AxP/Av8T/wL/E/8G/xP/Bv8T/wb/E/8G/wv+5ubv/wsTD/8bLx/+2vLj/wszE/8DNxP+ktKn/vcjC/7u/wv/AwcX/vcO//7vFvP+/xL3/vcS9/7fDwf+uybr/OWY//ztmOf+yya//vMK2/87Kyf/Mxsr/u7m6/7m5uf/AvsH/wr3B/8K9wf/CvcH/wr3B/8K9wf/CvcH/wr3B/8K9wf/CvcH/wr3B/8K9wf/CvcH/wr3B/8K9wf/CvcH/w77C/8O+wv/DvsL/w77C/8O+wv/DvsL/w77C/8O+wv/DvsL/w77C/8O+wv/DvsL/w77C/8O+wv/DvsL/w77C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/DvsL/w77C/8O+wv/DvsL/w77C/8O+wv/DvsL/w77C/8O+wv/DvsL/w77C/8O+wv/DvsL/w77C/8O+wv/DvsL/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8O+wv/DvsL/w77C/8O+wv/DvsL/w77C/8O+wv/DvsL/w77C/8O+wv/DvsL/w77C/8O+wv/DvsL/w77C/8O+wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/w77C/8O+wv/DvsL/w77C/8O+wv/DvsL/w77C/8O+wv/DvsL/w77C/8O+wv/DvsL/w77C/8O+wv/DvsL/w77C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Dv8D/w7/A/8O/wP/Dv8D/w7/A/8O/wP/Dv8D/w7/A/8O/wP/Dv8D/w7/A/8O/wP/Dv8D/w7/A/8O/wP/Dv8D/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8O+xP/DvsT/w77E/8G/xP/AwML/wMDC/8DAwv/AwML/wb/E/8G/xP/Bv8L/wb/C/8jIyv+2uLf/x8zI/7C5tP/Ez8f/u8i//1ZmW/9RXFb/vL3C/7+/x/+9w8H/vMO8/77Au/+6wLz/s8PD/7HGv/+/1rz/tsqu/7/Lvf+/xr//t7i6/8C+w//Mwcf/yr/D/8W8wf/DvcH/w73B/8O9wf/DvcH/w73B/8O9wf/DvcH/w73B/8O9wf/DvcH/w73B/8O9wf/DvcH/w73B/8O9wf/EvsD/xL7A/8S+wP/EvsD/xL7A/8S+wP/EvsD/xL7A/8S+wP/EvsD/xL7A/8S+wP/EvsD/xL7A/8S+wP/EvsD/w77C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/w77C/8S+wP/EvsD/xL7A/8S+wP/EvsD/xL7A/8S+wP/EvsD/xL7A/8S+wP/EvsD/xL7A/8S+wP/EvsD/xL7A/8S+wP/DvsL/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/DvsL/xL7A/8S+wP/EvsD/xL7A/8S+wP/EvsD/xL7A/8S+wP/EvsD/xL7A/8S+wP/EvsD/xL7A/8S+wP/EvsD/xL7A/8O+wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8O+wv/EvsD/xL7A/8S+wP/EvsD/xL7A/8S+wP/EvsD/xL7A/8S+wP/EvsD/xL7A/8S+wP/EvsD/xL7A/8S+wP/EvsD/w77C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8G/wv/Bv8L/wb/C/8e9vP/Gvrz/x728/8a+vP/Hvbz/xr68/8e9vP/Gvrz/x728/8a+vP/Hvbz/xr68/8e9vP/Gvrz/x728/8a9vv/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xr3A/8a9wP/GvcD/xL7A/8O/wP/BwL7/wb/A/8O/wP/Dv8D/w7/A/8O/wP/Dv77/zMjH/7W0sP/KzMf/s7ix/7vCuv+xu7D/V2NX/05YUP+8u8D/wL3E/8DAvv+/wLr/wL+6/7zBvf+1w8P/tsfB/622of+5vqf/rrKk/8TJw/+7wb//xMXH/8zDxP/Dt7n/yL6//8e+v//Hvr//x76//8i+v//Hvr//yL6//8i+v//Hvb7/x72+/8e9vv/Gvb7/x72+/8a9vv/Hvb7/xr2+/8e9vv/Gvrz/x72+/8a+vP/Hvb7/xr68/8e9vv/Gvrz/x72+/8a+vP/Hvb7/xr68/8e9vv/Gvrz/x72+/8a9vv/Evr7/xL6+/8S+vv/Evr7/xL6+/8S+vv/Evr7/xL6+/8S+vv/Evr7/xL6+/8S+vv/Evr7/xL6+/8S+vv/Evr7/xr2+/8a+vP/Hvb7/xr68/8e9vv/Gvrz/x72+/8a+vP/Hvb7/xr68/8e9vv/Gvrz/x72+/8a+vP/Hvb7/xr2+/8S+vv/Evr7/xL6+/8S+vv/Evr7/xL6+/8S+vv/Evr7/xL6+/8S+vv/Evr7/xL6+/8S+vv/Evr7/xL6+/8S+vv/Gvb7/xr68/8e9vv/Gvrz/x72+/8a+vP/Hvb7/xr68/8e9vv/Gvrz/x72+/8a+vP/Hvb7/xr68/8e9vv/Gvb7/xL6+/8S+vv/Evr7/xL6+/8S+vv/Evr7/xL6+/8S+vv/Evr7/xL6+/8S+vv/Evr7/xL6+/8S+vv/Evr7/xL6+/8a9vv/Gvrz/x72+/8a+vP/Hvb7/xr68/8e9vv/Gvrz/x72+/8a+vP/Hvb7/xr68/8e9vv/Gvrz/x72+/8a9vv/Evr7/xL6+/8S+vv/Evr7/xL6+/8S+vv/Evr7/xL6+/8S+vv/Evr7/xL6+/8S+vv/Evr7/xL6+/8S+vv/Evr7/y7u7/8q8u//Lu7v/yry7/8u7u//KvLv/y7u7/8q8u//Lu7v/yry7/8u7u//KvLv/y7u7/8q8u//Lu7v/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//KvLv/yry7/8q8u//Ivbv/x727/8a/uf/Gvrv/x727/8e9u//Hvbv/x727/8e+uf+/trH/v7iy/8nFvP/Hxbn/xMS4/8bIuv++wrP/wcS5/8LBv//GwMD/yL+6/8e+tf/DwbX/vsG4/7fAu/+4wrf/w8mt/8jLrP/My7f/xsi7/7jCuf+6xLz/vcC5/8PDu//Gv7n/x765/8e+uf/Hvrn/yL25/8e+uf/Ivbn/yL25/8m+uv/Jvrr/yb66/8i/uv/Jvrr/yL+6/8m+uv/Iv7r/yL25/8e+t//Ivbn/x763/8i9uf/Hvrf/yL25/8e+t//Ivbn/x763/8i9uf/Hvrf/yL25/8e+t//Ivbn/yL25/8i9uf/Ivbn/yL25/8i9uf/Ivbn/yL25/8i9uf/Ivbn/yL25/8i9uf/Ivbn/yL25/8i9uf/Ivbn/yL25/8i9uf/Ivbn/x763/8i9uf/Hvrf/yL25/8e+t//Ivbn/x763/8i9uf/Hvrf/yL25/8e+t//Ivbn/x763/8i9uf/Ivbn/yL25/8i9uf/Ivbn/yL25/8i9uf/Ivbn/yL25/8i9uf/Ivbn/yL25/8i9uf/Ivbn/yL25/8i9uf/Ivbn/yL25/8i9uf/Hvrf/yL25/8e+t//Ivbn/x763/8i9uf/Hvrf/yL25/8e+t//Ivbn/x763/8i9uf/Hvrf/yL25/8i9uf/Ivbn/yL25/8i9uf/Ivbn/yL25/8i9uf/Ivbn/yL25/8i9uf/Ivbn/yL25/8i9uf/Ivbn/yL25/8i9uf/Ivbn/yL25/8e+t//Ivbn/x763/8i9uf/Hvrf/yL25/8e+t//Ivbn/x763/8i9uf/Hvrf/yL25/8e+t//Ivbn/yL25/8i9uf/Ivbn/yL25/8i9uf/Ivbn/yL25/8i9uf/Ivbn/yL25/8i9uf/Ivbn/yL25/8i9uf/Ivbn/yL25/8i9uf/ds7T/3LS0/92ztP/ctLT/3bO0/9y0tP/ds7T/3LS0/92ztP/ctLT/3bO0/9y0tP/ds7T/3LS0/92ztP/ctLT/3LS0/9u1sv/ctLT/27Wy/9y0tP/btbL/3LS0/9u1sv/ctLT/27Wy/9y0tP/btbL/3LS0/9u1sv/ctLT/27Wy/9y0tP/btbL/3LS0/9u1sv/ctLT/27Wy/9y0tP/btbL/3LS0/9u1sv/ctLT/27Wy/9y0tP/btbL/3LS0/9u1sv/ctLT/27Wy/9y0tP/btbL/3LS0/9u1sv/ctLT/27Wy/9y0tP/btbL/3LS0/9u1sv/ctLT/27Wy/9y0tP/btbL/3LS0/9u1sv/ctLT/27Wy/9y0tP/btbL/3LS0/9u1sv/ctLT/27Wy/9y0tP/btbL/3LS0/9u1sv/ctLT/27Wy/9y0tP/btbL/3LS0/9u1sv/ctLT/27Wy/9y0tP/btbL/3LS0/9u1sv/ctLT/27Wy/9y0tP/btbL/3LS0/9u1sv/ctLT/27Wy/9y0tP/btbL/3LS0/9u1sv/ctLT/27Wy/9y0tP/btbL/3LS0/9u1sv/ctLT/27Wy/9y0tP/btbL/3LS0/9u1sv/ctLT/27Wy/9y0tP/btbL/3LS0/9u1sv/ctLT/27Wy/9y0tP/btbL/3LS0/9u1sv/ctLT/27Wy/9y0tP/btbL/3LS0/9u1sv/ctLT/27Wy/9y0tP/btbL/3LS0/9u1sv/ctLT/27Wy/9y0tP/btbL/3LS0/9u1sv/ZtrT/2ba0/9u1tP/btbT/27W0/9u1tP/ctLT/3LS0/9q0s//jvbr/z6ym/969tv/Utqz/x6ug/+PJvP/Os6r/07Wz/9i0tP/bsrD/3bKs/9u2rv/WubP/zbq0/8a/r/9SXTP/a3JG/7+vlf/HsKD/0sa6/83Fuv/CuK7/08G3/9W4sv/Yt7L/2Ley/9i3sv/ZtrL/2Ley/9m2sv/ZtrL/2bay/9m2sv/ZtrL/2Ley/9m2sv/Yt7L/2bay/9i3sv/ZtrL/2Ley/9m2sv/Yt7L/2bay/9i3sv/ZtrL/2Ley/9m2sv/Yt7L/2bay/9i3sv/ZtrL/2Ley/9m2sv/ZtrL/27Wy/9u1sv/ctLL/27Wy/9y0sv/btbL/3LSy/9u1sv/ctLL/27Wy/9y0sv/btbL/3LSy/9u1sv/ctLL/27Wy/9m2sv/Yt7L/2bay/9i3sv/ZtrL/2Ley/9m2sv/Yt7L/2bay/9i3sv/ZtrL/2Ley/9m2sv/Yt7L/2bay/9m2sv/btbL/27Wy/9y0sv/btbL/3LSy/9u1sv/ctLL/27Wy/9y0sv/btbL/3LSy/9u1sv/ctLL/27Wy/9y0sv/btbL/2bay/9i3sv/ZtrL/2Ley/9m2sv/Yt7L/2bay/9i3sv/ZtrL/2Ley/9m2sv/Yt7L/2bay/9i3sv/ZtrL/2bay/9u1sv/btbL/3LSy/9u1sv/ctLL/27Wy/9y0sv/btbL/3LSy/9u1sv/ctLL/27Wy/9y0sv/btbL/3LSy/9u1sv/ZtrL/2Ley/9m2sv/Yt7L/2bay/9i3sv/ZtrL/2Ley/9m2sv/Yt7L/2bay/9i3sv/ZtrL/2Ley/9m2sv/ZtrL/27Wy/9u1sv/ctLL/27Wy/9y0sv/btbL/3LSy/9u1sv/ctLL/27Wy/9y0sv/btbL/3LSy/9u1sv/ctLL/27Wy/6xTV/+qVFf/rFNX/6pUV/+sU1f/qlRX/6xTV/+qVFf/rFNX/6pUV/+sU1f/qlRX/6xTV/+qVFf/rFNX/6pUV/+qVFf/qVRX/6pTWf+pVFf/qlNZ/6lUV/+qU1n/qVRX/6pTWf+pVFf/qlNZ/6lUV/+qU1n/qVRX/6pTWf+pVFf/qlNZ/6lUV/+qU1n/qVRX/6pTWf+pVFf/qlNZ/6lUV/+qU1n/qVRX/6pTWf+pVFf/qlNZ/6lUV/+qU1n/qVRX/6pTWf+pVFf/qlNZ/6lUV/+qU1n/qVRX/6pTWf+pVFf/qlNZ/6lUV/+qU1n/qVRX/6pTWf+pVFf/qlNZ/6lUV/+qU1n/qVRX/6pTWf+pVFf/qlNZ/6lUV/+qU1n/qVRX/6pTWf+pVFf/qlNZ/6lUV/+qU1n/qVRX/6pTWf+pVFf/qlNZ/6lUV/+qU1n/qVRX/6pTWf+pVFf/qlNZ/6lUV/+qU1n/qVRX/6pTWf+pVFf/qlNZ/6lUV/+qU1n/qVRX/6pTWf+pVFf/qlNZ/6lUV/+qU1n/qVRX/6pTWf+pVFf/qlNZ/6lUV/+qU1n/qVRX/6pTWf+pVFf/qlNZ/6lUV/+qU1n/qVRX/6pTWf+pVFf/qlNZ/6lUV/+qU1n/qVRX/6pTWf+pVFf/qlNZ/6lUV/+qU1n/qVRX/6pTWf+pVFf/qlNZ/6lUV/+qU1n/qVRX/6pTWf+pVFf/qlNZ/6lUV/+qU1n/qVRX/6pTWf+pVFf/qlNZ/6lUV/+qU1n/qlRX/6pTWf+qU1n/rFNZ/61UWv+uU1r/rlNa/61SWf+tUln/rlNa/65TWv+sU1f/qlRX/6pUVf+pVVX/qVVT/6dWVf+rVlv/rFNZ/7JPVP+2T1P/tlFV/7BWWP+jWVr/iGNQ/0xgI/9VZSb/i149/6FeTf+TW07/jlxT/5NeWP+VWlb/olhZ/6ZWV/+mVlf/plZX/6dVV/+mVlf/p1VX/6dVV/+nVVf/p1VX/6dVV/+mVlf/p1VX/6ZWV/+nVVf/plZX/6dVV/+mVlf/p1VX/6ZWV/+nVVf/plZX/6dVV/+mVlf/p1VX/6ZWV/+nVVf/plZX/6dVV/+mVlf/p1VX/6dVV/+pVFf/qVRX/6pUV/+pVFf/qlRX/6lUV/+qVFf/qVRX/6pUV/+pVFf/qlRX/6lUV/+qVFf/qVRX/6pUV/+pVFf/p1VX/6ZWV/+nVVf/plZX/6dVV/+mVlf/p1VX/6ZWV/+nVVf/plZX/6dVV/+mVlf/p1VX/6ZWV/+nVVf/p1VX/6lUV/+pVFf/qlRX/6lUV/+qVFf/qVRX/6pUV/+pVFf/qlRX/6lUV/+qVFf/qVRX/6pUV/+pVFf/qlRX/6lUV/+nVVf/plZX/6dVV/+mVlf/p1VX/6ZWV/+nVVf/plZX/6dVV/+mVlf/p1VX/6ZWV/+nVVf/plZX/6dVV/+nVVf/qVRX/6lUV/+qVFf/qVRX/6pUV/+pVFf/qlRX/6lUV/+qVFf/qVRX/6pUV/+pVFf/qlRX/6lUV/+qVFf/qVRX/6dVV/+mVlf/p1VX/6ZWV/+nVVf/plZX/6dVV/+mVlf/p1VX/6ZWV/+nVVf/plZX/6dVV/+mVlf/p1VX/6dVV/+pVFf/qVRX/6pUV/+pVFf/qlRX/6lUV/+qVFf/qVRX/6pUV/+pVFf/qlRX/6lUV/+qVFf/qVRX/6pUV/+pVFf/vUxQ/71MUP+9TFD/vUxQ/71MUP+9TFD/vUxQ/71MUP+9TFD/vUxQ/71MUP+9TFD/vUxQ/71MUP+9TFD/vUxQ/71MUP+7TVD/vUxQ/7tNUP+9TFD/u01Q/71MUP+7TVD/vUxQ/7tNUP+9TFD/u01Q/71MUP+7TVD/vUxQ/7tNUP+9TFD/u01Q/71MUP+7TVD/vUxQ/7tNUP+9TFD/u01Q/71MUP+7TVD/vUxQ/7tNUP+9TFD/u01Q/71MUP+7TVD/vUxQ/7tNUP+9TFD/u01Q/71MUP+7TVD/vUxQ/7tNUP+9TFD/u01Q/71MUP+7TVD/vUxQ/7tNUP+9TFD/u01Q/71MUP+7TVD/vUxQ/7tNUP+9TFD/u01Q/71MUP+7TVD/vUxQ/7tNUP+9TFD/u01Q/71MUP+7TVD/vUxQ/7tNUP+9TFD/u01Q/71MUP+7TVD/vUxQ/7tNUP+9TFD/u01Q/71MUP+7TVD/vUxQ/7tNUP+9TFD/u01Q/71MUP+7TVD/vUxQ/7tNUP+9TFD/u01Q/71MUP+7TVD/vUxQ/7tNUP+9TFD/u01Q/71MUP+7TVD/vUxQ/7tNUP+9TFD/u01Q/71MUP+7TVD/vUxQ/7tNUP+9TFD/u01Q/71MUP+7TVD/vUxQ/7tNUP+9TFD/u01Q/71MUP+7TVD/vUxQ/7tNUP+9TFD/u01Q/71MUP+7TVD/vUxQ/7tNUP+9TFD/u01Q/71MUP+7TVD/vUxQ/7tNUP+9TFD/u01Q/71MUP+9TFD/vktQ/75LUP+/SlL/v0pS/8JKU//CSlP/wUlT/8FJUv/DSVT/wkpT/8FJUv+/SlD/v0pQ/75LTv++S07/vUxO/75NUf/AS1H/yUhN/81GTP/KR0z/w0tN/7VNTv+TXUP/T2kf/1BtG/+PXzH/rlxE/6NcSP+ZV0n/kE5C/4k8Nv+xUlD/uE5Q/7pNUP+6TVD/uk1Q/7pNUP+6TVD/uk1Q/7pNUP+6TVD/uk1Q/7pNUP+6TVD/uk1Q/7pNUP+6TVD/uk1Q/7pNUP+6TVL/uk1Q/7pNUv+6TVD/uk1S/7pNUP+6TVL/uk1Q/7pNUv+6TVD/uk1S/7pNUP+6TVL/uk1Q/7tMUv+7TVD/u0xS/7tNUP+7TFL/u01Q/7tMUv+7TVD/u0xS/7tNUP+7TFL/u01Q/7tMUv+7TVD/u0xS/7tNUP+6TVL/uk1Q/7pNUv+6TVD/uk1S/7pNUP+6TVL/uk1Q/7pNUv+6TVD/uk1S/7pNUP+6TVL/uk1Q/7pNUv+6TVD/u0xS/7tNUP+7TFL/u01Q/7tMUv+7TVD/u0xS/7tNUP+7TFL/u01Q/7tMUv+7TVD/u0xS/7tNUP+7TFL/u01Q/7pNUv+6TVD/uk1S/7pNUP+6TVL/uk1Q/7pNUv+6TVD/uk1S/7pNUP+6TVL/uk1Q/7pNUv+6TVD/uk1S/7pNUP+7TFL/u01Q/7tMUv+7TVD/u0xS/7tNUP+7TFL/u01Q/7tMUv+7TVD/u0xS/7tNUP+7TFL/u01Q/7tMUv+7TVD/uk1S/7pNUP+6TVL/uk1Q/7pNUv+6TVD/uk1S/7pNUP+6TVL/uk1Q/7pNUv+6TVD/uk1S/7pNUP+6TVL/uk1Q/7tMUv+7TVD/u0xS/7tNUP+7TFL/u01Q/7tMUv+7TVD/u0xS/7tNUP+7TFL/u01Q/7tMUv+7TVD/u0xS/7tNUP/CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS0//wktP/8JLT//CS03/wkxM/8BMTP/CTEz/wExM/8JMTP/ATEz/wkxM/8BMTP/CTEz/wExM/8JMTP/ATEz/wkxM/8BMTP/CTEz/wExM/8JMTP/ATEz/wkxM/8BMTP/CTEz/wExM/8JMTP/ATEz/wkxM/8BMTP/CTEz/wExM/8JMTP/ATEz/wkxM/8BMTP/CTEz/wExM/8JMTP/ATEz/wkxM/8BMTP/CTEz/wExM/8JMTP/ATEz/wkxM/8BMTP/CTEz/wExM/8JMTP/ATEz/wkxM/8BMTP/CTEz/wExM/8JMTP/ATEz/wkxM/8BMTP/CTEz/wExM/8JMTP/ATEz/wkxM/8BMTP/CTEz/wExM/8JMTP/ATEz/wkxM/8BMTP/CTEz/wExM/8JMTP/ATEz/wkxM/8BMTP/CTEz/wExM/8JMTP/ATEz/wkxM/8BMTP/CTEz/wExM/8JMTP/ATEz/wkxM/8BMTP/CTEz/wExM/8JMTP/ATEz/wkxM/8BMTP/CTEz/wExM/8JMTP/ATEz/wkxM/8BMTP/CTEz/wExM/8JMTP/ATEz/wkxM/8BMTP/CTEz/wExM/8JMTP/ATEz/wkxM/8BMTP/CTEz/wExM/8JMTP/ATEz/wkxM/8BMTP/CTEz/wExM/8JMTP/ATEz/wkxM/8BMTP/CTEz/wExM/8JMTP/ATEz/wkxM/8JMTP/CTEz/w0tM/8RJTP/ESUz/xklN/8ZJTf/FSE7/xUhM/8dIT//GSU3/xUhM/8RJS//ESUv/wkpJ/8JKSf/BS0n/vUxI/8FLR//NR0T/0EZD/8xIRP/ESkX/uk1G/5dfPP9FZxD/RnIQ/4doKP+kYzn/lF48/4lYOv+HUTn/ikIz/7RRS/++TEv/v0tL/79LS/+/S0v/v0tL/79LS/+/S0v/wUtL/8FLS//BS0v/wUtL/8FLS//BS0v/v0tL/79LS/+/S0v/v0tL/79LTP+/S0v/v0tM/79LS/+/S0z/v0tL/79LTP+/S0v/v0tM/79LS/+/S0z/v0tL/79LTP+/S0v/vkxM/71NS/+9TUz/vU1L/71NTP+9TUv/vU1M/71NS/+9TUz/vU1L/71NTP+9TUv/vU1M/71NS/+9TUz/vkxL/79LTP+/S0v/v0tM/79LS/+/S0z/v0tL/79LTP+/S0v/v0tM/79LS/+/S0z/v0tL/79LTP+/S0v/v0tM/79LS/++TEz/vU1L/71NTP+9TUv/vU1M/71NS/+9TUz/vU1L/71NTP+9TUv/vU1M/71NS/+9TUz/vU1L/71NTP++TEv/v0tM/79LS/+/S0z/v0tL/79LTP+/S0v/v0tM/79LS/+/S0z/v0tL/79LTP+/S0v/v0tM/79LS/+/S0z/v0tL/75MTP+9TUv/vU1M/71NS/+9TUz/vU1L/71NTP+9TUv/vU1M/71NS/+9TUz/vU1L/71NTP+9TUv/vU1M/75MS/+/S0z/v0tL/79LTP+/S0v/v0tM/79LS/+/S0z/v0tL/79LTP+/S0v/v0tM/79LS/+/S0z/v0tL/79LTP+/S0v/vkxM/71NS/+9TUz/vU1L/71NTP+9TUv/vU1M/71NS/+9TUz/vU1L/71NTP+9TUv/vU1M/71NS/+9TUz/vU1L/8VKTP/FSkz/xUpM/8VKTP/FSkz/xUpM/8VKTP/FSkz/xUpM/8VKTP/FSkz/xUpM/8VKTP/FSkz/xUpM/8VLSv/FS0r/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8ZMSf/GSkj/xkpK/8VJSf/HSUr/x0lM/8hHS//IR0v/yUhM/8ZISf/GSEn/xkpI/8ZKSP/FS0j/xEpF/8FMRf++S0T/wktD/8xJQf/OSD//zElB/8RLQv+9TkP/nGI8/0FmCf9FeA//gXMq/5JpM/94WCn/dVIq/49aO/+nWkb/uVFI/8NMSP/FS0j/xEpH/8RKR//ESkf/xEpH/8RKR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//ESkf/xEpH/8RKSf/ESkn/xEpJ/8RKSf/ESkn/xEpJ/8RKSf/ESkn/xEpJ/8RKSf/ESkn/xEpJ/8RKSf/ESkn/xEpJ/8JKSf/BS0n/wUtJ/8FLSf/BS0n/wUtJ/8FLSf/BS0n/wUtJ/8FLSf/BS0n/wUtJ/8FLSf/BS0n/wUtJ/8FLSf/BS0n/wkpJ/8RKSf/ESkn/xEpJ/8RKSf/ESkn/xEpJ/8RKSf/ESkn/xEpJ/8RKSf/ESkn/xEpJ/8RKSf/ESkn/wkpJ/8FLSf/BS0n/wUtJ/8FLSf/BS0n/wUtJ/8FLSf/BS0n/wUtJ/8FLSf/BS0n/wUtJ/8FLSf/BS0n/wUtJ/8FLSf/CSkn/xEpJ/8RKSf/ESkn/xEpJ/8RKSf/ESkn/xEpJ/8RKSf/ESkn/xEpJ/8RKSf/ESkn/xEpJ/8RKSf/CSkn/wUtJ/8FLSf/BS0n/wUtJ/8FLSf/BS0n/wUtJ/8FLSf/BS0n/wUtJ/8FLSf/BS0n/wUtJ/8FLSf/BS0n/wUtJ/8JKSf/ESkn/xEpJ/8RKSf/ESkn/xEpJ/8RKSf/ESkn/xEpJ/8RKSf/ESkn/xEpJ/8RKSf/ESkn/xEpJ/8JKSf/BS0n/wUtJ/8FLSf/BS0n/wUtJ/8FLSf/BS0n/wUtJ/8FLSf/BS0n/wUtJ/8FLSf/BS0n/wUtJ/8FLSf/BS0n/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8dKSP/HSkj/yEtH/8dKRv/HSkj/x0pI/8lJSP/JSUr/x0lK/8ZISf/GSEn/xkhJ/8VJSf/FS0j/xUtI/8NMRv/DTEb/wk1G/8JPSP/DTkX/x0tB/8lJPv/JST7/w0o//7lORP+ZYTz/T20V/0d7Fv9tdSj/dmwu/2NeJv9vWSr/mVo7/7VYRv+/Tkb/xkpI/8ZKSP/GSkj/xklH/8ZJR//GSUf/xklH/8lJSP/JSUj/yUlI/8lJSP/JSUj/yUlI/8lJSP/JSUj/x0pI/8dKSP/HSkj/x0pI/8dKSP/HSkj/x0pI/8dKSP/HSkj/x0pI/8dKSP/HSkj/x0pI/8dKSP/HSkj/x0pI/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//HSkj/x0pI/8dKSP/HSkj/x0pI/8dKSP/HSkj/x0pI/8dKSP/HSkj/x0pI/8dKSP/HSkj/x0pI/8dKSP/HSkj/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8dKSP/HSkj/x0pI/8dKSP/HSkj/x0pI/8dKSP/HSkj/x0pI/8dKSP/HSkj/x0pI/8dKSP/HSkj/x0pI/8dKSP/FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/x0pI/8dKSP/HSkj/x0pI/8dKSP/HSkj/x0pI/8dKSP/HSkj/x0pI/8dKSP/HSkj/x0pI/8dKSP/HSkj/x0pI/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/xklH/8ZJR//GSUf/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEn/yEhJ/8hISf/ISEf/yEhJ/8hIR//ISEn/yEhH/8hISf/ISEf/yEhJ/8hIR//ISEn/yEhH/8hISf/ISEf/yUlK/8lJSP/HSkj/x0pG/8ZJR//HSkj/yUlI/8lJSv/HSUr/xkhJ/8ZISf/FSUn/xEpJ/8JLR//DTEj/wk1G/8JNRv/ATUb/xU9L/8NMRv/DSkH/xEo//8hJQP/ES0L/uU5G/5tgQP9TbBn/O3EP/1NqHP9iayr/Z2wy/39qO/+lXkD/tE08/8FMRf/FSUn/xEhI/8RISP/FR0j/xUdI/8VHSP/FR0j/x0dI/8dHSP/HR0j/x0dI/8dHSP/HR0j/x0dI/8dHSP/FR0j/xUhG/8VHSP/FSEb/xUdI/8VIRv/FR0j/xUhG/8VHSP/FSEb/xUdI/8VIRv/FR0j/xUhG/8VHSP/FSEb/xUdI/8VIRv/FR0j/xUhG/8VHSP/FSEb/xUdI/8VIRv/FR0j/xUhG/8VHSP/FSEb/xUdI/8VIRv/FR0j/xUhG/8VHSP/FSEb/xUdI/8VIRv/FR0j/xUhG/8VHSP/FSEb/xUdI/8VIRv/FR0j/xUhG/8VHSP/FSEb/xUdI/8VIRv/FR0j/xUhG/8VHSP/FSEb/xUdI/8VIRv/FR0j/xUhG/8VHSP/FSEb/xUdI/8VIRv/FR0j/xUhG/8VHSP/FSEb/xUdI/8VIRv/FR0j/xUhG/8VHSP/FSEb/xUdI/8VIRv/FR0j/xUhG/8VHSP/FSEb/xUdI/8VIRv/FR0j/xUhG/8VHSP/FSEb/xUdI/8VIRv/FR0j/xUhG/8VHSP/FSEb/xUdI/8VIRv/FR0j/xUhG/8VHSP/FSEb/xUdI/8VIRv/FR0j/xUhG/8VHSP/FSEb/xUdI/8VIRv/FR0j/xUhG/8VHSP/FSEb/xUdI/8VIRv/FR0j/xUhG/8VHSP/FSEb/xUdI/8VIRv/FR0j/xUhG/8VHSP/FSEb/xUdI/8VIRv/FR0j/xUhG/8VHSP/FSEb/xUdI/8VIRv/FR0j/xUhG/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/GSkr/xkpK/8ZKSv/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJSv/HSUz/x0lK/8dJTP/HSUr/x0lM/8dJSv/HSUz/x0lK/8dJTP/HSUr/x0lM/8dJSv/HSUz/x0lK/8hIR//ISEf/yEhJ/8hISf/JSUr/yUhM/8dJTP/GSEv/xkpM/8RJS//CSkv/wUtJ/79MSf++TUf/vk1H/79MR//CTEr/wEhH/79IQP/CTEL/x0xE/8JNRv+7T0z/nGBG/05mHP82bRL/Smoh/15sL/9sbDj/hmk//6pfQP+2Tz7/v0xH/8RJS//ESUv/w0hK/8RISv/ESEr/xUlL/8VJS//FSUv/xUlL/8ZIS//GSEv/xkhL/8ZIS//FSUv/xUlL/8VJS//FSUn/xUlL/8VJSf/FSUv/xUlJ/8VJS//FSUn/xUlL/8VJSf/FSUv/xUlJ/8VJS//FSUn/xUlL/8VJSf/GSkz/xkpK/8ZKTP/GSkr/xkpM/8ZKSv/GSkz/xkpK/8ZKTP/GSkr/xkpM/8ZKSv/GSkz/xkpK/8ZKTP/GSkr/xUlL/8VJSf/FSUv/xUlJ/8VJS//FSUn/xUlL/8VJSf/FSUv/xUlJ/8VJS//FSUn/xUlL/8VJSf/FSUv/xUlJ/8ZKTP/GSkr/xkpM/8ZKSv/GSkz/xkpK/8ZKTP/GSkr/xkpM/8ZKSv/GSkz/xkpK/8ZKTP/GSkr/xkpM/8ZKSv/FSUv/xUlJ/8VJS//FSUn/xUlL/8VJSf/FSUv/xUlJ/8VJS//FSUn/xUlL/8VJSf/FSUv/xUlJ/8VJS//FSUn/xkpM/8ZKSv/GSkz/xkpK/8ZKTP/GSkr/xkpM/8ZKSv/GSkz/xkpK/8ZKTP/GSkr/xkpM/8ZKSv/GSkz/xkpK/8VJS//FSUn/xUlL/8VJSf/FSUv/xUlJ/8VJS//FSUn/xUlL/8VJSf/FSUv/xUlJ/8VJS//FSUn/xUlL/8VJSf/GSkz/xkpK/8ZKTP/GSkr/xkpM/8ZKSv/GSkz/xkpK/8ZKTP/GSkr/xkpM/8ZKSv/GSkz/xkpK/8ZKTP/GSkr/xkpM/8ZKTP/GSkz/xkpM/8ZKTP/GSkz/xkpM/8ZKTP/GSkz/xkpM/8ZKTP/GSkz/xkpM/8ZKTP/GSkz/xkpM/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/GSEv/xkhL/8ZIS//GSEv/xUdI/8VHSP/GSEn/xkhJ/8dJTP/HSUz/xkhL/8ZIS//GSkz/xUtK/8FLS/+9TEj/uU5I/7VQRv+yUkb/s1FG/7pNSv+/SUf/wkhF/8ZLRP/FTkb/wU5H/7lQTP+cYEb/UWgk/0Z1Jf9ldTb/cmw4/2xbLf95Viz/mVo3/69ZQP+9UEn/xExN/8RMTv/DS0z/xktO/8ZLTf/GS07/xktN/8ZLTv/GS03/x0pO/8dLTf/HSk7/x0tN/8ZLTv/GS03/xktN/8ZLTf/HS03/xktN/8dLTf/GS03/x0tN/8ZLTf/HS03/xktN/8dLTf/GS03/x0tN/8ZLTf/HS03/xktN/8dLTf/GS03/x0tN/8ZLTf/HS03/xktN/8dLTf/GS03/x0tN/8ZLTf/HS03/xktN/8dLTf/GS03/x0tN/8ZLTf/HS03/xktN/8dLTf/GS03/x0tN/8ZLTf/HS03/xktN/8dLTf/GS03/x0tN/8ZLTf/HS03/xktN/8dLTf/GS03/x0tN/8ZLTf/HS03/xktN/8dLTf/GS03/x0tN/8ZLTf/HS03/xktN/8dLTf/GS03/x0tN/8ZLTf/HS03/xktN/8dLTf/GS03/x0tN/8ZLTf/HS03/xktN/8dLTf/GS03/x0tN/8ZLTf/HS03/xktN/8dLTf/GS03/x0tN/8ZLTf/HS03/xktN/8dLTf/GS03/x0tN/8ZLTf/HS03/xktN/8dLTf/GS03/x0tN/8ZLTf/HS03/xktN/8dLTf/GS03/x0tN/8ZLTf/HS03/xktN/8dLTf/GS03/x0tN/8ZLTf/HS03/xktN/8dLTf/GS03/x0tN/8ZLTf/HS03/xktN/8dLTf/GS03/x0tN/8ZLTf/HS03/xktN/8dLTf/GS03/x0tN/8ZLTf/HS03/xktN/8dLTf/GS03/x0tN/8ZLTf/FSEz/xUhM/8VITP/FSEz/xUhM/8VITP/FSEz/xUhM/8VITP/FSEz/xUhM/8VITP/FSEz/xUhM/8VITP/FSEz/yEpO/8pJTv/KSU7/yklO/8pJTv/KSU7/yklO/8pJTv/KSU7/yklO/8pJTv/KSU7/yklO/8pJTv/KSU7/yklO/8pJTf/KSU3/yklN/8pJTf/KSU3/yklN/8pJTf/KSU3/yklN/8pJTf/KSU3/yklN/8pJTf/KSU3/yklN/8pJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTf/HSU3/x0lN/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/HSUz/x0lM/8dJTP/GSEv/xUlL/8VKTP/FSkz/xUtK/8VJSf/HSUr/yUlK/8pKS//FSUf/wEpI/7hQR/+tVEb/n1Q//41PNv+LRzL/qU9E/7xMSP/KSkn/zUlH/8NMRv+8UEb/t1JG/5lgQ/9TZSn/UnEu/31pN/+OYTj/hVgv/4BVK/+DYTP/mmRA/7ZUR//ETEv/w0tM/8NLSv/DS0z/w0tK/8VKTP/FS0r/xUpM/8VLSv/GSkz/xkpK/8ZKTP/GSkr/xkpM/8ZKTP/FSUv/xUlL/8ZIS//FSUv/xkhL/8VJS//GSEv/xUlL/8ZIS//FSUv/xkhL/8VJS//GSEv/xUlL/8ZIS//FSUv/xkhM/8VITP/GSEz/xUhM/8ZITP/FSEz/xkhM/8VITP/GSEz/xUhM/8ZITP/FSEz/xkhM/8VITP/GSEz/xUhM/8ZITP/FSEz/xkhM/8VITP/GSEz/xUhM/8ZITP/FSEz/xkhM/8VITP/GSEz/xUhM/8ZITP/FSEz/xkhM/8VITP/GSEz/xUhM/8ZITP/FSEz/xkhM/8VITP/GSEz/xUhM/8ZITP/FSEz/xkhM/8VITP/GSEz/xUhM/8ZITP/FSEz/xkhM/8VITP/GSEz/xUhM/8ZITP/FSEz/xkhM/8VITP/GSEz/xUhM/8ZITP/FSEz/xkhM/8VITP/GSEz/xUhM/8ZITP/FSEz/xkhM/8VITP/GSEz/xUhM/8ZITP/FSEz/xkhM/8VITP/GSEz/xUhM/8ZITP/FSEz/xkhM/8VITP/GSEz/xUhM/8ZITP/FSEz/xkhM/8VITP/GSEz/xUhM/8ZITP/FSEz/xkhM/8VITP/GSEz/xUhM/8ZITP/FSEz/xkhM/8VITP/GSEz/xUhM/8ZITP/FSEz/xkhM/8VITP/GSEz/xUhM/8ZITP/FSEz/xkhM/8VITP/GSEz/xUhM/8dLTf/HS03/x0tN/8dLTf/HS03/x0tN/8dLTf/HS03/x0tN/8dLTf/HS03/x0tN/8dLTf/HS03/x0tN/8dLTf/ISk3/yEpN/8hKTf/ISk3/yEpN/8hKTf/ISk3/yEpN/8hKTf/ISk3/yEpN/8hKTf/ISk3/yEpN/8hKTf/ISk3/yEpL/8hKS//KSkv/yEpL/8pKS//ISkv/ykpL/8hKS//KSkv/yEpL/8pKS//ISkv/ykpL/8hKS//KSkv/yEpL/8hKTf/HS03/yEpN/8dLTf/ISk3/x0tN/8hKTf/HS03/yEpN/8dLTf/ISk3/x0tN/8hKTf/HS03/yEpN/8dLTf/ISk3/x0tN/8hKTf/HS03/yEpN/8dLTf/ISk3/x0tN/8hKTf/HS03/yEpN/8dLTf/ISk3/x0tN/8hKTf/HS03/yEpN/8dLTf/ISk3/x0tN/8hKTf/HS03/yEpN/8dLTf/ISk3/x0tN/8hKTf/HS03/yEpN/8dLTf/ISk3/x0tN/8hKTf/HS03/yEpN/8dLTf/ISk3/x0tN/8hKTf/HS03/yEpN/8dLTf/ISk3/x0tN/8hKTf/HS03/yEpN/8dLTf/ISk3/x0tN/8hKTf/HS03/yEpN/8dLTf/ISk3/x0tN/8hKTf/HS03/yEpN/8dLTf/ISk3/x0tN/8hKTf/HS03/yEpL/8dLS//ISkv/x0tL/8hKS//HS0v/yEpL/8dLS//ISkv/x0tL/8hKS//HS0v/yEpL/8dLS//HSUr/xkpK/8VJSf/ESkn/wkpJ/8NLSv/CSkn/w0lG/8VIRv/ISEf/ykhI/8ZJRf/CS0X/ulJH/65YR/+fXEL/j1o7/41RN/+pUUP/vE1G/81HSP/ORkb/xEpF/7xQRP+4UUL/nl0//1leKP9cZy3/kGA4/6lePv+iXDr/kFky/3xeLP+CVy3/sVRD/8JLR//CS0f/w0xI/8NMSP/DTEj/xUtI/8VLSP/ESkf/xEpH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJSf/FSUn/xkhJ/8VJSf/GSEn/xUlJ/8ZISf/FSUn/xkhJ/8VJSf/GSEn/xUlJ/8ZISf/FSUn/xkhJ/8ZISf/GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xkhL/8ZIS//GSEv/xEpH/8RKR//ESkf/xEpH/8RKR//ESkf/xEpH/8RKR//ESkf/xEpH/8RKR//ESkf/xEpH/8RKR//ESkf/xEpH/8JGRP/CRkT/wkZE/8JGRP/CRkT/wkZE/8JGRP/CRkT/wkZE/8JGRP/CRkT/wkZE/8JGRP/CRkT/wkZE/8JGRP/FSUf/xUlH/8ZJR//FSUf/xklH/8VJR//GSUf/xUlH/8ZJR//FSUf/xklH/8VJR//GSUf/xUlH/8ZJR//FSUf/xUpF/8RKRf/FSkX/xEpF/8VKRf/ESkX/xUpF/8RKRf/FSkX/xEpF/8VKRf/ESkX/xUpF/8RKRf/FSkX/xEpF/8VKRf/ESkX/xUpF/8RKRf/FSkX/xEpF/8VKRf/ESkX/xUpF/8RKRf/FSkX/xEpF/8VKRf/ESkX/xUpF/8RKRf/FSkX/xEpF/8VKRf/ESkX/xUpF/8RKRf/FSkX/xEpF/8VKRf/ESkX/xUpF/8RKRf/FSkX/xEpF/8VKRf/ESkX/xUpF/8RKRf/FSkX/xEpF/8VKRf/ESkX/xUpF/8RKRf/FSkX/xEpF/8VKRf/ESkX/xUpF/8RKRf/FSkX/xEpF/8VKRf/ESkX/xUpF/8RKRf/FSkX/xEpF/8VKRf/ESkX/xUpF/8RKRf/FSkX/xEpF/8VKRf/ESkX/xUpF/8RKRf/FSUf/xEpH/8VJR//ESkf/xUlH/8RKR//FSUf/xEpH/8VJR//ESkf/xUlH/8RKR//FSUf/w0lG/8RIRv/DSUb/xUtI/8VLSP/CS0f/wk1G/8FMRf/BSkT/xUhE/8lIQ//KRkL/x0ZB/8NIQf+/T0P/t1ZF/6xaRP+dWj//nlQ7/7RQQf/ESkX/zkZG/9BGRP/FSkP/wE5D/8BOQ/+oWD//bl0v/21jMP+bWzj/t1xB/7ddQv+lWzj/iVgt/4NLJv+zUkH/wEtE/8FMRf/BTEX/wk1G/8JNRv/CS0X/wktF/8JLRf/CS0X/xEpF/8RKRf/ESkX/xEpF/8RKRf/ESkX/w0lG/8NJRv/ESEb/w0lG/8RIRv/DSUb/xEhG/8NJRv/ESEb/w0lG/8RIRv/DSUb/xEhG/8NJRv/ESEb/xEhG/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FSUf/xUlH/8VJR//FS0b/xUtG/8VLRv/FS0b/xUtG/8VLRv/FS0b/xUtG/8VLRv/FS0b/xUtG/8VLRv/FS0b/xUtG/8VLRv/FS0b/xUtG/8NMRv/FS0b/w0xG/8VLRv/DTEb/xUtG/8NMRv/FS0b/w0xG/8VLRv/DTEb/xUtG/8NMRv/FS0b/xUtG/8RKRf/ESkX/xEpH/8RKRf/ESkf/xEpF/8RKR//ESkX/xEpH/8RKRf/ESkf/xEpF/8RKR//ESkX/xEpH/8RKRf/FS0b/xUxE/8VLRv/FTET/xUtG/8VMRP/FS0b/xUxE/8VLRv/FTET/xUtG/8VMRP/FS0b/xUxE/8VLRv/FTET/xUtG/8VMRP/FS0b/xUxE/8VLRv/FTET/xUtG/8VMRP/FS0b/xUxE/8VLRv/FTET/xUtG/8VMRP/FS0b/xUxE/8VLRv/FTET/xUtG/8VMRP/FS0b/xUxE/8VLRv/FTET/xUtG/8VMRP/FS0b/xUxE/8VLRv/FTET/xUtG/8VMRP/FS0b/xUxE/8VLRv/FTET/xUtG/8VMRP/FS0b/xUxE/8VLRv/FTET/xUtG/8VMRP/FS0b/xUxE/8VLRv/FTET/xUtG/8VMRP/FS0b/xUxE/8VLRv/FTET/xUtG/8VMRP/FS0b/xUxE/8VLRv/FTET/xUtG/8VMRP/FS0b/xUtG/8VLRv/FS0b/xUtG/8VLRv/FS0b/xUtG/8VLRv/FS0b/xUtG/8VLRv/FS0b/xUtG/8VLRv/FS0b/xEpF/8RKRf/FS0b/wktF/8FMRf/CTUb/wk1G/8JLQ//HSkT/yklE/81JRf/LR0L/yElC/8ZNRP/AVEf/uVhF/69aRf+vV0P/vU5D/8dKRP/NR0b/zUdE/8dKRP/FTEP/xUxD/7FVQP+MZT7/iWQ6/6lVO/++UT3/wVI//7dVPP+fWTf/nFI1/7dRQv/BTEP/wUxF/8JNRP/CTUb/wk1E/8NMRv/DTET/w0xG/8NMRP/FS0b/xUxE/8VLRv/ES0P/xEpF/8RKRf/ESkX/xEpF/8RKRf/ESkX/xEpF/8RKRf/ESkX/xEpF/8RKRf/ESkX/xEpF/8RKRf/ESkX/xEpF/8RKRf/ESkX/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8ZLRv/GS0b/xktG/8RNSf/ETUn/xE1J/8RNSf/ETUn/xE1J/8RNSf/ETUn/xE1J/8RNSf/ETUn/xE1J/8RNSf/ETUn/xE1J/8RNSf/DTEj/wkxI/8NMSP/CTEj/w0xI/8JMSP/DTEj/wkxI/8NMSP/CTEj/w0xI/8JMSP/DTEj/wkxI/8NMSP/DTEj/wUpG/8FKRv/BSUj/wUpG/8FJSP/BSkb/wUlI/8FKRv/BSUj/wUpG/8FJSP/BSkb/wUlI/8FKRv/BSUj/wUpG/8NMSP/DTEb/w0xI/8NMRv/DTEj/w0xG/8NMSP/DTEb/w0xI/8NMRv/DTEj/w0xG/8NMSP/DTEb/w0xI/8NMRv/DTEj/w0xG/8NMSP/DTEb/w0xI/8NMRv/DTEj/w0xG/8NMSP/DTEb/w0xI/8NMRv/DTEj/w0xG/8NMSP/DTEb/w0xI/8NMRv/DTEj/w0xG/8NMSP/DTEb/w0xI/8NMRv/DTEj/w0xG/8NMSP/DTEb/w0xI/8NMRv/DTEj/w0xG/8NMSP/DTEb/w0xI/8NMRv/DTEj/w0xG/8NMSP/DTEb/w0xI/8NMRv/DTEj/w0xG/8NMSP/DTEb/w0xI/8NMRv/DTEj/w0xG/8NMSP/DTEb/w0xI/8NMRv/DTEj/w0xG/8NMSP/DTEb/w0xI/8NMRv/DTEj/w0xG/8NMSP/DTEj/w0xI/8NMSP/DTEj/w0xI/8NMSP/DTEj/w0xI/8NMSP/DTEj/w0xI/8NMSP/DTEj/w0xI/8NMSP/DTEj/w0xI/8RKR//BSkb/wEpG/79MR/+/TEf/wk1G/8ZLRv/KSkf/z0lI/81HRP/MRkP/yklE/8dORv/CUkb/u1NG/7xSRf/DTEb/x0pG/8ZKSP/GS0b/x0pG/8dKRP/GS0T/uFBD/6dhSP+hXkP/t1BB/8RIPv/KQz3/yElA/7lWQ/+1WEb/vVFH/8BNRv/CTEj/wUxF/8FLR//BTEX/wkxI/8JNRv/DTEj/w0xG/8NMSP/DTEb/w0xI/8NMRv/DTEj/w0xI/8NMSP/DTEj/w0xI/8NMSP/DTEj/w0xI/8NMSP/DTEj/w0xI/8NMSP/DTEj/w0xI/8NMSP/DTEj/w0xI/8NMSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/xUtI/8VLSP/FS0j/wUtL/8FLS//BS0v/wUtL/8FLS//BS0v/wUtL/8FLS//BS0v/wUtL/8FLS//BS0v/wUtL/8FLS//BS0v/wUtL/8BMTP/ATEz/wExM/8BMTP/ATEz/wExM/8BMTP/ATEz/wExM/8BMTP/ATEz/wExM/8BMTP/ATEz/wExM/8BMTP+/S0z/v0tM/79LTP+/S0z/v0tM/79LTP+/S0z/v0tM/79LTP+/S0z/v0tM/79LTP+/S0z/v0tM/79LTP+/S0z/wktN/8JMTP/CS03/wkxM/8JLTf/CTEz/wktN/8JMTP/CS03/wkxM/8JLTf/CTEz/wktN/8JMTP/CS03/wkxM/8JLTf/CTEz/wktN/8JMTP/CS03/wkxM/8JLTf/CTEz/wktN/8JMTP/CS03/wkxM/8JLTf/CTEz/wktN/8JMTP/CS03/wkxM/8JLTf/CTEz/wktN/8JMTP/CS03/wkxM/8JLTf/CTEz/wktN/8JMTP/CS03/wkxM/8JLTf/CTEz/wktN/8JMTP/CS03/wkxM/8JLTf/CTEz/wktN/8JMTP/CS03/wkxM/8JLTf/CTEz/wktN/8JMTP/CS03/wkxM/8JLTf/CTEz/wktN/8JMTP/CS03/wkxM/8JLTf/CTEz/wktN/8JMTP/CS03/wkxM/8JLTf/CTEz/wktN/8JMTP/CS03/wkxM/8JLTf/CTEz/wktN/8JMTP/CS03/wkxM/8FKTP/BS0v/wUpM/8JMTP/CS03/wkxM/8JLTf/BS0v/wkpL/8BKSP++Skr/vk1J/79OSv/ATUr/xExL/8hMSv/LSUv/y0ZH/8pERf/JRUP/xUhG/8NJRP+/TEf/v0xH/8ZKSv/FS0r/v05K/79OSv/FS0r/xkpI/8RKSf+7Tkf/r1ZI/65VR/+/Tkj/y0ZH/9E/Qv/PQ0T/wk9I/71VTP+/T03/v01M/8BMTf+/S0v/v0tM/79LS/+/S0z/wExM/8JLTf/CTEz/wktN/8JMTP/CS03/wkxM/8JLTf/CTEz/wkxM/8JMTP/CTEz/wkxM/8JMTP/CTEz/wkxM/8JMTP/CTEz/wkxM/8JMTP/CTEz/wkxM/8JMTP/CTEz/wkxM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP/DS0z/w0tM/8NLTP+/TVX/v01V/79NVf+/TVX/v01V/79NVf+/TVX/v01V/79NVf+/TVX/v01V/79NVf+/TVX/v01V/79NVf+/TVX/vUtT/71LU/+9S1P/vUtT/71LU/+9S1P/vUtT/71LU/+9S1P/vUtT/71LU/+9S1P/vUtT/71LU/+9S1P/vUtT/75PWP++T1j/vk9Y/75PWP++T1j/vk9Y/75PWP++T1j/vk9Y/75PWP++T1j/vk9Y/75PWP++T1j/vk9Y/75PWP+/TVf/v01V/79NV/+/TVX/v01X/79NVf+/TVf/v01V/79NV/+/TVX/v01X/79NVf+/TVf/v01V/79NV/+/TVX/v01X/79NVf+/TVf/v01V/79NV/+/TVX/v01X/79NVf+/TVf/v01V/79NV/+/TVX/v01X/79NVf+/TVf/v01V/79NV/+/TVX/v01X/79NVf+/TVf/v01V/79NV/+/TVX/v01X/79NVf+/TVf/v01V/79NV/+/TVX/v01X/79NVf+/TVf/v01V/79NV/+/TVX/v01X/79NVf+/TVf/v01V/79NV/+/TVX/v01X/79NVf+/TVf/v01V/79NV/+/TVX/v01X/79NVf+/TVf/v01V/79NV/+/TVX/v01X/79NVf+/TVf/v01V/79NV/+/TVX/v01X/79NVf+/TVf/v01V/79NV/+/TVX/v01X/79NVf+/TVf/v01V/79NV/+/TVX/v01X/79NVf+/TVf/v01V/79NV/+/TVX/v01X/8BMVf/AS1H/vktO/7xLT/+7TU7/uk5O/7tPT/++TU//wU1O/8dMUf/HSU3/yUhN/8hHS//GSEz/xUlL/8JKTP/DS03/w0tN/79MT/+3UU//t1FP/79MT//BSkz/vktO/7tNTP+yT0r/tU9L/79NTf/KSU7/00FM/9FETf/ETE7/vE5P/71OVP+8TVT/vE1W/7tMU/+7TFX/u0xT/75MVv++TFT/vkxW/75MVP++TFb/vkxU/75MVv++TFT/vkxW/75MVP+9S1P/vUtT/71LU/+9S1P/vUtT/71LU/+9S1P/vUtT/71LU/+9S1P/vUtT/71LU/+9S1P/vUtT/71LU/+9S1P/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/79LVP+/S1T/v0tU/6tUXf+qVF3/q1Rd/6pUXf+rVF3/qlRd/6tUXf+qVF3/q1Rd/6pUXf+rVF3/qlRd/6tUXf+qVF3/q1Rd/6tUXf+rVF3/q1Rd/6tUXf+rVF3/q1Rd/6tUXf+rVF3/q1Rd/6tUXf+rVF3/q1Rd/6tUXf+rVF3/q1Rd/6tUXf+qVF3/qFJb/6hSW/+oUlv/qFJb/6hSW/+oUlv/qFJb/6hSW/+oUlv/qFJb/6hSW/+oUlv/qFJb/6hSW/+oUlv/qFJb/6pUXf+qVF3/q1Nf/6pUXf+rU1//qlRd/6tTX/+qVF3/q1Nf/6pUXf+rU1//qlRd/6tTX/+qVF3/q1Nf/6pUXf+rU1//qlRd/6tTX/+qVF3/q1Nf/6pUXf+rU1//qlRd/6tTX/+qVF3/q1Nf/6pUXf+rU1//qlRd/6tTX/+qVF3/q1Nf/6pUXf+rU1//qlRd/6tTX/+qVF3/q1Nf/6pUXf+rU1//qlRd/6tTX/+qVF3/q1Nf/6pUXf+rU1//qlRd/6tTX/+qVF3/q1Nf/6pUXf+rU1//qlRd/6tTX/+qVF3/q1Nf/6pUXf+rU1//qlRd/6tTX/+qVF3/q1Nf/6pUXf+rU1//qlRd/6tTX/+qVF3/q1Nf/6pUXf+rU1//qlRd/6tTX/+qVF3/q1Nf/6pUXf+rU1//qlRd/6tTX/+qVF3/q1Rd/6pUXf+rVF3/qlRd/6tUXf+qVF3/q1Rd/6pUXf+rVF3/qlRd/6tUXf+qVF3/q1Rd/6pUXf+qU1z/qlNc/61TXP+sU1n/qFNY/6ZUWP+lVVb/pVVW/6ZUVv+qVFf/r1NY/7FQV/+0T1f/tE9V/7NOVP+yT1T/sk9U/7FRVf+vU1j/q1VY/6NZWP+kWln/q1ZZ/61UWP+sU1f/qlVY/6lXWf+nVVf/rFNX/7JRWP+8TFj/vE5Z/7NUWv+qU1n/qlRd/6pUXf+qVF3/qlRd/6pUXf+qVF3/qlRd/6tVXv+rVF3/qlRd/6tUXf+qVF3/q1Rd/6pUXf+rVF3/qlRd/6tUXf+qVVz/q1Rd/6pVXP+rVF3/qlVc/6tUXf+qVVz/q1Rd/6pVXP+rVF3/qlVc/6tUXf+qVVz/q1Rd/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/q1Rc/6tUXP+rVFz/IAAA/x8AAP8gAAD/HwAA/yAAAP8fAAD/IAAA/x8AAP8gAAD/HwAA/yAAAP8fAAD/IAAA/x8AAP8gAAD/IAAA/x8AAP8fAAD/HwAA/x8AAP8fAAD/HwAA/x8AAP8fAAD/HwAA/x8AAP8fAAD/HwAA/x8AAP8fAAD/HwAA/x8AAP8gAAD/HwAA/x8AAP8fAAD/HwAA/x8AAP8fAAD/HwAA/x8AAP8fAAD/HwAA/x8AAP8fAAD/HwAA/x8AAP8fAAD/HgAA/x4AAP8fAAD/HgAA/x8AAP8eAAD/HwAA/x4AAP8fAAD/HgAA/x8AAP8eAAD/HwAA/x4AAP8fAAD/HgAA/x8AAP8eAAD/HwAA/x4AAP8fAAD/HgAA/x8AAP8eAAD/HwAA/x4AAP8fAAD/HgAA/x8AAP8eAAD/HwAA/x4AAP8fAAD/HgAA/x8AAP8eAAD/HwAA/x4AAP8fAAD/HgAA/x8AAP8eAAD/HwAA/x4AAP8fAAD/HgAA/x8AAP8eAAD/HwAA/x4AAP8fAAD/HgAA/x8AAP8eAAD/HwAA/x4AAP8fAAD/HgAA/x8AAP8eAAD/HwAA/x4AAP8fAAD/HgAA/x8AAP8eAAD/HwAA/x4AAP8fAAD/HgAA/x8AAP8eAAD/HwAA/x4AAP8fAAD/HgAA/x8AAP8eAAD/HwAA/x4AAP8fAAD/HgAA/x8AAP8eAAD/HwAA/x4AAP8fAAD/HgAA/x8AAP8eAAD/HwAA/x4AAP8fAAD/HgAA/x8AAP8fAAD/IgAA/yIAAP8gAAD/HwAA/xsAAP8aAAD/GwAA/x4AAP8iAAD/JAAA/ycAAP8oAAD/JwAA/ycAAP8oAAD/KAAA/yQAAP8hAAD/GwAA/xoAAP8dAAD/IQAA/yIAAP8hAAD/HQAA/xwAAP8dAAD/IgAA/yYAAP8mAAD/IQAA/x8AAP8fAAD/HwAA/x8AAP8fAAD/HwAA/x8AAP8fAAD/HwAA/yAAAP8fAAD/IAAA/x8AAP8gAAD/HwAA/yAAAP8fAAD/IAAA/x8AAP8gAAD/HwAA/yAAAP8fAAD/IAAA/x8AAP8gAAD/HwAA/yAAAP8fAAD/IAAA/x8AAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8gAAD/IAAA/yAAAP8JAAH/CQAB/wkAAf8JAAH/CQAB/wkAAf8JAAH/CQAB/wkAAf8JAAH/CQAB/wkAAf8JAAH/CQAB/wkAAf8JAAH/CgAB/woAAf8KAAH/CgAB/woAAf8KAAH/CgAB/woAAf8KAAH/CgAB/woAAf8KAAH/CgAB/woAAf8KAAH/CgAA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAAH/CQAB/wkAAf8JAAH/CQAB/wkAAf8JAAH/CQAB/wkAAf8JAAH/CQAB/wkAAf8JAAH/CQAB/wkAAf8JAAH/CQAB/wkAAf8JAAH/CQAB/wkAAf8JAAH/CQAB/wkAAf8JAAH/CQAB/wkAAf8JAAH/CQAB/wkAAf8JAAH/CQAB/wkAAf8JAAH/CQAB/wkAAf8JAAH/CQAB/wkAAf8JAAH/CQAB/wkAAf8JAAH/CQAB/wkAAf8JAAH/CQAB/wkAAf8JAAH/CQAB/wkAAf8JAAH/CQAB/wkAAf8JAAH/CQAB/wkAAf8JAAH/CQAB/wkAAf8JAAH/CQAB/wkAAf8JAAH/CQAB/wkAAf8JAAH/CQAB/wkAAf8JAAH/CQAB/wkAAf8JAAH/CQAB/wkAAf8JAAH/CQAB/wkAAf8JAAH/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8LAQL/CwAE/woBBP8IAgT/BgID/wMBAv8FAQL/BQEC/wcBA/8LAAT/DgIE/xABBP8PAAP/DwAC/w8AAv8PAAP/DgAC/wsAAf8JAAH/BgAA/wgAAP8KAAH/DQAB/wsAAf8HAQP/BAID/wQCA/8EAgP/BwED/wcBA/8JAAP/CgEC/wgAAP8IAAD/CAAA/wgAAP8IAAD/CAAA/wgAAP8IAAD/CAAA/wgAAP8IAAD/CAAA/wgAAP8IAAD/CAAA/wgAAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wkBAP8JAQD/CQEA/wQAAf8EAAH/BAAB/wQAAf8EAAH/BAAB/wQAAf8EAAH/BAAB/wQAAf8EAAH/BAAB/wQAAf8EAAH/BAAB/wQAAf8FAAH/BQAB/wUAAf8FAAH/BQAB/wUAAf8FAAH/BQAB/wUAAf8FAAH/BQAB/wUAAf8FAAH/BQAB/wUAAf8FAAH/BQEC/wUBAP8FAQD/BQEA/wUBAP8FAQD/BQEA/wUBAP8FAQD/BQEA/wUBAP8FAQD/BQEA/wUBAP8FAQD/BQEA/wUBAv8FAQL/BQEC/wUBAv8FAQL/BQEC/wUBAv8FAQL/BQEC/wUBAv8FAQL/BQEC/wUBAv8FAQL/BQEC/wUBAv8FAQL/BQEC/wUBAv8FAQL/BQEC/wUBAv8FAQL/BQEC/wUBAv8FAQL/BQEC/wUBAv8FAQL/BQEC/wUBAv8FAQL/BQEC/wUBAv8FAQL/BQEC/wUBAv8FAQL/BQEC/wUBAv8FAQL/BQEC/wUBAv8FAQL/BQEC/wUBAv8FAQL/BQEC/wUBAv8FAQL/BQEC/wUBAv8FAQL/BQEC/wUBAv8FAQL/BQEC/wUBAv8FAQL/BQEC/wUBAv8FAQL/BQEC/wUBAv8FAQL/BQEC/wUBAv8FAQL/BQEC/wUBAv8FAQL/BQEC/wUBAv8FAQL/BQEC/wUBAv8FAQL/BQEC/wUBAv8FAQL/BQEC/wUBAP8FAQD/BQEA/wUBAP8FAQD/BQEA/wUBAP8FAQD/BQEA/wUBAP8FAQD/BQEA/wUBAP8FAQD/BQEA/wYAAP8GAAD/BQEA/wMCAP8BAQD/AAIA/wACAP8AAgD/AAAA/wIBAP8GAgH/BgIB/wUBAP8FAAD/BQAA/wUAAP8GAQD/BQAA/wUAAP8FAAD/BQAA/wUAAP8HAAD/BQAA/wUBAP8CAgD/AAQA/wADAP8ABAD/AAQA/wQDAf8HAQH/AwAA/wMAAP8DAAD/AwAA/wMAAP8DAAD/AwAA/wMAAP8DAAD/AwAA/wMAAP8DAAD/AwAA/wMAAP8DAAD/AwAA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AgEA/wIBAP8CAQD/AwEE/wMBBP8DAQT/AwEE/wMBBP8DAQT/AwEE/wMBBP8DAQT/AwEE/wMBBP8DAQT/AwEE/wMBBP8DAQT/AwEE/wUABP8FAAT/BQAE/wUABP8FAAT/BQAE/wUABP8FAAT/BQAE/wUABP8FAAT/BQAE/wUABP8FAAT/BQAE/wUABP8DAQL/AwEC/wMBAv8DAQL/AwEC/wMBAv8DAQL/AwEC/wMBAv8DAQL/AwEC/wMBAv8DAQL/AwEC/wMBAv8DAQL/AwEE/wMBBP8DAQT/AwEE/wMBBP8DAQT/AwEE/wMBBP8DAQT/AwEE/wMBBP8DAQT/AwEE/wMBBP8DAQT/AwEE/wMBBP8DAQT/AwEE/wMBBP8DAQT/AwEE/wMBBP8DAQT/AwEE/wMBBP8DAQT/AwEE/wMBBP8DAQT/AwEE/wMBBP8DAQT/AwEE/wMBBP8DAQT/AwEE/wMBBP8DAQT/AwEE/wMBBP8DAQT/AwEE/wMBBP8DAQT/AwEE/wMBBP8DAQT/AwEE/wMBBP8DAQT/AwEE/wMBBP8DAQT/AwEE/wMBBP8DAQT/AwEE/wMBBP8DAQT/AwEE/wMBBP8DAQT/AwEE/wMBBP8DAQT/AwEE/wMBBP8DAQT/AwEE/wMBBP8DAQT/AwEE/wMBBP8DAQT/AwEE/wMBBP8DAQT/AwEE/wMBBP8DAQL/AwEC/wMBAv8DAQL/AwEC/wMBAv8DAQL/AwEC/wMBAv8DAQL/AwEC/wMBAv8DAQL/AwEC/wMBAv8DAQL/AwIA/wMCAP8CAgD/AQEA/wACAP8AAwD/AAIA/wADAP8AAgD/AAEA/wACAP8CAgD/AQEA/wEBAP8BAQD/AgEA/wIBAP8CAQD/BAAA/wQAAP8EAAD/BAAA/wQAAP8EAAD/BAMB/wMDAf8ABAD/AAYA/wAGAP8ABQH/BAMB/wYCAf8DAQL/AwEC/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wMBAv8DAQL/AwEC/wIAAf8CAAH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8CAAP/AgAD/wIAA/8CAAP/AgAD/wIAA/8CAAP/AgAD/wIAA/8CAAP/AgAD/wIAA/8CAAP/AgAD/wIAA/8CAAP/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AgAB/wIAAf8BAAD/AQAA/wEAAP8BAAD/AgAB/wIAAf8AAAD/AQEA/wEBAP8AAAD/AAAA/wABAP8AAAD/AAEA/wABAP8AAQD/AAIA/wEDAP8BAwD/AQMA/wEDAP8CAgD/AQEA/wEBAP8CAQD/AgEA/wQAAP8EAAD/AQEA/wEBAP8GAgP/BAID/wAEA/8ABgP/AAQD/wICAv8FAQL/BgAC/wQAAf8CAAH/AgAB/wIAAf8BAAD/AQAA/wEAAP8BAAD/AgAB/wIAAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wIAA/8CAAP/AgAD/wIAA/8CAAP/AgAD/wIAA/8CAAP/AgAD/wIAA/8CAAP/AgAD/wIAA/8CAAP/AgAD/wIAA/8EAgX/AwMF/wQCBf8DAwX/BAIF/wMDBf8EAgX/AwMF/wQCBf8DAwX/BAIF/wMDBf8EAgX/AwMF/wQCBf8EAgX/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAC/wEAAv8BAAL/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AAAA/wACAf8BAwD/AQMA/wAAAP8AAAD/AQEA/wEBAP8BAQD/AAAA/wABAP8AAgD/AAIA/wEDAP8BAwD/AQMA/wEDAP8AAgH/AQEB/wEBAf8CAAH/BAAB/wIBAP8BAQH/AQEB/wYCA/8EAgP/AQUE/wAGBP8CBAP/AwMD/wUBAv8FAQL/AgAB/wIAAf8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wAAAP8AAQD/AAAA/wABAP8AAAD/AAEA/wAAAP8AAQD/AAAA/wABAP8AAAD/AAEA/wAAAP8AAQD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AQED/wEBA/8BAQH/AAMC/wAEA/8CBAP/AQEB/wAAAP8DAQL/AwEC/wIAAf8BAAD/AAAA/wAAAP8BAQH/AAIB/wACAf8AAgH/AAIB/wICBP8DAQT/AwEE/wMBBP8DAQT/AwEC/wICBP8BAQP/AwMF/wMDBf8CAwX/AAQF/wIDBf8CAwX/AgIE/wICBP8CAAH/AgAB/wIAAf8CAAH/AAAA/wAAAP8AAAD/AAAA/wAAAP8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8BAQH/AAAA/wABAP8AAQD/AAEA/wABAP8AAQD/AAEA/wABAP8AAQD/AAEA/wABAP8AAQD/AAEA/wABAP8AAQD/AAEA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AQED/wABA/8AAgH/AAMC/wEDAv8AAAD/AAAA/wIAAf8CAAH/AQAA/wEAAP8BAAD/AAAA/wEBAf8AAgH/AAIB/wABAP8AAAD/AgAD/wMBBP8DAQb/AwEE/wMBBP8DAQT/AQED/wEBA/8BAQP/AAED/wEBA/8AAQP/AQED/wABA/8BAQP/AQED/wEBAf8CAAH/AgAB/wIAAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAv8AAAL/AAAC/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wACAf8AAgH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wAAAP8CAAH/AgAB/wIAA/8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8BAQH/AgAB/wEBAf8CAAH/AQEB/wIAAf8BAQH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/AQEB/wAAAP8AAAD/AAAA/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8CAAH/AgAB/wIAAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/" diff --git a/sys.py/UI/createby_screen.py b/sys.py/UI/createby_screen.py new file mode 100644 index 0000000..194d695 --- /dev/null +++ b/sys.py/UI/createby_screen.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +import pygame +import base64 +## local package import +from full_screen import FullScreen +from skin_manager import MySkinManager +from createby_clockworkpi import createby_clockworkpi_b64 + +from constants import Width,Height + +class CreateByScreen(FullScreen): + + _BG = None + _BGColor = MySkinManager.GiveColor('Black') + + def Init(self): + self._BG = pygame.image.frombuffer(base64.b64decode(createby_clockworkpi_b64 ),(Width,Height),"RGBA") + self._CanvasHWND = pygame.Surface((self._Width,self._Height)) + + + def Draw(self): + self._CanvasHWND.fill( self._BGColor ) + + self._CanvasHWND.blit(self._BG,(0,0,Width,Height)) diff --git a/sys.py/UI/delete_confirm_page.py b/sys.py/UI/delete_confirm_page.py new file mode 100644 index 0000000..177977a --- /dev/null +++ b/sys.py/UI/delete_confirm_page.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- + +import pygame +import os +import shutil + + +#UI lib +from constants import Width,Height,ICON_TYPES +from page import Page,PageSelector +from label import Label +from util_funcs import midRect +from keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB +from confirm_page import ConfirmPage +from lang_manager import MyLangManager + +class DeleteConfirmPage(ConfirmPage): + + _FileName = "" + _TrashDir = "" + _ConfirmText = MyLangManager.Tr("ConfirmDeleteQ") + + def SetTrashDir(self,d): + self._TrashDir = d + + if os.path.isdir(self._TrashDir) == False: + raise IOError("Trash not existed") + + def SetFileName(self,fn): + self._FileName = fn + + def KeyDown(self,event): + + if IsKeyMenuOrB(event.key): + + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + + if IsKeyStartOrA(event.key): + try: + os.remove(self._TrashDir+"/"+os.path.basename(self._FileName)) + except: + pass + + try: + shutil.move(self._FileName, self._TrashDir) + except shutil.Error as e: + if "already exists" in str(e): + self._Screen._MsgBox.SetText("AlreadyExisted") + else: + self._Screen._MsgBox.SetText("Error") + + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + else: + self.SnapMsg(MyLangManager.Tr("Deleting")) + self._Screen.Draw() + self._Screen.SwapAndShow() + self.Reset() + + pygame.time.delay(300) + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + print(self._FileName) + + diff --git a/sys.py/UI/download.py b/sys.py/UI/download.py new file mode 100644 index 0000000..014373f --- /dev/null +++ b/sys.py/UI/download.py @@ -0,0 +1,219 @@ +import os +import pycurl +import sys +import time +import urllib2 +import hashlib + +from threading import Thread +from StringIO import StringIO + +class Download(Thread): + _dst_path = "" + _is_finished = False + _is_successful = False + _errors = [] + _HashFunc = None + _HashValue = "" + + def __init__(self, url, path, cookies=False, useragent=False): + super(Download, self).__init__() + self.url = url + self.path = path + self.useragent = useragent + self.cookies = cookies + self.downloaded = 0 + + self.progress = { 'downloaded': 0, 'total': 0, 'percent': 0,'stopped':False } + self._stop = False + self.filename = "" + + def isFinished(self): + return self._is_finished + + def isSuccessful(self): + return self._is_successful + + def get_dest(self): + return self._dst_path + + def get_errors(self): + return self._errors + + def run(self): + c = pycurl.Curl() + c.setopt(pycurl.URL, self.url) + c.setopt(pycurl.FOLLOWLOCATION, True) + c.setopt(pycurl.MAXREDIRS, 4) + #c.setopt(pycurl.NOBODY, 1) + + c.setopt(c.VERBOSE, True) + + #c.setopt(pycurl.CONNECTTIMEOUT, 20) + + if self.useragent: + c.setopt(pycurl.USERAGENT, self.useragent) + + # add cookies, if available + if self.cookies: + c.setopt(pycurl.COOKIE, self.cookies) + + #realurl = c.getinfo(pycurl.EFFECTIVE_URL) + realurl = self.url + print("realurl",realurl) + self.filename = realurl.split("/")[-1].strip() + c.setopt(pycurl.URL, realurl) + c.setopt(pycurl.FOLLOWLOCATION, True) + c.setopt(pycurl.NOPROGRESS, False) + c.setopt(pycurl.XFERINFOFUNCTION, self.getProgress) + + c.setopt(pycurl.SSL_VERIFYPEER, False) + c.setopt(pycurl.SSL_VERIFYHOST, False) + + # configure pycurl output file + if self.path == False: + self.path = os.getcwd() + filepath = os.path.join(self.path, self.filename) + + + if os.path.exists(filepath):## remove old file,restart download + os.system("rm -rf " + filepath) + + buffer = StringIO() + c.setopt(pycurl.WRITEDATA, buffer) + + self._dst_path = filepath + + # add cookies, if available + if self.cookies: + c.setopt(pycurl.COOKIE, self.cookies) + + self._stop = False + self.progress["stopped"] = False + # download file + try: + c.perform() + except pycurl.error, error: + errno,errstr = error + print("curl error: %s" % errstr) + self._errors.append(errstr) + self._stop = True + self.progress["stopped"] = True + self.stop() + finally: + + code = c.getinfo( c.RESPONSE_CODE ) + c.close() + self._is_finished = True + + with open(filepath, mode='w') as f: + f.write(buffer.getvalue()) + + if self.progress["percent"] < 100: + self._is_successful = False + else: + if self._HashFunc != None: + hashed = self.hashlib_hash(self._HashFunc, self._dst_path) + if hashed == self._HashValue: + self._is_successful= True + else: + self._is_successful = False + self._errors.append("hash failed") + else: + if code != 200: + self._is_successful = False + os.system("rm -rf " + self._dst_path) ## clear garbage file + self._errors.append("response error %d " % code) + else: + self._is_successful = True ## 100% downloaded without hash check + + def getProgress(self,download_t, download_d, upload_t, upload_d): + if download_t and download_d: + self.progress['downloaded'] = download_d + self.downloaded + self.progress['total'] = download_t + self.downloaded + self.progress['percent'] = ( float(self.progress['downloaded']) / float(self.progress['total'])) * 100.0 + self.progress["stopped"] = False + if self._stop: + self.progress["stopped"] = True + return 1 + + def hashlib_hash(method,fname): #eg: method == hashlib.md5(),function pointer + hash_ = method + with open(fname, "rb") as f: + for chunk in iter(lambda: f.read(4096), b""): + hash_.update(chunk) + + return hash_.hexdigest() + + def add_hash_verification(self,method_name,method_value): + if method_name == "md5": + self._HashFunc = hashlib.md5() + else: + self._HashFunc = None + + self._HashValue = method_value + + def get_progress(self): + return self.progress["percent"] + + def stop(self): + self._stop = True + + def cancel(self): + # sets the boolean to stop the thread. + self._stop = True + +def main(): + from optparse import OptionParser + + parser = OptionParser(usage="%prog [options] ") + parser.add_option( "-p", "--path", default=False, dest="path", help="download file to PATH", metavar="PATH") + parser.add_option( "-c", "--cookies", default=False, dest="cookies", help="specify cookie(s)", metavar="COOKIES") + opts, args = parser.parse_args() + + if len(args) == 0: + parser.error("No url supplied") + + for url in args: + print("Downloading: %s" % url) + if opts.path: + print("to: %s" % opts.path) + else: + print("to current directory") + d = Download(url, opts.path, opts.cookies) + d.start() + + last_downloaded = 0 + sleep_time = 0.05 + while 1: + try: + progress = d.progress['percent'] + + download_dx = d.progress["downloaded"] - last_downloaded + + speed = float(download_dx) / ( sleep_time * 1000.0) + + last_downloaded = d.progress["downloaded"] + + if d.progress["stopped"] == True: + break + + print("%.2f percent | %d of %d | %.1f KB/s" % (progress, d.progress['downloaded'], d.progress['total'], speed)) + + if progress == 100: + print("") + print("Download complete: %s" % d.filename) + break + time.sleep(sleep_time) + + # tell thread to terminate on keyboard interrupt, + # otherwise the process has to be killed manually + except KeyboardInterrupt: + d.cancel() + break + + except: + raise + +if __name__ == "__main__": + main() diff --git a/sys.py/UI/download_process_page.py b/sys.py/UI/download_process_page.py new file mode 100644 index 0000000..060eea7 --- /dev/null +++ b/sys.py/UI/download_process_page.py @@ -0,0 +1,241 @@ +# -*- coding: utf-8 -*- +import os +import pygame + +import gobject +import validators + + +from libs.roundrects import aa_round_rect + +## local UI import +from UI.constants import Width,Height,ICON_TYPES,RUNEVT +from UI.page import Page,PageSelector +from UI.label import Label +from UI.icon_item import IconItem +from UI.util_funcs import midRect,CmdClean,FileExists +from UI.keys_def import CurKeys, IsKeyMenuOrB +from UI.multi_icon_item import MultiIconItem +from UI.icon_pool import MyIconPool +from UI.download import Download +from UI.skin_manager import MySkinManager +from UI.lang_manager import MyLangManager + +from libs.DBUS import is_wifi_connected_now + +import config + +class DownloadProcessPage(Page): + _FootMsg = ["Nav.","","","Back",""] + _Downloader = None + _DownloaderTimer = -1 + _Value = 0 + + _URL = "" + _DST_DIR = "" + + _PngSize = {} + + _FileNameLabel = None + _SizeLabel = None + + _URLColor = MySkinManager.GiveColor('URL') + _TextColor = MySkinManager.GiveColor('Text') + + def __init__(self): + Page.__init__(self) + self._Icons = {} + self._CanvasHWND = None + + def Init(self): + self._PosX = self._Index * self._Screen._Width + self._Width = self._Screen._Width + self._Height = self._Screen._Height + + self._CanvasHWND = self._Screen._CanvasHWND + + self._PngSize["bg"] = (48,79) + self._PngSize["needwifi_bg"] = (253,132) + + bgpng = IconItem() + bgpng._ImgSurf = MyIconPool.GiveIconSurface("rom_download") + bgpng._MyType = ICON_TYPES["STAT"] + bgpng._Parent = self + bgpng.Adjust(0,0,self._PngSize["bg"][0],self._PngSize["bg"][1],0) + self._Icons["bg"] = bgpng + + needwifi_bg = IconItem() + needwifi_bg._ImgSurf = MyIconPool.GiveIconSurface("needwifi_bg") + needwifi_bg._MyType = ICON_TYPES["STAT"] + needwifi_bg._Parent = self + needwifi_bg.Adjust(0,0,self._PngSize["needwifi_bg"][0],self._PngSize["needwifi_bg"][1],0) + + self._Icons["needwifi_bg"] = needwifi_bg + + + self._FileNameLabel = Label() + self._FileNameLabel.SetCanvasHWND(self._CanvasHWND) + self._FileNameLabel.Init("", MyLangManager.TrFont("varela12")) + + self._SizeLabel = Label() + self._SizeLabel.SetCanvasHWND(self._CanvasHWND) + self._SizeLabel.Init("0/0Kb",MyLangManager.TrFont("varela12")) + self._SizeLabel.SetColor( self._URLColor ) + + + def OnExitCb(self,event): + #print("DownloadProcessPage OnExitCb") + if self._Downloader == None: + return + try: + self._Downloader.stop() + except: + pass + return + + def GObjectUpdateProcessInterval(self): + if self._Screen.CurPage() == self: + if self._Downloader.isFinished(): + if self._Downloader.isSuccessful(): + print("Download Success!") + # Do something with obj.get_dest() + filename = os.path.basename(self._Downloader.get_dest()) + cur_dir = os.getcwd() + + if filename.endswith(".zip"): + os.chdir(self._DST_DIR) + os.system( "unzip -o " + filename ) + + elif filename.endswith(".zsync"): + os.chdir(self._DST_DIR) + os.system( "rm -rf " + filename) + + elif filename.endswith(".tar.xz"): + os.chdir(self._DST_DIR) + os.system( "tar xf " + filename) + os.system( "rm -rf " + filename) + + os.chdir(cur_dir) + self.DownloadPostJob() + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + else: + print("Download failed with the following exceptions:") + for e in self._Downloader.get_errors(): + print(unicode(e)) + + try: + self._Downloader.stop() + except: + pass + + self._Screen._MsgBox.SetText("DownloadFailed") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + return False + else: + self._Value = self._Downloader.get_progress() + + filename = os.path.basename(self._Downloader.get_dest()) + self._FileNameLabel.SetText( filename ) + + downloaded = self._Downloader.progress["downloaded"] + total = self._Downloader.progress["total"] + + downloaded = downloaded/1000.0/1000.0 + total = total/1000.0/1000.0 + + self._SizeLabel.SetText( "%.2f" % downloaded+"/"+ "%.2f" % total +"Mb") + + print("Progress: %d%%" % (self._Value)) + self._Screen.Draw() + self._Screen.SwapAndShow() + return True + else: + return False + + def DownloadPostJob(self): + cur_dir = os.getcwd() + + arr = self._URL.rsplit('/', 1) + if len(arr) > 1: + downloaded_filename = arr[1] + try: + os.chdir(os.path.join(cur_dir,"patches",downloaded_filename)) + os.system("/bin/sh Run.sh") + except: + pass + + os.chdir(cur_dir) + + def StartDownload(self,url,dst_dir): + if is_wifi_connected_now() == False: + return + + if validators.url(url) and os.path.isdir(dst_dir): + self._URL = url + self._DST_DIR = dst_dir + else: + self._Screen._MsgBox.SetText("Invaid") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + print("url or dst dir error") + return + + self._Downloader = Download(url,dst_dir,None) + self._Downloader.start() + + self._DownloaderTimer = gobject.timeout_add(200, self.GObjectUpdateProcessInterval) + + def KeyDown(self,event): + if IsKeyMenuOrB(event.key): + gobject.source_remove(self._DownloaderTimer) + self._DownloaderTimer = -1 + + if self._Downloader != None: + try: + self._Downloader.stop() + except: + print("user canceled ") + + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + def Draw(self): + self.ClearCanvas() + + if is_wifi_connected_now() == False: + self._Icons["needwifi_bg"].NewCoord(self._Width/2, self._Height/2) + self._Icons["needwifi_bg"].Draw() + return + + self._Icons["bg"].NewCoord(self._Width/2,self._Height/2-20) + self._Icons["bg"].Draw() + + percent = self._Value + if percent < 10: + percent = 10 + + + rect_ = midRect(self._Width/2,self._Height/2+33,170,17, Width,Height) + aa_round_rect(self._CanvasHWND,rect_,MySkinManager.GiveColor('TitleBg'),5,0,MySkinManager.GiveColor('TitleBg')) + + rect2 = midRect(self._Width/2,self._Height/2+33,int(170*(percent/100.0)),17, Width,Height) + rect2.left = rect_.left + rect2.top = rect_.top + aa_round_rect(self._CanvasHWND,rect2,MySkinManager.GiveColor('Front'),5,0,MySkinManager.GiveColor('Front')) + + rect3 = midRect(self._Width/2,self._Height/2+53,self._FileNameLabel._Width, self._FileNameLabel._Height,Width,Height) + + rect4 = midRect(self._Width/2,self._Height/2+70,self._SizeLabel._Width, self._SizeLabel._Height,Width,Height) + + self._FileNameLabel.NewCoord(rect3.left,rect3.top) + self._SizeLabel.NewCoord(rect4.left, rect4.top) + + self._FileNameLabel.Draw() + self._SizeLabel.Draw() + + diff --git a/sys.py/UI/foot_bar.py b/sys.py/UI/foot_bar.py new file mode 100644 index 0000000..7524637 --- /dev/null +++ b/sys.py/UI/foot_bar.py @@ -0,0 +1,192 @@ +# -*- coding: utf-8 -*- + +import pygame +import os + + +##local import +from constants import Width,Height,ICON_TYPES,ALIGN +from util_funcs import FileExists,midRect +from icon_item import IconItem +from multi_icon_item import MultiIconItem +from icon_pool import MyIconPool +from libs.roundrects import aa_round_rect +from lang_manager import MyLangManager +from widget import Widget +from skin_manager import MySkinManager + +import config + +icon_base_path = MySkinManager.GiveIcon("gameshell/footbar_icons/") + +class FootBarIcon(MultiIconItem): + + def TotalWidth(self): + return self._Width+self._Label._Width + + def Draw(self): + if self._Align==ALIGN["VCenter"]: #default + if self._Label != None: + self._Label._PosX = self._PosX - self._Label._Width/2 + self._Label._PosY = self._PosY + self._Height/2 + 12 + + elif self._Align ==ALIGN["HLeft"]: + if self._Label != None: + self._Label._PosX = self._PosX + self._Width/2 + 3 + self._Label._PosY = self._PosY - self._Label._Height/2 + + if self._Label!=None: + self._Label.Draw() + + if self._ImgSurf != None: + self._Parent._CanvasHWND.blit(self._ImgSurf,midRect(self._PosX, + self._PosY, + self._Width,self._Height,Width,Height), + (0,self._IconIndex*self._IconHeight,self._IconWidth,self._IconHeight)) +class FootBar(Widget): + _Width = Width + _Height = 20 + _BarHeight = 20.5 + _BorderWidth = 1 + _CanvasHWND = None + _HWND = None + _Icons = {} + _IconWidth = 18 + _IconHeight = 18 + _LabelFont = MyLangManager.TrFont("veramono10") + _State = "normal" + + _SkinManager = None + + def __init__(self): + self._Icons = {} + + + def ReadFootBarIcons(self,icondir): + if FileExists(icondir) == False and os.path.isdir(icondir) == False: + return + + keynames = ["nav","x","y","a","b","select"] + + share_surf = pygame.image.load(icon_base_path+"footbar.png").convert_alpha() + + files = os.listdir(icondir) + for _i,i in enumerate( keynames): + it = FootBarIcon() + it._MyType = ICON_TYPES["NAV"] + it._Parent = self + it._ImgSurf= share_surf + it._Align = ALIGN["HLeft"] # (x)text <= + + it.AddLabel("game",self._LabelFont) + it.Adjust(self._IconWidth/2+_i*self._IconWidth, self._IconHeight/2+2, self._IconWidth, self._IconHeight,0) + it._IconIndex = _i + self._Icons[i] = it + + + def Init(self,screen): + self._HWND = screen + self._CanvasHWND = pygame.Surface((Width,int(self._BarHeight))) + + self.ReadFootBarIcons(icon_base_path) + + round_corners = MultiIconItem() + round_corners._IconWidth = 10 + round_corners._IconHeight = 10 + + round_corners._MyType = ICON_TYPES["STAT"] + round_corners._Parent = self + round_corners._ImgSurf = MyIconPool.GiveIconSurface("roundcorners") + round_corners.Adjust(0,0,10,10,0) + + self._Icons["round_corners"] = round_corners + + def ResetNavText(self): + self._Icons["nav"]._Label.SetText(MyLangManager.Tr("Nav")) + self._State = "normal" + self.Draw() + return False + + def UpdateNavText(self,texts): + self._State = "tips" + texts = MyLangManager.Tr(texts) + my_text = self._LabelFont.render(texts,True,self._SkinManager.GiveColor("Text")) + """ + _w = 0 + for i, x in enumerate(("b","a","y","x")): + if self._Icons[x]._Label._Text!="": + if i==0: + _w += self._Icons[x].TotalWidth() + else: + _w += self._Icons[x].TotalWidth()+5 + """ + left_width = self._Width - 18 + + final_piece = "" + for i ,v in enumerate(texts): + text_slice = texts[:i+1] + my_text = self._LabelFont.render(text_slice,True, self._SkinManager.GiveColor("Text")) + final_piece = text_slice + if my_text.get_width() >= left_width: + break + + print("finalpiece %s" %final_piece) + self._Icons["nav"]._Label.SetText( final_piece ) + + self.Draw() + + def SetLabelTexts(self,texts): + barr = ["nav","y","x","b","a","select"] + texts2 = texts + [""] if len(texts) == 5 else texts + + for idx,x in enumerate(barr): + try: + self._Icons[x]._Label.SetText(MyLangManager.Tr(texts2[idx])) + except IndexError: + print("Index "+x+" doesn't exist!") + + + def ClearCanvas(self): + self._CanvasHWND.fill( self._SkinManager.GiveColor("White") ) + + self._Icons["round_corners"].NewCoord(5,self._Height -5 ) + self._Icons["round_corners"]._IconIndex = 2 + self._Icons["round_corners"].Draw() + + self._Icons["round_corners"].NewCoord(self._Width-5,self._Height-5) + self._Icons["round_corners"]._IconIndex = 3 + self._Icons["round_corners"].Draw() + + + """ + aa_round_rect(self._CanvasHWND, + (0,0,self._Width,self._Height),self._BgColor,8,0, self._BgColor) + + pygame.draw.rect(self._CanvasHWND,self._BgColor,(0,0,Width,self._BarHeight/2), 0 ) + """ + + def Draw(self): + self.ClearCanvas() + self._Icons["nav"].NewCoord(self._IconWidth/2+3,self._IconHeight/2+2) + self._Icons["nav"].Draw() + + if self._State == "normal": + _w=0 + #for i,x in enumerate(("a","b","x","y")): + for i, x in enumerate(("b","a","y","x","select")): + if self._Icons[x]._Label._Text!="": + if i==0: + _w += self._Icons[x].TotalWidth() + else: + _w += self._Icons[x].TotalWidth()+5 + + start_x = self._Width - _w + start_y = self._IconHeight/2+2 + self._Icons[x].NewCoord(start_x,start_y) + self._Icons[x].Draw() + + + pygame.draw.line(self._CanvasHWND,self._SkinManager.GiveColor("Line"),(0,0),(Width,0),self._BorderWidth) + + if self._HWND != None: + self._HWND.blit(self._CanvasHWND,(self._PosX,Height - self._Height,Width,self._BarHeight)) diff --git a/sys.py/UI/full_screen.py b/sys.py/UI/full_screen.py new file mode 100644 index 0000000..c6e2c65 --- /dev/null +++ b/sys.py/UI/full_screen.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- + +import pygame +#from sys import exit +#import os +#import sys + +#from libs import easing +#from datetime import datetime + +#from beeprint import pp + +## local package import +from constants import Width,Height + + +class FullScreen(object): + _PosX = 0 + _PosY = 0 + _Width = Width + _Height = Height + _CanvasHWND = None + _HWND = None + + def __init__(self): + pass + + def Init(self): + pass + + def SwapAndShow(self): + if self._HWND != None: + self._HWND.blit(self._CanvasHWND,(self._PosX,self._PosY,self._Width,self._Height)) + pygame.display.update() + + def Draw(self): + pass + diff --git a/sys.py/UI/icon_item.py b/sys.py/UI/icon_item.py new file mode 100644 index 0000000..1b6cafc --- /dev/null +++ b/sys.py/UI/icon_item.py @@ -0,0 +1,121 @@ +# -*- coding: utf-8 -*- + +import pygame + +## local import +from constants import icon_width,icon_height,ICON_TYPES,ALIGN,icon_ext,Width,Height +from util_funcs import color_surface,midRect +from label import Label +from lang_manager import MyLangManager +from widget import Widget +class IconItem(Widget): + _ImageName="" + _ImgSurf = None + _Parent = None + _Index = 0 + _MyType = ICON_TYPES["EXE"] + _CmdPath = "" + _LinkPage = None + _Label = None + _Align = ALIGN["VCenter"] # set for the Icon Image and Text Label + + def __init__(self): + self._ImgSurf=None + + + def Init(self,x,y,w,h,at): # the Surface is assigned in Screen + self._PosX = x + self._PosY = y + self._Width = w + self._Height = h + self._AnimationTime = at + + def SetLableColor(self,color): + self._Label.SetColor(color) + + def AddLabel(self,text,fontobj): + if self._Label == None: + self._Label = Label() + self._Label.Init(text,fontobj) + else: + #just replace the text + self._Label._Init(text,fontobj) + + def Adjust(self,x,y,w,h,at): # the Surface is assigned in Screen + self.Init(x,y,w,h,at) + + if self._Label != None: + self._Label.SetCanvasHWND( self._Parent._CanvasHWND) + + self.CreateImageSurf() + self.AdjustLinkPage() + + def AdjustLinkPage(self): + if self._MyType==ICON_TYPES["DIR"] and self._LinkPage != None: + self._LinkPage._Index = 0 + self._LinkPage._Align = ALIGN["SLeft"] + self._LinkPage._IconNumbers = len(self._LinkPage._Icons) + self._LinkPage._Screen = self._Parent._Screen + self._LinkPage._CanvasHWND = self._Parent._Screen._CanvasHWND + + self._LinkPage._FootMsg = ["Nav","","","Back","Enter"] ## Default Page Foot info + + if self._LinkPage._Align == ALIGN["HLeft"]: + self._LinkPage.AdjustHLeftAlign() + elif self._LinkPage._Align == ALIGN["SLeft"]: + self._LinkPage.AdjustSAutoLeftAlign() + if self._LinkPage._IconNumbers > 1: + self._LinkPage._PsIndex = 1 + self._LinkPage._IconIndex = self._LinkPage._PsIndex + + def CreateImageSurf(self): + + if self._ImgSurf == None and self._ImageName != "": +# print(self._ImageName) + self._ImgSurf = pygame.image.load( self._ImageName ).convert_alpha() + #if self._ImgSurf.get_width() > icon_width or self._ImgSurf.get_height() > icon_height: + # self._ImgSurf = pygame.transform.scale(self._ImgSurf,(icon_width,icon_height)) + + def ChangeImgSurfColor(self,color): + color_surface(self._ImgSurf,color) + + def Clear(self): + pass + + def DrawTopLeft(self): + if self._Align==ALIGN["VCenter"]: #default + if self._Label != None: + self._Label._PosX = self._PosX - self._Label._Width/2 + self._Parent._PosX + self._Label._PosY = self._PosY + self._Height/2 +6 + self._Parent._PosY + + elif self._Align ==ALIGN["HLeft"]: + if self._Label != None: + self._Label._PosX = self._PosX + self._Width/2 + 3 + self._Parent._PosX + self._Label._PosY = self._PosY - self._Label._Height/2 + self._Parent._PosY + + if self._Label!=None: + self._Label.Draw() + + if self._ImgSurf != None: + self._Parent._CanvasHWND.blit(self._ImgSurf,pygame.Rect(self._PosX+self._Parent._PosX, + self._PosY+self._Parent._PosY, + self._Width, + self._Height)) + def Draw(self): + if self._Align==ALIGN["VCenter"]: #default + if self._Label != None: + self._Label._PosX = self._PosX - self._Label._Width/2 + self._Parent._PosX + self._Label._PosY = self._PosY + self._Height/2 +6 + self._Parent._PosY + + elif self._Align ==ALIGN["HLeft"]: + if self._Label != None: + self._Label._PosX = self._PosX + self._Width/2 + 3 + self._Parent._PosX + self._Label._PosY = self._PosY - self._Label._Height/2 + self._Parent._PosY + + if self._Label!=None: + self._Label.Draw() + + if self._ImgSurf != None: + self._Parent._CanvasHWND.blit(self._ImgSurf,midRect(self._PosX+self._Parent._PosX, + self._PosY+self._Parent._PosY, + self._Width,self._Height,Width,Height)) diff --git a/sys.py/UI/icon_pool.py b/sys.py/UI/icon_pool.py new file mode 100644 index 0000000..95980b7 --- /dev/null +++ b/sys.py/UI/icon_pool.py @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- + +import pygame +from pygame.locals import * +from sys import exit +import os +import sys + +from skin_manager import MySkinManager +##pool only store surfaces + +class IconPool(object): + + _GameShellIconPath = MySkinManager.GiveIcon("gameshell/icons/") + _Icons = {} + _Sizes = {} + def __init__(self): + self._Icons= {} + + def Init(self): + + files = os.listdir(self._GameShellIconPath) + for i in files: + if os.path.isfile(self._GameShellIconPath+"/"+i) and i.endswith(".png"): + keyname = i.split(".")[0] + self._Icons[keyname] = pygame.image.load(self._GameShellIconPath+"/"+i).convert_alpha() + self._Sizes[keyname] = self._Icons[keyname].get_size() + + def Width(self,keyname): + if keyname in self._Sizes: + return self._Sizes[keyname][0] + + def Height(self,keyname): + if keyname in self._Sizes: + return self._Sizes[keyname][1] + + def GiveIconSurface(self,imgname): ## imgname is the png file name without .png + if imgname in self._Icons: + return self._Icons[imgname] + else: + icon_file = MySkinManager.GiveIcon("gameshell/icons/"+imgname+".png") + if os.path.isfile(icon_file): + keyname = imgname + self._Icons[keyname] = pygame.image.load(icon_file).convert_alpha() + self._Sizes[keyname] = self._Icons[keyname].get_size() + return self._Icons[keyname] + + return None # this will cause panic,if not found both in theme and default skin folder + +##global Handler +MyIconPool = None + +def InitMyIconPool(): + global MyIconPool + if MyIconPool == None: + MyIconPool = IconPool() + +InitMyIconPool() + diff --git a/sys.py/UI/info_page_list_item.py b/sys.py/UI/info_page_list_item.py new file mode 100644 index 0000000..bfbd8c7 --- /dev/null +++ b/sys.py/UI/info_page_list_item.py @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- + +import pygame +from label import Label +from skin_manager import MySkinManager +from widget import Widget +class InfoPageListItem(Widget): + _Height = 30 + + _Labels = {} + _Icons = {} + _Fonts = {} + + _LinkObj = None + _ReadOnly = False + + def __init__(self): + self._Labels = {} + self._Icons = {} + self._Fonts = {} + + def SetSmallText(self,text): + + l = Label() + l._PosX = 40 + l.SetCanvasHWND(self._Parent._CanvasHWND) + l.Init(text,self._Fonts["small"]) + self._Labels["Small"] = l + + def Init(self,text): + + #self._Fonts["normal"] = fonts["veramono12"] + + l = Label() + l._PosX = 10 + l.SetCanvasHWND(self._Parent._CanvasHWND) + + l.Init(text,self._Fonts["normal"]) + self._Labels["Text"] = l + + def Draw(self): + if self._ReadOnly == True: + self._Labels["Text"].SetColor(MySkinManager.GiveColor("ReadOnlyText")) + else: + self._Labels["Text"].SetColor(MySkinManager.GiveColor("Text")) + + + self._Labels["Text"]._PosX = self._Labels["Text"]._PosX + self._PosX + self._Labels["Text"]._PosY = self._PosY + (self._Height - self._Labels["Text"]._Height)/2 + self._Labels["Text"].Draw() + self._Labels["Text"]._PosX = self._Labels["Text"]._PosX - self._PosX + + if "Small" in self._Labels: + self._Labels["Small"]._PosX = self._Width - self._Labels["Small"]._Width-5 + + self._Labels["Small"]._PosY = self._PosY + (self._Height - self._Labels["Small"]._Height)/2 + self._Labels["Small"].Draw() + + pygame.draw.line(self._Parent._CanvasHWND,MySkinManager.GiveColor('Line'),(self._PosX,self._PosY+self._Height-1),(self._PosX+self._Width,self._PosY+self._Height-1),1) diff --git a/sys.py/UI/info_page_selector.py b/sys.py/UI/info_page_selector.py new file mode 100644 index 0000000..2b167cc --- /dev/null +++ b/sys.py/UI/info_page_selector.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +import pygame + +from libs.roundrects import aa_round_rect +## local UI import +from UI.constants import Width,Height +from UI.page import Page,PageSelector +from UI.skin_manager import MySkinManager + +class InfoPageSelector(PageSelector): + _BackgroundColor = MySkinManager.GiveColor('Front') + + def __init__(self): + self._Width = Width + + def AnimateDraw(self,x2,y2): + pass + + def Draw(self): + idx = self._Parent._PsIndex + if idx >= 0 and idx < len(self._Parent._MyList): + y = self._Parent._MyList[idx]._PosY+1 + h = self._Parent._MyList[idx]._Height -3 + + self._PosY = y + self._Height = h + + aa_round_rect(self._Parent._CanvasHWND, + (self._PosX,self._PosY,self._Width-4,self._Height),self._BackgroundColor,4,0,self._BackgroundColor) diff --git a/sys.py/UI/keyboard.py b/sys.py/UI/keyboard.py new file mode 100644 index 0000000..51aa395 --- /dev/null +++ b/sys.py/UI/keyboard.py @@ -0,0 +1,350 @@ +# -*- coding: utf-8 -*- + +import pygame + +from libs import easing + +## local UI import +from UI.constants import Width,Height,ICON_TYPES +from UI.page import Page,PageSelector +from UI.label import Label +from UI.util_funcs import midRect +from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB +from UI.icon_item import IconItem +from UI.icon_pool import MyIconPool +from UI.skin_manager import MySkinManager + +from libs.roundrects import aa_round_rect + +from textarea import Textarea +from text_item import TextItem + +import myvars + +class KeyboardIcon(IconItem): + _Color = MySkinManager.GiveColor('Text') + _MyType = ICON_TYPES["NAV"] + _Parent = None + _Str = "" + + def Draw(self): + self._Parent._CanvasHWND.blit(self._ImgSurf, \ + midRect(self._PosX,self._PosY,self._Width,self._Height,Width,Height)) + + +class KeyboardSelector(PageSelector): + + def Draw(self): + sec_idx = self._Parent._SectionIndex + row_idx = self._Parent._RowIndex + idx = self._Parent._PsIndex + + x = self._Parent._SecsKeys[sec_idx][row_idx][idx]._PosX + y = self._Parent._SecsKeys[sec_idx][row_idx][idx]._PosY + w = self._Parent._SecsKeys[sec_idx][row_idx][idx]._Width+6 + h = self._Parent._SecsKeys[sec_idx][row_idx][idx]._Height+1 + + rect = midRect(x,y,w,h,self._Parent._Width,self._Parent._Height) + if rect.width <=0 or rect.height <= 0 : + return + + aa_round_rect(self._Parent._CanvasHWND,rect, (126,206,244),3,0,(126,206,244)) +# pygame.draw.rect(self._Parent._CanvasHWND,(0,0,0),rect,1) + +class Keyboard(Page): + _SectionNumbers = 3 + _SectionIndex = 1 + + _Icons = {} + _Secs = {} + _SecsKeys = {} + _KeyboardLayoutFile = "UI/keyboard_keys.layout" + _Textarea = None + _Selector = None + _LeftOrRight = 1 + _FootMsg = ["Nav.","Done","ABC","Backspace","Enter"] + + _RowIndex = 0 + _Caller = None + + def __init__(self): + self._Secs = {} + self._SecsKeys = {} + self._Icons = {} + + def ReadLayoutFile(self,fname): + LayoutIndex = 0 + with open(fname) as f: + content = f.readlines() + + content = [ x.strip() for x in content] + content = [ x.split(" ") for x in content] + + for i in content: + i = [ x.strip() for x in i] + if len(i) > 2: + if LayoutIndex in self._Secs: + self._Secs[LayoutIndex].append(i) + else: + self._Secs[LayoutIndex] = [] + self._Secs[LayoutIndex].append(i) + else: + LayoutIndex+=1 + + def SetPassword(self,pwd): + + pwd_list = list(pwd) + self._Textarea.ResetMyWords() + for i in pwd_list: + self._Textarea.AppendText(i) + #self._Textarea.BlitText() + + def Init(self): + self._CanvasHWND = self._Screen._CanvasHWND + self.ReadLayoutFile(self._KeyboardLayoutFile) ## assign to _Secs + self._SectionNumbers = len(self._Secs) + self._PosX = self._Index*self._Screen._Width + self._Width = self._Screen._Width + self._Height = self._Screen._Height + + fontobj = MySkinManager.GiveFont("veramono24") + word_margin = 15 + + start_x = (self._Width - fontobj.size( "".join(self._Secs[0][0]))[0]-len(self._Secs[0][0])*word_margin)/2+word_margin/2 + start_y = 0 + cnt = 0 + for i in range(0,self._SectionNumbers): + self._SecsKeys[i] = [] + for j in range(0,len(self._Secs[i])): + self._SecsKeys[i].append( [] ) + + start_x = (self._Width - fontobj.size( "".join(self._Secs[i][j]))[0]-len(self._Secs[i][j])*word_margin)/2+word_margin/2 + start_x = start_x + i*Width + start_y = 84+j*(word_margin+14) + for idx,val in enumerate(self._Secs[i][j]): + ti = TextItem() + ti._FontObj = fontobj + ti._Parent = self + + if val == "_L" or val == "_R": + it = KeyboardIcon() + it._ImgSurf = MyIconPool.GiveIconSurface(val) + it._Parent = self + it._Str = val + it.Init(start_x+it._ImgSurf.get_width()/2 ,start_y,it._ImgSurf.get_width(),it._ImgSurf.get_height(),0) + #self._Icons[val] = it + self._SecsKeys[i][j].append(it) + self._IconNumbers+=1 + start_x = start_x + it._ImgSurf.get_width()+word_margin + + else: + if val == "_S": + val = "Space" + ti._FontObj = MySkinManager.GiveFont("veramono15") + ti._Bold = True + + cur_alpha_size = ti._FontObj.size( val) + ti.Init(start_x + cur_alpha_size[0]/2,start_y,cur_alpha_size[0],cur_alpha_size[1],0) + ti._Str = val + + start_x = start_x + cur_alpha_size[0]+word_margin # prepare for next alpha + self._SecsKeys[i][j].append(ti) + + self._SectionIndex = 0 + + self._Textarea = Textarea() + + self._Textarea._PosX = 4 + self._Textarea._PosY = 4 + self._Textarea._Width= self._Width - 4*2 + self._Textarea._Height = 60 + self._Textarea._CanvasHWND = self._CanvasHWND + self._Textarea.Init() + + + ps = KeyboardSelector() + ps._Parent = self + ps.Init(start_x,start_y,25,25,128) + self._Ps = ps + self._PsIndex = 0 + self._Ps._OnShow = True + + def SelectUpChar(self): + sec_idx = self._SectionIndex + self._RowIndex-=1 + if self._RowIndex <0: + self._RowIndex = len(self._SecsKeys[sec_idx])-1 + + if self._PsIndex >=len(self._SecsKeys[sec_idx][self._RowIndex]): + self._PsIndex = len(self._SecsKeys[sec_idx][self._RowIndex])-1 + + + self.ClearCanvas() + self.Draw() + self._Screen.SwapAndShow() + + def SelectDownChar(self): + sec_idx = self._SectionIndex + self._RowIndex+=1 + if self._RowIndex >= len(self._SecsKeys[sec_idx]): + self._RowIndex = 0 + + if self._PsIndex >=len(self._SecsKeys[sec_idx][self._RowIndex]): + self._PsIndex = len(self._SecsKeys[sec_idx][self._RowIndex])-1 + + self.ClearCanvas() + self.Draw() + self._Screen.SwapAndShow() + + def SelectNextChar(self): + sec_idx = self._SectionIndex + row_idx = self._RowIndex + self._PsIndex+=1 + if self._PsIndex >= len(self._SecsKeys[sec_idx][row_idx]): + self._PsIndex = 0 + self._RowIndex+=1 + if self._RowIndex >= len(self._SecsKeys[sec_idx]): + self._RowIndex = 0 + + self.ClearCanvas() + self.Draw() + self._Screen.SwapAndShow() + + def SelectPrevChar(self): + sec_idx = self._SectionIndex + self._PsIndex-=1 + if self._PsIndex < 0: + self._RowIndex-=1 + if self._RowIndex <=0: + self._RowIndex = len(self._SecsKeys[sec_idx])-1 + self._PsIndex = len(self._SecsKeys[sec_idx][self._RowIndex]) -1 + + self.ClearCanvas() + self.Draw() + self._Screen.SwapAndShow() + + def ClickOnChar(self): + sec_idx = self._SectionIndex + alphabet = self._SecsKeys[sec_idx][self._RowIndex][self._PsIndex]._Str + + if alphabet == "Space": + alphabet = " " + + if alphabet == "_L" or alphabet == "_R": + if alphabet == "_L": + self._Textarea.SubTextIndex() + elif alphabet == "_R": + self._Textarea.AddTextIndex() + else: + self._Textarea.AppendText(alphabet) + + self._Textarea.Draw() + self._Screen.SwapAndShow() + + + def KeyboardShift(self): + current_time = 0.0 + start_posx = 0.0 + current_posx = start_posx + final_posx = 320.0 + posx_init = 0.0 + dur = 30 + last_posx = 0.0 + all_last_posx = [] + + for i in range(0,Width*dur): + current_posx = easing.SineIn(current_time,start_posx,final_posx-start_posx,float(dur)) + if current_posx >= final_posx: + current_posx = final_posx + + dx = current_posx - last_posx + all_last_posx.append(int(dx)) + current_time +=1 + last_posx = current_posx + if current_posx >= final_posx: + break + + c = 0 + for i in all_last_posx: + c+=i + if c < final_posx - start_posx: + all_last_posx.append(final_posx - c) + + for i in all_last_posx: + for j in range(0,self._SectionNumbers): + for u in self._SecsKeys[j]: + for x in u: + x._PosX += self._LeftOrRight*i + + self.ResetPageSelector() + self.ClearCanvas() + self.Draw() + self._Screen.SwapAndShow() + + def KeyDown(self,event):# event from pygame.event.get() + if event.key == CurKeys["Up"]: + self.SelectUpChar() + if event.key == CurKeys["Down"]: + self.SelectDownChar() + if event.key == CurKeys["Right"]: + self.SelectNextChar() + if event.key == CurKeys["Left"]: + self.SelectPrevChar() + if IsKeyStartOrA(event.key): + self.ClickOnChar() + if event.key == CurKeys["X"]: + if self._SectionIndex <= 0: + self._LeftOrRight = -1 + if self._SectionIndex >= (self._SectionNumbers -1): + self._LeftOrRight = 1 + + self.ShiftKeyboardPage() + + if event.key == CurKeys["Menu"]: # we assume keyboard always be child page + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Y"]: #done + print("".join(self._Textarea._MyWords)) + self.ReturnToUpLevelPage() + self._Screen.SwapAndShow() + if self._Caller != None: + on_kbd_return_back_cb = getattr(self._Caller,"OnKbdReturnBackCb",None) + if on_kbd_return_back_cb != None: + if callable( on_kbd_return_back_cb ): + self._Caller.OnKbdReturnBackCb() + #Uplevel page invokes OnReturnBackCb,eg: ConfigWireless + + if event.key == CurKeys["B"]: + self._Textarea.RemoveFromLastText() + self._Textarea.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["LK1"]: + if self._SectionIndex < self._SectionNumbers -1: + self._LeftOrRight = -1 + self.ShiftKeyboardPage() + + if event.key == CurKeys["LK5"]: + if self._SectionIndex > 0: + self._LeftOrRight = 1 + self.ShiftKeyboardPage() + + def Draw(self): + self.ClearCanvas() + self._Ps.Draw() + for i in range(0,self._SectionNumbers): + for j in self._SecsKeys[i]: + for u in j: + u.Draw() + + + self._Textarea.Draw() + + def ShiftKeyboardPage(self): + self.KeyboardShift() + self._SectionIndex -= self._LeftOrRight + self.Draw() + self._Screen.SwapAndShow() + diff --git a/sys.py/UI/keyboard_keys.layout b/sys.py/UI/keyboard_keys.layout new file mode 100644 index 0000000..a77e2ff --- /dev/null +++ b/sys.py/UI/keyboard_keys.layout @@ -0,0 +1,14 @@ +1 2 3 4 5 6 7 8 9 0 +q w e r t y u i o p +a s d f g h j k l +_L z x c v b n m _R + +1 2 3 4 5 6 7 8 9 0 +Q W E R T Y U I O P +A S D F G H J K L +_L Z X C V B N M _R + +! @ # $ % ^ & * ( ) +- _ + = ~ ` [ ] { } +| \ : ; " ' < > , . +_L ? / _R _S diff --git a/sys.py/UI/keys_def.py b/sys.py/UI/keys_def.py new file mode 100644 index 0000000..176adc5 --- /dev/null +++ b/sys.py/UI/keys_def.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- + +import pygame +from pygame.locals import * +from sys import exit +import os +import sys + +import config +from config import CurKeySet ## read only + +def GetButtonsLayoutMode(): + lm = "xbox" + try: + with open(".buttonslayout", "r") as f: + lm = f.read() + except: + None + if lm not in ["xbox","snes"]: + lm = "xbox" + return lm + +def SetButtonsLayoutMode(mode): + SetXYABButtons(mode) + with open(".buttonslayout", "w") as f: + f.write(mode) + config.ButtonsLayout = mode + +def SetXYABButtons(mode): + if mode == "snes": + GameShell["Y"] = pygame.K_u + GameShell["X"] = pygame.K_i + GameShell["B"] = pygame.K_j + GameShell["A"] = pygame.K_k + else: + GameShell["X"] = pygame.K_u + GameShell["Y"] = pygame.K_i + GameShell["A"] = pygame.K_j + GameShell["B"] = pygame.K_k + + +GameShell = {} +GameShell["Up"] = pygame.K_UP +GameShell["Down"] = pygame.K_DOWN +GameShell["Left"] = pygame.K_LEFT +GameShell["Right"]= pygame.K_RIGHT + +GameShell["Menu"] = pygame.K_ESCAPE + +SetXYABButtons(GetButtonsLayoutMode()) + +GameShell["Select"] = pygame.K_SPACE +GameShell["Start"] = pygame.K_RETURN + +GameShell["LK1"] = pygame.K_h +GameShell["LK5"] = pygame.K_l + +PC = {} + +PC["Up"] = pygame.K_UP +PC["Down"] = pygame.K_DOWN +PC["Left"] = pygame.K_LEFT +PC["Right"] = pygame.K_RIGHT +PC["Menu"] = pygame.K_ESCAPE +PC["X"] = pygame.K_x +PC["Y"] = pygame.K_y +PC["A"] = pygame.K_a +PC["B"] = pygame.K_b +PC["Select"] = pygame.K_SPACE +PC["Start"] = pygame.K_s + +PC["LK1"] = pygame.K_h +PC["LK5"] = pygame.K_l + +if CurKeySet == "PC": + CurKeys = PC +else: + CurKeys = GameShell + + +def IsKeyStartOrA(key): + return key == CurKeys["Start"] or key == CurKeys["A"] + +def IsKeyMenuOrB(key): + return key == CurKeys["Menu"] or key == CurKeys["B"] diff --git a/sys.py/UI/label.py b/sys.py/UI/label.py new file mode 100644 index 0000000..ccfa98d --- /dev/null +++ b/sys.py/UI/label.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- + +import pygame + +#import base64 +#from beeprint import pp +from constants import Width,Height +from util_funcs import midRect + +#UI lib +from skin_manager import MySkinManager +from lang_manager import MyLangManager +from widget import Widget +class Label(Widget): + _Text="" + _FontObj=None + _Color = MySkinManager.GiveColor('Text') + _CanvasHWND = None + _TextSurf = None + def __init__(self): + pass + + def Init(self, text, font_obj, color=MySkinManager.GiveColor('Text')): + self._Color = color + self._FontObj = font_obj + self._Text = text + + my_text = self._FontObj.render(self._Text,True,self._Color) + self._Width = my_text.get_width() + self._Height = my_text.get_height() + + def SetColor(self,color): + self._Color = color + + def GetText(self): + return self._Text + + def SetText(self,text): + self._Text = text + + my_text = self._FontObj.render(self._Text,True,self._Color) + self._Width = my_text.get_width() + self._Height = my_text.get_height() + + + def SetCanvasHWND(self,_canvashwnd): + self._CanvasHWND = _canvashwnd + + def DrawCenter(self,bold=False): + self._FontObj.set_bold(bold) ## avoing same font tangling set_bold to others + my_text = self._FontObj.render( self._Text,True,self._Color) + self._CanvasHWND.blit(my_text,midRect(self._PosX,self._PosY,self._Width,self._Height,Width,Height)) + + def Draw(self,bold=False): + self._FontObj.set_bold(bold) ## avoing same font tangling set_bold to others + my_text = self._FontObj.render( self._Text,True,self._Color) + + self._CanvasHWND.blit(my_text,(self._PosX,self._PosY,self._Width,self._Height)) diff --git a/sys.py/UI/lang_manager.py b/sys.py/UI/lang_manager.py new file mode 100644 index 0000000..e0ffce0 --- /dev/null +++ b/sys.py/UI/lang_manager.py @@ -0,0 +1,117 @@ +# -*- coding: utf-8 -*- +import os +import pygame +import config +import ConfigParser +from skin_manager import MySkinManager +from util_funcs import FileExists + +class CaseConfigParser(ConfigParser.SafeConfigParser): + def optionxform(self, optionstr): + return optionstr + +class LangManager(object): + """ + """ + + _Langs = {} + _Config = None + _ConfigFileName = "00_English.ini" ## double % to escape + _CJKMode = False + + def __init__(self): + self.Init() + + def Init(self): + if not self._Langs: + self.SetLangs() + + def UpdateLang(self): + self._Langs = {} + self.SetLangs() + + def IsCJKMode(self):## in MultiLabel, latins seped by white spaces,CJK no needs for that + latins = ["English"] + self._CJKMode = True + + for i in latins: + if i in self._ConfigFileName: + self._CJKMode= False + break + + return self._CJKMode + + def SetLangs(self): + self._Config = CaseConfigParser() + #print("SetLangs") + fname = ".lang" + + try: + with open(fname, "r") as f: + self._ConfigFileName = f.read() + self._ConfigFileName = self._ConfigFileName.strip("\r\n ") + #print(self._ConfigFileName) + except: + os.system("touch .lang") + print("read lang failed") + None + + + if self._ConfigFileName == "" or FileExists("langs/"+self._ConfigFileName) == False: + #print("miss file") + self._ConfigFileName = "00_English.ini" + else: + pass + #print("has file",self._ConfigFileName) + + + try: + self._Config.read("langs/"+self._ConfigFileName) + except Exception, e: + print("read lang ini error %s" % str(e)) + return + else: + if "Langs" in self._Config.sections(): + lang_opts = self._Config.options("Langs") + for i in lang_opts: + try: + self._Langs[i] = self._Config.get("Langs", i) + except Exception, e: + print("error %s" % str(e)) + continue + + def Tr(self,english_key_str): + #print("english_key_str", english_key_str) + if english_key_str in self._Langs: + #print( self._Langs[english_key_str] ) + return self._Langs[english_key_str].decode("utf8") + else: + return english_key_str + + def TrFont(self,orig_font_str): + try: + font_size_number = int(filter(str.isdigit, orig_font_str)) + except TypeError: + font_size_number = int(filter(unicode.isdigit, orig_font_str)) + if font_size_number > 120: + raise Exception('font string format error') + + if "English.ini" in self._ConfigFileName: + return MySkinManager.GiveFont(orig_font_str) + else: + if font_size_number > 28: + # raise Exception('cjk font string format error '+ str(font_size_number)) + return MySkinManager.GiveFont(orig_font_str) + else: + return MySkinManager.GiveFont("notosanscjk%d" % font_size_number) + +##global MyLangManager Handler +MyLangManager = None + +def InitMyLangManager(): + global MyLangManager + if MyLangManager == None: + MyLangManager = LangManager() + + +InitMyLangManager() diff --git a/sys.py/UI/main_screen.py b/sys.py/UI/main_screen.py new file mode 100644 index 0000000..27891ee --- /dev/null +++ b/sys.py/UI/main_screen.py @@ -0,0 +1,664 @@ +# -*- coding: utf-8 -*- + +import pygame +from pygame.locals import * +from sys import exit +import os +import sys +import json +from operator import itemgetter + +from libs import easing +from datetime import datetime + +from beeprint import pp + +## local package import +from constants import ICON_TYPES,icon_ext,icon_width,icon_height,RUNEVT +from icon_item import IconItem +from page import Page,PageStack +from title_bar import TitleBar +from foot_bar import FootBar +from constants import Width,Height +from util_funcs import midRect,FileExists,ReplaceSuffix,ReadTheFileContent,CmdClean,MakeExecutable +from keys_def import CurKeys +from label import Label +from untitled_icon import UntitledIcon +from Emulator import MyEmulator +from CommercialSoftwarePackage import MyCommercialSoftwarePackage + +from skin_manager import MySkinManager +from lang_manager import MyLangManager +from widget import Widget + +from counter_screen import CounterScreen + +class MessageBox(Label): + _Parent = None + + def __init__(self): + pass + + def Init(self,text,font_obj,color=MySkinManager.GiveColor('Text')): + self._Color = color + self._FontObj = font_obj + self._Text = text + + self._Width = 0 + self._Height = 0 + self._CanvasHWND = pygame.Surface( ( int(self._Parent._Width),int(self._Parent._Height))) + self._HWND = self._Parent._CanvasHWND + + def SetText(self,text): + self._Text = MyLangManager.Tr(text) + + def PreDraw(self): + self._Width = 0 + self._Height = 0 + self._CanvasHWND.fill(MySkinManager.GiveColor('White')) + + words = self._Text.split(' ') + space = self._FontObj.size(' ')[0] + max_width = self._Parent._Width-40 + x ,y = (0,0) + row_total_width = 0 + lines = 0 + + for word in words: + word_surface = self._FontObj.render(word, True, self._Color) + word_width = word_surface.get_width() + word_height = word_surface.get_height() + row_total_width += word_width + if lines == 0: + lines += word_height + if row_total_width+space >= max_width: + x = 0 # Reset the x. + y += word_height # Start on new row. + row_total_width = word_width + + lines += word_height + + self._CanvasHWND.blit(word_surface, (x, y)) + + if len(words) == 1: # single line + x += word_width + else: + x += word_width + space + + if x > self._Width: + self._Width = x + + if lines >= (self._Parent._Height - 40): + break + + self._Height = lines + + def DrawWith(self, x_,y_, withborder): + + self.PreDraw() + + x_ = x_ - self._Width/2 + y_ = y_ - self._Height/2 + + padding = 5 + + pygame.draw.rect(self._HWND,MySkinManager.GiveColor('White'),(x_-padding,y_-padding, self._Width+padding*2,self._Height+padding*2)) + + if self._HWND != None: + rect = pygame.Rect(x_,y_,self._Width,self._Height) + self._HWND.blit(self._CanvasHWND,rect,(0,0,self._Width,self._Height)) + #self._HWND.blit(self._CanvasHWND,rect) + + if withborder == True: + pygame.draw.rect(self._HWND,MySkinManager.GiveColor('Black'),(x_-padding,y_-padding, self._Width+padding*2,self._Height+padding*2),1) + + def Draw(self): + x = (self._Parent._Width)/2 + y = (self._Parent._Height)/2 + + self.DrawWith(x,y,True) + + +python_package_flag = "__init__.py" +emulator_flag = "action.config" +commercialsoftware_flag = "compkginfo.json" + +##Abstract object for manage Pages ,not the pygame's physic screen +class MainScreen(Widget): + _Pages = [] + _PageMax = 0 + _PageIndex = 0 + _PosY = TitleBar._BarHeight+1 + _Width = Width + _Height = Height -FootBar._BarHeight -TitleBar._BarHeight + _MyPageStack = None + _CurrentPage = None # pointer to the current displaying Page Class + _CanvasHWND = None + _HWND = None + _TitleBar = None + _FootBar = None + _MsgBox = None + _MsgBoxFont = MyLangManager.TrFont("veramono20") + _IconFont = MyLangManager.TrFont("varela15") + _SkinManager = None + + _Closed = False + _CounterScreen = None + + _LastKey = -1 + _LastKeyDown = -1 + + def __init__(self): + self._Pages = [] + self._MyPageStack = PageStack() + + def Init(self): + self._CanvasHWND = pygame.Surface((self._Width,self._Height)) + self._MsgBox= MessageBox() + self._MsgBox._Parent= self + self._MsgBox.Init(" ", self._MsgBoxFont) + + self._SkinManager = MySkinManager + + self._CounterScreen = CounterScreen() + self._CounterScreen._HWND = self._HWND + + self._CounterScreen.Init() + + + def FartherPages(self): + self._PageMax = len(self._Pages) + for i in range(0,self._PageMax): + self._Pages[i]._Index = i + self._Pages[i]._CanvasHWND = self._CanvasHWND + self._Pages[i]._IconNumbers = len(self._Pages[i]._Icons) + self._Pages[i]._Screen = self + self._Pages[i].Adjust() + + if self._Pages[i]._IconNumbers > 1: + self._Pages[i]._PsIndex = 1 + self._Pages[i]._IconIndex = self._Pages[i]._PsIndex + + + self._CurrentPage = self._Pages[self._PageIndex] + self._CurrentPage._OnShow = True + + def GetMyRightSidePage(self): + ret = self._PageIndex +1 + if ret > (self._PageMax -1): + ret = self._PageMax -1 + return ret + + def PageMoveLeft(self): + self._Pages[self._PageIndex]._OnShow = False + if self._PageIndex < (self._PageMax - 1): + my_right_side_page = self.GetMyRightSidePage() + for i in range(0,self._PageMax): + if i!= self._PageIndex and i != my_right_side_page: + self._Pages[i].MoveLeft(Width) + + self._Pages[self._PageIndex].EasingLeft(Width) + + if self._PageIndex != my_right_side_page: + self._Pages[my_right_side_page].EasingLeft(Width) + + self._Pages[self._PageIndex].ResetPageSelector() + + self._PageIndex+=1 + if self._PageIndex > (self._PageMax -1): + self._PageIndex = (self._PageMax -1) + + self._Pages[self._PageIndex]._OnShow = True + self._CurrentPage = self._Pages[self._PageIndex] + + def GetMyLeftSidePage(self): + ret = self._PageIndex -1 + if ret < 0: + ret = 0 + return ret + + def PageMoveRight(self): + self._Pages[self._PageIndex]._OnShow = False + if self._PageIndex > 0: + my_left_side_page = self.GetMyLeftSidePage() + for i in range(0,self._PageMax): + if i!= self._PageIndex and i!= my_left_side_page: + pass + #self._Pages[i].MoveRight(Width) + + self._Pages[self._PageIndex].EasingRight(Width) + + if self._PageIndex != my_left_side_page: + self._Pages[my_left_side_page].EasingRight(Width) + + self._Pages[self._PageIndex].ResetPageSelector() + + self._PageIndex-=1 + if self._PageIndex < 0: + self._PageIndex = 0 + + self._Pages[self._PageIndex]._OnShow = True + self._CurrentPage = self._Pages[self._PageIndex] + + + def EasingAllPageLeft(self): + current_time = 0.0 + start_posx = 0.0 + current_posx = start_posx + final_posx = float(Width) + posx_init = 0 + dur = 30 + last_posx = 0.0 + all_last_posx = [] + if self._PageIndex >= (self._PageMax - 1): + return + for i in range(0,Width*dur): + current_posx = easing.SineIn(current_time,start_posx,final_posx-start_posx,float(dur)) + if current_posx >= final_posx: + current_posx = final_posx + + dx = current_posx - last_posx + all_last_posx.append(int(dx)) + current_time+=1 + last_posx = current_posx + if current_posx >= final_posx: + break + + c = 0 + for i in all_last_posx: + c+=i + if c < final_posx - start_posx: + all_last_posx.append( final_posx - c ) + + for i in all_last_posx: + self.ClearCanvas() + for j in self._Pages: + j._PosX -= i + j.DrawIcons() + j._Screen.SwapAndShow() + + + self._Pages[self._PageIndex]._OnShow = False + + self._PageIndex+=1 + if self._PageIndex > (self._PageMax -1): + self._PageIndex = (self._PageMax -1) + + self._Pages[self._PageIndex]._OnShow = True + self._CurrentPage = self._Pages[self._PageIndex] + + def EasingAllPageRight(self): + current_time = 0.0 + start_posx = 0.0 + current_posx = start_posx + final_posx = float(Width) + posx_init = 0 + dur = 30 + last_posx = 0.0 + all_last_posx = [] + if self._PageIndex <= 0: + return + for i in range(0,Width*dur): + current_posx = easing.SineIn(current_time,start_posx,final_posx-start_posx,float(dur)) + if current_posx >= final_posx: + current_posx = final_posx + + dx = current_posx - last_posx + all_last_posx.append(int(dx)) + current_time+=1 + last_posx = current_posx + if current_posx >= final_posx: + break + + c = 0 + for i in all_last_posx: + c+=i + if c < final_posx - start_posx: + all_last_posx.append( final_posx - c ) + + for i in all_last_posx: + self.ClearCanvas() + for j in reversed(self._Pages): + j._PosX += i + j.DrawIcons() + j._Screen.SwapAndShow() + + + self._Pages[self._PageIndex]._OnShow = False + + self._PageIndex-=1 + if self._PageIndex < 0: + self._PageIndex = 0 + + self._Pages[self._PageIndex]._OnShow = True + self._CurrentPage = self._Pages[self._PageIndex] + + def CurPage(self): + return self._CurrentPage + + def PushCurPage(self): + self._MyPageStack.Push(self._CurrentPage) + + def SetCurPage(self,page): + self._CurrentPage = page + on_load_cb = getattr(self._CurrentPage,"OnLoadCb",None) + if on_load_cb != None: + if callable( on_load_cb ): + self._CurrentPage.OnLoadCb() + + def PushPage(self,page): + self.PushCurPage() + self.SetCurPage(page) + + def AppendPage(self,Page): + self._Pages.append(Page) + + def ClearCanvas(self): + self._CanvasHWND.fill(self._SkinManager.GiveColor('White')) + + def SwapAndShow(self): + if self._Closed == True: + return + if self._HWND != None: + self._HWND.blit(self._CanvasHWND,(self._PosX,self._PosY,self._Width,self._Height)) + pygame.display.update() + + def ExtraName(self,name): + ## extra name like 1_xxx to be => xxx, + parts = name.split("_") + if len(parts) > 1: + return parts[1] + elif len(parts) == 1: + return parts[0] + else: + return name + + def IsExecPackage(self,dirname): + files = os.listdir(dirname) + bname = os.path.basename(dirname) + bname = self.ExtraName(bname) + for i in sorted(files): + if i == bname+".sh": + return True + return False + + def IsEmulatorPackage(self,dirname): + files = os.listdir(dirname) + for i in sorted(files): + if i.endswith(emulator_flag): + return True + return False + + def IsCommercialPackage(self,dirname): + files = os.listdir(dirname) + for i in sorted(files): + if i.endswith(commercialsoftware_flag): + return True + return False + + def IsPythonPackage(self,dirname): + files = os.listdir(dirname) + for i in sorted(files): + if i.endswith(python_package_flag): + return True + return False + + def ReunionPagesIcons(self): #This is for combining /home/cpi/apps/Menu and ~/launcher/Menu/GameShell + for p in self._Pages: + tmp = [] + for i,x in enumerate(p._Icons): + tup = ('',0) + if hasattr(x, '_FileName'): + if str.find(x._FileName,"_") < 0: + tup = ("98_"+x._FileName,i) # prefer to maintain PowerOFF in last position if the filename has no order labels + else: + tup = (x._FileName, i) + else: + tup = ("",i) + + tmp.append(tup) + tmp = sorted(tmp, key=itemgetter(0)) + + retro_games_idx = [] + retro_games_dir = "20_Retro Games" + for i,x in enumerate(tmp): + if retro_games_dir in x[0]: + retro_games_idx.append(x[1]) + + if len(retro_games_idx) > 1: + for i in range(1,len(retro_games_idx)): + p._Icons[retro_games_idx[0]]._LinkPage._Icons.extend( p._Icons[retro_games_idx[i]]._LinkPage._Icons) ### assumes the folder of ~/apps/Menu/20_Retro Games is legalzip","sfc"], + + + tmp_swap = [] + for i, x in enumerate(tmp): + if retro_games_dir not in x[0]: + tmp_swap.append(x) + if retro_games_dir in x[0] and i == retro_games_idx[0]: + tmp_swap.append(x) + + tmp = tmp_swap + + #print(tmp) + new_icons = [] + for x in tmp: + new_icons.append( p._Icons[ x[1] ] ) + p._Icons = new_icons + + + def ReadTheDirIntoPages(self,_dir,pglevel,cur_page): + global commercialsoftware_flag + + if FileExists(_dir) == False and os.path.isdir(_dir) == False: + return + + files = os.listdir(_dir) + for i in sorted(files): + if os.path.isdir(_dir+"/"+i) and i.startswith(".") == False: # TOPLEVEL only is dir + if pglevel == 0: + page = Page() + page._Name = self.ExtraName(i) + page._Icons = [] + self._Pages.append(page) + self.ReadTheDirIntoPages(_dir+"/"+i, pglevel+1 ,self._Pages[ len(self._Pages) -1]) + else: ## On CurPage now + i2 = self.ExtraName(i) + iconitem = IconItem() + iconitem._FileName = i + iconitem._CmdPath = "" + iconitem.AddLabel(MyLangManager.Tr(i2),self._IconFont) + if FileExists( _dir+"/"+i+"/"+i2+".png"): ### 20_Prog/Prog.png , cut 20_ + iconitem._ImageName = _dir+"/"+i+"/"+i2+".png" + elif FileExists( MySkinManager.GiveIcon(_dir+"/"+i2+".png") ): + iconitem._ImageName = MySkinManager.GiveIcon(_dir+"/"+i2+".png") + else: + untitled = UntitledIcon() + untitled.Init() + if len(i2) > 1: + untitled.SetWords(i2[:2]) + elif len(i2) == 1: + untitled.SetWords([i2[0],i2[0]]) + else: + untitled.SetWords(["G","s"]) + + iconitem._ImgSurf = untitled.Surface() + iconitem._ImageName = "" + + if self.IsPythonPackage(_dir+"/"+i): + iconitem._MyType = ICON_TYPES["FUNC"] + sys.path.append(_dir) + iconitem._CmdPath = __import__(i) + init_cb = getattr(iconitem._CmdPath,"Init",None) + if init_cb != None: + if callable(init_cb): + iconitem._CmdPath.Init(self) + cur_page._Icons.append(iconitem) + + elif self.IsEmulatorPackage(_dir+"/"+i): + obj = {} + obj["ROM"] = "" + obj["ROM_SO"] ="" + obj["EXT"] = [] + obj["EXCLUDE"] = [] + obj["FILETYPE"] = "file" + obj["LAUNCHER"] = "" + obj["TITLE"] = "Game" + obj["SO_URL"] = "" + obj["RETRO_CONFIG"] = "" ## + try: + f = open(_dir+"/"+i+"/"+emulator_flag) + except IOError: + print("action config open failed") + return + else: + with f: + content = f.readlines() + content = [x.strip() for x in content] + for c in content: + pis = c.split("=") + if len(pis) > 1: + if "EXT" in pis[0]: + obj[pis[0]] = pis[1].split(",") + elif "EXCLUDE" in pis[0]: + obj[pis[0]] = pis[1].split(",") + else: + obj[pis[0]] = pis[1] + + if FileExists(_dir+"/"+i+"/retroarch-local.cfg"): + obj["RETRO_CONFIG"] = CmdClean(os.path.abspath( _dir+"/"+i+"/retroarch-local.cfg" )) + print("a local retroarch cfg:", obj["RETRO_CONFIG"]) + + em = MyEmulator() + em._Emulator = obj + + em.Init(self) + iconitem._CmdPath = em + iconitem._MyType = ICON_TYPES["Emulator"] + cur_page._Icons.append(iconitem) + + elif self.IsCommercialPackage( os.path.join(_dir,i)): + data = None + em = MyCommercialSoftwarePackage() + + with open(os.path.join(_dir,i) +"/"+commercialsoftware_flag) as f: + data = json.load(f) + + if FileExists( _dir+"/"+i+"/.done"): + print(_dir+"/"+i+"/.done") + em._Done = os.path.realpath(_dir+"/"+i+"/"+i2+".sh") + em._ComPkgInfo = data + else: + em._ComPkgInfo = data + em._Done = "" + + em._InvokeDir = os.path.realpath( os.path.join(_dir,i)) + em.Init(self) + + iconitem._CmdPath = em + iconitem._MyType = ICON_TYPES["Commercial"] + cur_page._Icons.append(iconitem) + + elif self.IsExecPackage(_dir+"/"+i): ## ExecPackage is the last one to check + iconitem._MyType = ICON_TYPES["EXE"] + iconitem._CmdPath = os.path.realpath(_dir+"/"+i+"/"+i2+".sh") + MakeExecutable(iconitem._CmdPath) + cur_page._Icons.append(iconitem) + else: + iconitem._MyType = ICON_TYPES["DIR"] + iconitem._LinkPage = Page() + iconitem._LinkPage._Name = i2 + cur_page._Icons.append(iconitem) + self.ReadTheDirIntoPages(_dir+"/"+i,pglevel+1,iconitem._LinkPage) + + elif os.path.isfile(_dir+"/"+i) and i.startswith(".") == False and pglevel > 0: + if i.lower().endswith(icon_ext): + i2 = self.ExtraName(i) + + #cmd = ReadTheFileContent(_dir+"/"+i) + iconitem = IconItem() + iconitem._FileName = i + iconitem._CmdPath = os.path.realpath(_dir+"/"+i) + MakeExecutable(iconitem._CmdPath) + iconitem._MyType = ICON_TYPES["EXE"] + if FileExists( MySkinManager.GiveIcon( _dir+"/"+ReplaceSuffix(i2,"png"))): + iconitem._ImageName = MySkinManager.GiveIcon(_dir+"/"+ReplaceSuffix(i2,"png")) + else: + untitled = UntitledIcon() + untitled.Init() + if len(i2) > 1: + untitled.SetWords(i2[:2]) + elif len(i2) == 1: + untitled.SetWords([i2[0],i2[0]]) + else: + untitled.SetWords(["G","s"]) + + iconitem._ImgSurf = untitled.Surface() + + iconitem._ImageName = "" + + iconitem.AddLabel(MyLangManager.Tr(i2.split(".")[0]),self._IconFont) + iconitem._LinkPage = None + cur_page._Icons.append(iconitem) + + def RunEXE(self,cmdpath): + self.DrawRun() + self.SwapAndShow() + pygame.time.delay(1000) + cmdpath = cmdpath.strip() + cmdpath = CmdClean(cmdpath) + pygame.event.post( pygame.event.Event(RUNEVT, message=cmdpath)) + + def OnExitCb(self,event): + ## leave rest to Pages + on_exit_cb = getattr(self._CurrentPage,"OnExitCb",None) + if on_exit_cb != None: + if callable( on_exit_cb ): + self._CurrentPage.OnExitCb(event) + return + + def KeyDown(self,event): + """ + if event.key == pygame.K_PAGEUP: + self.EasingAllPageLeft() + #self.SwapAndShow() + if event.key == pygame.K_PAGEDOWN: + self.EasingAllPageRight() + #self.SwapAndShow() + """ + + if event.key == pygame.K_t: + self.DrawRun() + self.SwapAndShow() + + """ + if event.key == CurKeys["Space"]: + self._CounterScreen.Draw() + self._CounterScreen.SwapAndShow() + self._CounterScreen.StartCounter() + """ + ## leave rest to Pages + current_page_key_down_cb = getattr(self._CurrentPage,"KeyDown",None) + if current_page_key_down_cb != None: + if callable( current_page_key_down_cb ): + self._CurrentPage.KeyDown(event) + + self._LastKey = event.key + + def DrawRun(self): + self._MsgBox.SetText(MyLangManager.Tr("Launching")) + self._MsgBox.Draw() + + def Draw(self): + if self._Closed == True: + return + + self._CurrentPage.Draw() + #if self._HWND != None: + # self._HWND.blit(self._CanvasHWND,(self._PosX,self._PosY,self._Width,self._Height)) + if self._TitleBar != None: + self._TitleBar.Draw(self._CurrentPage._Name) + if self._FootBar != None: + if hasattr(self._CurrentPage,"_FootMsg"): + self._FootBar.SetLabelTexts(self._CurrentPage._FootMsg) + self._FootBar.Draw() + diff --git a/sys.py/UI/multi_icon_item.py b/sys.py/UI/multi_icon_item.py new file mode 100644 index 0000000..9400b46 --- /dev/null +++ b/sys.py/UI/multi_icon_item.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- + +import pygame +#from beeprint import pp + +## local import +from constants import icon_width,icon_height,ICON_TYPES,ALIGN,icon_ext,Width,Height +from util_funcs import color_surface,midRect +from label import Label +from icon_item import IconItem + +##Resource file contains multi icons in single image +##usually the Image contains icons in Vertical, convert 1.png 2.png 3.png -append out.png + +class MultiIconItem(IconItem): + _IconWidth=18 + _IconHeight=18 + _IconIndex = 0 # icon index on the resource Image + + def CreateImageSurf(self): + if self._ImgSurf == None and self._ImageName != "": +# print(self._ImageName) + self._ImgSurf = pygame.image.load( self._ImageName ).convert_alpha() + + + def DrawTopLeft(self): + if self._Align==ALIGN["VCenter"]: #default + if self._Label != None: + self._Label._PosX = self._PosX - self._Label._Width/2 + self._Parent._PosX + self._Label._PosY = self._PosY + self._Height/2 +6 + self._Parent._PosY + + elif self._Align ==ALIGN["HLeft"]: + if self._Label != None: + self._Label._PosX = self._PosX + self._Width/2 + 3 + self._Parent._PosX + self._Label._PosY = self._PosY - self._Label._Height/2 + self._Parent._PosY + + if self._Label!=None: + self._Label.Draw() + + + if self._ImgSurf != None: + self._Parent._CanvasHWND.blit(self._ImgSurf,pygame.Rect(self._PosX+self._Parent._PosX, + self._PosY+self._Parent._PosY, + self._Width,self._Height), + (0,self._IconIndex*self._IconHeight,self._IconWidth,self._IconHeight)) + + def DrawRect(self,rect1,rect2): + if self._ImgSurf != None: + self._Parent._CanvasHWND.blit(self._ImgSurf,rect1,rect2) + + def Draw(self): + if self._Align==ALIGN["VCenter"]: #default + if self._Label != None: + self._Label._PosX = self._PosX - self._Label._Width/2 + self._Parent._PosX + self._Label._PosY = self._PosY + self._Height/2 +6 + self._Parent._PosY + + elif self._Align ==ALIGN["HLeft"]: + if self._Label != None: + self._Label._PosX = self._PosX + self._Width/2 + 3 + self._Parent._PosX + self._Label._PosY = self._PosY - self._Label._Height/2 + self._Parent._PosY + + if self._Label!=None: + self._Label.Draw() + + + if self._ImgSurf != None: + self._Parent._CanvasHWND.blit(self._ImgSurf,midRect(self._PosX+self._Parent._PosX, + self._PosY+self._Parent._PosY, + self._Width,self._Height,Width,Height), + (0,self._IconIndex*self._IconHeight,self._IconWidth,self._IconHeight)) + diff --git a/sys.py/UI/multilabel.py b/sys.py/UI/multilabel.py new file mode 100644 index 0000000..c955ea0 --- /dev/null +++ b/sys.py/UI/multilabel.py @@ -0,0 +1,92 @@ +# -*- coding: utf-8 -*- + +import pygame + +from skin_manager import MySkinManager +from lang_manager import MyLangManager +from widget import Widget + +class MultiLabel(Widget): ##Multi Line Label + _Width=135 + _Height=100 + _Text="" + _FontObj=None + _Color = MySkinManager.GiveColor('Text') + _CanvasHWND = None + _TextSurf = None + _MaxWidth = 0 + + def __init__(self): + pass + + def Init(self,text,font_obj,color=MySkinManager.GiveColor('Text')): + self._Color = color + self._FontObj = font_obj + self._Text = text + + self.blit_text(self._CanvasHWND,self._Text,(self._PosX,self._PosY),self._FontObj) + + + def SetColor(self,color): + self._Color = color + + def GetText(self): + return self._Text + + def SetText(self,text): + self._Text = text + + self.blit_text(self._CanvasHWND,self._Text,(self._PosX,self._PosY),self._FontObj) + + def SetCanvasHWND(self,_canvashwnd): + self._CanvasHWND = _canvashwnd + + def blit_text(self, surface,text, pos, font): + iscjk = MyLangManager.IsCJKMode() + + color = self._Color + words = [word.split(' ') for word in text.splitlines()] + space = font.size(' ')[0] + + if iscjk: + space = 0 + words = [list(word.decode("utf8")) for word in text.splitlines()] + + max_width = self._Width + x ,y = pos + row_total_width = 0 + lines = 0 + line_max = 12 + row_max = 4 + if iscjk: + line_max = line_max*2 + + for i,line in enumerate(words[:row_max]): + for word in line[:line_max]: + word_surface = font.render(word, True, color) + word_width = word_surface.get_width() + word_height = word_surface.get_height() + row_total_width += word_width + if row_total_width+space >= max_width: + x = pos[0] # Reset the x. + y += word_height # Start on new row. + row_total_width = word_width + + if lines == 0: + lines += word_height + else: + lines += word_height + + surface.blit(word_surface, (x, y)) + x += word_width + space + x = pos[0] # Reset the x. + y += word_height # Start on new row. + lines += word_height + self._Height = lines + + + def Draw(self): + #my_text = self._FontObj.render( self._Text,True,self._Color) + self.blit_text(self._CanvasHWND,self._Text,(self._PosX,self._PosY),self._FontObj) + #pygame.draw.rect(self._CanvasHWND,(83,83,83), (self._PosX,self._PosY,self._Width,self._Height) , 1 ) + #self._CanvasHWND.blit(my_text,(self._PosX,self._PosY,self._Width,self._Height)) diff --git a/sys.py/UI/page.py b/sys.py/UI/page.py new file mode 100644 index 0000000..9816150 --- /dev/null +++ b/sys.py/UI/page.py @@ -0,0 +1,675 @@ +# -*- coding: utf-8 -*- + +import pygame +from pygame.locals import * +from sys import exit +import os +import sys +import math +import fnmatch +import random + + +from libs import easing + +# import base64 +# from beeprint import pp + +# local import +from constants import ALIGN, icon_width, icon_height, Width, Height, ICON_TYPES +from util_funcs import midRect,FileExists +from keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB +from icon_pool import MyIconPool +from lang_manager import MyLangManager +from widget import Widget +import config + +class PageStack: + def __init__(self): + self.stack = list() + + def Push(self, data): + if data not in self.stack: + self.stack.append(data) + return True + return False + + def Pop(self): + if len(self.stack) <= 0: + return None, False + return self.stack.pop(), True + + def Length(self): + return len(self.stack) + + +class PageSelector(Widget): + + _Parent = None + _Alpha = 0 + _OnShow = True + _IconSurf = None + + def __init__(self): + pass + + def Init(self, x, y, w, h, alpha): + self._PosX = x + self._PosY = y + self._Width = w + self._Height = h + self._Alpha = alpha + + def Adjust(self, x, y, w, h, alpha): + self._PosX = x + self._PosY = y + self._Width = w + self._Height = h + self._Alpha = alpha + + def Draw(self): + canvas = self._Parent._CanvasHWND + idx = self._Parent._PsIndex + iconidx = self._Parent._IconIndex + + if idx < len(self._Parent._Icons): + x = self._Parent._Icons[idx]._PosX+self._Parent._PosX + # only use current icon's PosY + y = self._Parent._Icons[iconidx]._PosY + + rect = midRect(x, y, self._Width, self._Height, + self._Parent._Width, self._Parent._Height) + if rect.width <= 0 or rect.height <= 0: + return + + # color = (244,197,66,50) + # pygame.draw.rect(canvas,color,rect,1) + if self._IconSurf != None: + self._Parent._CanvasHWND.blit(self._IconSurf, rect) + + +class Page(Widget): + _Icons = [] + _Ps = None + _PsIndex = 0 + _IconNumbers = 0 + _IconIndex = 0 # shows which icon current selected, the Selector can not move here + _PrevIconIndex = 0 # for remember the Highlighted Icon ,restore it's PosY to average + _Index = 0 + _Align = ALIGN["SLeft"] + _CanvasHWND = None + _HWND = None + _OnShow = False + _Name = "" + _Screen = None # Should be the Screen Class + _PageIconMargin = 20 + _FootMsg = ["Nav", "", "", "", "Enter"] # Default Page Foot info + _Wallpaper = None + _SelectedIconTopOffset = 20 + _EasingDur = 30 + _Padding = pygame.Rect(0, 0, 0, 0) # x,y,w,h + _Margin = pygame.Rect(0, 0, 0, 0) + _ScrollStep = 1 + + def __init__(self): + self._Icons = [] + ## so every theme can have a background.png for displaying as the background of the launcher,except the topbar and footbar + ## https://forum.clockworkpi.com/t/give-your-gs-a-custom-wallpaper/3724 + bg_img_path = config.SKIN+"/background.png" + + if FileExists(bg_img_path): + self._Wallpaper = pygame.transform.scale(pygame.image.load(bg_img_path).convert(), (320,240)) + + def AdjustHLeftAlign(self): ## adjust coordinator and append the PageSelector + self._PosX = self._Index*self._Screen._Width + self._Width = self._Screen._Width + self._Height = self._Screen._Height + + cols = int(Width /icon_width) + rows = int( (self._IconNumbers * icon_width)/Width + 1) + if rows < 1: + rows = 1 + + cnt = 0 + + for i in range(0,rows): + for j in range(0,cols): + start_x = icon_width/2 + j*icon_width + start_y = icon_height/2 + i*icon_height + icon = self._Icons[cnt] + icon.Adjust(start_x,start_y,icon_width-4,icon_height-4,0) + icon._Index = cnt + icon._Parent = self + if cnt >= (self._IconNumbers -1): + break + cnt+=1 + + ps = PageSelector() + ps._IconSurf = MyIconPool.GiveIconSurface("blueselector") + ps._Parent = self + ps.Init(icon_width/2, TitleBar._BarHeight+icon_height/2,92,92,128) + self._Ps = ps + self._PsIndex = 0 + self._OnShow = False + + + def AdjustSLeftAlign(self): ## adjust coordinator and append the PageSelector + self._PosX = self._Index*self._Screen._Width + self._Width = self._Screen._Width + self._Height = self._Screen._Height + + start_x = (self._PageIconMargin + icon_width+self._PageIconMargin) /2 + start_y = self._Height/2 + + for i in range(0,self._IconNumbers): + it = self._Icons[i] + it._Parent = self + it._Index = i + it.Adjust(start_x+i*self._PageIconMargin+i*icon_width,start_y,icon_width-6,icon_height-6,0) + it._ImgSurf = pygame.transform.smoothscale(it._ImgSurf,(it._Width,it._Height)) + + ps = PageSelector() + ps._IconSurf = MyIconPool.GiveIconSurface("blueselector") + ps._Parent = self + ps.Init(start_x,start_y,92,92,128) + + self._Ps = ps + self._PsIndex = 0 + self._OnShow = False + + if self._IconNumbers > 1: + self._PsIndex = 1 + self._IconIndex = self._PsIndex + self._PrevIconIndex = self._IconIndex + self._Icons[self._IconIndex]._PosY -= self._SelectedIconTopOffset + + def AdjustSAutoLeftAlign(self): ## adjust coordinator and append the PageSelector + self._PosX = self._Index*self._Screen._Width + self._Width = self._Screen._Width + self._Height = self._Screen._Height + + start_x = (self._PageIconMargin + icon_width+self._PageIconMargin) /2 + start_y = self._Height/2 + + if self._IconNumbers == 1: + start_x = self._Width / 2 + start_y = self._Height/2 + + it = self._Icons[0] + it._Parent = self + it._Index = 0 + it.Adjust(start_x,start_y,icon_width,icon_height,0) + # it._ImgSurf = pygame.transform.smoothscale(it._ImgSurf,(it._Width,it._Height)) + + elif self._IconNumbers == 2: + start_x = (self._Width - self._PageIconMargin - self._IconNumbers*icon_width) / 2 + icon_width/2 + start_y = self._Height /2 + + for i in range(0,self._IconNumbers): + it = self._Icons[i] + it._Parent = self + it._Index = i + it.Adjust(start_x+i*self._PageIconMargin + i*icon_width,start_y, icon_width, icon_height,0) + # it._ImgSurf = pygame.transform.smoothscale(it._ImgSurf,(it._Width,it._Height)) + + elif self._IconNumbers > 2: + for i in range(0,self._IconNumbers): + it = self._Icons[i] + it._Parent = self + it._Index = i + it.Adjust(start_x+i*self._PageIconMargin + i*icon_width,start_y,icon_width,icon_height,0) + # it._ImgSurf = pygame.transform.smoothscale(it._ImgSurf,(it._Width,it._Height)) + + ps = PageSelector() + ps._IconSurf = MyIconPool.GiveIconSurface("blueselector") + ps._Parent = self + ps.Init(start_x,start_y,92,92,128) + + self._Ps = ps + self._PsIndex = 0 + self._OnShow = False + + if self._IconNumbers > 1: + self._PsIndex = 1 + self._IconIndex = self._PsIndex + self._PrevIconIndex = self._IconIndex + self._Icons[self._IconIndex]._PosY -= self._SelectedIconTopOffset + + def InitLeftAlign(self): + self._PosX = self._Index*Width + self._Width = self._Screen._Width + self._Height = self._Screen._Height + + cols = int(self._Width /icon_width) + rows = int((self._IconNumbers * icon_width)/self._Width + 1) + if rows < 1: + rows = 1 + cnt = 0 + for i in range(0,rows): + for j in range(0,cols): + start_x = icon_width/2 + j*icon_width + start_y = TitleBar._BarHeight + icon_height/2 + i*icon_height + icon = IconItem() + icon.Init(start_x,start_y,icon_width-4,icon_height-4,0) + icon._Index = cnt + icon._Parent = self + self._Icons.append(icon) + if cnt >= (self._IconNumbers -1): + break + cnt+=1 + + ps = PageSelector() + ps._IconSurf = MyIconPool.GiveIconSurface("blueselector") + ps._Parent = self + ps.Init(icon_width/2,icon_height/2,92,92,128) + self._Ps = ps + self._PsIndex = 0 + self._OnShow = False + + def Adjust(self): ## default init way, + self._PosX = self._Index*self._Screen._Width + self._Width = self._Screen._Width ## equal to screen width + self._Height = self._Screen._Height + + if self._Align == ALIGN["HLeft"]: + start_x = (self._Width - self._IconNumbers*icon_width)/2 + icon_width/2 + start_y = self._Height/2 + + for i in range(0,self._IconNumbers): + it = self._Icons[i] + it._Parent = self + it._Index = i + it.Adjust(start_x+i*icon_width,start_y,icon_width,icon_height,0) + + ps = PageSelector() + ps._IconSurf = MyIconPool.GiveIconSurface("blueselector") + ps._Parent = self + ps.Init(start_x,start_y,92,92,128) + self._Ps = ps + self._PsIndex = 0 + self._OnShow = False + elif self._Align == ALIGN["SLeft"]: + start_x = (self._PageIconMargin + icon_width+self._PageIconMargin) /2 + start_y = self._Height/2 + + for i in range(0,self._IconNumbers): + it = self._Icons[i] + it._Parent = self + it._Index = i + it.Adjust(start_x+i*self._PageIconMargin+i*icon_width,start_y,icon_width,icon_height,0) + + + + ps = PageSelector() + ps._IconSurf = MyIconPool.GiveIconSurface("blueselector") + ps._Parent = self + ps.Init(start_x,start_y-self._SelectedIconTopOffset,92,92,128) + + self._Ps = ps + self._PsIndex = 0 + self._OnShow = False + + if self._IconNumbers > 1: + self._PsIndex = 1 + self._IconIndex = self._PsIndex + self._PrevIconIndex = self._IconIndex + self._Icons[self._IconIndex]._PosY -= self._SelectedIconTopOffset + + + def Init(self): ## default init way, + if self._Screen != None: + if self._Screen._CanvasHWND != None and self._CanvasHWND == None: + self._CanvasHWND = self._Screen._CanvasHWND + + self._PosX = self._Index*self._Screen._Width + self._Width = self._Screen._Width ## equal to screen width + self._Height = self._Screen._Height + + start_x = (self._Width - self._IconNumbers*icon_width)/2 + icon_width/2 + start_y = self._Height/2 + + for i in range(0,self._IconNumbers): + it = IconItem() + it._Parent = self + it._Index = i + it.Init(start_x+i*icon_width,start_y,icon_width,icon_height,0) + self._Icons.append(it) + + if self._IconNumbers > 0: + ps = PageSelector() + ps._IconSurf = MyIconPool.GiveIconSurface("blueselector") + ps._Parent = self + ps.Init(start_x,start_y,icon_width+4,icon_height+4,128) + self._Ps = ps + self._PsIndex = 0 + self._OnShow = False + + def IconStepMoveData(self,icon_eh,cuts):## no Sine,No curve,plain movement steps data + all_pieces = [] + piece = icon_eh / cuts + + c = 0.0 + prev = 0.0 + for i in range(0,cuts): + c+=piece + dx = c-prev + if dx < 0.5: + dx = 1.0 + + all_pieces.append( math.ceil(dx) ) + if c >= icon_eh: + break + + c = 0 + bidx = 0 + for i in all_pieces: + c+=i + bidx+=1 + if c >= icon_eh: + break + + all_pieces = all_pieces[0:bidx] + + if len(all_pieces) < cuts: + dff = cuts - len(all_pieces) + diffa = [] + for i in range(0,dff): + diffa.append(0) + all_pieces.extend( diffa) + + return all_pieces + + def EasingData(self,start,distance):##generate easing steps data + current_time = 0.0 + start_posx = 0.0 + current_posx = start_posx + final_posx = float(distance) + posx_init = start + dur = self._EasingDur + last_posx = 0.0 + all_last_posx = [] + for i in range(0,distance*dur): + current_posx = easing.SineIn(current_time,start_posx,final_posx-start_posx,float(dur)) + if current_posx >= final_posx: + current_posx = final_posx + + dx = current_posx - last_posx + all_last_posx.append(int(dx)) + current_time+=1 + last_posx = current_posx + if current_posx >= final_posx: + break + c = 0 + for i in all_last_posx: + c+=i + if c < final_posx -start_posx: + all_last_posx.append(final_posx - c) + + return all_last_posx + + def IconSmoothUp(self,icon_ew): + data = self.EasingData(self._PosX,icon_ew) + data2 = self.IconStepMoveData(self._SelectedIconTopOffset,len(data)) + + for i,v in enumerate(data): + + self.ClearCanvas() + + self._Icons[self._IconIndex]._PosY -= data2[i] + + if self._Icons[self._PrevIconIndex]._PosY < self._Height/2: + self._Icons[self._PrevIconIndex]._PosY+=data2[i] + + self.DrawIcons() + self._Screen.SwapAndShow() + + def IconsEasingLeft(self,icon_ew): + + data = self.EasingData(self._PosX,icon_ew) + data2 = self.IconStepMoveData(self._SelectedIconTopOffset,len(data)) + + for i,v in enumerate(data): + + self.ClearCanvas() + self._PosX -= v + + self._Icons[self._IconIndex]._PosY -= data2[i] + + if self._Icons[self._PrevIconIndex]._PosY < self._Height/2: + self._Icons[self._PrevIconIndex]._PosY+=data2[i] + self.DrawIcons() + self._Screen.SwapAndShow() + + def IconsEasingRight(self,icon_ew): + + data = self.EasingData(self._PosX,icon_ew) + data2 = self.IconStepMoveData(self._SelectedIconTopOffset,len(data)) + + for i,v in enumerate(data): + self.ClearCanvas() + self._PosX += v + + + self._Icons[self._IconIndex]._PosY-=data2[i] + + if self._Icons[self._PrevIconIndex]._PosY < self._Height/2: + self._Icons[self._PrevIconIndex]._PosY+=data2[i] + + self.DrawIcons() + self._Screen.SwapAndShow() + + def EasingLeft(self,ew): #ew int + + data = self.EasingData(self._PosX,ew) + + for i in data: + self._PosX -=i + self.Draw() + self._Screen.SwapAndShow() + + def EasingRight(self,ew): + + data = self.EasingData(self._PosX,ew) + + for i in data: + self._PosX += i + self.Draw() + self._Screen.SwapAndShow() + + def MoveLeft(self,ew): + self._PosX -= ew + def MoveRight(self,ew): + self._PosX += ew + + def ResetPageSelector(self): + self._PsIndex = 0 + self._IconIndex = 0 + self._Ps._OnShow = True + + def DrawPageSelector(self): + if self._Ps._OnShow == True: + self._Ps.Draw() + + def MoveIconIndexPrev(self): + self._PrevIconIndex = self._IconIndex + self._IconIndex-=1 + if self._IconIndex < 0: + self._IconIndex = max(0, self._IconNumbers - 1) # Wrap Icon Index + return False + return True + + def MoveIconIndexNext(self): + self._PrevIconIndex = self._IconIndex + self._IconIndex+=1 + if self._IconIndex > (self._IconNumbers - 1): + self._IconIndex = 0 # Wrap Icon Index + return False + return True + + def IconClick(self): + + if self._IconIndex > (len(self._Icons) -1): + return + + cur_icon = self._Icons[self._IconIndex] + if self._Ps._OnShow == False: + return + if cur_icon._MyType == ICON_TYPES["EXE"]: + print("IconClick: %s %d"%(cur_icon._CmdPath,cur_icon._Index)) + self._Screen.RunEXE(cur_icon._CmdPath) + + elif cur_icon._MyType == ICON_TYPES["DIR"]: + child_page = self._Icons[self._IconIndex]._LinkPage + if child_page != None: + child_page.Draw() + self._Screen._MyPageStack.Push(self._Screen._CurrentPage) + self._Screen._CurrentPage = child_page + elif cur_icon._MyType == ICON_TYPES["FUNC"]: + print("IconClick API: %d"%(cur_icon._Index)) + # print("%s"% cur_icon._CmdPath) + api_cb = getattr(cur_icon._CmdPath,"API",None) + if api_cb != None: + if callable(api_cb): + cur_icon._CmdPath.API(self._Screen) + elif cur_icon._MyType == ICON_TYPES["Emulator"] or cur_icon._MyType == ICON_TYPES["Commercial"]: + cur_icon._CmdPath.API(self._Screen) + + def ReturnToUpLevelPage(self): + pop_page,ok = self._Screen._MyPageStack.Pop() + if ok == True: + # self._Screen._CurrentPage.ResetPageSelector() + pop_page.Draw() + self._Screen._CurrentPage = pop_page + on_return_back_cb = getattr(self._Screen._CurrentPage,"OnReturnBackCb",None) + if on_return_back_cb != None: + if callable(on_return_back_cb): + self._Screen._CurrentPage.OnReturnBackCb() + else: + if self._Screen._MyPageStack.Length() == 0: + if len(self._Screen._Pages) > 0: + self._Screen._CurrentPage = self._Screen._Pages[self._Screen._PageIndex] + self._Screen._CurrentPage.Draw() + print("OnTopLevel ",self._Screen._PageIndex) + + def ClearCanvas(self): + if self._Wallpaper: + self._CanvasHWND.blit(self._Wallpaper,(0,0)) + else: + self._CanvasHWND.fill(self._Screen._SkinManager.GiveColor("White")) + + + def ClearIcons(self): + for i in range(0,self._IconNumbers): + self._Icons[i].Clear() + + def DrawIcons(self): + for i in range(0,self._IconNumbers): + self._Icons[i].Draw() + + # make sure the Class has the _MyList + def ScrollDown(self): + if len(self._MyList) == 0: + return + self._PsIndex +=1 + if self._PsIndex >= len(self._MyList): + self._PsIndex = len(self._MyList) -1 + + cur_li = self._MyList[self._PsIndex] + if cur_li._PosY +cur_li._Height > self._Height: + for i in range(0,len(self._MyList)): + self._MyList[i]._PosY -= self._MyList[i]._Height + + def ScrollUp(self): + if len(self._MyList) == 0: + return + self._PsIndex -= 1 + if self._PsIndex < 0: + self._PsIndex = 0 + cur_li = self._MyList[self._PsIndex] + if cur_li._PosY < 0: + for i in range(0, len(self._MyList)): + self._MyList[i]._PosY += self._MyList[i]._Height + + def FScrollUp(self,Step=1): + if len(self._MyList) == 0: + return + tmp = self._PsIndex + self._PsIndex -= Step + + if self._PsIndex < 0: + self._PsIndex = 0 + dy = tmp-self._PsIndex + cur_li = self._MyList[self._PsIndex] + if cur_li._PosY < 0: + for i in range(0, len(self._MyList)): + self._MyList[i]._PosY += self._MyList[i]._Height*dy + + def RefreshPsIndex(self): + if len(self._MyList) == 0: + self._PsIndex = 0 + if self._PsIndex > (len(self._MyList) -1): + self._PsIndex = len(self._MyList) -1 + + def FScrollDown(self,Step=1): + if len(self._MyList) == 0: + return + tmp = self._PsIndex + self._PsIndex +=Step + if self._PsIndex >= len(self._MyList): + self._PsIndex = len(self._MyList) -1 + dy = self._PsIndex - tmp + cur_li = self._MyList[self._PsIndex] + if cur_li._PosY +cur_li._Height > self._Height: + for i in range(0,len(self._MyList)): + self._MyList[i]._PosY -= self._MyList[i]._Height*dy + + def KeyDown(self,event):##default keydown,every inherited page class should have it's own KeyDown + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Right"]: + if self.MoveIconIndexNext() == True: + if self._IconIndex == (self._IconNumbers -1) or self._PrevIconIndex == 0: + self.IconSmoothUp(icon_width + self._PageIconMargin) + else: + self.IconsEasingLeft(icon_width + self._PageIconMargin) + else: + screen_icons = int(math.floor(self._Screen._Width / (icon_width + self._PageIconMargin))) + if self._IconNumbers > screen_icons: + self.IconsEasingRight((icon_width + self._PageIconMargin) * (self._IconNumbers - screen_icons)) + elif self._IconNumbers > 0: + self.IconSmoothUp(icon_width+ self._PageIconMargin) + + self._PsIndex = self._IconIndex + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Left"]: + if self.MoveIconIndexPrev() == True: + if self._IconIndex == 0 or self._PrevIconIndex == (self._IconNumbers -1): + self.IconSmoothUp(icon_width + self._PageIconMargin) + else: + self.IconsEasingRight(icon_width + self._PageIconMargin) + else: + screen_icons = int(math.floor(self._Screen._Width / (icon_width + self._PageIconMargin))) + if self._IconNumbers > screen_icons: + self.IconsEasingLeft((icon_width + self._PageIconMargin) * (self._IconNumbers - screen_icons)) + elif self._IconNumbers > 0: + self.IconSmoothUp(icon_width+ self._PageIconMargin) + + self._PsIndex = self._IconIndex + self._Screen.Draw() + self._Screen.SwapAndShow() + + if IsKeyStartOrA(event.key): + self.IconClick() + self._Screen.Draw() + self._Screen.SwapAndShow() + + def Draw(self): + self.ClearCanvas() + self.DrawIcons() + self.DrawPageSelector() + diff --git a/sys.py/UI/scroller.py b/sys.py/UI/scroller.py new file mode 100644 index 0000000..f6d2490 --- /dev/null +++ b/sys.py/UI/scroller.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +import pygame + +from util_funcs import midRect + +from libs.roundrects import aa_round_rect + +from skin_manager import MySkinManager + +class ListScroller(object): + _PosX = 0 + _PosY = 0 + _Width = 7 + _Height = 0 + _MinHeight = 6 ## tested + _Parent = None + _Color = MySkinManager.GiveColor('Line') + + _StartX = 0 + _StartY = 0 + _EndX = 0 + _EndY = 0 + _Value = 0 + _CanvasHWND = None + + def __init__(self): + pass + + def Init(self): + self.SetCanvasHWND(self._Parent._CanvasHWND) + + def SetCanvasHWND(self,canvas): + self._CanvasHWND = canvas + + def AnimateDraw(self,x2,y2): + pass + + def UpdateSize(self,bigheight,dirtyheight): + bodyheight = float(self._Parent._Height) / float(bigheight) + if bodyheight > 1: + bodyheight = 1 ## 100% + + margin = 4 + self._Height = bodyheight * self._Parent._Height - margin ## Draw body + + if self._Height < self._MinHeight: + self._Height = self._MinHeight + + self._StartX = self._Width/2 + self._StartY = margin/2+self._Height/2 + + self._EndX = self._Width/2 + self._EndY = self._Parent._Height - margin/2 - self._Height/2 + + process = float(dirtyheight) / float(bigheight) + value = process* (self._EndY - self._StartY) + + self._Value = int(value) + + def Draw(self): + + start_rect = midRect(self._PosX+self._StartX,self._StartY+self._Value,self._Width,self._Height,self._Parent._Width,self._Parent._Height) + #aa_round_rect(self._CanvasHWND,start_rect, self._Color,3,0, self._Color) + pygame.draw.rect(self._CanvasHWND,self._Color,start_rect,0) diff --git a/sys.py/UI/simple_name_space.py b/sys.py/UI/simple_name_space.py new file mode 100644 index 0000000..e9e7073 --- /dev/null +++ b/sys.py/UI/simple_name_space.py @@ -0,0 +1,12 @@ + +class SimpleNamespace: + def __init__(self, **kwargs): + self.__dict__.update(kwargs) + + def __repr__(self): + keys = sorted(self.__dict__) + items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys) + return "{}({})".format(type(self).__name__, ", ".join(items)) + + def __eq__(self, other): + return self.__dict__ == other.__dict__ diff --git a/sys.py/UI/skin_manager.py b/sys.py/UI/skin_manager.py new file mode 100644 index 0000000..a99bc8b --- /dev/null +++ b/sys.py/UI/skin_manager.py @@ -0,0 +1,179 @@ +# -*- coding: utf-8 -*- + +import pygame +import config +import ConfigParser + +from util_funcs import FileExists + +class CaseConfigParser(ConfigParser.SafeConfigParser): + def optionxform(self, optionstr): + return optionstr + +class SkinManager(object): + """ + _HighColor = pygame.Color(51,166,255) # #33a6ff + _TextColor = pygame.Color(83,83,83) # #535353 + _FrontColor = pygame.Color(131,199,219) ## light blue,#83c7db + _URLColor = pygame.Color(51,166,255) ## blue more #33a6ff + _LineColor = pygame.Color(169,169,169) # #a9a9a9 + _TitleBgColor = pygame.Color(228,228,228) # #e4e4e4 + _ActiveColor = pygame.Color(175,90,0) ## light brown #af5a00 + """ + + _Colors = {} + _Config = None + _Fonts = {} + DefaultSkin = "../skin/default" + + def __init__(self): + self.Init() + + def ConvertToRGB(self,hexstr): + + h = hexstr.lstrip('#') + return tuple(int(h[i:i+2], 16) for i in (0, 2 ,4)) + + def Init(self): + if not SkinManager._Colors: + self.SetColors() + if not SkinManager._Fonts: + self.SetFonts() + + def SetFonts(self): + if not pygame.font.get_init(): + pygame.font.init() + + skinpath = config.SKIN+"/truetype" + fonts_path = {} + fonts_path["varela"] = "%s/VarelaRound-Regular.ttf" % skinpath + print(fonts_path["varela"]) + fonts_path["veramono"] = "%s/VeraMono.ttf" % skinpath + fonts_path["noto"] = "%s/NotoSansMono-Regular.ttf" % skinpath + fonts_path["notocjk"] = "%s/NotoSansCJK-Regular.ttf" % skinpath + fonts_path["Eurostile"] = "%s/EurostileMN-Medium.pfb.ttf" %skinpath + fonts_path["EurostileBold"] = "%s/EurostileMN-ExtendedBold.pfb.ttf" % skinpath + + + self._Fonts["EurostileBold13"] = pygame.font.Font(fonts_path["EurostileBold"],13) + self._Fonts["EurostileBold30"] = pygame.font.Font(fonts_path["EurostileBold"],30) + + for i in range(10,29): + self._Fonts["varela%d"%i] = pygame.font.Font(fonts_path["Eurostile"],i) + + self._Fonts["varela34"] = pygame.font.Font(fonts_path["Eurostile"],34) + self._Fonts["varela40"] = pygame.font.Font(fonts_path["Eurostile"],40) + self._Fonts["varela120"] = pygame.font.Font(fonts_path["Eurostile"],120) + + + for i in range(10,29): + self._Fonts["varela%d"%i] = pygame.font.Font(fonts_path["varela"],i) + + self._Fonts["varela34"] = pygame.font.Font(fonts_path["varela"],34) + self._Fonts["varela40"] = pygame.font.Font(fonts_path["varela"],40) + self._Fonts["varela120"] = pygame.font.Font(fonts_path["varela"],120) + + for i in range(10,26): + self._Fonts["veramono%d"%i] = pygame.font.Font(fonts_path["veramono"],i) + + for i in range(10,28): + self._Fonts["notosansmono%d"%i] = pygame.font.Font(fonts_path["noto"],i) + + for i in range(10,28): + self._Fonts["notosanscjk%d"%i] = pygame.font.Font(fonts_path["notocjk"],i) + + self._Fonts["arial"] = pygame.font.SysFont("arial",16) + + def SetColors(self): + Colors = {} + Colors["High"] = pygame.Color(51, 166, 255) + Colors["Text"] = pygame.Color(83, 83, 83) + Colors["ReadOnlyText"] = pygame.Color(130,130,130) + Colors["Front"] = pygame.Color(131, 199, 219) + Colors["URL"] = pygame.Color(51, 166, 255) + Colors["Line"] = pygame.Color(169, 169, 169) + Colors["TitleBg"] = pygame.Color(228, 228, 228) + Colors["Active"] = pygame.Color(175, 90, 0) + Colors["Disabled"] = pygame.Color(204, 204, 204) + Colors["White"] = pygame.Color(255, 255, 255) + Colors["Black"] = pygame.Color(0, 0, 0) + + SkinManager._Colors = Colors + + self._Config = CaseConfigParser() + + fname = config.SKIN+"/config.ini" + + try: + self._Config.read(fname) + except Exception, e: + print("read skin config.cfg error %s" % str(e)) + return + else: + if "Colors" in self._Config.sections(): + colour_opts = self._Config.options("Colors") +# print(colour_opts) + for i in SkinManager._Colors: + if i in colour_opts: + try: + SkinManager._Colors[i] = self.ConvertToRGB( + self._Config.get("Colors", i)) + except Exception, e: + print("error in ConvertToRGB %s" % str(e)) + continue + + def GiveFont(self,name): + return SkinManager._Fonts[name] + + def GiveColor(self,name): + if name in SkinManager._Colors: + return SkinManager._Colors[name] + else: + return pygame.Color(255,0,0) + + def GiveIcon(self,orig_file_or_dir): ## return is string,not Surface + #doing a wrapper for items under /home/cpi/apps/Menu/*, to be like Menu/GameShell/* + if orig_file_or_dir.startswith("/home/cpi/apps/Menu"): + orig_file_or_dir = orig_file_or_dir.replace("/home/cpi/apps/Menu/","../Menu/GameShell/") + + if orig_file_or_dir.startswith(".."): + ret = orig_file_or_dir.replace("..",config.SKIN) + if FileExists(ret) == False: + ret = orig_file_or_dir.replace("..",self.DefaultSkin) + else: + ret = config.SKIN+"/sys.py/"+orig_file_or_dir + if FileExists(ret) == False: + ret = self.DefaultSkin+"/sys.py/"+orig_file_or_dir + + if FileExists( ret ): + return ret + else: ## if not existed both in default or custom skin ,return where it is + return orig_file_or_dir + + def GiveWallpaper(self,png_name): + #first SKIN/wallpapers/xxxx.png + #second ../skin/default/wallpapers/xxxx.png + #finnal gameshell/wallpaper/xxxx.png + #loading.png,seeyou.png,updating.png,gameover.png,desktopbg.png + wlp = "/wallpaper/" + if FileExists(config.SKIN+wlp+png_name): + return config.SKIN+wlp+png_name + elif FileExists(self.DefaultSkin+wlp+png_name): + return self.DefaultSkin+wlp+png_name + else: + return "gameshell/wallpaper/"+png_name + + + +##global MySkinManager Handler +MySkinManager = None + +def InitMySkinManager(): + global MySkinManager + if MySkinManager == None: + MySkinManager = SkinManager() + + +InitMySkinManager() + + diff --git a/sys.py/UI/slider.py b/sys.py/UI/slider.py new file mode 100644 index 0000000..864ce0e --- /dev/null +++ b/sys.py/UI/slider.py @@ -0,0 +1,40 @@ + + +class Slider(object): + _PosX = 0 + _PosY = 0 + _Width = 0 + _Height = 0 + + _Value = 0 + _CanvasHWND = None + + _Range = [] + + def __init__(self): + self._Range = [0,255] + + def Init(self): + self._Value = 0 + + def SetValue(self,v): + self._Value = int(v) + + def SetRange(self,m1,m2): + if m1 >= m2: + return + + self._Range[0] = m1 + self._Range[1] = m2 + + + def SetCanvasHWND(self,cav): + self._CanvasHWND = cav + + def KeyDown(self): + pass + + def Draw(self): + pass + + diff --git a/sys.py/UI/text_bulletinboard.py b/sys.py/UI/text_bulletinboard.py new file mode 100644 index 0000000..52f9c86 --- /dev/null +++ b/sys.py/UI/text_bulletinboard.py @@ -0,0 +1,228 @@ +# -*- coding: utf-8 -*- + +import pygame +from libs.roundrects import aa_round_rect + +## local UI import +from page import Page,PageStack,PageSelector +from label import Label +from skin_manager import MySkinManager +from lang_manager import MyLangManager +from widget import Widget +from textarea import Textarea + +class Word: + _T = "" + _Color = MySkinManager.GiveColor('Text') ## default text color + _FontObj = MyLangManager.TrFont("varela12") ##default font + _Size = 12 + _Bold = False + _UndLine = False + def SetColor(self,color): + self._Color = color + + def GetColor(self): + return self._Color + + def SetFont(self,fnt): + self._FontObj = fnt + + def SetBold(self,bd): + self._Bold = bd + + def SetUnderLine(self,bd): + self._UndLine = bd + + def __init__(self,v=""): + self._T = v + + def __str__(self): + return self._T + + def __unicode__(self): + return self._T.encode("utf-8") + + def __add__(self,a): + return self._T + a + + def __repr__(self): + return self._T + + def __len__(self): + return len(self._T) + + def __eq__(self, other): + return self._T == other + + def FnHeight(self): + return self._FontObj.get_height() + + def Render(self): + self._FontObj.set_bold(self._Bold) + self._FontObj.set_underline(self._UndLine) + + sur = self._FontObj.render(self._T,True,self._Color) + + self._FontObj.set_bold(False) + self._FontObj.set_underline(False) + return sur + +class Text: + _Words = [] + def __init__(self,content="",color=None,fnt=None,Bold=False,Und=False): + self._Words = [ Word(x) for x in list(content) ] + if color != None: + self.SetColor(color) + if fnt != None: + self.SetFont(fnt) + + if Bold == True: + self.SetBold(True) + if Und == True: + self.SetUnderLine(True) + + def SetColor(self,color): + if len(self._Words) > 0: + for i,x in enumerate(self._Words): + self._Words[i].SetColor(color) + + def SetBold(self,bd): + if len(self._Words) > 0: + for i,x in enumerate(self._Words): + self._Words[i].SetBold(bd) + + def SetUnderLine(self,bd): + if len(self._Words) > 0: + for i,x in enumerate(self._Words): + self._Words[i].SetUnderLine(bd) + + def SetFont(self,fnt): + if len(self._Words) > 0: + for i,x in enumerate(self._Words): + self._Words[i].SetFont(fnt) + + def __add__(self,a): + return self._Words+a.Words() + + def Words(self): + return self._Words + +class Textbulletinboard(Textarea): + _TextLimit = 200 + _BackgroundColor = MySkinManager.GiveColor("White") + _Align = "Left" ## Left or Center + _RowPitch = -1 ## for \n + _BreakPitch = -1 ## for linebreak line wrapp + + def SetAndBlitText(self,words):# words => [] + + if self._TextFull != True: + self._MyWords = words + self._TextIndex = len(self._MyWords) + else: + print("is Full %s" % "".join(str(self._MyWords))) + + def BuildBlitText(self): + blit_rows = [[]] + w = 0 + xmargin = 5 + endmargin = 15 + x = self._PosX+xmargin + linenumber = 0 + cursor_row = 0 + + #print(self._MyWords) + for i, v in enumerate(self._MyWords): + if str(v) == "\n": + w = 0 + x = self._PosX+xmargin + linenumber+=2 + blit_rows.append([]) + blit_rows.append([]) + else: + t = v.Render() + t_width = t.get_width() + w += t_width + del(t) + + blit_rows[linenumber].append(v) + + if i == self._TextIndex - 1: + cursor_row = linenumber + + self._BlitWords = blit_rows + self._BlitIndex = self._TextIndex + + def BlitText(self): + # build up blitwords + self.BuildBlitText() + xmargin = 5 + endmargin = 5 + start_x = self._PosX+xmargin ##start_point_x + start_y = self._PosY ## start_point_y + x = self._PosX+xmargin ##start_point_x + y = self._PosY ## start_point_y + + self._TextFull = len(self._MyWords) > self._TextLimit + last_height = 0 + + for row_idx, row in enumerate(self._BlitWords): + if len(row) == 0: + if self._RowPitch > 0: + y = y + self._RowPitch + else: + y = y + 16 + + w = 0 + continue + + else: + + total_row_width = 0 + for i,v in enumerate(row): + t = v.Render() + total_row_width += t.get_width() + if total_row_width > self._Width-endmargin: + start_x = self._PosX + xmargin + else: + if self._Align == "Center": + start_x = (self._Width - total_row_width)/2 + + last_height = 0 + row_width = 0 + x = start_x + y = y + last_height + for i,v in enumerate(row): + t = v.Render() + row_width += t.get_width() + + if last_height < v.FnHeight(): + last_height = v.FnHeight() + + if row_width >= self._Width-endmargin: + x = start_x + + if self._Align == "Center": + whatisleft = total_row_width - row_width + if whatisleft >= self._Width-endmargin: + x = start_x + else: + x = (self._Width-whatisleft)/2-endmargin + + if self._BreakPitch > 0: + y = y + self._BreakPitch + else: + y = y + last_height + + row_width = 0 + + self._CanvasHWND.blit(t, (x,y)) + x += t.get_width() + + def Draw(self): + #aa_round_rect(self._CanvasHWND, (4,24.5+6,312,60),self._BackgroundColor,4,0,self._BackgroundColor) + + aa_round_rect(self._CanvasHWND, + (self._PosX,self._PosY,self._Width,self._Height),self._BackgroundColor,4,0,self._BackgroundColor) + + self.BlitText() diff --git a/sys.py/UI/text_item.py b/sys.py/UI/text_item.py new file mode 100644 index 0000000..7469b92 --- /dev/null +++ b/sys.py/UI/text_item.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +#local import +from UI.constants import Width,Height,ICON_TYPES +from UI.icon_item import IconItem +from UI.util_funcs import midRect +from UI.skin_manager import MySkinManager + +class TextItem(IconItem): + _PosX = 0 + _PosY = 0 + _Width = 0 + _Height = 0 + _Str = "" + _Color = MySkinManager.GiveColor('Text') + _FontObj = None + _Bold = False + _MyType = ICON_TYPES["LETTER"] + _Parent = None + + def Draw(self): + self._FontObj.set_bold(self._Bold) + my_text = self._FontObj.render(self._Str,True,self._Color) + if my_text.get_width() != self._Width: + self._Width = my_text.get_width() + if my_text.get_height() != self._Height: + self._Height = my_text.get_height() + + self._Parent._CanvasHWND.blit(my_text, \ + midRect(self._PosX,self._PosY,self._Width,self._Height,Width,Height)) diff --git a/sys.py/UI/textarea.py b/sys.py/UI/textarea.py new file mode 100644 index 0000000..5708223 --- /dev/null +++ b/sys.py/UI/textarea.py @@ -0,0 +1,170 @@ +# -*- coding: utf-8 -*- + +import pygame +from libs.roundrects import aa_round_rect + +## local UI import +from UI.page import Page,PageStack,PageSelector +from UI.label import Label +from UI.skin_manager import MySkinManager +from UI.lang_manager import MyLangManager +from UI.widget import Widget + +class Textarea(Widget): + _BackgroundColor = MySkinManager.GiveColor('TitleBg') + _CanvasHWND = None + _MyWords = [] + _BlitWords = [] + _FontObj = None + _LineNumber = 0 + _TextLimit = 63 + _TextFull = False + _TextIndex = 0 + _BlitIndex = 0 + + def __init__(self): + pass + + def Init(self): + self._FontObj = MyLangManager.TrFont("veramono24") + #pygame.font.Font(fonts_path["veramono"],24) + + def SubTextIndex(self): + + self._TextIndex-=1 + if self._TextIndex < 0: + self._TextIndex = 0 + + def AddTextIndex(self): + self._TextIndex +=1 + if self._TextIndex > len(self._MyWords): + self._TextIndex = len(self._MyWords) + + def ResetMyWords(self): + self._MyWords = [] + self._TextIndex = 0 + + def RemoveFromLastText(self): + if len(self._MyWords) > 0: + self.SubTextIndex() + + del self._MyWords[self._TextIndex] + + return self._MyWords + + def AppendText(self,alphabet): + + self.AppendAndBlitText(alphabet) + + def AppendAndBlitText(self,alphabet): + + if self._TextFull != True: + + self._MyWords.insert(self._TextIndex,alphabet) + self.BlitText() + self.AddTextIndex() + else: + print("is Full %s" % "".join(str(self._MyWords))) + + def BuildBlitText(self): + blit_rows = [[]] + w = 0 + xmargin = 5 + endmargin = 15 + x = self._PosX+xmargin + linenumber = 0 + cursor_row = 0 + + for i, v in enumerate(self._MyWords): + t = self._FontObj.render(v, True, (8, 135, 174)) + t_width = t.get_width() + w += t_width + del(t) + + blit_rows[linenumber].append(v) + + if i == self._TextIndex - 1: + cursor_row = linenumber + + if w + t_width >= self._Width-endmargin: + x = self._PosX+xmargin + w = 0 + linenumber += 1 + blit_rows.append([]) + + # only paint 2 rows + if len(blit_rows) == 1: + self._BlitWords = blit_rows[0] + self._BlitIndex = self._TextIndex + elif len(blit_rows) == 2 or cursor_row < 2: + self._BlitWords = blit_rows[0] + blit_rows[1] + self._BlitIndex = self._TextIndex + else: + self._BlitWords = blit_rows[cursor_row - 1] + blit_rows[cursor_row] + self._BlitIndex = self._TextIndex + for i,v in enumerate(blit_rows): + if i == cursor_row - 1: + break + self._BlitIndex -= len(v) + + def BlitText(self): + """ + blit every single word into surface and calc the width ,check multi line + """ + # build up blitwords + self.BuildBlitText() + + w = 0 + xmargin = 5 + endmargin = 15 + x = self._PosX+xmargin + y = self._PosY + linenumber = 0 + self._TextFull = len(self._MyWords) > self._TextLimit + for i, v in enumerate(self._BlitWords): + t = self._FontObj.render(v,True,(8,135,174)) + w += t.get_width() + + if w >= self._Width-endmargin and linenumber == 0: + linenumber +=1 + x = self._PosX+xmargin + y = self._PosY + t.get_height() * linenumber + w = 0 + + self._CanvasHWND.blit(t, (x,y)) + x += t.get_width() + + def Cursor(self): + w = 0 + xmargin = 5 + endmargin = 15 + x = self._PosX+xmargin + y = self._PosY + linenumber = 0 + for i,v in enumerate(self._BlitWords[:self._BlitIndex]): + t = self._FontObj.render(v,True,(8,135,174)) + w += t.get_width() + + if w >= self._Width-endmargin and linenumber == 0: + x = self._PosX+xmargin + y = self._PosY+ t.get_height() + w = 0 + linenumber +=1 + + if w >= self._Width-endmargin*3 and linenumber > 0: + x += t.get_width() + break + x += t.get_width() + + self._CanvasHWND.blit(self._FontObj.render("_",True,(0,0,0)),(x+1,y-2)) + + def Draw(self): + #aa_round_rect(self._CanvasHWND, (4,24.5+6,312,60),self._BackgroundColor,4,0,self._BackgroundColor) + + aa_round_rect(self._CanvasHWND, + (self._PosX,self._PosY,self._Width,self._Height),self._BackgroundColor,4,0,self._BackgroundColor) + + + + self.BlitText() + self.Cursor() diff --git a/sys.py/UI/title_bar.py b/sys.py/UI/title_bar.py new file mode 100644 index 0000000..12a3e1c --- /dev/null +++ b/sys.py/UI/title_bar.py @@ -0,0 +1,384 @@ +# -*- coding: utf-8 -*- + +import pygame +import os +import sys +import commands + +from datetime import datetime + +#from beeprint import pp + +import alsaaudio + +##local import +from constants import ICON_TYPES,Width,Height +from icon_item import IconItem +from multi_icon_item import MultiIconItem +from icon_pool import MyIconPool +from lang_manager import MyLangManager +from util_funcs import midRect,SwapAndShow,FileExists +from skin_manager import MySkinManager +from widget import Widget +from config import Battery,RPC + +from libs.roundrects import aa_round_rect + +from libs.DBUS import is_wifi_connected_now,wifi_strength + +icon_base_path = MySkinManager.GiveIcon("gameshell/titlebar_icons/") +class TitleBar(Widget): + _Width = Width + _Height = 25 + _BarHeight = 24.5 + _LOffset = 3 + _ROffset = 3 + _Icons = {} + _icon_width = 18 + _icon_height = 18 + _BorderWidth = 1 + _CanvasHWND = None + _HWND = None + _Title = "" + + _InLowBackLight = -1 + + _SkinManager = None + + _InAirPlaneMode = False + + def __init__(self): + self._Icons = {} + + def Redraw(self): + #self.CheckBatteryStat() + #self.SyncSoundVolume() + #self.CheckBluetooth() + #self.UpdateWifiStrength() + self.UpdateDownloadStatus() + SwapAndShow() + + def GObjectRoundRobin(self): + if self._InLowBackLight < 0: + self.CheckBatteryStat() + self.SyncSoundVolume() + self.CheckBluetooth() + self.UpdateWifiStrength() + self.UpdateDownloadStatus() + + SwapAndShow() +# print("TitleBar Gobjectroundrobin") + elif self._InLowBackLight >= 0: + self._InLowBackLight+=1 + if self._InLowBackLight > 10: + self.CheckBatteryStat() + self.SyncSoundVolume() + self.CheckBluetooth() + self.UpdateWifiStrength() + self.UpdateDownloadStatus() + SwapAndShow() + self._InLowBackLight = 0 + + return True + + def UpdateDownloadStatus(self): + resp = RPC.getGlobalStat() + + if( int(resp["numActive"]) > 0): + self._Icons["dlstatus"]._IconIndex = 1 + elif( int(resp["numActive"]) == 0): + self._Icons["dlstatus"]._IconIndex = 0 + + def UpdateWifiStrength(self): + self.Draw(self._Title) + + def GetWifiStrength(self,stren): ##invoke anytime to change title bar icon status + #0-25 + #25-50 + #50-75 + #75-100 + + segs = [[-2,-1], [0,25],[25,50],[50,75],[75,100] ] + + stren = int(stren) + ge = 0 + + if stren == 0: + return ge + + for i,v in enumerate(segs): + if stren >= v[0] and stren <= v[1]: + ge = i + break + + return ge + + def SyncSoundVolume(self): + try: + m = alsaaudio.Mixer() + vol = m.getvolume()[0] + except Exception,e: + print(str(e)) + vol = 0 + + snd_segs = [ [0,10],[10,30],[30,70],[70,100] ] + + ge = 0 + for i,v in enumerate(snd_segs): + if vol >= v[0] and vol <= v[1]: + ge = i + break + + self._Icons["soundvolume"]._IconIndex = ge + self._Icons["sound"] = self._Icons["soundvolume"] + + + def SetSoundVolume(self,vol): + pass + + def CheckBatteryStat(self): ## 100ms check interval + content = "" + bat_uevent = {} + bat_segs=[ [0,6],[7,15],[16,20], [21,30],[31,50],[51,60], [61,80],[81,90],[91,100] ] + + try: + f = open(Battery) + except IOError: + self._Icons["battery"] = self._Icons["battery_unknown"] +# print("CheckBatteryStat open failed") + return False + else: + with f: + content = f.readlines() + content = [x.strip() for x in content] + f.close() + + for i in content: + pis = i.split("=") + if len(pis) > 1: + bat_uevent[pis[0]] = pis[1] + + # print(bat_uevent["POWER_SUPPLY_CAPACITY"]) + + """ + power_current = int(bat_uevent["POWER_SUPPLY_CURRENT_NOW"]) + if power_current < 270000: + self._Icons["battery"] = self._Icons["battery_unknown"] + return False + """ + + if "POWER_SUPPLY_CAPACITY" in bat_uevent: + cur_cap = int(bat_uevent["POWER_SUPPLY_CAPACITY"]) + else: + cur_cap = 0 + + cap_ge = 0 + + for i,v in enumerate(bat_segs): + if cur_cap >= v[0] and cur_cap <= v[1]: + cap_ge = i + break + + if bat_uevent["POWER_SUPPLY_STATUS"] == "Charging": + self._Icons["battery_charging"]._IconIndex = cap_ge + self._Icons["battery"] = self._Icons["battery_charging"] + + #print("Charging %d" % cap_ge) + else: + self._Icons["battery_discharging"]._IconIndex = cap_ge + self._Icons["battery"] = self._Icons["battery_discharging"] + #print("Discharging %d" % cap_ge) + + + return True + + def SetBatteryStat(self,bat): + pass + + def CheckBluetooth(self): + out = commands.getstatusoutput("hcitool dev | grep hci0 |cut -f3") + if len(out[1]) < 17: + print("CheckBluetooth:no bluetooth", out) + self._Icons["bluetooth"]._IconIndex = 2 + return + else: + out = commands.getstatusoutput("sudo rfkill list | grep hci0 -A 2 | grep yes") + if len(out[1]) > 10: + self._Icons["bluetooth"]._IconIndex = 1 + return + + self._Icons["bluetooth"]._IconIndex = 0 + + def Init(self,screen): + + + start_x = 0 + self._CanvasHWND = pygame.Surface((self._Width,self._Height)) + self._HWND = screen + + + icon_wifi_status = MultiIconItem() + icon_wifi_status._MyType = ICON_TYPES["STAT"] + icon_wifi_status._ImageName = icon_base_path+"wifi.png" + icon_wifi_status._Parent = self + icon_wifi_status.Adjust(start_x+self._icon_width+5,self._icon_height/2+(self._BarHeight-self._icon_height)/2,self._icon_width,self._icon_height,0) + self._Icons["wifistatus"] = icon_wifi_status + + battery_charging = MultiIconItem() + battery_charging._MyType = ICON_TYPES["STAT"] + battery_charging._Parent = self + battery_charging._ImageName = icon_base_path+"withcharging.png" + battery_charging.Adjust(start_x+self._icon_width+self._icon_width+8,self._icon_height/2+(self._BarHeight-self._icon_height)/2,self._icon_width,self._icon_height,0) + + self._Icons["battery_charging"] = battery_charging + + battery_discharging = MultiIconItem() + battery_discharging._MyType = ICON_TYPES["STAT"] + battery_discharging._Parent = self + battery_discharging._ImageName = icon_base_path+"without_charging.png" + battery_discharging.Adjust(start_x+self._icon_width+self._icon_width+8,self._icon_height/2+(self._BarHeight-self._icon_height)/2,self._icon_width,self._icon_height,0) + + self._Icons["battery_discharging"] = battery_discharging + + battery_unknown = IconItem() + battery_unknown._MyType = ICON_TYPES["STAT"] + battery_unknown._Parent = self + battery_unknown._ImageName = icon_base_path+"battery_unknown.png" + battery_unknown.Adjust(start_x+self._icon_width+self._icon_width+8,self._icon_height/2+(self._BarHeight-self._icon_height)/2,self._icon_width,self._icon_height,0) + + self._Icons["battery_unknown"] = battery_unknown + + self.CheckBatteryStat() + + sound_volume = MultiIconItem() + sound_volume._MyType = ICON_TYPES["STAT"] + sound_volume._Parent = self + sound_volume._ImageName = icon_base_path+"soundvolume.png" + sound_volume.Adjust(start_x+self._icon_width+self._icon_width+8,self._icon_height/2+(self._BarHeight-self._icon_height)/2,self._icon_width,self._icon_height,0) + + self._Icons["soundvolume"] = sound_volume + + self.SyncSoundVolume() + + + bluetooth = MultiIconItem() + bluetooth._MyType = ICON_TYPES["STAT"] + bluetooth._Parent = self + bluetooth._ImageName = icon_base_path+"bluetooth.png" + bluetooth.Adjust(start_x+self._icon_width+self._icon_width+8,self._icon_height/2+(self._BarHeight-self._icon_height)/2,self._icon_width,self._icon_height,0) + + self._Icons["bluetooth"] = bluetooth + self.CheckBluetooth() + + round_corners = MultiIconItem() + round_corners._IconWidth = 10 + round_corners._IconHeight = 10 + + round_corners._MyType = ICON_TYPES["STAT"] + round_corners._Parent = self + round_corners._ImgSurf = MyIconPool.GiveIconSurface("roundcorners") + round_corners.Adjust(0,0,10,10,0) + + self._Icons["round_corners"] = round_corners + + dlstatus = MultiIconItem() + dlstatus._MyType = ICON_TYPES["STAT"] + dlstatus._Parent = self + if FileExists(icon_base_path+"dlstatus18.png"): + dlstatus._ImageName = icon_base_path+"dlstatus18.png" + dlstatus.Adjust(start_x+self._icon_width+self._icon_width+8,self._icon_height/2+(self._BarHeight-self._icon_height)/2,self._icon_width,self._icon_height,0) + + self._Icons["dlstatus"] = dlstatus + self.UpdateDownloadStatus() + + if is_wifi_connected_now(): + print("wifi is connected") + print( wifi_strength()) + else: + out = commands.getstatusoutput('sudo rfkill list | grep yes | cut -d " " -f3') + if out[1] == "yes": + self._InAirPlaneMode = True + else: + self._InAirPlaneMode = False + + def ClearCanvas(self): + self._CanvasHWND.fill( self._SkinManager.GiveColor("TitleBg") ) + + self._Icons["round_corners"].NewCoord(5,5) + self._Icons["round_corners"]._IconIndex = 0 + self._Icons["round_corners"].Draw() + + self._Icons["round_corners"].NewCoord(self._Width-5,5) + self._Icons["round_corners"]._IconIndex = 1 + self._Icons["round_corners"].Draw() + + + """ + aa_round_rect(self._CanvasHWND, + (0,0,self._Width,self._Height),self._BgColor,8,0, self._BgColor) + + pygame.draw.rect(self._CanvasHWND,self._BgColor,(0,self._Height/2,Width,self._BarHeight), 0 ) + """ + + def Draw(self,title): + self.ClearCanvas() + title = MyLangManager.Tr(title) + self._Title = title + + cur_time = datetime.now().strftime("%H:%M") + time_text_font = MySkinManager.GiveFont("varela12") + time_text_size = time_text_font.size(cur_time) + title_text_size = MyLangManager.TrFont("varela16").size(title) + + self._CanvasHWND.blit(MyLangManager.TrFont("varela16").render(title,True,self._SkinManager.GiveColor("Text")),midRect(title_text_size[0]/2+self._LOffset, + title_text_size[1]/2+(self._BarHeight-title_text_size[1])/2, + title_text_size[0],title_text_size[1],Width,Height)) + self._CanvasHWND.blit( time_text_font.render(cur_time,True,self._SkinManager.GiveColor("Text")),midRect(Width-time_text_size[0]/2-self._ROffset, + time_text_size[1]/2+(self._BarHeight-time_text_size[1])/2, + time_text_size[0],time_text_size[1],Width,Height)) + + start_x = Width-time_text_size[0]-self._ROffset-self._icon_width*3 # near by the time_text + + self._Icons["dlstatus"].NewCoord(start_x - self._icon_width*2,self._icon_height/2+(self._BarHeight-self._icon_height)/2) + + self._Icons["bluetooth"].NewCoord(start_x - self._icon_width,self._icon_height/2+(self._BarHeight-self._icon_height)/2) + + self._Icons["sound"].NewCoord(start_x, self._icon_height/2+(self._BarHeight-self._icon_height)/2) + + #self._Icons["wifi"].NewCoord(start_x+self._icon_width+5, self._icon_height/2+(self._BarHeight-self._icon_height)/2) + + self._Icons["battery"].NewCoord(start_x+self._icon_width+self._icon_width+8,self._icon_height/2+(self._BarHeight-self._icon_height)/2) + + + if is_wifi_connected_now(): + ge = self.GetWifiStrength(wifi_strength()) + if ge > 0: + self._Icons["wifistatus"]._IconIndex = ge + self._Icons["wifistatus"].NewCoord(start_x+self._icon_width+5,self._icon_height/2+(self._BarHeight-self._icon_height)/2) + self._Icons["wifistatus"].Draw() + else: + self._Icons["wifistatus"]._IconIndex = 0 + self._Icons["wifistatus"].Draw() + print("wifi strength error") + else: + if self._InAirPlaneMode == False: + self._Icons["wifistatus"]._IconIndex = 0 + else: + self._Icons["wifistatus"]._IconIndex = 5 ## airplane mode icon + + self._Icons["wifistatus"].NewCoord(start_x+self._icon_width+5,self._icon_height/2+(self._BarHeight-self._icon_height)/2) + self._Icons["wifistatus"].Draw() + + self._Icons["sound"].Draw() + + self._Icons["battery"].Draw() + + self._Icons["bluetooth"].Draw() + + #self._Icons["dlstatus"].Draw() + + + pygame.draw.line(self._CanvasHWND,self._SkinManager.GiveColor("Line"),(0,self._BarHeight),(self._Width,self._BarHeight),self._BorderWidth) + + if self._HWND != None: + self._HWND.blit(self._CanvasHWND,(self._PosX,self._PosY,self._Width,self._Height)) diff --git a/sys.py/UI/untitled_icon.py b/sys.py/UI/untitled_icon.py new file mode 100644 index 0000000..978edaf --- /dev/null +++ b/sys.py/UI/untitled_icon.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- + +import pygame +from pygame.locals import * +from sys import exit +import os +import sys + +from datetime import datetime + +import base64 +from beeprint import pp + +from util_funcs import midRect + +from skin_manager import MySkinManager + +BlankPng = MySkinManager.GiveIcon("gameshell/blank.png") # 80x80 +## use blank circle as bg, Two alpha As Icon Label +#Upper and Lower + + +class UntitledIcon(object): + _PosX = 0 + _PosY = 0 + _Width = 80 + _Height = 80 + + _Words = ["G", "s"] + _FontObj = MySkinManager.GiveFont("varela40") + + _BG = None # initial surface + + _Color = MySkinManager.GiveColor('Text') + + def __init__(self): + self._Words = ["G", "s"] + + def Init(self): + self._BG = pygame.image.load(BlankPng).convert_alpha() + + def SetWords(self, TwoWords): + if len(TwoWords) == 1: + self._Words[0] = TwoWords[0].upper() + + if len(TwoWords) == 2: + self._Words[0] = TwoWords[0].upper() + self._Words[1] = TwoWords[1].lower() + + self._Text = self._FontObj.render("".join(self._Words),True,self._Color) + + def Draw(self): + if self._BG != None: + w_ = self._Text.get_width() + h_ = self._Text.get_height() + + self._BG.blit(self._Text,midRect(self._Width/2,self._Height/2,w_,h_,self._Width,self._Height)) + + def Surface(self): + self.Draw() + + return self._BG + + diff --git a/sys.py/UI/util_funcs.py b/sys.py/UI/util_funcs.py new file mode 100644 index 0000000..f913516 --- /dev/null +++ b/sys.py/UI/util_funcs.py @@ -0,0 +1,123 @@ +# -*- coding: utf-8 -*- +import platform +import pygame +import os +import subprocess + +#from libs import easing +#from datetime import datetime + +#import base64 +#from beeprint import pp +import string +from Xlib import X,display +import config + +def get_git_revision_hash(): + return subprocess.check_output(['git', 'rev-parse', 'HEAD']) + +def get_git_revision_short_hash(): + return subprocess.check_output(['git', 'rev-parse', '--short', 'HEAD']) + + +def X_center_mouse(): + d = display.Display() + s = d.screen() + root = s.root + width = s.width_in_pixels + height = s.height_in_pixels +# print(width,height) + root.warp_pointer(width/2,height/2) + + d.sync() + + +def IsPythonPackage(self,dirname): + files = os.listdir(dirname) + for i in sorted(files): + if i.endswith("__init__.py"): + return True + return False + +def IsExecutable(fpath): + return os.path.isfile(fpath) and os.access(fpath, os.X_OK) + +def MakeExecutable(path): + mode = os.stat(path).st_mode + mode |= (mode & 0o444) >> 2 # copy R bits to X + os.chmod(path, mode) + +def GetExePath():# get self dir + #dir_path = os.path.dirname(os.path.realpath(__file__)) + dir_path = os.getcwd() + return dir_path + +def CmdClean(cmdpath):#escape spec chars + spchars = "\\`$();|{}&'\"*?<>[]!^~-#\n\r " + for i in spchars: + cmdpath = string.replace(cmdpath,i,"\\"+i) + + return cmdpath + +def ReplaceSuffix(orig_file_str,new_ext): + filename,ext = os.path.splitext(orig_file_str) + ext = ext.strip() + if ext != "": + return "%s.%s"%(filename,new_ext) + +def FileExists(name): # both file and dir checked + return os.path.exists(name) + + +def ReadTheFileContent(filename): + data = "" + with open(filename, 'r') as myfile: + data = myfile.read() + return data + +def midRect(x,y,width,height,canWidth,canHeight): + return pygame.Rect(min(canWidth,x-width/2),min(canHeight,y-height/2),width,height) + +#surface color change +def color_surface(surface, color): + red = color.r + green = color.g + blue = color.b + arr = pygame.surfarray.pixels3d(surface) + arr[:,:,0] = red + arr[:,:,1] = green + arr[:,:,2] = blue + + +def DrawText(canvas,text, x,y,width,height,canWidth,canHeight,fontObj):# text for content,fontObj for pygame.font.Font + _w = 0 + _tp = len(text) + + for idx,t in enumerate(fontObj.metrics(text)): + _w = _w + t[1] - t[0] + if _w > icon_width: + _tp = idx + break + width = _w #recalc the width of text + if width > icon_width: ##Label width max is icon width + width = icon_width + + if _tp < len(text):##cut the text to fit width + text = text[0:_tp] + + canvas.blit(fontObj.render(text,True,(83,83,83)),midRect(x,y,width,height,canWidth,canHeight)) + + +def SwapAndShow(): + pygame.display.update() + +def ArmSystem(cmd): + if "arm" not in platform.machine(): + return + os.system(cmd) + +def InGameShell(): + if "arm" not in platform.machine(): + return True + else: + return False diff --git a/sys.py/UI/widget.py b/sys.py/UI/widget.py new file mode 100644 index 0000000..4d1eec0 --- /dev/null +++ b/sys.py/UI/widget.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- + +class Widget: + _PosX =0 + _PosY = 0 + _Width = 0 + _Height = 0 + + def __init__(self): + pass + + def NewCoord(self,x,y): + self._PosX = x + self._PosY = y + + def Coord(self): + return self._PosX,self._PosY + + def Width(self): + return self._Width + + def Height(self): + return self._Height + + def Size(self): + return self._Width,self._Height diff --git a/sys.py/UI/yes_cancel_confirm_page.py b/sys.py/UI/yes_cancel_confirm_page.py new file mode 100644 index 0000000..4d44998 --- /dev/null +++ b/sys.py/UI/yes_cancel_confirm_page.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- + +import pygame + +#UI lib +from UI.constants import RUNSYS +from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB +from UI.confirm_page import ConfirmPage +from UI.lang_manager import MyLangManager +from UI.skin_manager import MySkinManager + +class YesCancelConfirmPage(ConfirmPage): + + _ConfirmText = MyLangManager.Tr("Awaiting Input") + _FootMsg = ["Nav","","","Cancel","Yes"] + _StartOrA_Event = None + _Key_X_Event = None + _Key_Y_Event = None + + def KeyDown(self,event): + + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if IsKeyStartOrA(event.key): + if self._StartOrA_Event != None: + if callable( self._StartOrA_Event): + self._StartOrA_Event() + self.ReturnToUpLevelPage() + + if event.key == CurKeys["X"]: + if self._Key_X_Event != None: + if callable( self._Key_X_Event): + self._Key_X_Event() + self.ReturnToUpLevelPage() + + if event.key == CurKeys["Y"]: + if self._Key_Y_Event != None: + if callable( self._Key_Y_Event): + self._Key_Y_Event() + self.ReturnToUpLevelPage() + diff --git a/sys.py/appinstaller.py b/sys.py/appinstaller.py new file mode 100644 index 0000000..1739716 --- /dev/null +++ b/sys.py/appinstaller.py @@ -0,0 +1,190 @@ +import os +import platform +import sqlite3 +import json + +from wicd import misc +from pyaria2_rpc.pyaria2 import Wsrpc + +import libs.websocket as websocket + +aria2_ws = "ws://localhost:6800/jsonrpc" +aria2_db = "aria2tasks.db" +warehouse_db = "warehouse.db" + +rpc = Wsrpc('localhost',6800) + +def dict_factory(cursor, row): + d = {} + for idx, col in enumerate(cursor.description): + d[col[0]] = row[idx] + return d + +@misc.threaded +def game_install_thread(aria2_result): + try: + #print("game_install_thread ",aria2_result) + if "files" in aria2_result: + if len(aria2_result["files"]) <= 0: + return + if "arm" not in platform.machine(): + return + + ret = aria2_result["files"][0]['uris'] + + remote_file_url = ret[0]['uri'] + menu_file = remote_file_url.split("raw.githubusercontent.com")[1] + local_menu_file = "%s/aria2download%s" % (os.path.expanduser('~'),menu_file ) + local_menu_file_path = os.path.dirname(local_menu_file) + + + if os.path.exists(local_menu_file) == True: + + gametype = "launcher" + + if local_menu_file.endswith(".tar.gz"): + gametype = "launcher" + if local_menu_file.endswith(".p8.png"): + gametype = "pico8" + if local_menu_file.endswith(".tic"): + gametype = "tic80" + + if gametype == "launcher": + #tar zxvf + _cmd = "tar zxvf '%s' -C %s" % (local_menu_file, local_menu_file_path) + print(_cmd) + os.system(_cmd) + if gametype == "pico8": + _cmd="cp -rf '%s' ~/.lexaloffle/pico-8/carts/" % local_menu_file + print(_cmd) + os.system(_cmd) + if gametype == "tic80": + _cmd = "cp -rf '%s' ~/games/TIC-80/" % local_menu_file + print(_cmd) + os.system(_cmd) + + + except Exception as ex: + print("app install error: ",ex) + + +def on_message(ws, message): + global rpc + print("got message ",message) + #decode json + #lookup in the sqlite db ,update the status[error,complete], + #uncompress the game into destnation folder in the game_install_thread + aria2_noti = json.loads(message) + if "method" in aria2_noti and aria2_noti["method"] == "aria2.onDownloadError": + gid = aria2_noti["params"][0]["gid"] + msg = rpc.tellStatus(gid) + ws.send(msg) + + if "method" in aria2_noti and aria2_noti["method"] == "aria2.onDownloadComplete": + gid = aria2_noti["params"][0]["gid"] + msg = rpc.tellStatus(gid) + ws.send(msg) + #game_install_thread(gid) + + if "method" not in aria2_noti and "result" in aria2_noti: + result = aria2_noti["result"] + if "status" in result: + if result["status"] == "error": + try: + print(result["errorMessage"]) + for x in result["files"]: + if os.path.exists(x["path"]): + os.remove(x["path"]) + if os.path.exists(x["path"]+".aria2"): + os.remove(x["path"]+".aria2") + + except Exception as ex: + print(ex) + if result["status"] == "complete": + game_install_thread(result) + + +def on_error(ws, error): + print(error) + +def on_close(ws): + print("### closed ###") + +def on_open(ws): + print "on open" + +def create_connection(db_file): + conn = None + try: + conn = sqlite3.connect(db_file) + return conn + except Error as e: + print(e) + + return conn + + +def create_table(conn, create_table_sql): + try: + c = conn.cursor() + c.execute(create_table_sql) + except Error as e: + print(e) + + + +def init_sqlite3(): + global aria2_db + global warehouse_db + + database = aria2_db + + sql_create_tasks_table = """ CREATE TABLE IF NOT EXISTS tasks ( + id integer PRIMARY KEY, + gid text NOT NULL, + title text NOT NULL, + file text NOT NULL, + type text NOT NULL, + status text, + totalLength text, + completedLength text, + fav text + ); """ + + sql_create_warehouse_table = """ CREATE TABLE IF NOT EXISTS warehouse ( + id integer PRIMARY KEY, + title text NOT NULL, + file text NOT NULL, + type text NOT NULL + ); """ + + conn = create_connection(database) + + if conn is not None: + create_table(conn, sql_create_tasks_table) + conn.close() + else: + print("Error! cannot create the database connection.") + exit() + + database = warehouse_db + conn = create_connection(database) + + if conn is not None: + create_table(conn, sql_create_warehouse_table) + conn.close() + else: + print("Error! cannot create the database connection.") + exit() + + + +if __name__ == "__main__": + init_sqlite3() + websocket.enableTrace(True) + ws = websocket.WebSocketApp(aria2_ws, + on_message = on_message, + on_error = on_error, + on_close = on_close) +# ws.on_open = on_open + ws.run_forever() diff --git a/sys.py/config.py b/sys.py/config.py new file mode 100644 index 0000000..4275c3b --- /dev/null +++ b/sys.py/config.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- +import os +import platform +from UI.util_funcs import FileExists,ArmSystem +from pyaria2_rpc.pyaria2 import Xmlrpc + +CurKeySet = "GameShell" ## >>> PC or GameShell <<< + +DontLeave = False + +BackLight = "/proc/driver/backlight" +Battery = "/sys/class/power_supply/axp20x-battery/uevent" + +MPD_socket = "/tmp/mpd.socket" + +UPDATE_URL="https://raw.githubusercontent.com/clockworkpi/launcher_deot/master/CPI/version.json" + +VERSION="stable 1.25" + +SKIN=None + +ButtonsLayout="xbox" + +RPC = None +## three timer values in seconds: dim screen, close screen,PowerOff +## zero means no action +PowerLevels = {} +PowerLevels["supersaving"] = [10,30,120] +PowerLevels["powersaving"] = [40,120,300] +PowerLevels["server"] = [40,120,0] +PowerLevels["balance_saving"] = [40,0,0] + +PowerLevel = "balance_saving" + +def PreparationInAdv(): + global SKIN,ButtonsLayout + global PowerLevel + global RPC + if SKIN != None: + return + + SKIN= "../skin/default" + + if FileExists("%s/.gameshell_skin" % os.path.expanduser('~')) == True: + with open("%s/.gameshell_skin" % os.path.expanduser('~'),"r") as f: + gameshell_skin = f.read() + + gameshell_skin = gameshell_skin.strip() + SKIN= gameshell_skin + + if FileExists(".buttonslayout") == True: + with open(".buttonslayout") as f: + btnlayout = f.read() + + btnlayout = btnlayout.strip() + ButtonsLayout = btnlayout + if ButtonsLayout != "xbox" and ButtonsLayout != "snes": + ButtonsLayout = "xbox" + + if FileExists(".powerlevel") == False: + os.system("touch .powerlevel") + + with open(".powerlevel","r") as f: + powerlevel = f.read() + + powerlevel = powerlevel.strip() + if powerlevel != "": + PowerLevel = powerlevel + if powerlevel != "supersaving": + ArmSystem("sudo iw wlan0 set power_save off >/dev/null") + else: + ArmSystem("sudo iw wlan0 set power_save on > /dev/null") + else: + ArmSystem("sudo iw wlan0 set power_save off >/dev/null") + + RPC = Xmlrpc('localhost', 6800) +PreparationInAdv() +##sys.py/.powerlevel + diff --git a/sys.py/gameshell/wallpaper/desktopbg.jpg b/sys.py/gameshell/wallpaper/desktopbg.jpg new file mode 100644 index 0000000..9be7a20 Binary files /dev/null and b/sys.py/gameshell/wallpaper/desktopbg.jpg differ diff --git a/sys.py/gameshell/wallpaper/gameover.png b/sys.py/gameshell/wallpaper/gameover.png new file mode 100644 index 0000000..971022c Binary files /dev/null and b/sys.py/gameshell/wallpaper/gameover.png differ diff --git a/sys.py/gameshell/wallpaper/loading.png b/sys.py/gameshell/wallpaper/loading.png new file mode 100644 index 0000000..e06064b Binary files /dev/null and b/sys.py/gameshell/wallpaper/loading.png differ diff --git a/sys.py/gameshell/wallpaper/seeyou.png b/sys.py/gameshell/wallpaper/seeyou.png new file mode 100644 index 0000000..971022c Binary files /dev/null and b/sys.py/gameshell/wallpaper/seeyou.png differ diff --git a/sys.py/gameshell/wallpaper/updating.png b/sys.py/gameshell/wallpaper/updating.png new file mode 100644 index 0000000..88a92c1 Binary files /dev/null and b/sys.py/gameshell/wallpaper/updating.png differ diff --git a/sys.py/gsnotify/Jobs/.gitkeep b/sys.py/gsnotify/Jobs/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/sys.py/gsnotify/Jobs/00_lowpower.alias b/sys.py/gsnotify/Jobs/00_lowpower.alias new file mode 100644 index 0000000..c302351 --- /dev/null +++ b/sys.py/gsnotify/Jobs/00_lowpower.alias @@ -0,0 +1 @@ +Low Battery diff --git a/sys.py/gsnotify/Jobs/00_lowpower.sh b/sys.py/gsnotify/Jobs/00_lowpower.sh new file mode 100755 index 0000000..33ff5ab --- /dev/null +++ b/sys.py/gsnotify/Jobs/00_lowpower.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +BAT_PNT=`upower -i $(upower -e | grep 'battery') | grep -E "state|to\ full|percentage" | awk '/perc/{print $2}' | cut -d % -f1 ` + +if [ "$BAT_PNT" -lt "20" ]; then + + if [ "$BAT_PNT" -lt "5" ]; then + echo '{"type":"once","content":"Low Battery: 5% of battery remaining"}' + elif [ "$BAT_PNT" -lt "10" ]; then + echo '{"type":"once","content":"Low Battery: 10% of battery remaining"}' + fi + +else + echo $BAT_PNT +fi diff --git a/sys.py/gsnotify/gsnotify-arm b/sys.py/gsnotify/gsnotify-arm new file mode 100755 index 0000000..45ed21f Binary files /dev/null and b/sys.py/gsnotify/gsnotify-arm differ diff --git a/sys.py/gsnotify/md5sum b/sys.py/gsnotify/md5sum new file mode 100644 index 0000000..0b324df --- /dev/null +++ b/sys.py/gsnotify/md5sum @@ -0,0 +1 @@ +f174bb3f8e91ce01ae03d70864425abb gsnotify-arm diff --git a/sys.py/langs/00_English.ini b/sys.py/langs/00_English.ini new file mode 100644 index 0000000..1b0ea2e --- /dev/null +++ b/sys.py/langs/00_English.ini @@ -0,0 +1,106 @@ +[Langs] +Settings=Settings +Retro Games=Retro Games +Music Player=Music Player +TinyCloud=Tiny Cloud +PowerOFF=PowerOFF +Reload UI=Reload UI +freeDM=freeDM +CaveStory=CaveStory +RetroArch=RetroArch +Launching=Launching.... +Nav=Nav +Scan=Scan +Back=Back +Enter=Enter +Remove=Remove +Backspace=Backspace +Done=Done +Run=Run +AddToPlayList=Add to Playlist +Add to Playlist=Add to Playlist +DownloadConfirm=Download Confirm +MyFavGames=my favorite games +Deleting=Deleting... +AddFav=Add Fav +ADdFavList=Add to favourite list +Del=Del +Please upload data over Wi-Fi=Please upload data over Wi-Fi +ConfirmDeleteQ=Confirm Delete ? +AlreadyExisted=Already existed +Cancel=Cancel +Yes=Yes +ConfirmQ=Confirm? +Disconnecting=Disconnecting... +ConfirmUpdateToFQ=Confirm Update to %%s ? +UpdateToFQ=Update to %%s ? +SetupGameEngineAutoQ=Do you want to setup this game engine automatically? +Downloading=Downloading... +BATOver5Pct=Battery must over 5%% +DeleteConfirm=Delete Confirm +FavouriteGames=Favourite Games +ConfirmForgetQ=Confirm Forget? +ConfirmForget=Confirm Forget +Disconnect=Disconnect +ConfirmDisconnectQ=Confirm Disconnect ? +Confirm Disconnect=Confirm Disconnect +Forget=Forget +Forgeting=Forgeting... +Info=Info +TryConnect=TryConnect +Bluetooth Info=Bluetooth info +Connecting=Connecting +BluetoothScanning=Bluetooth scanning... +Scanning=Scanning.. +ShutDownConnecting=ShutDownConnecting... +Select=Select +Detail=Detail +Applying=Applying... +DownloadFailed=Download failed +LauncherIsUpToDate=Launcher is up to date +CheckWifiConnection=Please Check your Wi-Fi connection +TurningOn=Turning On +TurningOff=Turning Off +Invalid=Invalid +CheckingUpdate=Checking update... +CheckingUpdateFailed=Checking update failed +Update=Update +Toggle=Toggle +Rescue=Rescue +Airplane Mode=Airplane Mode +minutes=minutes +seconds=seconds +second=second +minute=minute +Never=Never +Power Options=Power Options +Languages=Languages +Notify=Notify +Setting List=Setting List +Wi-Fi=Wi-Fi +Bluetooth=Bluetooth +Sound Volume=Sound Volume +Brightness=Brightness +BackLight Brightness=BackLight Brightness +Storage=Storage +Timezone=Timezone +Timezone Selection=Timezone Selection +Notification=Notification +About=About +Power off=Power off +Buttons Layout=Buttons Layout +UpdateRetroArch=UpdateRetroArch +Wifi scanning=Wifi scanning... +Power option detail=Power option detail +Screen dimming=Screen dimming +Screen OFF=Screen OFF +Power OFF=Power OFF +Power saving=Power saving +Balanced=Balanced +Server=Server +Performance=Performance +Confirm Power OFF?=Confirm Power OFF? +Reboot=Reboot +Shutdown=Shutdown +my favorite music=my favorite music +Check Update=Check Update diff --git a/sys.py/langs/01_日本語.ini b/sys.py/langs/01_日本語.ini new file mode 100644 index 0000000..fb1ef32 --- /dev/null +++ b/sys.py/langs/01_日本語.ini @@ -0,0 +1,110 @@ +[Langs] +Settings=設定 +Retro Games=Retro Games +Music Player=音楽プレーヤー +TinyCloud=Tiny Cloud +PowerOFF=電源オフ +Reload UI=リロードUI +freeDM=デュークニューケム +CaveStory=洞窟物語 +RetroArch=RetroArch +Launching=起動中... +Nav=ナビ +Scan=スキャン +Back=後ろ +Enter=エンター +Remove=削除 +Backspace=後退 +Done=完了 +Run=起動 +AddToPlayList=再生リストに追加 +Add to Playlist=再生リストに追加 +DownloadConfirm=ダウンロード確認 +MyFavGames=お気に入りのゲーム +Deleting=削除 +AddFav=お気に入りに追加 +ADdFavList=お気に入りリストに登録 +Del=削除 +Please upload data over Wi-Fi=Wi-Fiでデータ転送 +ConfirmDeleteQ=削除しますか? +AlreadyExisted=既に存在している +Cancel=取り消す +Yes=はい +ConfirmQ=確認? +Disconnecting=接続を切断 +ConfirmUpdateToFQ=%%sにアップデートしますか? +UpdateToFQ=%%sにアップデート? +SetupGameEngineAutoQ=ゲームエンジンの自動セットアップを希望しますか? +Downloading=ダウンロード中 +BATOver5Pct=バッテリーは5%%以上が必要 +DeleteConfirm=削除の確認 +FavouriteGames=お気に入りのゲーム +ConfirmForgetQ=無視しますか? +ConfirmForget=無視しますか +Disconnect=接続を切断 +ConfirmDisconnectQ=接続を切りますか? +Confirm Disconnect=接続を切りますか +Forget=無視 +Forgeting=無視中 +Info=情報 +TryConnect=接続を試みる +Bluetooth Info=ブルートゥース情報 +Connecting=接続中 +BluetoothScanning=ブルートゥーススキャン中 +Scanning=スキャン中 +ShutDownConnecting=接続を切断 +Select=選択 +Detail=詳細 +Applying=応用中 +DownloadFailed=ダウンロード失敗 +LauncherIsUpToDate=Launcher更新済み +CheckWifiConnection=wifi接続をチェックしてください +TurningOn=開けている +TurningOff=閉じている +Invalid=無効 +CheckingUpdate=アップデート確認中 +CheckingUpdateFailed=アップデート確認失敗 +Update=更新 +Toggle=切り替え +Rescue=救う +Airplane Mode=機内モード +minutes=分 +seconds=秒 +second=秒 +minute=分 +Never=決してしない +Power Options=電源オプション +Languages=言語 +Notify=通知ウィジェット +Setting List=設定リスト +Wi-Fi=Wi-Fi +Bluetooth=ブルートゥース +Sound Volume=音量 +Sound Volume=音量 +Brightness=明るさ +BackLight Brightness=バックライトの明るさ +Storage=ストレージ +Timezone=時地 +Timezone Selection=タイムゾーン選択 +Notification=注意を通知する +About=について +Power off=電源オフ +Buttons Layout=ボタンの配置 +UpdateRetroArch=RetroArchを更新 +Wifi scanning=wifiスキャン中 +Power option detail=電源オプション +Screen dimming=画面が暗くなる +Screen OFF=スクリーンオフ +Power OFF=電源オフ +Power saving=省エネルギー +Balanced=バランス +Server=サーバ +Performance=性能 +Confirm Power OFF?=電源オフしますか? +Reboot=再起動 +Shutdown=シャットダウン +Play List=プレイリスト +Music Library=ミュージックライブラリ +Play/Pause=再生/停止 +my favorite music=お気に入り +Check Update=アップデートをチェック diff --git a/sys.py/langs/02_한국어.ini b/sys.py/langs/02_한국어.ini new file mode 100644 index 0000000..7e11cd8 --- /dev/null +++ b/sys.py/langs/02_한국어.ini @@ -0,0 +1,113 @@ +[Langs] +Settings=설정 +Retro Games=레트로 게임 +Music Player=뮤직 플레이어 +TinyCloud=타이니 클라우드 +Indie Games=인디 게임 +PowerOFF=전원끄기 +Reload UI=UI 재설정 +freeDM=freeDM +CaveStory=케이브 스토리 +RetroArch=레트로아크 +Launching=실행 중.... +Nav=이동 +Scan=스캔 +Back=이전 +Enter=확인 +Remove=제거 +Backspace=백스페이스 +Done=완료 +Run=실행 +AddToPlayList=재생목록에 추가 +Add to Playlist=재생목록에 추가 +DownloadConfirm=다운로드 확인 +MyFavGames=내 즐겨찾기 게임 +Deleting=삭제 중... +AddFav=즐겨찾기 추가 +AddFavList=즐겨찾기 목록에 추가 +Del=삭제 +Please upload data over Wi-Fi=Wi-Fi를 통해 데이터를 업로드하세요 +ConfirmDeleteQ=삭제하시겠습니까? +AlreadyExisted=이미 존재함 +Cancel=취소 +Yes=예 +ConfirmQ=확인? +Disconnecting=연결해제 중... +ConfirmUpdateToFQ=%%s 버전으로 업데이트 합니까? +UpdateToFQ=%%s 업데이트? +SetupGameEngineAutoQ=현재 게임 엔진을 자동으로 설치할까요? +Downloading=다운로드 중... +BATOver5Pct=배터리가 5%% 이상이어야 합니다 +DeleteConfirm=삭제 확인 +FavouriteGames=즐겨찾기 게임 +ConfirmForgetQ=등록해제 확인? +ConfirmForget=등록해제 확인 +Disconnect=연결해제 +ConfirmDisconnectQ=연결해제 확인? +Confirm Disconnect=연결해제 확인 +Forget=등록해제 +Forgeting=등록해제 중... +Info=정보 +TryConnect=연결시도 +Bluetooth Info=블루투스 정보 +Connecting=연결 중 +BluetoothScanning=블루투스 검색 중... +Scanning=검색 중.. +ShutDownConnecting=연결종정료 중... +Select=선택 +Detail=세부정보 +Applying=적용 중... +DownloadFailed=다운로드 실패 +LauncherIsUpToDate=런처가 최신입니다 +CheckWifiConnection=Wi-Fi 연결을 확인하십시오 +TurningOn=켜기 +TurningOff=끄기 +Invalid=잘못됨 +CheckingUpdate=업데이트 확인 중... +CheckingUpdateFailed=업데이트 확인 실패 +Update=업데이트 +Toggle=토글 +Rescue=Rescue +Airplane Mode=비행기 모드 +minutes=분 +seconds=초 +second=초 +minute=분 +Never=사용안함 +Power Options=전원 옵션 +Languages=언어 +Notify=알림 +Setting List=설정 목록 +Wi-Fi=Wi-Fi +Bluetooth=블루투스 +Sound Volume=사운드 볼륨 +Sound volume=사운드 볼륨 +Brightness=밝기 +BackLight Brightness=백라이트 밝기 +Storage=저장공간 +Timezone=시간대 +Timezone Selection=시간대 선택 +Notification=알림 +About=정보 +Power off=전원 끄기 +Buttons Layout=버튼 레이아웃 +UpdateRetroArch=레트로아크 업데이트 +Wifi scanning=Wifi 검색 중... +Power option detail=전원 옵션 세부정보 +Screen dimming=화면 어둡게 +Screen OFF=화면 끄기 +Power OFF=전원 끄기 +Power saving=전원 절역모드 +Balanced=균형 +Server=서버 +Performance=퍼포먼스 +Confirm Power OFF?=전원 끄기 확인? +Reboot=재시작 +Shutdown=종료 +my favorite music=내 즐겨찾기 음악 +Check Update=업데이트 확인 +GPU Driver Switch=GPU 드라이버 변경 +Switch to LauncherGo=런처고로 변경 +Network gateway switch=네트워크 게이트웨이 변경 +Update Launcher=런처 업데이트 +Theme Manager=테마 매니저 \ No newline at end of file diff --git a/sys.py/langs/03_简体中文.ini b/sys.py/langs/03_简体中文.ini new file mode 100644 index 0000000..8469662 --- /dev/null +++ b/sys.py/langs/03_简体中文.ini @@ -0,0 +1,117 @@ +[Langs] +Settings=设置 +Retro Games=Retro Games +Music Player=音乐播放器 +TinyCloud=Tiny Cloud +PowerOFF=关机 +Reload UI=重载菜单 +freeDM=freeDM +CaveStory=洞窟物语 +Launching=正在启动... +Nav=导航 +Scan=扫描 +Back=返回 +Enter=进入 +Remove=删除 +Backspace=退格 +Done=完成 +Run=运行 +AddToPlayList=添加到播放列表 +Add to Playlist=添加到播放列表 +DownloadConfirm=下载确认 +MyFavGames=加星游戏列表 +Deleting=删除中... +AddFav=加星 +Del=删 +Please upload data over Wi-Fi=请通过无线Wifi上传数据 +ConfirmDeleteQ=确认删除? +AlreadyExisted=已存在 +Cancel=取消 +Yes=是 +ConfirmQ=确认? +Disconnecting=断开连接... +ConfirmUpdateToFQ=确认升级至 %%s ? +UpdateToFQ=更新至 %%s ? +SetupGameEngineAutoQ=你希望自动安装游戏引擎部件吗? +Downloading=下载中... +BATOver5Pct=电量必须多余5%% +DeleteConfirm=删除确认 +FavouriteGames=偏好游戏 +ConfirmForgetQ=确认忽略? +ConfirmForget=确认忽略 +Disconnect=断开 +ConfirmDisconnectQ=确认断开? +Confirm Disconnect=确认断开 +Forget=忽略 +Forgeting=忽略中... +Info=属性 +TryConnect=试连接 +Bluetooth Info=蓝牙属性 +Connecting=连接中 +BluetoothScanning=蓝牙搜索中... +Scanning=搜索中.. +ShutDownConnecting=断开连接... +Select=选择 +Detail=详细 +Applying=设置中... +DownloadFailed=下载失败 +LauncherIsUpToDate=Launcher已是最新 +CheckWifiConnection=请检查 Wi-Fi 连接 +TurningOn=打开 +TurningOff=关闭 +Invalid=非法 +CheckingUpdate=检查更新... +CheckingUpdateFailed=检查更新失败 +Update=更新 +Toggle=切换 +Rescue=重置无线设备 +Airplane Mode=飞行模式 +minutes=分 +seconds=秒 +second=秒 +minute=分 +Never=永不 +Power Options=电源选项 +Languages=语言 +Notify=提醒 +Setting List=设置列表 +Wi-Fi=Wi-Fi +Bluetooth=蓝牙 +Sound Volume=音量 +Sound volume=音量 +Sound Volume=音量 +Brightness=亮度 +BackLight Brightness=背光亮度 +Storage=存储空间 +Timezone=时区 +Timezone Selection=时区选择 +Notification=提醒控件 +Update Launcher=更新启动器 +About=关于GameShell +Power off=关机 +Buttons Layout=按钮布局 +UpdateRetroArch=更新RetroArch +Wifi scanning=WiFi扫描中 +Power option detail=电源选项 +Screen dimming=屏幕变暗 +Screen OFF=关闭屏幕 +Power OFF=关机 +Power saving=节能 +Balanced=平衡 +Server=服务器 +Performance=性能 +Confirm Power OFF?=确认关机? +Reboot=重启 +Shutdown=关闭 +Play List=播放列表 +Music Library=乐库 +Play/Pause=播放/暂停 +my favorite music=我的音乐库 +Check Update=检查更新 +Theme Manager=主题管理 +Switch to LauncherGo=切换至LauncherGo +GPU Driver Switch=切换GPU驱动 +GPU driver switch=切换GPU驱动 +Network gateway switch=切换网关 +Rebooting to LauncherGo=正在重启至LauncherGo... +Awaiting Input=等待输入中... diff --git a/sys.py/langs/04_繁体中文.ini b/sys.py/langs/04_繁体中文.ini new file mode 100644 index 0000000..5a84662 --- /dev/null +++ b/sys.py/langs/04_繁体中文.ini @@ -0,0 +1,112 @@ +[Langs] +Settings=設置 +Retro Games=Retro Games +Music Player=音樂播放器 +TinyCloud=Tiny Cloud +PowerOFF=關機 +Reload UI=重載菜單 +freeDM=freeDM +CaveStory=洞窟物語 +Launching=正在啟動... +Nav=導航 +Scan=掃描 +Back=返回 +Enter=進入 +Remove=刪除 +Backspace=退格 +Done=完成 +Run=運行 +AddToPlayList=添加到播放列表 +Add to Playlist=添加到播放列表 +DownloadConfirm=下載確認 +MyFavGames=加星遊戲列表 +Deleting=刪除中... +AddFav=加星 +Del=刪 +Please upload data over Wi-Fi=請通過無線Wifi上傳數據 +ConfirmDeleteQ=確認刪除? +AlreadyExisted=已存在 +Cancel=取消 +Yes=是 +ConfirmQ=確認? +Disconnecting=斷開連接... +ConfirmUpdateToFQ=確認升級至 %%s ? +UpdateToFQ=更新至 %%s ? +SetupGameEngineAutoQ=你希望自動安裝遊戲引擎部件嗎? +Downloading=下載中... +BATOver5Pct=電量必須多余5%% +DeleteConfirm=刪除確認 +FavouriteGames=偏好遊戲 +ConfirmForgetQ=確認忽略? +ConfirmForget=確認忽略 +Disconnect=斷開 +ConfirmDisconnectQ=確認斷開? +Confirm Disconnect=確認斷開 +Forget=忽略 +Forgeting=忽略中... +Info=屬性 +TryConnect=試連接 +Bluetooth Info=藍牙屬性 +Connecting=連接中 +BluetoothScanning=藍牙搜索中... +Scanning=搜索中.. +ShutDownConnecting=斷開連接... +Select=選擇 +Detail=詳細 +Applying=設置中... +DownloadFailed=下載失敗 +LauncherIsUpToDate=Launcher已是最新 +CheckWifiConnection=請檢查 Wi-Fi 連接 +TurningOn=打開 +TurningOff=關閉 +Invalid=非法 +CheckingUpdate=檢查更新... +CheckingUpdateFailed=檢查更新失敗 +Update=更新 +Toggle=切換 +Rescue=重置無線設備 +Airplane Mode=飛行模式 +minutes=分 +seconds=秒 +second=秒 +minute=分 +Never=永不 +Power Options=電源選項 +Languages=語言 +Notify=提醒 +Setting List=設置列表 +Wi-Fi=Wi-Fi +Bluetooth=藍牙 +Sound Volume=音量 +Sound volume=音量 +Sound Volume=音量 +Brightness=亮度 +BackLight Brightness=背光亮度 +Storage=存儲空間 +Timezone=時區 +Timezone Selection=時區選擇 +Notification=提醒控件 +Update Launcher=更新啟動器 +About=關於GameShell +Power off=關機 +Buttons Layout=按鈕布局 +UpdateRetroArch=更新RetroArch +Wifi scanning=WiFi掃描中 +Power option detail=電源選項 +Screen dimming=屏幕變暗 +Screen OFF=關閉屏幕 +Power OFF=關機 +Power saving=節能 +Balanced=平衡 +Server=服務器 +Performance=性能 +Confirm Power OFF?=確認關機? +Reboot=重啟 +Shutdown=關閉 +Play List=播放列表 +Music Library=樂庫 +Play/Pause=播放/暫停 +my favorite music=我的音樂庫 +Check Update=檢查更新 +Theme Manager=主題管理 +GPU Driver Switch=切換GPU驅動 diff --git a/sys.py/langs/05_Spanish.ini b/sys.py/langs/05_Spanish.ini new file mode 100644 index 0000000..14b92ae --- /dev/null +++ b/sys.py/langs/05_Spanish.ini @@ -0,0 +1,122 @@ +[Langs] +Settings=Opciones +Retro Games=Juegos Retro +Indie Games=Juegos Indie +Music Player=Música +TinyCloud=TinyCloud +PowerOFF=Apagar +Reload UI=Recargar IU +freeDM=freeDM +CaveStory=CaveStory +RetroArch=RetroArch +Launching=Cargando.... +Nav=Nav +Scan=Buscar +Back=Volver +Enter=Entrar +Remove=Borrar +Backspace=Borrar +Done=Hecho +Run=Abrir +AddToPlayList=Añadir a lista +Add to Playlist=Añadir a lista +DownloadConfirm=Confirmar descarga +Download Confirm=Confirmar descarga +MyFavGames=mis juegos favoritos +Deleting=Borrando... +AddFav=Favorito +AddFavList=Añadido a favoritos +Del=Borrar +Please upload data over Wi-Fi=Carga datos por Wi-Fi +ConfirmDeleteQ=¿Confirmar borrado? +AlreadyExisted=Ya existía +Cancel=Cancelar +Yes=Sí +ConfirmQ=¿Confirmar? +Disconnecting=Desconectando... +ConfirmUpdateToFQ=¿Confirmar actualización al %%s ? +UpdateToFQ=¿Actualizar al %%s ? +SetupGameEngineAutoQ=¿Descargar emulador? +Downloading=Descargando... +BATOver5Pct=La batería debe ser superior al 5%% +DeleteConfirm=Confirmar borrado +FavouriteGames=Juegos favoritos +ConfirmForgetQ=¿Confirmar olvidar? +ConfirmForget=Confirmar olvidar +Disconnect=Desconectar +ConfirmDisconnectQ=¿Confirmar desconectar? +Confirm Disconnect=Confirmar desconectar +Forget=Olvidar +Forgeting=Olvidando... +Info=Info +TryConnect=Intentar conectar +Bluetooth Info=Info Bluetooth +Connecting=Conectando +BluetoothScanning=Escaneando Bluetooth... +Scanning=Escaneando... +ShutDownConnecting=Terminando conectar... +Select=Seleccionar +Detail=Detalle +Applying=Aplicando... +DownloadFailed=Descarga fallida +LauncherIsUpToDate=Lanzador ya actualizado +CheckWifiConnection=Comprueba tu conexión Wi-Fi +TurningOn=Encendiendo +TurningOff=Apagando +Invalid=Inválido +CheckingUpdate=Comprobando actualizaciones... +CheckingUpdateFailed=Fallo al comprobar +Update=Actualizar +Toggle=Alternar +Rescue=Rescatar +Airplane Mode=Modo avión +minutes=minutos +seconds=segundos +second=segundo +minute=minuto +Never=Nunca +Power Options=Opciones de energía +Languages=Idiomas +Notify=Notificaciones +Setting List=Lista de opciones +Wi-Fi=Wi-Fi +Bluetooth=Bluetooth +Sound Volume=Volumen de sonido +Sound volume=Volumen de sonido +Brightness=Brillo +BackLight Brightness=Brillo de pantalla +Storage=Almacenamiento +Timezone=Zona horaria +Timezone Selection=Seleccionar zona horaria +Notification=Notificaciones +About=Acerca de +Power off=Apagar +Buttons Layout=Disposición de botones +UpdateRetroArch=Actualizar RetroArch +Wifi scanning=Buscando Wifi... +Power option detail=Detalle opciones energía +Screen dimming=Oscurecer pantalla +Screen OFF=Apagar pantalla +Power OFF=Apagar +Power saving=Ahorro energía +Balanced=Equilibrado +Server=Servidor +Performance=Rendimiento +Confirm Power OFF?=¿Confirmar apagado? +Reboot=Reiniciar +Shutdown=Apagar +my favorite music=mi música favorita +Check Update=Buscar actualizaciones +Switch to LauncherGo=Cambiar a LauncherGo +GPU driver switch=Cambiar controlador gráfico +Network gateway switch=Cambiar pasarela de red +Gateway switch=Cambiar pasarela +Clear All=Limpiar todo +Cleaning up=Limpiando +Overwrite RA conf=Restaurar conf RA +Music Library=Biblioteca musical +Play List=Lista de reproducción +Play/Pause=Repr/Pausa +Awaiting Input=Escoge una opción +Scan wifi=Escanear Wifi +Wifi info=Información Wifi \ No newline at end of file diff --git a/sys.py/langs/06_French.ini b/sys.py/langs/06_French.ini new file mode 100644 index 0000000..8ed94c4 --- /dev/null +++ b/sys.py/langs/06_French.ini @@ -0,0 +1,107 @@ +[Langs] +Settings=Réglages +Retro Games=Jeux Retro +Music Player=Musique +TinyCloud=Tiny Cloud +PowerOFF=Arrêt +Reload UI=Recharger IU +freeDM=FreeDooM +CaveStory=CaveStory +RetroArch=RetroArch +Launching=Lancement ... +Nav=Nav +Scan=Scan +Back=Retour +Enter=Entrer +Remove=Supprimer +Backspace=Retour Arrière +Done=Valider +Run=Lancer +AddToPlayList=Ajouter à la playlist +Add to Playlist=Ajouter à la playlist +DownloadConfirm=Confirmer le téléchargement +MyFavGames=Mes jeux favoris +Deleting=Suppression ... +AddFav=Ajouter Favoris +ADdFavList=Ajouter à la liste des favoris +Del=Suppr +Please upload data over Wi-Fi=Aucun fichier +ConfirmDeleteQ=Confirmer la suppression ? +AlreadyExisted=Déjà existant +Cancel=Annuler +Yes=Confirmer +ConfirmQ=Confirmer ? +Disconnecting=Déconnexion ... +ConfirmUpdateToFQ=Confirmer la mise à jour vers %%s ? +UpdateToFQ=Mise à jour vers %%s ? +SetupGameEngineAutoQ=Souhaitez vous installer le moteur du jeux automatiquement ? +Downloading=Téléchargement ... +BATOver5Pct=La batterie doit être à plus de 5% +DeleteConfirm=Suppression effectué +FavouriteGames=Jeux favoris +ConfirmForgetQ=Confirmer l'oubli ? +ConfirmForget=Oubli confirmé +Disconnect=Déconnecter +ConfirmDisconnectQ=Confirmer la déconnexion ? +Confirm Disconnect=Déconnexion effectué +Forget=Oubli +Forgeting=Oubli ... +Info=Info +TryConnect=Se connecter +Bluetooth Info=Info sur le Bluetooth +Connecting=Connexion +BluetoothScanning=Scan Bluetooth en cours ... +Scanning=Scan ... +ShutDownConnecting=Arrêt de la connexion ... +Select=Sélectionner +Detail=Détail +Applying=Application ... +DownloadFailed=Échec du téléchargement +LauncherIsUpToDate=Le lanceur est à jour +CheckWifiConnection=Veuillez vérifier votre connexion Wi-Fi +TurningOn=Allumage +TurningOff=Extinction +Invalid=Invalide +CheckingUpdate=Vérification des mises à jour ... +CheckingUpdateFailed=Échec de la vérification des mises à jour +Update=Mise à jour +Toggle=Basculer +Rescue=Récupération +Airplane Mode=Mode avion +minutes=minutes +seconds=secondes +second=seconde +minute=minute +Never=Jamais +Power Options=Gestion de l'alimentation +Languages=Langues +Notify=Notifications +Setting List=Liste des réglages +Wi-Fi=Wi-Fi +Bluetooth=Bluetooth +Sound Volume=Volume sonore +Sound volume=Volume sonore +Brightness=Luminosité +BackLight Brightness=Rétroéclairage +Storage=Stockage +Timezone=Fuseau horaire +Timezone Selection=Liste des fuseaux horaire +Notification=Notifications +About=À propos +Power off=Arrêt +Buttons Layout=Mappage des touches +UpdateRetroArch=Mettre à jour RetroArch +Wifi scanning=Scan Wi-Fi en cours ... +Power option detail=Détail de l'option +Screen dimming=Atténuation de l'écran +Screen OFF=Extinction de l'écran +Power OFF=Arrêt de l'appareil +Power saving=Économique +Balanced=Équilibré +Server=Serveur +Performance=Performance +Confirm Power OFF?=Confirmer l’arrêt ? +Reboot=Redémarrage +Shutdown=Extinction +my favorite music=Ma musique favorite +Check Update=Vérifier les mises à jour \ No newline at end of file diff --git a/sys.py/langs/07_Deutsch.ini b/sys.py/langs/07_Deutsch.ini new file mode 100644 index 0000000..662da3b --- /dev/null +++ b/sys.py/langs/07_Deutsch.ini @@ -0,0 +1,107 @@ +[Langs] +Settings=Einstellungen +Retro Games=Retro Spiele +Music Player=Musik Player +TinyCloud=Tiny Cloud +PowerOFF=Ausschalten +Reload UI=UI Neu Laden +freeDM=freeDM +CaveStory=CaveStory +RetroArch=RetroArch +Launching=Starte.... +Nav=Nav +Scan=Scannen +Back=Zurück +Enter=Enter +Remove=Entfernen +Backspace=Löschen +Done=Fertig +Run=Starten +AddToPlayList=Zur Playlist hinzufügen +Add to Playlist=Zur Playlist hinzufügen +DownloadConfirm=Bestätige Download +MyFavGames=Meine Lieblingsspiele +Deleting=Lösche... +AddFav=Favorit hinzufügen +ADdFavList=Zur Favoritenliste hinzufügen +Del=Löschen +Please upload data over Wi-Fi=Bitte lade die Daten über Wi-Fi hoch +ConfirmDeleteQ=Wirklich löschen? +AlreadyExisted=Existiert bereits +Cancel=Abbrechen +Yes=Ja +ConfirmQ=Bestätigen? +Disconnecting=Trenne... +ConfirmUpdateToFQ=Bestätige Update zu %%s ? +UpdateToFQ=Update zu %%s ? +SetupGameEngineAutoQ=Willst du diese Spiele-Engine automatisch konfigurieren? +Downloading=Lade runter... +BATOver5Pct=Batterie muss über 5%% sein +DeleteConfirm=Löschen bestätigen +FavouriteGames=Lieblings-Spiele +ConfirmForgetQ=Entfernen bestätigen? +ConfirmForget=Bestätige Entfernen +Disconnect=Trennen +ConfirmDisconnectQ=Trennen bestätigen? +Confirm Disconnect=Bestätige Trennen +Forget=Entfernen +Forgeting=Entferne... +Info=Info +TryConnect=Verbinden +Bluetooth Info=Bluetooth Info +Connecting=Verbinde +BluetoothScanning=Scanne Bluetooth... +Scanning=Scanne... +ShutDownConnecting=Verbinden abbrechen... +Select=Auswählen +Detail=Details +Applying=Wende an... +DownloadFailed=Download fehlgeschlagen +LauncherIsUpToDate=Launcher ist auf dem neuesten Stand +CheckWifiConnection=Bitte überprüfe deine Wi-Fi Verbindung +TurningOn=Schalte ein +TurningOff=Schalte aus +Invalid=Ungültig +CheckingUpdate=Überprüfe auf Update... +CheckingUpdateFailed=Auf Update überprüfen fehlgeschlagen +Update=Update +Toggle=Umschalten +Rescue=Retten +Airplane Mode=Flugmodus +minutes=minuten +seconds=sekunden +second=sekunde +minute=minute +Never=Nie +Power Options=Energieoptionen +Languages=Sprachen +Notify=Benachrichtigen +Setting List=Einstellungen +Wi-Fi=Wi-Fi +Bluetooth=Bluetooth +Sound Volume=Lautsprecher +Sound Volume=Lautsprecher +Brightness=Helligkeit +BackLight Brightness=Display Helligkeit +Storage=Speicher +Timezone=Zeitzone +Timezone Selection=Zeitzone auswählen +Notification=Benachrichtigung +About=Über +Power off=Ausschalten +Buttons Layout=Tastenlayout +UpdateRetroArch=RetroArch aktualisieren +Wifi scanning=Wi-Fi Scan... +Power option detail=Energieoptionen Details +Screen dimming=Bildschirmdimmung +Screen OFF=Bildschirm aus +Power OFF=System ausschalten +Power saving=Energiesparen +Balanced=Balanciert +Server=Server +Performance=Leistung +Confirm Power OFF?=Ausschalten bestätigen? +Reboot=Neustart +Shutdown=Ausschalten +my favorite music=Meine Lieblingsmusik +Check Update=Auf Update überprüfen \ No newline at end of file diff --git a/sys.py/langs/08_Bulgarian.ini b/sys.py/langs/08_Bulgarian.ini new file mode 100644 index 0000000..38fd35d --- /dev/null +++ b/sys.py/langs/08_Bulgarian.ini @@ -0,0 +1,107 @@ +[Langs] +Settings=Настройки +Retro Games=Ретро игри +Music Player=Музик плеър +TinyCloud=Tiny Cloud +PowerOFF=Изключи +Reload UI=Презареди UI +freeDM=freeDM +CaveStory=CaveStory +RetroArch=RetroArch +Launching=Стартиране.... +Nav=Нав +Scan=Сканиране +Back=Назад +Enter=Въведи +Remove=Премахни +Backspace=Backspace +Done=Изпълнено +Run=Старт +AddToPlayList=Добави към плейлист +Add to Playlist=Добави към плейлист +DownloadConfirm=Потвърждаване Изтегляне +MyFavGames=любимите ми игри +Deleting=Изтриване... +AddFav=Add Fav +ADdFavList=Добавяне към списъка с любими +Del=Изт +Please upload data over Wi-Fi=Моля, качете данни през Wi-Fi +ConfirmDeleteQ=Потвърди Изтриване ? +AlreadyExisted=Вече съществува +Cancel=Отказ +Yes=Да +ConfirmQ=Потвърди? +Disconnecting=Изключване... +ConfirmUpdateToFQ=Потвърдете Актуализиране до %%s ? +UpdateToFQ=Актуализиране до %%s ? +SetupGameEngineAutoQ=Искате ли да настроите този game engine автоматично? +Downloading=Изтегля се... +BATOver5Pct=Батерията трябва да е над 5%% +DeleteConfirm=Потвърдете изтриването +FavouriteGames=Favourite GamesЛюбими игри +ConfirmForgetQ=Потвърдете забравянето? +ConfirmForget=Потвърдете забравянето +Disconnect=Изключване +ConfirmDisconnectQ=Потвърдете Изключване ? +Confirm Disconnect=Потвърдете Изключване +Forget=Забрави +Forgeting=Забравям... +Info=Инфо +TryConnect=TryConnect +Bluetooth Info=Bluetooth информация +Connecting=Свързване +BluetoothScanning=Bluetooth сканиране... +Scanning=Сканиране... +ShutDownConnecting=ShutDownConnecting... +Select=Изберете +Detail=Детайл +Applying=Прилагане... +DownloadFailed=Изтеглянето се провали +LauncherIsUpToDate=Launcher е актуален +CheckWifiConnection=Моля, проверете вашата Wi-Fi връзка +TurningOn=Включване +TurningOff=Изключване +Invalid=Невалиден +CheckingUpdate=Проверката на актуализация... +CheckingUpdateFailed=Проверката на актуализацията не бе успешна +Update=Актуализация +Toggle=Щифт +Rescue=Спаси +Airplane Mode=Самолетен режим +minutes=минути +seconds=секунди +second=секунда +minute=минута +Never=Никога +Power Options=Опции за захранване +Languages=Езици +Notify=Уведоми +Setting List=Настройките +Wi-Fi=Wi-Fi +Bluetooth=Bluetooth +Sound Volume=Сила на звука +Sound Volume=Сила на звука +Brightness=Яркост +BackLight Brightness=Яркост на задната светлина +Storage=памет +Timezone=Часова зона +Timezone Selection=Избор на часова зона +Notification=Съобщение +About=Относно +Power off=изключи захранването +Buttons Layout=Положение на бутони +UpdateRetroArch=UpdateRetroArch +Wifi scanning=Wifi Сканиране... +Power option detail=Детайл за опция за захранване +Screen dimming=Затъмняване на екрана +Screen OFF=изключи екрана +Power OFF=изключи захранването +Power saving=Енергоспестяващ +Balanced=Уравновесен +Server=Сървър +Performance=Перформънс +Confirm Power OFF?=Потвърдете изключването +Reboot=Рестарт +Shutdown=Изключи +my favorite music=любимата ми музика +Check Update=Провери актуализацията diff --git a/sys.py/libs/DBUS/__init__.py b/sys.py/libs/DBUS/__init__.py new file mode 100644 index 0000000..ee71ef8 --- /dev/null +++ b/sys.py/libs/DBUS/__init__.py @@ -0,0 +1,134 @@ +# -*- coding: utf-8 -*- + +import dbus +import dbus.service + +import sys +from wicd import misc +##misc.to_bool +##misc.misc.noneToString +##misc.to_unicode +##misc.Noneify +from wicd.translations import _ +from wicd import wpath +from wicd import dbusmanager +from wicd import misc + +import time +import gobject + +if getattr(dbus, 'version', (0, 0, 0)) < (0, 80, 0): + import dbus.glib +else: + from dbus.mainloop.glib import DBusGMainLoop + DBusGMainLoop(set_as_default=True) + +bus = daemon = wireless = wired = None + +manager = objects = adapter = None +devices = {} + +def setup_dbus(force=True): + global bus,daemon,wireless,wired + global manager,objects,adapter,devices + + try: + dbusmanager.connect_to_dbus() + except dbus.DBusException: + print >> sys.stderr,\ + _("Can't connect to wicd daemon,trying to start it automatically...") + else: + bus = dbusmanager.get_bus() + dbus_ifaces = dbusmanager.get_dbus_ifaces() + daemon = dbus_ifaces["daemon"] ## @dbus.service.method('org.wicd.daemon') + wireless = dbus_ifaces["wireless"] ## @dbus.service.method('org.wicd.daemon.wireless') + wired = dbus_ifaces["wired"] ## @ + + + ### BlueZ + try: + proxy_obj = bus.get_object("org.bluez", "/") + manager = dbus.Interface(proxy_obj,"org.freedesktop.DBus.ObjectManager") + objects = manager.GetManagedObjects() + + for path, interfaces in objects.iteritems(): + if "org.bluez.Device1" in interfaces: + devices[path] = interfaces["org.bluez.Device1"] ## like /org/bluez/hci0/dev_xx_xx_xx_yy_yy_yy + + proxy_obj = bus.get_object("org.bluez", "/org/bluez/hci0") + adapter = dbus.Interface(proxy_obj, "org.bluez.Adapter1") + except Exception as e: + print(str(e)) + + if not daemon: + print("Error connecting to wicd via D-Bus") + + + + + return True + + +def wifi_strength(): + fast = not daemon.NeedsExternalCalls() + if not fast: + iwconfig = wireless.GetIwconfig() + else: + iwconfig = '' + + if daemon.GetSignalDisplayType() == 0: + strength = wireless.GetCurrentSignalStrength(iwconfig) + else: + strength = wireless.GetCurrentDBMStrength(iwconfig) + + return strength + + +def get_wifi_ip(): + if wireless == None: + return None + return wireless.GetWirelessIP('') + +def is_wifi_connected_now(): + if wireless == None: + return False + + wireless_connecting = wireless.CheckIfWirelessConnecting() + fast = not daemon.NeedsExternalCalls() + if wireless_connecting: + return False + else: + if not fast: + iwconfig = wireless.GetIwconfig() + else: + iwconfig = '' + if check_for_wireless(iwconfig,wireless.GetWirelessIP(''),None): + return True + else: + return False + +def check_for_wireless(iwconfig,wireless_ip,set_status): + if not wireless_ip: + return False + network = wireless.GetCurrentNetwork(iwconfig) + if not network: + return False + network = misc.to_unicode(network) + if daemon.GetSignalDisplayType() == 0: + strength = wireless.GetCurrentSignalStrength(iwconfig) + else: + strength = wireless.GetCurrentDBMStrength(iwconfig) + + if strength is None: + return False + + strength = misc.to_unicode(daemon.FormatSignalForPrinting(strength)) + ip = misc.to_unicode(wireless_ip) + + """ + print(_('dbus Connected to $A at $B (IP: $C)').replace + ('$A', network).replace + ('$B', strength).replace + ('$C', ip)) + """ + return True diff --git a/sys.py/libs/MPD/__init__.py b/sys.py/libs/MPD/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/sys.py/libs/MPD/poller.py b/sys.py/libs/MPD/poller.py new file mode 100644 index 0000000..dbc372a --- /dev/null +++ b/sys.py/libs/MPD/poller.py @@ -0,0 +1,190 @@ +# -*- coding: utf-8 -*- +# + +from mpd import MPDClient, MPDError, CommandError +import sys +import os + + +class PollerError(Exception): + """Fatal error in poller.""" + + +class MPDPoller(object): + _host="/tmp/mpd/socket" + #_host = "localhost" + _port="6600" + _client= None + + def __init__(self, host, port="6600"): + self._host = host + self._port = port + self._client = MPDClient(use_unicode=True) + self._client.timeout = 60*60*1000 + + def connect(self): + try: + self._client.connect(self._host, self._port) + # Catch socket errors + except IOError as err: + errno, strerror = err + raise PollerError("Could not connect to '%s': %s" % + (self._host, strerror)) + + # Catch all other possible errors + except MPDError as e: + raise PollerError("Could not connect to '%s': %s" % + (self._host, e)) + + + def disconnect(self): + # Try to tell MPD to close the connection first + try: + self._client.close() + + # If that fails, ignore it and disconnect + except (MPDError, IOError): + pass + + try: + self._client.disconnect() + + # Disconnecting failed, setup a new client object instead + # This should never happen. If it does, something is seriously broken, + # and the client object shouldn't be trusted to be re-used. + except (MPDError, IOError): + self._client = MPDClient(use_unicode=True) + self._client.timeout = 60*60*1000 + + def general(self,func,*args): + ret = None + try: + ret = func( *args ) + except CommandError: + return False + except (MPDError, IOError): + print("first error") + self.disconnect() + + try: + self.connect() + + except PollerError as e: + raise PollerError("Reconnecting failed: %s" % e) + + try: + ret = func(*args) + except (MPDError, IOError) as e: + raise PollerError("Couldn't retrieve current song: %s" % e) + + return ret + + def ping(self): + return self.general(self._client.ping) + + def poll(self): + song = self.general( self._client.status ) + """ + while playing: + {u'songid': u'4', u'playlistlength': u'4', u'playlist': u'7', u'repeat': u'0', u'consume': u'0', u'mixrampdb': u'0.000000', u'random': u'0', u'state': u'play', u'elapsed': u'148.758', u'volume': u'100', u'single': u'0', u'time': u'149:436', u'duration': u'435.670', u'song': u'3', u'audio': u'44100:24:2', u'bitrate': u'192'} + + """ + +# print(song) + return song + + def stop(self): + self.general(self._client.stop) + + def addfile(self,url): + self.general(self._client.add, url) + + def delete(self,posid): + self.general(self._client.delete,posid) + + def play(self,posid): + + song = self.poll() + + if "song" in song: + if int(song["song"]) != posid: + self.general(self._client.play,posid) + else: + if "state" in song: + if song["state"] == "play": + self.general(self._client.pause) + elif song["state"] == "pause": + self.general(self._client.pause) + elif song["state"] == "stop": + self.general(self._client.play,posid) + else: + self.general(self._client.play,posid) + + self.general(self._client.setvol,100) + + return posid + + def playlist(self): + lst = self.general(self._client.playlistinfo) + return lst + for i in lst: + if "title" in i: + print( i["title"] ) + elif "file" in i: + print( os.path.basename( i["file"] ) ) + + def listfiles(self,path): + files = self.general(self._client.lsinfo,path) + return files + for i in sorted(files): + if "directory" in i: + print( "D %s" % i["directory"] ) + elif "file" in i: + print(i["file"]) + + def rootfiles(self): + files = self.general(self._client.lsinfo, "/") + return files + for i in sorted(files): + if "directory" in i: + print( "D %s" % i["directory"] ) + elif "file" in i: + print(i["file"]) + +def main(): + from time import sleep + + poller = MPDPoller() + poller.connect() + + while True: + print("poll:") + print( poller.poll() ) + + """ + print("playlist:") + print(poller.playlist()) + print("rootfiles:") + poller.rootfiles() + """ + sleep(120) + + +if __name__ == "__main__": + import sys + + try: + main() + + except PollerError as e: + print("Fatal poller error: %s" % e) + sys.exit(1) + + except Exception as e: + print("Unexpected exception: %s" % e) + sys.exit(1) + + except: + sys.exit(0) + + diff --git a/sys.py/libs/__init__.py b/sys.py/libs/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/sys.py/libs/bluezutils/__init__.py b/sys.py/libs/bluezutils/__init__.py new file mode 100644 index 0000000..de08cbd --- /dev/null +++ b/sys.py/libs/bluezutils/__init__.py @@ -0,0 +1,47 @@ +import dbus + +SERVICE_NAME = "org.bluez" +ADAPTER_INTERFACE = SERVICE_NAME + ".Adapter1" +DEVICE_INTERFACE = SERVICE_NAME + ".Device1" + +def get_managed_objects(): + bus = dbus.SystemBus() + manager = dbus.Interface(bus.get_object("org.bluez", "/"), + "org.freedesktop.DBus.ObjectManager") + return manager.GetManagedObjects() + +def find_adapter(pattern=None): + return find_adapter_in_objects(get_managed_objects(), pattern) + +def find_adapter_in_objects(objects, pattern=None): + bus = dbus.SystemBus() + for path, ifaces in objects.iteritems(): + adapter = ifaces.get(ADAPTER_INTERFACE) + if adapter is None: + continue + if not pattern or pattern == adapter["Address"] or \ + path.endswith(pattern): + obj = bus.get_object(SERVICE_NAME, path) + return dbus.Interface(obj, ADAPTER_INTERFACE) + raise Exception("Bluetooth adapter not found") + +def find_device(device_address, adapter_pattern=None): + return find_device_in_objects(get_managed_objects(), device_address, + adapter_pattern) + +def find_device_in_objects(objects, device_address, adapter_pattern=None): + bus = dbus.SystemBus() + path_prefix = "" + if adapter_pattern: + adapter = find_adapter_in_objects(objects, adapter_pattern) + path_prefix = adapter.object_path + for path, ifaces in objects.iteritems(): + device = ifaces.get(DEVICE_INTERFACE) + if device is None: + continue + if (device["Address"] == device_address and + path.startswith(path_prefix)): + obj = bus.get_object(SERVICE_NAME, path) + return dbus.Interface(obj, DEVICE_INTERFACE) + + raise Exception("Bluetooth device not found") diff --git a/sys.py/libs/easing.py b/sys.py/libs/easing.py new file mode 100644 index 0000000..28d4ae2 --- /dev/null +++ b/sys.py/libs/easing.py @@ -0,0 +1,7 @@ + +import math + + +def SineIn(t, b, c, d): + return -c * math.cos(t/d * (math.pi/2)) + c + b + diff --git a/sys.py/libs/roundrects/__init__.py b/sys.py/libs/roundrects/__init__.py new file mode 100644 index 0000000..73cdbbd --- /dev/null +++ b/sys.py/libs/roundrects/__init__.py @@ -0,0 +1 @@ +from .roundrects import aa_round_rect, round_rect diff --git a/sys.py/libs/roundrects/roundrects.py b/sys.py/libs/roundrects/roundrects.py new file mode 100644 index 0000000..aa01c20 --- /dev/null +++ b/sys.py/libs/roundrects/roundrects.py @@ -0,0 +1,60 @@ +""" +Rounded rectangles in both non-antialiased and antialiased varieties. +""" + +import pygame as pg + +from pygame import gfxdraw + + +def round_rect(surface, rect, color, rad=20, border=0, inside=(0,0,0,0)): + """ + Draw a rect with rounded corners to surface. Argument rad can be specified + to adjust curvature of edges (given in pixels). An optional border + width can also be supplied; if not provided the rect will be filled. + Both the color and optional interior color (the inside argument) support + alpha. + """ + rect = pg.Rect(rect) + zeroed_rect = rect.copy() + zeroed_rect.topleft = 0,0 + image = pg.Surface(rect.size).convert_alpha() + image.fill((0,0,0,0)) + _render_region(image, zeroed_rect, color, rad) + if border: + zeroed_rect.inflate_ip(-2*border, -2*border) + _render_region(image, zeroed_rect, inside, rad) + surface.blit(image, rect) + + +def _render_region(image, rect, color, rad): + """Helper function for round_rect.""" + corners = rect.inflate(-2*rad, -2*rad) + for attribute in ("topleft", "topright", "bottomleft", "bottomright"): + pg.draw.circle(image, color, getattr(corners,attribute), rad) + image.fill(color, rect.inflate(-2*rad,0)) + image.fill(color, rect.inflate(0,-2*rad)) + + +def aa_round_rect(surface, rect, color, rad=20, border=0, inside=(0,0,0)): + """ + Draw an antialiased rounded rect on the target surface. Alpha is not + supported in this implementation but other than that usage is identical to + round_rect. + """ + rect = pg.Rect(rect) + _aa_render_region(surface, rect, color, rad) + if border: + rect.inflate_ip(-2*border, -2*border) + _aa_render_region(surface, rect, inside, rad) + + +def _aa_render_region(image, rect, color, rad): + """Helper function for aa_round_rect.""" + corners = rect.inflate(-2*rad-1, -2*rad-1) + for attribute in ("topleft", "topright", "bottomleft", "bottomright"): + x, y = getattr(corners, attribute) + gfxdraw.aacircle(image, x, y, rad, color) + gfxdraw.filled_circle(image, x, y, rad, color) + image.fill(color, rect.inflate(-2*rad,0)) + image.fill(color, rect.inflate(0,-2*rad)) diff --git a/sys.py/libs/websocket/__init__.py b/sys.py/libs/websocket/__init__.py new file mode 100644 index 0000000..15c74ce --- /dev/null +++ b/sys.py/libs/websocket/__init__.py @@ -0,0 +1,29 @@ +""" +websocket - WebSocket client library for Python + +Copyright (C) 2010 Hiroki Ohtani(liris) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1335 USA + +""" +from ._abnf import * +from ._app import WebSocketApp +from ._core import * +from ._exceptions import * +from ._logging import * +from ._socket import * + +__version__ = "0.56.0" diff --git a/sys.py/libs/websocket/_abnf.py b/sys.py/libs/websocket/_abnf.py new file mode 100644 index 0000000..a0000fa --- /dev/null +++ b/sys.py/libs/websocket/_abnf.py @@ -0,0 +1,447 @@ +""" +websocket - WebSocket client library for Python + +Copyright (C) 2010 Hiroki Ohtani(liris) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1335 USA + +""" +import array +import os +import struct + +import six + +from ._exceptions import * +from ._utils import validate_utf8 +from threading import Lock + +try: + if six.PY3: + import numpy + else: + numpy = None +except ImportError: + numpy = None + +try: + # If wsaccel is available we use compiled routines to mask data. + if not numpy: + from wsaccel.xormask import XorMaskerSimple + + def _mask(_m, _d): + return XorMaskerSimple(_m).process(_d) +except ImportError: + # wsaccel is not available, we rely on python implementations. + def _mask(_m, _d): + for i in range(len(_d)): + _d[i] ^= _m[i % 4] + + if six.PY3: + return _d.tobytes() + else: + return _d.tostring() + + +__all__ = [ + 'ABNF', 'continuous_frame', 'frame_buffer', + 'STATUS_NORMAL', + 'STATUS_GOING_AWAY', + 'STATUS_PROTOCOL_ERROR', + 'STATUS_UNSUPPORTED_DATA_TYPE', + 'STATUS_STATUS_NOT_AVAILABLE', + 'STATUS_ABNORMAL_CLOSED', + 'STATUS_INVALID_PAYLOAD', + 'STATUS_POLICY_VIOLATION', + 'STATUS_MESSAGE_TOO_BIG', + 'STATUS_INVALID_EXTENSION', + 'STATUS_UNEXPECTED_CONDITION', + 'STATUS_BAD_GATEWAY', + 'STATUS_TLS_HANDSHAKE_ERROR', +] + +# closing frame status codes. +STATUS_NORMAL = 1000 +STATUS_GOING_AWAY = 1001 +STATUS_PROTOCOL_ERROR = 1002 +STATUS_UNSUPPORTED_DATA_TYPE = 1003 +STATUS_STATUS_NOT_AVAILABLE = 1005 +STATUS_ABNORMAL_CLOSED = 1006 +STATUS_INVALID_PAYLOAD = 1007 +STATUS_POLICY_VIOLATION = 1008 +STATUS_MESSAGE_TOO_BIG = 1009 +STATUS_INVALID_EXTENSION = 1010 +STATUS_UNEXPECTED_CONDITION = 1011 +STATUS_BAD_GATEWAY = 1014 +STATUS_TLS_HANDSHAKE_ERROR = 1015 + +VALID_CLOSE_STATUS = ( + STATUS_NORMAL, + STATUS_GOING_AWAY, + STATUS_PROTOCOL_ERROR, + STATUS_UNSUPPORTED_DATA_TYPE, + STATUS_INVALID_PAYLOAD, + STATUS_POLICY_VIOLATION, + STATUS_MESSAGE_TOO_BIG, + STATUS_INVALID_EXTENSION, + STATUS_UNEXPECTED_CONDITION, + STATUS_BAD_GATEWAY, +) + + +class ABNF(object): + """ + ABNF frame class. + see http://tools.ietf.org/html/rfc5234 + and http://tools.ietf.org/html/rfc6455#section-5.2 + """ + + # operation code values. + OPCODE_CONT = 0x0 + OPCODE_TEXT = 0x1 + OPCODE_BINARY = 0x2 + OPCODE_CLOSE = 0x8 + OPCODE_PING = 0x9 + OPCODE_PONG = 0xa + + # available operation code value tuple + OPCODES = (OPCODE_CONT, OPCODE_TEXT, OPCODE_BINARY, OPCODE_CLOSE, + OPCODE_PING, OPCODE_PONG) + + # opcode human readable string + OPCODE_MAP = { + OPCODE_CONT: "cont", + OPCODE_TEXT: "text", + OPCODE_BINARY: "binary", + OPCODE_CLOSE: "close", + OPCODE_PING: "ping", + OPCODE_PONG: "pong" + } + + # data length threshold. + LENGTH_7 = 0x7e + LENGTH_16 = 1 << 16 + LENGTH_63 = 1 << 63 + + def __init__(self, fin=0, rsv1=0, rsv2=0, rsv3=0, + opcode=OPCODE_TEXT, mask=1, data=""): + """ + Constructor for ABNF. + please check RFC for arguments. + """ + self.fin = fin + self.rsv1 = rsv1 + self.rsv2 = rsv2 + self.rsv3 = rsv3 + self.opcode = opcode + self.mask = mask + if data is None: + data = "" + self.data = data + self.get_mask_key = os.urandom + + def validate(self, skip_utf8_validation=False): + """ + validate the ABNF frame. + skip_utf8_validation: skip utf8 validation. + """ + if self.rsv1 or self.rsv2 or self.rsv3: + raise WebSocketProtocolException("rsv is not implemented, yet") + + if self.opcode not in ABNF.OPCODES: + raise WebSocketProtocolException("Invalid opcode %r", self.opcode) + + if self.opcode == ABNF.OPCODE_PING and not self.fin: + raise WebSocketProtocolException("Invalid ping frame.") + + if self.opcode == ABNF.OPCODE_CLOSE: + l = len(self.data) + if not l: + return + if l == 1 or l >= 126: + raise WebSocketProtocolException("Invalid close frame.") + if l > 2 and not skip_utf8_validation and not validate_utf8(self.data[2:]): + raise WebSocketProtocolException("Invalid close frame.") + + code = 256 * \ + six.byte2int(self.data[0:1]) + six.byte2int(self.data[1:2]) + if not self._is_valid_close_status(code): + raise WebSocketProtocolException("Invalid close opcode.") + + @staticmethod + def _is_valid_close_status(code): + return code in VALID_CLOSE_STATUS or (3000 <= code < 5000) + + def __str__(self): + return "fin=" + str(self.fin) \ + + " opcode=" + str(self.opcode) \ + + " data=" + str(self.data) + + @staticmethod + def create_frame(data, opcode, fin=1): + """ + create frame to send text, binary and other data. + + data: data to send. This is string value(byte array). + if opcode is OPCODE_TEXT and this value is unicode, + data value is converted into unicode string, automatically. + + opcode: operation code. please see OPCODE_XXX. + + fin: fin flag. if set to 0, create continue fragmentation. + """ + if opcode == ABNF.OPCODE_TEXT and isinstance(data, six.text_type): + data = data.encode("utf-8") + # mask must be set if send data from client + return ABNF(fin, 0, 0, 0, opcode, 1, data) + + def format(self): + """ + format this object to string(byte array) to send data to server. + """ + if any(x not in (0, 1) for x in [self.fin, self.rsv1, self.rsv2, self.rsv3]): + raise ValueError("not 0 or 1") + if self.opcode not in ABNF.OPCODES: + raise ValueError("Invalid OPCODE") + length = len(self.data) + if length >= ABNF.LENGTH_63: + raise ValueError("data is too long") + + frame_header = chr(self.fin << 7 + | self.rsv1 << 6 | self.rsv2 << 5 | self.rsv3 << 4 + | self.opcode) + if length < ABNF.LENGTH_7: + frame_header += chr(self.mask << 7 | length) + frame_header = six.b(frame_header) + elif length < ABNF.LENGTH_16: + frame_header += chr(self.mask << 7 | 0x7e) + frame_header = six.b(frame_header) + frame_header += struct.pack("!H", length) + else: + frame_header += chr(self.mask << 7 | 0x7f) + frame_header = six.b(frame_header) + frame_header += struct.pack("!Q", length) + + if not self.mask: + return frame_header + self.data + else: + mask_key = self.get_mask_key(4) + return frame_header + self._get_masked(mask_key) + + def _get_masked(self, mask_key): + s = ABNF.mask(mask_key, self.data) + + if isinstance(mask_key, six.text_type): + mask_key = mask_key.encode('utf-8') + + return mask_key + s + + @staticmethod + def mask(mask_key, data): + """ + mask or unmask data. Just do xor for each byte + + mask_key: 4 byte string(byte). + + data: data to mask/unmask. + """ + if data is None: + data = "" + + if isinstance(mask_key, six.text_type): + mask_key = six.b(mask_key) + + if isinstance(data, six.text_type): + data = six.b(data) + + if numpy: + origlen = len(data) + _mask_key = mask_key[3] << 24 | mask_key[2] << 16 | mask_key[1] << 8 | mask_key[0] + + # We need data to be a multiple of four... + data += bytes(" " * (4 - (len(data) % 4)), "us-ascii") + a = numpy.frombuffer(data, dtype="uint32") + masked = numpy.bitwise_xor(a, [_mask_key]).astype("uint32") + if len(data) > origlen: + return masked.tobytes()[:origlen] + return masked.tobytes() + else: + _m = array.array("B", mask_key) + _d = array.array("B", data) + return _mask(_m, _d) + + +class frame_buffer(object): + _HEADER_MASK_INDEX = 5 + _HEADER_LENGTH_INDEX = 6 + + def __init__(self, recv_fn, skip_utf8_validation): + self.recv = recv_fn + self.skip_utf8_validation = skip_utf8_validation + # Buffers over the packets from the layer beneath until desired amount + # bytes of bytes are received. + self.recv_buffer = [] + self.clear() + self.lock = Lock() + + def clear(self): + self.header = None + self.length = None + self.mask = None + + def has_received_header(self): + return self.header is None + + def recv_header(self): + header = self.recv_strict(2) + b1 = header[0] + + if six.PY2: + b1 = ord(b1) + + fin = b1 >> 7 & 1 + rsv1 = b1 >> 6 & 1 + rsv2 = b1 >> 5 & 1 + rsv3 = b1 >> 4 & 1 + opcode = b1 & 0xf + b2 = header[1] + + if six.PY2: + b2 = ord(b2) + + has_mask = b2 >> 7 & 1 + length_bits = b2 & 0x7f + + self.header = (fin, rsv1, rsv2, rsv3, opcode, has_mask, length_bits) + + def has_mask(self): + if not self.header: + return False + return self.header[frame_buffer._HEADER_MASK_INDEX] + + def has_received_length(self): + return self.length is None + + def recv_length(self): + bits = self.header[frame_buffer._HEADER_LENGTH_INDEX] + length_bits = bits & 0x7f + if length_bits == 0x7e: + v = self.recv_strict(2) + self.length = struct.unpack("!H", v)[0] + elif length_bits == 0x7f: + v = self.recv_strict(8) + self.length = struct.unpack("!Q", v)[0] + else: + self.length = length_bits + + def has_received_mask(self): + return self.mask is None + + def recv_mask(self): + self.mask = self.recv_strict(4) if self.has_mask() else "" + + def recv_frame(self): + + with self.lock: + # Header + if self.has_received_header(): + self.recv_header() + (fin, rsv1, rsv2, rsv3, opcode, has_mask, _) = self.header + + # Frame length + if self.has_received_length(): + self.recv_length() + length = self.length + + # Mask + if self.has_received_mask(): + self.recv_mask() + mask = self.mask + + # Payload + payload = self.recv_strict(length) + if has_mask: + payload = ABNF.mask(mask, payload) + + # Reset for next frame + self.clear() + + frame = ABNF(fin, rsv1, rsv2, rsv3, opcode, has_mask, payload) + frame.validate(self.skip_utf8_validation) + + return frame + + def recv_strict(self, bufsize): + shortage = bufsize - sum(len(x) for x in self.recv_buffer) + while shortage > 0: + # Limit buffer size that we pass to socket.recv() to avoid + # fragmenting the heap -- the number of bytes recv() actually + # reads is limited by socket buffer and is relatively small, + # yet passing large numbers repeatedly causes lots of large + # buffers allocated and then shrunk, which results in + # fragmentation. + bytes_ = self.recv(min(16384, shortage)) + self.recv_buffer.append(bytes_) + shortage -= len(bytes_) + + unified = six.b("").join(self.recv_buffer) + + if shortage == 0: + self.recv_buffer = [] + return unified + else: + self.recv_buffer = [unified[bufsize:]] + return unified[:bufsize] + + +class continuous_frame(object): + + def __init__(self, fire_cont_frame, skip_utf8_validation): + self.fire_cont_frame = fire_cont_frame + self.skip_utf8_validation = skip_utf8_validation + self.cont_data = None + self.recving_frames = None + + def validate(self, frame): + if not self.recving_frames and frame.opcode == ABNF.OPCODE_CONT: + raise WebSocketProtocolException("Illegal frame") + if self.recving_frames and \ + frame.opcode in (ABNF.OPCODE_TEXT, ABNF.OPCODE_BINARY): + raise WebSocketProtocolException("Illegal frame") + + def add(self, frame): + if self.cont_data: + self.cont_data[1] += frame.data + else: + if frame.opcode in (ABNF.OPCODE_TEXT, ABNF.OPCODE_BINARY): + self.recving_frames = frame.opcode + self.cont_data = [frame.opcode, frame.data] + + if frame.fin: + self.recving_frames = None + + def is_fire(self, frame): + return frame.fin or self.fire_cont_frame + + def extract(self, frame): + data = self.cont_data + self.cont_data = None + frame.data = data[1] + if not self.fire_cont_frame and data[0] == ABNF.OPCODE_TEXT and not self.skip_utf8_validation and not validate_utf8(frame.data): + raise WebSocketPayloadException( + "cannot decode: " + repr(frame.data)) + + return [data[0], frame] diff --git a/sys.py/libs/websocket/_app.py b/sys.py/libs/websocket/_app.py new file mode 100644 index 0000000..81aa1fc --- /dev/null +++ b/sys.py/libs/websocket/_app.py @@ -0,0 +1,351 @@ +""" +websocket - WebSocket client library for Python + +Copyright (C) 2010 Hiroki Ohtani(liris) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1335 USA + +""" + +""" +WebSocketApp provides higher level APIs. +""" +import inspect +import select +import sys +import threading +import time +import traceback + +import six + +from ._abnf import ABNF +from ._core import WebSocket, getdefaulttimeout +from ._exceptions import * +from . import _logging + + +__all__ = ["WebSocketApp"] + +class Dispatcher: + def __init__(self, app, ping_timeout): + self.app = app + self.ping_timeout = ping_timeout + + def read(self, sock, read_callback, check_callback): + while self.app.sock.connected: + r, w, e = select.select( + (self.app.sock.sock, ), (), (), self.ping_timeout) + if r: + if not read_callback(): + break + check_callback() + +class SSLDispacther: + def __init__(self, app, ping_timeout): + self.app = app + self.ping_timeout = ping_timeout + + def read(self, sock, read_callback, check_callback): + while self.app.sock.connected: + r = self.select() + if r: + if not read_callback(): + break + check_callback() + + def select(self): + sock = self.app.sock.sock + if sock.pending(): + return [sock,] + + r, w, e = select.select((sock, ), (), (), self.ping_timeout) + return r + +class WebSocketApp(object): + """ + Higher level of APIs are provided. + The interface is like JavaScript WebSocket object. + """ + + def __init__(self, url, header=None, + on_open=None, on_message=None, on_error=None, + on_close=None, on_ping=None, on_pong=None, + on_cont_message=None, + keep_running=True, get_mask_key=None, cookie=None, + subprotocols=None, + on_data=None): + """ + url: websocket url. + header: custom header for websocket handshake. + on_open: callable object which is called at opening websocket. + this function has one argument. The argument is this class object. + on_message: callable object which is called when received data. + on_message has 2 arguments. + The 1st argument is this class object. + The 2nd argument is utf-8 string which we get from the server. + on_error: callable object which is called when we get error. + on_error has 2 arguments. + The 1st argument is this class object. + The 2nd argument is exception object. + on_close: callable object which is called when closed the connection. + this function has one argument. The argument is this class object. + on_cont_message: callback object which is called when receive continued + frame data. + on_cont_message has 3 arguments. + The 1st argument is this class object. + The 2nd argument is utf-8 string which we get from the server. + The 3rd argument is continue flag. if 0, the data continue + to next frame data + on_data: callback object which is called when a message received. + This is called before on_message or on_cont_message, + and then on_message or on_cont_message is called. + on_data has 4 argument. + The 1st argument is this class object. + The 2nd argument is utf-8 string which we get from the server. + The 3rd argument is data type. ABNF.OPCODE_TEXT or ABNF.OPCODE_BINARY will be came. + The 4th argument is continue flag. if 0, the data continue + keep_running: this parameter is obsolete and ignored. + get_mask_key: a callable to produce new mask keys, + see the WebSocket.set_mask_key's docstring for more information + subprotocols: array of available sub protocols. default is None. + """ + self.url = url + self.header = header if header is not None else [] + self.cookie = cookie + + self.on_open = on_open + self.on_message = on_message + self.on_data = on_data + self.on_error = on_error + self.on_close = on_close + self.on_ping = on_ping + self.on_pong = on_pong + self.on_cont_message = on_cont_message + self.keep_running = False + self.get_mask_key = get_mask_key + self.sock = None + self.last_ping_tm = 0 + self.last_pong_tm = 0 + self.subprotocols = subprotocols + + def send(self, data, opcode=ABNF.OPCODE_TEXT): + """ + send message. + data: message to send. If you set opcode to OPCODE_TEXT, + data must be utf-8 string or unicode. + opcode: operation code of data. default is OPCODE_TEXT. + """ + + if not self.sock or self.sock.send(data, opcode) == 0: + raise WebSocketConnectionClosedException( + "Connection is already closed.") + + def close(self, **kwargs): + """ + close websocket connection. + """ + self.keep_running = False + if self.sock: + self.sock.close(**kwargs) + self.sock = None + + def _send_ping(self, interval, event): + while not event.wait(interval): + self.last_ping_tm = time.time() + if self.sock: + try: + self.sock.ping() + except Exception as ex: + _logging.warning("send_ping routine terminated: {}".format(ex)) + break + + def run_forever(self, sockopt=None, sslopt=None, + ping_interval=0, ping_timeout=None, + http_proxy_host=None, http_proxy_port=None, + http_no_proxy=None, http_proxy_auth=None, + skip_utf8_validation=False, + host=None, origin=None, dispatcher=None, + suppress_origin = False, proxy_type=None): + """ + run event loop for WebSocket framework. + This loop is infinite loop and is alive during websocket is available. + sockopt: values for socket.setsockopt. + sockopt must be tuple + and each element is argument of sock.setsockopt. + sslopt: ssl socket optional dict. + ping_interval: automatically send "ping" command + every specified period(second) + if set to 0, not send automatically. + ping_timeout: timeout(second) if the pong message is not received. + http_proxy_host: http proxy host name. + http_proxy_port: http proxy port. If not set, set to 80. + http_no_proxy: host names, which doesn't use proxy. + skip_utf8_validation: skip utf8 validation. + host: update host header. + origin: update origin header. + dispatcher: customize reading data from socket. + suppress_origin: suppress outputting origin header. + + Returns + ------- + False if caught KeyboardInterrupt + True if other exception was raised during a loop + """ + + if ping_timeout is not None and ping_timeout <= 0: + ping_timeout = None + if ping_timeout and ping_interval and ping_interval <= ping_timeout: + raise WebSocketException("Ensure ping_interval > ping_timeout") + if not sockopt: + sockopt = [] + if not sslopt: + sslopt = {} + if self.sock: + raise WebSocketException("socket is already opened") + thread = None + self.keep_running = True + self.last_ping_tm = 0 + self.last_pong_tm = 0 + + def teardown(close_frame=None): + """ + Tears down the connection. + If close_frame is set, we will invoke the on_close handler with the + statusCode and reason from there. + """ + if thread and thread.isAlive(): + event.set() + thread.join() + self.keep_running = False + if self.sock: + self.sock.close() + close_args = self._get_close_args( + close_frame.data if close_frame else None) + self._callback(self.on_close, *close_args) + self.sock = None + + try: + self.sock = WebSocket( + self.get_mask_key, sockopt=sockopt, sslopt=sslopt, + fire_cont_frame=self.on_cont_message is not None, + skip_utf8_validation=skip_utf8_validation, + enable_multithread=True if ping_interval else False) + self.sock.settimeout(getdefaulttimeout()) + self.sock.connect( + self.url, header=self.header, cookie=self.cookie, + http_proxy_host=http_proxy_host, + http_proxy_port=http_proxy_port, http_no_proxy=http_no_proxy, + http_proxy_auth=http_proxy_auth, subprotocols=self.subprotocols, + host=host, origin=origin, suppress_origin=suppress_origin, + proxy_type=proxy_type) + if not dispatcher: + dispatcher = self.create_dispatcher(ping_timeout) + + self._callback(self.on_open) + + if ping_interval: + event = threading.Event() + thread = threading.Thread( + target=self._send_ping, args=(ping_interval, event)) + thread.setDaemon(True) + thread.start() + + def read(): + if not self.keep_running: + return teardown() + + op_code, frame = self.sock.recv_data_frame(True) + if op_code == ABNF.OPCODE_CLOSE: + return teardown(frame) + elif op_code == ABNF.OPCODE_PING: + self._callback(self.on_ping, frame.data) + elif op_code == ABNF.OPCODE_PONG: + self.last_pong_tm = time.time() + self._callback(self.on_pong, frame.data) + elif op_code == ABNF.OPCODE_CONT and self.on_cont_message: + self._callback(self.on_data, frame.data, + frame.opcode, frame.fin) + self._callback(self.on_cont_message, + frame.data, frame.fin) + else: + data = frame.data + if six.PY3 and op_code == ABNF.OPCODE_TEXT: + data = data.decode("utf-8") + self._callback(self.on_data, data, frame.opcode, True) + self._callback(self.on_message, data) + + return True + + def check(): + if (ping_timeout): + has_timeout_expired = time.time() - self.last_ping_tm > ping_timeout + has_pong_not_arrived_after_last_ping = self.last_pong_tm - self.last_ping_tm < 0 + has_pong_arrived_too_late = self.last_pong_tm - self.last_ping_tm > ping_timeout + + if (self.last_ping_tm + and has_timeout_expired + and (has_pong_not_arrived_after_last_ping or has_pong_arrived_too_late)): + raise WebSocketTimeoutException("ping/pong timed out") + return True + + dispatcher.read(self.sock.sock, read, check) + except (Exception, KeyboardInterrupt, SystemExit) as e: + self._callback(self.on_error, e) + if isinstance(e, SystemExit): + # propagate SystemExit further + raise + teardown() + return not isinstance(e, KeyboardInterrupt) + + def create_dispatcher(self, ping_timeout): + timeout = ping_timeout or 10 + if self.sock.is_ssl(): + return SSLDispacther(self, timeout) + + return Dispatcher(self, timeout) + + def _get_close_args(self, data): + """ this functions extracts the code, reason from the close body + if they exists, and if the self.on_close except three arguments """ + # if the on_close callback is "old", just return empty list + if sys.version_info < (3, 0): + if not self.on_close or len(inspect.getargspec(self.on_close).args) != 3: + return [] + else: + if not self.on_close or len(inspect.getfullargspec(self.on_close).args) != 3: + return [] + + if data and len(data) >= 2: + code = 256 * six.byte2int(data[0:1]) + six.byte2int(data[1:2]) + reason = data[2:].decode('utf-8') + return [code, reason] + + return [None, None] + + def _callback(self, callback, *args): + if callback: + try: + if inspect.ismethod(callback): + callback(*args) + else: + callback(self, *args) + + except Exception as e: + _logging.error("error from callback {}: {}".format(callback, e)) + if _logging.isEnabledForDebug(): + _, _, tb = sys.exc_info() + traceback.print_tb(tb) diff --git a/sys.py/libs/websocket/_cookiejar.py b/sys.py/libs/websocket/_cookiejar.py new file mode 100644 index 0000000..3efeb0f --- /dev/null +++ b/sys.py/libs/websocket/_cookiejar.py @@ -0,0 +1,52 @@ +try: + import Cookie +except: + import http.cookies as Cookie + + +class SimpleCookieJar(object): + def __init__(self): + self.jar = dict() + + def add(self, set_cookie): + if set_cookie: + try: + simpleCookie = Cookie.SimpleCookie(set_cookie) + except: + simpleCookie = Cookie.SimpleCookie(set_cookie.encode('ascii', 'ignore')) + + for k, v in simpleCookie.items(): + domain = v.get("domain") + if domain: + if not domain.startswith("."): + domain = "." + domain + cookie = self.jar.get(domain) if self.jar.get(domain) else Cookie.SimpleCookie() + cookie.update(simpleCookie) + self.jar[domain.lower()] = cookie + + def set(self, set_cookie): + if set_cookie: + try: + simpleCookie = Cookie.SimpleCookie(set_cookie) + except: + simpleCookie = Cookie.SimpleCookie(set_cookie.encode('ascii', 'ignore')) + + for k, v in simpleCookie.items(): + domain = v.get("domain") + if domain: + if not domain.startswith("."): + domain = "." + domain + self.jar[domain.lower()] = simpleCookie + + def get(self, host): + if not host: + return "" + + cookies = [] + for domain, simpleCookie in self.jar.items(): + host = host.lower() + if host.endswith(domain) or host == domain[1:]: + cookies.append(self.jar.get(domain)) + + return "; ".join(filter(None, ["%s=%s" % (k, v.value) for cookie in filter(None, sorted(cookies)) for k, v in + sorted(cookie.items())])) diff --git a/sys.py/libs/websocket/_core.py b/sys.py/libs/websocket/_core.py new file mode 100644 index 0000000..0f914c2 --- /dev/null +++ b/sys.py/libs/websocket/_core.py @@ -0,0 +1,515 @@ +""" +websocket - WebSocket client library for Python + +Copyright (C) 2010 Hiroki Ohtani(liris) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1335 USA + +""" +from __future__ import print_function + +import socket +import struct +import threading +import time + +import six + +# websocket modules +from ._abnf import * +from ._exceptions import * +from ._handshake import * +from ._http import * +from ._logging import * +from ._socket import * +from ._ssl_compat import * +from ._utils import * + +__all__ = ['WebSocket', 'create_connection'] + +""" +websocket python client. +========================= + +This version support only hybi-13. +Please see http://tools.ietf.org/html/rfc6455 for protocol. +""" + + +class WebSocket(object): + """ + Low level WebSocket interface. + This class is based on + The WebSocket protocol draft-hixie-thewebsocketprotocol-76 + http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-76 + + We can connect to the websocket server and send/receive data. + The following example is an echo client. + + >>> import websocket + >>> ws = websocket.WebSocket() + >>> ws.connect("ws://echo.websocket.org") + >>> ws.send("Hello, Server") + >>> ws.recv() + 'Hello, Server' + >>> ws.close() + + get_mask_key: a callable to produce new mask keys, see the set_mask_key + function's docstring for more details + sockopt: values for socket.setsockopt. + sockopt must be tuple and each element is argument of sock.setsockopt. + sslopt: dict object for ssl socket option. + fire_cont_frame: fire recv event for each cont frame. default is False + enable_multithread: if set to True, lock send method. + skip_utf8_validation: skip utf8 validation. + """ + + def __init__(self, get_mask_key=None, sockopt=None, sslopt=None, + fire_cont_frame=False, enable_multithread=False, + skip_utf8_validation=False, **_): + """ + Initialize WebSocket object. + """ + self.sock_opt = sock_opt(sockopt, sslopt) + self.handshake_response = None + self.sock = None + + self.connected = False + self.get_mask_key = get_mask_key + # These buffer over the build-up of a single frame. + self.frame_buffer = frame_buffer(self._recv, skip_utf8_validation) + self.cont_frame = continuous_frame( + fire_cont_frame, skip_utf8_validation) + + if enable_multithread: + self.lock = threading.Lock() + self.readlock = threading.Lock() + else: + self.lock = NoLock() + self.readlock = NoLock() + + def __iter__(self): + """ + Allow iteration over websocket, implying sequential `recv` executions. + """ + while True: + yield self.recv() + + def __next__(self): + return self.recv() + + def next(self): + return self.__next__() + + def fileno(self): + return self.sock.fileno() + + def set_mask_key(self, func): + """ + set function to create musk key. You can customize mask key generator. + Mainly, this is for testing purpose. + + func: callable object. the func takes 1 argument as integer. + The argument means length of mask key. + This func must return string(byte array), + which length is argument specified. + """ + self.get_mask_key = func + + def gettimeout(self): + """ + Get the websocket timeout(second). + """ + return self.sock_opt.timeout + + def settimeout(self, timeout): + """ + Set the timeout to the websocket. + + timeout: timeout time(second). + """ + self.sock_opt.timeout = timeout + if self.sock: + self.sock.settimeout(timeout) + + timeout = property(gettimeout, settimeout) + + def getsubprotocol(self): + """ + get subprotocol + """ + if self.handshake_response: + return self.handshake_response.subprotocol + else: + return None + + subprotocol = property(getsubprotocol) + + def getstatus(self): + """ + get handshake status + """ + if self.handshake_response: + return self.handshake_response.status + else: + return None + + status = property(getstatus) + + def getheaders(self): + """ + get handshake response header + """ + if self.handshake_response: + return self.handshake_response.headers + else: + return None + + def is_ssl(self): + return isinstance(self.sock, ssl.SSLSocket) + + headers = property(getheaders) + + def connect(self, url, **options): + """ + Connect to url. url is websocket url scheme. + ie. ws://host:port/resource + You can customize using 'options'. + If you set "header" list object, you can set your own custom header. + + >>> ws = WebSocket() + >>> ws.connect("ws://echo.websocket.org/", + ... header=["User-Agent: MyProgram", + ... "x-custom: header"]) + + timeout: socket timeout time. This value is integer. + if you set None for this value, + it means "use default_timeout value" + + options: "header" -> custom http header list or dict. + "cookie" -> cookie value. + "origin" -> custom origin url. + "suppress_origin" -> suppress outputting origin header. + "host" -> custom host header string. + "http_proxy_host" - http proxy host name. + "http_proxy_port" - http proxy port. If not set, set to 80. + "http_no_proxy" - host names, which doesn't use proxy. + "http_proxy_auth" - http proxy auth information. + tuple of username and password. + default is None + "redirect_limit" -> number of redirects to follow. + "subprotocols" - array of available sub protocols. + default is None. + "socket" - pre-initialized stream socket. + + """ + # FIXME: "subprotocols" are getting lost, not passed down + # FIXME: "header", "cookie", "origin" and "host" too + self.sock_opt.timeout = options.get('timeout', self.sock_opt.timeout) + self.sock, addrs = connect(url, self.sock_opt, proxy_info(**options), + options.pop('socket', None)) + + try: + self.handshake_response = handshake(self.sock, *addrs, **options) + for attempt in range(options.pop('redirect_limit', 3)): + if self.handshake_response.status in SUPPORTED_REDIRECT_STATUSES: + url = self.handshake_response.headers['location'] + self.sock.close() + self.sock, addrs = connect(url, self.sock_opt, proxy_info(**options), + options.pop('socket', None)) + self.handshake_response = handshake(self.sock, *addrs, **options) + self.connected = True + except: + if self.sock: + self.sock.close() + self.sock = None + raise + + def send(self, payload, opcode=ABNF.OPCODE_TEXT): + """ + Send the data as string. + + payload: Payload must be utf-8 string or unicode, + if the opcode is OPCODE_TEXT. + Otherwise, it must be string(byte array) + + opcode: operation code to send. Please see OPCODE_XXX. + """ + + frame = ABNF.create_frame(payload, opcode) + return self.send_frame(frame) + + def send_frame(self, frame): + """ + Send the data frame. + + frame: frame data created by ABNF.create_frame + + >>> ws = create_connection("ws://echo.websocket.org/") + >>> frame = ABNF.create_frame("Hello", ABNF.OPCODE_TEXT) + >>> ws.send_frame(frame) + >>> cont_frame = ABNF.create_frame("My name is ", ABNF.OPCODE_CONT, 0) + >>> ws.send_frame(frame) + >>> cont_frame = ABNF.create_frame("Foo Bar", ABNF.OPCODE_CONT, 1) + >>> ws.send_frame(frame) + + """ + if self.get_mask_key: + frame.get_mask_key = self.get_mask_key + data = frame.format() + length = len(data) + trace("send: " + repr(data)) + + with self.lock: + while data: + l = self._send(data) + data = data[l:] + + return length + + def send_binary(self, payload): + return self.send(payload, ABNF.OPCODE_BINARY) + + def ping(self, payload=""): + """ + send ping data. + + payload: data payload to send server. + """ + if isinstance(payload, six.text_type): + payload = payload.encode("utf-8") + self.send(payload, ABNF.OPCODE_PING) + + def pong(self, payload): + """ + send pong data. + + payload: data payload to send server. + """ + if isinstance(payload, six.text_type): + payload = payload.encode("utf-8") + self.send(payload, ABNF.OPCODE_PONG) + + def recv(self): + """ + Receive string data(byte array) from the server. + + return value: string(byte array) value. + """ + with self.readlock: + opcode, data = self.recv_data() + if six.PY3 and opcode == ABNF.OPCODE_TEXT: + return data.decode("utf-8") + elif opcode == ABNF.OPCODE_TEXT or opcode == ABNF.OPCODE_BINARY: + return data + else: + return '' + + def recv_data(self, control_frame=False): + """ + Receive data with operation code. + + control_frame: a boolean flag indicating whether to return control frame + data, defaults to False + + return value: tuple of operation code and string(byte array) value. + """ + opcode, frame = self.recv_data_frame(control_frame) + return opcode, frame.data + + def recv_data_frame(self, control_frame=False): + """ + Receive data with operation code. + + control_frame: a boolean flag indicating whether to return control frame + data, defaults to False + + return value: tuple of operation code and string(byte array) value. + """ + while True: + frame = self.recv_frame() + if not frame: + # handle error: + # 'NoneType' object has no attribute 'opcode' + raise WebSocketProtocolException( + "Not a valid frame %s" % frame) + elif frame.opcode in (ABNF.OPCODE_TEXT, ABNF.OPCODE_BINARY, ABNF.OPCODE_CONT): + self.cont_frame.validate(frame) + self.cont_frame.add(frame) + + if self.cont_frame.is_fire(frame): + return self.cont_frame.extract(frame) + + elif frame.opcode == ABNF.OPCODE_CLOSE: + self.send_close() + return frame.opcode, frame + elif frame.opcode == ABNF.OPCODE_PING: + if len(frame.data) < 126: + self.pong(frame.data) + else: + raise WebSocketProtocolException( + "Ping message is too long") + if control_frame: + return frame.opcode, frame + elif frame.opcode == ABNF.OPCODE_PONG: + if control_frame: + return frame.opcode, frame + + def recv_frame(self): + """ + receive data as frame from server. + + return value: ABNF frame object. + """ + return self.frame_buffer.recv_frame() + + def send_close(self, status=STATUS_NORMAL, reason=six.b("")): + """ + send close data to the server. + + status: status code to send. see STATUS_XXX. + + reason: the reason to close. This must be string or bytes. + """ + if status < 0 or status >= ABNF.LENGTH_16: + raise ValueError("code is invalid range") + self.connected = False + self.send(struct.pack('!H', status) + reason, ABNF.OPCODE_CLOSE) + + def close(self, status=STATUS_NORMAL, reason=six.b(""), timeout=3): + """ + Close Websocket object + + status: status code to send. see STATUS_XXX. + + reason: the reason to close. This must be string. + + timeout: timeout until receive a close frame. + If None, it will wait forever until receive a close frame. + """ + if self.connected: + if status < 0 or status >= ABNF.LENGTH_16: + raise ValueError("code is invalid range") + + try: + self.connected = False + self.send(struct.pack('!H', status) + + reason, ABNF.OPCODE_CLOSE) + sock_timeout = self.sock.gettimeout() + self.sock.settimeout(timeout) + start_time = time.time() + while timeout is None or time.time() - start_time < timeout: + try: + frame = self.recv_frame() + if frame.opcode != ABNF.OPCODE_CLOSE: + continue + if isEnabledForError(): + recv_status = struct.unpack("!H", frame.data[0:2])[0] + if recv_status != STATUS_NORMAL: + error("close status: " + repr(recv_status)) + break + except: + break + self.sock.settimeout(sock_timeout) + self.sock.shutdown(socket.SHUT_RDWR) + except: + pass + + self.shutdown() + + def abort(self): + """ + Low-level asynchronous abort, wakes up other threads that are waiting in recv_* + """ + if self.connected: + self.sock.shutdown(socket.SHUT_RDWR) + + def shutdown(self): + """close socket, immediately.""" + if self.sock: + self.sock.close() + self.sock = None + self.connected = False + + def _send(self, data): + return send(self.sock, data) + + def _recv(self, bufsize): + try: + return recv(self.sock, bufsize) + except WebSocketConnectionClosedException: + if self.sock: + self.sock.close() + self.sock = None + self.connected = False + raise + + +def create_connection(url, timeout=None, class_=WebSocket, **options): + """ + connect to url and return websocket object. + + Connect to url and return the WebSocket object. + Passing optional timeout parameter will set the timeout on the socket. + If no timeout is supplied, + the global default timeout setting returned by getdefauttimeout() is used. + You can customize using 'options'. + If you set "header" list object, you can set your own custom header. + + >>> conn = create_connection("ws://echo.websocket.org/", + ... header=["User-Agent: MyProgram", + ... "x-custom: header"]) + + + timeout: socket timeout time. This value is integer. + if you set None for this value, + it means "use default_timeout value" + + class_: class to instantiate when creating the connection. It has to implement + settimeout and connect. It's __init__ should be compatible with + WebSocket.__init__, i.e. accept all of it's kwargs. + options: "header" -> custom http header list or dict. + "cookie" -> cookie value. + "origin" -> custom origin url. + "suppress_origin" -> suppress outputting origin header. + "host" -> custom host header string. + "http_proxy_host" - http proxy host name. + "http_proxy_port" - http proxy port. If not set, set to 80. + "http_no_proxy" - host names, which doesn't use proxy. + "http_proxy_auth" - http proxy auth information. + tuple of username and password. + default is None + "enable_multithread" -> enable lock for multithread. + "redirect_limit" -> number of redirects to follow. + "sockopt" -> socket options + "sslopt" -> ssl option + "subprotocols" - array of available sub protocols. + default is None. + "skip_utf8_validation" - skip utf8 validation. + "socket" - pre-initialized stream socket. + """ + sockopt = options.pop("sockopt", []) + sslopt = options.pop("sslopt", {}) + fire_cont_frame = options.pop("fire_cont_frame", False) + enable_multithread = options.pop("enable_multithread", False) + skip_utf8_validation = options.pop("skip_utf8_validation", False) + websock = class_(sockopt=sockopt, sslopt=sslopt, + fire_cont_frame=fire_cont_frame, + enable_multithread=enable_multithread, + skip_utf8_validation=skip_utf8_validation, **options) + websock.settimeout(timeout if timeout is not None else getdefaulttimeout()) + websock.connect(url, **options) + return websock diff --git a/sys.py/libs/websocket/_exceptions.py b/sys.py/libs/websocket/_exceptions.py new file mode 100644 index 0000000..b7a61d3 --- /dev/null +++ b/sys.py/libs/websocket/_exceptions.py @@ -0,0 +1,87 @@ +""" +websocket - WebSocket client library for Python + +Copyright (C) 2010 Hiroki Ohtani(liris) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1335 USA + +""" + + +""" +define websocket exceptions +""" + + +class WebSocketException(Exception): + """ + websocket exception class. + """ + pass + + +class WebSocketProtocolException(WebSocketException): + """ + If the websocket protocol is invalid, this exception will be raised. + """ + pass + + +class WebSocketPayloadException(WebSocketException): + """ + If the websocket payload is invalid, this exception will be raised. + """ + pass + + +class WebSocketConnectionClosedException(WebSocketException): + """ + If remote host closed the connection or some network error happened, + this exception will be raised. + """ + pass + + +class WebSocketTimeoutException(WebSocketException): + """ + WebSocketTimeoutException will be raised at socket timeout during read/write data. + """ + pass + + +class WebSocketProxyException(WebSocketException): + """ + WebSocketProxyException will be raised when proxy error occurred. + """ + pass + + +class WebSocketBadStatusException(WebSocketException): + """ + WebSocketBadStatusException will be raised when we get bad handshake status code. + """ + + def __init__(self, message, status_code, status_message=None, resp_headers=None): + msg = message % (status_code, status_message) + super(WebSocketBadStatusException, self).__init__(msg) + self.status_code = status_code + self.resp_headers = resp_headers + +class WebSocketAddressException(WebSocketException): + """ + If the websocket address info cannot be found, this exception will be raised. + """ + pass diff --git a/sys.py/libs/websocket/_handshake.py b/sys.py/libs/websocket/_handshake.py new file mode 100644 index 0000000..809a8c9 --- /dev/null +++ b/sys.py/libs/websocket/_handshake.py @@ -0,0 +1,205 @@ +""" +websocket - WebSocket client library for Python + +Copyright (C) 2010 Hiroki Ohtani(liris) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1335 USA + +""" +import hashlib +import hmac +import os + +import six + +from ._cookiejar import SimpleCookieJar +from ._exceptions import * +from ._http import * +from ._logging import * +from ._socket import * + +if six.PY3: + from base64 import encodebytes as base64encode +else: + from base64 import encodestring as base64encode + +if six.PY3: + if six.PY34: + from http import client as HTTPStatus + else: + from http import HTTPStatus +else: + import httplib as HTTPStatus + +__all__ = ["handshake_response", "handshake", "SUPPORTED_REDIRECT_STATUSES"] + +if hasattr(hmac, "compare_digest"): + compare_digest = hmac.compare_digest +else: + def compare_digest(s1, s2): + return s1 == s2 + +# websocket supported version. +VERSION = 13 + +SUPPORTED_REDIRECT_STATUSES = [HTTPStatus.MOVED_PERMANENTLY, HTTPStatus.FOUND, HTTPStatus.SEE_OTHER] + +CookieJar = SimpleCookieJar() + + +class handshake_response(object): + + def __init__(self, status, headers, subprotocol): + self.status = status + self.headers = headers + self.subprotocol = subprotocol + CookieJar.add(headers.get("set-cookie")) + + +def handshake(sock, hostname, port, resource, **options): + headers, key = _get_handshake_headers(resource, hostname, port, options) + + header_str = "\r\n".join(headers) + send(sock, header_str) + dump("request header", header_str) + + status, resp = _get_resp_headers(sock) + if status in SUPPORTED_REDIRECT_STATUSES: + return handshake_response(status, resp, None) + success, subproto = _validate(resp, key, options.get("subprotocols")) + if not success: + raise WebSocketException("Invalid WebSocket Header") + + return handshake_response(status, resp, subproto) + +def _pack_hostname(hostname): + # IPv6 address + if ':' in hostname: + return '[' + hostname + ']' + + return hostname + +def _get_handshake_headers(resource, host, port, options): + headers = [ + "GET %s HTTP/1.1" % resource, + "Upgrade: websocket", + "Connection: Upgrade" + ] + if port == 80 or port == 443: + hostport = _pack_hostname(host) + else: + hostport = "%s:%d" % (_pack_hostname(host), port) + + if "host" in options and options["host"] is not None: + headers.append("Host: %s" % options["host"]) + else: + headers.append("Host: %s" % hostport) + + if "suppress_origin" not in options or not options["suppress_origin"]: + if "origin" in options and options["origin"] is not None: + headers.append("Origin: %s" % options["origin"]) + else: + headers.append("Origin: http://%s" % hostport) + + key = _create_sec_websocket_key() + + # Append Sec-WebSocket-Key & Sec-WebSocket-Version if not manually specified + if not 'header' in options or 'Sec-WebSocket-Key' not in options['header']: + key = _create_sec_websocket_key() + headers.append("Sec-WebSocket-Key: %s" % key) + else: + key = options['header']['Sec-WebSocket-Key'] + + if not 'header' in options or 'Sec-WebSocket-Version' not in options['header']: + headers.append("Sec-WebSocket-Version: %s" % VERSION) + + subprotocols = options.get("subprotocols") + if subprotocols: + headers.append("Sec-WebSocket-Protocol: %s" % ",".join(subprotocols)) + + if "header" in options: + header = options["header"] + if isinstance(header, dict): + header = [ + ": ".join([k, v]) + for k, v in header.items() + if v is not None + ] + headers.extend(header) + + server_cookie = CookieJar.get(host) + client_cookie = options.get("cookie", None) + + cookie = "; ".join(filter(None, [server_cookie, client_cookie])) + + if cookie: + headers.append("Cookie: %s" % cookie) + + headers.append("") + headers.append("") + + return headers, key + + +def _get_resp_headers(sock, success_statuses=(101, 301, 302, 303)): + status, resp_headers, status_message = read_headers(sock) + if status not in success_statuses: + raise WebSocketBadStatusException("Handshake status %d %s", status, status_message, resp_headers) + return status, resp_headers + +_HEADERS_TO_CHECK = { + "upgrade": "websocket", + "connection": "upgrade", +} + + +def _validate(headers, key, subprotocols): + subproto = None + for k, v in _HEADERS_TO_CHECK.items(): + r = headers.get(k, None) + if not r: + return False, None + r = r.lower() + if v != r: + return False, None + + if subprotocols: + subproto = headers.get("sec-websocket-protocol", None).lower() + if not subproto or subproto not in [s.lower() for s in subprotocols]: + error("Invalid subprotocol: " + str(subprotocols)) + return False, None + + result = headers.get("sec-websocket-accept", None) + if not result: + return False, None + result = result.lower() + + if isinstance(result, six.text_type): + result = result.encode('utf-8') + + value = (key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11").encode('utf-8') + hashed = base64encode(hashlib.sha1(value).digest()).strip().lower() + success = compare_digest(hashed, result) + + if success: + return True, subproto + else: + return False, None + + +def _create_sec_websocket_key(): + randomness = os.urandom(16) + return base64encode(randomness).decode('utf-8').strip() diff --git a/sys.py/libs/websocket/_http.py b/sys.py/libs/websocket/_http.py new file mode 100644 index 0000000..5b9a26d --- /dev/null +++ b/sys.py/libs/websocket/_http.py @@ -0,0 +1,326 @@ +""" +websocket - WebSocket client library for Python + +Copyright (C) 2010 Hiroki Ohtani(liris) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1335 USA + +""" +import errno +import os +import socket +import sys + +import six + +from ._exceptions import * +from ._logging import * +from ._socket import* +from ._ssl_compat import * +from ._url import * + +if six.PY3: + from base64 import encodebytes as base64encode +else: + from base64 import encodestring as base64encode + +__all__ = ["proxy_info", "connect", "read_headers"] + +try: + import socks + ProxyConnectionError = socks.ProxyConnectionError + HAS_PYSOCKS = True +except: + class ProxyConnectionError(BaseException): + pass + HAS_PYSOCKS = False + +class proxy_info(object): + + def __init__(self, **options): + self.type = options.get("proxy_type") or "http" + if not(self.type in ['http', 'socks4', 'socks5', 'socks5h']): + raise ValueError("proxy_type must be 'http', 'socks4', 'socks5' or 'socks5h'") + self.host = options.get("http_proxy_host", None) + if self.host: + self.port = options.get("http_proxy_port", 0) + self.auth = options.get("http_proxy_auth", None) + self.no_proxy = options.get("http_no_proxy", None) + else: + self.port = 0 + self.auth = None + self.no_proxy = None + +def _open_proxied_socket(url, options, proxy): + hostname, port, resource, is_secure = parse_url(url) + + if not HAS_PYSOCKS: + raise WebSocketException("PySocks module not found.") + + ptype = socks.SOCKS5 + rdns = False + if proxy.type == "socks4": + ptype = socks.SOCKS4 + if proxy.type == "http": + ptype = socks.HTTP + if proxy.type[-1] == "h": + rdns = True + + sock = socks.create_connection( + (hostname, port), + proxy_type = ptype, + proxy_addr = proxy.host, + proxy_port = proxy.port, + proxy_rdns = rdns, + proxy_username = proxy.auth[0] if proxy.auth else None, + proxy_password = proxy.auth[1] if proxy.auth else None, + timeout = options.timeout, + socket_options = DEFAULT_SOCKET_OPTION + options.sockopt + ) + + if is_secure: + if HAVE_SSL: + sock = _ssl_socket(sock, options.sslopt, hostname) + else: + raise WebSocketException("SSL not available.") + + return sock, (hostname, port, resource) + + +def connect(url, options, proxy, socket): + if proxy.host and not socket and not (proxy.type == 'http'): + return _open_proxied_socket(url, options, proxy) + + hostname, port, resource, is_secure = parse_url(url) + + if socket: + return socket, (hostname, port, resource) + + addrinfo_list, need_tunnel, auth = _get_addrinfo_list( + hostname, port, is_secure, proxy) + if not addrinfo_list: + raise WebSocketException( + "Host not found.: " + hostname + ":" + str(port)) + + sock = None + try: + sock = _open_socket(addrinfo_list, options.sockopt, options.timeout) + if need_tunnel: + sock = _tunnel(sock, hostname, port, auth) + + if is_secure: + if HAVE_SSL: + sock = _ssl_socket(sock, options.sslopt, hostname) + else: + raise WebSocketException("SSL not available.") + + return sock, (hostname, port, resource) + except: + if sock: + sock.close() + raise + + +def _get_addrinfo_list(hostname, port, is_secure, proxy): + phost, pport, pauth = get_proxy_info( + hostname, is_secure, proxy.host, proxy.port, proxy.auth, proxy.no_proxy) + try: + if not phost: + addrinfo_list = socket.getaddrinfo( + hostname, port, 0, 0, socket.SOL_TCP) + return addrinfo_list, False, None + else: + pport = pport and pport or 80 + # when running on windows 10, the getaddrinfo used above + # returns a socktype 0. This generates an error exception: + #_on_error: exception Socket type must be stream or datagram, not 0 + # Force the socket type to SOCK_STREAM + addrinfo_list = socket.getaddrinfo(phost, pport, 0, socket.SOCK_STREAM, socket.SOL_TCP) + return addrinfo_list, True, pauth + except socket.gaierror as e: + raise WebSocketAddressException(e) + + +def _open_socket(addrinfo_list, sockopt, timeout): + err = None + for addrinfo in addrinfo_list: + family, socktype, proto = addrinfo[:3] + sock = socket.socket(family, socktype, proto) + sock.settimeout(timeout) + for opts in DEFAULT_SOCKET_OPTION: + sock.setsockopt(*opts) + for opts in sockopt: + sock.setsockopt(*opts) + + address = addrinfo[4] + err = None + while not err: + try: + sock.connect(address) + except ProxyConnectionError as error: + err = WebSocketProxyException(str(error)) + err.remote_ip = str(address[0]) + continue + except socket.error as error: + error.remote_ip = str(address[0]) + try: + eConnRefused = (errno.ECONNREFUSED, errno.WSAECONNREFUSED) + except: + eConnRefused = (errno.ECONNREFUSED, ) + if error.errno == errno.EINTR: + continue + elif error.errno in eConnRefused: + err = error + continue + else: + raise error + else: + break + else: + continue + break + else: + if err: + raise err + + return sock + + +def _can_use_sni(): + return six.PY2 and sys.version_info >= (2, 7, 9) or sys.version_info >= (3, 2) + + +def _wrap_sni_socket(sock, sslopt, hostname, check_hostname): + context = ssl.SSLContext(sslopt.get('ssl_version', ssl.PROTOCOL_SSLv23)) + + if sslopt.get('cert_reqs', ssl.CERT_NONE) != ssl.CERT_NONE: + cafile = sslopt.get('ca_certs', None) + capath = sslopt.get('ca_cert_path', None) + if cafile or capath: + context.load_verify_locations(cafile=cafile, capath=capath) + elif hasattr(context, 'load_default_certs'): + context.load_default_certs(ssl.Purpose.SERVER_AUTH) + if sslopt.get('certfile', None): + context.load_cert_chain( + sslopt['certfile'], + sslopt.get('keyfile', None), + sslopt.get('password', None), + ) + # see + # https://github.com/liris/websocket-client/commit/b96a2e8fa765753e82eea531adb19716b52ca3ca#commitcomment-10803153 + context.verify_mode = sslopt['cert_reqs'] + if HAVE_CONTEXT_CHECK_HOSTNAME: + context.check_hostname = check_hostname + if 'ciphers' in sslopt: + context.set_ciphers(sslopt['ciphers']) + if 'cert_chain' in sslopt: + certfile, keyfile, password = sslopt['cert_chain'] + context.load_cert_chain(certfile, keyfile, password) + if 'ecdh_curve' in sslopt: + context.set_ecdh_curve(sslopt['ecdh_curve']) + + return context.wrap_socket( + sock, + do_handshake_on_connect=sslopt.get('do_handshake_on_connect', True), + suppress_ragged_eofs=sslopt.get('suppress_ragged_eofs', True), + server_hostname=hostname, + ) + + +def _ssl_socket(sock, user_sslopt, hostname): + sslopt = dict(cert_reqs=ssl.CERT_REQUIRED) + sslopt.update(user_sslopt) + + certPath = os.environ.get('WEBSOCKET_CLIENT_CA_BUNDLE') + if certPath and os.path.isfile(certPath) \ + and user_sslopt.get('ca_certs', None) is None \ + and user_sslopt.get('ca_cert', None) is None: + sslopt['ca_certs'] = certPath + elif certPath and os.path.isdir(certPath) \ + and user_sslopt.get('ca_cert_path', None) is None: + sslopt['ca_cert_path'] = certPath + + check_hostname = sslopt["cert_reqs"] != ssl.CERT_NONE and sslopt.pop( + 'check_hostname', True) + + if _can_use_sni(): + sock = _wrap_sni_socket(sock, sslopt, hostname, check_hostname) + else: + sslopt.pop('check_hostname', True) + sock = ssl.wrap_socket(sock, **sslopt) + + if not HAVE_CONTEXT_CHECK_HOSTNAME and check_hostname: + match_hostname(sock.getpeercert(), hostname) + + return sock + + +def _tunnel(sock, host, port, auth): + debug("Connecting proxy...") + connect_header = "CONNECT %s:%d HTTP/1.0\r\n" % (host, port) + # TODO: support digest auth. + if auth and auth[0]: + auth_str = auth[0] + if auth[1]: + auth_str += ":" + auth[1] + encoded_str = base64encode(auth_str.encode()).strip().decode() + connect_header += "Proxy-Authorization: Basic %s\r\n" % encoded_str + connect_header += "\r\n" + dump("request header", connect_header) + + send(sock, connect_header) + + try: + status, resp_headers, status_message = read_headers(sock) + except Exception as e: + raise WebSocketProxyException(str(e)) + + if status != 200: + raise WebSocketProxyException( + "failed CONNECT via proxy status: %r" % status) + + return sock + + +def read_headers(sock): + status = None + status_message = None + headers = {} + trace("--- response header ---") + + while True: + line = recv_line(sock) + line = line.decode('utf-8').strip() + if not line: + break + trace(line) + if not status: + + status_info = line.split(" ", 2) + status = int(status_info[1]) + if len(status_info) > 2: + status_message = status_info[2] + else: + kv = line.split(":", 1) + if len(kv) == 2: + key, value = kv + headers[key.lower()] = value.strip() + else: + raise WebSocketException("Invalid header") + + trace("-----------------------") + + return status, headers, status_message diff --git a/sys.py/libs/websocket/_logging.py b/sys.py/libs/websocket/_logging.py new file mode 100644 index 0000000..70a6271 --- /dev/null +++ b/sys.py/libs/websocket/_logging.py @@ -0,0 +1,82 @@ +""" +websocket - WebSocket client library for Python + +Copyright (C) 2010 Hiroki Ohtani(liris) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1335 USA + +""" +import logging + +_logger = logging.getLogger('websocket') +try: + from logging import NullHandler +except ImportError: + class NullHandler(logging.Handler): + def emit(self, record): + pass + +_logger.addHandler(NullHandler()) + +_traceEnabled = False + +__all__ = ["enableTrace", "dump", "error", "warning", "debug", "trace", + "isEnabledForError", "isEnabledForDebug"] + + +def enableTrace(traceable, handler = logging.StreamHandler()): + """ + turn on/off the traceability. + + traceable: boolean value. if set True, traceability is enabled. + """ + global _traceEnabled + _traceEnabled = traceable + if traceable: + _logger.addHandler(handler) + _logger.setLevel(logging.DEBUG) + + +def dump(title, message): + if _traceEnabled: + _logger.debug("--- " + title + " ---") + _logger.debug(message) + _logger.debug("-----------------------") + + +def error(msg): + _logger.error(msg) + + +def warning(msg): + _logger.warning(msg) + + +def debug(msg): + _logger.debug(msg) + + +def trace(msg): + if _traceEnabled: + _logger.debug(msg) + + +def isEnabledForError(): + return _logger.isEnabledFor(logging.ERROR) + + +def isEnabledForDebug(): + return _logger.isEnabledFor(logging.DEBUG) diff --git a/sys.py/libs/websocket/_socket.py b/sys.py/libs/websocket/_socket.py new file mode 100644 index 0000000..7be3913 --- /dev/null +++ b/sys.py/libs/websocket/_socket.py @@ -0,0 +1,166 @@ +""" +websocket - WebSocket client library for Python + +Copyright (C) 2010 Hiroki Ohtani(liris) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1335 USA + +""" +import errno +import select +import socket + +import six +import sys + +from ._exceptions import * +from ._ssl_compat import * +from ._utils import * + +DEFAULT_SOCKET_OPTION = [(socket.SOL_TCP, socket.TCP_NODELAY, 1)] +if hasattr(socket, "SO_KEEPALIVE"): + DEFAULT_SOCKET_OPTION.append((socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)) +if hasattr(socket, "TCP_KEEPIDLE"): + DEFAULT_SOCKET_OPTION.append((socket.SOL_TCP, socket.TCP_KEEPIDLE, 30)) +if hasattr(socket, "TCP_KEEPINTVL"): + DEFAULT_SOCKET_OPTION.append((socket.SOL_TCP, socket.TCP_KEEPINTVL, 10)) +if hasattr(socket, "TCP_KEEPCNT"): + DEFAULT_SOCKET_OPTION.append((socket.SOL_TCP, socket.TCP_KEEPCNT, 3)) + +_default_timeout = None + +__all__ = ["DEFAULT_SOCKET_OPTION", "sock_opt", "setdefaulttimeout", "getdefaulttimeout", + "recv", "recv_line", "send"] + + +class sock_opt(object): + + def __init__(self, sockopt, sslopt): + if sockopt is None: + sockopt = [] + if sslopt is None: + sslopt = {} + self.sockopt = sockopt + self.sslopt = sslopt + self.timeout = None + + +def setdefaulttimeout(timeout): + """ + Set the global timeout setting to connect. + + timeout: default socket timeout time. This value is second. + """ + global _default_timeout + _default_timeout = timeout + + +def getdefaulttimeout(): + """ + Return the global timeout setting(second) to connect. + """ + return _default_timeout + + +def recv(sock, bufsize): + if not sock: + raise WebSocketConnectionClosedException("socket is already closed.") + + def _recv(): + try: + return sock.recv(bufsize) + except SSLWantReadError: + pass + except socket.error as exc: + error_code = extract_error_code(exc) + if error_code is None: + raise + if error_code != errno.EAGAIN or error_code != errno.EWOULDBLOCK: + raise + + r, w, e = select.select((sock, ), (), (), sock.gettimeout()) + if r: + return sock.recv(bufsize) + + try: + if sock.gettimeout() == 0: + bytes_ = sock.recv(bufsize) + else: + bytes_ = _recv() + except socket.timeout as e: + message = extract_err_message(e) + raise WebSocketTimeoutException(message) + except SSLError as e: + message = extract_err_message(e) + if isinstance(message, str) and 'timed out' in message: + raise WebSocketTimeoutException(message) + else: + raise + + if not bytes_: + raise WebSocketConnectionClosedException( + "Connection is already closed.") + + return bytes_ + + +def recv_line(sock): + line = [] + while True: + c = recv(sock, 1) + line.append(c) + if c == six.b("\n"): + break + return six.b("").join(line) + + +def send(sock, data): + if isinstance(data, six.text_type): + data = data.encode('utf-8') + + if not sock: + raise WebSocketConnectionClosedException("socket is already closed.") + + def _send(): + try: + return sock.send(data) + except SSLWantWriteError: + pass + except socket.error as exc: + error_code = extract_error_code(exc) + if error_code is None: + raise + if error_code != errno.EAGAIN or error_code != errno.EWOULDBLOCK: + raise + + r, w, e = select.select((), (sock, ), (), sock.gettimeout()) + if w: + return sock.send(data) + + try: + if sock.gettimeout() == 0: + return sock.send(data) + else: + return _send() + except socket.timeout as e: + message = extract_err_message(e) + raise WebSocketTimeoutException(message) + except Exception as e: + message = extract_err_message(e) + if isinstance(message, str) and "timed out" in message: + raise WebSocketTimeoutException(message) + else: + raise diff --git a/sys.py/libs/websocket/_ssl_compat.py b/sys.py/libs/websocket/_ssl_compat.py new file mode 100644 index 0000000..5b3c413 --- /dev/null +++ b/sys.py/libs/websocket/_ssl_compat.py @@ -0,0 +1,52 @@ +""" +websocket - WebSocket client library for Python + +Copyright (C) 2010 Hiroki Ohtani(liris) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1335 USA + +""" +__all__ = ["HAVE_SSL", "ssl", "SSLError", "SSLWantReadError", "SSLWantWriteError"] + +try: + import ssl + from ssl import SSLError + from ssl import SSLWantReadError + from ssl import SSLWantWriteError + if hasattr(ssl, 'SSLContext') and hasattr(ssl.SSLContext, 'check_hostname'): + HAVE_CONTEXT_CHECK_HOSTNAME = True + else: + HAVE_CONTEXT_CHECK_HOSTNAME = False + if hasattr(ssl, "match_hostname"): + from ssl import match_hostname + else: + from backports.ssl_match_hostname import match_hostname + __all__.append("match_hostname") + __all__.append("HAVE_CONTEXT_CHECK_HOSTNAME") + + HAVE_SSL = True +except ImportError: + # dummy class of SSLError for ssl none-support environment. + class SSLError(Exception): + pass + + class SSLWantReadError(Exception): + pass + + class SSLWantWriteError(Exception): + pass + + HAVE_SSL = False diff --git a/sys.py/libs/websocket/_url.py b/sys.py/libs/websocket/_url.py new file mode 100644 index 0000000..ae46d6c --- /dev/null +++ b/sys.py/libs/websocket/_url.py @@ -0,0 +1,163 @@ +""" +websocket - WebSocket client library for Python + +Copyright (C) 2010 Hiroki Ohtani(liris) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1335 USA + +""" + +import os +import socket +import struct + +from six.moves.urllib.parse import urlparse + + +__all__ = ["parse_url", "get_proxy_info"] + + +def parse_url(url): + """ + parse url and the result is tuple of + (hostname, port, resource path and the flag of secure mode) + + url: url string. + """ + if ":" not in url: + raise ValueError("url is invalid") + + scheme, url = url.split(":", 1) + + parsed = urlparse(url, scheme="ws") + if parsed.hostname: + hostname = parsed.hostname + else: + raise ValueError("hostname is invalid") + port = 0 + if parsed.port: + port = parsed.port + + is_secure = False + if scheme == "ws": + if not port: + port = 80 + elif scheme == "wss": + is_secure = True + if not port: + port = 443 + else: + raise ValueError("scheme %s is invalid" % scheme) + + if parsed.path: + resource = parsed.path + else: + resource = "/" + + if parsed.query: + resource += "?" + parsed.query + + return hostname, port, resource, is_secure + + +DEFAULT_NO_PROXY_HOST = ["localhost", "127.0.0.1"] + + +def _is_ip_address(addr): + try: + socket.inet_aton(addr) + except socket.error: + return False + else: + return True + + +def _is_subnet_address(hostname): + try: + addr, netmask = hostname.split("/") + return _is_ip_address(addr) and 0 <= int(netmask) < 32 + except ValueError: + return False + + +def _is_address_in_network(ip, net): + ipaddr = struct.unpack('I', socket.inet_aton(ip))[0] + netaddr, bits = net.split('/') + netmask = struct.unpack('I', socket.inet_aton(netaddr))[0] & ((2 << int(bits) - 1) - 1) + return ipaddr & netmask == netmask + + +def _is_no_proxy_host(hostname, no_proxy): + if not no_proxy: + v = os.environ.get("no_proxy", "").replace(" ", "") + no_proxy = v.split(",") + if not no_proxy: + no_proxy = DEFAULT_NO_PROXY_HOST + + if hostname in no_proxy: + return True + elif _is_ip_address(hostname): + return any([_is_address_in_network(hostname, subnet) for subnet in no_proxy if _is_subnet_address(subnet)]) + + return False + + +def get_proxy_info( + hostname, is_secure, proxy_host=None, proxy_port=0, proxy_auth=None, + no_proxy=None, proxy_type='http'): + """ + try to retrieve proxy host and port from environment + if not provided in options. + result is (proxy_host, proxy_port, proxy_auth). + proxy_auth is tuple of username and password + of proxy authentication information. + + hostname: websocket server name. + + is_secure: is the connection secure? (wss) + looks for "https_proxy" in env + before falling back to "http_proxy" + + options: "http_proxy_host" - http proxy host name. + "http_proxy_port" - http proxy port. + "http_no_proxy" - host names, which doesn't use proxy. + "http_proxy_auth" - http proxy auth information. + tuple of username and password. + default is None + "proxy_type" - if set to "socks5" PySocks wrapper + will be used in place of a http proxy. + default is "http" + """ + if _is_no_proxy_host(hostname, no_proxy): + return None, 0, None + + if proxy_host: + port = proxy_port + auth = proxy_auth + return proxy_host, port, auth + + env_keys = ["http_proxy"] + if is_secure: + env_keys.insert(0, "https_proxy") + + for key in env_keys: + value = os.environ.get(key, None) + if value: + proxy = urlparse(value) + auth = (proxy.username, proxy.password) if proxy.username else None + return proxy.hostname, proxy.port, auth + + return None, 0, None diff --git a/sys.py/libs/websocket/_utils.py b/sys.py/libs/websocket/_utils.py new file mode 100644 index 0000000..8eddabf --- /dev/null +++ b/sys.py/libs/websocket/_utils.py @@ -0,0 +1,110 @@ +""" +websocket - WebSocket client library for Python + +Copyright (C) 2010 Hiroki Ohtani(liris) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1335 USA + +""" +import six + +__all__ = ["NoLock", "validate_utf8", "extract_err_message", "extract_error_code"] + + +class NoLock(object): + + def __enter__(self): + pass + + def __exit__(self, exc_type, exc_value, traceback): + pass + +try: + # If wsaccel is available we use compiled routines to validate UTF-8 + # strings. + from wsaccel.utf8validator import Utf8Validator + + def _validate_utf8(utfbytes): + return Utf8Validator().validate(utfbytes)[0] + +except ImportError: + # UTF-8 validator + # python implementation of http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ + + _UTF8_ACCEPT = 0 + _UTF8_REJECT = 12 + + _UTF8D = [ + # The first part of the table maps bytes to character classes that + # to reduce the size of the transition table and create bitmasks. + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8, + + # The second part is a transition table that maps a combination + # of a state of the automaton and a character class to a state. + 0,12,24,36,60,96,84,12,12,12,48,72, 12,12,12,12,12,12,12,12,12,12,12,12, + 12, 0,12,12,12,12,12, 0,12, 0,12,12, 12,24,12,12,12,12,12,24,12,24,12,12, + 12,12,12,12,12,12,12,24,12,12,12,12, 12,24,12,12,12,12,12,12,12,24,12,12, + 12,12,12,12,12,12,12,36,12,36,12,12, 12,36,12,12,12,12,12,36,12,36,12,12, + 12,36,12,12,12,12,12,12,12,12,12,12, ] + + def _decode(state, codep, ch): + tp = _UTF8D[ch] + + codep = (ch & 0x3f) | (codep << 6) if ( + state != _UTF8_ACCEPT) else (0xff >> tp) & ch + state = _UTF8D[256 + state + tp] + + return state, codep + + def _validate_utf8(utfbytes): + state = _UTF8_ACCEPT + codep = 0 + for i in utfbytes: + if six.PY2: + i = ord(i) + state, codep = _decode(state, codep, i) + if state == _UTF8_REJECT: + return False + + return True + + +def validate_utf8(utfbytes): + """ + validate utf8 byte string. + utfbytes: utf byte string to check. + return value: if valid utf8 string, return true. Otherwise, return false. + """ + return _validate_utf8(utfbytes) + + +def extract_err_message(exception): + if exception.args: + return exception.args[0] + else: + return None + + +def extract_error_code(exception): + if exception.args and len(exception.args) > 1: + return exception.args[0] if isinstance(exception.args[0], int) else None diff --git a/sys.py/patches/mame2003_plus_libretro.so.zip/Run.sh b/sys.py/patches/mame2003_plus_libretro.so.zip/Run.sh new file mode 100755 index 0000000..af48969 --- /dev/null +++ b/sys.py/patches/mame2003_plus_libretro.so.zip/Run.sh @@ -0,0 +1,46 @@ +#!/bin/bash + +cat >~/.config/retroarch/retroarch-core-options.cfg<<'EOF' +mame2003-plus_analog = "digital" +mame2003-plus_art_resolution = "1" +mame2003-plus_brightness = "1.0" +mame2003-plus_cheat_input_ports = "disabled" +mame2003-plus_core_save_subfolder = "enabled" +mame2003-plus_core_sys_subfolder = "enabled" +mame2003-plus_dcs_speedhack = "disabled" +mame2003-plus_deadzone = "20" +mame2003-plus_display_artwork = "enabled" +mame2003-plus_display_setup = "disabled" +mame2003-plus_four_way_emulation = "disabled" +mame2003-plus_frameskip = "0" +mame2003-plus_gamma = "1.2" +mame2003-plus_input_interface = "retropad" +mame2003-plus_machine_timing = "enabled" +mame2003-plus_mame_remapping = "enabled" +mame2003-plus_mouse_device = "mouse" +mame2003-plus_neogeo_bios = "default" +mame2003-plus_rstick_to_btns = "enabled" +mame2003-plus_sample_rate = "48000" +mame2003-plus_skip_disclaimer = "disabled" +mame2003-plus_skip_warnings = "disabled" +mame2003-plus_tate_mode = "disabled" +mame2003_art_resolution = "1" +mame2003_brightness = "1.0" +mame2003_core_save_subfolder = "enabled" +mame2003_core_sys_subfolder = "enabled" +mame2003_dcs_speedhack = "enabled" +mame2003_display_artwork = "enabled" +mame2003_display_setup = "disabled" +mame2003_four_way_emulation = "disabled" +mame2003_frameskip = "0" +mame2003_gamma = "1.0" +mame2003_input_interface = "simultaneous" +mame2003_mame_remapping = "enabled" +mame2003_mouse_device = "mouse" +mame2003_neogeo_bios = "default" +mame2003_rstick_to_btns = "enabled" +mame2003_sample_rate = "48000" +mame2003_skip_disclaimer = "disabled" +mame2003_skip_warnings = "disabled" +mame2003_tate_mode = "disabled" +EOF diff --git a/sys.py/pyaria2_rpc/.gitignore b/sys.py/pyaria2_rpc/.gitignore new file mode 100644 index 0000000..0e16dd0 --- /dev/null +++ b/sys.py/pyaria2_rpc/.gitignore @@ -0,0 +1,3 @@ +*.pyc +*.swp + diff --git a/sys.py/pyaria2_rpc/README.md b/sys.py/pyaria2_rpc/README.md new file mode 100644 index 0000000..5449f5f --- /dev/null +++ b/sys.py/pyaria2_rpc/README.md @@ -0,0 +1,32 @@ +```python +from pyaria2 import Jsonrpc +jsonrpc = Jsonrpc('localhost', 6800) +resp = jsonrpc.addUri('https://download.freebsd.org/ftp/releases/ISO-IMAGES/12.0/FreeBSD-122222.0-RELEASE-amd64-memstick.img', options={"out": "fbsd.img"}) +print resp +# {"id":0,"jsonrpc":"2.0","result":"3f6fa9aa6428a25f"} +``` +```python +from pyaria2 import Xmlrpc +rpc = Xmlrpc('localhost', 6800) +resp = rpc.addUri('https://download.freebsd.org/ftp/releases/ISO-IMAGES/12.0/FreeBSD-122222.0-RELEASE-amd64-memstick.img', options={"out": "fbsd.img"}) +print resp +# 790af4098c7a7249 +``` + +aria2.conf + +``` +max-connection-per-server=5 +enable-rpc=true +rpc-allow-origin-all=true +rpc-listen-all=true +log-level=error +log=/tmp/aria.log +dir=~/aria2download +daemon=true +allow-overwrite=true +#jsonrpc hook +#on-download-complete=~/pyaria2-rpc/hook.py + +``` + diff --git a/sys.py/pyaria2_rpc/__init__.py b/sys.py/pyaria2_rpc/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/sys.py/pyaria2_rpc/example_add.py b/sys.py/pyaria2_rpc/example_add.py new file mode 100644 index 0000000..8eda218 --- /dev/null +++ b/sys.py/pyaria2_rpc/example_add.py @@ -0,0 +1,12 @@ +""" +from pyaria2 import Jsonrpc +jsonrpc = Jsonrpc('localhost', 6800) +resp = jsonrpc.addUri('https://download.freebsd.org/ftp/releases/ISO-IMAGES/12.0/FreeBSD-122222.0-RELEASE-amd64-memstick.img', options={"out": "fbsd.img"}) +print resp +""" + +from pyaria2 import Xmlrpc +rpc = Xmlrpc('localhost', 6800) +resp = rpc.addUri('https://download.freebsd.org/ftp/releases/ISO-IMAGES/12.0/FreeBSD-122222.0-RELEASE-amd64-memstick.img', options={"out": "fbsd.img"}) +print resp + diff --git a/sys.py/pyaria2_rpc/example_clearall.py b/sys.py/pyaria2_rpc/example_clearall.py new file mode 100644 index 0000000..5c9fa6a --- /dev/null +++ b/sys.py/pyaria2_rpc/example_clearall.py @@ -0,0 +1,35 @@ +import sys +from pyaria2 import Xmlrpc +rpc = Xmlrpc('localhost', 6800) + +resp = rpc.getGlobalStat() +print resp + +if( int(resp["numActive"]) > 0 ): + resp2 = rpc.tellActive() + print resp2 + for i in resp2: + rpc.remove(i["gid"]) + rpc.removeDownloadResult(i["gid"]) + + +if( int(resp["numWaiting"]) > 0): + offset = 0 + num = int(resp["numWaiting"]) + resp2 = rpc.tellWaiting(offset,num) + print resp2 + for i in resp2: + rpc.remove(i["gid"]) + rpc.removeDownloadResult(i["gid"]) + +if( int(resp["numStopped"]) > 0): + offset = 0 + num = int(resp["numStopped"]) + print num + print "numStopped" + resp2 = rpc.tellStopped(offset,num) + print resp2[0]["files"][0]["uris"] + for i in resp2: + rpc.remove(i["gid"])#may occurs errors like: ... + rpc.removeDownloadResult(i["gid"]) #clear the records + diff --git a/sys.py/pyaria2_rpc/example_download_test.py b/sys.py/pyaria2_rpc/example_download_test.py new file mode 100644 index 0000000..e61ff9f --- /dev/null +++ b/sys.py/pyaria2_rpc/example_download_test.py @@ -0,0 +1,31 @@ + +from time import sleep +from pyaria2 import Xmlrpc + +OVER = False + +#remote_file_url = 'https://download.freebsd.org/ftp/releases/ISO-IMAGES/12.0/FreeBSD-12.0-RELEASE-amd64-memstick.img' +remote_file_url = "https://raw.githubusercontent.com/cuu/gamestore/master/gameshell-19q3/AGENT%20OF%20SHINIGAMI/file/AGENT%20OF%20SHINIGAMI.tar.gz" +#remote_file_url = "https://raw.githubusercontent.com/cuu/gamestore/master/index.json" + +rpc = Xmlrpc('localhost', 6800) +gid = None +ret = False +gid,ret = rpc.urlDownloading(remote_file_url) +print(gid,ret) +if ret == False: + resp = rpc.addUri(remote_file_url, options={"out": "fbsd.tar.gz"}) + print resp + gid = resp +else: + print "url in the queue" + +while True: + stat = rpc.tellStatus(gid) + print(stat) + if stat["status"]=="complete": + print "over" + exit() + sleep(2) + + diff --git a/sys.py/pyaria2_rpc/example_global.py b/sys.py/pyaria2_rpc/example_global.py new file mode 100644 index 0000000..58952c1 --- /dev/null +++ b/sys.py/pyaria2_rpc/example_global.py @@ -0,0 +1,49 @@ +import sys +""" +from pyaria2 import Jsonrpc +jsonrpc = Jsonrpc('localhost', 6800) + +resp = jsonrpc.getGlobalStat() +print resp["result"] +if( int(resp["result"]["numActive"]) > 0 ): + resp2 = jsonrpc.tellActive() + print resp2 + +if( int(resp["result"]["numWaiting"]) > 0): + offset = 0 + num = int(resp["result"]["numWaiting"]) + resp2 = jsonrpc.tellWaiting(offset,num) + print resp2 + +if( int(resp["result"]["numStopped"]) > 0): + offset = 0 + num = int(resp["result"]["numStopped"]) + print num + resp2 = jsonrpc.tellStopped(offset,num) + print resp2 + +""" +from pyaria2 import Xmlrpc +rpc = Xmlrpc('localhost', 6800) + +resp = rpc.getGlobalStat() +print resp + +if( int(resp["numActive"]) > 0 ): + resp2 = rpc.tellActive() + print resp2 + +if( int(resp["numWaiting"]) > 0): + offset = 0 + num = int(resp["numWaiting"]) + resp2 = rpc.tellWaiting(offset,num) + print resp2 + +if( int(resp["numStopped"]) > 0): + offset = 0 + num = int(resp["numStopped"]) + print num + print "numStopped" + resp2 = rpc.tellStopped(offset,num) + print resp2 + diff --git a/sys.py/pyaria2_rpc/example_tellstatus.py b/sys.py/pyaria2_rpc/example_tellstatus.py new file mode 100644 index 0000000..1437468 --- /dev/null +++ b/sys.py/pyaria2_rpc/example_tellstatus.py @@ -0,0 +1,20 @@ +import sys + +""" +from pyaria2 import Jsonrpc +jsonrpc = Jsonrpc('localhost', 6800) + +if(len(sys.argv) > 1): + print sys.argv[1] + resp = jsonrpc.tellStatus( sys.argv[1], ["gid","status","errorCode","errorMessage"] ) + print resp +""" + +from pyaria2 import Xmlrpc +rpc = Xmlrpc('localhost', 6800) + +if(len(sys.argv) > 1): + print sys.argv[1] + resp = rpc.tellStatus( sys.argv[1], ["gid","status","errorCode","errorMessage"] ) + print resp + diff --git a/sys.py/pyaria2_rpc/example_xmlrpc.py b/sys.py/pyaria2_rpc/example_xmlrpc.py new file mode 100644 index 0000000..bade1ae --- /dev/null +++ b/sys.py/pyaria2_rpc/example_xmlrpc.py @@ -0,0 +1,9 @@ + +from pyaria2 import Xmlrpc +rpc = Xmlrpc('localhost', 6800) + +#resp = rpc.aria2.addUri(['http://music.xyz.com/test.mp3'], {"out": "aa.mp3"}) +#print resp +resp2 = rpc.getOption('2089b05ecca3d829') +print resp2 + diff --git a/sys.py/pyaria2_rpc/hook.py b/sys.py/pyaria2_rpc/hook.py new file mode 100755 index 0000000..8e459b3 --- /dev/null +++ b/sys.py/pyaria2_rpc/hook.py @@ -0,0 +1,14 @@ +#! /usr/bin/env python + +"""Notify that aria2 download is complete. + +This implements the --on-download-complete hook interface. +""" + +import sys + +# ['/Users/csx/GitProject/snowmusic/pyaria2-jsonrpc/hook.py', 'e3f97be6d4490a5a', '1', './temp/aa.mp3'] +Argv = sys.argv + +def Hook(Argv): + print Argv diff --git a/sys.py/pyaria2_rpc/pyaria2.py b/sys.py/pyaria2_rpc/pyaria2.py new file mode 100644 index 0000000..a34b694 --- /dev/null +++ b/sys.py/pyaria2_rpc/pyaria2.py @@ -0,0 +1,331 @@ +# -*- coding: utf-8 -*- + +import sys +import time +import urllib2 +import json +import xmlrpclib +import random +import requests + +class Xmlrpc(object): + def __init__(self, host, port, token=None): + self._idCount = 0 + self.host = host + self.port = port + self.serverUrl = "http://{host}:{port}/rpc".format(**locals()) + self.s = xmlrpclib.ServerProxy(self.serverUrl,allow_none=True) + self.aria2 = self.s.aria2 + + def getOption(self,gid): + try: + return self.aria2.getOption(gid) + except xmlrpclib.Fault as ex: + print "" % (ex.faultCode, ex.faultString) + return None + + def addUri(self,uris, options=None):#aria2.addUri(['http://example.org/file'], {}) + try: + if isinstance(uris, basestring): + return self.aria2.addUri([uris],options) + else: + return self.aria2.addUri(uris,options) + + except xmlrpclib.Fault as ex: + print "" % (ex.faultCode, ex.faultString) + return None + + def tellStatus(self,gid,keys=None):#aria2.tellStatus("2089b05ecca3d829", ["gid", "status"]) + try: + return self.aria2.tellStatus(gid,keys) + except xmlrpclib.Fault as ex: + print "" % (ex.faultCode, ex.faultString) + return None + + def tellActive(self,keys=None): + try: + return self.aria2.tellActive(keys) + except xmlrpclib.Fault as ex: + print "" % (ex.faultCode, ex.faultString) + return None + + def tellWaiting(self,offset=0,num=0,keys=None): + try: + return self.aria2.tellWaiting(offet,num,keys) + except xmlrpclib.Fault as ex: + print "" % (ex.faultCode, ex.faultString) + return None + + def tellStopped(self,offset=0,num=0,keys=None): + try: + return self.aria2.tellStopped(offset,num,keys) + except xmlrpclib.Fault as ex: + print "" % (ex.faultCode, ex.faultString) + return None + + def remove(self,gid): + try: + return self.aria2.remove(gid) + except xmlrpclib.Fault as ex: + print "" % (ex.faultCode, ex.faultString) + return None + + def forceRemove(self,gid): + try: + return self.aria2.forceRemove(gid) + except xmlrpclib.Fault as ex: + print "" % (ex.faultCode, ex.faultString) + return None + + def getGlobalStat(self): + try: + return self.aria2.getGlobalStat() + except xmlrpclib.Fault as ex: + print "" % (ex.faultCode, ex.faultString) + return None + + def purgeDownloadResult(self): + try: + return self.aria2.purgeDownloadResult() + except xmlrpclib.Fault as ex: + print "" % (ex.faultCode, ex.faultString) + return None + + def removeDownloadResult(self,gid): + try: + return self.aria2.removeDownloadResult(gid) + except xmlrpclib.Fault as ex: + print "" % (ex.faultCode, ex.faultString) + return None + + def getUris(self,gid): + try: + return self.aria2.getUris(gid) + except xmlrpclib.Fault as ex: + print "" % (ex.faultCode, ex.faultString) + return None + + def urlDownloading(self,url): + ret = False + try: + resp = self.tellActive() + for i in resp: + uris = self.aria2.getUris(i["gid"]) + for x in uris: + if x["uri"] == url: + return i["gid"],True + except: + return None,False + return None,False + + def urlWaiting(self,url): + try: + _g = self.getGlobalStat() + num = _g["numWaiting"] + if num > 0: + resp = self.tellWaiting(0,num) + for i in resp: + uris = self.aria2.getUris(i["gid"]) + for x in uris: + if x["uri"] == url: + return i["gid"],True + except: + return None,False + + return None,False + + def getPercent(self,url): + try: + resp = self.tellActive() + for i in resp: + uris = self.aria2.getUris(i["gid"]) + for x in uris: + if x["uri"] == url: + pct = float(i["completedLength"]) / float( i["totalLength"]) + pct = pct * 100.0 + return int(pct) + except: + return None + return None + +class Wsrpc(object): + + MUTI_METHOD = "system.multicall" + ADDURI_METHOD = "aria2.addUri" + TELLSTATUS_METHOD= "aria2.tellStatus" + TELLACTIVE_METHOD="aria2.tellActive" + TELLWAITING_METHOD="aria2.tellWaiting" + TELLSTOPPED_METHOD="aria2.tellStopped" + REMOVE_METHOD="aria2.remove" + FORCEREMOVE_METHOD="aria2.forceRemove" + GETGLOBALSTAT_METHOD="aria2.getGlobalStat" + PURGEDOWNLOADRESULT_METHOD="aria2.purgeDownloadResult" + REMOVEDOWNLOADRESULT_METHOD="aria2.removeDownloadResult" + + def __init__(self, host, port, token=None): + self._idCount = 0 + self.host = host + self.port = port + self.serverUrl = "ws://{host}:{port}/jsonrpc".format(**locals()) + + def _genParams(self, method , params): + p = { + 'jsonrpc': '2.0', + 'id': self._idCount, + 'method': method, + 'test': 'test', + 'params': [] + } + + for i in params: + if i is not None: + p['params'].append(i) + + return p + + def _post(self, action, params): + #print params + paramsObject = self._genParams(action, params) + #print paramsObject + data=json.dumps(paramsObject) + return data + + def addUri(self, uris, options=None): + if isinstance(uris, basestring): + return self._post(Wsrpc.ADDURI_METHOD, [[uris,], options]) + else: + return self._post(Wsrpc.ADDURI_METHOD, [uris, options]) + + def tellStatus(self,gid,keys=None): + return self._post(Wsrpc.TELLSTATUS_METHOD,[gid,keys]) + + def tellActive(self,keys=None): + return self._post(Wsrpc.TELLACTIVE_METHOD,[keys]) + + def tellWaiting(self,offset=0,num=0,keys=None): + return self._post(Wsrpc.TELLWAITING_METHOD,[offset,num,keys]) + + def tellStopped(self,offset=0,num=0,keys=None): + return self._post(Wsrpc.TELLSTOPPED_METHOD,[offset,num,keys]) + + def remove(self,gid): + return self._post(Wsrpc.REMOVE_METHOD,[gid]) + + def forceRemove(self,gid): + return self._post(Wsrpc.FORCEREMOVE_METHOD,[gid]) + + def getGlobalStat(self): + return self._post(Wsrpc.GETGLOBALSTAT_METHOD,[]) + + def purgeDownloadResult(self): + return self._post(Wsrpc.PURGEDOWNLOADRESULT_METHOD,[]) + + def removeDownloadResult(self,gid): + return self._post(Wsrpc.REMOVEDOWNLOADRESULT_METHOD,[gid]) + +class Jsonrpc(object): + + MUTI_METHOD = "system.multicall" + ADDURI_METHOD = "aria2.addUri" + TELLSTATUS_METHOD= "aria2.tellStatus" + TELLACTIVE_METHOD="aria2.tellActive" + TELLWAITING_METHOD="aria2.tellWaiting" + TELLSTOPPED_METHOD="aria2.tellStopped" + REMOVE_METHOD="aria2.remove" + FORCEREMOVE_METHOD="aria2.forceRemove" + GETGLOBALSTAT_METHOD="aria2.getGlobalStat" + PURGEDOWNLOADRESULT_METHOD="aria2.purgeDownloadResult" + REMOVEDOWNLOADRESULT_METHOD="aria2.removeDownloadResult" + + def __init__(self, host, port, token=None): + self._idCount = 0 + self.host = host + self.port = port + self.serverUrl = "http://{host}:{port}/jsonrpc".format(**locals()) + + def _genParams(self, method , params): + p = { + 'jsonrpc': '2.0', + 'id': self._idCount, + 'method': method, + 'test': 'test', + 'params': [] + } + + for i in params: + if i is not None: + p['params'].append(i) + + return p + + def _post(self, action, params, onSuccess, onFail=None): + if onFail is None: + onFail = Jsonrpc._defaultErrorHandle + print params + paramsObject = self._genParams(action, params) + print paramsObject + resp = requests.post(self.serverUrl, data=json.dumps(paramsObject)) + result = resp.json() + if "error" in result: + return onFail(result["error"]["code"], result["error"]["message"]) + else: + return onSuccess(result)#give json object back + + def addUri(self, uris, options=None): + def success(response): + return response["result"] + if isinstance(uris, basestring): + return self._post(Jsonrpc.ADDURI_METHOD, [[uris,], options], success) + else: + return self._post(Jsonrpc.ADDURI_METHOD, [uris, options], success) + + def tellStatus(self,gid,keys=None): + def success(response): + return response + return self._post(Jsonrpc.TELLSTATUS_METHOD,[gid,keys],success) + + def tellActive(self,keys=None): + def success(response): + return response + return self._post(Jsonrpc.TELLACTIVE_METHOD,[keys],success) + + def tellWaiting(self,offset=0,num=0,keys=None): + def success(response): + return response + return self._post(Jsonrpc.TELLWAITING_METHOD,[offset,num,keys],success) + + def tellStopped(self,offset=0,num=0,keys=None): + def success(response): + return response + return self._post(Jsonrpc.TELLSTOPPED_METHOD,[offset,num,keys],success) + + def remove(self,gid): + def success(response): + return response + return self._post(Jsonrpc.REMOVE_METHOD,[gid],success) + + def forceRemove(self,gid): + def success(response): + return response + return self._post(Jsonrpc.FORCEREMOVE_METHOD,[gid],success) + + def getGlobalStat(self): + def success(response): + return response + return self._post(Jsonrpc.GETGLOBALSTAT_METHOD,[],success) + + def purgeDownloadResult(self): + def success(response): + return response + return self._post(Jsonrpc.PURGEDOWNLOADRESULT_METHOD,[],success) + + def removeDownloadResult(self,gid): + def success(response): + return response + return self._post(Jsonrpc.REMOVEDOWNLOADRESULT_METHOD,[gid],success) + + + @staticmethod + def _defaultErrorHandle(code, message): + print ("pyaria2 ERROR: {},{}".format(code, message)) + return None diff --git a/sys.py/run.py b/sys.py/run.py new file mode 100644 index 0000000..c1470e5 --- /dev/null +++ b/sys.py/run.py @@ -0,0 +1,671 @@ +# -*- coding: utf-8 -*- +import os +import dbus +import dbus.service +import sys +import commands +import logging +import errno + +from wicd import misc +import libs.websocket as websocket +##misc.to_bool +##misc.misc.noneToString +##misc.to_unicode +##misc.Noneify +from wicd.translations import _ +from wicd import wpath +from wicd import dbusmanager +import time +import gobject + + +import socket +import pygame +from sys import exit +import json + +#from beeprint import pp +######## +if getattr(dbus, 'version', (0, 0, 0)) < (0, 80, 0): + import dbus.glib +else: + from dbus.mainloop.glib import DBusGMainLoop + DBusGMainLoop(set_as_default=True) + +import config +#local UI import +from UI.constants import Width,Height,icon_width,icon_height,DT,RUNEVT,RUNSYS,ICON_TYPES,POWEROPT,RESTARTUI,RUNSH +from UI.util_funcs import ReplaceSuffix,FileExists, ReadTheFileContent,midRect,color_surface,SwapAndShow,GetExePath,X_center_mouse,ArmSystem +from UI.page import PageStack,PageSelector,Page +from UI.label import Label +from UI.icon_item import IconItem +#from UI.fonts import fonts +from UI.title_bar import TitleBar +from UI.foot_bar import FootBar +from UI.main_screen import MainScreen +from UI.above_all_patch import SoundPatch +from UI.icon_pool import MyIconPool +from UI.createby_screen import CreateByScreen +from UI.skin_manager import MySkinManager +from libs.DBUS import setup_dbus + + +if not pygame.display.get_init(): + pygame.display.init() +if not pygame.font.get_init(): + pygame.font.init() + +gobject_main_loop = None + +sound_patch = None + +myscriptname = os.path.basename(os.path.realpath(__file__)) + +everytime_keydown = time.time() + +passout_time_stage = 0 + +last_brt = -1 + +gobject_flash_led1 = -1 +gobject_flash_led1_counter = 0 + +Keys = [] +crt_screen = None + +def gobject_loop(): + """ + here to receive dbus signal + """ + try: + gobject_main_loop.run() + except KeyboardInterrupt: + gobject_main_loop.quit() + exit(-1) + +def GobjectFlashLed1(main_screen): + global gobject_flash_led1_counter + + if main_screen._Closed == False: + if gobject_flash_led1_counter > 0: + try: + f = open("/proc/driver/led1","w") + except IOError: + print( "open /proc/driver/led1 IOError") + pass + else: + with f: + f.seek(0) + f.write("0") + f.truncate() + f.close() + + gobject_flash_led1_counter = 0 + return True + + gobject_flash_led1_counter+=1 + + if gobject_flash_led1_counter == 3: + try: + f = open("/proc/driver/led1","w") + except IOError: + print( "open /proc/driver/led1 IOError") + pass + else: + with f: + f.seek(0) + f.write("1") + f.truncate() + f.close() + + + elif gobject_flash_led1_counter == 5: + try: + f = open("/proc/driver/led1","w") + except IOError: + print( "open /proc/driver/led1 IOError") + pass + else: + with f: + f.seek(0) + f.write("0") + f.truncate() + f.close() + + if gobject_flash_led1_counter == 11: + gobject_flash_led1_counter = 1 + + return True + + +def RestoreLastBackLightBrightness(main_screen): + global last_brt,passout_time_stage,gobject_flash_led1 + + passout_time_stage = 0 + main_screen._TitleBar._InLowBackLight = -1 + main_screen._Closed = False + + + if last_brt == -1: + return True + + try: + f = open(config.BackLight,"r+") + except IOError: + print( "RestoreLastBackLightBrightness open %s failed, try to adjust brightness in Settings" % config.BackLight) + pass + else: + with f: + content = f.readlines() + content = [x.strip() for x in content] + brt=int(content[0]) + if brt < last_brt: + f.seek(0) + f.write(str( last_brt )) + f.truncate() + + f.close() + last_brt = -1 + try: + f = open("/proc/driver/led1","w") + except IOError: + print( "open /proc/driver/led1 IOError") + pass + else: + with f: + f.seek(0) + f.write("0") + f.truncate() + f.close() + + if main_screen._CounterScreen._Counting==True: + main_screen._CounterScreen.StopCounter() + main_screen.Draw() + main_screen.SwapAndShow() + return False + + return True + +def InspectionTeam(main_screen): + global everytime_keydown,last_brt,passout_time_stage,gobject_flash_led1 + + cur_time = time.time() + time_1 = config.PowerLevels[config.PowerLevel][0] + time_2 = config.PowerLevels[config.PowerLevel][1] + time_3 = config.PowerLevels[config.PowerLevel][2] + + if cur_time - everytime_keydown > time_1 and passout_time_stage == 0: + print("timeout, dim screen %d" % int(cur_time - everytime_keydown)) + try: + f = open(config.BackLight,"r+") + except IOError: + pass + else: + with f: + content = f.readlines() + content = [x.strip() for x in content] + brt=int(content[0]) + if brt > 0: + if last_brt < 0: + last_brt = brt ## remember brt for restore + + brt = 1 + f.seek(0) + f.write(str(brt)) + f.truncate() + f.close() + + main_screen._TitleBar._InLowBackLight = 0 + + if time_2 != 0: + passout_time_stage = 1 # next + everytime_keydown = cur_time + + elif cur_time - everytime_keydown > time_2 and passout_time_stage == 1: + print("timeout, close screen %d" % int(cur_time - everytime_keydown)) + try: + f = open(config.BackLight,"r+") + except IOError: + pass + else: + with f: + brt = 0 + f.seek(0) + f.write(str(brt)) + f.truncate() + f.close() + + + main_screen._TitleBar._InLowBackLight = 0 + main_screen._Closed = True + if time_3 != 0: + passout_time_stage = 2 # next + + everytime_keydown = cur_time + + elif cur_time - everytime_keydown > time_3 and passout_time_stage == 2: + print("Power Off counting down") + + try: + f = open(config.BackLight,"r+") + except IOError: + pass + else: + with f: + brt = last_brt + f.seek(0) + f.write(str(brt)) + f.truncate() + f.close() + + main_screen._CounterScreen.Draw() + main_screen._CounterScreen.SwapAndShow() + main_screen._CounterScreen.StartCounter() + + main_screen._TitleBar._InLowBackLight = 0 + + passout_time_stage = 4 + + return True + +def RecordKeyDns(thekey,main_screen): + global Keys,crt_screen + + if len(Keys) < 10: + Keys.append(thekey) + else: + Keys = [] + Keys.append(thekey) + + keys = ''.join(map(str,Keys)) + #print(keys) + if keys == "273273274274276276275275106107":##uuddllrrab + crt_screen.Draw() + crt_screen.SwapAndShow() + main_screen._TitleBar._InLowBackLight = 0 ##pause titlebar drawing + return True + + return False + + + +def release_self_fds(): + fds_flags= ["pipe","socket",".ttf"] + """List process currently open FDs and their target """ + if sys.platform != 'linux2': + raise NotImplementedError('Unsupported platform: %s' % sys.platform) + + ret = {} + base = '/proc/self/fd' + for num in os.listdir(base): + path = None + try: + path = os.readlink(os.path.join(base, num)) + except OSError as err: + # Last FD is always the "listdir" one (which may be closed) + if err.errno != errno.ENOENT: + raise + ret[int(num)] = path + + for key in ret: + if ret[key] != None and isinstance(ret[key], str): + for i in fds_flags: + if i in ret[key]: + os.close(key) + break + return ret + + +def event_process(event,main_screen): + global sound_patch + global everytime_keydown + if event != None: + pygame.event.clear() + if event.type == pygame.ACTIVEEVENT: + print(" ACTIVEEVENT !") + return + if event.type == pygame.QUIT: + exit() + if event.type == RUNEVT: + if config.DontLeave==True: + os.chdir(GetExePath()) + os.system( "/bin/sh -c "+event.message) + else: + on_exit_cb = getattr(main_screen,"OnExitCb",None) + if on_exit_cb != None: + if callable( on_exit_cb ): + main_screen.OnExitCb(event) + + pygame.quit() + gobject_main_loop.quit() + os.chdir( GetExePath()) + + endpos = len(event.message) + space_break_pos = endpos + for i in range(0,endpos): + if event.message[i] == "/" and event.message[i-1] == " " and i > 6: + space_break_pos = i-1 + break + + exec_app_cmd = "cd "+os.path.dirname(event.message[:space_break_pos])+";" + exec_app_cmd += event.message + exec_app_cmd += "; sync & cd "+GetExePath()+"; exec python "+myscriptname + print(exec_app_cmd) + release_self_fds() + os.execlp("/bin/sh","/bin/sh","-c", exec_app_cmd) + os.chdir( GetExePath()) + os.execlp("python","python"," "+myscriptname) + sys.exit(-1) + return + + if event.type == RUNSYS: + if config.DontLeave==True: + os.chdir(GetExePath()) + os.system( "/bin/sh -c "+event.message) + else: + pygame.quit() + gobject_main_loop.quit() + os.chdir( GetExePath()) + endpos = len(event.message) + space_break_pos = endpos + for i in range(0,endpos): + if event.message[i] == "/" and event.message[i-1] == " " and i > 6: + space_break_pos = i-1 + break + + exec_app_cmd = "cd "+os.path.dirname(event.message[:space_break_pos])+";" + exec_app_cmd += event.message + exec_app_cmd += "; sync & cd "+GetExePath()+"; exec python "+myscriptname + print(exec_app_cmd) + release_self_fds() + os.execlp("/bin/sh","/bin/sh","-c", exec_app_cmd) + os.chdir( GetExePath()) + os.execlp("python","python"," "+myscriptname) + return + if event.type == RESTARTUI: + pygame.quit() + gobject_main_loop.quit() + os.chdir(GetExePath()) + exec_app_cmd = " sync & cd "+GetExePath()+"; exec python "+myscriptname + print(exec_app_cmd) + release_self_fds() + os.execlp("/bin/sh","/bin/sh","-c", exec_app_cmd) + os.chdir( GetExePath()) + os.execlp("python","python"," "+myscriptname) + return + if event.type == RUNSH: + pygame.quit() + gobject_main_loop.quit() + exec_app_cmd = event.message +";" + release_self_fds() + os.execlp("/bin/sh","/bin/sh","-c", exec_app_cmd) + sys.exit(-1) + return + if event.type == POWEROPT: + everytime_keydown = time.time() + + return + if event.type == pygame.KEYUP: + + pygame.event.clear(pygame.KEYDOWN) + return + if event.type == pygame.KEYDOWN: + everytime_keydown = time.time() + if RestoreLastBackLightBrightness(main_screen) == False: + return + ########################################################### + if event.key == pygame.K_q: + on_exit_cb = getattr(main_screen,"OnExitCb",None) + if on_exit_cb != None: + if callable( on_exit_cb ): + main_screen.OnExitCb(event) + + gobject_main_loop.quit() + exit() + + if event.key == pygame.K_KP_PLUS: + if main_screen._CurrentPage._Name != "Sound volume": ## name from Menu/GameShell/10_Settings/Sound/pages.py + main_screen.Draw() + sound_patch.VolumeUp() + sound_patch.Draw() + + main_screen.SwapAndShow() + #pygame.time.delay(200) + #main_screen.Draw() + #main_screen.SwapAndShow() + + if event.key == pygame.K_KP_MINUS: + if main_screen._CurrentPage._Name != "Sound volume": + main_screen.Draw() + + sound_patch.VolumeDown() + sound_patch.Draw() + + main_screen.SwapAndShow() + #pygame.time.delay(200) + #main_screen.Draw() + #main_screen.SwapAndShow() + + + ########################################################### + if event.key == pygame.K_ESCAPE: + pygame.event.clear() + + if RecordKeyDns(event.key,main_screen) == False: + key_down_cb = getattr(main_screen,"KeyDown",None) + if key_down_cb != None: + if callable( key_down_cb ): + main_screen.KeyDown(event) + + main_screen._LastKeyDown = everytime_keydown + return + +def gobject_pygame_event_poll_timer(main_screen): + + event = pygame.event.poll() + + event_process(event,main_screen) + + InspectionTeam(main_screen) + + return True + +def gobject_pygame_event_timer(main_screen): + global sound_patch + + for event in pygame.event.get(): + event_process(event,main_screen) + + return True + +@misc.threaded +def aria2_ws(main_screen): + def on_message(ws, message): + print("run.py aria2_ws on_message: ",message) + try: + aria2_noti = json.loads(message) + if "method" in aria2_noti and aria2_noti["method"] == "aria2.onDownloadError": + gid = aria2_noti["params"][0]["gid"] + + if "method" in aria2_noti and aria2_noti["method"] == "aria2.onDownloadComplete": + gid = aria2_noti["params"][0]["gid"] + on_comp_cb = getattr(main_screen._CurrentPage,"OnAria2CompleteCb",None) + if on_comp_cb != None: + if callable( on_comp_cb ): + main_screen._CurrentPage.OnAria2CompleteCb(gid) + #game_install_thread(gid) + except Exception as ex: + print(ex) + + def on_error(ws, error): + print(error) + + def on_close(ws): + print("### closed ###") + + + #websocket.enableTrace(True) + try: + ws = websocket.WebSocketApp("ws://localhost:6800/jsonrpc", + on_message = on_message, + on_error = on_error, + on_close = on_close) +# ws.on_open = on_open + ws.run_forever() + except: + return + + +@misc.threaded +def socket_thread(main_screen): + global everytime_keydown + + socket_path = "/tmp/gameshell" + if os.path.exists(socket_path): + os.remove(socket_path) + + server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + server.bind(socket_path) + while True: + server.listen(1) + conn, addr = server.accept() + datagram = conn.recv(1024) + if datagram: + tokens = datagram.strip().split() + + if tokens[0].lower() == "esc": + escevent = pygame.event.Event(pygame.KEYDOWN,{'scancode':9,'key': 27, 'unicode': u'\x1b', 'mod': 0}) + current_page_key_down_cb = getattr(main_screen._CurrentPage,"KeyDown",None) + if current_page_key_down_cb != None: + if callable( current_page_key_down_cb ): + main_screen._CurrentPage.KeyDown(escevent) + + if tokens[0].lower() == "quit": #eg: echo "quit" | socat - UNIX-CONNECT:/tmp/gameshell + conn.close() + on_exit_cb = getattr(main_screen,"OnExitCb",None) + if on_exit_cb != None: + if callable( on_exit_cb ): + main_screen.OnExitCb(None) + + gobject_main_loop.quit() + exit() + + if tokens[0].lower() == "keydown": ## simulate keydown event + everytime_keydown = time.time() + if RestoreLastBackLightBrightness(main_screen) == False: + print("RestoreLastBackLightBrightness unix socket false") + + if tokens[0].lower() == "poweroff": + escevent = pygame.event.Event(pygame.KEYDOWN,{'scancode':9,'key': 27, 'unicode': u'\x1b', 'mod': 0}) + for i in range(0,5): + current_page_key_down_cb = getattr(main_screen._CurrentPage,"KeyDown",None) + if current_page_key_down_cb != None: + if callable( current_page_key_down_cb ): + main_screen._CurrentPage.KeyDown(escevent) + + if main_screen._MyPageStack.Length() == 0: ## on Top Level + break + + if main_screen._CurrentPage._Name == "GameShell": + for i in main_screen._CurrentPage._Icons: + if i._MyType == ICON_TYPES["FUNC"]: + if i._Label.GetText() == "PowerOFF": + api_cb = getattr(i._CmdPath,"API",None) + if api_cb != None: + if callable(api_cb): + i._CmdPath.API(main_screen) + + if tokens[0].lower() == "redraw": #echo "redraw titlebar" | socat - UNIX-CONNECT:/tmp/gameshell + if len(tokens) > 1: + area = tokens[1].lower() + if area == "titlebar": + if hasattr(main_screen._TitleBar,'Redraw'): + if main_screen._TitleBar.Redraw != None and callable(main_screen._TitleBar.Redraw): + main_screen._TitleBar.Redraw() + + +def big_loop(): + global sound_patch,gobject_flash_led1 + + title_bar = TitleBar() + title_bar.Init(screen) + foot_bar = FootBar() + foot_bar.Init(screen) + + main_screen = MainScreen() + main_screen._HWND = screen + main_screen._TitleBar = title_bar + main_screen._FootBar = foot_bar + main_screen.Init() + + main_screen.ReadTheDirIntoPages("../Menu",0,None) + main_screen.ReadTheDirIntoPages("/home/cpi/apps/Menu",1,main_screen._Pages[ len(main_screen._Pages) -1]) + main_screen.ReunionPagesIcons() + + main_screen.FartherPages() + + + title_bar._SkinManager = main_screen._SkinManager + foot_bar._SkinManager = main_screen._SkinManager + + sound_patch = SoundPatch() + sound_patch._Parent = main_screen + sound_patch.Init() + #pp(main_screen._Pages[0],True,6) + + screen.fill(MySkinManager.GiveColor("White")) + main_screen.Draw() + main_screen.SwapAndShow() + + #gobject.timeout_add(DT,gobject_pygame_event_timer,main_screen) + gobject_flash_led1 = gobject.timeout_add(200,GobjectFlashLed1,main_screen) + + gobject.timeout_add(DT,gobject_pygame_event_poll_timer,main_screen) + gobject.timeout_add(3000,title_bar.GObjectRoundRobin) + + + socket_thread(main_screen) + aria2_ws(main_screen) + + gobject_loop() + + +###MAIN()### +if __name__ == '__main__': + + os.environ['SDL_VIDEO_CENTERED'] = '1' + X_center_mouse() + + os.chdir( os.path.dirname(os.path.realpath(__file__)) ) + + SCREEN_SIZE = (Width,Height) + screen = pygame.display.set_mode(SCREEN_SIZE, 0, 32) + + pygame.event.set_allowed(None) + pygame.event.set_allowed([pygame.KEYDOWN,pygame.KEYUP,RUNEVT,RUNSYS,POWEROPT,RESTARTUI,RUNSH]) + + pygame.key.set_repeat(DT+DT*6+DT/2, DT+DT*3+DT/2) + + MyIconPool.Init() + + setup_dbus() + + gobject.threads_init() + + gobject_main_loop = gobject.MainLoop() + +# if pygame.display.get_active() == True: +# print("I am actived") + + if pygame.image.get_extended() == False: + print("This pygame does not support PNG") + exit() + + + crt_screen = CreateByScreen() + crt_screen.Init() + crt_screen._HWND = screen + + big_loop() + diff --git a/sys.py/volume_hotkey.py b/sys.py/volume_hotkey.py new file mode 100644 index 0000000..20f195e --- /dev/null +++ b/sys.py/volume_hotkey.py @@ -0,0 +1,34 @@ +import time +from evdev import InputDevice +from select import select +import alsaaudio + +m = alsaaudio.Mixer() +sound_volume=m.getvolume()[0] +# print("cur aound volume:%d",sound_volume) + +dev = InputDevice('/dev/input/event1') + +while True: + select([dev], [], []) + for event in dev.read(): + # print "code:%s value:%s" % (event.code, event.value) + if(event.code==74 and event.value==1): + sound_volume=sound_volume - 4 + if(sound_volume<0): + sound_volume=0 + try: + m = alsaaudio.Mixer() + m.setvolume(sound_volume) + except Exception,e: + print(str(e)) + elif(event.code==78 and event.value==1): + sound_volume=sound_volume + 4 + if(sound_volume>100): + sound_volume=98 + try: + m = alsaaudio.Mixer() + m.setvolume(sound_volume) + except Exception,e: + print(str(e)) + diff --git a/update.sh b/update.sh new file mode 100755 index 0000000..cb2312b --- /dev/null +++ b/update.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +cd /home/cpi/launcher +feh --bg-center /home/cpi/launcher/sys.py/gameshell/wallpaper/updating.png +git pull +git reset --hard $1 +git submodule init +git submodule update + +cd ~/apps/Menu && git pull && cd - + +feh --bg-center /home/cpi/launcher/sys.py/gameshell/wallpaper/loading.png +./load.sh +