pydpm_xl 0.1.39rc25__tar.gz → 0.1.39rc26__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.
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/PKG-INFO +1 -1
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/Utils/ast_serialization.py +25 -46
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/__init__.py +1 -1
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/pydpm_xl.egg-info/PKG-INFO +1 -1
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/pyproject.toml +2 -2
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/LICENSE +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/README.md +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/AST/ASTConstructor.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/AST/ASTObjects.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/AST/ASTTemplate.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/AST/ASTVisitor.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/AST/MLGeneration.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/AST/ModuleAnalyzer.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/AST/ModuleDependencies.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/AST/WhereClauseChecker.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/AST/__init__.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/AST/check_operands.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/DataTypes/ScalarTypes.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/DataTypes/TimeClasses.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/DataTypes/TypePromotion.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/DataTypes/__init__.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/Exceptions/__init__.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/Exceptions/exceptions.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/Exceptions/messages.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/OperationScopes/OperationScopeService.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/OperationScopes/__init__.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/Operators/AggregateOperators.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/Operators/BooleanOperators.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/Operators/ClauseOperators.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/Operators/ComparisonOperators.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/Operators/ConditionalOperators.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/Operators/NumericOperators.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/Operators/Operator.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/Operators/StringOperators.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/Operators/TimeOperators.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/Operators/__init__.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/Utils/ValidationsGenerationUtils.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/Utils/__init__.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/Utils/operands_mapping.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/Utils/operator_mapping.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/Utils/tokens.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/Utils/utils.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/ValidationsGeneration/PropertiesConstraintsProcessor.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/ValidationsGeneration/Utils.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/ValidationsGeneration/VariantsProcessor.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/ValidationsGeneration/__init__.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/ValidationsGeneration/auxiliary_functions.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/api/__init__.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/api/ast_generator.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/api/complete_ast.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/api/data_dictionary.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/api/data_dictionary_validation.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/api/migration.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/api/operation_scopes.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/api/semantic.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/api/syntax.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/client.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/data_handlers.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/db_utils.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/grammar/__init__.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/grammar/dist/__init__.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/grammar/dist/dpm_xlLexer.interp +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/grammar/dist/dpm_xlLexer.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/grammar/dist/dpm_xlLexer.tokens +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/grammar/dist/dpm_xlParser.interp +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/grammar/dist/dpm_xlParser.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/grammar/dist/dpm_xlParser.tokens +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/grammar/dist/dpm_xlParserListener.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/grammar/dist/dpm_xlParserVisitor.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/grammar/dist/listeners.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/grammar/dpm_xlLexer.g4 +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/grammar/dpm_xlParser.g4 +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/migration.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/models.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/semantics/DAG/DAGAnalyzer.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/semantics/DAG/__init__.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/semantics/SemanticAnalyzer.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/semantics/Symbols.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/semantics/__init__.py +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/views/data_types.sql +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/views/datapoints.sql +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/views/hierarchy_operand_reference.sql +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/views/hierarchy_preconditions.sql +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/views/hierarchy_variables.sql +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/views/hierarchy_variables_context.sql +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/views/key_components.sql +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/views/module_from_table.sql +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/views/open_keys.sql +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/views/operation_info.sql +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/views/operation_list.sql +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/views/operations_versions_from_module_version.sql +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/views/precondition_info.sql +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/views/report_type_operand_reference_info.sql +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/views/subcategory_info.sql +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/views/table_info.sql +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/pydpm_xl.egg-info/SOURCES.txt +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/pydpm_xl.egg-info/dependency_links.txt +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/pydpm_xl.egg-info/entry_points.txt +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/pydpm_xl.egg-info/requires.txt +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/pydpm_xl.egg-info/top_level.txt +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/setup.cfg +0 -0
- {pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/tests/test_semantic_release.py +0 -0
|
@@ -240,48 +240,29 @@ class ASTToJSONVisitor(NodeVisitor):
|
|
|
240
240
|
if 'cell_id' in record and record['cell_id'] is not None:
|
|
241
241
|
transformed_record['operand_reference_id'] = int(record['cell_id'])
|
|
242
242
|
|
|
243
|
-
# Check if data type is scalar (no x/y/z coordinates)
|
|
244
|
-
# Scalar types: b (boolean), s (string), e (enumeration/item)
|
|
245
|
-
# Non-scalar types: i, r, m, p (integer, decimal, monetary, percentage)
|
|
246
|
-
data_type = record.get('data_type', '')
|
|
247
|
-
is_scalar_type = data_type in ['b', 's', 'e']
|
|
248
|
-
|
|
249
243
|
column_code = record.get('column_code', '')
|
|
250
244
|
sheet_code = record.get('sheet_code', '')
|
|
251
245
|
|
|
252
|
-
# Add x/y/z coordinates for
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
#
|
|
271
|
-
|
|
272
|
-
# Add additional fields required by ADAM engine
|
|
273
|
-
# CRITICAL: data_type determines how the engine processes values
|
|
274
|
-
if 'data_type' in record and record['data_type'] is not None:
|
|
275
|
-
transformed_record['data_type'] = record['data_type']
|
|
276
|
-
|
|
277
|
-
# Add metadata fields (cell_code, table_code, table_vid)
|
|
278
|
-
# NOTE: row, column, sheet are NOT included in data - they're at VarID level
|
|
279
|
-
if 'cell_code' in record and record['cell_code'] is not None:
|
|
280
|
-
transformed_record['cell_code'] = record['cell_code']
|
|
281
|
-
if 'table_code' in record and record['table_code'] is not None:
|
|
282
|
-
transformed_record['table_code'] = record['table_code']
|
|
283
|
-
if 'table_vid' in record and record['table_vid'] is not None:
|
|
284
|
-
transformed_record['table_vid'] = int(record['table_vid'])
|
|
246
|
+
# Add x/y/z coordinates for ALL data types
|
|
247
|
+
# Coordinates are added unconditionally, then common ones are removed later
|
|
248
|
+
transformed_record['x'] = x_index
|
|
249
|
+
|
|
250
|
+
# Find y coordinate based on column position in context
|
|
251
|
+
y_index = 1 # default
|
|
252
|
+
if context_cols and column_code in context_cols:
|
|
253
|
+
y_index = context_cols.index(column_code) + 1
|
|
254
|
+
transformed_record['y'] = y_index
|
|
255
|
+
|
|
256
|
+
# Add z coordinate if sheet data exists
|
|
257
|
+
if sheet_code:
|
|
258
|
+
# Find z coordinate based on sheet position in context
|
|
259
|
+
z_index = 1 # default
|
|
260
|
+
if context_sheets and sheet_code in context_sheets:
|
|
261
|
+
z_index = context_sheets.index(sheet_code) + 1
|
|
262
|
+
transformed_record['z'] = z_index
|
|
263
|
+
|
|
264
|
+
# NOTE: data_type, cell_code, table_code, table_vid are NOT included
|
|
265
|
+
# in data entries - working fixtures don't have these fields
|
|
285
266
|
|
|
286
267
|
transformed_data.append(transformed_record)
|
|
287
268
|
|
|
@@ -319,19 +300,17 @@ class ASTToJSONVisitor(NodeVisitor):
|
|
|
319
300
|
'z': 'sheet'
|
|
320
301
|
}
|
|
321
302
|
|
|
322
|
-
# Add dimension codes
|
|
323
|
-
#
|
|
324
|
-
#
|
|
325
|
-
# We need to match each transformed record back to its original record
|
|
303
|
+
# Add dimension codes only for VARIABLE coordinates
|
|
304
|
+
# Working fixtures show dimension codes are only included when that dimension varies
|
|
305
|
+
# Example: {c*, s*} with fixed row has y/column, z/sheet but NO x/row
|
|
326
306
|
record_index = 0
|
|
327
307
|
for x_index, row_code in enumerate(rows, 1):
|
|
328
308
|
for original_record in entries_by_row[row_code]:
|
|
329
309
|
if record_index < len(transformed_data):
|
|
330
310
|
transformed_record = transformed_data[record_index]
|
|
331
311
|
|
|
332
|
-
#
|
|
333
|
-
|
|
334
|
-
for coord in ['x', 'y', 'z']:
|
|
312
|
+
# Only add dimension codes for VARIABLE coordinates
|
|
313
|
+
for coord in variable_coords:
|
|
335
314
|
dimension_field = coord_to_dimension[coord]
|
|
336
315
|
output_field = coord_to_field[coord]
|
|
337
316
|
|
|
@@ -41,7 +41,7 @@ Available packages:
|
|
|
41
41
|
- pydpm.api: Main APIs for migration, syntax, and semantic analysis
|
|
42
42
|
"""
|
|
43
43
|
|
|
44
|
-
__version__ = "0.1.
|
|
44
|
+
__version__ = "0.1.39rc26"
|
|
45
45
|
__author__ = "MeaningfulData S.L."
|
|
46
46
|
__email__ = "info@meaningfuldata.eu"
|
|
47
47
|
__license__ = "GPL-3.0-or-later"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "pydpm_xl"
|
|
3
|
-
version = "0.1.
|
|
3
|
+
version = "0.1.39rc26"
|
|
4
4
|
description = "Python library for DPM-XL data processing and analysis"
|
|
5
5
|
authors = [
|
|
6
6
|
{name = "MeaningfulData S.L.", email = "info@meaningfuldata.eu"}
|
|
@@ -52,7 +52,7 @@ exclude = []
|
|
|
52
52
|
|
|
53
53
|
[tool.poetry]
|
|
54
54
|
name = "pydpm_xl"
|
|
55
|
-
version = "0.1.
|
|
55
|
+
version = "0.1.39rc26"
|
|
56
56
|
description = "Python library for DPM-XL data processing and analysis"
|
|
57
57
|
authors = ["MeaningfulData S.L. <info@meaningfuldata.eu>"]
|
|
58
58
|
readme = "README.md"
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/ValidationsGeneration/VariantsProcessor.py
RENAMED
|
File without changes
|
|
File without changes
|
{pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/ValidationsGeneration/auxiliary_functions.py
RENAMED
|
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
|
|
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
|
{pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/views/operations_versions_from_module_version.sql
RENAMED
|
File without changes
|
|
File without changes
|
{pydpm_xl-0.1.39rc25 → pydpm_xl-0.1.39rc26}/py_dpm/views/report_type_operand_reference_info.sql
RENAMED
|
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
|