e6data-python-connector 2.3.9rc9__tar.gz → 2.3.9rc11__tar.gz
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.
- {e6data_python_connector-2.3.9rc9/e6data_python_connector.egg-info → e6data_python_connector-2.3.9rc11}/PKG-INFO +3 -3
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/README.md +1 -1
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/e6data_python_connector/cluster_manager.py +1 -1
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/e6data_python_connector/e6data_grpc.py +22 -19
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11/e6data_python_connector.egg-info}/PKG-INFO +3 -3
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/e6data_python_connector.egg-info/requires.txt +1 -1
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/setup.py +2 -2
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/LICENSE +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/MANIFEST.in +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/e6data_python_connector/__init__.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/e6data_python_connector/cluster_server/__init__.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/e6data_python_connector/cluster_server/cluster_pb2.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/e6data_python_connector/cluster_server/cluster_pb2_grpc.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/e6data_python_connector/common.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/e6data_python_connector/constants.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/e6data_python_connector/datainputstream.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/e6data_python_connector/date_time_utils.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/e6data_python_connector/dialect.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/e6data_python_connector/e6x_vector/__init__.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/e6data_python_connector/e6x_vector/constants.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/e6data_python_connector/e6x_vector/ttypes.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/e6data_python_connector/exceptions.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/e6data_python_connector/server/QueryEngineService.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/e6data_python_connector/server/__init__.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/e6data_python_connector/server/constants.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/e6data_python_connector/server/e6x_engine_pb2.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/e6data_python_connector/server/e6x_engine_pb2.pyi +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/e6data_python_connector/server/e6x_engine_pb2_grpc.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/e6data_python_connector/server/ttypes.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/e6data_python_connector/strategy.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/e6data_python_connector/typeId.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/e6data_python_connector.egg-info/SOURCES.txt +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/e6data_python_connector.egg-info/dependency_links.txt +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/e6data_python_connector.egg-info/entry_points.txt +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/e6data_python_connector.egg-info/top_level.txt +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/pyproject.toml +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/setup.cfg +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/__init__.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/analyze_38_nines.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/analyze_all_cases.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/analyze_binary.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/analyze_correct_value.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/analyze_fields.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/check_decimal_errors.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/cleanup_test_files.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/debug_38_nines.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/debug_binary.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/final_test.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/move_tests.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/quick_test.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/test_38_nines.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/test_all_decimal128_cases.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/test_cluster_manager_efficiency.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/test_cluster_manager_none_strategy.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/test_cluster_manager_strategy.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/test_comprehensive.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/test_current_implementation.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/test_decimal128_binary_parsing.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/test_decimal128_parsing.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/test_fix.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/test_improved_parsing.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/test_known_case.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/test_manual_analysis.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/test_mock_server.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/test_multiprocessing_fix.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/test_new_implementation.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/test_specific_binary.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/test_strategy.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/test_strategy_logic.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/test_strategy_persistence_fix.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/test_strategy_sharing_fix.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/test_user_binary_value.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/tests.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/tests_grpc.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/validate_decimal128.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/validate_implementation.py +0 -0
- {e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/verify_decimal_fix.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: e6data-python-connector
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.9rc11
|
|
4
4
|
Summary: Client for the e6data distributed SQL Engine.
|
|
5
5
|
Home-page: https://github.com/e6x-labs/e6data-python-connector
|
|
6
6
|
Author: e6data, Inc.
|
|
@@ -24,7 +24,7 @@ Requires-Dist: python-dateutil==2.9.0.post0
|
|
|
24
24
|
Requires-Dist: pycryptodome==3.19.1
|
|
25
25
|
Requires-Dist: pytz==2024.1
|
|
26
26
|
Requires-Dist: thrift==0.20.0
|
|
27
|
-
Requires-Dist: grpcio
|
|
27
|
+
Requires-Dist: grpcio>=1.74.0
|
|
28
28
|
Requires-Dist: grpcio-tools
|
|
29
29
|
Dynamic: author
|
|
30
30
|
Dynamic: author-email
|
|
@@ -38,7 +38,7 @@ Dynamic: summary
|
|
|
38
38
|
|
|
39
39
|
# e6data Python Connector
|
|
40
40
|
|
|
41
|
-

|
|
42
42
|
|
|
43
43
|
## Introduction
|
|
44
44
|
|
|
@@ -365,7 +365,7 @@ class ClusterManager:
|
|
|
365
365
|
# Retrieve the current cluster status with strategy header
|
|
366
366
|
try:
|
|
367
367
|
current_status = self._try_cluster_request("status")
|
|
368
|
-
except _InactiveRpcError:
|
|
368
|
+
except _InactiveRpcError as e:
|
|
369
369
|
return False
|
|
370
370
|
if current_status.status == 'suspended':
|
|
371
371
|
# Send the resume request with strategy header
|
|
@@ -137,9 +137,18 @@ def _strategy_debug_log(message):
|
|
|
137
137
|
print(f"[E6DATA_STRATEGY_DEBUG] {time.strftime('%Y-%m-%d %H:%M:%S')} - {message}")
|
|
138
138
|
|
|
139
139
|
|
|
140
|
+
def _get_normalised_strategy_with_validate(strategy):
|
|
141
|
+
if not strategy:
|
|
142
|
+
return False
|
|
143
|
+
# Normalize strategy to lowercase and validate
|
|
144
|
+
normalized_strategy = strategy.lower()
|
|
145
|
+
if normalized_strategy not in ['blue', 'green']:
|
|
146
|
+
return False
|
|
147
|
+
return normalized_strategy
|
|
148
|
+
|
|
149
|
+
|
|
140
150
|
def _get_shared_strategy():
|
|
141
151
|
"""Get or create the shared strategy storage."""
|
|
142
|
-
global _strategy_manager, _shared_strategy
|
|
143
152
|
return _local_strategy_cache
|
|
144
153
|
|
|
145
154
|
|
|
@@ -158,11 +167,8 @@ def _get_active_strategy():
|
|
|
158
167
|
|
|
159
168
|
def _set_active_strategy(strategy):
|
|
160
169
|
"""Set the active deployment strategy in shared memory."""
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
# Normalize strategy to lowercase and validate
|
|
164
|
-
normalized_strategy = strategy.lower()
|
|
165
|
-
if normalized_strategy not in ['blue', 'green']:
|
|
170
|
+
normalized_strategy = _get_normalised_strategy_with_validate(strategy)
|
|
171
|
+
if not normalized_strategy:
|
|
166
172
|
return
|
|
167
173
|
|
|
168
174
|
with _strategy_lock:
|
|
@@ -195,11 +201,8 @@ def _clear_strategy_cache():
|
|
|
195
201
|
|
|
196
202
|
def _set_pending_strategy(strategy):
|
|
197
203
|
"""Set the pending strategy to be used for the next query."""
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
# Normalize strategy to lowercase and validate
|
|
201
|
-
normalized_strategy = strategy.lower()
|
|
202
|
-
if normalized_strategy not in ['blue', 'green']:
|
|
204
|
+
normalized_strategy = _get_normalised_strategy_with_validate(strategy)
|
|
205
|
+
if not normalized_strategy:
|
|
203
206
|
return
|
|
204
207
|
|
|
205
208
|
with _strategy_lock:
|
|
@@ -244,11 +247,8 @@ def _invalidate_all_sessions():
|
|
|
244
247
|
|
|
245
248
|
def _register_query_strategy(query_id, strategy):
|
|
246
249
|
"""Register the strategy used for a specific query."""
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
# Normalize strategy to lowercase and validate
|
|
250
|
-
normalized_strategy = strategy.lower()
|
|
251
|
-
if normalized_strategy not in ['blue', 'green']:
|
|
250
|
+
normalized_strategy = _get_normalised_strategy_with_validate(strategy)
|
|
251
|
+
if not normalized_strategy:
|
|
252
252
|
return
|
|
253
253
|
|
|
254
254
|
with _strategy_lock:
|
|
@@ -537,8 +537,9 @@ class Connection(object):
|
|
|
537
537
|
# Check for new strategy in authenticate response
|
|
538
538
|
if hasattr(authenticate_response, 'new_strategy') and authenticate_response.new_strategy:
|
|
539
539
|
new_strategy = authenticate_response.new_strategy.lower()
|
|
540
|
-
|
|
541
|
-
|
|
540
|
+
normalized_strategy = _get_normalised_strategy_with_validate(new_strategy)
|
|
541
|
+
if normalized_strategy and normalized_strategy != active_strategy:
|
|
542
|
+
_set_pending_strategy(normalized_strategy)
|
|
542
543
|
_apply_pending_strategy()
|
|
543
544
|
self._session_id = None
|
|
544
545
|
self.close()
|
|
@@ -584,7 +585,8 @@ class Connection(object):
|
|
|
584
585
|
# Check for new strategy in authenticate response
|
|
585
586
|
if hasattr(authenticate_response, 'new_strategy') and authenticate_response.new_strategy:
|
|
586
587
|
new_strategy = authenticate_response.new_strategy.lower()
|
|
587
|
-
|
|
588
|
+
normalized_strategy = _get_normalised_strategy_with_validate(new_strategy)
|
|
589
|
+
if normalized_strategy and normalized_strategy != active_strategy:
|
|
588
590
|
_set_pending_strategy(new_strategy)
|
|
589
591
|
_apply_pending_strategy()
|
|
590
592
|
self.close()
|
|
@@ -620,6 +622,7 @@ class Connection(object):
|
|
|
620
622
|
cluster_uuid=self.cluster_name,
|
|
621
623
|
timeout=self.grpc_auto_resume_timeout_seconds
|
|
622
624
|
).resume()
|
|
625
|
+
print('starus', status)
|
|
623
626
|
if status:
|
|
624
627
|
return self.get_session_id
|
|
625
628
|
else:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: e6data-python-connector
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.9rc11
|
|
4
4
|
Summary: Client for the e6data distributed SQL Engine.
|
|
5
5
|
Home-page: https://github.com/e6x-labs/e6data-python-connector
|
|
6
6
|
Author: e6data, Inc.
|
|
@@ -24,7 +24,7 @@ Requires-Dist: python-dateutil==2.9.0.post0
|
|
|
24
24
|
Requires-Dist: pycryptodome==3.19.1
|
|
25
25
|
Requires-Dist: pytz==2024.1
|
|
26
26
|
Requires-Dist: thrift==0.20.0
|
|
27
|
-
Requires-Dist: grpcio
|
|
27
|
+
Requires-Dist: grpcio>=1.74.0
|
|
28
28
|
Requires-Dist: grpcio-tools
|
|
29
29
|
Dynamic: author
|
|
30
30
|
Dynamic: author-email
|
|
@@ -38,7 +38,7 @@ Dynamic: summary
|
|
|
38
38
|
|
|
39
39
|
# e6data Python Connector
|
|
40
40
|
|
|
41
|
-

