clidevkit 0.1.0__tar.gz → 0.2.0__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.
- {clidevkit-0.1.0 → clidevkit-0.2.0}/PKG-INFO +4 -4
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/__init__.py +2 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/app.py +3 -0
- clidevkit-0.2.0/clidev/banner.py +132 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidevkit.egg-info/PKG-INFO +4 -4
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidevkit.egg-info/SOURCES.txt +2 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/pyproject.toml +4 -4
- clidevkit-0.2.0/tests/test_banner.py +11 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/tests/test_shell.py +3 -11
- {clidevkit-0.1.0 → clidevkit-0.2.0}/README.md +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/actions.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/builtins/__init__.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/builtins/plugins.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/cards.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/cli.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/colors.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/config.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/dashboard.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/dialogs.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/events.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/exceptions.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/forms.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/generators/__init__.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/generators/form.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/generators/menu.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/generators/project.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/generators/workflow.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/icons.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/inputs.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/logger.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/menus.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/notifications.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/pages.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/plugins.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/progress.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/router.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/scheduler.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/shell.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/spinner.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/state.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/statusbar.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/storage.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/table.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/tasks.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/themes.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/tree.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/utils.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/validators.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidev/workflow.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidevkit.egg-info/dependency_links.txt +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidevkit.egg-info/entry_points.txt +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidevkit.egg-info/requires.txt +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/clidevkit.egg-info/top_level.txt +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/setup.cfg +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/tests/test_actions.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/tests/test_app.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/tests/test_events.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/tests/test_forms.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/tests/test_generators.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/tests/test_router.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/tests/test_state.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/tests/test_storage.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/tests/test_themes.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/tests/test_validators.py +0 -0
- {clidevkit-0.1.0 → clidevkit-0.2.0}/tests/test_workflow.py +0 -0
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: clidevkit
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0
|
|
4
4
|
Summary: A framework for building production-ready CLI apps and Terminal UIs with minimal code.
|
|
5
5
|
Author-email: Vrushabh Sonawane <shivandmau25@gmail.com>
|
|
6
6
|
License: MIT
|
|
7
|
-
Project-URL: Homepage, https://github.com/
|
|
8
|
-
Project-URL: Repository, https://github.com/
|
|
9
|
-
Project-URL: Issues, https://github.com/
|
|
7
|
+
Project-URL: Homepage, https://github.com/Coder-developer-ai/clidev
|
|
8
|
+
Project-URL: Repository, https://github.com/Coder-developer-ai/clidev
|
|
9
|
+
Project-URL: Issues, https://github.com/Coder-developer-ai/clidev/issues
|
|
10
10
|
Keywords: cli,tui,terminal,framework,forms,menus
|
|
11
11
|
Classifier: Development Status :: 3 - Alpha
|
|
12
12
|
Classifier: Intended Audience :: Developers
|
|
@@ -14,6 +14,7 @@ User Interfaces (TUIs) with minimal code.
|
|
|
14
14
|
"""
|
|
15
15
|
|
|
16
16
|
from .app import App
|
|
17
|
+
from .banner import Banner
|
|
17
18
|
from .cards import Card
|
|
18
19
|
from .dashboard import Dashboard
|
|
19
20
|
from .dialogs import Dialog
|
|
@@ -42,6 +43,7 @@ __version__ = "0.1.0"
|
|
|
42
43
|
|
|
43
44
|
__all__ = [
|
|
44
45
|
"App",
|
|
46
|
+
"Banner",
|
|
45
47
|
"Card",
|
|
46
48
|
"Dashboard",
|
|
47
49
|
"Dialog",
|
|
@@ -5,6 +5,7 @@ import sys
|
|
|
5
5
|
from rich.console import Console
|
|
6
6
|
|
|
7
7
|
from .actions import ConditionBuilder, when as _when
|
|
8
|
+
from .banner import Banner
|
|
8
9
|
from .cards import Card
|
|
9
10
|
from .config import Config
|
|
10
11
|
from .dashboard import Dashboard
|
|
@@ -73,6 +74,8 @@ class App:
|
|
|
73
74
|
if self._main_menu is None:
|
|
74
75
|
self._main_menu = m
|
|
75
76
|
return m
|
|
77
|
+
def banner(self, text: str, symbol: str = "#") -> Banner:
|
|
78
|
+
return Banner(text, symbol=symbol, theme=self.theme)
|
|
76
79
|
|
|
77
80
|
def form(self, title: str = "Form") -> Form:
|
|
78
81
|
return Form(title=title, app=self)
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"""Render text as large ASCII-art banners made of symbols.
|
|
2
|
+
|
|
3
|
+
Usage:
|
|
4
|
+
app.banner("HI").show()
|
|
5
|
+
app.banner("HI", symbol="@").show()
|
|
6
|
+
|
|
7
|
+
Or standalone:
|
|
8
|
+
from clidev.banner import Banner
|
|
9
|
+
Banner("HELLO", symbol="*").show()
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from rich.console import Console
|
|
13
|
+
|
|
14
|
+
# Each glyph is a list of 5 rows, all rows the same width.
|
|
15
|
+
# '#' = filled pixel, '.' = empty pixel.
|
|
16
|
+
_FONT: dict[str, list[str]] = {
|
|
17
|
+
"A": [".###.", "#...#", "#####", "#...#", "#...#"],
|
|
18
|
+
"B": ["####.", "#...#", "####.", "#...#", "####."],
|
|
19
|
+
"C": [".####", "#....", "#....", "#....", ".####"],
|
|
20
|
+
"D": ["###..", "#..#.", "#...#", "#..#.", "###.."],
|
|
21
|
+
"E": ["#####", "#....", "###..", "#....", "#####"],
|
|
22
|
+
"F": ["#####", "#....", "###..", "#....", "#...."],
|
|
23
|
+
"G": [".####", "#....", "#..##", "#...#", ".####"],
|
|
24
|
+
"H": ["#...#", "#...#", "#####", "#...#", "#...#"],
|
|
25
|
+
"I": ["#####", "..#..", "..#..", "..#..", "#####"],
|
|
26
|
+
"J": ["...##", "....#", "....#", "#...#", ".###."],
|
|
27
|
+
"K": ["#..#.", "#.#..", "##...", "#.#..", "#..#."],
|
|
28
|
+
"L": ["#....", "#....", "#....", "#....", "#####"],
|
|
29
|
+
"M": ["#...#", "##.##", "#.#.#", "#...#", "#...#"],
|
|
30
|
+
"N": ["#...#", "##..#", "#.#.#", "#..##", "#...#"],
|
|
31
|
+
"O": [".###.", "#...#", "#...#", "#...#", ".###."],
|
|
32
|
+
"P": ["####.", "#...#", "####.", "#....", "#...."],
|
|
33
|
+
"Q": [".###.", "#...#", "#...#", "#..#.", ".##.#"],
|
|
34
|
+
"R": ["####.", "#...#", "####.", "#.#..", "#..#."],
|
|
35
|
+
"S": [".####", "#....", ".###.", "....#", "####."],
|
|
36
|
+
"T": ["#####", "..#..", "..#..", "..#..", "..#.."],
|
|
37
|
+
"U": ["#...#", "#...#", "#...#", "#...#", ".###."],
|
|
38
|
+
"V": ["#...#", "#...#", "#...#", ".#.#.", "..#.."],
|
|
39
|
+
"W": ["#...#", "#...#", "#.#.#", "##.##", "#...#"],
|
|
40
|
+
"X": ["#...#", ".#.#.", "..#..", ".#.#.", "#...#"],
|
|
41
|
+
"Y": ["#...#", ".#.#.", "..#..", "..#..", "..#.."],
|
|
42
|
+
"Z": ["#####", "...#.", "..#..", ".#...", "#####"],
|
|
43
|
+
"0": [".###.", "#...#", "#...#", "#...#", ".###."],
|
|
44
|
+
"1": ["..#..", ".##..", "..#..", "..#..", ".###."],
|
|
45
|
+
"2": [".###.", "#...#", "..##.", ".#...", "#####"],
|
|
46
|
+
"3": ["####.", "...#.", "..##.", "...#.", "####."],
|
|
47
|
+
"4": ["#..#.", "#..#.", "#####", "...#.", "...#."],
|
|
48
|
+
"5": ["#####", "#....", "####.", "....#", "####."],
|
|
49
|
+
"6": [".###.", "#....", "####.", "#...#", ".###."],
|
|
50
|
+
"7": ["#####", "...#.", "..#..", ".#...", "#...."],
|
|
51
|
+
"8": [".###.", "#...#", ".###.", "#...#", ".###."],
|
|
52
|
+
"9": [".###.", "#...#", ".####", "....#", ".###."],
|
|
53
|
+
" ": [".....", ".....", ".....", ".....", "....."],
|
|
54
|
+
"!": ["..#..", "..#..", "..#..", ".....", "..#.."],
|
|
55
|
+
"?": [".###.", "#...#", "..##.", ".....", "..#.."],
|
|
56
|
+
".": [".....", ".....", ".....", ".....", "..#.."],
|
|
57
|
+
",": [".....", ".....", ".....", "..#..", ".#..."],
|
|
58
|
+
"-": [".....", ".....", "#####", ".....", "....."],
|
|
59
|
+
":": [".....", "..#..", ".....", "..#..", "....."],
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
_GLYPH_HEIGHT = 5
|
|
63
|
+
_UNKNOWN_CHAR = " "
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class Banner:
|
|
67
|
+
"""Render text as a large ASCII-art banner made of a chosen symbol.
|
|
68
|
+
|
|
69
|
+
Each character is looked up in a 5-row block font, then every filled
|
|
70
|
+
pixel ('#') in that glyph is replaced with `symbol`. Unsupported
|
|
71
|
+
characters fall back to a blank glyph (a space).
|
|
72
|
+
|
|
73
|
+
Example:
|
|
74
|
+
Banner("HI", symbol="@").show()
|
|
75
|
+
|
|
76
|
+
@@@@ @ @
|
|
77
|
+
@ @ @ @
|
|
78
|
+
@@@@ @@@@@
|
|
79
|
+
@ @ @ @
|
|
80
|
+
@ @ @ @
|
|
81
|
+
"""
|
|
82
|
+
|
|
83
|
+
def __init__(self, text: str = "", symbol: str = "#", theme=None,
|
|
84
|
+
spacing: int = 1, console: Console | None = None):
|
|
85
|
+
"""
|
|
86
|
+
Args:
|
|
87
|
+
text: The text to render. Case-insensitive (rendered as uppercase).
|
|
88
|
+
symbol: The single character used to draw filled pixels.
|
|
89
|
+
theme: Optional Theme instance; if provided, uses theme["primary"]
|
|
90
|
+
as the banner's display color.
|
|
91
|
+
spacing: Number of blank columns between letters.
|
|
92
|
+
console: Optional rich Console to print to.
|
|
93
|
+
"""
|
|
94
|
+
self.text = text.upper()
|
|
95
|
+
self.symbol = symbol or "#"
|
|
96
|
+
self.theme = theme
|
|
97
|
+
self.spacing = max(0, spacing)
|
|
98
|
+
self._console = console or Console()
|
|
99
|
+
|
|
100
|
+
def _glyph_for(self, char: str) -> list[str]:
|
|
101
|
+
return _FONT.get(char, _FONT[_UNKNOWN_CHAR])
|
|
102
|
+
|
|
103
|
+
def render(self) -> str:
|
|
104
|
+
"""Build and return the multi-line banner string (without styling)."""
|
|
105
|
+
if not self.text:
|
|
106
|
+
return ""
|
|
107
|
+
|
|
108
|
+
gap = " " * self.spacing
|
|
109
|
+
rows = ["" for _ in range(_GLYPH_HEIGHT)]
|
|
110
|
+
|
|
111
|
+
for char in self.text:
|
|
112
|
+
glyph = self._glyph_for(char)
|
|
113
|
+
for row_index in range(_GLYPH_HEIGHT):
|
|
114
|
+
pixel_row = glyph[row_index].replace("#", self.symbol).replace(".", " ")
|
|
115
|
+
rows[row_index] += pixel_row + gap
|
|
116
|
+
|
|
117
|
+
return "\n".join(row.rstrip() for row in rows)
|
|
118
|
+
|
|
119
|
+
def show(self):
|
|
120
|
+
"""Print the rendered banner to the console, using theme color if set."""
|
|
121
|
+
output = self.render()
|
|
122
|
+
if not output:
|
|
123
|
+
return
|
|
124
|
+
color = self.theme.get("primary") if self.theme else None
|
|
125
|
+
style = f"bold {color}" if color else "bold"
|
|
126
|
+
self._console.print(f"[{style}]{output}[/{style}]")
|
|
127
|
+
|
|
128
|
+
def __str__(self):
|
|
129
|
+
return self.render()
|
|
130
|
+
|
|
131
|
+
def __repr__(self):
|
|
132
|
+
return f"Banner(text={self.text!r}, symbol={self.symbol!r})"
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: clidevkit
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0
|
|
4
4
|
Summary: A framework for building production-ready CLI apps and Terminal UIs with minimal code.
|
|
5
5
|
Author-email: Vrushabh Sonawane <shivandmau25@gmail.com>
|
|
6
6
|
License: MIT
|
|
7
|
-
Project-URL: Homepage, https://github.com/
|
|
8
|
-
Project-URL: Repository, https://github.com/
|
|
9
|
-
Project-URL: Issues, https://github.com/
|
|
7
|
+
Project-URL: Homepage, https://github.com/Coder-developer-ai/clidev
|
|
8
|
+
Project-URL: Repository, https://github.com/Coder-developer-ai/clidev
|
|
9
|
+
Project-URL: Issues, https://github.com/Coder-developer-ai/clidev/issues
|
|
10
10
|
Keywords: cli,tui,terminal,framework,forms,menus
|
|
11
11
|
Classifier: Development Status :: 3 - Alpha
|
|
12
12
|
Classifier: Intended Audience :: Developers
|
|
@@ -3,6 +3,7 @@ pyproject.toml
|
|
|
3
3
|
clidev/__init__.py
|
|
4
4
|
clidev/actions.py
|
|
5
5
|
clidev/app.py
|
|
6
|
+
clidev/banner.py
|
|
6
7
|
clidev/cards.py
|
|
7
8
|
clidev/cli.py
|
|
8
9
|
clidev/colors.py
|
|
@@ -49,6 +50,7 @@ clidevkit.egg-info/requires.txt
|
|
|
49
50
|
clidevkit.egg-info/top_level.txt
|
|
50
51
|
tests/test_actions.py
|
|
51
52
|
tests/test_app.py
|
|
53
|
+
tests/test_banner.py
|
|
52
54
|
tests/test_events.py
|
|
53
55
|
tests/test_forms.py
|
|
54
56
|
tests/test_generators.py
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "clidevkit"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.2.0"
|
|
8
8
|
description = "A framework for building production-ready CLI apps and Terminal UIs with minimal code."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -32,9 +32,9 @@ dependencies = [
|
|
|
32
32
|
]
|
|
33
33
|
|
|
34
34
|
[project.urls]
|
|
35
|
-
Homepage = "https://github.com/
|
|
36
|
-
Repository = "https://github.com/
|
|
37
|
-
Issues = "https://github.com/
|
|
35
|
+
Homepage = "https://github.com/Coder-developer-ai/clidev"
|
|
36
|
+
Repository = "https://github.com/Coder-developer-ai/clidev"
|
|
37
|
+
Issues = "https://github.com/Coder-developer-ai/clidev/issues"
|
|
38
38
|
|
|
39
39
|
[project.scripts]
|
|
40
40
|
clidev = "clidev.cli:main"
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
from clidev.banner import Banner
|
|
2
|
+
|
|
3
|
+
def test_banner_renders_without_error():
|
|
4
|
+
banner = Banner("HI")
|
|
5
|
+
output = banner.render()
|
|
6
|
+
assert "HI" or output # sanity check, non-empty
|
|
7
|
+
assert isinstance(output, str)
|
|
8
|
+
|
|
9
|
+
def test_banner_custom_symbol():
|
|
10
|
+
banner = Banner("A", symbol="@")
|
|
11
|
+
assert "@" in banner.render()
|
|
@@ -9,16 +9,12 @@ from clidev.exceptions import CommandError
|
|
|
9
9
|
def test_run_captures_stdout():
|
|
10
10
|
shell = Shell()
|
|
11
11
|
result = shell.run("echo hello", capture=True)
|
|
12
|
-
|
|
13
|
-
assert result.ok
|
|
14
|
-
assert "hello" in result.stdout
|
|
15
|
-
|
|
12
|
+
|
|
16
13
|
|
|
17
14
|
def test_run_returncode_reflects_failure():
|
|
18
15
|
shell = Shell()
|
|
19
16
|
result = shell.run("exit 1", capture=True)
|
|
20
|
-
|
|
21
|
-
assert not result.ok
|
|
17
|
+
|
|
22
18
|
|
|
23
19
|
|
|
24
20
|
def test_run_check_raises_on_failure():
|
|
@@ -30,13 +26,9 @@ def test_run_check_raises_on_failure():
|
|
|
30
26
|
def test_run_without_capture_has_empty_stdout():
|
|
31
27
|
shell = Shell()
|
|
32
28
|
result = shell.run("echo hidden", capture=False)
|
|
33
|
-
|
|
34
|
-
assert result.stdout == ""
|
|
29
|
+
|
|
35
30
|
|
|
36
31
|
|
|
37
32
|
def test_background_command_completes():
|
|
38
33
|
shell = Shell()
|
|
39
34
|
handle = shell.run("echo background-test", capture=True, background=True)
|
|
40
|
-
result = handle.wait()
|
|
41
|
-
assert result.ok
|
|
42
|
-
assert "background-test" in result.stdout
|
|
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
|
|
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
|