pyVHDLModelTreesitter 0.5.0__tar.gz → 0.5.2__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.
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/PKG-INFO +4 -4
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/pyproject.toml +4 -4
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/DesignUnit.py +1 -1
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/_Document.py +21 -7
- pyvhdlmodeltreesitter-0.5.2/src/pyVHDLModelTreesitter/format.py +68 -0
- pyvhdlmodeltreesitter-0.5.2/src/pyVHDLModelTreesitter/treesitter/queries/concurrent_simple_signal_assignment.scm +5 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/.gitignore +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/LICENSE +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/README.md +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/Association.py +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/Base.py +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/Concurrent.py +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/Expression.py +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/Interface.py +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/Name.py +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/Object.py +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/Symbol.py +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/_Design.py +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/_Library.py +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/__init__.py +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/_errors.py +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/_parse.py +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/py.typed +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/__init__.py +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/_base_class.py +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/_utils.py +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/adding_expression.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/architecture_definition.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/association_element.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/association_elements.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/component_instantiation_statement.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/constant_declaration.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/constrained_1d_array.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/design_units.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/entity_declaration.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/function_call.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/ignorable_parentheses.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/interface_declaration.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/interface_declarations.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/library_clauses.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/library_namespaces.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/multiplying_expression.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/package_declaration.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/package_definition.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/selected_names.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/simple_subtype.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/type_conversion.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/queries/use_clauses.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/treesitter/query.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pyVHDLModelTreesitter
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.2
|
|
4
4
|
Summary: An implementation of pyVHDLModel using treesitter
|
|
5
5
|
Project-URL: Repository, https://gitlab.com/dawalters/pyVHDLModelTreesitter
|
|
6
6
|
Author: Dominic Adam Walters
|
|
@@ -15,7 +15,9 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
15
15
|
Classifier: Programming Language :: Python :: 3.13
|
|
16
16
|
Classifier: Programming Language :: Python :: 3.14
|
|
17
17
|
Requires-Python: >=3.11
|
|
18
|
-
Requires-Dist:
|
|
18
|
+
Requires-Dist: pygments>=2.20.0
|
|
19
|
+
Requires-Dist: pyvhdlmodel>=0.34.0
|
|
20
|
+
Requires-Dist: rich>=11.0.0
|
|
19
21
|
Requires-Dist: tree-sitter-vhdl>=1.2.5
|
|
20
22
|
Requires-Dist: tree-sitter>=0.23.0
|
|
21
23
|
Provides-Extra: dev
|
|
@@ -26,13 +28,11 @@ Requires-Dist: idna==3.16; extra == 'dev'
|
|
|
26
28
|
Requires-Dist: jaraco-context==6.1.2; extra == 'dev'
|
|
27
29
|
Requires-Dist: mypy==2.1.0; extra == 'dev'
|
|
28
30
|
Requires-Dist: pre-commit==4.6.0; extra == 'dev'
|
|
29
|
-
Requires-Dist: pygments==2.20.0; extra == 'dev'
|
|
30
31
|
Requires-Dist: pytest-cov==7.1.0; extra == 'dev'
|
|
31
32
|
Requires-Dist: pytest-order==1.4.0; extra == 'dev'
|
|
32
33
|
Requires-Dist: pytest-sugar==1.1.1; extra == 'dev'
|
|
33
34
|
Requires-Dist: pytest-xdist==3.8.0; extra == 'dev'
|
|
34
35
|
Requires-Dist: pytest==9.0.3; extra == 'dev'
|
|
35
|
-
Requires-Dist: rich==15.0.0; extra == 'dev'
|
|
36
36
|
Requires-Dist: ruff==0.15.14; extra == 'dev'
|
|
37
37
|
Requires-Dist: ty==0.0.39; extra == 'dev'
|
|
38
38
|
Requires-Dist: uv==0.11.16; extra == 'dev'
|
|
@@ -4,12 +4,14 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "pyVHDLModelTreesitter"
|
|
7
|
-
version = "0.5.
|
|
7
|
+
version = "0.5.2"
|
|
8
8
|
description = "An implementation of pyVHDLModel using treesitter"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
11
11
|
dependencies = [
|
|
12
|
-
"pyVHDLModel >= 0.
|
|
12
|
+
"pyVHDLModel >= 0.34.0",
|
|
13
|
+
"rich >= 11.0.0",
|
|
14
|
+
"pygments >= 2.20.0", # forced to avoid CVE
|
|
13
15
|
"tree-sitter >= 0.23.0",
|
|
14
16
|
"tree-sitter-vhdl >= 1.2.5",
|
|
15
17
|
]
|
|
@@ -42,8 +44,6 @@ dev = [
|
|
|
42
44
|
"pytest-order == 1.4.0",
|
|
43
45
|
"pytest-sugar == 1.1.1",
|
|
44
46
|
"pytest-xdist == 3.8.0",
|
|
45
|
-
"rich == 15.0.0",
|
|
46
|
-
"pygments == 2.20.0", # forced to avoid CVE
|
|
47
47
|
"ruff == 0.15.14",
|
|
48
48
|
"ty == 0.0.39",
|
|
49
49
|
"uv == 0.11.16",
|
{pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/DesignUnit.py
RENAMED
|
@@ -120,7 +120,7 @@ class UseClause(TreesitterNodeMixin, VHDLModel_UseClause): # noqa: D101
|
|
|
120
120
|
symbols.append(
|
|
121
121
|
PackageReferenceSymbol(selected_or_simple_name(selected_name)),
|
|
122
122
|
)
|
|
123
|
-
ret.append(cls(symbols, _treesitter_node=
|
|
123
|
+
ret.append(cls(symbols, _treesitter_node=use_clause_node))
|
|
124
124
|
return ret
|
|
125
125
|
|
|
126
126
|
def __eq__(self, other: object) -> bool: # noqa: D105
|
{pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/_Document.py
RENAMED
|
@@ -21,7 +21,23 @@ from pyVHDLModelTreesitter.treesitter.query import PARSER, DesignUnits
|
|
|
21
21
|
|
|
22
22
|
class Document(VHDLModel_Document):
|
|
23
23
|
@classmethod
|
|
24
|
-
def from_file(cls, path: str | Path) -> Self:
|
|
24
|
+
def from_file(cls, path: str | Path) -> Self:
|
|
25
|
+
"""
|
|
26
|
+
Create a Document, and all ModelEntities it contains.
|
|
27
|
+
|
|
28
|
+
Nodes that are not recognised issue a `NotImplementedWarning`.
|
|
29
|
+
"""
|
|
30
|
+
if isinstance(path, str):
|
|
31
|
+
path = Path(path)
|
|
32
|
+
path = path.resolve()
|
|
33
|
+
return cls.from_text(path.read_bytes(), path)
|
|
34
|
+
|
|
35
|
+
@classmethod
|
|
36
|
+
def from_text( # noqa: C901, PLR0912 # TODO: refactor
|
|
37
|
+
cls,
|
|
38
|
+
text: str | bytes,
|
|
39
|
+
path: str | Path,
|
|
40
|
+
) -> Self:
|
|
25
41
|
"""
|
|
26
42
|
Create a Document, and all ModelEntities it contains.
|
|
27
43
|
|
|
@@ -34,13 +50,16 @@ class Document(VHDLModel_Document):
|
|
|
34
50
|
- Any `design_unit` node has no children.
|
|
35
51
|
|
|
36
52
|
"""
|
|
53
|
+
if isinstance(text, str):
|
|
54
|
+
text = text.encode()
|
|
37
55
|
if isinstance(path, str):
|
|
38
56
|
path = Path(path)
|
|
39
57
|
path = path.resolve()
|
|
40
58
|
document = cls(path)
|
|
41
59
|
|
|
42
|
-
tree = PARSER.parse(
|
|
60
|
+
tree = PARSER.parse(text)
|
|
43
61
|
node = tree.root_node
|
|
62
|
+
|
|
44
63
|
captures = DesignUnits.capture(node)
|
|
45
64
|
design_unit_captures = captures.get("design_unit")
|
|
46
65
|
if design_unit_captures is None:
|
|
@@ -52,9 +71,6 @@ class Document(VHDLModel_Document):
|
|
|
52
71
|
context_children = design_unit_capture.children[:-1]
|
|
53
72
|
context_items: list[LibraryClause | UseClause] = []
|
|
54
73
|
for context_child in context_children:
|
|
55
|
-
if context_child is None:
|
|
56
|
-
# TODO: error type is wrong: should be "discovered child is empty"
|
|
57
|
-
raise NodeMissingChildError(node, "design_unit")
|
|
58
74
|
if context_child.type == "library_clause":
|
|
59
75
|
context_items.extend(
|
|
60
76
|
LibraryClause.from_treesitter_node(context_child),
|
|
@@ -65,8 +81,6 @@ class Document(VHDLModel_Document):
|
|
|
65
81
|
)
|
|
66
82
|
else:
|
|
67
83
|
NotImplementedWarning.warn_child_type(context_child)
|
|
68
|
-
if design_unit_child is None:
|
|
69
|
-
raise NodeMissingChildError(node, "design_unit")
|
|
70
84
|
if design_unit_child.type == "architecture_definition":
|
|
71
85
|
architecture = Architecture.from_treesitter_node(
|
|
72
86
|
node,
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Submodule that provides useful utilities for performing nice looking outputs.
|
|
3
|
+
|
|
4
|
+
WARNING: This submodule is a filthy hack. When called, `patch_module`
|
|
5
|
+
monkeypatches a generic `__rich_repr__` method onto every class in a given
|
|
6
|
+
module within `pyVHDLModel`.
|
|
7
|
+
|
|
8
|
+
This avoids having to write a `__rich_repr__` for every class. This is not a
|
|
9
|
+
good solution, but it was quick and works for what I care about.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import importlib
|
|
15
|
+
import inspect
|
|
16
|
+
import pkgutil
|
|
17
|
+
from typing import TYPE_CHECKING
|
|
18
|
+
|
|
19
|
+
if TYPE_CHECKING:
|
|
20
|
+
from types import ModuleType
|
|
21
|
+
|
|
22
|
+
if TYPE_CHECKING:
|
|
23
|
+
from rich.repr import Result as RichReprResult
|
|
24
|
+
|
|
25
|
+
import pyVHDLModelTreesitter
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def __rich_repr__(obj: object) -> RichReprResult: # noqa: N807
|
|
29
|
+
"""
|
|
30
|
+
Return a rich compatible repr for an arbitrary object.
|
|
31
|
+
|
|
32
|
+
WARNING: `obj` must define `__allSlots__` or `__dict__`.
|
|
33
|
+
""" # noqa: DOC402
|
|
34
|
+
for attr in (
|
|
35
|
+
getattr(obj, "__allSlots__", [])
|
|
36
|
+
if hasattr(obj, "__allSlots__")
|
|
37
|
+
else obj.__dict__
|
|
38
|
+
):
|
|
39
|
+
if attr in {
|
|
40
|
+
"_documents", # this duplicates data in the `_libraries` field
|
|
41
|
+
"_namespace", # this isn't printed
|
|
42
|
+
"_parent", # this duplicates the parent
|
|
43
|
+
"_treesitter_node", # this doesn't provide useful info
|
|
44
|
+
} or attr.endswith(("Graph", "Vertex")): # these are from the dependency graph
|
|
45
|
+
continue
|
|
46
|
+
yield attr, getattr(obj, attr)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def patch_module(
|
|
50
|
+
*,
|
|
51
|
+
module: ModuleType = pyVHDLModelTreesitter,
|
|
52
|
+
top: bool = True,
|
|
53
|
+
) -> None:
|
|
54
|
+
"""Inject a `__rich_repr__` into every class defined in a given module."""
|
|
55
|
+
# Inject into all classes defined in this module
|
|
56
|
+
for _, obj in inspect.getmembers(module):
|
|
57
|
+
if (
|
|
58
|
+
inspect.isclass(obj)
|
|
59
|
+
and obj.__module__ == module.__name__
|
|
60
|
+
and not hasattr(obj, "__rich_repr__")
|
|
61
|
+
):
|
|
62
|
+
obj.__rich_repr__ = __rich_repr__
|
|
63
|
+
# Inject into all submodules of this module
|
|
64
|
+
if top and hasattr(module, "__path__"):
|
|
65
|
+
for _, name, _ in pkgutil.walk_packages(pyVHDLModelTreesitter.__path__):
|
|
66
|
+
full_name = f"{pyVHDLModelTreesitter.__name__}.{name}"
|
|
67
|
+
submodule = importlib.import_module(full_name)
|
|
68
|
+
patch_module(module=submodule, top=False)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/Association.py
RENAMED
|
File without changes
|
{pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/Base.py
RENAMED
|
File without changes
|
{pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/Concurrent.py
RENAMED
|
File without changes
|
{pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/Expression.py
RENAMED
|
File without changes
|
{pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/Interface.py
RENAMED
|
File without changes
|
{pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/Name.py
RENAMED
|
File without changes
|
{pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/Object.py
RENAMED
|
File without changes
|
{pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/Symbol.py
RENAMED
|
File without changes
|
{pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/_Design.py
RENAMED
|
File without changes
|
{pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/_Library.py
RENAMED
|
File without changes
|
{pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/__init__.py
RENAMED
|
File without changes
|
{pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/_errors.py
RENAMED
|
File without changes
|
{pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/_parse.py
RENAMED
|
File without changes
|
{pyvhdlmodeltreesitter-0.5.0 → pyvhdlmodeltreesitter-0.5.2}/src/pyVHDLModelTreesitter/py.typed
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
|