|
|
42
42
|
|
|
43
43
|
## Introduction
|
|
44
44
|
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
|
|
13
13
|
import setuptools
|
|
14
14
|
|
|
15
|
-
VERSION = (2, 3, 9, '
|
|
15
|
+
VERSION = (2, 3, 9, 'rc11',)
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
def get_long_desc():
|
|
@@ -49,7 +49,7 @@ setuptools.setup(
|
|
|
49
49
|
'pycryptodome==3.19.1',
|
|
50
50
|
'pytz==2024.1',
|
|
51
51
|
'thrift==0.20.0',
|
|
52
|
-
'grpcio
|
|
52
|
+
'grpcio>=1.74.0',
|
|
53
53
|
'grpcio-tools',
|
|
54
54
|
],
|
|
55
55
|
classifiers=[
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/analyze_38_nines.py
RENAMED
|
File without changes
|
{e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/analyze_all_cases.py
RENAMED
|
File without changes
|
{e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/analyze_binary.py
RENAMED
|
File without changes
|
{e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/analyze_correct_value.py
RENAMED
|
File without changes
|
{e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/analyze_fields.py
RENAMED
|
File without changes
|
{e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/check_decimal_errors.py
RENAMED
|
File without changes
|
{e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/cleanup_test_files.py
RENAMED
|
File without changes
|
{e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/debug_38_nines.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/test_38_nines.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/test_comprehensive.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/test_improved_parsing.py
RENAMED
|
File without changes
|
{e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/test_known_case.py
RENAMED
|
File without changes
|
{e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/test_manual_analysis.py
RENAMED
|
File without changes
|
{e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/test_mock_server.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/test_specific_binary.py
RENAMED
|
File without changes
|
{e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/test_strategy.py
RENAMED
|
File without changes
|
{e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/test_strategy_logic.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/validate_decimal128.py
RENAMED
|
File without changes
|
|
File without changes
|
{e6data_python_connector-2.3.9rc9 → e6data_python_connector-2.3.9rc11}/test/verify_decimal_fix.py
RENAMED
|
File without changes
|