diff --git a/.forgejo/workflows/build.yaml b/.forgejo/workflows/build.yaml deleted file mode 100644 index 9dca19d..0000000 --- a/.forgejo/workflows/build.yaml +++ /dev/null @@ -1,48 +0,0 @@ -name: Build - -on: - push: - branches: - - master - -jobs: - - build: - runs-on: debian-latest - - steps: - - run: |- - apt update - apt install -y \ - python3 git curl make gcc g++ pkg-config \ - libboost-dev libjack-dev nlohmann-json3-dev - - uses: actions/checkout@v4 - - - run: ./waf configure - - run: ./waf - - - name: Build Debian package - run: |- - mkdir -p deb/DEBIAN - cat <, Bob - Description: Executes a command triggered by jack audio - Depends: libboost-dev, libjack0 - EOF - - install -D -m 0755 build/ampswitch deb/usr/bin/ampswitch - - dpkg-deb --build deb ampswitch.deb - - - name: Deploy Debian package - run: |- - curl \ - --fail \ - --user ${{ secrets.PKG_RELEASE_CREDENTIALS }} \ - --upload-file ampswitch.deb \ - $GITHUB_SERVER_URL/api/packages/$GITHUB_REPOSITORY_OWNER/debian/pool/stable/main/upload diff --git a/COPYING b/LICENSE similarity index 99% rename from COPYING rename to LICENSE index 10926e8..f288702 100644 --- a/COPYING +++ b/LICENSE @@ -1,7 +1,7 @@ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 - Copyright (C) 2007 Free Software Foundation, Inc. + 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. @@ -645,7 +645,7 @@ the "copyright" line and a pointer to where the full notice is found. 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 . + along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. @@ -664,12 +664,11 @@ 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/relay_board_description/description.txt b/relay_board_description/description.txt deleted file mode 100644 index f595efc..0000000 --- a/relay_board_description/description.txt +++ /dev/null @@ -1,87 +0,0 @@ -Original description from the relay board in chinlish: - - -Below item is powered by Canton-electronics Ltd . - -Product Name: 12V 2Ch RS232 Relay Remote Control USB PC UART TTL COM Serial Ports Smart Home - -Module No.: TB252 - -Qty: -1 pcs Dual Function Manual control and PC UART Control Relay ; -1 pcs RS232 to TTL; -4 pcs female to 4 pins female dupont wire; - -Descripion : - -12V 2 Channel Relay Module; - -Dual Function : Manual control & PC RS232 Control Relay; - -Input and output optical isolation; - -With 5V TTL 232 interface, which is convenient to achieve USB to PC by USB to TTL232 serial to control relay, you can also use 8051 AVR Arduino MCU to control relay ; - -Power indicator: LED lights ; - -Output indication: relay output with LED indicators, easy to see working status of the relay ; - -Communication protocol: UART protocol communication, baud rate 9600kpbs, 8 data bits, one stop bit, no parity. Each data frame contains eight bytes. Two-way data transmission. - - -Baud rate 9600kbps, 8 data bits, one stop bit, no parity. Each data frame contains eight bytes.. - -1 Control commands: - -1. Reading status(reading the satus of the relay (on/off)) - -0x55 0x56 0x00 0x00 0x00 0x00 0x00 0xAB - - -2. Relay open (issue this command ,Relay open , COM connect to NO ) - -Channel 1 :0x55 0x56 0x00 0x00 0x00 0x01 0x01 0xAD - -Channel 2 :0x55 0x56 0x00 0x00 0x00 0x02 0x01 0xAE - - -3. Relay close (issue this command ,Relay close , COM disconnect NO , and COM connect to NC ) - -Channel 1 :0x55 0x56 0x00 0x00 0x00 0x01 0x02 0xAE - -Channel 2 :0x55 0x56 0x00 0x00 0x00 0x02 0x02 0xAF - - - -4. Relay toggle(Relay status reversal,if COM connect to NO,this commands will Disconnect COM to NO and Reverse COM connect to NC,and vice versa) - -Channel 1 :0x55 0x56 0x00 0x00 0x00 0x01 0x03 0xAF - -Channel 2 :0x55 0x56 0x00 0x00 0x00 0x02 0x03 0xB0 - - -5. Relay momentary(Relay COM connect to NO,disconnect after 200MS ) - -Channel 1 :0x55 0x56 0x00 0x00 0x00 0x01 0x04 0xB0 - -Channel 2 :0x55 0x56 0x00 0x00 0x00 0x02 0x04 0xB1 - -Once issue a command, will have a return fame , 7th byte of return fame mean the satus of realy . - - - -2 return command - - -1、Return relay open(return this command,mean COM connect to NO ) - -Channel 1 : 0x33 0x3C 0x00 0x00 0x00 0x01 0x01 0x71 - -Channel 2 : 0x33 0x3C 0x00 0x00 0x00 0x02 0x01 0x72 - - -2、Return relay close(return this command,mean COM disconnect NO , and COM connect to NC ) - -Channel 1 : 0x33 0x3C 0x00 0x00 0x00 0x01 0x02 0x72 - -Channel 2 : 0x33 0x3C 0x00 0x00 0x00 0x02 0x02 0x73 diff --git a/relay_board_description/pcb1.jpg b/relay_board_description/pcb1.jpg deleted file mode 100644 index 454fe01..0000000 Binary files a/relay_board_description/pcb1.jpg and /dev/null differ diff --git a/relay_board_description/pcb2.jpg b/relay_board_description/pcb2.jpg deleted file mode 100644 index 0b131a8..0000000 Binary files a/relay_board_description/pcb2.jpg and /dev/null differ diff --git a/relay_board_description/pcb3.jpg b/relay_board_description/pcb3.jpg deleted file mode 100644 index 84c537e..0000000 Binary files a/relay_board_description/pcb3.jpg and /dev/null differ diff --git a/src/ampswitch.cpp b/src/ampswitch.cpp deleted file mode 100644 index ac15f0d..0000000 --- a/src/ampswitch.cpp +++ /dev/null @@ -1,401 +0,0 @@ -/* - * ampswitch - * Copyright (C) Bob 2014 - * - * ampswitch 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. - * - * ampswitch 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 . - */ - -#include "ampswitch.h" - -#ifndef _GNU_SOURCE - #define _GNU_SOURCE //for pipe2 -#endif //_GNU_SOURCE -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -volatile bool g_stop = false; - -CAmpSwitch::CAmpSwitch(int argc, char *argv[]) -{ - m_triggerlevel = 0.1f; - m_switchtime = 10.0f; - m_oncommand = NULL; - m_offcommand = NULL; - m_pipe[0] = -1; - m_pipe[1] = -1; - m_connected = false; - m_jackname = "Ampswitch"; - m_client = NULL; - m_port = NULL; - m_samplerate = 0; - m_jackshutdown = false; - m_switchedon = false; - m_samplecounter = 0; - m_usekodi = false; - m_playing = false; - - struct option longoptions[] = - { - {"jack-name", required_argument, NULL, 'j'}, - {"on-command", required_argument, NULL, 'n'}, - {"off-command", required_argument, NULL, 'f'}, - {"switch-time", required_argument, NULL, 's'}, - {"trigger-level", required_argument, NULL, 't'}, - {"kodi", no_argument, NULL, 'k'}, - {"help", no_argument, NULL, 'h'}, - {0, 0, 0, 0} - }; - - const char* shortoptions = "j:n:f:s:t:kh"; - int c; - int optionindex = 0; - while ((c = getopt_long(argc, argv, shortoptions, longoptions, &optionindex)) != -1) - { - if (c == 'j') - { - m_jackname = optarg; - } - else if (c == 'n') - { - m_oncommand = optarg; - } - else if (c == 'f') - { - m_offcommand = optarg; - } - else if (c == 'h') - { - PrintHelpMessage(); - exit(1); - } - else if (c == 's') - { - float switchtime; - if (sscanf(optarg, "%f", &switchtime) != 1) - { - printf("ERROR: Wrong value for switch-time: \"%s\"\n", optarg); - exit(1); - } - - m_switchtime = switchtime; - } - else if (c == 't') - { - float triggerlevel; - if (sscanf(optarg, "%f", &triggerlevel) != 1) - { - printf("ERROR: Wrong value for trigger-level: \"%s\"\n", optarg); - exit(1); - } - - m_triggerlevel = triggerlevel; - } - else if (c == 'k') - { - m_usekodi = true; - } - else if (c == '?') - { - exit(1); - } - } -} - -CAmpSwitch::~CAmpSwitch() -{ -} - -bool CAmpSwitch::Setup() -{ - //install signal handlers for exiting - signal(SIGINT, SignalHandler); - signal(SIGTERM, SignalHandler); - - //create a non blocking pipe which the jack thread will use to communicate with the main thread - if (pipe2(m_pipe, O_NONBLOCK) == -1) - { - printf("ERROR: Creating pipe: %s\n", strerror(errno)); - return false; - } - - if (m_oncommand) - printf("on command: \"%s\"\n", m_oncommand); - if (m_offcommand) - printf("off command: \"%s\"\n", m_offcommand); - - if (m_usekodi) - m_kodiclient.Start(this); //start a thread that connects to Kodi's JSONRPC - - return true; -} - -void CAmpSwitch::Process() -{ - //if the off command is passed on the command line, execute that first - if (m_offcommand) - { - printf("switching off, executing \"%s\"\n", m_offcommand); - system(m_offcommand); - } - - //local switch state - bool switchedon = false; - - while (!g_stop) - { - //if the jack daemon has shut down, clean up the jack client - if (m_jackshutdown) - JackDisconnect(); - - //try to connect to jackd if not connected yet - if (!m_connected) - Connect(); - - //wait for one second on the readable end of the pipe - fd_set pipeset; - FD_ZERO(&pipeset); - FD_SET(m_pipe[0], &pipeset); - struct timeval tv; - tv.tv_sec = 1; - tv.tv_usec = 0; - select(m_pipe[0] + 1, &pipeset, NULL, NULL, &tv); - - //clear the readable end of the pipe - uint8_t byte; - read(m_pipe[0], &byte, 1); - - //if the jack thread has written a byte to the pipe, the switch state has changed - //execute the switch on or switch off command if necessary - if (switchedon != m_switchedon) - { - switchedon = m_switchedon; - if (switchedon && m_oncommand) - { - printf("switching on, executing \"%s\"\n", m_oncommand); - system(m_oncommand); - } - else if (!switchedon && m_offcommand) - { - printf("switching off, executing \"%s\"\n", m_offcommand); - system(m_offcommand); - } - } - } - - //if the off command is passed on the command line, execute that before exiting - if (m_offcommand) - { - printf("switching off, executing \"%s\"\n", m_offcommand); - system(m_offcommand); - } -} - -void CAmpSwitch::Cleanup() -{ - JackDisconnect(); -} - -void CAmpSwitch::PrintHelpMessage() -{ - printf( - "\n" - "usage: ampswitch [OPTION]\n" - "\n" - " options:\n" - "\n" - " -j, --jack-name name of the jack client\n" - " -n, --on-command command to execute when switching on\n" - " -f, --off-command command to execute when switching off\n" - " -s, --switch-time minimum number of seconds between switches\n" - " -t, --trigger-level absolute value of trigger level\n" - " -k, --kodi use Kodi's JSONRPC to switch on when playback starts\n" - " -h, --help print this message\n" - "\n" - ); -} - -void CAmpSwitch::Connect() -{ - m_connected = JackConnect(); - if (!m_connected) - { - JackDisconnect(); - - printf("Waiting 10 seconds before trying again\n"); - sleep(10); - } -} - -bool CAmpSwitch::JackConnect() -{ - //try to connect to jackd - m_client = jack_client_open(m_jackname, JackNoStartServer, NULL); - if (m_client == NULL) - { - printf("ERROR: Unable to connect to jack\n"); - return false; - } - - int returnv; - - //get the sample rate for timing calculations - m_samplerate = jack_get_sample_rate(m_client); - - //install a callback which gets called when jackd shuts down - jack_on_info_shutdown(m_client, SJackInfoShutdownCallback, this); - - //install the process callback, this will be called when a new audio frame is passed - returnv = jack_set_process_callback(m_client, SJackProcessCallback, this); - if (returnv != 0) - { - printf("ERROR: Unable to set process callback\n"); - return false; - } - - //install a callback for when the sample rate changes - returnv = jack_set_sample_rate_callback(m_client, SJackSamplerateCallback, this); - if (returnv != 0) - printf("ERROR: Unable to set sample rate callback\n"); - - //register a jack audio port - m_port = jack_port_register(m_client, "Input", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0); - if (m_port == NULL) - { - printf("ERROR: Unable to register jack port\n"); - return false; - } - - //activate the jack client - returnv = jack_activate(m_client); - if (returnv != 0) - { - printf("ERROR: Unable to activate jack client\n"); - return false; - } - - printf("Connected to jack with name %s\n", m_jackname); - - return true; -} - -void CAmpSwitch::JackDisconnect() -{ - if (m_client) - { - printf("Disconnecting from jack\n"); - - jack_client_close(m_client); - m_port = NULL; - m_client = NULL; - } - m_jackshutdown = false; - m_connected = false; -} - -int CAmpSwitch::SJackProcessCallback(jack_nframes_t nframes, void *arg) -{ - return ((CAmpSwitch*)arg)->PJackProcessCallback(nframes); -} - -int CAmpSwitch::PJackProcessCallback(jack_nframes_t nframes) -{ - float* jackptr = (float*)jack_port_get_buffer(m_port, nframes); - - //iterate over all samples - float* in = jackptr; - float* inend = in + nframes; - while (in != inend) - { - //if the absolute sample value is higher than the trigger level, set the switch state to on and reset the sample counter - bool trigger = fabsf(*(in++)) > m_triggerlevel; - - //Consider kodi playing as a trigger - if (m_playing) - trigger = true; - - if (trigger) - { - m_samplecounter = std::max((int)lround(m_switchtime * m_samplerate), 1); - if (!m_switchedon) - { - m_switchedon = true; - uint8_t msgbyte = 0; - write(m_pipe[1], &msgbyte, 1); - } - } - else if (m_samplecounter > 0) - { - //if the sample counter expires, set the switch state to off - m_samplecounter--; - if (m_samplecounter == 0) - { - m_switchedon = false; - uint8_t msgbyte = 0; - write(m_pipe[1], &msgbyte, 1); - } - } - } - - return 0; -} - -int CAmpSwitch::SJackSamplerateCallback(jack_nframes_t nframes, void *arg) -{ - return ((CAmpSwitch*)arg)->PJackSamplerateCallback(nframes); -} - -int CAmpSwitch::PJackSamplerateCallback(jack_nframes_t nframes) -{ - //when the sample rate changes, update the sample counter so that it will represent the same amount of time - m_samplecounter = lround((double)m_samplecounter / (double)m_samplerate * (double)nframes); - m_samplerate = nframes; - - return 0; -} - -void CAmpSwitch::SJackInfoShutdownCallback(jack_status_t code, const char *reason, void *arg) -{ - ((CAmpSwitch*)arg)->PJackInfoShutdownCallback(code, reason); -} - -void CAmpSwitch::PJackInfoShutdownCallback(jack_status_t code, const char *reason) -{ - //signal the main thread that the jack server has shut down - m_jackshutdown = true; - uint8_t msgbyte = 0; - write(m_pipe[1], &msgbyte, 1); -} - -void CAmpSwitch::SignalHandler(int signum) -{ - //signal the main thread that the process should exit - if (signum == SIGINT || signum == SIGTERM) - g_stop = true; -} - -void CAmpSwitch::SetPlayingState(bool playing) -{ - //Inform the switch thread about the play state of kodi - m_playing = playing; -} diff --git a/src/ampswitch.h b/src/ampswitch.h deleted file mode 100644 index 4cf90e4..0000000 --- a/src/ampswitch.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * ampswitch - * Copyright (C) Bob 2014 - * - * ampswitch 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. - * - * ampswitch 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 . - */ - -#ifndef AMPSWITCH_H -#define AMPSWITCH_H - -#include -#include "kodiclient.h" - -class CAmpSwitch -{ - public: - CAmpSwitch(int argc, char *argv[]); - ~CAmpSwitch(); - - bool Setup(); - void Process(); - void Cleanup(); - - void SetPlayingState(bool playing); - - private: - void PrintHelpMessage(); - - void Connect(); - bool JackConnect(); - void JackDisconnect(); - - static int SJackProcessCallback(jack_nframes_t nframes, void *arg); - int PJackProcessCallback(jack_nframes_t nframes); - - static int SJackSamplerateCallback(jack_nframes_t nframes, void *arg); - int PJackSamplerateCallback(jack_nframes_t nframes); - - static void SJackInfoShutdownCallback(jack_status_t code, const char *reason, void *arg); - void PJackInfoShutdownCallback(jack_status_t code, const char *reason); - - static void SignalHandler(int signum); - - float m_triggerlevel; - float m_switchtime; - char* m_oncommand; - char* m_offcommand; - - int m_pipe[2]; - - bool m_connected; - const char* m_jackname; - jack_client_t* m_client; - jack_port_t* m_port; - int m_samplerate; - bool m_jackshutdown; - - bool m_switchedon; - int m_samplecounter; - - bool m_usekodi; - CKodiClient m_kodiclient; - bool m_playing; -}; - -#endif //AMPSWITCH_H diff --git a/src/kodiclient.cpp b/src/kodiclient.cpp deleted file mode 100644 index 81f570d..0000000 --- a/src/kodiclient.cpp +++ /dev/null @@ -1,167 +0,0 @@ -/* - * ampswitch - * Copyright (C) Bob 2021 - * - * ampswitch 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. - * - * ampswitch 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 . - */ - -#include "kodiclient.h" -#include "ampswitch.h" - -#include -#include -#include - -#include -#include - -#include - -using namespace boost::asio; -using ip::tcp; -using namespace nlohmann; - -void CKodiClient::Start(CAmpSwitch* ampswitch) -{ - m_ampswitch = ampswitch; - m_thread = std::thread(SProcess, this); -} - -void CKodiClient::SProcess(CKodiClient* kodiclient) -{ - kodiclient->Process(); -} - -void CKodiClient::Process() -{ - printf("Kodi client started\n"); - - for(;;) - { - try - { - //TODO: make "localhost" work instead of "127.0.0.1" - boost::asio::io_service io_service; - tcp::socket socket(io_service); - boost::asio::ip::address address = boost::asio::ip::make_address("127.0.0.1"); - - //Connect to Kodi's JSONRPC, this will thrown an exception on failure. - socket.connect(tcp::endpoint(address, 9090)); - - printf("Connected to Kodi\n"); - - //Read data from the TCP socket, and split into separate JSON objects. - ResetSplit(); - for(;;) - { - boost::asio::streambuf receive_buffer; - size_t bytesread = boost::asio::read(socket, receive_buffer, - boost::asio::transfer_at_least(1)); - - const char* data = boost::asio::buffer_cast(receive_buffer.data()); - - Split(data, bytesread); - } - } - catch(boost::system::system_error& error) - { - m_ampswitch->SetPlayingState(false); - printf("ERROR: unable to connect to Kodi JSONRPC: %s\n", error.what()); - printf("Retrying in 10 seconds\n"); - sleep(10); - } - } -} - -void CKodiClient::ResetSplit() -{ - m_bracketlevel = 0; - m_instring = false; - m_escaped = false; - m_parsebuf.clear(); -} - -/*! Splits JSON objects from Kodi's JSON RPC and passes them to Parse().*/ -void CKodiClient::Split(const char* data, uint32_t len) -{ - //Parse the JSON data into separate JSON objects by finding the text from - //the starting { to ending }, while ignoring curly brackets in strings. - for (uint32_t i = 0; i < len; i++) - { - m_parsebuf.push_back(data[i]); - - if (!m_instring) - { - if (data[i] == '"') - { - m_instring = true; - } - else if (data[i] == '{') - { - m_bracketlevel++; - } - else if (data[i] == '}') - { - if (m_bracketlevel > 0) - { - m_bracketlevel--; - if (m_bracketlevel == 0) - { //Parse the full received JSON object. - Parse(m_parsebuf); - m_parsebuf.clear(); - } - } - else - { - m_parsebuf.clear(); //Shouldn't happen. - } - } - } - else - { - if (!m_escaped) - { - if (data[i] == '\\') - m_escaped = true; - else if (data[i] == '"') - m_instring = false; - } - else - { - m_escaped = false; - } - } - } -} - -void CKodiClient::Parse(const std::string& jsonstr) -{ - json jsondata = json::parse(jsonstr); - - if (jsondata.contains("method")) - { - std::string method = jsondata["method"]; - - if (method == "Player.OnPlay") - { - printf("Player started\n"); - m_ampswitch->SetPlayingState(true); - } - else if (method == "Player.OnStop") - { - printf("Player stopped\n"); - m_ampswitch->SetPlayingState(false); - } - } -} diff --git a/src/kodiclient.h b/src/kodiclient.h deleted file mode 100644 index 20d7eda..0000000 --- a/src/kodiclient.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * ampswitch - * Copyright (C) Bob 2021 - * - * ampswitch 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. - * - * ampswitch 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 . - */ - -#ifndef KODICLIENT_H -#define KODICLIENT_H - -#include -#include - -class CAmpSwitch; - -class CKodiClient -{ - public: - void Start(CAmpSwitch* ampswitch); - - private: - static void SProcess(CKodiClient* kodiclient); - void Process(); - void ResetSplit(); - void Split(const char* data, uint32_t len); - void Parse(const std::string& jsonstr); - - std::thread m_thread; - CAmpSwitch* m_ampswitch; - - uint32_t m_bracketlevel; - bool m_instring; - bool m_escaped; - std::string m_parsebuf; -}; - -#endif //KODICLIENT_H diff --git a/src/main.cpp b/src/main.cpp deleted file mode 100644 index 5360deb..0000000 --- a/src/main.cpp +++ /dev/null @@ -1,33 +0,0 @@ -/* - * ampswitch - * Copyright (C) Bob 2014 - * - * ampswitch 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. - * - * ampswitch 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 . - */ - -#include "ampswitch.h" - -int main (int argc, char *argv[]) -{ - CAmpSwitch ampswitch(argc, argv); - - if (!ampswitch.Setup()) - return 1; - - ampswitch.Process(); - ampswitch.Cleanup(); - - return 0; -} - diff --git a/waf b/waf deleted file mode 100755 index 030bf9b..0000000 --- a/waf +++ /dev/null @@ -1,177 +0,0 @@ -#!/usr/bin/env python3 -# encoding: latin-1 -# Thomas Nagy, 2005-2018 -# -""" -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. -""" - -import os, sys, inspect - -VERSION="2.1.5" -REVISION="7e89fb078ab3c46cf09c8f74bbcfd16d" -GIT="1b9fe4011973e40efb2c106764aac97da3153e5a" -INSTALL='' -C1='#5' -C2='#*' -C3='#)' -cwd = os.getcwd() -join = os.path.join - - -WAF='waf' -def b(x): - return x -if sys.hexversion>0x300000f: - WAF='waf3' - def b(x): - return x.encode() - -def err(m): - print(('\033[91mError: %s\033[0m' % m)) - sys.exit(1) - -def unpack_wafdir(dir, src): - f = open(src,'rb') - c = 'corrupt archive (%d)' - while 1: - line = f.readline() - if not line: err('run waf-light from a folder containing waflib') - if line == b('#==>\n'): - txt = f.readline() - if not txt: err(c % 1) - if f.readline() != b('#<==\n'): err(c % 2) - break - if not txt: err(c % 3) - txt = txt[1:-1].replace(b(C1), b('\n')).replace(b(C2), b('\r')).replace(b(C3), b('\x00')) - - import shutil, tarfile - try: shutil.rmtree(dir) - except OSError: pass - try: - for x in ('Tools', 'extras'): - os.makedirs(join(dir, 'waflib', x)) - except OSError: - err("Cannot unpack waf lib into %s\nMove waf in a writable directory" % dir) - - os.chdir(dir) - tmp = 't.bz2' - t = open(tmp,'wb') - try: t.write(txt) - finally: t.close() - - try: - t = tarfile.open(tmp) - except: - try: - os.system('bunzip2 t.bz2') - t = tarfile.open('t') - tmp = 't' - except: - os.chdir(cwd) - try: shutil.rmtree(dir) - except OSError: pass - err("Waf cannot be unpacked, check that bzip2 support is present") - - try: - for x in t: - if hasattr(tarfile, 'data_filter'): - t.extract(x, filter='data') - else: - t.extract(x) - finally: - t.close() - - for x in ('Tools', 'extras'): - os.chmod(join('waflib',x), 493) - - if sys.hexversion<0x300000f: - sys.path = [join(dir, 'waflib')] + sys.path - import fixpy2 - fixpy2.fixdir(dir) - - os.remove(tmp) - os.chdir(cwd) - - try: dir = unicode(dir, 'mbcs') - except: pass - try: - from ctypes import windll - windll.kernel32.SetFileAttributesW(dir, 2) - except: - pass - -def test(dir): - try: - os.stat(join(dir, 'waflib')) - return os.path.abspath(dir) - except OSError: - pass - -def find_lib(): - src = os.path.abspath(inspect.getfile(inspect.getmodule(err))) - base, name = os.path.split(src) - - #devs use $WAFDIR - w=test(os.environ.get('WAFDIR', '')) - if w: return w - - #waf-light - if name.endswith('waf-light'): - w = test(base) - if w: return w - for dir in sys.path: - if test(dir): - return dir - err('waf-light requires waflib -> export WAFDIR=/folder') - - dirname = '%s-%s-%s' % (WAF, VERSION, REVISION) - for i in (INSTALL,'/usr','/usr/local','/opt'): - w = test(i + '/lib/' + dirname) - if w: return w - - #waf-local - dir = join(base, (sys.platform != 'win32' and '.' or '') + dirname) - w = test(dir) - if w: return w - - #unpack - unpack_wafdir(dir, src) - return dir - -wafdir = find_lib() -sys.path.insert(0, wafdir) - -if __name__ == '__main__': - - from waflib import Scripting - Scripting.waf_entry_point(cwd, VERSION, wafdir) - -#==> -#BZh91AY&SY-PM"(#54u@b1J#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)﮾xij-`◵k4nhMo]ZlLRtZ_|j#5g^H:pGTS{wxnS=#)[wV˻#5F|=}ڎ=}3jӞ#)#)#)#)(zp#)#*05N07Cj{#)#)46ci=:m% Р#5((Rv:JQ#5hGJ#jz;kh$k.SLQ-06wgPi[=K޻^sTDu[[kOzwC{V}5sAݹKZ]ˬ/S^cNNEA{=:UP;d#5u@[f5x{K^)ϰ6_v$P#)iK-ejv几jw|=:k.<:-}Pv(>-=89m +U{]6mwv;ts`=5v>ړO}}zav[mlm;mη/8)Lw|k{oM^eD.'ٯIriQWs k7a@hhUR:jBnU]o}Ǡ8s7m[׶Sٶ4{phAǹnn#){N@#)#*}˽woqWV.+}U=;}M[oF^a=UݙA.M.'DޛէC{06n{{w݀{#5c{h#)=ćujªj@"&[[2{M뻻wwJAJPjlKju7]ɥjom˻p^v=w fԷw'l$hSޮ#*T/vewOXs{ݪ;_]oj|4#)#)@#)4Ba244F(Cd#*=FM|K_`xLc$M.*V8aUsYBq#)" zo@M/T8o[B{3U4qq8X ^.$aUcZeBEx[B$BE-m;Z[VƫfZmUQkcVnHHAT `(IA$DlAO|^˪جUj5[V-mZԘ,fjI4$a$Y*635%M(Ҋmabf)(MSQEc`ж&4KD!L1@cCLYSh%j(M4 bZCf`33fƔؐ(K1P46ZF0"ji&lXə$,im5%%fSmmMfZLLAI,14i(S# *FЁQH)(#*X,RYlh*aBFHdFIcBd#  #*,HI ̊YY` %4&664Xa%!BF46I)24a44)1 i@I#5TI"J Jf  hflb6T#)I$$M#5HQ "QE"(d1$ JIQfTh0%&!HDd $Ŗe%f &TL)Fl3lB,L,h̙#F"5+%64J) M$R0f@Ѥ""% &i(Ԅc1!,Id CFVPF22HLRd`DdXJ(#dik1ERV&MH)Be T`"ddlcIZf#4fh#6QX#EY,ɦd26h6(R!ddęB$be$)EMI6&d!6#"e54#5(2FƑ2dA)RYBTSSa6ɍ%ȆɌQTQH!EFbACA,j,4hM)$l$Rb l`K4iLa#*dFؚ6тe 2F"IDEh5),f)4YdTZfLRSb!J"i!6e0eF(2a#5TFihF5Yf2e0#Y12lhj)#5fMKLXd$MLZJѲ#F,RRٱձȊ4ٛ&JJR̍X5#@RR65$JmEj#*j)VUEIb(։%$U&4El2ѵ0-cP`%`2d+HFѴĬb" M[fBe3YZD#Md&ԵlbU,,JԳMRȚSTbєk6,4-CEYf,Pcd1h43IDH#*ĉLV ci&(ɒifl#*ـ)LJ6i$(-2Bdfi1 mafJ (1!2QCB$bCR$Y4Ia$QT%LIJj$!5Ffe4lI4dD!(E0M5&ɰladE"Jf$Ѣ̥LVd2V0M! ZE6[FhCF)6bKQ@(I&0 bRT5)ș%)[@Idhf"i#*#*L1LclF-M%$$I&RL-(QZ36I Сf61MFQK6,e$(dœJRTEEhF5D# j I5FɁVRV-44S(*&jb2EMdIM)Jd d؈R-"MmDZEL&+i4EXJ)6"V`2)Q`Rb%m$6ffKYj4lf"cj6ej4j)ƉBԕĤ6LE(H%jDQieP&Ude(Ml!j6Ƥ"!&FdDLfȌJLm&meY-eƢ#5662Fʡ*6lb&hQ fj1l[QJj-f* ((L%(*HڊزmZ44ɴRcES[XLTLIDbDJi%ES dhش[F542Y6!mIU(#E4m!(6͒ݛ,Ed`!d3U1f?޺-kr:c.f ~Ⱥ58ٟ܉ g?޹G&8?ŌV7P4(ّ5,Q7ѦE֢[ D`?łXH(69 BP9YgZI$ͯ]3g,"sMض=6qkҵKPT۳g4c0"M,OG=ފ1 'N#5±23|y]ӽ5/<&'y˽wzm=;K>~w)ͿxMǭ@YeS\RJHH"#gkdH%AFvnTޛ,:D#8 4*9Zā|}2>.kג,/U'Cux3FJb.4&ߗCvTTvHG[ fKiDsWT\M Awesn$TUͺؙQ5Z*ъW/E2IR+PpS)Sߕ(QϞ0PqX%&,n$x֫G0mxNwDFԣ+F&]rnQҹs&"T""i#5ҠLUIH QR"LZJbL~֌m[_Kݙ#*(_(݆u@U@E@>B̚RZg`,/;%CsYe$NP0T[ɈwM^FGFm9&PdS3j(R1k3œG'V608sh$uuC2{V]CANME)ߣޝrkS*$9;ӂgV[q)~ F6KfXZVN*uW(jvKBJF_xM>FH!o=2/J1G]1K믻HCV1C|)u{ q^cSԗүm++_#5^2PPłV&4Q_J m$}m |Z2kAC~ݺYuUY[J>~mz[ X4R|;+ݵn[Qg{4ֆjaZ"mۿ>!ܱkvd^Z&9QؖU E )N/kcPi-hς^{Ɏw2#*e/ND/Tݼٿx5e+Bn0Y[HvU՚] MlDДɻlAH1i iz¡\J)"KJEvr7SB²HSE#5lQ MZH##5oYʥ0’jF]((E;(\+QXXy"<=98Q94}Jǽǘ~"cd v_f[%m0H7m;\qHfLuI/t(q<>u{3#uq#8e(]#*c=NG[#*gG\ԇU![sЛG.·Dlf!`iuMd4B40i8 ߲WparC#*Ɯ-:#*l^ϥY Ј}e.㤓-5'4p:ae}'-z:OS$p֫#[cD58hÉ<[O'Di GG<{t^UH(aSו)owʉB>鼕 d8!Sv7I5"J Ni%@mhQbsiEC׮}-_V2^{~o7W"U$_g->?om—j+Jg).w"}[%]~MJ Q܆*bΨ/&|1ջKÈ+0UMD#*q>jnpf[J^tJPPu(+쨄w)=QEFv'p,Q9U}qa~#5uQp3H>"#*{]RM:\'֔Gf4>R"s7 P)-9U߅>f3{]?Ǯq TMsS-wK*nU$Hzi?#5|[]p>~&ĈV̂OGU0adZd֙6{ڏc]fd̼hM4זhG4zfcG1aJ[4֋` K:`TYL*P[oeU!̚Z(Orɓ썋p;\t X )[G&HxJãpf Q Wѻ)R"1yP[Y9Y&x#5h6Dx0)A#IL8_= q!㻽=7&ZWЙ4s0~?ՒY2nFc<#59s}T?YTSO:>˾^EbhCWpq?g Ӻnk[(1e#*g5Ҥ]]ǝakmwvl߅#:*!|C#5EP#5dX4\&5rOگikwcCJWkP\{鉉:Qjb);o鯡#*\4w_sv1TtC:6rVZbsPJ ʊ8eΩfגּxڨ0#*{:{`tIb#)әRGD Qs*#5Q#5MOâ_I~R!i=cêUqpPOҎaq=GA@mG%tXє|DhCqݩbRpO_:DS\cۉLO:ߌ#5=_3-"4Yx-H~+/.ˆ#}۬Oy3H]ԫe )˞l4,xmAtݡ֋^NI %A$o9*1'66ċQz=v KEju_ER&[sG!h]_1GT/6>19%_yҷn{qC1I#+_iyuk4=P̺JjPvپw{0x#5!pLw(KB?15F1q`at(fVë9NF0YUD806/d3#6Hƫ{QfD|:!QȂ$#*{دh/gģ68v?8oT|15Yv8 $qm};sSj8{hΕD-I ·UkJ2l8|h+sdSj#*to_w "Vo=KJͿxGZ#)ێ!ۀ*Փ-0!cBwCI']:?{?lMwiڰxH_5D(6pw4Kl1o~KF #5878A #*xX2ԆP84vk%R*#5s]U9.TęeG,>C ]mD*\Dd^lπ Eg(ԳHֵe2Pw(#5[D(8$Py>X(ݦ.ZgL+_{QV[<9:xz~fv;h$+xF`^>vWY!{lж#*xbI|@@BCcԞ̭JeV8)ـLTn]&6p!|aBʕ(ؘQ,32kTcVlH*heeM #*(x&g1aBCwO/wW'.$ݣHѲo=p]#g-4hj?ߺ.;}!֏/yFFO+*͵,ހ]@#5bA!X)aBgt2ZbhadjG{Tq_~~N{(m79*ޝ)" BWsH޹?ѥܶïA!EaZ8h?G|+΀"#)@J ?7h#)]*<ؿ?~N]K #*cc8rB#)R+#*Poc( rlp7N^gL1W!R{*">@3ZrnhFz~K6Jv@r0#]ZJ#5`#)Ag.tXG9ko"W8OAR Q#513P!4!sE)."̠,p%$:&u!FxG\#u(DA܅#)$P#)lɓmO'D>: ֡ڳTZu-0n#*֙KGTrԧ~:oҬl^| [^#s9eDܗv( oHp?GDa=tٷX>^:lmA0ņhؾwvN!tPYDE鈌~zOvo`H@0d#5P mEɀz\{ÍU3`V#lZlET|o#*7⮆C5gӟѝNeL,BpR댵_EdIv}-DY|bAXP@%4 -ID˫: ?_̾vsO)tUJHLvvɳ9>+9G-u/%Տ_~N\`a#*xl[CPX:xfd(֛:|Șŗyt8n0,Iߕqi u0d{mv׮~i͝&qD~*e9XeN#5'"WuH"#) v d`H#)Tn&$ihv /rS} VIX!Dk>.l17k<ݡ&s֩ F;S2 I[WS}q'1tO߃u|`qPs}`$5󣬖zoM#*9#5#*˩kUI-(J-+ar;pVpXz$NVKE5:3 9{!9͠ీة0 I~OH~qt+_'P̭Ė3W8_FiH- 7#*8XŸ1#5KBo眕:wLS}S͆:cpn_Ekパ #*M&UM0EGV"ϕ7ߘt!ͤ9{~#*(I%d e|ۍ׶~^8]BG'M7{)A4#*@iy";Mq^KI;vo,qH:4y#)y5kŎe2k\y&uAټzGQ"#5@AzҏwH:bҳm}M1 `E[$|n}F$H:X3PX&1їoC A{g@l˶ÆٰYnDE1ij#5XciA#-^ߜS[!uä]1",">A4ՎӆvF[V9tX.*G\ !iG)\C7Z.; ^c$= #)%mJ(!n! xcls[}~lM#5NaG<3SSGKM'k27+Crk E aESvw/xF!ݮ<˵i376墣Gߓy w閙ټWR[p)0m5#5ITV iF 2&#**Zi #)6 Hbpj5J]6z%AC iʲzNL4dz3Y?#5;oETT\#*aMÇ5,$!!&KZҐ#5j6[s (T)h7v\T5Knƒ,~Dž*zI$lp/t&mBdδРHu;U"/Q{EZ3 v@}1#[ .7m,Vv>Uj.t@'uI.DM(HȶtZ;VS᎖bJHIˣK#5Ѷ˩cGcHК8\#5PjF =H" "#%,ʋQaF-÷Яq{5ձ;w+S'}l7@d#㒼t[kXMGYʲcg#5(ZPxV0v^II20cv"2@63rÍk*U(td]F_CY)$7PS^],'cT`Mc[mTAbJ ,Ǯuvhޢ8>D~ֻ~vhzbG 8ORj}ڿ#*%Z#ږ0FKgp jwWߏ[t%Cmj)IXtDaIP$k˕n#*~1>ED48N,]"c(|MM/+'XyҪ7cxkd8:bn.,4>4y!O=Al~MrsEQw?dǐ&#*d2'9"đebO&Xol#m#*F4?QS1pJ[J0ESÍxϰ|qu.Ȭ2βjDwlLf^>yytkm=?ooh!!0ȑ8rʍ$F(ኔ1{8}xUo;1q|"(9/ZC#57JbD*0m0pJ1K|`G3X@#)!ji]J3eU>rqN-!}3vfiw8֍-DL-kInmʫ1RLer[!`2+]S40(3 zZC3x_I3Yb6~xM #57|pON?HRpjB|xvǂƌ=APf}żGJ#)t#5ƣ@٬~x~VF*)Bg*8m"X(@@5QE!FBcpMK05H[`J<:OSkO<E{*W77,:?|_JS8Q.%c#*%jM殥*/0X7${-gQÑbp!R$ k(D-$A<`un{ݧ45aB(a~0dXZ}*=:&.Oˎxέ~!CE\:gfֻF݊/Db}}~v #5#*Ā,FeB`ƍՇ>M>R?wꀏK_о=qS4v]ho =TWm>%@>$j{fӣ/}57ٽCޣ hڈ7/zW=ꫥ+0.q+͜]O΋r5a<&seOowk^3fwrt<*ui+5÷CcL?#̌(ia([UI8•Hz#oH.X͕tm@itϚ5l.2!#5Bc!f$TyI,xCb1BW?e RŇK5H dkx#*9tn21z5F"57`am;s N.yc #ص %ISXVUP|`*yRpZWi#Z_{ sosM~ODUVlNz;;CW!n͝FrBǕ重^5fU&[KMڲu;dk:o!>wO_,sUCx,˗;܍EE}\UחAG]t٧3Cȡ)d<,2RÛ\yyT.^p9V"FS?C8٣^g:]L#]7m1rW40QP099A(WG3l:‰$^ hxPgR#*EPt.V~@*Qr#)Ur!uhtW3#W vJ#_|saI|r%#5ٛ:1NQ?EVnժկjs4"q׵iAw|,}}7q#)fP^}u #5_bExQ/|~SC!(ch"!r8}1S6RTcф9U-@#5c}B#5`s±%R#5O;x3]Yd1+có[?3TINxM>G~눡 N#5%ݲiCm# O7PO鄳r6#)cN,5AR^ -s`IBYڒ~<C'uiw$?NZu_c:)LɎNXYZtp2Pڔ _VAH}JR_N#A֑PEE7gj{i>6==#*7G#)oSk4P{)9_0^U(VQyL9yՊou88QY֢U慒NrW$>ef*Uw̼ň?_7󬾺F]:?G3%EkYB֔kcbmn&R#)z3%^lHKDh̟I2 o7  UɟV|9nކ^!Rx;H #)RpM*gj4t)Fy Aߕ:Ɵm z#*:%nTR]*y*J2#<+V1)wz!~6d=Y\=_h_kuKlPlZ'Dəekw =;oY!Uvߖ5N?4@;:נ.BUWRɮe]W'K4N-ú22r#5#$pw]mCoϣWiDA_n`AE5~MNzEX7mnjNG{ k+nTԥ-ӿEɧ܉&, bx2(}9`)=ϝ6UբEm' Z`G {2`Ln%aM0`AADe J°@=9^0#*J(0iBGakhbe+-G#C:8qcEj, b 7Ndn0)nBQ7!L5 H;.4lF9Mcm#58VsTZO#Cf5Kk$-[Җf!d6<6)w[F#*AIeCN"G;FRv|6OTR:4/^_E=pk7#ΩG<|qܮVnlA0/H#Ǩ=zY5)R#cމ!aAg*P^W_W͚>hӇ7i-]zznSS>8>Xt`ú\8fe@rtrIfUUkyTN V, +,G$IUR~HT^A>47H rtZ#_臅OmBA%_{mRv9Flg5-QƩ}Ψ(2d=$tTb$Z_v~uC?N;z:)(c$V#*\)r-QH7 CPx4c6/.EQVW?o:m_/Pd PBI#g3"(9W#5A3#&UdΗy2YK 5f'T-@ZuzܺL5TehmW05ppE30BH+Q`|5ͥ^b#*&Tp Ojd$ Pj7଄v#57s*c#if'M!#"\XsVƂͽ[q "dzn&ljmPU `ʃш0n#*Gr3t#5ލ,5ַo4(%l#)2fiB?w:Ѡ fsXlX+#5quR\`7+Jzdէݛ͕&#xc-(pw#5!E^>^w~#)3le#*1i y`%PJ<}1C>)eLD+"+N^9>Q媭@A悀PLFأ,-**N0_WHԎqqť F"D,Y%ө Hȑ#e!S&}y1XH"\ 4Ic#*\E#MP#1@/F4]F"Vl۞wCdA(᧲1^n#)7#*n{8yQiB+7Վ cy Qmɻn0!!+kj_Nfqϫ\<@>Q6tLI'5$%vgJG]'usLp8-- hw52\%o[&ݵʈ"r!Gcw0]jK;븣}:K%/2'JMM;l\t+?#*bÀ 5K3:+b<s'&v2TS_,NQZά9ctVYjILm3BXPMö6NA>(-Q[3cF2Fώ3X靷ݛbRq78=!(n?gl^H) CmҞ\@>F\k36hO*pgN!b#%Qk6gMU>pLJјvtNu}Syl*&3Jw?ŝz-vE]|^r"c\iih1frU.uBR\m=thEL*aC&tQ=#W^5-bgM2dI#*|qM[ذƟwqfYc;sxc_]gҩ NO15Y#*sM_}w|>䬫xybzflל67%GOQ~G_٭4+7 ;Pw "-u#5J;Z0q41F@{4xK'K)>nQ 9,y>O V4*ݪ-VtҹF\t>]y>]x|miݩ&5#5Ixeߵ0x->ͦ־.aK0D[B!,Tk ^a\[rIl0LQUcu2xc"l)eːL?݀1l< EjY8Ty|UuJ͉ƬP&wBFVg\;y)TPEYd蕈zt#*>3ަkEIeն{+ҏQe#+ :^$DIA.2^-f\28)#5edC̟/Jk$$.2I0.QDq[.&/䆇'l(uNl/H-M:fm#t'guj{t?s0*APӉa郞[!+6nuJhTϘ%=˭:;_3oF}aT8~sb_.|1plK!vXvk D7 ~+ NR+ sDxP 2|$ɖBbsM?KbG6‚H$P}e[X^aϳ5!iE(ݮ <Ȏ:4|W^:+Њ LA S9oC'mnB[X{٦ yPɘ[1hhAT%g$EwT^^|\Zjj .r+sd*S\_GRN%P"#(t^~TG /&8G7}Xpv dtb5.gCf#*g:ǭ9aWj\'zyu*h3t^yG/k[!v,,uޞGfi?3f):%0m(,V =eɷ*0QXA>梳 Is_&|f4hVWt:~L$f3_/vWu J~&+3־[o993pf,6oJgtk(o9,0n bǫ4kLZ~|T\-$6V[ᰓķ'g4rzڸ}>rv}Wo$ӬEnF#t{ւQp`o(Swb66^\#V?[/gq1$7;bgiW7S۞Ϫזݨæ}k#*D6+-Oƍ;ZN*"ͤws[O 0j+'}'nVu6d-'L5z<)csMLk^5w5`U,#)e<-]63KF!c﮺/-i@V6Ua*m52TYB#5,j}g3t:7s䗡;:69Eٮ>Ύ"^UЃsl9 . r \SEN6RV(f&:~..]AԹΌ$dbGrwXǶo!:KYbh.Pְv~#*>\l]bsvtdǦ<+uUa鋱2vYoǗzzkEηS?glҢ،o`E5vk+ETaFcWGܫPca'H?ҸC}S 0)tCvǠ{Nqb|P~YtV;+W#)n!ta&ώY9#58@*愳.xNQtS^| x`rrɻriR 4\-ʺoeۥ"##*/O;]$Q_k=zsRFg~gy{ɕ%nFn)ܸF}k#5=q17.'x]JӦN}V55orkl<L%pxWl7-0BYM_{YeRCu3Ȳ0#) #*ZҵmQ[Wc]&Tpx\72IQm#)!|Qo-%#*ge$BTtӢ1FdETvnrЕ~ɻmou0n*e}s>ӫ4QZkY&9mח82&C|90ߥsy^Fm>޹To+mKn®xY>_RrrІ%"rdpcUC V3FEȳϗ56:Kwl*IcGR -Ӣ9%88PQx}M{>oAͽ(m #)`Vd`M21<"6-{l)k46. )JT \J#*4sUpc5yd4Qٳ{zo~Na۳XU+n}ZF-: YYȱJ窢U Wk#*-quދijXXGQ#oRg8xvkP.gJn]$Ɵ#*m#*32߆oσi!u#*@dP##5m^ߵ}e)wdc۷V:dz_cRfV.քg/ggßR{F-xO6/qɮ{9S6JyjskQVn{\`dk"-TŅNLPt`&%*uŒa<1[Z 6&#*&-vpz<S[:ˀ:qs2sRg|Zٶ.o@41ιMNU\bMݩ&;c+YcFF$MqoMPO#)з#*#Du-+~X\)W s9N,/@#*=QۋE1Rb5QEڕ8h-r"/s3u\d=6*oc* S5nלfs7[Sm5',]{Hh#)*눪*־@G#էS`1?U7ύLN80HwY:QgC {NT^\fRb+3)OGΊ1wūEDL^w蕺]*TB 9#q-B(2׍Tӈ9چ,gUw̼!p*Ss#*I`}ĨQ:J9֙~Xb8>#5m ߛytAK7S 3<-ȓfJpS~jfTm= lyltԵ\I uܭI0jj}od旲.Kv3]`+:|C6! ֿF*/=2l`; ;T?߽{cvZ_FzVO n.NwPJ0U[1:#_I@O!CQWO%=O-űB"NmWkht5WFBW#*,L#C-,L_ PA]gy"VP=E@bPM#*m'P-9-Ϟ0" k:PsV eͣ ;_-JNo#5њ謪pP4!/(}m'=8)u$&2/gL| ,!V(%N ;T'oԮ4_N9Ň7z\zTm{B}PFhҦT˹iL.A(Yvˤ{V2sG:*#5VgZOHLxc3GW' +JMAiZRJ>oβo2QB|&i{)69GK$З90)ȲW-^6֎l0uV3SUD躚3A \KŮ6͔R<{qxUɭyU[ъ=%9s=|'#*u#5q=_7HUͿԒ.n#5,vĕޮs RD`MBn&H1k6ՙ̢]W*%fYX;3\_oG} ؓAؑ?>?@逝xA2Wr`)ok'9l.\},^XpSu-#*" 2A g`+e"HT& ?Nq w@鶡=//%6P@H{3-X#5iuA|)uR.r+!Ϟ0Ѫnd0É<اi N8ۃDЋ4_\^F$y#1z&߆/Ex)ΊƈNߜϗ#pw O+s#5| f܈ԫkH1N-Ix͋!bMb\D0u4qCIx\8Grλwl1zo]]4dqƊ$Tzx#*7҇C Ht#)EBW<+Z #5s3OE(﭅ush]+cҡ('Y~"/q}Y;GyGA4Uɸb#)TWU;#@Ief?5,85·/Q{ۘ{+Vzm=RoJ m^$?Q'ݵq#2u]H:8% nT0X#5N{|eXykQAo?D<2NE^l}#)KFL{(Mzqg(~!RKyp. ݜ9. B",/~v^~oj׈ώ< MΧq\ѴbW_cgs2oe1׾{4,f>F&B|b;澿ܝ>ßτz(#)`@)z۠tW=kpBRaUC߅RXI H ?A?(?|NA⃪?GkJ]bKI_6WlJ&*m]u|w_04[!&;J,-L/쁌z!EX#5AHMSBzu8r:L-&OySqM`=MD#)Z I0r^rxSFf |z{BBࢂD/p) ?0#){#)GZ(F6bUʦEP@RȶޛO (Pkr҈dв&WyΕ$NIe|:ToUp2r8GEߵtm[Nm˧z]\~`oFGa-> o#)ݭбOEͼ稌@֚f4s%N]m.O38 ^䂸E_};0~VafZqtVs#* C>hZ#6Z\"0tKOֺE-:@UVka_GgU+"FNL._GӶ.2&FzY*{BMhu){ rKJ}ԀiD!$((aLtӂsgF2d=Dj#)ACI$s󈯳u#5q XY8(gV1)4`)ahYI 6Kb% #) *nKjLbO-OAC{tL0Yc[6#)ugVgzh[*Dq#5:%SO&bx26/99ׅjGTqteW`7n#)AeYWwq^jЩ}mL+^U?ۗC o%' WqtT=vMZV-g r_ǧ֫lzI">{ꇟʸxjEDn8 G#=wғOh#Ңjl_#*FO_FѣZ+Oq,wLخ9S\GUN8{oLb)ֵ1KbRgER1#8BA,;˝7gs0x^=#5 څJU(۷LjTl^Dβ `)ek#)޲@ziT;QhQ=?ӟ-7>0ۥn+z(1A&տMsUJCz~F͘t{?rLR P:gm Xz_=!|M\޾kW{:F&N6?xU0~I*pF}Y$ՁP5: ;h S(ό |#)߯Pz #5cqyhB;AT%)j@W쀣@ Fmg 0$FA甩ĜTp;dX_Z3ΰ_w!a.0vFS!j m!*mȮVaepEc o.5)tljy2uy=2`@/+M?wg^8z[+֮k9B"/M+i#5j5:vq6/4Ҕ=د˨BdYl0SĪӡxp8(9t E}%&.g i3\a64Z dz$=z|Vo<"3شDc*Juxcwp/~a]" 9ϟ\S}/ط7m7($rGc>-hA (e3߄#5Bf;?-]' : #*NlfADl*<g~[\zCmg+&Jɘ-uc6s/k؈|#5>~gH5GA*#(7k6C4E%E1 Kx '%DCvrY4X!32m*ZZ{};DvI hdYKo`oNI^6p@e]nAq$s=>Ӭ?80Pb)OK,M'v R+ØaJs 'qCˋFR.'$ -v:ODqp[@(FBx\@e<3=0ѫq~VUEE@EUH5 Y+8!{7 p#*v,Owᒗ*$~ia8o>p/k:<U' p%dGK. W]ng١"y> vH[@,ݨqjbA,~ұ{b1$VFP0:;ZEvZ$L71IwaѣVB01Bl&z5NEHLJ}틍cXS{aCʏUd:i!k)y'a.q7㭳;ũM#4!Q9G .4WU7-gi>mt* =fS;0V`&^^pݦ_6gar!-0t؛4@XZ; ̶ɪAUovj3#*%|予wr@9|v*0{#),uaXmc28|18<6u{Oٵ0;* O\ i]c(DFSl߱l78ɭnTeS?Aiqΰlc#*gz[Cep$?ZoDlk{|~ؗc͙В"zy^1Z/lZaRTQRv,U`s;*g(OxuPx3?* AdXBeAUO~h OX`{v^WRz|TC i? MԹ4x3R9%-#)Eu"'^|RaIOcq[/`\*J!pʊmulJd)4f߲o;XoAt ;_] =Pp}=-'C@E0u F!2v!e܅>~#*WI9;uXh[![SaM$)ςwv9(sdV $ }~8aWސ`fr!Sb冤C#*\rXvD-N*DAC1q#)&J4 ab+Au#*Zd4#)HF0nB@b2P㳂낶Ln),bEI:ܥtB9eJf;] 6JP#d(x2f;F%`#*Rd@(0 T%_mx ?[#*>KR7Rre\9"j|j혠POAT>rt7 bҀÝڸFe.X>{c#1̐w"!DnN"ʃu%wSuOh<]vZ=&t0بRBeV7vdcFVL#)C}rJ;gwTU= V0nbY Y Ϫd#*3mRc!DgО_MI(HH&u-hpXd]#59p&kFr!wp8nWx zu##)m)3g`|〭#5CeoP=U\C\փfsa:3#;briӟͺns.M)*VX{#*;z_-vxT${჊ׂKakw>{C!tJ]:%;K0o/sYʙs0fp$[@=D8xm>w!v,HBЬz0lêH܎9]=U{nEFS\RW1]Ƿq9@0nᱼLyVaR{C a>.muE©r?H#(Um/"I؀JPQfVYY@}%d@MҐaefQ:Z?X02i}_D}L3Gϱd̪6'vgK[Hs='4]]^h͈u߆]>2[Ew\ :WpG;N:ڛ1{^qٴMܜ(>3`$ bmȐ;fQzmΘ'L~#*y3"1*j6N;%uK ?/&].E?͇0 |ݐ#*6N{#){Hu_ݰjiCX~8SCfR3m# |=׀EĘi~?7]# M6|iπ#5rvN2Kw)e_e01'A7ؚKU%$?Y2F`HC?#5Cd)EI TrR_٤3T:L#*霊ϙU6s+ $d,fQ/^3ڰ X0NwB, @f@=_G~!/c{^xަv[氍pյ0ʽgvWi "8wr0 "ra7aa~^pmY$fcon.f8SSF3?!-k(YQ*{eawg9BJ%V#5^T ?_߯w>֭>I^ Q/ 4"nPwa=x "?<q3g4o¢F)>^,u-]tV7<GElniס ,ts@}?gWJlhk+Vo(#)L?KCe3B9Y k5q00 IϧP#)Jf0 0ܮxDHiFP^J@cPtĕ=hÜ?1o߭JT&ƻ$'F]cwgAz]v7+T>1=0Dȋn1<"n16R1麗22.Qqu6UtQi%NB(:>g5O%x#NCz'}]H[JkNcŇ@0HP2Gy|}ZkÊʵ+ݠGEB9CYu`tt߻6%{rf̃Z|r#)G=vӡXL]4 J(/-!dVTZ};}FNr~k )]Hz̊t/8_Ϡ&G=#fʯ -E2"{>[-,ر% 0Kp1T]R(rGJTab^ϟc`0{=U{՗#)>С=Rwk&f `@TV?~#=ƽy:@益DӤ}!1(7Elh:0plt(U_?CR]lpBQ!*J9/jQ^=8<{@ku {XIAQ\fsn~cl05jP3:dlm]M'vԭkO4w\1GwDGk~h`~^OMNWb[Ńu,x6M7MЇ]<<#*[Ծё8BɅm_(V%LIlZ?Ƕ9-MTZ#)%x| ww#5zըw[A#5a֛۸tf=r|qȽgvYϼQ}*sEĸ;Uw4cÐ~:!*ƼSMHt)#}wrg$D nfEC((\E۔]w1Ծ_{Ma(#**0-#*;@Ӻ8 j+ZNuӚ+L&$2}XWxyƧ˭^fIk2Sؠv<?mN|a2ʲŸZ.rLcWԱz7#)+ް"Z`sV #5;;^:Aq*db4 bDmO6/b#)mmRfd.jQJ'{ŵPʮo`Ba%f=}^ ?)?x֡V6Qs󓓵ySj>DQ߻$>\#*hVTTqG6R#қ)X0sFxPtq~{\=q4T+ωST?l\(j?yqH^/눷4}v32ý̇bݫǯvd&8#2vBɟp ;{0xkYG#)^UM%?i#5DUt\miU4l[xmOQ@韓_0<42f:DulDnSυ* }ӥ8XBLz83[I•2 ,h|vt#51@4Wr݂2[3Y6-˻!^ {?4c*=llŢ)3QE#5#\Ā;|d^#*0k?qm&OAYqT$!C-`vWtx!gОVM#)r-;/wOG)F9u2 8tƑd&~u0'9cg.sϋ?>7Lk;0sCdw`Ԡx'㯺RcJ5b{P(`BM=l"rk_#5>׳f`|!3Ryox}\٭h\3Er#50€ԉ .!1 +_C@X©*O]S)qc1UQx=+ ^<;~Xf, l};V#*ϔ~RmȁhYxO3Lz^O;**I(QByh%qI;50ps[iCB#)Dsezb/xu\BHJQȼP N 0Cpx~^$0 :u\4E8/n% ({^z@ ,ڬtk_ĶF$>*WfU$`߅3>[xS@d!ּmPT)-8RGHxBDD|h~^m_y8 ,=Yrؕq.@TReF[TK/P=%ecx,#5 .U)Ϻs5aҠi h$#)&=dɱyXY:C13YM.YV#?Q(lN#*^#5a8#*M5`Dݴ2P'+wV_u+_tfӸ@n{O0$uNm]U4}aivٴ Rh_*Bmѯ ڕk23*s$@Et$>GPPj㈄W$TD.MɃF`5e$C/*@U[( (g~_P&ɆIlZ 8i}25Tyqxuj)ʙNA=Mƽßpc;bHՎ_$Ĉ4~DNPRqZ'hUFA P d!Ģ!OmˤhҨ3֡ɤˇwyi$#5`T1'Mh֎7ަ7yч;]6_N~n1.f8#)̠sICbbB׌-&< R)RC;ޗ$uºI*auP0`l󁆝#\#)#5޾x5#5#)&(O1!_}2hmGg4EU_$u,qO'?n~"63٫9ATq9,{|1ӷ:2D5b#ug]xF (#)3,Œ30t\iZ^MRqeUe#5@1oFDj.}~#*P=7ғNP.=ZDKq5he.CgA6ygÏ]wU >/M%B9d`kv]s#|vtn#uP ^#0u+#5Q[ (.ɉV/ d@4JP殻K3$\"xV; =͝)|%,D\eXS%H^/@eDqD-u24 ҫ"zBκ֎W HlJ6LU2)W`X0"09pNl"Hn9 isRI'/w#ģ,WnQ^ -$50q#5laP0ןkpbWPRq;ru06o.Y;,wJ>A#*,.-<="N^9vA:]_%;E8N6CŶDj:( q^NEv,Kso3D-v1U%cגs<#*Q]Wٷ6>Dq-GwM=(4m٥NvyÅN`&8yI(#58Z":\u>l#)xXuR"7T3@WL*MN\_6]S-Rg`!s j@+K8Z #5.\DObe0wDaiK a~6\cpQ>7~wӷAQ{2=V;9FAtEQzxӔ!Hk,0ǹ$˼<)IH*!}BJ/=J`P}-"~}w $#*aAK:%Vꠤ<9=թPf)!d9Pe!n'~ܔmLOJ)wtΛ5~/<h̃/#5!2Deza%v*$:bGJ#)ҨY*e#54OZyB@3?FkF89+ۙO}|77ݴ^\-QHu=#*&UG0ga/U`#6#){J Tk兾CB" zRJ R*aR3UPYQZ+a#Ҷ%7#*+``0gg˻`wfXm}.5?QG@;p xh,/_yT2Cc.Av Js6/' t6<%#5;:ѽZ+c"su(ل`K]^A詰#)wzw p1.﹊i Or;Ej=NС|Cܟ"d&era$/lP47OTԡk!;?^̓zPK??s<貛'n!^%cV#*_-k0bY3ڷ #*c2ǘМԽ&mmy `h>;#)oŐs#d7~-';@(̀,5"}YkU}Ӛ{Ro42T.ƇG? E߫U,)q8%m@D#*@ka(E;"+ؘ4BLLuL$wv5)O)c!E2~q zk6.I~]~$yk`^,Mbg7kvmQ5gxoY #9`ày-)FH%dVBt\#*r$sV6ŮdMcuL0@%AR(#)*^>-bxgeHՄ}!= H61L|;a?#5XHWCIz: [WO:"x#5J*(X唝#*T.@u\4rĴ/;zE v0"&lE>?ǁ-iH6t^Mqf%ЮI$;H_ۯPnG`M./U3=aF$D9?|  |N :ξݶfl\2$v!o>~( ;MA.?t΅T'J]PR#52|vD;2Jr/՚(s}+#)| 5V6 ʴ8KYO'0lqŇkЦu5:I-ͼԃyhn`p CL#*ϳcFEDdhxee9`?EE#)H'#*̓G x 'QICL!Pg~Ԇ> I)b GbsC(j0(B|hb$P72$W%Rϑpd62:!h#5]`~]6IN)a]̐L!9@dqئQ@%dqV!'0$]Wx!9}cLšT!Vʹfַh鱺z)1fX:03QZgw0͊0um PF#)l3IsJ#5S'.>M|Meb=!B,p}#5dquo0; #*0J$+;7(#5wcBi`#Ti>]%HC;}LlqQ}{'L,[A%/H]>bO@#b[U}9y|EIJR(4LD`=sF[5#*#)/vjT/ JҖs~vWy#)݀A `0_2T,BAE#*RHzYil2 6@7H pdd<hCqL~+pPDr#)>a>YWIot(Df?,FJ ؠ}44D6裡 OLOIGqH&`! l B A/Dbqtn\!(E9?YHCuP}D^|M2j?0=N+Ҿ_d.Kgd.@~XIy !0Cتi`e#)Y #$S; |Jӫ#{l(džyt" -Ce&p7 mH`ODE@]'rԕO3~Arck$Et enp)Br 9t'/v)bD.Y,A*>R\r$ bmUM?TqtLHДTwv5P#^w!q0UH%HYW.&&2nF=H8<^ºӃM91L"jnNgކ_H#)u;S_'`zióI;J¾xy_cy, x\'z)#*]8bxxuwwf~iB#5"Dd#5#)5"#*Uh6l#*#)A\A3ju)qmTP+ǛJ=;rbHH@9 !HRp'fr1ð2L!c#)8#5{Q!Z6Eur͞~n}muCih[XPDa軵u;gmQtQY@f-%"Ұ)0?OOl%Aʏ O?T}^r'M'4Tq2Kii隺4Y xL!(ye࢈L;ӳZAMR<`^B#*3EO9QH|rQ&G^e #*Ta4HD{haRmzvo܏2 T3Ʌ#)ҞQP,4YºWޑ'#C@ +#*z!CW@١gG`s|]j0@"#)Ad4#ጻP1<1uKڶ/n%3]O"(!J6nȿWO;T(1T&r0<Tf38z1* B "D> xw]y`P9 R)HAdP K#| .=GRIf#*g n#5t"nW?b(@ F_d$EL,S1}jaTiTъP 2A(MتI6#)UP!f弸|Z|"pSR"#(!8?O}/ <#_e[Z>c#56ęD#͈L`Й{=2<֍ni$/&v٠[dяM¨֠zCJ`UGdqVTBSm Jh6 6 1s}Ǹ}~$xLyy7p{E]vOgv$,7QڗcPp#5rvDȣ7 >H%B(Omfwǂ@q!OJs_]ڄ^uT6u+ q̃|`#h"HB:Wt>Oxz>\AW}#͍H:UpKdz˔tuYHW-:}n!#5?H",Z@gx֩ɊA oϠB*B{L"p6(žN߉Psl50?ɻRp3㎀@;u?5lN;l*'HifnÒi1/-\(h7ȪJfZ"&YT՘8>5/t zp7"<(H/o| /zn;H'[ӽ2 h,h5Fwn9#*'mՎLgU'*Z:_΃K)jfB;;^t(PpL871iJİ6#5Ba̰hrB+kKŐ#)^ "Mv+~+fD[nlJ30FeN;b\ikh'g770Jƈ䕟ů ػ^Br1c%Qc(7R~@y[޷{P{& ! @(|#)|H4`j?hݽ3xG$[n#*zqP{B;Wl1__߶g6oGmcQ=O󄐈ckG*Deȿ?k`0uJS\نV'L8Raʖ4?~pM椡Xq*1T CDVCGg ,}&Jw)d^zo(0>FT!y? @4382^߾#)T_)#>yՙmqQ}Ҟn~2LN}{ɿ넉S#EN<~*8$3Ȩe@suTڇWpTtZ1'>M`0M!i!Q'ʅ , XLtx %?؄l!]=NXBGr?>v? wt*#*{ )VB0n{Ozw(j[w2s%nǭ:=a>?E?|/bˌ]Fa-J{t\ԛu2ˮA%H*,YV L2l!R 4a5'/ūO33ZV ai*f/8޶o!GShGH̿fS6caj1 ~͠ 4`l? Hjst4T:ݳ}膿IJnnRK\ bO`<$Zbap`)]ϻC"*@¡?:yWSl  =e+b] Y#*a^32)E \$Kҡ(H*cL̮jkt&ߜ>Ŀ^ӷfXCȨ4)-Y-Y*\1vK[#59I׈#59B^=vx$f+4'6|?_*ei!pWiR<?Dv%rfzQmᇒz,!ġ:xr?WQکPe#5@#*#5D'^c"8C8 "Hi^IJ'{=~h|t* Bۓ#5 ٽg`Ms0PzHsǯ2(r~P{kzur0(peҎ$都/d͍4!γߚgy꘩XWr RzbҺWK9HhaQf#'c}=늘~G9vR ^=Щ9[Nկ7<|\1o>u-u"N&xwҖ90 DqA\U@ҭڇc%|Yap[J>>./v5&D_FSqs8.#5$7Iqn 0&`<[ iy#S֜ږ9<FjlõT:o|~U}'4F&#*(d@RqUYMK5ñxR8_ιq7?!%r< N #)#){']F"PpЮuA!hgW#5IBOUyV8YU;95TNQqIE>GuӭB=f?|q=pdys8ph^:=am |SVQN"ӕkcaWo|-\ԨHB;P9!:sux#^oMd]@RT]9Cg;QOP>d>V*;@ߪ"/n }K,Oӷ%Sk˖aQ\_ʾ`Z8^`{s5zCw@1!, )@{Ґ|`5sT蜺L#5TNܔBL)vW|-߲5Y ot@2UySv:wQ_DK&b7>?I؈4%jb\lM`5fcdkp&p3h5#)a0&b1"J5ihb~@J 8 FeqW!i.jx8Q -0V#%@zǘ1_DN;#*}>$lg9EHwE}1)PZ)%LQ#5VBJdRU 0hA]$Lg TC2FB,?2$d`E""JB[A@DH:$ג= ? >P<Т"ݷfЁ=hbK+0 lfhkn- U^}}Rwwwq*<<7s?cб u d2ZZ2!?'9CPր*B!hm0T޾b!OBQz7 =RT֠Ig{#5D64e̜-p0Y,:HCX'"0 4#i5ҶE~6&b yxmx~Uu~(^#)fPRV96v۰\[ ߼7۩O]&T"Pvi2?#5CO#*eXɽ=^V<7 7]dĆ;YW2)(3`f I5LSrMA#5x5u#ÿg~mat7c"fSu[8W#*8ѥ&$f|^sDR7ckfk#5كs50]y=Ma c*Ө\CM`]:7E1{|L&fmT-}<ØMdw1(Aèq3ӿeJE,&)e#Fz@C{R1$V#C[ͷF`.m* ΈM8V9G1y4NgL&!҉a]36>,I%p1~ʦxd擻QU>ҍ4Cxo0tM'~}ܽ,$ow\s#`b5;0=Xv]$8d=0\<w#5--N:LʙHwoP#*l0{#*T@ދcp*Q88Ma8%қbE7,-]HnKk.,I(5=N%JOrǏqdxt#*JQ,%;^U (9#*=3~_sጻ$wϯ&3P#*!MriS2_CJN4(,퐁Z||986p#*z@/8)!)ѭSf4-b$B& k!)܂ 4щS̤By&QHIS|s8ٕVCD9K{pnn0GQQp(!L߻nۼZa0d&Ũʖ3ǀn;hI&AF9,e=v;*+0;0`RYZ13XIDO`bv7^y!T8hIs"^Dn8ۀࡺ=; 3ȽQRDW#5lT1jaɜ5#qI{6ejB#)4֞;$)=pqS!Ry\3zX42QR(E4Am$6&Ì57#*E55ڦ Zșa3y#5Jd&a<Uz#@cNݭeBR]9 5X&p;#) p/&q5#)Z#5%2#5U%,@dFP"@̲p5F+7H+ ЦllgC^q#Q| q.jAհZCdRH!'#)CJEʋ{X,} ei򄉬ܸ&\qd໠ȯ<ĉf˱,oLM[*&թ&w/FcDR"A M8dvwc;`*$N>2@9d~&cZ_"}R̡hC+aw[wC)h2y5G; 9^~5fỶu:z.J?HNO1㤚~5f#*țNzzͱ;X];g fɹo}{dEYZJ9yႾxhaaDBJ#n@_#5Ga`oyE#*BłX(, ?9hvK}JCş;KX11V/_w)DT긻;Wmm©.4kL%WEYGg|ǰ#*Cy@m{2`($6"hon$kX yAqJD4qD0qsh@4a#5 OUbK<]TQRY`o9HCby#5-@I\!(?@ت PZUj@@y;#)ߥvXqIz\RT82C$}JPc8HZ o:[sE_CSB@!xE#5=r$HqaRlH a=H$ 5 HMmI[tі{3kgubg*n_$QDd/,iVj C0as ?n]yƏ,~>9BGН#5*0؀H$#%X*dʌBP#`|%33*qJvnώ=!WL"I#52(TBA`BG88#5t_ֱkUYZۥ^b1. {-crQ%;#5(0ZZg@'Z54Lf`}\`H炇y&W^E^$Ž]zm^zLnŹ*.nwrn@ y+`3IȜ5b#*YSRs6#*k6HWZ߯_gշꀁoh@68'I8YÒV퀗_iTYaE-9'6A^p-+VA ä>xmI>কd0j ܓy.p] 60E)i~}^߬RQI_Dh+=RuOKE hU&Yy>;b՚mC_26/U$bkUh1;D~^)Kb-e#*{RhB%h/][쭃?ǶĨQnZU3*[lRQmDlՍ$*LkZ)T[cZM2MKRD+ȉ?/Z;}t"y ȪEdRFE^Re#* xvo8s[#* ?஫#5#*#*9 i#q'  )o8AɀmkZ~Q ֈU13Lm6hxiҾMDJ%LbBO1h90W;(9.#5}#)Up@Eިvddž!hW 2b%&*&#ϝQu#Po@(' :ɶ"Bf+VmI\3aJES0Z*MliC (3>#*;[d@X#5d"<?x0:i&`!2@&]cŅ=_+ge58hG2#Ӊټpت`dCs ex +_3:v0-Rp6YC[>zzᤝJ`}vL|e_o#*#*&MoƇC!qJEMdqV Y\5^11P+=D)y;%W||S{^2= peы^FyV#5bהx: nc{Wq“f^O+\=EwOˎnM8ۅGmfAͷuP[FP%F=k_IQlA׏q##5I/wfLdh[lp`F!L\9/[m.ɶvÐlK"A/f%=jlLӻ+RnXtՌ#5A =A`._KSv#*V͙`Sl|YXuy,2`zA &4k7>x.79Cw]B-wJ<#xQ =)<m\vwhT7μiFwf8<w?r z/!=Z`dO#Xlفo$$%^ fs\fIED3WGPBTfݸm/}s0/a#! jxZձE;7Fl/hؖ$F4"XmieZt8ƽtBD#| g.!gDt]"&8rpp y*eMJuERLwkmL!E'2whX\*FȌy44R}s1||w5g^Kvi4&K8bL@`* .>>˦;3>EHdBV#59-Cm-Җ{YGoxte?C0.ŽNR!C\~qu4٢%(pr;ƨ~Yי"N(DﮗJ II=YkYjccc /m$BGO={5 p$:nP4NOt @':11 QU@`$:R͒se'uu6r.K;kmv) A  j5#* QDFA@@].#vX`A:81}ZjRjR($&j)WetqD;$_j%@b`z!#)SK'3O6'Ul#*E:|K#0kTs2-M o }tY6sN[=x$W^XƉ$i,#5D->I[E3#)v* 0BA#5.0{5RG?#5 .R"!ݒ|G&q9A_9gï:V@18dg3SOR۾!m6J=M\ȏqWv6Աl]S*վ#)0$ 3]&:3u/CZ7@ JV)X[ZlȦ_NY3!`:Ii|Dtָ2 #<ݐZ4Klfl5ᒭh1R]%#*#uH8 sئj2T@ 3´HJ#)B1ؐ%2'79^, gƈCP!ď6f#)j"D@4+ 5FS}˱ʒ#5Q pF]L41"a >KZ#caL;aKaG[3A`(1H0"SJG2%xhri"f 06(>.c`.ԑ9)WEqSy9'#)${`ﱺ-"K[Hm]bXƹd׿_8z> WǛ$rUF.ĩ;?Ks߈4{JBd'6KDQV;*`LP(ʗSPnTZd!xcH#)(UP FYYRLcC@(PRxRL@")IjKϝ熄#*0Evp#)HY9ԍсv_06Ԑbҭ#4HF}M`b[ɨቑu < dD)5EzrBB[&:Z|xt?UAiC7M_Hml6Qǯ,&DߓhbD00;A&R{U =>M IfQ2WtCvد$Ȉ2iKU&qR5 j TCs;ll!8wf͕U1J vM< 4!` d`{ּJ0ң,d0vn$ avBXU"cڊbV&Bl۱'|e1T0N\pYXڹ{2Zck5&F)O xk+v3KDy_ߤo3aT<)R[phm Xf" M-2@AȞ|ufbbVe]*Qb3#*s$7σ_7aQfWL׿n39S1%J kHI1"17{w}G䧆'>|HyMh! @6Wq|ŠV?r;.I@K8ȧ}΢GÕ gIU8#$ D"H^ŏ]pKv}M,&~cwM)~ǥV(%Df<mj8ǘE!㯇n?#5yS5cuI-O> !X{Yv[ا-S"-dFԯYQ9#Xc~#*1/ÞQq7PGWe2r&PrE>Źo g+b4N{I.Zmu3FWb*`W}rCm#5ڵha0wp$Jk]H9M4{Oa S:ѧd|a#* ps\Yd1lSt?_idnޗg5uRQ{$j^{+pW"]h'W:'ZUHe<*N ~g_ӎk/A:6jqBons#*dPQCaRܛ#*me};<#)]薪7[F0Lt%'YɼO#5<+ycLxO@!$Z'W:N&!ϥgxD}={g#*JnmԞ͢;#Za\kr1ǕZfMT!B+:uӃ{Oˌ7Ϻ6bt3G6k/9r21 %(gFE5)\vq+[yBk2뭓0EufN![-x}Zr.3+Mi^% ce4m(\æwYY8/yr¸Qfh 0R!BH_Ҟern }d]yڃHݮt)^ ѴdY"G3."Ϥt;!궒4,T\T&._gvb#5T\6(社JhgTU6$UQґ`˲c nx:Mhۀk3G>5GkOF]}1ػY[;xvۇ5QK> : 0+.+x#l#*f*b[<7#5Mej#ϯi̹Ԟz[QfGc:ƞ1&ӊ-ZWѬ^+z6@ܡ΀tm{QUz(Gw6#* !N4>^֣U9Fg R35v-)qy|<$32zBh%i65gݱ,}]GKp/9dmꬼ4DRKfLl{b[w@M*l;^=tŮ&A#5`#5b3Fd+Y0O+#5$UۨwRLyW#P$'I#) 1l*P)1A&k@3L<.0ֶVNю8\_{@ƣe1f3gsplVik9Mjg2JR8I'.vvB+&  H$b@0x7bk@&G%:CӆD#*p(K՛\ zzOQ(* ]Yt@0L;?#*4*wSKo Eە07CN#*mfG!sl|<~TaA#*Ht#:͓k` IiuRd-#*Zó#*rS#*"؄ײlm&VL#*VLh-&Y#LM*B)U).飦j#*)T,G4S6pŷL#*S '-WD:$UtwNLm)p=cJx3a ւjf9M(}ߔ&a"#Tst>`„/F32 M'g3#V#դDe3d8!Lc#*6Qv0Jwmqrun;tn e6r-b1!#*#)RHonПl;mF%IkmdN5tc/2jZ]4X]"8nEH-^\2pa:̯ 13TiYᕈ)#* G ]X2086AŃF@SHDWqg`/JK4BE !#5xʤ;幼Rj9@d:9804$J#*5XEPSBpz{1r,u#*dmU#vhbGaJt=#*Hǥo3duSq5(7TP#b#5p(kxmpr#pc#5e#*ٙXa HME5Ca#*fjaulJDCst11p #)i9XhwQ8ʌW;eT.IG3#%@Cf!b1pr8C^]K,qy5,4&`Av-Tp"`55avW-"Gd1%8d#*Θ&e̺F@ѦMG ns\$\-+#*; `b[T; h[@#mAQH Lѓ6o]m5+6$B(Bf%(aMJzR kuxǚ`J#)fѫ4r @Ь*?PLY@X#){!snLP+!no7^[ʻ* 4K@ `@R0۔dJbImRaBe*gZX vCXPŨ2ĨzIjJk#*Mt}fMOMC5ޖc G^w$l5J>FN:u3;'MDBl$Yl9B7aq6q.=Ū!#5^ϕ#)5O>3|N_ED `o D6C󚜺3wf\tݷwH%E݅?6:^Gv=PgADF)lmb2leQ-2;fH(։<{T8ฦ!.t54O\CXLuhIcXcQ"H2$i#*#) _q,>'(vD] 4wbLM*nÞ)/jEF9FD`m-Qki5_j !!| ԉѮR/DAV\CLVrRo4oXQ n6+uVu#5z6]$C8x:Y%leҵS0:4KYk2k8s4!S8b \!^RӃ#*h1R;ua]#5JfuoNcnH,kC3 A䦰FYW DlpaY|#s$C6 =F)~&LctDAN <9U8J)01i.k8 c0jn!s[3%56+6r7뒌iܺ,O <1W[hQ`p(Y`&!:M+F(c;#*81K A"1a93PfJ)"4`LX#)`գ6qT;JEZ#5!he@*X6CQT4I$YY.*e‰X!jմPEvD͔+#mmw]jvvhI$c)ZJ#pR2dƒC#U-ծk]]Row(iy2%Dŕ5-%fS8`#f UmۙMWeTRdM֚LהYi5j4W5ELնEX!! J?֣J#r w0Aȸ@ #)*'hRJ"P PD=AB0 ,;bgf>ڽF#5#*z;ɌC`l .8xRhGAvy;!*;^ gءsDpaY+-SVěJd&"Xb@axQ3r4֦wRMd׏֡Db@?'X[>γfFO#~"{BoQP$"!= [M:'Ih"#HuRBH$tKMSZ4V 96'ɐ#*RfuZc_fIx-]5*#)H*#5W#5@K!2Λ#)鸤H#),#5kYl)f4b[HJ-,6lٛY6ؚSE*Sona!DDJ D4Bl43FLQ#*YE661h Xԛh-ŔRjJIZQ#*K !BIFL%2M2jYb5D[HZ4ɖVږk&M(m)6ڒڵjveIe#*%J5)kY5Fڽ׬cUbԦ6JUkk)lO;'J͐a `J;oM0AyLv?㜱M _p*Ǩo x88ا*#*.n{}B;Ygʛ#5'ߙ_P܀'`o )}!9,ӿf5ѳlf<2b+N?ťߙإ<*"fW8 5[ &)"-!ő@PB^fhXUE09BP,ڶSL `wC/JU%#5?#)gz;77__H6TY@4&hfq0bkO#52,ȱ4c4HB@%uzmi[7nNUx\FA'dZ+xnr12X*[QÏZZ#58V#5rłGT%O@uqTM#*: #z8$j(*(ukߵQX)M34#C;9D2ϸYó C]h’TI*@#)#)+QmJۏS#*VģHAI!虰unrQ=wO<嚰F#*zJ H#)TC13o J Qv9ie֥p-tO6#)@fˏ7öoKt;j7z(LoMGE9!󵗪y '`Qrس!B .\2gnZzbʰlV!-|orأhee$F1FsJƱ&Fi6ԚFW $崘f#K4܍)#*u Mi䊽-# 3Vi#*KTmba2KǮ=qvƻ@9ch*>Mf~ȈÌo҃T#*t#)6zwQd턀(yN!mE'@N sg#*U% *U0͕hG~#)D4\z]pJ}i<p!$p߁͉jcFļ !TDo++}a:h5,D }Ad ìQ.osnWTé\3A)1k,Ըv#5LgM?.Bږ"ZyrnIXK;m.ℨǖ#tqvL#5L̰AƮ5%!%6)F-yF6(Ow].l~g_8g:60[bS >4b$-|\zA PcBe'$I{|>7.*XV%#*#*#*$6 <$(ȤII娊47 E@2Q'e%_ Q5lcS=;Us :  3F!T2-X3xQȵCMMƒ'SB9tLhԐ8q4<ڡᖄխzVژ(Ҵ߾Dc<ϏpCxj) c@MkaYIj "# h`6AySX DqiDs1p \"_f#)yi;z}, uCx(xuծ+='*M[),#5~ `4̞Nqi9ۤ#*iAޘ̈Ѩ™4L5!,&ii [ #*&Ṿ8&#*4ҋLF;evo|FCqudC09wpU]=(CiѬ$ 2DpEK,:]en*:fvFZcE@qd¨o%1#*:87*HR!dJbb# k#5tK6`=XVi/ng8Y9*#*欹GcRheMjDTP#51Ծ_b|>RACmtV"6|"&ww]%㰌kLpے.yZ^v6e E#)I b0F~=kTQS#*&HaoUfbJyᦷI-F EHhwMo[׼Gۡ.|8֛׉ u*;G-ש\h̎NRG`E?(z&ƅpN0˭9!ng;+Ů E 'o6HCh="r7a`z2+qĄdAvl~Z˘_eMDUH4ڈP0x\#*IņU0L[$B#56o]HC4HNdФ@Q2)RƄ"uHf2@IsҗyɷEXV84֨ L7}fC<8Bܓ!fTyA+J{2j3z^0WYXȋ ~t#5M0؊j5dګ#0c8 L nj[੦bRMW(KKusWLIlV-EmZ#5H)@F*7ajfj]4O>e J b5eek4,% .$#)@ej^ oڃ &yL#)E`#yY/9ɠ&Xf+V1&wϜ3,$P6O4qwc\%/8$#55ܜY Jd"*FZCZ#5bI5z\r:Xc=:l9z#*#5Q+4Wv"IZ媁QTFP׾Ws0FȪ5Ѭ<)O{,Hz#5\C*6蝼hpז% Ƚ[)q( Y`,Y/߰Q3@0QaC8&25,PPI0#)* 5WӺo:~șуBrO+3ܓW h~PNf̦/19(|/"\;}@)$HҢP*,"TT 2G6,PF$H$AqYFDF[[j ]!h2 l1Q!E:M8Ru]cڿܼV!$` rzܔfu4Mcq8tp$dTJoAD[O4)եԨvGӒ]F&+?_N\XN M[LϨXa{n-<}1"|]rix}{!E@Q;#6쥬RK!E"ԂƏhl0{WF5EP mہ()@L#5e,&Tha B⁆UZ2gpkG1l_;_OW ]:5"KM6l9Xn$pK0VI˻jL$ S%HP3MRbcEYȴjEdVkܩkrm{j>fe, YKM)(0"5|zoʹ[hc^X `ȄcWkDC5KISFM2Ɖ%#e` 7 6ȫ#5mh7U&X97hΕ$EY,i*)2_;xmci]bnUآ1f@3te)`T2"*‘^66CzjeX,f0AΤ]Ya#K@j37Qr #5RlA 17ֱJÓ,͝1p"$#5`W.! :P(]}#)}4OMIj7V8?{]&!]jfT][uvtEM:벻me7^L HCt>SL?_f6szm㛚1T{Poxq}! .Z1 ,i&r[,5]TcMD/j ;jmXŪ Ь"L A*:#5%RD@Q' SaB(*B$ S't,XS߇X:b&/qC3DD(bE!@-i*0*_HݥaLC 9N?xi#);}sV'`7r\ dH"61sZ%7nF(-*CUkҠ%#ɔm ȈlcWn2baI6ԕ&iY/^U{#5fihEG dyEXyuC&{*Z٭D*%]m5#5\R `B$b.WوAB2z@<ăfĸ?l@!*!GJL'5%I{$ىN;3~=#%Ѫg5H(țalNPqz4҂4`e +zTTi#)#)E>q88%\;,ש,.!m4JAY,KV+C6jMfMlb5 Eio 8c0&c~X|G41,Q~bN,ԫe5w(sV͢L7mJx#*kE 2kX]QbiLHj"&#*#)(rmk%U#*|>#5 4=xM;Ё'eMa=HNv`Tn12kݙVd̐jUCtKQi[2$::3"6sLGpM'+* C]%x5dM`t!zLp[!#)TϜi\3 b`&HF#50lDS;+TPP_i=YfLGU?ؖFƷ+T4W90&v&$7=Jn3y>h&'ԖRzrk+*?7Wr:S ("V`ԕ&JiMZy\I)\K?ZT̶1)k$eVjmK35AkQMmflVeM7YjaG%ן iltG)Mtknj[]NkZkmm7WT`/76 8:9qCu-kmsb洷x!#)?aw G*(4*#iʣՅ 0| z bLH'˃p(q0/(өU=>InoA'8 %J xo'D7,SQ!(@@-*/Q/j*:ZЛE (#'{#5Eb1B&"p$uNF{ ͛ā8s `!" * !t+4§`H5IiK$(SZSH!œ WdD^4,ea$0(^$K h&cBk-/"l)P!=ZCbH]jCD(F2Hzi淁?PuS#*h@D/: yӌ R#o{K5)zg8Gxˉ*\̵Ըu tV%DQjƛ%S -⍈$Ҁ4Ld Ȉ*EATD#5)y7])L4O/Kwl;(~<ɘC2D\pL;U>dO*( 4&S|5T'xmaJ45ݨmPZfU4IJVZ `9k)'RJxR/x8w6QdP.$D4|JH)"u2j#*44Z`#]̚TAЫJ1.)Uhfned3>;gjZj'S.B/2qզeCi\E(z#*ݭbH2OfH$#LCJ~sXn_흡W&+! hA#zL3BB2++ۭ#RʣJ6Z!t9`#*Fy^fcL1e38F#*Arm2݄j%g&:= İu&o%8Yfajʥ=v#5ͦ#5lmE:]kEmP]ޚVo 2͓\0uE7ghh=ϗLY65ЁYT`#)I#) l 42*jR*EH7`#*nyA2#5{gu@#*}S#)ƀ"ͱ|S#)}~:#*?AՐ0Y$;EE!CۇPNf6Ne-+H4t@m˳ۢnw4q(!Κ̱O`֟^UU{6F46 e#*a AJDcHBEF>%#* F#*T*F%!A`ߟآhO`` VQEUAO?0U!2'ta U.#5)f$tLC&X##*%g}WیiLBav*8t 2ypڻaskwk>q{Kg6JlJ8UeVXd9_ hJD싄I#)= f)K*+&Fi*1>dT0#5C#)}ƨ#UPBibw^?0ꍏEEm`q>DY!PJr9v፽0urܩAy-Ac׳ΉSBɦ*I&%Cytiv{=s<j6I4NJ]R()CV=7aocm9V# 7Dž`e& }-'P4]2BETe4wrp!ķԊ#*PVI76<=.#*+43@5a;Vu1"BPc|'ow@S<(ݘޓ#*@׋o@ŕ#*9^#*Q 8) ड़[#5F~ Հ#*&0t71kmF0Va7M~M6.tb3BZĚ!9<dP^$.5`XBP|օ_t )A`z$>J *H#*Y SEQA-m*C!hFˍa~lj\`#*ZQSbqbS#*pH>Yw)uq;ilm0z#*WQZgwDc%',]ʚF\J#* ?/Ѹc6>G9H@aDy a 0\JQP1xv,\Avn(KRPJ'H2YmY5m[Z6FcskjMhf^-xb ;0)jt<~ͳش#*Ȍ#A#bL6-$nۅ@o ܳ ;PjÍ.&ݶКw=RPp\!e6 $4Vkd+T4XޞCI>!Ǒ~Mu80t^0zt@ {*R^‡sc #qyj>?:5S 5HKK˻Jwd#hk)]*feIV*I]EL#5QiW}>y<;o>={x2ۭ٠y.n zDĚ`5+# ,XbAFj#*MlfS$hSYbJdl뷗nlK;kn;KyDJܷ+.XȬc "م,҃IyqE:錓h##*-5P`h@h&mxh[Զ#LL605󪵍L*bknEe|ivq>V%<5fуδi#*exmoouATR'2$}&w#)pn fR#*0.a0}&Newbˋ}畅1sa]o1Ȫ6EP, or3ʱ;qyuoxknKjMkv,U/&nmݺd9xESLYHjjwuXJMzZM&vm*7k+m70!hIB#*/ɋl-Q(S"K:E$V#*!&T!;[W&KeU6m[30#)^ I('*^ּ&leZ.T1R|-20XR kQfmHuRE,S,Qj6ƣS,Tlj+F,QZfQ2H#jfM%-B#)CyaSp|um=`[QXJ!$Y,'c淫sX{8ӛW̿ͅjڭI-[Ycjߜm4*o_Nu 4mQfշ#5Ie4wQgwg][ۘX[s\uu55]k51UvZhtK#5p#aQS* (VB\ @HfY]l[I$DQ&Ld(B],o;%JEƒy]sj#7 EûYd5[0_ Y>8I>Cׯw-^bY'#5Q3WZ$2I6fU4iYcs14&$SX3ji8$ pMe8xJG7羣IZ6v.>*^#5uX rOȮl{hSL͇0s"\Ӳ[PցxMðhtKEH *Ӹ #*1.gE'iBȽ! KV a9@Ml6[=?o<1RELYI5c9>&(\phr""ȡ#R[|htLi5zP ` be[" "MH 䮴et!])T ";7#5tL_ #)P"H0ۋmʫJ2 %.ST 5U2 \O $\[($ɵsJMl]Dm.ksYz]ZKR٥Kh*7kJL\!,mմm)A Vj­a#5#)`P"#)Up!-% Ld0IB7?D)`ްF.CA{C^0!81D`zʁ9?ϝ((h{:!Oa`s8#*V32ghكyoowIsc0KQLr3*"#1(oj[mmwy}Ȅ ?9KCtP7dmzIN18wۓOST~#ޓ EUTu%#*-uU.U RBEV@4=!#*S1=ڽNWu\vgh Ldbl2H$ v9d6h`$f́*I#5l'YJ,QLq4KrW67q˯'ИP(| m|ܻc5vZ]K-0^}o13P?$oOrÉȄ#)wU{B(XHJ#(RC8 &jnޚ4zoKkz܌`iH3Xc %d@# dmd'fAe>b)ˆrT!V)D>G$֦oP#*S(@ -TjղͥmQYHGA#*؟Qt\(#)#gcH#) bIB@:CV7QII32 ?ШHDI"C#)13s8⌌) r3`>GjB`У}ngC_@~DƌbBK #)-Bj;LiliZa+y!>QՁAuui$]Vd΃nǵH큓#)eX. #*IK$0R%Z)&*,„"mCP1#5-JQ  rFAմRBD#5@ѶlZ#)ekDWR1VeCfc¡V#*cڪF%s{mk %"3*Hߣbn0cX(*N$^쪰r-1 1#*:  ]62h̓8tZH-ԋ:a%]V  Z[zknn\Lgs462WR~p9RB5u7_uȱLH#5a0v!d"j7KXӹ=Gw?#*Ij'xT:#)<$TR#) DU؀PJZս5E2ӶB,5CάHVf*^3xd!!'Q,_|WD-(sd)%#bŁjOϥ#53|d5(i=]T¦!Ls&w40n=;dW[7=zFQ6Ȱq9<;8F^8"IWyUmVݦszLUS {~*yq1lbFӷ ZŐ}|9'Y>7#*tlqA0t#5ӹ,rv^$wWzښ)6ʝhZ7wM&Uiw>ݐȱ>翃:[M܃RB% 2Nh*/l j117iٰ y/v3|S|G%xa-5dі܏NP4qL\}v y0# KE|pDrt#*FٙJF\Xz#*6 ZÉZĸd'1?*]kU߹Թ yM$ZT) [Wň ȇ#5X]G#j*YAU{|hi{IBkAT3*9gwg^T8=ErdNKG2h^t6 y_B4>AѺW.z. ZExc`4zS#)*%R(=7E;FPMӛFku?S~JOz~u8V2I5j_޷U\xǦֹ*K#$0) .Ֆե\{Y_z}S*kZJ,9[C(@xR0yuǬj4Q`&Ub@Ȁq+]dez'3|m `BHl^APvL! _effZTe,9"i<^-$Ѧ&P!PcݘWE*g?^ׁ,ӯ)z0!2NJ#)]@4^f 9~\W}YFD I$|#)O"Џb_zߞmhQFZLJ<#5QLFdo4퀒(o=;v3l$#)ܨ:qGp7j#5c-@@Y`YjLѐoCPhHC;hTUI\Һsq=vsC<+{,[(ӨepŵAKn'Ցzkݵkԫ5u*3-:4Q$:  (Zo)D܄W8O?̬~˜zAF؊T-J}LTiRDw1@,&Cii Syr"_\Tՙ:p#5T FSYJ'RsCy_&Dـ1S}ydFm0$lR8B|#*_x0$#*8v1J0gfr-^&%6|IŰf#)dJ"8@GOϭ T+%}|K .Xcq#1ܚnqF u=Ҏ&?FH}T_RlIj> X 0M; T!&T4!>:eֵ$PʥlYtg#*KuQ|Q"K!Q2ZJ,@,?zT5ͦK1 #5@.|l;kx+#)a'Oi󌌵2V,@kͶ625wfwpbiJ&)1rDidhRl61 .9,I DD=ۮ~]c,rlig'6@(F,5lK&HL~~pgNZqL8 5;"d m%>ygtg}@ 8^$ȅFXF_v&{\&@ `Z#5|g4)p#*f 6-ƦDFFS&y>u@lLЈft!w97Kʿ7hA~Miaev.?c:R`ۊ]mh7r2eRv>dU|҈^#5g.uW2jm$2oHA#*b @wn)\ݮsuv*QI)ctFˈa%C!oB$Bƒ&2pęS$Jē!Ljn͹%\#*tu(R&< /d/Etݲ C8K1:j.xlj'Fc.HCJi/k4ˉٚ 00A#5(gFKފWa4H5!V$#t*<[h iyb[i4QG`#5L3EY,qARR46#5нyͧ0i#5 hlAZ?%6U!cB8,eЭM i\:{@)]vW{y{Őۦc ѩͲXLk7AZec&\@mx6]h*ҕUƫA@2AՌ#V])<}QtA]A+s3RM):F8u(uu=7jdtE FZ7l(DmwZ#*H7.kH+&">x&(Ю`1@Qk9ƌ hi8EJ"dBC[SR1F׊fa̱Ǻ `Ҙbɼ͹7+-y4l*#5asMVufH"Pd^Ux#*ں"#*#8<5Tz b|eۤ:%Abie#YR%C#*\dWkDS Sxjiin5Ti Te4RH5{=>o\RL #)v59ED0ڼ.]iqf@`pLIR0F\D#*rg(-$m2"imR pC]: -YJU#*K0)(SPD0(m,IQAdT01@`en#*EiM(R>ϓ!#5 xw#*9^`(utur;J|ozڍm RͤX0"A (=R8/ #) `Qc `%D$f=q?Jybm#O]mIUpM$" B !1HFb %k"CQgzX#eHV p0*dgH^j+CL'*((@xvwNn](syMj_^$B,e5/#5E-!PQLXZb@|Y!E,9:udӅ\ 3][@fX"736JgaKd= m.8ȤboGe^Uƽw*섋:#*:e6dIY:UD5&&PHP+:mlICis}x#)J7@P')2T; / 5Ey7 \+.'M~φg_+ءL&ʚM]>)zW=ݽ)t ve@~Oق.='^enآMU#*=?#{,yC3Ks rQ?GÔQ>'0l=#5rAT$ !^?RtS,>u71Q8^NX^讐:#*(*h_X;l튥ES{ZlkXc#)}U8j_[D#*GC60 =|{ #*$b[ ^qwDtZ2i5n#) 0fR) 2BXOycWP'mLYMkwWw+۫rKHl-B"H,2݉n]ݭ~kpTmktMIVwXܭnmn;TU&[ƹ^*󺱠d[KuE̵ 7~(!У2lLc zzP`"΁I"($ ői􊭜iCÀA <S>"wTu{l!!TTD+œ(Bm|ӺL)ï EhJXD <~`B0~T%X=S1 YC)`IpGh=;<:04o&+KR/ZجY$!q)l@{} c:7s`YSM_#*,Ym5HzYѭٶ/&݊<*VS6T=!Gw;g~w3+j@T&JT(rn7F7Z[;mwvZ8KַN'4&G8`-FabcMfc88P"9@*5yex3mhkSGG˛kUK"}\``1gO^;꩹YRͽMF:5AGsW0WS*m-&i,DMa3BN6]52kg?WomZ~ '$Iև٭-X !OP¢p,6)R'a?4.NNmjYW6 HQ#)UI葿RtaCf+)k^ WIAO4Af+9uyU(TTTR("7#*Y kT-$VU2MB.qPcpTsu'E$/a0`ٌf"ܞq\XƗRY~4tV~ggsmm9!y_M\l2a$3A8ZJp?˷`07]i2-5U}F!e-8Ll#5`kSL1=7Va(9ZcXjN%eC'(ݼa)ˎ'񳚭߾3zYmS)]Nʹskg!q/$r9Z|KW51Cƃ#*#5C: 9әG.so#5PAe/bQ7T5/پs똯V>qW=1'Rf]\%#53d|8]X@'ぃ{(]17#nFk".RcޑbPwSRCuBY\k%5C4'ϑy^zP L$10A:L”oj(D+sJ"xJ6j7otbèlZٞ\q#u Ńulc8m#*HXBb^#,t#)(B`@U1D:oLSwAs{8Ao0n@"l\ 17q:J5G049"BXKnݚceBs& ks$^G몼l@BҒp`@rrjL3vFlT2S+Fqc^1Zˆ nPy~FS9UJ"0{Tsˤh8gƺW2:2sxPk1k'~yeGӂgzЊSiDD,nu6\;-mMIsWV~I18 سD b:'t[OT3}UR氁hfH_kb7Y>8eBua;u;C%55#*HZc\/3Ju|Ҏ ;,J5"ukd\bNBƟ&C(9hKώݹvL5qN8u~}PbqװbO i]wաUtR{qGSG#5:W#{tno=nx7 Iѷ]/ngZ}a1J|ͱʨnjG{vn!/9yN#VgXt%p݉0e*FT"Cm#5XBiF#)3idATCIнlBZnTH*NI'ar;*X*lYQn|݌G?%r9m;kI&Q([ @#$CSZt_nvG;0ln>$-jֱY̶<,GHAn#*#5Ivq-h\Xc8b.z!'[/e5;0tT0x=hy|/'l#*|m#5jh|w^#5z@(ljjX$Vz$xTʿS#a_XEW}E$F%%y]涋MhRj\UBAXI)[F5B l4L*xcm^Lm\X]vhA*i #I#)c-X[rڍтL *gfR,tb+q0j,(ʒQQL*(TF>G#JU(P#*C<.]!xi:IF3|!~]#*zWr.Mk_V6m #)cQCL-oZskJ[-N*1K+ud2|Kp v87Z1tlŢEv`dCՁ9֜hĕf#sJY&peTd$0"apH<2"4#5q.k%,"E#5G0m6C#5&IXԑK wQXؚi+r50b#5GI!VKi⤥E ,!$YUt1LEqcn5)Vs7v94 #*ZǶֵd5p1c6jǓ\歕b[b8Ȅq. f#5XX^ M#5 9w9uѤ Ҍch޵m#* ("$1Pdc1ye63xd&l"""%C/s.cuadJ$ S.3#*7`6nN+\)v #t壞=t|p2cD4< 2*HLp#6Q 9t3Ldq"7*#5*(aIY3 #(^&bd6r@ehȩQFL`sUEajnkm£O5@Lb9--CFF\j@Dm4GSU:dIxTo3$MT$i%EpMF6Nr#*VFpf˄!K%e6BaL9+a0͵DLܸwkctxiR#5#NHQp(!h][GW( (Xģ܋F:jS=mǫ5%-4<`b=6alS!vH#*0Ռ鶖\ƙdT-h=PDMP1#BuXDHZt4Bi #5`@8xqF\X5t g^ 8G)#54%T;W,jel|WaJU \l`nx6#5g̅,U$b4CԡXaHtJZJRA=koᢡ)B0KA;eNSX͍jHb1ݟq(0UUQR=M5?;Օ.1pȫ ?Y!ޛ#!"Hnpb.Ϸ͸^ސX ~/Z| S޹;Nnt#*n8~vbm%#*Wcہ#CR ܘD_ݻ6n ^K-꧑y8T:C:=ԗ~hEa5ݼ<YH#.E;Boa8BY$Pty^ǃSRJx1]ʄA땢2Z"Ma$VmmkJJFɨ5m˨j0#)B#)#*R>԰EY#)ߘ`&IFB &G[3`-^#*$0[٤aeѪƈ}N/PΘ1dLE"d1H1!VQhu9ZbĚZn#*m#*Nƽ-e9LBiLIia)%75aGt\b "()*!2|(5O"s!2%*<.#sXHPZdFRBFwԆqр.!umbHdXzнlr&)Lc@`#*@lҒ6d`@UhaA&C@pBh_*UcF ߚe`)JuKOJDP_saBt>np'%D#*u@phc>ookq*7-wFǣЁ\.klK2Gq$̩*L4j:,ZJC#)|>StŊgE/ ULJxc%~>Xʢz*K6׭jB!OY#*qLu sk-I{h=DM>هbʍ5(][S[25UQ(0qhj#5!~KsG0KB/{D_!؛C֜ӘOI(遌{  /ױ\9;zq[JQ2jWň؊͏aME8s@O3m~ws^xPQDGi4aE>Q eC~bm[$J;~oHk#5CRGㄦ}i ~\8i'\S?6k׎a#5,#G:ݕ 8CuCcᏺYDp+ ~'9>""z}2>uf%UaIzE]%ǞvR@"yzd,٬#i:Rm#5"ϋ6)K$5$o^x53pTl0 x(`P 6fF jiUhj *4 PmnE٩ #)5)oce2XtvQp\ &pRgXA( +#3=it\1;GFYR%Ǟ#*Z#)u)SJ-H' !`,ە@.!ECrHCbyZdPT$!XRhA]\G׍-h6g %RAc`ݑZQ#5" "`n(H0cCJwߦP@5lvX@zH[M6v2`ds?pK}\:}#* #5FpR) D`^.&S mcp-}oqU/0OjNF2Â^p_rIvE03)#58 #*8ːR dwA4#5IL!a+ +&Z.r]xhzJZV{JxߥBh0WQjBHrc#\+۱C呾ق8Ψ#*2Ⰲ,'ѱ^w|$0eLa\GSk9i:4oFQ 1*4 lѦYGKϛBC͖INKJQҒnL˖:]`lNit&!dlamAjO\h@"l:FKѫrbR#*)Sd˧Yu m O-e̢3LFwL.}e"9nD*HX8&wyk&Y#eCU#)-5)>*,\ym-kr]3&N黧̛OIӻRIԆF2[!eڹXUε{3t#5A7$d5TC[-mycD)[0;{W\st@EPQ1#m9#*#*tIM:K!J(9AӱMwHF-pCyy(qPHj- *P]w;MX#5H0ʯ#*NZŹ] }bL#5u .1-}Ih'wШ#*CLaDbu,y@wk˖SO1Pt7Rp%Q2g wCQ+E$4M)K`&e:7a΢:fO(˙pt賌2#*ϟ#*p숏!p߭9ӥ N9R ;k7MiXfd0}_.ZV17Ǒdm4#556o7, VJMjfCX|Uk}f!]pMQoKB) @(4S&zm-ht MoU#) wZ-% sJcg#*2+Us&`mPm4(4( Q4Zq`0剉7G4P5i'D^Ȟ#56^S[ot.\,8reמ8AF6b ~o{VvYLlm&kcl[UAEGF=5\k;tNuI4t󁛸2M`TR`qWk󜻵Ci2r1U"i5e1䐄nYm!Aن !b1՚B1e0ddPi[n\ѫ$m'ˢA,8OOgl~ad0<4p ;'h \1>Ofզƍ'50 s0fDCB#* jbthxk#N&MKEuqyBz^g- 5{fOƞ m'Tk0F:eVK1#5p 4.{غL"h` Н)OiQNv݁滒BTN#*T4_gkLY~]1^H`1ubb"OjQN8gMnhgZ쐞H2Q(db]i6ʭґ&ڛu&6Mhl#أ.4r"ZTD,TRD$#).\D(쀓2R4 '#)r#5yk\|#*V#*+*eѵ$>TD"p#)F*kv,NU4z/]tG%2FnOA:vRS7mcfJ(pQ!%  d$V)r֊#)b*TnTbQȭm3 0몓ʼ^,dTFH!$(~P#--HpLDW66Ħ>DzRX$d4"8>|:I&zPuj4Pe JM끘Y<,vp sQWE1! oݠtԒB}RϡQf82j7 d8 EAa_E0:35uQlQhol^5#5\n% D£[w#봼rm("P՛75ZmjwkJTBJ97H8L %OPܑA9"+1"*Jf5$fٌ[$#*jŬĶbF%kUrIAb(w;Mz X!vx(C}#)nu^bv[5;A$F@C&}D /|yu;uFOrp>qTĈ#)ώZBIÔK[]|;>{2ӆZ^xjmu9#*6 RjF0$Hq~a駋qAr"8Ք]b|DAqA4HfAD&-3o:9$B-+F/SE-FXZ.ud7 ,#5 -2[P*sux;QS(zF@ 0oţJPedY7bZ#*ekC1jlB͏qC<Yu@B"#)WUQH}@ۘxOENɆ1a<Ȭb@IG>^BsDP;!R'q!(k4F߿(b #*(C)#)C)a= NjRlۣ OO ta5 #5[|#*a#57=yU.L#)#* D/N_V@/h Olx?J;4v#*}s@!#)pRY_A:%AEC#5QM#)@[zX:&#*I>}e^o ̎]E#*LS_ەsro=}^qp Fl7s]Œhxq m׋yui9"%#M$4U?bE6&6'_?u#aJI{Ϳ lNR(*#)I X!u>Or(g#hM#QRY#eTk{~j6:Y(QHaj4To(`6!#)1)OX>DV›A $@/7u͑MPhF6dbEDL]K@@dxn@/hC rEMM>#\I'!Pb6$؇꺏ٶ 1>0;D| pkqɜ\r#57#=6ŅHR,RsiOlOk@%d)22bȃY?GV˅@8K"76{v2>i PU)m6h(`!$jKjjM5&Զu{( kg^&h&Q`.ɓ:kHGl&FO.,Ȅ{@#*{!%I9d1y b $O3IŁ#*IǓy%ą^"hjT|Vvx6pi0ېaݷB#5#58QF;4ˈјUu[2"ĉU!iSU~ee$W@#go%v:>+.IE<@z  \Qc+$hZB1OB`k2;Tߑ80hKQꘛ ̹wgJ~dwƿaL]vuFޔTMN?`3vO??//?o_G߿Ϗ?gG;_5?oڨOأaCXRQ!J#*Lg#bՃO#)!Pw9sL Ui@?HTT"ɡ/s]ILVk5ة p:E-9au1A@?ۻfЅYhf$]WR R͌E$AI6ՏVp:4{D!#u/vɽMU98g['v;?FI"c,HF#yec.#)hAc&gN₍_7׆]D-idso!lmݍKb;l<0|OV"wmC'!) acϫY1x"& %)!ʧ}@?n mcJ &y]A~oO*vL#uPUuRc.$5''.jh&᳑:#*`a=Ȅdqc*`Đ!2#5.4U(#A~3-+&|)+7$1(@'-(Ps7j[åj7֒ni6֔q5iLjSlFSIFRT*s>ClMV"#5[$^@a.ԤE=&FU%{i%W_YMʪb1F?Hxuq[tM<4mkC}9jXe6ϐHFr");Z$َT#*aw#)@cggK?#5xoq%!#)Ö5lS1H|B|ps\7X-ĕk-}7mJS{m~S0$W̶ƼkI[c1mVƯey,VX+WUZ]nY[nаqp7"gLLSBʜ@kp.P#5ħ!q!4w JXQAʒpGztE 7-?wJ=:=HGG_>e#,OTSY_j:E!>4}?bG̾VZ~Ǭ@壣f_霿O@t"qHɫēGy(P,P?B-6tӧ&EKa;nl+ jý_w.>ɷ|8(S 'dp'||h,asa (#5!<%na d.PkϿ#eC9kKӅg8Oh]N*pMp9SCttYXnrbKks s׆`Zd.H$Y@zm= h{hްVOUJi\9jb/}!_ ???ܑN$6{ -#<== -#-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCgAdFiEEjH6y+TsMRfVzL+XRG6xXHc13IpUFAmepH3MACgkQG6xXHc13\nIpXdLRAAxgYy2M+/QAP1SaUMv5LfzYHJ2r9+x1rL046SsAiIaOCoaihVAj3POmy1\nZZd6jCUxL0TYU8qA12li7fudKmPJIhGJSIJVtTHsCsAn8MbCXiJuvqDSh2OflYn5\nAU8dF4FElwsIQ25QX4wwJvNwf/bCae+ppicqbOidczwvgBYH8VdwAulcfro3pNQ0\nQku+tHOFik8vcHLZRwVZ0g2Wak9l5SUUWCxNLkaaOhXiinR4dQFWsbEV2vJOZHtR\n+/QC3+BWPB3Wx14uHFrcD7obMhrT6Snsf/B9jHsaZEvaRNn6iBtKeOBzlyVnMS/H\nr6xMq30BY/NsaivZZH8wj/d+HLFqzlTR5zpncHbFYBOpwt7V2rRc+6wcJ85FB4Hm\nijIzp/7kYTP74tbBZmmz6nzM36gV0BC13FsLvH/9pd4avwVyR2+KxFi4zeFncIxC\nt3hbXnsEUTl+JIhuCywYFYGb8v0J0Y1ATUouLGZryVdN7kf7UBuIi/cUsZ1olxAT\nFMHoEKgIp2MNFKQi71Hvl9eLFWj6VKsFNCMi5LZPcAx4dcDNhL83VY0pljunjqzx\ncsQW5oYn2kruOa4H1dZ3679mb+0DK0LLuAKnRbqx+zQnIhKPt01VcIgQ9+I4/V+B\nEFuzIhnX3usDHVgv8ZPtld1lHB1OFRfijqUb/i7Y4xynKAOY+x4=\n=aTfe\n-----END PGP SIGNATURE-----\n diff --git a/wscript b/wscript deleted file mode 100644 index 4363a6d..0000000 --- a/wscript +++ /dev/null @@ -1,35 +0,0 @@ -#! /usr/bin/env python -# encoding: utf-8 - -# the following two variables are used by the target "waf dist" -VERSION='0.0.1' -APPNAME='ampswitch' - -# these variables are mandatory ('/' are converted automatically) -top = '.' -out = 'build' - -def options(opt): - opt.load('compiler_cxx') - -def configure(conf): - conf.load('compiler_cxx') - - conf.check(header_name='jack/jack.h') - conf.check(header_name='boost/asio.hpp') - conf.check(header_name='nlohmann/json.hpp') - - conf.check(lib='jack', uselib_store='jack', mandatory=True) - conf.check(lib='pthread', uselib_store='pthread', mandatory=False) - - conf.write_config_header('config.h') - -def build(bld): - bld.program(source='src/main.cpp\ - src/ampswitch.cpp\ - src/kodiclient.cpp', - use=['jack', 'pthread'], - includes='./src', - cxxflags='-Wall -g', - target='ampswitch') -