From dc619ca57a80c6d333c2e6b46e4d42ff592c1a92 Mon Sep 17 00:00:00 2001 From: Sonja Stefani Date: Mon, 22 May 2023 12:21:45 +0200 Subject: [PATCH 01/78] First BLE client structure and new BT client parent class --- src/explorepy/btcpp.py | 134 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 130 insertions(+), 4 deletions(-) diff --git a/src/explorepy/btcpp.py b/src/explorepy/btcpp.py index 9a0b25c7..f975ed83 100644 --- a/src/explorepy/btcpp.py +++ b/src/explorepy/btcpp.py @@ -1,8 +1,11 @@ # -*- coding: utf-8 -*- """A module for bluetooth connection""" +import abc import logging import time +from bleak import BleakClient, BleakScanner + from explorepy import ( exploresdk, settings_manager @@ -16,7 +19,66 @@ logger = logging.getLogger(__name__) -class SDKBtClient: +class BTClient(abc.ABC): + @abc.abstractmethod + def __init__(self, device_name=None, mac_address=None): + if (mac_address is None) and (device_name is None): + raise InputError("Either name or address options must be provided!") + self.is_connected = False + self.mac_address = mac_address + self.device_name = device_name + self.bt_serial_port_manager = None + self.device_manager = None + + @abc.abstractmethod + def connect(self): + """Connect to the device and return the socket + + Returns: + socket (bluetooth.socket) + """ + + @abc.abstractmethod + def reconnect(self): + """Reconnect to the last used bluetooth socket. + + This function reconnects to the last bluetooth socket. If after 1 minute the connection doesn't succeed, + program will end. + """ + + @abc.abstractmethod + def disconnect(self): + """Disconnect from the device""" + + @abc.abstractmethod + def _find_mac_address(self): + pass + + @abc.abstractmethod + def read(self, n_bytes): + """Read n_bytes from the socket + + Args: + n_bytes (int): number of bytes to be read + + Returns: + list of bytes + """ + + @abc.abstractmethod + def send(self, data): + """Send data to the device + + Args: + data (bytearray): Data to be sent + """ + + @staticmethod + def _check_mac_address(device_name, mac_address): + return (device_name[-4:-2] == mac_address[-5:-3]) and (device_name[-2:] == mac_address[-2:]) + + +class SDKBtClient(BTClient): """ Responsible for Connecting and reconnecting explore devices via bluetooth""" def __init__(self, device_name=None, mac_address=None): """Initialize Bluetooth connection @@ -170,6 +232,70 @@ def send(self, data): """ self.bt_serial_port_manager.Write(data) - @staticmethod - def _check_mac_address(device_name, mac_address): - return (device_name[-4:-2] == mac_address[-5:-3]) and (device_name[-2:] == mac_address[-2:]) + +class BLEClient(BTClient): + """ Responsible for Connecting and reconnecting explore devices via bluetooth""" + def __init__(self, device_name=None, mac_address=None): + """Initialize Bluetooth connection + + Args: + device_name(str): Name of the device (either device_name or device address should be given) + mac_address(str): Devices MAC address + """ + super.__init__(device_name=device_name, mac_address=mac_address) + + async def connect(self): + """Connect to the device and return the socket + + Returns: + socket (bluetooth.socket) + """ + ble_device = await self._discover_device() + async with BleakClient(ble_device) as client: + pass + + async def _discover_device(self): + if self.mac_address: + ble_device = await BleakScanner.find_device_by_address(self.mac_address) + else: + ble_device = await BleakScanner.find_device_by_name(self.device_name) + + if not ble_device: + raise DeviceNotFoundError( + "Could not discover the device! Please make sure the device is on and in advertising mode." + ) + return ble_device + + def reconnect(self): + """Reconnect to the last used bluetooth socket. + + This function reconnects to the last bluetooth socket. If after 1 minute the connection doesn't succeed, + program will end. + """ + raise NotImplementedError + + def disconnect(self): + """Disconnect from the device""" + raise NotImplementedError + + async def _find_mac_address(self): + raise NotImplementedError + + def read(self, n_bytes): + """Read n_bytes from the socket + + Args: + n_bytes (int): number of bytes to be read + + Returns: + list of bytes + """ + raise NotImplementedError + + def send(self, data): + """Send data to the device + + Args: + data (bytearray): Data to be sent + """ + raise NotImplementedError From 48d40e48426436871f8768eff5c18b686093dd82 Mon Sep 17 00:00:00 2001 From: Sonja Stefani Date: Mon, 22 May 2023 14:47:35 +0200 Subject: [PATCH 02/78] Added connect, read, disconnect, send to BLE client --- src/explorepy/btcpp.py | 50 +++++++++++++++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/src/explorepy/btcpp.py b/src/explorepy/btcpp.py index f975ed83..bc66f098 100644 --- a/src/explorepy/btcpp.py +++ b/src/explorepy/btcpp.py @@ -3,8 +3,10 @@ import abc import logging import time +from queue import Queue from bleak import BleakClient, BleakScanner +import asyncio from explorepy import ( exploresdk, @@ -243,16 +245,40 @@ def __init__(self, device_name=None, mac_address=None): mac_address(str): Devices MAC address """ super.__init__(device_name=device_name, mac_address=mac_address) + self.buffer = Queue() + self.packet_characteristic = '' + self.try_disconnect = False + self.try_send = None - async def connect(self): + async def stream(self): + ble_device = await self._discover_device() + + async with BleakClient(ble_device) as client: + self.is_connected = True + + async def handle_packet(sender, data): + # write packet to buffer + for b in data: + self.buffer.put(b) + + await client.start_notify(self.packet_characteristic, handle_packet) + + while client.is_connected and not self.try_disconnect: + if self.try_send: + await client.write_gatt_char(self.try_disconnect['char'], self.try_disconnect['data']) + self.try_send = None + time.sleep(0.1) + + self.try_disconnect = False + self.is_connected = False + + def connect(self): """Connect to the device and return the socket Returns: socket (bluetooth.socket) """ - ble_device = await self._discover_device() - async with BleakClient(ble_device) as client: - pass + asyncio.run(self.stream()) async def _discover_device(self): if self.mac_address: @@ -272,13 +298,13 @@ def reconnect(self): This function reconnects to the last bluetooth socket. If after 1 minute the connection doesn't succeed, program will end. """ - raise NotImplementedError + self.connect() def disconnect(self): """Disconnect from the device""" - raise NotImplementedError + self.try_disconnect = True - async def _find_mac_address(self): + def _find_mac_address(self): raise NotImplementedError def read(self, n_bytes): @@ -290,7 +316,11 @@ def read(self, n_bytes): Returns: list of bytes """ - raise NotImplementedError + ret = b'' + for _ in range(n_bytes): + ret += bytes(self.buffer.get()) + + return ret def send(self, data): """Send data to the device @@ -298,4 +328,8 @@ def send(self, data): Args: data (bytearray): Data to be sent """ + self.try_send = { + 'char': '', + 'data': data + } raise NotImplementedError From 7524c3d8967b571124713311aaf8efa0b94a7600 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Fri, 25 Aug 2023 15:21:23 +0200 Subject: [PATCH 03/78] update flag only when last 10 sec is stable --- src/explorepy/stream_processor.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/explorepy/stream_processor.py b/src/explorepy/stream_processor.py index 1091e7b2..d9d5e56d 100644 --- a/src/explorepy/stream_processor.py +++ b/src/explorepy/stream_processor.py @@ -65,7 +65,8 @@ def __init__(self, debug=False): self._last_packet_rcv_time = 0 self.is_bt_streaming = True self.debug = debug - self.is_unstable = False + self.unstablility_flag = False + self.last_bt_unstable_time = 0 def subscribe(self, callback, topic): """Subscribe a function to a topic @@ -331,14 +332,25 @@ def send_timestamp(self): def update_bt_stability_status(self, current_timestamp): if 'board_id' in self.device_info.keys(): + if self._last_packet_timestamp == 0: + return # device is an explore plus device, check sample timestamps timestamp_diff = current_timestamp - self._last_packet_timestamp + # allowed time interval is two samples allowed_time_interval = np.round(2 * (1 / self.device_info['sampling_rate']), 3) - self.is_unstable = timestamp_diff >= allowed_time_interval + is_unstable = timestamp_diff >= allowed_time_interval else: # devices is an old device, check if last sample has an earlier timestamp - self.is_unstable = current_timestamp < self._last_packet_timestamp + is_unstable = current_timestamp < self._last_packet_timestamp + + current_time = get_local_time() + if is_unstable: + self.unstablility_flag = True + self.last_bt_unstable_time = current_time + else: + if current_time - self.last_bt_unstable_time > 10: + self.unstablility_flag = False def is_connection_unstable(self): - return self.is_unstable + return self.unstablility_flag From 2ecc83cff3a1c1f29982227f5d5ddbb86def40ce Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Mon, 28 Aug 2023 10:34:03 +0200 Subject: [PATCH 04/78] update changelog --- CHANGELOG.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 66e5b095..1a5149ad 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -2,6 +2,13 @@ Changelog ========= +1.8.2 (28.8.2023) +------------------ +* Improve explore mock device +* Add yaml file for RTD build + + + 1.8.1 (11.7.2023) ------------------ * Bugfix record data From 3bdc48dfeb8252c035c6732e6a6481f8f235381d Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Mon, 28 Aug 2023 10:40:18 +0200 Subject: [PATCH 05/78] fix typo --- src/explorepy/stream_processor.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/explorepy/stream_processor.py b/src/explorepy/stream_processor.py index d9d5e56d..b090f44b 100644 --- a/src/explorepy/stream_processor.py +++ b/src/explorepy/stream_processor.py @@ -65,7 +65,7 @@ def __init__(self, debug=False): self._last_packet_rcv_time = 0 self.is_bt_streaming = True self.debug = debug - self.unstablility_flag = False + self.instability_flag = False self.last_bt_unstable_time = 0 def subscribe(self, callback, topic): @@ -346,11 +346,11 @@ def update_bt_stability_status(self, current_timestamp): current_time = get_local_time() if is_unstable: - self.unstablility_flag = True + self.instability_flag = True self.last_bt_unstable_time = current_time else: if current_time - self.last_bt_unstable_time > 10: - self.unstablility_flag = False + self.instability_flag = False def is_connection_unstable(self): - return self.unstablility_flag + return self.instability_flag From 02420b997cb0e79e19330373f1e70f5ae8b5b61f Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Thu, 12 Oct 2023 15:28:41 +0200 Subject: [PATCH 06/78] Bugfix rtd build (#286) * add sphinx-rtd in req file * add sphinx requirements * update sphinx version * update theme --- .readthedocs.yaml | 18 ++++++------------ docs/conf.py | 6 +++--- docs/requirements.txt | 2 ++ 3 files changed, 11 insertions(+), 15 deletions(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 09162a5f..5fae229e 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -11,12 +11,9 @@ version: 2 # Set the OS, Python version and other tools you might need build: - - os: ubuntu-22.04 - - tools: - - python: "3.11" + os: ubuntu-22.04 + tools: + python: "3.11" # You can also specify other tool versions: @@ -30,8 +27,7 @@ build: # Build documentation in the "docs/" directory with Sphinx sphinx: - - configuration: docs/conf.py + configuration: docs/conf.py # You can configure Sphinx to use a different builder, for instance use the dirhtml builder for simpler URLs @@ -58,7 +54,5 @@ sphinx: # See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html python: - - install: - - - requirements: docs/requirements.txt \ No newline at end of file + install: + - requirements: docs/requirements.txt diff --git a/docs/conf.py b/docs/conf.py index 1089100e..679fabbb 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -38,10 +38,10 @@ 'pr': ('https://github.com/Mentalab-hub/explorepy/pull/%s', 'PR #'), } # on_rtd is whether we are on readthedocs.org -on_rtd = os.environ.get('READTHEDOCS', None) == 'True' +#on_rtd = os.environ.get('READTHEDOCS', None) == 'True' -if not on_rtd: # only set the theme if we're building docs locally - html_theme = 'sphinx_rtd_theme' +#if not on_rtd: # only set the theme if we're building docs locally +html_theme = 'sphinx_rtd_theme' html_use_smartypants = True html_last_updated_fmt = '%b %d, %Y' diff --git a/docs/requirements.txt b/docs/requirements.txt index 848c76f9..e16ef5a0 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -12,3 +12,5 @@ PyYAML==6.0.1 scipy==1.11.1 sentry_sdk==1.19.1 tornado==6.3.2 +sphinx-rtd-theme==1.3.0 +sphinx==7.2.4 From 63f8ff2b32610f86f4b6b52693f909732cf9f694 Mon Sep 17 00:00:00 2001 From: salman Date: Wed, 18 Oct 2023 12:42:08 +0200 Subject: [PATCH 07/78] update marker labels in p300 analysis --- examples/p300_demo/analysis_csv_4_channel.py | 4 ++-- examples/p300_demo/analysis_csv_8_channel.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/p300_demo/analysis_csv_4_channel.py b/examples/p300_demo/analysis_csv_4_channel.py index 8845a21e..728032ea 100644 --- a/examples/p300_demo/analysis_csv_4_channel.py +++ b/examples/p300_demo/analysis_csv_4_channel.py @@ -67,8 +67,8 @@ def main(): lf = .5 hf = 40 - label_target = 11 - label_nontarget = 10 + label_target = 'sw_11' + label_nontarget = 'sw_10' t_min = -.3 t_max = 1. diff --git a/examples/p300_demo/analysis_csv_8_channel.py b/examples/p300_demo/analysis_csv_8_channel.py index ef5c5cf9..d98a4eb4 100644 --- a/examples/p300_demo/analysis_csv_8_channel.py +++ b/examples/p300_demo/analysis_csv_8_channel.py @@ -67,8 +67,8 @@ def main(): lf = .5 hf = 40 - label_target = 11 - label_nontarget = 10 + label_target = 'sw_11' + label_nontarget = 'sw_10' t_min = -.3 t_max = 1. From 49bb736e77b7a2f617ac8ce186f5b32e06f67774 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Wed, 18 Oct 2023 17:12:48 +0200 Subject: [PATCH 08/78] read binary file with BLE board info --- src/explorepy/packet.py | 7 +++++++ src/explorepy/settings_manager.py | 8 ++++++++ src/explorepy/tools.py | 10 ++++------ 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/explorepy/packet.py b/src/explorepy/packet.py index 8d44ffc6..103b2533 100644 --- a/src/explorepy/packet.py +++ b/src/explorepy/packet.py @@ -30,6 +30,7 @@ class PACKET_ID(IntEnum): EEG98 = 146 EEG32 = 148 EEG98_USBC = 150 + EEG98_BLE = 151 EEG99 = 62 EEG94R = 208 EEG98R = 210 @@ -202,6 +203,11 @@ class EEG98_USBC(EEG): def __init__(self, timestamp, payload, time_offset=0): super().__init__(timestamp, payload, time_offset, v_ref=2.4, n_packet=16) +class EEG98_BLE(EEG): + """EEG packet for 8 channel device""" + + def __init__(self, timestamp, payload, time_offset=0): + super().__init__(timestamp, payload, time_offset, v_ref=2.4, n_packet=1) class EEG99(EEG): """EEG packet for 8 channel device""" @@ -572,6 +578,7 @@ def _convert(self, bin_data): PACKET_ID.EEG94R: EEG94, PACKET_ID.EEG98R: EEG98, PACKET_ID.EEG98_USBC: EEG98_USBC, + PACKET_ID.EEG98_BLE: EEG98_BLE, PACKET_ID.EEG32: EEG32, PACKET_ID.CMDRCV: CommandRCV, PACKET_ID.CMDSTAT: CommandStatus, diff --git a/src/explorepy/settings_manager.py b/src/explorepy/settings_manager.py index dca13d5a..1b13fe27 100644 --- a/src/explorepy/settings_manager.py +++ b/src/explorepy/settings_manager.py @@ -111,6 +111,14 @@ def update_device_settings(self, device_info_dict_update): hardware_adc = self.settings_dict.get(self.hardware_channel_mask_key) self.settings_dict[self.software_channel_mask_key] = hardware_adc self.settings_dict[self.adc_mask_key] = self.settings_dict.get(self.software_channel_mask_key) + if "board_id" in device_info_dict_update: + if self.settings_dict["board_id"] == "PCB_303_801D_XXX": + self.settings_dict[self.channel_count_key] = 8 + self.settings_dict[self.hardware_channel_mask_key] = [1 for _ in range(8)] + if self.software_channel_mask_key not in self.settings_dict: + hardware_adc = self.settings_dict.get(self.hardware_channel_mask_key) + self.settings_dict[self.software_channel_mask_key] = hardware_adc + self.settings_dict[self.adc_mask_key] = self.settings_dict.get(self.software_channel_mask_key) if self.channel_count_key not in self.settings_dict: self.settings_dict[self.channel_count_key] = 8 if sum(self.settings_dict["adc_mask"]) > 4 else 4 diff --git a/src/explorepy/tools.py b/src/explorepy/tools.py index f190d603..c50d1ea1 100644 --- a/src/explorepy/tools.py +++ b/src/explorepy/tools.py @@ -511,12 +511,10 @@ def write_data(self, packet): """ time_vector, sig = packet.get_data(self._fs) - if len(time_vector) == 1: - data = np.array(time_vector + sig)[:, np.newaxis] - else: - if self._rec_time_offset is None: - self._rec_time_offset = time_vector[0] - data = np.concatenate((np.array(time_vector)[:, np.newaxis].T, np.array(sig)), axis=0) + + if self._rec_time_offset is None: + self._rec_time_offset = time_vector[0] + data = np.concatenate((np.array(time_vector)[:, np.newaxis].T, np.array(sig)), axis=0) data = np.round(data, 4) if self.file_type == 'edf': if isinstance(packet, EEG): From ab5af4b0040a6f0088732cf3341c0e0692fcf5fe Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Wed, 13 Dec 2023 11:41:31 +0100 Subject: [PATCH 09/78] Remove bokeh from explorepy (#288) * update script for arch64 * add bin2csv feature * update connection on sys exit * fix flake8 , prune redundant code * sort imports * update parser file imports * add pyserial to dependency * APIS-864: remove bokeh * Added pyyaml as requirement --------- Co-authored-by: ss rr Co-authored-by: Sonja Stefani --- lib/mac/create_shared_lib.sh | 17 +- lib/mac/exploresdk.py | 147 +- lib/mac/swig_interface_wrap.cxx | 1463 ++++++++++-------- setup.py | 14 +- src/explorepy/__init__.py | 10 +- src/explorepy/cli.py | 26 +- src/explorepy/dashboard/__init__.py | 0 src/explorepy/dashboard/dashboard.py | 761 --------- src/explorepy/dashboard/templates/index.html | 117 -- src/explorepy/dashboard/theme.yaml | 21 - src/explorepy/explore.py | 44 +- src/explorepy/exploresdk.py | 203 +-- src/explorepy/parser.py | 13 +- src/explorepy/serial_client.py | 142 ++ 14 files changed, 1163 insertions(+), 1815 deletions(-) mode change 100644 => 100755 lib/mac/create_shared_lib.sh delete mode 100644 src/explorepy/dashboard/__init__.py delete mode 100644 src/explorepy/dashboard/dashboard.py delete mode 100644 src/explorepy/dashboard/templates/index.html delete mode 100644 src/explorepy/dashboard/theme.yaml create mode 100644 src/explorepy/serial_client.py diff --git a/lib/mac/create_shared_lib.sh b/lib/mac/create_shared_lib.sh old mode 100644 new mode 100755 index 606269cd..bd96f7e1 --- a/lib/mac/create_shared_lib.sh +++ b/lib/mac/create_shared_lib.sh @@ -27,22 +27,23 @@ #ln -s -f /usr/local/bin/python3.7 /usr/local/bin/python #python can be found at: #/Library/Frameworks/Python.framework/Versions/3.7/ - +#For Sonoma OS: +#/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.9/Headers swig -python -c++ -py3 -extranative -threads -debug-classes swig_interface.i # for windows: use the -threads option #swig -python -c++ -py3 -extranative -debug-classes swig_interface.i -c++ -c -fpic swig_interface_wrap.cxx -I/usr/local/Cellar/python@3.7/3.7.11/Frameworks/Python.framework/Versions/3.7/include/python3.7m/ -ObjC++ -std=c++11 +c++ -c -fpic swig_interface_wrap.cxx -I/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.9/Headers -ObjC++ -std=c++11 -c++ -c -fpic BluetoothDeviceResources.mm -I/usr/local/Cellar/python@3.7/3.7.11/Frameworks/Python.framework/Versions/3.7/include/python3.7m/ -ObjC++ -std=c++11 +c++ -c -fpic BluetoothDeviceResources.mm -I/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.9/Headers -ObjC++ -std=c++11 -c++ -c -fpic BluetoothWorker.mm -I/usr/local/Cellar/python@3.7/3.7.11/Frameworks/Python.framework/Versions/3.7/include/python3.7m/ -ObjC++ -std=c++11 +c++ -c -fpic BluetoothWorker.mm -I/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.9/Headers -ObjC++ -std=c++11 -c++ -c -fpic BTSerialPortBinding.mm -I/usr/local/Cellar/python@3.7/3.7.11/Frameworks/Python.framework/Versions/3.7/include/python3.7m/ -ObjC++ -std=c++11 +c++ -c -fpic BTSerialPortBinding.mm -I/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.9/Headers -ObjC++ -std=c++11 -c++ -c -fpic -std=c++11 DeviceINQ.mm -I/usr/local/Cellar/python@3.7/3.7.11/Frameworks/Python.framework/Versions/3.7/include/python3.7m/ -ObjC++ -std=c++11 +c++ -c -fpic -std=c++11 DeviceINQ.mm -I/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.9/Headers -ObjC++ -std=c++11 -gcc -c -fpic pipe.c -I/usr/local/Cellar/python@3.7/3.7.11/Frameworks/Python.framework/Versions/3.7/include/python3.7m/ +gcc -c -fpic pipe.c -I/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.9/Headers -c++ -shared -flat_namespace -undefined suppress BTSerialPortBinding.o DeviceINQ.o BluetoothDeviceResources.o BluetoothWorker.o pipe.o swig_interface_wrap.o -std=c++11 -framework foundation -framework IOBluetooth -o _exploresdk.so +c++ -shared -flat_namespace -arch arm64 -undefined suppress BTSerialPortBinding.o DeviceINQ.o BluetoothDeviceResources.o BluetoothWorker.o pipe.o swig_interface_wrap.o -std=c++11 -framework foundation -framework IOBluetooth -o _exploresdk.so rm -rf *.o diff --git a/lib/mac/exploresdk.py b/lib/mac/exploresdk.py index 96d5aaf8..7d91b5e0 100644 --- a/lib/mac/exploresdk.py +++ b/lib/mac/exploresdk.py @@ -1,13 +1,10 @@ -# This file was automatically generated by SWIG (http://www.swig.org). -# Version 4.0.2 +# This file was automatically generated by SWIG (https://www.swig.org). +# Version 4.1.1 # -# Do not make changes to this file unless you know what you are doing--modify +# Do not make changes to this file unless you know what you are doing - modify # the SWIG interface file instead. from sys import version_info as _swig_python_version_info -if _swig_python_version_info < (2, 7, 0): - raise RuntimeError("Python 2.7 or later required") - # Import the low-level C/C++ module if __package__ or "." in __name__: from . import _exploresdk @@ -29,10 +26,10 @@ def _swig_repr(self): def _swig_setattr_nondynamic_instance_variable(set): def set_instance_attr(self, name, value): - if name == "thisown": - self.this.own(value) - elif name == "this": + if name == "this": set(self, name, value) + elif name == "thisown": + self.this.own(value) elif hasattr(self, name) and isinstance(getattr(type(self), name), property): set(self, name, value) else: @@ -61,7 +58,11 @@ class _SwigNonDynamicMeta(type): __setattr__ = _swig_setattr_nondynamic_class_variable(type.__setattr__) -import collections.abc +if _swig_python_version_info[0:2] >= (3, 3): + import collections.abc +else: + import collections + class SwigPyIterator(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -70,59 +71,58 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr __swig_destroy__ = _exploresdk.delete_SwigPyIterator - def value(self) -> "PyObject *": + def value(self): return _exploresdk.SwigPyIterator_value(self) - def incr(self, n: "size_t"=1) -> "swig::SwigPyIterator *": + def incr(self, n=1): return _exploresdk.SwigPyIterator_incr(self, n) - def decr(self, n: "size_t"=1) -> "swig::SwigPyIterator *": + def decr(self, n=1): return _exploresdk.SwigPyIterator_decr(self, n) - def distance(self, x: "SwigPyIterator") -> "ptrdiff_t": + def distance(self, x): return _exploresdk.SwigPyIterator_distance(self, x) - def equal(self, x: "SwigPyIterator") -> "bool": + def equal(self, x): return _exploresdk.SwigPyIterator_equal(self, x) - def copy(self) -> "swig::SwigPyIterator *": + def copy(self): return _exploresdk.SwigPyIterator_copy(self) - def next(self) -> "PyObject *": + def next(self): return _exploresdk.SwigPyIterator_next(self) - def __next__(self) -> "PyObject *": + def __next__(self): return _exploresdk.SwigPyIterator___next__(self) - def previous(self) -> "PyObject *": + def previous(self): return _exploresdk.SwigPyIterator_previous(self) - def advance(self, n: "ptrdiff_t") -> "swig::SwigPyIterator *": + def advance(self, n): return _exploresdk.SwigPyIterator_advance(self, n) - def __eq__(self, x: "SwigPyIterator") -> "bool": + def __eq__(self, x): return _exploresdk.SwigPyIterator___eq__(self, x) - def __ne__(self, x: "SwigPyIterator") -> "bool": + def __ne__(self, x): return _exploresdk.SwigPyIterator___ne__(self, x) - def __iadd__(self, n: "ptrdiff_t") -> "swig::SwigPyIterator &": + def __iadd__(self, n): return _exploresdk.SwigPyIterator___iadd__(self, n) - def __isub__(self, n: "ptrdiff_t") -> "swig::SwigPyIterator &": + def __isub__(self, n): return _exploresdk.SwigPyIterator___isub__(self, n) - def __add__(self, n: "ptrdiff_t") -> "swig::SwigPyIterator *": + def __add__(self, n): return _exploresdk.SwigPyIterator___add__(self, n) - def __sub__(self, *args) -> "ptrdiff_t": + def __sub__(self, *args): return _exploresdk.SwigPyIterator___sub__(self, *args) def __iter__(self): return self # Register SwigPyIterator in _exploresdk: _exploresdk.SwigPyIterator_swigregister(SwigPyIterator) - class BTSerialPortBinding(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -132,136 +132,131 @@ def __init__(self, *args, **kwargs): __swig_destroy__ = _exploresdk.delete_BTSerialPortBinding @staticmethod - def Create(address: "std::string", channelID: "int") -> "BTSerialPortBinding *": + def Create(address, channelID): return _exploresdk.BTSerialPortBinding_Create(address, channelID) - def Connect(self) -> "int": + def Connect(self): return _exploresdk.BTSerialPortBinding_Connect(self) - def Close(self) -> "void": + def Close(self): return _exploresdk.BTSerialPortBinding_Close(self) - def Read(self, bt_buffer: "char *") -> "void": + def Read(self, bt_buffer): return _exploresdk.BTSerialPortBinding_Read(self, bt_buffer) - def Write(self, write_buffer: "char const *") -> "void": + def Write(self, write_buffer): return _exploresdk.BTSerialPortBinding_Write(self, write_buffer) - def IsDataAvailable(self) -> "bool": + def IsDataAvailable(self): return _exploresdk.BTSerialPortBinding_IsDataAvailable(self) # Register BTSerialPortBinding in _exploresdk: _exploresdk.BTSerialPortBinding_swigregister(BTSerialPortBinding) - -def BTSerialPortBinding_Create(address: "std::string", channelID: "int") -> "BTSerialPortBinding *": - return _exploresdk.BTSerialPortBinding_Create(address, channelID) - -class vectordevice(collections.abc.MutableSequence): +class vectordevice(collections.abc.MutableSequence if _swig_python_version_info >= (3, 3) else collections.MutableSequence): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr - def iterator(self) -> "swig::SwigPyIterator *": + def iterator(self): return _exploresdk.vectordevice_iterator(self) def __iter__(self): return self.iterator() - def __nonzero__(self) -> "bool": + def __nonzero__(self): return _exploresdk.vectordevice___nonzero__(self) - def __bool__(self) -> "bool": + def __bool__(self): return _exploresdk.vectordevice___bool__(self) - def __len__(self) -> "std::vector< device >::size_type": + def __len__(self): return _exploresdk.vectordevice___len__(self) - def __getslice__(self, i: "std::vector< device >::difference_type", j: "std::vector< device >::difference_type") -> "std::vector< device,std::allocator< device > > *": + def __getslice__(self, i, j): return _exploresdk.vectordevice___getslice__(self, i, j) - def __setslice__(self, *args) -> "void": + def __setslice__(self, *args): return _exploresdk.vectordevice___setslice__(self, *args) - def __delslice__(self, i: "std::vector< device >::difference_type", j: "std::vector< device >::difference_type") -> "void": + def __delslice__(self, i, j): return _exploresdk.vectordevice___delslice__(self, i, j) - def __delitem__(self, *args) -> "void": + def __delitem__(self, *args): return _exploresdk.vectordevice___delitem__(self, *args) - def __getitem__(self, *args) -> "std::vector< device >::value_type const &": + def __getitem__(self, *args): return _exploresdk.vectordevice___getitem__(self, *args) - def __setitem__(self, *args) -> "void": + def __setitem__(self, *args): return _exploresdk.vectordevice___setitem__(self, *args) - def pop(self) -> "std::vector< device >::value_type": + def pop(self): return _exploresdk.vectordevice_pop(self) - def append(self, x: "device") -> "void": + def append(self, x): return _exploresdk.vectordevice_append(self, x) - def empty(self) -> "bool": + def empty(self): return _exploresdk.vectordevice_empty(self) - def size(self) -> "std::vector< device >::size_type": + def size(self): return _exploresdk.vectordevice_size(self) - def swap(self, v: "vectordevice") -> "void": + def swap(self, v): return _exploresdk.vectordevice_swap(self, v) - def begin(self) -> "std::vector< device >::iterator": + def begin(self): return _exploresdk.vectordevice_begin(self) - def end(self) -> "std::vector< device >::iterator": + def end(self): return _exploresdk.vectordevice_end(self) - def rbegin(self) -> "std::vector< device >::reverse_iterator": + def rbegin(self): return _exploresdk.vectordevice_rbegin(self) - def rend(self) -> "std::vector< device >::reverse_iterator": + def rend(self): return _exploresdk.vectordevice_rend(self) - def clear(self) -> "void": + def clear(self): return _exploresdk.vectordevice_clear(self) - def get_allocator(self) -> "std::vector< device >::allocator_type": + def get_allocator(self): return _exploresdk.vectordevice_get_allocator(self) - def pop_back(self) -> "void": + def pop_back(self): return _exploresdk.vectordevice_pop_back(self) - def erase(self, *args) -> "std::vector< device >::iterator": + def erase(self, *args): return _exploresdk.vectordevice_erase(self, *args) def __init__(self, *args): _exploresdk.vectordevice_swiginit(self, _exploresdk.new_vectordevice(*args)) - def push_back(self, x: "device") -> "void": + def push_back(self, x): return _exploresdk.vectordevice_push_back(self, x) - def front(self) -> "std::vector< device >::value_type const &": + def front(self): return _exploresdk.vectordevice_front(self) - def back(self) -> "std::vector< device >::value_type const &": + def back(self): return _exploresdk.vectordevice_back(self) - def assign(self, n: "std::vector< device >::size_type", x: "device") -> "void": + def assign(self, n, x): return _exploresdk.vectordevice_assign(self, n, x) - def resize(self, *args) -> "void": + def resize(self, *args): return _exploresdk.vectordevice_resize(self, *args) - def insert(self, *args) -> "void": + def insert(self, *args): return _exploresdk.vectordevice_insert(self, *args) - def reserve(self, n: "std::vector< device >::size_type") -> "void": + def reserve(self, n): return _exploresdk.vectordevice_reserve(self, n) - def capacity(self) -> "std::vector< device >::size_type": + def capacity(self): return _exploresdk.vectordevice_capacity(self) __swig_destroy__ = _exploresdk.delete_vectordevice # Register vectordevice in _exploresdk: _exploresdk.vectordevice_swigregister(vectordevice) - class device(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr @@ -279,7 +274,6 @@ def __init__(self): # Register device in _exploresdk: _exploresdk.device_swigregister(device) - class ExploreSDK(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -289,20 +283,15 @@ def __init__(self, *args, **kwargs): __swig_destroy__ = _exploresdk.delete_ExploreSDK @staticmethod - def Create() -> "ExploreSDK *": + def Create(): return _exploresdk.ExploreSDK_Create() - def PerformDeviceSearch(self, length: "int"=8) -> "std::vector< device,std::allocator< device > >": + def PerformDeviceSearch(self, length=8): return _exploresdk.ExploreSDK_PerformDeviceSearch(self, length) - def SdpSearch(self, address: "std::string") -> "int": + def SdpSearch(self, address): return _exploresdk.ExploreSDK_SdpSearch(self, address) # Register ExploreSDK in _exploresdk: _exploresdk.ExploreSDK_swigregister(ExploreSDK) -def ExploreSDK_Create() -> "ExploreSDK *": - return _exploresdk.ExploreSDK_Create() - - - diff --git a/lib/mac/swig_interface_wrap.cxx b/lib/mac/swig_interface_wrap.cxx index 695a4b86..88de37f4 100644 --- a/lib/mac/swig_interface_wrap.cxx +++ b/lib/mac/swig_interface_wrap.cxx @@ -1,46 +1,18 @@ /* ---------------------------------------------------------------------------- - * This file was automatically generated by SWIG (http://www.swig.org). - * Version 4.0.2 + * This file was automatically generated by SWIG (https://www.swig.org). + * Version 4.1.1 * - * This file is not intended to be easily readable and contains a number of - * coding conventions designed to improve portability and efficiency. Do not make - * changes to this file unless you know what you are doing--modify the SWIG - * interface file instead. + * Do not make changes to this file unless you know what you are doing - modify + * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ -#ifndef SWIGPYTHON +#define SWIG_VERSION 0x040101 #define SWIGPYTHON -#endif - #define SWIG_PYTHON_THREADS #define SWIG_PYTHON_DIRECTOR_NO_VTABLE #define SWIG_PYTHON_EXTRA_NATIVE_CONTAINERS - -#ifdef __cplusplus -/* SwigValueWrapper is described in swig.swg */ -template class SwigValueWrapper { - struct SwigMovePointer { - T *ptr; - SwigMovePointer(T *p) : ptr(p) { } - ~SwigMovePointer() { delete ptr; } - SwigMovePointer& operator=(SwigMovePointer& rhs) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = rhs.ptr; rhs.ptr = 0; return *this; } - } pointer; - SwigValueWrapper& operator=(const SwigValueWrapper& rhs); - SwigValueWrapper(const SwigValueWrapper& rhs); -public: - SwigValueWrapper() : pointer(0) { } - SwigValueWrapper& operator=(const T& t) { SwigMovePointer tmp(new T(t)); pointer = tmp; return *this; } - operator T&() const { return *pointer.ptr; } - T *operator&() { return pointer.ptr; } -}; - -template T SwigValueInit() { - return T(); -} -#endif - /* ----------------------------------------------------------------------------- * This section contains generic SWIG labels for method/variable * declarations/attributes, and other compiler dependent labels. @@ -171,8 +143,26 @@ template T SwigValueInit() { # include #endif +#if !defined(PY_SSIZE_T_CLEAN) && !defined(SWIG_NO_PY_SSIZE_T_CLEAN) +#define PY_SSIZE_T_CLEAN +#endif + +#if __GNUC__ >= 7 +#pragma GCC diagnostic push +#if defined(__cplusplus) && __cplusplus >=201703L +#pragma GCC diagnostic ignored "-Wregister" /* For python-2.7 headers that use register */ +#endif +#endif + #if defined(_DEBUG) && defined(SWIG_PYTHON_INTERPRETER_NO_DEBUG) /* Use debug wrappers with the Python release dll */ + +#if defined(_MSC_VER) && _MSC_VER >= 1929 +/* Workaround compilation errors when redefining _DEBUG in MSVC 2019 version 16.10 and later + * See https://github.com/swig/swig/issues/2090 */ +# include +#endif + # undef _DEBUG # include # define _DEBUG 1 @@ -180,6 +170,10 @@ template T SwigValueInit() { # include #endif +#if __GNUC__ >= 7 +#pragma GCC diagnostic pop +#endif + /* ----------------------------------------------------------------------------- * swigrun.swg * @@ -226,6 +220,8 @@ template T SwigValueInit() { #define SWIG_POINTER_DISOWN 0x1 #define SWIG_CAST_NEW_MEMORY 0x2 #define SWIG_POINTER_NO_NULL 0x4 +#define SWIG_POINTER_CLEAR 0x8 +#define SWIG_POINTER_RELEASE (SWIG_POINTER_CLEAR | SWIG_POINTER_DISOWN) /* Flags for new pointer objects */ #define SWIG_POINTER_OWN 0x1 @@ -297,7 +293,7 @@ template T SwigValueInit() { SWIG errors code. Finally, if the SWIG_CASTRANK_MODE is enabled, the result code - allows to return the 'cast rank', for example, if you have this + allows returning the 'cast rank', for example, if you have this int food(double) int fooi(int); @@ -311,7 +307,13 @@ template T SwigValueInit() { */ #define SWIG_OK (0) +/* Runtime errors are < 0 */ #define SWIG_ERROR (-1) +/* Errors in range -1 to -99 are in swigerrors.swg (errors for all languages including those not using the runtime) */ +/* Errors in range -100 to -199 are language specific errors defined in *errors.swg */ +/* Errors < -200 are generic runtime specific errors */ +#define SWIG_ERROR_RELEASE_NOT_OWNED (-200) + #define SWIG_IsOK(r) (r >= 0) #define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError) @@ -326,7 +328,7 @@ template T SwigValueInit() { #define SWIG_OLDOBJ (SWIG_OK) #define SWIG_NEWOBJ (SWIG_OK | SWIG_NEWOBJMASK) #define SWIG_TMPOBJ (SWIG_OK | SWIG_TMPOBJMASK) -/* Check, add and del mask methods */ +/* Check, add and del object mask methods */ #define SWIG_AddNewMask(r) (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r) #define SWIG_DelNewMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r) #define SWIG_IsNewObj(r) (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK)) @@ -472,7 +474,7 @@ SWIG_TypeCheck(const char *c, swig_type_info *ty) { Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison */ SWIGRUNTIME swig_cast_info * -SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *ty) { +SWIG_TypeCheckStruct(const swig_type_info *from, swig_type_info *ty) { if (ty) { swig_cast_info *iter = ty->cast; while (iter) { @@ -532,9 +534,9 @@ SWIG_TypeName(const swig_type_info *ty) { SWIGRUNTIME const char * SWIG_TypePrettyName(const swig_type_info *type) { /* The "str" field contains the equivalent pretty names of the - type, separated by vertical-bar characters. We choose - to print the last name, as it is often (?) the most - specific. */ + type, separated by vertical-bar characters. Choose the last + name. It should be the most specific; a fully resolved name + but not necessarily with default template parameters expanded. */ if (!type) return NULL; if (type->str != NULL) { const char *last_name = type->str; @@ -754,7 +756,7 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { } #endif -/* Errors in SWIG */ +/* SWIG Errors applicable to all language modules, values are reserved from -1 to -99 */ #define SWIG_UnknownError -1 #define SWIG_IOError -2 #define SWIG_RuntimeError -3 @@ -770,7 +772,6 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { #define SWIG_NullReferenceError -13 - /* Compatibility macros for Python 3 */ #if PY_VERSION_HEX >= 0x03000000 @@ -786,7 +787,6 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { #define PyString_Size(str) PyBytes_Size(str) #define PyString_InternFromString(key) PyUnicode_InternFromString(key) #define Py_TPFLAGS_HAVE_CLASS Py_TPFLAGS_BASETYPE -#define PyString_AS_STRING(x) PyUnicode_AS_STRING(x) #define _PyLong_FromSsize_t(x) PyLong_FromSsize_t(x) #endif @@ -804,38 +804,19 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { #endif -/* Warning: This function will allocate a new string in Python 3, - * so please call SWIG_Python_str_DelForPy3(x) to free the space. - */ SWIGINTERN char* SWIG_Python_str_AsChar(PyObject *str) { #if PY_VERSION_HEX >= 0x03030000 return (char *)PyUnicode_AsUTF8(str); -#elif PY_VERSION_HEX >= 0x03000000 - char *newstr = 0; - str = PyUnicode_AsUTF8String(str); - if (str) { - char *cstr; - Py_ssize_t len; - if (PyBytes_AsStringAndSize(str, &cstr, &len) != -1) { - newstr = (char *) malloc(len+1); - if (newstr) - memcpy(newstr, cstr, len+1); - } - Py_XDECREF(str); - } - return newstr; #else return PyString_AsString(str); #endif } -#if PY_VERSION_HEX >= 0x03030000 || PY_VERSION_HEX < 0x03000000 -# define SWIG_Python_str_DelForPy3(x) -#else -# define SWIG_Python_str_DelForPy3(x) free( (void*) (x) ) -#endif +/* Was useful for Python 3.0.x-3.2.x - now provided only for compatibility + * with any uses in user interface files. */ +#define SWIG_Python_str_DelForPy3(x) SWIGINTERN PyObject* @@ -852,10 +833,14 @@ SWIG_Python_str_FromChar(const char *c) # define PyObject_DEL PyObject_Del #endif -// SWIGPY_USE_CAPSULE is no longer used within SWIG itself, but some user -// interface files check for it. +/* SWIGPY_USE_CAPSULE is no longer used within SWIG itself, but some user interface files check for it. */ # define SWIGPY_USE_CAPSULE -# define SWIGPY_CAPSULE_NAME ("swig_runtime_data" SWIG_RUNTIME_VERSION ".type_pointer_capsule" SWIG_TYPE_TABLE_NAME) +#ifdef SWIGPYTHON_BUILTIN +# define SWIGPY_CAPSULE_ATTR_NAME "type_pointer_capsule_builtin" SWIG_TYPE_TABLE_NAME +#else +# define SWIGPY_CAPSULE_ATTR_NAME "type_pointer_capsule" SWIG_TYPE_TABLE_NAME +#endif +# define SWIGPY_CAPSULE_NAME ("swig_runtime_data" SWIG_RUNTIME_VERSION "." SWIGPY_CAPSULE_ATTR_NAME) #if PY_VERSION_HEX < 0x03020000 #define PyDescr_TYPE(x) (((PyDescrObject *)(x))->d_type) @@ -929,7 +914,6 @@ SWIG_Python_AddErrorMsg(const char* mesg) PyErr_Format(type, "%s %s", tmp, mesg); else PyErr_Format(type, "%s", mesg); - SWIG_Python_str_DelForPy3(tmp); Py_DECREF(old_str); Py_DECREF(value); } else { @@ -960,8 +944,12 @@ SWIG_Python_RaiseOrModifyTypeError(const char *message) #else newvalue = PyString_FromFormat("%s\nAdditional information:\n%s", PyString_AsString(value), message); #endif - Py_XDECREF(value); - PyErr_Restore(type, newvalue, traceback); + if (newvalue) { + Py_XDECREF(value); + PyErr_Restore(type, newvalue, traceback); + } else { + PyErr_Restore(type, value, traceback); + } } else { /* Raise TypeError using given message */ PyErr_SetString(PyExc_TypeError, message); @@ -978,8 +966,12 @@ SWIG_Python_RaiseOrModifyTypeError(const char *message) # define SWIG_PYTHON_USE_GIL # endif # if defined(SWIG_PYTHON_USE_GIL) /* Use PyGILState threads calls */ -# ifndef SWIG_PYTHON_INITIALIZE_THREADS -# define SWIG_PYTHON_INITIALIZE_THREADS PyEval_InitThreads() +# if !defined(SWIG_PYTHON_INITIALIZE_THREADS) +# if PY_VERSION_HEX < 0x03070000 +# define SWIG_PYTHON_INITIALIZE_THREADS PyEval_InitThreads() +# else +# define SWIG_PYTHON_INITIALIZE_THREADS +# endif # endif # ifdef __cplusplus /* C++ code */ class SWIG_Python_Thread_Block { @@ -1077,8 +1069,8 @@ typedef struct swig_const_info { # error "This version of SWIG only supports Python >= 2.7" #endif -#if PY_VERSION_HEX >= 0x03000000 && PY_VERSION_HEX < 0x03020000 -# error "This version of SWIG only supports Python 3 >= 3.2" +#if PY_VERSION_HEX >= 0x03000000 && PY_VERSION_HEX < 0x03030000 +# error "This version of SWIG only supports Python 3 >= 3.3" #endif /* Common SWIG API */ @@ -1193,7 +1185,12 @@ SWIG_Python_AppendOutput(PyObject* result, PyObject* obj) { if (!PyList_Check(result)) { PyObject *o2 = result; result = PyList_New(1); - PyList_SetItem(result, 0, o2); + if (result) { + PyList_SET_ITEM(result, 0, o2); + } else { + Py_DECREF(obj); + return o2; + } } PyList_Append(result,obj); Py_DECREF(obj); @@ -1275,6 +1272,238 @@ SWIG_Python_CheckNoKeywords(PyObject *kwargs, const char *name) { #define SWIG_STATIC_POINTER(var) var = 0; if (!var) var #endif +#ifdef __cplusplus +extern "C" { +#endif + +/* Python-specific SWIG API */ +#define SWIG_newvarlink() SWIG_Python_newvarlink() +#define SWIG_addvarlink(p, name, get_attr, set_attr) SWIG_Python_addvarlink(p, name, get_attr, set_attr) +#define SWIG_InstallConstants(d, constants) SWIG_Python_InstallConstants(d, constants) + +/* ----------------------------------------------------------------------------- + * global variable support code. + * ----------------------------------------------------------------------------- */ + +typedef struct swig_globalvar { + char *name; /* Name of global variable */ + PyObject *(*get_attr)(void); /* Return the current value */ + int (*set_attr)(PyObject *); /* Set the value */ + struct swig_globalvar *next; +} swig_globalvar; + +typedef struct swig_varlinkobject { + PyObject_HEAD + swig_globalvar *vars; +} swig_varlinkobject; + +SWIGINTERN PyObject * +swig_varlink_repr(PyObject *SWIGUNUSEDPARM(v)) { +#if PY_VERSION_HEX >= 0x03000000 + return PyUnicode_InternFromString(""); +#else + return PyString_FromString(""); +#endif +} + +SWIGINTERN PyObject * +swig_varlink_str(PyObject *o) { + swig_varlinkobject *v = (swig_varlinkobject *) o; +#if PY_VERSION_HEX >= 0x03000000 + PyObject *str = PyUnicode_InternFromString("("); + PyObject *tail; + PyObject *joined; + swig_globalvar *var; + for (var = v->vars; var; var=var->next) { + tail = PyUnicode_FromString(var->name); + joined = PyUnicode_Concat(str, tail); + Py_DecRef(str); + Py_DecRef(tail); + str = joined; + if (var->next) { + tail = PyUnicode_InternFromString(", "); + joined = PyUnicode_Concat(str, tail); + Py_DecRef(str); + Py_DecRef(tail); + str = joined; + } + } + tail = PyUnicode_InternFromString(")"); + joined = PyUnicode_Concat(str, tail); + Py_DecRef(str); + Py_DecRef(tail); + str = joined; +#else + PyObject *str = PyString_FromString("("); + swig_globalvar *var; + for (var = v->vars; var; var=var->next) { + PyString_ConcatAndDel(&str,PyString_FromString(var->name)); + if (var->next) PyString_ConcatAndDel(&str,PyString_FromString(", ")); + } + PyString_ConcatAndDel(&str,PyString_FromString(")")); +#endif + return str; +} + +SWIGINTERN void +swig_varlink_dealloc(PyObject *o) { + swig_varlinkobject *v = (swig_varlinkobject *) o; + swig_globalvar *var = v->vars; + while (var) { + swig_globalvar *n = var->next; + free(var->name); + free(var); + var = n; + } +} + +SWIGINTERN PyObject * +swig_varlink_getattr(PyObject *o, char *n) { + swig_varlinkobject *v = (swig_varlinkobject *) o; + PyObject *res = NULL; + swig_globalvar *var = v->vars; + while (var) { + if (strcmp(var->name,n) == 0) { + res = (*var->get_attr)(); + break; + } + var = var->next; + } + if (res == NULL && !PyErr_Occurred()) { + PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n); + } + return res; +} + +SWIGINTERN int +swig_varlink_setattr(PyObject *o, char *n, PyObject *p) { + swig_varlinkobject *v = (swig_varlinkobject *) o; + int res = 1; + swig_globalvar *var = v->vars; + while (var) { + if (strcmp(var->name,n) == 0) { + res = (*var->set_attr)(p); + break; + } + var = var->next; + } + if (res == 1 && !PyErr_Occurred()) { + PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n); + } + return res; +} + +SWIGINTERN PyTypeObject* +swig_varlink_type(void) { + static char varlink__doc__[] = "Swig var link object"; + static PyTypeObject varlink_type; + static int type_init = 0; + if (!type_init) { + const PyTypeObject tmp = { +#if PY_VERSION_HEX >= 0x03000000 + PyVarObject_HEAD_INIT(NULL, 0) +#else + PyObject_HEAD_INIT(NULL) + 0, /* ob_size */ +#endif + "swigvarlink", /* tp_name */ + sizeof(swig_varlinkobject), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor) swig_varlink_dealloc, /* tp_dealloc */ +#if PY_VERSION_HEX < 0x030800b4 + (printfunc)0, /*tp_print*/ +#else + (Py_ssize_t)0, /*tp_vectorcall_offset*/ +#endif + (getattrfunc) swig_varlink_getattr, /* tp_getattr */ + (setattrfunc) swig_varlink_setattr, /* tp_setattr */ + 0, /* tp_compare */ + (reprfunc) swig_varlink_repr, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + (reprfunc) swig_varlink_str, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + 0, /* tp_flags */ + varlink__doc__, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */ + 0, /* tp_del */ + 0, /* tp_version_tag */ +#if PY_VERSION_HEX >= 0x03040000 + 0, /* tp_finalize */ +#endif +#if PY_VERSION_HEX >= 0x03080000 + 0, /* tp_vectorcall */ +#endif +#if (PY_VERSION_HEX >= 0x03080000) && (PY_VERSION_HEX < 0x03090000) + 0, /* tp_print */ +#endif +#ifdef COUNT_ALLOCS + 0, /* tp_allocs */ + 0, /* tp_frees */ + 0, /* tp_maxalloc */ + 0, /* tp_prev */ + 0 /* tp_next */ +#endif + }; + varlink_type = tmp; + type_init = 1; + if (PyType_Ready(&varlink_type) < 0) + return NULL; + } + return &varlink_type; +} + +/* Create a variable linking object for use later */ +SWIGINTERN PyObject * +SWIG_Python_newvarlink(void) { + swig_varlinkobject *result = PyObject_NEW(swig_varlinkobject, swig_varlink_type()); + if (result) { + result->vars = 0; + } + return ((PyObject*) result); +} + +SWIGINTERN void +SWIG_Python_addvarlink(PyObject *p, const char *name, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)) { + swig_varlinkobject *v = (swig_varlinkobject *) p; + swig_globalvar *gv = (swig_globalvar *) malloc(sizeof(swig_globalvar)); + if (gv) { + size_t size = strlen(name)+1; + gv->name = (char *)malloc(size); + if (gv->name) { + memcpy(gv->name, name, size); + gv->get_attr = get_attr; + gv->set_attr = set_attr; + gv->next = v->vars; + } + } + v->vars = gv; +} + + +static PyObject *Swig_Globals_global = NULL; + +SWIGINTERN PyObject * +SWIG_globals(void) { + if (Swig_Globals_global == NULL) { + Swig_Globals_global = SWIG_newvarlink(); + } + return Swig_Globals_global; +} + +#ifdef __cplusplus +} +#endif + /* ----------------------------------------------------------------------------- * Pointer declarations * ----------------------------------------------------------------------------- */ @@ -1345,18 +1574,25 @@ SwigPyClientData_New(PyObject* obj) /* the newraw method and newargs arguments used to create a new raw instance */ if (PyClass_Check(obj)) { data->newraw = 0; - data->newargs = obj; Py_INCREF(obj); + data->newargs = obj; } else { data->newraw = PyObject_GetAttrString(data->klass, "__new__"); if (data->newraw) { - Py_INCREF(data->newraw); - data->newargs = PyTuple_New(1); - PyTuple_SetItem(data->newargs, 0, obj); + data->newargs = PyTuple_New(1); + if (data->newargs) { + Py_INCREF(obj); + PyTuple_SET_ITEM(data->newargs, 0, obj); + } else { + Py_DECREF(data->newraw); + Py_DECREF(data->klass); + free(data); + return 0; + } } else { - data->newargs = obj; + Py_INCREF(obj); + data->newargs = obj; } - Py_INCREF(data->newargs); } /* the destroy method, aka as the C++ delete method */ data->destroy = PyObject_GetAttrString(data->klass, "__swig_destroy__"); @@ -1365,10 +1601,7 @@ SwigPyClientData_New(PyObject* obj) data->destroy = 0; } if (data->destroy) { - int flags; - Py_INCREF(data->destroy); - flags = PyCFunction_GET_FLAGS(data->destroy); - data->delargs = !(flags & (METH_O)); + data->delargs = !(PyCFunction_GET_FLAGS(data->destroy) & METH_O); } else { data->delargs = 0; } @@ -1379,10 +1612,13 @@ SwigPyClientData_New(PyObject* obj) } SWIGRUNTIME void -SwigPyClientData_Del(SwigPyClientData *data) { +SwigPyClientData_Del(SwigPyClientData *data) +{ + Py_XDECREF(data->klass); Py_XDECREF(data->newraw); Py_XDECREF(data->newargs); Py_XDECREF(data->destroy); + free(data); } /* =============== SwigPyObject =====================*/ @@ -1409,7 +1645,7 @@ SwigPyObject_get___dict__(PyObject *v, PyObject *SWIGUNUSEDPARM(args)) if (!sobj->dict) sobj->dict = PyDict_New(); - Py_INCREF(sobj->dict); + Py_XINCREF(sobj->dict); return sobj->dict; } @@ -1427,18 +1663,21 @@ SwigPyObject_format(const char* fmt, SwigPyObject *v) PyObject *res = NULL; PyObject *args = PyTuple_New(1); if (args) { - if (PyTuple_SetItem(args, 0, SwigPyObject_long(v)) == 0) { - PyObject *ofmt = SWIG_Python_str_FromChar(fmt); + PyObject *val = SwigPyObject_long(v); + if (val) { + PyObject *ofmt; + PyTuple_SET_ITEM(args, 0, val); + ofmt = SWIG_Python_str_FromChar(fmt); if (ofmt) { #if PY_VERSION_HEX >= 0x03000000 - res = PyUnicode_Format(ofmt,args); + res = PyUnicode_Format(ofmt,args); #else - res = PyString_Format(ofmt,args); + res = PyString_Format(ofmt,args); #endif - Py_DECREF(ofmt); + Py_DECREF(ofmt); } - Py_DECREF(args); } + Py_DECREF(args); } return res; } @@ -1460,18 +1699,23 @@ SwigPyObject_repr(SwigPyObject *v) { const char *name = SWIG_TypePrettyName(v->ty); PyObject *repr = SWIG_Python_str_FromFormat("", (name ? name : "unknown"), (void *)v); - if (v->next) { + if (repr && v->next) { PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next); + if (nrep) { # if PY_VERSION_HEX >= 0x03000000 - PyObject *joined = PyUnicode_Concat(repr, nrep); - Py_DecRef(repr); - Py_DecRef(nrep); - repr = joined; + PyObject *joined = PyUnicode_Concat(repr, nrep); + Py_DecRef(repr); + Py_DecRef(nrep); + repr = joined; # else - PyString_ConcatAndDel(&repr,nrep); + PyString_ConcatAndDel(&repr,nrep); # endif + } else { + Py_DecRef(repr); + repr = NULL; + } } - return repr; + return repr; } /* We need a version taking two PyObject* parameters so it's a valid @@ -1541,6 +1785,8 @@ SwigPyObject_Check(PyObject *op) { SWIGRUNTIME PyObject * SwigPyObject_New(void *ptr, swig_type_info *ty, int own); +static PyObject* Swig_Capsule_global = NULL; + SWIGRUNTIME void SwigPyObject_dealloc(PyObject *v) { @@ -1567,8 +1813,12 @@ SwigPyObject_dealloc(PyObject *v) if (data->delargs) { /* we need to create a temporary object to carry the destroy operation */ PyObject *tmp = SwigPyObject_New(sobj->ptr, ty, 0); - res = SWIG_Python_CallFunctor(destroy, tmp); - Py_DECREF(tmp); + if (tmp) { + res = SWIG_Python_CallFunctor(destroy, tmp); + } else { + res = 0; + } + Py_XDECREF(tmp); } else { PyCFunction meth = PyCFunction_GET_FUNCTION(destroy); PyObject *mself = PyCFunction_GET_SELF(destroy); @@ -1587,8 +1837,12 @@ SwigPyObject_dealloc(PyObject *v) printf("swig/python detected a memory leak of type '%s', no destructor found.\n", (name ? name : "unknown")); } #endif - } + Py_XDECREF(Swig_Capsule_global); + } Py_XDECREF(next); +#ifdef SWIGPYTHON_BUILTIN + Py_XDECREF(sobj->dict); +#endif PyObject_DEL(v); } @@ -1600,6 +1854,7 @@ SwigPyObject_append(PyObject* v, PyObject* next) PyErr_SetString(PyExc_TypeError, "Attempt to append a non SwigPyObject"); return NULL; } + ((SwigPyObject *)next)->next = sobj->next; sobj->next = next; Py_INCREF(next); return SWIG_Py_Void(); @@ -1644,9 +1899,9 @@ SwigPyObject_own(PyObject *v, PyObject *args) PyObject *obj = PyBool_FromLong(sobj->own); if (val) { if (PyObject_IsTrue(val)) { - SwigPyObject_acquire(v,args); + Py_DECREF(SwigPyObject_acquire(v,args)); } else { - SwigPyObject_disown(v,args); + Py_DECREF(SwigPyObject_disown(v,args)); } } return obj; @@ -1726,7 +1981,11 @@ SwigPyObject_TypeOnce(void) { sizeof(SwigPyObject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)SwigPyObject_dealloc, /* tp_dealloc */ - 0, /* tp_print */ +#if PY_VERSION_HEX < 0x030800b4 + (printfunc)0, /*tp_print*/ +#else + (Py_ssize_t)0, /*tp_vectorcall_offset*/ +#endif (getattrfunc)0, /* tp_getattr */ (setattrfunc)0, /* tp_setattr */ #if PY_VERSION_HEX >= 0x03000000 @@ -1791,7 +2050,7 @@ SwigPyObject_TypeOnce(void) { }; swigpyobject_type = tmp; type_init = 1; - if (PyType_Ready(&swigpyobject_type) < 0) + if (PyType_Ready(&swigpyobject_type) != 0) return NULL; } return &swigpyobject_type; @@ -1806,6 +2065,15 @@ SwigPyObject_New(void *ptr, swig_type_info *ty, int own) sobj->ty = ty; sobj->own = own; sobj->next = 0; +#ifdef SWIGPYTHON_BUILTIN + sobj->dict = 0; +#endif + if (own == SWIG_POINTER_OWN) { + /* Obtain a reference to the Python capsule wrapping the module information, so that the + * module information is correctly destroyed after all SWIG python objects have been freed + * by the GC (and corresponding destructors invoked) */ + Py_XINCREF(Swig_Capsule_global); + } } return (PyObject *)sobj; } @@ -1893,7 +2161,11 @@ SwigPyPacked_TypeOnce(void) { sizeof(SwigPyPacked), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)SwigPyPacked_dealloc, /* tp_dealloc */ - 0, /* tp_print */ +#if PY_VERSION_HEX < 0x030800b4 + (printfunc)0, /*tp_print*/ +#else + (Py_ssize_t)0, /*tp_vectorcall_offset*/ +#endif (getattrfunc)0, /* tp_getattr */ (setattrfunc)0, /* tp_setattr */ #if PY_VERSION_HEX>=0x03000000 @@ -1958,7 +2230,7 @@ SwigPyPacked_TypeOnce(void) { }; swigpypacked_type = tmp; type_init = 1; - if (PyType_Ready(&swigpypacked_type) < 0) + if (PyType_Ready(&swigpypacked_type) != 0) return NULL; } return &swigpypacked_type; @@ -2148,12 +2420,19 @@ SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int } } if (sobj) { - if (own) - *own = *own | sobj->own; - if (flags & SWIG_POINTER_DISOWN) { - sobj->own = 0; + if (((flags & SWIG_POINTER_RELEASE) == SWIG_POINTER_RELEASE) && !sobj->own) { + res = SWIG_ERROR_RELEASE_NOT_OWNED; + } else { + if (own) + *own = *own | sobj->own; + if (flags & SWIG_POINTER_DISOWN) { + sobj->own = 0; + } + if (flags & SWIG_POINTER_CLEAR) { + sobj->ptr = 0; + } + res = SWIG_OK; } - res = SWIG_OK; } else { if (implicit_conv) { SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0; @@ -2266,12 +2545,17 @@ SWIG_Python_NewShadowInstance(SwigPyClientData *data, PyObject *swig_this) #if !defined(SWIG_PYTHON_SLOW_GETSET_THIS) PyObject **dictptr = _PyObject_GetDictPtr(inst); if (dictptr != NULL) { - PyObject *dict = *dictptr; - if (dict == NULL) { - dict = PyDict_New(); - *dictptr = dict; - PyDict_SetItem(dict, SWIG_This(), swig_this); - } + PyObject *dict = *dictptr; + if (dict == NULL) { + dict = PyDict_New(); + *dictptr = dict; + } + if (dict) { + PyDict_SetItem(dict, SWIG_This(), swig_this); + } else{ + Py_DECREF(inst); + inst = 0; + } } #else if (PyObject_SetAttr(inst, SWIG_This(), swig_this) == -1) { @@ -2293,7 +2577,7 @@ SWIG_Python_NewShadowInstance(SwigPyClientData *data, PyObject *swig_this) Py_DECREF(inst); inst = 0; } else { - Py_TYPE(inst)->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG; + PyType_Modified(Py_TYPE(inst)); } } } @@ -2322,7 +2606,11 @@ SWIG_Python_SetSwigThis(PyObject *inst, PyObject *swig_this) dict = PyDict_New(); *dictptr = dict; } - return PyDict_SetItem(dict, SWIG_This(), swig_this); + if (dict) { + return PyDict_SetItem(dict, SWIG_This(), swig_this); + } else{ + return -1; + } } #endif return PyObject_SetAttr(inst, SWIG_This(), swig_this); @@ -2337,7 +2625,7 @@ SWIG_Python_InitShadowInstance(PyObject *args) { } else { SwigPyObject *sthis = SWIG_Python_GetSwigThis(obj[0]); if (sthis) { - SwigPyObject_append((PyObject*) sthis, obj[1]); + Py_DECREF(SwigPyObject_append((PyObject*) sthis, obj[1])); } else { if (SWIG_Python_SetSwigThis(obj[0], obj[1]) != 0) return NULL; @@ -2376,7 +2664,9 @@ SWIG_Python_NewPointerObj(PyObject *self, void *ptr, swig_type_info *type, int f } else { newobj = PyObject_New(SwigPyObject, clientdata->pytype); #ifdef SWIGPYTHON_BUILTIN - newobj->dict = 0; + if (newobj) { + newobj->dict = 0; + } #endif } if (newobj) { @@ -2415,39 +2705,61 @@ SWIG_Python_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) { void *SWIG_ReturnGlobalTypeList(void *); #endif +static PyObject *Swig_TypeCache_global = NULL; + +/* The python cached type query */ +SWIGRUNTIME PyObject * +SWIG_Python_TypeCache(void) { + if (Swig_TypeCache_global == NULL) { + Swig_TypeCache_global = PyDict_New(); + } + return Swig_TypeCache_global; +} + SWIGRUNTIME swig_module_info * SWIG_Python_GetModule(void *SWIGUNUSEDPARM(clientdata)) { +#ifdef SWIG_LINK_RUNTIME static void *type_pointer = (void *)0; /* first check if module already created */ if (!type_pointer) { -#ifdef SWIG_LINK_RUNTIME type_pointer = SWIG_ReturnGlobalTypeList((void *)0); + } #else - type_pointer = PyCapsule_Import(SWIGPY_CAPSULE_NAME, 0); - if (PyErr_Occurred()) { - PyErr_Clear(); - type_pointer = (void *)0; - } -#endif + void *type_pointer = PyCapsule_Import(SWIGPY_CAPSULE_NAME, 0); + if (PyErr_Occurred()) { + PyErr_Clear(); + type_pointer = (void *)0; } +#endif return (swig_module_info *) type_pointer; } + +static int interpreter_counter = 0; // how many (sub-)interpreters are using swig_module's types + SWIGRUNTIME void SWIG_Python_DestroyModule(PyObject *obj) { swig_module_info *swig_module = (swig_module_info *) PyCapsule_GetPointer(obj, SWIGPY_CAPSULE_NAME); swig_type_info **types = swig_module->types; size_t i; + if (--interpreter_counter != 0) // another sub-interpreter may still be using the swig_module's types + return; for (i =0; i < swig_module->size; ++i) { swig_type_info *ty = types[i]; if (ty->owndata) { SwigPyClientData *data = (SwigPyClientData *) ty->clientdata; + ty->clientdata = 0; if (data) SwigPyClientData_Del(data); } } Py_DECREF(SWIG_This()); Swig_This_global = NULL; + Py_DECREF(SWIG_globals()); + Swig_Globals_global = NULL; + Py_DECREF(SWIG_Python_TypeCache()); + Swig_TypeCache_global = NULL; + Swig_Capsule_global = NULL; } SWIGRUNTIME void @@ -2461,19 +2773,17 @@ SWIG_Python_SetModule(swig_module_info *swig_module) { #endif PyObject *pointer = PyCapsule_New((void *) swig_module, SWIGPY_CAPSULE_NAME, SWIG_Python_DestroyModule); if (pointer && module) { - PyModule_AddObject(module, "type_pointer_capsule" SWIG_TYPE_TABLE_NAME, pointer); + if (PyModule_AddObject(module, SWIGPY_CAPSULE_ATTR_NAME, pointer) == 0) { + ++interpreter_counter; + Swig_Capsule_global = pointer; + } else { + Py_DECREF(pointer); + } } else { Py_XDECREF(pointer); } } -/* The python cached type query */ -SWIGRUNTIME PyObject * -SWIG_Python_TypeCache(void) { - static PyObject *SWIG_STATIC_POINTER(cache) = PyDict_New(); - return cache; -} - SWIGRUNTIME swig_type_info * SWIG_Python_TypeQuery(const char *type) { @@ -2488,8 +2798,10 @@ SWIG_Python_TypeQuery(const char *type) descriptor = SWIG_TypeQueryModule(swig_module, swig_module, type); if (descriptor) { obj = PyCapsule_New((void*) descriptor, NULL, NULL); - PyDict_SetItem(cache, key, obj); - Py_DECREF(obj); + if (obj) { + PyDict_SetItem(cache, key, obj); + Py_DECREF(obj); + } } } Py_DECREF(key); @@ -2522,7 +2834,6 @@ SWIG_Python_AddErrMesg(const char* mesg, int infront) } else { PyErr_Format(type, "%s %s", errmesg, mesg); } - SWIG_Python_str_DelForPy3(tmp); Py_DECREF(old_str); } return 1; @@ -2574,7 +2885,6 @@ SWIG_Python_TypeError(const char *type, PyObject *obj) if (cstr) { PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s(%s)' is received", type, otype, cstr); - SWIG_Python_str_DelForPy3(cstr); } else { PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s' is received", type, otype); @@ -2596,12 +2906,6 @@ SWIG_Python_MustGetPtr(PyObject *obj, swig_type_info *ty, int SWIGUNUSEDPARM(arg void *result; if (SWIG_Python_ConvertPtr(obj, &result, ty, flags) == -1) { PyErr_Clear(); -#if SWIG_POINTER_EXCEPTION - if (flags) { - SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj); - SWIG_Python_ArgFail(argnum); - } -#endif } return result; } @@ -2632,7 +2936,7 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) { } if (!tp->tp_dict) { - if (PyType_Ready(tp) < 0) + if (PyType_Ready(tp) != 0) goto done; } @@ -2647,7 +2951,7 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) { } else { encoded_name = PyUnicode_AsUTF8String(name); if (!encoded_name) - return -1; + goto done; } PyErr_Format(PyExc_AttributeError, "'%.100s' object has no attribute '%.200s'", tp->tp_name, PyString_AsString(encoded_name)); Py_DECREF(encoded_name); @@ -2670,23 +2974,8 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) { #define SWIG_exception_fail(code, msg) do { SWIG_Error(code, msg); SWIG_fail; } while(0) -#define SWIG_contract_assert(expr, msg) if (!(expr)) { SWIG_Error(SWIG_RuntimeError, msg); SWIG_fail; } else - - - -#ifdef __cplusplus -extern "C" { -#endif - -/* Method creation and docstring support functions */ +#define SWIG_contract_assert(expr, msg) do { if (!(expr)) { SWIG_Error(SWIG_RuntimeError, msg); SWIG_fail; } } while (0) -SWIGINTERN PyMethodDef *SWIG_PythonGetProxyDoc(const char *name); -SWIGINTERN PyObject *SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *func); -SWIGINTERN PyObject *SWIG_PyStaticMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *func); - -#ifdef __cplusplus -} -#endif #define SWIG_exception(code, msg) do { SWIG_Error(code, msg); SWIG_fail;; } while(0) @@ -2733,8 +3022,52 @@ static swig_module_info swig_module = {swig_types, 15, 0, 0, 0, 0}; #endif #define SWIG_name "_exploresdk" -#define SWIGVERSION 0x040002 -#define SWIG_VERSION SWIGVERSION +#ifdef __cplusplus +#include +/* SwigValueWrapper is described in swig.swg */ +template class SwigValueWrapper { + struct SwigSmartPointer { + T *ptr; + SwigSmartPointer(T *p) : ptr(p) { } + ~SwigSmartPointer() { delete ptr; } + SwigSmartPointer& operator=(SwigSmartPointer& rhs) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = rhs.ptr; rhs.ptr = 0; return *this; } + void reset(T *p) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = p; } + } pointer; + SwigValueWrapper& operator=(const SwigValueWrapper& rhs); + SwigValueWrapper(const SwigValueWrapper& rhs); +public: + SwigValueWrapper() : pointer(0) { } + SwigValueWrapper& operator=(const T& t) { SwigSmartPointer tmp(new T(t)); pointer = tmp; return *this; } +#if __cplusplus >=201103L + SwigValueWrapper& operator=(T&& t) { SwigSmartPointer tmp(new T(std::move(t))); pointer = tmp; return *this; } + operator T&&() const { return std::move(*pointer.ptr); } +#else + operator T&() const { return *pointer.ptr; } +#endif + T *operator&() const { return pointer.ptr; } + static void reset(SwigValueWrapper& t, T *p) { t.pointer.reset(p); } +}; + +/* + * SwigValueInit() is a generic initialisation solution as the following approach: + * + * T c_result = T(); + * + * doesn't compile for all types for example: + * + * unsigned int c_result = unsigned int(); + */ +template T SwigValueInit() { + return T(); +} + +#if __cplusplus >=201103L +# define SWIG_STD_MOVE(OBJ) std::move(OBJ) +#else +# define SWIG_STD_MOVE(OBJ) OBJ +#endif + +#endif #define SWIG_as_voidptr(a) const_cast< void * >(static_cast< const void * >(a)) @@ -2817,9 +3150,9 @@ namespace swig { #include #if PY_VERSION_HEX >= 0x03020000 -# define SWIGPY_SLICE_ARG(obj) ((PyObject*) (obj)) +# define SWIGPY_SLICEOBJECT PyObject #else -# define SWIGPY_SLICE_ARG(obj) ((PySliceObject*) (obj)) +# define SWIGPY_SLICEOBJECT PySliceObject #endif @@ -4827,46 +5160,46 @@ SWIGINTERN void std_vector_Sl_device_Sg____delslice__(std::vector< device > *sel SWIGINTERN void std_vector_Sl_device_Sg____delitem____SWIG_0(std::vector< device > *self,std::vector< device >::difference_type i){ swig::erase(self, swig::getpos(self, i)); } -SWIGINTERN std::vector< device,std::allocator< device > > *std_vector_Sl_device_Sg____getitem____SWIG_0(std::vector< device > *self,PySliceObject *slice){ +SWIGINTERN std::vector< device,std::allocator< device > > *std_vector_Sl_device_Sg____getitem____SWIG_0(std::vector< device > *self,SWIGPY_SLICEOBJECT *slice){ Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return NULL; } - PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step); + PySlice_GetIndices(slice, (Py_ssize_t)self->size(), &i, &j, &step); std::vector< device,std::allocator< device > >::difference_type id = i; std::vector< device,std::allocator< device > >::difference_type jd = j; return swig::getslice(self, id, jd, step); } -SWIGINTERN void std_vector_Sl_device_Sg____setitem____SWIG_0(std::vector< device > *self,PySliceObject *slice,std::vector< device,std::allocator< device > > const &v){ +SWIGINTERN void std_vector_Sl_device_Sg____setitem____SWIG_0(std::vector< device > *self,SWIGPY_SLICEOBJECT *slice,std::vector< device,std::allocator< device > > const &v){ Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return; } - PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step); + PySlice_GetIndices(slice, (Py_ssize_t)self->size(), &i, &j, &step); std::vector< device,std::allocator< device > >::difference_type id = i; std::vector< device,std::allocator< device > >::difference_type jd = j; swig::setslice(self, id, jd, step, v); } -SWIGINTERN void std_vector_Sl_device_Sg____setitem____SWIG_1(std::vector< device > *self,PySliceObject *slice){ +SWIGINTERN void std_vector_Sl_device_Sg____setitem____SWIG_1(std::vector< device > *self,SWIGPY_SLICEOBJECT *slice){ Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return; } - PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step); + PySlice_GetIndices(slice, (Py_ssize_t)self->size(), &i, &j, &step); std::vector< device,std::allocator< device > >::difference_type id = i; std::vector< device,std::allocator< device > >::difference_type jd = j; swig::delslice(self, id, jd, step); } -SWIGINTERN void std_vector_Sl_device_Sg____delitem____SWIG_1(std::vector< device > *self,PySliceObject *slice){ +SWIGINTERN void std_vector_Sl_device_Sg____delitem____SWIG_1(std::vector< device > *self,SWIGPY_SLICEOBJECT *slice){ Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return; } - PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step); + PySlice_GetIndices(slice, (Py_ssize_t)self->size(), &i, &j, &step); std::vector< device,std::allocator< device > >::difference_type id = i; std::vector< device,std::allocator< device > >::difference_type jd = j; swig::delslice(self, id, jd, step); @@ -4950,7 +5283,7 @@ SWIG_AsVal_bool (PyObject *obj, bool *val) #ifdef __cplusplus extern "C" { #endif -SWIGINTERN PyObject *_wrap_delete_SwigPyIterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_delete_SwigPyIterator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; void *argp1 = 0 ; @@ -4976,7 +5309,7 @@ SWIGINTERN PyObject *_wrap_delete_SwigPyIterator(PyObject *SWIGUNUSEDPARM(self), } -SWIGINTERN PyObject *_wrap_SwigPyIterator_value(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_SwigPyIterator_value(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; void *argp1 = 0 ; @@ -5011,7 +5344,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_value(PyObject *SWIGUNUSEDPARM(self), } -SWIGINTERN PyObject *_wrap_SwigPyIterator_incr__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_SwigPyIterator_incr__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; size_t arg2 ; @@ -5052,7 +5385,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_incr__SWIG_0(PyObject *SWIGUNUSEDPARM( } -SWIGINTERN PyObject *_wrap_SwigPyIterator_incr__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_SwigPyIterator_incr__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; void *argp1 = 0 ; @@ -5094,7 +5427,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_incr(PyObject *self, PyObject *args) { if (!(argc = SWIG_Python_UnpackTuple(args, "SwigPyIterator_incr", 0, 2, argv))) SWIG_fail; --argc; if (argc == 1) { - int _v; + int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0); _v = SWIG_CheckState(res); @@ -5103,7 +5436,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_incr(PyObject *self, PyObject *args) { } } if (argc == 2) { - int _v; + int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0); _v = SWIG_CheckState(res); @@ -5127,7 +5460,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_incr(PyObject *self, PyObject *args) { } -SWIGINTERN PyObject *_wrap_SwigPyIterator_decr__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_SwigPyIterator_decr__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; size_t arg2 ; @@ -5168,7 +5501,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_decr__SWIG_0(PyObject *SWIGUNUSEDPARM( } -SWIGINTERN PyObject *_wrap_SwigPyIterator_decr__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_SwigPyIterator_decr__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; void *argp1 = 0 ; @@ -5210,7 +5543,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_decr(PyObject *self, PyObject *args) { if (!(argc = SWIG_Python_UnpackTuple(args, "SwigPyIterator_decr", 0, 2, argv))) SWIG_fail; --argc; if (argc == 1) { - int _v; + int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0); _v = SWIG_CheckState(res); @@ -5219,7 +5552,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_decr(PyObject *self, PyObject *args) { } } if (argc == 2) { - int _v; + int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0); _v = SWIG_CheckState(res); @@ -5243,7 +5576,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_decr(PyObject *self, PyObject *args) { } -SWIGINTERN PyObject *_wrap_SwigPyIterator_distance(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_SwigPyIterator_distance(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; swig::SwigPyIterator *arg2 = 0 ; @@ -5284,7 +5617,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_distance(PyObject *SWIGUNUSEDPARM(self } -SWIGINTERN PyObject *_wrap_SwigPyIterator_equal(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_SwigPyIterator_equal(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; swig::SwigPyIterator *arg2 = 0 ; @@ -5325,7 +5658,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_equal(PyObject *SWIGUNUSEDPARM(self), } -SWIGINTERN PyObject *_wrap_SwigPyIterator_copy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_SwigPyIterator_copy(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; void *argp1 = 0 ; @@ -5352,7 +5685,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_copy(PyObject *SWIGUNUSEDPARM(self), P } -SWIGINTERN PyObject *_wrap_SwigPyIterator_next(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_SwigPyIterator_next(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; void *argp1 = 0 ; @@ -5387,7 +5720,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_next(PyObject *SWIGUNUSEDPARM(self), P } -SWIGINTERN PyObject *_wrap_SwigPyIterator___next__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_SwigPyIterator___next__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; void *argp1 = 0 ; @@ -5422,7 +5755,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator___next__(PyObject *SWIGUNUSEDPARM(self } -SWIGINTERN PyObject *_wrap_SwigPyIterator_previous(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_SwigPyIterator_previous(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; void *argp1 = 0 ; @@ -5457,7 +5790,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_previous(PyObject *SWIGUNUSEDPARM(self } -SWIGINTERN PyObject *_wrap_SwigPyIterator_advance(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_SwigPyIterator_advance(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; ptrdiff_t arg2 ; @@ -5499,7 +5832,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_advance(PyObject *SWIGUNUSEDPARM(self) } -SWIGINTERN PyObject *_wrap_SwigPyIterator___eq__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_SwigPyIterator___eq__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; swig::SwigPyIterator *arg2 = 0 ; @@ -5538,7 +5871,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator___eq__(PyObject *SWIGUNUSEDPARM(self), } -SWIGINTERN PyObject *_wrap_SwigPyIterator___ne__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_SwigPyIterator___ne__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; swig::SwigPyIterator *arg2 = 0 ; @@ -5577,7 +5910,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator___ne__(PyObject *SWIGUNUSEDPARM(self), } -SWIGINTERN PyObject *_wrap_SwigPyIterator___iadd__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_SwigPyIterator___iadd__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; ptrdiff_t arg2 ; @@ -5619,7 +5952,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator___iadd__(PyObject *SWIGUNUSEDPARM(self } -SWIGINTERN PyObject *_wrap_SwigPyIterator___isub__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_SwigPyIterator___isub__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; ptrdiff_t arg2 ; @@ -5661,7 +5994,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator___isub__(PyObject *SWIGUNUSEDPARM(self } -SWIGINTERN PyObject *_wrap_SwigPyIterator___add__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_SwigPyIterator___add__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; ptrdiff_t arg2 ; @@ -5705,7 +6038,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator___add__(PyObject *SWIGUNUSEDPARM(self) } -SWIGINTERN PyObject *_wrap_SwigPyIterator___sub____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_SwigPyIterator___sub____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; ptrdiff_t arg2 ; @@ -5748,7 +6081,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator___sub____SWIG_0(PyObject *SWIGUNUSEDPA } -SWIGINTERN PyObject *_wrap_SwigPyIterator___sub____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_SwigPyIterator___sub____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; swig::SwigPyIterator *arg2 = 0 ; @@ -5795,7 +6128,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator___sub__(PyObject *self, PyObject *args if (!(argc = SWIG_Python_UnpackTuple(args, "SwigPyIterator___sub__", 0, 2, argv))) SWIG_fail; --argc; if (argc == 2) { - int _v; + int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0); _v = SWIG_CheckState(res); @@ -5808,7 +6141,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator___sub__(PyObject *self, PyObject *args } } if (argc == 2) { - int _v; + int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0); _v = SWIG_CheckState(res); @@ -5836,7 +6169,7 @@ SWIGINTERN PyObject *SwigPyIterator_swigregister(PyObject *SWIGUNUSEDPARM(self), return SWIG_Py_Void(); } -SWIGINTERN PyObject *_wrap_delete_BTSerialPortBinding(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_delete_BTSerialPortBinding(PyObject *self, PyObject *args) { PyObject *resultobj = 0; BTSerialPortBinding *arg1 = (BTSerialPortBinding *) 0 ; void *argp1 = 0 ; @@ -5866,6 +6199,9 @@ SWIGINTERN PyObject *_wrap_delete_BTSerialPortBinding(PyObject *SWIGUNUSEDPARM(s catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -5880,7 +6216,7 @@ SWIGINTERN PyObject *_wrap_delete_BTSerialPortBinding(PyObject *SWIGUNUSEDPARM(s } -SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Create(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Create(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::string arg1 ; int arg2 ; @@ -5908,7 +6244,7 @@ SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Create(PyObject *SWIGUNUSEDPARM(s try { { SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (BTSerialPortBinding *)BTSerialPortBinding::Create(arg1,arg2); + result = (BTSerialPortBinding *)BTSerialPortBinding::Create(SWIG_STD_MOVE(arg1),arg2); SWIG_PYTHON_THREAD_END_ALLOW; } } catch(const ExploreException& e) { @@ -5920,6 +6256,9 @@ SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Create(PyObject *SWIGUNUSEDPARM(s catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -5934,7 +6273,7 @@ SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Create(PyObject *SWIGUNUSEDPARM(s } -SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Connect(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Connect(PyObject *self, PyObject *args) { PyObject *resultobj = 0; BTSerialPortBinding *arg1 = (BTSerialPortBinding *) 0 ; void *argp1 = 0 ; @@ -5965,6 +6304,9 @@ SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Connect(PyObject *SWIGUNUSEDPARM( catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -5979,7 +6321,7 @@ SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Connect(PyObject *SWIGUNUSEDPARM( } -SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Close(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Close(PyObject *self, PyObject *args) { PyObject *resultobj = 0; BTSerialPortBinding *arg1 = (BTSerialPortBinding *) 0 ; void *argp1 = 0 ; @@ -6009,6 +6351,9 @@ SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Close(PyObject *SWIGUNUSEDPARM(se catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -6023,7 +6368,7 @@ SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Close(PyObject *SWIGUNUSEDPARM(se } -SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Read(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Read(PyObject *self, PyObject *args) { PyObject *resultobj = 0; BTSerialPortBinding *arg1 = (BTSerialPortBinding *) 0 ; char *arg2 = (char *) 0 ; @@ -6066,6 +6411,9 @@ SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Read(PyObject *SWIGUNUSEDPARM(sel catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -6083,7 +6431,7 @@ SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Read(PyObject *SWIGUNUSEDPARM(sel } -SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Write(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Write(PyObject *self, PyObject *args) { PyObject *resultobj = 0; BTSerialPortBinding *arg1 = (BTSerialPortBinding *) 0 ; char *arg2 = (char *) 0 ; @@ -6119,6 +6467,9 @@ SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Write(PyObject *SWIGUNUSEDPARM(se catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -6133,7 +6484,7 @@ SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Write(PyObject *SWIGUNUSEDPARM(se } -SWIGINTERN PyObject *_wrap_BTSerialPortBinding_IsDataAvailable(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_BTSerialPortBinding_IsDataAvailable(PyObject *self, PyObject *args) { PyObject *resultobj = 0; BTSerialPortBinding *arg1 = (BTSerialPortBinding *) 0 ; void *argp1 = 0 ; @@ -6164,6 +6515,9 @@ SWIGINTERN PyObject *_wrap_BTSerialPortBinding_IsDataAvailable(PyObject *SWIGUNU catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -6185,7 +6539,7 @@ SWIGINTERN PyObject *BTSerialPortBinding_swigregister(PyObject *SWIGUNUSEDPARM(s return SWIG_Py_Void(); } -SWIGINTERN PyObject *_wrap_vectordevice_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_iterator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; PyObject **arg2 = (PyObject **) 0 ; @@ -6218,6 +6572,9 @@ SWIGINTERN PyObject *_wrap_vectordevice_iterator(PyObject *SWIGUNUSEDPARM(self), catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -6232,7 +6589,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_iterator(PyObject *SWIGUNUSEDPARM(self), } -SWIGINTERN PyObject *_wrap_vectordevice___nonzero__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice___nonzero__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; void *argp1 = 0 ; @@ -6263,6 +6620,9 @@ SWIGINTERN PyObject *_wrap_vectordevice___nonzero__(PyObject *SWIGUNUSEDPARM(sel catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -6277,7 +6637,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___nonzero__(PyObject *SWIGUNUSEDPARM(sel } -SWIGINTERN PyObject *_wrap_vectordevice___bool__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice___bool__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; void *argp1 = 0 ; @@ -6308,6 +6668,9 @@ SWIGINTERN PyObject *_wrap_vectordevice___bool__(PyObject *SWIGUNUSEDPARM(self), catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -6322,7 +6685,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___bool__(PyObject *SWIGUNUSEDPARM(self), } -SWIGINTERN PyObject *_wrap_vectordevice___len__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice___len__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; void *argp1 = 0 ; @@ -6353,6 +6716,9 @@ SWIGINTERN PyObject *_wrap_vectordevice___len__(PyObject *SWIGUNUSEDPARM(self), catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -6367,7 +6733,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___len__(PyObject *SWIGUNUSEDPARM(self), } -SWIGINTERN PyObject *_wrap_vectordevice___getslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice___getslice__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device >::difference_type arg2 ; @@ -6402,7 +6768,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___getslice__(PyObject *SWIGUNUSEDPARM(se try { { SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (std::vector< device,std::allocator< device > > *)std_vector_Sl_device_Sg____getslice__(arg1,arg2,arg3); + result = (std::vector< device,std::allocator< device > > *)std_vector_Sl_device_Sg____getslice__(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); SWIG_PYTHON_THREAD_END_ALLOW; } } catch(std::out_of_range &_e) { @@ -6419,6 +6785,9 @@ SWIGINTERN PyObject *_wrap_vectordevice___getslice__(PyObject *SWIGUNUSEDPARM(se catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -6433,7 +6802,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___getslice__(PyObject *SWIGUNUSEDPARM(se } -SWIGINTERN PyObject *_wrap_vectordevice___setslice____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_vectordevice___setslice____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device >::difference_type arg2 ; @@ -6466,7 +6835,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___setslice____SWIG_0(PyObject *SWIGUNUSE try { { SWIG_PYTHON_THREAD_BEGIN_ALLOW; - std_vector_Sl_device_Sg____setslice____SWIG_0(arg1,arg2,arg3); + std_vector_Sl_device_Sg____setslice____SWIG_0(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); SWIG_PYTHON_THREAD_END_ALLOW; } } catch(std::out_of_range &_e) { @@ -6483,6 +6852,9 @@ SWIGINTERN PyObject *_wrap_vectordevice___setslice____SWIG_0(PyObject *SWIGUNUSE catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -6497,7 +6869,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___setslice____SWIG_0(PyObject *SWIGUNUSE } -SWIGINTERN PyObject *_wrap_vectordevice___setslice____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_vectordevice___setslice____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device >::difference_type arg2 ; @@ -6543,7 +6915,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___setslice____SWIG_1(PyObject *SWIGUNUSE try { { SWIG_PYTHON_THREAD_BEGIN_ALLOW; - std_vector_Sl_device_Sg____setslice____SWIG_1(arg1,arg2,arg3,(std::vector< device,std::allocator< device > > const &)*arg4); + std_vector_Sl_device_Sg____setslice____SWIG_1(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3),(std::vector< device,std::allocator< device > > const &)*arg4); SWIG_PYTHON_THREAD_END_ALLOW; } } catch(std::out_of_range &_e) { @@ -6560,6 +6932,9 @@ SWIGINTERN PyObject *_wrap_vectordevice___setslice____SWIG_1(PyObject *SWIGUNUSE catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -6585,7 +6960,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___setslice__(PyObject *self, PyObject *a if (!(argc = SWIG_Python_UnpackTuple(args, "vectordevice___setslice__", 0, 4, argv))) SWIG_fail; --argc; if (argc == 3) { - int _v; + int _v = 0; int res = swig::asptr(argv[0], (std::vector< device,std::allocator< device > >**)(0)); _v = SWIG_CheckState(res); if (_v) { @@ -6605,7 +6980,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___setslice__(PyObject *self, PyObject *a } } if (argc == 4) { - int _v; + int _v = 0; int res = swig::asptr(argv[0], (std::vector< device,std::allocator< device > >**)(0)); _v = SWIG_CheckState(res); if (_v) { @@ -6638,7 +7013,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___setslice__(PyObject *self, PyObject *a } -SWIGINTERN PyObject *_wrap_vectordevice___delslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice___delslice__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device >::difference_type arg2 ; @@ -6672,7 +7047,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___delslice__(PyObject *SWIGUNUSEDPARM(se try { { SWIG_PYTHON_THREAD_BEGIN_ALLOW; - std_vector_Sl_device_Sg____delslice__(arg1,arg2,arg3); + std_vector_Sl_device_Sg____delslice__(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); SWIG_PYTHON_THREAD_END_ALLOW; } } catch(std::out_of_range &_e) { @@ -6689,6 +7064,9 @@ SWIGINTERN PyObject *_wrap_vectordevice___delslice__(PyObject *SWIGUNUSEDPARM(se catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -6703,7 +7081,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___delslice__(PyObject *SWIGUNUSEDPARM(se } -SWIGINTERN PyObject *_wrap_vectordevice___delitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_vectordevice___delitem____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device >::difference_type arg2 ; @@ -6728,7 +7106,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___delitem____SWIG_0(PyObject *SWIGUNUSED try { { SWIG_PYTHON_THREAD_BEGIN_ALLOW; - std_vector_Sl_device_Sg____delitem____SWIG_0(arg1,arg2); + std_vector_Sl_device_Sg____delitem____SWIG_0(arg1,SWIG_STD_MOVE(arg2)); SWIG_PYTHON_THREAD_END_ALLOW; } } catch(std::out_of_range &_e) { @@ -6745,6 +7123,9 @@ SWIGINTERN PyObject *_wrap_vectordevice___delitem____SWIG_0(PyObject *SWIGUNUSED catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -6759,10 +7140,10 @@ SWIGINTERN PyObject *_wrap_vectordevice___delitem____SWIG_0(PyObject *SWIGUNUSED } -SWIGINTERN PyObject *_wrap_vectordevice___getitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_vectordevice___getitem____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; - PySliceObject *arg2 = (PySliceObject *) 0 ; + SWIGPY_SLICEOBJECT *arg2 = (SWIGPY_SLICEOBJECT *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< device,std::allocator< device > > *result = 0 ; @@ -6775,9 +7156,9 @@ SWIGINTERN PyObject *_wrap_vectordevice___getitem____SWIG_0(PyObject *SWIGUNUSED arg1 = reinterpret_cast< std::vector< device > * >(argp1); { if (!PySlice_Check(swig_obj[1])) { - SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vectordevice___getitem__" "', argument " "2"" of type '" "PySliceObject *""'"); + SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vectordevice___getitem__" "', argument " "2"" of type '" "SWIGPY_SLICEOBJECT *""'"); } - arg2 = (PySliceObject *) swig_obj[1]; + arg2 = (SWIGPY_SLICEOBJECT *) swig_obj[1]; } { try { @@ -6801,6 +7182,9 @@ SWIGINTERN PyObject *_wrap_vectordevice___getitem____SWIG_0(PyObject *SWIGUNUSED catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -6815,10 +7199,10 @@ SWIGINTERN PyObject *_wrap_vectordevice___getitem____SWIG_0(PyObject *SWIGUNUSED } -SWIGINTERN PyObject *_wrap_vectordevice___setitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_vectordevice___setitem____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; - PySliceObject *arg2 = (PySliceObject *) 0 ; + SWIGPY_SLICEOBJECT *arg2 = (SWIGPY_SLICEOBJECT *) 0 ; std::vector< device,std::allocator< device > > *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; @@ -6832,9 +7216,9 @@ SWIGINTERN PyObject *_wrap_vectordevice___setitem____SWIG_0(PyObject *SWIGUNUSED arg1 = reinterpret_cast< std::vector< device > * >(argp1); { if (!PySlice_Check(swig_obj[1])) { - SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vectordevice___setitem__" "', argument " "2"" of type '" "PySliceObject *""'"); + SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vectordevice___setitem__" "', argument " "2"" of type '" "SWIGPY_SLICEOBJECT *""'"); } - arg2 = (PySliceObject *) swig_obj[1]; + arg2 = (SWIGPY_SLICEOBJECT *) swig_obj[1]; } { std::vector< device,std::allocator< device > > *ptr = (std::vector< device,std::allocator< device > > *)0; @@ -6869,6 +7253,9 @@ SWIGINTERN PyObject *_wrap_vectordevice___setitem____SWIG_0(PyObject *SWIGUNUSED catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -6885,10 +7272,10 @@ SWIGINTERN PyObject *_wrap_vectordevice___setitem____SWIG_0(PyObject *SWIGUNUSED } -SWIGINTERN PyObject *_wrap_vectordevice___setitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_vectordevice___setitem____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; - PySliceObject *arg2 = (PySliceObject *) 0 ; + SWIGPY_SLICEOBJECT *arg2 = (SWIGPY_SLICEOBJECT *) 0 ; void *argp1 = 0 ; int res1 = 0 ; @@ -6900,9 +7287,9 @@ SWIGINTERN PyObject *_wrap_vectordevice___setitem____SWIG_1(PyObject *SWIGUNUSED arg1 = reinterpret_cast< std::vector< device > * >(argp1); { if (!PySlice_Check(swig_obj[1])) { - SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vectordevice___setitem__" "', argument " "2"" of type '" "PySliceObject *""'"); + SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vectordevice___setitem__" "', argument " "2"" of type '" "SWIGPY_SLICEOBJECT *""'"); } - arg2 = (PySliceObject *) swig_obj[1]; + arg2 = (SWIGPY_SLICEOBJECT *) swig_obj[1]; } { try { @@ -6926,6 +7313,9 @@ SWIGINTERN PyObject *_wrap_vectordevice___setitem____SWIG_1(PyObject *SWIGUNUSED catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -6940,10 +7330,10 @@ SWIGINTERN PyObject *_wrap_vectordevice___setitem____SWIG_1(PyObject *SWIGUNUSED } -SWIGINTERN PyObject *_wrap_vectordevice___delitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_vectordevice___delitem____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; - PySliceObject *arg2 = (PySliceObject *) 0 ; + SWIGPY_SLICEOBJECT *arg2 = (SWIGPY_SLICEOBJECT *) 0 ; void *argp1 = 0 ; int res1 = 0 ; @@ -6955,9 +7345,9 @@ SWIGINTERN PyObject *_wrap_vectordevice___delitem____SWIG_1(PyObject *SWIGUNUSED arg1 = reinterpret_cast< std::vector< device > * >(argp1); { if (!PySlice_Check(swig_obj[1])) { - SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vectordevice___delitem__" "', argument " "2"" of type '" "PySliceObject *""'"); + SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vectordevice___delitem__" "', argument " "2"" of type '" "SWIGPY_SLICEOBJECT *""'"); } - arg2 = (PySliceObject *) swig_obj[1]; + arg2 = (SWIGPY_SLICEOBJECT *) swig_obj[1]; } { try { @@ -6981,6 +7371,9 @@ SWIGINTERN PyObject *_wrap_vectordevice___delitem____SWIG_1(PyObject *SWIGUNUSED catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -7004,7 +7397,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___delitem__(PyObject *self, PyObject *ar if (!(argc = SWIG_Python_UnpackTuple(args, "vectordevice___delitem__", 0, 2, argv))) SWIG_fail; --argc; if (argc == 2) { - int _v; + int _v = 0; int res = swig::asptr(argv[0], (std::vector< device,std::allocator< device > >**)(0)); _v = SWIG_CheckState(res); if (_v) { @@ -7017,7 +7410,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___delitem__(PyObject *self, PyObject *ar } } if (argc == 2) { - int _v; + int _v = 0; int res = swig::asptr(argv[0], (std::vector< device,std::allocator< device > >**)(0)); _v = SWIG_CheckState(res); if (_v) { @@ -7035,12 +7428,12 @@ SWIGINTERN PyObject *_wrap_vectordevice___delitem__(PyObject *self, PyObject *ar SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'vectordevice___delitem__'.\n" " Possible C/C++ prototypes are:\n" " std::vector< device >::__delitem__(std::vector< device >::difference_type)\n" - " std::vector< device >::__delitem__(PySliceObject *)\n"); + " std::vector< device >::__delitem__(SWIGPY_SLICEOBJECT *)\n"); return 0; } -SWIGINTERN PyObject *_wrap_vectordevice___getitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_vectordevice___getitem____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device >::difference_type arg2 ; @@ -7066,7 +7459,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___getitem____SWIG_1(PyObject *SWIGUNUSED try { { SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (std::vector< device >::value_type *) &std_vector_Sl_device_Sg____getitem____SWIG_1((std::vector< device > const *)arg1,arg2); + result = (std::vector< device >::value_type *) &std_vector_Sl_device_Sg____getitem____SWIG_1((std::vector< device > const *)arg1,SWIG_STD_MOVE(arg2)); SWIG_PYTHON_THREAD_END_ALLOW; } } catch(std::out_of_range &_e) { @@ -7081,6 +7474,9 @@ SWIGINTERN PyObject *_wrap_vectordevice___getitem____SWIG_1(PyObject *SWIGUNUSED catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -7105,7 +7501,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___getitem__(PyObject *self, PyObject *ar if (!(argc = SWIG_Python_UnpackTuple(args, "vectordevice___getitem__", 0, 2, argv))) SWIG_fail; --argc; if (argc == 2) { - int _v; + int _v = 0; int res = swig::asptr(argv[0], (std::vector< device,std::allocator< device > >**)(0)); _v = SWIG_CheckState(res); if (_v) { @@ -7118,7 +7514,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___getitem__(PyObject *self, PyObject *ar } } if (argc == 2) { - int _v; + int _v = 0; int res = swig::asptr(argv[0], (std::vector< device,std::allocator< device > >**)(0)); _v = SWIG_CheckState(res); if (_v) { @@ -7135,13 +7531,13 @@ SWIGINTERN PyObject *_wrap_vectordevice___getitem__(PyObject *self, PyObject *ar fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'vectordevice___getitem__'.\n" " Possible C/C++ prototypes are:\n" - " std::vector< device >::__getitem__(PySliceObject *)\n" + " std::vector< device >::__getitem__(SWIGPY_SLICEOBJECT *)\n" " std::vector< device >::__getitem__(std::vector< device >::difference_type) const\n"); return 0; } -SWIGINTERN PyObject *_wrap_vectordevice___setitem____SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_vectordevice___setitem____SWIG_2(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device >::difference_type arg2 ; @@ -7177,7 +7573,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___setitem____SWIG_2(PyObject *SWIGUNUSED try { { SWIG_PYTHON_THREAD_BEGIN_ALLOW; - std_vector_Sl_device_Sg____setitem____SWIG_2(arg1,arg2,(device const &)*arg3); + std_vector_Sl_device_Sg____setitem____SWIG_2(arg1,SWIG_STD_MOVE(arg2),(device const &)*arg3); SWIG_PYTHON_THREAD_END_ALLOW; } } catch(std::out_of_range &_e) { @@ -7192,6 +7588,9 @@ SWIGINTERN PyObject *_wrap_vectordevice___setitem____SWIG_2(PyObject *SWIGUNUSED catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -7215,7 +7614,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___setitem__(PyObject *self, PyObject *ar if (!(argc = SWIG_Python_UnpackTuple(args, "vectordevice___setitem__", 0, 3, argv))) SWIG_fail; --argc; if (argc == 2) { - int _v; + int _v = 0; int res = swig::asptr(argv[0], (std::vector< device,std::allocator< device > >**)(0)); _v = SWIG_CheckState(res); if (_v) { @@ -7228,7 +7627,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___setitem__(PyObject *self, PyObject *ar } } if (argc == 3) { - int _v; + int _v = 0; int res = swig::asptr(argv[0], (std::vector< device,std::allocator< device > >**)(0)); _v = SWIG_CheckState(res); if (_v) { @@ -7245,7 +7644,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___setitem__(PyObject *self, PyObject *ar } } if (argc == 3) { - int _v; + int _v = 0; int res = swig::asptr(argv[0], (std::vector< device,std::allocator< device > >**)(0)); _v = SWIG_CheckState(res); if (_v) { @@ -7266,14 +7665,14 @@ SWIGINTERN PyObject *_wrap_vectordevice___setitem__(PyObject *self, PyObject *ar fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'vectordevice___setitem__'.\n" " Possible C/C++ prototypes are:\n" - " std::vector< device >::__setitem__(PySliceObject *,std::vector< device,std::allocator< device > > const &)\n" - " std::vector< device >::__setitem__(PySliceObject *)\n" + " std::vector< device >::__setitem__(SWIGPY_SLICEOBJECT *,std::vector< device,std::allocator< device > > const &)\n" + " std::vector< device >::__setitem__(SWIGPY_SLICEOBJECT *)\n" " std::vector< device >::__setitem__(std::vector< device >::difference_type,std::vector< device >::value_type const &)\n"); return 0; } -SWIGINTERN PyObject *_wrap_vectordevice_pop(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_pop(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; void *argp1 = 0 ; @@ -7308,6 +7707,9 @@ SWIGINTERN PyObject *_wrap_vectordevice_pop(PyObject *SWIGUNUSEDPARM(self), PyOb catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -7315,14 +7717,14 @@ SWIGINTERN PyObject *_wrap_vectordevice_pop(PyObject *SWIGUNUSEDPARM(self), PyOb SWIG_exception(SWIG_RuntimeError, "Unknown exception"); } } - resultobj = SWIG_NewPointerObj((new std::vector< device >::value_type(static_cast< const std::vector< device >::value_type& >(result))), SWIGTYPE_p_device, SWIG_POINTER_OWN | 0 ); + resultobj = SWIG_NewPointerObj((new std::vector< device >::value_type(result)), SWIGTYPE_p_device, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } -SWIGINTERN PyObject *_wrap_vectordevice_append(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_append(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device >::value_type *arg2 = 0 ; @@ -7362,6 +7764,9 @@ SWIGINTERN PyObject *_wrap_vectordevice_append(PyObject *SWIGUNUSEDPARM(self), P catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -7376,7 +7781,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_append(PyObject *SWIGUNUSEDPARM(self), P } -SWIGINTERN PyObject *_wrap_new_vectordevice__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) { +SWIGINTERN PyObject *_wrap_new_vectordevice__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) { PyObject *resultobj = 0; std::vector< device > *result = 0 ; @@ -7397,6 +7802,9 @@ SWIGINTERN PyObject *_wrap_new_vectordevice__SWIG_0(PyObject *SWIGUNUSEDPARM(sel catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -7411,7 +7819,7 @@ SWIGINTERN PyObject *_wrap_new_vectordevice__SWIG_0(PyObject *SWIGUNUSEDPARM(sel } -SWIGINTERN PyObject *_wrap_new_vectordevice__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_new_vectordevice__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device > *arg1 = 0 ; int res1 = SWIG_OLDOBJ ; @@ -7445,6 +7853,9 @@ SWIGINTERN PyObject *_wrap_new_vectordevice__SWIG_1(PyObject *SWIGUNUSEDPARM(sel catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -7461,7 +7872,7 @@ SWIGINTERN PyObject *_wrap_new_vectordevice__SWIG_1(PyObject *SWIGUNUSEDPARM(sel } -SWIGINTERN PyObject *_wrap_vectordevice_empty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_empty(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; void *argp1 = 0 ; @@ -7492,6 +7903,9 @@ SWIGINTERN PyObject *_wrap_vectordevice_empty(PyObject *SWIGUNUSEDPARM(self), Py catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -7506,7 +7920,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_empty(PyObject *SWIGUNUSEDPARM(self), Py } -SWIGINTERN PyObject *_wrap_vectordevice_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_size(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; void *argp1 = 0 ; @@ -7537,6 +7951,9 @@ SWIGINTERN PyObject *_wrap_vectordevice_size(PyObject *SWIGUNUSEDPARM(self), PyO catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -7551,7 +7968,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_size(PyObject *SWIGUNUSEDPARM(self), PyO } -SWIGINTERN PyObject *_wrap_vectordevice_swap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_swap(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device > *arg2 = 0 ; @@ -7591,6 +8008,9 @@ SWIGINTERN PyObject *_wrap_vectordevice_swap(PyObject *SWIGUNUSEDPARM(self), PyO catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -7605,7 +8025,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_swap(PyObject *SWIGUNUSEDPARM(self), PyO } -SWIGINTERN PyObject *_wrap_vectordevice_begin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_begin(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; void *argp1 = 0 ; @@ -7636,6 +8056,9 @@ SWIGINTERN PyObject *_wrap_vectordevice_begin(PyObject *SWIGUNUSEDPARM(self), Py catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -7651,7 +8074,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_begin(PyObject *SWIGUNUSEDPARM(self), Py } -SWIGINTERN PyObject *_wrap_vectordevice_end(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_end(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; void *argp1 = 0 ; @@ -7682,6 +8105,9 @@ SWIGINTERN PyObject *_wrap_vectordevice_end(PyObject *SWIGUNUSEDPARM(self), PyOb catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -7697,7 +8123,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_end(PyObject *SWIGUNUSEDPARM(self), PyOb } -SWIGINTERN PyObject *_wrap_vectordevice_rbegin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_rbegin(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; void *argp1 = 0 ; @@ -7728,6 +8154,9 @@ SWIGINTERN PyObject *_wrap_vectordevice_rbegin(PyObject *SWIGUNUSEDPARM(self), P catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -7743,7 +8172,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_rbegin(PyObject *SWIGUNUSEDPARM(self), P } -SWIGINTERN PyObject *_wrap_vectordevice_rend(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_rend(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; void *argp1 = 0 ; @@ -7774,6 +8203,9 @@ SWIGINTERN PyObject *_wrap_vectordevice_rend(PyObject *SWIGUNUSEDPARM(self), PyO catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -7789,7 +8221,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_rend(PyObject *SWIGUNUSEDPARM(self), PyO } -SWIGINTERN PyObject *_wrap_vectordevice_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_clear(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; void *argp1 = 0 ; @@ -7819,6 +8251,9 @@ SWIGINTERN PyObject *_wrap_vectordevice_clear(PyObject *SWIGUNUSEDPARM(self), Py catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -7833,7 +8268,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_clear(PyObject *SWIGUNUSEDPARM(self), Py } -SWIGINTERN PyObject *_wrap_vectordevice_get_allocator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_get_allocator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; void *argp1 = 0 ; @@ -7864,6 +8299,9 @@ SWIGINTERN PyObject *_wrap_vectordevice_get_allocator(PyObject *SWIGUNUSEDPARM(s catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -7871,14 +8309,14 @@ SWIGINTERN PyObject *_wrap_vectordevice_get_allocator(PyObject *SWIGUNUSEDPARM(s SWIG_exception(SWIG_RuntimeError, "Unknown exception"); } } - resultobj = SWIG_NewPointerObj((new std::vector< device >::allocator_type(static_cast< const std::vector< device >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_device_t, SWIG_POINTER_OWN | 0 ); + resultobj = SWIG_NewPointerObj((new std::vector< device >::allocator_type(result)), SWIGTYPE_p_std__allocatorT_device_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } -SWIGINTERN PyObject *_wrap_new_vectordevice__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_new_vectordevice__SWIG_2(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device >::size_type arg1 ; size_t val1 ; @@ -7907,6 +8345,9 @@ SWIGINTERN PyObject *_wrap_new_vectordevice__SWIG_2(PyObject *SWIGUNUSEDPARM(sel catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -7921,7 +8362,7 @@ SWIGINTERN PyObject *_wrap_new_vectordevice__SWIG_2(PyObject *SWIGUNUSEDPARM(sel } -SWIGINTERN PyObject *_wrap_vectordevice_pop_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_pop_back(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; void *argp1 = 0 ; @@ -7951,6 +8392,9 @@ SWIGINTERN PyObject *_wrap_vectordevice_pop_back(PyObject *SWIGUNUSEDPARM(self), catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -7965,7 +8409,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_pop_back(PyObject *SWIGUNUSEDPARM(self), } -SWIGINTERN PyObject *_wrap_vectordevice_resize__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_vectordevice_resize__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device >::size_type arg2 ; @@ -8001,6 +8445,9 @@ SWIGINTERN PyObject *_wrap_vectordevice_resize__SWIG_0(PyObject *SWIGUNUSEDPARM( catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -8015,7 +8462,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_resize__SWIG_0(PyObject *SWIGUNUSEDPARM( } -SWIGINTERN PyObject *_wrap_vectordevice_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_vectordevice_erase__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device >::iterator arg2 ; @@ -8046,7 +8493,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(s try { { SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = std_vector_Sl_device_Sg__erase__SWIG_0(arg1,arg2); + result = std_vector_Sl_device_Sg__erase__SWIG_0(arg1,SWIG_STD_MOVE(arg2)); SWIG_PYTHON_THREAD_END_ALLOW; } } catch(const ExploreException& e) { @@ -8058,6 +8505,9 @@ SWIGINTERN PyObject *_wrap_vectordevice_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(s catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -8073,7 +8523,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(s } -SWIGINTERN PyObject *_wrap_vectordevice_erase__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_vectordevice_erase__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device >::iterator arg2 ; @@ -8118,7 +8568,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_erase__SWIG_1(PyObject *SWIGUNUSEDPARM(s try { { SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = std_vector_Sl_device_Sg__erase__SWIG_1(arg1,arg2,arg3); + result = std_vector_Sl_device_Sg__erase__SWIG_1(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); SWIG_PYTHON_THREAD_END_ALLOW; } } catch(const ExploreException& e) { @@ -8130,6 +8580,9 @@ SWIGINTERN PyObject *_wrap_vectordevice_erase__SWIG_1(PyObject *SWIGUNUSEDPARM(s catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -8154,7 +8607,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_erase(PyObject *self, PyObject *args) { if (!(argc = SWIG_Python_UnpackTuple(args, "vectordevice_erase", 0, 3, argv))) SWIG_fail; --argc; if (argc == 2) { - int _v; + int _v = 0; int res = swig::asptr(argv[0], (std::vector< device,std::allocator< device > >**)(0)); _v = SWIG_CheckState(res); if (_v) { @@ -8167,7 +8620,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_erase(PyObject *self, PyObject *args) { } } if (argc == 3) { - int _v; + int _v = 0; int res = swig::asptr(argv[0], (std::vector< device,std::allocator< device > >**)(0)); _v = SWIG_CheckState(res); if (_v) { @@ -8194,7 +8647,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_erase(PyObject *self, PyObject *args) { } -SWIGINTERN PyObject *_wrap_new_vectordevice__SWIG_3(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_new_vectordevice__SWIG_3(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device >::size_type arg1 ; std::vector< device >::value_type *arg2 = 0 ; @@ -8234,6 +8687,9 @@ SWIGINTERN PyObject *_wrap_new_vectordevice__SWIG_3(PyObject *SWIGUNUSEDPARM(sel catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -8260,7 +8716,7 @@ SWIGINTERN PyObject *_wrap_new_vectordevice(PyObject *self, PyObject *args) { return _wrap_new_vectordevice__SWIG_0(self, argc, argv); } if (argc == 1) { - int _v; + int _v = 0; { int res = SWIG_AsVal_size_t(argv[0], NULL); _v = SWIG_CheckState(res); @@ -8270,7 +8726,7 @@ SWIGINTERN PyObject *_wrap_new_vectordevice(PyObject *self, PyObject *args) { } } if (argc == 1) { - int _v; + int _v = 0; int res = swig::asptr(argv[0], (std::vector< device,std::allocator< device > >**)(0)); _v = SWIG_CheckState(res); if (_v) { @@ -8278,7 +8734,7 @@ SWIGINTERN PyObject *_wrap_new_vectordevice(PyObject *self, PyObject *args) { } } if (argc == 2) { - int _v; + int _v = 0; { int res = SWIG_AsVal_size_t(argv[0], NULL); _v = SWIG_CheckState(res); @@ -8303,7 +8759,7 @@ SWIGINTERN PyObject *_wrap_new_vectordevice(PyObject *self, PyObject *args) { } -SWIGINTERN PyObject *_wrap_vectordevice_push_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_push_back(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device >::value_type *arg2 = 0 ; @@ -8343,6 +8799,9 @@ SWIGINTERN PyObject *_wrap_vectordevice_push_back(PyObject *SWIGUNUSEDPARM(self) catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -8357,7 +8816,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_push_back(PyObject *SWIGUNUSEDPARM(self) } -SWIGINTERN PyObject *_wrap_vectordevice_front(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_front(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; void *argp1 = 0 ; @@ -8388,6 +8847,9 @@ SWIGINTERN PyObject *_wrap_vectordevice_front(PyObject *SWIGUNUSEDPARM(self), Py catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -8403,7 +8865,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_front(PyObject *SWIGUNUSEDPARM(self), Py } -SWIGINTERN PyObject *_wrap_vectordevice_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_back(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; void *argp1 = 0 ; @@ -8434,6 +8896,9 @@ SWIGINTERN PyObject *_wrap_vectordevice_back(PyObject *SWIGUNUSEDPARM(self), PyO catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -8449,7 +8914,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_back(PyObject *SWIGUNUSEDPARM(self), PyO } -SWIGINTERN PyObject *_wrap_vectordevice_assign(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_assign(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device >::size_type arg2 ; @@ -8497,6 +8962,9 @@ SWIGINTERN PyObject *_wrap_vectordevice_assign(PyObject *SWIGUNUSEDPARM(self), P catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -8511,7 +8979,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_assign(PyObject *SWIGUNUSEDPARM(self), P } -SWIGINTERN PyObject *_wrap_vectordevice_resize__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_vectordevice_resize__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device >::size_type arg2 ; @@ -8558,6 +9026,9 @@ SWIGINTERN PyObject *_wrap_vectordevice_resize__SWIG_1(PyObject *SWIGUNUSEDPARM( catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -8581,7 +9052,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_resize(PyObject *self, PyObject *args) { if (!(argc = SWIG_Python_UnpackTuple(args, "vectordevice_resize", 0, 3, argv))) SWIG_fail; --argc; if (argc == 2) { - int _v; + int _v = 0; int res = swig::asptr(argv[0], (std::vector< device,std::allocator< device > >**)(0)); _v = SWIG_CheckState(res); if (_v) { @@ -8595,7 +9066,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_resize(PyObject *self, PyObject *args) { } } if (argc == 3) { - int _v; + int _v = 0; int res = swig::asptr(argv[0], (std::vector< device,std::allocator< device > >**)(0)); _v = SWIG_CheckState(res); if (_v) { @@ -8622,7 +9093,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_resize(PyObject *self, PyObject *args) { } -SWIGINTERN PyObject *_wrap_vectordevice_insert__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_vectordevice_insert__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device >::iterator arg2 ; @@ -8664,7 +9135,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_insert__SWIG_0(PyObject *SWIGUNUSEDPARM( try { { SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = std_vector_Sl_device_Sg__insert__SWIG_0(arg1,arg2,(device const &)*arg3); + result = std_vector_Sl_device_Sg__insert__SWIG_0(arg1,SWIG_STD_MOVE(arg2),(device const &)*arg3); SWIG_PYTHON_THREAD_END_ALLOW; } } catch(const ExploreException& e) { @@ -8676,6 +9147,9 @@ SWIGINTERN PyObject *_wrap_vectordevice_insert__SWIG_0(PyObject *SWIGUNUSEDPARM( catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -8691,7 +9165,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_insert__SWIG_0(PyObject *SWIGUNUSEDPARM( } -SWIGINTERN PyObject *_wrap_vectordevice_insert__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_vectordevice_insert__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device >::iterator arg2 ; @@ -8740,7 +9214,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_insert__SWIG_1(PyObject *SWIGUNUSEDPARM( try { { SWIG_PYTHON_THREAD_BEGIN_ALLOW; - std_vector_Sl_device_Sg__insert__SWIG_1(arg1,arg2,arg3,(device const &)*arg4); + std_vector_Sl_device_Sg__insert__SWIG_1(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3),(device const &)*arg4); SWIG_PYTHON_THREAD_END_ALLOW; } } catch(const ExploreException& e) { @@ -8752,6 +9226,9 @@ SWIGINTERN PyObject *_wrap_vectordevice_insert__SWIG_1(PyObject *SWIGUNUSEDPARM( catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -8775,7 +9252,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_insert(PyObject *self, PyObject *args) { if (!(argc = SWIG_Python_UnpackTuple(args, "vectordevice_insert", 0, 4, argv))) SWIG_fail; --argc; if (argc == 3) { - int _v; + int _v = 0; int res = swig::asptr(argv[0], (std::vector< device,std::allocator< device > >**)(0)); _v = SWIG_CheckState(res); if (_v) { @@ -8792,7 +9269,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_insert(PyObject *self, PyObject *args) { } } if (argc == 4) { - int _v; + int _v = 0; int res = swig::asptr(argv[0], (std::vector< device,std::allocator< device > >**)(0)); _v = SWIG_CheckState(res); if (_v) { @@ -8824,7 +9301,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_insert(PyObject *self, PyObject *args) { } -SWIGINTERN PyObject *_wrap_vectordevice_reserve(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_reserve(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device >::size_type arg2 ; @@ -8861,6 +9338,9 @@ SWIGINTERN PyObject *_wrap_vectordevice_reserve(PyObject *SWIGUNUSEDPARM(self), catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -8875,7 +9355,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_reserve(PyObject *SWIGUNUSEDPARM(self), } -SWIGINTERN PyObject *_wrap_vectordevice_capacity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_capacity(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; void *argp1 = 0 ; @@ -8906,6 +9386,9 @@ SWIGINTERN PyObject *_wrap_vectordevice_capacity(PyObject *SWIGUNUSEDPARM(self), catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -8920,7 +9403,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_capacity(PyObject *SWIGUNUSEDPARM(self), } -SWIGINTERN PyObject *_wrap_delete_vectordevice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_delete_vectordevice(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; void *argp1 = 0 ; @@ -8950,6 +9433,9 @@ SWIGINTERN PyObject *_wrap_delete_vectordevice(PyObject *SWIGUNUSEDPARM(self), P catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -8975,7 +9461,7 @@ SWIGINTERN PyObject *vectordevice_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObj return SWIG_Python_InitShadowInstance(args); } -SWIGINTERN PyObject *_wrap_device_address_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_device_address_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; device *arg1 = (device *) 0 ; std::string *arg2 = 0 ; @@ -9015,7 +9501,7 @@ SWIGINTERN PyObject *_wrap_device_address_set(PyObject *SWIGUNUSEDPARM(self), Py } -SWIGINTERN PyObject *_wrap_device_address_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_device_address_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; device *arg1 = (device *) 0 ; void *argp1 = 0 ; @@ -9042,7 +9528,7 @@ SWIGINTERN PyObject *_wrap_device_address_get(PyObject *SWIGUNUSEDPARM(self), Py } -SWIGINTERN PyObject *_wrap_device_name_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_device_name_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; device *arg1 = (device *) 0 ; std::string *arg2 = 0 ; @@ -9082,7 +9568,7 @@ SWIGINTERN PyObject *_wrap_device_name_set(PyObject *SWIGUNUSEDPARM(self), PyObj } -SWIGINTERN PyObject *_wrap_device_name_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_device_name_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; device *arg1 = (device *) 0 ; void *argp1 = 0 ; @@ -9109,7 +9595,7 @@ SWIGINTERN PyObject *_wrap_device_name_get(PyObject *SWIGUNUSEDPARM(self), PyObj } -SWIGINTERN PyObject *_wrap_device_lastSeen_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_device_lastSeen_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; device *arg1 = (device *) 0 ; std::time_t arg2 ; @@ -9150,7 +9636,7 @@ SWIGINTERN PyObject *_wrap_device_lastSeen_set(PyObject *SWIGUNUSEDPARM(self), P } -SWIGINTERN PyObject *_wrap_device_lastSeen_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_device_lastSeen_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; device *arg1 = (device *) 0 ; void *argp1 = 0 ; @@ -9170,14 +9656,14 @@ SWIGINTERN PyObject *_wrap_device_lastSeen_get(PyObject *SWIGUNUSEDPARM(self), P result = ((arg1)->lastSeen); SWIG_PYTHON_THREAD_END_ALLOW; } - resultobj = SWIG_NewPointerObj((new std::time_t(static_cast< const std::time_t& >(result))), SWIGTYPE_p_std__time_t, SWIG_POINTER_OWN | 0 ); + resultobj = SWIG_NewPointerObj((new std::time_t(result)), SWIGTYPE_p_std__time_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } -SWIGINTERN PyObject *_wrap_device_lastUsed_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_device_lastUsed_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; device *arg1 = (device *) 0 ; std::time_t arg2 ; @@ -9218,7 +9704,7 @@ SWIGINTERN PyObject *_wrap_device_lastUsed_set(PyObject *SWIGUNUSEDPARM(self), P } -SWIGINTERN PyObject *_wrap_device_lastUsed_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_device_lastUsed_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; device *arg1 = (device *) 0 ; void *argp1 = 0 ; @@ -9238,14 +9724,14 @@ SWIGINTERN PyObject *_wrap_device_lastUsed_get(PyObject *SWIGUNUSEDPARM(self), P result = ((arg1)->lastUsed); SWIG_PYTHON_THREAD_END_ALLOW; } - resultobj = SWIG_NewPointerObj((new std::time_t(static_cast< const std::time_t& >(result))), SWIGTYPE_p_std__time_t, SWIG_POINTER_OWN | 0 ); + resultobj = SWIG_NewPointerObj((new std::time_t(result)), SWIGTYPE_p_std__time_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } -SWIGINTERN PyObject *_wrap_device_connected_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_device_connected_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; device *arg1 = (device *) 0 ; bool arg2 ; @@ -9278,7 +9764,7 @@ SWIGINTERN PyObject *_wrap_device_connected_set(PyObject *SWIGUNUSEDPARM(self), } -SWIGINTERN PyObject *_wrap_device_connected_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_device_connected_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; device *arg1 = (device *) 0 ; void *argp1 = 0 ; @@ -9305,7 +9791,7 @@ SWIGINTERN PyObject *_wrap_device_connected_get(PyObject *SWIGUNUSEDPARM(self), } -SWIGINTERN PyObject *_wrap_device_remembered_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_device_remembered_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; device *arg1 = (device *) 0 ; bool arg2 ; @@ -9338,7 +9824,7 @@ SWIGINTERN PyObject *_wrap_device_remembered_set(PyObject *SWIGUNUSEDPARM(self), } -SWIGINTERN PyObject *_wrap_device_remembered_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_device_remembered_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; device *arg1 = (device *) 0 ; void *argp1 = 0 ; @@ -9365,7 +9851,7 @@ SWIGINTERN PyObject *_wrap_device_remembered_get(PyObject *SWIGUNUSEDPARM(self), } -SWIGINTERN PyObject *_wrap_device_authenticated_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_device_authenticated_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; device *arg1 = (device *) 0 ; bool arg2 ; @@ -9398,7 +9884,7 @@ SWIGINTERN PyObject *_wrap_device_authenticated_set(PyObject *SWIGUNUSEDPARM(sel } -SWIGINTERN PyObject *_wrap_device_authenticated_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_device_authenticated_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; device *arg1 = (device *) 0 ; void *argp1 = 0 ; @@ -9425,7 +9911,7 @@ SWIGINTERN PyObject *_wrap_device_authenticated_get(PyObject *SWIGUNUSEDPARM(sel } -SWIGINTERN PyObject *_wrap_new_device(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_new_device(PyObject *self, PyObject *args) { PyObject *resultobj = 0; device *result = 0 ; @@ -9446,6 +9932,9 @@ SWIGINTERN PyObject *_wrap_new_device(PyObject *SWIGUNUSEDPARM(self), PyObject * catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -9460,7 +9949,7 @@ SWIGINTERN PyObject *_wrap_new_device(PyObject *SWIGUNUSEDPARM(self), PyObject * } -SWIGINTERN PyObject *_wrap_delete_device(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_delete_device(PyObject *self, PyObject *args) { PyObject *resultobj = 0; device *arg1 = (device *) 0 ; void *argp1 = 0 ; @@ -9490,6 +9979,9 @@ SWIGINTERN PyObject *_wrap_delete_device(PyObject *SWIGUNUSEDPARM(self), PyObjec catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -9515,7 +10007,7 @@ SWIGINTERN PyObject *device_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *a return SWIG_Python_InitShadowInstance(args); } -SWIGINTERN PyObject *_wrap_delete_ExploreSDK(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_delete_ExploreSDK(PyObject *self, PyObject *args) { PyObject *resultobj = 0; ExploreSDK *arg1 = (ExploreSDK *) 0 ; void *argp1 = 0 ; @@ -9545,6 +10037,9 @@ SWIGINTERN PyObject *_wrap_delete_ExploreSDK(PyObject *SWIGUNUSEDPARM(self), PyO catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -9559,7 +10054,7 @@ SWIGINTERN PyObject *_wrap_delete_ExploreSDK(PyObject *SWIGUNUSEDPARM(self), PyO } -SWIGINTERN PyObject *_wrap_ExploreSDK_Create(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_ExploreSDK_Create(PyObject *self, PyObject *args) { PyObject *resultobj = 0; ExploreSDK *result = 0 ; @@ -9580,6 +10075,9 @@ SWIGINTERN PyObject *_wrap_ExploreSDK_Create(PyObject *SWIGUNUSEDPARM(self), PyO catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -9594,7 +10092,7 @@ SWIGINTERN PyObject *_wrap_ExploreSDK_Create(PyObject *SWIGUNUSEDPARM(self), PyO } -SWIGINTERN PyObject *_wrap_ExploreSDK_PerformDeviceSearch__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_ExploreSDK_PerformDeviceSearch__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; ExploreSDK *arg1 = (ExploreSDK *) 0 ; int arg2 ; @@ -9631,6 +10129,9 @@ SWIGINTERN PyObject *_wrap_ExploreSDK_PerformDeviceSearch__SWIG_0(PyObject *SWIG catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -9645,7 +10146,7 @@ SWIGINTERN PyObject *_wrap_ExploreSDK_PerformDeviceSearch__SWIG_0(PyObject *SWIG } -SWIGINTERN PyObject *_wrap_ExploreSDK_PerformDeviceSearch__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_ExploreSDK_PerformDeviceSearch__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; ExploreSDK *arg1 = (ExploreSDK *) 0 ; void *argp1 = 0 ; @@ -9674,6 +10175,9 @@ SWIGINTERN PyObject *_wrap_ExploreSDK_PerformDeviceSearch__SWIG_1(PyObject *SWIG catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -9697,7 +10201,7 @@ SWIGINTERN PyObject *_wrap_ExploreSDK_PerformDeviceSearch(PyObject *self, PyObje if (!(argc = SWIG_Python_UnpackTuple(args, "ExploreSDK_PerformDeviceSearch", 0, 2, argv))) SWIG_fail; --argc; if (argc == 1) { - int _v; + int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ExploreSDK, 0); _v = SWIG_CheckState(res); @@ -9706,7 +10210,7 @@ SWIGINTERN PyObject *_wrap_ExploreSDK_PerformDeviceSearch(PyObject *self, PyObje } } if (argc == 2) { - int _v; + int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ExploreSDK, 0); _v = SWIG_CheckState(res); @@ -9730,7 +10234,7 @@ SWIGINTERN PyObject *_wrap_ExploreSDK_PerformDeviceSearch(PyObject *self, PyObje } -SWIGINTERN PyObject *_wrap_ExploreSDK_SdpSearch(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_ExploreSDK_SdpSearch(PyObject *self, PyObject *args) { PyObject *resultobj = 0; ExploreSDK *arg1 = (ExploreSDK *) 0 ; std::string arg2 ; @@ -9770,6 +10274,9 @@ SWIGINTERN PyObject *_wrap_ExploreSDK_SdpSearch(PyObject *SWIGUNUSEDPARM(self), catch(const ExploreIOException& e) { SWIG_exception(SWIG_IOError, e.what()); } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } catch(const std::exception& e) { SWIG_exception(SWIG_UnknownError, "Standard exception"); } @@ -9792,7 +10299,6 @@ SWIGINTERN PyObject *ExploreSDK_swigregister(PyObject *SWIGUNUSEDPARM(self), PyO } static PyMethodDef SwigMethods[] = { - { "SWIG_PyInstanceMethod_New", SWIG_PyInstanceMethod_New, METH_O, NULL}, { "delete_SwigPyIterator", _wrap_delete_SwigPyIterator, METH_O, NULL}, { "SwigPyIterator_value", _wrap_SwigPyIterator_value, METH_O, NULL}, { "SwigPyIterator_incr", _wrap_SwigPyIterator_incr, METH_VARARGS, NULL}, @@ -9880,10 +10386,6 @@ static PyMethodDef SwigMethods[] = { { NULL, NULL, 0, NULL } }; -static PyMethodDef SwigMethods_proxydocs[] = { - { NULL, NULL, 0, NULL } -}; - /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */ @@ -10016,9 +10518,12 @@ extern "C" { #define SWIGRUNTIME_DEBUG #endif +#ifndef SWIG_INIT_CLIENT_DATA_TYPE +#define SWIG_INIT_CLIENT_DATA_TYPE void * +#endif SWIGRUNTIME void -SWIG_InitializeModule(void *clientdata) { +SWIG_InitializeModule(SWIG_INIT_CLIENT_DATA_TYPE clientdata) { size_t i; swig_module_info *module_head, *iter; int init; @@ -10201,220 +10706,6 @@ SWIG_PropagateClientData(void) { extern "C" { #endif - /* Python-specific SWIG API */ -#define SWIG_newvarlink() SWIG_Python_newvarlink() -#define SWIG_addvarlink(p, name, get_attr, set_attr) SWIG_Python_addvarlink(p, name, get_attr, set_attr) -#define SWIG_InstallConstants(d, constants) SWIG_Python_InstallConstants(d, constants) - - /* ----------------------------------------------------------------------------- - * global variable support code. - * ----------------------------------------------------------------------------- */ - - typedef struct swig_globalvar { - char *name; /* Name of global variable */ - PyObject *(*get_attr)(void); /* Return the current value */ - int (*set_attr)(PyObject *); /* Set the value */ - struct swig_globalvar *next; - } swig_globalvar; - - typedef struct swig_varlinkobject { - PyObject_HEAD - swig_globalvar *vars; - } swig_varlinkobject; - - SWIGINTERN PyObject * - swig_varlink_repr(swig_varlinkobject *SWIGUNUSEDPARM(v)) { -#if PY_VERSION_HEX >= 0x03000000 - return PyUnicode_InternFromString(""); -#else - return PyString_FromString(""); -#endif - } - - SWIGINTERN PyObject * - swig_varlink_str(swig_varlinkobject *v) { -#if PY_VERSION_HEX >= 0x03000000 - PyObject *str = PyUnicode_InternFromString("("); - PyObject *tail; - PyObject *joined; - swig_globalvar *var; - for (var = v->vars; var; var=var->next) { - tail = PyUnicode_FromString(var->name); - joined = PyUnicode_Concat(str, tail); - Py_DecRef(str); - Py_DecRef(tail); - str = joined; - if (var->next) { - tail = PyUnicode_InternFromString(", "); - joined = PyUnicode_Concat(str, tail); - Py_DecRef(str); - Py_DecRef(tail); - str = joined; - } - } - tail = PyUnicode_InternFromString(")"); - joined = PyUnicode_Concat(str, tail); - Py_DecRef(str); - Py_DecRef(tail); - str = joined; -#else - PyObject *str = PyString_FromString("("); - swig_globalvar *var; - for (var = v->vars; var; var=var->next) { - PyString_ConcatAndDel(&str,PyString_FromString(var->name)); - if (var->next) PyString_ConcatAndDel(&str,PyString_FromString(", ")); - } - PyString_ConcatAndDel(&str,PyString_FromString(")")); -#endif - return str; - } - - SWIGINTERN void - swig_varlink_dealloc(swig_varlinkobject *v) { - swig_globalvar *var = v->vars; - while (var) { - swig_globalvar *n = var->next; - free(var->name); - free(var); - var = n; - } - } - - SWIGINTERN PyObject * - swig_varlink_getattr(swig_varlinkobject *v, char *n) { - PyObject *res = NULL; - swig_globalvar *var = v->vars; - while (var) { - if (strcmp(var->name,n) == 0) { - res = (*var->get_attr)(); - break; - } - var = var->next; - } - if (res == NULL && !PyErr_Occurred()) { - PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n); - } - return res; - } - - SWIGINTERN int - swig_varlink_setattr(swig_varlinkobject *v, char *n, PyObject *p) { - int res = 1; - swig_globalvar *var = v->vars; - while (var) { - if (strcmp(var->name,n) == 0) { - res = (*var->set_attr)(p); - break; - } - var = var->next; - } - if (res == 1 && !PyErr_Occurred()) { - PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n); - } - return res; - } - - SWIGINTERN PyTypeObject* - swig_varlink_type(void) { - static char varlink__doc__[] = "Swig var link object"; - static PyTypeObject varlink_type; - static int type_init = 0; - if (!type_init) { - const PyTypeObject tmp = { -#if PY_VERSION_HEX >= 0x03000000 - PyVarObject_HEAD_INIT(NULL, 0) -#else - PyObject_HEAD_INIT(NULL) - 0, /* ob_size */ -#endif - "swigvarlink", /* tp_name */ - sizeof(swig_varlinkobject), /* tp_basicsize */ - 0, /* tp_itemsize */ - (destructor) swig_varlink_dealloc, /* tp_dealloc */ - 0, /* tp_print */ - (getattrfunc) swig_varlink_getattr, /* tp_getattr */ - (setattrfunc) swig_varlink_setattr, /* tp_setattr */ - 0, /* tp_compare */ - (reprfunc) swig_varlink_repr, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - (reprfunc) swig_varlink_str, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - 0, /* tp_flags */ - varlink__doc__, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */ - 0, /* tp_del */ - 0, /* tp_version_tag */ -#if PY_VERSION_HEX >= 0x03040000 - 0, /* tp_finalize */ -#endif -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall */ -#endif -#if (PY_VERSION_HEX >= 0x03080000) && (PY_VERSION_HEX < 0x03090000) - 0, /* tp_print */ -#endif -#ifdef COUNT_ALLOCS - 0, /* tp_allocs */ - 0, /* tp_frees */ - 0, /* tp_maxalloc */ - 0, /* tp_prev */ - 0 /* tp_next */ -#endif - }; - varlink_type = tmp; - type_init = 1; - if (PyType_Ready(&varlink_type) < 0) - return NULL; - } - return &varlink_type; - } - - /* Create a variable linking object for use later */ - SWIGINTERN PyObject * - SWIG_Python_newvarlink(void) { - swig_varlinkobject *result = PyObject_NEW(swig_varlinkobject, swig_varlink_type()); - if (result) { - result->vars = 0; - } - return ((PyObject*) result); - } - - SWIGINTERN void - SWIG_Python_addvarlink(PyObject *p, const char *name, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)) { - swig_varlinkobject *v = (swig_varlinkobject *) p; - swig_globalvar *gv = (swig_globalvar *) malloc(sizeof(swig_globalvar)); - if (gv) { - size_t size = strlen(name)+1; - gv->name = (char *)malloc(size); - if (gv->name) { - memcpy(gv->name, name, size); - gv->get_attr = get_attr; - gv->set_attr = set_attr; - gv->next = v->vars; - } - } - v->vars = gv; - } - - SWIGINTERN PyObject * - SWIG_globals(void) { - static PyObject *globals = 0; - if (!globals) { - globals = SWIG_newvarlink(); - } - return globals; - } - /* ----------------------------------------------------------------------------- * constants/methods manipulation * ----------------------------------------------------------------------------- */ @@ -10443,15 +10734,12 @@ extern "C" { } } - /* -----------------------------------------------------------------------------*/ - /* Fix SwigMethods to carry the callback ptrs when needed */ - /* -----------------------------------------------------------------------------*/ + /* ----------------------------------------------------------------------------- + * Patch %callback methods' docstrings to hold the callback ptrs + * -----------------------------------------------------------------------------*/ SWIGINTERN void - SWIG_Python_FixMethods(PyMethodDef *methods, - swig_const_info *const_table, - swig_type_info **types, - swig_type_info **types_initial) { + SWIG_Python_FixMethods(PyMethodDef *methods, const swig_const_info *const_table, swig_type_info **types, swig_type_info **types_initial) { size_t i; for (i = 0; methods[i].ml_name; ++i) { const char *c = methods[i].ml_doc; @@ -10459,7 +10747,7 @@ extern "C" { c = strstr(c, "swig_ptr: "); if (c) { int j; - swig_const_info *ci = 0; + const swig_const_info *ci = 0; const char *name = c + 10; for (j = 0; const_table[j].type; ++j) { if (strncmp(const_table[j].name, name, @@ -10491,68 +10779,13 @@ extern "C" { } } - /* ----------------------------------------------------------------------------- - * Method creation and docstring support functions - * ----------------------------------------------------------------------------- */ - - /* ----------------------------------------------------------------------------- - * Function to find the method definition with the correct docstring for the - * proxy module as opposed to the low-level API - * ----------------------------------------------------------------------------- */ - - SWIGINTERN PyMethodDef *SWIG_PythonGetProxyDoc(const char *name) { - /* Find the function in the modified method table */ - size_t offset = 0; - int found = 0; - while (SwigMethods_proxydocs[offset].ml_meth != NULL) { - if (strcmp(SwigMethods_proxydocs[offset].ml_name, name) == 0) { - found = 1; - break; - } - offset++; - } - /* Use the copy with the modified docstring if available */ - return found ? &SwigMethods_proxydocs[offset] : NULL; - } - - /* ----------------------------------------------------------------------------- - * Wrapper of PyInstanceMethod_New() used in Python 3 - * It is exported to the generated module, used for -fastproxy - * ----------------------------------------------------------------------------- */ - - SWIGINTERN PyObject *SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *func) { - if (PyCFunction_Check(func)) { - PyCFunctionObject *funcobj = (PyCFunctionObject *)func; - PyMethodDef *ml = SWIG_PythonGetProxyDoc(funcobj->m_ml->ml_name); - if (ml) - func = PyCFunction_NewEx(ml, funcobj->m_self, funcobj->m_module); - } -#if PY_VERSION_HEX >= 0x03000000 - return PyInstanceMethod_New(func); -#else - return PyMethod_New(func, NULL, NULL); -#endif - } - - /* ----------------------------------------------------------------------------- - * Wrapper of PyStaticMethod_New() - * It is exported to the generated module, used for -fastproxy - * ----------------------------------------------------------------------------- */ - - SWIGINTERN PyObject *SWIG_PyStaticMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *func) { - if (PyCFunction_Check(func)) { - PyCFunctionObject *funcobj = (PyCFunctionObject *)func; - PyMethodDef *ml = SWIG_PythonGetProxyDoc(funcobj->m_ml->ml_name); - if (ml) - func = PyCFunction_NewEx(ml, funcobj->m_self, funcobj->m_module); - } - return PyStaticMethod_New(func); - } - #ifdef __cplusplus } #endif + + + /* -----------------------------------------------------------------------------* * Partial Init method * -----------------------------------------------------------------------------*/ diff --git a/setup.py b/setup.py index 66315158..ed3b88c7 100644 --- a/setup.py +++ b/setup.py @@ -32,7 +32,17 @@ def read(*names, **kwargs): return fh.read() -my_req = ['numpy', 'scipy', 'pyedflib', 'click==7.1.2', 'appdirs==1.4.3', 'sentry_sdk==1.19.1', 'mne', 'eeglabio', 'pandas'] # noqa: E501 +my_req = ['numpy', + 'scipy', + 'pyedflib', + 'click==7.1.2', + 'appdirs==1.4.3', + 'sentry_sdk==1.19.1', + 'mne', + 'eeglabio', + 'pandas', + 'pyserial', + 'pyyaml'] # noqa: E501 test_requirements = ["pytest==6.2.5", "pytest-mock==3.10.0", "pytest-html==3.2.0", @@ -45,8 +55,6 @@ def read(*names, **kwargs): if not os.environ.get('READTHEDOCS'): my_req.append('pylsl') - my_req.append('Jinja2==3.0.0') - my_req.append('bokeh==2.2.3') libPath = "lib" if current_platform == 'win32' or current_platform == 'win64': windows_lib_path = os.path.join(libPath, 'windows') diff --git a/src/explorepy/__init__.py b/src/explorepy/__init__.py index bcb25135..8220a562 100644 --- a/src/explorepy/__init__.py +++ b/src/explorepy/__init__.py @@ -17,16 +17,18 @@ exploresdk, tools ) -from .dashboard.dashboard import Dashboard # noqa from .explore import Explore # noqa -__all__ = ["Explore", "Dashboard", "command", "exploresdk", "tools", "log_config"] +__all__ = ["Explore", "command", "exploresdk", "tools", "log_config"] __version__ = '1.8.2' this = sys.modules[__name__] -this._bt_interface = 'sdk' -list_sdk = ['sdk', 'mock'] +list_sdk = ['sdk', 'mock', 'pyserial'] +if sys.platform == 'darwin': + this._bt_interface = 'pyserial' +else: + this._bt_interface = 'sdk' if not sys.version_info >= (3, 6): raise EnvironmentError("Explorepy requires python versions 3.6 or newer!") diff --git a/src/explorepy/cli.py b/src/explorepy/cli.py index 55bd4fe7..b616c746 100644 --- a/src/explorepy/cli.py +++ b/src/explorepy/cli.py @@ -52,6 +52,7 @@ def wrapper(ctx, *args, **kwargs): logger.warning("Invalid device mac address! Please check the MAC address and try again.") sys.exit() return ctx.invoke(func, *args, **kwargs) + return update_wrapper(wrapper, func) @@ -124,31 +125,6 @@ def bin2edf(filename, overwrite): explore.convert_bin(bin_file=filename, do_overwrite=overwrite, file_type='edf') -@cli.command() -@click.option("--address", "-a", type=str, help="Explore device's MAC address") -@click.option("--name", "-n", type=str, help="Name of the device") -@click.option("-nf", "--notchfreq", type=click.Choice(['50', '60']), help="Frequency of notch filter.", default='50') -@click.option("-lf", "--lowfreq", type=float, help="Low cutoff frequency of bandpass/highpass filter.") -@click.option("-hf", "--highfreq", type=float, help="High cutoff frequency of bandpass/lowpass filter.") -@verify_inputs -def visualize(address, name, notchfreq, lowfreq, highfreq): - """Visualizing signal in a browser-based dashboard""" - explore = explorepy.explore.Explore() - explore.connect(mac_address=address, device_name=name) - explore.visualize(notch_freq=int(notchfreq), bp_freq=(lowfreq, highfreq)) - - -@cli.command() -@click.option("--address", "-a", type=str, help="Explore device's MAC address") -@click.option("--name", "-n", type=str, help="Name of the device") -@verify_inputs -def impedance(address, name): - """Impedance measurement in a browser-based dashboard""" - explore = explorepy.explore.Explore() - explore.connect(mac_address=address, device_name=name) - explore.measure_imp() - - @cli.command() @click.option("--address", "-a", type=str, help="Explore device's MAC address") @click.option("--name", "-n", type=str, help="Name of the device") diff --git a/src/explorepy/dashboard/__init__.py b/src/explorepy/dashboard/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/src/explorepy/dashboard/dashboard.py b/src/explorepy/dashboard/dashboard.py deleted file mode 100644 index c736fccc..00000000 --- a/src/explorepy/dashboard/dashboard.py +++ /dev/null @@ -1,761 +0,0 @@ -# -*- coding: utf-8 -*- -"""Dashboard module""" -import logging -import os -from datetime import datetime -from functools import partial - -import numpy as np -from bokeh.core.property.validation import ( - validate, - without_property_validation -) -from bokeh.layouts import ( - Spacer, - column, - row, - widgetbox -) -from bokeh.models import ( - BoxZoomTool, - Button, - CheckboxGroup, - ColumnDataSource, - Div, - Panel, - RadioGroup, - ResetTool, - SingleIntervalTicker, - Tabs, - TextInput, - Toggle, - widgets -) -from bokeh.palettes import Category20 -from bokeh.plotting import figure -from bokeh.server.server import Server -from bokeh.themes import Theme -from bokeh.transform import dodge -from jinja2 import Template -from scipy.ndimage import gaussian_filter1d -from tornado import gen - -from explorepy.stream_processor import TOPICS -from explorepy.tools import ( - HeartRateEstimator, - find_free_port -) - - -logger = logging.getLogger(__name__) -ORN_SRATE = 20 # Hz -EXG_VIS_SRATE = 125 -WIN_LENGTH = 10 # Seconds -MODE_LIST = ['EEG', 'ECG'] -CHAN_LIST = ['Ch1', 'Ch2', 'Ch3', 'Ch4', 'Ch5', 'Ch6', 'Ch7', 'Ch8'] -DEFAULT_SCALE = 10 ** 3 # Volt -BATTERY_N_MOVING_AVERAGE = 60 -V_TH = [10, 5 * 10 ** 3] # Noise threshold for ECG (microVolt) -ORN_LIST = ['accX', 'accY', 'accZ', 'gyroX', 'gyroY', 'gyroZ', 'magX', 'magY', 'magZ'] - -SCALE_MENU = {"1 uV": 0, "5 uV": -0.66667, "10 uV": -1, "100 uV": -2, "200 uV": -2.33333, "500 uV": -2.66667, - "1 mV": -3, "5 mV": -3.66667, "10 mV": -4, "100 mV": -5} -TIME_RANGE_MENU = {"10 s": 10., "5 s": 5., "20 s": 20.} - -LINE_COLORS = ['green', '#42C4F7', 'red'] -FFT_COLORS = Category20[8] - - -class Dashboard: - """Explorepy dashboard class""" - - def __init__(self, explore=None, mode='signal'): - """ - Args: - stream_processor (explorepy.stream_processor.StreamProcessor): Stream processor object - """ - logger.debug(f"Initializing dashboard in {mode} mode") - self.explore = explore - self.stream_processor = self.explore.stream_processor - self.n_chan = self.stream_processor.device_info['adc_mask'].count(1) - self.y_unit = DEFAULT_SCALE - self.offsets = np.arange(1, self.n_chan + 1)[:, np.newaxis].astype(float) - self.chan_key_list = [CHAN_LIST[i] - for i, mask in enumerate(reversed(self.stream_processor.device_info['adc_mask'])) if - mask == 1] - self.exg_mode = 'EEG' - self.rr_estimator = None - self.win_length = WIN_LENGTH - self.mode = mode - self.exg_fs = self.stream_processor.device_info['sampling_rate'] - self._vis_time_offset = None - self._baseline_corrector = {"MA_length": 1.5 * EXG_VIS_SRATE, - "baseline": 0} - - # Init ExG data source - exg_temp = np.zeros((self.n_chan, 2)) - exg_temp[:, 0] = self.offsets[:, 0] - exg_temp[:, 1] = np.nan - init_data = dict(zip(self.chan_key_list, exg_temp)) - self._exg_source_orig = ColumnDataSource(data=init_data) - init_data['t'] = np.array([0., 0.]) - self._exg_source_ds = ColumnDataSource(data=init_data) # Downsampled ExG data for visualization purposes - - # Init ECG R-peak source - init_data = dict(zip(['r_peak', 't'], [np.array([None], dtype=np.double), np.array([None], dtype=np.double)])) - self._r_peak_source = ColumnDataSource(data=init_data) - - # Init marker source - init_data = dict(zip(['marker', 't'], [np.array([None], dtype=np.double), np.array([None], dtype=np.double)])) - self._marker_source = ColumnDataSource(data=init_data) - - # Init ORN data source - init_data = dict(zip(ORN_LIST, np.zeros((9, 1)))) - init_data['t'] = [0.] - self._orn_source = ColumnDataSource(data=init_data) - - # Init table sources - self._heart_rate_source = ColumnDataSource(data={'heart_rate': ['NA']}) - self._firmware_source = ColumnDataSource( - data={'firmware_version': [self.stream_processor.device_info['firmware_version']]} - ) - self._battery_source = ColumnDataSource(data={'battery': ['NA']}) - self.temperature_source = ColumnDataSource(data={'temperature': ['NA']}) - self.light_source = ColumnDataSource(data={'light': ['NA']}) - self.battery_percent_list = [] - self.server = None - - # Init fft data source - init_data = dict(zip(self.chan_key_list, np.zeros((self.n_chan, 1)))) - init_data['f'] = np.array([0.]) - self.fft_source = ColumnDataSource(data=init_data) - - # Init impedance measurement source - init_data = {'channel': self.chan_key_list, - 'impedance': ['NA' for i in range(self.n_chan)], - 'row': ['1' for i in range(self.n_chan)], - 'color': ['black' for i in range(self.n_chan)]} - self.imp_source = ColumnDataSource(data=init_data) - - # Init timer source - self._timer_source = ColumnDataSource(data={'timer': ['00:00:00']}) - - def start_server(self): - """Start bokeh server""" - validate(False) - logger.debug("Starting bokeh server...") - port_number = find_free_port() - logger.info("Opening the dashboard on port: %i", port_number) - self.server = Server({'/': self._init_doc}, num_procs=1, port=port_number) - self.server.start() - - def start_loop(self): - """Start io loop and show the dashboard""" - logger.debug("Starting bokeh io_loop...") - self.server.io_loop.add_callback(self.server.show, "/") - try: - self.server.io_loop.start() - except KeyboardInterrupt: - if self.mode == 'signal': - logger.info("Got Keyboard Interrupt. The program exits ...") - self.explore.stop_lsl() - self.explore.stop_recording() - os._exit(0) - else: - logger.info("Got Keyboard Interrupt. The program exits after disabling the impedance mode ...") - raise KeyboardInterrupt - - def exg_callback(self, packet): - """ - Update ExG data in the visualization - - Args: - packet (explorepy.packet.EEG): Received ExG packet - - """ - time_vector, exg = packet.get_data(self.exg_fs) - if self._vis_time_offset is None: - self._vis_time_offset = time_vector[0] - time_vector -= self._vis_time_offset - self._exg_source_orig.stream(dict(zip(self.chan_key_list, exg)), rollover=int(self.exg_fs * self.win_length)) - - if self.mode == 'signal': - # Downsampling - exg = exg[:, ::int(self.exg_fs / EXG_VIS_SRATE)] - time_vector = time_vector[::int(self.exg_fs / EXG_VIS_SRATE)] - - # Baseline correction - if self.baseline_widget.active: - samples_avg = exg.mean(axis=1) - baseline = self._baseline_corrector["baseline"] - ma_len = self._baseline_corrector["MA_length"] - if baseline is None: - self._baseline_corrector["baseline"] = samples_avg - else: - self._baseline_corrector["baseline"] -= ((baseline - samples_avg) / ma_len * exg.shape[1]) - exg -= self._baseline_corrector["baseline"][:, np.newaxis] - else: - self._baseline_corrector["baseline"] = None - - # Update ExG unit - exg = self.offsets + exg / self.y_unit - new_data = dict(zip(self.chan_key_list, exg)) - new_data['t'] = time_vector - self.doc.add_next_tick_callback(partial(self._update_exg, new_data=new_data)) - - def orn_callback(self, packet): - """Update orientation data - - Args: - packet (explorepy.packet.Orientation): Orientation packet - """ - if self.tabs.active != 1: - return - timestamp, orn_data = packet.get_data() - if self._vis_time_offset is None: - self._vis_time_offset = timestamp[0] - timestamp -= self._vis_time_offset - new_data = dict(zip(ORN_LIST, np.array(orn_data)[:, np.newaxis])) - new_data['t'] = timestamp - self.doc.add_next_tick_callback(partial(self._update_orn, new_data=new_data)) - - def info_callback(self, packet): - """Update device information in the dashboard - - Args: - packet (explorepy.packet.Environment): Environment/DeviceInfo packet - - """ - new_info = packet.get_data() - for key in new_info.keys(): - data = {key: new_info[key]} - if key == 'firmware_version': - self.doc.add_next_tick_callback(partial(self._update_fw_version, new_data=data)) - elif key == 'battery': - self.battery_percent_list.append(new_info[key][0]) - if len(self.battery_percent_list) > BATTERY_N_MOVING_AVERAGE: - del self.battery_percent_list[0] - value = int(np.mean(self.battery_percent_list) / 5) * 5 - if value < 1: - value = 1 - self.doc.add_next_tick_callback(partial(self._update_battery, new_data={key: [value]})) - elif key == 'temperature': - self.doc.add_next_tick_callback(partial(self._update_temperature, new_data=data)) - elif key == 'light': - data[key] = [int(data[key][0])] - self.doc.add_next_tick_callback(partial(self._update_light, new_data=data)) - else: - logger.warning("There is no field named: " + key) - - def marker_callback(self, packet): - """Update markers - Args: - packet (explorepy.packet.EventMarker): Event marker packet - """ - if self.mode == "impedance": - return - timestamp, _ = packet.get_data() - if self._vis_time_offset is None: - self._vis_time_offset = timestamp[0] - timestamp -= self._vis_time_offset - new_data = dict(zip(['marker', 't', 'code'], [np.array([0.01, self.n_chan + 0.99, None], dtype=np.double), - np.array([timestamp[0], timestamp[0], None], dtype=np.double)])) - self.doc.add_next_tick_callback(partial(self._update_marker, new_data=new_data)) - - def impedance_callback(self, packet): - """Update impedances - - Args: - packet (explorepy.packet.EEG): ExG packet - """ - if self.mode == "impedance": - imp = packet.get_impedances() / 2 - color = [] - imp_status = [] - for value in imp: - if value > 250: - color.append("black") - imp_status.append("Open") - elif value > 50: - color.append("black") - imp_status.append(str(round(value, 0)) + " K\u03A9") - elif value > 30: - color.append("red") - imp_status.append(str(round(value, 0)) + " K\u03A9") - elif value > 20: - color.append("orange") - imp_status.append(str(round(value, 0)) + " K\u03A9") - elif value > 10: - color.append("yellow") - imp_status.append(str(round(value, 0)) + " K\u03A9") - elif value > 5: - imp_status.append(str(round(value, 0)) + " K\u03A9") - color.append("green") - else: - color.append("green") - imp_status.append("<5K\u03A9") # As the ADS is not precise in low values. - - data = {"impedance": imp_status, - 'channel': self.chan_key_list, - 'row': ['1' for i in range(self.n_chan)], - 'color': color - } - self.doc.add_next_tick_callback(partial(self._update_imp, new_data=data)) - else: - raise RuntimeError("Trying to compute impedances while the dashboard is not in Impedance mode!") - - @gen.coroutine - @without_property_validation - def _update_exg(self, new_data): - self._exg_source_ds.stream(new_data, rollover=int(2 * EXG_VIS_SRATE * WIN_LENGTH)) - - @gen.coroutine - @without_property_validation - def _update_orn(self, new_data): - self._orn_source.stream(new_data, rollover=int(2 * WIN_LENGTH * ORN_SRATE)) - - @gen.coroutine - @without_property_validation - def _update_fw_version(self, new_data): - self._firmware_source.stream(new_data, rollover=1) - - @gen.coroutine - @without_property_validation - def _update_battery(self, new_data): - self._battery_source.stream(new_data, rollover=1) - - @gen.coroutine - @without_property_validation - def _update_temperature(self, new_data): - self.temperature_source.stream(new_data, rollover=1) - - @gen.coroutine - @without_property_validation - def _update_light(self, new_data): - self.light_source.stream(new_data, rollover=1) - - @gen.coroutine - @without_property_validation - def _update_marker(self, new_data): - self._marker_source.stream(new_data=new_data, rollover=100) - - @gen.coroutine - @without_property_validation - def _update_imp(self, new_data): - self.imp_source.stream(new_data, rollover=self.n_chan) - - @gen.coroutine - @without_property_validation - def _update_fft(self): - """ Update spectral frequency analysis plot""" - # Check if the tab is active and if EEG mode is active - if (self.tabs.active != 2) or (self.exg_mode != 'EEG'): - return - - exg_data = np.array([self._exg_source_orig.data[key] for key in self.chan_key_list]) - - if exg_data.shape[1] < self.exg_fs * 5: - return - fft_content, freq = get_fft(exg_data, self.exg_fs) - data = dict(zip(self.chan_key_list, fft_content)) - data['f'] = freq - self.fft_source.data = data - - @gen.coroutine - @without_property_validation - def _update_heart_rate(self): - """Detect R-peaks and update the plot and heart rate""" - if self.exg_mode == 'EEG': - self._heart_rate_source.stream({'heart_rate': ['NA']}, rollover=1) - return - if CHAN_LIST[0] not in self.chan_key_list: - logger.warning('Heart rate estimation works only when channel 1 is enabled.') - return - if self.rr_estimator is None: - self.rr_estimator = HeartRateEstimator(fs=self.exg_fs) - # Init R-peaks plot - self.exg_plot.circle(x='t', y='r_peak', source=self._r_peak_source, - fill_color="red", size=8) - - ecg_data = (np.array(self._exg_source_ds.data['Ch1'])[-2 * EXG_VIS_SRATE:] - self.offsets[0]) * self.y_unit - time_vector = np.array(self._exg_source_ds.data['t'])[-2 * EXG_VIS_SRATE:] - - # Check if the peak2peak value is bigger than threshold - if (np.ptp(ecg_data) < V_TH[0]) or (np.ptp(ecg_data) > V_TH[1]): - logger.warning("P2P value larger or less than threshold. Cannot compute heart rate!") - return - - peaks_time, peaks_val = self.rr_estimator.estimate(ecg_data, time_vector) - peaks_val = (np.array(peaks_val) / self.y_unit) + self.offsets[0] - if peaks_time: - data = dict(zip(['r_peak', 't'], [peaks_val, peaks_time])) - self._r_peak_source.stream(data, rollover=50) - - # Update heart rate cell - estimated_heart_rate = self.rr_estimator.heart_rate - data = {'heart_rate': [estimated_heart_rate]} - self._heart_rate_source.stream(data, rollover=1) - - @gen.coroutine - @without_property_validation - def _change_scale(self, attr, old, new): - """Change y-scale of ExG plot""" - logger.debug(f"ExG scale has been changed from {old} to {new}") - new, old = SCALE_MENU[new], SCALE_MENU[old] - old_unit = 10 ** (-old) - self.y_unit = 10 ** (-new) - - for chan, value in self._exg_source_ds.data.items(): - if chan in self.chan_key_list: - temp_offset = self.offsets[self.chan_key_list.index(chan)] - self._exg_source_ds.data[chan] = (value - temp_offset) * (old_unit / self.y_unit) + temp_offset - self._r_peak_source.data['r_peak'] = (np.array(self._r_peak_source.data['r_peak']) - self.offsets[0]) * \ - (old_unit / self.y_unit) + self.offsets[0] - - @gen.coroutine - @without_property_validation - def _change_t_range(self, attr, old, new): - """Change time range""" - logger.debug(f"Time scale has been changed from {old} to {new}") - self._set_t_range(TIME_RANGE_MENU[new]) - - @gen.coroutine - def _change_mode(self, attr, old, new): - """Set EEG or ECG mode""" - logger.debug(f"ExG mode has been changed to {new}") - self.exg_mode = new - - def _init_doc(self, doc): - self.doc = doc - self.doc.title = "Explore Dashboard" - with open(os.path.join(os.path.dirname(__file__), 'templates', 'index.html')) as f: - index_template = Template(f.read()) - doc.template = index_template - self.doc.theme = Theme(os.path.join(os.path.dirname(__file__), 'theme.yaml')) - self._init_plots() - m_widgetbox = self._init_controls() - - # Create tabs - if self.mode == "signal": - exg_tab = Panel(child=self.exg_plot, title="ExG Signal") - orn_tab = Panel(child=column([self.acc_plot, self.gyro_plot, self.mag_plot], sizing_mode='scale_width'), - title="Orientation") - fft_tab = Panel(child=self.fft_plot, title="Spectral analysis") - self.tabs = Tabs(tabs=[exg_tab, orn_tab, fft_tab], width=400, sizing_mode='scale_width') - self.recorder_widget = self._init_recorder() - self.push2lsl_widget = self._init_push2lsl() - self.set_marker_widget = self._init_set_marker() - self.baseline_widget = CheckboxGroup(labels=['Baseline correction'], active=[0]) - - elif self.mode == "impedance": - imp_tab = Panel(child=self.imp_plot, title="Impedance") - self.tabs = Tabs(tabs=[imp_tab], width=500, sizing_mode='scale_width') - banner = Div(text=""" Mentalab""", - width=1500, height=50, css_classes=["banner"], align='center', sizing_mode="stretch_width") - heading = Div(text=""" """, height=2, sizing_mode="stretch_width") - if self.mode == 'signal': - layout = column([heading, - banner, - row(m_widgetbox, - Spacer(width=10, height=300), - self.tabs, - Spacer(width=10, height=300), - column(Spacer(width=170, height=50), self.baseline_widget, self.recorder_widget, - self.set_marker_widget, self.push2lsl_widget), - Spacer(width=50, height=300)), - ], - sizing_mode="stretch_both") - - elif self.mode == 'impedance': - layout = column(banner, - Spacer(width=600, height=20), - row([m_widgetbox, Spacer(width=25, height=500), self.tabs]) - ) - self.doc.add_root(layout) - self.doc.add_periodic_callback(self._update_fft, 2000) - self.doc.add_periodic_callback(self._update_heart_rate, 2000) - if self.stream_processor: - self.stream_processor.subscribe(topic=TOPICS.filtered_ExG, callback=self.exg_callback) - self.stream_processor.subscribe(topic=TOPICS.raw_orn, callback=self.orn_callback) - self.stream_processor.subscribe(topic=TOPICS.device_info, callback=self.info_callback) - self.stream_processor.subscribe(topic=TOPICS.marker, callback=self.marker_callback) - self.stream_processor.subscribe(topic=TOPICS.env, callback=self.info_callback) - self.stream_processor.subscribe(topic=TOPICS.imp, callback=self.impedance_callback) - - def _init_plots(self): - """Initialize all plots in the dashboard""" - self.exg_plot = figure(y_range=(0.01, self.n_chan + 1 - 0.01), y_axis_label='Voltage', x_axis_label='Time (s)', - title="ExG signal", - plot_height=250, plot_width=500, - y_minor_ticks=int(10), - tools=[ResetTool()], active_scroll=None, active_drag=None, - active_inspect=None, active_tap=None, sizing_mode="scale_width") - - self.mag_plot = figure(y_axis_label='Mag [mgauss/LSB]', x_axis_label='Time (s)', - plot_height=100, plot_width=500, - tools=[ResetTool()], active_scroll=None, active_drag=None, - active_inspect=None, active_tap=None, sizing_mode="scale_width") - self.acc_plot = figure(y_axis_label='Acc [mg/LSB]', - plot_height=75, plot_width=500, - tools=[ResetTool()], active_scroll=None, active_drag=None, - active_inspect=None, active_tap=None, sizing_mode="scale_width") - self.acc_plot.xaxis.visible = False - self.gyro_plot = figure(y_axis_label='Gyro [mdps/LSB]', - plot_height=75, plot_width=500, - tools=[ResetTool()], active_scroll=None, active_drag=None, - active_inspect=None, active_tap=None, sizing_mode="scale_width") - self.gyro_plot.xaxis.visible = False - - self.fft_plot = figure(y_axis_label='Amplitude (uV)', x_axis_label='Frequency (Hz)', title="FFT", - x_range=(0, 70), plot_height=250, plot_width=500, y_axis_type="log", - tools=[BoxZoomTool(), ResetTool()], active_scroll=None, active_drag=None, - active_tap=None, - sizing_mode="scale_width") - - self.imp_plot = self._init_imp_plot() - - # Set yaxis properties - self.exg_plot.yaxis.ticker = SingleIntervalTicker(interval=1, num_minor_ticks=0) - - # Initial plot line - for i in range(self.n_chan): - self.exg_plot.line(x='t', y=self.chan_key_list[i], source=self._exg_source_ds, - line_width=1.0, alpha=.9, line_color="#42C4F7") - self.fft_plot.line(x='f', y=self.chan_key_list[i], source=self.fft_source, - legend_label=self.chan_key_list[i] + " ", - line_width=1.5, alpha=.9, line_color=FFT_COLORS[i]) - self.fft_plot.yaxis.axis_label_text_font_style = 'normal' - self.exg_plot.line(x='t', y='marker', source=self._marker_source, - line_width=1, alpha=.8, line_color='#7AB904', line_dash="4 4") - - for i in range(3): - self.acc_plot.line(x='t', y=ORN_LIST[i], source=self._orn_source, legend_label=ORN_LIST[i] + " ", - line_width=1.5, line_color=LINE_COLORS[i], alpha=.9) - self.gyro_plot.line(x='t', y=ORN_LIST[i + 3], source=self._orn_source, legend_label=ORN_LIST[i + 3] + " ", - line_width=1.5, line_color=LINE_COLORS[i], alpha=.9) - self.mag_plot.line(x='t', y=ORN_LIST[i + 6], source=self._orn_source, legend_label=ORN_LIST[i + 6] + " ", - line_width=1.5, line_color=LINE_COLORS[i], alpha=.9) - - # Set x_range - self.plot_list = [self.exg_plot, self.acc_plot, self.gyro_plot, self.mag_plot] - self._set_t_range(WIN_LENGTH) - - # Set the formatting of yaxis ticks' labels - self.exg_plot.yaxis.major_label_overrides = dict(zip(range(1, self.n_chan + 1), self.chan_key_list)) - for plot in self.plot_list: - plot.toolbar.autohide = True - plot.yaxis.axis_label_text_font_style = 'normal' - if len(plot.legend) != 0: - plot.legend.location = "bottom_left" - plot.legend.orientation = "horizontal" - plot.legend.padding = 2 - - def _init_imp_plot(self): - plot = figure(plot_width=600, plot_height=200, x_range=self.chan_key_list[0:self.n_chan], - y_range=[str(1)], toolbar_location=None, sizing_mode="scale_width") - - plot.circle(x='channel', y="row", size=50, source=self.imp_source, fill_alpha=0.6, color="color", - line_color='color', line_width=2) - - text_props = {"source": self.imp_source, "text_align": "center", - "text_color": "white", "text_baseline": "middle", "text_font": "helvetica", - "text_font_style": "bold"} - - x = dodge("channel", -0.1, range=plot.x_range) - - plot.text(x=x, y=dodge('row', -.35, range=plot.y_range), - text="impedance", **text_props).glyph.text_font_size = "10pt" - plot.text(x=x, y=dodge('row', -.25, range=plot.y_range), text="channel", - **text_props).glyph.text_font_size = "12pt" - - plot.outline_line_color = None - plot.grid.grid_line_color = None - plot.axis.axis_line_color = None - plot.axis.major_tick_line_color = None - plot.axis.major_label_standoff = 0 - plot.axis.visible = False - return plot - - def _init_controls(self): - """Initialize all controls in the dashboard""" - # EEG/ECG Radio button - self.mode_control = widgets.Select(title="Signal", value='EEG', options=MODE_LIST, width=170, height=50) - self.mode_control.on_change('value', self._change_mode) - - self.t_range = widgets.Select(title="Time window", value="10 s", options=list(TIME_RANGE_MENU.keys()), - width=170, height=50) - self.t_range.on_change('value', self._change_t_range) - self.y_scale = widgets.Select(title="Y-axis Scale", value="1 mV", options=list(SCALE_MENU.keys()), - width=170, height=50) - self.y_scale.on_change('value', self._change_scale) - - # Create device info tables - columns = [widgets.TableColumn(field='heart_rate', title="Heart Rate (bpm)")] - self.heart_rate = widgets.DataTable(source=self._heart_rate_source, index_position=None, sortable=False, - reorderable=False, - columns=columns, width=170, height=50) - - columns = [widgets.TableColumn(field='firmware_version', title="Firmware Version")] - self.firmware = widgets.DataTable(source=self._firmware_source, index_position=None, sortable=False, - reorderable=False, - columns=columns, width=170, height=50) - - columns = [widgets.TableColumn(field='battery', title="Battery (%)")] - self.battery = widgets.DataTable(source=self._battery_source, index_position=None, sortable=False, - reorderable=False, - columns=columns, width=170, height=50) - - columns = [widgets.TableColumn(field='temperature', title="Device temperature (C)")] - self.temperature = widgets.DataTable(source=self.temperature_source, index_position=None, sortable=False, - reorderable=False, columns=columns, width=170, height=50) - - columns = [widgets.TableColumn(field='light', title="Light (Lux)")] - self.light = widgets.DataTable(source=self.light_source, index_position=None, sortable=False, reorderable=False, - columns=columns, width=170, height=50) - if self.mode == 'signal': - widget_list = [Spacer(width=170, height=30), self.mode_control, self.y_scale, self.t_range, self.heart_rate, - self.battery, self.temperature, self.firmware] - elif self.mode == 'impedance': - widget_list = [Spacer(width=170, height=40), self.battery, self.temperature, self.firmware] - - widget_box = widgetbox(widget_list, width=175, height=450, sizing_mode='fixed') - return widget_box - - def _init_recorder(self): - self.rec_button = Toggle(label=u"\u25CF Record", button_type="default", active=False, - width=170, height=35) - self.file_name_widget = TextInput(value="test_file", title="File name:", width=170, height=50) - self.file_type_widget = RadioGroup(labels=["EDF (BDF+)", "CSV"], active=0, width=170, height=50) - - columns = [widgets.TableColumn(field='timer', title="Record time", - formatter=widgets.StringFormatter(text_align='center'))] - self.timer = widgets.DataTable(source=self._timer_source, index_position=None, sortable=False, - reorderable=False, - header_row=False, columns=columns, - width=170, height=50, css_classes=["timer_widget"]) - - self.rec_button.on_click(self._toggle_rec) - return column([Spacer(width=170, height=5), self.file_name_widget, self.file_type_widget, self.rec_button, - self.timer], width=170, height=200, sizing_mode='fixed') - - def _toggle_rec(self, active): - logger.debug(f"Pressed record button -> {active}") - if active: - self.event_code_input.disabled = False - self.marker_button.disabled = False - if self.explore.is_connected: - self.explore.record_data(file_name=self.file_name_widget.value, - file_type=['edf', 'csv'][self.file_type_widget.active], - do_overwrite=True) - self.rec_button.label = u"\u25A0 Stop" - self.rec_start_time = datetime.now() - self.rec_timer_id = self.doc.add_periodic_callback(self._timer_callback, 1000) - else: - self.rec_button.active = False - self.doc.remove_periodic_callback(self.rec_timer_id) - self.doc.add_next_tick_callback(partial(self._update_rec_timer, new_data={'timer': '00:00:00'})) - else: - self.explore.stop_recording() - self.rec_button.label = u"\u25CF Record" - self.doc.add_next_tick_callback(partial(self._update_rec_timer, new_data={'timer': '00:00:00'})) - self.doc.remove_periodic_callback(self.rec_timer_id) - if not self.push2lsl_button.active: - self.event_code_input.disabled = True - self.marker_button.disabled = True - - def _timer_callback(self): - t_delta = (datetime.now() - self.rec_start_time).seconds - timer_text = ':'.join([str(int(t_delta / 3600)).zfill(2), str(int(t_delta / 60) % 60).zfill(2), - str(int(t_delta % 60)).zfill(2)]) - data = {'timer': timer_text} - self.doc.add_next_tick_callback(partial(self._update_rec_timer, new_data=data)) - - def _init_push2lsl(self): - push2lsl_title = Div(text="""Push to LSL""", width=170, height=10) - self.push2lsl_button = Toggle(label=u"\u25CF Start", button_type="default", active=False, - width=170, height=35) - self.push2lsl_button.on_click(self._toggle_push2lsl) - return column([Spacer(width=170, height=30), push2lsl_title, self.push2lsl_button], - width=170, height=200, sizing_mode='fixed') - - def _toggle_push2lsl(self, active): - logger.debug(f"Pressed push2lsl button -> {active}") - if active: - self.event_code_input.disabled = False - self.marker_button.disabled = False - if self.explore.is_connected: - self.explore.push2lsl() - self.push2lsl_button.label = u"\u25A0 Stop" - else: - self.push2lsl_button.active = False - else: - self.explore.stop_lsl() - self.push2lsl_button.label = u"\u25CF Start" - if not self.rec_button.active: - self.event_code_input.disabled = True - self.marker_button.disabled = True - - def _init_set_marker(self): - self.marker_button = Button(label=u"Set", button_type="default", width=80, height=31, disabled=True) - self.event_code_input = TextInput(value="0", title="Event code:", width=80, disabled=True) - self.event_code_input.on_change('value', self._check_marker_value) - self.marker_button.on_click(self._set_marker) - return column([Spacer(width=170, height=5), - row([self.event_code_input, - column(Spacer(width=50, height=19), self.marker_button)], height=50, width=170)], - width=170, height=50, sizing_mode='fixed' - ) - - def _set_marker(self): - code = self.event_code_input.value - self.stream_processor.set_marker(int(code)) - - def _check_marker_value(self, attr, old, new): - try: - code = int(self.event_code_input.value) - if code < 0 or code > 65535: - raise ValueError('Value must be an integer between 0 and 65535') - except ValueError: - self.event_code_input.value = "0<=val<=65535" - - @gen.coroutine - @without_property_validation - def _update_rec_timer(self, new_data): - self._timer_source.stream(new_data, rollover=1) - - def _set_t_range(self, t_length): - """Change time range of ExG and orientation plots""" - for plot in self.plot_list: - self.win_length = int(t_length) - plot.x_range.follow = "end" - plot.x_range.follow_interval = t_length - plot.x_range.range_padding = 0. - plot.x_range.min_interval = t_length - - -def get_fft(exg, s_rate): - """Compute FFT""" - n_point = 1024 - exg -= exg.mean(axis=1)[:, np.newaxis] - freq = s_rate * np.arange(int(n_point / 2)) / n_point - fft_content = np.fft.fft(exg, n=n_point) / n_point - fft_content = np.abs(fft_content[:, range(int(n_point / 2))]) - fft_content = gaussian_filter1d(fft_content, 1) - return fft_content[:, 1:], freq[1:] - - -if __name__ == '__main__': - from explorepy import Explore - from explorepy.stream_processor import StreamProcessor - - explore = Explore() - explore.stream_processor = StreamProcessor() - explore.stream_processor.device_info = {'firmware_version': '0.0.0', - 'adc_mask': [1 for i in range(8)], - 'sampling_rate': 250} - - dashboard = Dashboard(explore=explore) - dashboard.start_server() - dashboard.start_loop() diff --git a/src/explorepy/dashboard/templates/index.html b/src/explorepy/dashboard/templates/index.html deleted file mode 100644 index 73f4526e..00000000 --- a/src/explorepy/dashboard/templates/index.html +++ /dev/null @@ -1,117 +0,0 @@ -{% extends base %} - -{% block title %}Explorepy dashboard style{% endblock %} - -{% block preamble %} - -{% endblock %} - -{% block contents %} -
- {{ super() }} -
-{% endblock %} diff --git a/src/explorepy/dashboard/theme.yaml b/src/explorepy/dashboard/theme.yaml deleted file mode 100644 index 2ffa8200..00000000 --- a/src/explorepy/dashboard/theme.yaml +++ /dev/null @@ -1,21 +0,0 @@ -attrs: - Figure: - background_fill_color: '#0F1328' - border_fill_color: '#0F1328' - outline_line_color: '#444444' - Axis: - axis_line_color: "white" - axis_label_text_color: "white" - major_label_text_color: "white" - major_tick_line_color: "white" - minor_tick_line_color: "white" - Grid: - grid_line_dash: [6, 4] - grid_line_alpha: .1 - Title: - text_color: "white" - Legend: - background_fill_color: "white" - background_fill_alpha: 0.2 - label_text_color: "white" - diff --git a/src/explorepy/explore.py b/src/explorepy/explore.py index 269cc2b6..62137319 100644 --- a/src/explorepy/explore.py +++ b/src/explorepy/explore.py @@ -22,7 +22,6 @@ import numpy as np from appdirs import user_cache_dir -import explorepy from explorepy.command import ( MemoryFormat, ModuleDisable, @@ -363,52 +362,11 @@ def stop_lsl(self): if self.lsl['timer'].is_alive(): self.lsl['timer'].cancel() self.lsl = {} + logger.info("Push2lsl has been stopped.") else: logger.debug("Tried to stop LSL while no LSL server is running!") - def visualize(self, bp_freq=(1, 30), notch_freq=50): - r"""Visualization of the signal in the dashboard: only works for 4 and 8 channel devices - - Args: - bp_freq (tuple): Bandpass filter cut-off frequencies (low_cutoff_freq, high_cutoff_freq), No bandpass filter - if it is None. - notch_freq (int): Line frequency for notch filter (50 or 60 Hz), No notch filter if it is None - """ - self._check_connection() - - if notch_freq: - self.stream_processor.add_filter(cutoff_freq=notch_freq, filter_type='notch') - - if bp_freq: - if bp_freq[0] and bp_freq[1]: - self.stream_processor.add_filter(cutoff_freq=bp_freq, filter_type='bandpass') - elif bp_freq[0]: - self.stream_processor.add_filter(cutoff_freq=bp_freq[0], filter_type='highpass') - elif bp_freq[1]: - self.stream_processor.add_filter(cutoff_freq=bp_freq[1], filter_type='lowpass') - - dashboard = explorepy.Dashboard(explore=self) - dashboard.start_server() - dashboard.start_loop() - - def measure_imp(self): - """ - Visualization of the electrode impedance - """ - self._check_connection() - assert self.stream_processor.device_info['sampling_rate'] == 250, \ - "Impedance mode only works at 250 Hz sampling rate. Please set the sampling rate to 250Hz." - - self.stream_processor.imp_initialize(notch_freq=50) - - try: - dashboard = explorepy.Dashboard(explore=self, mode='impedance') - dashboard.start_server() - dashboard.start_loop() - except KeyboardInterrupt: - self.stream_processor.disable_imp() - def set_marker(self, code): """Sets a digital event marker while streaming diff --git a/src/explorepy/exploresdk.py b/src/explorepy/exploresdk.py index 5df28eee..936b02fa 100644 --- a/src/explorepy/exploresdk.py +++ b/src/explorepy/exploresdk.py @@ -1,15 +1,12 @@ -# This file was automatically generated by SWIG (http://www.swig.org). -# Version 4.0.1 +# This file was automatically generated by SWIG (https://www.swig.org). +# Version 4.1.1 # -# Do not make changes to this file unless you know what you are doing--modify +# Do not make changes to this file unless you know what you are doing - modify # the SWIG interface file instead. from sys import version_info as _swig_python_version_info -if _swig_python_version_info < (2, 7, 0): - raise RuntimeError("Python 2.7 or later required") - # Import the low-level C/C++ module if __package__ or "." in __name__: from . import _exploresdk @@ -31,10 +28,10 @@ def _swig_repr(self): def _swig_setattr_nondynamic_instance_variable(set): def set_instance_attr(self, name, value): - if name == "thisown": - self.this.own(value) - elif name == "this": + if name == "this": set(self, name, value) + elif name == "thisown": + self.this.own(value) elif hasattr(self, name) and isinstance(getattr(type(self), name), property): set(self, name, value) else: @@ -63,8 +60,10 @@ class _SwigNonDynamicMeta(type): __setattr__ = _swig_setattr_nondynamic_class_variable(type.__setattr__) -import collections.abc - +if _swig_python_version_info[0:2] >= (3, 3): + import collections.abc +else: + import collections class SwigPyIterator(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -74,59 +73,58 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr __swig_destroy__ = _exploresdk.delete_SwigPyIterator - def value(self) -> "PyObject *": + def value(self): return _exploresdk.SwigPyIterator_value(self) - def incr(self, n: "size_t"=1) -> "swig::SwigPyIterator *": + def incr(self, n=1): return _exploresdk.SwigPyIterator_incr(self, n) - def decr(self, n: "size_t"=1) -> "swig::SwigPyIterator *": + def decr(self, n=1): return _exploresdk.SwigPyIterator_decr(self, n) - def distance(self, x: "SwigPyIterator") -> "ptrdiff_t": + def distance(self, x): return _exploresdk.SwigPyIterator_distance(self, x) - def equal(self, x: "SwigPyIterator") -> "bool": + def equal(self, x): return _exploresdk.SwigPyIterator_equal(self, x) - def copy(self) -> "swig::SwigPyIterator *": + def copy(self): return _exploresdk.SwigPyIterator_copy(self) - def next(self) -> "PyObject *": + def next(self): return _exploresdk.SwigPyIterator_next(self) - def __next__(self) -> "PyObject *": + def __next__(self): return _exploresdk.SwigPyIterator___next__(self) - def previous(self) -> "PyObject *": + def previous(self): return _exploresdk.SwigPyIterator_previous(self) - def advance(self, n: "ptrdiff_t") -> "swig::SwigPyIterator *": + def advance(self, n): return _exploresdk.SwigPyIterator_advance(self, n) - def __eq__(self, x: "SwigPyIterator") -> "bool": + def __eq__(self, x): return _exploresdk.SwigPyIterator___eq__(self, x) - def __ne__(self, x: "SwigPyIterator") -> "bool": + def __ne__(self, x): return _exploresdk.SwigPyIterator___ne__(self, x) - def __iadd__(self, n: "ptrdiff_t") -> "swig::SwigPyIterator &": + def __iadd__(self, n): return _exploresdk.SwigPyIterator___iadd__(self, n) - def __isub__(self, n: "ptrdiff_t") -> "swig::SwigPyIterator &": + def __isub__(self, n): return _exploresdk.SwigPyIterator___isub__(self, n) - def __add__(self, n: "ptrdiff_t") -> "swig::SwigPyIterator *": + def __add__(self, n): return _exploresdk.SwigPyIterator___add__(self, n) - def __sub__(self, *args) -> "ptrdiff_t": + def __sub__(self, *args): return _exploresdk.SwigPyIterator___sub__(self, *args) def __iter__(self): return self # Register SwigPyIterator in _exploresdk: _exploresdk.SwigPyIterator_swigregister(SwigPyIterator) - class BTSerialPortBinding(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -136,192 +134,131 @@ def __init__(self, *args, **kwargs): __swig_destroy__ = _exploresdk.delete_BTSerialPortBinding @staticmethod - def Create(address: "std::string", channelID: "int") -> "BTSerialPortBinding *": + def Create(address, channelID): return _exploresdk.BTSerialPortBinding_Create(address, channelID) - def Connect(self) -> "int": + def Connect(self): return _exploresdk.BTSerialPortBinding_Connect(self) - def Close(self) -> "void": + def Close(self): return _exploresdk.BTSerialPortBinding_Close(self) - def Read(self, bt_buffer: "char *") -> "void": + def Read(self, bt_buffer): return _exploresdk.BTSerialPortBinding_Read(self, bt_buffer) - def Write(self, write_buffer: "char const *") -> "void": + def Write(self, write_buffer): return _exploresdk.BTSerialPortBinding_Write(self, write_buffer) - def IsDataAvailable(self) -> "bool": + def IsDataAvailable(self): return _exploresdk.BTSerialPortBinding_IsDataAvailable(self) # Register BTSerialPortBinding in _exploresdk: _exploresdk.BTSerialPortBinding_swigregister(BTSerialPortBinding) - -def BTSerialPortBinding_Create(address: "std::string", channelID: "int") -> "BTSerialPortBinding *": - return _exploresdk.BTSerialPortBinding_Create(address, channelID) - -class vectordevice(collections.abc.MutableSequence): +class vectordevice(collections.abc.MutableSequence if _swig_python_version_info >= (3, 3) else collections.MutableSequence): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr - def iterator(self) -> "swig::SwigPyIterator *": + def iterator(self): return _exploresdk.vectordevice_iterator(self) def __iter__(self): return self.iterator() - def __nonzero__(self) -> "bool": + def __nonzero__(self): return _exploresdk.vectordevice___nonzero__(self) - def __bool__(self) -> "bool": + def __bool__(self): return _exploresdk.vectordevice___bool__(self) - def __len__(self) -> "std::vector< device >::size_type": + def __len__(self): return _exploresdk.vectordevice___len__(self) - def __getslice__(self, i: "std::vector< device >::difference_type", j: "std::vector< device >::difference_type") -> "std::vector< device,std::allocator< device > > *": + def __getslice__(self, i, j): return _exploresdk.vectordevice___getslice__(self, i, j) - def __setslice__(self, *args) -> "void": + def __setslice__(self, *args): return _exploresdk.vectordevice___setslice__(self, *args) - def __delslice__(self, i: "std::vector< device >::difference_type", j: "std::vector< device >::difference_type") -> "void": + def __delslice__(self, i, j): return _exploresdk.vectordevice___delslice__(self, i, j) - def __delitem__(self, *args) -> "void": + def __delitem__(self, *args): return _exploresdk.vectordevice___delitem__(self, *args) - def __getitem__(self, *args) -> "std::vector< device >::value_type const &": + def __getitem__(self, *args): return _exploresdk.vectordevice___getitem__(self, *args) - def __setitem__(self, *args) -> "void": + def __setitem__(self, *args): return _exploresdk.vectordevice___setitem__(self, *args) - def pop(self) -> "std::vector< device >::value_type": + def pop(self): return _exploresdk.vectordevice_pop(self) - def append(self, x: "device") -> "void": + def append(self, x): return _exploresdk.vectordevice_append(self, x) - def empty(self) -> "bool": + def empty(self): return _exploresdk.vectordevice_empty(self) - def size(self) -> "std::vector< device >::size_type": + def size(self): return _exploresdk.vectordevice_size(self) - def swap(self, v: "vectordevice") -> "void": + def swap(self, v): return _exploresdk.vectordevice_swap(self, v) - def begin(self) -> "std::vector< device >::iterator": + def begin(self): return _exploresdk.vectordevice_begin(self) - def end(self) -> "std::vector< device >::iterator": + def end(self): return _exploresdk.vectordevice_end(self) - def rbegin(self) -> "std::vector< device >::reverse_iterator": + def rbegin(self): return _exploresdk.vectordevice_rbegin(self) - def rend(self) -> "std::vector< device >::reverse_iterator": + def rend(self): return _exploresdk.vectordevice_rend(self) - def clear(self) -> "void": + def clear(self): return _exploresdk.vectordevice_clear(self) - def get_allocator(self) -> "std::vector< device >::allocator_type": + def get_allocator(self): return _exploresdk.vectordevice_get_allocator(self) - def pop_back(self) -> "void": + def pop_back(self): return _exploresdk.vectordevice_pop_back(self) - def erase(self, *args) -> "std::vector< device >::iterator": + def erase(self, *args): return _exploresdk.vectordevice_erase(self, *args) def __init__(self, *args): _exploresdk.vectordevice_swiginit(self, _exploresdk.new_vectordevice(*args)) - def push_back(self, x: "device") -> "void": + def push_back(self, x): return _exploresdk.vectordevice_push_back(self, x) - def front(self) -> "std::vector< device >::value_type const &": + def front(self): return _exploresdk.vectordevice_front(self) - def back(self) -> "std::vector< device >::value_type const &": + def back(self): return _exploresdk.vectordevice_back(self) - def assign(self, n: "std::vector< device >::size_type", x: "device") -> "void": + def assign(self, n, x): return _exploresdk.vectordevice_assign(self, n, x) - def resize(self, *args) -> "void": + def resize(self, *args): return _exploresdk.vectordevice_resize(self, *args) - def insert(self, *args) -> "void": + def insert(self, *args): return _exploresdk.vectordevice_insert(self, *args) - def reserve(self, n: "std::vector< device >::size_type") -> "void": + def reserve(self, n): return _exploresdk.vectordevice_reserve(self, n) - def capacity(self) -> "std::vector< device >::size_type": + def capacity(self): return _exploresdk.vectordevice_capacity(self) __swig_destroy__ = _exploresdk.delete_vectordevice # Register vectordevice in _exploresdk: _exploresdk.vectordevice_swigregister(vectordevice) - -class ExploreException(object): - thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") - __repr__ = _swig_repr - - def __init__(self, message: "std::string"): - _exploresdk.ExploreException_swiginit(self, _exploresdk.new_ExploreException(message)) - - def what(self) -> "char const *": - return _exploresdk.ExploreException_what(self) - __swig_destroy__ = _exploresdk.delete_ExploreException - -# Register ExploreException in _exploresdk: -_exploresdk.ExploreException_swigregister(ExploreException) - -class ExploreReadBufferException(object): - thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") - __repr__ = _swig_repr - - def __init__(self, message: "std::string"): - _exploresdk.ExploreReadBufferException_swiginit(self, _exploresdk.new_ExploreReadBufferException(message)) - - def what(self) -> "char const *": - return _exploresdk.ExploreReadBufferException_what(self) - __swig_destroy__ = _exploresdk.delete_ExploreReadBufferException - -# Register ExploreReadBufferException in _exploresdk: -_exploresdk.ExploreReadBufferException_swigregister(ExploreReadBufferException) - -class ExploreIOException(object): - thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") - __repr__ = _swig_repr - - def __init__(self, message: "std::string"): - _exploresdk.ExploreIOException_swiginit(self, _exploresdk.new_ExploreIOException(message)) - - def what(self) -> "char const *": - return _exploresdk.ExploreIOException_what(self) - __swig_destroy__ = _exploresdk.delete_ExploreIOException - -# Register ExploreIOException in _exploresdk: -_exploresdk.ExploreIOException_swigregister(ExploreIOException) - -class ExploreBtSocketException(object): - thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") - __repr__ = _swig_repr - - def __init__(self, message: "std::string"): - _exploresdk.ExploreBtSocketException_swiginit(self, _exploresdk.new_ExploreBtSocketException(message)) - - def what(self) -> "char const *": - return _exploresdk.ExploreBtSocketException_what(self) - __swig_destroy__ = _exploresdk.delete_ExploreBtSocketException - -# Register ExploreBtSocketException in _exploresdk: -_exploresdk.ExploreBtSocketException_swigregister(ExploreBtSocketException) - class device(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr @@ -339,7 +276,6 @@ def __init__(self): # Register device in _exploresdk: _exploresdk.device_swigregister(device) - class ExploreSDK(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -349,20 +285,15 @@ def __init__(self, *args, **kwargs): __swig_destroy__ = _exploresdk.delete_ExploreSDK @staticmethod - def Create() -> "ExploreSDK *": + def Create(): return _exploresdk.ExploreSDK_Create() - def PerformDeviceSearch(self, length: "int"=8) -> "std::vector< device,std::allocator< device > >": + def PerformDeviceSearch(self, length=8): return _exploresdk.ExploreSDK_PerformDeviceSearch(self, length) - def SdpSearch(self, address: "std::string") -> "int": + def SdpSearch(self, address): return _exploresdk.ExploreSDK_SdpSearch(self, address) # Register ExploreSDK in _exploresdk: _exploresdk.ExploreSDK_swigregister(ExploreSDK) -def ExploreSDK_Create() -> "ExploreSDK *": - return _exploresdk.ExploreSDK_Create() - - - diff --git a/src/explorepy/parser.py b/src/explorepy/parser.py index 12798400..492d6c9d 100644 --- a/src/explorepy/parser.py +++ b/src/explorepy/parser.py @@ -10,6 +10,7 @@ from explorepy.packet import ( PACKET_CLASS_DICT, TIMESTAMP_SCALE, + DeviceInfo, PacketBIN ) from explorepy.settings_manager import SettingsManager @@ -53,6 +54,9 @@ def start_streaming(self, device_name, mac_address): elif explorepy.get_bt_interface() == 'mock': from explorepy.bt_mock_client import MockBtClient self.stream_interface = MockBtClient(device_name=device_name, mac_address=mac_address) + elif explorepy.get_bt_interface() == 'pyserial': + from explorepy.serial_client import SerialClient + self.stream_interface = SerialClient(device_name=device_name) else: raise ValueError("Invalid Bluetooth interface: " + explorepy.get_bt_interface()) self.stream_interface.connect() @@ -77,8 +81,12 @@ def read_device_info(self, filename): self.stream_interface = FileHandler(filename) packet = None try: - packet = self._generate_packet() - self.callback(packet=packet) + while True: + packet = self._generate_packet() + if isinstance(packet, DeviceInfo): + print('packet is {}'.format(packet.__str__())) + self.callback(packet=packet) + break except (IOError, ValueError, FletcherError) as error: logger.error('Conversion ended incomplete. The binary file is corrupted.') raise error @@ -141,7 +149,6 @@ def _generate_packet(self): packet object """ raw_header = self.stream_interface.read(8) - pid = raw_header[0] raw_payload = raw_header[2:4] raw_timestamp = raw_header[4:8] diff --git a/src/explorepy/serial_client.py b/src/explorepy/serial_client.py new file mode 100644 index 00000000..0efa0ccc --- /dev/null +++ b/src/explorepy/serial_client.py @@ -0,0 +1,142 @@ +# -*- coding: utf-8 -*- +"""A module for bluetooth connection""" +import logging +import subprocess +import time + +import serial + +from explorepy import settings_manager +from explorepy._exceptions import DeviceNotFoundError + + +logger = logging.getLogger(__name__) + + +class SerialClient: + """ Responsible for Connecting and reconnecting explore devices via bluetooth""" + + def __init__(self, device_name): + """Initialize Bluetooth connection + """ + self.mac_address = None + self.is_connected = False + self.device_name = device_name + self.bt_serial_port_manager = None + self.device_manager = None + self.bt_sdk = None + + def connect(self): + """Connect to the device and return the socket + + Returns: + socket (bluetooth.socket) + """ + config_manager = settings_manager.SettingsManager(self.device_name) + self.mac_address = config_manager.get_mac_address() + if self.mac_address is None: + self._find_mac_address() + config_manager.set_mac_address(self.mac_address) + + for _ in range(5): + try: + self.connect_bluetooth_device() + self.bt_serial_port_manager = serial.Serial('/dev/tty.' + self.device_name, 9600) + print('/dev/tty.' + self.device_name) + self.is_connected = True + return 0 + except Exception as error: + self.is_connected = False + logger.debug( + "Got an exception while connecting to the device: {} of type: {}".format(error, type(error)) + ) + logger.debug('trying to connect again as tty port is not visible yet') + logger.warning("Could not connect; Retrying in 2s...") + time.sleep(2) + return -1 + + self.is_connected = False + raise DeviceNotFoundError( + "Could not find the device! Please make sure the device is on and connected to the computer" + ) + + def reconnect(self): + """Reconnect to the last used bluetooth socket. + + This function reconnects to the last bluetooth socket. If after 1 minute the connection doesn't succeed, + program will end. + """ + + def reconnect(self): + """Reconnect to the last used bluetooth socket. + + This function reconnects to the last bluetooth socket. If after 1 minute the connection doesn't succeed, + program will end. + """ + self.is_connected = False + for _ in range(5): + connection_error_code = self.bt_serial_port_manager.Connect() + logger.debug("Got an exception while connecting to the device: {}".format(connection_error_code)) + if connection_error_code == 0: + self.is_connected = True + logger.info('Connected to the device') + return self.bt_serial_port_manager + else: + self.is_connected = False + logger.warning("Couldn't connect to the device. Trying to reconnect...") + time.sleep(2) + logger.error("Could not reconnect after 5 attempts. Closing the socket.") + return None + + def disconnect(self): + """Disconnect from the device""" + self.is_connected = False + self.bt_serial_port_manager.close() + + def _find_mac_address(self): + if self.device_name[8] == '8': + self.mac_default = '00:13:43:A1:' + else: + self.mac_default = '00:13:43:93:' + print(self.device_name[8]) + id_to_mac = self.device_name[-4:-2] + ':' + self.device_name[-2:] + + self.mac_address = self.mac_default + id_to_mac + + def read(self, n_bytes): + """Read n_bytes from the socket + + Args: + n_bytes (int): number of bytes to be read + + Returns: + list of bytes + """ + try: + read_output = self.bt_serial_port_manager.read(n_bytes) + return read_output + except Exception as error: + print(error) + logger.error( + "unknown error occured while reading bluetooth data by " + "pyserial {} of type:{}".format(error, type(error)) + ) + + def send(self, data): + """Send data to the device + + Args: + data (bytearray): Data to be sent + """ + self.bt_serial_port_manager.write(data) + + @staticmethod + def _check_mac_address(device_name, mac_address): + return (device_name[-4:-2] == mac_address[-5:-3]) and (device_name[-2:] == mac_address[-2:]) + + def connect_bluetooth_device(self): + try: + subprocess.run(["blueutil", '--connect', self.mac_address], check=True) + print(f"Attempted to connect to the device with address: {self.mac_address}") + except subprocess.CalledProcessError as e: + print(f"Failed to connect to the device: {e}") From ff243965b08afe1446340dcb2a7ff293111943f5 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Wed, 13 Dec 2023 11:44:53 +0100 Subject: [PATCH 10/78] Feature mac dev (#287) * update script for arch64 * add bin2csv feature * update connection on sys exit * fix flake8 , prune redundant code * sort imports * update parser file imports * add pyserial to dependency * APIS-864: remove bokeh * Added pyyaml as requirement * conditional import of exploresdk * add reconnection message * remove library copy for mac * remove sdk.py file from src * update .so file, remove unused variable * fix isort error * add exploresdk.py to src folder again * restore old sdk file * update bt_unstable message --------- Co-authored-by: ss rr Co-authored-by: Sonja Stefani --- lib/mac/_exploresdk.so | Bin 880440 -> 958800 bytes setup.py | 10 ---------- src/explorepy/__init__.py | 2 +- src/explorepy/serial_client.py | 23 +---------------------- src/explorepy/stream_processor.py | 5 ++++- 5 files changed, 6 insertions(+), 34 deletions(-) mode change 100644 => 100755 lib/mac/_exploresdk.so diff --git a/lib/mac/_exploresdk.so b/lib/mac/_exploresdk.so old mode 100644 new mode 100755 index 97e302fb00f4c8ee5a99a0c114b957251260438c..6c79daae0a630e569fde9dac0912cc52e31a8310 GIT binary patch literal 958800 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 aX+p`P%ed{hawogPK1N{y49i1}m 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

G5jeVc`yMDP!Q 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

=#@s_@&_2f<+@W{so5$ZX#GLxVhk#g5MA<72HN} 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 (3, 6): - my_req.append('pyobjc-core>=6') - my_req.append('pyobjc-framework-Cocoa>=6') - else: - my_req.append('pyobjc-core>=3.1,<6') - my_req.append('pyobjc-framework-Cocoa>=3.1,<6') - os.system('cp lib/mac/_exploresdk.so src/explorepy') - os.system('cp lib/mac/btScan src/explorepy') - os.system('cp lib/mac/exploresdk.py src/explorepy') setup( name='explorepy', version='1.8.2', diff --git a/src/explorepy/__init__.py b/src/explorepy/__init__.py index 8220a562..8885c715 100644 --- a/src/explorepy/__init__.py +++ b/src/explorepy/__init__.py @@ -14,7 +14,6 @@ from . import ( # noqa ignore E402 command, - exploresdk, tools ) from .explore import Explore # noqa @@ -28,6 +27,7 @@ if sys.platform == 'darwin': this._bt_interface = 'pyserial' else: + from . import exploresdk this._bt_interface = 'sdk' if not sys.version_info >= (3, 6): diff --git a/src/explorepy/serial_client.py b/src/explorepy/serial_client.py index 0efa0ccc..0cd62f76 100644 --- a/src/explorepy/serial_client.py +++ b/src/explorepy/serial_client.py @@ -41,7 +41,7 @@ def connect(self): for _ in range(5): try: self.connect_bluetooth_device() - self.bt_serial_port_manager = serial.Serial('/dev/tty.' + self.device_name, 9600) + self.bt_serial_port_manager = serial.Serial('/dev/tty.' + self.device_name, 9600, timeout=5) print('/dev/tty.' + self.device_name) self.is_connected = True return 0 @@ -67,27 +67,6 @@ def reconnect(self): program will end. """ - def reconnect(self): - """Reconnect to the last used bluetooth socket. - - This function reconnects to the last bluetooth socket. If after 1 minute the connection doesn't succeed, - program will end. - """ - self.is_connected = False - for _ in range(5): - connection_error_code = self.bt_serial_port_manager.Connect() - logger.debug("Got an exception while connecting to the device: {}".format(connection_error_code)) - if connection_error_code == 0: - self.is_connected = True - logger.info('Connected to the device') - return self.bt_serial_port_manager - else: - self.is_connected = False - logger.warning("Couldn't connect to the device. Trying to reconnect...") - time.sleep(2) - logger.error("Could not reconnect after 5 attempts. Closing the socket.") - return None - def disconnect(self): """Disconnect from the device""" self.is_connected = False diff --git a/src/explorepy/stream_processor.py b/src/explorepy/stream_processor.py index b090f44b..627941e3 100644 --- a/src/explorepy/stream_processor.py +++ b/src/explorepy/stream_processor.py @@ -331,6 +331,9 @@ def send_timestamp(self): self._device_configurator.send_timestamp() def update_bt_stability_status(self, current_timestamp): + if self._is_imp_mode: + self.instability_flag = False + return if 'board_id' in self.device_info.keys(): if self._last_packet_timestamp == 0: return @@ -349,7 +352,7 @@ def update_bt_stability_status(self, current_timestamp): self.instability_flag = True self.last_bt_unstable_time = current_time else: - if current_time - self.last_bt_unstable_time > 10: + if current_time - self.last_bt_unstable_time > 3: self.instability_flag = False def is_connection_unstable(self): From bd375f43159cae0235363d86d73f259e2a76fc2a Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Wed, 20 Dec 2023 14:53:14 +0100 Subject: [PATCH 11/78] add ble to list to interfaes --- src/explorepy/__init__.py | 5 +++-- src/explorepy/parser.py | 3 +++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/explorepy/__init__.py b/src/explorepy/__init__.py index 17a0214b..c71eb993 100644 --- a/src/explorepy/__init__.py +++ b/src/explorepy/__init__.py @@ -25,7 +25,8 @@ __version__ = '1.8.1' this = sys.modules[__name__] -this._bt_interface = 'sdk' +bt_interface_list = ['sdk', 'ble'] +this._bt_interface = 'ble' if not sys.version_info >= (3, 6): raise EnvironmentError("Explorepy requires python versions 3.6 or newer!") @@ -41,7 +42,7 @@ def set_bt_interface(bt_interface): bt_interface (str): Bluetooth interface type. Options:'sdk' """ - if bt_interface not in ['sdk']: + if bt_interface not in bt_interface_list: raise ValueError(("Invalid Bluetooth interface: " + bt_interface)) this._bt_interface = bt_interface diff --git a/src/explorepy/parser.py b/src/explorepy/parser.py index 7b00aaeb..34583fec 100644 --- a/src/explorepy/parser.py +++ b/src/explorepy/parser.py @@ -48,6 +48,9 @@ def start_streaming(self, device_name, mac_address): if explorepy.get_bt_interface() == 'sdk': from explorepy.btcpp import SDKBtClient self.stream_interface = SDKBtClient(device_name=device_name, mac_address=mac_address) + if explorepy.get_bt_interface() == 'ble': + from explorepy.btcpp import BLEClient + self.stream_interface = BLEClient(device_name=device_name, mac_address=mac_address) else: raise ValueError("Invalid Bluetooth interface: " + explorepy.get_bt_interface()) self.stream_interface.connect() From 083e9d801f50a0a3507d267ab1895927319fd3d0 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Fri, 22 Dec 2023 13:59:12 +0100 Subject: [PATCH 12/78] add support for ble interface --- src/explorepy/btcpp.py | 85 +++++++++++++++++++++++++++------------- src/explorepy/explore.py | 3 +- src/explorepy/packet.py | 8 ++-- 3 files changed, 63 insertions(+), 33 deletions(-) diff --git a/src/explorepy/btcpp.py b/src/explorepy/btcpp.py index bc66f098..6518e15c 100644 --- a/src/explorepy/btcpp.py +++ b/src/explorepy/btcpp.py @@ -2,10 +2,12 @@ """A module for bluetooth connection""" import abc import logging +import sys +import threading import time from queue import Queue -from bleak import BleakClient, BleakScanner +from bleak import BleakClient, BleakScanner, BLEDevice, AdvertisementData import asyncio from explorepy import ( @@ -17,7 +19,6 @@ InputError ) - logger = logging.getLogger(__name__) @@ -82,6 +83,7 @@ def _check_mac_address(device_name, mac_address): class SDKBtClient(BTClient): """ Responsible for Connecting and reconnecting explore devices via bluetooth""" + def __init__(self, device_name=None, mac_address=None): """Initialize Bluetooth connection @@ -237,6 +239,7 @@ def send(self, data): class BLEClient(BTClient): """ Responsible for Connecting and reconnecting explore devices via bluetooth""" + def __init__(self, device_name=None, mac_address=None): """Initialize Bluetooth connection @@ -244,33 +247,38 @@ def __init__(self, device_name=None, mac_address=None): device_name(str): Name of the device (either device_name or device address should be given) mac_address(str): Devices MAC address """ - super.__init__(device_name=device_name, mac_address=mac_address) + super().__init__(device_name=device_name, mac_address=mac_address) + self.ble_device = None + self.eeg_service_uuid = "FFFE0001-B5A3-F393-E0A9-E50E24DCCA9E" + self.eeg_tx_char_uuid = "FFFE0003-B5A3-F393-E0A9-E50E24DCCA9E" + self.loop = None self.buffer = Queue() - self.packet_characteristic = '' self.try_disconnect = False self.try_send = None + self.notification_thread = None + self.copy_buffer = bytearray() async def stream(self): - ble_device = await self._discover_device() - async with BleakClient(ble_device) as client: - self.is_connected = True - - async def handle_packet(sender, data): + async with BleakClient(self.ble_device) as client: + def handle_packet(sender, bt_byte_array): # write packet to buffer - for b in data: - self.buffer.put(b) + self.buffer.put(bt_byte_array) - await client.start_notify(self.packet_characteristic, handle_packet) + await client.start_notify(self.eeg_tx_char_uuid, handle_packet) + loop = asyncio.get_running_loop() + while True: + # This waits until you type a line and press ENTER. + # A real terminal program might put stdin in raw mode so that things + # like CTRL+C get passed to the remote device. + data = await loop.run_in_executor(None, sys.stdin.buffer.readline) - while client.is_connected and not self.try_disconnect: - if self.try_send: - await client.write_gatt_char(self.try_disconnect['char'], self.try_disconnect['data']) - self.try_send = None - time.sleep(0.1) + # data will be empty on EOF (e.g. CTRL+D on *nix) + if not data: + break - self.try_disconnect = False - self.is_connected = False + # self.try_disconnect = False + # self.is_connected = False def connect(self): """Connect to the device and return the socket @@ -278,19 +286,33 @@ def connect(self): Returns: socket (bluetooth.socket) """ + asyncio.run(self._discover_device()) + if self.ble_device is None: + print('No device found!!') + else: + logger.info('Device is connected') + self.is_connected = True + self.notification_thread = threading.Thread(target=self.start_read_loop, daemon=True) + self.notification_thread.start() + + def start_read_loop(self): asyncio.run(self.stream()) + def stop_read_loop(self): + self.notification_thread.join() + async def _discover_device(self): if self.mac_address: - ble_device = await BleakScanner.find_device_by_address(self.mac_address) + self.ble_device = await BleakScanner.find_device_by_address(self.mac_address) else: - ble_device = await BleakScanner.find_device_by_name(self.device_name) + logger.info('Commencing device discovery') + self.ble_device = await BleakScanner.find_device_by_name(self.device_name, timeout=15) - if not ble_device: + if self.ble_device is None: + print('No device found!!!!!') raise DeviceNotFoundError( "Could not discover the device! Please make sure the device is on and in advertising mode." ) - return ble_device def reconnect(self): """Reconnect to the last used bluetooth socket. @@ -316,10 +338,11 @@ def read(self, n_bytes): Returns: list of bytes """ - ret = b'' - for _ in range(n_bytes): - ret += bytes(self.buffer.get()) - + if len(self.copy_buffer) < n_bytes: + get_item = self.buffer.get() + self.copy_buffer.extend(get_item) + ret = self.copy_buffer[:n_bytes] + self.copy_buffer = self.copy_buffer[n_bytes:] return ret def send(self, data): @@ -333,3 +356,11 @@ def send(self, data): 'data': data } raise NotImplementedError + + def match_eeg_uuid(self, device: BLEDevice, adv: AdvertisementData): + # This assumes that the device includes the EEG service UUID in the + # advertising data. This test may need to be adjusted depending on the + # actual advertising data supplied by the device. + if self.eeg_service_uuid.lower() in adv.service_uuids and adv.local_name == self.device_name: + print('name is {}'.format(adv.local_name)) + return True diff --git a/src/explorepy/explore.py b/src/explorepy/explore.py index 269cc2b6..63156527 100644 --- a/src/explorepy/explore.py +++ b/src/explorepy/explore.py @@ -88,14 +88,13 @@ def connect(self, device_name=None, mac_address=None): while "adc_mask" not in self.stream_processor.device_info: logger.info("Waiting for device info packet...") time.sleep(1) - if cnt >= 10: + if cnt >= 100: raise ConnectionAbortedError("Could not get info packet from the device") cnt += 1 logger.info('Device info packet has been received. Connection has been established. Streaming...') logger.info("Device info: " + str(self.stream_processor.device_info)) self.is_connected = True - self.stream_processor.send_timestamp() if self.debug: self.stream_processor.subscribe(callback=self.debug.process_bin, topic=TOPICS.packet_bin) diff --git a/src/explorepy/packet.py b/src/explorepy/packet.py index 103b2533..6a6cf722 100644 --- a/src/explorepy/packet.py +++ b/src/explorepy/packet.py @@ -13,7 +13,7 @@ logger = logging.getLogger(__name__) -TIMESTAMP_SCALE = 10000 +TIMESTAMP_SCALE = 100000 class PACKET_ID(IntEnum): @@ -125,9 +125,7 @@ def _convert(self, bin_data): n_chan = -1 data = data.reshape((self.n_packet, n_chan)).astype(float).T gain = EXG_UNIT * ((2 ** 23) - 1) * 6.0 - self.data = np.round(data[1:, :] * self.v_ref / gain, 2) - # EEG32: status bits will change in future releases as we need to use 4 bytes for 32 channel status - self.status = self.int32_to_status(data[0, :]) + self.data = np.round(data * self.v_ref / gain, 2) @staticmethod def int32_to_status(data): @@ -203,12 +201,14 @@ class EEG98_USBC(EEG): def __init__(self, timestamp, payload, time_offset=0): super().__init__(timestamp, payload, time_offset, v_ref=2.4, n_packet=16) + class EEG98_BLE(EEG): """EEG packet for 8 channel device""" def __init__(self, timestamp, payload, time_offset=0): super().__init__(timestamp, payload, time_offset, v_ref=2.4, n_packet=1) + class EEG99(EEG): """EEG packet for 8 channel device""" From 3d8a78d634f50469900c082e26d0991f818fe96c Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Wed, 3 Jan 2024 15:35:53 +0100 Subject: [PATCH 13/78] update lib file for windows compatibility --- src/explorepy/exploresdk.py | 203 ++++++++++++++++++++++++------------ 1 file changed, 136 insertions(+), 67 deletions(-) diff --git a/src/explorepy/exploresdk.py b/src/explorepy/exploresdk.py index 936b02fa..5df28eee 100644 --- a/src/explorepy/exploresdk.py +++ b/src/explorepy/exploresdk.py @@ -1,12 +1,15 @@ -# This file was automatically generated by SWIG (https://www.swig.org). -# Version 4.1.1 +# This file was automatically generated by SWIG (http://www.swig.org). +# Version 4.0.1 # -# Do not make changes to this file unless you know what you are doing - modify +# Do not make changes to this file unless you know what you are doing--modify # the SWIG interface file instead. from sys import version_info as _swig_python_version_info +if _swig_python_version_info < (2, 7, 0): + raise RuntimeError("Python 2.7 or later required") + # Import the low-level C/C++ module if __package__ or "." in __name__: from . import _exploresdk @@ -28,10 +31,10 @@ def _swig_repr(self): def _swig_setattr_nondynamic_instance_variable(set): def set_instance_attr(self, name, value): - if name == "this": - set(self, name, value) - elif name == "thisown": + if name == "thisown": self.this.own(value) + elif name == "this": + set(self, name, value) elif hasattr(self, name) and isinstance(getattr(type(self), name), property): set(self, name, value) else: @@ -60,10 +63,8 @@ class _SwigNonDynamicMeta(type): __setattr__ = _swig_setattr_nondynamic_class_variable(type.__setattr__) -if _swig_python_version_info[0:2] >= (3, 3): - import collections.abc -else: - import collections +import collections.abc + class SwigPyIterator(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -73,58 +74,59 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr __swig_destroy__ = _exploresdk.delete_SwigPyIterator - def value(self): + def value(self) -> "PyObject *": return _exploresdk.SwigPyIterator_value(self) - def incr(self, n=1): + def incr(self, n: "size_t"=1) -> "swig::SwigPyIterator *": return _exploresdk.SwigPyIterator_incr(self, n) - def decr(self, n=1): + def decr(self, n: "size_t"=1) -> "swig::SwigPyIterator *": return _exploresdk.SwigPyIterator_decr(self, n) - def distance(self, x): + def distance(self, x: "SwigPyIterator") -> "ptrdiff_t": return _exploresdk.SwigPyIterator_distance(self, x) - def equal(self, x): + def equal(self, x: "SwigPyIterator") -> "bool": return _exploresdk.SwigPyIterator_equal(self, x) - def copy(self): + def copy(self) -> "swig::SwigPyIterator *": return _exploresdk.SwigPyIterator_copy(self) - def next(self): + def next(self) -> "PyObject *": return _exploresdk.SwigPyIterator_next(self) - def __next__(self): + def __next__(self) -> "PyObject *": return _exploresdk.SwigPyIterator___next__(self) - def previous(self): + def previous(self) -> "PyObject *": return _exploresdk.SwigPyIterator_previous(self) - def advance(self, n): + def advance(self, n: "ptrdiff_t") -> "swig::SwigPyIterator *": return _exploresdk.SwigPyIterator_advance(self, n) - def __eq__(self, x): + def __eq__(self, x: "SwigPyIterator") -> "bool": return _exploresdk.SwigPyIterator___eq__(self, x) - def __ne__(self, x): + def __ne__(self, x: "SwigPyIterator") -> "bool": return _exploresdk.SwigPyIterator___ne__(self, x) - def __iadd__(self, n): + def __iadd__(self, n: "ptrdiff_t") -> "swig::SwigPyIterator &": return _exploresdk.SwigPyIterator___iadd__(self, n) - def __isub__(self, n): + def __isub__(self, n: "ptrdiff_t") -> "swig::SwigPyIterator &": return _exploresdk.SwigPyIterator___isub__(self, n) - def __add__(self, n): + def __add__(self, n: "ptrdiff_t") -> "swig::SwigPyIterator *": return _exploresdk.SwigPyIterator___add__(self, n) - def __sub__(self, *args): + def __sub__(self, *args) -> "ptrdiff_t": return _exploresdk.SwigPyIterator___sub__(self, *args) def __iter__(self): return self # Register SwigPyIterator in _exploresdk: _exploresdk.SwigPyIterator_swigregister(SwigPyIterator) + class BTSerialPortBinding(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -134,131 +136,192 @@ def __init__(self, *args, **kwargs): __swig_destroy__ = _exploresdk.delete_BTSerialPortBinding @staticmethod - def Create(address, channelID): + def Create(address: "std::string", channelID: "int") -> "BTSerialPortBinding *": return _exploresdk.BTSerialPortBinding_Create(address, channelID) - def Connect(self): + def Connect(self) -> "int": return _exploresdk.BTSerialPortBinding_Connect(self) - def Close(self): + def Close(self) -> "void": return _exploresdk.BTSerialPortBinding_Close(self) - def Read(self, bt_buffer): + def Read(self, bt_buffer: "char *") -> "void": return _exploresdk.BTSerialPortBinding_Read(self, bt_buffer) - def Write(self, write_buffer): + def Write(self, write_buffer: "char const *") -> "void": return _exploresdk.BTSerialPortBinding_Write(self, write_buffer) - def IsDataAvailable(self): + def IsDataAvailable(self) -> "bool": return _exploresdk.BTSerialPortBinding_IsDataAvailable(self) # Register BTSerialPortBinding in _exploresdk: _exploresdk.BTSerialPortBinding_swigregister(BTSerialPortBinding) -class vectordevice(collections.abc.MutableSequence if _swig_python_version_info >= (3, 3) else collections.MutableSequence): + +def BTSerialPortBinding_Create(address: "std::string", channelID: "int") -> "BTSerialPortBinding *": + return _exploresdk.BTSerialPortBinding_Create(address, channelID) + +class vectordevice(collections.abc.MutableSequence): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr - def iterator(self): + def iterator(self) -> "swig::SwigPyIterator *": return _exploresdk.vectordevice_iterator(self) def __iter__(self): return self.iterator() - def __nonzero__(self): + def __nonzero__(self) -> "bool": return _exploresdk.vectordevice___nonzero__(self) - def __bool__(self): + def __bool__(self) -> "bool": return _exploresdk.vectordevice___bool__(self) - def __len__(self): + def __len__(self) -> "std::vector< device >::size_type": return _exploresdk.vectordevice___len__(self) - def __getslice__(self, i, j): + def __getslice__(self, i: "std::vector< device >::difference_type", j: "std::vector< device >::difference_type") -> "std::vector< device,std::allocator< device > > *": return _exploresdk.vectordevice___getslice__(self, i, j) - def __setslice__(self, *args): + def __setslice__(self, *args) -> "void": return _exploresdk.vectordevice___setslice__(self, *args) - def __delslice__(self, i, j): + def __delslice__(self, i: "std::vector< device >::difference_type", j: "std::vector< device >::difference_type") -> "void": return _exploresdk.vectordevice___delslice__(self, i, j) - def __delitem__(self, *args): + def __delitem__(self, *args) -> "void": return _exploresdk.vectordevice___delitem__(self, *args) - def __getitem__(self, *args): + def __getitem__(self, *args) -> "std::vector< device >::value_type const &": return _exploresdk.vectordevice___getitem__(self, *args) - def __setitem__(self, *args): + def __setitem__(self, *args) -> "void": return _exploresdk.vectordevice___setitem__(self, *args) - def pop(self): + def pop(self) -> "std::vector< device >::value_type": return _exploresdk.vectordevice_pop(self) - def append(self, x): + def append(self, x: "device") -> "void": return _exploresdk.vectordevice_append(self, x) - def empty(self): + def empty(self) -> "bool": return _exploresdk.vectordevice_empty(self) - def size(self): + def size(self) -> "std::vector< device >::size_type": return _exploresdk.vectordevice_size(self) - def swap(self, v): + def swap(self, v: "vectordevice") -> "void": return _exploresdk.vectordevice_swap(self, v) - def begin(self): + def begin(self) -> "std::vector< device >::iterator": return _exploresdk.vectordevice_begin(self) - def end(self): + def end(self) -> "std::vector< device >::iterator": return _exploresdk.vectordevice_end(self) - def rbegin(self): + def rbegin(self) -> "std::vector< device >::reverse_iterator": return _exploresdk.vectordevice_rbegin(self) - def rend(self): + def rend(self) -> "std::vector< device >::reverse_iterator": return _exploresdk.vectordevice_rend(self) - def clear(self): + def clear(self) -> "void": return _exploresdk.vectordevice_clear(self) - def get_allocator(self): + def get_allocator(self) -> "std::vector< device >::allocator_type": return _exploresdk.vectordevice_get_allocator(self) - def pop_back(self): + def pop_back(self) -> "void": return _exploresdk.vectordevice_pop_back(self) - def erase(self, *args): + def erase(self, *args) -> "std::vector< device >::iterator": return _exploresdk.vectordevice_erase(self, *args) def __init__(self, *args): _exploresdk.vectordevice_swiginit(self, _exploresdk.new_vectordevice(*args)) - def push_back(self, x): + def push_back(self, x: "device") -> "void": return _exploresdk.vectordevice_push_back(self, x) - def front(self): + def front(self) -> "std::vector< device >::value_type const &": return _exploresdk.vectordevice_front(self) - def back(self): + def back(self) -> "std::vector< device >::value_type const &": return _exploresdk.vectordevice_back(self) - def assign(self, n, x): + def assign(self, n: "std::vector< device >::size_type", x: "device") -> "void": return _exploresdk.vectordevice_assign(self, n, x) - def resize(self, *args): + def resize(self, *args) -> "void": return _exploresdk.vectordevice_resize(self, *args) - def insert(self, *args): + def insert(self, *args) -> "void": return _exploresdk.vectordevice_insert(self, *args) - def reserve(self, n): + def reserve(self, n: "std::vector< device >::size_type") -> "void": return _exploresdk.vectordevice_reserve(self, n) - def capacity(self): + def capacity(self) -> "std::vector< device >::size_type": return _exploresdk.vectordevice_capacity(self) __swig_destroy__ = _exploresdk.delete_vectordevice # Register vectordevice in _exploresdk: _exploresdk.vectordevice_swigregister(vectordevice) + +class ExploreException(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + + def __init__(self, message: "std::string"): + _exploresdk.ExploreException_swiginit(self, _exploresdk.new_ExploreException(message)) + + def what(self) -> "char const *": + return _exploresdk.ExploreException_what(self) + __swig_destroy__ = _exploresdk.delete_ExploreException + +# Register ExploreException in _exploresdk: +_exploresdk.ExploreException_swigregister(ExploreException) + +class ExploreReadBufferException(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + + def __init__(self, message: "std::string"): + _exploresdk.ExploreReadBufferException_swiginit(self, _exploresdk.new_ExploreReadBufferException(message)) + + def what(self) -> "char const *": + return _exploresdk.ExploreReadBufferException_what(self) + __swig_destroy__ = _exploresdk.delete_ExploreReadBufferException + +# Register ExploreReadBufferException in _exploresdk: +_exploresdk.ExploreReadBufferException_swigregister(ExploreReadBufferException) + +class ExploreIOException(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + + def __init__(self, message: "std::string"): + _exploresdk.ExploreIOException_swiginit(self, _exploresdk.new_ExploreIOException(message)) + + def what(self) -> "char const *": + return _exploresdk.ExploreIOException_what(self) + __swig_destroy__ = _exploresdk.delete_ExploreIOException + +# Register ExploreIOException in _exploresdk: +_exploresdk.ExploreIOException_swigregister(ExploreIOException) + +class ExploreBtSocketException(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + + def __init__(self, message: "std::string"): + _exploresdk.ExploreBtSocketException_swiginit(self, _exploresdk.new_ExploreBtSocketException(message)) + + def what(self) -> "char const *": + return _exploresdk.ExploreBtSocketException_what(self) + __swig_destroy__ = _exploresdk.delete_ExploreBtSocketException + +# Register ExploreBtSocketException in _exploresdk: +_exploresdk.ExploreBtSocketException_swigregister(ExploreBtSocketException) + class device(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr @@ -276,6 +339,7 @@ def __init__(self): # Register device in _exploresdk: _exploresdk.device_swigregister(device) + class ExploreSDK(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -285,15 +349,20 @@ def __init__(self, *args, **kwargs): __swig_destroy__ = _exploresdk.delete_ExploreSDK @staticmethod - def Create(): + def Create() -> "ExploreSDK *": return _exploresdk.ExploreSDK_Create() - def PerformDeviceSearch(self, length=8): + def PerformDeviceSearch(self, length: "int"=8) -> "std::vector< device,std::allocator< device > >": return _exploresdk.ExploreSDK_PerformDeviceSearch(self, length) - def SdpSearch(self, address): + def SdpSearch(self, address: "std::string") -> "int": return _exploresdk.ExploreSDK_SdpSearch(self, address) # Register ExploreSDK in _exploresdk: _exploresdk.ExploreSDK_swigregister(ExploreSDK) +def ExploreSDK_Create() -> "ExploreSDK *": + return _exploresdk.ExploreSDK_Create() + + + From 4ddc99aed0da3b2cf64ee7e35d270af35e71cf2f Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Wed, 3 Jan 2024 17:45:47 +0100 Subject: [PATCH 14/78] add method to read sampling rate --- src/explorepy/settings_manager.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/explorepy/settings_manager.py b/src/explorepy/settings_manager.py index dca13d5a..8117ff84 100644 --- a/src/explorepy/settings_manager.py +++ b/src/explorepy/settings_manager.py @@ -122,6 +122,11 @@ def set_sampling_rate(self, value): self.settings_dict[self.sr_key] = value self.write_settings() + def get_sampling_rate(self): + '''Returns device sampling rate''' + self.load_current_settings() + return self.settings_dict.get(self.sr_key) + def set_chan_names(self, value): """Setter method for channel names for Explore Desktop""" self.load_current_settings() From 5954eae0b2386d892102d297c601f8c6b1dedbf0 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Fri, 5 Jan 2024 17:23:37 +0100 Subject: [PATCH 15/78] Update docs for 2.0.0 (#291) * Update changelog and setup doc * change version number as major * add explorepy version in win installer * bumpversion major * update changelog to 2.0.0 --- .bumpversion.cfg | 2 +- CHANGELOG.rst | 7 +++++++ README.rst | 8 ++++---- docs/conf.py | 2 +- docs/installation.rst | 12 ++++++++---- installer/windows/installer.cfg | 3 ++- setup.py | 2 +- src/explorepy/__init__.py | 2 +- 8 files changed, 25 insertions(+), 13 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index ed79653a..ebd1f580 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.8.2 +current_version = 2.0.0 commit = False tag = False diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 1a5149ad..e2b2a456 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -2,6 +2,13 @@ Changelog ========= +2.0.0 (5.1.2024) +------------------ +* Add Mac OSX support +* Remove browser based visualization support +* Update build script for docs + + 1.8.2 (28.8.2023) ------------------ * Improve explore mock device diff --git a/README.rst b/README.rst index da202144..66117b82 100644 --- a/README.rst +++ b/README.rst @@ -17,9 +17,9 @@ :target: https://pypi.org/project/explorepy -.. |commits-since| image:: https://img.shields.io/github/commits-since/Mentalab-hub/explorepy/v1.8.2.svg +.. |commits-since| image:: https://img.shields.io/github/commits-since/Mentalab-hub/explorepy/v2.0.0.svg :alt: Commits since latest release - :target: https://github.com/Mentalab-hub/explorepy/compare/v1.8.2...master + :target: https://github.com/Mentalab-hub/explorepy/compare/v2.0.0...master .. |wheel| image:: https://img.shields.io/pypi/wheel/explorepy.svg @@ -54,13 +54,13 @@ Quick installation ================== For Windows users, the best way to install ``explorepy`` is to download the latest ``explorepy`` version from the `release page `_. Please note that dependencies will install automatically from the release page. -For other operating systems, or to build the package manually on Windows, please refer to the information below. MAC OSX is currently not supported. +For other operating systems, or to build the package manually on Windows, please refer to the information below. Requirements ------------ -* Python 3.7 to Python 3.11. +* Python 3.7 to Python 3.12. * Visual Studio 2015 community edition (Windows only. For package building). * Bluetooth header files (Linux only. Use: ``sudo apt-get install libbluetooth-dev``). diff --git a/docs/conf.py b/docs/conf.py index 679fabbb..dfdedf19 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -29,7 +29,7 @@ year = '2018-2022' author = 'Mentalab GmbH.' copyright = '{0}, {1}'.format(year, author) -version = release = '1.8.2' +version = release = '2.0.0' pygments_style = 'trac' templates_path = ['.'] diff --git a/docs/installation.rst b/docs/installation.rst index 45872b13..cacb4437 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -4,14 +4,14 @@ Installation Minimal Requirements ------------ -* Python 3.7 to Python 3.11 +* Python 3.7 to Python 3.12 * Microsoft Build Tools for Visual Studio 2019 (only Windows) * 6GB RAM (minimum 1GB *free* RAM during the session) * Intel i5 or higher (2x2.5GHz) CPU Recommended Requirements ------------ -* Python 3.7 to Python 3.11 +* Python 3.7 to Python 3.12 * Microsoft Build Tools for Visual Studio 2019 (only Windows) * 8GB RAM * Intel i7 or higher CPU @@ -36,6 +36,9 @@ For an overview of ``explorepy`` commands, click `here `_. Please note that the dependencies will be installed automatically. +A standalone Mac installer is also available. Please contact Mentalab support to get Mac installer. + + Option 2: Installing from Python Package Index (PyPI) and pip (advanced) """""""" @@ -68,17 +71,18 @@ Ubuntu Mac ^^^ -Please note that Mac OSX is not supported at the moment due to some bluetooth bug from Apple OS updates. 1. Install ``XCode`` from the Mac App store. For this, you may need to upgrade to the latest version of MacOS. For older versions of MacOS, find compatible versions of ``XCode`` `here `_. All old ``XCode`` versions are available `here `_. 2. Accept the license agreement: ``sudo xcodebuild -license`` 3. It is best to install Anaconda. Download and install the `Anaconda Python 3.7 Mac installer `_. For older versions of MacOS, compatible version of Anaconda can be found in `this table `_ and downloaded `here `_. 4. We recommend using a virtual environment in Conda. - a. In Conda command prompt: ``conda create -n myenv python=3.8`` + a. In Conda command prompt: ``conda create -n myenv python=3.10`` b. Activate the virtual environment: ``conda activate myenv`` 5. Upgrade your pip: ``python -m pip install --upgrade pip`` 6. Run: ``pip install explorepy``, to install ``explorepy`` from PyPI. +7. Run: ``brew install blueutil``, to install blueutil for bluetooth communication +7. Connect your Explore device from Mac Bluetooth menu and run your Python script. Quick test ---------- diff --git a/installer/windows/installer.cfg b/installer/windows/installer.cfg index d6d666b1..dee88282 100644 --- a/installer/windows/installer.cfg +++ b/installer/windows/installer.cfg @@ -1,6 +1,6 @@ [Application] name=MentaLab ExplorePy -version=1.8.2 +version=2.0.0 entry_point=explorepy.cli:cli console=true icon=mentalab.ico @@ -26,6 +26,7 @@ pypi_wheels = decorator==5.1.1 distlib==0.3.7 eeglabio==0.0.2.post4 + explorepy==2.0.0 fonttools==4.42.1 idna==3.4 importlib-resources==6.0.1 diff --git a/setup.py b/setup.py index 1c23c68d..1ad015d2 100644 --- a/setup.py +++ b/setup.py @@ -80,7 +80,7 @@ def read(*names, **kwargs): )) setup( name='explorepy', - version='1.8.2', + version='2.0.0', license='MIT license', description='Python API for Mentalab biosignal aquisition devices', long_description_content_type="text/markdown", diff --git a/src/explorepy/__init__.py b/src/explorepy/__init__.py index 8885c715..65a97007 100644 --- a/src/explorepy/__init__.py +++ b/src/explorepy/__init__.py @@ -20,7 +20,7 @@ __all__ = ["Explore", "command", "exploresdk", "tools", "log_config"] -__version__ = '1.8.2' +__version__ = '2.0.0' this = sys.modules[__name__] list_sdk = ['sdk', 'mock', 'pyserial'] From a747555b5467ead8212561def8b80a844ae0d5db Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Mon, 8 Jan 2024 15:27:00 +0100 Subject: [PATCH 16/78] add BLE write feature --- src/explorepy/btcpp.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/explorepy/btcpp.py b/src/explorepy/btcpp.py index 6518e15c..1df71f05 100644 --- a/src/explorepy/btcpp.py +++ b/src/explorepy/btcpp.py @@ -248,9 +248,12 @@ def __init__(self, device_name=None, mac_address=None): mac_address(str): Devices MAC address """ super().__init__(device_name=device_name, mac_address=mac_address) + self.ble_device = None self.eeg_service_uuid = "FFFE0001-B5A3-F393-E0A9-E50E24DCCA9E" self.eeg_tx_char_uuid = "FFFE0003-B5A3-F393-E0A9-E50E24DCCA9E" + self.eeg_rx_char_uuid = "FFFE0002-B5A3-F393-E0A9-E50E24DCCA9E" + self.rx_char = None self.loop = None self.buffer = Queue() self.try_disconnect = False @@ -267,6 +270,7 @@ def handle_packet(sender, bt_byte_array): await client.start_notify(self.eeg_tx_char_uuid, handle_packet) loop = asyncio.get_running_loop() + self.rx_char = client.services.get_service(self.eeg_service_uuid).get_characteristic(self.eeg_rx_char_uuid) while True: # This waits until you type a line and press ENTER. # A real terminal program might put stdin in raw mode so that things @@ -351,11 +355,12 @@ def send(self, data): Args: data (bytearray): Data to be sent """ - self.try_send = { - 'char': '', - 'data': data - } - raise NotImplementedError + asyncio.run(self.write_ble_data(data)) + + + def write_ble_data(self, data): + async with BleakClient(self.ble_device) as client: + await client.write_gatt_char(self.rx_char, data, response=False) def match_eeg_uuid(self, device: BLEDevice, adv: AdvertisementData): # This assumes that the device includes the EEG service UUID in the From 99cb787a78985807a423ef8bb40f7779bc0ab0f9 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Wed, 10 Jan 2024 17:40:57 +0100 Subject: [PATCH 17/78] update byte order and remove gain in exg --- src/explorepy/packet.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/explorepy/packet.py b/src/explorepy/packet.py index 6a6cf722..0ba8dee7 100644 --- a/src/explorepy/packet.py +++ b/src/explorepy/packet.py @@ -85,7 +85,7 @@ def int24to32(bin_data): """ assert len(bin_data) % 3 == 0, "Packet length error!" return np.asarray([ - int.from_bytes(bin_data[x:x + 3], byteorder="little", signed=True) + int.from_bytes(bin_data[x:x + 3], byteorder="big", signed=True) for x in range(0, len(bin_data), 3) ]) @@ -123,9 +123,7 @@ def _convert(self, bin_data): raise ValueError("v_ref or n_packet cannot be null for conversion!") data = Packet.int24to32(bin_data) n_chan = -1 - data = data.reshape((self.n_packet, n_chan)).astype(float).T - gain = EXG_UNIT * ((2 ** 23) - 1) * 6.0 - self.data = np.round(data * self.v_ref / gain, 2) + self.data = data.reshape((self.n_packet, n_chan)).astype(float).T @staticmethod def int32_to_status(data): From 5c0006554602519463dd8909c786565520ea677b Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Mon, 15 Jan 2024 14:47:50 +0100 Subject: [PATCH 18/78] add missing async keyword --- src/explorepy/btcpp.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/explorepy/btcpp.py b/src/explorepy/btcpp.py index 1df71f05..b0215943 100644 --- a/src/explorepy/btcpp.py +++ b/src/explorepy/btcpp.py @@ -357,8 +357,7 @@ def send(self, data): """ asyncio.run(self.write_ble_data(data)) - - def write_ble_data(self, data): + async def write_ble_data(self, data): async with BleakClient(self.ble_device) as client: await client.write_gatt_char(self.rx_char, data, response=False) From 09554e798f7776473d24606147c06a61f6d5bf38 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Tue, 16 Jan 2024 13:08:10 +0100 Subject: [PATCH 19/78] write commands via stream loop --- src/explorepy/btcpp.py | 34 ++++++++-------------------------- 1 file changed, 8 insertions(+), 26 deletions(-) diff --git a/src/explorepy/btcpp.py b/src/explorepy/btcpp.py index b0215943..9083ddd3 100644 --- a/src/explorepy/btcpp.py +++ b/src/explorepy/btcpp.py @@ -254,12 +254,12 @@ def __init__(self, device_name=None, mac_address=None): self.eeg_tx_char_uuid = "FFFE0003-B5A3-F393-E0A9-E50E24DCCA9E" self.eeg_rx_char_uuid = "FFFE0002-B5A3-F393-E0A9-E50E24DCCA9E" self.rx_char = None - self.loop = None self.buffer = Queue() self.try_disconnect = False - self.try_send = None self.notification_thread = None self.copy_buffer = bytearray() + self.read_event = asyncio.Event() + self.data = None async def stream(self): @@ -272,17 +272,9 @@ def handle_packet(sender, bt_byte_array): loop = asyncio.get_running_loop() self.rx_char = client.services.get_service(self.eeg_service_uuid).get_characteristic(self.eeg_rx_char_uuid) while True: - # This waits until you type a line and press ENTER. - # A real terminal program might put stdin in raw mode so that things - # like CTRL+C get passed to the remote device. - data = await loop.run_in_executor(None, sys.stdin.buffer.readline) - - # data will be empty on EOF (e.g. CTRL+D on *nix) - if not data: - break - - # self.try_disconnect = False - # self.is_connected = False + loop.run_in_executor(None, await self.read_event.wait()) + await client.write_gatt_char(self.rx_char, self.data, response=False) + self.read_event.clear() def connect(self): """Connect to the device and return the socket @@ -355,16 +347,6 @@ def send(self, data): Args: data (bytearray): Data to be sent """ - asyncio.run(self.write_ble_data(data)) - - async def write_ble_data(self, data): - async with BleakClient(self.ble_device) as client: - await client.write_gatt_char(self.rx_char, data, response=False) - - def match_eeg_uuid(self, device: BLEDevice, adv: AdvertisementData): - # This assumes that the device includes the EEG service UUID in the - # advertising data. This test may need to be adjusted depending on the - # actual advertising data supplied by the device. - if self.eeg_service_uuid.lower() in adv.service_uuids and adv.local_name == self.device_name: - print('name is {}'.format(adv.local_name)) - return True + self.data = data + print('sending data to device') + self.read_event.set() From abb7581a42d3ea9098143e95fc4d26acde8131fa Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Tue, 16 Jan 2024 14:34:07 +0100 Subject: [PATCH 20/78] update setup.py and min python version --- setup.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/setup.py b/setup.py index 66315158..5293b779 100644 --- a/setup.py +++ b/setup.py @@ -32,7 +32,7 @@ def read(*names, **kwargs): return fh.read() -my_req = ['numpy', 'scipy', 'pyedflib', 'click==7.1.2', 'appdirs==1.4.3', 'sentry_sdk==1.19.1', 'mne', 'eeglabio', 'pandas'] # noqa: E501 +my_req = ['numpy', 'scipy', 'pyedflib', 'click==7.1.2', 'appdirs==1.4.3', 'sentry_sdk==1.19.1', 'mne', 'eeglabio', 'pandas', 'bleak'] # noqa: E501 test_requirements = ["pytest==6.2.5", "pytest-mock==3.10.0", "pytest-html==3.2.0", @@ -108,9 +108,6 @@ def read(*names, **kwargs): 'Operating System :: POSIX', 'Operating System :: Microsoft :: Windows', 'Programming Language :: Python', - 'Programming Language :: Python :: 3.7', - 'Programming Language :: Python :: 3.8', - 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.11', 'Topic :: Education', From 34511e19f0a8bf8e4e490281601fb51538dc87d2 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Wed, 17 Jan 2024 15:05:08 +0100 Subject: [PATCH 21/78] Feature mac dev (#292) * update script for arch64 * add bin2csv feature * update connection on sys exit * fix flake8 , prune redundant code * sort imports * update parser file imports * add pyserial to dependency * APIS-864: remove bokeh * Added pyyaml as requirement * conditional import of exploresdk * add reconnection message * remove library copy for mac * remove sdk.py file from src * update .so file, remove unused variable * fix isort error * add exploresdk.py to src folder again * restore old sdk file * update bt_unstable message * update blueutil path --------- Co-authored-by: ss rr Co-authored-by: Sonja Stefani --- src/explorepy/serial_client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/explorepy/serial_client.py b/src/explorepy/serial_client.py index 0cd62f76..ee4b6f73 100644 --- a/src/explorepy/serial_client.py +++ b/src/explorepy/serial_client.py @@ -115,7 +115,7 @@ def _check_mac_address(device_name, mac_address): def connect_bluetooth_device(self): try: - subprocess.run(["blueutil", '--connect', self.mac_address], check=True) + subprocess.run(["/opt/homebrew/bin/blueutil", '--connect', self.mac_address], check=True) print(f"Attempted to connect to the device with address: {self.mac_address}") except subprocess.CalledProcessError as e: print(f"Failed to connect to the device: {e}") From 47689d89fa5f43fd38b30e4797040de09047e170 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Thu, 25 Jan 2024 15:05:32 +0100 Subject: [PATCH 22/78] exit BLE context manager on disconnect --- src/explorepy/btcpp.py | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/explorepy/btcpp.py b/src/explorepy/btcpp.py index 9083ddd3..9472091a 100644 --- a/src/explorepy/btcpp.py +++ b/src/explorepy/btcpp.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- """A module for bluetooth connection""" import abc +import atexit import logging import sys import threading @@ -273,7 +274,11 @@ def handle_packet(sender, bt_byte_array): self.rx_char = client.services.get_service(self.eeg_service_uuid).get_characteristic(self.eeg_rx_char_uuid) while True: loop.run_in_executor(None, await self.read_event.wait()) + if self.rx_char is None: + print('Client disconnection requested') + break await client.write_gatt_char(self.rx_char, self.data, response=False) + self.rx_char = None self.read_event.clear() def connect(self): @@ -290,11 +295,13 @@ def connect(self): self.is_connected = True self.notification_thread = threading.Thread(target=self.start_read_loop, daemon=True) self.notification_thread.start() + atexit.register(self.disconnect) def start_read_loop(self): asyncio.run(self.stream()) def stop_read_loop(self): + print('calling stop!!') self.notification_thread.join() async def _discover_device(self): @@ -321,6 +328,7 @@ def reconnect(self): def disconnect(self): """Disconnect from the device""" self.try_disconnect = True + self.read_event.set() def _find_mac_address(self): raise NotImplementedError @@ -334,13 +342,17 @@ def read(self, n_bytes): Returns: list of bytes """ - if len(self.copy_buffer) < n_bytes: - get_item = self.buffer.get() - self.copy_buffer.extend(get_item) - ret = self.copy_buffer[:n_bytes] - self.copy_buffer = self.copy_buffer[n_bytes:] - return ret - + try: + if len(self.copy_buffer) < n_bytes: + get_item = self.buffer.get() + self.copy_buffer.extend(get_item) + ret = self.copy_buffer[:n_bytes] + self.copy_buffer = self.copy_buffer[n_bytes:] + if len(ret) < n_bytes: + raise ConnectionAbortedError('Error reading data from BLE stream, too many bytes requested') + return ret + except Exception as error: + logger.error('Error reading data from BLE stream') def send(self, data): """Send data to the device From 60fe6f90428b1f1decedc4828cbf5ea50c8cff83 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Thu, 25 Jan 2024 15:17:37 +0100 Subject: [PATCH 23/78] catch runtime exception in asyncio --- src/explorepy/btcpp.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/explorepy/btcpp.py b/src/explorepy/btcpp.py index 9472091a..0e7e95d4 100644 --- a/src/explorepy/btcpp.py +++ b/src/explorepy/btcpp.py @@ -298,7 +298,10 @@ def connect(self): atexit.register(self.disconnect) def start_read_loop(self): - asyncio.run(self.stream()) + try: + asyncio.run(self.stream()) + except RuntimeError as error: + logger.info('Shutting down BLE stream loop') def stop_read_loop(self): print('calling stop!!') From d355eea883979ecd20429744b702f45c746a277a Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Fri, 26 Jan 2024 17:02:01 +0100 Subject: [PATCH 24/78] check data variable for disconnection --- src/explorepy/btcpp.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/explorepy/btcpp.py b/src/explorepy/btcpp.py index 0e7e95d4..e051b6e3 100644 --- a/src/explorepy/btcpp.py +++ b/src/explorepy/btcpp.py @@ -274,11 +274,11 @@ def handle_packet(sender, bt_byte_array): self.rx_char = client.services.get_service(self.eeg_service_uuid).get_characteristic(self.eeg_rx_char_uuid) while True: loop.run_in_executor(None, await self.read_event.wait()) - if self.rx_char is None: + if self.data is None: print('Client disconnection requested') break await client.write_gatt_char(self.rx_char, self.data, response=False) - self.rx_char = None + self.data = None self.read_event.clear() def connect(self): From 9124a8ff4d685ad1e814cd6900570c27b51f0d13 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Thu, 1 Feb 2024 15:38:05 +0100 Subject: [PATCH 25/78] method for custom name retrieval from settings --- src/explorepy/settings_manager.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/explorepy/settings_manager.py b/src/explorepy/settings_manager.py index 8117ff84..922db869 100644 --- a/src/explorepy/settings_manager.py +++ b/src/explorepy/settings_manager.py @@ -133,6 +133,11 @@ def set_chan_names(self, value): self.settings_dict[self.channel_name_key] = value self.write_settings() + def get_channel_names(self): + """Returns channels names""" + self.load_current_settings() + return self.settings_dict.get(self.channel_name_key) + def __str__(self): self.load_current_settings() return self.settings_dict From c2e12fb23b6a57f2434e827407ca1426f2ad5c8b Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Mon, 5 Feb 2024 12:19:33 +0100 Subject: [PATCH 26/78] set unstable flag time to .5s --- src/explorepy/stream_processor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/explorepy/stream_processor.py b/src/explorepy/stream_processor.py index 627941e3..1cb20457 100644 --- a/src/explorepy/stream_processor.py +++ b/src/explorepy/stream_processor.py @@ -352,7 +352,7 @@ def update_bt_stability_status(self, current_timestamp): self.instability_flag = True self.last_bt_unstable_time = current_time else: - if current_time - self.last_bt_unstable_time > 3: + if current_time - self.last_bt_unstable_time > .5: self.instability_flag = False def is_connection_unstable(self): From 49bf616d5353e3fb8f1b2aa47637b955afc6f9ee Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Tue, 6 Feb 2024 15:48:17 +0100 Subject: [PATCH 27/78] initialize channel labels in settings file --- src/explorepy/settings_manager.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/explorepy/settings_manager.py b/src/explorepy/settings_manager.py index 922db869..020f2167 100644 --- a/src/explorepy/settings_manager.py +++ b/src/explorepy/settings_manager.py @@ -114,6 +114,8 @@ def update_device_settings(self, device_info_dict_update): if self.channel_count_key not in self.settings_dict: self.settings_dict[self.channel_count_key] = 8 if sum(self.settings_dict["adc_mask"]) > 4 else 4 + if self.channel_name_key not in self.settings_dict: + self.settings_dict[self.channel_name_key] = [f'ch{i + 1}' for i in range(self.settings_dict[self.channel_count_key])] self.write_settings() def set_sampling_rate(self, value): From c29453f1780dbc43b45ad3620fa37712ee9db99b Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Mon, 12 Feb 2024 15:12:55 +0100 Subject: [PATCH 28/78] cast sampling rate as int --- src/explorepy/packet.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/explorepy/packet.py b/src/explorepy/packet.py index 8d44ffc6..696bd74e 100644 --- a/src/explorepy/packet.py +++ b/src/explorepy/packet.py @@ -478,7 +478,7 @@ def _convert(self, bin_data): offset=0) self.firmware_version = ".".join([char for char in str(fw_num)[1:-1]]) - self.sampling_rate = 16000 / (2 ** bin_data[2]) + self.sampling_rate = int(16000 / (2 ** bin_data[2])) self.adc_mask = [int(bit) for bit in format(bin_data[3], "#010b")[2:]] def get_info(self): From ac2cb8e1462b84e19314584b70d3ee902623585c Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Mon, 12 Feb 2024 15:42:57 +0100 Subject: [PATCH 29/78] bin2csv for 32 channel with new packets --- src/explorepy/explore.py | 2 ++ src/explorepy/packet.py | 8 ++++++++ src/explorepy/settings_manager.py | 8 ++++++++ 3 files changed, 18 insertions(+) diff --git a/src/explorepy/explore.py b/src/explorepy/explore.py index 63156527..9fa0770b 100644 --- a/src/explorepy/explore.py +++ b/src/explorepy/explore.py @@ -257,6 +257,8 @@ def convert_bin(self, bin_file, out_dir='', file_type='edf', do_overwrite=False, self.mask = [1 for _ in range(0, 32)] if 'PCB_305_801_XXX' in self.stream_processor.device_info['board_id']: self.mask = [1 for _ in range(0, 16)] + if 'PCB_304_801p2_X' in self.stream_processor.device_info['board_id']: + self.mask = [1 for _ in range(0, 32)] self.recorders['exg'] = create_exg_recorder(filename=exg_out_file, file_type=self.recorders['file_type'], diff --git a/src/explorepy/packet.py b/src/explorepy/packet.py index 0ba8dee7..bc2c26ec 100644 --- a/src/explorepy/packet.py +++ b/src/explorepy/packet.py @@ -31,6 +31,7 @@ class PACKET_ID(IntEnum): EEG32 = 148 EEG98_USBC = 150 EEG98_BLE = 151 + EEG32_BLE = 152 EEG99 = 62 EEG94R = 208 EEG98R = 210 @@ -206,6 +207,12 @@ class EEG98_BLE(EEG): def __init__(self, timestamp, payload, time_offset=0): super().__init__(timestamp, payload, time_offset, v_ref=2.4, n_packet=1) +class EEG32_BLE(EEG): + """EEG packet for 32 channel BLE device""" + + def __init__(self, timestamp, payload, time_offset=0): + super().__init__(timestamp, payload, time_offset, v_ref=2.4, n_packet=1) + class EEG99(EEG): """EEG packet for 8 channel device""" @@ -577,6 +584,7 @@ def _convert(self, bin_data): PACKET_ID.EEG98R: EEG98, PACKET_ID.EEG98_USBC: EEG98_USBC, PACKET_ID.EEG98_BLE: EEG98_BLE, + PACKET_ID.EEG32_BLE: EEG32_BLE, PACKET_ID.EEG32: EEG32, PACKET_ID.CMDRCV: CommandRCV, PACKET_ID.CMDSTAT: CommandStatus, diff --git a/src/explorepy/settings_manager.py b/src/explorepy/settings_manager.py index 1b13fe27..bf67ed1b 100644 --- a/src/explorepy/settings_manager.py +++ b/src/explorepy/settings_manager.py @@ -119,6 +119,14 @@ def update_device_settings(self, device_info_dict_update): hardware_adc = self.settings_dict.get(self.hardware_channel_mask_key) self.settings_dict[self.software_channel_mask_key] = hardware_adc self.settings_dict[self.adc_mask_key] = self.settings_dict.get(self.software_channel_mask_key) + if "board_id" in device_info_dict_update: + if self.settings_dict["board_id"] == "PCB_304_801p2_X": + self.settings_dict[self.channel_count_key] = 32 + self.settings_dict[self.hardware_channel_mask_key] = [1 for _ in range(32)] + if self.software_channel_mask_key not in self.settings_dict: + hardware_adc = self.settings_dict.get(self.hardware_channel_mask_key) + self.settings_dict[self.software_channel_mask_key] = hardware_adc + self.settings_dict[self.adc_mask_key] = self.settings_dict.get(self.software_channel_mask_key) if self.channel_count_key not in self.settings_dict: self.settings_dict[self.channel_count_key] = 8 if sum(self.settings_dict["adc_mask"]) > 4 else 4 From 4aa3dd78639c25d6944acb1e4df16ae09ce5116b Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Wed, 21 Feb 2024 18:18:15 +0100 Subject: [PATCH 30/78] impedance measurement for BLE 8 ch --- src/explorepy/packet.py | 18 ++++++++++++++++++ src/explorepy/stream_processor.py | 3 ++- src/explorepy/tools.py | 28 ++++++++++++++++++++-------- 3 files changed, 40 insertions(+), 9 deletions(-) diff --git a/src/explorepy/packet.py b/src/explorepy/packet.py index bc2c26ec..9caeb93f 100644 --- a/src/explorepy/packet.py +++ b/src/explorepy/packet.py @@ -569,6 +569,24 @@ class CalibrationInfo_USBC(CalibrationInfoBase): def _convert(self, bin_data): super()._convert(bin_data, offset_multiplier=0.01) +class BleImpedancePacket(EEG98_USBC): + + def __init__(self, timestamp, payload, time_offset=0): + self.timestamp = timestamp + + def _convert(self, bin_data): + pass + + def populate_packet_with_data(self, ble_packet_list): + data_array = None + for i in range(len(ble_packet_list)): + _, data = ble_packet_list[i].get_data() + if data_array is None: + data_array = data + else: + data_array = np.concatenate((data_array, data), axis=1) + self.data = data_array + PACKET_CLASS_DICT = { PACKET_ID.ORN: Orientation, diff --git a/src/explorepy/stream_processor.py b/src/explorepy/stream_processor.py index b090f44b..f3458544 100644 --- a/src/explorepy/stream_processor.py +++ b/src/explorepy/stream_processor.py @@ -145,7 +145,8 @@ def process(self, packet): self.dispatch(topic=TOPICS.raw_ExG, packet=packet) if self._is_imp_mode and self.imp_calculator: packet_imp = self.imp_calculator.measure_imp(packet=packet) - self.dispatch(topic=TOPICS.imp, packet=packet_imp) + if packet_imp is not None: + self.dispatch(topic=TOPICS.imp, packet=packet_imp) self.apply_filters(packet=packet) self.dispatch(topic=TOPICS.filtered_ExG, packet=packet) elif isinstance(packet, DeviceInfo) or isinstance(packet, DeviceInfoV2): diff --git a/src/explorepy/tools.py b/src/explorepy/tools.py index c50d1ea1..8786cfdd 100644 --- a/src/explorepy/tools.py +++ b/src/explorepy/tools.py @@ -31,7 +31,7 @@ import explorepy from explorepy.filters import ExGFilter -from explorepy.packet import EEG +from explorepy.packet import EEG, EEG98_USBC, BleImpedancePacket from explorepy.settings_manager import SettingsManager @@ -674,6 +674,7 @@ def __init__(self, device_info, calib_param, notch_freq): self._filters = {} self._notch_freq = notch_freq self._add_filters() + self.packet_buffer = [] def _add_filters(self): bp_freq = self._device_info['sampling_rate'] / 4 - 1.5, self._device_info['sampling_rate'] / 4 + 1.5 @@ -702,13 +703,24 @@ def _add_filters(self): def measure_imp(self, packet): """Compute electrode impedances """ - temp_packet = self._filters['notch'].apply(input_data=packet, in_place=False) - self._calib_param['noise_level'] = self._filters['base_noise']. \ - apply(input_data=temp_packet, in_place=False).get_ptp() - self._filters['demodulation'].apply( - input_data=temp_packet, in_place=True - ).calculate_impedance(self._calib_param) - return temp_packet + self.packet_buffer.append(packet) + + if len(self.packet_buffer) < 16: + return None + else: + timestamp, _ = self.packet_buffer[0].get_data() + resized_packet = BleImpedancePacket(timestamp=timestamp, payload=None) + resized_packet.populate_packet_with_data(self.packet_buffer) + self.packet_buffer.clear() + + + temp_packet = self._filters['notch'].apply(input_data=resized_packet, in_place=False) + self._calib_param['noise_level'] = self._filters['base_noise']. \ + apply(input_data=temp_packet, in_place=False).get_ptp() + self._filters['demodulation'].apply( + input_data=temp_packet, in_place=True + ).calculate_impedance(self._calib_param) + return temp_packet class PhysicalOrientation: From 137645869cfd0eadae14ad90eb2b8e08d6ae6ef7 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Tue, 27 Feb 2024 18:29:16 +0100 Subject: [PATCH 31/78] fix flake8 errors --- src/explorepy/__init__.py | 2 +- src/explorepy/btcpp.py | 14 +++++++++----- src/explorepy/packet.py | 2 ++ src/explorepy/settings_manager.py | 3 ++- src/explorepy/tools.py | 8 ++++---- 5 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/explorepy/__init__.py b/src/explorepy/__init__.py index 44b1a5d7..96feec82 100644 --- a/src/explorepy/__init__.py +++ b/src/explorepy/__init__.py @@ -23,7 +23,7 @@ __version__ = '2.0.0' this = sys.modules[__name__] -# TODO appropriate library +# TODO appropriate library bt_interface_list = ['sdk', 'ble', 'mock', 'pyserial'] this._bt_interface = 'ble' diff --git a/src/explorepy/btcpp.py b/src/explorepy/btcpp.py index e051b6e3..31ae7632 100644 --- a/src/explorepy/btcpp.py +++ b/src/explorepy/btcpp.py @@ -1,15 +1,17 @@ # -*- coding: utf-8 -*- """A module for bluetooth connection""" import abc +import asyncio import atexit import logging -import sys import threading import time from queue import Queue -from bleak import BleakClient, BleakScanner, BLEDevice, AdvertisementData -import asyncio +from bleak import ( + BleakClient, + BleakScanner +) from explorepy import ( exploresdk, @@ -20,6 +22,7 @@ InputError ) + logger = logging.getLogger(__name__) @@ -301,7 +304,7 @@ def start_read_loop(self): try: asyncio.run(self.stream()) except RuntimeError as error: - logger.info('Shutting down BLE stream loop') + logger.info('Shutting down BLE stream loop with error {}'.format(error)) def stop_read_loop(self): print('calling stop!!') @@ -355,7 +358,8 @@ def read(self, n_bytes): raise ConnectionAbortedError('Error reading data from BLE stream, too many bytes requested') return ret except Exception as error: - logger.error('Error reading data from BLE stream') + logger.error('Error reading data from BLE stream with error {}'.format(error)) + def send(self, data): """Send data to the device diff --git a/src/explorepy/packet.py b/src/explorepy/packet.py index c1ec125c..81a701e9 100644 --- a/src/explorepy/packet.py +++ b/src/explorepy/packet.py @@ -207,6 +207,7 @@ class EEG98_BLE(EEG): def __init__(self, timestamp, payload, time_offset=0): super().__init__(timestamp, payload, time_offset, v_ref=2.4, n_packet=1) + class EEG32_BLE(EEG): """EEG packet for 32 channel BLE device""" @@ -569,6 +570,7 @@ class CalibrationInfo_USBC(CalibrationInfoBase): def _convert(self, bin_data): super()._convert(bin_data, offset_multiplier=0.01) + class BleImpedancePacket(EEG98_USBC): def __init__(self, timestamp, payload, time_offset=0): diff --git a/src/explorepy/settings_manager.py b/src/explorepy/settings_manager.py index 5b6c9bd3..a0432cd1 100644 --- a/src/explorepy/settings_manager.py +++ b/src/explorepy/settings_manager.py @@ -131,7 +131,8 @@ def update_device_settings(self, device_info_dict_update): if self.channel_count_key not in self.settings_dict: self.settings_dict[self.channel_count_key] = 8 if sum(self.settings_dict["adc_mask"]) > 4 else 4 if self.channel_name_key not in self.settings_dict: - self.settings_dict[self.channel_name_key] = [f'ch{i + 1}' for i in range(self.settings_dict[self.channel_count_key])] + self.settings_dict[self.channel_name_key] = [f'ch{i + 1}' for i in + range(self.settings_dict[self.channel_count_key])] self.write_settings() def set_sampling_rate(self, value): diff --git a/src/explorepy/tools.py b/src/explorepy/tools.py index 8786cfdd..70303c13 100644 --- a/src/explorepy/tools.py +++ b/src/explorepy/tools.py @@ -31,7 +31,10 @@ import explorepy from explorepy.filters import ExGFilter -from explorepy.packet import EEG, EEG98_USBC, BleImpedancePacket +from explorepy.packet import ( + EEG, + BleImpedancePacket +) from explorepy.settings_manager import SettingsManager @@ -511,7 +514,6 @@ def write_data(self, packet): """ time_vector, sig = packet.get_data(self._fs) - if self._rec_time_offset is None: self._rec_time_offset = time_vector[0] data = np.concatenate((np.array(time_vector)[:, np.newaxis].T, np.array(sig)), axis=0) @@ -712,8 +714,6 @@ def measure_imp(self, packet): resized_packet = BleImpedancePacket(timestamp=timestamp, payload=None) resized_packet.populate_packet_with_data(self.packet_buffer) self.packet_buffer.clear() - - temp_packet = self._filters['notch'].apply(input_data=resized_packet, in_place=False) self._calib_param['noise_level'] = self._filters['base_noise']. \ apply(input_data=temp_packet, in_place=False).get_ptp() From 2fb3ee7b3bf7c79a59819211874030c0fc731353 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Wed, 28 Feb 2024 17:25:00 +0100 Subject: [PATCH 32/78] improve disconnection, add gain calculation --- src/explorepy/btcpp.py | 6 ++++-- src/explorepy/packet.py | 4 +++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/explorepy/btcpp.py b/src/explorepy/btcpp.py index 31ae7632..f105b6f1 100644 --- a/src/explorepy/btcpp.py +++ b/src/explorepy/btcpp.py @@ -279,6 +279,7 @@ def handle_packet(sender, bt_byte_array): loop.run_in_executor(None, await self.read_event.wait()) if self.data is None: print('Client disconnection requested') + self.is_connected = False break await client.write_gatt_char(self.rx_char, self.data, response=False) self.data = None @@ -333,8 +334,8 @@ def reconnect(self): def disconnect(self): """Disconnect from the device""" - self.try_disconnect = True self.read_event.set() + self.stop_read_loop() def _find_mac_address(self): raise NotImplementedError @@ -358,7 +359,8 @@ def read(self, n_bytes): raise ConnectionAbortedError('Error reading data from BLE stream, too many bytes requested') return ret except Exception as error: - logger.error('Error reading data from BLE stream with error {}'.format(error)) + logger.error('Unknown error reading data from BLE stream') + raise ConnectionAbortedError(str(error)) def send(self, data): """Send data to the device diff --git a/src/explorepy/packet.py b/src/explorepy/packet.py index 81a701e9..339b1119 100644 --- a/src/explorepy/packet.py +++ b/src/explorepy/packet.py @@ -124,7 +124,9 @@ def _convert(self, bin_data): raise ValueError("v_ref or n_packet cannot be null for conversion!") data = Packet.int24to32(bin_data) n_chan = -1 - self.data = data.reshape((self.n_packet, n_chan)).astype(float).T + data = data.reshape((self.n_packet, n_chan)).astype(float).T + gain = EXG_UNIT * ((2 ** 23) - 1) * 6.0 + self.data = np.round(data * self.v_ref / gain, 2) @staticmethod def int32_to_status(data): From 24ed2570a5b8b1c4f3a7d38c7cbf052090e2958a Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Thu, 4 Apr 2024 11:19:44 +0200 Subject: [PATCH 33/78] continue parsing on fletcher error for BLE in bin2csv works for bin2csv at the moment but this might change in future for bt streaming --- src/explorepy/parser.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/explorepy/parser.py b/src/explorepy/parser.py index 3be64f4f..c82f2e02 100644 --- a/src/explorepy/parser.py +++ b/src/explorepy/parser.py @@ -44,6 +44,7 @@ def __init__(self, callback, mode='device', debug=True): self.is_waiting = False self._stream_thread = None self._is_reconnecting = False + self.seek_new_pid = asyncio.Event() def start_streaming(self, device_name, mac_address): """Start streaming data from Explore device""" @@ -126,7 +127,7 @@ def _stream_loop(self): self.stop_streaming() print("Press Ctrl+c to exit...") self._is_reconnecting = False - except (IOError, ValueError, MemoryError, FletcherError) as error: + except (IOError, ValueError, MemoryError) as error: logger.debug(f"Got this error while streaming: {error}") if self.mode == 'device': if str(error) != 'connection has been closed': @@ -137,6 +138,12 @@ def _stream_loop(self): else: logger.warning('The binary file is corrupted. Conversion has ended incompletely.') self.stop_streaming() + except FletcherError: + if explorepy.get_bt_interface() == 'ble': + logger.warning('Incomplete packet received, parsing will continue.') + self.seek_new_pid.set() + else: + self.stop_streaming() except EOFError: logger.info('End of file') self.stop_streaming() @@ -151,6 +158,12 @@ def _generate_packet(self): Returns: packet object """ + while self.seek_new_pid.is_set(): + import binascii + bytes_out = binascii.hexlify(bytearray(self.stream_interface.read(1))) + if bytes_out == b'af' and binascii.hexlify(bytearray(self.stream_interface.read(3))) == b'beadde': + self.seek_new_pid.clear() + break raw_header = self.stream_interface.read(8) pid = raw_header[0] raw_payload = raw_header[2:4] From b31b6299694f8dcc8ac6586e865e4887931501a5 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Thu, 4 Apr 2024 17:30:56 +0200 Subject: [PATCH 34/78] skip packet when payload is wrong --- src/explorepy/parser.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/explorepy/parser.py b/src/explorepy/parser.py index c82f2e02..94f5cf20 100644 --- a/src/explorepy/parser.py +++ b/src/explorepy/parser.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- """Parser module""" import asyncio +import binascii import logging import struct from threading import Thread @@ -159,7 +160,7 @@ def _generate_packet(self): packet object """ while self.seek_new_pid.is_set(): - import binascii + bytes_out = binascii.hexlify(bytearray(self.stream_interface.read(1))) if bytes_out == b'af' and binascii.hexlify(bytearray(self.stream_interface.read(3))) == b'beadde': self.seek_new_pid.clear() @@ -171,6 +172,8 @@ def _generate_packet(self): # pid = struct.unpack('B', raw_pid)[0] payload = struct.unpack(' 500: + raise FletcherError timestamp = struct.unpack(' Date: Fri, 5 Apr 2024 10:24:15 +0200 Subject: [PATCH 35/78] device name based bt backend detection --- src/explorepy/parser.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/explorepy/parser.py b/src/explorepy/parser.py index 94f5cf20..4869a25f 100644 --- a/src/explorepy/parser.py +++ b/src/explorepy/parser.py @@ -50,6 +50,8 @@ def __init__(self, callback, mode='device', debug=True): def start_streaming(self, device_name, mac_address): """Start streaming data from Explore device""" self.device_name = device_name + if not device_name[-4:].isalpha(): + explorepy.set_bt_interface('sdk') if explorepy.get_bt_interface() == 'sdk': from explorepy.btcpp import SDKBtClient self.stream_interface = SDKBtClient(device_name=device_name, mac_address=mac_address) From fb7fc43da933261c2c232d65866809ce29f806e9 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Mon, 8 Apr 2024 12:02:57 +0200 Subject: [PATCH 36/78] continue parsing on assertion error --- src/explorepy/parser.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/explorepy/parser.py b/src/explorepy/parser.py index 4869a25f..2c0564b0 100644 --- a/src/explorepy/parser.py +++ b/src/explorepy/parser.py @@ -186,7 +186,10 @@ def _generate_packet(self): payload_data = self.stream_interface.read(payload - 4) if self.debug: self.callback(packet=PacketBIN(raw_header + payload_data)) - packet = self._parse_packet(pid, timestamp, payload_data) + try: + packet = self._parse_packet(pid, timestamp, payload_data) + except AssertionError: + raise FletcherError return packet def _parse_packet(self, pid, timestamp, bin_data): From 1128630cc83f77ea5551b7ea2d9ff92b88ee3ba7 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Mon, 8 Apr 2024 14:46:17 +0200 Subject: [PATCH 37/78] visualizer with gaps filled with duplicate filtered packets --- src/explorepy/parser.py | 10 +++++++--- src/explorepy/stream_processor.py | 27 ++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/explorepy/parser.py b/src/explorepy/parser.py index 2c0564b0..260a93f3 100644 --- a/src/explorepy/parser.py +++ b/src/explorepy/parser.py @@ -168,9 +168,12 @@ def _generate_packet(self): self.seek_new_pid.clear() break raw_header = self.stream_interface.read(8) - pid = raw_header[0] - raw_payload = raw_header[2:4] - raw_timestamp = raw_header[4:8] + try: + pid = raw_header[0] + raw_payload = raw_header[2:4] + raw_timestamp = raw_header[4:8] + except: + raise FletcherError # pid = struct.unpack('B', raw_pid)[0] payload = struct.unpack(' 0: + for t in missing_timestamps: + packet.timestamp = t + self.dispatch(topic=TOPICS.filtered_ExG, packet=packet) + self.dispatch(topic=TOPICS.filtered_ExG, packet=packet) elif isinstance(packet, DeviceInfo) or isinstance(packet, DeviceInfoV2): self.old_device_info = self.device_info.copy() @@ -358,3 +369,17 @@ def update_bt_stability_status(self, current_timestamp): def is_connection_unstable(self): return self.instability_flag + + def fill_mising_packet(self, packet): + timestamps = np.array([]) + if self._last_packet_timestamp != 0: + sps = np.round(1/ self.device_info['sampling_rate'], 3) + #print('self._last_packet_timestamp {} and current is {}'.format(self._last_packet_timestamp, packet.timestamp)) + time_diff = np.round(packet.timestamp - self._last_packet_timestamp, 3) + #print('+++++++++++++ {}'.format(time_diff)) + if time_diff > sps: + missing_samples = int(time_diff / sps) + #print('*************************** {}'.format(missing_samples)) + timestamps = np.linspace(self._last_packet_timestamp + sps, packet.timestamp, num=missing_samples, endpoint=True) + #print('returning data with length: {}'.format(len(timestamps[:-1]))) + return timestamps[:-1] From 6d8a6df06e281414bcd1f0024bd7ade1eea28a63 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Wed, 10 Apr 2024 10:53:47 +0200 Subject: [PATCH 38/78] remove prints --- src/explorepy/stream_processor.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/explorepy/stream_processor.py b/src/explorepy/stream_processor.py index aff9a1d2..f6585af5 100644 --- a/src/explorepy/stream_processor.py +++ b/src/explorepy/stream_processor.py @@ -374,12 +374,8 @@ def fill_mising_packet(self, packet): timestamps = np.array([]) if self._last_packet_timestamp != 0: sps = np.round(1/ self.device_info['sampling_rate'], 3) - #print('self._last_packet_timestamp {} and current is {}'.format(self._last_packet_timestamp, packet.timestamp)) time_diff = np.round(packet.timestamp - self._last_packet_timestamp, 3) - #print('+++++++++++++ {}'.format(time_diff)) if time_diff > sps: missing_samples = int(time_diff / sps) - #print('*************************** {}'.format(missing_samples)) timestamps = np.linspace(self._last_packet_timestamp + sps, packet.timestamp, num=missing_samples, endpoint=True) - #print('returning data with length: {}'.format(len(timestamps[:-1]))) return timestamps[:-1] From 4ca2160a6994fb2e21a69f142bfbfa2ee7eb9557 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Wed, 10 Apr 2024 12:24:28 +0200 Subject: [PATCH 39/78] add support for string marker in explore desktop --- src/explorepy/explore.py | 4 ++-- src/explorepy/packet.py | 8 ++++---- src/explorepy/stream_processor.py | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/explorepy/explore.py b/src/explorepy/explore.py index cb4367b2..0a5d3136 100644 --- a/src/explorepy/explore.py +++ b/src/explorepy/explore.py @@ -378,7 +378,7 @@ def set_marker(self, code): self._check_connection() self.stream_processor.set_marker(code=code) - def set_external_marker(self, time_lsl, marker_string): + def set_external_marker(self, marker_string, time_lsl=None): """Sets a digital event marker while streaming Args: @@ -386,7 +386,7 @@ def set_external_marker(self, time_lsl, marker_string): marker_string (string): string to save as experiment marker) """ self._check_connection() - self.stream_processor.set_ext_marker(time_lsl, marker_string) + self.stream_processor.set_ext_marker(marker_string=marker_string) def format_memory(self): """Format memory of the device diff --git a/src/explorepy/packet.py b/src/explorepy/packet.py index 339b1119..1a9be1b1 100644 --- a/src/explorepy/packet.py +++ b/src/explorepy/packet.py @@ -404,8 +404,8 @@ class ExternalMarker(EventMarker): """External marker packet""" def __init__(self, timestamp, payload, time_offset=0): - super().__init__(timestamp * 10_000, payload, 0) - self._label_prefix = "ext_" + super().__init__(timestamp * TIMESTAMP_SCALE, payload, 0) + self._label_prefix = "sw_" def _convert(self, bin_data): self.code = bin_data[:15].decode('utf-8', errors='ignore') @@ -423,8 +423,8 @@ def create(lsl_time, marker_string): """ if not isinstance(marker_string, str): raise ValueError("Marker label must be a string") - if len(marker_string) > 16 or len(marker_string) < 1: - raise ValueError("Marker label must be between 1 and 16 characters long") + if len(marker_string) > 10 or len(marker_string) < 1: + raise ValueError("Marker label length must be between 1 and 10 characters") byte_array = bytes(marker_string, 'utf-8') return ExternalMarker( lsl_time, diff --git a/src/explorepy/stream_processor.py b/src/explorepy/stream_processor.py index f6585af5..03bbe2b2 100644 --- a/src/explorepy/stream_processor.py +++ b/src/explorepy/stream_processor.py @@ -313,11 +313,11 @@ def set_marker(self, code): marker = SoftwareMarker.create(self._get_sw_marker_time(), code) self.process(marker) - def set_ext_marker(self, time_lsl, marker_string): + def set_ext_marker(self, marker_string, time_lsl=None): """Set an external marker in the stream""" logger.info(f"Setting a software marker with code: {marker_string}") - - marker = ExternalMarker.create(time_lsl, marker_string) + if time_lsl is None: + marker = ExternalMarker.create(lsl_time=self._get_sw_marker_time(), marker_string=marker_string) self.process(marker) def compare_device_info(self, new_device_info): From 6e89a71c3872039312649080d14de3211f8245cd Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Wed, 17 Apr 2024 14:30:32 +0200 Subject: [PATCH 40/78] Apis 918 sample loss counter (#299) * change unstable bt threshold to .5s * add hint for disabled BT * save last exg timestamp * count samples lost in seconds * update missing sample count for sudden disconnection * clear bt_duration after interval --- src/explorepy/btcpp.py | 3 +- src/explorepy/stream_processor.py | 74 +++++++++++++++++++++---------- 2 files changed, 52 insertions(+), 25 deletions(-) diff --git a/src/explorepy/btcpp.py b/src/explorepy/btcpp.py index f105b6f1..85d64024 100644 --- a/src/explorepy/btcpp.py +++ b/src/explorepy/btcpp.py @@ -154,7 +154,8 @@ def connect(self): self.is_connected = False raise DeviceNotFoundError( - "Could not find the device! Please make sure the device is on and in advertising mode." + "Could not find the device! Please make sure bluetooth is turned on in your computer and the Explore " + "device is in advertising mode. " ) def reconnect(self): diff --git a/src/explorepy/stream_processor.py b/src/explorepy/stream_processor.py index 03bbe2b2..36133e19 100644 --- a/src/explorepy/stream_processor.py +++ b/src/explorepy/stream_processor.py @@ -3,6 +3,7 @@ This module is responsible for processing incoming stream from Explore device and publishing data to subscribers. """ import logging +import threading import time from enum import Enum from threading import Lock @@ -67,6 +68,10 @@ def __init__(self, debug=False): self.debug = debug self.instability_flag = False self.last_bt_unstable_time = 0 + self.last_exg_packet_timestamp = 0 + self.last_bt_drop_duration = None + self.cmd_event = threading.Event() + self.reset_timer() def subscribe(self, callback, topic): """Subscribe a function to a topic @@ -124,6 +129,7 @@ def read_device_info(self, bin_file): def stop(self): """Stop streaming""" self.is_connected = False + self.cmd_event.clear() self.parser.stop_streaming() def process(self, packet): @@ -141,6 +147,7 @@ def process(self, packet): packet = self.physical_orn.calculate(packet=packet) self.dispatch(topic=TOPICS.mapped_orn, packet=packet) elif isinstance(packet, EEG): + self.last_exg_packet_timestamp = get_local_time() missing_timestamps = self.fill_mising_packet(packet) self._update_last_time_point(packet, received_time) @@ -234,7 +241,6 @@ def add_filter(self, cutoff_freq, filter_type): settings_manager = SettingsManager(self.device_info["device_name"]) settings_manager.load_current_settings() n_chan = settings_manager.settings_dict[settings_manager.channel_count_key] - # print(f"{n_chan=}") n_chan = 32 if n_chan == 16 else n_chan self.filters.append(ExGFilter(cutoff_freq=cutoff_freq, @@ -268,6 +274,7 @@ def configure_device(self, cmd): """ if not self.is_connected: raise ConnectionError("No Explore device is connected!") + self.start_cmd_process_thread() return self._device_configurator.change_setting(cmd) def imp_initialize(self, notch_freq): @@ -343,33 +350,52 @@ def send_timestamp(self): self._device_configurator.send_timestamp() def update_bt_stability_status(self, current_timestamp): - if self._is_imp_mode: - self.instability_flag = False - return - if 'board_id' in self.device_info.keys(): - if self._last_packet_timestamp == 0: - return - # device is an explore plus device, check sample timestamps - timestamp_diff = current_timestamp - self._last_packet_timestamp - - # allowed time interval is two samples - allowed_time_interval = np.round(2 * (1 / self.device_info['sampling_rate']), 3) - is_unstable = timestamp_diff >= allowed_time_interval - else: - # devices is an old device, check if last sample has an earlier timestamp - is_unstable = current_timestamp < self._last_packet_timestamp - - current_time = get_local_time() - if is_unstable: - self.instability_flag = True - self.last_bt_unstable_time = current_time - else: - if current_time - self.last_bt_unstable_time > .5: - self.instability_flag = False + if not self.cmd_event.is_set(): + if 'board_id' in self.device_info.keys(): + if self._last_packet_timestamp == 0: + return + # device is an explore plus device, check sample timestamps + timestamp_diff = current_timestamp - self._last_packet_timestamp + + # allowed time interval is two samples + allowed_time_interval = np.round(2 * (1 / self.device_info['sampling_rate']), 3) + is_unstable = timestamp_diff >= allowed_time_interval + else: + # devices is an old device, check if last sample has an earlier timestamp + is_unstable = current_timestamp < self._last_packet_timestamp + + current_time = get_local_time() + + + if is_unstable: + if not self.instability_flag: + self.bt_drop_start_time = get_local_time() + self.last_bt_drop_duration = None + self.instability_flag = True + self.last_bt_unstable_time = current_time + else: + if self.instability_flag: + self.last_bt_drop_duration = np.round(get_local_time() - self.bt_drop_start_time, 3) + threading.Timer(interval=10, function=self.reset_bt_duration).start() + if current_time - self.last_bt_unstable_time > .3: + self.instability_flag = False def is_connection_unstable(self): + if get_local_time() - self.last_exg_packet_timestamp > 1.5: + self.last_bt_drop_duration = np.round(get_local_time() - self.bt_drop_start_time, 3) return self.instability_flag + def start_cmd_process_thread(self): + self.cmd_event.set() + self.bt_status_ignore_thread.start() + + def reset_timer(self): + self.cmd_event.clear() + self.bt_status_ignore_thread = threading.Timer(interval=2, function=self.reset_timer) + + def reset_bt_duration(self): + self.last_bt_drop_duration = None + def fill_mising_packet(self, packet): timestamps = np.array([]) if self._last_packet_timestamp != 0: From ea8aaddfcdb7c4b4938e9cf4ea49a630ef24be8e Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Mon, 22 Apr 2024 12:32:18 +0200 Subject: [PATCH 41/78] orn recording and timescale backward compatibility --- src/explorepy/packet.py | 21 +++++++++++++++------ src/explorepy/parser.py | 15 ++++++++------- src/explorepy/stream_processor.py | 8 +++++--- src/explorepy/tools.py | 18 +++++++++++++----- 4 files changed, 41 insertions(+), 21 deletions(-) diff --git a/src/explorepy/packet.py b/src/explorepy/packet.py index 1a9be1b1..b36afa8e 100644 --- a/src/explorepy/packet.py +++ b/src/explorepy/packet.py @@ -13,7 +13,7 @@ logger = logging.getLogger(__name__) -TIMESTAMP_SCALE = 100000 + class PACKET_ID(IntEnum): @@ -58,7 +58,7 @@ def __init__(self, timestamp, payload, time_offset=0): time_offset (double): Time offset defined by parser. It will be the timestamp of the first packet when streaming in realtime. It will be zero while converting a binary file. """ - self.timestamp = timestamp / TIMESTAMP_SCALE + time_offset + self.timestamp = timestamp + time_offset self._convert(payload[:-4]) self._check_fletcher(payload[-4:]) @@ -126,7 +126,15 @@ def _convert(self, bin_data): n_chan = -1 data = data.reshape((self.n_packet, n_chan)).astype(float).T gain = EXG_UNIT * ((2 ** 23) - 1) * 6.0 - self.data = np.round(data * self.v_ref / gain, 2) + + if isinstance(self, EEG_BLE): + self.data = np.round(data * self.v_ref / gain, 2) + return + # legacy code for devices other than BLE + self.data = np.round(data[1:, :] * self.v_ref / gain, 2) + # EEG32: status bits will change in future releases as we need to use 4 bytes for 32 channel status + self.status = self.int32_to_status(data[0, :]) + @staticmethod def int32_to_status(data): @@ -178,8 +186,7 @@ def get_ptp(self): return np.ptp(self.data, axis=1) def __str__(self): - return "EEG: " + str(self.data[:, -1]) + "\tEEG STATUS: ADS: " +\ - str(self.status['ads'][-1]) + ", SR: " + str(self.status['sr'][-1]) + return "EEG: " + str(self.data[:, -1]) class EEG94(EEG): @@ -202,8 +209,10 @@ class EEG98_USBC(EEG): def __init__(self, timestamp, payload, time_offset=0): super().__init__(timestamp, payload, time_offset, v_ref=2.4, n_packet=16) +class EEG_BLE(EEG): + pass -class EEG98_BLE(EEG): +class EEG98_BLE(EEG_BLE): """EEG packet for 8 channel device""" def __init__(self, timestamp, payload, time_offset=0): diff --git a/src/explorepy/parser.py b/src/explorepy/parser.py index 260a93f3..45650d15 100644 --- a/src/explorepy/parser.py +++ b/src/explorepy/parser.py @@ -10,19 +10,18 @@ from explorepy._exceptions import FletcherError from explorepy.packet import ( PACKET_CLASS_DICT, - TIMESTAMP_SCALE, DeviceInfo, PacketBIN ) from explorepy.settings_manager import SettingsManager -from explorepy.tools import get_local_time - +from explorepy.tools import get_local_time, is_ble_device, TIMESTAMP_SCALE_BLE, TIMESTAMP_SCALE logger = logging.getLogger(__name__) class Parser: """Data parser class""" + def __init__(self, callback, mode='device', debug=True): """ Args: @@ -55,7 +54,7 @@ def start_streaming(self, device_name, mac_address): if explorepy.get_bt_interface() == 'sdk': from explorepy.btcpp import SDKBtClient self.stream_interface = SDKBtClient(device_name=device_name, mac_address=mac_address) - elif explorepy.get_bt_interface() == 'ble': + elif is_ble_device(): from explorepy.btcpp import BLEClient self.stream_interface = BLEClient(device_name=device_name, mac_address=mac_address) elif explorepy.get_bt_interface() == 'mock': @@ -142,7 +141,7 @@ def _stream_loop(self): logger.warning('The binary file is corrupted. Conversion has ended incompletely.') self.stop_streaming() except FletcherError: - if explorepy.get_bt_interface() == 'ble': + if is_ble_device(): logger.warning('Incomplete packet received, parsing will continue.') self.seek_new_pid.set() else: @@ -179,11 +178,12 @@ def _generate_packet(self): payload = struct.unpack(' 500: raise FletcherError - timestamp = struct.unpack(' Date: Tue, 23 Apr 2024 16:16:36 +0200 Subject: [PATCH 42/78] check None condition --- src/explorepy/stream_processor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/explorepy/stream_processor.py b/src/explorepy/stream_processor.py index 75c5410b..89c2873b 100644 --- a/src/explorepy/stream_processor.py +++ b/src/explorepy/stream_processor.py @@ -383,7 +383,7 @@ def update_bt_stability_status(self, current_timestamp): self.instability_flag = False def is_connection_unstable(self): - if get_local_time() - self.last_exg_packet_timestamp > 1.5: + if get_local_time() - self.last_exg_packet_timestamp > 1.5 and self.bt_drop_start_time: self.last_bt_drop_duration = np.round(get_local_time() - self.bt_drop_start_time, 3) return self.instability_flag From 2d8c17475740fa1616c02b4b6479c8e3bd5b3871 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Thu, 25 Apr 2024 12:30:01 +0200 Subject: [PATCH 43/78] bugfix data vis to imp navigation --- src/explorepy/stream_processor.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/explorepy/stream_processor.py b/src/explorepy/stream_processor.py index 89c2873b..12578df3 100644 --- a/src/explorepy/stream_processor.py +++ b/src/explorepy/stream_processor.py @@ -2,6 +2,7 @@ """Stream Processor module This module is responsible for processing incoming stream from Explore device and publishing data to subscribers. """ +import copy import logging import threading import time @@ -153,7 +154,7 @@ def process(self, packet): self.dispatch(topic=TOPICS.raw_ExG, packet=packet) if self._is_imp_mode and self.imp_calculator: - packet_imp = self.imp_calculator.measure_imp(packet=packet) + packet_imp = self.imp_calculator.measure_imp(packet=copy.deepcopy(packet)) if packet_imp is not None: self.dispatch(topic=TOPICS.imp, packet=packet_imp) try: From b6cf29cfdd215f610437b2222b2deabb68a45f7f Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Thu, 25 Apr 2024 14:47:21 +0200 Subject: [PATCH 44/78] update scaling for hw and sw marker --- src/explorepy/packet.py | 4 ++-- src/explorepy/stream_processor.py | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/explorepy/packet.py b/src/explorepy/packet.py index b36afa8e..3d81344f 100644 --- a/src/explorepy/packet.py +++ b/src/explorepy/packet.py @@ -413,7 +413,7 @@ class ExternalMarker(EventMarker): """External marker packet""" def __init__(self, timestamp, payload, time_offset=0): - super().__init__(timestamp * TIMESTAMP_SCALE, payload, 0) + super().__init__(timestamp, payload, 0) self._label_prefix = "sw_" def _convert(self, bin_data): @@ -453,7 +453,7 @@ def _convert(self, bin_data): dtype=np.dtype(np.uint32).newbyteorder("<"), count=1, offset=0)) - self.timestamp = precise_ts / TIMESTAMP_SCALE + self._time_offset + self.timestamp = precise_ts / 100000 + self._time_offset code = np.ndarray.item( np.frombuffer(bin_data, dtype=np.dtype(np.uint16).newbyteorder("<"), diff --git a/src/explorepy/stream_processor.py b/src/explorepy/stream_processor.py index 12578df3..acd0a095 100644 --- a/src/explorepy/stream_processor.py +++ b/src/explorepy/stream_processor.py @@ -326,7 +326,6 @@ def set_ext_marker(self, marker_string, time_lsl=None): logger.info(f"Setting a software marker with code: {marker_string}") if time_lsl is None: time_lsl = self._get_sw_marker_time() - time_lsl /= TIMESTAMP_SCALE_BLE if is_ble_device() else TIMESTAMP_SCALE ext_marker = ExternalMarker.create(marker_string=marker_string, lsl_time=time_lsl) self.process(ext_marker) From a2b5ea9d1f83ff59821ac98456e2547d6b5fa098 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Thu, 25 Apr 2024 18:07:28 +0200 Subject: [PATCH 45/78] add bt scan method --- src/explorepy/tools.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/explorepy/tools.py b/src/explorepy/tools.py index 0ce5cae9..372efc04 100644 --- a/src/explorepy/tools.py +++ b/src/explorepy/tools.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- """Some useful tools such as file recorder, heart rate estimation, etc. used in explorepy""" +import asyncio import configparser import copy import csv @@ -18,6 +19,9 @@ user_cache_dir, user_config_dir ) +from bleak import( + BleakScanner +) from mne import ( export, io @@ -93,6 +97,21 @@ def bt_scan(): return explore_devices +async def scan_explore_devices(): + # Start scanning for devices + device_list = [] + devices = await BleakScanner.discover(timeout=5) + for d in devices: + if d.name is None: + continue + if d.name.startswith('Explore_'): + device_list.append(d.name) + return device_list + +def run_ble_scanner(): + device_list = asyncio.run(scan_explore_devices()) + print('got device list here{}'.format(device_list)) + return device_list def create_exg_recorder(filename, file_type, adc_mask, fs, do_overwrite, exg_ch=None): """ Create ExG recorder From e9c9b7a836488a1ed69fe0d907362439726e10f9 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Thu, 25 Apr 2024 18:08:24 +0200 Subject: [PATCH 46/78] add fixed timeout and delete timestamp reset --- src/explorepy/btcpp.py | 9 ++++++++- src/explorepy/parser.py | 10 +++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/explorepy/btcpp.py b/src/explorepy/btcpp.py index 85d64024..b89a2d5e 100644 --- a/src/explorepy/btcpp.py +++ b/src/explorepy/btcpp.py @@ -4,6 +4,7 @@ import asyncio import atexit import logging +import queue import threading import time from queue import Queue @@ -352,13 +353,19 @@ def read(self, n_bytes): """ try: if len(self.copy_buffer) < n_bytes: - get_item = self.buffer.get() + get_item = self.buffer.get(timeout=10) self.copy_buffer.extend(get_item) ret = self.copy_buffer[:n_bytes] self.copy_buffer = self.copy_buffer[n_bytes:] if len(ret) < n_bytes: + logger.info('data size mismatch in buffer, raising connection aborted error when trying to read {} bytes'.format(n_bytes)) raise ConnectionAbortedError('Error reading data from BLE stream, too many bytes requested') return ret + except queue.Empty: + logger.info( + 'Timeout in queue read, raising connection aborted error when trying to read {} bytes'.format( + n_bytes)) + raise ConnectionAbortedError('Timeout in read method') except Exception as error: logger.error('Unknown error reading data from BLE stream') raise ConnectionAbortedError(str(error)) diff --git a/src/explorepy/parser.py b/src/explorepy/parser.py index 45650d15..7c24fb73 100644 --- a/src/explorepy/parser.py +++ b/src/explorepy/parser.py @@ -7,7 +7,7 @@ from threading import Thread import explorepy -from explorepy._exceptions import FletcherError +from explorepy._exceptions import FletcherError, ReconnectionFlowError from explorepy.packet import ( PACKET_CLASS_DICT, DeviceInfo, @@ -117,6 +117,9 @@ def _stream_loop(self): try: packet = self._generate_packet() self.callback(packet=packet) + except ReconnectionFlowError: + logger.info('Got exception in reconnection flow, normal operation continues') + pass except ConnectionAbortedError as error: logger.debug(f"Got this error while streaming: {error}") logger.warning("Device has been disconnected! Scanning for the last connected device...") @@ -161,7 +164,8 @@ def _generate_packet(self): packet object """ while self.seek_new_pid.is_set(): - + if self._is_reconnecting: + raise ReconnectionFlowError() bytes_out = binascii.hexlify(bytearray(self.stream_interface.read(1))) if bytes_out == b'af' and binascii.hexlify(bytearray(self.stream_interface.read(3))) == b'beadde': self.seek_new_pid.clear() @@ -171,6 +175,7 @@ def _generate_packet(self): pid = raw_header[0] raw_payload = raw_header[2:4] raw_timestamp = raw_header[4:8] + except: raise FletcherError @@ -184,7 +189,6 @@ def _generate_packet(self): # Timestamp conversion if self._time_offset is None: self._time_offset = get_local_time() - timestamp - timestamp = 0 payload_data = self.stream_interface.read(payload - 4) if self.debug: From 64f8101c4c1178dbf67b739eed199638ccb0853a Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Mon, 29 Apr 2024 11:38:44 +0200 Subject: [PATCH 47/78] remove sorting on record end --- src/explorepy/tools.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/explorepy/tools.py b/src/explorepy/tools.py index 372efc04..a678d507 100644 --- a/src/explorepy/tools.py +++ b/src/explorepy/tools.py @@ -499,12 +499,6 @@ def stop(self): self._file_obj = None elif self.file_type == 'csv': self._file_obj.close() - # sort CSV rows - if "ExG" in self._file_name: - path = os.path.join(os.getcwd(), self._file_name) - data = pandas.read_csv(path, delimiter=",") - data = data.sort_values(by=['TimeStamp']) - pandas.DataFrame(data).to_csv(path, index=False) def _init_edf_channels(self): self._file_obj.setEquipment(self._device_name) From b132b30f36c4b680b44cca79b4800dde1f46a852 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Mon, 29 Apr 2024 11:43:25 +0200 Subject: [PATCH 48/78] set debug counter for dev info packet --- src/explorepy/explore.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/explorepy/explore.py b/src/explorepy/explore.py index 0a5d3136..06af261b 100644 --- a/src/explorepy/explore.py +++ b/src/explorepy/explore.py @@ -84,10 +84,11 @@ def connect(self, device_name=None, mac_address=None): self.stream_processor = StreamProcessor(debug=True if self.debug else False) self.stream_processor.start(device_name=device_name, mac_address=mac_address) cnt = 0 + cnt_limit = 20 if self.debug else 15 while "adc_mask" not in self.stream_processor.device_info: logger.info("Waiting for device info packet...") time.sleep(1) - if cnt >= 100: + if cnt >= cnt_limit: raise ConnectionAbortedError("Could not get info packet from the device") cnt += 1 From 68683f77c24e4b0000aeca220f85b8fc7047ed8b Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Mon, 29 Apr 2024 12:32:18 +0200 Subject: [PATCH 49/78] wrap disconenction during data stream --- src/explorepy/_exceptions.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/explorepy/_exceptions.py b/src/explorepy/_exceptions.py index adf7d88a..cab5aba1 100644 --- a/src/explorepy/_exceptions.py +++ b/src/explorepy/_exceptions.py @@ -34,6 +34,13 @@ class FletcherError(Exception): pass +class ReconnectionFlowError(Exception): + """ + Reconnection flow error, only thrown when device is reconnecting + """ + pass + + if sys.platform == "darwin": class BluetoothError(Exception): """ From fb847b9bd0af0016658ef482feea9185169fa199 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Tue, 30 Apr 2024 15:23:10 +0200 Subject: [PATCH 50/78] Feature improve reconnection (#301) * improve reconnection flow * reconnection attempt when device goes out of range * manual disconnection from software --- src/explorepy/btcpp.py | 97 ++++++++++++++++++++++++++++++------------ 1 file changed, 70 insertions(+), 27 deletions(-) diff --git a/src/explorepy/btcpp.py b/src/explorepy/btcpp.py index b89a2d5e..c182b001 100644 --- a/src/explorepy/btcpp.py +++ b/src/explorepy/btcpp.py @@ -23,7 +23,6 @@ InputError ) - logger = logging.getLogger(__name__) @@ -261,31 +260,60 @@ def __init__(self, device_name=None, mac_address=None): self.eeg_rx_char_uuid = "FFFE0002-B5A3-F393-E0A9-E50E24DCCA9E" self.rx_char = None self.buffer = Queue() - self.try_disconnect = False + self.try_disconnect = asyncio.Event() self.notification_thread = None self.copy_buffer = bytearray() self.read_event = asyncio.Event() self.data = None + self.connection_attempt_counter = 0 async def stream(self): - - async with BleakClient(self.ble_device) as client: - def handle_packet(sender, bt_byte_array): - # write packet to buffer - self.buffer.put(bt_byte_array) - - await client.start_notify(self.eeg_tx_char_uuid, handle_packet) - loop = asyncio.get_running_loop() - self.rx_char = client.services.get_service(self.eeg_service_uuid).get_characteristic(self.eeg_rx_char_uuid) - while True: - loop.run_in_executor(None, await self.read_event.wait()) - if self.data is None: - print('Client disconnection requested') - self.is_connected = False - break - await client.write_gatt_char(self.rx_char, self.data, response=False) - self.data = None - self.read_event.clear() + while True: + if not self.is_connected: + break + if self.try_disconnect.is_set(): + logger.info("scanning for device") + device = await BleakScanner.find_device_by_name(self.device_name, timeout=5) + + if device is None: + logger.debug("no device found, wait then scan again") + await asyncio.sleep(2) + if self.connection_attempt_counter <= 5: + self.connection_attempt_counter += 1 + continue + else: + self.disconnect() + self.connection_attempt_counter = 0 + + def disconnection_callback(_: BleakClient): + logger.debug("Device sent disconnection callback") + # cancelling all tasks effectively ends the program + if self.is_connected: + self.try_disconnect.set() + self.read_event.set() + + async with BleakClient(self.ble_device, disconnected_callback=disconnection_callback) as client: + def handle_packet(sender, bt_byte_array): + # write packet to buffer + self.buffer.put(bt_byte_array) + + await client.start_notify(self.eeg_tx_char_uuid, handle_packet) + loop = asyncio.get_running_loop() + self.rx_char = client.services.get_service(self.eeg_service_uuid).get_characteristic( + self.eeg_rx_char_uuid) + while True: + loop.run_in_executor(None, await self.read_event.wait()) + if self.data is None: + if self.try_disconnect.is_set() and self.is_connected: + logger.debug('Closing write thread, will attempt reconnection') + self.read_event.clear() + break + logger.debug('Client disconnection requested') + self.is_connected = False + break + await client.write_gatt_char(self.rx_char, self.data, response=False) + self.data = None + self.read_event.clear() def connect(self): """Connect to the device and return the socket @@ -295,7 +323,8 @@ def connect(self): """ asyncio.run(self._discover_device()) if self.ble_device is None: - print('No device found!!') + logger.info('No device found!!') + raise DeviceNotFoundError('Could not find device') else: logger.info('Device is connected') self.is_connected = True @@ -332,10 +361,21 @@ def reconnect(self): This function reconnects to the last bluetooth socket. If after 1 minute the connection doesn't succeed, program will end. """ - self.connect() + self.is_connected = False + for _ in range(5): + try: + logger.info('reconnection called from parser') + return 0 + except DeviceNotFoundError: + self.is_connected = False + logger.warning("Couldn't connect to the device. Trying to reconnect...") + time.sleep(2) + logger.error("Could not reconnect after 5 attempts. Closing the socket.") + return None def disconnect(self): """Disconnect from the device""" + self.is_connected = False self.read_event.set() self.stop_read_loop() @@ -358,14 +398,17 @@ def read(self, n_bytes): ret = self.copy_buffer[:n_bytes] self.copy_buffer = self.copy_buffer[n_bytes:] if len(ret) < n_bytes: - logger.info('data size mismatch in buffer, raising connection aborted error when trying to read {} bytes'.format(n_bytes)) + logger.info('data size mismatch in buffer, raising connection aborted error when trying to read {}' + 'bytes'.format(n_bytes)) raise ConnectionAbortedError('Error reading data from BLE stream, too many bytes requested') + self.try_disconnect.clear() return ret except queue.Empty: - logger.info( - 'Timeout in queue read, raising connection aborted error when trying to read {} bytes'.format( - n_bytes)) - raise ConnectionAbortedError('Timeout in read method') + if self.try_disconnect.is_set(): + logger.debug('No item in bluetooth buffer, initiating next read() call') + return self.read(n_bytes) + else: + logger.info('disconnection flag is not set, continuing') except Exception as error: logger.error('Unknown error reading data from BLE stream') raise ConnectionAbortedError(str(error)) From e26daec410f3fe6e07aafae7a67a08ef22a46a7c Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Thu, 2 May 2024 15:05:33 +0200 Subject: [PATCH 51/78] update board id for 8ch --- src/explorepy/settings_manager.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/explorepy/settings_manager.py b/src/explorepy/settings_manager.py index a0432cd1..b1b6ebc5 100644 --- a/src/explorepy/settings_manager.py +++ b/src/explorepy/settings_manager.py @@ -112,7 +112,8 @@ def update_device_settings(self, device_info_dict_update): self.settings_dict[self.software_channel_mask_key] = hardware_adc self.settings_dict[self.adc_mask_key] = self.settings_dict.get(self.software_channel_mask_key) if "board_id" in device_info_dict_update: - if self.settings_dict["board_id"] == "PCB_303_801D_XXX": + # 8 channel BLE board + if self.settings_dict["board_id"] == "PCB_303_801E_XXX": self.settings_dict[self.channel_count_key] = 8 self.settings_dict[self.hardware_channel_mask_key] = [1 for _ in range(8)] if self.software_channel_mask_key not in self.settings_dict: @@ -120,6 +121,7 @@ def update_device_settings(self, device_info_dict_update): self.settings_dict[self.software_channel_mask_key] = hardware_adc self.settings_dict[self.adc_mask_key] = self.settings_dict.get(self.software_channel_mask_key) if "board_id" in device_info_dict_update: + # 32 channel BLE board if self.settings_dict["board_id"] == "PCB_304_801p2_X": self.settings_dict[self.channel_count_key] = 32 self.settings_dict[self.hardware_channel_mask_key] = [1 for _ in range(32)] From dabf0e63685ec0f2c4fd73113cef38d0fa24229c Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Mon, 6 May 2024 12:26:00 +0200 Subject: [PATCH 52/78] add backward compatibility of old devices streaming --- src/explorepy/explore.py | 7 +++++++ src/explorepy/packet.py | 17 +++++++++++------ src/explorepy/parser.py | 11 ++++++++--- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/explorepy/explore.py b/src/explorepy/explore.py index 06af261b..e268e38e 100644 --- a/src/explorepy/explore.py +++ b/src/explorepy/explore.py @@ -19,6 +19,7 @@ import time from threading import Timer +import explorepy import numpy as np from appdirs import user_cache_dir @@ -287,6 +288,12 @@ def convert_bin(self, bin_file, out_dir='', file_type='edf', do_overwrite=False, def device_info_callback(packet): new_device_info = packet.get_info() + # TODO add 16 channel board id and refactor + # setting correct device interface + if 'board_id' not in new_device_info or new_device_info['board_id'] != 'PCB_304_801p2_X' or new_device_info[ + 'board_id'] != 'PCB_303_801E_XXX': + logger.debug('setting bt interface to sdk') + explorepy.set_bt_interface('sdk') if not self.stream_processor.compare_device_info(new_device_info): new_file_name = exg_out_file[:-4] + "_" + str(np.round(packet.timestamp, 0)) + '_ExG' new_meta_name = meta_out_file[:-4] + "_" + str(np.round(packet.timestamp, 0)) + '_Meta' diff --git a/src/explorepy/packet.py b/src/explorepy/packet.py index 3d81344f..df78e6b1 100644 --- a/src/explorepy/packet.py +++ b/src/explorepy/packet.py @@ -75,18 +75,18 @@ def __str__(self): """Print the data/info""" @staticmethod - def int24to32(bin_data): + def int24to32(bin_data, byteorder_data='little'): """Converts binary data to int32 Args: bin_data (list): list of bytes with the structure of int24 - + byteorder_data(string): decoder byteorder- big or little endien Returns: np.ndarray of int values """ assert len(bin_data) % 3 == 0, "Packet length error!" return np.asarray([ - int.from_bytes(bin_data[x:x + 3], byteorder="big", signed=True) + int.from_bytes(bin_data[x:x + 3], byteorder=byteorder_data, signed=True) for x in range(0, len(bin_data), 3) ]) @@ -117,12 +117,14 @@ def __init__(self, timestamp, payload, time_offset=0, v_ref=None, n_packet=None) self.n_packet = n_packet self.data = None self.imp_data = None + if not isinstance(self, EEG_BLE): + self.byteorder_data = 'little' super().__init__(timestamp, payload, time_offset) def _convert(self, bin_data): if not self.v_ref or not self.n_packet: raise ValueError("v_ref or n_packet cannot be null for conversion!") - data = Packet.int24to32(bin_data) + data = Packet.int24to32(bin_data, self.byteorder_data) n_chan = -1 data = data.reshape((self.n_packet, n_chan)).astype(float).T gain = EXG_UNIT * ((2 ** 23) - 1) * 6.0 @@ -210,13 +212,16 @@ def __init__(self, timestamp, payload, time_offset=0): super().__init__(timestamp, payload, time_offset, v_ref=2.4, n_packet=16) class EEG_BLE(EEG): - pass + def __init__(self, timestamp, payload, time_offset=0): + self.byteorder_data = 'big' + super().__init__(timestamp, payload, time_offset, v_ref=2.4, n_packet=1) + class EEG98_BLE(EEG_BLE): """EEG packet for 8 channel device""" def __init__(self, timestamp, payload, time_offset=0): - super().__init__(timestamp, payload, time_offset, v_ref=2.4, n_packet=1) + super().__init__(timestamp, payload, time_offset) class EEG32_BLE(EEG): diff --git a/src/explorepy/parser.py b/src/explorepy/parser.py index 7c24fb73..0c39f36a 100644 --- a/src/explorepy/parser.py +++ b/src/explorepy/parser.py @@ -181,11 +181,15 @@ def _generate_packet(self): # pid = struct.unpack('B', raw_pid)[0] payload = struct.unpack(' 500: - raise FletcherError + # max payload among all devices is 503, we need to make sure there is no corrupted data in payload length field + if payload > 550: + logger.debug('Got exception in payload determination, raising fletcher error') timestamp = struct.unpack(' Date: Tue, 7 May 2024 14:51:03 +0200 Subject: [PATCH 53/78] separate async events from main --- src/explorepy/btcpp.py | 83 +++++++++++---- src/explorepy/exploresdk.py | 205 ++++++++++++------------------------ 2 files changed, 127 insertions(+), 161 deletions(-) diff --git a/src/explorepy/btcpp.py b/src/explorepy/btcpp.py index c182b001..6260c5d7 100644 --- a/src/explorepy/btcpp.py +++ b/src/explorepy/btcpp.py @@ -254,6 +254,7 @@ def __init__(self, device_name=None, mac_address=None): """ super().__init__(device_name=device_name, mac_address=mac_address) + self.client = None self.ble_device = None self.eeg_service_uuid = "FFFE0001-B5A3-F393-E0A9-E50E24DCCA9E" self.eeg_tx_char_uuid = "FFFE0003-B5A3-F393-E0A9-E50E24DCCA9E" @@ -266,6 +267,7 @@ def __init__(self, device_name=None, mac_address=None): self.read_event = asyncio.Event() self.data = None self.connection_attempt_counter = 0 + self.result_queue = Queue() async def stream(self): while True: @@ -292,28 +294,40 @@ def disconnection_callback(_: BleakClient): self.try_disconnect.set() self.read_event.set() - async with BleakClient(self.ble_device, disconnected_callback=disconnection_callback) as client: - def handle_packet(sender, bt_byte_array): - # write packet to buffer - self.buffer.put(bt_byte_array) + self.client = BleakClient(self.ble_device, disconnected_callback=disconnection_callback) + loop = asyncio.get_running_loop() + connect_task = loop.create_task(self.client.connect()) + await connect_task - await client.start_notify(self.eeg_tx_char_uuid, handle_packet) + # async with BleakClient(self.ble_device) as client: + def handle_packet(sender, bt_byte_array): + # write packet to buffer + self.buffer.put(bt_byte_array) + + loop = asyncio.get_running_loop() + task = loop.create_task(self.client.start_notify(self.eeg_tx_char_uuid, handle_packet)) + await task + + self.rx_char = self.client.services.get_service(self.eeg_service_uuid).get_characteristic( + self.eeg_rx_char_uuid) + while True: loop = asyncio.get_running_loop() - self.rx_char = client.services.get_service(self.eeg_service_uuid).get_characteristic( - self.eeg_rx_char_uuid) - while True: + try: loop.run_in_executor(None, await self.read_event.wait()) - if self.data is None: - if self.try_disconnect.is_set() and self.is_connected: - logger.debug('Closing write thread, will attempt reconnection') - self.read_event.clear() - break - logger.debug('Client disconnection requested') - self.is_connected = False + except Exception: + print('Got exception while waiting for read event in BLE thread') + if self.data is None: + if self.try_disconnect.is_set() and self.is_connected: + logger.debug('Closing write thread, will attempt reconnection') + self.read_event.clear() break - await client.write_gatt_char(self.rx_char, self.data, response=False) - self.data = None - self.read_event.clear() + logger.debug('Client disconnection requested') + self.is_connected = False + print('ending connection here!!!!!!!') + break + await self.client.write_gatt_char(self.rx_char, self.data, response=False) + self.data = None + self.read_event.clear() def connect(self): """Connect to the device and return the socket @@ -321,34 +335,57 @@ def connect(self): Returns: socket (bluetooth.socket) """ - asyncio.run(self._discover_device()) + self.is_connected = True + self.notification_thread = threading.Thread(target=self.start_read_loop, daemon=True) + self.notification_thread.start() + print('waiting for BLE device to show up..') + self.result_queue.get() + if self.ble_device is None: logger.info('No device found!!') raise DeviceNotFoundError('Could not find device') else: logger.info('Device is connected') self.is_connected = True - self.notification_thread = threading.Thread(target=self.start_read_loop, daemon=True) - self.notification_thread.start() + atexit.register(self.disconnect) def start_read_loop(self): try: - asyncio.run(self.stream()) + asyncio.run(self.ble_manager()) except RuntimeError as error: logger.info('Shutting down BLE stream loop with error {}'.format(error)) + except asyncio.exceptions.CancelledError as error: + print('asyncio.exceptions.CancelledError from BLE stream thread {}'.format(error)) def stop_read_loop(self): print('calling stop!!') + + self.stream_task.cancel() self.notification_thread.join() + async def ble_manager(self): + try: + discovery_task = asyncio.create_task(self._discover_device()) + await discovery_task + print('finished here for discovery.....') + self.result_queue.put(True) + self.stream_task = asyncio.create_task(self.stream()) + await self.stream_task + except DeviceNotFoundError: + print('device not found------') + self.result_queue.put(False) + except Exception as error: + print('got an error with the message{}'.format(error)) + async def _discover_device(self): if self.mac_address: self.ble_device = await BleakScanner.find_device_by_address(self.mac_address) else: logger.info('Commencing device discovery') self.ble_device = await BleakScanner.find_device_by_name(self.device_name, timeout=15) - + if self.ble_device: + print('found device!!!!') if self.ble_device is None: print('No device found!!!!!') raise DeviceNotFoundError( diff --git a/src/explorepy/exploresdk.py b/src/explorepy/exploresdk.py index 5df28eee..7d91b5e0 100644 --- a/src/explorepy/exploresdk.py +++ b/src/explorepy/exploresdk.py @@ -1,15 +1,10 @@ -# This file was automatically generated by SWIG (http://www.swig.org). -# Version 4.0.1 +# This file was automatically generated by SWIG (https://www.swig.org). +# Version 4.1.1 # -# Do not make changes to this file unless you know what you are doing--modify +# Do not make changes to this file unless you know what you are doing - modify # the SWIG interface file instead. from sys import version_info as _swig_python_version_info - - -if _swig_python_version_info < (2, 7, 0): - raise RuntimeError("Python 2.7 or later required") - # Import the low-level C/C++ module if __package__ or "." in __name__: from . import _exploresdk @@ -31,10 +26,10 @@ def _swig_repr(self): def _swig_setattr_nondynamic_instance_variable(set): def set_instance_attr(self, name, value): - if name == "thisown": - self.this.own(value) - elif name == "this": + if name == "this": set(self, name, value) + elif name == "thisown": + self.this.own(value) elif hasattr(self, name) and isinstance(getattr(type(self), name), property): set(self, name, value) else: @@ -63,8 +58,10 @@ class _SwigNonDynamicMeta(type): __setattr__ = _swig_setattr_nondynamic_class_variable(type.__setattr__) -import collections.abc - +if _swig_python_version_info[0:2] >= (3, 3): + import collections.abc +else: + import collections class SwigPyIterator(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -74,59 +71,58 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr __swig_destroy__ = _exploresdk.delete_SwigPyIterator - def value(self) -> "PyObject *": + def value(self): return _exploresdk.SwigPyIterator_value(self) - def incr(self, n: "size_t"=1) -> "swig::SwigPyIterator *": + def incr(self, n=1): return _exploresdk.SwigPyIterator_incr(self, n) - def decr(self, n: "size_t"=1) -> "swig::SwigPyIterator *": + def decr(self, n=1): return _exploresdk.SwigPyIterator_decr(self, n) - def distance(self, x: "SwigPyIterator") -> "ptrdiff_t": + def distance(self, x): return _exploresdk.SwigPyIterator_distance(self, x) - def equal(self, x: "SwigPyIterator") -> "bool": + def equal(self, x): return _exploresdk.SwigPyIterator_equal(self, x) - def copy(self) -> "swig::SwigPyIterator *": + def copy(self): return _exploresdk.SwigPyIterator_copy(self) - def next(self) -> "PyObject *": + def next(self): return _exploresdk.SwigPyIterator_next(self) - def __next__(self) -> "PyObject *": + def __next__(self): return _exploresdk.SwigPyIterator___next__(self) - def previous(self) -> "PyObject *": + def previous(self): return _exploresdk.SwigPyIterator_previous(self) - def advance(self, n: "ptrdiff_t") -> "swig::SwigPyIterator *": + def advance(self, n): return _exploresdk.SwigPyIterator_advance(self, n) - def __eq__(self, x: "SwigPyIterator") -> "bool": + def __eq__(self, x): return _exploresdk.SwigPyIterator___eq__(self, x) - def __ne__(self, x: "SwigPyIterator") -> "bool": + def __ne__(self, x): return _exploresdk.SwigPyIterator___ne__(self, x) - def __iadd__(self, n: "ptrdiff_t") -> "swig::SwigPyIterator &": + def __iadd__(self, n): return _exploresdk.SwigPyIterator___iadd__(self, n) - def __isub__(self, n: "ptrdiff_t") -> "swig::SwigPyIterator &": + def __isub__(self, n): return _exploresdk.SwigPyIterator___isub__(self, n) - def __add__(self, n: "ptrdiff_t") -> "swig::SwigPyIterator *": + def __add__(self, n): return _exploresdk.SwigPyIterator___add__(self, n) - def __sub__(self, *args) -> "ptrdiff_t": + def __sub__(self, *args): return _exploresdk.SwigPyIterator___sub__(self, *args) def __iter__(self): return self # Register SwigPyIterator in _exploresdk: _exploresdk.SwigPyIterator_swigregister(SwigPyIterator) - class BTSerialPortBinding(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -136,192 +132,131 @@ def __init__(self, *args, **kwargs): __swig_destroy__ = _exploresdk.delete_BTSerialPortBinding @staticmethod - def Create(address: "std::string", channelID: "int") -> "BTSerialPortBinding *": + def Create(address, channelID): return _exploresdk.BTSerialPortBinding_Create(address, channelID) - def Connect(self) -> "int": + def Connect(self): return _exploresdk.BTSerialPortBinding_Connect(self) - def Close(self) -> "void": + def Close(self): return _exploresdk.BTSerialPortBinding_Close(self) - def Read(self, bt_buffer: "char *") -> "void": + def Read(self, bt_buffer): return _exploresdk.BTSerialPortBinding_Read(self, bt_buffer) - def Write(self, write_buffer: "char const *") -> "void": + def Write(self, write_buffer): return _exploresdk.BTSerialPortBinding_Write(self, write_buffer) - def IsDataAvailable(self) -> "bool": + def IsDataAvailable(self): return _exploresdk.BTSerialPortBinding_IsDataAvailable(self) # Register BTSerialPortBinding in _exploresdk: _exploresdk.BTSerialPortBinding_swigregister(BTSerialPortBinding) - -def BTSerialPortBinding_Create(address: "std::string", channelID: "int") -> "BTSerialPortBinding *": - return _exploresdk.BTSerialPortBinding_Create(address, channelID) - -class vectordevice(collections.abc.MutableSequence): +class vectordevice(collections.abc.MutableSequence if _swig_python_version_info >= (3, 3) else collections.MutableSequence): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr - def iterator(self) -> "swig::SwigPyIterator *": + def iterator(self): return _exploresdk.vectordevice_iterator(self) def __iter__(self): return self.iterator() - def __nonzero__(self) -> "bool": + def __nonzero__(self): return _exploresdk.vectordevice___nonzero__(self) - def __bool__(self) -> "bool": + def __bool__(self): return _exploresdk.vectordevice___bool__(self) - def __len__(self) -> "std::vector< device >::size_type": + def __len__(self): return _exploresdk.vectordevice___len__(self) - def __getslice__(self, i: "std::vector< device >::difference_type", j: "std::vector< device >::difference_type") -> "std::vector< device,std::allocator< device > > *": + def __getslice__(self, i, j): return _exploresdk.vectordevice___getslice__(self, i, j) - def __setslice__(self, *args) -> "void": + def __setslice__(self, *args): return _exploresdk.vectordevice___setslice__(self, *args) - def __delslice__(self, i: "std::vector< device >::difference_type", j: "std::vector< device >::difference_type") -> "void": + def __delslice__(self, i, j): return _exploresdk.vectordevice___delslice__(self, i, j) - def __delitem__(self, *args) -> "void": + def __delitem__(self, *args): return _exploresdk.vectordevice___delitem__(self, *args) - def __getitem__(self, *args) -> "std::vector< device >::value_type const &": + def __getitem__(self, *args): return _exploresdk.vectordevice___getitem__(self, *args) - def __setitem__(self, *args) -> "void": + def __setitem__(self, *args): return _exploresdk.vectordevice___setitem__(self, *args) - def pop(self) -> "std::vector< device >::value_type": + def pop(self): return _exploresdk.vectordevice_pop(self) - def append(self, x: "device") -> "void": + def append(self, x): return _exploresdk.vectordevice_append(self, x) - def empty(self) -> "bool": + def empty(self): return _exploresdk.vectordevice_empty(self) - def size(self) -> "std::vector< device >::size_type": + def size(self): return _exploresdk.vectordevice_size(self) - def swap(self, v: "vectordevice") -> "void": + def swap(self, v): return _exploresdk.vectordevice_swap(self, v) - def begin(self) -> "std::vector< device >::iterator": + def begin(self): return _exploresdk.vectordevice_begin(self) - def end(self) -> "std::vector< device >::iterator": + def end(self): return _exploresdk.vectordevice_end(self) - def rbegin(self) -> "std::vector< device >::reverse_iterator": + def rbegin(self): return _exploresdk.vectordevice_rbegin(self) - def rend(self) -> "std::vector< device >::reverse_iterator": + def rend(self): return _exploresdk.vectordevice_rend(self) - def clear(self) -> "void": + def clear(self): return _exploresdk.vectordevice_clear(self) - def get_allocator(self) -> "std::vector< device >::allocator_type": + def get_allocator(self): return _exploresdk.vectordevice_get_allocator(self) - def pop_back(self) -> "void": + def pop_back(self): return _exploresdk.vectordevice_pop_back(self) - def erase(self, *args) -> "std::vector< device >::iterator": + def erase(self, *args): return _exploresdk.vectordevice_erase(self, *args) def __init__(self, *args): _exploresdk.vectordevice_swiginit(self, _exploresdk.new_vectordevice(*args)) - def push_back(self, x: "device") -> "void": + def push_back(self, x): return _exploresdk.vectordevice_push_back(self, x) - def front(self) -> "std::vector< device >::value_type const &": + def front(self): return _exploresdk.vectordevice_front(self) - def back(self) -> "std::vector< device >::value_type const &": + def back(self): return _exploresdk.vectordevice_back(self) - def assign(self, n: "std::vector< device >::size_type", x: "device") -> "void": + def assign(self, n, x): return _exploresdk.vectordevice_assign(self, n, x) - def resize(self, *args) -> "void": + def resize(self, *args): return _exploresdk.vectordevice_resize(self, *args) - def insert(self, *args) -> "void": + def insert(self, *args): return _exploresdk.vectordevice_insert(self, *args) - def reserve(self, n: "std::vector< device >::size_type") -> "void": + def reserve(self, n): return _exploresdk.vectordevice_reserve(self, n) - def capacity(self) -> "std::vector< device >::size_type": + def capacity(self): return _exploresdk.vectordevice_capacity(self) __swig_destroy__ = _exploresdk.delete_vectordevice # Register vectordevice in _exploresdk: _exploresdk.vectordevice_swigregister(vectordevice) - -class ExploreException(object): - thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") - __repr__ = _swig_repr - - def __init__(self, message: "std::string"): - _exploresdk.ExploreException_swiginit(self, _exploresdk.new_ExploreException(message)) - - def what(self) -> "char const *": - return _exploresdk.ExploreException_what(self) - __swig_destroy__ = _exploresdk.delete_ExploreException - -# Register ExploreException in _exploresdk: -_exploresdk.ExploreException_swigregister(ExploreException) - -class ExploreReadBufferException(object): - thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") - __repr__ = _swig_repr - - def __init__(self, message: "std::string"): - _exploresdk.ExploreReadBufferException_swiginit(self, _exploresdk.new_ExploreReadBufferException(message)) - - def what(self) -> "char const *": - return _exploresdk.ExploreReadBufferException_what(self) - __swig_destroy__ = _exploresdk.delete_ExploreReadBufferException - -# Register ExploreReadBufferException in _exploresdk: -_exploresdk.ExploreReadBufferException_swigregister(ExploreReadBufferException) - -class ExploreIOException(object): - thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") - __repr__ = _swig_repr - - def __init__(self, message: "std::string"): - _exploresdk.ExploreIOException_swiginit(self, _exploresdk.new_ExploreIOException(message)) - - def what(self) -> "char const *": - return _exploresdk.ExploreIOException_what(self) - __swig_destroy__ = _exploresdk.delete_ExploreIOException - -# Register ExploreIOException in _exploresdk: -_exploresdk.ExploreIOException_swigregister(ExploreIOException) - -class ExploreBtSocketException(object): - thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") - __repr__ = _swig_repr - - def __init__(self, message: "std::string"): - _exploresdk.ExploreBtSocketException_swiginit(self, _exploresdk.new_ExploreBtSocketException(message)) - - def what(self) -> "char const *": - return _exploresdk.ExploreBtSocketException_what(self) - __swig_destroy__ = _exploresdk.delete_ExploreBtSocketException - -# Register ExploreBtSocketException in _exploresdk: -_exploresdk.ExploreBtSocketException_swigregister(ExploreBtSocketException) - class device(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr @@ -339,7 +274,6 @@ def __init__(self): # Register device in _exploresdk: _exploresdk.device_swigregister(device) - class ExploreSDK(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -349,20 +283,15 @@ def __init__(self, *args, **kwargs): __swig_destroy__ = _exploresdk.delete_ExploreSDK @staticmethod - def Create() -> "ExploreSDK *": + def Create(): return _exploresdk.ExploreSDK_Create() - def PerformDeviceSearch(self, length: "int"=8) -> "std::vector< device,std::allocator< device > >": + def PerformDeviceSearch(self, length=8): return _exploresdk.ExploreSDK_PerformDeviceSearch(self, length) - def SdpSearch(self, address: "std::string") -> "int": + def SdpSearch(self, address): return _exploresdk.ExploreSDK_SdpSearch(self, address) # Register ExploreSDK in _exploresdk: _exploresdk.ExploreSDK_swigregister(ExploreSDK) -def ExploreSDK_Create() -> "ExploreSDK *": - return _exploresdk.ExploreSDK_Create() - - - From 5c2b6feff05e6a4dae172af4bec9529bfb4efe50 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Tue, 7 May 2024 14:56:20 +0200 Subject: [PATCH 54/78] handle setup for Mac --- setup.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/setup.py b/setup.py index 8a8ccb7a..7c5ba1b1 100644 --- a/setup.py +++ b/setup.py @@ -80,6 +80,10 @@ def read(*names, **kwargs): extra_link_args=["-lbluetooth"], swig_opts=['-c++'] )) + else: + # Handle Mac OSX setup + os.system('cp lib/mac/_exploresdk.so src/explorepy') + os.system('cp lib/mac/exploresdk.py src/explorepy') setup( name='explorepy', version='2.0.0', From 1db60aa788fb9c1b3d44fbb7a22a841ad9a47a71 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Wed, 8 May 2024 13:46:59 +0200 Subject: [PATCH 55/78] auto interface selection for mac --- src/explorepy/btcpp.py | 4 ++-- src/explorepy/parser.py | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/explorepy/btcpp.py b/src/explorepy/btcpp.py index 6260c5d7..df152aff 100644 --- a/src/explorepy/btcpp.py +++ b/src/explorepy/btcpp.py @@ -121,7 +121,7 @@ def connect(self): for _ in range(5): try: - self.bt_serial_port_manager = exploresdk.BTSerialPortBinding_Create(self.mac_address, 5) + self.bt_serial_port_manager = exploresdk.BTSerialPortBinding.Create(self.mac_address, 5) return_code = self.bt_serial_port_manager.Connect() logger.debug("Return code for connection attempt is : {}".format(return_code)) @@ -166,7 +166,7 @@ def reconnect(self): """ self.is_connected = False for _ in range(5): - self.bt_serial_port_manager = exploresdk.BTSerialPortBinding_Create(self.mac_address, 5) + self.bt_serial_port_manager = exploresdk.BTSerialPortBinding.Create(self.mac_address, 5) connection_error_code = self.bt_serial_port_manager.Connect() logger.debug("Got an exception while connecting to the device: {}".format(connection_error_code)) if connection_error_code == 0: diff --git a/src/explorepy/parser.py b/src/explorepy/parser.py index 0c39f36a..b4a90d6f 100644 --- a/src/explorepy/parser.py +++ b/src/explorepy/parser.py @@ -15,7 +15,7 @@ ) from explorepy.settings_manager import SettingsManager from explorepy.tools import get_local_time, is_ble_device, TIMESTAMP_SCALE_BLE, TIMESTAMP_SCALE - +import sys logger = logging.getLogger(__name__) @@ -50,7 +50,8 @@ def start_streaming(self, device_name, mac_address): """Start streaming data from Explore device""" self.device_name = device_name if not device_name[-4:].isalpha(): - explorepy.set_bt_interface('sdk') + interface = 'pyserial' if sys.platform == "darwin" else 'sdk' + explorepy.set_bt_interface(interface) if explorepy.get_bt_interface() == 'sdk': from explorepy.btcpp import SDKBtClient self.stream_interface = SDKBtClient(device_name=device_name, mac_address=mac_address) From 2c07e6e59a7267a67361a433a394f0d7cff73d48 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Mon, 13 May 2024 13:54:55 +0200 Subject: [PATCH 56/78] inherit correct parent class for 32 channel device --- src/explorepy/packet.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/explorepy/packet.py b/src/explorepy/packet.py index df78e6b1..dcaf7182 100644 --- a/src/explorepy/packet.py +++ b/src/explorepy/packet.py @@ -224,11 +224,11 @@ def __init__(self, timestamp, payload, time_offset=0): super().__init__(timestamp, payload, time_offset) -class EEG32_BLE(EEG): +class EEG32_BLE(EEG_BLE): """EEG packet for 32 channel BLE device""" def __init__(self, timestamp, payload, time_offset=0): - super().__init__(timestamp, payload, time_offset, v_ref=2.4, n_packet=1) + super().__init__(timestamp, payload, time_offset) class EEG99(EEG): From bf302d3105143a1f9f2a2f3ff8b578da07f6efe0 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Tue, 14 May 2024 10:03:13 +0200 Subject: [PATCH 57/78] use async disconnection api --- src/explorepy/btcpp.py | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/explorepy/btcpp.py b/src/explorepy/btcpp.py index df152aff..7a0a6693 100644 --- a/src/explorepy/btcpp.py +++ b/src/explorepy/btcpp.py @@ -305,8 +305,11 @@ def handle_packet(sender, bt_byte_array): self.buffer.put(bt_byte_array) loop = asyncio.get_running_loop() - task = loop.create_task(self.client.start_notify(self.eeg_tx_char_uuid, handle_packet)) - await task + self.notify_task = loop.create_task(self.client.start_notify(self.eeg_tx_char_uuid, handle_packet)) + try: + await self.notify_task + except asyncio.CancelledError: + print("Notify task is cancelled now") self.rx_char = self.client.services.get_service(self.eeg_service_uuid).get_characteristic( self.eeg_rx_char_uuid) @@ -323,7 +326,7 @@ def handle_packet(sender, bt_byte_array): break logger.debug('Client disconnection requested') self.is_connected = False - print('ending connection here!!!!!!!') + await self.client.disconnect() break await self.client.write_gatt_char(self.rx_char, self.data, response=False) self.data = None @@ -356,10 +359,10 @@ def start_read_loop(self): except RuntimeError as error: logger.info('Shutting down BLE stream loop with error {}'.format(error)) except asyncio.exceptions.CancelledError as error: - print('asyncio.exceptions.CancelledError from BLE stream thread {}'.format(error)) + logger.debug('asyncio.exceptions.CancelledError from BLE stream thread {}'.format(error)) def stop_read_loop(self): - print('calling stop!!') + logger.debug('Stopping BLE stream loop') self.stream_task.cancel() self.notification_thread.join() @@ -368,13 +371,13 @@ async def ble_manager(self): try: discovery_task = asyncio.create_task(self._discover_device()) await discovery_task - print('finished here for discovery.....') + logger.debug('Finished device discovery..') self.result_queue.put(True) self.stream_task = asyncio.create_task(self.stream()) await self.stream_task except DeviceNotFoundError: - print('device not found------') self.result_queue.put(False) + logger.debug('No matching device found') except Exception as error: print('got an error with the message{}'.format(error)) @@ -385,9 +388,9 @@ async def _discover_device(self): logger.info('Commencing device discovery') self.ble_device = await BleakScanner.find_device_by_name(self.device_name, timeout=15) if self.ble_device: - print('found device!!!!') + logger.debug('found device!!!!') if self.ble_device is None: - print('No device found!!!!!') + logger.debug('No device found!!!!!') raise DeviceNotFoundError( "Could not discover the device! Please make sure the device is on and in advertising mode." ) @@ -413,7 +416,9 @@ def reconnect(self): def disconnect(self): """Disconnect from the device""" self.is_connected = False + self.notify_task.cancel() self.read_event.set() + time.sleep(1) self.stop_read_loop() def _find_mac_address(self): @@ -457,5 +462,5 @@ def send(self, data): data (bytearray): Data to be sent """ self.data = data - print('sending data to device') + logger.debug('sending data to device') self.read_event.set() From aeaeb9276fbc0bf7eade037d0fa20e2504f17c59 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Tue, 14 May 2024 14:54:06 +0200 Subject: [PATCH 58/78] trigger in timetamp with backward compatibility --- src/explorepy/packet.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/explorepy/packet.py b/src/explorepy/packet.py index dcaf7182..c979477c 100644 --- a/src/explorepy/packet.py +++ b/src/explorepy/packet.py @@ -6,6 +6,7 @@ import struct from enum import IntEnum +import explorepy.tools import numpy as np from explorepy._exceptions import FletcherError @@ -458,7 +459,8 @@ def _convert(self, bin_data): dtype=np.dtype(np.uint32).newbyteorder("<"), count=1, offset=0)) - self.timestamp = precise_ts / 100000 + self._time_offset + scale = 100000 if explorepy.tools.is_ble_device() else 10000 + self.timestamp = precise_ts / scale + self._time_offset code = np.ndarray.item( np.frombuffer(bin_data, dtype=np.dtype(np.uint16).newbyteorder("<"), From 670dadfa04b823a9c5d6594c57171600efb1c0aa Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Tue, 14 May 2024 14:54:36 +0200 Subject: [PATCH 59/78] exploresdk default for windows --- src/explorepy/exploresdk.py | 217 +++++++++++++++++++++++++----------- 1 file changed, 149 insertions(+), 68 deletions(-) diff --git a/src/explorepy/exploresdk.py b/src/explorepy/exploresdk.py index 7d91b5e0..e13c341c 100644 --- a/src/explorepy/exploresdk.py +++ b/src/explorepy/exploresdk.py @@ -1,10 +1,13 @@ -# This file was automatically generated by SWIG (https://www.swig.org). -# Version 4.1.1 +# This file was automatically generated by SWIG (http://www.swig.org). +# Version 4.0.1 # -# Do not make changes to this file unless you know what you are doing - modify +# Do not make changes to this file unless you know what you are doing--modify # the SWIG interface file instead. from sys import version_info as _swig_python_version_info +if _swig_python_version_info < (2, 7, 0): + raise RuntimeError("Python 2.7 or later required") + # Import the low-level C/C++ module if __package__ or "." in __name__: from . import _exploresdk @@ -26,10 +29,10 @@ def _swig_repr(self): def _swig_setattr_nondynamic_instance_variable(set): def set_instance_attr(self, name, value): - if name == "this": - set(self, name, value) - elif name == "thisown": + if name == "thisown": self.this.own(value) + elif name == "this": + set(self, name, value) elif hasattr(self, name) and isinstance(getattr(type(self), name), property): set(self, name, value) else: @@ -58,11 +61,7 @@ class _SwigNonDynamicMeta(type): __setattr__ = _swig_setattr_nondynamic_class_variable(type.__setattr__) -if _swig_python_version_info[0:2] >= (3, 3): - import collections.abc -else: - import collections - +import collections.abc class SwigPyIterator(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -71,58 +70,59 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr __swig_destroy__ = _exploresdk.delete_SwigPyIterator - def value(self): + def value(self) -> "PyObject *": return _exploresdk.SwigPyIterator_value(self) - def incr(self, n=1): + def incr(self, n: "size_t"=1) -> "swig::SwigPyIterator *": return _exploresdk.SwigPyIterator_incr(self, n) - def decr(self, n=1): + def decr(self, n: "size_t"=1) -> "swig::SwigPyIterator *": return _exploresdk.SwigPyIterator_decr(self, n) - def distance(self, x): + def distance(self, x: "SwigPyIterator") -> "ptrdiff_t": return _exploresdk.SwigPyIterator_distance(self, x) - def equal(self, x): + def equal(self, x: "SwigPyIterator") -> "bool": return _exploresdk.SwigPyIterator_equal(self, x) - def copy(self): + def copy(self) -> "swig::SwigPyIterator *": return _exploresdk.SwigPyIterator_copy(self) - def next(self): + def next(self) -> "PyObject *": return _exploresdk.SwigPyIterator_next(self) - def __next__(self): + def __next__(self) -> "PyObject *": return _exploresdk.SwigPyIterator___next__(self) - def previous(self): + def previous(self) -> "PyObject *": return _exploresdk.SwigPyIterator_previous(self) - def advance(self, n): + def advance(self, n: "ptrdiff_t") -> "swig::SwigPyIterator *": return _exploresdk.SwigPyIterator_advance(self, n) - def __eq__(self, x): + def __eq__(self, x: "SwigPyIterator") -> "bool": return _exploresdk.SwigPyIterator___eq__(self, x) - def __ne__(self, x): + def __ne__(self, x: "SwigPyIterator") -> "bool": return _exploresdk.SwigPyIterator___ne__(self, x) - def __iadd__(self, n): + def __iadd__(self, n: "ptrdiff_t") -> "swig::SwigPyIterator &": return _exploresdk.SwigPyIterator___iadd__(self, n) - def __isub__(self, n): + def __isub__(self, n: "ptrdiff_t") -> "swig::SwigPyIterator &": return _exploresdk.SwigPyIterator___isub__(self, n) - def __add__(self, n): + def __add__(self, n: "ptrdiff_t") -> "swig::SwigPyIterator *": return _exploresdk.SwigPyIterator___add__(self, n) - def __sub__(self, *args): + def __sub__(self, *args) -> "ptrdiff_t": return _exploresdk.SwigPyIterator___sub__(self, *args) def __iter__(self): return self # Register SwigPyIterator in _exploresdk: _exploresdk.SwigPyIterator_swigregister(SwigPyIterator) + class BTSerialPortBinding(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -132,131 +132,206 @@ def __init__(self, *args, **kwargs): __swig_destroy__ = _exploresdk.delete_BTSerialPortBinding @staticmethod - def Create(address, channelID): + def Create(address: "std::string", channelID: "int") -> "BTSerialPortBinding *": return _exploresdk.BTSerialPortBinding_Create(address, channelID) - def Connect(self): + def Connect(self) -> "int": return _exploresdk.BTSerialPortBinding_Connect(self) - def Close(self): + def Close(self) -> "void": return _exploresdk.BTSerialPortBinding_Close(self) - def Read(self, bt_buffer): + def Read(self, bt_buffer: "char *") -> "void": return _exploresdk.BTSerialPortBinding_Read(self, bt_buffer) - def Write(self, write_buffer): + def Write(self, write_buffer: "char const *") -> "void": return _exploresdk.BTSerialPortBinding_Write(self, write_buffer) - def IsDataAvailable(self): + def IsDataAvailable(self) -> "bool": return _exploresdk.BTSerialPortBinding_IsDataAvailable(self) # Register BTSerialPortBinding in _exploresdk: _exploresdk.BTSerialPortBinding_swigregister(BTSerialPortBinding) -class vectordevice(collections.abc.MutableSequence if _swig_python_version_info >= (3, 3) else collections.MutableSequence): + +def BTSerialPortBinding_Create(address: "std::string", channelID: "int") -> "BTSerialPortBinding *": + return _exploresdk.BTSerialPortBinding_Create(address, channelID) + +class vectordevice(collections.abc.MutableSequence): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr - def iterator(self): + def iterator(self) -> "swig::SwigPyIterator *": return _exploresdk.vectordevice_iterator(self) def __iter__(self): return self.iterator() - def __nonzero__(self): + def __nonzero__(self) -> "bool": return _exploresdk.vectordevice___nonzero__(self) - def __bool__(self): + def __bool__(self) -> "bool": return _exploresdk.vectordevice___bool__(self) - def __len__(self): + def __len__(self) -> "std::vector< device >::size_type": return _exploresdk.vectordevice___len__(self) - def __getslice__(self, i, j): + def __getslice__(self, i: "std::vector< device >::difference_type", j: "std::vector< device >::difference_type") -> "std::vector< device,std::allocator< device > > *": return _exploresdk.vectordevice___getslice__(self, i, j) - def __setslice__(self, *args): + def __setslice__(self, *args) -> "void": return _exploresdk.vectordevice___setslice__(self, *args) - def __delslice__(self, i, j): + def __delslice__(self, i: "std::vector< device >::difference_type", j: "std::vector< device >::difference_type") -> "void": return _exploresdk.vectordevice___delslice__(self, i, j) - def __delitem__(self, *args): + def __delitem__(self, *args) -> "void": return _exploresdk.vectordevice___delitem__(self, *args) - def __getitem__(self, *args): + def __getitem__(self, *args) -> "std::vector< device >::value_type const &": return _exploresdk.vectordevice___getitem__(self, *args) - def __setitem__(self, *args): + def __setitem__(self, *args) -> "void": return _exploresdk.vectordevice___setitem__(self, *args) - def pop(self): + def pop(self) -> "std::vector< device >::value_type": return _exploresdk.vectordevice_pop(self) - def append(self, x): + def append(self, x: "device") -> "void": return _exploresdk.vectordevice_append(self, x) - def empty(self): + def empty(self) -> "bool": return _exploresdk.vectordevice_empty(self) - def size(self): + def size(self) -> "std::vector< device >::size_type": return _exploresdk.vectordevice_size(self) - def swap(self, v): + def swap(self, v: "vectordevice") -> "void": return _exploresdk.vectordevice_swap(self, v) - def begin(self): + def begin(self) -> "std::vector< device >::iterator": return _exploresdk.vectordevice_begin(self) - def end(self): + def end(self) -> "std::vector< device >::iterator": return _exploresdk.vectordevice_end(self) - def rbegin(self): + def rbegin(self) -> "std::vector< device >::reverse_iterator": return _exploresdk.vectordevice_rbegin(self) - def rend(self): + def rend(self) -> "std::vector< device >::reverse_iterator": return _exploresdk.vectordevice_rend(self) - def clear(self): + def clear(self) -> "void": return _exploresdk.vectordevice_clear(self) - def get_allocator(self): + def get_allocator(self) -> "std::vector< device >::allocator_type": return _exploresdk.vectordevice_get_allocator(self) - def pop_back(self): + def pop_back(self) -> "void": return _exploresdk.vectordevice_pop_back(self) - def erase(self, *args): + def erase(self, *args) -> "std::vector< device >::iterator": return _exploresdk.vectordevice_erase(self, *args) def __init__(self, *args): _exploresdk.vectordevice_swiginit(self, _exploresdk.new_vectordevice(*args)) - def push_back(self, x): + def push_back(self, x: "device") -> "void": return _exploresdk.vectordevice_push_back(self, x) - def front(self): + def front(self) -> "std::vector< device >::value_type const &": return _exploresdk.vectordevice_front(self) - def back(self): + def back(self) -> "std::vector< device >::value_type const &": return _exploresdk.vectordevice_back(self) - def assign(self, n, x): + def assign(self, n: "std::vector< device >::size_type", x: "device") -> "void": return _exploresdk.vectordevice_assign(self, n, x) - def resize(self, *args): + def resize(self, *args) -> "void": return _exploresdk.vectordevice_resize(self, *args) - def insert(self, *args): + def insert(self, *args) -> "void": return _exploresdk.vectordevice_insert(self, *args) - def reserve(self, n): + def reserve(self, n: "std::vector< device >::size_type") -> "void": return _exploresdk.vectordevice_reserve(self, n) - def capacity(self): + def capacity(self) -> "std::vector< device >::size_type": return _exploresdk.vectordevice_capacity(self) __swig_destroy__ = _exploresdk.delete_vectordevice # Register vectordevice in _exploresdk: _exploresdk.vectordevice_swigregister(vectordevice) + +class ExploreException(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + + def __init__(self, message: "std::string"): + _exploresdk.ExploreException_swiginit(self, _exploresdk.new_ExploreException(message)) + + def what(self) -> "char const *": + return _exploresdk.ExploreException_what(self) + __swig_destroy__ = _exploresdk.delete_ExploreException + +# Register ExploreException in _exploresdk: +_exploresdk.ExploreException_swigregister(ExploreException) + +class ExploreReadBufferException(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + + def __init__(self, message: "std::string"): + _exploresdk.ExploreReadBufferException_swiginit(self, _exploresdk.new_ExploreReadBufferException(message)) + + def what(self) -> "char const *": + return _exploresdk.ExploreReadBufferException_what(self) + __swig_destroy__ = _exploresdk.delete_ExploreReadBufferException + +# Register ExploreReadBufferException in _exploresdk: +_exploresdk.ExploreReadBufferException_swigregister(ExploreReadBufferException) + +class ExploreIOException(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + + def __init__(self, message: "std::string"): + _exploresdk.ExploreIOException_swiginit(self, _exploresdk.new_ExploreIOException(message)) + + def what(self) -> "char const *": + return _exploresdk.ExploreIOException_what(self) + __swig_destroy__ = _exploresdk.delete_ExploreIOException + +# Register ExploreIOException in _exploresdk: +_exploresdk.ExploreIOException_swigregister(ExploreIOException) + +class ExploreBtSocketException(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + + def __init__(self, message: "std::string"): + _exploresdk.ExploreBtSocketException_swiginit(self, _exploresdk.new_ExploreBtSocketException(message)) + + def what(self) -> "char const *": + return _exploresdk.ExploreBtSocketException_what(self) + __swig_destroy__ = _exploresdk.delete_ExploreBtSocketException + +# Register ExploreBtSocketException in _exploresdk: +_exploresdk.ExploreBtSocketException_swigregister(ExploreBtSocketException) + +class ExploreNoBluetoothException(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + + def __init__(self, message: "std::string"): + _exploresdk.ExploreNoBluetoothException_swiginit(self, _exploresdk.new_ExploreNoBluetoothException(message)) + + def what(self) -> "char const *": + return _exploresdk.ExploreNoBluetoothException_what(self) + __swig_destroy__ = _exploresdk.delete_ExploreNoBluetoothException + +# Register ExploreNoBluetoothException in _exploresdk: +_exploresdk.ExploreNoBluetoothException_swigregister(ExploreNoBluetoothException) + class device(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr @@ -274,6 +349,7 @@ def __init__(self): # Register device in _exploresdk: _exploresdk.device_swigregister(device) + class ExploreSDK(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -283,15 +359,20 @@ def __init__(self, *args, **kwargs): __swig_destroy__ = _exploresdk.delete_ExploreSDK @staticmethod - def Create(): + def Create() -> "ExploreSDK *": return _exploresdk.ExploreSDK_Create() - def PerformDeviceSearch(self, length=8): + def PerformDeviceSearch(self, length: "int"=8) -> "std::vector< device,std::allocator< device > >": return _exploresdk.ExploreSDK_PerformDeviceSearch(self, length) - def SdpSearch(self, address): + def SdpSearch(self, address: "std::string") -> "int": return _exploresdk.ExploreSDK_SdpSearch(self, address) # Register ExploreSDK in _exploresdk: _exploresdk.ExploreSDK_swigregister(ExploreSDK) +def ExploreSDK_Create() -> "ExploreSDK *": + return _exploresdk.ExploreSDK_Create() + + + From ecfb93d290b0c4806ee63f64db043db1d4458f2a Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Wed, 15 May 2024 14:13:35 +0200 Subject: [PATCH 60/78] set soft marker string length to 7 --- src/explorepy/packet.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/explorepy/packet.py b/src/explorepy/packet.py index c979477c..02a22ea2 100644 --- a/src/explorepy/packet.py +++ b/src/explorepy/packet.py @@ -438,8 +438,8 @@ def create(lsl_time, marker_string): """ if not isinstance(marker_string, str): raise ValueError("Marker label must be a string") - if len(marker_string) > 10 or len(marker_string) < 1: - raise ValueError("Marker label length must be between 1 and 10 characters") + if len(marker_string) > 7 or len(marker_string) < 1: + raise ValueError("Marker label length must be between 1 and 7 characters") byte_array = bytes(marker_string, 'utf-8') return ExternalMarker( lsl_time, From 5813fdcc146e0b8201cbb5f4ea39f32f33a0de00 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Thu, 23 May 2024 10:52:44 +0200 Subject: [PATCH 61/78] add 16 ch packets --- src/explorepy/explore.py | 2 +- src/explorepy/packet.py | 25 +++++++++++++++++++------ src/explorepy/settings_manager.py | 9 +++++++++ 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/explorepy/explore.py b/src/explorepy/explore.py index e268e38e..72eb4c03 100644 --- a/src/explorepy/explore.py +++ b/src/explorepy/explore.py @@ -291,7 +291,7 @@ def device_info_callback(packet): # TODO add 16 channel board id and refactor # setting correct device interface if 'board_id' not in new_device_info or new_device_info['board_id'] != 'PCB_304_801p2_X' or new_device_info[ - 'board_id'] != 'PCB_303_801E_XXX': + 'board_id'] != 'PCB_303_801E_XXX' or new_device_info['board_id'] != 'PCB_304_891p2_X': logger.debug('setting bt interface to sdk') explorepy.set_bt_interface('sdk') if not self.stream_processor.compare_device_info(new_device_info): diff --git a/src/explorepy/packet.py b/src/explorepy/packet.py index 02a22ea2..e7d84cf8 100644 --- a/src/explorepy/packet.py +++ b/src/explorepy/packet.py @@ -11,12 +11,9 @@ from explorepy._exceptions import FletcherError - logger = logging.getLogger(__name__) - - class PACKET_ID(IntEnum): """Packet ID enum""" @@ -33,6 +30,7 @@ class PACKET_ID(IntEnum): EEG98_USBC = 150 EEG98_BLE = 151 EEG32_BLE = 152 + EEG16_BLE = 153 EEG99 = 62 EEG94R = 208 EEG98R = 210 @@ -50,6 +48,7 @@ class PACKET_ID(IntEnum): class Packet(abc.ABC): """An abstract base class for Explore packet""" + def __init__(self, timestamp, payload, time_offset=0): """Gets the timestamp and payload and initializes the packet object @@ -76,7 +75,7 @@ def __str__(self): """Print the data/info""" @staticmethod - def int24to32(bin_data, byteorder_data='little'): + def int24to32(bin_data, byteorder_data='little'): """Converts binary data to int32 Args: @@ -98,6 +97,7 @@ class PacketBIN(Packet): parser for each incoming packet, dispatched by the stream_processor with topic TOPICS.packet_bin and used in the Debug class. """ + def __init__(self, raw_data): self.bin_data = raw_data @@ -138,7 +138,6 @@ def _convert(self, bin_data): # EEG32: status bits will change in future releases as we need to use 4 bytes for 32 channel status self.status = self.int32_to_status(data[0, :]) - @staticmethod def int32_to_status(data): data = data.astype(int) @@ -212,6 +211,7 @@ class EEG98_USBC(EEG): def __init__(self, timestamp, payload, time_offset=0): super().__init__(timestamp, payload, time_offset, v_ref=2.4, n_packet=16) + class EEG_BLE(EEG): def __init__(self, timestamp, payload, time_offset=0): self.byteorder_data = 'big' @@ -232,6 +232,13 @@ def __init__(self, timestamp, payload, time_offset=0): super().__init__(timestamp, payload, time_offset) +class EEG16_BLE(EEG_BLE): + """EEG packet for 16 channel BLE device""" + + def __init__(self, timestamp, payload, time_offset=0): + super().__init__(timestamp, payload, time_offset) + + class EEG99(EEG): """EEG packet for 8 channel device""" @@ -289,6 +296,7 @@ def compute_angle(self, matrix=None): class Environment(Packet): """Environment data packet""" + def _convert(self, bin_data): self.temperature = bin_data[0] self.light = (1000 / 4095) * np.frombuffer( @@ -335,6 +343,7 @@ def _volt_to_percent(voltage): class TimeStamp(Packet): """Time stamp data packet""" + def _convert(self, bin_data): self.host_timestamp = np.frombuffer(bin_data, dtype=np.dtype( @@ -410,7 +419,7 @@ def create(local_time, code): SoftwareMarker """ return SoftwareMarker( - local_time * TIMESTAMP_SCALE, + local_time * 10000, payload=bytearray(struct.pack(" 4 else 4 From 10a7411847e05aeb1e67967f3b4e2b0f0b089289 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Thu, 23 May 2024 16:23:05 +0200 Subject: [PATCH 62/78] update battery mapping --- src/explorepy/packet.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/explorepy/packet.py b/src/explorepy/packet.py index 02a22ea2..d3f1357e 100644 --- a/src/explorepy/packet.py +++ b/src/explorepy/packet.py @@ -296,7 +296,12 @@ def _convert(self, bin_data): np.uint16).newbyteorder("<")) # Unit Lux self.battery = ((16.8 / 6.8) * (1.8 / 2457) * np.frombuffer( bin_data[3:5], dtype=np.dtype(np.uint16).newbyteorder("<"))) # Unit Volt - self.battery_percentage = self._volt_to_percent(self.battery) + + max_voltage = 4.1 # constant, measured in recording, actually 4.2, but let's say 4.10 is better + min_voltage = 3.45 # constant , measured in recording + voltage_span = max_voltage - min_voltage + percent = int(((self.battery - min_voltage) / voltage_span) * 100) + self.battery_percentage = max(0, min(percent, 100)) def __str__(self): return "Temperature: " + str(self.temperature) + "\tLight: " + str( From 4e2a5136b9b0e532e0f7fc39624f26a7ab8be2bd Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Thu, 23 May 2024 17:24:56 +0200 Subject: [PATCH 63/78] rearrange channels to ADS sequence --- src/explorepy/packet.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/explorepy/packet.py b/src/explorepy/packet.py index d3f1357e..cf70df20 100644 --- a/src/explorepy/packet.py +++ b/src/explorepy/packet.py @@ -215,8 +215,11 @@ def __init__(self, timestamp, payload, time_offset=0): class EEG_BLE(EEG): def __init__(self, timestamp, payload, time_offset=0): self.byteorder_data = 'big' + self.channel_order = [7, 6, 5, 4, 3, 2, 1, 0, 15, 14, 13, 12, 11, 10, 9, 8, 23, 22, 21, 20, 19, 18, 17, 16, + 31, 30, 29, 28, 27, 26, 25, 24] super().__init__(timestamp, payload, time_offset, v_ref=2.4, n_packet=1) - + data_length = len(self.data) + self.data = self.data[self.channel_order[:data_length]] class EEG98_BLE(EEG_BLE): """EEG packet for 8 channel device""" From 6b4a430db862db4d3a4e775fd084e5454a1abb8a Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Fri, 24 May 2024 11:03:46 +0200 Subject: [PATCH 64/78] format tools.py --- src/explorepy/tools.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/explorepy/tools.py b/src/explorepy/tools.py index a678d507..ce091bd4 100644 --- a/src/explorepy/tools.py +++ b/src/explorepy/tools.py @@ -19,7 +19,7 @@ user_cache_dir, user_config_dir ) -from bleak import( +from bleak import ( BleakScanner ) from mne import ( @@ -41,7 +41,6 @@ ) from explorepy.settings_manager import SettingsManager - logger = logging.getLogger(__name__) lock = Lock() @@ -65,9 +64,11 @@ def get_local_time(): """ return local_clock() + def is_ble_device(): return explorepy.get_bt_interface() == 'ble' + def bt_scan(): """ Scan for nearby Explore devices @@ -97,6 +98,7 @@ def bt_scan(): return explore_devices + async def scan_explore_devices(): # Start scanning for devices device_list = [] @@ -108,11 +110,13 @@ async def scan_explore_devices(): device_list.append(d.name) return device_list + def run_ble_scanner(): device_list = asyncio.run(scan_explore_devices()) print('got device list here{}'.format(device_list)) return device_list + def create_exg_recorder(filename, file_type, adc_mask, fs, do_overwrite, exg_ch=None): """ Create ExG recorder From ad98ee18738ef8cfc737fd84aed61b84dda10585 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Wed, 29 May 2024 10:50:46 +0200 Subject: [PATCH 65/78] continue parsing BIN for old devices --- src/explorepy/parser.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/explorepy/parser.py b/src/explorepy/parser.py index b4a90d6f..2227a185 100644 --- a/src/explorepy/parser.py +++ b/src/explorepy/parser.py @@ -149,7 +149,11 @@ def _stream_loop(self): logger.warning('Incomplete packet received, parsing will continue.') self.seek_new_pid.set() else: - self.stop_streaming() + if self.mode == 'file': + logger.debug('Got Fletcher error in parsing BIN file, will continue') + self.seek_new_pid.set() + else: + self.stop_streaming() except EOFError: logger.info('End of file') self.stop_streaming() From e07e4311159eaec76b583d7463775fcafa6aa52c Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Tue, 28 May 2024 17:03:58 +0200 Subject: [PATCH 66/78] update RadialStim import --- examples/ssvep_demo/ssvep.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/examples/ssvep_demo/ssvep.py b/examples/ssvep_demo/ssvep.py index 637081c0..0ef11ef9 100644 --- a/examples/ssvep_demo/ssvep.py +++ b/examples/ssvep_demo/ssvep.py @@ -4,6 +4,7 @@ """ import time from threading import Lock +from psychopy_visionscience.radial import RadialStim from psychopy import visual, event import numpy as np from analysis import CCAAnalysis @@ -29,9 +30,9 @@ def __init__(self, window, size, position, n_frame, log_time=False): pattern = np.ones((4, 4)) pattern[::2, ::2] *= -1 pattern[1::2, 1::2] *= -1 - self._stim1 = visual.RadialStim(win=self._window, tex=pattern, pos=position, + self._stim1 = RadialStim(win=self._window, tex=pattern, pos=position, size=size, radialCycles=1, texRes=256, opacity=1) - self._stim2 = visual.RadialStim(win=self._window, tex=pattern*-1, pos=position, + self._stim2 = RadialStim(win=self._window, tex=pattern*-1, pos=position, size=size, radialCycles=1, texRes=256, opacity=1) self._toggle_flag = False self.log_time = log_time From c6e5b6eac51e9586358d098298dbbb5b8473cc9e Mon Sep 17 00:00:00 2001 From: salman2135 Date: Tue, 4 Jun 2024 13:22:01 +0200 Subject: [PATCH 67/78] update c++ files for No Bluetooth exception --- lib/linux/ExploreException.h | 19 + lib/linux/exploresdk.py | 178 +- lib/linux/swig_interface_wrap.cxx | 3754 ++++++++++++++--------------- 3 files changed, 1942 insertions(+), 2009 deletions(-) diff --git a/lib/linux/ExploreException.h b/lib/linux/ExploreException.h index db66b8c2..e7ff4441 100644 --- a/lib/linux/ExploreException.h +++ b/lib/linux/ExploreException.h @@ -83,3 +83,22 @@ class ExploreIOException : std::exception } }; + +// class to throw exception when no BT service is available +class ExploreNoBluetoothException : std::exception +{ +private: + std::string message; +public: + ExploreNoBluetoothException(std::string message) NOEXCEPT + { + this->message = message; + + } + + virtual const char* what() const NOEXCEPT + { + return message.c_str(); + } + +}; diff --git a/lib/linux/exploresdk.py b/lib/linux/exploresdk.py index 10677307..5670bacd 100644 --- a/lib/linux/exploresdk.py +++ b/lib/linux/exploresdk.py @@ -1,13 +1,10 @@ -# This file was automatically generated by SWIG (http://www.swig.org). -# Version 4.0.1 +# This file was automatically generated by SWIG (https://www.swig.org). +# Version 4.2.0 # -# Do not make changes to this file unless you know what you are doing--modify +# Do not make changes to this file unless you know what you are doing - modify # the SWIG interface file instead. from sys import version_info as _swig_python_version_info -if _swig_python_version_info < (2, 7, 0): - raise RuntimeError("Python 2.7 or later required") - # Import the low-level C/C++ module if __package__ or "." in __name__: from . import _exploresdk @@ -29,10 +26,10 @@ def _swig_repr(self): def _swig_setattr_nondynamic_instance_variable(set): def set_instance_attr(self, name, value): - if name == "thisown": - self.this.own(value) - elif name == "this": + if name == "this": set(self, name, value) + elif name == "thisown": + self.this.own(value) elif hasattr(self, name) and isinstance(getattr(type(self), name), property): set(self, name, value) else: @@ -61,7 +58,11 @@ class _SwigNonDynamicMeta(type): __setattr__ = _swig_setattr_nondynamic_class_variable(type.__setattr__) -import collections.abc +if _swig_python_version_info[0:2] >= (3, 3): + import collections.abc +else: + import collections + class SwigPyIterator(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -70,59 +71,58 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr __swig_destroy__ = _exploresdk.delete_SwigPyIterator - def value(self) -> "PyObject *": + def value(self): return _exploresdk.SwigPyIterator_value(self) - def incr(self, n: "size_t"=1) -> "swig::SwigPyIterator *": + def incr(self, n=1): return _exploresdk.SwigPyIterator_incr(self, n) - def decr(self, n: "size_t"=1) -> "swig::SwigPyIterator *": + def decr(self, n=1): return _exploresdk.SwigPyIterator_decr(self, n) - def distance(self, x: "SwigPyIterator") -> "ptrdiff_t": + def distance(self, x): return _exploresdk.SwigPyIterator_distance(self, x) - def equal(self, x: "SwigPyIterator") -> "bool": + def equal(self, x): return _exploresdk.SwigPyIterator_equal(self, x) - def copy(self) -> "swig::SwigPyIterator *": + def copy(self): return _exploresdk.SwigPyIterator_copy(self) - def next(self) -> "PyObject *": + def next(self): return _exploresdk.SwigPyIterator_next(self) - def __next__(self) -> "PyObject *": + def __next__(self): return _exploresdk.SwigPyIterator___next__(self) - def previous(self) -> "PyObject *": + def previous(self): return _exploresdk.SwigPyIterator_previous(self) - def advance(self, n: "ptrdiff_t") -> "swig::SwigPyIterator *": + def advance(self, n): return _exploresdk.SwigPyIterator_advance(self, n) - def __eq__(self, x: "SwigPyIterator") -> "bool": + def __eq__(self, x): return _exploresdk.SwigPyIterator___eq__(self, x) - def __ne__(self, x: "SwigPyIterator") -> "bool": + def __ne__(self, x): return _exploresdk.SwigPyIterator___ne__(self, x) - def __iadd__(self, n: "ptrdiff_t") -> "swig::SwigPyIterator &": + def __iadd__(self, n): return _exploresdk.SwigPyIterator___iadd__(self, n) - def __isub__(self, n: "ptrdiff_t") -> "swig::SwigPyIterator &": + def __isub__(self, n): return _exploresdk.SwigPyIterator___isub__(self, n) - def __add__(self, n: "ptrdiff_t") -> "swig::SwigPyIterator *": + def __add__(self, n): return _exploresdk.SwigPyIterator___add__(self, n) - def __sub__(self, *args) -> "ptrdiff_t": + def __sub__(self, *args): return _exploresdk.SwigPyIterator___sub__(self, *args) def __iter__(self): return self # Register SwigPyIterator in _exploresdk: _exploresdk.SwigPyIterator_swigregister(SwigPyIterator) - class BTSerialPortBinding(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -132,192 +132,196 @@ def __init__(self, *args, **kwargs): __swig_destroy__ = _exploresdk.delete_BTSerialPortBinding @staticmethod - def Create(address: "std::string", channelID: "int") -> "BTSerialPortBinding *": + def Create(address, channelID): return _exploresdk.BTSerialPortBinding_Create(address, channelID) - def Connect(self) -> "int": + def Connect(self): return _exploresdk.BTSerialPortBinding_Connect(self) - def Close(self) -> "void": + def Close(self): return _exploresdk.BTSerialPortBinding_Close(self) - def Read(self, bt_buffer: "char *") -> "void": + def Read(self, bt_buffer): return _exploresdk.BTSerialPortBinding_Read(self, bt_buffer) - def Write(self, write_buffer: "char const *") -> "void": + def Write(self, write_buffer): return _exploresdk.BTSerialPortBinding_Write(self, write_buffer) - def IsDataAvailable(self) -> "bool": + def IsDataAvailable(self): return _exploresdk.BTSerialPortBinding_IsDataAvailable(self) # Register BTSerialPortBinding in _exploresdk: _exploresdk.BTSerialPortBinding_swigregister(BTSerialPortBinding) - -def BTSerialPortBinding_Create(address: "std::string", channelID: "int") -> "BTSerialPortBinding *": - return _exploresdk.BTSerialPortBinding_Create(address, channelID) - -class vectordevice(collections.abc.MutableSequence): +class vectordevice(collections.abc.MutableSequence if _swig_python_version_info >= (3, 3) else collections.MutableSequence): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr - def iterator(self) -> "swig::SwigPyIterator *": + def iterator(self): return _exploresdk.vectordevice_iterator(self) def __iter__(self): return self.iterator() - def __nonzero__(self) -> "bool": + def __nonzero__(self): return _exploresdk.vectordevice___nonzero__(self) - def __bool__(self) -> "bool": + def __bool__(self): return _exploresdk.vectordevice___bool__(self) - def __len__(self) -> "std::vector< device >::size_type": + def __len__(self): return _exploresdk.vectordevice___len__(self) - def __getslice__(self, i: "std::vector< device >::difference_type", j: "std::vector< device >::difference_type") -> "std::vector< device,std::allocator< device > > *": + def __getslice__(self, i, j): return _exploresdk.vectordevice___getslice__(self, i, j) - def __setslice__(self, *args) -> "void": + def __setslice__(self, *args): return _exploresdk.vectordevice___setslice__(self, *args) - def __delslice__(self, i: "std::vector< device >::difference_type", j: "std::vector< device >::difference_type") -> "void": + def __delslice__(self, i, j): return _exploresdk.vectordevice___delslice__(self, i, j) - def __delitem__(self, *args) -> "void": + def __delitem__(self, *args): return _exploresdk.vectordevice___delitem__(self, *args) - def __getitem__(self, *args) -> "std::vector< device >::value_type const &": + def __getitem__(self, *args): return _exploresdk.vectordevice___getitem__(self, *args) - def __setitem__(self, *args) -> "void": + def __setitem__(self, *args): return _exploresdk.vectordevice___setitem__(self, *args) - def pop(self) -> "std::vector< device >::value_type": + def pop(self): return _exploresdk.vectordevice_pop(self) - def append(self, x: "device") -> "void": + def append(self, x): return _exploresdk.vectordevice_append(self, x) - def empty(self) -> "bool": + def empty(self): return _exploresdk.vectordevice_empty(self) - def size(self) -> "std::vector< device >::size_type": + def size(self): return _exploresdk.vectordevice_size(self) - def swap(self, v: "vectordevice") -> "void": + def swap(self, v): return _exploresdk.vectordevice_swap(self, v) - def begin(self) -> "std::vector< device >::iterator": + def begin(self): return _exploresdk.vectordevice_begin(self) - def end(self) -> "std::vector< device >::iterator": + def end(self): return _exploresdk.vectordevice_end(self) - def rbegin(self) -> "std::vector< device >::reverse_iterator": + def rbegin(self): return _exploresdk.vectordevice_rbegin(self) - def rend(self) -> "std::vector< device >::reverse_iterator": + def rend(self): return _exploresdk.vectordevice_rend(self) - def clear(self) -> "void": + def clear(self): return _exploresdk.vectordevice_clear(self) - def get_allocator(self) -> "std::vector< device >::allocator_type": + def get_allocator(self): return _exploresdk.vectordevice_get_allocator(self) - def pop_back(self) -> "void": + def pop_back(self): return _exploresdk.vectordevice_pop_back(self) - def erase(self, *args) -> "std::vector< device >::iterator": + def erase(self, *args): return _exploresdk.vectordevice_erase(self, *args) def __init__(self, *args): _exploresdk.vectordevice_swiginit(self, _exploresdk.new_vectordevice(*args)) - def push_back(self, x: "device") -> "void": + def push_back(self, x): return _exploresdk.vectordevice_push_back(self, x) - def front(self) -> "std::vector< device >::value_type const &": + def front(self): return _exploresdk.vectordevice_front(self) - def back(self) -> "std::vector< device >::value_type const &": + def back(self): return _exploresdk.vectordevice_back(self) - def assign(self, n: "std::vector< device >::size_type", x: "device") -> "void": + def assign(self, n, x): return _exploresdk.vectordevice_assign(self, n, x) - def resize(self, *args) -> "void": + def resize(self, *args): return _exploresdk.vectordevice_resize(self, *args) - def insert(self, *args) -> "void": + def insert(self, *args): return _exploresdk.vectordevice_insert(self, *args) - def reserve(self, n: "std::vector< device >::size_type") -> "void": + def reserve(self, n): return _exploresdk.vectordevice_reserve(self, n) - def capacity(self) -> "std::vector< device >::size_type": + def capacity(self): return _exploresdk.vectordevice_capacity(self) __swig_destroy__ = _exploresdk.delete_vectordevice # Register vectordevice in _exploresdk: _exploresdk.vectordevice_swigregister(vectordevice) - class ExploreException(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr - def __init__(self, message: "std::string"): + def __init__(self, message): _exploresdk.ExploreException_swiginit(self, _exploresdk.new_ExploreException(message)) - def what(self) -> "char const *": + def what(self): return _exploresdk.ExploreException_what(self) __swig_destroy__ = _exploresdk.delete_ExploreException # Register ExploreException in _exploresdk: _exploresdk.ExploreException_swigregister(ExploreException) - class ExploreReadBufferException(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr - def __init__(self, message: "std::string"): + def __init__(self, message): _exploresdk.ExploreReadBufferException_swiginit(self, _exploresdk.new_ExploreReadBufferException(message)) - def what(self) -> "char const *": + def what(self): return _exploresdk.ExploreReadBufferException_what(self) __swig_destroy__ = _exploresdk.delete_ExploreReadBufferException # Register ExploreReadBufferException in _exploresdk: _exploresdk.ExploreReadBufferException_swigregister(ExploreReadBufferException) - class ExploreBtSocketException(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr - def __init__(self, message: "std::string"): + def __init__(self, message): _exploresdk.ExploreBtSocketException_swiginit(self, _exploresdk.new_ExploreBtSocketException(message)) - def what(self) -> "char const *": + def what(self): return _exploresdk.ExploreBtSocketException_what(self) __swig_destroy__ = _exploresdk.delete_ExploreBtSocketException # Register ExploreBtSocketException in _exploresdk: _exploresdk.ExploreBtSocketException_swigregister(ExploreBtSocketException) - class ExploreIOException(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr - def __init__(self, message: "std::string"): + def __init__(self, message): _exploresdk.ExploreIOException_swiginit(self, _exploresdk.new_ExploreIOException(message)) - def what(self) -> "char const *": + def what(self): return _exploresdk.ExploreIOException_what(self) __swig_destroy__ = _exploresdk.delete_ExploreIOException # Register ExploreIOException in _exploresdk: _exploresdk.ExploreIOException_swigregister(ExploreIOException) +class ExploreNoBluetoothException(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + + def __init__(self, message): + _exploresdk.ExploreNoBluetoothException_swiginit(self, _exploresdk.new_ExploreNoBluetoothException(message)) + def what(self): + return _exploresdk.ExploreNoBluetoothException_what(self) + __swig_destroy__ = _exploresdk.delete_ExploreNoBluetoothException + +# Register ExploreNoBluetoothException in _exploresdk: +_exploresdk.ExploreNoBluetoothException_swigregister(ExploreNoBluetoothException) class device(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr @@ -335,7 +339,6 @@ def __init__(self): # Register device in _exploresdk: _exploresdk.device_swigregister(device) - class ExploreSDK(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -345,20 +348,15 @@ def __init__(self, *args, **kwargs): __swig_destroy__ = _exploresdk.delete_ExploreSDK @staticmethod - def Create() -> "ExploreSDK *": + def Create(): return _exploresdk.ExploreSDK_Create() - def PerformDeviceSearch(self, length: "int"=8) -> "std::vector< device,std::allocator< device > >": + def PerformDeviceSearch(self, length=8): return _exploresdk.ExploreSDK_PerformDeviceSearch(self, length) - def SdpSearch(self, address: "std::string") -> "int": + def SdpSearch(self, address): return _exploresdk.ExploreSDK_SdpSearch(self, address) # Register ExploreSDK in _exploresdk: _exploresdk.ExploreSDK_swigregister(ExploreSDK) -def ExploreSDK_Create() -> "ExploreSDK *": - return _exploresdk.ExploreSDK_Create() - - - diff --git a/lib/linux/swig_interface_wrap.cxx b/lib/linux/swig_interface_wrap.cxx index 83032b36..636f5d69 100644 --- a/lib/linux/swig_interface_wrap.cxx +++ b/lib/linux/swig_interface_wrap.cxx @@ -1,46 +1,17 @@ /* ---------------------------------------------------------------------------- - * This file was automatically generated by SWIG (http://www.swig.org). - * Version 4.0.1 + * This file was automatically generated by SWIG (https://www.swig.org). + * Version 4.2.0 * - * This file is not intended to be easily readable and contains a number of - * coding conventions designed to improve portability and efficiency. Do not make - * changes to this file unless you know what you are doing--modify the SWIG - * interface file instead. + * Do not make changes to this file unless you know what you are doing - modify + * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ -#ifndef SWIGPYTHON +#define SWIG_VERSION 0x040200 #define SWIGPYTHON -#endif - -#define SWIG_PYTHON_THREADS #define SWIG_PYTHON_DIRECTOR_NO_VTABLE #define SWIG_PYTHON_EXTRA_NATIVE_CONTAINERS - -#ifdef __cplusplus -/* SwigValueWrapper is described in swig.swg */ -template class SwigValueWrapper { - struct SwigMovePointer { - T *ptr; - SwigMovePointer(T *p) : ptr(p) { } - ~SwigMovePointer() { delete ptr; } - SwigMovePointer& operator=(SwigMovePointer& rhs) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = rhs.ptr; rhs.ptr = 0; return *this; } - } pointer; - SwigValueWrapper& operator=(const SwigValueWrapper& rhs); - SwigValueWrapper(const SwigValueWrapper& rhs); -public: - SwigValueWrapper() : pointer(0) { } - SwigValueWrapper& operator=(const T& t) { SwigMovePointer tmp(new T(t)); pointer = tmp; return *this; } - operator T&() const { return *pointer.ptr; } - T *operator&() { return pointer.ptr; } -}; - -template T SwigValueInit() { - return T(); -} -#endif - /* ----------------------------------------------------------------------------- * This section contains generic SWIG labels for method/variable * declarations/attributes, and other compiler dependent labels. @@ -165,14 +136,38 @@ template T SwigValueInit() { # pragma warning disable 592 #endif +#if __cplusplus >=201103L +# define SWIG_NULLPTR nullptr +#else +# define SWIG_NULLPTR NULL +#endif + #if defined(__GNUC__) && defined(_WIN32) && !defined(SWIG_PYTHON_NO_HYPOT_WORKAROUND) /* Workaround for '::hypot' has not been declared', see https://bugs.python.org/issue11566 */ # include #endif +#if !defined(PY_SSIZE_T_CLEAN) && !defined(SWIG_NO_PY_SSIZE_T_CLEAN) +#define PY_SSIZE_T_CLEAN +#endif + +#if __GNUC__ >= 7 +#pragma GCC diagnostic push +#if defined(__cplusplus) && __cplusplus >=201703L +#pragma GCC diagnostic ignored "-Wregister" /* For python-2.7 headers that use register */ +#endif +#endif + #if defined(_DEBUG) && defined(SWIG_PYTHON_INTERPRETER_NO_DEBUG) /* Use debug wrappers with the Python release dll */ + +#if defined(_MSC_VER) && _MSC_VER >= 1929 +/* Workaround compilation errors when redefining _DEBUG in MSVC 2019 version 16.10 and later + * See https://github.com/swig/swig/issues/2090 */ +# include +#endif + # undef _DEBUG # include # define _DEBUG 1 @@ -180,6 +175,12 @@ template T SwigValueInit() { # include #endif +#if __GNUC__ >= 7 +#pragma GCC diagnostic pop +#endif + +#include + /* ----------------------------------------------------------------------------- * swigrun.swg * @@ -226,6 +227,8 @@ template T SwigValueInit() { #define SWIG_POINTER_DISOWN 0x1 #define SWIG_CAST_NEW_MEMORY 0x2 #define SWIG_POINTER_NO_NULL 0x4 +#define SWIG_POINTER_CLEAR 0x8 +#define SWIG_POINTER_RELEASE (SWIG_POINTER_CLEAR | SWIG_POINTER_DISOWN) /* Flags for new pointer objects */ #define SWIG_POINTER_OWN 0x1 @@ -297,7 +300,7 @@ template T SwigValueInit() { SWIG errors code. Finally, if the SWIG_CASTRANK_MODE is enabled, the result code - allows to return the 'cast rank', for example, if you have this + allows returning the 'cast rank', for example, if you have this int food(double) int fooi(int); @@ -311,7 +314,13 @@ template T SwigValueInit() { */ #define SWIG_OK (0) +/* Runtime errors are < 0 */ #define SWIG_ERROR (-1) +/* Errors in range -1 to -99 are in swigerrors.swg (errors for all languages including those not using the runtime) */ +/* Errors in range -100 to -199 are language specific errors defined in *errors.swg */ +/* Errors < -200 are generic runtime specific errors */ +#define SWIG_ERROR_RELEASE_NOT_OWNED (-200) + #define SWIG_IsOK(r) (r >= 0) #define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError) @@ -319,14 +328,14 @@ template T SwigValueInit() { #define SWIG_CASTRANKLIMIT (1 << 8) /* The NewMask denotes the object was created (using new/malloc) */ #define SWIG_NEWOBJMASK (SWIG_CASTRANKLIMIT << 1) -/* The TmpMask is for in/out typemaps that use temporal objects */ +/* The TmpMask is for in/out typemaps that use temporary objects */ #define SWIG_TMPOBJMASK (SWIG_NEWOBJMASK << 1) /* Simple returning values */ #define SWIG_BADOBJ (SWIG_ERROR) #define SWIG_OLDOBJ (SWIG_OK) #define SWIG_NEWOBJ (SWIG_OK | SWIG_NEWOBJMASK) #define SWIG_TMPOBJ (SWIG_OK | SWIG_TMPOBJMASK) -/* Check, add and del mask methods */ +/* Check, add and del object mask methods */ #define SWIG_AddNewMask(r) (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r) #define SWIG_DelNewMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r) #define SWIG_IsNewObj(r) (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK)) @@ -355,6 +364,23 @@ SWIGINTERNINLINE int SWIG_CheckState(int r) { # define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0) #endif +/* C99 and C++11 should provide snprintf, but define SWIG_NO_SNPRINTF + * if you're missing it. + */ +#if ((defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L) || \ + (defined __cplusplus && __cplusplus >= 201103L) || \ + defined SWIG_HAVE_SNPRINTF) && \ + !defined SWIG_NO_SNPRINTF +# define SWIG_snprintf(O,S,F,A) snprintf(O,S,F,A) +# define SWIG_snprintf2(O,S,F,A,B) snprintf(O,S,F,A,B) +#else +/* Fallback versions ignore the buffer size, but most of our uses either have a + * fixed maximum possible size or dynamically allocate a buffer that's large + * enough. + */ +# define SWIG_snprintf(O,S,F,A) sprintf(O,F,A) +# define SWIG_snprintf2(O,S,F,A,B) sprintf(O,F,A,B) +#endif #include @@ -472,7 +498,7 @@ SWIG_TypeCheck(const char *c, swig_type_info *ty) { Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison */ SWIGRUNTIME swig_cast_info * -SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *ty) { +SWIG_TypeCheckStruct(const swig_type_info *from, swig_type_info *ty) { if (ty) { swig_cast_info *iter = ty->cast; while (iter) { @@ -532,9 +558,9 @@ SWIG_TypeName(const swig_type_info *ty) { SWIGRUNTIME const char * SWIG_TypePrettyName(const swig_type_info *type) { /* The "str" field contains the equivalent pretty names of the - type, separated by vertical-bar characters. We choose - to print the last name, as it is often (?) the most - specific. */ + type, separated by vertical-bar characters. Choose the last + name. It should be the most specific; a fully resolved name + but not necessarily with default template parameters expanded. */ if (!type) return NULL; if (type->str != NULL) { const char *last_name = type->str; @@ -754,7 +780,7 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { } #endif -/* Errors in SWIG */ +/* SWIG Errors applicable to all language modules, values are reserved from -1 to -99 */ #define SWIG_UnknownError -1 #define SWIG_IOError -2 #define SWIG_RuntimeError -3 @@ -770,7 +796,6 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { #define SWIG_NullReferenceError -13 - /* Compatibility macros for Python 3 */ #if PY_VERSION_HEX >= 0x03000000 @@ -786,7 +811,6 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { #define PyString_Size(str) PyBytes_Size(str) #define PyString_InternFromString(key) PyUnicode_InternFromString(key) #define Py_TPFLAGS_HAVE_CLASS Py_TPFLAGS_BASETYPE -#define PyString_AS_STRING(x) PyUnicode_AS_STRING(x) #define _PyLong_FromSsize_t(x) PyLong_FromSsize_t(x) #endif @@ -804,36 +828,29 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { #endif -/* Warning: This function will allocate a new string in Python 3, - * so please call SWIG_Python_str_DelForPy3(x) to free the space. - */ -SWIGINTERN char* -SWIG_Python_str_AsChar(PyObject *str) +/* Wrapper around PyUnicode_AsUTF8AndSize - call Py_XDECREF on the returned pbytes when finished with the returned string */ +SWIGINTERN const char * +SWIG_PyUnicode_AsUTF8AndSize(PyObject *str, Py_ssize_t *psize, PyObject **pbytes) { -#if PY_VERSION_HEX >= 0x03000000 - char *newstr = 0; - str = PyUnicode_AsUTF8String(str); - if (str) { - char *cstr; - Py_ssize_t len; - PyBytes_AsStringAndSize(str, &cstr, &len); - newstr = (char *) malloc(len+1); - memcpy(newstr, cstr, len+1); - Py_XDECREF(str); - } - return newstr; +#if PY_VERSION_HEX >= 0x03030000 +# if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030A0000 + *pbytes = NULL; + return PyUnicode_AsUTF8AndSize(str, psize); +# else + *pbytes = PyUnicode_AsUTF8String(str); + const char *chars = *pbytes ? PyBytes_AsString(*pbytes) : NULL; + if (chars && psize) + *psize = PyBytes_Size(*pbytes); + return chars; +# endif #else - return PyString_AsString(str); + char *chars = NULL; + *pbytes = NULL; + PyString_AsStringAndSize(str, &chars, psize); + return chars; #endif } -#if PY_VERSION_HEX >= 0x03000000 -# define SWIG_Python_str_DelForPy3(x) free( (void*) (x) ) -#else -# define SWIG_Python_str_DelForPy3(x) -#endif - - SWIGINTERN PyObject* SWIG_Python_str_FromChar(const char *c) { @@ -848,10 +865,14 @@ SWIG_Python_str_FromChar(const char *c) # define PyObject_DEL PyObject_Del #endif -// SWIGPY_USE_CAPSULE is no longer used within SWIG itself, but some user -// interface files check for it. +/* SWIGPY_USE_CAPSULE is no longer used within SWIG itself, but some user interface files check for it. */ # define SWIGPY_USE_CAPSULE -# define SWIGPY_CAPSULE_NAME ("swig_runtime_data" SWIG_RUNTIME_VERSION ".type_pointer_capsule" SWIG_TYPE_TABLE_NAME) +#ifdef SWIGPYTHON_BUILTIN +# define SWIGPY_CAPSULE_ATTR_NAME "type_pointer_capsule_builtin" SWIG_TYPE_TABLE_NAME +#else +# define SWIGPY_CAPSULE_ATTR_NAME "type_pointer_capsule" SWIG_TYPE_TABLE_NAME +#endif +# define SWIGPY_CAPSULE_NAME ("swig_runtime_data" SWIG_RUNTIME_VERSION "." SWIGPY_CAPSULE_ATTR_NAME) #if PY_VERSION_HEX < 0x03020000 #define PyDescr_TYPE(x) (((PyDescrObject *)(x))->d_type) @@ -859,6 +880,20 @@ SWIG_Python_str_FromChar(const char *c) #define Py_hash_t long #endif +#ifdef Py_LIMITED_API +# define PyTuple_GET_ITEM PyTuple_GetItem +/* Note that PyTuple_SetItem() has different semantics from PyTuple_SET_ITEM as it decref's the original tuple item, so in general they cannot be used + interchangeably. However in SWIG-generated code PyTuple_SET_ITEM is only used with newly initialized tuples without any items and for them this does work. */ +# define PyTuple_SET_ITEM PyTuple_SetItem +# define PyTuple_GET_SIZE PyTuple_Size +# define PyCFunction_GET_FLAGS PyCFunction_GetFlags +# define PyCFunction_GET_FUNCTION PyCFunction_GetFunction +# define PyCFunction_GET_SELF PyCFunction_GetSelf +# define PyList_GET_ITEM PyList_GetItem +# define PyList_SET_ITEM PyList_SetItem +# define PySliceObject PyObject +#endif + /* ----------------------------------------------------------------------------- * error manipulation * ----------------------------------------------------------------------------- */ @@ -918,14 +953,15 @@ SWIG_Python_AddErrorMsg(const char* mesg) PyErr_Fetch(&type, &value, &traceback); if (value) { PyObject *old_str = PyObject_Str(value); - const char *tmp = SWIG_Python_str_AsChar(old_str); + PyObject *bytes = NULL; + const char *tmp = SWIG_PyUnicode_AsUTF8AndSize(old_str, NULL, &bytes); PyErr_Clear(); Py_XINCREF(type); if (tmp) PyErr_Format(type, "%s %s", tmp, mesg); else PyErr_Format(type, "%s", mesg); - SWIG_Python_str_DelForPy3(tmp); + Py_XDECREF(bytes); Py_DECREF(old_str); Py_DECREF(value); } else { @@ -956,8 +992,12 @@ SWIG_Python_RaiseOrModifyTypeError(const char *message) #else newvalue = PyString_FromFormat("%s\nAdditional information:\n%s", PyString_AsString(value), message); #endif - Py_XDECREF(value); - PyErr_Restore(type, newvalue, traceback); + if (newvalue) { + Py_XDECREF(value); + PyErr_Restore(type, newvalue, traceback); + } else { + PyErr_Restore(type, value, traceback); + } } else { /* Raise TypeError using given message */ PyErr_SetString(PyExc_TypeError, message); @@ -974,8 +1014,12 @@ SWIG_Python_RaiseOrModifyTypeError(const char *message) # define SWIG_PYTHON_USE_GIL # endif # if defined(SWIG_PYTHON_USE_GIL) /* Use PyGILState threads calls */ -# ifndef SWIG_PYTHON_INITIALIZE_THREADS -# define SWIG_PYTHON_INITIALIZE_THREADS PyEval_InitThreads() +# if !defined(SWIG_PYTHON_INITIALIZE_THREADS) +# if PY_VERSION_HEX < 0x03070000 +# define SWIG_PYTHON_INITIALIZE_THREADS PyEval_InitThreads() +# else +# define SWIG_PYTHON_INITIALIZE_THREADS +# endif # endif # ifdef __cplusplus /* C++ code */ class SWIG_Python_Thread_Block { @@ -990,7 +1034,7 @@ SWIG_Python_RaiseOrModifyTypeError(const char *message) bool status; PyThreadState *save; public: - void end() { if (status) { PyEval_RestoreThread(save); status = false; }} + void end() { if (status) { status = false; PyEval_RestoreThread(save); }} SWIG_Python_Thread_Allow() : status(true), save(PyEval_SaveThread()) {} ~SWIG_Python_Thread_Allow() { end(); } }; @@ -1073,8 +1117,8 @@ typedef struct swig_const_info { # error "This version of SWIG only supports Python >= 2.7" #endif -#if PY_VERSION_HEX >= 0x03000000 && PY_VERSION_HEX < 0x03020000 -# error "This version of SWIG only supports Python 3 >= 3.2" +#if PY_VERSION_HEX >= 0x03000000 && PY_VERSION_HEX < 0x03030000 +# error "This version of SWIG only supports Python 3 >= 3.3" #endif /* Common SWIG API */ @@ -1189,7 +1233,12 @@ SWIG_Python_AppendOutput(PyObject* result, PyObject* obj) { if (!PyList_Check(result)) { PyObject *o2 = result; result = PyList_New(1); - PyList_SetItem(result, 0, o2); + if (result) { + PyList_SET_ITEM(result, 0, o2); + } else { + Py_DECREF(obj); + return o2; + } } PyList_Append(result,obj); Py_DECREF(obj); @@ -1245,6 +1294,19 @@ SWIG_Python_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssi } } +SWIGINTERN int +SWIG_Python_CheckNoKeywords(PyObject *kwargs, const char *name) { + int no_kwargs = 1; + if (kwargs) { + assert(PyDict_Check(kwargs)); + if (PyDict_Size(kwargs) > 0) { + PyErr_Format(PyExc_TypeError, "%s() does not take keyword arguments", name); + no_kwargs = 0; + } + } + return no_kwargs; +} + /* A functor is a function object with one single object argument */ #define SWIG_Python_CallFunctor(functor, obj) PyObject_CallFunctionObjArgs(functor, obj, NULL); @@ -1258,6 +1320,261 @@ SWIG_Python_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssi #define SWIG_STATIC_POINTER(var) var = 0; if (!var) var #endif +#ifdef __cplusplus +extern "C" { +#endif + +/* Python-specific SWIG API */ +#define SWIG_newvarlink() SWIG_Python_newvarlink() +#define SWIG_addvarlink(p, name, get_attr, set_attr) SWIG_Python_addvarlink(p, name, get_attr, set_attr) +#define SWIG_InstallConstants(d, constants) SWIG_Python_InstallConstants(d, constants) + +/* ----------------------------------------------------------------------------- + * global variable support code. + * ----------------------------------------------------------------------------- */ + +typedef struct swig_globalvar { + char *name; /* Name of global variable */ + PyObject *(*get_attr)(void); /* Return the current value */ + int (*set_attr)(PyObject *); /* Set the value */ + struct swig_globalvar *next; +} swig_globalvar; + +typedef struct swig_varlinkobject { + PyObject_HEAD + swig_globalvar *vars; +} swig_varlinkobject; + +SWIGINTERN PyObject * +swig_varlink_repr(PyObject *SWIGUNUSEDPARM(v)) { +#if PY_VERSION_HEX >= 0x03000000 + return PyUnicode_InternFromString(""); +#else + return PyString_FromString(""); +#endif +} + +SWIGINTERN PyObject * +swig_varlink_str(PyObject *o) { + swig_varlinkobject *v = (swig_varlinkobject *) o; +#if PY_VERSION_HEX >= 0x03000000 + PyObject *str = PyUnicode_InternFromString("("); + PyObject *tail; + PyObject *joined; + swig_globalvar *var; + for (var = v->vars; var; var=var->next) { + tail = PyUnicode_FromString(var->name); + joined = PyUnicode_Concat(str, tail); + Py_DecRef(str); + Py_DecRef(tail); + str = joined; + if (var->next) { + tail = PyUnicode_InternFromString(", "); + joined = PyUnicode_Concat(str, tail); + Py_DecRef(str); + Py_DecRef(tail); + str = joined; + } + } + tail = PyUnicode_InternFromString(")"); + joined = PyUnicode_Concat(str, tail); + Py_DecRef(str); + Py_DecRef(tail); + str = joined; +#else + PyObject *str = PyString_FromString("("); + swig_globalvar *var; + for (var = v->vars; var; var=var->next) { + PyString_ConcatAndDel(&str,PyString_FromString(var->name)); + if (var->next) PyString_ConcatAndDel(&str,PyString_FromString(", ")); + } + PyString_ConcatAndDel(&str,PyString_FromString(")")); +#endif + return str; +} + +SWIGINTERN void +swig_varlink_dealloc(PyObject *o) { + swig_varlinkobject *v = (swig_varlinkobject *) o; + swig_globalvar *var = v->vars; + while (var) { + swig_globalvar *n = var->next; + free(var->name); + free(var); + var = n; + } +} + +SWIGINTERN PyObject * +swig_varlink_getattr(PyObject *o, char *n) { + swig_varlinkobject *v = (swig_varlinkobject *) o; + PyObject *res = NULL; + swig_globalvar *var = v->vars; + while (var) { + if (strcmp(var->name,n) == 0) { + res = (*var->get_attr)(); + break; + } + var = var->next; + } + if (res == NULL && !PyErr_Occurred()) { + PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n); + } + return res; +} + +SWIGINTERN int +swig_varlink_setattr(PyObject *o, char *n, PyObject *p) { + swig_varlinkobject *v = (swig_varlinkobject *) o; + int res = 1; + swig_globalvar *var = v->vars; + while (var) { + if (strcmp(var->name,n) == 0) { + res = (*var->set_attr)(p); + break; + } + var = var->next; + } + if (res == 1 && !PyErr_Occurred()) { + PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n); + } + return res; +} + +SWIGINTERN PyTypeObject* +swig_varlink_type(void) { + static char varlink__doc__[] = "Swig var link object"; +#ifndef Py_LIMITED_API + static PyTypeObject varlink_type; + static int type_init = 0; + if (!type_init) { + const PyTypeObject tmp = { +#if PY_VERSION_HEX >= 0x03000000 + PyVarObject_HEAD_INIT(NULL, 0) +#else + PyObject_HEAD_INIT(NULL) + 0, /* ob_size */ +#endif + "swigvarlink", /* tp_name */ + sizeof(swig_varlinkobject), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor) swig_varlink_dealloc, /* tp_dealloc */ +#if PY_VERSION_HEX < 0x030800b4 + (printfunc)0, /*tp_print*/ +#else + (Py_ssize_t)0, /*tp_vectorcall_offset*/ +#endif + (getattrfunc) swig_varlink_getattr, /* tp_getattr */ + (setattrfunc) swig_varlink_setattr, /* tp_setattr */ + 0, /* tp_compare */ + (reprfunc) swig_varlink_repr, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + (reprfunc) swig_varlink_str, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + 0, /* tp_flags */ + varlink__doc__, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */ + 0, /* tp_del */ + 0, /* tp_version_tag */ +#if PY_VERSION_HEX >= 0x03040000 + 0, /* tp_finalize */ +#endif +#if PY_VERSION_HEX >= 0x03080000 + 0, /* tp_vectorcall */ +#endif +#if (PY_VERSION_HEX >= 0x03080000) && (PY_VERSION_HEX < 0x03090000) + 0, /* tp_print */ +#endif +#if PY_VERSION_HEX >= 0x030C0000 + 0, /* tp_watched */ +#endif +#ifdef COUNT_ALLOCS + 0, /* tp_allocs */ + 0, /* tp_frees */ + 0, /* tp_maxalloc */ + 0, /* tp_prev */ + 0 /* tp_next */ +#endif + }; + varlink_type = tmp; + type_init = 1; + if (PyType_Ready(&varlink_type) < 0) + return NULL; + } + return &varlink_type; +#else + PyType_Slot slots[] = { + { Py_tp_dealloc, (void *)swig_varlink_dealloc }, + { Py_tp_repr, (void *)swig_varlink_repr }, + { Py_tp_getattr, (void *)swig_varlink_getattr }, + { Py_tp_setattr, (void *)swig_varlink_setattr }, + { Py_tp_str, (void *)swig_varlink_str }, + { Py_tp_doc, (void *)varlink__doc__ }, + { 0, NULL } + }; + PyType_Spec spec = { + "swigvarlink", + sizeof(swig_varlinkobject), + 0, + Py_TPFLAGS_DEFAULT, + slots + }; + return (PyTypeObject *)PyType_FromSpec(&spec); +#endif +} + +/* Create a variable linking object for use later */ +SWIGINTERN PyObject * +SWIG_Python_newvarlink(void) { + swig_varlinkobject *result = PyObject_New(swig_varlinkobject, swig_varlink_type()); + if (result) { + result->vars = 0; + } + return ((PyObject*) result); +} + +SWIGINTERN void +SWIG_Python_addvarlink(PyObject *p, const char *name, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)) { + swig_varlinkobject *v = (swig_varlinkobject *) p; + swig_globalvar *gv = (swig_globalvar *) malloc(sizeof(swig_globalvar)); + if (gv) { + size_t size = strlen(name)+1; + gv->name = (char *)malloc(size); + if (gv->name) { + memcpy(gv->name, name, size); + gv->get_attr = get_attr; + gv->set_attr = set_attr; + gv->next = v->vars; + } + } + v->vars = gv; +} + + +static PyObject *Swig_Globals_global = NULL; + +SWIGINTERN PyObject * +SWIG_globals(void) { + if (Swig_Globals_global == NULL) { + Swig_Globals_global = SWIG_newvarlink(); + } + return Swig_Globals_global; +} + +#ifdef __cplusplus +} +#endif + /* ----------------------------------------------------------------------------- * Pointer declarations * ----------------------------------------------------------------------------- */ @@ -1328,18 +1645,25 @@ SwigPyClientData_New(PyObject* obj) /* the newraw method and newargs arguments used to create a new raw instance */ if (PyClass_Check(obj)) { data->newraw = 0; - data->newargs = obj; Py_INCREF(obj); + data->newargs = obj; } else { data->newraw = PyObject_GetAttrString(data->klass, "__new__"); if (data->newraw) { - Py_INCREF(data->newraw); - data->newargs = PyTuple_New(1); - PyTuple_SetItem(data->newargs, 0, obj); + data->newargs = PyTuple_New(1); + if (data->newargs) { + Py_INCREF(obj); + PyTuple_SET_ITEM(data->newargs, 0, obj); + } else { + Py_DECREF(data->newraw); + Py_DECREF(data->klass); + free(data); + return 0; + } } else { - data->newargs = obj; + Py_INCREF(obj); + data->newargs = obj; } - Py_INCREF(data->newargs); } /* the destroy method, aka as the C++ delete method */ data->destroy = PyObject_GetAttrString(data->klass, "__swig_destroy__"); @@ -1348,10 +1672,7 @@ SwigPyClientData_New(PyObject* obj) data->destroy = 0; } if (data->destroy) { - int flags; - Py_INCREF(data->destroy); - flags = PyCFunction_GET_FLAGS(data->destroy); - data->delargs = !(flags & (METH_O)); + data->delargs = !(PyCFunction_GET_FLAGS(data->destroy) & METH_O); } else { data->delargs = 0; } @@ -1362,10 +1683,13 @@ SwigPyClientData_New(PyObject* obj) } SWIGRUNTIME void -SwigPyClientData_Del(SwigPyClientData *data) { +SwigPyClientData_Del(SwigPyClientData *data) +{ + Py_XDECREF(data->klass); Py_XDECREF(data->newraw); Py_XDECREF(data->newargs); Py_XDECREF(data->destroy); + free(data); } /* =============== SwigPyObject =====================*/ @@ -1392,7 +1716,7 @@ SwigPyObject_get___dict__(PyObject *v, PyObject *SWIGUNUSEDPARM(args)) if (!sobj->dict) sobj->dict = PyDict_New(); - Py_INCREF(sobj->dict); + Py_XINCREF(sobj->dict); return sobj->dict; } @@ -1410,18 +1734,21 @@ SwigPyObject_format(const char* fmt, SwigPyObject *v) PyObject *res = NULL; PyObject *args = PyTuple_New(1); if (args) { - if (PyTuple_SetItem(args, 0, SwigPyObject_long(v)) == 0) { - PyObject *ofmt = SWIG_Python_str_FromChar(fmt); + PyObject *val = SwigPyObject_long(v); + if (val) { + PyObject *ofmt; + PyTuple_SET_ITEM(args, 0, val); + ofmt = SWIG_Python_str_FromChar(fmt); if (ofmt) { #if PY_VERSION_HEX >= 0x03000000 - res = PyUnicode_Format(ofmt,args); + res = PyUnicode_Format(ofmt,args); #else - res = PyString_Format(ofmt,args); + res = PyString_Format(ofmt,args); #endif - Py_DECREF(ofmt); + Py_DECREF(ofmt); } - Py_DECREF(args); } + Py_DECREF(args); } return res; } @@ -1443,18 +1770,23 @@ SwigPyObject_repr(SwigPyObject *v) { const char *name = SWIG_TypePrettyName(v->ty); PyObject *repr = SWIG_Python_str_FromFormat("", (name ? name : "unknown"), (void *)v); - if (v->next) { + if (repr && v->next) { PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next); + if (nrep) { # if PY_VERSION_HEX >= 0x03000000 - PyObject *joined = PyUnicode_Concat(repr, nrep); - Py_DecRef(repr); - Py_DecRef(nrep); - repr = joined; + PyObject *joined = PyUnicode_Concat(repr, nrep); + Py_DecRef(repr); + Py_DecRef(nrep); + repr = joined; # else - PyString_ConcatAndDel(&repr,nrep); + PyString_ConcatAndDel(&repr,nrep); # endif + } else { + Py_DecRef(repr); + repr = NULL; + } } - return repr; + return repr; } /* We need a version taking two PyObject* parameters so it's a valid @@ -1477,12 +1809,14 @@ SwigPyObject_compare(SwigPyObject *v, SwigPyObject *w) SWIGRUNTIME PyObject* SwigPyObject_richcompare(SwigPyObject *v, SwigPyObject *w, int op) { - PyObject* res; - if( op != Py_EQ && op != Py_NE ) { - Py_INCREF(Py_NotImplemented); - return Py_NotImplemented; + PyObject* res = NULL; + if (!PyErr_Occurred()) { + if (op != Py_EQ && op != Py_NE) { + Py_INCREF(Py_NotImplemented); + return Py_NotImplemented; + } + res = PyBool_FromLong( (SwigPyObject_compare(v, w)==0) == (op == Py_EQ) ? 1 : 0); } - res = PyBool_FromLong( (SwigPyObject_compare(v, w)==0) == (op == Py_EQ) ? 1 : 0); return res; } @@ -1510,20 +1844,34 @@ SwigPyObject_type(void) { SWIGRUNTIMEINLINE int SwigPyObject_Check(PyObject *op) { -#ifdef SWIGPYTHON_BUILTIN PyTypeObject *target_tp = SwigPyObject_type(); - if (PyType_IsSubtype(op->ob_type, target_tp)) + PyTypeObject *op_type = Py_TYPE(op); +#ifdef SWIGPYTHON_BUILTIN + if (PyType_IsSubtype(op_type, target_tp)) return 1; - return (strcmp(op->ob_type->tp_name, "SwigPyObject") == 0); + return (strcmp(op_type->tp_name, "SwigPyObject") == 0); #else - return (Py_TYPE(op) == SwigPyObject_type()) - || (strcmp(Py_TYPE(op)->tp_name,"SwigPyObject") == 0); + if (op_type == target_tp) + return 1; +# ifdef Py_LIMITED_API + int cmp; + PyObject *tp_name = PyObject_GetAttrString((PyObject *)op_type, "__name__"); + if (!tp_name) + return 0; + cmp = PyUnicode_CompareWithASCIIString(tp_name, "SwigPyObject"); + Py_DECREF(tp_name); + return cmp == 0; +# else + return (strcmp(op_type->tp_name, "SwigPyObject") == 0); +# endif #endif } SWIGRUNTIME PyObject * SwigPyObject_New(void *ptr, swig_type_info *ty, int own); +static PyObject* Swig_Capsule_global = NULL; + SWIGRUNTIME void SwigPyObject_dealloc(PyObject *v) { @@ -1550,8 +1898,12 @@ SwigPyObject_dealloc(PyObject *v) if (data->delargs) { /* we need to create a temporary object to carry the destroy operation */ PyObject *tmp = SwigPyObject_New(sobj->ptr, ty, 0); - res = SWIG_Python_CallFunctor(destroy, tmp); - Py_DECREF(tmp); + if (tmp) { + res = SWIG_Python_CallFunctor(destroy, tmp); + } else { + res = 0; + } + Py_XDECREF(tmp); } else { PyCFunction meth = PyCFunction_GET_FUNCTION(destroy); PyObject *mself = PyCFunction_GET_SELF(destroy); @@ -1570,8 +1922,12 @@ SwigPyObject_dealloc(PyObject *v) printf("swig/python detected a memory leak of type '%s', no destructor found.\n", (name ? name : "unknown")); } #endif - } + Py_XDECREF(Swig_Capsule_global); + } Py_XDECREF(next); +#ifdef SWIGPYTHON_BUILTIN + Py_XDECREF(sobj->dict); +#endif PyObject_DEL(v); } @@ -1583,6 +1939,7 @@ SwigPyObject_append(PyObject* v, PyObject* next) PyErr_SetString(PyExc_TypeError, "Attempt to append a non SwigPyObject"); return NULL; } + ((SwigPyObject *)next)->next = sobj->next; sobj->next = next; Py_INCREF(next); return SWIG_Py_Void(); @@ -1627,9 +1984,9 @@ SwigPyObject_own(PyObject *v, PyObject *args) PyObject *obj = PyBool_FromLong(sobj->own); if (val) { if (PyObject_IsTrue(val)) { - SwigPyObject_acquire(v,args); + Py_DECREF(SwigPyObject_acquire(v,args)); } else { - SwigPyObject_disown(v,args); + Py_DECREF(SwigPyObject_disown(v,args)); } } return obj; @@ -1650,7 +2007,7 @@ swigobject_methods[] = { SWIGRUNTIME PyTypeObject* SwigPyObject_TypeOnce(void) { static char swigobject_doc[] = "Swig object carries a C/C++ instance pointer"; - +#ifndef Py_LIMITED_API static PyNumberMethods SwigPyObject_as_number = { (binaryfunc)0, /*nb_add*/ (binaryfunc)0, /*nb_subtract*/ @@ -1709,7 +2066,11 @@ SwigPyObject_TypeOnce(void) { sizeof(SwigPyObject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)SwigPyObject_dealloc, /* tp_dealloc */ - 0, /* tp_print */ +#if PY_VERSION_HEX < 0x030800b4 + (printfunc)0, /*tp_print*/ +#else + (Py_ssize_t)0, /*tp_vectorcall_offset*/ +#endif (getattrfunc)0, /* tp_getattr */ (setattrfunc)0, /* tp_setattr */ #if PY_VERSION_HEX >= 0x03000000 @@ -1758,6 +2119,15 @@ SwigPyObject_TypeOnce(void) { #if PY_VERSION_HEX >= 0x03040000 0, /* tp_finalize */ #endif +#if PY_VERSION_HEX >= 0x03080000 + 0, /* tp_vectorcall */ +#endif +#if (PY_VERSION_HEX >= 0x03080000) && (PY_VERSION_HEX < 0x03090000) + 0, /* tp_print */ +#endif +#if PY_VERSION_HEX >= 0x030C0000 + 0, /* tp_watched */ +#endif #ifdef COUNT_ALLOCS 0, /* tp_allocs */ 0, /* tp_frees */ @@ -1768,21 +2138,50 @@ SwigPyObject_TypeOnce(void) { }; swigpyobject_type = tmp; type_init = 1; - if (PyType_Ready(&swigpyobject_type) < 0) + if (PyType_Ready(&swigpyobject_type) != 0) return NULL; } return &swigpyobject_type; +#else + PyType_Slot slots[] = { + { Py_tp_dealloc, (void *)SwigPyObject_dealloc }, + { Py_tp_repr, (void *)SwigPyObject_repr }, + { Py_tp_getattro, (void *)PyObject_GenericGetAttr }, + { Py_tp_doc, (void *)swigobject_doc }, + { Py_tp_richcompare, (void *)SwigPyObject_richcompare }, + { Py_tp_methods, (void *)swigobject_methods }, + { Py_nb_int, (void *)SwigPyObject_long }, + { 0, NULL } + }; + PyType_Spec spec = { + "SwigPyObject", + sizeof(SwigPyObject), + 0, + Py_TPFLAGS_DEFAULT, + slots + }; + return (PyTypeObject *)PyType_FromSpec(&spec); +#endif } SWIGRUNTIME PyObject * SwigPyObject_New(void *ptr, swig_type_info *ty, int own) { - SwigPyObject *sobj = PyObject_NEW(SwigPyObject, SwigPyObject_type()); + SwigPyObject *sobj = PyObject_New(SwigPyObject, SwigPyObject_type()); if (sobj) { sobj->ptr = ptr; sobj->ty = ty; sobj->own = own; sobj->next = 0; +#ifdef SWIGPYTHON_BUILTIN + sobj->dict = 0; +#endif + if (own == SWIG_POINTER_OWN) { + /* Obtain a reference to the Python capsule wrapping the module information, so that the + * module information is correctly destroyed after all SWIG python objects have been freed + * by the GC (and corresponding destructors invoked) */ + Py_XINCREF(Swig_Capsule_global); + } } return (PyObject *)sobj; } @@ -1839,8 +2238,20 @@ SwigPyPacked_type(void) { SWIGRUNTIMEINLINE int SwigPyPacked_Check(PyObject *op) { - return ((op)->ob_type == SwigPyPacked_TypeOnce()) - || (strcmp((op)->ob_type->tp_name,"SwigPyPacked") == 0); + PyTypeObject* op_type = Py_TYPE(op); + if (op_type == SwigPyPacked_TypeOnce()) + return 1; +#ifdef Py_LIMITED_API + int cmp; + PyObject *tp_name = PyObject_GetAttrString((PyObject *)op_type, "__name__"); + if (!tp_name) + return 0; + cmp = PyUnicode_CompareWithASCIIString(tp_name, "SwigPyPacked"); + Py_DECREF(tp_name); + return cmp == 0; +#else + return (strcmp(op_type->tp_name, "SwigPyPacked") == 0); +#endif } SWIGRUNTIME void @@ -1856,6 +2267,7 @@ SwigPyPacked_dealloc(PyObject *v) SWIGRUNTIME PyTypeObject* SwigPyPacked_TypeOnce(void) { static char swigpacked_doc[] = "Swig object carries a C/C++ instance pointer"; +#ifndef Py_LIMITED_API static PyTypeObject swigpypacked_type; static int type_init = 0; if (!type_init) { @@ -1870,7 +2282,11 @@ SwigPyPacked_TypeOnce(void) { sizeof(SwigPyPacked), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)SwigPyPacked_dealloc, /* tp_dealloc */ - 0, /* tp_print */ +#if PY_VERSION_HEX < 0x030800b4 + (printfunc)0, /*tp_print*/ +#else + (Py_ssize_t)0, /*tp_vectorcall_offset*/ +#endif (getattrfunc)0, /* tp_getattr */ (setattrfunc)0, /* tp_setattr */ #if PY_VERSION_HEX>=0x03000000 @@ -1919,6 +2335,15 @@ SwigPyPacked_TypeOnce(void) { #if PY_VERSION_HEX >= 0x03040000 0, /* tp_finalize */ #endif +#if PY_VERSION_HEX >= 0x03080000 + 0, /* tp_vectorcall */ +#endif +#if (PY_VERSION_HEX >= 0x03080000) && (PY_VERSION_HEX < 0x03090000) + 0, /* tp_print */ +#endif +#if PY_VERSION_HEX >= 0x030C0000 + 0, /* tp_watched */ +#endif #ifdef COUNT_ALLOCS 0, /* tp_allocs */ 0, /* tp_frees */ @@ -1929,16 +2354,34 @@ SwigPyPacked_TypeOnce(void) { }; swigpypacked_type = tmp; type_init = 1; - if (PyType_Ready(&swigpypacked_type) < 0) + if (PyType_Ready(&swigpypacked_type) != 0) return NULL; } return &swigpypacked_type; +#else + PyType_Slot slots[] = { + { Py_tp_dealloc, (void *)SwigPyPacked_dealloc }, + { Py_tp_repr, (void *)SwigPyPacked_repr }, + { Py_tp_str, (void *)SwigPyPacked_str }, + { Py_tp_getattro, (void *)PyObject_GenericGetAttr }, + { Py_tp_doc, (void *)swigpacked_doc }, + { 0, NULL } + }; + PyType_Spec spec = { + "SwigPyPacked", + sizeof(SwigPyPacked), + 0, + Py_TPFLAGS_DEFAULT, + slots + }; + return (PyTypeObject *)PyType_FromSpec(&spec); +#endif } SWIGRUNTIME PyObject * SwigPyPacked_New(void *ptr, size_t size, swig_type_info *ty) { - SwigPyPacked *sobj = PyObject_NEW(SwigPyPacked, SwigPyPacked_type()); + SwigPyPacked *sobj = PyObject_New(SwigPyPacked, SwigPyPacked_type()); if (sobj) { void *pack = malloc(size); if (pack) { @@ -2119,12 +2562,19 @@ SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int } } if (sobj) { - if (own) - *own = *own | sobj->own; - if (flags & SWIG_POINTER_DISOWN) { - sobj->own = 0; + if (((flags & SWIG_POINTER_RELEASE) == SWIG_POINTER_RELEASE) && !sobj->own) { + res = SWIG_ERROR_RELEASE_NOT_OWNED; + } else { + if (own) + *own = *own | sobj->own; + if (flags & SWIG_POINTER_DISOWN) { + sobj->own = 0; + } + if (flags & SWIG_POINTER_CLEAR) { + sobj->ptr = 0; + } + res = SWIG_OK; } - res = SWIG_OK; } else { if (implicit_conv) { SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0; @@ -2183,10 +2633,20 @@ SWIG_Python_ConvertFunctionPtr(PyObject *obj, void **ptr, swig_type_info *ty) { swig_cast_info *tc; /* here we get the method pointer for callbacks */ +#ifndef Py_LIMITED_API const char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc); +#else + PyObject* pystr_doc = PyObject_GetAttrString(obj, "__doc__"); + PyObject *bytes = NULL; + const char *doc = pystr_doc ? SWIG_PyUnicode_AsUTF8AndSize(pystr_doc, NULL, &bytes) : 0; +#endif const char *desc = doc ? strstr(doc, "swig_ptr: ") : 0; if (desc) desc = ty ? SWIG_UnpackVoidPtr(desc + 10, &vptr, ty->name) : 0; +#ifdef Py_LIMITED_API + Py_XDECREF(bytes); + Py_XDECREF(pystr_doc); +#endif if (!desc) return SWIG_ERROR; tc = SWIG_TypeCheck(desc,ty); @@ -2237,16 +2697,23 @@ SWIG_Python_NewShadowInstance(SwigPyClientData *data, PyObject *swig_this) #if !defined(SWIG_PYTHON_SLOW_GETSET_THIS) PyObject **dictptr = _PyObject_GetDictPtr(inst); if (dictptr != NULL) { - PyObject *dict = *dictptr; - if (dict == NULL) { - dict = PyDict_New(); - *dictptr = dict; - PyDict_SetItem(dict, SWIG_This(), swig_this); - } + PyObject *dict = *dictptr; + if (dict == NULL) { + dict = PyDict_New(); + *dictptr = dict; + } + if (dict) { + PyDict_SetItem(dict, SWIG_This(), swig_this); + } else{ + Py_DECREF(inst); + inst = 0; + } } #else - PyObject *key = SWIG_This(); - PyObject_SetAttr(inst, key, swig_this); + if (PyObject_SetAttr(inst, SWIG_This(), swig_this) == -1) { + Py_DECREF(inst); + inst = 0; + } #endif } } else { @@ -2255,11 +2722,20 @@ SWIG_Python_NewShadowInstance(SwigPyClientData *data, PyObject *swig_this) if (empty_args) { PyObject *empty_kwargs = PyDict_New(); if (empty_kwargs) { - inst = ((PyTypeObject *)data->newargs)->tp_new((PyTypeObject *)data->newargs, empty_args, empty_kwargs); +#ifndef Py_LIMITED_API + newfunc newfn = ((PyTypeObject *)data->newargs)->tp_new; +#else + newfunc newfn = (newfunc)PyType_GetSlot((PyTypeObject *)data->newargs, Py_tp_new); +#endif + inst = newfn((PyTypeObject *)data->newargs, empty_args, empty_kwargs); Py_DECREF(empty_kwargs); if (inst) { - PyObject_SetAttr(inst, SWIG_This(), swig_this); - Py_TYPE(inst)->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG; + if (PyObject_SetAttr(inst, SWIG_This(), swig_this) == -1) { + Py_DECREF(inst); + inst = 0; + } else { + PyType_Modified(Py_TYPE(inst)); + } } } Py_DECREF(empty_args); @@ -2276,25 +2752,25 @@ SWIG_Python_NewShadowInstance(SwigPyClientData *data, PyObject *swig_this) return inst; } -SWIGRUNTIME void +SWIGRUNTIME int SWIG_Python_SetSwigThis(PyObject *inst, PyObject *swig_this) { - PyObject *dict; #if !defined(SWIG_PYTHON_SLOW_GETSET_THIS) - PyObject **dictptr = _PyObject_GetDictPtr(inst); - if (dictptr != NULL) { - dict = *dictptr; - if (dict == NULL) { - dict = PyDict_New(); - *dictptr = dict; - } - PyDict_SetItem(dict, SWIG_This(), swig_this); - return; - } + PyObject **dictptr = _PyObject_GetDictPtr(inst); + if (dictptr != NULL) { + PyObject *dict = *dictptr; + if (dict == NULL) { + dict = PyDict_New(); + *dictptr = dict; + } + if (dict) { + return PyDict_SetItem(dict, SWIG_This(), swig_this); + } else{ + return -1; + } + } #endif - dict = PyObject_GetAttrString(inst, "__dict__"); - PyDict_SetItem(dict, SWIG_This(), swig_this); - Py_DECREF(dict); + return PyObject_SetAttr(inst, SWIG_This(), swig_this); } @@ -2306,9 +2782,10 @@ SWIG_Python_InitShadowInstance(PyObject *args) { } else { SwigPyObject *sthis = SWIG_Python_GetSwigThis(obj[0]); if (sthis) { - SwigPyObject_append((PyObject*) sthis, obj[1]); + Py_DECREF(SwigPyObject_append((PyObject*) sthis, obj[1])); } else { - SWIG_Python_SetSwigThis(obj[0], obj[1]); + if (SWIG_Python_SetSwigThis(obj[0], obj[1]) != 0) + return NULL; } return SWIG_Py_Void(); } @@ -2332,7 +2809,12 @@ SWIG_Python_NewPointerObj(PyObject *self, void *ptr, swig_type_info *type, int f if (flags & SWIG_BUILTIN_TP_INIT) { newobj = (SwigPyObject*) self; if (newobj->ptr) { - PyObject *next_self = clientdata->pytype->tp_alloc(clientdata->pytype, 0); +#ifndef Py_LIMITED_API + allocfunc alloc = clientdata->pytype->tp_alloc; +#else + allocfunc alloc = (allocfunc)PyType_GetSlot(clientdata->pytype, Py_tp_alloc); +#endif + PyObject *next_self = alloc(clientdata->pytype, 0); while (newobj->next) newobj = (SwigPyObject *) newobj->next; newobj->next = next_self; @@ -2344,7 +2826,9 @@ SWIG_Python_NewPointerObj(PyObject *self, void *ptr, swig_type_info *type, int f } else { newobj = PyObject_New(SwigPyObject, clientdata->pytype); #ifdef SWIGPYTHON_BUILTIN - newobj->dict = 0; + if (newobj) { + newobj->dict = 0; + } #endif } if (newobj) { @@ -2383,39 +2867,61 @@ SWIG_Python_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) { void *SWIG_ReturnGlobalTypeList(void *); #endif +static PyObject *Swig_TypeCache_global = NULL; + +/* The python cached type query */ +SWIGRUNTIME PyObject * +SWIG_Python_TypeCache(void) { + if (Swig_TypeCache_global == NULL) { + Swig_TypeCache_global = PyDict_New(); + } + return Swig_TypeCache_global; +} + SWIGRUNTIME swig_module_info * SWIG_Python_GetModule(void *SWIGUNUSEDPARM(clientdata)) { +#ifdef SWIG_LINK_RUNTIME static void *type_pointer = (void *)0; /* first check if module already created */ if (!type_pointer) { -#ifdef SWIG_LINK_RUNTIME type_pointer = SWIG_ReturnGlobalTypeList((void *)0); + } #else - type_pointer = PyCapsule_Import(SWIGPY_CAPSULE_NAME, 0); - if (PyErr_Occurred()) { - PyErr_Clear(); - type_pointer = (void *)0; - } -#endif + void *type_pointer = PyCapsule_Import(SWIGPY_CAPSULE_NAME, 0); + if (PyErr_Occurred()) { + PyErr_Clear(); + type_pointer = (void *)0; } +#endif return (swig_module_info *) type_pointer; } + +static int interpreter_counter = 0; /* how many (sub-)interpreters are using swig_module's types */ + SWIGRUNTIME void SWIG_Python_DestroyModule(PyObject *obj) { swig_module_info *swig_module = (swig_module_info *) PyCapsule_GetPointer(obj, SWIGPY_CAPSULE_NAME); swig_type_info **types = swig_module->types; size_t i; + if (--interpreter_counter != 0) /* another sub-interpreter may still be using the swig_module's types */ + return; for (i =0; i < swig_module->size; ++i) { swig_type_info *ty = types[i]; if (ty->owndata) { SwigPyClientData *data = (SwigPyClientData *) ty->clientdata; + ty->clientdata = 0; if (data) SwigPyClientData_Del(data); } } Py_DECREF(SWIG_This()); Swig_This_global = NULL; + Py_DECREF(SWIG_globals()); + Swig_Globals_global = NULL; + Py_DECREF(SWIG_Python_TypeCache()); + Swig_TypeCache_global = NULL; + Swig_Capsule_global = NULL; } SWIGRUNTIME void @@ -2429,19 +2935,17 @@ SWIG_Python_SetModule(swig_module_info *swig_module) { #endif PyObject *pointer = PyCapsule_New((void *) swig_module, SWIGPY_CAPSULE_NAME, SWIG_Python_DestroyModule); if (pointer && module) { - PyModule_AddObject(module, "type_pointer_capsule" SWIG_TYPE_TABLE_NAME, pointer); + if (PyModule_AddObject(module, SWIGPY_CAPSULE_ATTR_NAME, pointer) == 0) { + ++interpreter_counter; + Swig_Capsule_global = pointer; + } else { + Py_DECREF(pointer); + } } else { Py_XDECREF(pointer); } } -/* The python cached type query */ -SWIGRUNTIME PyObject * -SWIG_Python_TypeCache(void) { - static PyObject *SWIG_STATIC_POINTER(cache) = PyDict_New(); - return cache; -} - SWIGRUNTIME swig_type_info * SWIG_Python_TypeQuery(const char *type) { @@ -2456,8 +2960,10 @@ SWIG_Python_TypeQuery(const char *type) descriptor = SWIG_TypeQueryModule(swig_module, swig_module, type); if (descriptor) { obj = PyCapsule_New((void*) descriptor, NULL, NULL); - PyDict_SetItem(cache, key, obj); - Py_DECREF(obj); + if (obj) { + PyDict_SetItem(cache, key, obj); + Py_DECREF(obj); + } } } Py_DECREF(key); @@ -2481,7 +2987,8 @@ SWIG_Python_AddErrMesg(const char* mesg, int infront) PyErr_Fetch(&type, &value, &traceback); if (value) { PyObject *old_str = PyObject_Str(value); - const char *tmp = SWIG_Python_str_AsChar(old_str); + PyObject *bytes = NULL; + const char *tmp = SWIG_PyUnicode_AsUTF8AndSize(old_str, NULL, &bytes); const char *errmesg = tmp ? tmp : "Invalid error message"; Py_XINCREF(type); PyErr_Clear(); @@ -2490,7 +2997,7 @@ SWIG_Python_AddErrMesg(const char* mesg, int infront) } else { PyErr_Format(type, "%s %s", errmesg, mesg); } - SWIG_Python_str_DelForPy3(tmp); + Py_XDECREF(bytes); Py_DECREF(old_str); } return 1; @@ -2535,21 +3042,25 @@ SWIG_Python_TypeError(const char *type, PyObject *obj) } else #endif { +#ifndef Py_LIMITED_API + /* tp_name is not accessible */ const char *otype = (obj ? obj->ob_type->tp_name : 0); if (otype) { PyObject *str = PyObject_Str(obj); - const char *cstr = str ? SWIG_Python_str_AsChar(str) : 0; + PyObject *bytes = NULL; + const char *cstr = str ? SWIG_PyUnicode_AsUTF8AndSize(str, NULL, &bytes) : 0; if (cstr) { PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s(%s)' is received", type, otype, cstr); - SWIG_Python_str_DelForPy3(cstr); } else { PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s' is received", type, otype); } + Py_XDECREF(bytes); Py_XDECREF(str); return; } +#endif } PyErr_Format(PyExc_TypeError, "a '%s' is expected", type); } else { @@ -2564,12 +3075,6 @@ SWIG_Python_MustGetPtr(PyObject *obj, swig_type_info *ty, int SWIGUNUSEDPARM(arg void *result; if (SWIG_Python_ConvertPtr(obj, &result, ty, flags) == -1) { PyErr_Clear(); -#if SWIG_POINTER_EXCEPTION - if (flags) { - SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj); - SWIG_Python_ArgFail(argnum); - } -#endif } return result; } @@ -2600,7 +3105,7 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) { } if (!tp->tp_dict) { - if (PyType_Ready(tp) < 0) + if (PyType_Ready(tp) != 0) goto done; } @@ -2615,7 +3120,7 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) { } else { encoded_name = PyUnicode_AsUTF8String(name); if (!encoded_name) - return -1; + goto done; } PyErr_Format(PyExc_AttributeError, "'%.100s' object has no attribute '%.200s'", tp->tp_name, PyString_AsString(encoded_name)); Py_DECREF(encoded_name); @@ -2638,23 +3143,8 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) { #define SWIG_exception_fail(code, msg) do { SWIG_Error(code, msg); SWIG_fail; } while(0) -#define SWIG_contract_assert(expr, msg) if (!(expr)) { SWIG_Error(SWIG_RuntimeError, msg); SWIG_fail; } else - - - -#ifdef __cplusplus -extern "C" { -#endif - -/* Method creation and docstring support functions */ - -SWIGINTERN PyMethodDef *SWIG_PythonGetProxyDoc(const char *name); -SWIGINTERN PyObject *SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *func); -SWIGINTERN PyObject *SWIG_PyStaticMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *func); +#define SWIG_contract_assert(expr, msg) do { if (!(expr)) { SWIG_Error(SWIG_RuntimeError, msg); SWIG_fail; } } while (0) -#ifdef __cplusplus -} -#endif #define SWIG_exception(code, msg) do { SWIG_Error(code, msg); SWIG_fail;; } while(0) @@ -2666,24 +3156,25 @@ SWIGINTERN PyObject *SWIG_PyStaticMethod_New(PyObject *SWIGUNUSEDPARM(self), PyO #define SWIGTYPE_p_ExploreBtSocketException swig_types[1] #define SWIGTYPE_p_ExploreException swig_types[2] #define SWIGTYPE_p_ExploreIOException swig_types[3] -#define SWIGTYPE_p_ExploreReadBufferException swig_types[4] -#define SWIGTYPE_p_ExploreSDK swig_types[5] -#define SWIGTYPE_p_allocator_type swig_types[6] -#define SWIGTYPE_p_char swig_types[7] -#define SWIGTYPE_p_device swig_types[8] -#define SWIGTYPE_p_difference_type swig_types[9] -#define SWIGTYPE_p_int swig_types[10] -#define SWIGTYPE_p_p_PyObject swig_types[11] -#define SWIGTYPE_p_size_type swig_types[12] -#define SWIGTYPE_p_std__allocatorT_device_t swig_types[13] -#define SWIGTYPE_p_std__exception swig_types[14] -#define SWIGTYPE_p_std__invalid_argument swig_types[15] -#define SWIGTYPE_p_std__time_t swig_types[16] -#define SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t swig_types[17] -#define SWIGTYPE_p_swig__SwigPyIterator swig_types[18] -#define SWIGTYPE_p_value_type swig_types[19] -static swig_type_info *swig_types[21]; -static swig_module_info swig_module = {swig_types, 20, 0, 0, 0, 0}; +#define SWIGTYPE_p_ExploreNoBluetoothException swig_types[4] +#define SWIGTYPE_p_ExploreReadBufferException swig_types[5] +#define SWIGTYPE_p_ExploreSDK swig_types[6] +#define SWIGTYPE_p_allocator_type swig_types[7] +#define SWIGTYPE_p_char swig_types[8] +#define SWIGTYPE_p_device swig_types[9] +#define SWIGTYPE_p_difference_type swig_types[10] +#define SWIGTYPE_p_int swig_types[11] +#define SWIGTYPE_p_p_PyObject swig_types[12] +#define SWIGTYPE_p_size_type swig_types[13] +#define SWIGTYPE_p_std__allocatorT_device_t swig_types[14] +#define SWIGTYPE_p_std__exception swig_types[15] +#define SWIGTYPE_p_std__invalid_argument swig_types[16] +#define SWIGTYPE_p_std__time_t swig_types[17] +#define SWIGTYPE_p_std__vectorT_device_t swig_types[18] +#define SWIGTYPE_p_swig__SwigPyIterator swig_types[19] +#define SWIGTYPE_p_value_type swig_types[20] +static swig_type_info *swig_types[22]; +static swig_module_info swig_module = {swig_types, 21, 0, 0, 0, 0}; #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name) #define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name) @@ -2706,8 +3197,52 @@ static swig_module_info swig_module = {swig_types, 20, 0, 0, 0, 0}; #endif #define SWIG_name "_exploresdk" -#define SWIGVERSION 0x040001 -#define SWIG_VERSION SWIGVERSION +#ifdef __cplusplus +#include +/* SwigValueWrapper is described in swig.swg */ +template class SwigValueWrapper { + struct SwigSmartPointer { + T *ptr; + SwigSmartPointer(T *p) : ptr(p) { } + ~SwigSmartPointer() { delete ptr; } + SwigSmartPointer& operator=(SwigSmartPointer& rhs) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = rhs.ptr; rhs.ptr = 0; return *this; } + void reset(T *p) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = p; } + } pointer; + SwigValueWrapper& operator=(const SwigValueWrapper& rhs); + SwigValueWrapper(const SwigValueWrapper& rhs); +public: + SwigValueWrapper() : pointer(0) { } + SwigValueWrapper& operator=(const T& t) { SwigSmartPointer tmp(new T(t)); pointer = tmp; return *this; } +#if __cplusplus >=201103L + SwigValueWrapper& operator=(T&& t) { SwigSmartPointer tmp(new T(std::move(t))); pointer = tmp; return *this; } + operator T&&() const { return std::move(*pointer.ptr); } +#else + operator T&() const { return *pointer.ptr; } +#endif + T *operator&() const { return pointer.ptr; } + static void reset(SwigValueWrapper& t, T *p) { t.pointer.reset(p); } +}; + +/* + * SwigValueInit() is a generic initialisation solution as the following approach: + * + * T c_result = T(); + * + * doesn't compile for all types for example: + * + * unsigned int c_result = unsigned int(); + */ +template T SwigValueInit() { + return T(); +} + +#if __cplusplus >=201103L +# define SWIG_STD_MOVE(OBJ) std::move(OBJ) +#else +# define SWIG_STD_MOVE(OBJ) OBJ +#endif + +#endif #define SWIG_as_voidptr(a) const_cast< void * >(static_cast< const void * >(a)) @@ -2996,9 +3531,11 @@ SWIGINTERNINLINE int SWIG_CanCastAsInteger(double *d, double min, double max) { double x = *d; if ((min <= x && x <= max)) { - double fx = floor(x); - double cx = ceil(x); - double rd = ((x - fx) < 0.5) ? fx : cx; /* simple rint */ + double fx, cx, rd; + errno = 0; + fx = floor(x); + cx = ceil(x); + rd = ((x - fx) < 0.5) ? fx : cx; /* simple rint */ if ((errno == EDOM) || (errno == ERANGE)) { errno = 0; } else { @@ -3059,7 +3596,11 @@ SWIG_AsVal_unsigned_SS_long (PyObject *obj, unsigned long *val) if (!dispatch) { double d; int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d)); - if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, ULONG_MAX)) { + // Largest double not larger than ULONG_MAX (not portably calculated easily) + // Note that double(ULONG_MAX) is stored in a double rounded up by one (for 64-bit unsigned long) + // 0xfffffffffffff800ULL == (uint64_t)std::nextafter(double(__uint128_t(ULONG_MAX)+1), double(0)) + const double ulong_max = sizeof(unsigned long) == 8 ? 0xfffffffffffff800ULL : ULONG_MAX; + if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, ulong_max)) { if (val) *val = (unsigned long)(d); return res; } @@ -3215,7 +3756,12 @@ SWIG_AsVal_long (PyObject *obj, long* val) if (!dispatch) { double d; int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d)); - if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, LONG_MAX)) { + // Largest double not larger than LONG_MAX (not portably calculated easily) + // Note that double(LONG_MAX) is stored in a double rounded up by one (for 64-bit long) + // 0x7ffffffffffffc00LL == (int64_t)std::nextafter(double(__uint128_t(LONG_MAX)+1), double(0)) + const double long_max = sizeof(long) == 8 ? 0x7ffffffffffffc00LL : LONG_MAX; + // No equivalent needed for 64-bit double(LONG_MIN) is exactly LONG_MIN + if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, long_max)) { if (val) *val = (long)(d); return res; } @@ -3333,8 +3879,10 @@ SWIG_pchar_descriptor(void) } +/* Return string from Python obj. NOTE: obj must remain in scope in order + to use the returned cptr (but only when alloc is set to SWIG_OLDOBJ) */ SWIGINTERN int -SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc) +SWIG_AsCharPtrAndSize(PyObject *obj, char **cptr, size_t *psize, int *alloc) { #if PY_VERSION_HEX>=0x03000000 #if defined(SWIG_PYTHON_STRICT_BYTE_CHAR) @@ -3347,53 +3895,31 @@ SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc) #endif { char *cstr; Py_ssize_t len; + PyObject *bytes = NULL; int ret = SWIG_OK; -#if PY_VERSION_HEX>=0x03000000 -#if !defined(SWIG_PYTHON_STRICT_BYTE_CHAR) - if (!alloc && cptr) { - /* We can't allow converting without allocation, since the internal - representation of string in Python 3 is UCS-2/UCS-4 but we require - a UTF-8 representation. - TODO(bhy) More detailed explanation */ - return SWIG_RuntimeError; - } - obj = PyUnicode_AsUTF8String(obj); - if (!obj) - return SWIG_TypeError; if (alloc) - *alloc = SWIG_NEWOBJ; -#endif - PyBytes_AsStringAndSize(obj, &cstr, &len); + *alloc = SWIG_OLDOBJ; +#if PY_VERSION_HEX>=0x03000000 && defined(SWIG_PYTHON_STRICT_BYTE_CHAR) + if (PyBytes_AsStringAndSize(obj, &cstr, &len) == -1) + return SWIG_TypeError; #else - PyString_AsStringAndSize(obj, &cstr, &len); -#endif - if (cptr) { + cstr = (char *)SWIG_PyUnicode_AsUTF8AndSize(obj, &len, &bytes); + if (!cstr) + return SWIG_TypeError; + /* The returned string is only duplicated if the char * returned is not owned and memory managed by obj */ + if (bytes && cptr) { if (alloc) { - if (*alloc == SWIG_NEWOBJ) { - *cptr = reinterpret_cast< char* >(memcpy(new char[len + 1], cstr, sizeof(char)*(len + 1))); - *alloc = SWIG_NEWOBJ; - } else { - *cptr = cstr; - *alloc = SWIG_OLDOBJ; - } + cstr = reinterpret_cast< char* >(memcpy(new char[len + 1], cstr, sizeof(char)*(len + 1))); + *alloc = SWIG_NEWOBJ; } else { -#if PY_VERSION_HEX>=0x03000000 -#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR) - *cptr = PyBytes_AsString(obj); -#else - assert(0); /* Should never reach here with Unicode strings in Python 3 */ -#endif -#else - *cptr = SWIG_Python_str_AsChar(obj); - if (!*cptr) - ret = SWIG_TypeError; -#endif + /* alloc must be set in order to clean up allocated memory */ + return SWIG_RuntimeError; } } - if (psize) *psize = len + 1; -#if PY_VERSION_HEX>=0x03000000 && !defined(SWIG_PYTHON_STRICT_BYTE_CHAR) - Py_XDECREF(obj); #endif + if (cptr) *cptr = cstr; + if (psize) *psize = len + 1; + Py_XDECREF(bytes); return ret; } else { #if defined(SWIG_PYTHON_2_UNICODE) @@ -3654,11 +4180,20 @@ namespace swig { template struct traits_asptr { static int asptr(PyObject *obj, Type **val) { - Type *p = 0; + int res = SWIG_ERROR; swig_type_info *descriptor = type_info(); - int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; - if (SWIG_IsOK(res)) { - if (val) *val = p; + if (val) { + Type *p = 0; + int newmem = 0; + res = descriptor ? SWIG_ConvertPtrAndOwn(obj, (void **)&p, descriptor, 0, &newmem) : SWIG_ERROR; + if (SWIG_IsOK(res)) { + if (newmem & SWIG_CAST_NEW_MEMORY) { + res |= SWIG_NEWOBJMASK; + } + *val = p; + } + } else { + res = descriptor ? SWIG_ConvertPtr(obj, 0, descriptor, 0) : SWIG_ERROR; } return res; } @@ -3795,413 +4330,102 @@ namespace swig { } -#include +#if defined(__SUNPRO_CC) && defined(_RWSTD_VER) +# if !defined(SWIG_NO_STD_NOITERATOR_TRAITS_STL) +# define SWIG_STD_NOITERATOR_TRAITS_STL +# endif +#endif +#if !defined(SWIG_STD_NOITERATOR_TRAITS_STL) +#include +#else namespace std { - template <> - struct less - { - bool - operator()(PyObject * v, PyObject *w) const - { - bool res; - SWIG_PYTHON_THREAD_BEGIN_BLOCK; - res = PyObject_RichCompareBool(v, w, Py_LT) ? true : false; - /* This may fall into a case of inconsistent - eg. ObjA > ObjX > ObjB - but ObjA < ObjB - */ - if( PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_TypeError) ) - { - /* Objects can't be compared, this mostly occurred in Python 3.0 */ - /* Compare their ptr directly for a workaround */ - res = (v < w); - PyErr_Clear(); - } - SWIG_PYTHON_THREAD_END_BLOCK; - return res; - } + template + struct iterator_traits { + typedef ptrdiff_t difference_type; + typedef typename Iterator::value_type value_type; }; - template <> - struct less - { - bool - operator()(const swig::SwigPtr_PyObject& v, const swig::SwigPtr_PyObject& w) const - { - return std::less()(v, w); - } + template + struct iterator_traits<__reverse_bi_iterator > { + typedef Distance difference_type; + typedef T value_type; }; - template <> - struct less - { - bool - operator()(const swig::SwigVar_PyObject& v, const swig::SwigVar_PyObject& w) const - { - return std::less()(v, w); - } + template + struct iterator_traits { + typedef T value_type; + typedef ptrdiff_t difference_type; }; + template + inline typename iterator_traits<_InputIterator>::difference_type + distance(_InputIterator __first, _InputIterator __last) + { + typename iterator_traits<_InputIterator>::difference_type __n = 0; + while (__first != __last) { + ++__first; ++__n; + } + return __n; + } } +#endif + namespace swig { - template <> struct traits { - typedef value_category category; - static const char* type_name() { return "PyObject *"; } - }; + template + class SwigPyIterator_T : public SwigPyIterator + { + public: + typedef OutIterator out_iterator; + typedef typename std::iterator_traits::value_type value_type; + typedef SwigPyIterator_T self_type; - template <> struct traits_asval { - typedef PyObject * value_type; - static int asval(PyObject *obj, value_type *val) { - if (val) *val = obj; - return SWIG_OK; + SwigPyIterator_T(out_iterator curr, PyObject *seq) + : SwigPyIterator(seq), current(curr) + { } - }; - template <> - struct traits_check { - static bool check(PyObject *) { - return true; + const out_iterator& get_current() const + { + return current; } - }; - template <> struct traits_from { - typedef PyObject * value_type; - static PyObject *from(const value_type& val) { - Py_XINCREF(val); - return val; + + bool equal (const SwigPyIterator &iter) const + { + const self_type *iters = dynamic_cast(&iter); + if (iters) { + return (current == iters->get_current()); + } else { + throw std::invalid_argument("bad iterator type"); + } } + + ptrdiff_t distance(const SwigPyIterator &iter) const + { + const self_type *iters = dynamic_cast(&iter); + if (iters) { + return std::distance(current, iters->get_current()); + } else { + throw std::invalid_argument("bad iterator type"); + } + } + + protected: + out_iterator current; }; -} - -namespace swig { - template - inline size_t - check_index(Difference i, size_t size, bool insert = false) { - if ( i < 0 ) { - if ((size_t) (-i) <= size) - return (size_t) (i + size); - } else if ( (size_t) i < size ) { - return (size_t) i; - } else if (insert && ((size_t) i == size)) { - return size; + template + struct from_oper + { + typedef const ValueType& argument_type; + typedef PyObject *result_type; + result_type operator()(argument_type v) const + { + return swig::from(v); } - throw std::out_of_range("index out of range"); - } - - template - void - slice_adjust(Difference i, Difference j, Py_ssize_t step, size_t size, Difference &ii, Difference &jj, bool insert = false) { - if (step == 0) { - throw std::invalid_argument("slice step cannot be zero"); - } else if (step > 0) { - // Required range: 0 <= i < size, 0 <= j < size, i <= j - if (i < 0) { - ii = 0; - } else if (i < (Difference)size) { - ii = i; - } else if (insert && (i >= (Difference)size)) { - ii = (Difference)size; - } - if (j < 0) { - jj = 0; - } else { - jj = (j < (Difference)size) ? j : (Difference)size; - } - if (jj < ii) - jj = ii; - } else { - // Required range: -1 <= i < size-1, -1 <= j < size-1, i >= j - if (i < -1) { - ii = -1; - } else if (i < (Difference) size) { - ii = i; - } else if (i >= (Difference)(size-1)) { - ii = (Difference)(size-1); - } - if (j < -1) { - jj = -1; - } else { - jj = (j < (Difference)size ) ? j : (Difference)(size-1); - } - if (ii < jj) - ii = jj; - } - } - - template - inline typename Sequence::iterator - getpos(Sequence* self, Difference i) { - typename Sequence::iterator pos = self->begin(); - std::advance(pos, check_index(i,self->size())); - return pos; - } - - template - inline typename Sequence::const_iterator - cgetpos(const Sequence* self, Difference i) { - typename Sequence::const_iterator pos = self->begin(); - std::advance(pos, check_index(i,self->size())); - return pos; - } - - template - inline void - erase(Sequence* seq, const typename Sequence::iterator& position) { - seq->erase(position); - } - - template - struct traits_reserve { - static void reserve(Sequence & /*seq*/, typename Sequence::size_type /*n*/) { - // This should be specialized for types that support reserve - } - }; - - template - inline Sequence* - getslice(const Sequence* self, Difference i, Difference j, Py_ssize_t step) { - typename Sequence::size_type size = self->size(); - Difference ii = 0; - Difference jj = 0; - swig::slice_adjust(i, j, step, size, ii, jj); - - if (step > 0) { - typename Sequence::const_iterator sb = self->begin(); - typename Sequence::const_iterator se = self->begin(); - std::advance(sb,ii); - std::advance(se,jj); - if (step == 1) { - return new Sequence(sb, se); - } else { - Sequence *sequence = new Sequence(); - swig::traits_reserve::reserve(*sequence, (jj - ii + step - 1) / step); - typename Sequence::const_iterator it = sb; - while (it!=se) { - sequence->push_back(*it); - for (Py_ssize_t c=0; c::reserve(*sequence, (ii - jj - step - 1) / -step); - typename Sequence::const_reverse_iterator sb = self->rbegin(); - typename Sequence::const_reverse_iterator se = self->rbegin(); - std::advance(sb,size-ii-1); - std::advance(se,size-jj-1); - typename Sequence::const_reverse_iterator it = sb; - while (it!=se) { - sequence->push_back(*it); - for (Py_ssize_t c=0; c<-step && it!=se; ++c) - it++; - } - return sequence; - } - } - - template - inline void - setslice(Sequence* self, Difference i, Difference j, Py_ssize_t step, const InputSeq& is = InputSeq()) { - typename Sequence::size_type size = self->size(); - Difference ii = 0; - Difference jj = 0; - swig::slice_adjust(i, j, step, size, ii, jj, true); - if (step > 0) { - if (step == 1) { - size_t ssize = jj - ii; - if (ssize <= is.size()) { - // expanding/staying the same size - swig::traits_reserve::reserve(*self, self->size() - ssize + is.size()); - typename Sequence::iterator sb = self->begin(); - typename InputSeq::const_iterator isit = is.begin(); - std::advance(sb,ii); - std::advance(isit, jj - ii); - self->insert(std::copy(is.begin(), isit, sb), isit, is.end()); - } else { - // shrinking - typename Sequence::iterator sb = self->begin(); - typename Sequence::iterator se = self->begin(); - std::advance(sb,ii); - std::advance(se,jj); - self->erase(sb,se); - sb = self->begin(); - std::advance(sb,ii); - self->insert(sb, is.begin(), is.end()); - } - } else { - size_t replacecount = (jj - ii + step - 1) / step; - if (is.size() != replacecount) { - char msg[1024]; - sprintf(msg, "attempt to assign sequence of size %lu to extended slice of size %lu", (unsigned long)is.size(), (unsigned long)replacecount); - throw std::invalid_argument(msg); - } - typename Sequence::const_iterator isit = is.begin(); - typename Sequence::iterator it = self->begin(); - std::advance(it,ii); - for (size_t rc=0; rcend(); ++rc) { - *it++ = *isit++; - for (Py_ssize_t c=0; c<(step-1) && it != self->end(); ++c) - it++; - } - } - } else { - size_t replacecount = (ii - jj - step - 1) / -step; - if (is.size() != replacecount) { - char msg[1024]; - sprintf(msg, "attempt to assign sequence of size %lu to extended slice of size %lu", (unsigned long)is.size(), (unsigned long)replacecount); - throw std::invalid_argument(msg); - } - typename Sequence::const_iterator isit = is.begin(); - typename Sequence::reverse_iterator it = self->rbegin(); - std::advance(it,size-ii-1); - for (size_t rc=0; rcrend(); ++rc) { - *it++ = *isit++; - for (Py_ssize_t c=0; c<(-step-1) && it != self->rend(); ++c) - it++; - } - } - } - - template - inline void - delslice(Sequence* self, Difference i, Difference j, Py_ssize_t step) { - typename Sequence::size_type size = self->size(); - Difference ii = 0; - Difference jj = 0; - swig::slice_adjust(i, j, step, size, ii, jj, true); - if (step > 0) { - typename Sequence::iterator sb = self->begin(); - std::advance(sb,ii); - if (step == 1) { - typename Sequence::iterator se = self->begin(); - std::advance(se,jj); - self->erase(sb,se); - } else { - typename Sequence::iterator it = sb; - size_t delcount = (jj - ii + step - 1) / step; - while (delcount) { - it = self->erase(it); - for (Py_ssize_t c=0; c<(step-1) && it != self->end(); ++c) - it++; - delcount--; - } - } - } else { - typename Sequence::reverse_iterator sb = self->rbegin(); - std::advance(sb,size-ii-1); - typename Sequence::reverse_iterator it = sb; - size_t delcount = (ii - jj - step - 1) / -step; - while (delcount) { - it = typename Sequence::reverse_iterator(self->erase((++it).base())); - for (Py_ssize_t c=0; c<(-step-1) && it != self->rend(); ++c) - it++; - delcount--; - } - } - } -} - - -#if defined(__SUNPRO_CC) && defined(_RWSTD_VER) -# if !defined(SWIG_NO_STD_NOITERATOR_TRAITS_STL) -# define SWIG_STD_NOITERATOR_TRAITS_STL -# endif -#endif - -#if !defined(SWIG_STD_NOITERATOR_TRAITS_STL) -#include -#else -namespace std { - template - struct iterator_traits { - typedef ptrdiff_t difference_type; - typedef typename Iterator::value_type value_type; - }; - - template - struct iterator_traits<__reverse_bi_iterator > { - typedef Distance difference_type; - typedef T value_type; - }; - - template - struct iterator_traits { - typedef T value_type; - typedef ptrdiff_t difference_type; - }; - - template - inline typename iterator_traits<_InputIterator>::difference_type - distance(_InputIterator __first, _InputIterator __last) - { - typename iterator_traits<_InputIterator>::difference_type __n = 0; - while (__first != __last) { - ++__first; ++__n; - } - return __n; - } -} -#endif - - -namespace swig { - template - class SwigPyIterator_T : public SwigPyIterator - { - public: - typedef OutIterator out_iterator; - typedef typename std::iterator_traits::value_type value_type; - typedef SwigPyIterator_T self_type; - - SwigPyIterator_T(out_iterator curr, PyObject *seq) - : SwigPyIterator(seq), current(curr) - { - } - - const out_iterator& get_current() const - { - return current; - } - - - bool equal (const SwigPyIterator &iter) const - { - const self_type *iters = dynamic_cast(&iter); - if (iters) { - return (current == iters->get_current()); - } else { - throw std::invalid_argument("bad iterator type"); - } - } - - ptrdiff_t distance(const SwigPyIterator &iter) const - { - const self_type *iters = dynamic_cast(&iter); - if (iters) { - return std::distance(current, iters->get_current()); - } else { - throw std::invalid_argument("bad iterator type"); - } - } - - protected: - out_iterator current; - }; - - template - struct from_oper - { - typedef const ValueType& argument_type; - typedef PyObject *result_type; - result_type operator()(argument_type v) const - { - return swig::from(v); - } - }; + }; template::value_type, @@ -4375,260 +4599,367 @@ namespace swig { } -namespace swig -{ - template - struct SwigPySequence_Ref - { - SwigPySequence_Ref(PyObject* seq, Py_ssize_t index) - : _seq(seq), _index(index) - { - } - - operator T () const - { - swig::SwigVar_PyObject item = PySequence_GetItem(_seq, _index); - try { - return swig::as(item); - } catch (const std::invalid_argument& e) { - char msg[1024]; - sprintf(msg, "in sequence element %d ", (int)_index); - if (!PyErr_Occurred()) { - ::SWIG_Error(SWIG_TypeError, swig::type_name()); - } - SWIG_Python_AddErrorMsg(msg); - SWIG_Python_AddErrorMsg(e.what()); - throw; - } - } + namespace swig { + template <> struct traits< device > { + typedef pointer_category category; + static const char* type_name() { return"device"; } + }; + } - SwigPySequence_Ref& operator=(const T& v) - { - PySequence_SetItem(_seq, _index, swig::from(v)); - return *this; - } - private: - PyObject* _seq; - Py_ssize_t _index; - }; +#include - template - struct SwigPySequence_ArrowProxy +namespace std { + template <> + struct less { - SwigPySequence_ArrowProxy(const T& x): m_value(x) {} - const T* operator->() const { return &m_value; } - operator const T*() const { return &m_value; } - T m_value; + bool + operator()(PyObject * v, PyObject *w) const + { + bool res; + SWIG_PYTHON_THREAD_BEGIN_BLOCK; + res = PyObject_RichCompareBool(v, w, Py_LT) ? true : false; + /* This may fall into a case of inconsistent + eg. ObjA > ObjX > ObjB + but ObjA < ObjB + */ + if( PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_TypeError) ) + { + /* Objects can't be compared, this mostly occurred in Python 3.0 */ + /* Compare their ptr directly for a workaround */ + res = (v < w); + PyErr_Clear(); + } + SWIG_PYTHON_THREAD_END_BLOCK; + return res; + } }; - template - struct SwigPySequence_InputIterator + template <> + struct less { - typedef SwigPySequence_InputIterator self; - - typedef std::random_access_iterator_tag iterator_category; - typedef Reference reference; - typedef T value_type; - typedef T* pointer; - typedef Py_ssize_t difference_type; - - SwigPySequence_InputIterator() - { - } - - SwigPySequence_InputIterator(PyObject* seq, Py_ssize_t index) - : _seq(seq), _index(index) + bool + operator()(const swig::SwigPtr_PyObject& v, const swig::SwigPtr_PyObject& w) const { + return std::less()(v, w); } + }; - reference operator*() const + template <> + struct less + { + bool + operator()(const swig::SwigVar_PyObject& v, const swig::SwigVar_PyObject& w) const { - return reference(_seq, _index); - } - - SwigPySequence_ArrowProxy - operator->() const { - return SwigPySequence_ArrowProxy(operator*()); + return std::less()(v, w); } + }; - bool operator==(const self& ri) const - { - return (_index == ri._index) && (_seq == ri._seq); - } +} - bool operator!=(const self& ri) const - { - return !(operator==(ri)); - } +namespace swig { + template <> struct traits { + typedef value_category category; + static const char* type_name() { return "PyObject *"; } + }; - self& operator ++ () - { - ++_index; - return *this; + template <> struct traits_asval { + typedef PyObject * value_type; + static int asval(PyObject *obj, value_type *val) { + if (val) *val = obj; + return SWIG_OK; } + }; - self& operator -- () - { - --_index; - return *this; + template <> + struct traits_check { + static bool check(PyObject *) { + return true; } + }; - self& operator += (difference_type n) - { - _index += n; - return *this; + template <> struct traits_from { + typedef PyObject * value_type; + static PyObject *from(const value_type& val) { + Py_XINCREF(val); + return val; } + }; + +} - self operator +(difference_type n) const - { - return self(_seq, _index + n); +namespace swig { + template + inline size_t + check_index(Difference i, size_t size, bool insert = false) { + if ( i < 0 ) { + if ((size_t) (-i) <= size) + return (size_t) (i + size); + } else if ( (size_t) i < size ) { + return (size_t) i; + } else if (insert && ((size_t) i == size)) { + return size; } + throw std::out_of_range("index out of range"); + } - self& operator -= (difference_type n) - { - _index -= n; - return *this; + template + void + slice_adjust(Difference i, Difference j, Py_ssize_t step, size_t size, Difference &ii, Difference &jj, bool insert = false) { + if (step == 0) { + throw std::invalid_argument("slice step cannot be zero"); + } else if (step > 0) { + // Required range: 0 <= i < size, 0 <= j < size, i <= j + if (i < 0) { + ii = 0; + } else if (i < (Difference)size) { + ii = i; + } else if (insert && (i >= (Difference)size)) { + ii = (Difference)size; + } + if (j < 0) { + jj = 0; + } else { + jj = (j < (Difference)size) ? j : (Difference)size; + } + if (jj < ii) + jj = ii; + } else { + // Required range: -1 <= i < size-1, -1 <= j < size-1, i >= j + if (i < -1) { + ii = -1; + } else if (i < (Difference) size) { + ii = i; + } else if (i >= (Difference)(size-1)) { + ii = (Difference)(size-1); + } + if (j < -1) { + jj = -1; + } else { + jj = (j < (Difference)size ) ? j : (Difference)(size-1); + } + if (ii < jj) + ii = jj; } + } - self operator -(difference_type n) const - { - return self(_seq, _index - n); - } + template + inline typename Sequence::iterator + getpos(Sequence* self, Difference i) { + typename Sequence::iterator pos = self->begin(); + std::advance(pos, check_index(i,self->size())); + return pos; + } - difference_type operator - (const self& ri) const - { - return _index - ri._index; - } + template + inline typename Sequence::const_iterator + cgetpos(const Sequence* self, Difference i) { + typename Sequence::const_iterator pos = self->begin(); + std::advance(pos, check_index(i,self->size())); + return pos; + } - bool operator < (const self& ri) const - { - return _index < ri._index; - } + template + inline void + erase(Sequence* seq, const typename Sequence::iterator& position) { + seq->erase(position); + } - reference - operator[](difference_type n) const - { - return reference(_seq, _index + n); + template + struct traits_reserve { + static void reserve(Sequence & /*seq*/, typename Sequence::size_type /*n*/) { + // This should be specialized for types that support reserve } - - private: - PyObject* _seq; - difference_type _index; }; - // STL container wrapper around a Python sequence - template - struct SwigPySequence_Cont - { - typedef SwigPySequence_Ref reference; - typedef const SwigPySequence_Ref const_reference; - typedef T value_type; - typedef T* pointer; - typedef Py_ssize_t difference_type; - typedef size_t size_type; - typedef const pointer const_pointer; - typedef SwigPySequence_InputIterator iterator; - typedef SwigPySequence_InputIterator const_iterator; - - SwigPySequence_Cont(PyObject* seq) : _seq(0) - { - if (!PySequence_Check(seq)) { - throw std::invalid_argument("a sequence is expected"); - } - _seq = seq; - Py_INCREF(_seq); - } - - ~SwigPySequence_Cont() - { - Py_XDECREF(_seq); - } - - size_type size() const - { - return static_cast(PySequence_Size(_seq)); - } - - bool empty() const - { - return size() == 0; - } - - iterator begin() - { - return iterator(_seq, 0); - } + template + inline Sequence* + getslice(const Sequence* self, Difference i, Difference j, Py_ssize_t step) { + typename Sequence::size_type size = self->size(); + Difference ii = 0; + Difference jj = 0; + swig::slice_adjust(i, j, step, size, ii, jj); - const_iterator begin() const - { - return const_iterator(_seq, 0); + if (step > 0) { + typename Sequence::const_iterator sb = self->begin(); + typename Sequence::const_iterator se = self->begin(); + std::advance(sb,ii); + std::advance(se,jj); + if (step == 1) { + return new Sequence(sb, se); + } else { + Sequence *sequence = new Sequence(); + swig::traits_reserve::reserve(*sequence, (jj - ii + step - 1) / step); + typename Sequence::const_iterator it = sb; + while (it!=se) { + sequence->push_back(*it); + for (Py_ssize_t c=0; c::reserve(*sequence, (ii - jj - step - 1) / -step); + typename Sequence::const_reverse_iterator sb = self->rbegin(); + typename Sequence::const_reverse_iterator se = self->rbegin(); + std::advance(sb,size-ii-1); + std::advance(se,size-jj-1); + typename Sequence::const_reverse_iterator it = sb; + while (it!=se) { + sequence->push_back(*it); + for (Py_ssize_t c=0; c<-step && it!=se; ++c) + it++; + } + return sequence; } + } - iterator end() - { - return iterator(_seq, size()); + template + inline void + setslice(Sequence* self, Difference i, Difference j, Py_ssize_t step, const InputSeq& is = InputSeq()) { + typename Sequence::size_type size = self->size(); + Difference ii = 0; + Difference jj = 0; + swig::slice_adjust(i, j, step, size, ii, jj, true); + if (step > 0) { + if (step == 1) { + size_t ssize = jj - ii; + if (ssize <= is.size()) { + // expanding/staying the same size + swig::traits_reserve::reserve(*self, self->size() - ssize + is.size()); + typename Sequence::iterator sb = self->begin(); + typename InputSeq::const_iterator isit = is.begin(); + std::advance(sb,ii); + std::advance(isit, jj - ii); + self->insert(std::copy(is.begin(), isit, sb), isit, is.end()); + } else { + // shrinking + typename Sequence::iterator sb = self->begin(); + typename Sequence::iterator se = self->begin(); + std::advance(sb,ii); + std::advance(se,jj); + self->erase(sb,se); + sb = self->begin(); + std::advance(sb,ii); + self->insert(sb, is.begin(), is.end()); + } + } else { + size_t replacecount = (jj - ii + step - 1) / step; + if (is.size() != replacecount) { + char msg[1024]; + PyOS_snprintf(msg, sizeof(msg), "attempt to assign sequence of size %lu to extended slice of size %lu", (unsigned long)is.size(), (unsigned long)replacecount); + throw std::invalid_argument(msg); + } + typename Sequence::const_iterator isit = is.begin(); + typename Sequence::iterator it = self->begin(); + std::advance(it,ii); + for (size_t rc=0; rcend(); ++rc) { + *it++ = *isit++; + for (Py_ssize_t c=0; c<(step-1) && it != self->end(); ++c) + it++; + } + } + } else { + size_t replacecount = (ii - jj - step - 1) / -step; + if (is.size() != replacecount) { + char msg[1024]; + PyOS_snprintf(msg, sizeof(msg), "attempt to assign sequence of size %lu to extended slice of size %lu", (unsigned long)is.size(), (unsigned long)replacecount); + throw std::invalid_argument(msg); + } + typename Sequence::const_iterator isit = is.begin(); + typename Sequence::reverse_iterator it = self->rbegin(); + std::advance(it,size-ii-1); + for (size_t rc=0; rcrend(); ++rc) { + *it++ = *isit++; + for (Py_ssize_t c=0; c<(-step-1) && it != self->rend(); ++c) + it++; + } } + } - const_iterator end() const - { - return const_iterator(_seq, size()); + template + inline void + delslice(Sequence* self, Difference i, Difference j, Py_ssize_t step) { + typename Sequence::size_type size = self->size(); + Difference ii = 0; + Difference jj = 0; + swig::slice_adjust(i, j, step, size, ii, jj, true); + if (step > 0) { + typename Sequence::iterator sb = self->begin(); + std::advance(sb,ii); + if (step == 1) { + typename Sequence::iterator se = self->begin(); + std::advance(se,jj); + self->erase(sb,se); + } else { + typename Sequence::iterator it = sb; + size_t delcount = (jj - ii + step - 1) / step; + while (delcount) { + it = self->erase(it); + for (Py_ssize_t c=0; c<(step-1) && it != self->end(); ++c) + it++; + delcount--; + } + } + } else { + typename Sequence::reverse_iterator sb = self->rbegin(); + std::advance(sb,size-ii-1); + typename Sequence::reverse_iterator it = sb; + size_t delcount = (ii - jj - step - 1) / -step; + while (delcount) { + it = typename Sequence::reverse_iterator(self->erase((++it).base())); + for (Py_ssize_t c=0; c<(-step-1) && it != self->rend(); ++c) + it++; + delcount--; + } } + } +} - reference operator[](difference_type n) - { - return reference(_seq, n); - } - const_reference operator[](difference_type n) const - { - return const_reference(_seq, n); +namespace swig { + template + struct IteratorProtocol { + static void assign(PyObject *obj, Seq *seq) { + SwigVar_PyObject iter = PyObject_GetIter(obj); + if (iter) { + SwigVar_PyObject item = PyIter_Next(iter); + while (item) { + seq->insert(seq->end(), swig::as(item)); + item = PyIter_Next(iter); + } + } } - bool check() const - { - Py_ssize_t s = size(); - for (Py_ssize_t i = 0; i < s; ++i) { - swig::SwigVar_PyObject item = PySequence_GetItem(_seq, i); - if (!swig::check(item)) - return false; + static bool check(PyObject *obj) { + bool ret = false; + SwigVar_PyObject iter = PyObject_GetIter(obj); + if (iter) { + SwigVar_PyObject item = PyIter_Next(iter); + ret = true; + while (item) { + ret = swig::check(item); + item = ret ? PyIter_Next(iter) : 0; + } } - return true; + return ret; } - - private: - PyObject* _seq; }; -} - - - namespace swig { - template <> struct traits< device > { - typedef pointer_category category; - static const char* type_name() { return"device"; } - }; - } - - -namespace swig { - template - inline void - assign(const SwigPySeq& swigpyseq, Seq* seq) { - // seq->assign(swigpyseq.begin(), swigpyseq.end()); // not used as not always implemented - typedef typename SwigPySeq::value_type value_type; - typename SwigPySeq::const_iterator it = swigpyseq.begin(); - for (;it != swigpyseq.end(); ++it) { - seq->insert(seq->end(),(value_type)(*it)); - } - } - template struct traits_asptr_stdseq { typedef Seq sequence; typedef T value_type; + static bool is_iterable(PyObject *obj) { + SwigVar_PyObject iter = PyObject_GetIter(obj); + PyErr_Clear(); + return iter != 0; + } + static int asptr(PyObject *obj, sequence **seq) { + int ret = SWIG_ERROR; if (obj == Py_None || SWIG_Python_GetSwigThis(obj)) { sequence *p; swig_type_info *descriptor = swig::type_info(); @@ -4636,27 +4967,25 @@ namespace swig { if (seq) *seq = p; return SWIG_OLDOBJ; } - } else if (PySequence_Check(obj)) { + } else if (is_iterable(obj)) { try { - SwigPySequence_Cont swigpyseq(obj); if (seq) { - sequence *pseq = new sequence(); - assign(swigpyseq, pseq); - *seq = pseq; - return SWIG_NEWOBJ; + *seq = new sequence(); + IteratorProtocol::assign(obj, *seq); + if (!PyErr_Occurred()) + return SWIG_NEWOBJ; } else { - return swigpyseq.check() ? SWIG_OK : SWIG_ERROR; + return IteratorProtocol::check(obj) ? SWIG_OK : SWIG_ERROR; } } catch (std::exception& e) { - if (seq) { - if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_TypeError, e.what()); - } - } - return SWIG_ERROR; + if (seq && !PyErr_Occurred()) + PyErr_SetString(PyExc_TypeError, e.what()); } + if (seq) + delete *seq; + return SWIG_ERROR; } - return SWIG_ERROR; + return ret; } }; @@ -4843,7 +5172,7 @@ namespace swig { struct container_owner { // By default, do not add the back-reference (for value types) // Specialization below will check the reference for pointer types. - static bool back_reference(PyObject* child, PyObject* owner) { + static bool back_reference(PyObject* /*child*/, PyObject* /*owner*/) { return false; } }; @@ -4860,8 +5189,7 @@ namespace swig { static bool back_reference(PyObject* child, PyObject* owner) { SwigPyObject* swigThis = SWIG_Python_GetSwigThis(child); if (swigThis && (swigThis->own & SWIG_POINTER_OWN) != SWIG_POINTER_OWN) { - PyObject_SetAttr(child, container_owner_attribute(), owner); - return true; + return PyObject_SetAttr(child, container_owner_attribute(), owner) != -1; } return false; } @@ -4916,13 +5244,14 @@ SWIG_AsVal_bool (PyObject *obj, bool *val) #ifdef __cplusplus extern "C" { #endif -SWIGINTERN PyObject *_wrap_delete_SwigPyIterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_delete_SwigPyIterator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_DISOWN | 0 ); @@ -4930,11 +5259,7 @@ SWIGINTERN PyObject *_wrap_delete_SwigPyIterator(PyObject *SWIGUNUSEDPARM(self), SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SwigPyIterator" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); } arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1); - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - delete arg1; - SWIG_PYTHON_THREAD_END_ALLOW; - } + delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: @@ -4942,7 +5267,7 @@ SWIGINTERN PyObject *_wrap_delete_SwigPyIterator(PyObject *SWIGUNUSEDPARM(self), } -SWIGINTERN PyObject *_wrap_SwigPyIterator_value(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_SwigPyIterator_value(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; void *argp1 = 0 ; @@ -4950,6 +5275,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_value(PyObject *SWIGUNUSEDPARM(self), PyObject *swig_obj[1] ; PyObject *result = 0 ; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); @@ -4958,11 +5284,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_value(PyObject *SWIGUNUSEDPARM(self), } arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1); try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (PyObject *)((swig::SwigPyIterator const *)arg1)->value(); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (PyObject *)((swig::SwigPyIterator const *)arg1)->value(); } catch(swig::stop_iteration &_e) { { (void)_e; @@ -4977,7 +5299,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_value(PyObject *SWIGUNUSEDPARM(self), } -SWIGINTERN PyObject *_wrap_SwigPyIterator_incr__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_SwigPyIterator_incr__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; size_t arg2 ; @@ -4987,6 +5309,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_incr__SWIG_0(PyObject *SWIGUNUSEDPARM( int ecode2 = 0 ; swig::SwigPyIterator *result = 0 ; + (void)self; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { @@ -4999,11 +5322,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_incr__SWIG_0(PyObject *SWIGUNUSEDPARM( } arg2 = static_cast< size_t >(val2); try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (swig::SwigPyIterator *)(arg1)->incr(arg2); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (swig::SwigPyIterator *)(arg1)->incr(arg2); } catch(swig::stop_iteration &_e) { { (void)_e; @@ -5018,13 +5337,14 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_incr__SWIG_0(PyObject *SWIGUNUSEDPARM( } -SWIGINTERN PyObject *_wrap_SwigPyIterator_incr__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_SwigPyIterator_incr__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::SwigPyIterator *result = 0 ; + (void)self; if ((nobjs < 1) || (nobjs > 1)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { @@ -5032,11 +5352,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_incr__SWIG_1(PyObject *SWIGUNUSEDPARM( } arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1); try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (swig::SwigPyIterator *)(arg1)->incr(); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (swig::SwigPyIterator *)(arg1)->incr(); } catch(swig::stop_iteration &_e) { { (void)_e; @@ -5060,7 +5376,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_incr(PyObject *self, PyObject *args) { if (!(argc = SWIG_Python_UnpackTuple(args, "SwigPyIterator_incr", 0, 2, argv))) SWIG_fail; --argc; if (argc == 1) { - int _v; + int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0); _v = SWIG_CheckState(res); @@ -5069,7 +5385,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_incr(PyObject *self, PyObject *args) { } } if (argc == 2) { - int _v; + int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0); _v = SWIG_CheckState(res); @@ -5093,7 +5409,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_incr(PyObject *self, PyObject *args) { } -SWIGINTERN PyObject *_wrap_SwigPyIterator_decr__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_SwigPyIterator_decr__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; size_t arg2 ; @@ -5103,6 +5419,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_decr__SWIG_0(PyObject *SWIGUNUSEDPARM( int ecode2 = 0 ; swig::SwigPyIterator *result = 0 ; + (void)self; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { @@ -5115,11 +5432,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_decr__SWIG_0(PyObject *SWIGUNUSEDPARM( } arg2 = static_cast< size_t >(val2); try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (swig::SwigPyIterator *)(arg1)->decr(arg2); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (swig::SwigPyIterator *)(arg1)->decr(arg2); } catch(swig::stop_iteration &_e) { { (void)_e; @@ -5134,13 +5447,14 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_decr__SWIG_0(PyObject *SWIGUNUSEDPARM( } -SWIGINTERN PyObject *_wrap_SwigPyIterator_decr__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_SwigPyIterator_decr__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::SwigPyIterator *result = 0 ; + (void)self; if ((nobjs < 1) || (nobjs > 1)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { @@ -5148,11 +5462,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_decr__SWIG_1(PyObject *SWIGUNUSEDPARM( } arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1); try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (swig::SwigPyIterator *)(arg1)->decr(); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (swig::SwigPyIterator *)(arg1)->decr(); } catch(swig::stop_iteration &_e) { { (void)_e; @@ -5176,7 +5486,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_decr(PyObject *self, PyObject *args) { if (!(argc = SWIG_Python_UnpackTuple(args, "SwigPyIterator_decr", 0, 2, argv))) SWIG_fail; --argc; if (argc == 1) { - int _v; + int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0); _v = SWIG_CheckState(res); @@ -5185,7 +5495,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_decr(PyObject *self, PyObject *args) { } } if (argc == 2) { - int _v; + int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0); _v = SWIG_CheckState(res); @@ -5209,7 +5519,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_decr(PyObject *self, PyObject *args) { } -SWIGINTERN PyObject *_wrap_SwigPyIterator_distance(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_SwigPyIterator_distance(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; swig::SwigPyIterator *arg2 = 0 ; @@ -5220,6 +5530,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_distance(PyObject *SWIGUNUSEDPARM(self PyObject *swig_obj[2] ; ptrdiff_t result; + (void)self; if (!SWIG_Python_UnpackTuple(args, "SwigPyIterator_distance", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { @@ -5235,11 +5546,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_distance(PyObject *SWIGUNUSEDPARM(self } arg2 = reinterpret_cast< swig::SwigPyIterator * >(argp2); try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = ((swig::SwigPyIterator const *)arg1)->distance((swig::SwigPyIterator const &)*arg2); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = ((swig::SwigPyIterator const *)arg1)->distance((swig::SwigPyIterator const &)*arg2); } catch(std::invalid_argument &_e) { SWIG_Python_Raise(SWIG_NewPointerObj((new std::invalid_argument(static_cast< const std::invalid_argument& >(_e))),SWIGTYPE_p_std__invalid_argument,SWIG_POINTER_OWN), "std::invalid_argument", SWIGTYPE_p_std__invalid_argument); SWIG_fail; } @@ -5250,7 +5557,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_distance(PyObject *SWIGUNUSEDPARM(self } -SWIGINTERN PyObject *_wrap_SwigPyIterator_equal(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_SwigPyIterator_equal(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; swig::SwigPyIterator *arg2 = 0 ; @@ -5261,6 +5568,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_equal(PyObject *SWIGUNUSEDPARM(self), PyObject *swig_obj[2] ; bool result; + (void)self; if (!SWIG_Python_UnpackTuple(args, "SwigPyIterator_equal", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { @@ -5276,11 +5584,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_equal(PyObject *SWIGUNUSEDPARM(self), } arg2 = reinterpret_cast< swig::SwigPyIterator * >(argp2); try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (bool)((swig::SwigPyIterator const *)arg1)->equal((swig::SwigPyIterator const &)*arg2); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (bool)((swig::SwigPyIterator const *)arg1)->equal((swig::SwigPyIterator const &)*arg2); } catch(std::invalid_argument &_e) { SWIG_Python_Raise(SWIG_NewPointerObj((new std::invalid_argument(static_cast< const std::invalid_argument& >(_e))),SWIGTYPE_p_std__invalid_argument,SWIG_POINTER_OWN), "std::invalid_argument", SWIGTYPE_p_std__invalid_argument); SWIG_fail; } @@ -5291,7 +5595,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_equal(PyObject *SWIGUNUSEDPARM(self), } -SWIGINTERN PyObject *_wrap_SwigPyIterator_copy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_SwigPyIterator_copy(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; void *argp1 = 0 ; @@ -5299,6 +5603,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_copy(PyObject *SWIGUNUSEDPARM(self), P PyObject *swig_obj[1] ; swig::SwigPyIterator *result = 0 ; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); @@ -5306,11 +5611,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_copy(PyObject *SWIGUNUSEDPARM(self), P SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_copy" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); } arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1); - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (swig::SwigPyIterator *)((swig::SwigPyIterator const *)arg1)->copy(); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (swig::SwigPyIterator *)((swig::SwigPyIterator const *)arg1)->copy(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN | 0 ); return resultobj; fail: @@ -5318,7 +5619,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_copy(PyObject *SWIGUNUSEDPARM(self), P } -SWIGINTERN PyObject *_wrap_SwigPyIterator_next(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_SwigPyIterator_next(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; void *argp1 = 0 ; @@ -5326,6 +5627,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_next(PyObject *SWIGUNUSEDPARM(self), P PyObject *swig_obj[1] ; PyObject *result = 0 ; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); @@ -5334,11 +5636,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_next(PyObject *SWIGUNUSEDPARM(self), P } arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1); try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (PyObject *)(arg1)->next(); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (PyObject *)(arg1)->next(); } catch(swig::stop_iteration &_e) { { (void)_e; @@ -5353,7 +5651,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_next(PyObject *SWIGUNUSEDPARM(self), P } -SWIGINTERN PyObject *_wrap_SwigPyIterator___next__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_SwigPyIterator___next__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; void *argp1 = 0 ; @@ -5361,6 +5659,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator___next__(PyObject *SWIGUNUSEDPARM(self PyObject *swig_obj[1] ; PyObject *result = 0 ; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); @@ -5369,11 +5668,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator___next__(PyObject *SWIGUNUSEDPARM(self } arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1); try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (PyObject *)(arg1)->__next__(); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (PyObject *)(arg1)->__next__(); } catch(swig::stop_iteration &_e) { { (void)_e; @@ -5388,7 +5683,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator___next__(PyObject *SWIGUNUSEDPARM(self } -SWIGINTERN PyObject *_wrap_SwigPyIterator_previous(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_SwigPyIterator_previous(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; void *argp1 = 0 ; @@ -5396,6 +5691,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_previous(PyObject *SWIGUNUSEDPARM(self PyObject *swig_obj[1] ; PyObject *result = 0 ; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); @@ -5404,11 +5700,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_previous(PyObject *SWIGUNUSEDPARM(self } arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1); try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (PyObject *)(arg1)->previous(); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (PyObject *)(arg1)->previous(); } catch(swig::stop_iteration &_e) { { (void)_e; @@ -5423,7 +5715,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_previous(PyObject *SWIGUNUSEDPARM(self } -SWIGINTERN PyObject *_wrap_SwigPyIterator_advance(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_SwigPyIterator_advance(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; ptrdiff_t arg2 ; @@ -5434,6 +5726,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_advance(PyObject *SWIGUNUSEDPARM(self) PyObject *swig_obj[2] ; swig::SwigPyIterator *result = 0 ; + (void)self; if (!SWIG_Python_UnpackTuple(args, "SwigPyIterator_advance", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { @@ -5446,11 +5739,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_advance(PyObject *SWIGUNUSEDPARM(self) } arg2 = static_cast< ptrdiff_t >(val2); try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (swig::SwigPyIterator *)(arg1)->advance(arg2); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (swig::SwigPyIterator *)(arg1)->advance(arg2); } catch(swig::stop_iteration &_e) { { (void)_e; @@ -5465,7 +5754,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator_advance(PyObject *SWIGUNUSEDPARM(self) } -SWIGINTERN PyObject *_wrap_SwigPyIterator___eq__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_SwigPyIterator___eq__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; swig::SwigPyIterator *arg2 = 0 ; @@ -5476,6 +5765,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator___eq__(PyObject *SWIGUNUSEDPARM(self), PyObject *swig_obj[2] ; bool result; + (void)self; if (!SWIG_Python_UnpackTuple(args, "SwigPyIterator___eq__", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { @@ -5490,21 +5780,20 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator___eq__(PyObject *SWIGUNUSEDPARM(self), SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SwigPyIterator___eq__" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); } arg2 = reinterpret_cast< swig::SwigPyIterator * >(argp2); - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (bool)((swig::SwigPyIterator const *)arg1)->operator ==((swig::SwigPyIterator const &)*arg2); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (bool)((swig::SwigPyIterator const *)arg1)->operator ==((swig::SwigPyIterator const &)*arg2); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: + if (PyErr_Occurred() && !PyErr_ExceptionMatches(PyExc_TypeError)) { + return NULL; + } PyErr_Clear(); Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } -SWIGINTERN PyObject *_wrap_SwigPyIterator___ne__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_SwigPyIterator___ne__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; swig::SwigPyIterator *arg2 = 0 ; @@ -5515,6 +5804,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator___ne__(PyObject *SWIGUNUSEDPARM(self), PyObject *swig_obj[2] ; bool result; + (void)self; if (!SWIG_Python_UnpackTuple(args, "SwigPyIterator___ne__", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { @@ -5529,21 +5819,20 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator___ne__(PyObject *SWIGUNUSEDPARM(self), SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SwigPyIterator___ne__" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); } arg2 = reinterpret_cast< swig::SwigPyIterator * >(argp2); - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (bool)((swig::SwigPyIterator const *)arg1)->operator !=((swig::SwigPyIterator const &)*arg2); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (bool)((swig::SwigPyIterator const *)arg1)->operator !=((swig::SwigPyIterator const &)*arg2); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: + if (PyErr_Occurred() && !PyErr_ExceptionMatches(PyExc_TypeError)) { + return NULL; + } PyErr_Clear(); Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } -SWIGINTERN PyObject *_wrap_SwigPyIterator___iadd__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_SwigPyIterator___iadd__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; ptrdiff_t arg2 ; @@ -5554,6 +5843,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator___iadd__(PyObject *SWIGUNUSEDPARM(self PyObject *swig_obj[2] ; swig::SwigPyIterator *result = 0 ; + (void)self; if (!SWIG_Python_UnpackTuple(args, "SwigPyIterator___iadd__", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { @@ -5566,11 +5856,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator___iadd__(PyObject *SWIGUNUSEDPARM(self } arg2 = static_cast< ptrdiff_t >(val2); try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (swig::SwigPyIterator *) &(arg1)->operator +=(arg2); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (swig::SwigPyIterator *) &(arg1)->operator +=(arg2); } catch(swig::stop_iteration &_e) { { (void)_e; @@ -5585,7 +5871,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator___iadd__(PyObject *SWIGUNUSEDPARM(self } -SWIGINTERN PyObject *_wrap_SwigPyIterator___isub__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_SwigPyIterator___isub__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; ptrdiff_t arg2 ; @@ -5596,6 +5882,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator___isub__(PyObject *SWIGUNUSEDPARM(self PyObject *swig_obj[2] ; swig::SwigPyIterator *result = 0 ; + (void)self; if (!SWIG_Python_UnpackTuple(args, "SwigPyIterator___isub__", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { @@ -5608,11 +5895,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator___isub__(PyObject *SWIGUNUSEDPARM(self } arg2 = static_cast< ptrdiff_t >(val2); try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (swig::SwigPyIterator *) &(arg1)->operator -=(arg2); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (swig::SwigPyIterator *) &(arg1)->operator -=(arg2); } catch(swig::stop_iteration &_e) { { (void)_e; @@ -5627,7 +5910,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator___isub__(PyObject *SWIGUNUSEDPARM(self } -SWIGINTERN PyObject *_wrap_SwigPyIterator___add__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_SwigPyIterator___add__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; ptrdiff_t arg2 ; @@ -5638,6 +5921,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator___add__(PyObject *SWIGUNUSEDPARM(self) PyObject *swig_obj[2] ; swig::SwigPyIterator *result = 0 ; + (void)self; if (!SWIG_Python_UnpackTuple(args, "SwigPyIterator___add__", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { @@ -5650,11 +5934,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator___add__(PyObject *SWIGUNUSEDPARM(self) } arg2 = static_cast< ptrdiff_t >(val2); try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (swig::SwigPyIterator *)((swig::SwigPyIterator const *)arg1)->operator +(arg2); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (swig::SwigPyIterator *)((swig::SwigPyIterator const *)arg1)->operator +(arg2); } catch(swig::stop_iteration &_e) { { (void)_e; @@ -5665,13 +5945,16 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator___add__(PyObject *SWIGUNUSEDPARM(self) resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN | 0 ); return resultobj; fail: + if (PyErr_Occurred() && !PyErr_ExceptionMatches(PyExc_TypeError)) { + return NULL; + } PyErr_Clear(); Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } -SWIGINTERN PyObject *_wrap_SwigPyIterator___sub____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_SwigPyIterator___sub____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; ptrdiff_t arg2 ; @@ -5681,6 +5964,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator___sub____SWIG_0(PyObject *SWIGUNUSEDPA int ecode2 = 0 ; swig::SwigPyIterator *result = 0 ; + (void)self; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { @@ -5693,11 +5977,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator___sub____SWIG_0(PyObject *SWIGUNUSEDPA } arg2 = static_cast< ptrdiff_t >(val2); try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (swig::SwigPyIterator *)((swig::SwigPyIterator const *)arg1)->operator -(arg2); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (swig::SwigPyIterator *)((swig::SwigPyIterator const *)arg1)->operator -(arg2); } catch(swig::stop_iteration &_e) { { (void)_e; @@ -5708,13 +5988,16 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator___sub____SWIG_0(PyObject *SWIGUNUSEDPA resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN | 0 ); return resultobj; fail: + if (PyErr_Occurred() && !PyErr_ExceptionMatches(PyExc_TypeError)) { + return NULL; + } PyErr_Clear(); Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } -SWIGINTERN PyObject *_wrap_SwigPyIterator___sub____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_SwigPyIterator___sub____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; swig::SwigPyIterator *arg2 = 0 ; @@ -5724,6 +6007,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator___sub____SWIG_1(PyObject *SWIGUNUSEDPA int res2 = 0 ; ptrdiff_t result; + (void)self; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { @@ -5738,14 +6022,13 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator___sub____SWIG_1(PyObject *SWIGUNUSEDPA SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SwigPyIterator___sub__" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); } arg2 = reinterpret_cast< swig::SwigPyIterator * >(argp2); - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = ((swig::SwigPyIterator const *)arg1)->operator -((swig::SwigPyIterator const &)*arg2); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = ((swig::SwigPyIterator const *)arg1)->operator -((swig::SwigPyIterator const &)*arg2); resultobj = SWIG_From_ptrdiff_t(static_cast< ptrdiff_t >(result)); return resultobj; fail: + if (PyErr_Occurred() && !PyErr_ExceptionMatches(PyExc_TypeError)) { + return NULL; + } PyErr_Clear(); Py_INCREF(Py_NotImplemented); return Py_NotImplemented; @@ -5761,7 +6044,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator___sub__(PyObject *self, PyObject *args if (!(argc = SWIG_Python_UnpackTuple(args, "SwigPyIterator___sub__", 0, 2, argv))) SWIG_fail; --argc; if (argc == 2) { - int _v; + int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0); _v = SWIG_CheckState(res); @@ -5774,7 +6057,7 @@ SWIGINTERN PyObject *_wrap_SwigPyIterator___sub__(PyObject *self, PyObject *args } } if (argc == 2) { - int _v; + int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0); _v = SWIG_CheckState(res); @@ -5802,13 +6085,14 @@ SWIGINTERN PyObject *SwigPyIterator_swigregister(PyObject *SWIGUNUSEDPARM(self), return SWIG_Py_Void(); } -SWIGINTERN PyObject *_wrap_delete_BTSerialPortBinding(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_delete_BTSerialPortBinding(PyObject *self, PyObject *args) { PyObject *resultobj = 0; BTSerialPortBinding *arg1 = (BTSerialPortBinding *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_BTSerialPortBinding, SWIG_POINTER_DISOWN | 0 ); @@ -5818,11 +6102,7 @@ SWIGINTERN PyObject *_wrap_delete_BTSerialPortBinding(PyObject *SWIGUNUSEDPARM(s arg1 = reinterpret_cast< BTSerialPortBinding * >(argp1); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - delete arg1; - SWIG_PYTHON_THREAD_END_ALLOW; - } + delete arg1; } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -5848,7 +6128,7 @@ SWIGINTERN PyObject *_wrap_delete_BTSerialPortBinding(PyObject *SWIGUNUSEDPARM(s } -SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Create(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Create(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::string arg1 ; int arg2 ; @@ -5857,6 +6137,7 @@ SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Create(PyObject *SWIGUNUSEDPARM(s PyObject *swig_obj[2] ; BTSerialPortBinding *result = 0 ; + (void)self; if (!SWIG_Python_UnpackTuple(args, "BTSerialPortBinding_Create", 2, 2, swig_obj)) SWIG_fail; { std::string *ptr = (std::string *)0; @@ -5874,11 +6155,7 @@ SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Create(PyObject *SWIGUNUSEDPARM(s arg2 = static_cast< int >(val2); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (BTSerialPortBinding *)BTSerialPortBinding::Create(arg1,arg2); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (BTSerialPortBinding *)BTSerialPortBinding::Create(SWIG_STD_MOVE(arg1),arg2); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -5904,7 +6181,7 @@ SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Create(PyObject *SWIGUNUSEDPARM(s } -SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Connect(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Connect(PyObject *self, PyObject *args) { PyObject *resultobj = 0; BTSerialPortBinding *arg1 = (BTSerialPortBinding *) 0 ; void *argp1 = 0 ; @@ -5912,6 +6189,7 @@ SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Connect(PyObject *SWIGUNUSEDPARM( PyObject *swig_obj[1] ; int result; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_BTSerialPortBinding, 0 | 0 ); @@ -5921,11 +6199,7 @@ SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Connect(PyObject *SWIGUNUSEDPARM( arg1 = reinterpret_cast< BTSerialPortBinding * >(argp1); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (int)(arg1)->Connect(); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (int)(arg1)->Connect(); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -5951,13 +6225,14 @@ SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Connect(PyObject *SWIGUNUSEDPARM( } -SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Close(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Close(PyObject *self, PyObject *args) { PyObject *resultobj = 0; BTSerialPortBinding *arg1 = (BTSerialPortBinding *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_BTSerialPortBinding, 0 | 0 ); @@ -5967,11 +6242,7 @@ SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Close(PyObject *SWIGUNUSEDPARM(se arg1 = reinterpret_cast< BTSerialPortBinding * >(argp1); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - (arg1)->Close(); - SWIG_PYTHON_THREAD_END_ALLOW; - } + (arg1)->Close(); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -5997,7 +6268,7 @@ SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Close(PyObject *SWIGUNUSEDPARM(se } -SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Read(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Read(PyObject *self, PyObject *args) { PyObject *resultobj = 0; BTSerialPortBinding *arg1 = (BTSerialPortBinding *) 0 ; char *arg2 = (char *) 0 ; @@ -6010,6 +6281,7 @@ SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Read(PyObject *SWIGUNUSEDPARM(sel int size2 ; PyObject *swig_obj[2] ; + (void)self; if (!SWIG_Python_UnpackTuple(args, "BTSerialPortBinding_Read", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_BTSerialPortBinding, 0 | 0 ); if (!SWIG_IsOK(res1)) { @@ -6026,11 +6298,7 @@ SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Read(PyObject *SWIGUNUSEDPARM(sel arg3 = &size2; { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - (arg1)->Read(arg2,arg3); - SWIG_PYTHON_THREAD_END_ALLOW; - } + (arg1)->Read(arg2,arg3); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -6059,7 +6327,7 @@ SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Read(PyObject *SWIGUNUSEDPARM(sel } -SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Write(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Write(PyObject *self, PyObject *args) { PyObject *resultobj = 0; BTSerialPortBinding *arg1 = (BTSerialPortBinding *) 0 ; char *arg2 = (char *) 0 ; @@ -6068,6 +6336,7 @@ SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Write(PyObject *SWIGUNUSEDPARM(se int res1 = 0 ; PyObject *swig_obj[2] ; + (void)self; if (!SWIG_Python_UnpackTuple(args, "BTSerialPortBinding_Write", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_BTSerialPortBinding, 0 | 0 ); if (!SWIG_IsOK(res1)) { @@ -6081,11 +6350,7 @@ SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Write(PyObject *SWIGUNUSEDPARM(se } { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - (arg1)->Write((char const *)arg2,arg3); - SWIG_PYTHON_THREAD_END_ALLOW; - } + (arg1)->Write((char const *)arg2,arg3); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -6111,7 +6376,7 @@ SWIGINTERN PyObject *_wrap_BTSerialPortBinding_Write(PyObject *SWIGUNUSEDPARM(se } -SWIGINTERN PyObject *_wrap_BTSerialPortBinding_IsDataAvailable(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_BTSerialPortBinding_IsDataAvailable(PyObject *self, PyObject *args) { PyObject *resultobj = 0; BTSerialPortBinding *arg1 = (BTSerialPortBinding *) 0 ; void *argp1 = 0 ; @@ -6119,6 +6384,7 @@ SWIGINTERN PyObject *_wrap_BTSerialPortBinding_IsDataAvailable(PyObject *SWIGUNU PyObject *swig_obj[1] ; bool result; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_BTSerialPortBinding, 0 | 0 ); @@ -6128,11 +6394,7 @@ SWIGINTERN PyObject *_wrap_BTSerialPortBinding_IsDataAvailable(PyObject *SWIGUNU arg1 = reinterpret_cast< BTSerialPortBinding * >(argp1); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (bool)(arg1)->IsDataAvailable(); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (bool)(arg1)->IsDataAvailable(); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -6165,7 +6427,7 @@ SWIGINTERN PyObject *BTSerialPortBinding_swigregister(PyObject *SWIGUNUSEDPARM(s return SWIG_Py_Void(); } -SWIGINTERN PyObject *_wrap_vectordevice_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_iterator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; PyObject **arg2 = (PyObject **) 0 ; @@ -6175,20 +6437,17 @@ SWIGINTERN PyObject *_wrap_vectordevice_iterator(PyObject *SWIGUNUSEDPARM(self), swig::SwigPyIterator *result = 0 ; arg2 = &swig_obj[0]; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice_iterator" "', argument " "1"" of type '" "std::vector< device > *""'"); } arg1 = reinterpret_cast< std::vector< device > * >(argp1); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (swig::SwigPyIterator *)std_vector_Sl_device_Sg__iterator(arg1,arg2); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (swig::SwigPyIterator *)std_vector_Sl_device_Sg__iterator(arg1,arg2); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -6214,7 +6473,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_iterator(PyObject *SWIGUNUSEDPARM(self), } -SWIGINTERN PyObject *_wrap_vectordevice___nonzero__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice___nonzero__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; void *argp1 = 0 ; @@ -6222,20 +6481,17 @@ SWIGINTERN PyObject *_wrap_vectordevice___nonzero__(PyObject *SWIGUNUSEDPARM(sel PyObject *swig_obj[1] ; bool result; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice___nonzero__" "', argument " "1"" of type '" "std::vector< device > const *""'"); } arg1 = reinterpret_cast< std::vector< device > * >(argp1); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (bool)std_vector_Sl_device_Sg____nonzero__((std::vector< device > const *)arg1); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (bool)std_vector_Sl_device_Sg____nonzero__((std::vector< device > const *)arg1); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -6261,7 +6517,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___nonzero__(PyObject *SWIGUNUSEDPARM(sel } -SWIGINTERN PyObject *_wrap_vectordevice___bool__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice___bool__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; void *argp1 = 0 ; @@ -6269,20 +6525,17 @@ SWIGINTERN PyObject *_wrap_vectordevice___bool__(PyObject *SWIGUNUSEDPARM(self), PyObject *swig_obj[1] ; bool result; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice___bool__" "', argument " "1"" of type '" "std::vector< device > const *""'"); } arg1 = reinterpret_cast< std::vector< device > * >(argp1); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (bool)std_vector_Sl_device_Sg____bool__((std::vector< device > const *)arg1); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (bool)std_vector_Sl_device_Sg____bool__((std::vector< device > const *)arg1); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -6308,7 +6561,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___bool__(PyObject *SWIGUNUSEDPARM(self), } -SWIGINTERN PyObject *_wrap_vectordevice___len__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice___len__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; void *argp1 = 0 ; @@ -6316,20 +6569,17 @@ SWIGINTERN PyObject *_wrap_vectordevice___len__(PyObject *SWIGUNUSEDPARM(self), PyObject *swig_obj[1] ; std::vector< device >::size_type result; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice___len__" "', argument " "1"" of type '" "std::vector< device > const *""'"); } arg1 = reinterpret_cast< std::vector< device > * >(argp1); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = std_vector_Sl_device_Sg____len__((std::vector< device > const *)arg1); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = std_vector_Sl_device_Sg____len__((std::vector< device > const *)arg1); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -6355,7 +6605,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___len__(PyObject *SWIGUNUSEDPARM(self), } -SWIGINTERN PyObject *_wrap_vectordevice___getslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice___getslice__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device >::difference_type arg2 ; @@ -6369,8 +6619,9 @@ SWIGINTERN PyObject *_wrap_vectordevice___getslice__(PyObject *SWIGUNUSEDPARM(se PyObject *swig_obj[3] ; std::vector< device,std::allocator< device > > *result = 0 ; + (void)self; if (!SWIG_Python_UnpackTuple(args, "vectordevice___getslice__", 3, 3, swig_obj)) SWIG_fail; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice___getslice__" "', argument " "1"" of type '" "std::vector< device > *""'"); } @@ -6388,11 +6639,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___getslice__(PyObject *SWIGUNUSEDPARM(se { try { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (std::vector< device,std::allocator< device > > *)std_vector_Sl_device_Sg____getslice__(arg1,arg2,arg3); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (std::vector< device,std::allocator< device > > *)std_vector_Sl_device_Sg____getslice__(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { @@ -6416,14 +6663,14 @@ SWIGINTERN PyObject *_wrap_vectordevice___getslice__(PyObject *SWIGUNUSEDPARM(se SWIG_exception(SWIG_RuntimeError, "Unknown exception"); } } - resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, SWIG_POINTER_OWN | 0 ); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_device_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } -SWIGINTERN PyObject *_wrap_vectordevice___setslice____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_vectordevice___setslice____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device >::difference_type arg2 ; @@ -6435,8 +6682,9 @@ SWIGINTERN PyObject *_wrap_vectordevice___setslice____SWIG_0(PyObject *SWIGUNUSE ptrdiff_t val3 ; int ecode3 = 0 ; + (void)self; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice___setslice__" "', argument " "1"" of type '" "std::vector< device > *""'"); } @@ -6454,11 +6702,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___setslice____SWIG_0(PyObject *SWIGUNUSE { try { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - std_vector_Sl_device_Sg____setslice____SWIG_0(arg1,arg2,arg3); - SWIG_PYTHON_THREAD_END_ALLOW; - } + std_vector_Sl_device_Sg____setslice____SWIG_0(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { @@ -6489,7 +6733,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___setslice____SWIG_0(PyObject *SWIGUNUSE } -SWIGINTERN PyObject *_wrap_vectordevice___setslice____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_vectordevice___setslice____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device >::difference_type arg2 ; @@ -6503,8 +6747,9 @@ SWIGINTERN PyObject *_wrap_vectordevice___setslice____SWIG_1(PyObject *SWIGUNUSE int ecode3 = 0 ; int res4 = SWIG_OLDOBJ ; + (void)self; if ((nobjs < 4) || (nobjs > 4)) SWIG_fail; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice___setslice__" "', argument " "1"" of type '" "std::vector< device > *""'"); } @@ -6533,11 +6778,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___setslice____SWIG_1(PyObject *SWIGUNUSE { try { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - std_vector_Sl_device_Sg____setslice____SWIG_1(arg1,arg2,arg3,(std::vector< device,std::allocator< device > > const &)*arg4); - SWIG_PYTHON_THREAD_END_ALLOW; - } + std_vector_Sl_device_Sg____setslice____SWIG_1(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3),(std::vector< device,std::allocator< device > > const &)*arg4); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { @@ -6579,7 +6820,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___setslice__(PyObject *self, PyObject *a if (!(argc = SWIG_Python_UnpackTuple(args, "vectordevice___setslice__", 0, 4, argv))) SWIG_fail; --argc; if (argc == 3) { - int _v; + int _v = 0; int res = swig::asptr(argv[0], (std::vector< device,std::allocator< device > >**)(0)); _v = SWIG_CheckState(res); if (_v) { @@ -6599,7 +6840,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___setslice__(PyObject *self, PyObject *a } } if (argc == 4) { - int _v; + int _v = 0; int res = swig::asptr(argv[0], (std::vector< device,std::allocator< device > >**)(0)); _v = SWIG_CheckState(res); if (_v) { @@ -6632,7 +6873,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___setslice__(PyObject *self, PyObject *a } -SWIGINTERN PyObject *_wrap_vectordevice___delslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice___delslice__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device >::difference_type arg2 ; @@ -6645,8 +6886,9 @@ SWIGINTERN PyObject *_wrap_vectordevice___delslice__(PyObject *SWIGUNUSEDPARM(se int ecode3 = 0 ; PyObject *swig_obj[3] ; + (void)self; if (!SWIG_Python_UnpackTuple(args, "vectordevice___delslice__", 3, 3, swig_obj)) SWIG_fail; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice___delslice__" "', argument " "1"" of type '" "std::vector< device > *""'"); } @@ -6664,11 +6906,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___delslice__(PyObject *SWIGUNUSEDPARM(se { try { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - std_vector_Sl_device_Sg____delslice__(arg1,arg2,arg3); - SWIG_PYTHON_THREAD_END_ALLOW; - } + std_vector_Sl_device_Sg____delslice__(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { @@ -6699,7 +6937,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___delslice__(PyObject *SWIGUNUSEDPARM(se } -SWIGINTERN PyObject *_wrap_vectordevice___delitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_vectordevice___delitem____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device >::difference_type arg2 ; @@ -6708,8 +6946,9 @@ SWIGINTERN PyObject *_wrap_vectordevice___delitem____SWIG_0(PyObject *SWIGUNUSED ptrdiff_t val2 ; int ecode2 = 0 ; + (void)self; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice___delitem__" "', argument " "1"" of type '" "std::vector< device > *""'"); } @@ -6722,11 +6961,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___delitem____SWIG_0(PyObject *SWIGUNUSED { try { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - std_vector_Sl_device_Sg____delitem____SWIG_0(arg1,arg2); - SWIG_PYTHON_THREAD_END_ALLOW; - } + std_vector_Sl_device_Sg____delitem____SWIG_0(arg1,SWIG_STD_MOVE(arg2)); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { @@ -6757,7 +6992,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___delitem____SWIG_0(PyObject *SWIGUNUSED } -SWIGINTERN PyObject *_wrap_vectordevice___getitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_vectordevice___getitem____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; PySliceObject *arg2 = (PySliceObject *) 0 ; @@ -6765,8 +7000,9 @@ SWIGINTERN PyObject *_wrap_vectordevice___getitem____SWIG_0(PyObject *SWIGUNUSED int res1 = 0 ; std::vector< device,std::allocator< device > > *result = 0 ; + (void)self; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice___getitem__" "', argument " "1"" of type '" "std::vector< device > *""'"); } @@ -6780,11 +7016,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___getitem____SWIG_0(PyObject *SWIGUNUSED { try { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (std::vector< device,std::allocator< device > > *)std_vector_Sl_device_Sg____getitem____SWIG_0(arg1,arg2); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (std::vector< device,std::allocator< device > > *)std_vector_Sl_device_Sg____getitem____SWIG_0(arg1,arg2); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { @@ -6808,14 +7040,14 @@ SWIGINTERN PyObject *_wrap_vectordevice___getitem____SWIG_0(PyObject *SWIGUNUSED SWIG_exception(SWIG_RuntimeError, "Unknown exception"); } } - resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, SWIG_POINTER_OWN | 0 ); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_device_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } -SWIGINTERN PyObject *_wrap_vectordevice___setitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_vectordevice___setitem____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; PySliceObject *arg2 = (PySliceObject *) 0 ; @@ -6824,8 +7056,9 @@ SWIGINTERN PyObject *_wrap_vectordevice___setitem____SWIG_0(PyObject *SWIGUNUSED int res1 = 0 ; int res3 = SWIG_OLDOBJ ; + (void)self; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice___setitem__" "', argument " "1"" of type '" "std::vector< device > *""'"); } @@ -6850,11 +7083,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___setitem____SWIG_0(PyObject *SWIGUNUSED { try { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - std_vector_Sl_device_Sg____setitem____SWIG_0(arg1,arg2,(std::vector< device,std::allocator< device > > const &)*arg3); - SWIG_PYTHON_THREAD_END_ALLOW; - } + std_vector_Sl_device_Sg____setitem____SWIG_0(arg1,arg2,(std::vector< device,std::allocator< device > > const &)*arg3); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { @@ -6887,15 +7116,16 @@ SWIGINTERN PyObject *_wrap_vectordevice___setitem____SWIG_0(PyObject *SWIGUNUSED } -SWIGINTERN PyObject *_wrap_vectordevice___setitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_vectordevice___setitem____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; PySliceObject *arg2 = (PySliceObject *) 0 ; void *argp1 = 0 ; int res1 = 0 ; + (void)self; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice___setitem__" "', argument " "1"" of type '" "std::vector< device > *""'"); } @@ -6909,11 +7139,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___setitem____SWIG_1(PyObject *SWIGUNUSED { try { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - std_vector_Sl_device_Sg____setitem____SWIG_1(arg1,arg2); - SWIG_PYTHON_THREAD_END_ALLOW; - } + std_vector_Sl_device_Sg____setitem____SWIG_1(arg1,arg2); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { @@ -6944,15 +7170,16 @@ SWIGINTERN PyObject *_wrap_vectordevice___setitem____SWIG_1(PyObject *SWIGUNUSED } -SWIGINTERN PyObject *_wrap_vectordevice___delitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_vectordevice___delitem____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; PySliceObject *arg2 = (PySliceObject *) 0 ; void *argp1 = 0 ; int res1 = 0 ; + (void)self; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice___delitem__" "', argument " "1"" of type '" "std::vector< device > *""'"); } @@ -6966,11 +7193,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___delitem____SWIG_1(PyObject *SWIGUNUSED { try { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - std_vector_Sl_device_Sg____delitem____SWIG_1(arg1,arg2); - SWIG_PYTHON_THREAD_END_ALLOW; - } + std_vector_Sl_device_Sg____delitem____SWIG_1(arg1,arg2); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { @@ -7010,7 +7233,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___delitem__(PyObject *self, PyObject *ar if (!(argc = SWIG_Python_UnpackTuple(args, "vectordevice___delitem__", 0, 2, argv))) SWIG_fail; --argc; if (argc == 2) { - int _v; + int _v = 0; int res = swig::asptr(argv[0], (std::vector< device,std::allocator< device > >**)(0)); _v = SWIG_CheckState(res); if (_v) { @@ -7023,7 +7246,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___delitem__(PyObject *self, PyObject *ar } } if (argc == 2) { - int _v; + int _v = 0; int res = swig::asptr(argv[0], (std::vector< device,std::allocator< device > >**)(0)); _v = SWIG_CheckState(res); if (_v) { @@ -7046,7 +7269,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___delitem__(PyObject *self, PyObject *ar } -SWIGINTERN PyObject *_wrap_vectordevice___getitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_vectordevice___getitem____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device >::difference_type arg2 ; @@ -7056,8 +7279,9 @@ SWIGINTERN PyObject *_wrap_vectordevice___getitem____SWIG_1(PyObject *SWIGUNUSED int ecode2 = 0 ; std::vector< device >::value_type *result = 0 ; + (void)self; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice___getitem__" "', argument " "1"" of type '" "std::vector< device > const *""'"); } @@ -7070,11 +7294,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___getitem____SWIG_1(PyObject *SWIGUNUSED { try { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (std::vector< device >::value_type *) &std_vector_Sl_device_Sg____getitem____SWIG_1((std::vector< device > const *)arg1,arg2); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (std::vector< device >::value_type *) &std_vector_Sl_device_Sg____getitem____SWIG_1((std::vector< device > const *)arg1,SWIG_STD_MOVE(arg2)); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } @@ -7113,7 +7333,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___getitem__(PyObject *self, PyObject *ar if (!(argc = SWIG_Python_UnpackTuple(args, "vectordevice___getitem__", 0, 2, argv))) SWIG_fail; --argc; if (argc == 2) { - int _v; + int _v = 0; int res = swig::asptr(argv[0], (std::vector< device,std::allocator< device > >**)(0)); _v = SWIG_CheckState(res); if (_v) { @@ -7126,7 +7346,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___getitem__(PyObject *self, PyObject *ar } } if (argc == 2) { - int _v; + int _v = 0; int res = swig::asptr(argv[0], (std::vector< device,std::allocator< device > >**)(0)); _v = SWIG_CheckState(res); if (_v) { @@ -7149,7 +7369,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___getitem__(PyObject *self, PyObject *ar } -SWIGINTERN PyObject *_wrap_vectordevice___setitem____SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_vectordevice___setitem____SWIG_2(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device >::difference_type arg2 ; @@ -7161,8 +7381,9 @@ SWIGINTERN PyObject *_wrap_vectordevice___setitem____SWIG_2(PyObject *SWIGUNUSED void *argp3 = 0 ; int res3 = 0 ; + (void)self; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice___setitem__" "', argument " "1"" of type '" "std::vector< device > *""'"); } @@ -7183,11 +7404,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___setitem____SWIG_2(PyObject *SWIGUNUSED { try { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - std_vector_Sl_device_Sg____setitem____SWIG_2(arg1,arg2,(device const &)*arg3); - SWIG_PYTHON_THREAD_END_ALLOW; - } + std_vector_Sl_device_Sg____setitem____SWIG_2(arg1,SWIG_STD_MOVE(arg2),(device const &)*arg3); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } @@ -7225,7 +7442,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___setitem__(PyObject *self, PyObject *ar if (!(argc = SWIG_Python_UnpackTuple(args, "vectordevice___setitem__", 0, 3, argv))) SWIG_fail; --argc; if (argc == 2) { - int _v; + int _v = 0; int res = swig::asptr(argv[0], (std::vector< device,std::allocator< device > >**)(0)); _v = SWIG_CheckState(res); if (_v) { @@ -7238,7 +7455,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___setitem__(PyObject *self, PyObject *ar } } if (argc == 3) { - int _v; + int _v = 0; int res = swig::asptr(argv[0], (std::vector< device,std::allocator< device > >**)(0)); _v = SWIG_CheckState(res); if (_v) { @@ -7255,7 +7472,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___setitem__(PyObject *self, PyObject *ar } } if (argc == 3) { - int _v; + int _v = 0; int res = swig::asptr(argv[0], (std::vector< device,std::allocator< device > >**)(0)); _v = SWIG_CheckState(res); if (_v) { @@ -7283,7 +7500,7 @@ SWIGINTERN PyObject *_wrap_vectordevice___setitem__(PyObject *self, PyObject *ar } -SWIGINTERN PyObject *_wrap_vectordevice_pop(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_pop(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; void *argp1 = 0 ; @@ -7291,9 +7508,10 @@ SWIGINTERN PyObject *_wrap_vectordevice_pop(PyObject *SWIGUNUSEDPARM(self), PyOb PyObject *swig_obj[1] ; std::vector< device >::value_type result; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice_pop" "', argument " "1"" of type '" "std::vector< device > *""'"); } @@ -7301,11 +7519,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_pop(PyObject *SWIGUNUSEDPARM(self), PyOb { try { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = std_vector_Sl_device_Sg__pop(arg1); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = std_vector_Sl_device_Sg__pop(arg1); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } @@ -7327,14 +7541,14 @@ SWIGINTERN PyObject *_wrap_vectordevice_pop(PyObject *SWIGUNUSEDPARM(self), PyOb SWIG_exception(SWIG_RuntimeError, "Unknown exception"); } } - resultobj = SWIG_NewPointerObj((new std::vector< device >::value_type(static_cast< const std::vector< device >::value_type& >(result))), SWIGTYPE_p_device, SWIG_POINTER_OWN | 0 ); + resultobj = SWIG_NewPointerObj((new std::vector< device >::value_type(result)), SWIGTYPE_p_device, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } -SWIGINTERN PyObject *_wrap_vectordevice_append(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_append(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device >::value_type *arg2 = 0 ; @@ -7344,8 +7558,9 @@ SWIGINTERN PyObject *_wrap_vectordevice_append(PyObject *SWIGUNUSEDPARM(self), P int res2 = 0 ; PyObject *swig_obj[2] ; + (void)self; if (!SWIG_Python_UnpackTuple(args, "vectordevice_append", 2, 2, swig_obj)) SWIG_fail; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice_append" "', argument " "1"" of type '" "std::vector< device > *""'"); } @@ -7360,11 +7575,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_append(PyObject *SWIGUNUSEDPARM(self), P arg2 = reinterpret_cast< std::vector< device >::value_type * >(argp2); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - std_vector_Sl_device_Sg__append(arg1,(device const &)*arg2); - SWIG_PYTHON_THREAD_END_ALLOW; - } + std_vector_Sl_device_Sg__append(arg1,(device const &)*arg2); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -7390,18 +7601,15 @@ SWIGINTERN PyObject *_wrap_vectordevice_append(PyObject *SWIGUNUSEDPARM(self), P } -SWIGINTERN PyObject *_wrap_new_vectordevice__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) { +SWIGINTERN PyObject *_wrap_new_vectordevice__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) { PyObject *resultobj = 0; std::vector< device > *result = 0 ; + (void)self; if ((nobjs < 0) || (nobjs > 0)) SWIG_fail; { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (std::vector< device > *)new std::vector< device >(); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (std::vector< device > *)new std::vector< device >(); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -7420,19 +7628,20 @@ SWIGINTERN PyObject *_wrap_new_vectordevice__SWIG_0(PyObject *SWIGUNUSEDPARM(sel SWIG_exception(SWIG_RuntimeError, "Unknown exception"); } } - resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, SWIG_POINTER_NEW | 0 ); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_device_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } -SWIGINTERN PyObject *_wrap_new_vectordevice__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_new_vectordevice__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device > *arg1 = 0 ; int res1 = SWIG_OLDOBJ ; std::vector< device > *result = 0 ; + (void)self; if ((nobjs < 1) || (nobjs > 1)) SWIG_fail; { std::vector< device,std::allocator< device > > *ptr = (std::vector< device,std::allocator< device > > *)0; @@ -7447,11 +7656,7 @@ SWIGINTERN PyObject *_wrap_new_vectordevice__SWIG_1(PyObject *SWIGUNUSEDPARM(sel } { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (std::vector< device > *)new std::vector< device >((std::vector< device > const &)*arg1); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (std::vector< device > *)new std::vector< device >((std::vector< device > const &)*arg1); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -7470,7 +7675,7 @@ SWIGINTERN PyObject *_wrap_new_vectordevice__SWIG_1(PyObject *SWIGUNUSEDPARM(sel SWIG_exception(SWIG_RuntimeError, "Unknown exception"); } } - resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, SWIG_POINTER_NEW | 0 ); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_device_t, SWIG_POINTER_NEW | 0 ); if (SWIG_IsNewObj(res1)) delete arg1; return resultobj; fail: @@ -7479,7 +7684,7 @@ SWIGINTERN PyObject *_wrap_new_vectordevice__SWIG_1(PyObject *SWIGUNUSEDPARM(sel } -SWIGINTERN PyObject *_wrap_vectordevice_empty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_empty(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; void *argp1 = 0 ; @@ -7487,20 +7692,17 @@ SWIGINTERN PyObject *_wrap_vectordevice_empty(PyObject *SWIGUNUSEDPARM(self), Py PyObject *swig_obj[1] ; bool result; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice_empty" "', argument " "1"" of type '" "std::vector< device > const *""'"); } arg1 = reinterpret_cast< std::vector< device > * >(argp1); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (bool)((std::vector< device > const *)arg1)->empty(); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (bool)((std::vector< device > const *)arg1)->empty(); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -7526,7 +7728,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_empty(PyObject *SWIGUNUSEDPARM(self), Py } -SWIGINTERN PyObject *_wrap_vectordevice_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_size(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; void *argp1 = 0 ; @@ -7534,20 +7736,17 @@ SWIGINTERN PyObject *_wrap_vectordevice_size(PyObject *SWIGUNUSEDPARM(self), PyO PyObject *swig_obj[1] ; std::vector< device >::size_type result; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice_size" "', argument " "1"" of type '" "std::vector< device > const *""'"); } arg1 = reinterpret_cast< std::vector< device > * >(argp1); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = ((std::vector< device > const *)arg1)->size(); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = ((std::vector< device > const *)arg1)->size(); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -7573,7 +7772,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_size(PyObject *SWIGUNUSEDPARM(self), PyO } -SWIGINTERN PyObject *_wrap_vectordevice_swap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_swap(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device > *arg2 = 0 ; @@ -7583,13 +7782,14 @@ SWIGINTERN PyObject *_wrap_vectordevice_swap(PyObject *SWIGUNUSEDPARM(self), PyO int res2 = 0 ; PyObject *swig_obj[2] ; + (void)self; if (!SWIG_Python_UnpackTuple(args, "vectordevice_swap", 2, 2, swig_obj)) SWIG_fail; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice_swap" "', argument " "1"" of type '" "std::vector< device > *""'"); } arg1 = reinterpret_cast< std::vector< device > * >(argp1); - res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 ); + res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_std__vectorT_device_t, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "vectordevice_swap" "', argument " "2"" of type '" "std::vector< device > &""'"); } @@ -7599,11 +7799,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_swap(PyObject *SWIGUNUSEDPARM(self), PyO arg2 = reinterpret_cast< std::vector< device > * >(argp2); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - (arg1)->swap(*arg2); - SWIG_PYTHON_THREAD_END_ALLOW; - } + (arg1)->swap(*arg2); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -7629,7 +7825,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_swap(PyObject *SWIGUNUSEDPARM(self), PyO } -SWIGINTERN PyObject *_wrap_vectordevice_begin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_begin(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; void *argp1 = 0 ; @@ -7637,20 +7833,17 @@ SWIGINTERN PyObject *_wrap_vectordevice_begin(PyObject *SWIGUNUSEDPARM(self), Py PyObject *swig_obj[1] ; std::vector< device >::iterator result; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice_begin" "', argument " "1"" of type '" "std::vector< device > *""'"); } arg1 = reinterpret_cast< std::vector< device > * >(argp1); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (arg1)->begin(); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (arg1)->begin(); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -7677,7 +7870,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_begin(PyObject *SWIGUNUSEDPARM(self), Py } -SWIGINTERN PyObject *_wrap_vectordevice_end(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_end(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; void *argp1 = 0 ; @@ -7685,20 +7878,17 @@ SWIGINTERN PyObject *_wrap_vectordevice_end(PyObject *SWIGUNUSEDPARM(self), PyOb PyObject *swig_obj[1] ; std::vector< device >::iterator result; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice_end" "', argument " "1"" of type '" "std::vector< device > *""'"); } arg1 = reinterpret_cast< std::vector< device > * >(argp1); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (arg1)->end(); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (arg1)->end(); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -7725,7 +7915,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_end(PyObject *SWIGUNUSEDPARM(self), PyOb } -SWIGINTERN PyObject *_wrap_vectordevice_rbegin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_rbegin(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; void *argp1 = 0 ; @@ -7733,20 +7923,17 @@ SWIGINTERN PyObject *_wrap_vectordevice_rbegin(PyObject *SWIGUNUSEDPARM(self), P PyObject *swig_obj[1] ; std::vector< device >::reverse_iterator result; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice_rbegin" "', argument " "1"" of type '" "std::vector< device > *""'"); } arg1 = reinterpret_cast< std::vector< device > * >(argp1); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (arg1)->rbegin(); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (arg1)->rbegin(); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -7773,7 +7960,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_rbegin(PyObject *SWIGUNUSEDPARM(self), P } -SWIGINTERN PyObject *_wrap_vectordevice_rend(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_rend(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; void *argp1 = 0 ; @@ -7781,20 +7968,17 @@ SWIGINTERN PyObject *_wrap_vectordevice_rend(PyObject *SWIGUNUSEDPARM(self), PyO PyObject *swig_obj[1] ; std::vector< device >::reverse_iterator result; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice_rend" "', argument " "1"" of type '" "std::vector< device > *""'"); } arg1 = reinterpret_cast< std::vector< device > * >(argp1); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (arg1)->rend(); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (arg1)->rend(); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -7821,27 +8005,24 @@ SWIGINTERN PyObject *_wrap_vectordevice_rend(PyObject *SWIGUNUSEDPARM(self), PyO } -SWIGINTERN PyObject *_wrap_vectordevice_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_clear(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice_clear" "', argument " "1"" of type '" "std::vector< device > *""'"); } arg1 = reinterpret_cast< std::vector< device > * >(argp1); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - (arg1)->clear(); - SWIG_PYTHON_THREAD_END_ALLOW; - } + (arg1)->clear(); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -7867,7 +8048,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_clear(PyObject *SWIGUNUSEDPARM(self), Py } -SWIGINTERN PyObject *_wrap_vectordevice_get_allocator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_get_allocator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; void *argp1 = 0 ; @@ -7875,20 +8056,17 @@ SWIGINTERN PyObject *_wrap_vectordevice_get_allocator(PyObject *SWIGUNUSEDPARM(s PyObject *swig_obj[1] ; SwigValueWrapper< std::allocator< device > > result; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice_get_allocator" "', argument " "1"" of type '" "std::vector< device > const *""'"); } arg1 = reinterpret_cast< std::vector< device > * >(argp1); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = ((std::vector< device > const *)arg1)->get_allocator(); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = ((std::vector< device > const *)arg1)->get_allocator(); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -7907,20 +8085,21 @@ SWIGINTERN PyObject *_wrap_vectordevice_get_allocator(PyObject *SWIGUNUSEDPARM(s SWIG_exception(SWIG_RuntimeError, "Unknown exception"); } } - resultobj = SWIG_NewPointerObj((new std::vector< device >::allocator_type(static_cast< const std::vector< device >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_device_t, SWIG_POINTER_OWN | 0 ); + resultobj = SWIG_NewPointerObj((new std::vector< device >::allocator_type(result)), SWIGTYPE_p_std__allocatorT_device_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } -SWIGINTERN PyObject *_wrap_new_vectordevice__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_new_vectordevice__SWIG_2(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device >::size_type arg1 ; size_t val1 ; int ecode1 = 0 ; std::vector< device > *result = 0 ; + (void)self; if ((nobjs < 1) || (nobjs > 1)) SWIG_fail; ecode1 = SWIG_AsVal_size_t(swig_obj[0], &val1); if (!SWIG_IsOK(ecode1)) { @@ -7929,11 +8108,7 @@ SWIGINTERN PyObject *_wrap_new_vectordevice__SWIG_2(PyObject *SWIGUNUSEDPARM(sel arg1 = static_cast< std::vector< device >::size_type >(val1); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (std::vector< device > *)new std::vector< device >(arg1); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (std::vector< device > *)new std::vector< device >(arg1); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -7952,34 +8127,31 @@ SWIGINTERN PyObject *_wrap_new_vectordevice__SWIG_2(PyObject *SWIGUNUSEDPARM(sel SWIG_exception(SWIG_RuntimeError, "Unknown exception"); } } - resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, SWIG_POINTER_NEW | 0 ); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_device_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } -SWIGINTERN PyObject *_wrap_vectordevice_pop_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_pop_back(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice_pop_back" "', argument " "1"" of type '" "std::vector< device > *""'"); } arg1 = reinterpret_cast< std::vector< device > * >(argp1); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - (arg1)->pop_back(); - SWIG_PYTHON_THREAD_END_ALLOW; - } + (arg1)->pop_back(); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -8005,7 +8177,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_pop_back(PyObject *SWIGUNUSEDPARM(self), } -SWIGINTERN PyObject *_wrap_vectordevice_resize__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_vectordevice_resize__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device >::size_type arg2 ; @@ -8014,8 +8186,9 @@ SWIGINTERN PyObject *_wrap_vectordevice_resize__SWIG_0(PyObject *SWIGUNUSEDPARM( size_t val2 ; int ecode2 = 0 ; + (void)self; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice_resize" "', argument " "1"" of type '" "std::vector< device > *""'"); } @@ -8027,11 +8200,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_resize__SWIG_0(PyObject *SWIGUNUSEDPARM( arg2 = static_cast< std::vector< device >::size_type >(val2); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - (arg1)->resize(arg2); - SWIG_PYTHON_THREAD_END_ALLOW; - } + (arg1)->resize(arg2); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -8057,7 +8226,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_resize__SWIG_0(PyObject *SWIGUNUSEDPARM( } -SWIGINTERN PyObject *_wrap_vectordevice_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_vectordevice_erase__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device >::iterator arg2 ; @@ -8067,8 +8236,9 @@ SWIGINTERN PyObject *_wrap_vectordevice_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(s int res2 ; std::vector< device >::iterator result; + (void)self; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice_erase" "', argument " "1"" of type '" "std::vector< device > *""'"); } @@ -8086,11 +8256,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(s } { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = std_vector_Sl_device_Sg__erase__SWIG_0(arg1,arg2); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = std_vector_Sl_device_Sg__erase__SWIG_0(arg1,SWIG_STD_MOVE(arg2)); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -8117,7 +8283,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(s } -SWIGINTERN PyObject *_wrap_vectordevice_erase__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_vectordevice_erase__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device >::iterator arg2 ; @@ -8130,8 +8296,9 @@ SWIGINTERN PyObject *_wrap_vectordevice_erase__SWIG_1(PyObject *SWIGUNUSEDPARM(s int res3 ; std::vector< device >::iterator result; + (void)self; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice_erase" "', argument " "1"" of type '" "std::vector< device > *""'"); } @@ -8160,11 +8327,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_erase__SWIG_1(PyObject *SWIGUNUSEDPARM(s } { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = std_vector_Sl_device_Sg__erase__SWIG_1(arg1,arg2,arg3); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = std_vector_Sl_device_Sg__erase__SWIG_1(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -8200,7 +8363,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_erase(PyObject *self, PyObject *args) { if (!(argc = SWIG_Python_UnpackTuple(args, "vectordevice_erase", 0, 3, argv))) SWIG_fail; --argc; if (argc == 2) { - int _v; + int _v = 0; int res = swig::asptr(argv[0], (std::vector< device,std::allocator< device > >**)(0)); _v = SWIG_CheckState(res); if (_v) { @@ -8213,7 +8376,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_erase(PyObject *self, PyObject *args) { } } if (argc == 3) { - int _v; + int _v = 0; int res = swig::asptr(argv[0], (std::vector< device,std::allocator< device > >**)(0)); _v = SWIG_CheckState(res); if (_v) { @@ -8240,7 +8403,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_erase(PyObject *self, PyObject *args) { } -SWIGINTERN PyObject *_wrap_new_vectordevice__SWIG_3(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_new_vectordevice__SWIG_3(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device >::size_type arg1 ; std::vector< device >::value_type *arg2 = 0 ; @@ -8250,6 +8413,7 @@ SWIGINTERN PyObject *_wrap_new_vectordevice__SWIG_3(PyObject *SWIGUNUSEDPARM(sel int res2 = 0 ; std::vector< device > *result = 0 ; + (void)self; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; ecode1 = SWIG_AsVal_size_t(swig_obj[0], &val1); if (!SWIG_IsOK(ecode1)) { @@ -8266,11 +8430,7 @@ SWIGINTERN PyObject *_wrap_new_vectordevice__SWIG_3(PyObject *SWIGUNUSEDPARM(sel arg2 = reinterpret_cast< std::vector< device >::value_type * >(argp2); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (std::vector< device > *)new std::vector< device >(arg1,(std::vector< device >::value_type const &)*arg2); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (std::vector< device > *)new std::vector< device >(arg1,(std::vector< device >::value_type const &)*arg2); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -8289,7 +8449,7 @@ SWIGINTERN PyObject *_wrap_new_vectordevice__SWIG_3(PyObject *SWIGUNUSEDPARM(sel SWIG_exception(SWIG_RuntimeError, "Unknown exception"); } } - resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, SWIG_POINTER_NEW | 0 ); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_device_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; @@ -8308,7 +8468,7 @@ SWIGINTERN PyObject *_wrap_new_vectordevice(PyObject *self, PyObject *args) { return _wrap_new_vectordevice__SWIG_0(self, argc, argv); } if (argc == 1) { - int _v; + int _v = 0; { int res = SWIG_AsVal_size_t(argv[0], NULL); _v = SWIG_CheckState(res); @@ -8318,7 +8478,7 @@ SWIGINTERN PyObject *_wrap_new_vectordevice(PyObject *self, PyObject *args) { } } if (argc == 1) { - int _v; + int _v = 0; int res = swig::asptr(argv[0], (std::vector< device,std::allocator< device > >**)(0)); _v = SWIG_CheckState(res); if (_v) { @@ -8326,7 +8486,7 @@ SWIGINTERN PyObject *_wrap_new_vectordevice(PyObject *self, PyObject *args) { } } if (argc == 2) { - int _v; + int _v = 0; { int res = SWIG_AsVal_size_t(argv[0], NULL); _v = SWIG_CheckState(res); @@ -8351,7 +8511,7 @@ SWIGINTERN PyObject *_wrap_new_vectordevice(PyObject *self, PyObject *args) { } -SWIGINTERN PyObject *_wrap_vectordevice_push_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_push_back(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device >::value_type *arg2 = 0 ; @@ -8361,8 +8521,9 @@ SWIGINTERN PyObject *_wrap_vectordevice_push_back(PyObject *SWIGUNUSEDPARM(self) int res2 = 0 ; PyObject *swig_obj[2] ; + (void)self; if (!SWIG_Python_UnpackTuple(args, "vectordevice_push_back", 2, 2, swig_obj)) SWIG_fail; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice_push_back" "', argument " "1"" of type '" "std::vector< device > *""'"); } @@ -8377,11 +8538,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_push_back(PyObject *SWIGUNUSEDPARM(self) arg2 = reinterpret_cast< std::vector< device >::value_type * >(argp2); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - (arg1)->push_back((std::vector< device >::value_type const &)*arg2); - SWIG_PYTHON_THREAD_END_ALLOW; - } + (arg1)->push_back((std::vector< device >::value_type const &)*arg2); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -8407,7 +8564,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_push_back(PyObject *SWIGUNUSEDPARM(self) } -SWIGINTERN PyObject *_wrap_vectordevice_front(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_front(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; void *argp1 = 0 ; @@ -8415,20 +8572,17 @@ SWIGINTERN PyObject *_wrap_vectordevice_front(PyObject *SWIGUNUSEDPARM(self), Py PyObject *swig_obj[1] ; std::vector< device >::value_type *result = 0 ; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice_front" "', argument " "1"" of type '" "std::vector< device > const *""'"); } arg1 = reinterpret_cast< std::vector< device > * >(argp1); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (std::vector< device >::value_type *) &((std::vector< device > const *)arg1)->front(); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (std::vector< device >::value_type *) &((std::vector< device > const *)arg1)->front(); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -8455,7 +8609,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_front(PyObject *SWIGUNUSEDPARM(self), Py } -SWIGINTERN PyObject *_wrap_vectordevice_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_back(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; void *argp1 = 0 ; @@ -8463,20 +8617,17 @@ SWIGINTERN PyObject *_wrap_vectordevice_back(PyObject *SWIGUNUSEDPARM(self), PyO PyObject *swig_obj[1] ; std::vector< device >::value_type *result = 0 ; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice_back" "', argument " "1"" of type '" "std::vector< device > const *""'"); } arg1 = reinterpret_cast< std::vector< device > * >(argp1); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (std::vector< device >::value_type *) &((std::vector< device > const *)arg1)->back(); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (std::vector< device >::value_type *) &((std::vector< device > const *)arg1)->back(); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -8503,7 +8654,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_back(PyObject *SWIGUNUSEDPARM(self), PyO } -SWIGINTERN PyObject *_wrap_vectordevice_assign(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_assign(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device >::size_type arg2 ; @@ -8516,8 +8667,9 @@ SWIGINTERN PyObject *_wrap_vectordevice_assign(PyObject *SWIGUNUSEDPARM(self), P int res3 = 0 ; PyObject *swig_obj[3] ; + (void)self; if (!SWIG_Python_UnpackTuple(args, "vectordevice_assign", 3, 3, swig_obj)) SWIG_fail; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice_assign" "', argument " "1"" of type '" "std::vector< device > *""'"); } @@ -8537,11 +8689,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_assign(PyObject *SWIGUNUSEDPARM(self), P arg3 = reinterpret_cast< std::vector< device >::value_type * >(argp3); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - (arg1)->assign(arg2,(std::vector< device >::value_type const &)*arg3); - SWIG_PYTHON_THREAD_END_ALLOW; - } + (arg1)->assign(arg2,(std::vector< device >::value_type const &)*arg3); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -8567,7 +8715,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_assign(PyObject *SWIGUNUSEDPARM(self), P } -SWIGINTERN PyObject *_wrap_vectordevice_resize__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_vectordevice_resize__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device >::size_type arg2 ; @@ -8579,8 +8727,9 @@ SWIGINTERN PyObject *_wrap_vectordevice_resize__SWIG_1(PyObject *SWIGUNUSEDPARM( void *argp3 = 0 ; int res3 = 0 ; + (void)self; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice_resize" "', argument " "1"" of type '" "std::vector< device > *""'"); } @@ -8600,11 +8749,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_resize__SWIG_1(PyObject *SWIGUNUSEDPARM( arg3 = reinterpret_cast< std::vector< device >::value_type * >(argp3); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - (arg1)->resize(arg2,(std::vector< device >::value_type const &)*arg3); - SWIG_PYTHON_THREAD_END_ALLOW; - } + (arg1)->resize(arg2,(std::vector< device >::value_type const &)*arg3); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -8639,7 +8784,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_resize(PyObject *self, PyObject *args) { if (!(argc = SWIG_Python_UnpackTuple(args, "vectordevice_resize", 0, 3, argv))) SWIG_fail; --argc; if (argc == 2) { - int _v; + int _v = 0; int res = swig::asptr(argv[0], (std::vector< device,std::allocator< device > >**)(0)); _v = SWIG_CheckState(res); if (_v) { @@ -8653,7 +8798,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_resize(PyObject *self, PyObject *args) { } } if (argc == 3) { - int _v; + int _v = 0; int res = swig::asptr(argv[0], (std::vector< device,std::allocator< device > >**)(0)); _v = SWIG_CheckState(res); if (_v) { @@ -8680,7 +8825,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_resize(PyObject *self, PyObject *args) { } -SWIGINTERN PyObject *_wrap_vectordevice_insert__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_vectordevice_insert__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device >::iterator arg2 ; @@ -8693,8 +8838,9 @@ SWIGINTERN PyObject *_wrap_vectordevice_insert__SWIG_0(PyObject *SWIGUNUSEDPARM( int res3 = 0 ; std::vector< device >::iterator result; + (void)self; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice_insert" "', argument " "1"" of type '" "std::vector< device > *""'"); } @@ -8720,11 +8866,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_insert__SWIG_0(PyObject *SWIGUNUSEDPARM( arg3 = reinterpret_cast< std::vector< device >::value_type * >(argp3); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = std_vector_Sl_device_Sg__insert__SWIG_0(arg1,arg2,(device const &)*arg3); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = std_vector_Sl_device_Sg__insert__SWIG_0(arg1,SWIG_STD_MOVE(arg2),(device const &)*arg3); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -8751,7 +8893,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_insert__SWIG_0(PyObject *SWIGUNUSEDPARM( } -SWIGINTERN PyObject *_wrap_vectordevice_insert__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_vectordevice_insert__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device >::iterator arg2 ; @@ -8766,8 +8908,9 @@ SWIGINTERN PyObject *_wrap_vectordevice_insert__SWIG_1(PyObject *SWIGUNUSEDPARM( void *argp4 = 0 ; int res4 = 0 ; + (void)self; if ((nobjs < 4) || (nobjs > 4)) SWIG_fail; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice_insert" "', argument " "1"" of type '" "std::vector< device > *""'"); } @@ -8798,11 +8941,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_insert__SWIG_1(PyObject *SWIGUNUSEDPARM( arg4 = reinterpret_cast< std::vector< device >::value_type * >(argp4); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - std_vector_Sl_device_Sg__insert__SWIG_1(arg1,arg2,arg3,(device const &)*arg4); - SWIG_PYTHON_THREAD_END_ALLOW; - } + std_vector_Sl_device_Sg__insert__SWIG_1(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3),(device const &)*arg4); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -8837,7 +8976,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_insert(PyObject *self, PyObject *args) { if (!(argc = SWIG_Python_UnpackTuple(args, "vectordevice_insert", 0, 4, argv))) SWIG_fail; --argc; if (argc == 3) { - int _v; + int _v = 0; int res = swig::asptr(argv[0], (std::vector< device,std::allocator< device > >**)(0)); _v = SWIG_CheckState(res); if (_v) { @@ -8854,7 +8993,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_insert(PyObject *self, PyObject *args) { } } if (argc == 4) { - int _v; + int _v = 0; int res = swig::asptr(argv[0], (std::vector< device,std::allocator< device > >**)(0)); _v = SWIG_CheckState(res); if (_v) { @@ -8886,7 +9025,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_insert(PyObject *self, PyObject *args) { } -SWIGINTERN PyObject *_wrap_vectordevice_reserve(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_reserve(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; std::vector< device >::size_type arg2 ; @@ -8896,8 +9035,9 @@ SWIGINTERN PyObject *_wrap_vectordevice_reserve(PyObject *SWIGUNUSEDPARM(self), int ecode2 = 0 ; PyObject *swig_obj[2] ; + (void)self; if (!SWIG_Python_UnpackTuple(args, "vectordevice_reserve", 2, 2, swig_obj)) SWIG_fail; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice_reserve" "', argument " "1"" of type '" "std::vector< device > *""'"); } @@ -8909,11 +9049,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_reserve(PyObject *SWIGUNUSEDPARM(self), arg2 = static_cast< std::vector< device >::size_type >(val2); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - (arg1)->reserve(arg2); - SWIG_PYTHON_THREAD_END_ALLOW; - } + (arg1)->reserve(arg2); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -8939,7 +9075,7 @@ SWIGINTERN PyObject *_wrap_vectordevice_reserve(PyObject *SWIGUNUSEDPARM(self), } -SWIGINTERN PyObject *_wrap_vectordevice_capacity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_vectordevice_capacity(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; void *argp1 = 0 ; @@ -8947,20 +9083,17 @@ SWIGINTERN PyObject *_wrap_vectordevice_capacity(PyObject *SWIGUNUSEDPARM(self), PyObject *swig_obj[1] ; std::vector< device >::size_type result; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vectordevice_capacity" "', argument " "1"" of type '" "std::vector< device > const *""'"); } arg1 = reinterpret_cast< std::vector< device > * >(argp1); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = ((std::vector< device > const *)arg1)->capacity(); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = ((std::vector< device > const *)arg1)->capacity(); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -8986,27 +9119,24 @@ SWIGINTERN PyObject *_wrap_vectordevice_capacity(PyObject *SWIGUNUSEDPARM(self), } -SWIGINTERN PyObject *_wrap_delete_vectordevice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_delete_vectordevice(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< device > *arg1 = (std::vector< device > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, SWIG_POINTER_DISOWN | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_device_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_vectordevice" "', argument " "1"" of type '" "std::vector< device > *""'"); } arg1 = reinterpret_cast< std::vector< device > * >(argp1); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - delete arg1; - SWIG_PYTHON_THREAD_END_ALLOW; - } + delete arg1; } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -9035,7 +9165,7 @@ SWIGINTERN PyObject *_wrap_delete_vectordevice(PyObject *SWIGUNUSEDPARM(self), P SWIGINTERN PyObject *vectordevice_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL; - SWIG_TypeNewClientData(SWIGTYPE_p_std__vectorT_device_std__allocatorT_device_t_t, SWIG_NewClientData(obj)); + SWIG_TypeNewClientData(SWIGTYPE_p_std__vectorT_device_t, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } @@ -9043,12 +9173,13 @@ SWIGINTERN PyObject *vectordevice_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObj return SWIG_Python_InitShadowInstance(args); } -SWIGINTERN PyObject *_wrap_new_ExploreException(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_new_ExploreException(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::string arg1 ; PyObject *swig_obj[1] ; ExploreException *result = 0 ; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; { @@ -9062,11 +9193,7 @@ SWIGINTERN PyObject *_wrap_new_ExploreException(PyObject *SWIGUNUSEDPARM(self), } { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (ExploreException *)new ExploreException(arg1); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (ExploreException *)new ExploreException(arg1); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -9092,7 +9219,7 @@ SWIGINTERN PyObject *_wrap_new_ExploreException(PyObject *SWIGUNUSEDPARM(self), } -SWIGINTERN PyObject *_wrap_ExploreException_what(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_ExploreException_what(PyObject *self, PyObject *args) { PyObject *resultobj = 0; ExploreException *arg1 = (ExploreException *) 0 ; void *argp1 = 0 ; @@ -9100,6 +9227,7 @@ SWIGINTERN PyObject *_wrap_ExploreException_what(PyObject *SWIGUNUSEDPARM(self), PyObject *swig_obj[1] ; char *result = 0 ; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ExploreException, 0 | 0 ); @@ -9109,11 +9237,7 @@ SWIGINTERN PyObject *_wrap_ExploreException_what(PyObject *SWIGUNUSEDPARM(self), arg1 = reinterpret_cast< ExploreException * >(argp1); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (char *)((ExploreException const *)arg1)->what(); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (char *)((ExploreException const *)arg1)->what(); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -9139,13 +9263,14 @@ SWIGINTERN PyObject *_wrap_ExploreException_what(PyObject *SWIGUNUSEDPARM(self), } -SWIGINTERN PyObject *_wrap_delete_ExploreException(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_delete_ExploreException(PyObject *self, PyObject *args) { PyObject *resultobj = 0; ExploreException *arg1 = (ExploreException *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ExploreException, SWIG_POINTER_DISOWN | 0 ); @@ -9155,11 +9280,7 @@ SWIGINTERN PyObject *_wrap_delete_ExploreException(PyObject *SWIGUNUSEDPARM(self arg1 = reinterpret_cast< ExploreException * >(argp1); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - delete arg1; - SWIG_PYTHON_THREAD_END_ALLOW; - } + delete arg1; } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -9196,12 +9317,13 @@ SWIGINTERN PyObject *ExploreException_swiginit(PyObject *SWIGUNUSEDPARM(self), P return SWIG_Python_InitShadowInstance(args); } -SWIGINTERN PyObject *_wrap_new_ExploreReadBufferException(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_new_ExploreReadBufferException(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::string arg1 ; PyObject *swig_obj[1] ; ExploreReadBufferException *result = 0 ; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; { @@ -9215,11 +9337,7 @@ SWIGINTERN PyObject *_wrap_new_ExploreReadBufferException(PyObject *SWIGUNUSEDPA } { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (ExploreReadBufferException *)new ExploreReadBufferException(arg1); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (ExploreReadBufferException *)new ExploreReadBufferException(arg1); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -9245,7 +9363,7 @@ SWIGINTERN PyObject *_wrap_new_ExploreReadBufferException(PyObject *SWIGUNUSEDPA } -SWIGINTERN PyObject *_wrap_ExploreReadBufferException_what(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_ExploreReadBufferException_what(PyObject *self, PyObject *args) { PyObject *resultobj = 0; ExploreReadBufferException *arg1 = (ExploreReadBufferException *) 0 ; void *argp1 = 0 ; @@ -9253,20 +9371,161 @@ SWIGINTERN PyObject *_wrap_ExploreReadBufferException_what(PyObject *SWIGUNUSEDP PyObject *swig_obj[1] ; char *result = 0 ; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ExploreReadBufferException, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ExploreReadBufferException_what" "', argument " "1"" of type '" "ExploreReadBufferException const *""'"); } - arg1 = reinterpret_cast< ExploreReadBufferException * >(argp1); + arg1 = reinterpret_cast< ExploreReadBufferException * >(argp1); + { + try { + result = (char *)((ExploreReadBufferException const *)arg1)->what(); + } catch(const ExploreException& e) { + SWIG_exception(SWIG_ValueError, e.what()); + } + catch(const ExploreReadBufferException& e) { + SWIG_exception(SWIG_MemoryError, e.what()); + } + catch(const ExploreIOException& e) { + SWIG_exception(SWIG_IOError, e.what()); + } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } + catch(const std::exception& e) { + SWIG_exception(SWIG_UnknownError, "Standard exception"); + } catch(...) { + SWIG_exception(SWIG_RuntimeError, "Unknown exception"); + } + } + resultobj = SWIG_FromCharPtr((const char *)result); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_delete_ExploreReadBufferException(PyObject *self, PyObject *args) { + PyObject *resultobj = 0; + ExploreReadBufferException *arg1 = (ExploreReadBufferException *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject *swig_obj[1] ; + + (void)self; + if (!args) SWIG_fail; + swig_obj[0] = args; + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ExploreReadBufferException, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ExploreReadBufferException" "', argument " "1"" of type '" "ExploreReadBufferException *""'"); + } + arg1 = reinterpret_cast< ExploreReadBufferException * >(argp1); + { + try { + delete arg1; + } catch(const ExploreException& e) { + SWIG_exception(SWIG_ValueError, e.what()); + } + catch(const ExploreReadBufferException& e) { + SWIG_exception(SWIG_MemoryError, e.what()); + } + catch(const ExploreIOException& e) { + SWIG_exception(SWIG_IOError, e.what()); + } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } + catch(const std::exception& e) { + SWIG_exception(SWIG_UnknownError, "Standard exception"); + } catch(...) { + SWIG_exception(SWIG_RuntimeError, "Unknown exception"); + } + } + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *ExploreReadBufferException_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_ExploreReadBufferException, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *ExploreReadBufferException_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + return SWIG_Python_InitShadowInstance(args); +} + +SWIGINTERN PyObject *_wrap_new_ExploreBtSocketException(PyObject *self, PyObject *args) { + PyObject *resultobj = 0; + std::string arg1 ; + PyObject *swig_obj[1] ; + ExploreBtSocketException *result = 0 ; + + (void)self; + if (!args) SWIG_fail; + swig_obj[0] = args; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(swig_obj[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_ExploreBtSocketException" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + try { + result = (ExploreBtSocketException *)new ExploreBtSocketException(arg1); + } catch(const ExploreException& e) { + SWIG_exception(SWIG_ValueError, e.what()); + } + catch(const ExploreReadBufferException& e) { + SWIG_exception(SWIG_MemoryError, e.what()); + } + catch(const ExploreIOException& e) { + SWIG_exception(SWIG_IOError, e.what()); + } + catch(const ExploreBtSocketException& e) { + SWIG_exception(SWIG_TypeError, e.what()); + } + catch(const std::exception& e) { + SWIG_exception(SWIG_UnknownError, "Standard exception"); + } catch(...) { + SWIG_exception(SWIG_RuntimeError, "Unknown exception"); + } + } + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ExploreBtSocketException, SWIG_POINTER_NEW | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ExploreBtSocketException_what(PyObject *self, PyObject *args) { + PyObject *resultobj = 0; + ExploreBtSocketException *arg1 = (ExploreBtSocketException *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject *swig_obj[1] ; + char *result = 0 ; + + (void)self; + if (!args) SWIG_fail; + swig_obj[0] = args; + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ExploreBtSocketException, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ExploreBtSocketException_what" "', argument " "1"" of type '" "ExploreBtSocketException const *""'"); + } + arg1 = reinterpret_cast< ExploreBtSocketException * >(argp1); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (char *)((ExploreReadBufferException const *)arg1)->what(); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (char *)((ExploreBtSocketException const *)arg1)->what(); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -9292,27 +9551,24 @@ SWIGINTERN PyObject *_wrap_ExploreReadBufferException_what(PyObject *SWIGUNUSEDP } -SWIGINTERN PyObject *_wrap_delete_ExploreReadBufferException(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_delete_ExploreBtSocketException(PyObject *self, PyObject *args) { PyObject *resultobj = 0; - ExploreReadBufferException *arg1 = (ExploreReadBufferException *) 0 ; + ExploreBtSocketException *arg1 = (ExploreBtSocketException *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ExploreReadBufferException, SWIG_POINTER_DISOWN | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ExploreBtSocketException, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ExploreReadBufferException" "', argument " "1"" of type '" "ExploreReadBufferException *""'"); + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ExploreBtSocketException" "', argument " "1"" of type '" "ExploreBtSocketException *""'"); } - arg1 = reinterpret_cast< ExploreReadBufferException * >(argp1); + arg1 = reinterpret_cast< ExploreBtSocketException * >(argp1); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - delete arg1; - SWIG_PYTHON_THREAD_END_ALLOW; - } + delete arg1; } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -9338,41 +9594,38 @@ SWIGINTERN PyObject *_wrap_delete_ExploreReadBufferException(PyObject *SWIGUNUSE } -SWIGINTERN PyObject *ExploreReadBufferException_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *ExploreBtSocketException_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL; - SWIG_TypeNewClientData(SWIGTYPE_p_ExploreReadBufferException, SWIG_NewClientData(obj)); + SWIG_TypeNewClientData(SWIGTYPE_p_ExploreBtSocketException, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } -SWIGINTERN PyObject *ExploreReadBufferException_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *ExploreBtSocketException_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { return SWIG_Python_InitShadowInstance(args); } -SWIGINTERN PyObject *_wrap_new_ExploreBtSocketException(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_new_ExploreIOException(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::string arg1 ; PyObject *swig_obj[1] ; - ExploreBtSocketException *result = 0 ; + ExploreIOException *result = 0 ; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; { std::string *ptr = (std::string *)0; int res = SWIG_AsPtr_std_string(swig_obj[0], &ptr); if (!SWIG_IsOK(res) || !ptr) { - SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_ExploreBtSocketException" "', argument " "1"" of type '" "std::string""'"); + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_ExploreIOException" "', argument " "1"" of type '" "std::string""'"); } arg1 = *ptr; if (SWIG_IsNewObj(res)) delete ptr; } { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (ExploreBtSocketException *)new ExploreBtSocketException(arg1); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (ExploreIOException *)new ExploreIOException(arg1); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -9391,35 +9644,32 @@ SWIGINTERN PyObject *_wrap_new_ExploreBtSocketException(PyObject *SWIGUNUSEDPARM SWIG_exception(SWIG_RuntimeError, "Unknown exception"); } } - resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ExploreBtSocketException, SWIG_POINTER_NEW | 0 ); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ExploreIOException, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } -SWIGINTERN PyObject *_wrap_ExploreBtSocketException_what(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_ExploreIOException_what(PyObject *self, PyObject *args) { PyObject *resultobj = 0; - ExploreBtSocketException *arg1 = (ExploreBtSocketException *) 0 ; + ExploreIOException *arg1 = (ExploreIOException *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; char *result = 0 ; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ExploreBtSocketException, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ExploreIOException, 0 | 0 ); if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ExploreBtSocketException_what" "', argument " "1"" of type '" "ExploreBtSocketException const *""'"); + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ExploreIOException_what" "', argument " "1"" of type '" "ExploreIOException const *""'"); } - arg1 = reinterpret_cast< ExploreBtSocketException * >(argp1); + arg1 = reinterpret_cast< ExploreIOException * >(argp1); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (char *)((ExploreBtSocketException const *)arg1)->what(); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (char *)((ExploreIOException const *)arg1)->what(); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -9445,27 +9695,24 @@ SWIGINTERN PyObject *_wrap_ExploreBtSocketException_what(PyObject *SWIGUNUSEDPAR } -SWIGINTERN PyObject *_wrap_delete_ExploreBtSocketException(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_delete_ExploreIOException(PyObject *self, PyObject *args) { PyObject *resultobj = 0; - ExploreBtSocketException *arg1 = (ExploreBtSocketException *) 0 ; + ExploreIOException *arg1 = (ExploreIOException *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ExploreBtSocketException, SWIG_POINTER_DISOWN | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ExploreIOException, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ExploreBtSocketException" "', argument " "1"" of type '" "ExploreBtSocketException *""'"); + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ExploreIOException" "', argument " "1"" of type '" "ExploreIOException *""'"); } - arg1 = reinterpret_cast< ExploreBtSocketException * >(argp1); + arg1 = reinterpret_cast< ExploreIOException * >(argp1); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - delete arg1; - SWIG_PYTHON_THREAD_END_ALLOW; - } + delete arg1; } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -9491,41 +9738,38 @@ SWIGINTERN PyObject *_wrap_delete_ExploreBtSocketException(PyObject *SWIGUNUSEDP } -SWIGINTERN PyObject *ExploreBtSocketException_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *ExploreIOException_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL; - SWIG_TypeNewClientData(SWIGTYPE_p_ExploreBtSocketException, SWIG_NewClientData(obj)); + SWIG_TypeNewClientData(SWIGTYPE_p_ExploreIOException, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } -SWIGINTERN PyObject *ExploreBtSocketException_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *ExploreIOException_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { return SWIG_Python_InitShadowInstance(args); } -SWIGINTERN PyObject *_wrap_new_ExploreIOException(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_new_ExploreNoBluetoothException(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::string arg1 ; PyObject *swig_obj[1] ; - ExploreIOException *result = 0 ; + ExploreNoBluetoothException *result = 0 ; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; { std::string *ptr = (std::string *)0; int res = SWIG_AsPtr_std_string(swig_obj[0], &ptr); if (!SWIG_IsOK(res) || !ptr) { - SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_ExploreIOException" "', argument " "1"" of type '" "std::string""'"); + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_ExploreNoBluetoothException" "', argument " "1"" of type '" "std::string""'"); } arg1 = *ptr; if (SWIG_IsNewObj(res)) delete ptr; } { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (ExploreIOException *)new ExploreIOException(arg1); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (ExploreNoBluetoothException *)new ExploreNoBluetoothException(arg1); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -9544,35 +9788,32 @@ SWIGINTERN PyObject *_wrap_new_ExploreIOException(PyObject *SWIGUNUSEDPARM(self) SWIG_exception(SWIG_RuntimeError, "Unknown exception"); } } - resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ExploreIOException, SWIG_POINTER_NEW | 0 ); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ExploreNoBluetoothException, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } -SWIGINTERN PyObject *_wrap_ExploreIOException_what(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_ExploreNoBluetoothException_what(PyObject *self, PyObject *args) { PyObject *resultobj = 0; - ExploreIOException *arg1 = (ExploreIOException *) 0 ; + ExploreNoBluetoothException *arg1 = (ExploreNoBluetoothException *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; char *result = 0 ; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ExploreIOException, 0 | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ExploreNoBluetoothException, 0 | 0 ); if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ExploreIOException_what" "', argument " "1"" of type '" "ExploreIOException const *""'"); + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ExploreNoBluetoothException_what" "', argument " "1"" of type '" "ExploreNoBluetoothException const *""'"); } - arg1 = reinterpret_cast< ExploreIOException * >(argp1); + arg1 = reinterpret_cast< ExploreNoBluetoothException * >(argp1); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (char *)((ExploreIOException const *)arg1)->what(); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (char *)((ExploreNoBluetoothException const *)arg1)->what(); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -9598,27 +9839,24 @@ SWIGINTERN PyObject *_wrap_ExploreIOException_what(PyObject *SWIGUNUSEDPARM(self } -SWIGINTERN PyObject *_wrap_delete_ExploreIOException(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_delete_ExploreNoBluetoothException(PyObject *self, PyObject *args) { PyObject *resultobj = 0; - ExploreIOException *arg1 = (ExploreIOException *) 0 ; + ExploreNoBluetoothException *arg1 = (ExploreNoBluetoothException *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ExploreIOException, SWIG_POINTER_DISOWN | 0 ); + res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ExploreNoBluetoothException, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ExploreIOException" "', argument " "1"" of type '" "ExploreIOException *""'"); + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ExploreNoBluetoothException" "', argument " "1"" of type '" "ExploreNoBluetoothException *""'"); } - arg1 = reinterpret_cast< ExploreIOException * >(argp1); + arg1 = reinterpret_cast< ExploreNoBluetoothException * >(argp1); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - delete arg1; - SWIG_PYTHON_THREAD_END_ALLOW; - } + delete arg1; } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -9644,18 +9882,18 @@ SWIGINTERN PyObject *_wrap_delete_ExploreIOException(PyObject *SWIGUNUSEDPARM(se } -SWIGINTERN PyObject *ExploreIOException_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *ExploreNoBluetoothException_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL; - SWIG_TypeNewClientData(SWIGTYPE_p_ExploreIOException, SWIG_NewClientData(obj)); + SWIG_TypeNewClientData(SWIGTYPE_p_ExploreNoBluetoothException, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } -SWIGINTERN PyObject *ExploreIOException_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *ExploreNoBluetoothException_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { return SWIG_Python_InitShadowInstance(args); } -SWIGINTERN PyObject *_wrap_device_address_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_device_address_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; device *arg1 = (device *) 0 ; std::string *arg2 = 0 ; @@ -9664,6 +9902,7 @@ SWIGINTERN PyObject *_wrap_device_address_set(PyObject *SWIGUNUSEDPARM(self), Py int res2 = SWIG_OLDOBJ ; PyObject *swig_obj[2] ; + (void)self; if (!SWIG_Python_UnpackTuple(args, "device_address_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_device, 0 | 0 ); if (!SWIG_IsOK(res1)) { @@ -9681,11 +9920,7 @@ SWIGINTERN PyObject *_wrap_device_address_set(PyObject *SWIGUNUSEDPARM(self), Py } arg2 = ptr; } - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - if (arg1) (arg1)->address = *arg2; - SWIG_PYTHON_THREAD_END_ALLOW; - } + if (arg1) (arg1)->address = *arg2; resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; @@ -9695,7 +9930,7 @@ SWIGINTERN PyObject *_wrap_device_address_set(PyObject *SWIGUNUSEDPARM(self), Py } -SWIGINTERN PyObject *_wrap_device_address_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_device_address_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; device *arg1 = (device *) 0 ; void *argp1 = 0 ; @@ -9703,6 +9938,7 @@ SWIGINTERN PyObject *_wrap_device_address_get(PyObject *SWIGUNUSEDPARM(self), Py PyObject *swig_obj[1] ; std::string *result = 0 ; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_device, 0 | 0 ); @@ -9710,11 +9946,7 @@ SWIGINTERN PyObject *_wrap_device_address_get(PyObject *SWIGUNUSEDPARM(self), Py SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "device_address_get" "', argument " "1"" of type '" "device *""'"); } arg1 = reinterpret_cast< device * >(argp1); - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (std::string *) & ((arg1)->address); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (std::string *) & ((arg1)->address); resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); return resultobj; fail: @@ -9722,7 +9954,7 @@ SWIGINTERN PyObject *_wrap_device_address_get(PyObject *SWIGUNUSEDPARM(self), Py } -SWIGINTERN PyObject *_wrap_device_name_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_device_name_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; device *arg1 = (device *) 0 ; std::string *arg2 = 0 ; @@ -9731,6 +9963,7 @@ SWIGINTERN PyObject *_wrap_device_name_set(PyObject *SWIGUNUSEDPARM(self), PyObj int res2 = SWIG_OLDOBJ ; PyObject *swig_obj[2] ; + (void)self; if (!SWIG_Python_UnpackTuple(args, "device_name_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_device, 0 | 0 ); if (!SWIG_IsOK(res1)) { @@ -9748,11 +9981,7 @@ SWIGINTERN PyObject *_wrap_device_name_set(PyObject *SWIGUNUSEDPARM(self), PyObj } arg2 = ptr; } - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - if (arg1) (arg1)->name = *arg2; - SWIG_PYTHON_THREAD_END_ALLOW; - } + if (arg1) (arg1)->name = *arg2; resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; @@ -9762,7 +9991,7 @@ SWIGINTERN PyObject *_wrap_device_name_set(PyObject *SWIGUNUSEDPARM(self), PyObj } -SWIGINTERN PyObject *_wrap_device_name_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_device_name_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; device *arg1 = (device *) 0 ; void *argp1 = 0 ; @@ -9770,6 +9999,7 @@ SWIGINTERN PyObject *_wrap_device_name_get(PyObject *SWIGUNUSEDPARM(self), PyObj PyObject *swig_obj[1] ; std::string *result = 0 ; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_device, 0 | 0 ); @@ -9777,11 +10007,7 @@ SWIGINTERN PyObject *_wrap_device_name_get(PyObject *SWIGUNUSEDPARM(self), PyObj SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "device_name_get" "', argument " "1"" of type '" "device *""'"); } arg1 = reinterpret_cast< device * >(argp1); - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (std::string *) & ((arg1)->name); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (std::string *) & ((arg1)->name); resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); return resultobj; fail: @@ -9789,7 +10015,7 @@ SWIGINTERN PyObject *_wrap_device_name_get(PyObject *SWIGUNUSEDPARM(self), PyObj } -SWIGINTERN PyObject *_wrap_device_lastSeen_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_device_lastSeen_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; device *arg1 = (device *) 0 ; std::time_t arg2 ; @@ -9799,6 +10025,7 @@ SWIGINTERN PyObject *_wrap_device_lastSeen_set(PyObject *SWIGUNUSEDPARM(self), P int res2 = 0 ; PyObject *swig_obj[2] ; + (void)self; if (!SWIG_Python_UnpackTuple(args, "device_lastSeen_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_device, 0 | 0 ); if (!SWIG_IsOK(res1)) { @@ -9818,11 +10045,7 @@ SWIGINTERN PyObject *_wrap_device_lastSeen_set(PyObject *SWIGUNUSEDPARM(self), P if (SWIG_IsNewObj(res2)) delete temp; } } - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - if (arg1) (arg1)->lastSeen = arg2; - SWIG_PYTHON_THREAD_END_ALLOW; - } + if (arg1) (arg1)->lastSeen = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: @@ -9830,7 +10053,7 @@ SWIGINTERN PyObject *_wrap_device_lastSeen_set(PyObject *SWIGUNUSEDPARM(self), P } -SWIGINTERN PyObject *_wrap_device_lastSeen_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_device_lastSeen_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; device *arg1 = (device *) 0 ; void *argp1 = 0 ; @@ -9838,6 +10061,7 @@ SWIGINTERN PyObject *_wrap_device_lastSeen_get(PyObject *SWIGUNUSEDPARM(self), P PyObject *swig_obj[1] ; std::time_t result; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_device, 0 | 0 ); @@ -9845,19 +10069,15 @@ SWIGINTERN PyObject *_wrap_device_lastSeen_get(PyObject *SWIGUNUSEDPARM(self), P SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "device_lastSeen_get" "', argument " "1"" of type '" "device *""'"); } arg1 = reinterpret_cast< device * >(argp1); - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = ((arg1)->lastSeen); - SWIG_PYTHON_THREAD_END_ALLOW; - } - resultobj = SWIG_NewPointerObj((new std::time_t(static_cast< const std::time_t& >(result))), SWIGTYPE_p_std__time_t, SWIG_POINTER_OWN | 0 ); + result = ((arg1)->lastSeen); + resultobj = SWIG_NewPointerObj((new std::time_t(result)), SWIGTYPE_p_std__time_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } -SWIGINTERN PyObject *_wrap_device_lastUsed_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_device_lastUsed_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; device *arg1 = (device *) 0 ; std::time_t arg2 ; @@ -9867,6 +10087,7 @@ SWIGINTERN PyObject *_wrap_device_lastUsed_set(PyObject *SWIGUNUSEDPARM(self), P int res2 = 0 ; PyObject *swig_obj[2] ; + (void)self; if (!SWIG_Python_UnpackTuple(args, "device_lastUsed_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_device, 0 | 0 ); if (!SWIG_IsOK(res1)) { @@ -9886,11 +10107,7 @@ SWIGINTERN PyObject *_wrap_device_lastUsed_set(PyObject *SWIGUNUSEDPARM(self), P if (SWIG_IsNewObj(res2)) delete temp; } } - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - if (arg1) (arg1)->lastUsed = arg2; - SWIG_PYTHON_THREAD_END_ALLOW; - } + if (arg1) (arg1)->lastUsed = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: @@ -9898,7 +10115,7 @@ SWIGINTERN PyObject *_wrap_device_lastUsed_set(PyObject *SWIGUNUSEDPARM(self), P } -SWIGINTERN PyObject *_wrap_device_lastUsed_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_device_lastUsed_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; device *arg1 = (device *) 0 ; void *argp1 = 0 ; @@ -9906,6 +10123,7 @@ SWIGINTERN PyObject *_wrap_device_lastUsed_get(PyObject *SWIGUNUSEDPARM(self), P PyObject *swig_obj[1] ; std::time_t result; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_device, 0 | 0 ); @@ -9913,19 +10131,15 @@ SWIGINTERN PyObject *_wrap_device_lastUsed_get(PyObject *SWIGUNUSEDPARM(self), P SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "device_lastUsed_get" "', argument " "1"" of type '" "device *""'"); } arg1 = reinterpret_cast< device * >(argp1); - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = ((arg1)->lastUsed); - SWIG_PYTHON_THREAD_END_ALLOW; - } - resultobj = SWIG_NewPointerObj((new std::time_t(static_cast< const std::time_t& >(result))), SWIGTYPE_p_std__time_t, SWIG_POINTER_OWN | 0 ); + result = ((arg1)->lastUsed); + resultobj = SWIG_NewPointerObj((new std::time_t(result)), SWIGTYPE_p_std__time_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } -SWIGINTERN PyObject *_wrap_device_connected_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_device_connected_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; device *arg1 = (device *) 0 ; bool arg2 ; @@ -9935,6 +10149,7 @@ SWIGINTERN PyObject *_wrap_device_connected_set(PyObject *SWIGUNUSEDPARM(self), int ecode2 = 0 ; PyObject *swig_obj[2] ; + (void)self; if (!SWIG_Python_UnpackTuple(args, "device_connected_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_device, 0 | 0 ); if (!SWIG_IsOK(res1)) { @@ -9946,11 +10161,7 @@ SWIGINTERN PyObject *_wrap_device_connected_set(PyObject *SWIGUNUSEDPARM(self), SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "device_connected_set" "', argument " "2"" of type '" "bool""'"); } arg2 = static_cast< bool >(val2); - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - if (arg1) (arg1)->connected = arg2; - SWIG_PYTHON_THREAD_END_ALLOW; - } + if (arg1) (arg1)->connected = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: @@ -9958,7 +10169,7 @@ SWIGINTERN PyObject *_wrap_device_connected_set(PyObject *SWIGUNUSEDPARM(self), } -SWIGINTERN PyObject *_wrap_device_connected_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_device_connected_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; device *arg1 = (device *) 0 ; void *argp1 = 0 ; @@ -9966,6 +10177,7 @@ SWIGINTERN PyObject *_wrap_device_connected_get(PyObject *SWIGUNUSEDPARM(self), PyObject *swig_obj[1] ; bool result; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_device, 0 | 0 ); @@ -9973,11 +10185,7 @@ SWIGINTERN PyObject *_wrap_device_connected_get(PyObject *SWIGUNUSEDPARM(self), SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "device_connected_get" "', argument " "1"" of type '" "device *""'"); } arg1 = reinterpret_cast< device * >(argp1); - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (bool) ((arg1)->connected); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (bool) ((arg1)->connected); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: @@ -9985,7 +10193,7 @@ SWIGINTERN PyObject *_wrap_device_connected_get(PyObject *SWIGUNUSEDPARM(self), } -SWIGINTERN PyObject *_wrap_device_remembered_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_device_remembered_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; device *arg1 = (device *) 0 ; bool arg2 ; @@ -9995,6 +10203,7 @@ SWIGINTERN PyObject *_wrap_device_remembered_set(PyObject *SWIGUNUSEDPARM(self), int ecode2 = 0 ; PyObject *swig_obj[2] ; + (void)self; if (!SWIG_Python_UnpackTuple(args, "device_remembered_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_device, 0 | 0 ); if (!SWIG_IsOK(res1)) { @@ -10006,11 +10215,7 @@ SWIGINTERN PyObject *_wrap_device_remembered_set(PyObject *SWIGUNUSEDPARM(self), SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "device_remembered_set" "', argument " "2"" of type '" "bool""'"); } arg2 = static_cast< bool >(val2); - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - if (arg1) (arg1)->remembered = arg2; - SWIG_PYTHON_THREAD_END_ALLOW; - } + if (arg1) (arg1)->remembered = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: @@ -10018,7 +10223,7 @@ SWIGINTERN PyObject *_wrap_device_remembered_set(PyObject *SWIGUNUSEDPARM(self), } -SWIGINTERN PyObject *_wrap_device_remembered_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_device_remembered_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; device *arg1 = (device *) 0 ; void *argp1 = 0 ; @@ -10026,6 +10231,7 @@ SWIGINTERN PyObject *_wrap_device_remembered_get(PyObject *SWIGUNUSEDPARM(self), PyObject *swig_obj[1] ; bool result; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_device, 0 | 0 ); @@ -10033,11 +10239,7 @@ SWIGINTERN PyObject *_wrap_device_remembered_get(PyObject *SWIGUNUSEDPARM(self), SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "device_remembered_get" "', argument " "1"" of type '" "device *""'"); } arg1 = reinterpret_cast< device * >(argp1); - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (bool) ((arg1)->remembered); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (bool) ((arg1)->remembered); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: @@ -10045,7 +10247,7 @@ SWIGINTERN PyObject *_wrap_device_remembered_get(PyObject *SWIGUNUSEDPARM(self), } -SWIGINTERN PyObject *_wrap_device_authenticated_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_device_authenticated_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; device *arg1 = (device *) 0 ; bool arg2 ; @@ -10055,6 +10257,7 @@ SWIGINTERN PyObject *_wrap_device_authenticated_set(PyObject *SWIGUNUSEDPARM(sel int ecode2 = 0 ; PyObject *swig_obj[2] ; + (void)self; if (!SWIG_Python_UnpackTuple(args, "device_authenticated_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_device, 0 | 0 ); if (!SWIG_IsOK(res1)) { @@ -10066,11 +10269,7 @@ SWIGINTERN PyObject *_wrap_device_authenticated_set(PyObject *SWIGUNUSEDPARM(sel SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "device_authenticated_set" "', argument " "2"" of type '" "bool""'"); } arg2 = static_cast< bool >(val2); - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - if (arg1) (arg1)->authenticated = arg2; - SWIG_PYTHON_THREAD_END_ALLOW; - } + if (arg1) (arg1)->authenticated = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: @@ -10078,7 +10277,7 @@ SWIGINTERN PyObject *_wrap_device_authenticated_set(PyObject *SWIGUNUSEDPARM(sel } -SWIGINTERN PyObject *_wrap_device_authenticated_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_device_authenticated_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; device *arg1 = (device *) 0 ; void *argp1 = 0 ; @@ -10086,6 +10285,7 @@ SWIGINTERN PyObject *_wrap_device_authenticated_get(PyObject *SWIGUNUSEDPARM(sel PyObject *swig_obj[1] ; bool result; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_device, 0 | 0 ); @@ -10093,11 +10293,7 @@ SWIGINTERN PyObject *_wrap_device_authenticated_get(PyObject *SWIGUNUSEDPARM(sel SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "device_authenticated_get" "', argument " "1"" of type '" "device *""'"); } arg1 = reinterpret_cast< device * >(argp1); - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (bool) ((arg1)->authenticated); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (bool) ((arg1)->authenticated); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: @@ -10105,18 +10301,15 @@ SWIGINTERN PyObject *_wrap_device_authenticated_get(PyObject *SWIGUNUSEDPARM(sel } -SWIGINTERN PyObject *_wrap_new_device(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_new_device(PyObject *self, PyObject *args) { PyObject *resultobj = 0; device *result = 0 ; + (void)self; if (!SWIG_Python_UnpackTuple(args, "new_device", 0, 0, 0)) SWIG_fail; { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (device *)new device(); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (device *)new device(); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -10142,13 +10335,14 @@ SWIGINTERN PyObject *_wrap_new_device(PyObject *SWIGUNUSEDPARM(self), PyObject * } -SWIGINTERN PyObject *_wrap_delete_device(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_delete_device(PyObject *self, PyObject *args) { PyObject *resultobj = 0; device *arg1 = (device *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_device, SWIG_POINTER_DISOWN | 0 ); @@ -10158,11 +10352,7 @@ SWIGINTERN PyObject *_wrap_delete_device(PyObject *SWIGUNUSEDPARM(self), PyObjec arg1 = reinterpret_cast< device * >(argp1); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - delete arg1; - SWIG_PYTHON_THREAD_END_ALLOW; - } + delete arg1; } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -10199,13 +10389,14 @@ SWIGINTERN PyObject *device_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *a return SWIG_Python_InitShadowInstance(args); } -SWIGINTERN PyObject *_wrap_delete_ExploreSDK(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_delete_ExploreSDK(PyObject *self, PyObject *args) { PyObject *resultobj = 0; ExploreSDK *arg1 = (ExploreSDK *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; + (void)self; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ExploreSDK, SWIG_POINTER_DISOWN | 0 ); @@ -10215,11 +10406,7 @@ SWIGINTERN PyObject *_wrap_delete_ExploreSDK(PyObject *SWIGUNUSEDPARM(self), PyO arg1 = reinterpret_cast< ExploreSDK * >(argp1); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - delete arg1; - SWIG_PYTHON_THREAD_END_ALLOW; - } + delete arg1; } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -10245,18 +10432,15 @@ SWIGINTERN PyObject *_wrap_delete_ExploreSDK(PyObject *SWIGUNUSEDPARM(self), PyO } -SWIGINTERN PyObject *_wrap_ExploreSDK_Create(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_ExploreSDK_Create(PyObject *self, PyObject *args) { PyObject *resultobj = 0; ExploreSDK *result = 0 ; + (void)self; if (!SWIG_Python_UnpackTuple(args, "ExploreSDK_Create", 0, 0, 0)) SWIG_fail; { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (ExploreSDK *)ExploreSDK::Create(); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (ExploreSDK *)ExploreSDK::Create(); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -10282,7 +10466,7 @@ SWIGINTERN PyObject *_wrap_ExploreSDK_Create(PyObject *SWIGUNUSEDPARM(self), PyO } -SWIGINTERN PyObject *_wrap_ExploreSDK_PerformDeviceSearch__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_ExploreSDK_PerformDeviceSearch__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; ExploreSDK *arg1 = (ExploreSDK *) 0 ; int arg2 ; @@ -10292,6 +10476,7 @@ SWIGINTERN PyObject *_wrap_ExploreSDK_PerformDeviceSearch__SWIG_0(PyObject *SWIG int ecode2 = 0 ; std::vector< device,std::allocator< device > > result; + (void)self; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ExploreSDK, 0 | 0 ); if (!SWIG_IsOK(res1)) { @@ -10305,11 +10490,7 @@ SWIGINTERN PyObject *_wrap_ExploreSDK_PerformDeviceSearch__SWIG_0(PyObject *SWIG arg2 = static_cast< int >(val2); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (arg1)->PerformDeviceSearch(arg2); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (arg1)->PerformDeviceSearch(arg2); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -10335,13 +10516,14 @@ SWIGINTERN PyObject *_wrap_ExploreSDK_PerformDeviceSearch__SWIG_0(PyObject *SWIG } -SWIGINTERN PyObject *_wrap_ExploreSDK_PerformDeviceSearch__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) { +SWIGINTERN PyObject *_wrap_ExploreSDK_PerformDeviceSearch__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; ExploreSDK *arg1 = (ExploreSDK *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< device,std::allocator< device > > result; + (void)self; if ((nobjs < 1) || (nobjs > 1)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ExploreSDK, 0 | 0 ); if (!SWIG_IsOK(res1)) { @@ -10350,11 +10532,7 @@ SWIGINTERN PyObject *_wrap_ExploreSDK_PerformDeviceSearch__SWIG_1(PyObject *SWIG arg1 = reinterpret_cast< ExploreSDK * >(argp1); { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (arg1)->PerformDeviceSearch(); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (arg1)->PerformDeviceSearch(); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -10389,7 +10567,7 @@ SWIGINTERN PyObject *_wrap_ExploreSDK_PerformDeviceSearch(PyObject *self, PyObje if (!(argc = SWIG_Python_UnpackTuple(args, "ExploreSDK_PerformDeviceSearch", 0, 2, argv))) SWIG_fail; --argc; if (argc == 1) { - int _v; + int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ExploreSDK, 0); _v = SWIG_CheckState(res); @@ -10398,7 +10576,7 @@ SWIGINTERN PyObject *_wrap_ExploreSDK_PerformDeviceSearch(PyObject *self, PyObje } } if (argc == 2) { - int _v; + int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ExploreSDK, 0); _v = SWIG_CheckState(res); @@ -10422,7 +10600,7 @@ SWIGINTERN PyObject *_wrap_ExploreSDK_PerformDeviceSearch(PyObject *self, PyObje } -SWIGINTERN PyObject *_wrap_ExploreSDK_SdpSearch(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_ExploreSDK_SdpSearch(PyObject *self, PyObject *args) { PyObject *resultobj = 0; ExploreSDK *arg1 = (ExploreSDK *) 0 ; std::string arg2 ; @@ -10431,6 +10609,7 @@ SWIGINTERN PyObject *_wrap_ExploreSDK_SdpSearch(PyObject *SWIGUNUSEDPARM(self), PyObject *swig_obj[2] ; int result; + (void)self; if (!SWIG_Python_UnpackTuple(args, "ExploreSDK_SdpSearch", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ExploreSDK, 0 | 0 ); if (!SWIG_IsOK(res1)) { @@ -10448,11 +10627,7 @@ SWIGINTERN PyObject *_wrap_ExploreSDK_SdpSearch(PyObject *SWIGUNUSEDPARM(self), } { try { - { - SWIG_PYTHON_THREAD_BEGIN_ALLOW; - result = (int)(arg1)->SdpSearch(arg2); - SWIG_PYTHON_THREAD_END_ALLOW; - } + result = (int)(arg1)->SdpSearch(arg2); } catch(const ExploreException& e) { SWIG_exception(SWIG_ValueError, e.what()); } @@ -10486,7 +10661,6 @@ SWIGINTERN PyObject *ExploreSDK_swigregister(PyObject *SWIGUNUSEDPARM(self), PyO } static PyMethodDef SwigMethods[] = { - { "SWIG_PyInstanceMethod_New", SWIG_PyInstanceMethod_New, METH_O, NULL}, { "delete_SwigPyIterator", _wrap_delete_SwigPyIterator, METH_O, NULL}, { "SwigPyIterator_value", _wrap_SwigPyIterator_value, METH_O, NULL}, { "SwigPyIterator_incr", _wrap_SwigPyIterator_incr, METH_VARARGS, NULL}, @@ -10568,6 +10742,11 @@ static PyMethodDef SwigMethods[] = { { "delete_ExploreIOException", _wrap_delete_ExploreIOException, METH_O, NULL}, { "ExploreIOException_swigregister", ExploreIOException_swigregister, METH_O, NULL}, { "ExploreIOException_swiginit", ExploreIOException_swiginit, METH_VARARGS, NULL}, + { "new_ExploreNoBluetoothException", _wrap_new_ExploreNoBluetoothException, METH_O, NULL}, + { "ExploreNoBluetoothException_what", _wrap_ExploreNoBluetoothException_what, METH_O, NULL}, + { "delete_ExploreNoBluetoothException", _wrap_delete_ExploreNoBluetoothException, METH_O, NULL}, + { "ExploreNoBluetoothException_swigregister", ExploreNoBluetoothException_swigregister, METH_O, NULL}, + { "ExploreNoBluetoothException_swiginit", ExploreNoBluetoothException_swiginit, METH_VARARGS, NULL}, { "device_address_set", _wrap_device_address_set, METH_VARARGS, NULL}, { "device_address_get", _wrap_device_address_get, METH_O, NULL}, { "device_name_set", _wrap_device_name_set, METH_VARARGS, NULL}, @@ -10594,29 +10773,29 @@ static PyMethodDef SwigMethods[] = { { NULL, NULL, 0, NULL } }; -static PyMethodDef SwigMethods_proxydocs[] = { - { NULL, NULL, 0, NULL } -}; - /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */ -static void *_p_ExploreExceptionTo_p_std__exception(void *x, int *SWIGUNUSEDPARM(newmemory)) { - return (void *)((std::exception *) ((ExploreException *) x)); -} -static void *_p_ExploreReadBufferExceptionTo_p_std__exception(void *x, int *SWIGUNUSEDPARM(newmemory)) { - return (void *)((std::exception *) ((ExploreReadBufferException *) x)); -} static void *_p_ExploreBtSocketExceptionTo_p_std__exception(void *x, int *SWIGUNUSEDPARM(newmemory)) { return (void *)((std::exception *) ((ExploreBtSocketException *) x)); } +static void *_p_ExploreExceptionTo_p_std__exception(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((std::exception *) ((ExploreException *) x)); +} static void *_p_ExploreIOExceptionTo_p_std__exception(void *x, int *SWIGUNUSEDPARM(newmemory)) { return (void *)((std::exception *) ((ExploreIOException *) x)); } +static void *_p_ExploreNoBluetoothExceptionTo_p_std__exception(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((std::exception *) ((ExploreNoBluetoothException *) x)); +} +static void *_p_ExploreReadBufferExceptionTo_p_std__exception(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((std::exception *) ((ExploreReadBufferException *) x)); +} static swig_type_info _swigt__p_BTSerialPortBinding = {"_p_BTSerialPortBinding", "BTSerialPortBinding *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_ExploreBtSocketException = {"_p_ExploreBtSocketException", "ExploreBtSocketException *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_ExploreException = {"_p_ExploreException", "ExploreException *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_ExploreIOException = {"_p_ExploreIOException", "ExploreIOException *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_ExploreNoBluetoothException = {"_p_ExploreNoBluetoothException", "ExploreNoBluetoothException *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_ExploreReadBufferException = {"_p_ExploreReadBufferException", "ExploreReadBufferException *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_ExploreSDK = {"_p_ExploreSDK", "ExploreSDK *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_allocator_type = {"_p_allocator_type", "allocator_type *", 0, 0, (void*)0, 0}; @@ -10630,7 +10809,7 @@ static swig_type_info _swigt__p_std__allocatorT_device_t = {"_p_std__allocatorT_ static swig_type_info _swigt__p_std__exception = {"_p_std__exception", "std::exception *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__invalid_argument = {"_p_std__invalid_argument", "std::invalid_argument *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__time_t = {"_p_std__time_t", "std::time_t *", 0, 0, (void*)0, 0}; -static swig_type_info _swigt__p_std__vectorT_device_std__allocatorT_device_t_t = {"_p_std__vectorT_device_std__allocatorT_device_t_t", "std::vector< device,std::allocator< device > > *|std::vector< device > *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_std__vectorT_device_t = {"_p_std__vectorT_device_t", "std::vector< device,std::allocator< device > > *|std::vector< device > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_swig__SwigPyIterator = {"_p_swig__SwigPyIterator", "swig::SwigPyIterator *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_value_type = {"_p_value_type", "value_type *", 0, 0, (void*)0, 0}; @@ -10639,6 +10818,7 @@ static swig_type_info *swig_type_initial[] = { &_swigt__p_ExploreBtSocketException, &_swigt__p_ExploreException, &_swigt__p_ExploreIOException, + &_swigt__p_ExploreNoBluetoothException, &_swigt__p_ExploreReadBufferException, &_swigt__p_ExploreSDK, &_swigt__p_allocator_type, @@ -10652,7 +10832,7 @@ static swig_type_info *swig_type_initial[] = { &_swigt__p_std__exception, &_swigt__p_std__invalid_argument, &_swigt__p_std__time_t, - &_swigt__p_std__vectorT_device_std__allocatorT_device_t_t, + &_swigt__p_std__vectorT_device_t, &_swigt__p_swig__SwigPyIterator, &_swigt__p_value_type, }; @@ -10661,6 +10841,7 @@ static swig_cast_info _swigc__p_BTSerialPortBinding[] = { {&_swigt__p_BTSerialP static swig_cast_info _swigc__p_ExploreBtSocketException[] = { {&_swigt__p_ExploreBtSocketException, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_ExploreException[] = { {&_swigt__p_ExploreException, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_ExploreIOException[] = { {&_swigt__p_ExploreIOException, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_ExploreNoBluetoothException[] = { {&_swigt__p_ExploreNoBluetoothException, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_ExploreReadBufferException[] = { {&_swigt__p_ExploreReadBufferException, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_ExploreSDK[] = { {&_swigt__p_ExploreSDK, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_allocator_type[] = { {&_swigt__p_allocator_type, 0, 0, 0},{0, 0, 0, 0}}; @@ -10671,10 +10852,10 @@ static swig_cast_info _swigc__p_int[] = { {&_swigt__p_int, 0, 0, 0},{0, 0, 0, 0 static swig_cast_info _swigc__p_p_PyObject[] = { {&_swigt__p_p_PyObject, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_size_type[] = { {&_swigt__p_size_type, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__allocatorT_device_t[] = { {&_swigt__p_std__allocatorT_device_t, 0, 0, 0},{0, 0, 0, 0}}; -static swig_cast_info _swigc__p_std__exception[] = { {&_swigt__p_std__exception, 0, 0, 0}, {&_swigt__p_ExploreException, _p_ExploreExceptionTo_p_std__exception, 0, 0}, {&_swigt__p_ExploreReadBufferException, _p_ExploreReadBufferExceptionTo_p_std__exception, 0, 0}, {&_swigt__p_ExploreBtSocketException, _p_ExploreBtSocketExceptionTo_p_std__exception, 0, 0}, {&_swigt__p_ExploreIOException, _p_ExploreIOExceptionTo_p_std__exception, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_std__exception[] = { {&_swigt__p_std__exception, 0, 0, 0}, {&_swigt__p_ExploreBtSocketException, _p_ExploreBtSocketExceptionTo_p_std__exception, 0, 0}, {&_swigt__p_ExploreException, _p_ExploreExceptionTo_p_std__exception, 0, 0}, {&_swigt__p_ExploreIOException, _p_ExploreIOExceptionTo_p_std__exception, 0, 0}, {&_swigt__p_ExploreNoBluetoothException, _p_ExploreNoBluetoothExceptionTo_p_std__exception, 0, 0}, {&_swigt__p_ExploreReadBufferException, _p_ExploreReadBufferExceptionTo_p_std__exception, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__invalid_argument[] = { {&_swigt__p_std__invalid_argument, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__time_t[] = { {&_swigt__p_std__time_t, 0, 0, 0},{0, 0, 0, 0}}; -static swig_cast_info _swigc__p_std__vectorT_device_std__allocatorT_device_t_t[] = { {&_swigt__p_std__vectorT_device_std__allocatorT_device_t_t, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_std__vectorT_device_t[] = { {&_swigt__p_std__vectorT_device_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_swig__SwigPyIterator[] = { {&_swigt__p_swig__SwigPyIterator, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_value_type[] = { {&_swigt__p_value_type, 0, 0, 0},{0, 0, 0, 0}}; @@ -10683,6 +10864,7 @@ static swig_cast_info *swig_cast_initial[] = { _swigc__p_ExploreBtSocketException, _swigc__p_ExploreException, _swigc__p_ExploreIOException, + _swigc__p_ExploreNoBluetoothException, _swigc__p_ExploreReadBufferException, _swigc__p_ExploreSDK, _swigc__p_allocator_type, @@ -10696,7 +10878,7 @@ static swig_cast_info *swig_cast_initial[] = { _swigc__p_std__exception, _swigc__p_std__invalid_argument, _swigc__p_std__time_t, - _swigc__p_std__vectorT_device_std__allocatorT_device_t_t, + _swigc__p_std__vectorT_device_t, _swigc__p_swig__SwigPyIterator, _swigc__p_value_type, }; @@ -10762,9 +10944,12 @@ extern "C" { #define SWIGRUNTIME_DEBUG #endif +#ifndef SWIG_INIT_CLIENT_DATA_TYPE +#define SWIG_INIT_CLIENT_DATA_TYPE void * +#endif SWIGRUNTIME void -SWIG_InitializeModule(void *clientdata) { +SWIG_InitializeModule(SWIG_INIT_CLIENT_DATA_TYPE clientdata) { size_t i; swig_module_info *module_head, *iter; int init; @@ -10947,214 +11132,6 @@ SWIG_PropagateClientData(void) { extern "C" { #endif - /* Python-specific SWIG API */ -#define SWIG_newvarlink() SWIG_Python_newvarlink() -#define SWIG_addvarlink(p, name, get_attr, set_attr) SWIG_Python_addvarlink(p, name, get_attr, set_attr) -#define SWIG_InstallConstants(d, constants) SWIG_Python_InstallConstants(d, constants) - - /* ----------------------------------------------------------------------------- - * global variable support code. - * ----------------------------------------------------------------------------- */ - - typedef struct swig_globalvar { - char *name; /* Name of global variable */ - PyObject *(*get_attr)(void); /* Return the current value */ - int (*set_attr)(PyObject *); /* Set the value */ - struct swig_globalvar *next; - } swig_globalvar; - - typedef struct swig_varlinkobject { - PyObject_HEAD - swig_globalvar *vars; - } swig_varlinkobject; - - SWIGINTERN PyObject * - swig_varlink_repr(swig_varlinkobject *SWIGUNUSEDPARM(v)) { -#if PY_VERSION_HEX >= 0x03000000 - return PyUnicode_InternFromString(""); -#else - return PyString_FromString(""); -#endif - } - - SWIGINTERN PyObject * - swig_varlink_str(swig_varlinkobject *v) { -#if PY_VERSION_HEX >= 0x03000000 - PyObject *str = PyUnicode_InternFromString("("); - PyObject *tail; - PyObject *joined; - swig_globalvar *var; - for (var = v->vars; var; var=var->next) { - tail = PyUnicode_FromString(var->name); - joined = PyUnicode_Concat(str, tail); - Py_DecRef(str); - Py_DecRef(tail); - str = joined; - if (var->next) { - tail = PyUnicode_InternFromString(", "); - joined = PyUnicode_Concat(str, tail); - Py_DecRef(str); - Py_DecRef(tail); - str = joined; - } - } - tail = PyUnicode_InternFromString(")"); - joined = PyUnicode_Concat(str, tail); - Py_DecRef(str); - Py_DecRef(tail); - str = joined; -#else - PyObject *str = PyString_FromString("("); - swig_globalvar *var; - for (var = v->vars; var; var=var->next) { - PyString_ConcatAndDel(&str,PyString_FromString(var->name)); - if (var->next) PyString_ConcatAndDel(&str,PyString_FromString(", ")); - } - PyString_ConcatAndDel(&str,PyString_FromString(")")); -#endif - return str; - } - - SWIGINTERN void - swig_varlink_dealloc(swig_varlinkobject *v) { - swig_globalvar *var = v->vars; - while (var) { - swig_globalvar *n = var->next; - free(var->name); - free(var); - var = n; - } - } - - SWIGINTERN PyObject * - swig_varlink_getattr(swig_varlinkobject *v, char *n) { - PyObject *res = NULL; - swig_globalvar *var = v->vars; - while (var) { - if (strcmp(var->name,n) == 0) { - res = (*var->get_attr)(); - break; - } - var = var->next; - } - if (res == NULL && !PyErr_Occurred()) { - PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n); - } - return res; - } - - SWIGINTERN int - swig_varlink_setattr(swig_varlinkobject *v, char *n, PyObject *p) { - int res = 1; - swig_globalvar *var = v->vars; - while (var) { - if (strcmp(var->name,n) == 0) { - res = (*var->set_attr)(p); - break; - } - var = var->next; - } - if (res == 1 && !PyErr_Occurred()) { - PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n); - } - return res; - } - - SWIGINTERN PyTypeObject* - swig_varlink_type(void) { - static char varlink__doc__[] = "Swig var link object"; - static PyTypeObject varlink_type; - static int type_init = 0; - if (!type_init) { - const PyTypeObject tmp = { -#if PY_VERSION_HEX >= 0x03000000 - PyVarObject_HEAD_INIT(NULL, 0) -#else - PyObject_HEAD_INIT(NULL) - 0, /* ob_size */ -#endif - "swigvarlink", /* tp_name */ - sizeof(swig_varlinkobject), /* tp_basicsize */ - 0, /* tp_itemsize */ - (destructor) swig_varlink_dealloc, /* tp_dealloc */ - 0, /* tp_print */ - (getattrfunc) swig_varlink_getattr, /* tp_getattr */ - (setattrfunc) swig_varlink_setattr, /* tp_setattr */ - 0, /* tp_compare */ - (reprfunc) swig_varlink_repr, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - (reprfunc) swig_varlink_str, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - 0, /* tp_flags */ - varlink__doc__, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */ - 0, /* tp_del */ - 0, /* tp_version_tag */ -#if PY_VERSION_HEX >= 0x03040000 - 0, /* tp_finalize */ -#endif -#ifdef COUNT_ALLOCS - 0, /* tp_allocs */ - 0, /* tp_frees */ - 0, /* tp_maxalloc */ - 0, /* tp_prev */ - 0 /* tp_next */ -#endif - }; - varlink_type = tmp; - type_init = 1; - if (PyType_Ready(&varlink_type) < 0) - return NULL; - } - return &varlink_type; - } - - /* Create a variable linking object for use later */ - SWIGINTERN PyObject * - SWIG_Python_newvarlink(void) { - swig_varlinkobject *result = PyObject_NEW(swig_varlinkobject, swig_varlink_type()); - if (result) { - result->vars = 0; - } - return ((PyObject*) result); - } - - SWIGINTERN void - SWIG_Python_addvarlink(PyObject *p, const char *name, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)) { - swig_varlinkobject *v = (swig_varlinkobject *) p; - swig_globalvar *gv = (swig_globalvar *) malloc(sizeof(swig_globalvar)); - if (gv) { - size_t size = strlen(name)+1; - gv->name = (char *)malloc(size); - if (gv->name) { - memcpy(gv->name, name, size); - gv->get_attr = get_attr; - gv->set_attr = set_attr; - gv->next = v->vars; - } - } - v->vars = gv; - } - - SWIGINTERN PyObject * - SWIG_globals(void) { - static PyObject *globals = 0; - if (!globals) { - globals = SWIG_newvarlink(); - } - return globals; - } - /* ----------------------------------------------------------------------------- * constants/methods manipulation * ----------------------------------------------------------------------------- */ @@ -11183,15 +11160,12 @@ extern "C" { } } - /* -----------------------------------------------------------------------------*/ - /* Fix SwigMethods to carry the callback ptrs when needed */ - /* -----------------------------------------------------------------------------*/ + /* ----------------------------------------------------------------------------- + * Patch %callback methods' docstrings to hold the callback ptrs + * -----------------------------------------------------------------------------*/ SWIGINTERN void - SWIG_Python_FixMethods(PyMethodDef *methods, - swig_const_info *const_table, - swig_type_info **types, - swig_type_info **types_initial) { + SWIG_Python_FixMethods(PyMethodDef *methods, const swig_const_info *const_table, swig_type_info **types, swig_type_info **types_initial) { size_t i; for (i = 0; methods[i].ml_name; ++i) { const char *c = methods[i].ml_doc; @@ -11199,7 +11173,7 @@ extern "C" { c = strstr(c, "swig_ptr: "); if (c) { int j; - swig_const_info *ci = 0; + const swig_const_info *ci = 0; const char *name = c + 10; for (j = 0; const_table[j].type; ++j) { if (strncmp(const_table[j].name, name, @@ -11231,68 +11205,13 @@ extern "C" { } } - /* ----------------------------------------------------------------------------- - * Method creation and docstring support functions - * ----------------------------------------------------------------------------- */ - - /* ----------------------------------------------------------------------------- - * Function to find the method definition with the correct docstring for the - * proxy module as opposed to the low-level API - * ----------------------------------------------------------------------------- */ - - SWIGINTERN PyMethodDef *SWIG_PythonGetProxyDoc(const char *name) { - /* Find the function in the modified method table */ - size_t offset = 0; - int found = 0; - while (SwigMethods_proxydocs[offset].ml_meth != NULL) { - if (strcmp(SwigMethods_proxydocs[offset].ml_name, name) == 0) { - found = 1; - break; - } - offset++; - } - /* Use the copy with the modified docstring if available */ - return found ? &SwigMethods_proxydocs[offset] : NULL; - } - - /* ----------------------------------------------------------------------------- - * Wrapper of PyInstanceMethod_New() used in Python 3 - * It is exported to the generated module, used for -fastproxy - * ----------------------------------------------------------------------------- */ - - SWIGINTERN PyObject *SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *func) { - if (PyCFunction_Check(func)) { - PyCFunctionObject *funcobj = (PyCFunctionObject *)func; - PyMethodDef *ml = SWIG_PythonGetProxyDoc(funcobj->m_ml->ml_name); - if (ml) - func = PyCFunction_NewEx(ml, funcobj->m_self, funcobj->m_module); - } -#if PY_VERSION_HEX >= 0x03000000 - return PyInstanceMethod_New(func); -#else - return PyMethod_New(func, NULL, NULL); -#endif - } - - /* ----------------------------------------------------------------------------- - * Wrapper of PyStaticMethod_New() - * It is exported to the generated module, used for -fastproxy - * ----------------------------------------------------------------------------- */ - - SWIGINTERN PyObject *SWIG_PyStaticMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *func) { - if (PyCFunction_Check(func)) { - PyCFunctionObject *funcobj = (PyCFunctionObject *)func; - PyMethodDef *ml = SWIG_PythonGetProxyDoc(funcobj->m_ml->ml_name); - if (ml) - func = PyCFunction_NewEx(ml, funcobj->m_self, funcobj->m_module); - } - return PyStaticMethod_New(func); - } - #ifdef __cplusplus } #endif + + + /* -----------------------------------------------------------------------------* * Partial Init method * -----------------------------------------------------------------------------*/ @@ -11432,9 +11351,6 @@ SWIG_init(void) { // thread safe initialization swig::container_owner_attribute(); - - /* Initialize threading */ - SWIG_PYTHON_INITIALIZE_THREADS; #if PY_VERSION_HEX >= 0x03000000 return m; #else From fdbafe721ffb2d9d844a32a877513c04b98cc02f Mon Sep 17 00:00:00 2001 From: salman2135 Date: Tue, 4 Jun 2024 16:26:14 +0200 Subject: [PATCH 68/78] update docs for release --- AUTHORS.rst | 6 ++- CHANGELOG.rst | 6 +++ README.rst | 2 +- docs/conf.py | 2 +- docs/installation.rst | 86 +++++++----------------------------- docs/logo.png | Bin 11300 -> 170456 bytes installer/windows/README.md | 2 +- setup.py | 1 + 8 files changed, 29 insertions(+), 76 deletions(-) diff --git a/AUTHORS.rst b/AUTHORS.rst index c06c7a61..e46e4d9d 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -2,8 +2,10 @@ Authors ======= -* Mohamad Atayi - mentalab.com -* Masooma Fazelian - mentalab.com + * Salman Rahman - mentalab.com * Andrea Escartin - mentalab.com +* Sonja Stefani - mentalab.com +* Mohamad Atayi - mentalab.com +* Masoome Fazelian - mentalab.com * Alex Platt - mentalab.com diff --git a/CHANGELOG.rst b/CHANGELOG.rst index e2b2a456..10967293 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -2,6 +2,12 @@ Changelog ========= +3.0.0 (7.6.2024) +------------------ +* Improve Mac OSX support +* Add Support for Explore Pro +* Robust data parsing + 2.0.0 (5.1.2024) ------------------ * Add Mac OSX support diff --git a/README.rst b/README.rst index 66117b82..96cc4ca7 100644 --- a/README.rst +++ b/README.rst @@ -60,7 +60,7 @@ For other operating systems, or to build the package manually on Windows, please Requirements ------------ -* Python 3.7 to Python 3.12. +* Python 3.10 to Python 3.12. * Visual Studio 2015 community edition (Windows only. For package building). * Bluetooth header files (Linux only. Use: ``sudo apt-get install libbluetooth-dev``). diff --git a/docs/conf.py b/docs/conf.py index dfdedf19..3fced07a 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -26,7 +26,7 @@ source_suffix = '.rst' master_doc = 'index' project = 'explorepy' -year = '2018-2022' +year = '2018-2024' author = 'Mentalab GmbH.' copyright = '{0}, {1}'.format(year, author) version = release = '2.0.0' diff --git a/docs/installation.rst b/docs/installation.rst index cacb4437..6bc7f295 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -4,14 +4,14 @@ Installation Minimal Requirements ------------ -* Python 3.7 to Python 3.12 +* Python 3.10 to Python 3.12 * Microsoft Build Tools for Visual Studio 2019 (only Windows) * 6GB RAM (minimum 1GB *free* RAM during the session) * Intel i5 or higher (2x2.5GHz) CPU Recommended Requirements ------------ -* Python 3.7 to Python 3.12 +* Python 3.10 to Python 3.12 * Microsoft Build Tools for Visual Studio 2019 (only Windows) * 8GB RAM * Intel i7 or higher CPU @@ -25,7 +25,7 @@ Windows Option 1: Installing .exe file (basic) """""""" -*This option is best for users who only intend to use* ``explorepy`` *from a command-line prompt.* +*This option is best for users who only intend to use* ``explorepy`` *via graphical user interface* For example, if you want to quickly visualize and record data, use Option 1. If you intend to add ``explorepy`` commands to a Python script @@ -33,10 +33,10 @@ If you intend to add ``explorepy`` commands to a Python script For an overview of ``explorepy`` commands, click `here `_. -On a Windows machine, ``explorepy`` can be installed using the .exe installable file uploaded to -``explorepy``'s `release page `_. Please note that the dependencies will be installed automatically. +On a Windows machine, standalone desktop software ``explorepy-desktop`` can be installed using the .exe installable file uploaded to +`release page `_. Please note that the dependencies will be installed automatically. -A standalone Mac installer is also available. Please contact Mentalab support to get Mac installer. +A standalone Mac installer is also available in ` release page `_ Option 2: Installing from Python Package Index (PyPI) and pip (advanced) @@ -51,7 +51,7 @@ To install the ``explorepy`` API and all its dependencies using pip on Windows: 3. Open the Conda command prompt. 4. We recommend using a virtual environment. To do this: - a. In Conda command prompt: ``conda create -n myenv python=3.8`` + a. In Conda command prompt: ``conda create -n myenv python=3.10`` b. Activate the virtual environment: ``conda activate myenv`` 5. Upgrade your pip: ``python -m pip install --upgrade pip`` @@ -59,21 +59,22 @@ To install the ``explorepy`` API and all its dependencies using pip on Windows: Ubuntu ^^^^^^ -1. Install Bluetooth header files using ``sudo apt-get install libbluetooth-dev`` -2. We recommend installing Anaconda. Download and install the `Anaconda Python 3.7 Ubuntu installer `_. +1. From Linux Terminal, run these commands one by one: ``sudo apt-get install libbluetooth-dev`` and ``sudo apt-get install build-essential`` and ``conda install -c conda-forge liblsl``. +2. We recommend installing Anaconda. Download and install the `Anaconda Python 3.10 Ubuntu installer `_. 3. We recommend using a virtual environment in Conda. To do this: - a. In Conda command prompt: ``conda create -n myenv python=3.8`` + a. In Conda command prompt: ``conda create -n myenv python=3.10`` b. Activate the virtual environment: ``conda activate myenv`` 4. Upgrade your pip: ``python -m pip install --upgrade pip`` 5. Run: ``pip install explorepy``, to install ``explorepy`` from PyPI. +6. From Linux Terminal, run: ``sudo apt install libxcb-cursor0`` Mac ^^^ 1. Install ``XCode`` from the Mac App store. For this, you may need to upgrade to the latest version of MacOS. For older versions of MacOS, find compatible versions of ``XCode`` `here `_. All old ``XCode`` versions are available `here `_. 2. Accept the license agreement: ``sudo xcodebuild -license`` -3. It is best to install Anaconda. Download and install the `Anaconda Python 3.7 Mac installer `_. For older versions of MacOS, compatible version of Anaconda can be found in `this table `_ and downloaded `here `_. +3. It is best to install Anaconda. Download and install the `Anaconda Python 3.10 Mac installer `_. For older versions of MacOS, compatible version of Anaconda can be found in `this table `_ and downloaded `here `_. 4. We recommend using a virtual environment in Conda. a. In Conda command prompt: ``conda create -n myenv python=3.10`` @@ -81,7 +82,6 @@ Mac 5. Upgrade your pip: ``python -m pip install --upgrade pip`` 6. Run: ``pip install explorepy``, to install ``explorepy`` from PyPI. -7. Run: ``brew install blueutil``, to install blueutil for bluetooth communication 7. Connect your Explore device from Mac Bluetooth menu and run your Python script. Quick test @@ -95,75 +95,19 @@ Quick test Troubleshooting --------------- -**1. Pylsl import issue** - -:: - - self._handle = _dlopen(self._name, mode) - OSError: [WinError 126] The specified module could not be found - - -Solution: Install an older version of Pylsl. To do this, run: :: - - pip install pylsl==1.13.1 - -Alternatively, install `MS Visual C++ redistributable (vc_redist) `_. - --------------------- - - -**2. Anaconda asyncio events library raises "NotImplementedError" error in Windows** - -:: - - File "c:\users\jose\anaconda3\lib\site-packages\bokeh\server\server.py", line 407, in __init__ - http_server.add_sockets(sockets) - File "c:\users\jose\anaconda3\lib\site-packages\tornado\tcpserver.py", line 165, in add_sockets - self._handlers[sock.fileno()] = add_accept_handler( - File "c:\users\jose\anaconda3\lib\site-packages\tornado\netutil.py", line 279, in add_accept_handler - io_loop.add_handler(sock, accept_handler, IOLoop.READ) - File "c:\users\jose\anaconda3\lib\site-packages\tornado\platform\asyncio.py", line 100, in add_handler - self.asyncio_loop.add_reader(fd, self._handle_events, fd, IOLoop.READ) - File "c:\users\jose\anaconda3\lib\asyncio\events.py", line 501, in add_reader - raise NotImplementedError - -Solution: Downgrade your Anaconda distribution to version 3.6 or 3.7. - ---------------------- - -**3. No module named 'numpy'** - -:: - - ERROR: Command errored out with exit status 4294967295: - command: 'C:\Users\mh\Anaconda3\envs\test130_38\python.exe' -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\\Users\\mh_at\\AppData\\Local\\Temp\\pip-install-6fpsl7b1\\pyedflib_e1c2dcc3a4dc46af9468c24083cbda2b\\setup.py'"'"'; __file__='"'"'C:\\Users\\mh_at\\AppData\\Local\\Temp\\pip-install-6fpsl7b1\\pyedflib_e1c2dcc3a4dc46af9468c24083cbda2b\\setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base 'C:\Users\mh_at\AppData\Local\Temp\pip-pip-egg-info-48yn2fu3' - cwd: C:\Users\mh\AppData\Local\Temp\pip-install-6fpsl7b1\pyedflib_e1c2dcc3a4dc46af9468c24083cbda2b\ - Complete output (4 lines): - No module named 'numpy' - *** package "numpy" not found *** - pyEDFlib requires a version of NumPy, even for setup. - Please get it from http://numpy.scipy.org/ or install it through your package manager. - ---------------------------------------- - ERROR: Command errored out with exit status 4294967295: python setup.py egg_info Check the logs for full command output. - - -Solution: Install numpy separately using ``pip install numpy`` and then install ``explorepy``. - ---------------------- - -**4. OSError: A socket operation was attempted to an unreachable network.** +**1. OSError: A socket operation was attempted to an unreachable network.** Solution: Ensure that your Explore device is paired with your computer and try again. --------------------- -**5. ValueError: Error opening socket.** +**2. ValueError: Error opening socket.** Solution: Ensure the Bluetooth module of your computer's operating system is on and working. --------------------- -**6. OSError: The handle is invalid.** +**3. OSError: The handle is invalid.** Solution: Ensure the Bluetooth module of your computer's operating system is on and working. diff --git a/docs/logo.png b/docs/logo.png index 066b2f4bfa5971720f60df91294297d35279bc1d..5ad665cc4c3beb31ac9fb09dc7c885ffd65156a7 100644 GIT binary patch literal 170456 zcmeFacUV-{7B)VBf{I`g6GfUv4xkYgMCrv6#RCWy22d2nfFgo0(mO*;Bt}3zqZFk? z0hL2lq=QUi#Eb_PgHouC?|# z%ssZ%%1maK{45HEB7<-KaXW>gc$Pwu`e%kDc;|56NjLD%O#0@XJ`_qxH2kmF-NEve z;LQcT8|{5}cTBeJlc=DOf~+LZM8- zG6l;=2u#u8BQQRkPQmg4i;vExVEG7)52sVGe8A$Pvng0U0^`H!6f7UG_~>j3mXE;r za5@Fc2P{51n}X#dFg~14!SVr%kItrG`3Q^;r~j|P5?^UJ53Wv*=VctDr25T&E7kn| z?6m)0e0h@a)fVwD-~I0$%iq+*{(JG|iQ13MFW>y|&fE+5hZkR*F=qbH%^TJ)2R^Lg zi@_Ay`qeYPeD}Y1rk4F56d#>TdHW+U{yUu_`F~J+bTSp&AA#}T>6E1X2gQezDJB1a z#fP)01oi=o4`)+(`vVpq&Zf$h4_JISn<`g6VDaH>s$BVi#fP)0a^(XSAI|X3HAJEEe@WK(()1~ke~Af&GDUJxs7#Su6e?4lpD0xRPj-Hv%|9h+ zp8-QpBba*o&X=ldFdTNzcy)TbE(I~q_E80ue>Ey|IpCD!+=_umO^>m!0xwI zK^uzm1onGu_kfry*FXPWGuj=gM@8D256E+Ra+{$JCrb7#Q z?&+_b(1@7(2}B=W48~}+@2-T8esb?GaBe$d!+cUG0V%D|=e47WH-UQ#cE;J^64=);Pe?bqp`p0Nl9a5JMYV-e@xYai2vf$bQ z`O(@d{IKr7)h7l@M&J3=+-bNs$&<3QPIM8*2G{7r@%%{6k$@g4+c}wn9m!Ye@=|Sn zoT#ihwhIraZwfl>_d2P+@%G*i27GenaRjZ5PK(hpse0ST7vsctx6UC2SG?yp|7P*z znAP>3lF`)mq=k-U@DI5~91Ny8dTO?Ds9Nq)(cF_`eJ%a@{PUa^JHgM!eWvf60{a$b z1=#f@`-FRU{2<~2@GYwu=izg^G$-Ks9D_^A3A};5Y$@uc+~(=(P1&(UbCW{@22%LO zJ~hr3c9T3FOg}dhl||>)RF}99{Kh|3-k!w2zD)Pe>agtOSG)nS+Yt#q%6kkad4`wa zuwJ;1U$m+hgzdNKJH>gI1z=F5#M|^_j}N{LsTny|IN8I;C0gs@N33t0qeE=kZBJy@ zxT$LdJ+9kE4^+%)-B#&7H1;m3pPY336109UCI^@gR-YDY=(sZ2#OW=%>#d{)NCM}$F>n4FPQJ-6>IaW^u9NMKA6B_6}6@SGFfj zR8BhjIwl-#>l{5w-G6JxyMLbrux>Fvk!$5tKBLhrH>aHney za^G4ia39q=J7uf!^|uunM;J$VJ2+236pW7~^;aGr61@tFM;wA*al3Q03g<@FB|(ar zjWYm0e>ji7oTHFcd{^JJbkbGqN7X#*`&HF?S;3)xjsu09`74yBZMCzVPn~ZYVbmTv z@yvLVnJp0ISz@}?fd>XoxAapv-SsQPOYr%25xXi&%MR28-J5i*`Wd0sn$YSr@={OA zXwIH#^sKN8!4`h&23&#u%l79-9m=vM2c1@AIE%vQI(lm`a8^<<9c2j5HT zZ?ioy$)Za#gcBbDLT6`vIb~Z|m|ykdjg-;4o1A4?b~XBd{*%~D_YpdIQ?!;9;TjrisMLJR|!)tZY+`Sv*f3`gN*Qp2RAP!vaF^UWZoQnn>K8DErlpD&gl zWwNW13D6*`4yvyR3iqo9p7FSarabEt zesDle^pvy-AsK4-MjsyKyKw?++LxzDu!{EVdbe%B-KXZb-DKn)TqvCKYv<^dIoAu` z7V)zIjT)Wy1D!SGq~6uf+f#w6!7nFnR2K%j9ux{D*>2NLb?#nFk!3_=g_j36CH2>F zoWC3e-(eg=#TesY^x;hd+5Y0pIgUnBj3XVl`GuU7_w*;+CSB(_G^O67YPq4D>uGNX z`PmuH6g^9jNz;QtB7HpRjNK@gakt7l82Fui|h_zjr6CO|#)G;Y>gAsug z<(;D+lCHLGcE%pB6)AeH`#5*9;_vF8n3T2IDva@c*M6+?-wP+yt{x`%Az5B| zR!&Az6wj;(GQ9Nd5&d?~q)b;A<|(Oax#x#DK3VEiXRyRZ_l0D5A#`Kkq@d2-0Cj{B z<`w;#$B)YLvGWpRFu8U7VzMp4XS{t{V zG4uNQ;P8PAXyrQJJs@F^0mYd#{7no|_{Tk#u{6ne%jWNe&R|f_gMzU8rR8FVJp0}n}?Rhtr)K5&x7$r0;$=5mBjB2{a*neOi<&QgAZ64}+ zBgZBi#LY))!A)P_Y*Z5LI1tTopfD!dpL6o;s#djEcuXc1df7s;cnZWKGyFoZt)C0< z0{5a)mZMFj2PlCi<0rilxsU!=w3fiuxH#C#?=6sF*7E*H{&b(3hFoRQ5lD$ThMX7T z8GZN`fAq;Q%hn(`VbMq@Kgg%1%E1`qYf*=+1aiXQT{&l)Hv4y$eyM<*j7sgS2CC_r z|G{cS7ldZlF|BGl>dNezJ-`WidrkIKRs{d~Kb*i_gu;)jv%op@@W2jEK^BZ6x_4;B z+nan9OiMufn0djXZ#NTd(q?a+k`?`0EDpYZ7KiztYQk~oDbD-LVc_mw9=FDg;ph8 zpO3tAbHT*E9?w*h<(&qx5!W03dUjR1`rW-n;)^$7v&=95IxB-XI!j*s=&P&8@imFM z_ul-W;32QR#V4umo5G4a*_J=<`{7<R;q@tX{S)`bbApMfzhus1z(9?p8dw7u;JJHgACqE zEVSf=A9f!}Bob;$k$Lx&Yj<*@N^6LujS<58i` zJ^?~dFzGxla30!G^5Al|G;?e{krwPuVJs+9Vaqs2Pw*!l=8T5zC;3kf0z10cpz8caX+fej8l(k%>nCUqeGap$BYyU_d79XQEUN+gVqO%By@2FH) zEXaqj2)3Y5<~{RbhSthGZ!6y*+D6*496u@WQNC7TtpH1nK7~_gWi{q~^&~l2G&P!| zXtLc*O-|u$z*`esT%mmzjE&hR{LDm8!?Go{HU+>wuyZT5K{Y6h*aL`1ad;)btQR_u z?VQX}9@96#D#Id|w6f}ZiCK4eict>qS>xA3qF*;nW}yAGLIE^GHk-`d+{cznoJM)s zeH!!PPv)l_8j6XTR8A}ze25rQ6VhSkZbxcu=VXI6X1!n0(01wxysrpz4FC$Qkyxu< zdLa7s%1LEqiF*rFj;naeZ!oVdeZRn9 z`mXn9t?HhDNe3Yo9kBff?q$z>aAm{l;oXzMU4)Qhl#*mJ)z6(M{`(({!rG*m%HvEH z7Wp&YlRP1r47MQxF#U3%uC$FYSbVJ3_=U;Hs`GFc{J}|9vkk`&H<<@9h`K6$PUT_xpb^QNbe<*e=ea=oQ#l}CYHb4fx9IUH+*2?a!#9A9KLKb)7-#IL?O2dC z;RCgGf0rqd1W5GLWF%6|7Ltf+N3FH!I|jq=mA?%U?>iY&&tDcs63d({7?p7ty6#zx*2Fer$Hk`fG0TL@#YkJTkL19Te zZh@o{bx5UE%eBaWPb_jEd2+FMU!W!Vo)b*om{xV0UzDgpAbK`sBk|TKAj|aFskdOT zk~=N>E=)?E%ks{?y5M3O8Dy|0p{ouo69*;g$Zo<6>@Pi@EdO^FqIk&nAP?q{o_OCm z#M9fc*4`TfCP~X4zo2Xsl1V1xt;xI>Q0_f`??hx5u^O7n!RQAq;Dh{cN&X|O$HIFZ zB*D3t?zpl}^>FB9WXrxKB*Ci7WRJO!Yzb#?Fn2$g%sHL=pw=gV{Vyxx1g4(}#ES82 z$yGxUHo>>*v)+4VIY|;@mV_Oa2}&QzymkRLN5Of_VKTdnP6|mQOZEGaC{_*H2Wey3 zvKLQjn$)tr$g*V8K#kpv=L$er)9&o%OvahcZSSLV`3|b9+Q?d>07hry_5k&uS8~rS zCKZARp%4_AQ}>+aJ%^6eG>cLV`e`yp8hr(Im!)CD(PlQE;=$BIdA$4aWM<7lrJ`mK z)z60r5b|qn)}6`R&W(KZKDB*M9&{iY)Jl;y=#SQn(wfFz$UT<< zStwtF5@HrEAz!$WDzj7R-tQpzn+$SGCz^TE5O-7;nchtd?_nB`d~IeO-sy z`I@o9Lk*6hh7}Qp_Cv}UUaw$AT=jec=37RNPx#nqO<33;h)@X^g)F#dOEqMUc|s2K z=B((J1!L7*%|NZHLZL0N;Vi{h^a#-PKK>sD6?GB`rvU=&h3ci*kg6GPc<`GvV$g;P ziY?YRjmdESkH?{Ndp}sDG1!+$ZRXfEqNfY8$t`&+^%5!=m_Am7MVSiaj~!H{INnhK zwCK|#K^(aqv*G-To22lvq1)qH)5<}zV&IP-0{7obIR&cvFQUYP^yyMRf6@&HK=M^Pcu%4Z!lXQKW%3 zn_2c{xYB+=?b@;|au9fQRJliz!WdWu%Y2R70`hS^h&mb1-wiWAT_t#x?`FgYre&v- z!8-}vzXN~_D+KJO8mGfdpOF5LFvWLM0S{S82;^I4aEDj}XT{y}%CC{@Djp3ys-^%-wBJ{#}wD zz-YF7ES<&w4OrSJ9s=F`*+Kgq0Sq#fzgkcP;pzu6l;%=bp~e2Y30F|QvKCW0xtLu5 zT>hsA>)QpesfnvMR$*41y;9?6cy${2*!t@VD9tx5y0WKzk*MD>5 z_7~IUFG4_PY^UDBM(D(GSS%z|JVZQZm* zbalv57+d;IW3FJ?pC7D8$h(hiIInS&Bwi94*>M>ul};{6IzyqGD`)-1&NgE?YP}9@ zqux>l2BQKqVL4j9ZPO{<2oQJr5|V!nv+jf!`}APwqb&xHQkXHLh@=L{i)>^`QQa2m zi(FYsmPY{bafbN!0-93Fd4S?YHdLi#UJ=#~TQ|)Rryg1Gh5aw?V%89-BipD^>ZR93 z#KOzJV1<{zkK|v*iq(TGA*ZkrREcOB!rrZ?+|_+wpkRx3jqSzU)I8V1IXYWKT?yKJVF$y z=8j#~H2L>g0A$2^DrXSuvFaO!?iyBeLQLN87C=>krL97~Ixfo9NkT!sNEWFEg%Fou zp$d{>4qzoEA!CQIEbiP!H6(UFfz0{r@Db|IZ{#kEzD_))1-OhN)!QcISU2RD-`hX2 zTOxV|RO8g?hL91X78T6} zRNV0qSm)3sQuz$;FHw-G2*;A79TpS>$7bJfg=}E#EWb`FqruN_iddwk9a4@hJE$Sd zvE69k!zv_{1^ynWTct&i{8w0Q2VB6X2cr~;oyYHFnHswjCOVqL_;rMCr7@U`PN}uN z3agaQkC(S0C+Yu?d^Xsrerw6MUg{!PNHJJc=Nmj5-VH`o4U_Z~0X_N=7C(=nP^F9d?&68#T z!dWJZOd~2x*&9$WEfOXg_8fpa%h+@C)k;xd)t~_W9;QJrRsAX$OR|3^BVP{nbyEjQ zKp4KvA?vStK|%fOIDk~v9z4}EFD!(xK+}HJf-3diErY<(nj!J(K?g)s)M#am31A1z zAAYKMAwu3c^a?bPdv5nmsyg7krn{~PpeUn={q-57<5?FkNGXq>t>HhEu3KN@DQ!w( zEF&ss0}<+k-u%?y{1dQZ<%&@`1x!?;P;}VBwMx;Qsin0NYomQ9qR$}U3{Jk8NiUx(`N4jjJj(=MoK2rU!P@PYbj zF1mu4pbOwYv5%ThmhF3={8dJZ1@ z@Al0B-}QuanTq`n>Yw;xEETmNG<_S+P26+Kb_C_x07S9uhfI86cf^)EaA4ZOC`udH3oR(d_dFeTU;Kr^;60;U7FaC+O0e|rcZrD{nKs)D zsr(UTko~~uUmK_#cff*#D3Zj~MRYohhe&RvZKw_EBS&D~YScuD%0>y)FEkxbOOYEu z+&9phtiNnHFL0A{JQ}Q7JQ{Bx*OmL4QTH?h4bkuru|SF|(z|)-*|xbVU^Z?=KMdqL|r?z>rZ^KDrk~Au#>O9Ms5ay4@nWdf+>s z9W{5MQfq*^X0vxiIY_=|Lkm$rop3x0s@NHni<#u0YH1ey=(D470fZ%=LiO82So;C7 zSes@BqmyDwD>nqaahX25AFbfiag1aw*fwh0QRCG|n3xn??jH~A&;+*Jdh#u#gPI!( z>rY2g8uj6fn$FZhQ?@H}H%f%}P!Rdh7qL%4Yct5)Eq&D@stsB@@=wLPOPDS|ld`tJ z3k$jiHHNm)%7$|tPWs} zhg+#qOhr*)UK5LA?L7H57pr=R#=kxz04rmB_k<4!waU}Nd#8w8M)yYs-?ibK$5OWl zo1AF0>qql!-A=U&0F;<1ss>~=Ap&b}2YrY(?pO!Q1(m+7s9g9Rl&>&xKDVXjZ5EkU z=z~I>LN(cj(0eqO>vd2{^CfSQd>R;7&ktoIXj{O24}ux zE$(drr?sI*5zR(LVZ_&T9B;>obnBkK0G7&NmxVz z?>4Nq<-SJ|oAhoiHOv*-?3)cq{n^oIjOY|rb&_`xxSt}ISp^&d(on&3;HGE`>K=Gw z=F6U!C4e;$V`diFW8K#ezo7Zk9HDMEJtYl5;mW!!GSEX%b*@H|E3EpW@Ilz(vo;&2 z@UlRTpitZgyRaURZfJ@mzYgo^f*kqm7_5fTYPpq4C9Ks;Nmy2G>Z+P^qt_k+!;)+U z8%L}IinzCJ+P3hiRd zM6IC)`xtofxaBnOSG0mpt!1?eVag;o;NyDiNa&aZMii0=omXZgp8%lmTA=i0*P4i~ z{;;nccLb^lZbH3&0l{F%7?^^>3K)8sTt-wBim=pP23h(wbzmIp>4ugb3)EnzA?p;1 zs8o)U*xKXI@j(zgUmRIzgIMhks356`!t0ggk3M}3slkv5!NEOg;G6=I-;9C(f4DD( zQ?ihEHwoBje?*)H9S>aY$(2a(S2qDgqCIa-0rdQGM~~)*LT>n7DA8F4L+&T|nqn~! zOO{;#IXq_7sxO}g)fUc{O*)?Ar6CTkn}e#3)%vp|q!*KfPAm0hur3vWC3%8h#o$F_qzhv2M} zN^MuyZ-#33*^!+B|7xOqwkNB{J#LvZGVCe{`{~vg)w@+a|7-PYZOKzh|o5e zk}1*mf5lrL0#jRUIK`@^A_H7FIGuEi<2fT5sLYYM(HjUI#M*oaEFj<2jHw8T`T0>_ zi&lD>48u*5c@-!=Ppw3{9o@Jri(dvT_P<2d;G#8fHnRG;I#H1etA_nAk0Vr6ia|PL zpz0oP`m#g=7b)XkSjfcw}QmVYRV+rRY#tR;;s+k?*5iDye-fy%?)#8Z}jFMDVy1t z`@_U+G0Quzu~8^DpB;>QhgSoh=%kY?tosxY#5*ETSE>0mxPb)QlH^SC9WLO*b$oW{ zAU1i_^kAhW2qnI7wKI_b-fBI?`(2a(79eXSZ8-OEPo&xlPzjUo140|zDWY`!c9{0r zOdw4!f*#4=PaWvOCJ3hxU50gkofi~~ch+zmx-(oxPKF{-~zI>v)?3I?6`k}3+|m{*Pc)hqQZ|g zSnsDCxJU+X1MjHsoBibz{PR$KpS=#=^SOl@A+d2MA_~>zY9yfuZS5fW9DIBO%2c0D zdjA#-ne1Da2t_`Cl`%c=fZS0pKNzc)jeDqmu*|Ubu@Bqf>DC`jwGdtv3N*sd(`q#LQtsfkOcvu^krgsgEscE2BiPn z8K{EdLzB$SBVk#!2*kArHF||yX$u79EKgXtt^=*tW{5D$Qcgz#JmKTDxi1;U!Dq)> zBt`iKRf!;lLWlele{}C~JBqQyKrgB>;1ca=5y}~#4rLrh(!6XdwOB342jZ@A_Z{Mo zw)YaY5+J+<6?8|X8Aymf9V;h=SZ_x43n$uMfe>U&e|sGK19WucfdITJHw2}Yh$2G~ z#aQb*Ujnwj6j~&FP06mmL-OG>9dQ@Q8aCYZ_~O9Pz!bPkVuCWd^qV1E83Y#yv-2QY z8PkK^i7dpZPscJ|qh*HlXJYfAzJohRrn7IL4pnnQF_i=Nx1%COinZEOYe61QD20Of z`9VuU!**UK=d0_Z^ejCzA2CQeej-W4$YI~ZzYCA$=-8xpV0pg zkYD>cA&6_iCdE_q5CUbM3s4B!QNiZEE>RFwptaV3Eoj7CM)MO$g?vq2Th1Lo<^3-M zMF^0lCoIFbv!OvJP`QqHO!3tN&sJ#8rw$mydpuwjpB-|#Fb3%R7n%znzB!4N<{^hf z3V3$NmH6e$@fG$t<+exG%S`ygANuE1Qz7%QSZNw7*^+oVU;G#FVG{cd#Z^E_M zsFhkv@LK=dW4N3Hf^2~v!TVVhI%5c(r8b;3xWKap%r?#m6Eb12j11lqFpXtHrK;+S zYPv0tz%bJ*v<3|~R8*rE@IEnkU`P9;WPXTg0&gQS|5Joms}b9oux>7`ga`)SKFNdG z5)2HnMjKt4+eB_m_zFjk77jat#|N~6T;z^UfN~G`l0F{`0v!bFkqyU(S&<{cFA1_Y z^eL3y9ve<42uHX;qkENTofuw}MFPjDy|gFZi85F?ZNzi-jen}@(8wD?gfLvV$;HTo zMWM)o<|0xPqZV*8A8lnA-I!knNfUS*keu~Pa}v6V`YA#{IsyFC;>xhqeYMxf07Y!pZx=y}tV z&1ZOzA$7Rv$_tJ@?Lk>YFSFQ&!vUUDDHN3)EK%n%FNYjdA3?Vq>E@}OvS0%4X;8a^ zo{r{0^1s7#5$>POdl8i-76Gf-Ywm%yurkBYy+6i716!&Tn0(WIQNf*{12sXzmYN(d z?6p~L?}8Bcmj;rsVxZg68>vd>-ew|7D9uAKvhA;?;n&k340;)PV85mq@igfHB++lp ziM*YnczX>BF6|V_UrWq^`>T{o1Eq*D{=5O|KpznKQ+nvZ!Os?HiS7-=@i!A$AS@`1 zho~~rRJsMis*K7RQVa4EWoQ^OG>Lqi%DVvtnzi6PI7%T-R3)JE2So1t-9;i2_bL`^ zKuz4Gff#HK>frO8YpwbOz|0j?KQ}^TG29RD*fBO{g76E!2%}yvZ4?wymypoa+%^Ub zj)}$e;eE=_j|5Z*Y1}*Xev>HaK|6{}J@-74Yybv$fWJ^6P>=Z8P*y06PMTJVkpPrT zfH^cX6I5NWayBu;lOS#O2lRcV+6()E2)LagLeTa`OXvWa!0FBaZJmAwSPT#555BRq@OMIC6Xdg zG)gf;|3K7V7J(l7WZizZm0Fn(ro9>c>Pu+dVIjpRHAvzC1puO#4gS0XUV51wE)c{H zPjs~eJlel6Ebn!vq0-R>a>4Op>9dv`TD&o1x|rCyZ#DkVTVnsy)4z{yn)^-6^wDGN zW5Lg^=weG29a^$MO3P;Yonu;!KdoHydtj>RptkE#HrRHEYuk}qyK5-8btuSHX1=Dz zVEAC`kTp?lLF{3G9tXpTN&Ztu_qm@AK09hfP*!FNPJ+{Gx98bOZH5EX{`O(sC1X#f z9|pgZL7DU##Og7{)k|?AeXp-(ewg1cU}QSA??(OO;w%+#j^T5EGUmSG&%ougFrP?Q zn*eZeHx8C)+p-9J^T8>XV80{id(LNE4ie~Nye_|gTnCKZlJ1*iwisSSqUQKa@Q?ha zmASG)GjmCFf^E6HgHdZ^wz*Eucy7WTrSEZKwIy*^qJDaPXJxMRU5S?zcX6M{oxZpB z`oxU}AM9yZ;Vz$FKWp6JPWb5Yeb>ij=n*}grj)AgurSl!JFRbTu5!wIHR>c@<&o1; zJS(CT%=*J=m*uoD<FsQ7i0BG? z=TPQ+-zoo%{hN4JZDi^|>%`8U(Nqaj$?)b~AvC{<>#A@)N0zgF%lbKmk$!O_!8P7a zD@XeaU)3Cnw^y+DerAv?_=`czL7+Gk&TV~hHC%d3d02_Qu%)z{$cuOovZrsr zYiDrls1NrN%i6)cYFAT)B)BZGdO>i*-1Zg4FZ18D7QJY5>T4y$OtfF+u34cKmC^1n z(XCwk-EOCf_>7@KvDI;{Lq%hy^L2&m4W>qdi>cWWrM}>Y zoNm;OHpOMXXmjv3D(yPlzPjwW)vJ_3`@R99EuzUQ-n4bMx9JnFj@V^A-C^$(xOSBd z3y12hgF7$f6sG2mw_Snmb))JX*bXe*pvu-^t>Y*`V{Mx_95Hy3K679gGc2wbWXqmP z*V4-{SPKSxh3%AR{I+pgW5rO}()DK=3-Y)1_zhyNTVDKmE2T5M?V_cM@X6xnJh_GwQqZ#!t$Xqv6j*ikE(>{F^hZd|Ptx3N8euPg zTIG6FBch^oSL(o!N!!Fs3)5Q@o;?F8`>s!%8Y+M^s%z9osNQ&)@u=+&6=(rx4^;_7 z7KWdtU!vq?gZSl~a&e;F;>!Y@!%w=X<$sqyu*!W|S&XdCUPYa2@>|_0Pu|pT;LAwv z@>luQi_*r=nE*h#{cH%#l5_+VNNqS&Tj%_6q_SbJiE^@ez}-srjj^+%%;pWcfqiX} zUg7}{lmfzw3+vSk5QNukh{BFsC6AVnmY*{=V7eC-F#SS}d{d1DMWuhLy!#6qdLUyu z@_nx{*Ys6QWPCQ9?(okBFfax(u^k;X#V-rqD0(>4w99;A?%BWYt=^_xUR)HI?v&ut z6uGYL`Je5M6Ro>OM}FLBPGB+@FrQZfSBI<0_v-#6I_F*7lAh_?V5B4NANHG*PXwV_ zyCswgOdC3Rvw%bznR9jF!xjo8D=zP;j*Vp1KlUOwU~X%Y zwnIc$Clb>Fzs;YUFJTci=&_}^qyBVRS!D5EukNcqr@k{`7kB7b55HWM2WRo^`v%PN zb_22Im87}gT65>iGkd~34O(80hH@D%!u`Dnult7{`Ki;F(cRs<)tTp(z*%povH{gB zy_@nHmRTxnDzFc3EnggA={=|NPxU($;nKsK+`F&i2TlVMSBnvrX$o}(VaBxl^} zj#@r?q*d#MZse1=odMVC1<75Tp&9%D*|T6woo0}-X1T$7@J`(i4$ZsVIbVZQ5UaXU zdSb&{{eHu8e#aCjW_D1~x14T$T~p(GPND13Xs{VA=XUPbYnT}m%E}mfC8NCKs8~x~ z$h%$c-Q)OjaOty)@QV+Xq`Jk7a)-+1nn)X`?0@*KAguYS*PtZ5x$JJ)mBPX2>{=$A zZu|_!vh{5z4F?_LXX_-|*?RWtW ziekFx|vPHm(`(nP2C5XJQdMucM~)x@_nXL38H{uIVoKh_iRW z%G0lyUtN)}n?FCFA!yAiv`9O8Yj@e`v?2SKm8PmA0cGcz7AeUkz_hHNO%P5BCcA-` z)6buD`Jwk`7+)Bk^@0@U%DVI*69D7tKr8Y6AUhFQOcbW@(D;|CkRCr>+L5{?IoW=% zbS~QG-wgqOhpld*yR}57B&~4p3A}bXm2gqcpOe3^MXM&4m0frFL1B=W(iL6|)+U+j zw7;eMVjgtGrj1^g*|{v|$mE>{%`X1?;;TJ=(5xz!bsChy1?LsQy$xIZ;vFKr3hR{< zkZaveV@(v?1@6T3oI(W{P5ZD!@ub}?AWvU2Ans-;EGbpDkh1W!mCtysBN4dUYx(Q7UfQ`1 zj0lNb2~Qst7o4zJ&X)8&qB?X*VMXcOmWx~Y))qRQ!Tvp?PHLr+B^QdXx9)OZ;|6D3 z9UiW@5+9wO8jpS>0n%#R@>Bn8w({hd{t85h7R|9gJ^jq-7^vHM@6N}pNxTGUF zJLEIiI?|1W#VJ>K_pr7M1%n`k%Kp6i$HuC^0-@kxJC6$ro=S8aweYlaNdGQjz3%C7 zSK9Y$iByU%<#^bV}gI==lxru>r&=>*zD`sjx(< zyS@49*Db6RRd=aH8QVzB?;5WZr!{x!W+-F0!Rmk>shfm{5d%$qs8LVWyw zv2`NcSmIn-S#6X5jpq;773t6ey~M_ru+R8zP+#ejW|wJ2sO;RYy+7ybAyVQ|KuU^B z1Aj(N+!F_Pue{ikkJ^Y|Jb&XkRu)nkj|mF=+=2=^#-lX=y@8a=G|z5sbOJ}6ngGG@E!ldHukR{;f0r+c0^>?xZGBjNa2BY?UGVI&{8ioPU& zj%HfX=B&M8+}~P%&KN4#BfI;-uF=}7s~|pSDMD3YSzMLK_wtK^Uf_89x#v(}bbw-m za|L&NvTJlF6qa9pMTNl}RrY??xbIMHw^^~))oY90#UffAC{-5T+Aa6l?vV<++=py$ z;&m#GGxRPRtXItyQ(Uc2BRtj@i#2@DVlqlI)}7s~@Ia<0L~K`Jf1OsDS# z;3`xJkH70i8wbVwr(KNOA(zoh2D zu)}zGk(bzUMt{d(>F9>N=fGOAn8YJ$Ksr{>cASweRM>;yA%0NxfcHA~i>ZtEtOj^cO0Z4+ATss}P}%H&FN3;iRgNq~MDxbk$x z7KaeA9S4uwxWu;xujzHdSEK_{;UIa`Ay=rVuxHb(X%S^&>e7s+jBWDMeL8a6l$uA! zt#QFcg;4M1^nLE#DWo2-)NL`=G%ZlvA_}qp>#t~|tp-;BFwEv3b$z|H=*$MNkh-gc zhjbFfNG8ztaI9KGQKjDxEr*|Hu%@#%0x>xg2a&5gNJqVf!omY6|z1eFyV2ih z@MIl3qDnn9E8p46c>W@GapbZP_rvbpxBPhtG-0we&$>LT_4D~P3^Qy5}?2d>La zRal-K5d_jag{={%Pn(+yx*;&x_G396%Fp)LC@sd95iXLIF|A;X+73dWm0I9i!rN51 zQGS~bBP}>fwN$1=uH>s>bNBAZ+rTL{D(o_i7KVG?Gew!$!dEHp^p%IHL_eb-a-%2z z2RN@Ewlh^Ae|w#;gjGe{g?0H`yo^%?kMA_>Gzjb?>mRRN_8d%={z5fT+$dJySR~Pr zJEtt_%G(xs7Bg6y3sh)-$4G-xPN69$9enRtoXbM)bl)LXtwznZiLFwlKE#x;zkhqn>d z5(~X@!YXwvAbwRASC_SnbTB)Pp0mtcPE=zotIC1J+(^txtVU|Zft(iV0w87S56-wO z=Prs%i8y5MfW&QT+9X>i8UC*C+e zVVeW!hzA(11NA-3-P4n#b~o-SzXW3-hrrH>ue=Z<>+5+q_UH{8E~7O#fas4rA$}Yb zKteBK&A&knI?{bwSj0Gc`}r~8!ZRPO<_57GemBHA))5|ax}4zJk6IHljOUC?Vj&Vh zY|^#PNdhhG!LQC37N{(Uw)6#Y3vvn#p`d(2!TqN>ngtjcX6Tuv?epOlva*1a#};y%L1E)w z06i5Wue$_nkktKQ@b$uPPl0zNn>c_c@00B9L%^eY>F1`WYN{H4Uov{9qG?b?sL2D@^qtov57OpEHn zZJObnZi-l$ z?vuXmsw&-p9!%stOb!XlEgVd)1Io2&s~7EU=c`zECCyCp9Srrs`UusLHdd5_yXob7 zfGou7AB>j9f#tFAZ)kgkMTA!A1!3lVq-&Kadoq2Wk&-=XTVyU`{mhD)C3A;Y(HF}m zp01x3JKbbvs3Cil7~9$7xD|=G05_S{EM7s0vLvf=q{dWx3$Y1pc3KwNlgcUc9mM+_ zxldT_ki z?tPGuA=5xg_Q!Rs`og)J%3Mv7FP#s+`hD*%(C3>FF6;c@R#y7c_G561MDoFP#+;*2 z*p77f3FB{jo8BU}4(Pic739M;%EVz03B^R7BG;BnWzD;}b9>b;g+LSfQo1|QpxQ)U z+f1Z?O}Mmy?039Fa-H>ZE5i1sC5YU6xJjZ*&ogDyrnn*OFD2){v3h6M$9FOG$TN~&C=V7aAw|JA^_jI zjO|>;c6wlZ?(izj96dZ(?_uO~#zs8XyieoA9LW1E->!TM5OVt}*#>P%xLJnZ-!;1F zeZ+Z9lPbsg68Ip+KM!s_9{HZVAFrWYmkgbyH!bzSN!y$Ctj@?M%+RH5El+Y0UibIr ztBct2jN=S-+o8?QtEcPDD$!t1#|JZIAv504@OrDOn(W18F@HEoc~BixW1^Qw+KCkp z98FO?^LI=mu;{1_(ZZ~lJFM30R_4A$+dV7&lxB<|<-rMY@C!)V?6GHnrJz3Pz^$eW zD2@_$R{;Dt&lwRHLrk8j;$zwxknFolkHO6`Npp~>cL;Y^W7sd=Z)9EXPr}?mzb79g zTM1-m&a!0iCrM{LS-b_Ti#K=H{UJ@K^lHUg(rg-E%5|vuG8DRN}atF z&z(L`;*xmhcdmGv#|Ex1w;pR((>Gwh;e%ZT$&Eb=Vw@T0A_K%b=d0t+g$sIh%4%QM zZocaIo_$=QE}nIzxZ9#qT%Ng%lmIqhc$n)RZUQJ)(w4Cwvkt>eyG&En#4|h>?lKlw zJR=j3XX`HihdC?N^o@?yg0kq^?}W!W-VW9o)_IO`9i~UIKg~bkEyeU{l+IaYD>te*5ONbbyc=`fZ;+QT+FjtC`RO=iMrz9-qcZ!sFDrmh%2+Zd=DAD;L_)FCwL;74g z)-tgpW1II3`cA?cJKV1iDIl)ev@cOi-Brx+J9RwRWk;m?!#xqD+U#Y--KEGeH#VRnTR!F5t-(68dy!l5*(ov>4g;#(NW&yrtrecXt%4@rS;MS5M=`(c{0++U2d1}b? z*sTPScheLWjuI+tD^`kdx3rq4kW<+6UdZ3p{fw0ZcgY*$Ki}{K75FN`Bc2!LE1_0P z(OF_eY-$SS9%AVRD=gE~1fuW)OHARZvJSD1M|RxAw`WkyBy`n-%!mOJ>RkHXQ!cxR zH0JIZyUldDE-}wE@GMs!ZqKXSstQ&1OAhSjcm2SAiI2;dC=64$1v+)Kv*L=fyTQZ! z*e$ihT}rC>_A|b*QrFD`QlDIVhPkb}N3ojjY0($Z+5mh8Hh_ zyY|iRTnu_au$Nj{KO0E~tGITS$Y%0RLtaK2|qwa@r-H5AQW>t1pk} zc4jHDoWy07PaVCb%rc8~U?#=6_`^tGE@jJth9xR8=D1I~xx08CMPS+Y7V{Bi0vSoE zEnu(FZ4s6zmb6t^`Q6REEW8CVP&k*kn;Cm@wKq&a7+x5x;F~P10V%0A*#`lUKHNuR!ZHzeI=qz%c?8C1>UEi|Rr1=n}p9 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 OW3cgc@dcnq<`C(O@5Bu0irs=gvg(#5E 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�sqfQ zmH%7ue*ph*Alv{Kf_}ekKXm^sB&z4&-a>wU4x%jR`CLRH{oktR3%WfgyB2)-oMc(Z z;mt*s1>K&DDhoNhxu~*`!<&mL{|}`cuGAUI;v`tf^*2sdQp1lqeSR(2kdfi0-iYzIZ$Jr~ePk C^Ip#Y literal 11300 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 diff --git a/installer/windows/README.md b/installer/windows/README.md index 285a662b..8b9561a2 100644 --- a/installer/windows/README.md +++ b/installer/windows/README.md @@ -26,7 +26,7 @@ Tested versions in (brackets). - [NSIS - the Nullsoft Scriptable Install System](https://nsis.sourceforge.io/) (3.06.1) - [Microsoft Build Tools for Visual Studio 2019](https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=BuildTools&rel=16) - - A local python installation with virtual env support (3.7.7) + - A local python installation with virtual env support (3.10) #### Python wheels diff --git a/setup.py b/setup.py index 7c5ba1b1..d28f6e4a 100644 --- a/setup.py +++ b/setup.py @@ -114,6 +114,7 @@ def read(*names, **kwargs): 'Programming Language :: Python', 'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.11', + 'Programming Language :: Python :: 3.12', 'Topic :: Education', 'Topic :: Scientific/Engineering :: Medical Science Apps.', 'Topic :: Scientific/Engineering :: Visualization' From 9432230bdfefe9662732746e371ab8a22211e635 Mon Sep 17 00:00:00 2001 From: Mark Date: Thu, 23 May 2024 16:55:31 +0200 Subject: [PATCH 69/78] added some support --- src/explorepy/command.py | 8 ++++++++ src/explorepy/explore.py | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/explorepy/command.py b/src/explorepy/command.py index bb2ea67b..6096dc88 100644 --- a/src/explorepy/command.py +++ b/src/explorepy/command.py @@ -215,6 +215,14 @@ def __init__(self, sps_rate): self.param = b'\x02' elif sps_rate == 1000: self.param = b'\x03' + elif sps_rate == 2000: + self.param = b'\x04' + elif sps_rate == 4000: + self.param = b'\x05' + elif sps_rate == 8000: + self.param = b'\x06' + elif sps_rate == 16000: + self.param = b'\x07' else: raise ValueError("Invalid input") diff --git a/src/explorepy/explore.py b/src/explorepy/explore.py index 72eb4c03..cfa6ea84 100644 --- a/src/explorepy/explore.py +++ b/src/explorepy/explore.py @@ -416,8 +416,8 @@ def set_sampling_rate(self, sampling_rate): bool: True for success, False otherwise """ self._check_connection() - if sampling_rate not in [250, 500, 1000]: - raise ValueError("Sampling rate must be 250, 500 or 1000.") + if sampling_rate not in [250, 500, 1000, 2000, 4000, 8000, 16000]: + raise ValueError("Sampling rate must be 250, 500, 2000, 4000, 8000 or 16000.") cmd = SetSPS(sampling_rate) if self.stream_processor.configure_device(cmd): SettingsManager(self.device_name).set_sampling_rate(sampling_rate) From f6330b6f3c97e3538cf0f4d36f0a2781759e360e Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Fri, 7 Jun 2024 16:26:09 +0200 Subject: [PATCH 70/78] add ble device info --- src/explorepy/packet.py | 22 +++++++++++++++++++++- src/explorepy/parser.py | 1 - src/explorepy/stream_processor.py | 3 +-- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/explorepy/packet.py b/src/explorepy/packet.py index 5528086c..d2398706 100644 --- a/src/explorepy/packet.py +++ b/src/explorepy/packet.py @@ -21,6 +21,8 @@ class PACKET_ID(IntEnum): ENV = 19 TS = 27 DISCONNECT = 111 + # Info packet from BLE devices, applies to Explore Pro + INFO_BLE = 98 # New info packet containing memory and board ID: this applies to all Explore+ systems INFO_V2 = 97 INFO = 99 @@ -216,11 +218,12 @@ class EEG_BLE(EEG): def __init__(self, timestamp, payload, time_offset=0): self.byteorder_data = 'big' self.channel_order = [7, 6, 5, 4, 3, 2, 1, 0, 15, 14, 13, 12, 11, 10, 9, 8, 23, 22, 21, 20, 19, 18, 17, 16, - 31, 30, 29, 28, 27, 26, 25, 24] + 31, 30, 29, 28, 27, 26, 25, 24] super().__init__(timestamp, payload, time_offset, v_ref=2.4, n_packet=1) data_length = len(self.data) self.data = self.data[self.channel_order[:data_length]] + class EEG98_BLE(EEG_BLE): """EEG packet for 8 channel device""" @@ -555,6 +558,22 @@ def get_info(self): return as_dict +class DeviceInfoBLE(DeviceInfoV2): + def _convert(self, bin_data): + super()._convert(bin_data) + self.sps_info = bin(bin_data[21]) + self.max_online_sps = 250 * pow(2, 6 - int(self.sps_info[4:], 2)) + + self.max_offline_sps = 250 * pow(2, 6 - int(self.sps_info[:4], 2)) + print('max online and offline sps {} and {}'.format(self.max_online_sps, self.max_offline_sps)) + + def get_info(self): + as_dict = super().get_info() + as_dict['max_online_sps'] = self.max_online_sps + as_dict['max_offline_sps'] = self.max_offline_sps + return as_dict + + class CommandRCV(Packet): """Command Status packet""" @@ -635,6 +654,7 @@ def populate_packet_with_data(self, ble_packet_list): PACKET_ID.DISCONNECT: Disconnect, PACKET_ID.INFO: DeviceInfo, PACKET_ID.INFO_V2: DeviceInfoV2, + PACKET_ID.INFO_BLE: DeviceInfoBLE, PACKET_ID.EEG94: EEG94, PACKET_ID.EEG98: EEG98, PACKET_ID.EEG99: EEG99, diff --git a/src/explorepy/parser.py b/src/explorepy/parser.py index 2227a185..34ff2647 100644 --- a/src/explorepy/parser.py +++ b/src/explorepy/parser.py @@ -91,7 +91,6 @@ def read_device_info(self, filename): while True: packet = self._generate_packet() if isinstance(packet, DeviceInfo): - print('packet is {}'.format(packet.__str__())) self.callback(packet=packet) break except (IOError, ValueError, FletcherError) as error: diff --git a/src/explorepy/stream_processor.py b/src/explorepy/stream_processor.py index acd0a095..a1a25615 100644 --- a/src/explorepy/stream_processor.py +++ b/src/explorepy/stream_processor.py @@ -24,7 +24,6 @@ CommandRCV, CommandStatus, DeviceInfo, - DeviceInfoV2, Environment, EventMarker, ExternalMarker, @@ -168,7 +167,7 @@ def process(self, packet): self.dispatch(topic=TOPICS.filtered_ExG, packet=packet) self.dispatch(topic=TOPICS.filtered_ExG, packet=packet) - elif isinstance(packet, DeviceInfo) or isinstance(packet, DeviceInfoV2): + elif isinstance(packet, DeviceInfo): self.old_device_info = self.device_info.copy() self.device_info.update(packet.get_info()) if self.is_bt_streaming: From 3d8da12926624b142460729c63e748852e3f718d Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Mon, 10 Jun 2024 12:20:31 +0200 Subject: [PATCH 71/78] support old device channel count in imp --- src/explorepy/tools.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/explorepy/tools.py b/src/explorepy/tools.py index ce091bd4..d04f405f 100644 --- a/src/explorepy/tools.py +++ b/src/explorepy/tools.py @@ -710,8 +710,9 @@ def _add_filters(self): settings_manager.load_current_settings() n_chan = settings_manager.settings_dict[settings_manager.channel_count_key] # Temporary fix for 16/32 channel filters - if n_chan >= 16: - n_chan = 32 + if not is_ble_device(): + if n_chan >= 16: + n_chan = 32 self._filters['notch'] = ExGFilter(cutoff_freq=self._notch_freq, filter_type='notch', s_rate=self._device_info['sampling_rate'], From 0c9f2797d2c00a4331c1b6f8a85291d501236ae8 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Tue, 11 Jun 2024 13:07:43 +0200 Subject: [PATCH 72/78] multiple connection attempt for mac --- src/explorepy/serial_client.py | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/explorepy/serial_client.py b/src/explorepy/serial_client.py index ee4b6f73..9f479f09 100644 --- a/src/explorepy/serial_client.py +++ b/src/explorepy/serial_client.py @@ -6,7 +6,7 @@ import serial -from explorepy import settings_manager +from explorepy import settings_manager, exploresdk from explorepy._exceptions import DeviceNotFoundError @@ -37,10 +37,10 @@ def connect(self): if self.mac_address is None: self._find_mac_address() config_manager.set_mac_address(self.mac_address) - + result = exploresdk.BTSerialPortBinding.Create(self.mac_address, 5).Connect() + print('result is {}'.format(result)) for _ in range(5): try: - self.connect_bluetooth_device() self.bt_serial_port_manager = serial.Serial('/dev/tty.' + self.device_name, 9600, timeout=5) print('/dev/tty.' + self.device_name) self.is_connected = True @@ -53,7 +53,6 @@ def connect(self): logger.debug('trying to connect again as tty port is not visible yet') logger.warning("Could not connect; Retrying in 2s...") time.sleep(2) - return -1 self.is_connected = False raise DeviceNotFoundError( @@ -112,10 +111,3 @@ def send(self, data): @staticmethod def _check_mac_address(device_name, mac_address): return (device_name[-4:-2] == mac_address[-5:-3]) and (device_name[-2:] == mac_address[-2:]) - - def connect_bluetooth_device(self): - try: - subprocess.run(["/opt/homebrew/bin/blueutil", '--connect', self.mac_address], check=True) - print(f"Attempted to connect to the device with address: {self.mac_address}") - except subprocess.CalledProcessError as e: - print(f"Failed to connect to the device: {e}") From c84adb7eb271a60e8d193b82da6cc4cd636dce94 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Tue, 11 Jun 2024 18:09:56 +0200 Subject: [PATCH 73/78] bugfix for offline sps binary --- src/explorepy/stream_processor.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/explorepy/stream_processor.py b/src/explorepy/stream_processor.py index a1a25615..a1062e93 100644 --- a/src/explorepy/stream_processor.py +++ b/src/explorepy/stream_processor.py @@ -397,9 +397,9 @@ def reset_timer(self): def reset_bt_duration(self): self.last_bt_drop_duration = None - def fill_mising_packet(self, packet): + def fill_missing_packet(self, packet): timestamps = np.array([]) - if self._last_packet_timestamp != 0: + if self._last_packet_timestamp != 0 and self.parser.mode == 'device': sps = np.round(1/ self.device_info['sampling_rate'], 3) time_diff = np.round(packet.timestamp - self._last_packet_timestamp, 3) if time_diff > sps: From 24a0b238c31014b0ed2b984d1d3eb46c26c756a3 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Tue, 11 Jun 2024 18:48:02 +0200 Subject: [PATCH 74/78] fix typo --- src/explorepy/stream_processor.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/explorepy/stream_processor.py b/src/explorepy/stream_processor.py index a1062e93..7d16ce45 100644 --- a/src/explorepy/stream_processor.py +++ b/src/explorepy/stream_processor.py @@ -148,9 +148,8 @@ def process(self, packet): self.dispatch(topic=TOPICS.mapped_orn, packet=packet) elif isinstance(packet, EEG): self.last_exg_packet_timestamp = get_local_time() - missing_timestamps = self.fill_mising_packet(packet) + missing_timestamps = self.fill_missing_packet(packet) self._update_last_time_point(packet, received_time) - self.dispatch(topic=TOPICS.raw_ExG, packet=packet) if self._is_imp_mode and self.imp_calculator: packet_imp = self.imp_calculator.measure_imp(packet=copy.deepcopy(packet)) From c15ffd14424e36c1db3703eed0846d23a05de8f4 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Wed, 12 Jun 2024 12:37:03 +0200 Subject: [PATCH 75/78] update byte resolution for online and offline sps --- src/explorepy/packet.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/explorepy/packet.py b/src/explorepy/packet.py index d2398706..c77ed572 100644 --- a/src/explorepy/packet.py +++ b/src/explorepy/packet.py @@ -561,11 +561,12 @@ def get_info(self): class DeviceInfoBLE(DeviceInfoV2): def _convert(self, bin_data): super()._convert(bin_data) - self.sps_info = bin(bin_data[21]) + # basic binary conversion shows up binary number with leading zeroes cut off + # here we format the raw byte to full 8 bits + # https://stackoverflow.com/questions/10411085/converting-integer-to-binary-in-python + self.sps_info = '{0:08b}'.format(bin_data[21]) self.max_online_sps = 250 * pow(2, 6 - int(self.sps_info[4:], 2)) - self.max_offline_sps = 250 * pow(2, 6 - int(self.sps_info[:4], 2)) - print('max online and offline sps {} and {}'.format(self.max_online_sps, self.max_offline_sps)) def get_info(self): as_dict = super().get_info() From 0ecc2ec34a43246246ceea1f5583f39b34e99cd8 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Wed, 12 Jun 2024 16:38:43 +0200 Subject: [PATCH 76/78] set right channel count with backward compatibility for filters --- src/explorepy/stream_processor.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/explorepy/stream_processor.py b/src/explorepy/stream_processor.py index 7d16ce45..5aaf4b96 100644 --- a/src/explorepy/stream_processor.py +++ b/src/explorepy/stream_processor.py @@ -240,7 +240,8 @@ def add_filter(self, cutoff_freq, filter_type): settings_manager = SettingsManager(self.device_info["device_name"]) settings_manager.load_current_settings() n_chan = settings_manager.settings_dict[settings_manager.channel_count_key] - n_chan = 32 if n_chan == 16 else n_chan + if not is_ble_device() and n_chan == 16: + n_chan = 32 self.filters.append(ExGFilter(cutoff_freq=cutoff_freq, filter_type=filter_type, From 0ccff7b4ab94e10f55709d41c02325311a070a92 Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Fri, 14 Jun 2024 12:32:54 +0200 Subject: [PATCH 77/78] generate lib based on mac cpu arch --- lib/mac/create_shared_lib.sh | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/lib/mac/create_shared_lib.sh b/lib/mac/create_shared_lib.sh index bd96f7e1..951a8dd6 100755 --- a/lib/mac/create_shared_lib.sh +++ b/lib/mac/create_shared_lib.sh @@ -27,10 +27,10 @@ #ln -s -f /usr/local/bin/python3.7 /usr/local/bin/python #python can be found at: #/Library/Frameworks/Python.framework/Versions/3.7/ -#For Sonoma OS: +#For Sonoma OS: #/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.9/Headers swig -python -c++ -py3 -extranative -threads -debug-classes swig_interface.i -# for windows: use the -threads option +# for windows: use the -threads option #swig -python -c++ -py3 -extranative -debug-classes swig_interface.i c++ -c -fpic swig_interface_wrap.cxx -I/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.9/Headers -ObjC++ -std=c++11 @@ -44,6 +44,23 @@ c++ -c -fpic -std=c++11 DeviceINQ.mm -I/Library/Developer/CommandLineTools/Libra gcc -c -fpic pipe.c -I/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.9/Headers -c++ -shared -flat_namespace -arch arm64 -undefined suppress BTSerialPortBinding.o DeviceINQ.o BluetoothDeviceResources.o BluetoothWorker.o pipe.o swig_interface_wrap.o -std=c++11 -framework foundation -framework IOBluetooth -o _exploresdk.so +# Get the architecture +architecture=$(arch) + +# Base command +base_command="c++ -shared -flat_namespace" + +# Add architecture-specific flag if architecture is arm64 +if [ "$architecture" == "arm64" ]; then + arch_flag="-arch arm64" +else + arch_flag="" +fi + +# Complete command with other flags and files +complete_command="$base_command $arch_flag -undefined suppress BTSerialPortBinding.o DeviceINQ.o BluetoothDeviceResources.o BluetoothWorker.o pipe.o swig_interface_wrap.o -std=c++11 -framework foundation -framework IOBluetooth -o _exploresdk.so" + +# Execute the complete command +$complete_command rm -rf *.o From e842b7aba3003e5d728beca7cf649c11a8b09efd Mon Sep 17 00:00:00 2001 From: Salman Rahman Date: Fri, 14 Jun 2024 15:57:27 +0200 Subject: [PATCH 78/78] detect ble board from binary data --- src/explorepy/explore.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/explorepy/explore.py b/src/explorepy/explore.py index cfa6ea84..2447c8cb 100644 --- a/src/explorepy/explore.py +++ b/src/explorepy/explore.py @@ -290,8 +290,7 @@ def device_info_callback(packet): new_device_info = packet.get_info() # TODO add 16 channel board id and refactor # setting correct device interface - if 'board_id' not in new_device_info or new_device_info['board_id'] != 'PCB_304_801p2_X' or new_device_info[ - 'board_id'] != 'PCB_303_801E_XXX' or new_device_info['board_id'] != 'PCB_304_891p2_X': + if 'max_online_sps' not in new_device_info: logger.debug('setting bt interface to sdk') explorepy.set_bt_interface('sdk') if not self.stream_processor.compare_device_info(new_device_info):

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%0DY;Han$^V`71Q|`< z(*MAs0u79`W_8tjPWXZ*m%!jciZr!Ir{bFNd`Ws7aNCo0Rq29bG!^~JS#mK%S75q! z>PJ*H(0M@iB>&5ctKJ-Hz?ry2%W2f3{x`0Mbc?bdsj&T!3&uZQy`3L@%f>h$S< zila#X7~B8>P^0?21*wlxF`~a*yn7eVlKBEg6||W~dDty_I!?y@*$tYIlU^DFQBZF2 z52$uSF;)6RfQy%)`a($?&oD&4hwJx~`0NW@6QAI-@f6oO(tZg+=$}jo9*lZ}0WKiY z%qF=FSO^ZI*IY0^ajP&Zu4%vx~nA)kgp5+MT*&E|YI&eh^kU z@ymE|aU!mv_P!1P_~%p$B`R!D|^!7{vwW$*fI|H47(V zJXFZge3OJjyzE`HsR45vC7+I4tjySU_F6O!SRJKm!^xvciBoNx%7}`%UAOR`2arozhrm#ZqeJ|u(mKWm-9QJuRK95tfUzY+uK8K1EgUA zMt`#Dq(@F_E?OoO?pi;+?xq$Ax#%D{c;Fcl<8^|9;kd=+P!~UkUhwVCBfn8aTz5r$ z;GO^v5$uw^d9RO)AUqi|1j1}4?_wx2K)|QaQso3SR!Uh%l>exIeP#e~j~34HjGVlVv@ew)gboDO+d3bPtn=g^#R?19A@g?P9cp=w3Zd8o zCxcylnV9WSelBmZZ-;~BW%`zL>De|KpWM5^lD8M2gGo9DbOAEV8*}MOS7=Kfw;g|e zx=$I^R2PM*QL7(X*$Ah?;^yt#vgYAzU2}90b_>T?@-}dIY&yrmk^W_q zg%b=?*Y-|+o~Cc_)5XFweXsV;Rd`_M#n~`Tic$0K%zASe*Ra{h=|Pmx0$#hX!#zj4 zuabeRT%eM9Y1u1cTjUBp6$w63t2Y=y2+m<-LD26Ul+})!0*W|6TrI4Eh-{$z3L9?+ z~HxjVsAJRO*=(<3)Dk5<{gyKIxf5?1FM*sbQ-_ z=)0T@5;Amm&-qzqDX55G9sb51i~}do+7cC~OB?{q;79~rf(tovls}}*8MSV?#K}rA z17m_xEN@FiK8U_-28-%IHyTd13w*=V<+MLVixPhaZaH4cL|x9vg$9v%RR#DQ&jAlk=hKn)r&G64E;&-i#^%XoEb~bek1Ms*YfK zC2%%R8pw4S0A0h0%DJ#LoB)i~x{YoVglnsIlc)?!%0AS6lrm7Ov8)$VhlrB+rAox@ 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 hC+yXEf*o`9S0%yP|AIyUmNx> zNrmstlgz~67qaI#*a|J30PoI|{$(VrX`+>)=%&sA8XQ^fjmxi4gLV3LV$g2* zmAm#{A5GQ)tmb_BHEE#GF^?p2FT%4eQ%lCY8eE96HNmzVM!Wd}UFSti-xP~-0e~{Y32h)ifuC%u7B9XOnF+|00e-hs)CI?wsP5W$`#b5hk7pUjv=Xq89&Ovs)m%W7=me%`}$SnKH5Nh%ZEDL9i&_~CHdxd^`0Z9VRn0zptAdm_vfgdb; zb3pdN0_U!eq`(iZ&^VwoIiG$2o|5#Ii_l1t&KFN7gO|xo@U7F#=pc1W6B_dqb6$gQ ze9}3HcKlzL!jF?d?g$H=i`9BRTuu6y0R1=tg-k>txa^pcn6n?EhujDTi2=k=e?FWs z#}IAi-ekU-T#e6?IibJfb3KWXr=YAs@-7R6{1Jo-9DBbZBHN*zlbcCjoc5HKkSUd1 z&~|4aLc#jW>?3*EI63J4;8ile`QYkmIPkU=PBOZYoM>X1PEIf9I74DuNf95sMFZ+j zCd=XI09@Xi7>p=8@q9YC>L>HeV;UBF*E^lICxfGNqHpgF(#qwmJc{O5StbeM7AG__ z6a=keI$416i)N($Hv}K^0nd~$Qu|%fzgqUt8Usg_`A}gHC}#E>-*ar79xDtoBWekG zbhSid4etdU{;UXqrT~se#QIzcx)0F!WJ+8z`}GnM6a+2U$jJ~)G1}kV${=Yuzd7^| z#MOj3C2!}5?R>f*B36O~r3t|5v(x(TEvE+K@zJx7pU2-5KR88hhSbEr0awruWv)uK&m%3!9&Xeb0w$Z^wJf|8CoR z$N$O)Ao9VC_Pvps{@~1#cU#_vyZ(p!K9Zv?AAb?EKT+f_DQfzth?>lJO@CQYi+Qi* zuOezOh+_~CZ8P6)`zVOEnRRS4JF&~)YR`wcvE`4~X!v+(H2gUlEuY>R49pFNpc@Q) zja?tljXfVP%`Jc4X5_=%jQsUBnRPT9{=ChWzuqRZm(3jp7KWNzTmD|Q7@BM~{P9{0 zb7?i0@tAeAT0R}LTFkfG%zF&2wHR7!ZTmFd+F|BkSXOJ-r@t1n=dFDoFWU^e*=FF| zW?0EK!z;Jm}=`|xe=`}DHI?C;K&PeVIf%(o1k?l970huNbYhL`N@_%QDpX8EtVwc#FYAw8fwz+G2Q06fr~> zMa*vDp^wTaYWn+yhdyJ8B2N2=7*-!e%>G0XbBLmd;kr?SVH+?x#R#C3sL<~Ab)qHRXw#X|83n@!(kB>y zeCFtJG~r$FB7bm>eKQA+L6Hv@!xFfAjep1)-poi42B(Z#!yuXA@(dX=%!fJBj1Xgv zGsCkO8gKe2WbVDpm5&iIjFQ3Jr156(b6;gtxNRRUhVe0X z!5yCuGdCknVfTrgxjyasK3~y{Qmz5@Sw42O%ZMMnW!CTCgpvB1L7IPL_%)W8j zT8k4>j5^+87(H*_^0|MDVeFii$J)Ud#jnNC5N{h}lr+XB(qeSz*1mtHx0!Ra&De3a z8TDYB5#ZaLJZ13A+UXdPy3L5jZ3cg=jgMI`Yo}xQ%MPRR?J!E&4x^RrFu2-bXmW?4 z$sGo#I}9J%Vbr1>2KPG*PInl7z}gHM9>LiWcNlrO!|=5o#+J(45q&z{W%$7^vmd+6 ze(W-QW0$!L?=p(=E~6>$GJCnpSYLJ-nX=39=Uqm5-DNb+U1l$L89ubj+%|U^t#g+- zTf5BFeV4hp?{dm0r+PASaF@~OSi3G%GsK;ro^+FLV=+ZnI=@&d`5Uejsg^M2JlsO-Kb8CqRSqp3xL5{He*)ZuRZ-+>~H%W%U zQ6hxm;zeim66ywO7c4FjsEeFHbWu#kvr(^~bUfTNwuTc#H^gTG-EnWwn;|NJ@;L0& zLD_X9fZo6mp|=}yLN!x7n@^Y1{?y=91PUXDaygwTET;PwX#&ZRMWdw%=h^ZE5fc zEA>)|xtx;Wk~$0{2}z7kbuv`w1!heFk-{u2@Fp{6R`{GUqm_Aw#epXjeIdn6$Gx;> zNv5}JZKBd&W}c|@_oKYpBYg1a)yST%DF7pRI`v40|f z{qX6t_F>#TJ~};mesqX<_Rf)sVRv#qC|!;cJRl#%hlqH8Dr4V|kMNoKs5n~v)2GLs zr_T=CRj)vEX$f5=F8QhFuq?-?~ zEncLFtQ`CL{PSq9dqWjJVx+%_8W@Ygn|36V#mC4IqXaN2`XR~-yh@NgKA^N4Jdw%J z!Wv1rki(wP>pu_HTxiSu=9w(TFqn$u>-2S*hLx6RP_IvAm677t8%nQL%m9?Y z?ond48f$E=qOp%IGs6oke-=MGMb0Od(Vfnh&xRA3ql%T{nrGfo=0X$-5#u&m=})RA z6s|mk6FIH*b00QU`EV!wMpCF8YTJ4|Boj7Lz!Gb$X8JqwNaZ&cWHU6ElWUi=SPK*7 zqzq6^3n(fLl-9~T#l4LZ^JtXO5{ z2~Dp7u$D(VfI2MB)yu;HOz2lO$|CWVO~#UF`#8j?CSi#7P?15u1R02Tcrp+_g~>qt zoFxPC&?f`=I7|lO_Y4_`XFM5*pI9=Gzmy<@^u;_fNZ<0wApLD6GLWAakb!u~B?H5% zoEj2fFZ$mxm`g0G7Jc5_`pVag`X+_$m#qZ!A8zlVT$Rd2k3TPdeSeBGd^&xTASIS~ z=8hmp;hvFshVrp2Q$Z(G@m6tCK{qdRsjD6>P zs*p|GBBq*C76z4g5_0BwuYc)cH&QnmRc(WI1k-BP`QfKTOOgliZ=~W({eFrOM8zSr z7pA?R-6;8|$ISU+pWYE{O5#ONtt1@%8UT)eBb`e9?gKZK($)vg`@#hd-bXN_WR7a0 z_;2_hQRPCU`~qQ;mOqpwU#y)7oy&$kmnjrV*RX%MZo3eCE-inDjcuGRICv)j1J!x( z-&D+Hcy_f++Q1h5gRqIMtnk4T{O9le@^}1|Cr^IIAID$6h5n8I{G)jGB|Q7*pM2@t zo;>*y{_n|?3;h3Q^dtWBD^Gs&KlkUq{G}(~A^%zM-`{>}-m`SE?^{ft{MdK>r{6pH z*&qAM!ynoC{2%($Qz%{u@8?7k}i7Km6bS+`s(MzxYr8+1vj9yLP|zC;#@Z{=+};+yB5% z{Pw4hx>;L|vi{xv6<{$gw@E5=HkNs!=*U$ayU-?hI`rY6CE$@Epw}11m{nGEf z{OLdVZ~Wq`4}R+J{_26QBJ2 z-~5f=xBYki@!$7tfBNMA{OkYKmw)mHeoyo>zvbC~`7QtR-}}$Ee)U(r`9B=K{zG5+ zwg2_?kN)k+_x$RcfAxER=*L^hfA^K&_#5B*Z~d{~`{eKZ)_-UDM}Pj8fB&n0@_T>F z7vKE#zd8B0cfa;m<8S`-Fa53m@jL$O-}G<(%y<9dAKCh=zw{?x|E`N){g3|s(_cz{ z{5yZ*U-{WD{f^)E|6c#jpZw*&{PW*_^yiwt>07_0efGQmi+||He*gdSo&U!l`kCMM z?|%Pp{-yJO?N9#$^Z$7FPyKKI?C*)b`O{DT+Ry*Q|5uthwN(NrY_z6!wx&JVnCvF) zJh>*@*zGVi*|u%lm~2nRWV@Z+C&N2a9;zTGL45u85h zpIW}13tXd?{{Bj1S!lMeI4pO+@P25VIv6C;C!F!W?Z_)q&7WM@o{lt6YfKm(=+pIG zT<}I>M$3Bdb%_2E3rx(B5xnT!<(B3t?Ap-CV_k+m`ElMV$?YAAHvjT^GVg`dqZ1%dqi_5G*xGUQ5X@s^Vh@(Vn3hQhfq8cY@@_s>%EgNpyswA*kf(}}T@pNKpG-4IS^-=K4wibji+Xe@l z8U5{<4))H-F}a2`r@sJhrxpHWiR%%fH3-*XzbRRwzsD^k7nxdU9LRpAU{uNlC0VVK zOr&Abd1OrNd|>!mWOVRws?;J_8YhUTEj{Q0y*z3XhVPUd7FWj=T^oN~i>Zoh0uOP3TeioFJQ+y z98pv9Pvvlo#T8t;$vzsH!jYF?-$DGyJIpbw-#r*@hTr~TPcQ46C@}x_yb4v;ZZP9D zU+)rj+;$z>^P;y?`>x1v>|sBJIFMaZn?~e+Mt%cVpOKjcEab2YYE z5Zq)!A3;z1ZS#(X1X$r4Xh<5*mZOSC-OUuXhT42e?75$XjgTcBgT}^Sx?kZ;Uxy79 zn7gA)-1YQ9Ve`I}u1@Au#O$}D_g>0X$fa{*WcE~_%($n_!lw0WDXL{gCCnCaFM@-+ zN`!ZAicv39L%6-Ssmk@qQP1wLM;DmM@jg9EK-0yG7pTn4+7vFpYK|30NPnB%^$1K6 z$)tqdkL)9P5SV{3oDKOMb40zXM0%i1zD!@~;D)M%-sEW=RY%v}&3X0mo8-cQU{~lx z@Eq0PNo|f}w#dwF7?X;ase~kpG14}EKNocVrh%#~_xn}<;J#6Ci-~Nk<~ar{^ou~@ zf^}ChjM(^XNfF@=7VPdLM)1v+`@(G+e_|D+r(yfPI+vUc)uqDL@KX}jOb8OPsY}u9 zLIqb00u(h85f8hc7J=1Cry(6ha{yLW#hU zS?cd@|JE-4Ep=W5B0>Pe*69{UTByG}eN+icnLzAGTKbf(a|ITDkwyN3?jqRbsO-N( zP{|H}`MEJp)yW;VNL8(&>dux8faC#>&42SD6y#0&7m{Bm7cQs}0k(aIavqAs+Js`P zM6){29-lM=j$19YuWy{Ux>xnHCaTaL8rv#Y08oUJj+NoeW^k+5Rl<=(t1Hud_RVKH zuUL~@tNBl6h+&4nLGg}SC7FWw8}#2gZu;Z*mbsE_M8V;uip!Y>OF@mUw(J4kRJaOq zVHM?ezdcK!lku9q3cvI~|%|FpBqNt!K z!KN;I(?OCSMPqKpD-HQQ-vDmeA;NiI0Z=f!cwZv4^%-qX%oLyIBQgZYzsGDx1loDY zY^1ZB48)ADVgPi+0E0haVV0s{;1Lci4N>h^cUVau3Z{WMExUKN`jJrr^@!U?WOE~U zO{GsYL9_Z$AS4&p@0c=jb`Fm=r0dtsyLZJO%aL57#YMG8uu5q$SZ%MKI4h#{tBX^p zTtrO}avA|n5&O-t6Whx}^m4*NsDkK1nORKrO`n6dzE$y;IpWOk9~4PLAz;OHA+X?#pD3>xpt5$wa|8X?4B}jP zbBZ7Gi6q?|sYx#?%nLMAxtLvbHhTku7}zzoi}z90Ov&kI=OI#+Sn+(>d1RY5kH$iT z1ud2ng<9k)(FbB35(1^gT_QwTjoN2tAT49A=D~eU^alU0cFr2rjG(NyoOOIGKrUz9 zvbl@uspIGZapYeMM5WAlh|a8Pu78NSBE}O;ifz2kKtILS_sU|51sX@9D#466+ zWXv2a>3_Dh?5RHhKep(TP8GzVHeG}D@-VR!Ao4^abT#U_el#BXJRSQyuAwaK4o3EC`Wt^~Hpq=l>)>*Rn%Wt^w33b%9Cnjd(<&R9uLF2MWm!=O zH=#W$WS3Y zTf3Sksmxbh-PA%kwv%0sk6pbUvZ&oa$6cQgPcI{lox93@h(u{k?+Lx5Os<`nbNS!v zpX--557+RGFho=}*m5ES=a$eOG<`^$rFPw6DYrfx$oZtx`~^!p4K)>+`MmojN2#eD z?MZQD8d7n1PfgPB^-@?Jq2;~~@PxTctjV`EV7Cq;fvsmrhF*1A+W*(S`fq!| z9F0sV!2TmLf0h5SZyNUJS1CvGR>Bu#lPPTCY<45m7n{2WCrQ@2{!fLn!wtIb@udiS zNfZI?>0^{n7TEM>jSd}KAJ~?G-ahM9jeTJ8Mgui4S6OMy6ilhi9z2SOT7$WVqw%)U z&4glb-DOnRunb;N`h$k8F)#EpHWP*_UkF1f((~L{13x%4;WK0u`0vao^u#W@Fg24h zv$DzaFM7di-+P9iVRrs77c$+)mZ;J@=RzN4EL(Zj!5eq_c#ZekP98tqgVXxtIcK?) zG{s!I0HNXdKIemCiM6FoBMz9m6@zT0T<9dD<1g$Z5bo-d^C$Eck7FA=!AzqWz$bmX zT_Au~;2OT}Jf6Mw4BV1LLZ(NLl${!Hp7L(;zB;s|ZBZyJ<3crfbPPiL+}itKic1lp zs6Nq|&>;xh73!X3P0*1P+jWApPm&@(cOhW^jGZ^(ff{@*xZ-ZE&LVABUfGA0AX^JiSblO{=`+xi_gW(Ds`STGJ zRL5{RjrT|Ai?8aqjw)evwG^bh!|oeaGEaXd(vXrMQ$yZxnxDULp(ds7c{I-$*8AIqG(@{+=w z_JcB$`bq(Bn&)MZn$|MEco#y@?p)kO`mRRDb$hS*w<}W}fmdDZJg2UGDWhenWS!)s?2i-@xx&hZ5?p>c`z*u51lzPtO{|eGBMzB8 z=4fDMkTTxUTVy?JIr!L_(lo38;OpvF54m`C(Hu*7Tul8{5moqz8N!nZaV5MfDg(|q zv~+pZBw%;Bn9kpqU=|v;E0$UcXTNZG;aVqVo@x=c-|k|59OUEEX_ZvM!8Mz~qq*l~ zS$Q6JQ>gWy=U+g9$9%_%Ulzg3U%)AX`yExuYxM+);zipxVca`{?Wz|WYNAa^Khe-d z+9RExZ%s9o2>5n=eGO^+?Fo=1+i=@;y>la(1RfxRp~$=XL6d&SJS6^nelc)f0p)k! zjEsXX(Yp@O5K5(JJNQMU(uVLkk7lj-F~SLVbq-j9X+_yrf4@XB<*wAfV0rfm1Us2? zV?iNL6XmpZs6uCYhr8e z#Wfo?QA#cqL)z0`G-AkWgv-pH%49rrJ@7ZV{deVaR+XWYJ9bs(;GjFn58DpS)1m5gzTqp2fCDV0nvAW zTiwa=YxD>3YXzoxdHJ{D(j+g-b2FUCNtce$Vn<`~O933*@A32v;fdUk&S>rTUAEoy zA+yB$H`v@gXSMhy^wPP>Fk6B=S0?>us$cWPs4!QD-lC;E1T}9~@jR5;nvD`Qr~K~{ zn#@()rh?n*vi=UTK@u~v8~CsG>P;boIdABnu4bnZv}Zz9u(De`OoNN&5p=J*=^AdO z1LS^@{7pY)6E>K1n;_c_%HSCcx9>=bcdua7jC7bGDj#SpJ*mo%bn!y`knpkpp$khH z{+O=oF6{+SS#xnhoXU%x{n#DDR%*a;*g8DKj@Zwb-s>$@PfuBroHYd68zk0mZ z-2z*ve|9I-`h^oA_RoZldhv=U-+B?_)_QTcl)SK>Ja4z~3O?{<2lJAM32-j+Vz%$* zwOjVsR)>6pv8QMbU5SO9(JL_T`)r;xvk`?^FzQKR9YBKA1-#BArKMnwf0p>!ToQGy=8#cDPJD7v4Tt0_tNh^6KiE3RYeJ zneKv*V`Xvhk(#>4?5R9Q^FLV7JeQ#xvOIax5pf!6|8yrxpurDwtYk#D5zTc5jdHBxyCB}SFG{Gf!BPrj=m@SB?S#5Lauq8?+X+cW#Z_); z4ZR`0IqC7{*X*>A552cSxznKQvHNnl?%VI%b{wE7Q+Z{oP}#2+(uuL=&(mqBT;gq< zS$P@n#!6Qdtvtog&uKVtd08 zcAPiK9*oWjF1N&6y;6zqbw!-sps)kX+w|UV zS1D~XknB$lj>VAV6WwnZ~gkF->zsT%DX0hx?P7pNazGQKS8z9bQ&+#9Z8C?4MPvO>iH z%8{%@1g@`p!(^Jtc#gxo9QpNU{b`5w^q$JEUag3hZdFBzWU>VxyE&3*KvY0Jp7Ua_ zU88w6TQ5_Wzjv6kC=w;eiwZ=NheH3tVXMH)?G;ArjujJ0#$nX?r#nRP2R zR-;fH9gFOd@*5VWWD*E}U@%%Bj}z3>3v%;uF;>sDKGNJ~E3#Br`8TpQE=m~Id0H*#ysDb|o%`rh)|AdzQ{`M`rD~hHbMREz^s*kPB`2@` z;}r!i9kpeYo+T$V1nR4M;9o!OnI zoM9akHfGeJMOt0Mzv+~@ai^*1#+7+4&DiR9P{ly&-tc|=@`EW}rtYn~=1QqTsORyN z8+-F$%tdYACmrR|mz;eBcGS}tj!MLC&vZ@$;`^B_b4u#cm)@FM*l*+#6^&-xXR?Xj znD|+JtWdtIt8dUNNzgxYGwPiM{t_ADdsU_Mk9!G8MF_HVWQF*>DBd6gS(%M_8Uq~V z>ht(1Jmy1*F%1AhD$?qcPwwhgPAg8`i@uyFpAo}FyG zUU6sw=_RE$_VraO`7YDeF1=>sz*Kk5|6S%oSVea?DZ}a~({^e6ryb5+{)m98F>!e1 zk%cxQNvYJ=Y1vzA$|ZJb9i0#%(2eu8J{9iUN1U7T9UOBw4s(XKj8)DRYg~mOp|9z4 zn2TSiT6P2RXhq%r%qqu5Twbo5<}B_o)7G;X2lR3(^;s&SR9n%X-grvMsV)KMrVZSa z<(60&q+R@Ed-9Q!7B7!Io$&Mfgk#LStcjC8><~55C*j#y#COs#Jfnf>DYNpthKO!q z;48IW=Y7cxGcF|xoZK9gm$10shUD0m>Ys&rn(XU9;|c}WcsJlzJ}U4>dl(c z;zDiEYiYkOyLU7QdeAXCupF^qi#TN^C~BObWh@~}@+v-u*haUo(^vQrM+o17a^?4Lue5!?1j1iqvn4`eOFb)Ev_&2zu zOYyT$A}A;B#b``hiF*Fw5Z?LMG#O`b+n->661J?$jPWXmTCbicEJ@$LV=6&&)D7*?CxG4 fhj@9lZ4V1iI;qtYh~IkIUX&HO=1BAZ$Ljw9aYu=Q literal 880440 zcmeFa3w%`7wLd-)qM*=;wN$Kajf#pdjMh;sqCpuQtI_yK#a0DH6nud|ENW8|lhK(R zkEFN8Vr`XLt+ZN;w$X?NCrFd{B)(IhqqVw6QN~9hK5G8o@7jBxbLJ5Oy}kc?Kfh1W z$=PS0wbyH}z4mLJeb#*T{+C;YLM6jOq0pB2ZHr%en^0(YJyW634*0d>;q>XJM5mo1 zS-F2ISt{_)+?OJYKcJF-)2A<-wP>Na!6hHxJWVci)3GcS3h{opq|Be;q59zM^yv#0 z)}Fn<%gV<$>I{wNO~U~1OFZaMXoSIMx!3rn&z^PRyjk-Bmya(yTjSdY%HluXZ=sX= zZvlUE&pv&pH_F-}LF{&73)X)}ooS<}IAQ@T{}* z`Ab})@f{e|7?w!KI@`c1^hj9pT@VRk=Nc^H2JuvPoKG9;ruxlpJxE_ z`TKi^#`noA4Pfs#f^Y7{(3}02k1xHeuDPc*+7Rz^?8O!|S0nGt3(s1xfCA^^yJt_0 z@B0Sc-di+<@_PDPc-g!{{cW|E#`i5#(B2P@ulC{}&AIrT>2oeVcP@bP`5U*7#`oNI z8Uye1d9t{9WxE{@fa%kxPB~@D^dnC={$$;HZF{XG6#nJi(*~_CC_@@{H`lL)!SVH3 zW`Hkf$K?9+K*NKbaP#pkGx*94KHlfyquRWG#_s0LpSy5wF?>A+-w0EJ_j&j{Tuc~zb1pjTyjgQ# zD*62N=HcVLt(qJ}=7x4M8w53;07SjkTd30H<=vA<{!BHY{Do&tUvSw)XV1NG`n-kn z2gTPH_VESfq?`GEfKl6Ct+C|u*SA>n*KgWC?}PXZ74Ks3EtqxT{8{Is+sMb)+p6&` zGCc4;h!13n)vMSEG3MioEz$Uv8xD9M#E0x+_!iWn`zeO6-{7-$!uw6YH|Nr`*qar~ z8@f^RmyoCUgZn&u_K94L{?0jT;aTRM?bZiL7<`qct@D24_&iia@%8>f^Oqf?Y4CpI z{(a`$i!PdbvE?YgK2pmyzL6FH*C2lZ7bOtWr=PvRA6*pcuh-zK4=@!-=8QFnknJpn z-}LFn9drD#(W%F1ZyXAxG++7GiGS4j9;1z?Cb3k2EDEkk7-3q84IsN&I3sNx2+xb1QM!&adzI&GRgaV{?(5&GV!P-w~e z5uv4vhRgV^8u|S95R}K?9l$pexZcs(MgLa+eMIQQph67Pj<}Le^@&#;c))v+ul~C2 z^oREPWShtV$ScQB%L?Sfwvn{d(a7d4_QJDZg8_@78Tb(wd7pLZIw)+PlKoD;Y{9}= z7wvc4oU`YjHUF~xj+&3o{zr4?U$9`mqvqCL45OPf_u>iX+T8uVKWqL1p z%g3)dD+z4`|1l>VabfMOg>&aFoL!8-l>Gt#f}izc`44TGgs8w@yI}r)7tT4GznOdQ zJz@U|=Uj%Qz)uXom!2~UE-4pYi$389Qv}eV(C+wAZ{=e~gvz1TJUkd0|M~YH z4g5y~|IxsIH1PkA25Mr-zsDNaRwrw}XlFkjOV;(olHE$xlp@{P6@9iO=GLWSPA#&l zQn6&TU9CE~G?XEGPR$oFw-yiU+ErDR$wZM5i>O}%EapVpV~wk;&v*nS`;s-!W$64( zTA;1~)Ot_}$2oG&pgTvQx|I4M7!V@3>r;!5D-DIW3GWm#{FZ^w{$$N3c-ZgMe4?Jm zbI>U}cY#N*LLHJz$^#lwPyKfV8U`D$0SasQ-{Eyz;>Rvd2eIznWjtKNX^AK7-F^Q2#>T8GTmMmWFsr z?Wz?FF-uQkHfkPBwX0H$yJAk{g$CwTwF|GS9^hbXV9bpZSU##yW_KwQxu0Ok?tw8s z!K3K@sj0~>0Hhx#yvouHS=mlB9dl|>tSU9tnKBkyMc(8_DOBM8~2PSK4cD{QaXcgv6yeGY1yk!!$t_CWpKgh5lGe#^CfspHa-jiR5lN)3>W z$WQA>qK<0-5;@mC`xc)yt}Z|0k?>CSkVV^H z!`d>|7ps^io1~HpOf5bQ?5N}Z37#4!LYdE^bXV!Km`9bM8os$V5WA5#?6;#bZ;HHtBJd==v7{TLz{z+eff`Xt`wzFaH|BIm z=FP}NF=Brl3t};6%%O7WU`cfl@MeC5VJ{TZldM^7eHGKBpw=8uU-gLfRUDH8vy^?M z8f7b3wy`b?>BO0B&-?Duw=nkve$<8Nz;_OZf5FU&Y~P~nnPn;_vX!=>NUU-4A2^E* z$4jVPQyBhAI0&l$Z4dj(V5{c{%U2@{T26W2g_xdky7vZx?wJkhe_BJAy#p1>aWQ z1SFEo8f2mvv0o*Ej`?^Gk(VXa`=FbdK%R>lQbJvg?rJ@#=E^H&f5x)!Xj!(>vRnkl z)G#f}7bF8&#sy@daj9eY9J0jE!<|&0h|@6}w~(lxE-4w$;-a|5ZzO7y$4-ajr;xA9 zQ?7eOpfS5@xmaF}A#YrfwsLXt*Q8^vkWzQT|F73ftv)BmA;z_HXRvHjY#+JfB-x=ys6bS$|_-K)DDIHuqLAkTlA{&WC7 zO~wlTctXh?sMXik0+$B0cmi2{^{9RP37v!djH{hkG z&_6b=Ez6fj9r;x#phkEm>}-8h>l?u|Jpum$tFz7Yy{KTTrmAosd7kje?r8Xaps8w~ntT-9 zcKg7XS`=yQ4~3h=4|97;`qU$xzIWxAq6Qy8dw`;rmj#=Hu(TLi8b>8hkHJ zF50JNXsJtfBf?Y}Sn7)<(lwL#{rF!hlPM*eA0%mP{(e_1qxIz=aNLa>S)#@PPOAa5Wo;{}2 z;PdQX|#+{f6X`QOI$;V>d!+ZG%R@Im)Nk-RZUZl@#6Q&6J7`D;P|-=@+{QFuP{=+PdW(nEGBVq^4Yw#p%BRy`gSQx!(8INCE5JLxj>jf!IJr9y11 z^shS)+Fm9IglRA5fzlxDo0PJIwce{^&2l_l-a`?}nZR;=pURuBv|%-f)$X zEij`l?4KsFkW*QvVSRmyOpt#^KIe2!v@lsnaGoBVKY09XhP_(+m=2jb@Y~B^`n2iX~|Hv#`+=;!&L%3OaH^cOH%^bE#d^kS~5xQ>qc z>ND=5N4+D)YMjXrw1AaVnHkS)R6fwsj!CIC^kWWiW5~>oi5@Lz4%S~5@i+UYIESX3 zs6$R(bL+Rllh5{v(X^@-Im95Pg}}qZIQxuz>>Nj69HG!Fa}y1i(@N~Ysb%+|PSjM; zHTpc}*^{=9*&aJy|6uG{Kc80k+^;|SP}n$IO}J^4@PU>B^6wrYjX6g}27kW3^Y1s; zejC;; zR}NH`sU7h&8NE$VIMLg7TMo*N{pH~}MzgfKY-||ik1okbw<29kbO|2dR|TBtZcCoV z1*i{*IhW$@qge7q6lj4RC(s?%t3FKr67efxY`QUFIj~u7r-oPdfX!tn-U4h1jLquR zcgcG)KF+2&s56zq=Inmx^%@cOY&a~+BsKcdq z=vDhoVFKeOXWN)_k_g2yW}Fisb)D6^`ig)-kqxVt0__=(XpvYMpC5**Ndp|L62E%W zma<~^s&@|NL`ED*>kMN4@%p0U8Dp<#TWd&A`h^1j)jXp94Y=XXV1tnUwP9_Gh|KW^ z+fGdybj2OP*~5*u_L(h zM9idl(Ei!>cU(XIn7B4R{%|Ts1WnDi#~lBL!PI4wq%CEgd&myj;`fo^wOQ%$QD-a5 z@lYL$dJ#8JlT9{@*}}y*38um;pHB7~o^twI<6mW+@cK^M2nzT~)^gRp-@yeutfB$r z37G4@F-#eoE1JG?RlIV)vWo=(=hf<~`YJD#CbT5WrP-k!1J zCAJ4Aa@p4~Ul3D;8~+539~dyO^#?CjK0Dsl{6_nmtH4Ydsx-Xv!-10~YT7a+_UsW) zvA<>PJ666;6-_+(lzNXWnckuvve@x>ZvEyNOMBKcmMl7qUiB9;3(JA>dbxPkshNlI zc=oOLPTnLrZg{Pt0n%*I*QjsoZ^tO?3#45@_hvgzsb6cg^{baEsJ6lN0T%kzvjDOZ zS^YwG=+STQ`S+ebLit;Yly6vDA-w^b<>;BLC1<3#(B!AMv_l2UlQnm-JJE}x^SHM8 zF~${;VksIVevzj0Sh-j(+MDIw(bs;PXd<;bJC=NGV9d5s|8}etIop=_bUPNs_{iZe za+1w|L+2+Tc4B2E>Q4O)#wx2+-{RdPxN|0It8*v!EvD+bmWNc8=(F^QIl__3(!!JI z4xQ42P1dWD6_?)8F_$U;L|!{r$_Tq>le~Revjk6j^wWVcNApp)^qpYDhl<>7%Db%` zt__U&HUJOBqMx3z=y979X|Z?)zDg328TNi1@7>8qdZJuKMxDBP0L>(jQ~Cr!FbYEz z48Rs;IEG$bFH1*`5+MI6hg5i~FOiCzr(X8XlI;>D5Y8axr(>>L&9WHsIc>}mlXj;e zrT)tCvm39F=hy^nV=hWo^Wj6-fH6CYE;oPC3gR(7_!tjju52sGz9h=AK+I{C$4mFK zZG>am^%|HY)Yh0yb;Wl@67q`)s_l^l4l0F%_*h>wydK_m_4*^2qo*KJz#lD zPslZQJL3k-uvMrC(@yCPU!l{${}>Nr12BG&_Ez&KQ^RUHeU6QFalUC|i?3(eY(`Gq zi@lOM3pN+t#`bqJV$S3bXKoo%*Ro|elmCJ=oNSN!G4I{T^CC6JLkyZou^Ul86`n8w zpDl^V180%B(Vvaxg>ek4;CHa#YZ^r4*YdpdCH=gIQv$lY=rRkC&;So;fMxP4Z7CNqqeC1Y-D7MEnF zT53TJ04KR1(@F+ZWFH@YIZf!JJ@HV}Qs+`U!^mf-JuL#vkdnX*>wqY8A+aT;^(9*$ z!h?)kkRvPoIWQ7f9n3Mzsrdo=ZxfNBe>v!9zQYVhRHu#^$#m)Ox5>42MjXRWQ=hPP zR*=}b2>W#@(m_X|&e=oky8*V~+qYl;7<0jRFbY>H#vC1ZuJ9+Gl;(^Y)nwQa|ZYT|{ zcnteV>Ns>t8K9v^7-x=X-nQwPM9t!G)4?zedC(kPybl5+xY+95ZxL?dszydHEuf&@ z+;OUa0yDzPG26u&-P`A*;;}*swbjQk?^L%VTip(^TE%BoynS=31sI5 zva?GOc08sY)ad&&KZDvNIz)X5*CAmc4>FG8o4^C_iZwHL9_gDU!|gC;6B$>&K!MyE zICLEW5!u~H-xYlj0!HrHk_~yxSLM<{9O?-=C%q6FO(km{vdflCla`tVQ(GT>&~Es^ zMF52^JD+7gmJF}@%&t|p8V$#P;6R|J(ArQ^41|p%^9S5(DaTqVZ=sY2T`y8Dg_JV7 zPU>*2eKBy&k#Z^6m_`v!*v*sj7Ep*hUMf=VBNrK=tGDUmPay;7G7F_#s;&gL>!Y{i zNlE(ZT9!rEMCQ2|%LXIsUMbbMi*#-Xm-O4O?_Yk1W$b+a;k7s89N3j%AP+-74bIZD z>OD2N`YuGIVg4`OiTdF<;Q>tnGpghiw2w9FdDJkQhS~?kbJV@Spolq(Mu-z~5vE|* zEirTu6H+e@Cr)k7PMcW7m*Z)3GX2plhw*09nd#^`k*5M3QUnHj)!}%aNrR-W(WB^} z7|yg95p`&|xm9^BnRe@1xa0JFFkr|;R_U5w1`}>kzglnWdw=O7YnFjesqaaQ|-##oHQcbq_=lvaZjl`@x(L) zlXJ*8z&7d_%)W%Myp^S1M zz}SJEO=aSR%K8sVus)g7!>ro}JLsIoBJ#m;xa-=FTrt& ze&#v2%XbE6%ohdZ@Bd-^Z~ErH&E6@**2}fjzT6K?v<0O$5@Y+h?X^iE$+m!uINBX2JHi(x&v6{_eSGV`Ax_->*v%bdBYAN#vWK6 zVKaOz8w+=q#Y(Uc!^X;O8XK?U%~vQ72NGE|4!DFrGrsLs;>GhcQp8^s*LQ`due|uV zZ`x%YSZ7*&n^bf5XGZlE-Jj9zf%7Yg*8#`>y?D4leHM>Lqdu{QpJ#u%{u?^=96+1F z=YIsFIiwHQBM`y1*x>f4E-?pMVQ;Zht1JH|)AmmnWAUi7vn zm1kt2Dx-=;*S+7MReR$XcnREu@2gOAx3^XvoWFSXSwFGl z9xei86IJWNajdCmEcCiqBS2tsc$%kADq;BL$xr{y!hGz~X^X$b9^|-Z8KdX*FV*yyf&JCQWA*P+jeUu#7sE}gUXi~! z`Xa}trv&eZg_|0A-yy1G4?~aMqn_ct1a?%&IOk1U$Y#2A*%g>1g;YPE5J$}0h)${P z@W?{)ea2mJZ|k5h=2T$rqjd2@_=Nrl#nYO4yE-MOc)L2Muy|S*zno97d1=4fylMTRwfP za&8j+k3Bq_NB?ndVr_)}=lXfxc*vK>%KtYH&*srL_;ciktwN3Y?H{^Bgohr1E8D*f zqHnD~?SHeI?SD7fe{O<*HRGSvv|kx8cd5(AS{LW_|CKVH5q{w#`HCFcSUTKf)=S`y z*~rrBNf~~j5jyiQo<+t(l7WP@FTEtm(HJIxDOOS+#{%6Xj*+@)UplZsHF#|Ti@#iq z(e33i0-IP5wvryz_f$c=uWz4@tWp{i_2eHpa7AmhhH&~H-v^XLTa&F3GeWi+ijHa*@d?C;5c*4U@A_6FVy$7dVuuh~Cx{2m^stzFU`k%rR=YqE+CXwTl9!(dx=1UJ zUtjtD%*dD1o^8B-p8r#yeoZ7|9dB&^M7^ltU^FEUO-T4d;cb__To)vdN^j8=~#(bWvJ>?9}%lA z(W`dzfqH$Q9`&RTlu~KlXiO;!q~mWfz`%>?66?hG*xOYtL1k#*JEx#MX?rLC*o>mU z;if|jDK*D%ulRnb%#EG>&Ey*%A+3I=0qJ7X+%*(<)8lIUqP^I*fz?jzCHLjkudz?i zM+8(%GfPjJ*B-QePRxI9>`~TLoe-mzJ3k$cH+O7%DzsOhp6S2Fi4aD-ZDV`(#yb0l zLt{Da-1oPBd2eM>CXsmsiu1n-{?^Bjju9qj>MxHQzy0d^vpP0o7Opa?V_9i~jenp| zkN^1^Fo%T4KbWxn7wd@Y*IaDkN+#OGB)&_bUwT7NeWPAN!RtqzSq;XCexJI8JJ(!- z#|A_M>K12^dC=?e8C`+>mB4aFubSK)^bWrMeR=Kp%&Z3t(w`C@%>0YvtNSzHT&mXE zqfbA#zZq^02I*3N!V9fM+}(v;L4iE|mIeIBruN5vo1)k7`#a-r4=B#Sdw&Tspyff` z=C#NFp1$rFZTqaD^u_+!@OxE%QH4z^!f&v@h0nslEYgaVnt-OImCpVC3ESB2*LF4^ ztPTnvm=8f-s538q0E>%td(q`#D3RmO?D$#6vs^o@#ry~ztG1D#hqe8yXD^JJsq#X` zF`4IHQ;*thAKOZUrEU9eSX()ae3agRi5}yhbTG~cG@Z)&w@WG$ZCkMwC0qNYiN*Oq zM2=5nKv)8=33_W?e-=z_0_n!f45Z@{GL~$UcQhHs6Ccl_qxl@cfk=n%Ye}KiHonPt zoJz^p(2h$`M1~25$EG@Qrf`Ca+7EzPo^zju;3ce#V-x+c5(fD`fq~ zb@>qSO(L(emBs3Iv><=wEcQHZD+BVtIE$$_N_`m7m8(MmU6&<*iJYq|w)CNxuUarR z1uKGL+}1u@V|AKxsZmI0mXV}B3?kXOmMBgA9RCUgxNCUc)687zHwd4p$;Xf}kx*G+ z(>OCb2c;|LamH6X>-a{=2MXpbh!|R=d_pbsVNMcQXhr44Q2j{d*0aRkLKRj*KG*# zy{``kbPS{kNx2zNIOuQL1L<@1PkH&1RxoPUc{kpNh`s^*Os2?A#N)Qg`{ zBfiPo`9O}m>YXC;{su9RF}Fb8hnUU%l z(ejoQm$wo~^5lJAxH9sV3kx>#MdW?w)8g{Zkolb}>qpR4N-fkfr*NYK4Oz#Fv4#Md z5u}EQ16#-KY8kV6#^z3#|m30Qy%Dxpu61ENp~pZ`EAeS5i# z{sb4TgfB{hmCgpiMy8Ghk{l)UseWOT4G@iQZ($?449;za1ZeiEH~U2izJImvtAla< zRwF0PZsaLpfyX4)CG>()Jx1$`I6i87d0>Eta^idg^uv;M-4~`gOYjuJA7d^~++ZpSewrH>VSbSZy9s39_YOfm=C~umAq{xL7H85 zy|e<$S^;fYdR)tdEe6(?eST@9Tu*~v-i-5e{=N9L{=vh)vR)~D%qGU;4Z6Rp^}()2 z`Yd*M-Mal?Q&#NYJ6=5oH5_cOY}i>HZ?=*4YS(Xf)%c2zx3PAcw?66Hi};jI@6bKG z?{gY3nbrv#!NGhc)D7mB1?y`m3fC_T4BG6ENSlIjnOcU;a+F`*TJ$~33(gmV{;u%& z4*DbCp7QN~NA1_KP920V6Z@wu-hSRQ1O%(!eG46zQJ|SG3}(MZ7aTc24?BxgY(L$y z-mY6+u(oV_(EX3Duf2=PL;mnw+m^IH;mGsvhW|nA$?$9Zd$3LF{shklt=~cX0fwob zKal+(iK;f9;5_}Xmt)}zv^?+xzP<<3pZMGS_CFJJxYw}}e_4o6>qGl*#I#}nQp~?g zeQnbIyU{QG;^x3}zALnK(7&7}WNoPlit+sKX5*KUw#W?{=)3d!uL{qfYZ=8LTgVEA z5^$|zO18yucn2N##dz3=oDU}NmofZfUt%`rgYAG3m9$yiaC7#F#{7ZZPp& z5gwC%6Ueh)ul^^p|J30kJ7OeiRc7&TyuLvf{p7zqekA-qCj4xqKPWzan|?gTZ!>U~R_^%iZsr(d zO{ibbo_&3J{&(Z!m*;-}pYhATZ9Me9KYrP`KeOi{1$>hi5(>|hwuanY$@M(69USg! zPY?6s@l^$$75Jh)m0X5R#+>yX_=~*$t%!YYbbMUt`O|{_5N>m*^CW+SusV!ydf<6e z>IWhb&pPtOZtbU$W%;*BTtctI9LgX4uleQdnG3i z+y6WLTQoa({}%b}|5X3>;B&qUoof8&VEPWuM@>9%(eZlG`J=IK6K|Y1{>`&*y{C?* zh;bL+y2G@)wntUc<~YHVkI}4BOLZ3rOZIIrXMT;oQpsjoUjH|Qd}=GKjcjIrI9%3Y zLug?fMl1CRdE1o!@N+E$^jJ84p}vdvhbJ73{;+yoet&o~bN(&;;p*S~r$78R_JHn0!eH@1}+a@}=zlFVEs^`ZeNiA1tt4VU9 zf>ZoHb+cI`xSCg)PIal5B#i?}#d5?S+Vh5ilA8y$dU2AgA(8JN$=v|1!OQ6qf;c{# z6Eb~zfchz3pp3a=4i`9Cjh}(1>d$anGWKz>pyJ9=2I>@m>hX|SokwhfEZx6ofq|(1 z2ojV}^2{Tm3;bu;LA&T3Qq$U}00EZ=`SEqfStzEn=l@jON|o#5UAS2L@$_m%gRH=cr(KT|{?VVJ z_Tg)ySv3`Oy-k1Y=TPdbn!p66=jIJ>mtcQs}m0UYRpJw$}CYHzN zKg4sKH{bbbNo*#T?Q#Qbz4^H2SL6$fKlc+pM^N*zGR1W%0z-u2p9BJ z_TO$_e|`%UfLhueyS6}|rc=FK(mCx*<`bLJUO$j%iEi~mz)9~_44=sF*&C~^)0muY z`e`NWrB3Nvslci}__M22dG=C~W53o6dX>EN=9E4~Ecz2By}$ud$xBd!c>P({Ue>4+ z|7M%ES$2u0c}gljbqDn<_`9^4v{J7~tMLrbt4~yr*u7_eZ*f)AtS8Q6acv2C_5wz| z_~gsq^q}(bJEc{=8iWv!fhzue6xsR~VujI+TsK;L~tstL2r}V~$J=Oa(<$Dp@ z=WwqG>p*1N2zsoKD6f8k`cX?rJD(m&1l#-O><96Eb{>I>roz-QBX~@JeUl%d+t|k@ zkMKKqlb>Nbx&?Xj!=c6t!ROxkwKx?mMSgu*Tfm%}6G`D}Q{K1VbosSDHyvKuo7OM= z4YbsFS$T-A&^ss}v);;ba2v{;B|LMWUs*1&Jc>|Ur%YI|+K$cx58$Mx0KfuXf;9N* z9yn>Nj*ax5pgwq9fh}U!6ws^a_F(iC=uax8JwZMjPs}EbSXUWH$~hm1BdNwavLN5n zUCEUSHt>n`k&r5-&Jh`SN@16pjkM5|aAa`Nn`lV!IgUE|1TEU~gNYW(vfzS02?~lofzl?#h>YLz@wUC@rF=To6 zPnDKVu>F@?eL`RC$EYNw4i_iDj=D?UKUDRv>55HGDeIc@HGIU(zR9Mp7X_fo8#<|M zs_xf*R?K95*#YgiqmvWiIiwT&-i%oH5!62>i$~1k6>(FDnL1*T+UI3WE74HT$GY#$ z^^ZaO{#XMIG9TCamiaJRoYqrNe*d}IpURt$ma7wJ(-=8uV-SZ1O*PixkQjS*or#m$ zot(Inzsh5a-N+w#wzNC?>$qF-3-}gw{p-e}{CCpjt)p<9o@e=lM08z7cI~AmLd_%e zOYi!WY%~cma_l(o(u!p^zkP@(q!!{_$6y=lSN#n;AliBqGWUQ9g@CX4-b?RD;vOBy^WclU}n%4z9y?#+M11w zJ6bm85`2vyUvJ|N(zNu8Es>!4a8NI?XnaxlgCrL1%uCKa?MhYB)q*F&y`D z^t4*{!f+fP^+hJ(L%b6KL@6OKLkX!T4aB)V#N&hz99X&vsXGk>#>_%RU2igEqn~Q8 zGa0)80y6O3h76;2Q3XxFl~)Bg&L37$!9EM!&;Wn0{~!3>vxz($4!BhTSf)4S_nknQ z*Z-H&!wlWv7B@@w`mI&k<}Ia!tA8V*aXQWyu&J-`bjtKL#) zqk%Y8ZynOf52$@KfdAL8vcbc9i7Xgmm&)(}Wu42=>0%9Mca%y*`FRQ+PPjq+LTG3= zWPBV*fYI?jqvP#Z)Kc%UZO!PrQuLkF>y61O&eXEtl05=G%CyDQLprBGms1dLJw+cn zixDinMaG=$`X){#hoAXK4w)bQ2JTk$!5OL-;Yqb$?T+?}5;+B&grgi9XNiP3r!oGF z9=L#5Z+PW_+a8jg5^haRsm~6`Z+*(@#Q5){NlOmWo8tLz9&BYt8u*&Jt}Yz#;KHPE zFdm$p_AeNc`fHb}d{n@!ZegSxPh;w>-h7(uN*evcE;CA3HIeklaooOK&ykbM|m#Z%7_smTMa@n1! z>zO-0kjqX>{e-!v2XfinsoBguDv--gO`XKtia_p2<{rx2Z}_=tJ7gr|=dkwWZ!*qR z$i@!l4CpG$d3RuEV1Wwav|p!~PI=69d#EoInk4wbi+>133m-O93M;c=HU%^*w|l7*CbDyy91?iYuDf(qDmF6ABG- z+HE~(h28D(7atS>W@`=&PXdfbI%%+ht!PYKoOZ-yJNvgBox+^~$LP8m1@yDV^x>oH zbDkYYWbYu$AR8buwo;31)aZ0hfngpp5Gus?))Rx%>cO+jr2*Vu9WA3-ZRTL~4zF-$ z|ENOTiNNC`q~~~#3yW5fG$@-trm|P;Gnn~b2c>2tg4`|b85C+Zpx^_tg903_0mibz zi#D^}H9+N{0HqpW_MiZ7Z7Dpo3<~gw2527?;8qQg9u%NK1B@87Y0S_7kwF0t*8pb^ z3V?4PQIm@Y1^6e%4gk1sP=Hr7z~2T1cu)hB4eGFep#csa6yP!qaOR)@cm;q=UOgxP zRw@W^_n-hciiZF%3<`h{e*%0tC;-N(1lWDhzWz@d;P^oS{!0T~Iw-&;8sO$Z0jf1X z*PsCVX@K_!1^9{v7$XC>V!iA8jD~PaCl3nnga$ZgP=Gr%fHNpSvj(_#P=GlE(BnF1 z9){Z8>g{g0nJOvA^G~z&@HpMkPaei4hOau&iFe1Vap9CX=CnzU)5;v{-G2oX?3e=G z2Is+n!P-YCoKg6L$oX`4G`*CMqi>N&cU0BOWvwAOQIo911sWwu$#GhlV@d8cB*`mD zvR0Gq#kgD(c}|n;(|4~JlH)bW3ZJCpIIYaFB=7GUN=keZBb3=flT39-Q<})?TOdVu zv`61PVMvbEB+Gr0lH;^8$C8{nB*`1mr)C!84-~sB=8Qfd0k@s3Vsby7T#n>EI@yj2 z9ii!#;R63f?MjZ*${b7giN6db>dvGqCpfwMjKb(=t`WLSuF=UQNIs#HOF_3Eg9{i^ z$fqkgPAhXP-BX67`#bQQp+aM>`J~(Exk5zVkORp%nq)na=jvnv)Rm^rH=>QylH=%vK+BRLgca? z;jL{b^o&PT`cZBWu<&910|V3XtHr{9eNEbNs&f#lXO1{LVDL z@!-X#|6jfy{C`Z&U&D0%^BWkbg&qEH{9XdxDnuk~&My^!{|?&toq^x3sL!7x60!1= z&HFv_FO=C_8vkziKMcb2U-R76IQpWF7XW=chZ7GriqW0s(AswSkg<#q*3=fxUB&LY3{wF+OFu4}cJ$v$rv` zbuxNa_^N=`?h>s9j0+jiTCr-ILwa`_sf@;In5V}OdE8IYMAhCH;N@8FvPQLUj;$;c zA-4`+RgCB-4}w6Rt)!WEj;@B6cP|vYLgoz+yaRw6)8NmE$Y}7%B8c9xR8P@EN-Esdd}Q^PWDbgB9+;n_xl*-O+Kyr_umC32W(bSXZuiCqG{a__I&??jsJ zyGsDID2<=2=cG^J$DG&;DtmE^)XWXv|XHINiYItq*cy~IaB6g&!A6#?h{*y zVgl_j0V$YS2Y5)jWid(D{whz>KR`K44Rc8kr|4m=Q^5L(4hk73b!_ zk-op<SS!CZht&Rh6!xMtcej+O7?kHP>K-2uHN59y4w+D%0Kx0pidKiB)fDdjl3`NK0A0gTL#EKUz*O`aNF)e_nKNlQ#dwdRa z-hO7|+G?>c%a7SZuh$en5wYV7{F^?d-v>ba37a|N*YJkmNdy>1%FIA`;1s_^O7ZwZ z@MO-BhC*?cGxl%6Y7a_dIYpl%{l2dIYSwN&(z)^F!XNk9YjGZ`hD5-YukB*-d|rI- z*}4Giz%LMp@50`FpnlliU=!HiX3!F9+n(1}lpgo~!CRnwnQgD^J-L;sL*fRZXUa?P z|E8Q@%{nd?zdLxmSdbsO3Ul5#?F!<_dDMciF#gQb-$vqXgYmhWDzC&!V4cRVj9`1# z{?6KC;r9&Xd{FZ}!^Uq=zo;h__AIVT%|vEqjC~^eQh}Es7Yfl$vW=#BLL9G z>jmZU%z3P!aaN#T1ehTAb=M}d1 zWh#YvIxy1a@%>CJaK#2vOfyDrp&o1^9bKx<<1>0Be5V}@FD1htYXG{+ULapW!@q?H zb<|&r`l{w{2@15xd19;}{7`i$0ZJTXxwS%3o!Vx*27U^@n?vTt)$>H)_GHbUNm$*Z z2h#28nY-kzfS~=9ZC3l+*!!doIh5eoApS~Ee>w4x&|Tnt(sB{bf1k8oqpA!Vy~NWL z){o&I@x%xgFlOh|5BdvfM`*;!5xOlOGXi4*KRt{cMhs3bXb(Dm6lI2ZUr_pz|L*&O zK++6;qUi+R*+Hudw)mp`JNVD%m-^QHvTu|AsYiXeT!!XpAXgG2boEHB@gDU6A8~g1 z3Qbi{R5(9K$2v157>$Ro!h!)UFO7%&nR0#8hp!zlJ_~k;TH|-ApA@4F5eUGDBj$VU zz5rhPFVC?D_;3(M2^}L#x@zO+p;dV0wGRhDrK&NS7unF1#$i2LnjF53;G773LLCj= z(zD3>dieeqh&*LW(5>6g7|JMU9EQgY6`k+#kRx;KPHwwgY5>Umt?st4TQYH`#^)GK~giu7jeW?w2#1`S}hxP{bb9};I4Kx8=aV5fg>CPB9 zntwE%5krxt!+|V*h9kfIv9Hy!+NfTb3jD^Tk}2W;!t^|i>wPIQ;EkWjKj6^kZsW1- z^GE;GokGJO2nypr_v#<=Z_0R~ov85dO7HuxLHWT)4Xpw41Lj|m-+rIh>Ok5rdGo#{ z)Ez}A7b@Jr+tnCefgAr#W99+QNgD_qAk#=;UwiX)9MajELD zcG?3a_ev8g!MGXqgkVpO*d5-YGC0gnsXGN-Rf-Ni&-(=GgZco!whn#Yqi$mPLF`Y) zR~mMR^MqL6+5>vuAC>vXVB?`8@Mr4=R>Zzz_I(DAf315xa)82dKHr}o6c+=vcd7n0 zOv8wC&*$4&G^JlD*iB1aQQZEFEO=Pg{Zd3+PMx^o@Ss)z*arui!h2!Q0mckGAE%+N)3L zOS9^F?AftB!{(H_#=l9cU&sx5G@0uG0JU+h574Vl!}fugvIo$kqCP-MP16{L`i9Vl z9|@b)L76PS75k^ABvUy?E{zm*L+7_AzP^dsDBp-+3v~`SX3w7EN-+370QJ)s3SYOQ z*am&yMBOW6wNR>O6~2Iup@Q^Nf%*v81N_Q6QW}*hV`H4RX6|`hI7|ayT2!mOENIAB zO8{S`$9kZDFQ>rLZDM}CoqvOvZMn&vUw`zW2i>DeH9(I)0Z*x?31BDS-u${MbxacP z&+%D-`>_29>NNe0QHyE{WV>?biz;qTGgZ}WuE@h%GEO~*ePDu9Kf0DxZvD% z4#ZBv4j-&VJmA|On8p0epV8&z>hJtBi|EhiSL*{6RBJvDdj3!C#(;3Is{!wS15MHO z6p2kn4Q%>)KtDOxb>+2ZuRhTyHg?8zZ>Q85!%?jq&Nrr@GK@^oGH~jHZt zml^OP19XA!IRdpds+>i*bI*Vde0w(IH@@#KL#`NXz^TJw3-EPY0V5k>cx6@{$+WJ+ zy#3I6T8&eB=~Y<5bZE+G_?#F;`w-L5*lZmgjt5I}(Gj>qa z2fy_uxKY&|eGd4s*sVs%Wi9&v1du^+Tt2~Hl1yR4riWPwP)gyx9c;HN95T*_%jM=` zeX|UVEys)qTU(zI9(T@&WYukeS)z{mH3hC&(s+4UMfh6%wn%gd#5g3pcoz-51gpS} znF^=owq(`y$)}x~>z{pdSj}_En&&eAWgq}QC8zXJd8H4Q(k(3A;*~zZFMU={>2vc+ zpDLxVW$A0Z(pouh!QuxpR{)b#y#GgpE)@kq9~lNkNw9X+bBU-EUd-`uL)~)&13GR! z>NH24K$x9btFDl5*+fqJr_|TsxLffQ>+3L>hLCci&n2U8InlRb&gk>%X%1d6QnX3$ z!#L3<>{ir+9>S1lvGTEqCfs}Tk7_gbhA+Ts5XUm;L{N>r>Ty}?=$CIOuL(EpjWW`~ z{7L5z=bMAb7k9&s=O&%MCEpLITGJd|Qz(;sj>wI~zYv*zk1yY>;MZo=`L|gc#0rer zGTr4C0s-$Z;ugDrlyr106*B4+@ea->++dFA~S)%IU@Zxa- z0MxNEKICiT4G6;{-rBxN-y2>TzPYR{$FJFPdf$67&}YQ!xTP12pvF0D zo-zY3WQ8){1gv%d+yJz--~kk{gX&vKx$!Y8KKvUI?2bQj#|68t=z0UXUi~2mI#!Q_(FIv&d*8HT{t9*h zH>3Ic1fPBaqww3DDRip?rGLWsle7<3(ly|VWQc0h4lKui73<$+>>tg_(oBB>3obeS zvP|m-W1kD^i5n-Nhy%~npErMyJ`L})3oOUWSb-8hYTb` zu`+`R#J^1d<5bh$3db{sAL!SqpgLz!y#>RGyz=n;!Lg~|zZm>6 zXN0Vbbf&l9xUAs&kbIbnz?)BliJbWx>J=*+d*3=dgqQU(e}_;otZ4s7;j(C&-#h`c znA~Xl=~I_}KhJ)A`D6~u4o`QnS#>^|6HsN%n}QHt+7{>XC;ZscLXQ1-^L5xmG5vba zt-ad$1nr{8{)b&pp?w#A5A-zIDgrwdtdzpRUS0&Hv;`NNUp1^vbJZ$1q~n4iLUXZ7r%pSZZGVk+C+nkY z@TTAH*wn^;I3GK)ih)P@M)zoZPcMs%@HN%w*buX`C+Y#)=gbR)?Lf}%E_Qipj~g-e ziLb+BF^6VJ<^_w>9nvp$M;Y!A%G{0@h~PF-$(n~Ue_|S6=K=y%2V98dwYVHfHui55 zjvpbG2B&iA5|Vqzf;3Aqj~o{egX9hZiOhlMX^pUrizd6^leIO@>%J1s+lG8hWL38bpbQRNx`L#Udl;<}-x>OTDOlt|??ubEwe0&-)xRLjU zaa7hZmTLX|kL(cA?WjP;3hAL-mk(o3o2cs`=t5(~=kJieau&7ZwhCI;WifT_4IWHQ zB8D&RN%;99;%#tAxYX*_z9PveXLjT0@67!sK{kxMJ{^_c8v2k&gsk3(40#BwVN zYDgYAZOl^F;c+7VNBgu{l0(?eXXy5=dA^47$@nr`-jQTu|EMCi^rvFB1QkhtiRyq5EtX7phrO;l_0d3id@Vr;VJe=Kz(6 zFSbH7OVSz@;Z@&_C}h5kc%iVX`JAECM6FIi+S=7T7>%{1O|vT@b4h?qX@Jb9RI@Ak zRPQ65*$eo);y(ge;b=IeZ!nH<8tet`+A zwXdH5b26T=xKK z&_ZZQhnY^sXCuFehny%Vy3~=LVdj{7FE^`U?&G}2ZiF8wV#V^2+e!%40gjEM9P^NV z93o=3jZo^f<(4*_FY;I3Kylnw!l)B}YU|%^6>i{zS=P~VIc?-z{T)z=_<2@{W=UFe zC%nqsK!P2DvyL)r7S$y>Equ<>X_8T=A#F{+7Co9Z{T~Kg>ZUaVA%A{={FksZOa3FB z7V>ZFw2*%Z>CE<|3vX+y-r5Iy#$?AdNDHq^`>3W4s-OeZWXvi7Dk2CA^ErGBAE|5$ zRduw5YL;Z4J>~b{3lW%=na^beaI^n<^@8Bw8!}R@&2c7&z)?XQc&A5jsDxmM`WToT z0>cLwFJ;!EBPJJm0liAlO!d()IRu(Jhz9d-L6fV}i73sEYzE$Ug!=StmwI$DRd%pX zg~=hPOd*xSi&7bHsQeOWQDNm4FDS|*r;SnDIINn18B&pr$}p(l;@UPn06R zh|gInD7w@dKoxl`=M}@}+(smBq~bGPIx6T${(*C4jGyUJuVyBlZ2FiWUR`spy4% zeJw-A3i=&X86Vmzd)lv#4t^QeR+*r6T^3V&IF>Rx4RYhU1O@vdm(xbhRVSbl@ikTm zoS1>6tup!O?q6D1wnK29M)@&3BK|6!CTcYWXc&8Qw%l}@2 zv-GIyDkukYD61Stl8ybN!||`PPRs=HbgSr0ME0Fz5`gL4)b={d z#{34!Aw0}5E6S~B>cNgT)RDzBck++ci#2u2xyqw|jJp*tVyd9-vPNjn`J+Dm03>3W zn1GjLF3-|5@*BczQC3Ggc=H;te6jNL+D9*M&2f1OgM>j#Y zRk(3of`WaK%V{I$svS^?_#IY=W=YzHKzQ{KPCNo{g0q_P8$PG%G*PRGNL$N0MHW8v zg2JZxE+JDBAd?ZTXmz}*(?aHHq%&V3eq)1u;652&YPokLDV91zdRuMJ_X^Z6eJCay z`-`nR6rU^hQ1!`<78LXBA%PpU56l_7NctJn2^*RvlWPyl1x1(I5+!u4V zaU&OfEPAeFJ??|hBvX$a(~z-(P5}16ht?k2ud!I&js)_pJqTLYWij=Yt38-j;l_0d z3id@Vr;VJeWq?Y=ue3rmOVZi{;niIZ3c13Hs-*n*PCWAu)M=ttsh;6)5gjBJO$i zDdq}D4&jd$fS{>DZC@t=2@Wl?NN_R^lAE&@F`o5+K|G3i_En7=^#tk_97}pW(-_iQ zGP(9uCMdepZ#_%Mv9DeUa_mx95Q!TZ`ynqKOOdOd!0AWUzS@yt*CP1P+SjzWXFDAV z`PRM!Ee3kTb9bW$(<n-+Nn>AJvGJj9_WG)MkxhO#9ETl6x2YSZY;9hi9Ky!JB+BmU?o*5Rd5!C&BA-q3GCF~~729DwPW-uW80_;N020ZRKJV%b zSJ{+R)}UvS{o$1>bV+pu>isJ>6G8_S*_DVt)?PvZEyx%@@CnfkU1+r<{zRJ zt&WUN3z=7u&dB=3J2ghJjClMSo6$$&i`K6xHbP^&5RcAab|x4eU)%~|-}j^Fhd zp>2(Tpb5A>{65wJ)(#B3gH4ihydNL@%>#_t|ESK{Z!+H*4MW{+LCb7C9=?j zjp><)^_`R2DgNGxjEC&Z93JcJ->sx4HnTT2=NX;-Lag%xWPi3>$wwDFcFu;UOFENl z8Z*N|14q`5lqH_h{RAIEn(R@5503{S^$~T>U?AD&>{V;GD#3l^$?4qZ9rJCuK>p7G z_Ha21bmkQ3QSa#jx9I}^IFscN_x+expe3h3O1-NKT%ilRq6?(djb4H2IR)BPMixq zQ}(k^*sN}O4Xaa?SjfHvzc7Bc;-}vi;MNtkE)jm_oH#a?+#Z+mSn^bCKOQqamOP=1 z!A(ujR_^}ip!=5%YwH2ZPr^8(eg$TW2pGQEffrhnRSDH{ z7Ta$$VRsVoDi>9M3~HRsMQ$$CH|? z{fB%QUd*uW@XF}@jr}`?7azx)`>O882VT0?QcozgZskbis$MoBB!H-P9cV65i-1gW z^qckgihQz0$G%)l55m105)s&H>r-?AjRy>!LmWp#;gGsyJ$~UhsY#jfC=+u^=SamO z1x@jUe!Yzf-88JO2Pj%D-=m3K&IYSaLN|dh5WQdBur|cj0DWWE*M5bAnsy_vyhpQe zt3et5x?C<;T#1jBlv{?2>OURZh&A~5yg6~SO>&=tXE1sgbEjaz8@+DZY?e6pChLK* zt&DQxnfd$`UIA39TMOt`d64j+-7yzwOv~|niQ36~z$i->AN+G`m#g3X+#+}DmaA>* zDFA9=3rT2F>#vl|diA~}gm3kRPE%C%Jks(35=K~-5p}X{6dqtw%dH$W>xVQo(TAfS znB$I;o$6Ct-7KaYVs*5>8dg)!+$NXPx00<>flHraos)AuYc?n6go2#?3vy(-94rO; zkYA*t{8~KG==z^n`6XfG*J&+3()zILJcK=J1;HHI!Bpx;VnzAyQ#7odq3!9IWdCsz zo2Ea(q(fx0UD4MeUPn6@)7{9u8Q{a#9q*DZ_nXumKcIFIPIo+1$;Np-g_Syv=UTJsC1AiB} z>uo!H&2K7bZbpicIM&4AtE*R!YgVP%KCIL90_smXE!J{}P7AX)A)WcARKM2fw19Ri z18H`*#Wh{8zONAq(eLTB5Isz%h3Ek~Ekt)mI&+1uXJ=7`dSQ_$k_Urvqv+&mR*7z8 z-aGPWgy>if3RBmA&rY*kb8MQnn=iKXl+i(W^&q?ys*Y&YAL+3w0&F#&m*1L3;dz2qPuw=ZBRCi4XyhK>gYDxu$qmXy^Ge^FXUO> zQuR2duIOSs=TH!z)Et|J&$)!}>y%)x!1y2-kCWWMuoxJMQpZzIGL@*!s_)342JSid z0vWbCVN>z~*-UwkMZmFAiXpsw*-wvG^t&VV6Gw0+<+Cu=i-#J=~5tAO#X(oW#AMjAQxYkLRb<8)o_CS*t}4`!^;7A z@j9>iAuL7Wbw+Xh-YvaH;%Nqt*Li*+CnD=WLR$AG#p_HUPBYawRPgIXh$m~g2%#*l zV(~iTgxot8WRv1`9!4LQd5_|FligzLX17R7&zn;g#OuU+K^t944=yTuDQ%}i(l;>e zB0dMp^8yl25#+DP)_yN%A{nEXK(oACN<}JV4y>bK22S=`>Y$-I4%A@0>7b!HZ{SFA z15+eaN0@sBAc^?H;L}tdlXez4gO2H{Mf4HEhx$7DWu(V4e``r2RHp<9JB9rIzZRlI4^p*cqa z-6n?S++ECUiiPIHmk6(J3ohzDR3P}3^yy5yIuyrg(@+wtp?>LAbB^(F6hPy-L<&Z} z@|u)iMEAVvMBjK?kYQKC_z;#UuHbmzFb0jvxow_jJjJ7O5|rYXfJ#Wrh_N4rk68N= zmw&{iVn1X>y`be3J|FXCRx6RVCbZqZ7M1fdf{~y?Au~5XW@doQsYqv@#3ZyxR8BWM zk8UewRsM)eOh)E$ER=}dnW&t*=ThdYA*hj=$stT@av&;4L1$QEx8)s4=0@e*DI~76 zAXva2n#4=n!pUuk4xmU>PKJ`B6T?C?5ZMJUFDj=3_D~R&^SjD|sGMhtT6#4t3yamn zY@%```UXC72J+Ms&?GEf(({?d2vr;7Y$+0-MyPwOzAbkWE!n|15?cDtyvNufe_1yd z*%;LUIr~iUMlWOb){jG^VFGfhurH%)w@5%v>LOe9`2jg1lGCR715_e@Dp)nO&ZM>U zv9#`K3rJ808-QJucU4#x#l*?vA1CWoN%DT7pYD@vu@P}vd8qk{BpmzpM2 zcJiq(IRurTk;=oIgvyXO*wvO9Dm!Rd^lg_)pHErBJ{2a1pt3KioK}QN(SVzHe?PV8 zW^qw<+6X1RE7RBlq9;J#CQxxjsF`@8TYOH(Im5Vf7Gs@S!A!D(V`E}rAT6pytL=FSBaV$Q**X)sJ$Um`&;qvk>)6Kk_n3n@%q?+dIF zNL&B$>Ncpb&04z`GPhsslQ|?nX5RprosrJ`ocQw$!i%-(6TR!$D2b`z=$Mu83^WFF zl=LE|;T?5V^-7U=icsyIUURC-hS|7MFtWq*Qoe;d^{-*@Y-?f}GKz)SobT7fpkX$t z^ZeQp#=I~a5y@%O`~eDMWUy*#i%DBsI{xJ%Q6pJVA89#-&$oS<)k{d*+S(6cFq>Cf zLS_S^i=aXw;{?cD86dL&=}cxMS{EFJA7--;&ZG5~qqzXZm&PnRO939^_RIHW>{Tqx zW>m2J(!gfojH}mJBAt16OW-%d z_$y}7J`z39vUqS!@!4Jv>IJ5-2*o^8m?t;xY+O_issk)Z z`eLTt4hDa~6f~4XTd2FeO3U$t^8`7*oht<+V|t~$#H&1aq;Cp?#nsI4t9j74n)}Z7 zO+gs*;%Y=Be4B|<+zqHioZlEQrof~%1qpaLWwz9j#Of$5r||iTFSF`J+M2>{|5{wl z`v@n33WZEVfJ|+G%p9aMuNNIIRfBB~%GN?2)QZ0CQr{BsPVmKJatMb5-P+cxO=;_y zG`N^W;z+W198GakGI2DO!lUU_C(4amfs3jGNiZ$xU73cj(59rJB(Oov^eR2alzKUr z#gKiX6pTFoq?DHsn&cGUlo+>S7Y>3UG-G@-88n3Ef*HOk31eOejfiBz7iI!#(C`HX z@@nL{QpaRP{YuLzeE!szS;djIru5Rk7D99DET7Cl0Wy09$b1{=%=Lj@Z@06IjG4QK z459J*v-77@ELB_6n8p=rWPJe8fmaUyA(*I zKkMIE^vu|x<&|m68$rt(rkjhTe+Lb~@+3aRY12^g5TP;g|WPqQZVx8$E7@D zV^sKX-|`r(QY>)hCMeJLXAC>B{h6ROfioYT;lbnu&WK1(o8}KtiTJ<<&xtWJAOuUd5*mFWe}+y`e9 z2%O<+zX_cArS@|v^@ksDcci5P!>r$9(DDI(uOfXUVq$)T>$h;CN;P63 z{QV9vIq?+1^KyBfiWfgKzGQvnp8o^EGZSQesUUc!P3+DOp84Zj?B63Thf46w85m=2z4$|=yJ?$!m)(*@dffga_01y0T>04?eQhv@>h=mIHqx>sPAoC59YE?wY# zfgE#~F3_&__6mH+O7#MOma98;fz`Ue7+qkw`b_G6a>rw|y2uI~PmNZ6_Je5EcVl@^ z-GawC!85O8Aqjqa0Bb)3W%&IDKkqyy^S*v_Y^6)pVo#E|Qy@B&OuwTWK2Dq(OflemY*fk=?eKwqbjKkruCzVqAydm5)rpk3J zRJ$sZT9>?uI&Zo9f=$XnUUy|R`9;hY*h_&PPJpZ>zGbTYMB9X;>&D@P#;Tq~Lkr6_ zbS}YVC0YlXC3?`RrRwz4tcxL15buh(;10#) z@t+etJpT8)4@?`NWOiS0SJDk5lTvvb$T{`Hvsb`S zk@GCz4`fSys^>qn{GPs*I)zg~p50QYZ+pU%i{q)>8lga={QuZ{6Zk5Na}PKO(I~~l zt+i@v6gQ;Sphi(d19J4Bq(*C8>W2GzD=xW3E7xF%=5TtHx?HiFQL(1lThb~v;ua8- zxKv`bl2%)f)@7npDWPXe9tM`$Qif>HW;HF) zH#yNXc)1R*=&OG4_Y)z34m>I(#hG&=;tL_-3(Or*_Yh88ys@nGswW5`69X5E(+I)0 zt1-x7d`e!C$*4b@z(Ms!Zda7Edy$W`7=DBGuW+W8ltLGJ6~k7SFGu1OUb#C%PWH9T-k02s zRwB8~tnbS4Anv(u>f1NhPwv}YI`2Co8G7?g!|al((yNsR^$iY)Qd85rU8o$7jjD;X z)H&)IeD^A$ovO(!qYHr)Q-S?nKIpm6%~sEtW*yH0jHexzq?Kptm1y-ZB+f4VI zAqrJgWo?(aXd^fWQGF4X=Y!ZxOkD)>4}Q=w(0N5q(6*#1{52%Uv0lVq%N=h(PpJ<* zg}ow*`z%J$V_yB95JM5$|c%pJIRc^r4Oq=kZdB$k^QY zIUc|dZSx7+1`(f?zu--YN0u2{2ta^;6zEB?7FT2G6=2{E43?bOO#scuvbc*8QMCvn z0+9&#N4^FMLJqhK@q_YHm>y%HHVV@t;6HCq20d?^;{}8~?~H?p(JOpDn{V$_Er`7$ z@$r}+;8WB;Cp?Nztanp6n-LaIH~KRDiPa2JClaL zQ%=aD z9i7e6M#v6hVU>| zlUxRCy6lya$q~=UQPd5b;$J zrqrBfIo-K#p;9u@WKJNmU_x8Fr8cRFOBBaXDba&yQ_F!q zc--Q38?#hwFB)gS#(yv;<8T@!{-B|0ID>K;baUr&bcCLsPd@wlG@NET4SYQw3<8=w z`(|>x=Y_%H6sI>$j;#f&*S3QaUCFucNi|;KlRh9h_G_~DjNcAOjd0#vd;y2(FK};{@^v0BVi;)D8k1B7NV_P#{VoH5DfyK3>*YUt!TOh zy|fm<5xxaDG8k_!dP8?$0m|X4vQmY;bZ+xl_&n6Pt6Nz%<>a49g+jem$&_sHLS6}T zk|F%Z;*a^7B=bOF;c@~n(Ohwy8?ge39Wvyjz2PodKFaW|u+r*uVzsam6aW|jlRpN@ zmVl6~l*L%_54eRJ@ zAy-Tz4eOvt;P7VZTFk{i!T1CgutB5L%FoKENmg!)bq)z}%v+Hh`_*LXs{}rozEQ?8 zX=+L7RagYVa1p?!1)KC|agYGp zU&jdHH%O*75Z>}_L-a<#RKfWmy9ukY0CkOg*^xR=?gOdAh+$&JVa6DL8s=m{)06Sh zaVBsU)dMwR}rk}23PHZsvR1NEOZGt%qnpin!Tnu@^- zjd`lAyGp3UagB_S3TROp|MlwR*;hc@g=D*`(jT=5I(-{Z?KD@ED;IMIplzH?ZH!L~ z(wCK_J_k3~5cJf$fK+}x`?>&EF&*>g7|GlYQR%qdAzcTZvEKBt`lW6`dd?zhu(w0S zAqKlu5flkIJve?yz18eXC53kwI;_HcM6n84x3$YucQQtx4#q8MK>{xa!f z_7u&{Uh47ozV1klc+Z>8k!8sg;Ea4z zJDNhQ38w%&1!*QvIX!WBh^O+69@?%DPc?yf_23~=XSC(BKJbtzIjiYZXCY$(_%7mj>T7hN_^kQd`YN^)N*6z{rW)peDj52{E0)L1VZWj>l2oi z5O?(L2?SgMB;HjQ1W@7l6NF^MII)PDr*vM0AQ99VhvON94$(VO)`M#$Hd1`{tlqCd zY96Q8XGjF@;)j4~tygSND`yNBvnRIbzvXc_0f7(Ms3U72$%^rl^YKzO5s{goC3>(IMd zuH~%`h{(V27bZ}#g}W!l|79M3aDS5uEJH=t??Q3{$efPN1ZKV2%9-*d8-dY{1Vqkx%y?~ zxV-x1!4Ja&$j{HBqVn*w?|<&U#4Urh{>2 zXu28!mn21C-1V5x`R)FrikR|*j1BozE-moFzjw?-2aH0J*eYIm*@PFXn+@DniCd8R0a6$)gJR2xpI#1P$(48>q z0ML?5r-+_b#uMpnnZIQ*9>bUwGe2P4rWperyA__iI1>oF9} z@@6;-A<+w37w7EV$$rhVa{L`A%{ibN9KvcQ; zmXd>X#@F~q&%4+M{q|lc2u&VtD70D1q8f1~ zi)YG%2HW8}5_T^@{#yekmNmo++DtVb1!|Zdvq=O~I5G{7=_P!rJTz&)QL+i)&~R5w z)d2>e9y-j?aJM`R$_kxkinKQotZ2*wm4Yr5mXl7*8Cy7MbCA1QcY|{xjIpisGx?3% z*+S*a8~A6;t9V-a9duw4kO=F*3v(ok%UJeTTeVi3h zo}v|KZfKZVp)gy_=4qk?56m@7SL5%p68+w679vk{=_oV|k!!}ZO&aCT29lc+w+IOH z6SwRDo%)ikM~;07b_LoUa1-`zlu(LiD!Szy90VXH$mVIx#0 zH=BNpuz(3GW`l#9un%_gCTyDbXRDm?!hK|zq>dOcq)P0>BRzyHx08#x3}8(ca)?8A z3z5_dxSUmtR`^RQ@sxQ5D}7?F=5(j)o?41@kRs7GFnmZ zboyO4NmA~!W|Q587$}Kcy@xmUW{M!X@*7~=a6Ze@@(b3jd@#d5W2$}*%aWpHxs@6Z zu-K87^A|Kh4M?4@nNzfxI&J0xq=+w_&t|?CZN@>fp&yTH_z*O#7&zT`>PjC5wx)Ga zTOJ1(HS%GinG;ppI!%$|In71=A=O(tGX!VDU@38f}YIaz?1o1!_PBGBi z!}`tRXw)4u7z>!HRA2e^Msk@upDt6mClH>LdzyIH5^Y0097j%knlnI1Ig*Zxg*pLx z00?b~f@u?7ooX|e!!YSvD&4;U75LO_{)8Vq{|&`bODzv4c;v!m>4`491^jt{6oB&pH589C(kbL$hn7seOB%^>j2 z$_t-^UsltC6RrIGtou%9f5YTh%my_46B`AVZ+mTcH*u3|!NW)8kV`5(6d6(Iu$aO4U4kOkBBfK9t$D@+TP zPn`k)YX#1r>u>Jr8amK+%2kfsg7c;;pmUd%gAGOe8~b@$$D8<1J}tY^O_c4*(kA{H zvmu_AK20tAL7*3;fgqsh`x6IFuUD3{yUb!~+WYF;qvMW5Cz90@ZTLyef#|gkmvPp% znd>po-g}^!G4w3X1C!4!rT0~sOLrLZYNalV#Z*!TuYh#JE&Tlm@3$cF6;{-lw-b4}t-7=i=Pgm@I4 zi6;DXP+t$Io6KK9iq6D5V7sXIA26{PK9v|o)?#km08PHjmljlSAKySNj};qbw3v7C zHi?~Q!ag15JwDo+Y1rN+{9vxzndGpA8hZe$*%$qEG~!$ZTv+AG!;{t^S68(7F`1F& zI`c#b>jfJp&J%3>8c$0wp3#q#pu0}6eGw|h0q1maUvSeC^=~qH(lk}Sq4!e@4(BJ{_||%*jflt5SNK|BU>zM;H&7&7mILjvrYl>(_kRbmb`CK$_lS&U*ZVCD*M`()$lS zUlJc=8bT(&!|PFHf)7^wAxBZ@JJ;us`bAg0&rCRom?%DyJ?pBBUkone*y_=eTQ9Ng zv%aqH%_IBT{ZHk)U{vAxcn`0XH!Dc-==bsn{j5g^o;T)hYN*)yO9A{c8l9BH8KQwB zRS^HaKiiiXEWa|mUJ_qV-I{tgKYaBQ*UNvNsfE9O;)wj;!~Nx#XW8Cv<+))il9(&O zr9uRq65b4O=_Vn5!77U7@(y!z2;%7c6BC|_`wGc-AYWnnoQGIEKK?NLf-lfr7ZC!xavN#|6GMNWHhdWYK={7{zB_65?mYq+-0udu8#r?XkC zZL*itRCe2Eu7L)fu!daQfsYxg%1&ADHbvAmYo*zuiz<4a*ms+p@QYj1l5h`!I4DR|<=m;f-GgtD z)Nl60lpEGyBKl=k1U}I*EvB6S(4wVbha1Z9FwoB5w8MLe`@`RfW^)$5rLl6#BgoTr z%>?isEr7}hwdIxq%pXfRVV(tMQytMlR9L_YzXQj(5g|BlFC*{>C!|aB>+P*?z&^}X z^a6C67nn-b-YaisiEn^uj3c(v5l+jiKlA4wgRevOqOg8EFOR(B?3dLD8AAs*YmPed z(@nX^1fF5qIO3VwR8^Q`#J`C18=o0@dtR=_Z^#t>q^FlKHub+LK+9ek#Z2u~61?c< zHvk9fU}8hoMe$qmusAcpBxBeVY`Lmebq0G~*G>3jZbtXz_>eru|52FGo|yEknWT-N z;SMvvtr||4=3%s+9#tM5wPB!jm-+QKA@I6JZ?Hxm?1$_!m+}+$SH8$;s34UZyG43O z@U{oeUZVsD1lOiqAAGARY{nbv|exZu*K;z`#4q zcxebPm-9!A8@zri1JuAM{GS)Jn0PRO{8jkxB0r3`WTC;Mc-5j{7%N5KP~GBTN2LBL=XOe7idnI{s8)6HtD})46-XyC$6F1 zpOA9Y7M;!pS9im zTpF)#r}`1u$*&IrSusBq5TpCm96iFbi9_ChCHTPD2Hk&!ArJ=Ozu1)@V!n{mv5YrF zWPot&ms_!`h=hnum;9#L6?s+7*KM{F+)&+j$oUL$VF}^|3tL`$6ZlugtOS3Fk^qrZ zjjI0>#-HcI$o{Ks>#+Z-{2QzeuWDHqcR$(vSLgBNAn}Qx;EAb7Jit9>8)71)?7PjbE5jLS zR^M27f!p+~5;De7Y%#{Ix$(QBMW1;tL_e25IV!gSN6!d<0K0vI=HsdT2V=nB690yr zOkU!I(3G;$d19nEFa8ZN&3K(YqAc04998gF=8<}EehpAz^AA4+0R>sT_jm@zu;I;h zn+=}^f@14Q0e-yx8$_OC@_H;g9(2Bdcvt0Uo_zQJa6I)eS1?>Wb?bBT035G9o>E5) zWMe$le~RFvCK^w@!ncg4{yt`i@l=Jbr+^O-Prd&vsuzf-R`J^q;;EHVP6)B~cnV?? zilshbpxr^fLUz|^y?-t7)H?;@sSUab91VYm+1kZZzZ+USb@y=NsqaxQh2yEmXUdB~;;GKg z|2y&2x;U>OJ|FYH6;DBJbmzuX`u6|h@zf;}o6xE6Fy^-ukN;!w)V7g$YUNpor@Bi8 zPR3K%tz+Y}2!pc-={=^8 z>za;{%ou@5=smF4p$FTTbrwMbFPUCMA{7sQpsV?`sooe?!v#rBHm-i*$%}8XxtutL|K8Fi}g6Bcw+c@Jxv_wm5oQ8iGF-5>czej_-za& zv1Z?g&1Uqxdacyz+e0~d!MEa;qavPJ$1dWBsS)_|mR|vX&iw2~$6>T#f8x?(<;5WW z#19_%68?mSUY+L4&d*-+_lf-f$nX@EpMNR~$>&hw7h4|q87KyF_@jF@mgh*S30w)=b4CI*1mwHq^OjQ5 z=$YQ)w3qm2&H__T@Q+{(O!%j2A9N|&{Eg|5E^|L1T!TI>n{3FUtoV2_D%xc@=1$e) zgXB)(=IBpH>b5_X7u^3UN($;cIC6^a#-xp=l-`IF9Qp?2-r#yq zOkN8il%YN@!XK zlU~A6nD2fz61_F@x6S5i%4~~=(s^@$CAANYd_g(7Bl>F8XWtrCdi6W*C7KazS*CM5 z^+u8MR7jWtq!j@yLE2*BqVol5tw0(aTj-F+68te+{LLZl55P8f2?8V8c4i+yFEDl_ z787ar{8f;)x%_#EZJ4LQFukX9-7zoHTFqG_h_uBqq)FXNSoa&UW~o=ZE(ZJh49|oB zgW0q#kRohxC^N#$9NaGVoo?@(82aGO*;f2BF9kyS8W}-$)aq+V7fojbwOp*_nL0S> z#_X=b+zc&>e;MV_DJ8upf*x3HTaI_6YBGIkNiw}es@tP-^v{e8w?98rgfcVGZ6BNC zp~q=?Wh%7!1!x}sT=QkUpL>R%25uwm8jnE}Sg#Wlfpn5Sooei39^^a>CW$L(2nd3$ z!(OzMgoI?yC9yU6ICCRQm>)fD9jS-qz?_U6m5hd^shvM@w3ZG@?nN&Mxj+01|2)Kg z%}bzWZyhOP$vr;wTiil@Z+kZ9fT9*ab0U7P(a~7xwh|;QlTTFQ(y9mMuAm|jCDUz= z@3%^(pnVM6)9az)3ft3}fj`TcEuJdhgoD`aq3k;M-D)0!S_5%f=a+r{#5C+Az(H>H zI4KYNGfS_=CGr?m@s|994VcN(Hg8IfSU!Mrf|%xnMGKw+^G*3GD+7=?aE`SKu0+;+ zOG{+YhL%`DWCm^YnEkW_w3sb%y)7|6DQRCweJH)}U2~8Y>qhX0hHw(l`O${D%n@1w zR>C%PXtYGT*&|pFYkIrn0_PK(OUeWaQXMg4X^xZaJARcet5Uf{KQ90OvSDi?h7t3 z9}tG;Szj*fk-PP#GV-79MnXUZ^kRu^S)Lls|16L4t1JoN9G8#CpIjo1uOBOa%Nd%S zD{eQ>y-Wp~Xvc$*`$ee-5C04=Gng=tTL&;>g_(ltHq$0l2eFkOFqzL46z9ZpUO*722`&g3qwDMb*~OQZe@rLpxHM?i@(Rz# zH#$B)|6t4t+YQ!gffHly<#Q(hX77vvG(*FUSNIPF5zn$<4nOC?A2LX|t7~htsHBl5 zB?!S)38(*-A)#L%&r=^6E6hKZ_{u^P;J+e@f9T{`e#YjXlYezSaZCCAZ<|kyiI^uw zn12X=Uy|!HgXG`IMbI3>m&w0-fM-q0l4pm(c74(gyqtgjBdm|?d`*O%g7`AvfAW-U zxYRYK6NG_~Be5CvF{cTbFtN8jWKj|?INON0;gk?(RLNRuPpbAg`ShRg$?>Dd+|(zc z>T&4woAP5A-of=h;H?9XVCs{b<}~LH(6yTv)eX%;aUc&D{Q3!Acz?1=Mgz`)hayy< z+LGIUQQXu^erX-(11$#)*QafDu`P2wKKA|+mP;i*X1~gX{zT3A?Hrzf8dm(6tq`k1 zD61cW^67Z_C-RlA@$$iztXxAxY|fxMEM3sv?PmVlbObxisYvz&OqF z)Tm8RTvA?X!@C?uM(tl%-%vm9g?*%@_qE$@0{u>UN?Ej@)@CPRt4XjeCP$xv|MKFm z3wX=|5A7UMJyFPYfBF+v=dAZWTsq*nsTP<8x&z8Wr3T~8#ph<*6vmG`?}X-w$;W6L zG9aLc_gLMEomiw~E78Y^q)as+)Ju1&-V=!0P#pgVTuVpdP5_Qa*>!pmFbD9vP2VW| z$l$C3dk+t^$kwbZ!^6>4{FIVyv6%Ha8>-Y?Q_QM*8ai&ErFPW=f+4QvHSEP@9n-{8 z+AR;)Y%;%>YIQBxV^S{!*JHHW`C77!YwrXMGugw7QWW#@vfZy4pyu(X;_^CobvMTp zCLwY}aZDg_1{{*b>dkKztagkKN*0>3+xL&n0FOd0b?59AfTOgriY?;MGxHaL2pRZ< zRF4+}Rs=+*ZD#CjK)j=qY7-%$T=k|Bxm{ESl;{@25Dh=WB~f=(h( z)hFDI;KZhSa@FD%VS2KXCcKc1bUKS)=gL=?+=wA{y(8S$-+PvP!JD5bml1b0fWT}N zK*?vS>|^lCLpEAFM0uVbK4+msKW5qnf~sc0+Z#IJ2gb$ZOa@b(m?9-cnt`_k=AT%j zQc50<_Cu5`V=4M_a-y4V4^A!N1g1fHE-5K9MrnCPN|xenlk7L1FaPy0Ruf;~2ic#F zZI(DRyz!ekIP41{>R9~>_#GOvDxCejljTzghx6XHI2?;F>bpm1Loz`lkWBbP9fyB& zS5OAR!V>61x4zI1b%KA+s$+sTh10_&U$@2F_B;$DGGRLsF98*EvWoW^RO4KI#ia*4 zbAo9S&Co^*&8hN5uG_(=Y8RRx>kEtvv*;noLEx zcqgtu!uvz$f4KY<(y9{;5=#DbcP;^OlK6jUnY@=xayTcSYNp5h<$Zc8uzft2ixk8N zk*{vw(i}--+--gu2Lb5sIeUwE6ZTUX5Mu!;7V){0L&fVs<4+ch`A@NU8073Tw{Pys z6}JDL6A2r*lJRC*>y=02eU6WS_L;-p1A5`VP;Xp8J)kZO1{?6Zz!URdZf99Vinsm| z`)u*!{nzXARPgw$5PW+0DT9Pxb0HvMJ?0*P4c43f7I^z&JUed%)XVj^*gxo(W;jt? zPCDd3J1y*=S$v%LF4?VuC@~iVp-2oLO8*GFv}VYAA1!c#>1~YqB-(Irf(X(15sq^r zs`VMo&!Yyxk`UcB>Cn$7R0+LObYSRz(&lM=x()q!$!~-K-q(nt>(*qKdA!Bfi9fO> zWy>zrB9z_SWr7hl@`RaIB5zVk)MBT3nTAGvfF5P_o?dI{@T{|NB5N$w z-}@v`-up}Z2bkzGuS(b+^epm@-k&yig?m3v%CmR5IAUk_Xf0%?IUxcBCS{prZ%suA zik^_Em`XslbS-&6y9LS}`4Rt$dU$q%3j=))NSTCzvQ z0*Z42B7@Kp6RQ4jx?^qoOUPf~VakHb#|K;F%D=Nh>_&WkIm@S>!xDb;v4?mh5cSx1 zr*BlB4JH2Kc+rlte3Tt5XmbTS#Opp@wBrrw&oW;>JidnhqSBw)>y1?eoW8A!mM2=N z^*hZrv`>&biK}tm8}QX*c7%CKC7u(yrW4PhDUeMh2KSaN{dt~zqM2yV(ob*%I^vK9 z#vs$dVstSmZf$1HfQTDio*vVO;o@x<`fM{}JMcwTV=+x|Frm^tnO!K+Vs_k{%vFYx zt-w@^`MN;3qG8So7`4%82RD$U5})?UoH65`Nr|q~1{iFd-GLM;tXXZx&fFKdh6-QM zO;ImAIhMkI(aNV7>`Wj!rVlGHK8(pZ?^$!nV`OsKiQQxFHwf8Bk=qFilW^G z`kUiJV*pvy7PB*S029q+{7r>)jC+})LjW7S0581Wlk5w=y-Ukyt>%=;GSmAcXdso+ z`q^#m33-f>thJ+l8k!Gw@T*dT`$6C!s-nL7d$ZDZX#bHb&wRr4^s;1uU^^~fXfUQ8 zJUz;QAGAe#h}|?49LD=9V_^bXeZjIJc*6UI#r6mSQ3f(k=0!U~vVa}|{Tq0%)Q={h zlp<7~uR*Xb^fx-ciuSN4hrvt2^!^z?dSewbzQP0jBm^sv`GX30uyEv#C#>IariVD) zeMadJHMvgT5MP#`#1J9x#WED~(j@jEM^RcWn?U1FfdSboFr<#nFwpXIR<*+pz-O3*8 z`sVWj_tN|9eFs9-FgBy~4eNiYE&k@0SYK*=Uu3KskU(oLH?!z|t!;hjhvIL!p@!)P zn8@$^Zr!N>ew7E}tL++_M;FP5eq=x7L$|*IQ8@>E01D{kejEQCZ){`p@YdN^U=M9M zTzV@!zxExz6r%!%)t%#P#2>g68K*0WBppF9D!!UvP0Pn{42VbZ~x>-chBh+$)q63Hj!Qd6e z2%JL`*!{uiE4;+}rQ0hZpUTzC)W1_XkuTb-9`HN)AU*&CjMHH2S=bsVIQdfRS$)z7 zu)HqUvk1S^U+_skjSftYdHzL4!E~_Ow-jHoVcC}Q?P+rg^izb*5++sqDhFtODYal6 zSN&J*Q@zg zt+#=50|PhjNGX#rYpS+HnwOQ9K69efpeKbxf$&M1NrqnLz>boJC3{bHz4qd`bHbuF z2w;@>`gpkT1)0|9Gw-1o%}k`LzeZo`Fltbx_f<6C>qoYPZfTL>aRM&zMkc~c_nXTLjcLyhhdZVT zsF6D+;ueEu2rPZaoD%OZiSOeO!IOdV&FA4eDBaW~Y{4?BpThhwMExa6KcbgNKO#XC zo@+0xpV%jGnl%f=b0dBYg%sn;;&+dkE$=x64O=AIMB^9ipZ^1nvc%Xy=T7xkV>UH! ze`_$w%TC-re0B$FfkPUWkdXTE{ADmxew#w16t*l0>ysq51u z)9B0P@tnv`Yk~+` zo1H&iiQ9{{&3~-zyXOzkdJ@wMipz-|&}58YNhj;-@!R_-=6e5PpT{c+%O<4_|9Tk2pLYKPq1nkxZ>c;_?N2 zNFdE19Xm2!My#>SH8zjvi{Ve(OXg|si^yMd0r`VEpyCP1pPdZI>V4Z*{w{#;6PAs@ z7wy(DKsCJw?5-ttXF-(`1D?~s*O+E0&(DLz@O+TD!pokyvH&ga(>L6E3KHTOH`3e z*OZ7d=Enu@qpsgz@rkE>ikgBy^dNi{q-v0mHSlqng0oL&{`l0&1Nb@L`M=@$7%wwf zQ|9={%8A<^!LvI%69zq#pMVGWaHlhRV5Xt);Bt9(4mh|>#1Lm0O>T@j;LhGvMDQ!l zJbgy^eK;lYlBYzCXOp;b@2U;8S7Q#Aw=B|W)&LbW8T@^joHjtE57(I<6#frlh0nR` zF!@jLH>XJ?LwYza2jat^;1ZNv69Z128+f7+C% zz5fOO^o1u1`=^i9|Ev7d!*FSeB6BeQSN-e#TkD@*@aT~J)6LmU+&|r&i2qmnr$5EX z%-Fy4d!E*v8FK@k)Ia^%|2R^kVB{5q&)|kA4+#dP*6_=N|zk=sr?`NWae)UIOS7EM)&L6P6*X5jej?M4kyWQKV zcL4U`sVK5uUE%!=+GO=y;aX)4V*_;)F(qk!GZzM(Zm{@1>fe5hZM3LCPutGVgk~Xe z{`aL}4?6;{hreNUO{9MtBNwqZ_3?0iZM}cM`L+C#=lrFor4TT%>}7wn5;xS`7gTOH zy?oHh?e1J#fBq70AFFP|YAbdiw3(AwRHB)@@?hhC;>++pj*yOxm8ZR>Yl!o`v8tyi z1j?AyxD-3!flp2oJI^^hv(+s3f(7(%e>$&Gy^wHngmjhvjjN%ZnpT@=kfa_ z-+s^sri^0X2J;@@Zy`<4g)wdBnn$3(c%Nh=enjt+9E$`X5TGfzPjU)|?5cK~@3QJp z?vvcr^|2j(xbrydrET5jE7A<^lbqZ}C&JC|<`8OVE_J+tc(5bQkn2l(=w7F=els32s` z?LFkz;>&M_jA#gHcUI)F&lW%R6Gw)`FS6cNrE5FPIh4G^KFB)bMhFoz<~V22X_}v* zCX#ueE>rptMDp#71SqUl23@HCgegkqnq}{&V1#^@#7A7{o#Wm(Y zkpa|TIyT6MFZcWyiLXJi@gSLFzqRPERXY~cU$r;o=&x@>Ay`Wq(qHEzU)(97HuE&D zSr+~E7=A?c*J;Quit4XrNZ@o;yUq2iIu!kNuIu9z{K(N?Go%^luQ^EYclt|g7tYGR zuLP;^spZLrH%owGQ+o9!6y!|t6(Y|NVSngIruZow_)I$V99A-nf;f(WccyJq z!?Yz}?jwS&d%G*IP7XhmSQ-w3geHf8^mNXimTQY7nJD2!H z8V$>DYRdz5Lamuz_|*?A^_4bC(iw3^d|)g%aBCHgoCIedOD<&n$jg;%iRQ z0=$$>LXiD6QJDI7@Nq|W3E6kJfH{!Pk0-%CYQ67c8>~Q%}I-7T=(gSNIf)33lX6339EpU}B-~o8oYZEYna1O50BltFd zD>CT+rvFU=O{114uVuBYxkF5|0NK)OB`2$_K_+TJt1V=v-fPze<~Ua%jm?KlfJ^jv zh&%5ks(`z_6?BXa599ElMDB4!#@o&C)-^yR=x==ZxLfglHX7@FgsTioB2+s(z!Q2$ zg~w6BgYclOy}y7$0+DJ{O7f8n=n&xtm>|TuBHMlf0cF<`YMvvT5V0{rwwGiuAlq{= z0=Z;+o2Ef|t2qzZn$btIkS*h=l7AGty3ZcbA*v1h&Qh&j3=w$}SiKkzxl}t5Zv(1X z4nXOIRP8j6p{-ED-euV95)wt-$`V>ot#a#S(2%fSUYlDTNo9ik{5HjCfA9Vnh7;;O zb1Q6gzWn_A@g7KV`T4K{cj_B30~kUV3S#!NJg_f}FNER5s2j7DJV4!zTZTiaaWPSs zx_1%(*uu~FoW)f$xV}OIcH^xG`Xi6ZObBXa&CfzZM1J2b;xa&KlAm!H?PHSY&w%$nErfy%bW{8=B^A#~hwBX>aC6)}b1#$rA`TYG#J z&^L{tcN$4Si(n}?zUfnchQ17F^6!nuY9jQp^GSU_C+5W{X3gJ&haR(r4|(oGdRPh} z{0?1p#K`8CLFIPy=b-Z1=99j|qWR{N0{)H1BjWzrY!DZZSbBN-h4fRU_n2 z$Ka<-i1^`t#y(b|qvg(o3yG80A5!1P!|Nh`KJ9UirFfh92rGsXKZoZ}(;JFo47$td zn@oV5mY9axMj$L0n%shXrEOW?t3# zxE{NI86VPh$l}=ITsbclhks-cubd1Q3d93$an&wj*HT10l+Jw+ecCgKh1r4#*!kn- zNXhpQSNC^}D8k0$;5yw@huo8k$itZDek10k&zz#n1SNwLE$)<;#_W0*ez++K$DiSR zA|xd%FTiEgG``8lUJaU11422~=c}K~-@+d{hfzz-NqnI`hu&$rge&>G!`#)97oJ@D zoW&6oq)*Tv#G#{Tq>zXwXzu?TkpPT|4m6X!AzeFChy)3W-?^(>i7SSexP46at>Sze zoY&GNVB5XcylOUub6e`}Mr~|n#W(!p&sII#7LRlX8h@gQ?=dHsMM3(mfo$;#I~%#qDOMLGNh_4%3y z->fE$cnrz4ETZ7?;F|^JVX1>-dNPS7Py%oq%ceT{S|)vJ7o$0O_jf7k4!$9NC`3*k zNFUG?_ILc>rEWioiL+J!F_cMk{xLkIBlG3%JRwxFQb;X|R2`ta2bAi=`(}-%7n+}3 z2jM`p-;r2}#^-d~^H;z`Kn~`^s@vQ-Aiz*{llh)}L4DpEoUUy$DSgom$j~Sd1{VB~ z?;7+Rkej6gp^$TSaQ=kSFzZNVpJAXI&nC+3GqJB^vj^d3_?6V7K5@-8n>)~-o*l9h zXNRmrR5O;}tyykO)&3eoYc}6}2>zQ5BAQJZo&fYhoE_4P(vqUpYHqkyb9?6DmCcup z%ir3b8&=QEk9n`#K#f4REhJy*1VyX)sXhP^*p~eZeP{=+Aqusvpj`_GZ?no~`t^|- zv1jS+xk_~%bQ}N$ zP9{EoRDtng%yjr_!I-Sad0b?;$#j`D*OB(a<>{R=jR~%eOvizvZ+}U~(?vO)@XL`! z6CO`J4a9c2v+X<0GYcU|vF)JFzLWu;eiZMga1`2q1`LHoIap6}^GidWpAY*#(8n0N zKc9iQRe9_$@rCh1-Z^f_z1x3Xpgic|%1eAj_USTL{4KzdT|Xdg^7L0O`0zdkc^A8e z4wU*j6QedX7k_%c0-PvXcAn318F%Gcg{c11gmziol~a59OV01@KeP1P3GBCfr?hc5 z$aU#_F1nyd@yDl*;@|52(p|Rr9KX*jec=g|?ZQF$r9W9#(uFE^+i@4nKg=vofpD7x zqN5A=NyfKM{kPj?O0xKp`XTslb63|e=CSrxw*9^Y=7VzJiIn9SxG4WdIn;Z`XRnVYcD~)H#NS22N}eC z`PtOShV2Xf++jph;?6aRJ7Gu;5U8&w)J-9%uLsmkW;a0HnV1J`7xn&w))|MGrD|^= z=;qzav6O)`@&ZJO;6nlIgIa!aM0TjL{1m)R+SA|x=u|%1L1IcWBggNVSAIrv=n-_O zMy!bqm=yZyXuJRtf%zjP2`8a5;;smam+)gUqkhd+A&~dW2i-qmaMjVOUf2ejXbGTRnD z0EM;Sd?_B{(VYNDGBf$U4TVP^_*i)KDLgHGmps~ho8{5c(NR`)@N8kbSow?4Z3Yse zc(wuxJIz0SK)69cO!8(prT9=6;O3X>FXI>c*kSep2BfPFIXTW#!Vl{9pe6GI6o#Wy zB^ZS6%Pcuuk;ymaQnc)NO6DpoNW~L5Xms5K4>lsP78@-kf{p+Ar(ok#JT3i%*tiZX zFR;b1(a=6obZ8^iL2hX_#O9Hefn5P5sqsL*Nk1fIkH#BmagDr&lqjq0 zj51`EE%{eSB%|YNunOOrPk?zhx(8UqA$)dCa0`yTd%%vX8#l{96aA@Q#&saaH45g% zENzaBi&Dh)As{8}5>oUjADvXpt^um~#rza^i1<>CZ5;npB<6H9Zh)@=@npV0MTj35 zpuKRZhhL<8G^)*~-y;WDQtyf%xzNnGiGHN`OL2d3`1X7l@#$W`N|KQSa)K~)x?>$? z19?$57+b1Eqz@ZL@)Y8=tOTTYa6c0X~9wlx7ANmQZEQjz4h#C(E6; z{|~|(i%6Y6P)`5BmS;e^ff#!b#F+h>Ic(0jgd)=GeXn6}#M$d%*~^XoBPM;;Uhc}v zZ!(p;uL0DVG2`&0_HuKmn5YseC)-1g%chZ~LiTdy`9rst_tZfIy}i8SF*IfE<^5mG zUcU0Zy!LW2Ft_gPElg13-is3MW{P5I~~-P_CG-AHmo z?B#LjXBhVK%@D}@<+GQMUx%mDGlq91slA*9sm^C1y!CnwSSCETK&g33q2{y0i~?4r z$3ph<;-DpS2nrXrm(xSY%xf=?Jtroy)~?LPbvBULIXnY7Gv+Bgsl7ZEET0b>QG0nL zj5UDDV=qh4U({aigg4US@a^T3Ag*JTA==AkTsMVr-67{Qk16H2#9q#a(Tj|W_LA*G zK%BjNN_fe7k%7HD52s`LQfe!O~<2){+5DmUjhxLTrcT zPc1%zoaZ_H{=S=J^y;wab!Jl zSoZPFGh)(a?c+vr4_0L<4~))?*$_`^A3yl-LiVw5e@a-$J}#D~z5W?Ap1l715V;2! zM$+qOT=e;X%-D#H)Qh>cyZZA1#+APt(R3q@)Eq)wnWdk&^t(|z$(Qi3t_JFw8ehVL zh}eAj+0@8}?F;@KYFzmzI2lgr<971q?-#O@FQJylj*lyQ@iys9V262=k2!X7{xu|v zvycuM54lQ&8^ z@TQL|8CTIMoP;66PU>Tac@dA&V<9_vSkRK$mZU8hS8f+VW?nm4ffsV!oc5=1^%9V58 zlySX*C$*EOLj6X@MLWs%At269E)rhKv6Ba-*_JKU*h(>a^V}iX$%gYh{9-5XLAAVb zl4G$&xg*8QQ7L}bNhwL7xW4?&cT!F=c6E6f(@rMie3Ctvkxg7($A&RwCDRl z_4E5@gVa8LSqJld+kYpjm+gGtJDGJEzf1A*|{!_43|l1!%~tmzSK*!Avw4Kpxf_zcksx z-$CKQf-_XI7Ot5LYHUQVH9$5VOr^1>5h5^Lj^whsgw54|SX_zJNh^L@90tz}jbKRZ-)GiV}N9OyI=r0<-oQXHm;_&tIXmFPs-4OM1R>ITD*It!z9gb0|UVh?7 zv2jr^vwg2|JIq)3=%gr!U+!*XTTU;FtvT|HA?f9}0{BHQZ;fhs_3{Y~K7RSP&i73N zR+91gzIW%zOJja=HGT{=o;i@bke=LidJxa7NBuKc{XFpu=lgg>7#;8ZugY6r*F(eW zneP+g*lb^r4P;%RcUUTuj=meLVDC z0GO#f{1yHgGaXNAANPVv5!rBT=j~%f1z-!?$9Ilp)7}ycY9F7aE9C9thcBQhiCsF( z&3_q?xMi5@Ve1`|*FLTUuGZcB-ZucXllHiMeEF0@_Hk#_@>ucqaRS~#W-$*0EOwYZ z_~<0t&+q+lF3I8ImL4j$OVQ6T;+Bmxm$Tndg4+qz; z)jpnW3x6Ah2e*&Ed|P<*?w5o|AH{x^+8MKEEFzmAJ0L{4w-rF{i8_VG%v zd_HVM?c+t?5}@+f$6e50)IJ`JH`3zp?c-a(yc^vR?PI%yrInBURmQbD$0hT7cfrU- z#zp(c_8}l8R*F^&p>yJv^nbCfh<)7Sq#@bICr|S5i+%j$!~*tl|I5979F{)*3FccO zQK{9(OC=nwe1u0oXU5!*C)LM`ASHqYr!2faZr+s?4aF-bOVgg;2i3<1(FOAQcpbzm z7fs2lj}L@GTX*_6bG)ZcPJY4>Clu1hH=<ir2@t;;mP;9p*MZ=IG<8pt3Kd@k;OU z!_vo>g+R`$kB@^D9i~3M3TssXi{cGA60s`a_;_%F8{H7~am5=luF4)6*DZKbeY{nCT-3*G-)q_qbAm8ljz0cmHrtBm zz^qso=hTQ(1Wzs;w z{&LG-&kVp}l)q<~<)0m9dD)*;5S~bU$23JbzY~{FJ`aO!j3|(F@dd|#&~EbzR;{pL zCi`9-#2 zBWO3r{}^5{m;w5L+yw5(;1c5jP)FZlQy{vmhbzS{&E>v0i+vk56yumEK`lH=Eq(55Bz5Kx~Ew6o_ zW<0+CLFnW1&*geszlRWcaarB38dD}={(?}=>5tThT)8uOvbuGs$CLsYPy;;v8+B*vsI7xQGwCdw z?5tvMIK*I=B6qXfxV-ps=g&D$#SN3Kb|l`wh<3Hx@i`d<=j>PS7@MNC9HL2&|SzT{tqJ&k?l|PYi5=ReZYFkb9fmY2wyinx1 zwkw&I$zd}RV~{Fn7JyVX%z)BLZ}Hq={G+=4mu&TX4h4JfQnibEt!|dzRyXrE7^uta zISW8$aG3b6_^}3{+8|xe-O&d3VS}vLIzo>^oV#KHo+LrM#f(3Pnj5-1M}LL+&ri`_ zheVIxjzE@J=uVQt{$!X4pcm%;-Lx$?gRM{C^-P=c-;Dr|mEMO_to(V4YvGUe;{5T< zxg?kfoASr{$der+f20pq{y6ME1f-$x$J2yLS}vTog4>xTUq z?cdd>2#oy__1XU?piT&NdB$F#e<)k-VN5O8`za8{!XK+Uno@vMAtsfSHs}eEu!IAc zpN7swkq$FPH>9I*v1@Fxqfo3V@%#CS--nh*?L7YT zdx>WA-|BII07-B*9UE|!Y@fFNP>sl&@H@VMrgG>W_z2b8%^O&*!YJF#H@PB$WqP6N zh;i}&cEL{Yd7_r*w7~$ka@*4mAhBvxZYH(vB*3d{CV-pC z{552ScaW#%z;Wp`yGuC+%83Q$cO+OEA9!v7DjW%D+=!s|+QG`G$wMg6rCAP+v=#(- zdYz3oteC~a{}OGf+I!iv>DDgW%qgen2!r^%%8yUy8$lsC)5PFCz{7Y!(sG5U8{a_I zFMnS}w=!=J+Cv|{y+{a_<1Y(*jC`qP;7z8b5eP=!BWf1p)Fa$vDC9cnQ7x}UJ zjOdqb|I}w&gueU=U*h_##^aOy#re5Y5!r68Ia+v5`T4?HdFaEiTFt#xLj5-2rj@vf z@iUDuhcBGlbWc8hzKCzh&ljIOM1C$JG>)GiJqiy2KVPEq)q?NM=1zW#@$>syAi~eL zNIA>TufWwEjGxQUbimK6p}zxu?w~)I!_TeaCC+IxKR)RT@pFwrw9fdsNZb2z{QSTH zf+p;%s4!QY3_NQ98H-0}g1^8ha#jZZa+`eEUS5SpyfN|ivb+OLgBNL@ci?X^iE1zR z1C!`C*vmH#Abnv;3fjxYNvuB690*-Gh`l_?7TW>E3farso?_3Hck;aA%$PPjslEKs z8IA)8iMN-dZIh2dhxsAq+RIn>BY;o~QG5A~$M{-R^lvFck+v5Hl}rQaFjRZ_wB*xJkcPh?$dFVCFp2vERYmPhnUu0G>7 z=Uo46Tj?~PJ}VA=8NNRINR?H)dH4vzZSC`|HSz%Vgg#sJC;=*HpCkIL?Kh~HW1ny1 zTk5mhzc)mERzYZ-K70RgJOuh|kt%T2XRG)vrq9NT!xgp9E2W&(XMbESBU%Uzy&#`` zE{o{1Z6E=GK3l`abM#qOyKFPdj{8FTtV$tTXZoyfnT+tu>9f1F5tz6RvzWiXh(5b- z-+cOPW(v(&eRfF~VTGb_{y&(+>$9)zNBZ((Ng@9qD_GQL7eERJ(P!7#Vn?A^A$|78 zPWD{6s*Qif7(7}3f2QMrh|Za0oBZ&ELG{_@QY=TGo!CUU3+c0$D*06^nR|f3A?ve^ zbqt&780K&c>i@$^1o|v{HJY^g>;rF4tUl{KRtV6AKH>jQbOiW<`fQ14=D2@$G68V$ zX2d^BguV=4pY6QAwA*gpo+K6~acc~E`!>Qz!?NdB48D;;XY8~5?XANiL0?Ah8O z>a&@I#_6-MgeK5u&nd{N&o&T9qw&UfF_R>?3dI`(hx!pMFq`U#hN#bGKmr1NwiAtI zjy@|>SEkLpd(;=wXZ4K&@;cLJ724jH(`RqZ6QD$&4bZ6N)n~H?_s?G6E2Pg35kG|U z8Q4N)H+|~7#qK(F@0Hq(;1sLWTFul-5-)*|ur#&(y;tT;YGfx6)QRRN5JgpLi}Out z+;59rfnrUG#q$%3b0;-ETh5*<*SnX0#%zXr=2WS@alB)Lh*CS#Hd!t`+nMHEC+$Ef z7FKG_41=4nF$t`S-^gCband#lDw)3lkD}BXU9mwXHTKmp9B_|}p#@K>)W!y501-x` zb4vv3u7&0<5hmi;dZleQaZ?Dppa6TB@^$a)r`^(hNRz0?m#O!{@Q!k z!Yumj{hA@_xB5d+!|At!2u+~hK2VTVzwIoLM)ljp6J<=1_;cG}L<`IwX9+w*)Nkj5 za|8W$FpX!9eyiYH__SsdJHlbkr!=3b7+P2JDK*;OQ1n}c=g0Vb%4jsAX9bGc>oIqc zN8;xN&m3I8t&g1~J~;F7=Yl7JFYB+}z~7?1H2z!)6k65RX3nZ0VkmMY1^l(*-B=y@ zuitg5E$@8o-)&<+_=5ggu_)=dKD+jD8NH!mkLt6!(3j!svmfjs?Y5f(4ibq{eYV|H zc~F0CbM0VA`fOq|D(2|3?fI7e+SnOG)Mu>(!0EG#r{E#bXFKfa7y<6_G5i*bKX2Cp z5q);Jl(X^YREc;B&kw^Z2+gPc4D1@{v;U;s%+Y5v`Ih=@%3)u~Uu*4@`s>VJo2l&$ zMV|%sHLlOL)<(b*9cEkp&g-wOMW5|GKA%1-y93QxeRl8d96RMn_1T+1q1R_OjVFEi zv5-Eil$rmD=AG{hs?RpI#hyd4Li+5;``L5lF?aFLn6vSu`fUFr9S218*#kQh@QJ2Q zdM>EXZjfR*`fSW1)-I&aP7W%WJ%K`SwhI<_zX{~&t@Ot$3TCXIJf$2 zuiFSnBG6~&9Ll;@pM7;#M}RM=&niVT$MspM5Ix^~+J^#;ei^<#yHl(iR&2g66R|e_ zJVGV~t$%idb}%G;b~dk0%+Y5@>V=B9Iq{Go>a#2XaQf`_{qYd!v!ienvoZqo+130O z(`V0Wfrvi4Ldscvw)|FUVd2o`)1Csm2KwxmyQ6N7K3l-I)MpnS{Dt&cg+jE>^jWr9 z;Q4a;?5Em@=(7WFkztohuo1~WT#G(CbEkaztodm)XZ6`4{uX&seYO>t#Ot%pok(8_ zTOoaR##mOLXtsqE4la!J6EJvUH9Ql8R_1U#SC36~3IAneH@I3^+^3g>yhTS*@nNMqhE1_J>_4IOf zZuQv?0tg1?qRyKWtZVhz!8m@VkDU+hb` ztv;J8lY&;C?VueDNuMqJZ?ux5&#vTK`ezMOhp5lW2#wQc&+dbVK%dPU=NJL{?DzZ@ z(`O?!6(OR}7E3v+&yJJ`XQ=+!r(oAWpFPjUbM#recG+fbo$`hBS-bfBSkGTa>-V#? zy)UQF#%m*@&vxhUy#5)SSabM{cg3da=w>G<7>jsdNa-^^Xz&R*RVmAcUVSXNF68i16(DlbHG?S8r0Y@uq`n{MCZ?o{9l)z=yWS+(jHIggw(HHFe7PYToV%hOf0)#(nZ{qo7jcsgolLb7 zPVe>ky2_uCe8f>`DkgqGK3^5)LV*`d(Ybpqn1(ee(Nj8aGGS1xb%6)6z&>)JVgBaO z!b!{ul4NkD!vc08>07`jKV^HDkR)1J)j@&#E6StH9Fo7$NCj6N6PCZAyt{v5PhT#K z5X}d3@&XaDv$_MG@y}P;IBu$8+0b1-Q6ZZm zg}D8{Gntmt^pm- z5jJ0LZbd1_L|tYq>tM#}0r`u>`ZQQs{EsD+3vtilCLEu75AHgsVA%f;;=ljaw)h25aJq-_YT5k%e6gd zU6{#iiDLGl+f1?#W{+*j=1@?=GLd|mA=C2!2wy&WBEDEVJuj3(gU}P(uRT5CDRK-E zdbY}U(DN+Ktnl<)r4{4!#K;4BV*W?y`Ih|6rRT*WY!Q0iaG<53Nw}#K~6s z7NVz<64J60R0AZPRm@j{779z(G@ox-f!rqO4+hZG5KPst&Q2?R7#l2rqKVT|i5Jb> z?LHrvhK*5))UqiJ%SKE~Rev!3G*s#|ccNt!E}E9EelfA{vMIQiehM}XB(Q5>+Wgu+ z`};46?H--d@JZ2>(i`RTv?i#msBVd*A{NjW7!xuA!HCAZvz0#>H({{%hns@uE(d;q z`BmmtEN@IB_z5#DRW(YLkj+ml3-}%5j_r>u%Z=~KgYsg3fFIFuSifR#;zI@S2DxIy zV_$M4cFbU>Z)pEe(4I5?I;O1IIy9y%#{^Bi>R>mLY%r40dRM%^apG{)12UIStK+4= zay(sv9RDf6M_aA_uQ<6ct|h)owyR_&U$Agwk(pHmi9TmeUj^EInCxU8<{R7CJa*^$ zi;XX258i@$j^iu5-%IeZ*7Cu4&J$U*L-PBhg7G-}axu#lu%Fi71KHIdjXx`VeUkqt z@}WKqt*IHW?dJC{=|67?tWZeS!$r9KyA`g-bvX0(z9N}|ar-A%UsMun;pe@9^2{E@ z&4nMbGG&F=`^vs{NGkTArza%Sn?O0Y7Mb@@gqyS0;9qH@cpkh;>u!48s)iw5&fix0 zP(RSugebi#9iT%^^)=7&+3F7VYdPG}H^Bc3EEwY_;7>%z=@+MuJg-A0QUIRrO0p!Z zlN@}&N669(4J8RbOAPKpjAD-kWCPF3Krrbdls^B9ZJccprq_$mD= zndMk$Ch5aMVtJ*OYDbkW_){od+YV&mH#SDE=Yxhw;GgC#KAqH%F?p1^L;+~KlJ zB4D3SJOX;meth7aH1;~<`BeC#I*=_9V>z!cE3DRmJV^}EgLd(cGDd#@*P0>)B@f4j z;ip~hH$U7!%E5*P_AtC(QE1#}kpD`x1f+GEA~-S;{t1`&`g1uO<^*Wxz!Bt0>B041 zF8YF~lKBVKxtxD6W-03tA7F^5r448j-|Elg4gDVMZP*>0Y>Uc%7%gwf6|!&X;>yiD zah;+{Q+2~%;+UpTsRiTDmFF_A-<*BgjJ#UFK85v9tUPpjSc5oxRG|GH&=f2$bo^rX z^&Kcg;v8s)yYH_me}9U9x1Y%QX9J&;$YJH=^m|Y~ZtwH!-x`lEU!HiDJ2K70eqn#o zu+2=;hjuV;8;yf)uO`ZmRUSX08Wcz1^)6Q);|%E6u$uiVKBYYFG!*^cjV{|EGHvGG zj|2vE*aC-_oT zklUZ1k3ChPf*K51$m?_9FYZ5yE;r^dtyUi9Z#R~;z*}%UVSWwyM`91NW?%N0E`D>2 zSDAM2m{pacGDng;&Nc=E(($K@mjsmsSkbi@xx){~+b0b%*Kbm?tn|9&_3sVf|7(^b z_(~YNFtwAwg1#grkT-b4#DceKN=hHz*X&p^vM81Kw6_HB%ntgHPJHTFE|5=4ueHrr z3xA;dsJ$!OBWCX~BsrqRwqMmWXP^{Ya6{vZ@CU)Orb5S$`Y0RLSE2IUs}$J7KBK#b zt>wiSwWXMU6O7O5Pq0~m_Vf6E-hKl=PtpeD_%9*&^3=EdSZMrK9?AKR{@R|{AIfFj z+U}E&%LjSKB$s7JB{O?f$zAT|N(4?Ws(`dWanM&alV1O9AkLrR@s9Vz3Gfvk51#?6 zhdxnC%xrnjKo)-798**}4>M;_5jYN9w}4Z1cbX~MO9h7JPrz{f1@L=) zIMo9c6wk*WkjeB!vPd#rQ)0FWYUSWBg#S3d2#>+Q8FTk%&L$07pQ*|&yBb=;g?a$6C>pHG`#>v+Jh0Y60ghTzj9OK<2R@bvT& zM&Tj=ov2MppncCY0XFl_Uy&cgK8u%thGDONAdR3Mb&0vyaJqkmq1aHhV0(wy!ooOc zZy#S7NYwLrcJQzAw6}J7B7RZP#h*$L&@=1&zleQoSUoFRJ`ssm&Aap$iudI;qy^&D zE#5;B7q4z9+oNo}n*IkXV=)U};o%&Vc$9hK)hqGQ>7!Y}Mspjl?!7BCIpft2vF??7 z-d6?Sr<0RK8DnnZLc9jdJ!T^U5Q-PSCzvIhe5rWxG{&y6a5K<90e^dc-ufrj-o)@< z1NcFE%0Vr84DuKF|6Q8cfbr4)UoH4-hlI8L8~y)j3In<vfmSHs&+kGGnY*GM zf5N(XF#T6$WewxV^~aNJ4+@|2%Ib_`k?Fhk<#}%o*!=i1K-+D$rgLtWlpMa|^6u@W z`sXs9wffVWYQyv@yt%RXwe1h$|CR}Vs_n~-2VDFfvW=JMZXz7Yg>hooR^5vJ2pxfg z-F((=JTQKxTwR z6efY+kxryix7j{Yt~)5#Wk_?|Uc31VAAEc5t{m@+-1IBIT`5qVq{%-oR-@ zGmsln5Z_2bJeCa>k~c83pf3E~%NN~{qU1Q7yx5hz`F<()(Lcj1;pt6UdHUy}ci2C` z3dy+c0~zc#e$ulgcl-@@~hI7e35400nmbKcZ}M=^3$i zR(=m75iNC`{tJ)a!+(($jCAq;(Do(pQ5MPD;m8^koOnd>j_2aBimrnoq5&Bll(2Zj z#oHC{6AxT)#SJFW4C82&!+5Q6z2bV|g%LppL=s%Z;DPau7xpMBDk|<@&G$T2-S06o z331oYpJe*&x2vkVx~jUWuh*+TDq;1VZIED?(@I#gppFbhyj-nL7ku)Y)m=C7s)Z0k z7URTfo4H74_c$%K#6-a?u}_(2q%_?JZqL9HRbWk~)%@HRHdrcO!TE!%`OPeY5G)Vf zq>j)oU_X(aKkcM^vEN>3#Gn83vyDkzJfZsI^P9GY@nA2+gK3QiFWw+;Jh*$PMGl|R z`?c~x`mX&4=jlG*f71RVetvjnCbvpqdlow|IMI7T<{Yq`c`;qDkU4KrCy}w5f4bY?@pL<5CcjNmrsUZp&Pfji} zWn3bF?GYKW-Jh}UB(Y1O!?h4Pj!~h=NO6YZBbYR*@npDoD^yb^FJxO%5sP^*f80_g zFTCNf)!eZnEM2~SjP?7U@(vq_*i)7Y1gA)JtF_I_ii@g0Svo9OP5a|YG0=d#k&B=_?H|^#o zeFGlKo8rt~$l%5tov_8;9Blf$0xD9P1p1CNuH%pK;}?&!1x9 z4`aD=370j$;Mo_ve_$Q&-(JW2f9HL#`ltFr5i&US4M!ESgZ^yS_UE>1L|yimYpMIaUk!D6fa4yFB)CER} zvqCvWN8HPR(fRkW($cWev3nkgQjE@^;~WzMMyE5oa_eTOb7<5$^c8ALC931bp9#>H z)jIyr-hm4I^r7oxYg2l7e*jpouia~F;OF(E&tWPf%8yN8vW*8qY5pcQgZZ!Rpc90MGLEBg6&fJ>H)mLDu<_W{<7I0sm(NmMMB zdqaVcY2r8k+=BOvKIiONA0p>E_+zxO>v6Q^8 z8SgLNvrKu7VtO_j-2{(ew)q(xmEzN40E^5?qthqAL}I^&_^f}FTYii>32=Hs z^Y>1_A(!j?K7dTXUb{C4YbVO{buukV^K$}g#G$$nR#gm9=1n9rSpX>y;CK&!wuP2U z0q|g(77Xy5K9%bDL;I=m*J2tlF`=N1Xdug;=akp@j^ldX^2Hv0%>ByvB1f269!g5| z(ubjV74PU@s*l;Fe@TA3{$`yQe$YGK3;qRm0R-)BCA6hiUpSgBt?zQA+Pm-TI+ zZZiAsg%BHt{R;Ltz3&~*BZK$>1I%-!O0IgHYFXYk8b<=mMYLeLI@?~0IqKj4nO)b6 z`9&bntq0|-mRsv*>bgK`0_1B{B5kIVPLlU+ zR-lF4==~%&_Qw-5WjFT5dSVEGnw^wv7*=y00RdnlETYxptZ|(=P+)MwV+xz4DQPw1 zfYBVvY)*luDjoqk$r~?4W2>iO7If-j@`p<1O$Ko>Z z2iVXC(;$cBFcIl}4;S#79=%T5CqoD70KAtdDi8+V6%v{kAPv+| z#LMKR%=b1Sv(bIu0}TpVV<)dwtIEWl@hk~tf_p775osh|0V~LhG8asw&48tJj{^Op z{voO|5p5R#1$dCg2_(0^GBD`>3O%lexbh4}rAu0LzXGK8k18c#>JoDej+g75DQKU! zmFuEjux`3d!<(?t@jF*usK1a68E-nBzv*4lh`KS8(Vt8b}aU+|1_j&as}C1S=IA-DO| z`AaO1u@i>n@P0B{004%RgPJZYm4^GD?O7`_C-WaHRzw47_Y)!V5tTxdo6Y^Zq1HOO zwVFNnVE4Fj^70=Wf}Acp1>-y7m-^^wILaFRj5b~WrHn&9%~O3i;&^q0jJoy|OZ^xh zAFkq$ehuQ+_qPA-`sc954AE7rrpT^@6+^wU#KHO-P8P#!0m1Rc=RfV6wKHb(4FoB8 z31=dpf4TBGA;@2|0V>09YwYV^8nhhE((t4%0;CL29>-=zb_zb(!TYh_Au(R4jn>?o zu`vn)nAqi#-v$ejHebALC&`}Ola5NN0!oi@_qrl4czGNwiEb#IDLL5yl)=qt(99&s zS(q}O7vy?}OKY(2uGMZcZ<3XAzcv!zqnb8O=|dP|YljSE%5Szz1x+G!^ z5X469WCmPCH1Tn+e>>;D$vjr5&VO+IA+-NtC{aphI{7H|`RjaGW9~*V?@0VcQacPp zI@#Ku!M^zdU|mQtw*x0+T>M;L108-({$PuLFk7wHt6*B}hd}rd?teEQ;pFjC?oq&Z z5I-fmRUS|9n&1-)wAXJ>P~PrDH`*G8B1bHNL%4OF244g2*OwPA`=spTquo70R!z9NfFJc%V2W zZ_Cl&-H^9`pqM9bV$UUTvvY%8OI%ie2IXyynco`+{$gvi3Vv$>@}lLPy!}=7qYrER znCw@1TkAC;FMNJ^I~d)XU*5v@>`)-@{ZnL4OX7t+dQrb4*Zh^;lPavB6{3cFpX;JY z_=0#5xgb_c^vG-@Wsuz(%Kn|pejM4~#3OsS@?W@~pMe+CisXws%h~^l;*4)bM^TDG zX0!pqS8ryLh!yjbKla6Z$VACkF~1iMoXCIBjMke&AyASH6>ittW?|pev9}ld@NdOf4P4vUIuX6D3I@900^!NSE=@&kV z*^Ag}d>JiL&GAI6kkkrU(_&xA2odZ9H=g9JUoFJzx8=`zo$)7ZU;YfK`Ze}tbJ^EE zEZ$D>SNn1!>fVKY^4l96&))4JKso-C?)UP?vrl{G*q6(?vM(u=_wCEp&X7z9Wf!{a zqmcbgWDgla5=9x$yhM@Tsd@Q~DwD^&3?dC{UJBZM^YYdN$yf7o=qq{6i}|Hz$h@5O zKATbU^n3h)dAS!fyKP?n$PS@-*$s(&=4F3k%Q7#6f9k29JgfVqEBoU78|t>V9C#!7 zndM=7>)m5R{u%CE3VrY98tsa-dAMDoiFUdP=7#s>VKp9Rn~$|f6XJx~j5Dh7?0ap6 zaW%T_XmOi4i`UlM(^>3H5_k4TT$o#^7}k?ehDJH#6+}# zdF)%U$1jF>+%IqA|EvJj%~uTc%TqqF<%#T&5E}7It2wBnCs>Q+=&E#oVNcb<{_=jA z*$JBly{|qqQ(}KmhSbOB^K4b{jcb4)M6DPbaItHF| zKN}_-7G`?HhqOelvcoC(h&vQZ1r8+^wsXLRT42GBAG&;Z43(Nxz(xGak|wWyr5^t% zLo%_Ue5Xv4t~r=<<5|(4Ki@pigAe#KWmt&;Rp4tjYuFB&0Gb%E<+7K z0`o%bw$0xX0915|*v~cQav9Wj=YX3l&fdwo~?i};5UuU&o0XV1Lx=SVFWQlLzKx*a&YpZ#qqTTUEV5P-orP8 z$iS&CxvGG~ErReq3vo*ahn|G*vmX2MTcnK~PK zkILBlKbRv-4#j^V|4eOAm-{JQUvzf+O?w4yZCxyzj_~p`OM|lMsPRZ*5-RAr`HVE5Wvkp?*CokD zE;A?Sd(=-HFVyj{fu7?vGFeu3#>m8ovXRr`BSzL9M%RnZV)l5PJ-%c=JN@%ybG1G1 z1z(ICimLZlPOmmo#C1R=!&}hL;Cn2`*rCJ|wKlWr6{la)Ygj;>`(SXBryVbfg+F5J zCKS;fIGPx9%)ht4!!J)Z!E2DcRXbP z!-M{M;c0rN=DP2CT35iASWjQY7vR`e);}oG-Na7~GJAUX>%9N+;16A36nd|=f&Gm3 z%AFwj+W)`8=khPie@CC?ls?b9qzboxg)=n$rcqOpCAYqaCoYomkYJ*ssX3O$i$%?` z#rVOS@)mS+tB5Ux5zDAefSq#yjy%epRa`U$x2pzsM5;xytc^D_zxBgE^hUqG2?%b8 zkX=_}gMAYi?;!M)A^cCoe=jxDfF_@r3d+sT7|iLFtA(r9J)))cRSulo+#c>5gOu)jE32_DEuh+I;d2 zt4*|pyUFWjlV+AmL@Bbjvf20h*+t0yX$K-}HaGg&1CjlS&HkI8JpkFuZ1!n>b{Vpp zZT6wa-uso|iB_STj4mhz^5n2If9!b3@R!>Oc*^?)6l?7$SxAY{iWaN-mEkvfqd+xx zl-w!r+3Aee!~0{)JpMoj%$r}c$^FV$on-V_K_F*HI!aCuv5U2%w!7Ne-mIl}(9(bO zN~219qVzYB;=(f?=~WYVJ%X+@CJ5bGWsu<{itL|=ep-Rf@^5sKq0LYXi2uOY=M}d!UO_IZ|6kIkwM}1@i%o0?;ZTQn#^8-jE*S`$$*LKc8 zR5t1=*IOz_!IMy&Lb<)ZL;rS^eDVU&Qf#ZHv}1f8>iM?OUJk<|7O7f`xBH4BkzLVG zwzWLETM#sxJ<)b-#evAk`sp zbl!dd^V$-z*E&kJ^NC#Qz&6N7F7DzSXK`a3WZy0 z$C%15d$Q|VMC2jpD0+u0x}g^RK`UYY#G-P6S9BG!a62a$dAStEO{daE{8Tie`x3E+ zj*^#KQ0G*1?5q44b~b)SrwXsa&)!RiCzg)J^+=qi}37vFT0#tsR{>dZ(gz^T?ezb{EWsR-Qs~i5Lr`(IsDR zE&73^=m)Zgoy4rfeA#gbM=dFv7O@Xh_8umnD6(16=}Iy20oO=OEaG<3d5TwT@8 z0C-YL&{gRunXD!D*Ai{E#PmRkKeI$Kx>mC~N)F|-j<#!?%LdQuSwOthWs2Alu2`vn z6>cFNf{C1D^jY_+P%&U*^OP27@X4y*&Kgi=Zk3|6!i^mzE0#zFI<}M^Xmo8`z-*d; znr#I^;T&b7`RQ|!!8B?GT)4?289mCw2SK`8@X^#o4`zO{qJds4c5sa3K6`8_8Y$;l z>pM!0M^Pa$hZ=!aqQMjp#89nfh0J=L~2qm=?jr@IbSt?ejzO3G z06zeS^3s7lYwLrr=KS~IU%ntgx7U%>(O$0Iu_lcF&#~dr?O2&)IjXPxc%Rw+D0sbU z387zd)t;x26`R}scu+yeLYBM7m7AgEqOM%EmIMDN(VRp9WtxZRW3I?w6yzL-;s`vS zk%%qZJIxNLnjGgRS|T+%VLYX^AaX}qzuDrg(Z8u!TOk3hy4Ir^iH4bStUgzzv`S1As#fG-Zac_z$YSxQhD5e2^#OiOhRz0?v z?Sfr_+Drf%`p1{@S5_iJ`ZX{lPnZwn4c38rp6-ynvk=I3w8(z1$l%Rp$IoGW+TK!h z=JUMdlcr||@F@P0`-$6EA&AMaSyD`Ao_tRmjBIr(bhL$s3LO9y!n&96lr)}pGzOwf zGWM~$gF%1W-Tx5`y9;}=E0Uajj^5`me3?cqDe%d{4Ya4s?kmB-Wb`L3B7ssz$r3FG zktqCJTZ3e@UCYRzcDI&bw*g!9B}d^}~@rlB>rSHmeWYfPs6ycv zET4>yabQ0$5HyFl=P&RKH086;i0s*dPfXO7Uq3B&y{Axe9h0``|2DNfJC`V^HdRy7 z7)p0nolAqYEugf<6`Rgt;x6|=2{f!nhW2RzY)XMS<`W407&TJufLh|9PE_QLK#osd zR5R8F&l>Q9Wskdez3#U<}eXb(B1hGBPUDS;Jj)H&LJy!w<;(0nehD zPCXmq+{i)>HDpGig)Sdf?*Ke@c`loU`qxQLsun+Hs$kOAC2FK>(zd9k zjpdRxENAyZRn2ERh@%p}k?OHzUQ!!3RKOxv>F!|7!#7e;E`w|7Sxoq*S$N_bipV`$ zsR=A7u+3>vZXD!e7CQx{nbvbTGfA44b|-6u)rlIz4Exkesq}I!S{-P#JE~+K1#2bm46Zn2g&ifYkejMM&a^A0X?~msDorU&%;>MR@m@|xgP0kc*iJ2|P zLf!PI-;k%NT$q`{B-IdXC#s3#bwqU`DG#u%RKydXGdscy#(8D$d}1l=2i9J=l24Nu zmQ$;L=Z_No>mfh=&c@H&`+?0=z3cR^3AN{cl~8b4W<=?{8D{#zEPb|HWmeM+WR6F9 zDe4Xkuf~AZE`5f%rm{$twV$iSM7?U_8vw1$^2V_FMz+_qXRzP^M&N}TTTohxsa?`l zs-QipBvqQNswoUtv9$z;4Y|RDW~^#bf8-sm72{)>oWsS}r9OcEE{|u~r8DBfm&~F3 z>324s=JEqm=3ID(BI%iDdV83GN^W1tk7_GL^$$fgn5f<%s!|UXDuqhI>E;pr2viF# zXz!xamI|uqXvJ7Sj2{r=GVH^#Mw2&ccG~F)h3~8IE%=%HA>pqJz_)b)KT6?WJVcmt z9pOJB{1^{jI6k;bw)9pc*C>)BiR2R^=@UQ#q4)rcCZ*^>gWvx6ZO3mhe&Nj^T1jA+ zQ=*3%3iAw6Lh%o=wu$0gYdQ?YIRGAp;`BPXz2#yQUmudzV#aL>;|ux1lE#pQxNNsM zat&Rz+3+Nrg@@B(&7J7XVN&JjOEGEwM|hfRSo1%toTWe!WB3G$VMa}ss zu32z5mrRQ-=>+$ef;4)O;{KSpKO^pM-wfi$t_I?M-owpp4vPEvX|d-!!F{9RE>YZ% z5clWAeUrm2?4@?sJfeEiUH(6Vh!d>rKL49c8y1KF(nRh@W;B;o{?JiY`DqVK4K7s2{g*PMzj1uwhxmTYa>mbB>G5Lm#pwIt zMh2|7&RSGk@zk`~Q=PDDypmmcuypfcaBc2tl0D0j1-rV-pwA$n9O{K~QCaQ8IgzUl z`gJ_MPi0)HUKW|Pgh-~v=5$i|d!^RVUA6Luu<~EC@(;jkQWN2(r2O%sSd1rC*Nus0 z7TPMcP98DXyC)k-He~8T&S=2FOvKihOKd?Jad(wMcKjT`uS06H8RX+H^YNEi{8~!z zZ_*9?rMdNALHC-Kt(pvLbdy{M{vquBH}Uby;#EJwU$f)jW+Oz#ejF~Hy)mBVo<=|P zZz~+X#23b9)u{_HF2SwgzEwzkh+XG9a#I(2b^q8L;c}}cW2ES!5;q9-=%reTd+{^( zY*ym?*Ta-a>Inuc3M%u>R@H4lPZJhq9&nXCXww$Zu=aH+C%Hp+}R(NTPuA)syuBrud=>Y`tZFRoNZOBCaa`2 zzRklgSEpwIF7-$rLA#?GjbwsTW!crciG`_97^s$%Rj%Y9wPe(I%oNao_zjNR&iIRm zd=zbjYp}jXgWF6@F?OfHPTf9yCD`D%@DYqagY(7b!TS`YSPuas_R4_r><(3_66n_)yQP2y13nsL8j>P0|I=e-aF2ZL_4gnI~&tXZHbyI zzL*v$2}g z6i-Zs3&@LLYRz{W05pZwqf~h3>j@i0*2?NwZTvA(Q+U37@j7;9-HQsbCP3R?7Z`>(*LU#R8Q z#eK;jj-H9(1H-*o-6|^4j;^}NUUt^bPd&Db8ox9&u9gmyarMsq#inkHr@2>PXN}qM zW#8VQauh2046vz`tI$(%VbQ|C5Vk~pLSGD8C|eNPw}>itfO!P>4}x_E0T>d~=L;2M63$kK6cwN(Dxo zE0&SHFdg__s@37w0or{zGgm_n&~Tmhb}Fwjv@qcRhp6@?RadzwaA;8lsy$eGM>Izm4N>md4z#FcS@MC&_la+q;gzp&(C@HlfhJYTkg>JI7Kv?IH7xJE&hoc zTT{d?#U<*c(zP_?WyN^iE&$JHCUg$clj5ilt2MJkoY*oqf}q=E&H?%Xa3$BU01$9nad8&S|xYNT6&^luXLW@o7A`X${@wX@cqzlb{Zw#Ux%JJSjV9U zmE+E8JMzTVnjPSRc?)MdYh%%^fJ+v~cg2MWV+n%fH*y%Ve6>y-i#cSWu~JIoDD(y@ zzWeY}HD10?6ObqNJ@BJkaun(ou}ReUPaq`O1CT~lB|Q*nP(fPE9+ymv+4fVa0`xus zQXG7<93H#BGw^+CkmOgy1drW^1XOxQTBUr@f#zN0%ZN^Jg-K;?t$Adn2z(n}0EJBQ z&9;Wg>}bulFLEtbOZ90|v>^yUQQNM(}Aa9Ge2u zh?6MlJF-T3Cv!!4#4ll;r4+?3a>$tty$rpdQCl7bC^^wZP(EZ(1N3$P70?Ie|L18RY0kncC;@(51 z$WQ>XJal~*%#=mu{1PAkGQGCi*nRfQpLhm0VbLIKdTAzhpWHVscAuy7w`%vhc>(g@ zaflAJId};8A+Nh) zD+zvtiPhds@yWp$U4RAO@aiAJFd3PGdbN2(0z~>3cKsj#gcbS#S-h8xX*%Axcy}#s zQ}sjyvtqbZ1vP@E+E5Q$1jVZyZ9T08?IN0JA8e8r5G2J7LruYP>tli|5=mkVlt{7| z9Ko<5E~a@}1-um@oWzaY1{}B+C0H+4r6N^-*VsbS_8- z{u=9%LYiak&LdqdsGyG~*#UI8Sw zlc1L7t$CCxZXJ_-&2Ic?U<+jMAnUs6$ANaedB*Aokk)q_(nPFsU!Y$G^(Ie>*F89qaSNgdMkK8(QmgK@Rq^7haV%M6HTA_N(^FqP= z!Q)@gkYD9!T6af|e^~|lbqv`_zR4J12*Y&yVTSCXM&|`-*)VJ`G@K!B;J~t4aL}SS zM%8NVeMc8wv~$_GA%{4vRLr zA_GyPzYRiA;7(g0vtuqI6tnU83udy12u&BK);s;`?H?R#?jjN{XuP0_Rx_Le#Qhab zOr(Zg^o7`}TY6$UVyfgh`RTXyT4chanN8?_rG~w;s#n3Y-@$=1weZ$l{moQ7?EO7X zC~;ON0WbSCSUH4tm>P+W0w%L~J%IeFk5Ftfs~#3DWOYNQ3*33lVSRf6K2jr#9I0XR za2cBEi3>d9iNbGLuVmpW{9y3(<{K)9Wsn1q{n3XyAR-la7hau880{Gc$7n^5~p5nl7|q7fMg%Cf38grw3(xYAeFI81e)1cKGClr3giIr-^6!qi7#A>`&KzI6Kh8netW~(#~OrpoDiU= zz`Z!Q4vn*RfWR1sw*osf@%p+t~ zPBWwmzxsxiEo`UFOcj1DrnB%ZeR^D<=HaI~#!ZFzh!6fCjlZZY^t$ZC9^@%zCb(Q* zgH1%#&C3B{zC(jD$4Eiitynwo|AiQbU`j$&4BEI)j@CR0|d2bw*1eedA zXpw#sPhMQgtkGx3Bx`h!MYt7UKs>pzDIcsVlsOW>LesAc%saqB)l;`DD~kt^i_POS zAy7sQwOuPkGpkP%d+abj@9K%}!w8J&jt~ zKv;pcj@De`)b909d*)X5kG;WRq&Ghb|6|n8Vv2^dZmD4h;K@vfqax$K2w`g2edi)` z?l{XL6tuN0{2fXIXgva*M!zmu`0Y=~%5nofMV=Wf?_sWnVk{0`?&!~7a6TkiIQ1G} za8ntKb%qQtiqwo!s^TRIkGL3v!DW1@RI43&(GFSPMvCz}4`8EA9P)Q;sX1KxWwmgL z9;SJYIZ{(MpKs?sl7;sssG{sgcqY8I0YiZ^VOHtzoCYlz;(7c5d92r~Df|r2d#8u< zbUeHliIllSTvAM{iHlZcPT8D;iYH?8s;0~)8fjnnHGL*)j(Cd?Fe z@B!J#ug8?u2|Kgd_*hf)ksZO@cX0tm=3=}>yVIz43u2o_bImR&Bth$1wx!OyJi3mO zg`-!9gIR8S$er?qPmco1yhurI(}{|)Ak;D2NTGxj0=$oi!92a|=n2ohGH+x%~i%_et({ct|)$KFeAPjD)O za|F^8SJO(NC(I`}@V?GYs0?;OrR{`Dbiy0Bd{8@K!4Bwzad^zg+PdEf4W=i0N}0=^ z0N;7-0eH`o9-PFq@9dQaTsZ-6uD{Fgkp{CJQA}g&AOwku8RE#rjKAt*3Y0GZj{r)kb( z2A&Hte_}4zc!Kg_2P8G>Dhj7y`$td|#L3r4HtKy)X<6llnZi9Yx|GxaS?cY5uv2OM6a0n75uiO1Qd%rIG_cHeH*7)vER{vgf6kbIpKvaBDC*|GF5{1dC`fzP7glJ1a>?tCi77@#TP|W(HiJ6xY zkg;_rM?hzyaI%I4o)A)2h7*4f0i7nATO`C!#Uu$dA z;5sJ>8qBHeHDrPZ_)f+-Xtq^*n;8yFzn>B8qpJzqRbYBL3git;``=DFa1N4%OZi1K zKQKKKAW-ZHR3seQxXT$i7npubHzF9AzUusnZU?5#e+^5)x&qV0bYFitu9$6)6#bnE z%3=L&5Iz>3Aq3dK|3!a0myac%Sozp_!~aD-Hs8d_$DIC#84owe5}<)Ps+#rmxSbFAAkhpql!Z#tLNlnF(5Eiv2hMtmsNU=F|n{;}F7jB_BJZKwkN1tM}|j;-ZjzYz&Zqe2jPI z&B@2zfDFmUbY`#t-IkAQL?XK{AEU0%l8^Vwb^HhAu>EL9HLU-=gAj2t(pfwljDwqF z8vi!OYS|q22ZGO`>xKR9jcH%~ICwzN0~Wvg><>hE8cj2R{lMrBd|GrjVk2 z@R)f_eOUy+3?mT$rzX~$CInaO^t2_??K1Km?$LXN^cM94y%9<;6w98C4YE#fC6+ap zTqnXCa7}Z9*zZ%G{Hn`aMJx}H-NEp#^C0#pl+Oxc-wTTYzl=e640%Z)iIdY=;iN&Mnb|{Z2iS0 zMH1*9AQJ+ybXT5mCBHQonDCLX*z<(x=;p+t2VLuH!T^q>uN@|uaJYC|{+=o~|JQ&j zTYcDAsG+LAQ9QbT@33C{hjzo)i+h94ndrq4@1ePjM`!=88+t+iB^VLPGkZXH7{hzM zc>|{x=OZ*WTjDV@Fi15NkG}e@P_H-p2=#TuqcV{a&=Pr8>P&+ARvz_{q<-7_p#B(2 zTgSh|{}x${E(_e#?rgAJ5fb!j?uskY`^a)ETGNz#u&AD-sv5n|8- z0qF%{+q;Qb7laKaAzdud;55!Cc74Ez#WoGK(3xc6a;#G7iYb@~fFe{3QzkNP^7{E% zqDlqBb;m4dx8J*s8&EI_+GZpus^(ERH2!>a0|2Z%UL`1hJ9$j^2+QL+9DKWy$AxcO zc`WVyo5*7yn0xKxZ;R2#(~7#3$Agu6z4<4$NUYOpuUj6IAg9z{Aoaea-nl%U=#~DO zrQcgGpFGyGK~5e^V0pTb$88})Iv7y49tNZ*k2i3oEI28UUmh<9jLKv2)gq6>&+c3v zVSM5x3G?6x z@e_7LrRXu|nXmrlOj1G3y7Uj$E&pfylqLTh`g}W_BmXNv7G8ms|6dAz3zzvy*i@DO zP5M#(u}IR1{9_XRw~&92-kQFYf6~h<{}^e)@_%I2y5;|>Z22daUnBo0-A%{!b$nR%UG%>!<6M|0{pYl7CtdU;ekri5G{w3c~b@>;LaJ5&o%|w^reQ0B1%` zPdw%q{#wlU{|3Upkw@61T|3i*;ICf4|5(e_8i_ z5qz?S`++J=4>D6{O|Ji*$%3&efLiYqAD|?rSd#-OqL zEqYd?`?kyyl+=Dk0&1RTgHgS_(b|t;EjU&4&<|Ss8JL_4QPkO@>d*$Gc1+>3sdZR2 z%2zmNgVD*@Xa!ccWqu#3o>UZ)WllsbWNU1$WUV@x?*fuVE%7c><^y~UN(nAgULj7# z8UFmN?oVEgcJ7=x3H=bW|abqqXj;BHh+DZ1-iXK&%}$xD8g! ze6&4E^YgNpu(=OubMepYK^SQsXs{b{z5Q(T=h4Dlq!n7Mo9lmpb-!k8=*_qPbihl} zdv^cnXW!9U+x@43T`t^zs=Hj~C1j;HIEx`m!xRWz1V;N_#nQ1_>;9N%G)Lnxa|kM6 z9YU@#HJV>AGT7e3suN@YChIJAjNP+8pAY7`%c*nnf}C3pzd@j{LcT&1*Tz2q*HVl^ zU?O*;O7(17ihm7a*!T7{w@MFbNyu7oq{i;DXfXdETAfYMy)PTF1xY@YZ>t+6+$vDfL9+g4!9e5?d9kt&2_9^5p z_P-xTI;>N!FG(G|4hFh8b{i`XUzg?-#bveOp0BL;D6?b<*?HF>7O$p1Dxhkdl(gDV z3PI*LUTp|jPE=H9Ze_Yz1~!YgJ)U}U5^KL7$R=twb$F7JR3lY2pQfoGaxG04J}ANR z*yi>$u?rfPC7*e))=R!E5HxSaK58bb*1|%S1rdgz`?7Q~UfWH0@=RjM8YUC+6@y@b zA|E}IP@|bJ!qBRUo~l)w;ZX%X4(k<9O0&hNz4A9}1HFcFh}CxNTmU-+qZ+9mj67IS zHr`s<0wg^v%Lj86Frf_7ROEBvt=V3YWtawYr*Qcvm=(!S)-ajCM&c>AVMpRoAR+m9 z^hS!?^lJ{mw({!^7M@8^x*tl6wmyb=P7>Y?k5V9W0-Ty8YeyG@ZkhmA>7{L7SFS z#F}=hF2p~j>1B6~C;oBwpQIY=oD$fnfhC^11w_kNR0=?8zz$)R+r zQW^-vI_$g-1ZWd8LTzewl$ao;1M*Pf*GOfiF`06dhB@x7C8HBHgGmYhI?TDGl#2ET zJ19M?u#Y91M>jj*X8^22P*kB>e^ID8d7$hlMB8I(0hl=eXv~#NApsR*AJn81H7}wm zk?JjwXJ0U*%Jhs>--?E08u=&AKX2lXl_4|8!?;H-Mt%S!gpnD7aTM_!!$04X-ZcS? zA5V65e2b}Y9T#U~WQJgb!(Na<2vd-`o2h63dnhjQ0@FWBhX@|9pf$ zuGMA4Q;7^SC>P_rY>dnhj7JgADg1+fkgJJxh}R zDvcPfO;rYsE07ycGUY^Mr(^tgVp1n#aDEXA{QCt$B! zbQ#{)cgRAtgXfz1efFC;_uqfXKIInn>6jHYf5l^F5Ur)Z!4Id$R(lj*GG z0;^VKwE)hwGp3G!=gB`Xk&KF2Pkwt6NJW?Zs5bGR*_bAajKX`o6kuvbzeE{;BrM2< z*&x=2G8{7_0i~Y&{z&CGIL^78{g_jo|J<^vi>peX;;27o3Ih|ZNcBOlO?ERTN$SZp*saS9MM#33&HOW@>W zKfc``e_)3UOW_UX7y1qVQs3;`U5koJM&$9@k)co$K40G88rSyNWX(L6w5e zyg#2|?>9{rt{6j7tk!>HZ~ob-y;(8O+MC-y`AzK2)i7IXZ~nR#_GUdiW_HT9H;;a9 zxgF<*)#y1vlk(@#)2A%im4R7;0zm^qTNN-cmt34>U{<1+^BI`404D~93DJKP6p6@V zU`QlnVEPIfXJD=p8d*~XITmacBq>B7U|@0xJaCcdzcn!1D}k_q$+2L`YytrT;|O>L z<}f8-4NMxKuomZkrv_$tHYU%&YyvPfFewEYU_my_1_>INk0v;^e-o)3wMSTyXR6>~ z59scEK>4Q%CVM~^<^!5WN@8GwQw1YEp#Ad!RS-xFOmM0oLLlav!hArb1j0X@CSvDx z$GUuUSeA7e3$gR83m-5Mng&X1UG6!yfPo<1jS_ZwKe2KcMxo z0qPi_6kcTos0W}?!2ngBNj_P_Bw~u9mE0-{v9C!Ye z!U&wFl#_J91A_HlKwPh(OOPHz8L3xNq8iYv2LYwG2kC7=dU2&!7w<^(RYLaEnHSF& zRlL+8rC%**=97$9!W&S1sQk@ZW@-PXj_BC9y*WA zlWiFq9+xUHN_mJ_F*1Z06C`#`9%3&*1MHM+K4N7`Y%DNng#0*gpk>Sm5i3H55MzSG zw#-8eGcnGobHvI5YG zfY;>#+?;?x88F8IJhKC`%~+(nzX_Hxue!+|67Hd0~etv%?CJApoc&@`=?+jF4b z<3KO8UqdP%ZS2I*)yvGuInWIr^sG*x(}X^df3RkgRr6B`P4Ci->je5L0^%Renv$`y zL^>r6I|8kPN{-(f+j9!gVeF(GusR04(8nd_Bb;Xt0KEolcOU^=t)0%}R9d9EuVl{W zgSqEyR0gK8ATvperUBiS8Nvrev5V$A6r3OPQ1HQ=N)#yM1du<- z0YeB!1UczOQ(#U$#UDjDon_W+E2GG{AQALY-FSik&y6Sh2sO4ncg{KY{C5NE>&6is zKW4lc9zS;dlq~SZkKeS9^RzDaBXZPYVKLfN$kPDpD8v)4451Z|K>fmAlHBm zMrko%OwfQGi-ICX%@Y3i1c{(&CaHjF7GfJKv2l2%rnyFmF(YIx2O>j=F+pOh-pwTz zFwOah(Zd0o=t`?;?ytm{5h6AK8A6N+68n1|Vgb|ah?Swm&}3=ZU?oPSSb%>W<^kY< zX&(2Pn&v(7ptPo0;MZatR?~d30`{|j-@cREaBG?gs2ils0uJM19-l-?x15JfGt7)N z&789giI17;LI1TAXef*|&Db561%0pwJ){$8E*#0mlFW-_Sx|IMp$Gkc@J;g7{3Jpj z$Unlc5Og#B841+qcLH5XK>RB(88SAwdnFjCx3P$|gY^ex*}+mU+OvavfE}bI6FVr~ z_vhn%JJ_GyziJDygX2-F;Qp<&P$?WF6j+=8CO&@#`tMn`&^D0*Y-18 zwSAobay@T;h9{vw-y)R*)J&i|_~!>!PQ}HvctFqQ1GGC;BClP2EGR)EWfCdl<|8R=n8NFKIaISuKCve|wXqL5!ql3M`oe$x_ebq6(sVT!- zGqpra&007LG&R+%hVGZn-QRTJNAQ`zbyUsU-}E)@qWDcTh=|=ONCoyn%3&WhvU;(0 zx4)^^&nRQ}H#MUx&5e`{8nS%*o7#yn#VZ~Ajo|mqu;!8|U#HDO9hz8&=GYVb@um}G zH=cj*-rJqp!RuJ*)Wjz9T`TS26ID~52w$%AgcrF#p&N#Rp5AHTs&uBtwea-bgE>_@ zn1TYBlku3rrZh6932mnxtT%n$urfe9h=@CF-q?`7y?<2@g7^D^)^Srloih3M6CKdU5vAz~vc3^)NwAToCc(2C&vix%xNc?@*@1l!$P_ zlw6Pbd232)K_AD`@Yim1A`u$HquCKje7|fA99fW=fPD4g76KY%m=PjF;S@4V&|(e9 zCNl$)Xk+UfGM}CxWW=;1u;?(yDH&#j$P7k?kYR#k7QUL*8p^XZjE>BHt~HfH2Bw`@ z%=Z9=mAk854dY+4FY^WpgZ2AeOB zL3gPgN_+r2^aiY3u0J;Q70Yt*$HpUY>B1k|3|x}_5r6Dnf_CMP)u2EZ{@6ap`bsM% z=pNLtTmD#IHU*sln_n*`XeZwUId6tDy=YT|`S&=IasJqFp^>$KG7dd1R)Gmxg$G{F zBG8pTc8(IT3n=XXmC4rNUdyqL023r|ST=!x*>NqfW~agQQ3BQ<`#TAwqI$8J|2J5pLKMKRo8z zn~j|8iM=^^t1j)$y`zKnW)MNUvNt6t(1pEObaa-ziL%1oivRwdr7&IDo8yIyvp35D z+Ku=xn?P6g=08V?L9_N|f)ZF){P#ju3%as5H!A@b|B(RVzc-%IM&6wWp8%-!>_Y9tKwPqX6kwx|B1hoWp6MvLRJfx>_Hm;t-X1+ z(>QCFTdloGJ=YC;!%;98XUQ`vh*>`-5ocZ2LZ)#=b{r=6%@64HOqs@6X)u#<7WOMI zwSq79rq|{YW1T|W#Dy4(X_VGW=AvMib8s5W^MrjFt_9xby;=Ki6yOC!Zo-_mIeNiQ zy*Xm67@P^n)d{D?sA9h0C&xY5oo!(Sv4371oZWl}heQG~R=xS`PrhASgO~VHu8^68 zbSU`Ya1;vV7B9&n6EHiD%ot%4;?F7}1G^>x){g+qv1=UBLP6a4YyttZ;|N$c2RD2x zf!YPcV(LjC6^*^BW@n3ROxEnwo6pBMvvazF6j+dz&u6vHnjLnfc?M8wb{<6vXV1dX z73-O+peynLL9A_b^(~pELSv5bfDX+EbRB`t;h$#%KwEo28|MQ$mgOb7 zN(6vDg>xZmd*)rFa@w>Lf$$IgHf6Ty&zsV^5x#W-b^0p zo1B5{$qjpn$*B?7C%FG?ELdyziySFLSRwj2o$VKCVD0U?UUTePd8)YrG?>D%5Netv zbTg8;O0)FjH0%wO|+$Rbwjfm>B}9mOc?c%lvlQ#7c86=?Ukm<_rHKDNfmlbZ8C;Q(cl$C?Q8yf^F@~ zwrg9N1Z@Li+SV1MeKu*AEA2|q#vGQO-Y8yd>7X)TfZb}co1B!Fb0=0r?HLs5QwKY1 zglC==*^Wf^57AJWEKAJfoQ>Om!e~x&9D;AbprqW7{q%aMJr_B7e#KklB!s!;FtMkU z>;*qDqaT}=Oo^xmqdKmSi@9ThQQf5rZQBB8Gu{N9CiFQ@>5&vI_YZiA>&Zd$2PH<+ ztYbt2aDbSE4nbmEQ5Ryev<_nHNU^U}DQ0kQilfaA@&?S0(Wo%bN@8p9$Ly%Ym=Pk@>X^?2dwNuW#Da$VehQVAYfdan$ijzi^wm63e_Sd^bML z079~&B^Myr!lV7d?dAwuxFH#9$X9qv6vh@E%s_L?7OrYoy_fh=Eg9T(WUU>FXbO9* zX7`TNeCQKsHTCEK)+XnJ8@fZaI?&EG^BhJG7S6dz!4?j*v)#!CFu!RHdG-e}P zjcc(+6l$j}oYT(!gKRth;94hQob?Ca`#Sn14F6kl2Ecs`OYZmXcOmYo4+$&1wN5Ty zIQC#lBQ9U4CNJH6P6NSV>o4vg$S6Gjy}zhV;#p6Goy6jWsJSnXl{rr0$=9MC+*rKi ziEcQFTceRd$4Q>qreqD1FvX8N4T2KJR<(k21M!$yKcAC0=Z$VSi5w?`^yFFTF$sDH zdGyXCy>t`k-IC8qJcRUqjgu%2a50G4BhT`zw3!6$=Ri!`I)=1IlJ>S?C-E$lG@p|R zgcR%HoW$oZb9d~dbf@sugJEu^n9bN^F5s*`$iO}^^91~L{-B=|x8*+qouqt?!}AA= z0pNKFgfP>}WGpR1TK&PFpJK&w_ahgfgt%x-aNs@-1*Lw?vJ0>$s+xHdf2==9QUQNZ zh;5_9#^ROwgLO)b86hvB02xAz2@?AO!&)}6&B;RD)uya4&m9Do4MDbfnkgi}fYCq^ z_6HLIe~|UEj4VfS=MVbX<^rM;fAF-fknZcez@R_K4)XlLkTXsKrXLVG7flw4D$z_Z zzZ5S+{K#>}KYcQn9|3>RIpfEnN$`4vSi^xrj2@Z#gPSNZW`v04IOCV+Ar|ll^AY=_ z5*tWj^!UuZz=4)ABSef_Wu>Q?U{CkULoDDAI$~vkmMy`62{sNUG5qT=Lr5$YUAd6? z&1NoaS+?+4e^5AcHQ*PBKUkoEw_3odc>r^zt{mX%4<3wEK7q^GaY(XOW+NVSVJFaU zQ7)nTu$=TCLK43mBc0N2Mk*g|u26?|90q7l_n;GthIGF8^A*zORQeU-w&A zt(t&kcmHy%1)Bw(J)M&AoW1_2F`T^yy&S9Fd<;ae)tGaQ?)?yx6%9|*+~H$+^=3Y- zthCG@R&m7?3cgubjG5}5AnH{ZxR!2p)FY``0c!96UCEh%RGoT!h88+D-d$2J_q0Ef6azR8mfS9 z5(?jBwOOk=YdIhBvxRdiQt~%jksU)7(c0kq@Jlg7E>ENO;Tr>YDG57L_;hE@`fMa; zd8!sqIPp2N#s0beQ+EHpzv-{&-`+rI`}dp&vitX44pFk*%G*!hz5cy+?{4+)cN_hx z{@t^x+x@$Ntw6W>m+OxdhHm%oleJy;?;Gsjub<87-$O*4ef`eUzeC{o$v^zA*RFeS}8>)9ItH)wCH6V$B*8Azw~nD(-^b8cx{cED1>BQM{f@;&yCk` z%UwW`Tg_d2X-9V!uUSRzi|d-9$Zc7QY~wVmKYr*{a=q}kMLt~@QsmhP7#W>gOVVm~ zuocJ&>+F?utSu}_5))N5)3FO3ndbF_mcE50&xdl_(l+B#j&lWyc3-iLjc5JFT{_kjKVwt-za016#UKq%P z`SL!+l@l6TTsbY9e~WDyrvS2Arp-$Yi&NNp&l6#9K{2oyD|E?z$4Zy`!mc;J)i8>{ z;@nxN4+gUaJi)3R9HrFz_hrnML8NdqK|$Vjdw+yI_IPxkpK%qEzen^G4ZGTaYBe~8 ze)S4o_fY!_KT%?`25z8b(lQS5lJR)``oj8xr;E%8Y)5fe2kZ{#h1GN!Pm;{%%m~$J zi|ia%z6Ry(X-`xdv+a?Zr7UaDdG3SJ9heGGH;t?A`4?ZNm=SV-IZq`HFcWlu`=X%K ztXZb-C9bkgCnZMDoSHTa-kGC7&@5vL3DkzpG4Jbn0>7c#b(kUd%p8vys?1sZLx>D# z#>4GJmpE+P{ObiTvx(BpFS8zIEa(E3E|~^%&)qLA6dx@(x!;Hq(n2QK!rf3%=m%Q( zF4}4L*^*RXGFym!gs}|77$j)$a*Ps_s3AzK!4YGE#OA|PW)tgAVzm9qR6b&tDKSH0 zL}xe|ioRn;sPF3emiHtwL1JU`5IYKr+{9k=iIw5W2}&O&wi*}~09%K-g2YnMU7uu& zo6XNKSlRVQ2@ihhKo`6mtbp%f&WC`D^8n_`Q60eb-lwaX0^)!i%|N9>a>NXgqfO8t z`GjPKcLQaP#$!m1%wP}ip1FAIvhgxQ@N$MU)51SR{PPq3gz>gxtke3gU@BbSYqRk( zL-39#wh8>hDag#-Ie2S5yjSMptE48bcKl_k6zN4%qR@D3!lMR;d+$;Dfpjh7jM z_iSU?=V;}iCyGEN(&5v) zPj)rX+4n`-ruprgY z_j3-vOsLnJZ~j5*>-c_7Jd3(KD|IGeSl$LXrG6QypFrvhU`^p{)aQO*`5~`#BTMhe z(l@X)f@kyyw4^{PkhFImlrpbmEBo`VZY=w&0&Z*p*EZxf+>T{zr9Jw)7~nb?HW#UU2WWF9 z;sVfDd(c;O0{s@68k&d;K*v4k13Q7vnTQKOukS$@bOL=6X&=Zx!m!ZM-xmj<-7*ok z2&sJSE+ruT6__u{*zQck-QFw9N|%Ds-b5T9V5MnfWg?DkF(+*2Tju`E`1)O$h&v0l z$~uqd@BbDutWvk*n?Ov{2t(qT+R*vmSr>`X!};HvY4miuENF7)dApCgb=mhy*iJQi z<1jgF&ctJ8H#K8vR33o|j`VKSVA&kUKw)*Rnh_x&_5=jRWD^MNy38TaPYKw~-c?EshoY=KLLC0Vc%j8=y&;mnh6A_A$-{PZMZ;6X*p6kl=5%(zSje~Eg#T{BogJH z6#jr|a?#*L1R916b7nrE0W6Py{$byfngkd=71^HAZS zODE5$AdEGWaH_7pg?y76xaPyYtcS-8w!@?Du{0`A`_f<@z16Z??8{N$JYMPM?r~s` z^n?^NEcmh-n7o_2n^7RRxtsREGcfh$(jBNGda_j(CO?H0g@K`htwaA&(5h!0=)*|j zuMO-;ga+nl=^E_1?x$opc&H~-sbrWDB9mhUK80HzA`>t(j*PWq_2yp89a-o%cH;K9sXolPKMW*h-)X6j8$3E0iu&j1uQkyjcKxL{)PZkGgGS| zJ6e!F*&xBq-S3q;<$n#SoQ=?H$@JIwC%C!$eh=u5d_d2!yqKBb=I%>9pmXv8(Gkhr z+8EP=$#B#=U{$lmky2{Z&5rXU~CP6Wa~h#)q14_zsM>ozfO{fD|A2sGp9 zWY5I#A!uUi&25|cCZ-H;&EBtziD?wSCTqV=Ailg<=&&)gF`e!2?tXmvmm9+I<#8Oh z{P^j*9Xq{Qg?X=u3!IM6b21%t!}IATnY*sghqts}Jja4TuqStLeu zrh>#$(Vh*=Z#FC7^kg$jA|)GI{uA(OYqwUwr!a{_z}xcx=7yGM16)JPlab07Vs#Z- z?(RWv-wAYAq2(7G+IN5)n2(UkM;l&gc#j7MP#Y9K;z8fj3G_*XK9GNeVWH6SB0>)) z?K3-pE+ruT6`1K{YUJGk_Sncb&HdT^vtAa{+z+)1dVl`K6z!KZZrgA87tzymbU;B)j1V%8tEaRL$-plxIAmTbYDB zPJt0s+j~7G^35;TgT45$DH;)Q1RG)J-GJC)rg1;2T!V_+5}iYMXt8hC8q6C6XzRiu zoPz>EhmaN{;Hi!8Pi@g@Byk8=pkDcOJ;#w6#s;v3&9Q262(d8c96}NaIfOrLE@VW@ z#eQ9=WS9|h2;;~Q`^5xJ$_mJCh|EnrKn8rnvP%w`nM!5?VAXOJDH&#j$j}QAGE9)n zh1q2A#Vr?oIx_ns3yw;?*;C0(0_+0(>o9i$8a8Xpt!yRkzsyGFd4_A?iKw-@KtcLg zkgpJ&g_^k$iCHgdF`zUooQo7b&=TJE$oneQGaQSQ1G?S=s>uh$6;bsJahlx&I?e+c zn-2&}3)VA)tL6di>;Y|+4`?cZqWtq{0BALb=f5DstVAlOO`};J|8!>oHTRQ#B0_`7 z?;DWD#(|gP$tU@YlXCj4+GFWZb?10s{c0c!S}G2go(IVXc#!QNFF|U(Ij*m7rUtME zU%en^>I~FfwzQ1&_Ind5o-7-2)i+{6R=PBZ4k6i`w^fk`?MJfbYY*K!-8bUJ`G|u^Y|iT(JP@q z@Ahd{g1Td$PEay5M;frc3}}#HM#yl`EQRdTplmW-*{AO|me$Z5seL+2$uJ{CCdWR# zoXBcTSN7>TCF9$t9wd{BK0J%$o6S|($UOUWG$7SJ{XgQq1U|~@YClm@qev623tE@B z;~o?gL^LR)gEflQDDJpctP8fHxI}|VG{Z19D%jY%#HBSZpN-ZfqR4=h1UKS7T9?t* zdPk|oYB8?-pXZ!=-(}{_;wRtl@6Ryra?d&Uo_p?d&pmf}UqBj=OtU11=aU5SXuuPoJXaSE3JaRX`MtPxC#Z_9&ugd}{QFE{h_H#;3_75_~!+il`8uVrxs? z3O;>S8jVknGaN7&eCque%zgkq&0i}IpAKIt__P$xLLNT#C_ddN5}2DGfKP4aLoQPc z_)i;zMvoaR&BOX5S%dWNV=X=%b=4s7N#;TW{*&Azr|_S638Ni<4Ryyr+V}SXpPmBh z<*@S^YV!Q27IRjUZ6<B&|hBES+u`W|lQ z7fN`)T&eD}RM$mNSpbt$>rMlqj>L||l@9&GJ{HgM%w-`ccLJ_pIzqRzN4HfUbYGC9 zjsNJLPo?`D?u5$A;VMerlO&nWe^%fhC+`W5?!i9jP*5G$m{#H&$h66|JMtlfnK|HGf8_(b3O<>XyX7JG(KAsI{4z64z zc(!tAUwF3kUz9*i{UAKs_{zcJ+2%DC&l+l13!a^O73-CFcKO}FvrlHB;tKGrr5;aF zZ)_Z0=IpV9!n5t5JS8H!Jwg`!;n`dy=m*axtRr^d7elJ=PVL4-#IuudtG}_ z!k6ONAu5Rv`p2^e>k1|HhiB)iBp=VRU@#~=J2*m8e|Wa0O7ijSB1%e)-X=w@cA75% zUimum@N6mE2*tB1rTY6ErCJn06~wa}K&beVz*Q8!MB~}<9^Dar&_(0fHXhw3eb7bY z*~f5Oa$6Sxm)^rwR6e8e?60H~JiDh4xG#F(!`R#t^90ZS@}%I|_Q-yof0l+i;>nVg?@_`J!n1%|cFUT5g|&{JY+-D{ z%t64|g=l)g`AxY;25nuzfd33MR2VD16EL;|ZgX2gdcZAfGcR6Ytz2O2z^hObTvl=U zcm7(iHnT2`dKvrz)Ij9oiI2ghpT!d`C2Snx;;G{`lvx|h;)&l}?i%4B7Eg>6F>dk1 z-5?!!@x*%h0s^y|)1hLzK!-`aV=}l~I$n2D`avpSfW;H-m*tg!vxU~jass@?6X&Y{ zds5y9AO#>@-=xrTW{(ZmP$74(;p zREd^F5iLaFG#&%q){Z|Q?pYP zQ3Z+cS7eT5N z4>UnzSW#+SrMlZvr6Q;-P||bE zOFnCm zkL-VVi2ENPnQLsl{SRqjRPq{+sr^6j5BECA`iHliw_5zetA9&na+sUA3I5?)xGnS# zA4I2NYX`&J`m+V5+sp~jh(4ybxPpoL^ADdzf`0tNncs*t%|v}FD1ZDLR*4+?6ap|J zngAFt2w+Ddq2wdtF!^2g8^$-6BQqb--jLHdV(^@#3?B8v78ukeU2j3SEm4<~s<`$rK)`-dBlNc_WfqKGO`d@(08 zmX$Xc|Ioag2P%_cIsN#D_kQYQNgPSd{tt+M_$c5qZ@gIrC<^VrzZ|j#*ndBdEkln? zqY0Zof-SmkZo%LD*UYITaJ%p&$$990QPkir{7xMv=AD{`UHEa$lAfBjd5?_M`#d#m zBP0eYw?e7RLnfYzwc=Zp;%e#gEORQffkhrKO-LY8sc({xP=g3$nn$K_sBF(oZAu-E z$7OS93?tK+=xD{4CFD^9yb16JZ!FkDr&Pss4P0FlPnNvV%|Z`*A3q~sO1uUkd>v2N z*=g)ueg;4@2G7ja@UcK%iED9qq54Jfgq)uvHi15Z?_^ovyhWOy*^&i*bg2s;SJcDe zHl^g?k#5y`KuA}v0WOHJQhqqi4V(0j#zXI1foDEZmG-qse_J{+oiWUFuymqQtUp;W zLdqluPnt4e;Z!Pbl8;nKg2m?4vs9%G^|cK}O{p#MIH1xds8k*~mAcP(mNT7G>D5@} z43+*4KUSrD4V9M4k5wse%<}(=N{etERH@u+5%gGAuC$~|w?x9(k_D?$dqjY&tL>Bk zf-QMAp0cw?@?}!gn{>?U|2t?;(xoRK;Tzi18NZUkOUSc+0Rtvb!Kd^A<}`yXtx9%q zK@0M<0YeFtROP5`WtrM3qV@$*#MSt*ir{M~A|pRm5xg-=zYs-q<2tAaxwneowP#zD zKU;DURz!hq6<kLI`L_o?{(&S$xXMd5&*E6FxpgAMw+oNBlIKVyZ-Uciwm=6mZWGajGm4=jez5z|>Ld$h01=$3P+ccF$>gSyq`o#?T-L~_qitnbb2AW+ zz|z+_Km{D{b4S2z434hx7O)+L5eM1!b^1#I+a=f7jHZ!0k1b&K_rctLGDCCQ*2m$L zbczM5_{H$#hResnP4v#dG32fdi_p4(3#cOPEvFXKGFjxb@;8J-D>{hp!hdGy%>T{rL6WvD3rr zyDvSTmf@W`Q@DS489x}u{lk@~(b@jd>$^7r@T#-@&J9r99{@%D>>nPg(p$_!r&9Wl zUf=ykh*RkgQu=0;-uM3DbG_96V(L%MMCyY5!!0O~nyfu{+uZn+d%{KD`+Vq+5bDe` zOg-2|-nSsJ&Nz5c9BzH}&cfh0!Aykb0Mwt1YaKH@hHRoM=Y!CgfqlEU^t_-;zXi)f zvm5*(@7K|%Lf8~=u=8Ikj1NM>D)Ar`VR;a(Ghf&<01>-R(rxKI4%vZkG85G1Y!x;Y z*E*&DHh7?9d=L`GzFmY#Cy$a%j1aaZg~4mUl)e*I6%h6vI!u)8ED9q#Go8ZVEdB<~ z7{R^I02}%F$NESwvkO4KP$u^GR>GGqP{NJ~!i`B7TI}2aa-C+n6jxCTt%nnFIVQ@{ z_Y6}XyODWER(sJ~wkE&FB?B2Ziu@#)}aK%+TN_d$IU3F(GLEb^X1 z>M?j{uIhujf`s@(tc8jl%p&g-JHyZ`{$T%$yf^y?ahT9xXTKi2T}C4#kgJ0I!`;YD z9P?jGDTY}Z^n8A2jPWD(#Tj(iCAiGJh9O4u^6taWh;y6+qYcKV<(|U4 zeSWtBLlyk4`yJqHOWfwB=l~~;Lg+rfWq^56H(e6*?DcFFcAww$_kAR5HAS>*I8J;Y zxzF!ia0)J)WYY>P>z?zGG`Q(_s<^f46l!%4`~1#CLT!qLA90}&#yXCombnmmI~7Af zQN(IdF?~uzKivZCakLao>qQ^;eHveIT zJ4wfQMAcD5^rdu0?BM{>)+B<>7MbBuM2C|IfAkA)&=C=uW)j zL(&+E-QpI3qdj6kM6BdsS zq=3}up0gB>mK>j_5f6`U1exMdxsu#xNv_K$3F6V2pi(?K0at^>qmdrb4pBtWc=Rp& z0G0F~Top))#-mP;Xh9TFG#*_~BEh4kD57XQ`i7s7E5M_YU$Y_c@GOf*6aPL4JlgxI zABIO?y^)7U*R}{Al_2|JJSqafyYsJbqJZxs^)-HN6PWCbwemOo9V(2f>*T3Sbn=Rh z32g1Ln(+4p+Na``Ka$-a&Xwm@$xh`}I}3cZnlsTD2mA=tD72fPJ0&(nwLb@n#ke{UDym7GPa<4hzC2~^Z<>Y$iuc)@PvP3ZOTC1t+nD-xre+{S7P#x-YSgDgdjA7f)6li*Q~POwk1*RDdT=r6;3`8o zvPp2DZxbAh^!D2Xbinzosu3ucH>&3F(tN@m-Ja_%n+{Jww$U4~BM!lI1s;f3#|yfR zT}RtubjmOp4sua$2L83nBPfavsvYQxuvsds3a_+J_yRm2j1NM>hU0+<;{}BsA0aF- zs*V!2feMR*gLV$rs4zYV2`k3~5ylG&`vg--qWM6{wnS66E~^t(g%V>3FD1JhJ`B`2 z85|bkZW4h)wmztD2J6tMIzWA)M}2l5)CHsJ z0QFv^9>bjP(g$?~W#g~NOks@-W>mcv>NyzDl+_L1sJaw-ga1nCr~j(ezw~9l%P3;? zAAh}c885xX=V$8q__J0tBOf+?uIFpt{8%u4o{l_UyGi5cb!HKm0rWVt_t@dgVoj5s z){E7dKcJnVbip}2eCz~?@W{o_@v^oZ!R9M88#<>q=@pG(xAhTh4#d$j<|w$940sO^ zQ)UO9mX8~K-pF==*^2KVQ|dt>O=rTE2Q!j}4rTHW>ju!hbs+ae@|C4lPW_dIkE?zb zR>8ytA3?H-;V8Hec@`n^`?sY#;T=~^A5@O3=7rfGi%H0Q4{m;#4H|ehh1okmSh&edd6RsEZ#bVf?-yEA@`G*n9St- zusm{;nXPn_z&OryZVvD9hgj%gi}7RU@c25Oc%({x>>M6%%o=b6K|Ti8!8ts+*CNO} zamF~AN#V043*q_UJY(E)>yR;4f=Y~$7v`Zuw1@?U-Pc_6qU)?NVsUT2F|xf6DQkpE zX*OC%$98KS6&&=ga}Eu+X&p5M>L`E0`PSuR;p%7vvK{v)oIjhS1^6)&&Ko``b+iS3 z2AXg_30@NFs0f(|){)%XI^wlgM_b}1G~sNEeJ2uI9c9hA08=7D9Xz)X6xqa>t90nX z3An@XRl5MXa1vT7lo#f`xbPCkR2MNuaV)@?uWz)~x+`S)$dY#jpqYLpfMx~9m|>uq zAUgD?IH%SFX=pu@(I_-FeHyX}hnx>WJ~A;+d}LnGM}7u4CHWluoLapKn*t8%{jUTM z2;+m0Fan_n;{}DC7$Gd+{kv%{v|8}fIkk;c*i>*(??0i!_#h;V@Fl_o#~`d{Qenvg z-oF!86%cmMOQOcJD2(jPW)zkhy$nlzU~}e{2$t6SpULFYK)+Dt)c%2#AiTm7o*qGH zy?+wgxcZ@UYX3p^pwtFeQPgjusC~_;J?v56+Xr=l_aDglMIQAzeNY#8 z{{iYTq!#agw?3#Vm~;FUnd4X^gYo{?zMnuBz|9IM+VlQ-0|$-3DBizRUstE^{SRk- zo_Mu*|F58{Wx&Yu-_jt9WB(2nZyYbQo@y-|%152OePjDXXKDc6jCjy!Z1?OeXLjNWz zCeWK3?j?zhTaSQV^c4@*>|nzF;?}=Mf_~!G6XA6LtENN2cK#pv0etX5s714hON*Aa zjuyQIGtQC?CT{)q3nGRUt0*;D#qdE$%oHbv7euMYVtHcvi(6kLVqDyM1xN>uTOXY- zpciH8YaVSw6=37mNeW1f9&@Au(z^MaE&(T0V2gR@c?U&Pl;raxl;n+xd8G@+tselD zMw9QtRY5eF`7Asy^AeBf{3xQQNpu_k`J9=v=Pyn4i1vvhBB~aims#c!l|&ICPG;xP z5&=nXK8G@m#RJogtAa9ZOCtPHZS7|04U$C+d2Xs_@nnUnSTw6M5=uzWyMQL6r@9ek?Fg&!xa4(-RVD7$nf8x(5Zs--d1cY8+u#V@{Mi;)gWS3BRhJ|B6judA3sI87ovlkeqWMuo zvq^L||Cx_}pkT?~?>wT$C?bS-E&enHh>j!CXgn~JqlhXWBs-qn`VQ)X zdIP}^T5sAJYXuwTisRZP`-I1}>wCp3L82TcWPN8%#5MgCe$88 zP`RggU8D{TJvg2U;ij&Y7Xm@|z-{h4NQHuQTno4%fmX?k7Bl%w%GKCr@M8_Fz|)_S zGi+8?%m?KbBKKHN?vs=|e_zO5NjZ@x2oLpAzs}Tin7T`H<((khWcEUz0`d+7dv}+2 zGun~s4l@dUpqP4YI3FV}lbFXXe}MNUa|(!ZYq7w*d*n%*RPJJUXQq-XJb#HI&w(?? z5^jebv_-VS2DUKhN&@Eqc6J}(ex)7#N1$K1X^E4dT~sDF1sn#)oDQkSoHyo|%AD6U z_kBI);WgG5@*v&dpoG0kS)+D;5;#T6rFBcotuuQ)!Io=&33hZ6ifZDC58|^{Fhx9B zvb}I~wx1o$_#U4t*D7zhUYrm=B=b0mmT&I|(oB!y2TCe~m?|=5XBR(oz)X zB*a?zUTe>MI!6`L5PD6xkK#$LWc<+fqVWsgDI|R<=&+tTm5aq-a;H z4@N+>gKc*_rBQ~tlH9s{VoBW{&7&5amz?4)zRwAW+s#{qB~$ zN}e37WZncTxy2j-PYjiO9!v;xOdcA0c&PPl@oo=cj`I9Sy!(1|81J^OLjDEL1@EvS zA`kCI4z+lf*>knv-6FuI8pF;Pz!(m|Z4TS5sKjWzn|jJ>!MjPG+)t)M?lW+7WKt^{ z?|$y3{t0t=GgEW63%P6&yChg0gwch?yS?Nc@eYy5`t)#u!FY7PeZt<^p!H$zsmFZt zZZe1AotZ}FKLYk1Ul4-5I~F<#s{{5eLA;sc+x7XLsEh?MC-VmWb-z(cu zQ@ib`((W6|Y!Q%94wOFEiJRu}XF@com4}l!S~V6Nnez$nU~&-^KV{0yu>MjA~TR1saN5 zeuO&KEDOFhSd1Gy#`9*_#_l7jC%R{Iu;JXa1N3sucxx5u!xJ_o{t~8u=Uwq+6$XpM zCiH_vP=fFix2YLP7M6nE>;ne})3D1qdZf3OsEj8|Hesf*uiKq7{#g~J1AbiOZF7ot z9v6VFiq?m^&3Csd=7wu4hJA~}nJgLe_bnoSEynysDyc;Lt>Aj}b|km>@)9=A4LqLg z8(%)!C5$i65XAe#mp6)~^4d(@POAl9rtMC(u@+0tMlF5>+~@~iZcynhW(|@4qw(cq zh*RlHr$PETl-@VKEbvml$<+HX_3Fo$zrdR)#Fy)+r$~Gm%vEkYD1< z+dKRid|3{3Qrn1~h1#Bs+dlE-b1avz_%a6NQG98=->VPcK_#q3@#Rf84+Z%0`1i;j6d2OZw{orbdQ?0!-^+P*z)Y~V)j zZRXyM+azQ-<4#j|bur}060fpgeClQ|K6Ue8;!`(4fXcg;@;0Tsb0Keb?9OeAn_`cl zuW2$%m?^(8&&Ff;3V1)EO5UG&uWva`W+hUa^~4$j&A5Vv2*;$JN5ZHE{6DF%Nocgm zg>mTf!9i#RKO4q5{~j@nIq+A4-hnrssiWv*$K z9Yp(W3Hk>u)<0;0e^9ogtBI;JP!r7~pq%q1=g^`KUodh<2qxBS_GGQWKbRe_s(Y`v zsrm_Yz|H2}HoqF$%=t(&JN5+E*!7wt8E=hfo{YPr3fs&CR(wSFztx;@UBsHa?!O7O zP=^fKFnI26sfC}2t9E7|?eitQ(?Q@pwuyn-=kh;^WvoDd-(UNDG!e9o>}qSDuYD;dkT$g_ zqZeoG%YW~)eV)IatBI4a>A>`$vG>_NZ(yxS`_;51eV>?>E; ze~w)#mD6Uj@XuC5|G8`%S4&?_MJ*kI+vxULb>(VlpT~Ogo~OJwfii{dvjMge-98VH z_PPC?zF{<(N0HjRNRk2CXNo2m(LT?`zN*kPh|JdX-GA0OQQeG_jhf8^?5g~}@u)R%o5JF=mDCLB7sm0A`37DCEUif%l^v6YUYg2wtg6Ic z1^&w6m&7}(sz`v2$TVScn@K=|jR{~k4f%Gc)@8mTb8Ock%XFgVNr{))Ye}9#0t8Cj z2{y3??;P>8Y0|8;=)$${w*;4DbxUZq#Y}jAvf6?dobEmgsYE>7dx$N{{T%=5=DO;J zz+#cK*-5##>SB>r<=z_N&P8&P)$7ToU#=7sY9Uoh5{YRcU%6G@x%lzaO^vM~Py9YzS(?aT`AG-u?qxrB9vy+vkk zkm)j!2bJVdOR`5kiCrebDl=<=N|%Xz2gdf@~f$4|2quh-G2=S^W0uu?`zjf?b<|H@(4eN!q-AGg~yh zx5PY|Ha+KfE)4Mz*2Wh!CR6fg9prgyEg}g0ZocBZ-ErXib;a?;>jb+ z`c|<2i5iMl;+xX9?_y?6C zM58>SouY_lGra)K`~cA^`U3)K|HV~7_G(BZK+_l?dWJ-NYSK|e6(qu6k@=L03J%GK z@zp-~2Z&;r1c+iVUvlf^#D&08`zrJS{j5iu+Tz2`7fz&Y>#r7kJPHSrg@=z1 zfK2gmgpxdsfig+%$tMZo;}xJ%0J;!Y1ppL{kCQy2{iBGY@o@u>Xq_mcXncH^U9{li ztGFu2UJbCJ5FhU)(P+Fftx-f3B*I^jSx!X_1|P4un7A-_e5|@54Ssu08}$H#s#pIY-0h(17s|agN1Jg;1MO%qOYQ1uX~w6V0|s$fvXp_KYMTdA)jM718#Z=;Cb1Ap~(Rs&#xmVA!AREL|Gg`oC z)mm^Z8#i!#l5*+op#P=Q5>|S7Gq`i@mxO>TZu@DuPtQwu5U;Nbk*U!yK%sOfrr=gJ z{W3!CFvJ$*ts@@#NPvl_9%1~<{2EO<(YUV9lb1SeY(E50Hs_}h?mhre*7&%~r}wCV zO3*Fz`h}z561h^JH81OXQMRfe!w~flrVbQV?vWboc^Npr!fwVb^4aqe#a}j5v@yhL z;}G1cHvTq*+K^(ye{MBDLEkHHyn@o+wH*EeyD`jb=t~DYt-{-!AV*g`dL02mzmtR< z+~#-PxEP(!)iQ^2*#j8+D5}t zyYF~6nRmr;k#m$aR(s?+)KjVgnF{s&{P2SWBlHUpOU>hJ+Y0GyoQPM5rG&l~M>!1I zvQvq3(c27_Gy-WgZfn2*lK3DbDdQyZf}z{PBP4wZq_Clt0!c$vQY9skm$^bE@j*xu zKS&{Ek}p$0(g&r5Wg16GEL}3?B#n1vx}CLV50e9{Rb~T9N{wE$p*G=p5&Uj)#HWK; zM-uNK8K^F?R3}GJSqFsBWJc1)_5~ZW1FvuaYiAwsYjMw^OrdYP@qv8hEQNyP;3(Oz z#XXBF3wGvR7>sg!l~-YoUHKgOKsZu0a%j1JE$)&4$CSshzL4XRe2#n|94T6v-NmaN z0vyMA97h&%Oy_gt1L634@)2f7^6FLm<4T=_*OB`T9+-D|g^Pe5pUmgT2f{Iibh5-- zDX?7QBnC+mjqOMw&wwGkhMY9K+%)EKGTKN`oTA*u{HGfKxDL~QCwNwgiUQih!y0xj zRwf4f(8f0Asu9a^@mOvUr)H-KKZ;QJ-#H{jW83~}-=S&+jd@}szUMYd+$?XuOyT~; zE7mWJ7mY-x-FLib=L~Zg%er{cfx9qk8ZTN4*XAX3mQX}=yr=?Xy--6B3WOef1%JS; zC%!0K5>E{~h|G%@#p^FAg%@*B_~nlFWpXUm%J!OlQ8sbifOljisupY{KduR8HhOZm zpqj(kxCJ?0v9 zXXv$dg9(70OuCha77H#W-f(9d-lVZe8KGw^BCM~?;_+JkLqK|*ZOY-PaJC3C^)8~Mu2BJN9WC!vI&>=j9BEqRhB@f5GVeW zER=nH?agqBk5d{HYF>KOsy2N5M%E-SfPn*|_FV(IOpQKLeukZfpZUiEQO)~F+sLgx z%9tGbNS4+wTZ0#gQc;TjvlHIxmDoviVMXj?Z0f4WiC)GUtm%O}H9It3p%TP2ifO2> zQq!GP6(D2H@h5i(`Wi8ShH6=)dGuguEb+wa z@su3T7f;wT@HniL5#emKmqhHj`r7BPec~LI!=`aGFZB=~Ya_TLL#x(g&2xzwOU61$ z#-1Bi1jX9#1h1`+^v-=S__-Wf4pTy)+5m3V8lZ$aRKQu1WBXGYpS1}0!28lTnq*mn zn8k3AAS;@(3RZv(0J=GIRd*g!xs{To4iKu6Lr-;h&^HR0GAw-2N}xbvt|<152=}%_ zVIL8Wv1IIL9WD;57S#KQjZ6h?*zgAM8(P(7o^ECDykm%KU(73|+#!Gy9G z9d?mT)Vw8W&QkKMxd-_QhTrUd+(hlS4(gGg`t-VqMfGMKbdIL%nh%h*c&dZ}9;wCC zHfV|$FJAS2JX!J{R^zC-_T<h#g#z@u~Z z(ZzvB0yW8!%L9)N)>N|sk4EXElLC*n(nmuBk7WFnEUEAx!J2wlBSphuKCj{LY5cY0 zkG<4v{9TN{)A4r%{`SM)&iD)T-#}|tS8cEPHLzdjT7va!-^Y4a78RqadORTMi6>{4 zn*X5TGYd-{EjqUbhR*VSNtxYUd85o3%)=1ML7)=;$lGJ-PvVgJ|?k zm;uu5=)@1^foyUw^2VDpW4~IPG1H&_p8Z*dLxB$FIDw8(@pux_t68#hbd&m$5hyCJ zK_a3_Nm;Z++Zt=Lt|_v%%)-k;?Wu*g?zo1%NvuM*6+UP$*n_GrhjPY~4Mivlg8qiG zm?u?^w3Y&WRCvyVvi{tWC9BxuW+9R2|GGX#&cSqyG|y@{c;fEd>%Bw&J8r^oFUXRm z?A$%xYjo|&YOt6D&J%D=?la55J-l!UPd;z1+=BL7hHHDUY4~N>PPVj-`{{T*lpTw8;4=cgjeW7 zO0=JB4lz86=+!EQ{Um3YRo$XVDK8zkVEa)1jsOkB?1|wLa^4dkyXc|frkYR78nhuh zo->ETwfNcB#YN`X2Cad)i<+uGogMp>%d^vHg7gtJp5@NxkoL)($y{hqKJ?7?8)%=_ zZRknP9AeJEfC?`I%`?9}S$ed8x{dwtU#jijtSc<5dlD0dxYTu^bp3(P@3c!D;7g`C z1&VXm%!OkRm)+8y@8*>+*6aBHc_yrEMBnboMq6pFrb>Xj|L*5ic%vItanu6=EI>0Wc{Vj>&0EI~q*tzOOpRa!< zU0k)7Yv$)-=103h1PaYV$Pv1|V0kBd?Hhvw4g)zlfF1Y1aHlgn(!O;Up6*~2I7D+G zj^^$INXC;TWmuUb?H+AF8&)Ph7E$by(l?;()UdxHb-Zk1m%PMcGTh=cD|l}2UxXJ9 z!A=rp09t{+x;Bd64*$RqxT<%y%}#OI?@rLmOmW$qBX~*OCi%JYVleAs&hV%UBY{j= ziZNl_L4VcQpEINjxB9k3((xqh%1TO7;asaw{psGv;QwN_B9FG2gM zpeubr8DJL$O%g%vo}hLJS|=#zYL>z6h{DVbN|r85?V|O-itC6cCw2{&8cf!7#1lha zgaSIeA#q1;sfWWZzrkuv2dWiQA+}o6TCG7w0%T|pll}9DTA7Q$_!#-j;1ToNZGXjL zI%7-hZHN5U*BTg~jC$qrTDX=)IfO<1K?A2w_K7DqT&D|lmzsgqt34bbEUB+uQdE|T zF+Ew~7U3{*O2(FOZ7ds@-P5bHwV13$-1hkY(p}(gts$@>^VS!@hE3HFy8s$E00k>G zu3qUnEDJN}?w(SG05y=T&e>WWZV({`%?79|eagGL$U&M~BGwwU`mG)bxVnQ}$99!9 z-iKdcUaQ%w7RJS4U9#jutVAImBy_XobdbdL6j-`Qi@vs*?2KW@58A*Qpv=j_HkD~U zgA*lLk|-1gembQGI~o1tQm{@uGF|)_j=gwgu0T_Q>$b_ZiJI(|ZK06Xdz?y@#U zbg>l@*qI|d*cBf%Ue^FKlxS-%Qsi zQ!_;jtPrL9O5VIru|R(Q>}GVe>9*-kkCOq$Ef zm-x*^!tIOs0Ngcb>ou2FG?&!V;GVFbb7ymz494bg>STcCk_JC%E=}gr>3(yGlfG>C zaC33zS=Fzo(s&Pj;^n3bK?(`M%m**nq`?n=v-Ve!7LE#RAd9)?jCt-nsD^QtWKAyu zW$%1eT!h}_wetm8dc2{hZW72bPet1dUTVsA}W|U@Nc!F`!1;u$cyPgw}g=+n^fN zv63lCZ3$Hsc&9tUREO2NV-s&%@KHb%J6ZEq{rkoBUl+}%NtMN(NmMTZ8>-?9JU~Kt zZZk*V_5<8X9B+uI{{nprd;#RML)2ka4IV=jCf(sWB`1xDCli&@SnxH$y$SRkmk@BE6Jb>r25(}l=wHiRSo~jNn_N!tZ@q8=*oyLljV(upV<|+BE$GA@bQCo zi1(fywpu#`S(^x_8Kbo889j-b6=uX!916~?FsGa&D$baVe9^s{48hi?Kl;(-!9X6tKVfW0zD>c(!ls_?I=02hI3weqIw z56c=h!;5&b6ID$^UQ1Cucu_ ztZ{s@>>od7eDZ`LE^~ZR{4sp5eQ{ejKKWP9x-+PCG#*&mq>6#YCl^AiYU&)H4EYEg z`Wv7810o{FCpW^2fyFkXHV&So-MJl~bb|ywmpEi-WLte=GwH@Br-CvxJ~@I9P&0WB z7aG{;&E|u3!T97IxN(r3L9sLV9cX;AHY~*L=92Nrt=okiF6(d1T9F>uKA2=Rj1LaP zN<^4R+S~zDSPkQY*BWW@xgg;>{rA1U}I0_y_DJV0b~}84-WXyR=?V) z8y}$M4=_G>_6*-po6YfL)8F`DA0&tzAN(5~kv~58<3Y|=WqhzLr~>1I86Vrs2F3?} z1-&y@86Vui2eg9laJm)ddM=iF7mg2hmsmsp=9&gSJ3ct>bl+TMeDLYkVRLnOPTxUe zo>z^`VVZGI(rTdC3vRpec=2V#w-cwb&tX707+*!jk)$D3U8SPkL zar`ulOipoG@X}X_e9BI7vMSbX)+A1Q=v!{B8c|S`6L}FA2Hg~g1l;N8!bi(jy`(9? z$9#ygy7U;l3Fov~TREqZc?^yq%m%W1%%@_sh(K3@F!24Ap#I*A)L&u#4-{Szy@$(? z?N_2pmSJwq4uSm36J$1RCMjn>|0YrMPf5SK=HHm<&~PaKm9Bn&Y<%cuX#WSthl2Ct zGFXtnRLqoJ%lQNy$DY^9s+k_MSK z9~5lge?P6bXw<4e>d^d1fIs9A5BA4uHf`trWN82o6vJGe@Jlr(UNEITSr8ur{5i!R?k9aknr%}pDq+^(ZLH&F{GG{^T6G-pz5F+c_jJ9ZxXuK)IKe z#*-Vq#P8d2r@}}PJV0=er_Tq2gL2Oz>lglzgH630?8zMb@of;?g9PYc+A*T{_73PO z;}v+V?(FeQeJ)d9#?%_)&`{#W?-EO8e?*sQA^Pg!q!x@U`Ce)D?3ZVm(QfZecT=251i zsbKXL#*>eK%T>r0AEH9u`a868jSR;z+SVQ&mSf||Ct-?VHTa7kLWml{)0BA@W&TWM zwnL^G!TK}}>ddo*xq^Fr2a@kVJt_q)VGq*x=P0g+1VKmf36+H!26Xw3;&1k)S&YG? zi#UqkP+xu^`A~T6A~WD9&IWz%Kyp)aGneoIiy}L%0A)O%q7`lNp#K4HoKHc6GwZ?U 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
yVtLxgx;46PQcBBFeUg@`y)i$VG_`o(q7L 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