clickzetta-dbutils 1.0.17__py3-none-any.whl → 1.0.21__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- clickzetta_dbutils/.DS_Store +0 -0
- clickzetta_dbutils/__init__.py +3 -5
- clickzetta_dbutils/__pycache__/AESCryptor.cpython-310-pytest-8.2.1.pyc +0 -0
- clickzetta_dbutils/__pycache__/__init__.cpython-310.pyc +0 -0
- clickzetta_dbutils/__pycache__/db_utils.cpython-310.pyc +0 -0
- clickzetta_dbutils/__pycache__/version.cpython-310.pyc +0 -0
- clickzetta_dbutils/db_utils.py +3 -410
- clickzetta_dbutils/version.py +3 -1
- {clickzetta_dbutils-1.0.17.dist-info → clickzetta_dbutils-1.0.21.dist-info}/METADATA +4 -2
- clickzetta_dbutils-1.0.21.dist-info/RECORD +17 -0
- clickzetta_dbutils-1.0.21.dist-info/top_level.txt +2 -0
- pyarmor_runtime_000000/__init__.py +53 -0
- pyarmor_runtime_000000/__pycache__/__init__.cpython-310.pyc +0 -0
- pyarmor_runtime_000000/alpine_x86_64/pyarmor_runtime.so +0 -0
- pyarmor_runtime_000000/darwin_universal/pyarmor_runtime.so +0 -0
- pyarmor_runtime_000000/linux_x86_64/pyarmor_runtime.so +0 -0
- clickzetta_dbutils-1.0.17.dist-info/RECORD +0 -7
- clickzetta_dbutils-1.0.17.dist-info/top_level.txt +0 -1
- {clickzetta_dbutils-1.0.17.dist-info → clickzetta_dbutils-1.0.21.dist-info}/WHEEL +0 -0
Binary file
|
clickzetta_dbutils/__init__.py
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
__all__ = ["get_active_engine", "get_lakehouse_connection", "get_active_lakehouse_engine", "DatabaseConnectionManager", "ConnectionConfig",
|
5
|
-
"DatabaseConnectionError", "clean_connection_cache"]
|
1
|
+
# Pyarmor 9.0.8 (trial), 000000, non-profits, 2025-02-21T12:00:33.075806
|
2
|
+
from pyarmor_runtime_000000 import __pyarmor__
|
3
|
+
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x82\x02\x00\x00\x12\t\x04\x00\xf7m\xbb\xe7\xfb\xad\x8fv\xdak\x1d\xbe\x9e\x0b\xc2\x18\x00\x00\x00\x00\x00\x00\x00\x00M+\xbc\xf3&r\x07\xa4\xf2\x8f_\xd4\x1fRHR,c\xf4\x11xa\xdf\xb3e+\xbe\x8c\xc2\x88*\xbbu\xd2\xe5\x9c\xd1\xa6H\xef\xdc\xb5\x0c\n\x0f\xba\xbc\xa1\xb4\xa1=\xe5\x07&\xf3c\x8aB-\xf5\x17\t,N\n8\xe0\x0f^A\x82s\x11\xb9U\t;o\xee\rACL\xb4\xd0\x08^U\xb5\x93\xae\x90\xbb\xe3\xae\x8f\xebd]\xbb-\xa2\xc0\x7f\x08Y(\x19\xf0\xc5\r\xf9\x14\x91\xe5ld\xc7\x84\xa5\\;\xda\x02*\x089\xe0F\x17\x97\xec\xaa3\x08Pf0\xc4\xe7K\x86z\x15p]\xcd\xe3O\x84S\x9a\xe8\x8b\xc2I\xef\xe4\x07\x08\x19%\xa9\x92\xa9\xc5\xb4\x066H\x05\xe6t\x96r\x8e\xa0\xa7\xa3\xa26\xaa\xa9)+@\xdd\x98\x18\x87\xf9\xe9\xed\xf0\xd5\x12Q\xcd\xaci"s\xf4\x15\xc0\xfc|\x0fX\xe5wc\x9e\xff\x90gg`l\x08_\x0cJWS\xfeA\xa4Z\x00\xe8?*MT\x93\xb4\xa55\x90b{\x04\xa3\xbc\xb2:\x99\t\x8c\xecKG\x14\xa5\x97>~H[\xa4l|yw\xd1\xa1\xab\x9d\x1c\x1b\x9cQo\x15\x97\xf9T\x94\xb8\x8f.\x04{9\xc7Q\xa0a\xb4\xd7$8vL\xe3\'4\xbd\xd9\x99\x02.ewNa[/t\xdc\xd3\x8c\xfaV\xfei\x99\x0ch\x97\x87\x15\xbd\x99\xa61g\x1e\xd6g\xf4\xe3:\xacD\xc5\xbeB\x90\x94\xc6\xdbf\x8aqx\xd5\xb0\xb5\xfb\xc1\xb9\xb9\x8a\r\xc7\xc4)\xfe[\x9a\x1d\nVo\xad9K?]r\xd2\xa0\x92\xa5/\x1f\x13\x84\x8f\x12\xa3jo\xf9}}2\x8a1\x92\xaf\xdf\x18Sc\xfc\x8e\xf2\xfb\xb1\xa3\x9a\xfa\xc8\x05\x00\x01^r\xb7@\xda\x06\xa5C\x19\xd2?\xb3\xccs6?Q\x10\xe6\xaa\xe0\x7f\xd0\xa5\xf6Fm\xacG\x10_\xdbz|B\x01n\x14\x11\xd2\xbe\xc7\x19?k\x89p\xd1\xd3\x81\xf9a\x82\xeb\x86k\xe9\x80\xf0\xdb|\x9a\xf2\xb6\xcc\xeb!=\x97\x13\xab\x0f\xdbP{!\x93F\xa2\xe5T\xe8b\xe4]\xc3\xbbL5a\x8f\xe5\x04\x1a\\\xc3\x84\x1cS6C\xc8;\xe4z\x01\x88\xf5\xbbx\x18\xe9\x1d\x80\xca\xac4K\x8f\x8c\x8d\x12\xa4\xdaN<\xf6\xfd\x14\xe1u\x0c#\x14\x87\t\x17$\x8a\xba\xba7\x033\x9dJ\x00\xe3\xb7\xecni\xe0\xb8\xed\xe5\xf7[\x81\xc1\x10\xaa%\xd4*\x03\xf6\xff\x7f\x92^M\xe9\x13\x15\x14=U\x9e\xc7]\x14\xe8Z\x8f/a\x81\xa7?\x80n\xce\xb8\x0b\xd3z\xd0Z\xf9)\xcbmp)C\x00\x0c\xedJ\xc6\xfcY\xc5\xd4\x1b\x03\xe0\x1e\x83\x91Dm\xba!|L\xa7\xf4\xc4\xd8\x19w')
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
clickzetta_dbutils/db_utils.py
CHANGED
@@ -1,410 +1,3 @@
|
|
1
|
-
|
2
|
-
import
|
3
|
-
import urllib.parse
|
4
|
-
from dataclasses import dataclass, field
|
5
|
-
from logging import getLogger
|
6
|
-
from typing import Optional, Dict
|
7
|
-
|
8
|
-
from sqlalchemy import create_engine as sa_create_engine
|
9
|
-
from sqlalchemy.engine import URL
|
10
|
-
from sqlalchemy.engine.base import Engine
|
11
|
-
|
12
|
-
_log = getLogger(__name__)
|
13
|
-
|
14
|
-
|
15
|
-
class DatabaseConnectionError(Exception):
|
16
|
-
"""Custom exception for database connection errors."""
|
17
|
-
pass
|
18
|
-
|
19
|
-
|
20
|
-
@dataclass
|
21
|
-
class ConnectionConfig:
|
22
|
-
dsName: str
|
23
|
-
dsType: int
|
24
|
-
schema: str = "public"
|
25
|
-
workspaceName: str = "default"
|
26
|
-
table: Optional[str] = None
|
27
|
-
host: Optional[str] = None
|
28
|
-
magicToken: Optional[str] = None
|
29
|
-
username: Optional[str] = None
|
30
|
-
password: Optional[str] = None
|
31
|
-
instanceName: Optional[str] = None
|
32
|
-
options: Dict[str, str] = field(default_factory=dict)
|
33
|
-
query: Dict[str, str] = field(default_factory=dict)
|
34
|
-
|
35
|
-
|
36
|
-
class DatabaseConnectionManager:
|
37
|
-
"""
|
38
|
-
Manages database connections with flexible configuration options.
|
39
|
-
"""
|
40
|
-
|
41
|
-
def __init__(self, ds_name: Optional[str] = None):
|
42
|
-
"""
|
43
|
-
Initialize a database connection for a specific data source.
|
44
|
-
"""
|
45
|
-
self._ds_name = ds_name
|
46
|
-
self._vcluster: Optional[str] = None
|
47
|
-
self._workspace: Optional[str] = None
|
48
|
-
self._driver: Optional[str] = None
|
49
|
-
self._schema: Optional[str] = None
|
50
|
-
self._engine: Optional[Engine] = None
|
51
|
-
self._options = {}
|
52
|
-
self._query: Dict[str, str] = {}
|
53
|
-
self._host: Optional[str] = None
|
54
|
-
|
55
|
-
@classmethod
|
56
|
-
def load_connection_configs(cls) -> Dict[str, ConnectionConfig]:
|
57
|
-
"""
|
58
|
-
Load and cache connection configurations from environment variables.
|
59
|
-
|
60
|
-
Returns:
|
61
|
-
Dict of connection configurations keyed by data source name
|
62
|
-
"""
|
63
|
-
if not hasattr(DatabaseConnectionManager, '_connection_cache'):
|
64
|
-
# Retrieve and decode connection info from environment variable
|
65
|
-
conn_info_str = None
|
66
|
-
if log_id := os.environ.get('EXECUTE_LOG_ID'):
|
67
|
-
pipe_path = f"/tmp/{log_id}"
|
68
|
-
_log.info(f"Loading EXECUTE_LOG_ID is : {pipe_path}")
|
69
|
-
try:
|
70
|
-
with open(pipe_path, 'r') as pipe:
|
71
|
-
conn_info_str = pipe.read()
|
72
|
-
except FileNotFoundError:
|
73
|
-
raise DatabaseConnectionError(f"Path not found: {pipe_path}")
|
74
|
-
# Fall back to environment variable if pipe is not found
|
75
|
-
conn_info_str = conn_info_str or os.environ.get('connectionInfos', '[]')
|
76
|
-
if not conn_info_str:
|
77
|
-
raise DatabaseConnectionError("No connection information found in env")
|
78
|
-
decoded_info = urllib.parse.unquote(conn_info_str)
|
79
|
-
conn_list = json.loads(decoded_info)
|
80
|
-
|
81
|
-
# Create connection configs
|
82
|
-
cls._connection_cache = {
|
83
|
-
info.get('dsName'): ConnectionConfig(**info)
|
84
|
-
for info in conn_list
|
85
|
-
}
|
86
|
-
|
87
|
-
return cls._connection_cache
|
88
|
-
|
89
|
-
def get_connection_info(self, ds_name: str) -> ConnectionConfig:
|
90
|
-
"""
|
91
|
-
Find connection info by data source name
|
92
|
-
"""
|
93
|
-
connections = self.load_connection_configs()
|
94
|
-
|
95
|
-
# Validate data source exists
|
96
|
-
if ds_name not in connections:
|
97
|
-
raise DatabaseConnectionError(f"Data source '{ds_name}' not found")
|
98
|
-
|
99
|
-
config = connections.get(ds_name)
|
100
|
-
config.options.update(self._options)
|
101
|
-
if self._query:
|
102
|
-
config.query.update(self._query)
|
103
|
-
return config
|
104
|
-
|
105
|
-
@classmethod
|
106
|
-
def get_connection_infos(cls) -> Dict[str, ConnectionConfig]:
|
107
|
-
"""
|
108
|
-
Get all connection infos
|
109
|
-
"""
|
110
|
-
return DatabaseConnectionManager.load_connection_configs()
|
111
|
-
|
112
|
-
def use_workspace(self, workspace: str) -> 'DatabaseConnectionManager':
|
113
|
-
"""
|
114
|
-
Set workspace for the connection.
|
115
|
-
|
116
|
-
Args:
|
117
|
-
workspace (str): Workspace name
|
118
|
-
|
119
|
-
Returns:
|
120
|
-
self: For method chaining
|
121
|
-
"""
|
122
|
-
self._workspace = workspace
|
123
|
-
return self
|
124
|
-
|
125
|
-
def use_driver(self, driver: str) -> 'DatabaseConnectionManager':
|
126
|
-
"""
|
127
|
-
Set driver for the connection.
|
128
|
-
|
129
|
-
Args:
|
130
|
-
driver (str): Driver name
|
131
|
-
|
132
|
-
Returns:
|
133
|
-
self: For method chaining
|
134
|
-
"""
|
135
|
-
self._driver = driver
|
136
|
-
return self
|
137
|
-
|
138
|
-
def use_schema(self, schema: str) -> 'DatabaseConnectionManager':
|
139
|
-
"""
|
140
|
-
Set schema for the connection.
|
141
|
-
|
142
|
-
Args:
|
143
|
-
schema (str): Schema name
|
144
|
-
|
145
|
-
Returns:
|
146
|
-
self: For method chaining
|
147
|
-
"""
|
148
|
-
self._schema = schema
|
149
|
-
return self
|
150
|
-
|
151
|
-
def use_vcluster(self, vcluster: str) -> 'DatabaseConnectionManager':
|
152
|
-
"""
|
153
|
-
Set virtual cluster for the connection.
|
154
|
-
|
155
|
-
Args:
|
156
|
-
vcluster (str): Virtual cluster name
|
157
|
-
|
158
|
-
Returns:
|
159
|
-
self: For method chaining
|
160
|
-
"""
|
161
|
-
self._vcluster = vcluster
|
162
|
-
return self
|
163
|
-
|
164
|
-
def use_options(self, options):
|
165
|
-
"""
|
166
|
-
Set additional connection options.
|
167
|
-
|
168
|
-
Args:
|
169
|
-
options (dict): Additional connection options
|
170
|
-
|
171
|
-
Returns:
|
172
|
-
self: For method chaining
|
173
|
-
"""
|
174
|
-
if options:
|
175
|
-
self._options.update(options)
|
176
|
-
return self
|
177
|
-
|
178
|
-
def use_query(self, query: dict) -> 'DatabaseConnectionManager':
|
179
|
-
"""
|
180
|
-
Set query for the connection.
|
181
|
-
Args:
|
182
|
-
query (str): Query string
|
183
|
-
Returns:
|
184
|
-
self: For method chaining
|
185
|
-
"""
|
186
|
-
if query:
|
187
|
-
self._query.update(query)
|
188
|
-
return self
|
189
|
-
|
190
|
-
def use_host(self, host: str) -> 'DatabaseConnectionManager':
|
191
|
-
"""
|
192
|
-
Set host for the connection.
|
193
|
-
Args:
|
194
|
-
host (str): Host name
|
195
|
-
Returns:
|
196
|
-
self: For method chaining
|
197
|
-
"""
|
198
|
-
if host:
|
199
|
-
self._host = host
|
200
|
-
return self
|
201
|
-
|
202
|
-
def build(self, *args, **kwargs) -> Engine:
|
203
|
-
"""
|
204
|
-
Create SQLAlchemy engine based on data source name and optional schema
|
205
|
-
|
206
|
-
:return: SQLAlchemy Engine
|
207
|
-
"""
|
208
|
-
conn_info: ConnectionConfig = self.get_connection_info(self._ds_name)
|
209
|
-
|
210
|
-
if not conn_info.host:
|
211
|
-
raise DatabaseConnectionError("Missing connection host for MySQL data source")
|
212
|
-
|
213
|
-
ds_type = conn_info.dsType
|
214
|
-
options = conn_info.options or {}
|
215
|
-
schema = self._schema or conn_info.schema
|
216
|
-
host = self._host or conn_info.host
|
217
|
-
host_parts = host.split(':')
|
218
|
-
connect_args = {}
|
219
|
-
|
220
|
-
# Construct connection URL based on data source type
|
221
|
-
if ds_type == 5: # Mysql
|
222
|
-
if not conn_info.username or not conn_info.password:
|
223
|
-
raise DatabaseConnectionError("Missing username or password for MySQL data source")
|
224
|
-
|
225
|
-
options.update(conn_info.query)
|
226
|
-
url = URL.create(
|
227
|
-
drivername=self._driver or 'mysql+mysqlconnector',
|
228
|
-
username=conn_info.username,
|
229
|
-
password=conn_info.password,
|
230
|
-
host=host_parts[0],
|
231
|
-
port=host_parts[1] if len(host_parts) > 1 else None,
|
232
|
-
database=schema,
|
233
|
-
query=options
|
234
|
-
)
|
235
|
-
return sa_create_engine(url, *args, **kwargs)
|
236
|
-
|
237
|
-
elif ds_type == 7: # PostgreSQL
|
238
|
-
url = URL.create(
|
239
|
-
drivername=self._driver or 'postgresql+psycopg2',
|
240
|
-
username=conn_info.username,
|
241
|
-
password=conn_info.password,
|
242
|
-
host=host_parts[0],
|
243
|
-
port=host_parts[1] if len(host_parts) > 1 else None,
|
244
|
-
database=schema,
|
245
|
-
query=conn_info.query
|
246
|
-
)
|
247
|
-
connect_args = {'options': self._convert_options(options)}
|
248
|
-
|
249
|
-
elif ds_type == 1: # ClickZetta
|
250
|
-
if not conn_info.workspaceName or not conn_info.instanceName:
|
251
|
-
raise DatabaseConnectionError("Missing required parameters 'workspace_name', "
|
252
|
-
"'instance_name' for ClickZetta data source")
|
253
|
-
if not self._vcluster:
|
254
|
-
raise DatabaseConnectionError("Missing virtual cluster for ClickZetta data source")
|
255
|
-
|
256
|
-
# Generate base parameters
|
257
|
-
query_params = {
|
258
|
-
"virtualcluster": self._vcluster
|
259
|
-
}
|
260
|
-
|
261
|
-
if schema:
|
262
|
-
query_params["schema"] = schema
|
263
|
-
|
264
|
-
query_params.update(options)
|
265
|
-
query_params.update(conn_info.query)
|
266
|
-
|
267
|
-
full_host = f"{conn_info.instanceName}.{conn_info.host}"
|
268
|
-
|
269
|
-
if conn_info.username and conn_info.password:
|
270
|
-
url = URL.create(
|
271
|
-
drivername="clickzetta",
|
272
|
-
username=conn_info.username,
|
273
|
-
password=conn_info.password,
|
274
|
-
host=full_host,
|
275
|
-
database=conn_info.workspaceName,
|
276
|
-
query=query_params
|
277
|
-
)
|
278
|
-
elif conn_info.magicToken:
|
279
|
-
# Use magic token for authentication, do not require username and password
|
280
|
-
query_params["magic_token"] = conn_info.magicToken
|
281
|
-
url = URL.create(
|
282
|
-
drivername="clickzetta",
|
283
|
-
host=full_host,
|
284
|
-
database=conn_info.workspaceName,
|
285
|
-
query=query_params
|
286
|
-
)
|
287
|
-
else:
|
288
|
-
raise ValueError("username and password or token must be specified")
|
289
|
-
else:
|
290
|
-
raise ValueError(f"Unsupported data source type: {ds_type}")
|
291
|
-
|
292
|
-
self._engine = sa_create_engine(url, connect_args=connect_args, *args, **kwargs)
|
293
|
-
return self._engine
|
294
|
-
|
295
|
-
@staticmethod
|
296
|
-
def _convert_options(options):
|
297
|
-
if not options:
|
298
|
-
return ''
|
299
|
-
return ' '.join([f'-c{k}={v}' for k, v in options.items()])
|
300
|
-
|
301
|
-
|
302
|
-
def get_lakehouse_connection(conn):
|
303
|
-
return conn.connection.connection
|
304
|
-
|
305
|
-
|
306
|
-
def get_active_engine(
|
307
|
-
ds_name: str,
|
308
|
-
vcluster: Optional[str] = None,
|
309
|
-
workspace: Optional[str] = None,
|
310
|
-
schema: Optional[str] = None,
|
311
|
-
options: Optional[Dict[str, str]] = None,
|
312
|
-
query: Optional[Dict[str, str]] = None,
|
313
|
-
driver: Optional[str] = None,
|
314
|
-
host: Optional[str] = None,
|
315
|
-
*args, **kwargs
|
316
|
-
) -> Engine:
|
317
|
-
"""
|
318
|
-
Convenience function to create a database engine.
|
319
|
-
|
320
|
-
Args:
|
321
|
-
ds_name (str): Data source name. Required.
|
322
|
-
vcluster (str, optional): Virtual cluster name for ClickZetta data source. Required for ClickZetta.
|
323
|
-
workspace (str, optional): Workspace name. Default is 'default'.
|
324
|
-
schema (str, optional): Schema name for the connection. Default is 'public'.
|
325
|
-
options (dict, optional): Additional connection options.
|
326
|
-
query (dict, optional): Additional query parameters for SQLAlchemy url.
|
327
|
-
driver (str, optional): Driver name for the connection.
|
328
|
-
host (str, optional): Host name for the connection.
|
329
|
-
*args: Additional arguments for SQLAlchemy engine.
|
330
|
-
|
331
|
-
Returns:
|
332
|
-
SQLAlchemy Engine instance
|
333
|
-
"""
|
334
|
-
manager = DatabaseConnectionManager(ds_name)
|
335
|
-
|
336
|
-
if workspace:
|
337
|
-
manager.use_workspace(workspace)
|
338
|
-
if schema:
|
339
|
-
manager.use_schema(schema)
|
340
|
-
if vcluster:
|
341
|
-
manager.use_vcluster(vcluster)
|
342
|
-
if options:
|
343
|
-
manager.use_options(options)
|
344
|
-
if query:
|
345
|
-
manager.use_query(query)
|
346
|
-
if driver:
|
347
|
-
manager.use_driver(driver)
|
348
|
-
if host:
|
349
|
-
manager.use_host(host)
|
350
|
-
|
351
|
-
return manager.build(*args, **kwargs)
|
352
|
-
|
353
|
-
|
354
|
-
def get_active_lakehouse_engine(
|
355
|
-
vcluster: Optional[str] = None,
|
356
|
-
workspace: Optional[str] = None,
|
357
|
-
schema: Optional[str] = None,
|
358
|
-
options: Optional[Dict[str, str]] = None,
|
359
|
-
query: Optional[Dict[str, str]] = None,
|
360
|
-
driver: Optional[str] = None,
|
361
|
-
*args, **kwargs
|
362
|
-
) -> Engine:
|
363
|
-
"""
|
364
|
-
Convenience function to create a database engine for lakehouse (ClickZetta) data source.
|
365
|
-
|
366
|
-
Args:
|
367
|
-
vcluster (str, optional): Virtual cluster name for ClickZetta data source. Required.
|
368
|
-
workspace (str, optional): Workspace name. Default is 'default'.
|
369
|
-
schema (str, optional): Schema name for the connection. Default is 'public'.
|
370
|
-
options (dict, optional): Additional connection options.
|
371
|
-
query (dict, optional): Additional query parameters for SQLAlchemy url.
|
372
|
-
driver (str, optional): Driver name for the connection.
|
373
|
-
*args: Additional arguments for SQLAlchemy engine.
|
374
|
-
**kwargs: Additional keyword arguments for SQLAlchemy engine.
|
375
|
-
|
376
|
-
Returns:
|
377
|
-
SQLAlchemy Engine instance
|
378
|
-
|
379
|
-
Raises:
|
380
|
-
DatabaseConnectionError: If no lakehouse data source is found in the configuration.
|
381
|
-
"""
|
382
|
-
# Get all connection configurations
|
383
|
-
conn_infos = DatabaseConnectionManager.get_connection_infos()
|
384
|
-
|
385
|
-
# Find the lakehouse (ClickZetta) data source
|
386
|
-
lakehouse_ds = None
|
387
|
-
for ds_name, conn_info in conn_infos.items():
|
388
|
-
if conn_info.dsType == 1: # ClickZetta type
|
389
|
-
lakehouse_ds = ds_name
|
390
|
-
break
|
391
|
-
|
392
|
-
if not lakehouse_ds:
|
393
|
-
raise DatabaseConnectionError("No lakehouse data source found in configuration")
|
394
|
-
|
395
|
-
# Create engine using the found lakehouse data source
|
396
|
-
return get_active_engine(
|
397
|
-
ds_name=lakehouse_ds,
|
398
|
-
vcluster=vcluster,
|
399
|
-
workspace=workspace,
|
400
|
-
schema=schema,
|
401
|
-
options=options,
|
402
|
-
query=query,
|
403
|
-
driver=driver,
|
404
|
-
*args, **kwargs
|
405
|
-
)
|
406
|
-
|
407
|
-
def clean_connection_cache():
|
408
|
-
"""Clear connection cache before each test"""
|
409
|
-
if hasattr(DatabaseConnectionManager, '_connection_cache'):
|
410
|
-
delattr(DatabaseConnectionManager, '_connection_cache')
|
1
|
+
# Pyarmor 9.0.8 (trial), 000000, non-profits, 2025-02-21T12:00:33.094294
|
2
|
+
from pyarmor_runtime_000000 import __pyarmor__
|
3
|
+
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x03C\x00\x00\x12\t\x04\x00\xe40\xb9\x1d_\xc0\x99\xcb\xcc\xb5\xedZ\x95\xe2\xf2\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x893\xd2;.\xc7T\x8fO\xa2m\x10\x08Gi\xf2dtN\xf8\x836\x9bb\xffQ+\xf4\x93\xa2\xe8N\xa0r\x05\x98\x9f\xfeO\xa0<l\xfeqFk]\x1e\xbd\xb1\xdf2\xb3\x80\xb8\x1b\xf87\x96e\xc9\xf4;\xc5K\xa8\xb7\xc0\xccbs\x97\'\x1e\rD\x10\xee\x91\xc02\x89\xf6\xc3\xde\x1d&-\xb5\xe3\xc5N)\xaf\xb7\x96\x06\xbf\x1e\xa4h\xf7QZ\x91\xf0}\xcb\xf0\xc4!!\x1a\x01\xeeh^t<\xea\x99P\xf1\xff\xa1\xa6[\x93\x16Bq\xe4\xb1\xcd\xf0;\x1dkW>!(!\r\xcb\xda\xaa\xbf/d\xc3h\xba\xe8\x81\xd7\xa3Ot\x9f-\xf6\xb4\xeca\xd0\x18\x08\xbf\xa4\x0cz\x08\xad\x97\xa7`\x8f\x04\xdf\xbb\x90\x01\xb5\xce\x14\xe86\x18>\x14\\\x87\x95\xe9\x8a\x97\'\x92\x82Xm\x13\xbbj\x8a`\xceJ\xc2|\x7f8\x8a\x04\x0cYK\xf40\x0b?\x13\xde\xb4F\x17\x069\xe9R}\xdb\x7f\x0b\x11k\xc4\x8fX\xe9\xba\x97\xebD\xd4K:.ed\x0bl\xdf\xbf<A!\x98\xcebk\x8c\xc0\x9a\x96>+\xc5\x04\xe4\xd9\xad\x80\x06\tI\x04\xc1\x998\x96\xa4\xd9\x88V\xc8b\x7f\x94\xdav\xb2\xca\x11\xfb\xbdjo\xd2j\xc6\x8a~\xf5(\x8e\xa8\xd5\xfd\xe8\xf8\x19^\x0e\x82\xb2\x88\xeaaP\xda\x13\x85{Fr\x14;O\xef{\t\xcb\xf7\x8c\x15\xe5\xed\xcc.\x95\x87C\x9e[\x9b\xfa}:d\x8ef\x85\xfe\xc5\xdbw\x8a\xfaek\x08\xdf{7\xbeQ\x84o\x97m\xa7p\x05Q\xea|\x13=\xedp!\x93\xb1\xaf\xbevu2\x94\x1b\xd0\x0b \xb1L\x8c\x945,V\xe9\x06\xb7\xc3\x89\xd7\xc2\xd3`\xac;\xb2\x1a\x8c"MY\xab\xc2\xcb\xe9!\xb0\x1d[w\xb8\xa6\xcf{j\x0bH\xa1\'\x08\xe0\x81ES\xcf\xa1\xe3V\\\xd3m\xd1\xf2\xe4\xc6\xad\xa2\x92\x1b\xde8,\x91\x8a={\x7f|\xdd}c\xa7\xd3\xfc\x15\x1e-Y\'H[\x86}\xa3\xaa\x90\xf1\xc9n\xe9;&a(\x99\xfdK\xe5\xe0\x92\x10\x8e;\x92\x84-\x0ea\xb7\xc0\xe1\x9a\xa8\xd9\xdb\xbb\xc9~\xe6@\xd0@\xe6\n\xbf\xc4p\xfe\xeevn\xe74;\xe1\x03\x80\x94w\xe4\xd3\xb5h\xb8\xbb\xba\x8a\x8a`\x86\xd7\xc3\x12B\\m4\xfd\xf8&D\x90\x80u\t\xca\xe5\xed2\x08\x81\x1d\xc4T\xee\x1fs>WMJ\x82\xcbog8\xa8\xd4_\xfba\xd9&\xe1*w=)\x9dg\xb7\xcbH\xc94\x17\xad)\x9a\x8e\x96\x04A\xa5\'\xc88U4\x7f\xa8\xa2\x90\xd4PQ\x96\xbb-^\xe6\x81\xa5\x10"\xd8\xdfh\xb7N\xa6\xf3\xc7\x01x\x85J\xbcR-~\xf0%q\'L\xd4\xdb\xf9\x10\x19\xb8\x84n2\\\xf88\xe8L\xd7Y\'\xd0\xf3\xb6\xf9\xb2\x91\x977J\xa3\x89B\xe1\xc56K\x9f\x84%i\xda\t\xa5\x19\xc9\xe2{\xbf7\x1bBM\xf9=\xffX\x0b\xca\xb9\ti\xe9M-m\xf2\xbe\xedz\x88\xe1\x165\xea\xe5hp"\x8c\x82\x85mv\xed\x1f\x81\x9b\x83\x9c\x8c\x8de\x92*\xbd<\xd2\x8d]\x9b\xba\xec\x1c\x06~[\xc5\xd7\xe1\xf8Q\x05{\xf3\xe8\xc8\t\xae\x89\x8d\x8e4\x91\xe5\xe1\x8f\xe5\xa2i\x81\xf5z\xb0\xfado\xa3ai\xc0\xb2E\x1bL\xe3_C\xbe\x97\x12\xcd\xba\xc8E\xb6\xcb\xa39\xe8|\x16\x9d\x85\x04ql\x89\xcd\xd7\x9fac\x00\xbb\x19\x19tC\x01Y\x8e\xb2\xa4\xeb\xc8\xc2\x8d\x93\xe2\xee\x1b\x9c\xc2\x91#\xa2\t\xce\xeaH^\xc4\x1f\xb2\xda\x17.\xfa\x14r\xcc\x89[\xb4\xedq"_\x9f\x98\x08^\xba\x9a\xbb:\xf1\x07\x99\xddQ`\xf9\x9d\xb4\x99\xfd:N0%\x13\xba\xb7\x08K\xd9\xe5d\x8a}\x11\xbf\xf7[\xe3\x18.\xa3\xd9z\xde5\xc0\xa4\x80\x9c\x1em\x19\xa0O\x81)\x97M!\x87\x19\x8c\x1b\xa2d\x07}k\xf2\xf9\x11\x91\x07h?:\xe6\xf5\xb3\x07\x1a]tw\xc1+\xed\xed\xc8_\x1c\xa6/\xb5\xb5J\xca\xd0\n\x86\x1a\xfcN\x0f\x0c\x850\x81M}\xc5L\x96\x12\xc7\x96\xff\x1eO\x9f\xd6Up1\xb9ch\x11\x91;vz\xcb\xb6\xc0W\xb6\xbe\xa6\x85\x12\rr^ni\xc4\xee\xec\x0e\xd8d\xc7K\xff\x0e\xf5\xa6\xc3R\xc7$\xeb\xaa\x1e\x83\xba\xf7\x1c]\x15\x12z\x9afa)R\xbd\x8f\x9f\xd8ea\xffc\xe5\xd3\\\xba\x0c\x16\xc9\xb7\\\xa9E\xabS\x85^c{\xaeB\x11\x06\x1a\xf9\xca\xe0]\x86\x11\x9f\x8d\xfd\xe8\xcbF-\x9c\xea\x02m\xeb\xeb\xe8\xeeX 1H\xac\xb3\xf9\xd6\xb9*|\xa8\x91\x03\xe8V\x16\x00\xd7\x11v\xb8\xbc\xdfn3\xf1\x0c*/b\xa9\x1cZ\x1b[\x94\xb7\xea\xa4\xa1\x1c\x18S\xba\xbd\xd7?\xa3\xd8\x8a@\xae\nU\x81ae\x8d4\xe1\xddD\xc5\x8e;?q5\xcc\x9d\xb9!]\x96\x1b;\x0f\x1e\x17\xfe\x95\xc7=?\xbd\xf7\xe7\x0be?\xb6\xc5\x9775y_\xd6\x0c\x91\x1dm\x07q\x18\xf24s\x98v{\xeb\x17\xa8\x1e\x8a\xf9\xbd\xc9\'\x8e\x94X\x81\xa1\xedE\xb6\xb9q\'c\xec\xd9\x1a\x08EC\xe3{\xdb\x18W\x97\xd6|\x0c\xc9\xff\xc9\x01#\x81@\xa0\x04X\xabd\xff\xfe\xfd\xf3\xc5t\xeff^>8\x91\xccU\x14\xf5\x89\xe0\xa4\xadW8\x08`\xff\x00\xa3\xdcJ{\xb1\xe6\x1c\x98\xfa\xa7\xf67X|\x8bX`\xf60\xf5\xffv\xc1^\x10\xbd4zLD\x90\xa3R\xa6\xdd\xf7\x02\x9b\xd9Q.\r\x8d\xdfr\xb0*D\xe0u\xf5\xf6%\x91\xc1Xo\xd3\xa0\xe0a\xa4E\x98\xe3\x003%=j=\x084\x03\x0e\xba\xa91\xb7\xa0\xc5>b\xfcx+I{\xafl\x9a]\x9c\xe6\x87(\xf8p\x97\x8fN\xb5O\xf5=_\xaf.(\xa1\x9c\x9cu*6\xaaW\xe8tY^\xf0\xb1\x8e \xb2\xe1z\x95f\xf3\xd5\x864T\xa3\\is\xd4\x04\x85L\xb6y\x17\xea\xd6\xe9\xbemE\xd1\xfe\xe8\xf77f4+ \xb3I\xb1p\x07S\x02\x8bi\x03D \xd2\xbd\xbd2\x1f\x00\xe7\x90\xc7\x01}\x1eZS\x80@\xca\x16\xaeV\xcc\rkA\x18R\x8a\xea\xa9\x0e\xf0|1\xf1\xd0\x96"\xf3\x86\xb3IWo{\xd0\x10Zd$\x9bU~/\xd4 y\xb2\xcf\x00\xb9\xc1\x1d\xe8v+\xf3\xa9\x9fKs*\x8b4\xf5\xe0Q9\xfe\xd2L\xa5\xbf\x1b\xc5[\x90\xc6\xe69\xca\xb7\xde\xfb\xa8u\x8b\xed\x9e\xff\xd1\xc5\xa6\x03\xacgQ\xe6\x18e@\xc8\'\x8e\xdb8\xf8hQ\x8fS\x0fD\xe9Vjo\x9a&\x13\x1b\xb0\xb9]\xa5\xf9\xd9_\xf7W[\xaf=\xea\x91O\x16\x0cG\xbfr\x077\x10\x86\xe2\xfc\x0c\xc5\xcf\x98\xec\xed\xd1]\x15)a\xa6t\xe4\x90\x19\xba(\xacj\x9aRV\x08\xb4*\x02d\xb3\xad\xc1\xaa|\x87\x97\xb4w\x1fr7\xa6,7\xc9\xc5\xac+\xa1\x1df=\xd9\x95>\x01\x81\xb0\nI\xb4/\xa2\x1c\x88\xf0)-`\xcd\xa0\x9dY\x07\n\xc6F\xfd\xb7|T\x8e\xd0\xaf\xca\xb5L\xdc\x84rL<\x8d\xbe\xda\x1c8bd\xc0\xb7\x9bs\xa0\x9cn\x9c@\xa3\xc4\xb2\xb1\xa3m*\xa42Q\xb6 e\x16\x19k\x14I\xaf\xc8 X\x10z\x84\x8b\xa1| \x8d\xff\xf5[%+3\xed#\x96G50\xd4\x15q=\xb4r\xd7<\xcbTk\xd8\xfd.\x1a\xc3+\xa6\xfa\xa0\xe4V&\xba4#Jn\r\x8f1Cb\xd1\xa7P\x82\xc1\x14Tl\xbc\xf4\t\x88\x7f\x1d\xd0\tH\xb9yD\x00\xa2\xa1B\x88\xe4\xa7\x1fF+\x15p\xac\x027\x1c\xf24\x08\xb6\x06\xd2[\xbc\xc5\xe2;\xa6\xdc\xd6F\xb7\x9c\xa4\x8a\r\x95L\xe3\xa3\xba\xfd_\xf9-S\xe2\x12\xec\x93c\xf7\xe7\xdfmT\xec\x99$\x1e\xe3\xe96\x04\xe5\x1d\xc3y\xd1\xbd!\x93\xa7\x89\xa3\xf3\xb1p\x87\xf9\xa0\xca\xc2/\xd9-\x9d\x93\xc4\x97y\xc6\x04\xdb\xe3\xbc\xd4F\xf8/A\xf1$\xef\x0e\xa9\x87s\xec\xa2\xe1\xe6\xbc\x90\xc8\xa6\xffM^Z\xfb\x9dz\\\x9c)\x96\xd6\xc1\x8f^,\x96<U\xe3]\xbd>\x9a\x08\x94\x17\xb9\xcdBw94xw\x9a2K\xf7\xdd\x1f\xfb\x17\x94a\xd5\x11q\xe0\x83\xb36R yT\xe97p\xc9u\xce\xf5\x04\x16\xc6 \xa3\xd2\x0b\x02G\x8f\xbc\xa9\xfb\x07b\x85:\x14\xa3\x02^\xbd\xd2\xb0)\xa6\x07\xa1\xf6\xd2\xfe4\xf9\x17\x7f\x12]mhc4z%\x16\x88H)*r\xdbw\xff\x9e=\xd3\xf0\xb1\x99b\x99\xdc\x05_z\xd0(z-bFo\xcb\xe8\x1ah\xba\xe8\x8e\x1c\xf4}\xb3\xd0-\xe2\x17\xe3\xf7\xa1\xb1\x07x\xdf\xb8\x01v\\78\x81\xce#\x98\x81(>ETH\xbf\r\x1d\x82\xc8~\xff\xd61\x1bw\xa8\x900\xcd Tl\xa3\xee\xd8\xb4\x94_\xa8\xb9\xc5tQ\xb2UW\n\x0f[\x8a\x84\xf1C\x8d\x82\xb1\xcct\xb0\x85#\xd2\xc4\xe9\x8b\xfb\x06\x08\xcb|\xf7\x02\xc7\x92\xb9\xc5\x80\x10\xee f,\x14\xaf\xba\x81\xd6F\xd7x\x00"\xeeq\x11Q\xfd\xa0\x80\xcf\x9c\x995R\x95\xe1\xdb\xf9\xed\xc0\x8d\x05\\\xa0$\x88V\x7f\xef\xc4\xe5\xbd\xea"\xf5\xe0x\x9f\xc2\xf0$\xfa\x8f\xd2\x04\xea\xe1\xcd+8c\xda\xf6\xb7\xdb\xc3\x8a|L\xa2\'\xcac]\x15=\xb4r\x04\xf1D\xb7\xb7+\xaf\xb5\x13\x11\xbb\xa6\xb7\xab3o^\xfa1\x04y\x04\xbb\xc2-y\x9b\xcc\xfc*^\xa0\x91\t\xa1.\xb8.\xdbh,\xc0\xbd\x11\xb74\xe1\x1a\x98]\'\xbcb6\xee\x8b\xf6\xcfYb\x10m7\x1f\x8d\xec\xa3\xe8\xe5\xd0W\x8fs\xa8\x0e5\xdev\xb6{Q\x937\xb2~\x92\x06J\x89uU\xfa\x1ax/\xeb\xc4\x90X\xbb\xa9k\xa1\xa1Q\x81\xea\x0c\xc7\x9f:~.\xe6\x1f\xd8\\\x85\x05F~\x9b\xb1)\'\xe7\xac\x07\x954\xa2\xaa@E\x9d\x1dH\x9fO[\x06\xa6y\xf2\x0f\x1aM\x9f\xc4&\x08iQ\x174zG\x9ep\x93D\x8a\t\x12\xf5\x1c\x90P\xdc\x92\x06\\\xc4\xf8\x17\r\xc7\xbeHa4\x98\xceK\xa0\x80/\x90[\x12\x15|r\xa5\xc4q\\\xbf|y\xea~`\t\x82\x0cFD\xbb^\x7f\x04\x84V\x89\xd5\x92\xc7T\xb7\x89q\xc4\x95J\xe8\x956\xeco\x8fV\xc9\x0b\xacn\x7f\xb4Z\xd0\x9a\xbf\xfe\xd6\xee\xc6\xe1a\x97\'0\x01:\xf8p\x97\xb0\x06D\xb9\xb41\x10\x00\x9c5\xed$d/\xee:WG0P\x9d\xd3\xd9\xdb\xc9\x19\xe9R\xfcQ\xa4\x99\xdf|\xb9\xaa\x81:\x97|<\xa8\\\xa3pI~\x9f\xe07Y\xb9\xb0\xa1+)\x19blj\x8fo\xa0\xdahM\xf5\xcf\xc9\xa1A\\{\'\xdc(\x1dz+"\x8c\x84^W\xf6\xb3\x03\x08\x82\xa6\xb0\x1e\xd7N\n\xd8\x1dx~\x02%\xad\x80j\xa1\x06*\x88o\xb9$\x0c$t\xff*\x18jMQsR \x0el\xb6P\x9c\xdc\xb4\xc1y\xdd\x8aG$\x8b\x7f\xb6\xddQ\x0b*\x0c=\xfa\x108{%}4\xafs"\x81-&#\x0eEu3\x0cn\xea\xc3x&\x9d\xc8\r0$?k\xab\x8f\xc0\x10\x16\xdd\x1b\xa1\x8cv\xbd\xf4\xd3\xb4[\xe9\xb1[\xe7\xc6\xa6\xb2l-B\x8c\xe0\xd7\xbag\x81\x11\xc5c\xdc\xe0\xbb@=J\x0c:\x9cp\xfc\xac`\x88V\x89f1\x1a\xc4l\x87\xf5\xa3Q\x11\xe1\'x\xbe\xb6m\xb6\xcf\xde\xe6\xfd\xce\xb3\xac{rT\nH&\x8a\x16Im\x8f\xd2Y\xf1\xc6\x97p\x1f\x1a\xb5\xe4\x1f\xdf/\xfd\x8eI\xb6\x1e\xf4_\xf1\xe9qg\xb6Vs\xf4\xc9$\x93\xa7\xdc:\x14\xa6\x80~8\x81_\x16\xb3\x08;?I\x0c\xd6\xe8\x1b\\0*nv\x83\xba\xd5<<]\x1e\x87\t5\xe5&G\x07\xcbZ\x02/\xa4\\`\xcb\x1c7\xb5\xd5 Z\x96\x9c\xcfr\xd7>\xe1\xae^\xa5X\xb1\xb0\xec\xef5~d\xcbKzrm8\'\x84\xdd!3z\xd6<ct\xa1\xfa\xa6\xbfm\xc4\x92\xa5&\x96\x93\x19Y\xcb\xc9A\xdc-\xa4\xfd\xee|\n\xearQwE?Re\x8a\xc5\xeb\x7f1\xc2\x88k[D8\xf8\xac\xde\xe0\x85K\xf6>\xd3\x81\x97\x02\xd5\x04\x0f\xce\xd4Q\xe0O\xcc\xa0\x04a\xfc\xe8\x8b\x9a@\xb2\xbc\x05jV\xfa\x92\xbc?H\xa5\xbb\x83\xc7\xd7\x1d\rf\xa0t\xd6_\x8b\xbcl\xbb4\xa4o2\xfdRS\xf2\xd0\xee\'A\xd3\xcf\xc4\x89\x8e\xa9\x9fQ\xf3\xb0@L\xdf\x03\x11\x024^O=\xb2C\x8b\x00\x1a\x92\x7f\x82\x9e\xcc\xe4LkY\x1d\xfa\x90\xc82EI\xdc\xec.]\xd7\x17_\xf3\x1bG\x83\x8eH\xb9gU\x99b\x95.\xb9\xd9\xf30Y=\x82\xe9\x9d\x06\x93l\xe4\xa6\x04w\xd4B\x16;\xe1\xc5f\xf9\xa5G\xd1\xc9jl\xb8\x17\x99%\xb1\x0b\x1b\xf7\xc5-g!\x9d\xeb\xaeB\xc0\xeb \xa7\xd4\xea\xb1|\xc3 t\x15m\x13\x94\xfa\x84_\x1c}\xe6\x92\x00z\x8b\x06/\x1c\x85\x11r\xa6\x98\x81\'\xe9\x98\x07\xea\x93f\xa1\x01\xb3\x0bo\xb46?OmQ\xbcg\xa8\x0b\xfe\n9\x13\x90\xf7\xa8\xb7\x91\x8b\xe0\xc6\xf4 \xae\xa9g\x92Xg\xa2\x87\xe7\x13*gx\xf8(T\x07\xfc\x1b,\x03B`\xde\xb2\r8\xb5\xd5\x8crG\xc6\xf8\x93\xed\xc9\xfd\x82b*\x95\xfa\'\xdb\xefOd\xce\xea\x90P-8\xd0,\x01\x87\x12\xc3=\xb9\xcd\xf7n\xde\x13\xf4\xd2\xce4q\x8aS\xfbFS\xa6?\xb1a\x0c\x12\xada\xb4bk\x9d\x97\xca8\xfd\x06\xfd^\xc1\xcf\x08\x17n\xec->H\xfc\xb9\xcf\x0b\x95\xc5\x89\x9c\xf6\xa63\x0e\x96\xd3\x10p\x84\x86\x8c\x92\xd0Oo\xa9]\x9cO~\xc6V \xb1\xf7\x83\x89\x99\x876\xc2\x93\xf5@\xd1"\xf6\xefOQn\xc0\x89\x9cu\xccSH\x9d\xd9\xb7\xf2\xaf5\xa9\x12\xed\xa73^\xe7\xfb\xf2(\x98[j\xe7j\xb9\x01/s^\x1a\x92\xe6\xdf;g\xf7\xefaW\x9e\xaeq\xc6\xc3\x87\xa61C\x19yf\x1fb\x0e\xa8\x8c\xa7\xb00\xc84>sz\xc4\xa9\x07\xd7A\x1e\xc4\x0b\xf0v\x17\xbe\x8f\x12 \xfc\x14\xd1\xfb\xc2G\x9f\x93\x81\xaf\x97+&\xc4\x9b\xb2\r.\xb6u\x04rg\x15\xe9\x93!!\xe2\xbe\x08\x11I\xe1$\xc6\x03\xdb\xd5\x8e7R\xbb\x11\xec\xa7\xff&\xd8\r\x10\x04>\xa4\xf4\x91\x10L\xcc\xe9\xe7`\xf47\x95\xcbW\xb6\x8aj\xe9g\x15\x07\xe9A1\xf8\xeb&\x0e|!\x05%\xb0\xc2\x08}L;?Xq\xcd\xe5\xb2\xe0\xb4\x02D\xf3\x0b\x10vC\xa3\xc6_\xa8R\xb1h\x06=0\x13\xa5\xe9\x92\xae\x0f\xba\xea\x00\x88\xbd\xd2O2\xe8\x00v}\x82\x15%YF;\x91\x06XmfUW\xa1\xf9\xb1\x07U<\x1cf\xe4_\x0e\x9f\ry\xb8\x0c"\xa0i\x91\xbdD\x1f\xc6+<\xbb\xa4m\xf8-\x10\xceJG~\x9b \xd3\x8e\xf4\xbd2\xeb\xb21\xfe\xe15Kk-\x8c`\x10%\x16\x17\x08hx;\xf6\xd7\x8e\x9e&\xcf\xa1\xd6y\x882\x81\xe4\xaf~\xba,\x80\x03ZtNP\n\x00%\xed#8\xd8\x9c9\xce\xee\x9b\x99K\n\xbe\x88\xed]\xdf\xc1\x7fz\xa8X\x0c\xe6\xbaz\xce\xcf\xb9\x95\xc7o\xf6\x10\x7fW\x92\x15\xc5_\xa5NZ\xc8\x80\x83\xb2\x0e\x19Ig\xf5d\xa7\xbc\xc9\xd10\xc4X\xe3\x00\x05-\'K\xd2\x9bN`\x8e\x10\x16\x01\xcf\xed\x82Lt\\\x91c\xb1$\x9e\xbau\t\x93p\x9e\xf6CF\xc4\x16k\xa6d\xaf\x9a0\xca\x1bY\x9dr5\xc8\x8e\xdd\xa7\xc29XI\x8e\x98@\xd8\xc07S_O\xc2\xf3\x84\xab\x03?q\xde\x9b\xdc{m\xb4\xcb2](\xad\xdf\x94d\xb2\xbf:A\xafN\xca\x00\xe4\x1en\xd0Lb\x83\x03e\xb5\xed>(\xbd\xe1I\xb5\x07\x9a\x16\xb3e2\x19\xc5\xeaJ\x83r\xe8\xec\x19U\xa0\xf0!J\xffb\xdb\xbd\xf6\x1c\xbb\x83R\xc6\x05\xf2?B\xfa\xde9D\xabO\xc1\xa7\xbb\x80\xe8\x17%m\xbeIN>*\xebz\xad\xa5\x08g\xf8a\xa5\x83\xc9\x19\xea\xa2dD\xc0p\x12\xc3\xa0\xba.wn\xdc\xea\xe2\xe3\x0b\x82\xac[#\xff7\x98\x01\xdaO\xe7\xfc=~\xa7P\xff9\xd7K\xa7\xebQ?4>\xc9d\x8dG0\xf1\x0c\x1c\xd5\xdbq\xd2\xc9\xf9\xf3\x8b\x06\xb2\xc9\x0e\xb2L\xbeS\x1d\xbd\x81\xfe\xbd\x91+P\x07\xba\x01\x17k\xf2;\xb8LP\xe3\xbd\xcb\xdb\x02\xd76\x15\x9cE\x8dQ\xcc\xeb\x0b\xaa\xe1\xb3\xa8\x06NF \x98\x96\x11c\x1e\xca\x01O\x9d\xf9\xa0\x9d\xde\xa8 4$\xb75f:z\x97\x87\xe2\xe9\xe9\x0fad\x1cX\xf6\xcc>\xab,\xf6\x8ex\x91\x023$\r\n\xef\x9c\xd6\x8e@\x1c\xb6d\x16u\xa4&\na\x86q\xd6\t\xc3\x94\xac(y[\xbaC\xb9\xad2\x0c\xe8w\xcaue\xc8\xbf\xc6\x04wl\x83\xb2\xe5<\xb4\xa1\x82\x1d\x87g\x8a\xc8\x82:\x87f-\x90*\x9e\xeeL\x9c\xed=}\x1a#|lw\x91)\x11\x84\x1aG\xdf\xf5\xabC\xe7\xb1\x9e\xd8\xa9(K\x0f\xeb\xdb\x19\xbf#\x03D\xc3\xbd\xfes\x9fB\x86\x915\x7f\xe4\xd3I\xcc\xb6.\x95\xf6H\x12\xfa\x1b\xa2\xfbD\xf06\x9a\xb2\x91_\xc6\xe8e\x05ei\x1e\xbc\x8b\xa1\xc3"Arv\x17\x97S\n\x1amT\xa0\xa9\x17\xca\xf2\xbc;\xd9\xad\xa3\xfe\xe1F\x9c\x95\xd6\x1d\x9dpsl\x05}\x97mC\xe1\xc4\xc4\xe2\xa7\xa6o7K\x94\xc4e\xb9\x05\xf0\xd1\x9e\xc5\x84\xf6\x00\x93\xc9\x91\x96\xa7\x9b\xa1\x8b\x9e\x88\x07\xf4\xf1z\xf0\xd1\xc0\xab0\x0f\x93\x06N\xb9\x9e\xad\xc0\xa2^\xbe~w]~\x95>\xa2\n\xb0dx\xf4\xe3\xf9R\nJ\xd7\xe9\xc3\x1d\x06}\x18,&c\xaenW\xe5I\x1c\xd3\x04\x04< \xd8\x0cG\x82\x0c\x12\x18\x1c\xee<\xbc9\xa5\xa1R\x07\xf5u\x8d\x02\xf9O\x10SZ\xab\x81\xec\xa7\xe4\xb7H]\x04\xfc$\x00\xc7;\xf64\xf4\xc3\xc3\xbc\x80~\xdf\x96;O\x80B\x96[U\xc7\xd9\x93\xdf\xb3\xbf\xdf22\xe6\x05\x11d\xda(F\xc8kK\x0e\\\xb2w\xf4<\xecD\x99\x14\xd7\xa21\xc1{}\xd7\x82\xb3\xae"\x830B\xbf\xb4\xb5r\xa0W\xdd\xffd\x83rf+\x1e\x1a\xa3\xfa\xa2 r\x13\xc5\xcbA\x19\xb1R(\x8e`J\xa2\x1e\xfcN\x1f)\xac\x11\x9f\xc9\x17i\x86\'F\xbbF\xd2\xee\x9c\xfc p\xb0W \xb3\xfe\x00RJ6\x120\x18\xc8N\x18_\xe5\xfa\x1f\x9d\xc1\xd3#j\xb7\xdad\x8c\xacB\xbe\xa9\xd3\x04\x969Q\x1e\xd8\x99~\x08\x15\xe5&\xf0\x86GIh\xcdw\xd69wk|\x06\xc6\xbe\xd4%G^\x82r\x18\xca\xa3\x01\xfbv\xc0\x80\xe4\xfc\x0b\xcd\xc7 L\rj\xd9\x12M\xe0U-w\x16\xf4\xd2\x80,\x82 \xe3\xd5\xa9i\xd4\xb8Z\xd1\xb4\x10\xd7\xc8\xd0O\xcf\xf8\xdf\xb8\xd9\xf5\xcc\x0eL\x02\xb8\xa3\x10\x7f\x90\xbe\xa4m\x96\x9a\xfd\xa6\x17\x1b\x1a\xac\x19)\xeag\xcet\x08\xa3\t\x89\x98\r\xc0#b\t$\x80\xae\x81#\xee\x85\x8a\xb8]\x8a\xea"\xd1\x13\xcd\x8cT\x06\xab\xff\xcd\x8f\x04R\x9e@\xc1\x1eJx\t\xa3\x98!\xc8\x13\xf4\x93?.K\x0b\x1c\x11\x8c\x13@\xb5\xad4\xa5\xce\xce\xb4\xc8\xbc/\x17w\'\xa9\x9e{\x8aP\xeb&\xba\xc7\xad,K\xf2\xbc\xd8p\x0c\xff\xc5\xd8\xea]!z,\x17\xa0X\x97\x98g)C\xde\x1f\x99\xba\xa8\xef\x80\x8e_\xbd\x93\xfd\xfc\xb3h\x08\xb0Hd\xfe\x03%\xac\x17eU\'\x1e\xe86\xc5A\xdb\x0f\xd7z@\x1bj\xbc\x06`v\xef\xe7\xbc\xed?\x88\x9e\xe0"hm>\x17\xa3\x02\xa8\xc5\xf1\xb1\xce\xd5\x80\xf3\xa4U\xc8\x0e\x9b\xaf\xfa\xe8\xf6\x119R\xff\x8aZ\x17\xf3s@\xd0\n\x86\x93\xc2L\xceW\x01@\xed}\xfa\x84\x10\xdb`\xc6\xf1\x02Q\xcaT1\\\xec\xf3t\xc4f\x10\xe7\x0ff\xd5\x9f\xd5\xef_\x00@\x90x\xc1\xda\x19)\xc3nkR\x06\xc9gY\n\xcb,\xfa\xf3\x8a\x92\xc0\xb53x\xaf\xc3:\t\xb2\xc6\xee\xf8\xbb\xcf\x04\xb3\xf7\x12#\x7f\xfe\xf1[\xee\xef\xc8\xd5\x00e\xc7\xfb\xe3\xbf\x87\x98\x95C\x1eb\xa4Z\xa1\x9d\x1a\x05\x11\xcbIV9MA*M\xf0\xf2\xb8_\x04\x1b\xbc\xe1\xfb\x0c\xa6?\x95F\xbf\xbc\xcb\x8a\xecQ{0\xb1\xa7w\xda\xb6\x0c\x1c\xdd\xff\xc4\x17\x91\x0b\x8e\xaa\xc3(\x175\xcc\xbe\x16\x13\x997G\xd1K\x8dc\xe7rt8Hl\x17/|\xe6U\xdc\xfb\xd8\xf5@\xbeA\x1e\xd1M\x067K\x04\xd7tC>E~\x03\xb6$8\xe0\x10\x8cB\xe1<r\x99pp\x17\xba^f3|6\x02\xe1\xf5\x13\xdb\x0b\x1a\xd4\xa6\x8b\x80\x0f\xcb\x14\xa4\xa3\xe6\xfe\xf4\x16g8Q\x81\x0f\xf4\xef\xb0\xfe\xb4\x8c\xad-hk\x9ds\xff\x7f\xa4?\x0f\xd5\xf6\'-\xe8\xc4\xbf@\x04!\xdf\x8fXX\x0e\xd4/\xc9ti1AWt\xa1\x1dTZO\x95c\xdf\x89\x8a\x1b\xa3\xd5N\xf1\xbf\x1en9\x99\xfe\x8a\xfcNKN\npa\xff}\xbb\xf0\xb9w\xf1\x9b\xd0{\x14T\x8fv\xccnM0\xd9&\x102\xa8K1uO,\xe3\xe7\xe6\x08\x99\x976\x19\xf9\xaf\\AY\xfe\xd5\x15\xe8\xe1\xcf\x1a\x0b\xffB\x8e\xe9{\x85\xaeu\xa0Rm0\xac\xca/WO\xde\xb9U\xcec\xd7\xd8\xdd\xab:\xa0$\x81\x90\xb9\xd08\x88_\xc8\x89E^\xf0\xbd\x93\xb7\xd7\xd2\xe6\xb66\xb4^9\x9c2\x05\xe7\x07\x9c\x93\xc5\xea\xa4h\xe6\x82\'1\xff9\xca7\xca\x05\xac\x15\x97\xed\x1bc\xf0=\xd3\xff\x0c`QgG\x17\xb5\xda\xd9\xcd\x06C\xf7\xccr\t\x87X\xda\xe3\x81\xd1i$O&\xbc\xd0\x17C*cc\xd6U.\xd8\xc9\xee\x9fb\xc3g\x15\xb5\xea<M\xb5V?^ \xe4I\x03YN\xae\xa2\x15\x00\xb0\xb6]\xd6\x08d\'\x07\x7f\x9b\xdf\x8b\x9fa:\xea}\xa9Q\x10k\x0b.\xb1\xf9]\x83\xabq\xcd\x04#,\xf4\xa7\x99\xfd\xfaV\xe2\xa8[R+\x848\xd9Ua\x81<\xa3\xb9\x13\x13\x8f\xd1\x88C\x18b\xb9\\\x9d9\t\xa8\xe1\x96\x8a\xab\xc3\xb5\x93\x97\x89\x86\xc3\'TQ \'#\xa3\\\xa4\xdd\xa9\xcaX\x84\x9b\\\x90\x16\xba\xae\x03X\xc1\xd3\xfd\xed\xee\xdd\x02U\xdb\xe9zT3}Q)\x994\x8b\xe0\xc6\xb9\r\xf9\xcb\x98\xd9H\xaal1\xef\xf6(s\xf8>]Xv\xd5"\xaf\xad\xcc\x10\xf0Iv\xb2\xc1\x8b\xd1\xa7\xcd\xaa\xb9g\x0b\xc8\xf4C\'\xc3\x07Siw&\xdb]\x05\xcfP\xef\x9b\xf5\xee\xe7\xa9\xde\xc5_cmoa\xf4^\xfd\x14#\xeb>B\xf5*}\xef\xe2m\x18\xe3\x7f\xdd\x8d\x9a5\x98p&\x06 }\x9f\x0f\x81n\xafh\xf5"*J\x8b2\xf0\xf9~\xb0\x9f\xc9u\xf9\x15\x80a\x04\x17w\xde\x01\x10\x969$\x97H\x8e|\xee\x92,K\x8ds\xe1\xc4\x11+{\x98\xecu\xab\x03C\xf0\xc4)o<\xe2LW\xb6\x82@?\x04h\xbd\xf5h|M\x90\xb9\xab\x18\xa1\xf0\xbdl\x0c\xd80\x9f\x0e\xbb\x14\xb4 T\xd1\xdb\xb6\xf3\x8f\x10\xda5i\xd6\x9b\xc9@\xa2\x02\xda\xf5\xe9\xb6\xf6\xaf@+\x7fs\xfe8\x1cf\x17\xf23\xe27\x997\xd6WE\x87\xabw\x06\x96\x9ee\x8cX4\x16\xde\xb4S\xd4\x06\x00\x01\x90\x87\xde\xc4o)\xeb\x05\x89\xdfp\x9dT\xfc7\x83t\xaf\r\xa1\xd9p\x1dyxD3\xa7\xac\x9f\x1a\x881\xefMeF\xd5B\xb5\xc9\x8e$E\xac\xbc\xcb@\riMk\xff\xe3\xb7\x9b\xddc\xf7eI\xba\x84\x990\xd2\xae\xf2\xb1\x7f\xae\xb0\xaf\x95\x1eR\xb5m\xcfM\xd6\xfa\xc8\x19<-\x16B@\xd3\xad\x97\xc0m\xd0a\xc7t\x87\x845Ese_!\xe5J\xc6e\xa1\x00<\xd8\xb5?\xac)y\x105=\t`a\xa0\xd2\xee\xab\xf6\xf8?\xbb\\aQ\xe4Bv\xbb0\xefB\xff\x84K\x1f\xf8\x1d\xb4v^.RG\xf8\xeb\x11W\xed\xcd\xc6\xcf\x8em\ty0\xc2\xa4\x81\'\\\xe4\xc6\xa7\xa1\xf8\x07\xb0:*Q\xdc\xd8\xaa\xd2\xdc\x17\x00%{\xeb\xd5\xf5\x14\xffe?\x9f\x05S\xa2\x9a\xf6\x8e\\\x0f\xb6\xf6~\xf1\xaep\xd5E`\xbe\xd3<ZIb\x80\xfdz\x08\xae\xbf\xce;\xf6$\x9bLV\xa0/\x8d>)H\x00\x95?@\x94\xee\xe0\xb4\xcc$>\x13M\xe8\xd7\xc3Dg\xaf\xbb\xad\x1fP\x98J\xc0>\xf2\xaf\xe5.?O]p%\x8a|\xfb?"\x99\xb6\xbe\xedk\x81\xebK\xdf>t\xa7\xeeL\x98\xaf\x1ds~sD\xcc\xfb9\xbd\xc0^\xd34G\x1doP[\xa4\x1d8\xd2E\x8d\xc8\x04\x11=\x82\x9f\xbcQx\xf3*\xc5Ew\xbb\xb7\x84_Cc@\x05 \xac\x9d\xf7\xc9\xa9\xa8\x93\xbe\x9f!\x92F*&)0\x08\xa7\xb5\xff\xc2\xf4.\xe5\x90\xce\xdb\xcd*\x94"\xdd\x1e\r\xae\x88Q\xeaE\xc6YO\x04\x03\xa7P:\x83\xb5iU\x03o\xb7\xaf\xe22f\x83"\xbc\xb9~\x90\xaa\xc5G\xd5\x7f30qMjlIu^\xc7\xe3\x1e\x0bU\x8b\xbd\x8bo\x9c \x06\xd6\xd0"\xbadb\xc3K\xb6\xa5\x0f\xfa\xae\x98\xb3\xeb\x00\xd8\t\xc2r@4A\x05\x9eu!\x13\x1d\x00Z]$\xfdp\x9fKz~\x84\xb6\x10\xfb\x0e\r7\x1e\xdd\x9d\x19\x84\xb5)\xc7\xebe\x88\xdc\xa5\x0bJ\x87+"\x1e\x91(\xe6\x98Xw\x83A[$\xbb\xc4\x0e\xf60\x0e.\xa2\x8625\xc1Y\xa6\xb3\xe26\xfa\xa5H\xbe\xdf\xd4L\r\x92\xcca\xe5\xa9\xd3\xa0\xd2\x7f[\xf4\x11XL\x1d&.F\x08\x968\x9d\x8a\xeb\xd8\xd9!\xaf\xf9\x98\x06\xa7\x00\xce6 \n+\xef\xa2|\r\x92@\xf5)y[\x9f\x14\xc8\x0bY\x1f\x84\xbd\x04\x86\xbc\xaf\xa2\xe9\x9dgp\x98S\xe6\xcdy\xdd)\xed\t<s\x92\x11\xd2"a\x14HH\xfb\x97-\xa5k\xc5\x9b#\x13L\xfeg\xe5a\xcb\xfeD<n\xa7\x8a\x8d\x0c\xb3\x0c_\x90\xec\x19\xf2\x8c\xc1\xcbQ\xa7\xe7\xcdS`Sic3\x01\xf7\t\xe7\xe9\xabn)\xd5\x92\xa1e\xc4\xd0\xa3\xf6\t\xcc\xa5\xc8L\x16[\xe6\xfa}>\x14Lc\x1e\xe39\x7f\xdc1\xf8Qa\xbdG\xf7]\xf6\x0e\\nh\xea\xbe\xa3\x10\x9d\xd6\xdf\xafG\xe2\xcd\xb2\xcf\t\x11\xa5\x80\xe7@\n\xe6Z\xb8\xc3Y\x98A\xef\xa8\xea\xb9"\xde|\x1e\x14s\x93*\xb4FwD\x97\r\xf8\x89\x83\xb2&^\xc3\xeb\xcd\xeb\xeea`\r\x15^\x11%\x83\xf8\x82\xb2$\xcb\xa7K\xb9\xee\xcb\x92\xdf,\xc7\x9c\xceF\xa2\x8c\xd7\xa9\xff|\x0b\xbd\xca\xe8\xa1\x8e\x18\xab\x80*\x9aq\xa77\xf4\x1c.\x88\x14J~\xf8n\x8e\xb03\x9dg\xfbw\xdb\x7f\x92\xed\xe1(\xb8\xf2m\xdd\xed\xf4\x07\xbd\xcd\xd2vSGi\xe1\xff\x0b\xc9|\xe4\xc9\xff\x95\n\x18`Nx\x0e\x04st\xa3\xc6\x00\x1ap\x85J\xe5\xfek$\xdb\xe0\xb9\x884\xf5I\x05\x0e\xa6 \xa8\xac\x10\r\xb8\xbdi\xad\xb2\xc7s\xdf\xa3\xa8\x05\xe0\xca\xf4\xe4\x8b\xe0\x92\x987\x1f\x8f\x9aC\x90\x9a\xb8|\xeb^*\xf9\x8d,\xbb\x1c6a~\x9du\xe2\xd3\x18w,\xc5\xed\xcc\xa9\xba\xf0\n\xba\x8aS\x87x\xab\xe3ob?k4Y*\xb9\xf8\x97\\G`\xf4\n\\\xc2i\x87\x92\xf1\xdadSI\xa4\x1c\xbaO1\xeb\x9e\xe9^\x99\xab\x9dX\xfc\x13,>\x08\x99\xc9\x15\xd9\x91\x93\xd6\xb1q}(A\xb4\x93\x1a\xb3\xa4\xfb|\x01\x18\xecm\xcf[\xe6\xa5s\x86(\\\x9b\xac\xf1\xe6\xe2\xd0\xb9F\xd7@\x97\xdb9\xe1\x8a\xe4\x12(r\xc9\xa0\rAX\xb0o\r\x10Og9\x1e\xc1\xc2[}nvg\x8e\xd5Q\xd4\x10\x8d\xd6dY\xf5ns\xaa\x8b\xc5\xech7\xcb\x98XR\xf0\xef\x0e\xf8\xdc\x0e\x13~\xccr\xd2\xda"[)IQ\xc0\xa2\xa9K\xdd\x91%~\xae\xf1J\x8c_\xf6\x15\x01\x82\x8a\xb0}JR2\x13\x8a\x1d\x8a\x19;\xfe\xf2\xd2\x08L\xce\xc3\xb0\xe6Ey\xcc\xf8\x1f\xd7\x07\x1d\xd8\xe6\xc5\x83\xbcT6Q,\x0c\xeb\xeb\xbe\xbf}\\NnG\xec\xda\x9dyx\xdd,,\xf1\xbb\xf7\xda\x19OO\xc9\xb9\x86tn\x07\x80\xf1\xda\xdc}\x8biW\xd1\xa5x\xce3\xd0\xa0\x83\xbe^\xc9\xbfk\x9d\x0c\xd6\xb9\xee2`%\xe5\xf4\x87H\x12\xf7\x04V\x9dDY\x0eG7%\x1c\x8c\xf3\xfa{\xc5\x1d\x8a\x9dzj\x00\r\xb5wX+3\xe8\r\xc5`\xd3\xc9\x8a\x0f\x80\xe1\x82\xf3~d9\x88\xe0\xbeRR\xd0\xe6\x97\x9d*S+UE/\x97+\x88\x93\x80\xff\xb2L\xcc\x1f\xf9i\x06\xf3\xdfo\xec\x14\x92\x1d\xaey\x10\xd3W\xc4\x08\x1d\x88aFVN\xbb\xd9<\xf3!\x87I\xc1h\x92\xb5\xf5W\xcc\xd4)\x8d/\x8a\xbb\xc79T\x8e5P\xe6\xc6\x0b\xb4\xfaHY\x97q\xd0\xbd_\x05%\x8b\xff.\xce\xa1\x17OE\xd8\x89\xbebucXJ\xd4\xef\xcb=\xb0a\xf2\xa5F\xfaC\xa3\x8b\x10>\x08\x1bD\xc8J%\x06UF\xd7\x19\x17\xd5\x98\x9e\x83T\x17(\x81\xf2\xb4\x06\xc5\xcb\xcd\xda\n5@\xa7:J\xf5\xec-\xe0\xd2\x90.\x99Re~.\xb4\xcb\x03i\x11\'D\xf2\xeb\xd7\x08\x86\x08\x96\xa4\xfb\x0f\xa9:\x9f\xcb\xb4x\xb8\xa4\xa7\xeb\xa7ju\x19\x1d\x16\xd4\xf6\xbe\x1a\\\xa5as\x87\trZA\x16z\x81$4\x8b/.2\x82Q\x9dm;Z>H\xb5 \xbe\x80<\'Uv!<b\xca\x15\x8b\xc1\xd1\xa13"\xdf\x80V#\xfc8\x13%\xdc\xfd{\xc8\x97\x82\xb7\xf8 \xb3\x9c\xed[h\x92B\xb2\xf5\xe3\x063\xb3$\xe5\xd8\x1e\xb5\x06y\x94C\xcf\xc56\x87D\xaf<\xd8\\\xd4j\xaeU\xf4\xcc\x96\xfdF\xd6!xl\xf5\xbf\\\x7fuf(\xdae5\x8eD\xae\x08\x82\xf3\x81\xa6\x8e\xf3\x14\x96;\x9cg@u\x19\x8b\xe0\x85\xa6\xb9;LLa\xf8^\x0004|\x14s$\xfb\xaa\xaa\xe2\xd7m\xf9\x14\xe0\x83\x0b]Q_\x95\xca\xf2\xc1\xda\x9b\xd3\xea\xf8\x00\xe6\xf4\x97\x1b\xf4\xd5\x8d\xd3\x15H\xa1^"\xcc\x85\xf2q\x02lk+\xd0\x1c\xe2\xa4\t\x96%\xe4\xa9k\xc4\xfb7Dc:\x19\x05]2\xcdxj\x14`c\xfa\xdbu\x07\xf0E\x02y\xa36\xcbc\x88\xc7c\xec\x15\xa6\x1f\x001\xe1\x8co\xac\x9f\'hb\x8em\x07\xd8K_Fyv\xb9\x88\xc2\x87sM\xe0$\xcb\xca\xd9\xe7\x97\x84\xca]\xd5T\xe7\xadhr\xaby\x9a<\xd6H\xd4\xd4O\xda\x92nY\xf1\xbf\x99\xceY\xdb\x12\xc0\xe0\xb1\xda\x1e\x9e\x06\xa5n|\xb9\xc7\x085\xbf\xcd\x1e\x0bb\xdf\xf6\t3\xda\xbb\xc0\t\x1eh-\xd7E\x91\xb1\xf5\xb8\xb7\x8de8\x1a\r"\x07T1\x82.\x1ea\xbc1\xce-H\xa3\xc0\xbe\xc1\xd13\x97\xee\xedwZ\xac4\xbb\x93\xe0\xebn\xa0T2\x19\xfb\xf66\xff4\x0e\xc9\xd1Z\xc1!\x02\x93f\xc8\x1d\xf4\xb0\xf9\xa3\xd7FA ~\x89n\xfa7TA\xdcZ:F\xc9\xcb\xceCK\x8f\x86\xdek\xa3u\x7fX\\\xcdOW\xe5\xe8\x04\xcd\x12\x8f\xf5;\xc5\xd0\x86D\x01\xef\xadB\xf7=\xa5\xfc\x01\xee\xbb\xa3;C\xc2\xf8\x7f\r\xd28U0\xa9\x1cO\x92\xc6\x17\xedz\x05X\xfb1\xce)\x07\x10\xef\xca\x06\xfd\xd5~\x1d\xb7\x0f\xa3/\xfem"T\'\xc0`\x08\xe61\xa4\x17\xf8\xd9 \x99y\x118\x07\xd9\x8ee\xea\x83\x88\x93\x89t\x16\xd5\x8d\xee\x0c\xe7\x00.\xe3&\xe6\x1a\x97\x96r\xf9\xfc2\xfe\xe0\xec\xadw\xf8\x12\xee\xb8\xf0zs\xc0\x05\xd2\x0fW\x89\xe6\xe4=r\xbb\xdd\x82n\xedQ\x91\x04\x95\x92\x16 \xcaJ\xe4\x170\x0e\xbe\x97 \x90X\xa5\xfd\x95\xfe\xb9OO\xc5\xe1\xd0\xc3\xe0\x80\xf5<\xe91\'M$\xab[\xa5Y\xda/xO\xeeay\x1bZw}\x88C\x92\xc9\xc3\xa0~e-\x1b:0/7\x03\xf0\x03\x83\xb56$\xf8\xf7\xe5j\xea\xe1\xc77\xa4[\xba\x1e\xb7\xd3`\x9a \x12\xbe\x05I\xafm\xd0\xa2%d\xb1\x9b]tj\xe6z\x85\xceB\x848\x00E|TC3+\xa4\xc7\xfe\xabh\x11\x19\ts_/\x0e\xed\xaaNFb}n\x14\xb1\x04\xa0a\x9a\xed\xf9W\xc1\x96:I\xb8DN\x80\x01\xf5\xdd\xbb0\r\x0b\x97\xd1{\x00\x97\x98s\x9f;\x17\x81\xe7\xde7\x0e\xfa9\xe48+\x95\xf2\t\x8dHJq\x11l\xe5k\xb87\xac\xf6\x9fW\xeadP\x9dpk\x91\xc0\r>zhh\x9f\xb3\xbfYD\xbc\xc7N3\\\xfe\xcf\x01\xeb\x80\x80\xd6\xc4x\xfc%t0\xe6\xd4\x02\xfeI?Y\x9bg\x82\xbf\xfc\xcd_\xf9\x8b=\x80>\xba\xe6I\xcf\x1f=\xbe\x96u\x03\xad\xbc* \xd5\x80w\xf0jP\x10\x82\x85\x17SrP\xff#\xb0\x14\xfeI7\xc3\xbd\xb9\x18\x7fUe\x02:I\xa2\x15^s\xc5\xfd\x01n\x06\xa2\'\xc1\xa4%B \xdf\xb60\xa8\x00Lk\x83\xc5y2\xeb\xe0\x05\xfe\xea\xa9\\\x99m*\x15\x85RG|\xdb[\xb5\x12{\xae#c\x1c{]\xf1\xb9\xe3\xcaGf\xffs\xfb\xdfg\xab\x9eW\xfeM\xd9o\x19$U\xc2\x041\xc8\xc8@l\xd6\xa8\xc7\xfd\x93\xc3\x8e\xb2\xb0\x13gK\xde\x08n\x8d\x0c\x13\xeb\x8e@\x9d\xea\xad\xe52\xf0\x98yjX\xfe\xce\x8b\xda\x10\xa3\xc3M3\xcfwc\xc7Q\x87\xc2s|\xd7\x97i_.\xe1\xa2?B\x85K\xb6\xbd^&\x81\xdf\x04\xda\x06\x04\x06\xddpo/k*\x8b@\xaf\xb4\xcd\x90B\xbe\xa5\x85 \x85\xef$\xf76\xf6\x13\xfc\xb0O\x04\xbc]WM4\xfe9B\x91z\xef\xc51\xad*8\xad \x06\xd2?W\x8a\xd0DE.v\\\xc88\x00i\xc7\x1c\xc9\xf6\xd2\xe8E\x0b\x9bxS\xd5\x1e\xda\x87\x99\xdbg\x06Y)\x9b\xe7\x1f\xa7\x93\x9a\xbf\xf0\xfd\xa8\xbf\xba{\xe5 \xb0\xcd\x84\xe68\xf9m\xc0\xb2A\xe6<\xc5\t\xb2Y\xcak\x84\xd9\x8a\xdc\x9f\x8f$\x11\x85u\xbd\x1b\xcb\xef\xc0\xc1\x11\xfa\x87\xb7\xf0\x04\xdef\xf7;\x19u\x87\xefm\xf3\xf9\xa9\xedW\xa2@6\xb7\x05665\x1c\x0f$\x15\xf9\x0c\xdd\xbeM+\n$,&\xf4\x87do\x1d\xde\xc4m\x1f\xa9a\xdd\xa9\x10\x02\x10\xc3\xa0\xe2nI\\\xd4u\x97c\x94\xa9j\x10\xbb)Z\x83\xcd\xda\xffg^\xc1\x02\xaf7r\x8d\r\xa5D\x19\x07F1\xbf\xe3\xe9\xe2\x83-a\xecHF}.d\xf3\xb7d\xf9\xd9\xad\xc1v\xf9*\xd9.J\xa4j\xc2,\x12*"4\xc8\x02\xbc\n3R\x02\xa8w\xe3\x8d5\x08\xb4yi>\xa1\xbc\xeah\x99C\xf71\xb5\xcfA+\x1b\x11\xd3\xa7\x1d\xfb\x8a\xfft,DRFp\xc9B\xe7\xc8m\xb4F\x8aG:\xf0\xf9\xae\x88q\x08(\x80\x03+\xc8\xf8\n\xeb \x9c\x92I\xfb\xd0;U\xf4\t,\xa3gw V\x83n\xd8\xa6cs\r\xfd\x8c\xeaG\x16\xc3\xb4\x18\x03\x94\xc6\xed\xdb\xb0\xeb\x89w\x98\xb7\x8f\xebnP\xbc\x8cX\x10\xc9\xec\xd7\xbd\x9b\x9a\x05E\xc0\x1e\x9a=\xa6\xb4\xa7P\xe1\xe7\x15\x83\xe1nK\xcb>.\x90\xc2\xcf\xaa#\xcb\xa4S\xa1\xe3\xca\xd8\xc8v\xd7\x92\x91lF\xd1\xd7\xc7P\xb1\xc6U\xcb\xa0G7n\xbcq+qFY\xe5\xa6wg\xda\x83~\xaa\\\x8b\xadQ\xac\x95\x19\x12\xb42\x90\x1a\x8b\x92\x02\xee\xa6\x98\x8e\xeb\x91\xbd<@\xcbR`W\xf29\xdcS\xea\xfd\xb5\xe4_\x10\x0c\xff\x9a\x13~\xc4._\xdfU\x88\xd8\x03?\x90X\x16\x93\xc4\xe2\x9f\x06\xa5\xf0*\x9c\'\x9db\x1d\x95\xc0\xb2\xd6\'\t\x1f\x94\xc3\x8d\xf16\x03XJ\xd4\x1b;i\xdc5\xb88\xf7on/\x07\x8c\xc8\x1do\x1b\x1d\x04\x9b\xa3\xd2~1\xcc\x05w\x10\xb9\xe9\xe6\xc8\x82\x8e0\xb4L\xdf9\xbe\x9eX\x1c\x05\xaaO\x95\xe8I\x91\xff\x8b\xda\xfd\x03m\x8a\x9d$\x03u\x06n\x1f\x17\x8fD\x16\xcb\x89V\xdb\x0e\xa2\x8fN\xe3\x16\x99s\xdb\x80\x148\xf8\xc6\xd2\x18\x11\x08\x9d)\xfbo\xbb\xd0\xd5\xeb\x19Z\x9el,%\xe2w<\xe7#\xa4\xfeD\xb8\xef\x93\xae\xd9N\x92;K E\xfa\xc42\xe8\xa5x\xfb9\x16\xfd\x07\x9fgr\x87\xc7\xcf]\x94\xf8\x1aG\xc2\x93\x9d\xda\x8b\x10\xf5\xef\xac\x83,\x8aZ\xcb\xcd3\xc9B\xaaH\xef\xf2\xcf\xbb\xad\xff\x16\xb1&\xa9\xc0\xbc\x9d\\!\xe1jM\x85\x8a0N\xb2\xf6\xa08\x00\x0e\xa5\xcf\xa0\x12\xd5\x85\xa1\xdeM\x19;\xf6fX"1{x\x86\xc6\xbdj\x00ii\xa2\xda\x14\xe7k0\xb6\xb8\x95kmw\xa7>C\xde\x08\xe8\xba@\x82\xb2\xe2W#A\xe7\x1f\xef\xa5\xcb\x1a)\x9em\xb2\x85\xdd\xe4\xf9"\xc6<_q\x9a\xb6\x91\t \x92"\xa3o\xfe\x19tM\xda3W\x8df\xe8\xa4\x8c\xeb\xd2\x83gy\x85W\x86S&\n\xcc\xc1+3\xaa"\x00p\xc8"$\x97\xd1$#|\x84\xac\xf9\x82"\xac\xa29\x89XD\x8b2\xac\x15=G\xdd\tF\xd6\x05\x02;\xf2S6\xe9x\xa6\xe6\xab(\x9a\xfeq\x08\xbcG\x03\xf8n\x1b\x97\xe6\x8d\xc7\xcb\xc7\xbf\xf2\xb6\xc8\x93\xe1P*OV\x01\xb8\x9c\xb5\x7f\xf4A\xa9\x04\xaa\xb0\x17I\x05a*\x9c\'\x9f\xcd\xd55<7^\x05\xacr\x0b\\\xd07\x93w=:\xb90\xb7\xe12?\xc1\x98\xa3:\xfb <H\xef\xcd\x1au\x96\xca\x05!A\x9a_+\xab\xbcG\xfd\xcbe\x1b\x94\xad)\xf7a\xedX\xbdX\xb6\x9fXH\xab\xe2\xc9X\x82K]4\x1c\xee\x02S\x04\xe8G)\xb3\xae\xfd\\\x12\x1e8\xb9\xd6\xfesE\xdaj\xea6\xd0H\xa2\xb7\x12\xe0\n\xaa\xdb1\xc09\xc0\xbb\xd7\xed\xd5\xbd\x89\xdb\xec\xb4\xe4\xab\x19\xd6-\x11\x1cu\xe8O\xe7\x1d~\xc5\xb5i\x8f\n]\r\xb5j\xea\x8fN\x84\r\xf5u\x9b\x0b\xc7\xfaL\x91\xfc\xec\xad1\x80N\x89\x0c\xb3\x10\n0\xef\x91\n\xa1\xb3\xfd\xc8J\xfb\x98!\xaf]y\x15\xed\xcf\xf5\xbb\x8e\x13HV\x17\xaa\x10tR\x96\xa3;\xd7K\x08\xfe\xd8\xd1^L\x141e\xb6Q8z\xf6\x1d\xe7\xc3\x84\xa35[<\x99q\xb3\xcf\x14]\xab\xe7\x98\xff\x08S^\xb4\x86g\xb1\x8a\xc9\xfd\x91\x1cH_&\xba\xfd\x94g\xda\x1c\xae\x9f?Y\xc8\xed\x03\x1c{\xa8M\xee\x07\xc0\x9b\x18c\xbc\xab\x96Dr\xbb\x1d\x07\x8a\x7f`V\nc\x8c\xd6{\xb6sK\xac\xf6*(\xfc\xfa\xf6C_\xa5k\xba\xc5\xbb\xa1L\x02\x98\xf9\x8d\xe5l\x8aU+\xe4\x16V\xa2V\xc944\x94\xc3[\xbc\x8e7\xec\xe8G\'\xd1\xd3z\x94"M\xb1\xd8\x1e\x03Lf\xad\xa3\xccv/"\x9d\xc0\xcd\x82\xc2,\x9di\rH\xd4\x13\xc3\xb9\xd7[\x89KS\x18\x1b\xfbe\xd0\xdaw\xba\xd7\xbaw\xafAA\xa5\x01\x157\xea\xb65\xaf\xbe\x89\xcc\xf0\xbc\x99\xfebm;=b\x8b\xfb^>\xb7\xeezh:\x02V?Q\xeai\xc6~(\x84\x0b\x0f\x03I%\x19\x85\xb4\x0cd9\x9aP\xe8Yn\x9f\xdf\n\xbf%\x08\x87\xb0xG\xef\xa7\xce\x1f\xce\xc1B\xe3\x90\x14\n9\xa1\xa8\xf70\xa2\x11M\x13\xb8\xa1\xec\x1cG=O\r+\xea(L\xc5\xb9\xb6\x80A~=\xb8\\Y\xdd\xac\x95\x8d\x98\x91\x1e,I\xc2L\x83\xbe>`\xcc\x81\r8\x1e\xe9l\xac\x14\xa2\xf3\\\xaa\xbc\xa8\xa5\xc0O\\K\xef\xcbI\x90\xbd\x17E\xdeD\xafy\x91\x0e\x94\xf5\xe3\xcc7\xf1\xfe\xd1\x11\xb5\xd5x*\xff\x9eo\xfa\x0f\xd6TTR\xd5|\x93\x15\x1aP\x1b.-3\x95q\xb0\xf0_rp\xe8\xe1\x83\xa6\xf6\xec\x80\xc1\xf3\xb0v5\xfc\\\tR\xf0R\x99\xc1k\x10zs\xa9\xf7mVez\xa5S\x9d\xd8\xc6\xc8o\xaf\xa0\xb4F$I`\x83\x02\xc7\xf4I\xb3\x8d^\xdar%\xe9p\x91-\x0f\x19\xaa\xce\xb5|\xd8U\t\xe2\x84\xbc\xf2\xaaa\x11\xf9T$\xb3Ds\xe4\x9dhS\xed\x9b\xfeU\xdc\x9a\xd0\xcc\n\x13\x7f\xe3\xf6\xb5\t\xe2C\xe9 \xa0\xff\xd3\xa5W\x95\xdeq\xa4\xdb\xc2B\x19\x15\x9f\xf9\xf1\xd6\x15\xe7\xdeU\x02\xb1\xc8\x93\xf30\xebW\xd2\t\x91~\x82N\x88_\xa0Vo\xbfJ\xe0\xc9\xca\xfd\x06*\x87Y$\xa6,\xf6\xb37\x1e\x82F\xd8\x12\xedTB\x97\x80\xccl\x90N|<\x91)\x0c\xbcZ\x80>\xfb\x02P\x14\x9c\xc6\xe3lD\x98q\xec\x1a\x87h\x0bK\xca\x10*(4W\xa7\xf54Zll\xdb\xea\xd3\x13\xf7\x1d\x0f\xb1\xd1\x10\xb6\xfa8\x06\x08\xd1\xe1\x9c+\xa7\xdc\xd1\x8e\x98\x97 \x9c\xf1!\x1b\xa6\x11\x83\xbc\xaf\x8e\x9c\x1c<\xde \xbd\xff\xb3\xfd\xc8\xdc\x9d\xbf\x17\xe0\\\x9f\xe8t\xf6\xbc\x8e\xc8\xaa\xa7`\xd1}Q\xd0\xc7\x8e\x0c\'\x17\xf1H\xccW\xcbcS\xe4\x94\x0cp\xa8bG\xcaF\x12\xcb\xca\xaa\x9f\xd9\x1f\xb6\xb0\xb7\xd9\x94\xf07 \xad(\\\xdd\x03*S\x8e\xa9\x9fG\x15\x1b\x8b\xd0]\n\x83 si\xcb~\x0c\x82\xc6\xcb\x1cMQ|\xd1\x0e V\x94\xc4o\x96\xf3\xb6J\xcbPE#*m\x10\xc2~NR\xeb{\xa0\xff>J\x99\xbeP,\x8c\xd7\xd5+\x1c\xa6\xe0\xef\xcfD\xd8\xab\xd1M\x033\xa3\xa8\xa5\x93Y\x16\xe0\xbf\xc4\x9b\xae\x14\xde\xb6\\\xb8Ko\xf6\xe2X\xa1"2\x8ct\x1bw\xe0\xd7 n\x92\xa8L\x8e\xc4\xd7^S\x90\xd5vGnZh\x7f\x89u\x01\xdc-_1N\xa5d\xe8&\x8c\xadBG\xddx\xdb\xb7AD\xbc\xc7\xa6Y$:\\w\xcc\x1fQ)\xf1+(\xe7\x15\xa5qE\x14\x84\xed\x01Q\xc6\xa89\xe1\\\xdb\xcc\xaa\x92+\x12|\x9a\xfe\x12\x1c_\x11\xbc\xa4\xbam8\xa3\xae\x05\xbe\x06\xca3).\x97\x1b;\x1f\x85\xb3\xcd\xea\x16\x84\xb6\xa4\xaf\xf1:\x92\x14`\x94\xed#c\xd9Q\x9f\x9d\xe39F\xe4g\x11\x19@\xc3%\x88\x0f3\x8f\xfcB\x84!\x80\xfc\xff\x92\xd18r1\x13\xd2e\x86\xd6\xbe\xe82\xedOO\xa5\x9a\x82F\x1dP\xd3\xaa\xc9\x12\x18\t\xcf\x044\x80\xd6\xdc\xb1c\x1a\xc5dp\xf3A\xeb_\xc2$\x11tb\xba=(\xae\xf1\x8f\x1f\xda\xe15E~&\x07`\xd731\xd9\x91:\xc2l\x8e\x06\x80\n3y\t\xfa\xfaYK \rN\xe1\xa4{\xf0\x91\xd5*v\xb0\x97t\xb8\xb4\x83\x06\xe6\x9f8t\xb1V5\x82\xc8\xab\xc4\x16\xb3\xdd\x86\x10\x0c\xf6\x18\xee\x80\x8cK\xaf\xd5C\x8b\xc4\xfc0\xa0\xa2q\xefN\x10+Vc\xe3\xf0\xea\xc5$\x13\x941h\xdd\xb7\x1e^ \x11\xb6/,|\x9a\xa2p\xf4\xea\x9f\x86h\xe1\xf4-\xbb\x89!\xd0b\xe79\x9b$\x95\x80;\x02\xa3*k\xbf_\x8f\xa4\xa49\xc3\x19;:\xc7F\xe6d\x83\x1e\xcf;~\xbeOX\x9b\x97\xf6\xfaw\xb8\xad\xe9\xa8\x96@\xff\x9c:>\x96\'\rK\x18/j\xd5\xff\x0b\xd2\xa3:Z\xddy\x0c4\xfb\xeai\xb4\xd9\x17\x00\xae\xd2\xb0\xd9\xe0\'\xf3\xa2y\x95\x90\xa5\x82\xb8p;=\'\x85\x04\xcc\xe9\x06\xb0*\xd8\x98\xef-\x84\x9aU_\xea\xc2]\x9f\xac5S~\xfa\xf0\xa0\x15\x9f*\xf7\xb4\xc43\xa7\x06\x8f\xf7\x01\xd1\xd7>\xbaf\x90\x91\x9b\x96\x7fF\x8e\x0b)\xbb&\xad\x7f\x8aS\x10\xd8\xa5\xf2a\xd2\x89\xf3\x97>\x88E\xef[-\xd0\xec\x040-Q\xeb\xf4:-\xe7\xb7\xa2K\xd7m\xf2\xd1a\xcd2Q4\xd2\xf8\xa4vEAA#\xa1\x13[\xe6\x1c\xb2o\x0b\x9a9\xdar\xbe\xbd)\xce\xde/\xebFF\x08\xd4\x83\xf2\xfe\xa7\xf9\xe8\x07\xa0.V\x10\xe7\x8au\xfb"jD\xd9\x1e{\x9cl\x1f\x10\xaa,\x1d<\xa0\xca\x1b\x11EF>\x90gG\xaf\xe4\xa3\xb3.\x9d\xaf\xa8\x9c\xf6C\x1b3R:\xda\xb0A\xa9y\xb7\xf9\xd8\xb2\x0e\x87\x8aq)\xcbN\x9d\xa6,\xc7\xb5*\x89U\xceTv\xdcS\xb5e\xfb\xe8\x1cb\xad\xfa\xd0J0W\xd2\xcck\xaa\x9d\xab\xca\xd7\x03\x939UQ6\xe1\x9b\x15L\x8ei\xd9j*$\xb0\x17\xd4P@)\xfca\x9e\x8a\x91G\xf4f\xf4M\x14\xcd\xf6\xef\xa0\xc3\xa4lu\xa6\x01\xbbO\xf7\xec\x9b|\xe2\xe1-\xbe+$\xafCQ\x83D\xae\x8d\xda\x94X\xf4Zu\xc6\x08\x86\xd7\xe1\xab\xe4\xf8GnX\r\x01\x90\xb2\x05[\xee$\x1c\x10MfE\'P$\x93P\xb3\xe0\xd1a\xfb\x95\xd2c\x0f!l\xd90\xca\x02\x8e\xbb\xa2\xb6$[u\xf0;\xaa\xa1\x8bS\x08U\xc7ek\xcd\xebu\xef\x99[vf\x1c\x85\xe8\xf8\x99\x9c\x0c\x06O\xbda\xc7\x85\x02[\xach\xd6I"\x94\xdfN"\xee\xcf\x11\x86I\x9d\xbe\xa0+\x07\xe1\xd8^\x00;\x97\xa3Mx\x17,\x08\xab\xbb\x0b\xd9\x89\xc4\xd3\xd3\xa3\xdc\x19\x8d\xb5\xd8\x1dl\xa0\xe2\x9f\x9a\xc1+:\xbdQ\xa4\xc1w\x7f\x86\x16\xd7\x82\x9eu\x18\x8b\xe6\x10\xe1~F\xf3\xf5\x8c@\xa3U\x8aI\xa2\xc4IV\xbfo\x08\xab\x19\x87\xdd9\x83<\xccFaXF\x98q_\xcb\xb59\x85m\t\x18U\x81\xa7Pm\x13\xef\xc2\xdc^\x94f\xb7\xefcX\x9bJmq\xe3M\xa20\xd6Z\xca\xa9B\xd7In\xc2\xc8\x9d\x80;\xf6\xd2\x1a\xc9 \x1117.\x0c@\xda\xc6<UT)M\x18\xd2\x07\xceFT\xa7\xd6\xcb\x0e\x90>\xd8\x8e\xf9M\xa8\xef\xec\xe6i\xbc\x8a\x86\x8a\xdd|w\x94\x1f\ns\x90\xba\xa5\xb6\xcd\xa0\xb0\xe7\x12\xf5\x96\x87\x1a%q.w\x1d\x15\xc0\xbbY\\\xfe\xc9\xf1b\xcd\x16l\x98\x04\xb9\x9c< \xbe\x94T\x8a\x93\xfb\xa9\x1d\x8b\x86\xdd\x8b\x9e\xbb\xf9f\xa1\x94\x99^#\x01\xecd&%\xa4\xbc\x05\x1f\xec\xb4\xca\xe3\xf1\x8b<\x05\x05\r@\xd2\xfaW\xea\xd5\xd1u\xf5\x02\xe2V\x1f\x05\xed\x00\x86<\x93\x80\xd8\xe0\x99s.\x86\xd1\xc73\xf0\xa9\x01\x8e\x7f6DS\x87\x92x\xeeW\xb0\x94\xc3\x00\xe0\xa5w*\xfb{V\xa8X\xf7\x87D\xf6\xb2\x13\x9d&\x85\xad\x9c\x17F,\t\xed9\xbb\xd7P;N\x90a\xfe\x004\xa9\xb1a\x0fYVG\xe7\x0bAiD\xfco\xbd\xa9aF\xb9(\xbf\x17\xdb\x83mE\x02\xcaPT\xddz\x1c@\x18\xa7D\x92\x9c\x02\xcf\xbbif\xba\x93\xc9\xcf\xc0\x16`\xb3w\xcb\x87\x8d\x04\x90\xbeY\x07\xfcgb\x18\xa2:\xdeQW\xbbO^\xc6\x08\x93\xa6\x8b\x83\r\x13\xd0\x05\xdd\xc0\xbfv\x91\x8b\xef\xd5\xfb\xafb\xfb\xb7mi\x97\xdaM\xccM\xd0\x1f\xfc\xbe\xb9\x93L\x96\xc8\xdc+\xc50\x17\x87\x1e\xb7;\xee\x11\xb6N\xba\x84\xa3\xc2\xb7\x81\xd3\x83_\xea\x87\x80\xd3\xf9P\x9c\xed\x0f\xc7\xa8\x1eE\x1f\xa2/\xb2\xd2X\xab2#k\x9fSm"^?\x8a\xd94\xc0\xea\x92\xeb\xaf?\xbe\xbbW[\xad\x15mV5\xcdC\x16\x07\x98,\x0b\xbd\x81;d\x86\xd4\x0c\x04\x8e\x95w\xa4\xc8\xa6\xf2\xf3?)\\(+\x1b\xfc\xb2I\xfd\xaeYZ\x1ah\xa0v:\xf6\x96\xb5\xd5V\xd0\xb3\xf1UQ\t\xc3\xa9\x9f\x01c\x0b\xfa\x9d?\xcc\x82 \'%\x14oA<\x0f\xea\xc9y*\x18\xbc\x93N\xb2wug;\xb0\xc3\x1f?\x89\xad\x87}\xe1K\xd2V\x7fvQ8\x0b\x18B\xde*\xb4{\xa9\x12\x06\xa0\xddH\t\x97H\xa1\x84\x04\xbd\xfct\x85\xb4@z\x98]Gv\xbc7{\xe8\xa9I&t/\xd5n27\xdcPQ\xa7<S\xad4\x05|\xf4\x0f!\xc1C{\x9a\xef\x9b\xc0\xecT\x9b\x00\x10\x86\xf2a|U\xcc\xc1x\x83\xe7\xca\x14z\x99\x82\xbfEOo\x13\xefq\xbd\xcf\xc7\x04\xc0\xf3^,\xd1p\xe7+1\t\x85\xf6\xfd\x9b\xe8t\x9b\xa4\xe2hk\\lL\x1897D\xd1\x9c\xd3\xe0sQ\xc6Z\x01?[\x15w\x97[gl\xce\xa4\xff\x188a\\#\x08\x96\x83\xa3\xb8~\x01\xd3W\x97y\x1c\x00\x8e\xe8H/\x8a)&\n\xb7\xe9\x18\x15~dD&\xe2\xa2\xc3[\x8d\x17\x96Jn\x12\xfa\xbc@\xed-\x0f\xe7\x17\xb0\xb5\x16\x99\xb09!mI\x14\xe1\x9e\xe0}\xc4\xd7`\x891\xc2\xc9\xeer\xa0\xc7O\xd2\xf7\x7f\x97\xf1bd\x97=\x8f\xa1"\xbc\xa5\x8cd\x14\x8c\xfd\x8d\x066\x18\xedX"\xb4\xfa\x9f\xc9\x90\x94\x0ev\xaeR\xcf\x0e\xac)\x912\xa97\x0c\xf9\xd2\x99Z2f\xde\xfd~(\xf7\xcd\xf5,\xc8\xd4[\xd1]\xb9d\xa2\x1d\xf1\xda\xba\xad\xbe5f\x17L\xbb\x1c4\x07\xaah$\x06m\tb+\xae~\xa6\\\xd4K\xa9Z\xfb&\x98[!\xc9\x9c\x10\xebb\x8c1\x7f.n\xe3z\\\xa0b~\r\x10\xe46\xe4\x97\xeb.\xb5\xf7|K\xb9\x02\xc7\xc7\x85\xeb\x93Bj\xc1(>\xde|\xcb\xa2\xa1@s[\xbe\xe7w\xe2\xbdh\x94S\x8b\x1a\x8f\x15\xc8v\xe7\xa0:KF\x052\xe7\xc9\x13\t\x19\xc5W\xc2\x90\xe9JsY\x1b\xb6AO(\xbb"\x16\x18u\x83q\x92]\x8d(\x98\x8a\xd7\xad\xfb\xdaW\x07)l.-O\xa4\x15D\xd5H\xb6\x11\x99Y3k\x01\xc0i\x07\xa1\xcf\x99W\xdf\xd4p\xbb\xfa\x83C\xf2?\xd4@ck&;M\xda\xd4\xeakR9\xb2S\xdfR\x01\xb1N\xe0b~\xe8\x9b\t\x95x\xa4NP\x0e[3\x8c\x96\xc7\x1f_\xf49\xb9\xe5\xc6\xaa\xecR\r<#W\x01V\x08o\xbeA\x13wbL`EH\xf2\x8b\xb0r\xc8N\xa7M\xca}\x7fa\xa7\xe7\x93\x0f\x14\x82F\x01\xd1\xbc\xc9h\xb1>\xc0sL\xf5#\x99?yZ)L\xf4P\xcb\xcc0\xbd\x99\xc5W\x9b\x17\xb8\xc3\xbf\xfe\xc0\xa0\xfa\xa5\x15P\x17\xe03&\xf4\xfe\xd3e\x9f\xa5\x93\xa2\x91\xec\x84\xae\xcfh\x1f\xa7!\xbf\xf0\x97\x13Bd$\xff\x03\xa0\x86\x9f\xc4\xfdM_j\x16\xd3<\xe1y\xe5l\xe9v\xda\xe9\x02X\xa7\xe6\xfbA\x02\xf9\x98\x87f\xa43{\x9b\x8cU\xa2\x03\\e\x1f\xb4\x80j\x80\xfb\xce\x90\xb0n\x84\xf2\x87\xe9(H7\xc8G\xe8P\xaa\x91e\xe5u\x0cY\xc0+o\xb3?\xd6\xdd\xef\x0b\xd6\x14\x93J\xaa~\x19\xb4\x98\x15\x1a\xa1\x188\xbc\xd8\x016\t@=Tkt)\xb2\xd0x7T\xab\x1d\xbf\t=\x9a\xa3\xed\xf5\x9f%q\xfc2\x87\x82S<\xce+\xb2c\xcb\x02\x8c\x9b\x7fh\xbd#\xa8\xdfJ\xd0\xb2\xaetL\xd1\xb0\xfd\x11\x8dD\x1dz\x85\xab\x8d\x9a\x91\xd7\x14\xedc\x82|/I[\x9d\xc0\nU\xc2N\xcf8\x85y\x88\xdf\x0fI\xf8\xc2\x154\x1ea\xa0\xcd,tF9\xe6\x0e95u\xa0\x00\x00\xfa\xf9Q\x17s\x98H_X!\xaeP\x80\xc1\xdfi9\x95?\xaa$\x97q\xa0\xd43j\xb4\xcag]x]\x82u?\x88B~\x15\x95<m\x18@6r\xeb\xe17\xae\xfcS\x176\xb4\xa5R\x9c4\xce\x1fL\xc4`\x8c\xd6\x81\xb4\x1aq\x85\xfd!\xbd\xcfV\x95\x92~\x1f\xdcT\x94\x10]{\xaezA\t~9\xe4u\x1e>\xa6I\xcdi\x18\xb1*q\xdd6\x93^\xb7\x18\\\xe8 \x80q\x1e\xd8\x12!\xaaS\xdaC\x02\n\x12r#4o\xb1\x86q\x94\x06\xd4\x99\xa9\x7fv\xb1\xe6G\xe9\xe2\xdc_\xb4r\x19Y\xe04Y\xaeDg\xc7\xd6\xa3X/\xc6Hs\xbf\x84\xed\x16?\xednr\x850\xae\x1e\xba\xcblX\x13\x88\x7f\x06\xd4Q3\x9dJ\x13o7\x0e#\xbf\xa1\xc4\xee\x03\xa6/\x0c\x87\xafJ\x0f\xa3G\xcd=O\xea\xa0\xf5R\x0b\xa9\xa4\x1a\x95\x10\x81|\xea2\xf1\x0f\x85\r\x15\'*\x94\xe2j\xaf%``g\x00\xa5\xe1\xd9\xdb`^H\xba\xd4T\x03\xe5\xa4#h\xf7\x99\xce\x9c\x1a\x14\xdej\x98\x887uj!\xac\x12|"\x98\xed\x1d\xa8x\x04)\xac\xa0\xfa\x9a\x1b\xbeui\xb5\xbb\xe8\xc6\x00\x9e\xb6t\x1c+\x0b\x13\x11z#\xfe\xf2*\xdf\x8f\xc1UkUw\xc9\xea\x89I\xc9\x1d\x95\xc8\xe0g\x04\x96\x05GvEg\xab,\x11\x1d@z\xddk\x9a\xdb\x96\x9c\xac\xb17\x02\xa3\xd1\xd1\xa4\x98\xf4)\xcbU\xa7\xbc\xf6\xfd\xa2\xdf\xc3\x91\x12\x11\xfa\x14Z\xc9c\x8d\xf40g\x1a\xe3n[\xc4,\x83*\xa3~_\x91\xbc,\x9a\xa6V\x8az\x80\xe3\x1a\x01\x0c*\xc0H\xf0Mfw\xb6{\x8c\xb3\n\xf9\r\xe8\x87[\xdf\x81\xf8f*\x94,?eK\xc5n\xdd\n\xa9\xd5\xb9\x8cQK\xa8\xfc\xc7\xe9G\xd5\x82\x08\xefz\xe3\x9a1\xb5G\xea\x13[\x92\xc3\xc6^`.\n0x\xd2\xe09/\xde\xaa<\x85;\xfb\xc57\x02\xf0\x1d4\xdc\x0b\xb9\xe6\x01H\xc5\x8d\xa6\x99\xa3\xd7\x1d\xd0\xdb!\xd6nG\x0c\xaf\xdfC \x169\xc3i\tM=\xea\x8f]\x88aap\xf3,"\x830\xc1\xb7N\x85fD!\xd3\xe5\x93~RL\x93\xd7U\x1f\xd1\xf4\x9b_\x1cc\xc6w\xa59\xc8\xecV\x18\x08\xee\xda\x01\xd5\x1a\xeaw\x94 \x91\xa5\xf1\xa0U\xa1\xcd\xa4\xdc?\x92sE\x04\xfeH\xd6.\xe49\xec\xbdn\xeb\x9a\xfc\xe4\x85\xb5\xb8W.\xd2\xeb\x1e\x95;@\xa8\x1av\x00\xd1\x96\xeb\x129\x15DB\xdc\xab!z\xb9\xe3\x00ry\xb9s\x13\x1d\x82\xe4\xd3\xbf\xc1\x89\xfes\x99\x12!5\x11d\x84\xee\xb4w\xf5b\xeaY\x8a\xed\x07 \xd5\xa2\xfc2\x10\x13"B\x9dU\xfcg"U\t\xf9\xad\xae(<\x92*@\xbe\xab9O\xf0|\x8f=[\x80<\xa7\xfbZ\xbav1\xe5}\xcb\xc6\xbf\xdb\x9c\xbb\x14L\xcf\xe0E)\x1d9n\x83\x1c\x8dZ/l\xd05\x1f\xa02V\xa7\xcba\xe1\'8\xab\xca\xcfS\x81\x16wH\x1e\xd9B\x10\x86O\xdb\xaf\t-\xae\x94(\xa5c\x89\xf0S\xce\xb4\xeb\xeb\x96\x81\xe9\xcc\xc2\xb1+rq)=\xe2\xed\x1a\x08\xcd\x7f\xea\x07\xf3\x95\xd1>/\xa3\x81\xb1\x08+\x95\x12,e\x8c\xd9\x86=\xdf\n4x\xe3M6\x9dbj\x1d\xfcv\x98\x9b\xf5$t"\x7f\xfef\xa8\xc0\xd81\xd5\x19\x8aH\x85\x8f/U\n\xb2\t\xf5\x062C\xbe\x80\xe0\x8b\xd6\xcc\x9d\xf7@D\x10U\x01\xa0:\xe5\xf6\x13\xa0+\xc5\xd6Fn\x99l\x07\xb9ql\x95\xc3$\xa0k%\xc0\xe7g\xf6`?Rc\x98\xf1\xadAY`\x84\x00\xc4\xcd\xd9#]\x9d\xd7\xd8)~\xef\x8fbw\xf3\r~\x00\xe9#\x87\r\x06\xc6\x8f9\xd7+\\E\xde\xdd\xc2\x93\xc6|\xcc\x93\xa3\xe7\x08u\xf1\xc4\x8f\xf7\x97t\x1a\x817\xe3j.\xde-*\xda\xb0sP\xba\xed\xc8\xd8\x95\t\xaf\x1c\xb0\x85S\xb5\xa9\x9c\xe6\xd4\x8d\x8f\x86\x0e\xa4\x9e\x82o\xbd\x0f]{\x04"\xde\xae]\xa0U\xe1\x9d\xef\x0bv9\xe1f1\xfb\xff\x01\x1b\xed\x15\xdb\xeb&\xfb\x1e\xfdg\x93\xcd\xe5\xd3<I\xc3\x93w\x1b \xef&mBsM\xc2*\xef\xcfm:\xb4\x9er\xe1_\xde\xfe\x1d\x8fT\xdf\xc8FH\x01Q\xa6J\x1a\xda\xa7\x9aH>V&\x87\xfe.\xc4~\xd14J\xda\x9a9\x1c\x1de\xd5\x99q\xb0\xec\x0e\x9aT\xc9d\x8e*\xb7\x9d\xfb\x05\x17\x82\x8d\xff09\x12\xad\xe2\xb4e\xe6\xc8\xc4\x9ak\xbe2\xfc\xa0r>$\xe9\xd2\xcb=\ru\xaf\xb7\x90;\x86\xdb6\x8e\x0bm\xf5 /b\x1eF\xaf\xe21~g\xb6\xd0Y\xe6\'J\n\x10m\xfa\x19\x18q\x88\x0f-i\x85\x13\x18at\xe8\x01\xa7\x0f&3\xaaF\xaa\xb1\xb6~E\xd8\x03\xbb/\xe8\xbc\n\x85\xe2\xbe\x12\xd7\xa5\xe6\x16\xc0\x89\xf1\xf6\xe3P;\xa7\xe7\xa7\x07\xb6N\xc09\xc0\x009\xfcpp\xaaU\xbb\xd1}\xc9\x06\x8b\xc9\xeb8W\xd3#X\xf4\x8a,\xa9\xcf\xc0\x145x\\\x9dC\x8bo\xf0\x9b#8\xd7t\xa4 \xac\x859&\x0f\x9d\x1d\x9f$[?\x0f?S\xa2\xca\x9a$M\x8f\x86\x99\x98\x83"zL\x9eNDM\xea\x84a\xe9)\x85\xfc\xc8\xe7\x1f\xc6\xdd\x8ep\x7f\x14r\x8c2!"%-\xfbB\xf0v\x1d\xec\xcf\xed\xa0\xfe0d(\x1b\x01P,\xa8\xc4\xd8\t\x82(f\xed\x88\x10F\xc6\xc9)\x00wl\xdb\x8f0\x02\\E^\xc0\xc4;\xb9<\x80w\x0c\x86\x8b\xea\x97&\x98\xecQ\x8e\xd2K\xec\x0f\xe0Ak\x88}U\x1a\xadD-g\x8c\x9b\xcf\x1c\x81\t#\x9dq$\x9d\xf9LHK\x1f\xbe\xe2y\x7f\t\x9e}q\xb9\xb7\xa6\x85\xe5\x0f\n\x7f\xc4(\xab\xe6H\x1a\x19\xb4\xbd\xf1\x1ctYV\x17{\xa3SP\x86\x1bU\xee\xe5\x1b\x8e\xee\xf4\xd2 \x03\x98\x85X\xc6\xdf\xd4\x0e\xb8\x93\x03Y\xd3\xff@\xf3\xa6v\xf5H\x10\xd2H\x90\xaa\x9a{[!\x7ff\x115t\xd5\x08O}5C\xaf\xdfa4\xc1\xede\xe8\xb0\r3@_\n\x8f\x9c\x14o\x9e\xde\xec\xc3j\xf7\xf3!\xed\xca\xadN\xb3\x04q\xa2\x87\xa9{\xb2\xd7U\x07E\x81y\x13\xaf\x94p\xe3\xff\x99?;L\x1a\xe7g\xb1\x19\x9a\xb9\xa2e\xfaxk\x08\x014p73,\x11\x83\x97\x9c\x80j\xcf>\xa4]\x1b\xabE\x8d\xbcA&$\x0c\xdfL\xff{+\xda\x19\xcb\x95\x89\x98m\x06\xf3\xf5\x14s\xb0\r\xe9\x886\xa1&u(\xae{\xba\xb4\xde_^\x8fV_\xe1x\x83\x85A\xf6-\x85\xd8&M-\xe9\xe0\x11\xfeMuP;\xc4}\xa5\x07\x9a\xbdk\xb9\xc4\x12\xce\xef\x99\xe3\x04\xd2\x1e\xae\xd6\x12\x82\x12\xf4\x83\xc3\xf0XGde\x94Nm^\xf6\x8d\xe0I\x88aeq\xbc\xe3\x15\xb6\xadU]\xf6\x1c\xc4\x96=\x7f!L\x17%ux|\xac\x89\x96C@\x020O6\xe6\x07\xb0lj\xa2Ny\x14e \xaag\xb0m\x10\x0ck\x8b\xd1\xfc+\xc7\xaamNX5\x8e%\x91\xbd?T\xc7#\xbdq\n\xa5\xb5\xba|R\xfc\xfd\xc7\xc4:\xe1L\x90\x99\x01\xbfP\xbf\xe3\x98\xfb\xbbH\xbb0\xd5@\xf5/\'\x84\xd8\xfcH\x04\x955\xd3>\x8cX\x1eG\xcbv\xc7\xeb2\xa8\x87\x1e\xd4+n\xbd\x0b\xa3\x06\xf5\xde\x16?:XG?\x18u*\x96\x8c\rj\xa9\xc3\x08\xd8\xfa_\xa7\r\xb7\x12w\xb3\xaa\xd0!*\xf2PE\xa4\xad6e\x04M\x0b\x9a\xf4+X+=}\xefE\xf3\x9dU0\xa1\xa7\xd2\xc9C\x93n\x80Q\xca\x1a0\x1e\xd5\xc6\xc2F\x07\xa2\xfa\x7f]\x99\xb7QGY\xa0\x15\xaa\'\x1dB\x08\x9a\xceC_R7=\r\xca~\x9d\xbb\x17\xd5O\xb56\xa9\xa0&F\x07_9|\x14\xaf\xed\xed\x9egr\x1d\xb5`\x01\xafdQ\x02\x04\xff\x1cf\xa3\xc4\x895\xc5\xf7\xef\x10\xbe\x9c\xfe\x99U:\\4\xe0\xe4y\xb9\xe2\xd6\x04\xa3\xb8\xd5\xc9\x00\xb5\xda\xbb+Q\x06b\x15I\xa9\x1a\xa2\xb4HY\\\xaeV3\xb9>I]\xf6\xbe\x07\xfan\xd4\x9e \x82\x9e\xfc=:1\x98\xa6\xb4\x18\x8d\xdeG\x1b\x173\x03\xcbE\x83\xfa=b\xea\xbbV%\xe7pC\x05\xb9\xc2\x9bE\xdc\x98V\xc4\x07\xa8\xbfB\xc4\xbbtO\xa6aO\xe2\x17\xaf\xedv\xf2\xe5\xd9y\xf8\x10\xea\xc6\x0c\x1b\x0e\x8d+\xda\xc7\xe7\xf2W\xf6\x93\xe8\xb1\x9e\xa6Q\xf2A\xefZ\xc2%\xf8d\xc9\xe3\xd5\x9b\xef\xbb\x16\n\xe945$\xad||\xaau&U\x81\xa9\xa2\x99\xa7\x14,\x081H+\xaeH\x01\xe2+\x83\x87\xe3\x1cj>\xd1Z\x88g\xd9\x9d\xa9\xfb\x1b\x04\x94\xe1\x87\x19\xea\x96\x01\xc95^\xf5\xeci\xefA\xed\xbd\xef\x94\xa5\xcd\xcd\xae\xd1\xddX\x0f\xcfw)d8`\xd9<\xa4Wrb\xe0\x82\xbb\xd6Mg\n_\xd9\xa6\xab\xad\xf3\x17\x9eE\xeex\xea\x07v\xc2L\x14u\xc4\xbf\xe3\xc6R\x820u\xcf"\xd31b\x8f\'\xd5\xd2\x11b\xd7@\xae\x1d2\xca\xd3V\x16\x88\xf50\x07\xd7\xf0\xcft\xab\xa9\x99\xec\xd1@=\xecn\x94h\x80\x9d\xcd\x1cLS\x17\xb8\xfa;p\xa9\xe3h\xc6\x0e\x1a\xa2\xf0\xbd\xbe\x98i\xf1BMXy\xd4\xee\xff\xeb.\xbf\xa2\xa2Z\x15\x98\x9e\x05\xa0\xac\x19"\x91\xccb\\@\x9b\xee\xa0\xcd0I\\-\xf6\x84\xd4\x02\x18\xfa\xea\x1b\xde\x1a\x8a\x8d\x18u\xc1\xef\xf1\xd6\x84w\xf8\x039\xae\xbf\x9c\x87l\xe728{r\xeay\xe4\xe2:\x93\xce\xe5\xa3\x92\xa1\xab\xe5i\xa08\xea!0\xff?\xd4\xe1\xe6\xcfU\x871\xe8\xc7u\x8bu\xda\x15\x1a\x89\x8f\x05\x17\x02\xec\xd7D\x9a\xe7Ez\x03\xd8\x9e\x11#C!n\xa6FM\xd5\xa5\x86\xbb\x1e\xe0\x83\x7f\xc5\\\x9c \xd1\xd5uu\xac\xfc\xc87\xb1\xcaQ%+\xd5\x82J<\xc1Q@\xd2\xa9T\n\xda`\xa8o\xb4\xa6\xf2\xd0\x0f\xb1\xab0\x9b\x8d\xb0\xe1\xb1\x99_\xd0\xb8\xfdHR0\xf8i\x07\xca\x04\x8d\xa6&D \xf6[L\x15\xad\x91\xd0\xbc^\x83\xef\xb2\xe013\x1a\x92\xc5_e\xa6L\x0b\x03\xc2\xed\x019\x07\xf9}.\xd4\xb9&\xbf\x983\x0ekUREc\x7f\xe1o\xcb\xe7r!h\x0cG\xc0\x80N\x0b\xa3i\xa8qX.\xc0\xfd&\x88T\xf8\xba.J\t_B\\X\x01\xfa\x1a\x94\xde<\xb4\xd2=t\x82\xf5\x18\xa4F"X,w/h\x18&\xd0^p\x022\xd1_\x02\x08\x06\xffR\xc9\xd7\xc0\x1b\xda\xd7\x06\x11\xda\x9c\x81\xbe\xed\xedJ\x02\xfc\x8f\\\x03\']\x0e\xfc\xb10\xf0*\x88\xae+n\x02\xca\xdd\xf2\r2\x86\xf0\x03`\x04F\xce~S3\xff\x9d\x80i\xe1\xdd\xc6\x84C\xe7\x8cz\x17\xd3S\xa9\x05\x7f\xcew\xd7(\x93\xb4A\xf45\x0c\xb4\x969A<,\xe1\xbd\xe8N\x12\xbc\x01\xe8\x92B]\xdb\x0c\xa4G:\xa0\xe3\x0fZ\x86\xcd\x9e\xd5\xc9^P\x11~\x8b\xd2\xd4\x1c>\x1f\x9c\x1d\t\x8d\x0b\xd51\xe8\x04\xdc\xb3\xf3\x85\x9f\xa1g\x87\xab\xa1%0\x18a\xe8D\xa3/\xd5y\xeahV\x8e\x85\x93\xb7\xf8|\xbe\x1f\x10\xa7=\xc1\x14\x0b\xf18\xd6\x8fw\xdd\x89\xae\xacUFi\xfb4\x87\xf2X\xf9\xb8\x18\xdd\x9cK\xe8]\r\xbf\x9b"\xb9\x1d.>\xde\xaf\xa4\x9fp\x01X\xe6\xcb+\xe6\xfa\xe3J\x94\xedG\xb4\x90\x86\x88\x1f\xcd\xd6\x81\xfd\x11\xc4\x1d\xc1\xa2`q\x12\x19G\xcb\xab:vB\xed,\xbb\x7f\'\xb9s\x80W\xbf\x132t^\xda~_h\xb2\x00\xca\x90+r\xdc\xe8\xba\xf4uXl\x8dq\xac\xe0\x07\xb00_\x15\xc9\x0c\xc3Ig\xb6LZ\x7f\xde\xa0\xd8\xd2\x06\xd2\xfa~\xf6\xb1t\'\xc3\x8b-\xf2\x1d\xb8\xdaN\xd9\xa9\xff3\xee\xf6f\xbet\x8e\xe3\xa3\xec\x0c\xe4A\xd9C\xcfe\x97\xc5u\xf6R\xc4\x15\x0c\x17eC\xe7\xfe{\x8c\x88\xac\xab\x91\xe6\xd5\x13\x16\x93\xfbJ\xc6\xc1\xb8\xfeb\xe3j\x8cI4\xf1\xec\xf6\xd3|2\xed2\xd3\x86\x7f\xdc\xd2\xc8\xea\xe1\x14q\x96\xae7~9\xcf\x89x>]I\x16\x0c\xf111\x13\xf5\xd4\x13\xf2\xde\x17\xd6vJ\x00\xf4K\xa0/\n\x87\x06\xb8@\\\xb6\xa5y\xb0\xcb\x9f\xf4O\xe7Gyh\xcc\x8b0\x9e=\xfa\xd9@\xa2\x06\rj\x98\xc9Z\x0cK\xe8sO0\xc4-^4j\x0b\xd3\xa0w\xce\xde\xef`\x1dg\xdc\xf3L\xedQT4\xd1\xbc\xe1\xcdZk\x90\xee\x8c=\xcb\xfa88\xf7\xa5\xaa1\xa00K\xd0d}\xc6\xde\xdbnx\x1fW\xed|p\xde\xc7\xa9\xbf\xe68\xa5\xf8\x90\xbaG\xfd\x81\xb5x\xf0\xa78\xd0\x19\xe2\x8a$3\xa06[\xdd)\xb7W\xaar\x9e;\x9d\x1e\x17oV\x88\xf1\x91\x11Cw\x96_9\xf2\xc9\xec\x10W\x0c\x0f\xf4i$\x86\xbd\xdfg\xf7\x18\xa6\xb6J\xa3D\xc5(\x85\x8bp\xec\xbdf\x03\x11\xfe\xd4\xaeK\xea\x15\xbb\x9c\xeb\xce\'[,\xc3}\x9c\x82\xed1\x93\xe4\x9f\xc3>[}E\n\\\x01\xc1\xd3\x9e\xb7\x82\x87C\xeel\x16\x17\x13\x8fD\x06\x0c\x8b\xa2\x0c\x8e\x8e3\x0b[$\xcdQN\x12\xee\x1d\xa4D\xf4\xcf\xa0xW\xd1\x07\x1e\xa4\xa4\xb4\xff`F9\xca\xa0\xa6\xd2a%\x80\xcei\xba\xe3z\xd85\xbb\xef-\\2\xae2q\xcc\x9a\x7f3Fyj\x9a\xdb]O\xc9| \x014\x9f\x12\xfb\x1f\xd8_\x193g\x07Nn\x8a\xc4a\x99\xa2\xca\xf5\x99(udOeo]\xf46\x9b\xcbD"^\xa4Y\x0c\xf1\xe4\xab\xb1\x10\xd3 \x9c\xf5\x1b\x07\xd9^\x84\xea\xc3\xd9R\xfc4e\r\x85\xd1K\x94\r\xf9\xc0\x1a\tOF\x07pX\x9b\x06\xfe\x81X\xeeb\xb5|/@8\xe0\x1btK\xb5\xa8!\x89\xb7tO\xe9\xf7k\x9f\xaeY\xe4^\xd8}\xab\xe3s\xbb\xa9i\xb0o\xcb\xfa\xf7\xaa\xa5\xf4\xd8\x00]\x15\x93\xfc\r\x14!N\x84\x19\x86R\n\x81/\xe1\x8b\x8f\\\xf1\x11\x9a\x0f\xf8\x00r\x8a\xc5\x11\x9b\xe5\x0b\xfe9c\xac\xe6]y\x90\xa2{s{\x85\xb2\x1e\xe2s\xdaJ\x8d\xc7\xfb\x93(\x17F\x07O\x04Zw\xc7\xdc\x98r@r\x81\xc8\xea\xc3\x00\xa6\xe8\xf0T\xc5\xc4\xdb\xdc\xf8\x95@\xec\x96\x13\xc7\xe3us\x810\'\xd0d\x9e&\x15\xe2~\x8d#\x03\x14\xb4"\x03\x8f\xaa!\xb5\xe2\xa1^M\xf4\x03\x1a\xe9\x00\xf3O\x89\ng\x82\xdb\x05\xc1\x01\xbd\xdc\xc9\x7f\x99p@<\xd6\x8e=\x01\xf0e@VJ\x13j\xca{V\xf32\xdd\xcaS\xb8\xe7\x08\xe8F7s\x19J6Q\xdde\x02\n\xad\xde\x8e\x0c1\xfd\xd2\xd5\xa7\x8e\xd2\xc9\x84\xd2\x18\x84\x01\xb4\x03\xb5\x15\\\'\t\x051&\xf4n\xf4\xdf\xb5\\\x1a\xb1\x92\xb3i\xf2\xab\x8as\x10\xe8!\xab\xc4x\x17\x8e\xe9\xbae\xa21L\xb6\xd9ap\xbc\xb8\xf4\x7f\xee\xe3Q\x97Zh\xab%\n\xa5$^\xc0\x94z\\\xa5\x9aA\xe5\xd5Dd\xb7"\x7f\x05[a\xacpjW\xf3\xbe\x81X]\xe4,p A\x90\x04\xaf\xbb\xac\xc5\xc4\x01\x84\xa1&\xc6c\x11\r!Z\xbb\xa07d5$\xa8\'~+\x1b\x8c\xf9\r\xf0\x04\xb7\xbb|\x1et\x08\x86\xfbF6i\'\xfd\xc1Va\xa4\x86i\xacH\xa1K\x95\x1d\xd9\xc6\x88\x9cp\x93\xe3\x9e\xed\xa0\x85\xfb\xc4wP\xee\xd4\\~\x81\x02k\x0fa\xab\xd1\xd0\x8e\xd7\x1c\xd3\x96:\x10\xbf"\xb8J\xdb\xa9\xb6\x80\xa2\xab8\x89\xed\xcd\xbb\xa7\xb3=\xf3\x1f\xb6\xc2\x1cT?\x14-\xa0`lm}\xdf\xc5$\xdd9\xd9\x04\t\xd3)\x00\x1f8\x130U\xc4I\xf5q\xce\xcb\x97+%\x8fS\x17v\x92\xbb\xe7\x80\xccF)\xd2^\x16\x8d-k\xed\x85\xe2\xda\x92\x08"\x88\xd2\x84\xacU?\xc7\xe2BA\xe9\xb9\xcf\xed\x06\xdb,\x01j\xd1\xa9\x16ZM\xb4=\xb5\xe3\xd1\xa4o\xd2}v\xd3\xa8\xf2\x82\xd1\x08u\x1e\xb2\xa3s\xa5I\xed!\xed\x7fq\x1dSEaG\xdb\xcd\t;\xac\xe7\xb9n\x8d\x88\x88\x83\xc6\xf5\x03\xec\x13"V\xe4;\x01T8\x89\xde\x9aB\xcb\x1f\t\xc5\xee\xee\xafW\x17IiBw\xce\xce\xaexg\x97K\xefU\xabo=\xd0\xa3\x04\x06X(\xeb]\x83"\x00g\x94\xfe\xf1\x84U~\xcf\xf2\x81\x06\x92C=Re \xd6[\xd4\x0e\xda\xab\xf0\x12\x8e\xf5\x02\xebO\xeb|\xba\x13\xaf}B9\xa8\xf7z_n7\xf3)\xa3G\xbb^\x99\x9c_\x02\xf3jj\xdd\xfdZ\xb3(r\r\xe1\x81Dl\xfc\xc5\x1b\xe6\x15\x11\xab\xfaO@F\x01\xfa\xdf\xf8l\xa0g\xfe\xfb\x06\t\xb0\xb9\x07C\xa7\x17t\xd2$C\xc5\x02<\x7f\x9f\x86f\x8aW\xb8\xb2\xe1\xf6\x00g\x8ej\xaaK\x1eh\xae\x89\xfc\x84\x87C\t\xbb\xfe\xff\xde\x1e\xb1L\x95\x14\xdd\xe3\xe5\x88^\xbd\xb1\xd6\x91\x9e\xd3I\xee\t\x83\x12\xbf!(\xaa\xc7s\xd1zIU\x97b(\x8dn\xc3v\x16]I2*-\x11% Q\xb0\xb2^,a\x05\xa0B\x00\x06\x0cy\xbbA\xe2I\xa4\x8b\xea~\xc4\xb4\xc1\x88\xda\x81\x18}M\x18 \xe88\xac\xbbc\xd9\xf1\xeb"mk\x8dz\x87Pc\x8ep\xd5U\xaa\xeaZ_u"#\x8d\x87\xafp\xfb\xe1\x82\xc8\xd7BR>\x8d\xbe\xd5V\xba\x8a\xf6s\x91r\xde\x97\xfb\x1f\x1b}\xb3\xcb\xaa500H\xf8\xbbz\x9f\x02\x8aJ\xbb\x8d\xed\x1d\xecB\xe37b;\x13>\x07\xd3/,dZ$\x0e<\xd7\xb16\xe71\xaa\x15\xa2b\xf9.\x1c\x82\xa3\x0b\xa0\x115i\x98QQ\x9d\xd8\x18\xa7\xd5\xfbU\xbb*K\xe5\x86\xd0+q:|\x92\x9a\xf6/\xd9\xa1\xc3\xda\xe4\x8e\x1f\xf1\xa9,c\x8d\xc5h8t\x9d\x15\x04\x9c\x12`y\x00O\x8d\xdc\xa3\xb2\x95\x1e\x90\xd9#bP\x0f\xfb\x14\x07U@_\xa7\x07\x8d]M93h`x.\x0f\x13\x90\x9e>\x9c\x18\xa4\xb81\n\x81\xb1\x1a\x99S(\xbd#<P\xe9j\x8e\xf4a\xd3\xa7\x8f\xec\xe8\xdaEZ\x9c\xdf\x96)\xc4\xa7\x0cJ[\xc3\xde\xe5\xa8\x8a\x95Z\x88\x11\xb6I,\x8bW\xc4\x00\x86"\x81\xf7\x1b\xebM\xa9\x81,\x10\xe8RVm\x86]\xcf\xf5\x1c\xda\xf4\x96\xf0\xdfLS\xea\x8d\x9b\xd4\x89\xd1\xaf\xcen\x08\xffl\xd2\xdcmi\xa4\t\x8c\xdb\xc6m\x89\x80NA\xfd\x1bT\xa3\x9b\x02\xfe\x13\xfa\xdb\xfa\x7f\xd6\x10\xa5\xe4\xbe\xach\x04\x8b\x8c{\xfe[\xd7\x92\xb3-\xa6x@\xc6\x07\\\xba\xeb\x04\xa7\xd6S\x1fv\x1e"\xe1l\x87>\xd71\x85\xdb\x1b\xf2\xa2 \xf5\xb0O\xa9\x11\xecR\xbd\x1eY\xe3\xc4KG\xd5\x02\x86\x1d;\xa5o\x08\x1d\xc4_\xb7\xd2Q\x0b\xea\x0b\x9d\xed\x86\x07:\xe8\x9b\xc2|W\xfbN0H\x02AC\x15\xc4\xe6\x96\xda\x12\x89\x1d\xe7\x02EFSE\r\xac?x\x19\x12Kb\rXO\xa4\x81K\xac\xdb\xb5\x0eRo\xeb\x9b\x97\xd3h\xe5\x13\xeb9ohy#\xea\xdcL\xe0\xd3,\x92\xc5EN\xfdJ\xb4)\xfe\x0b\xca\xaf\xa7\x06\xea\xda)H\xbb\xea\xe8$^6\xb9\xe4\x12\x86\xc8iU\x1e\xf8U\x89VQ\xb3dy\xb6\x86o\x8a)\xb6\xb8y\x8cQ v\xc3~Lz\xd7\x9b\x85\xae0\xd7\xd7\xae\xaf\x1a\x12z\x88\x0c+\x97\x94F\xed\x9b\x1f\x81\xe4\xde\xd8a\xf2%\x97@)[R\xfc\x8dm\xdb\x0b\xde\xedT\x15\x13\x0f\xd4qH\xde \xbeL\xe8\xe7\xf2\xe8q\x8f\xc0!\xcc\x15\xd93\x119\x98a\x1do\xdeVd\x85L$\xecM\xff\xfe\x8e:[@\xe7\xb0\x8e7\x11\xaa\xaf\x9fJ\xe13\xd0}y2\x96\xbe\xef\x9b,\x8atI\xb0\xee\xd2\x0f\xfe1O\xdf4}\x00l\xd4\xa5\xce\xab\xac\x92W\xa7bp\xf8\t\x8c\x95<\xe4\xec\xe8O\x17?\xb6\xcc\xbb\xdd\xce\x9dF\x93c9Q\xee\xef\x9c\xa3#\x14fW\x9e\xfe\x8e\\o\xb9\x1b1\xdc{')
|
clickzetta_dbutils/version.py
CHANGED
@@ -1 +1,3 @@
|
|
1
|
-
|
1
|
+
# Pyarmor 9.0.8 (trial), 000000, non-profits, 2025-02-21T12:00:33.073669
|
2
|
+
from pyarmor_runtime_000000 import __pyarmor__
|
3
|
+
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00m\x01\x00\x00\x12\t\x04\x00*%\xe8\x98\xde\x10U\xb2\xd6.WM\xf5^\xa0u\x00\x00\x00\x00\x00\x00\x00\x00\xdb6W\x04\xd4ha){\x07\x1d\x1d\xb19\xaelC0\x7f\x89\xa6\xeb\x80y\x0bzi!<<3Hk\xd3\xbdc\xb9\xc5\x92\x8d\x8f\x8f\xa8\xb1Mxv{?!\xbb\x0c\nzTG\xbbtG\x1e\xe6LRF-\xe66\xcf\x15\x13\xd6=z\x93&\xdb\xd3\xf4\xaa>U.\xa55;\xa5\xa0\xef\xe1\xb5\x11\x82\x9a\xcd\x0c\x95\xb0\xc2\xd1\xc0\xb01\xcc#\x90\xdc\xecN\x1c2\xea;\x8fO\x1b\xb6\x1dM\xd6\x96\x13\x11\x051\x19C\xe5@\xfbP\xd4\'e\xbb\xd0\x93\xae~/\xb8\xec-\xef\xd8\x19\xe0\xce([\x04\xd4Ld\xe3\x0b\x8d|>r\xc1\xb1&\xda\x14\xa9XRzX\x7f\xa18.\x9a\x121\xc4\x0b"\xc5\x88\xae\xaa\xbd\xfe?\xc6\xe2\xdd\x06\xfd5\xf5\x950\xdbE\xce\xd1\' b\x06\xa7`\xb2\x99b\x1d"?j\x10\xe4(\xc89U\xee_\x07/\x8b~\xda\xc1{;-(\xb2i\x03\x0eX\xe4\x82\xe7\x17\xf3\xe3v`L6\x04\x93\xe2\x1a\xa8\xc3b\x98\xf3\xb8\x06h0\xc3\xa3\xd9@5-\x1cq\xe6\xb4\xd5\xc4\xac\x9e\xef\x0f\xab\xdf\x1d-\xe0\xd0\xb2A\xe3S<\xb2\nl\xbb>\x94\xbc\x90B\x8b\xb1\x01\x9a\xf4\xd8\x1b|\xaa:G\x03\xbeR\x98\x80">a;`\xa5\x7f\xe8\xc6\r\xcf\xad\xe3\xf0E\xbfp0\x14U\xdfN\xc7\x14\xe0B\xfa "\xa5A 78\x04\x9e9\x96\xf6 \x1f8Y\xb8\x94\xce\x03\x06\x97\x8b\x9e\x13\x8a\xf1.')
|
@@ -1,17 +1,19 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: clickzetta-dbutils
|
3
|
-
Version: 1.0.
|
3
|
+
Version: 1.0.21
|
4
4
|
Summary: clickzetta dbutils
|
5
5
|
Author-email: "lin.zhang" <lin.zhang@clickzetta.com>
|
6
6
|
Project-URL: documentation, https://www.yunqi.tech/
|
7
7
|
Platform: Posix
|
8
8
|
Platform: MacOS X
|
9
9
|
Classifier: Development Status :: 3 - Alpha
|
10
|
-
Requires-Python: >=3.
|
10
|
+
Requires-Python: >=3.10
|
11
11
|
Requires-Dist: sqlalchemy<2.0.0,>=1.4.0
|
12
12
|
Requires-Dist: numpy==1.24.4
|
13
13
|
Requires-Dist: psycopg2-binary
|
14
14
|
Requires-Dist: mysql-connector-python
|
15
|
+
Requires-Dist: crypto
|
16
|
+
Requires-Dist: pycryptodome
|
15
17
|
Provides-Extra: dev
|
16
18
|
Requires-Dist: pytest==8.2.1; extra == "dev"
|
17
19
|
Requires-Dist: build; extra == "dev"
|
@@ -0,0 +1,17 @@
|
|
1
|
+
clickzetta_dbutils/.DS_Store,sha256=BAZfmI8Al-lW7frqAAU9awnYpuHOen2sk2DhHY8OWRE,6148
|
2
|
+
clickzetta_dbutils/__init__.py,sha256=l5TtbeoO59OSRqU8xSwqu1jXO2cDFDynN7mkJYcG_Zc,2201
|
3
|
+
clickzetta_dbutils/db_utils.py,sha256=A3xx1PhuR8oQEggWCN6alkI8tD-ea6DppBB9tT4UoMs,49693
|
4
|
+
clickzetta_dbutils/version.py,sha256=ANPLsWFWGyUXEyVzgQ_-nf7WNF6QLw_UTLQj_QyrtR0,1370
|
5
|
+
clickzetta_dbutils/__pycache__/AESCryptor.cpython-310-pytest-8.2.1.pyc,sha256=FtkRhza1Nu31OpBZIrpabpYCjojcoTvk0t1qW_jSmag,1593
|
6
|
+
clickzetta_dbutils/__pycache__/__init__.cpython-310.pyc,sha256=wtQzjrZAuzzIl3AVNe5J-UXhXohs99JQ-2Uww0O0ATk,483
|
7
|
+
clickzetta_dbutils/__pycache__/db_utils.cpython-310.pyc,sha256=PrZqy-ASUR6mUWGMZC6asJ7yaW_2N5tyzTWxGLzC-aE,12042
|
8
|
+
clickzetta_dbutils/__pycache__/version.cpython-310.pyc,sha256=VJFGnXC2jzHbXgBE1WCt8Oxsu5LU0xj_ULhkf-Hwk3Y,705
|
9
|
+
pyarmor_runtime_000000/__init__.py,sha256=TNVOi9I3kePSKopAbhD9Cbirqzg2yiCHIcmWXViH4Vc,1953
|
10
|
+
pyarmor_runtime_000000/__pycache__/__init__.cpython-310.pyc,sha256=Ntx0zFe7cir3y94zzjYwWE7-_rdoNK6UbnYQJOj7SS4,1649
|
11
|
+
pyarmor_runtime_000000/alpine_x86_64/pyarmor_runtime.so,sha256=sCLz2Nukjqx1wIbweO9xtXWZIUZhQl5c3bF1K6Vq1O8,676912
|
12
|
+
pyarmor_runtime_000000/darwin_universal/pyarmor_runtime.so,sha256=gCWtfCGB2-gPJ07lE011mNd9kS0hNsB2-nOlFs2V_lw,1601792
|
13
|
+
pyarmor_runtime_000000/linux_x86_64/pyarmor_runtime.so,sha256=WDL51-TNh6cRIL066Ne1nQCEjw2i5pg50gPCx26cxow,792360
|
14
|
+
clickzetta_dbutils-1.0.21.dist-info/METADATA,sha256=G4bQz1G1kSayulTvQ_QMtmO_e2qTpTKd5s5hZYzEQyQ,904
|
15
|
+
clickzetta_dbutils-1.0.21.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
16
|
+
clickzetta_dbutils-1.0.21.dist-info/top_level.txt,sha256=iN29E2uT8disQHsSRGtRU0Gv71R5q51J3mA4W1_MEoU,42
|
17
|
+
clickzetta_dbutils-1.0.21.dist-info/RECORD,,
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# Pyarmor 9.0.8 (trial), 000000, 2025-02-21T12:00:33.070827
|
2
|
+
def __pyarmor__():
|
3
|
+
import platform
|
4
|
+
import sys
|
5
|
+
from struct import calcsize
|
6
|
+
|
7
|
+
def format_system():
|
8
|
+
plat = platform.system().lower()
|
9
|
+
plat = ('cygwin' if plat.startswith('cygwin') else
|
10
|
+
'linux' if plat.startswith('linux') else
|
11
|
+
'freebsd' if plat.startswith(
|
12
|
+
('freebsd', 'openbsd', 'isilon onefs')) else plat)
|
13
|
+
if plat == 'linux':
|
14
|
+
if hasattr(sys, 'getandroidapilevel'):
|
15
|
+
plat = 'android'
|
16
|
+
else:
|
17
|
+
cname, cver = platform.libc_ver()
|
18
|
+
if cname == 'musl':
|
19
|
+
plat = 'alpine'
|
20
|
+
elif cname == 'libc':
|
21
|
+
plat = 'android'
|
22
|
+
return plat
|
23
|
+
|
24
|
+
def format_machine():
|
25
|
+
mach = platform.machine().lower()
|
26
|
+
arch_table = (
|
27
|
+
('x86', ('i386', 'i486', 'i586', 'i686', 'x86')),
|
28
|
+
('x86_64', ('x64', 'x86_64', 'amd64', 'intel')),
|
29
|
+
('arm', ('armv5',)),
|
30
|
+
('armv6', ('armv6l',)),
|
31
|
+
('armv7', ('armv7l',)),
|
32
|
+
('aarch32', ('aarch32',)),
|
33
|
+
('aarch64', ('aarch64', 'arm64')),
|
34
|
+
('ppc64le', ('ppc64le',)),
|
35
|
+
('mips32el', ('mipsel', 'mips32el')),
|
36
|
+
('mips64el', ('mips64el',)),
|
37
|
+
('riscv64', ('riscv64',)),
|
38
|
+
)
|
39
|
+
for alias, archlist in arch_table:
|
40
|
+
if mach in archlist:
|
41
|
+
mach = alias
|
42
|
+
break
|
43
|
+
return mach
|
44
|
+
|
45
|
+
plat, mach = format_system(), format_machine()
|
46
|
+
if plat == 'windows' and mach == 'x86_64':
|
47
|
+
bitness = calcsize('P'.encode()) * 8
|
48
|
+
if bitness == 32:
|
49
|
+
mach = 'x86'
|
50
|
+
mach = 'universal' if plat == 'darwin' else mach
|
51
|
+
name = '.'.join(['_'.join([plat, mach]), 'pyarmor_runtime'])
|
52
|
+
return __import__(name, globals(), locals(), ['__pyarmor__'], level=1)
|
53
|
+
__pyarmor__ = __pyarmor__().__pyarmor__
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -1,7 +0,0 @@
|
|
1
|
-
clickzetta_dbutils/__init__.py,sha256=8c39hS6EZAc5gp-U0Jw2p6Fvc2VSZ0Jnw_MCQtCt9og,400
|
2
|
-
clickzetta_dbutils/db_utils.py,sha256=GuINeCq5FJlvD3Dma-3-GwZffhE6aM3UWIAEGME0lzs,13662
|
3
|
-
clickzetta_dbutils/version.py,sha256=7yiPGp334fwhzFzJY1eZEZGBwKTzqWutAVnsTPuCvFE,22
|
4
|
-
clickzetta_dbutils-1.0.17.dist-info/METADATA,sha256=WPxIY-kyi6Ex5SZnpZfh7UOJBqXotoGdpjpPJFWH-u4,853
|
5
|
-
clickzetta_dbutils-1.0.17.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
6
|
-
clickzetta_dbutils-1.0.17.dist-info/top_level.txt,sha256=8o5KqMSg9pxnPNejHjMaqZV2vEDvwvsz2GdChZI0N6I,19
|
7
|
-
clickzetta_dbutils-1.0.17.dist-info/RECORD,,
|
@@ -1 +0,0 @@
|
|
1
|
-
clickzetta_dbutils
|
File without changes
|