v440 2.0.0.dev51__tar.gz → 2.0.0.dev52__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.
- {v440-2.0.0.dev51/src/v440.egg-info → v440-2.0.0.dev52}/PKG-INFO +1 -1
- {v440-2.0.0.dev51 → v440-2.0.0.dev52}/pyproject.toml +1 -1
- {v440-2.0.0.dev51 → v440-2.0.0.dev52}/src/v440/_utils/BaseList.py +6 -0
- {v440-2.0.0.dev51 → v440-2.0.0.dev52}/src/v440/_utils/Digest.py +3 -1
- {v440-2.0.0.dev51 → v440-2.0.0.dev52}/src/v440/_utils/SlotList.py +11 -3
- {v440-2.0.0.dev51 → v440-2.0.0.dev52}/src/v440/_utils/VList.py +14 -0
- {v440-2.0.0.dev51 → v440-2.0.0.dev52}/src/v440/core/Base.py +9 -11
- {v440-2.0.0.dev51 → v440-2.0.0.dev52}/src/v440/core/Local.py +38 -33
- {v440-2.0.0.dev51 → v440-2.0.0.dev52}/src/v440/core/Public.py +4 -5
- {v440-2.0.0.dev51 → v440-2.0.0.dev52}/src/v440/core/Qual.py +16 -14
- {v440-2.0.0.dev51 → v440-2.0.0.dev52}/src/v440/core/Release.py +12 -13
- {v440-2.0.0.dev51 → v440-2.0.0.dev52}/src/v440/core/Version.py +7 -8
- {v440-2.0.0.dev51 → v440-2.0.0.dev52}/src/v440/core/VersionError.py +3 -0
- {v440-2.0.0.dev51 → v440-2.0.0.dev52}/src/v440/tests/test_testdata.py +1 -1
- {v440-2.0.0.dev51 → v440-2.0.0.dev52}/src/v440/tests/test_version.py +2 -2
- {v440-2.0.0.dev51 → v440-2.0.0.dev52/src/v440.egg-info}/PKG-INFO +1 -1
- {v440-2.0.0.dev51 → v440-2.0.0.dev52}/LICENSE.txt +0 -0
- {v440-2.0.0.dev51 → v440-2.0.0.dev52}/MANIFEST.in +0 -0
- {v440-2.0.0.dev51 → v440-2.0.0.dev52}/README.rst +0 -0
- {v440-2.0.0.dev51 → v440-2.0.0.dev52}/setup.cfg +0 -0
- {v440-2.0.0.dev51 → v440-2.0.0.dev52}/src/v440/__init__.py +0 -0
- {v440-2.0.0.dev51 → v440-2.0.0.dev52}/src/v440/_utils/Cfg.py +0 -0
- {v440-2.0.0.dev51 → v440-2.0.0.dev52}/src/v440/_utils/Pattern.py +0 -0
- {v440-2.0.0.dev51 → v440-2.0.0.dev52}/src/v440/_utils/__init__.py +0 -0
- {v440-2.0.0.dev51 → v440-2.0.0.dev52}/src/v440/_utils/cfg.toml +0 -0
- {v440-2.0.0.dev51 → v440-2.0.0.dev52}/src/v440/_utils/qualparse.py +0 -0
- {v440-2.0.0.dev51 → v440-2.0.0.dev52}/src/v440/_utils/utils.py +0 -0
- {v440-2.0.0.dev51 → v440-2.0.0.dev52}/src/v440/core/__init__.py +0 -0
- {v440-2.0.0.dev51 → v440-2.0.0.dev52}/src/v440/tests/__init__.py +0 -0
- {v440-2.0.0.dev51 → v440-2.0.0.dev52}/src/v440/tests/testdata.toml +0 -0
- {v440-2.0.0.dev51 → v440-2.0.0.dev52}/src/v440.egg-info/SOURCES.txt +0 -0
- {v440-2.0.0.dev51 → v440-2.0.0.dev52}/src/v440.egg-info/dependency_links.txt +0 -0
- {v440-2.0.0.dev51 → v440-2.0.0.dev52}/src/v440.egg-info/requires.txt +0 -0
- {v440-2.0.0.dev51 → v440-2.0.0.dev52}/src/v440.egg-info/top_level.txt +0 -0
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
from abc import ABCMeta, abstractmethod
|
|
2
2
|
from typing import *
|
|
3
3
|
|
|
4
|
+
import setdoc
|
|
5
|
+
|
|
4
6
|
|
|
5
7
|
class BaseList(metaclass=ABCMeta):
|
|
6
8
|
__slots__ = ()
|
|
7
9
|
|
|
8
10
|
@abstractmethod
|
|
11
|
+
@setdoc.basic
|
|
9
12
|
def __bool__(self: Self) -> bool: ...
|
|
13
|
+
|
|
14
|
+
@abstractmethod
|
|
15
|
+
def _format(self: Self, format_spec: str) -> str: ...
|
|
@@ -4,6 +4,8 @@ import functools
|
|
|
4
4
|
import types
|
|
5
5
|
from typing import *
|
|
6
6
|
|
|
7
|
+
import setdoc
|
|
8
|
+
|
|
7
9
|
|
|
8
10
|
class Digest:
|
|
9
11
|
__slots__ = ("__dict__", "lookup", "name", "kind")
|
|
@@ -23,12 +25,12 @@ class Digest:
|
|
|
23
25
|
"This magic method implements getting as an attribute from a class or an object."
|
|
24
26
|
return self.wrapped.__get__(*args, **kwargs)
|
|
25
27
|
|
|
28
|
+
@setdoc.basic
|
|
26
29
|
def __init__(
|
|
27
30
|
self: Self,
|
|
28
31
|
name: str = "",
|
|
29
32
|
kind: Any = None,
|
|
30
33
|
) -> None:
|
|
31
|
-
"This magic method sets up self."
|
|
32
34
|
self.lookup = dict()
|
|
33
35
|
self.name = name
|
|
34
36
|
self.kind = kind
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import collections
|
|
2
|
+
import sys
|
|
2
3
|
from abc import abstractmethod
|
|
3
4
|
from typing import *
|
|
4
5
|
|
|
@@ -37,8 +38,13 @@ class SlotList(collections.abc.Collection, BaseList):
|
|
|
37
38
|
return self.data == alt.data
|
|
38
39
|
|
|
39
40
|
@setdoc.basic
|
|
40
|
-
def __format__(self: Self, format_spec: Any
|
|
41
|
-
|
|
41
|
+
def __format__(self: Self, format_spec: Any) -> str:
|
|
42
|
+
try:
|
|
43
|
+
return self._format(str(format_spec))
|
|
44
|
+
except Exception:
|
|
45
|
+
msg: str = "unsupported format string passed to %s.__format__"
|
|
46
|
+
msg %= type(self).__name__
|
|
47
|
+
raise TypeError(msg) from None
|
|
42
48
|
|
|
43
49
|
@setdoc.basic
|
|
44
50
|
def __getitem__(self: Self, key: Any) -> Any:
|
|
@@ -118,7 +124,7 @@ class SlotList(collections.abc.Collection, BaseList):
|
|
|
118
124
|
|
|
119
125
|
@setdoc.basic
|
|
120
126
|
def __str__(self: Self) -> str:
|
|
121
|
-
return
|
|
127
|
+
return format(self)
|
|
122
128
|
|
|
123
129
|
@classmethod
|
|
124
130
|
def __subclasshook__(cls: type, other: type, /) -> bool:
|
|
@@ -128,6 +134,7 @@ class SlotList(collections.abc.Collection, BaseList):
|
|
|
128
134
|
def _cmp(self: Self) -> Any:
|
|
129
135
|
return self.data
|
|
130
136
|
|
|
137
|
+
@setdoc.basic
|
|
131
138
|
def copy(self: Self) -> Self:
|
|
132
139
|
return type(self)(self)
|
|
133
140
|
|
|
@@ -136,6 +143,7 @@ class SlotList(collections.abc.Collection, BaseList):
|
|
|
136
143
|
|
|
137
144
|
@property
|
|
138
145
|
@abstractmethod
|
|
146
|
+
@setdoc.basic
|
|
139
147
|
def data(self: Self) -> list: ...
|
|
140
148
|
|
|
141
149
|
def index(self: Self, value: Any) -> Any:
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import builtins
|
|
1
2
|
from typing import *
|
|
2
3
|
|
|
3
4
|
import setdoc
|
|
@@ -11,6 +12,19 @@ class VList(OkayList, BaseList):
|
|
|
11
12
|
|
|
12
13
|
__slots__ = ()
|
|
13
14
|
|
|
15
|
+
@setdoc.basic
|
|
16
|
+
def __format__(self: Self, format_spec: Any) -> str:
|
|
17
|
+
try:
|
|
18
|
+
return self._format(str(format_spec))
|
|
19
|
+
except Exception:
|
|
20
|
+
msg: str = "unsupported format string passed to %s.__format__"
|
|
21
|
+
msg %= type(self).__name__
|
|
22
|
+
raise TypeError(msg) from None
|
|
23
|
+
|
|
24
|
+
@setdoc.basic
|
|
25
|
+
def __str__(self: Self) -> str:
|
|
26
|
+
return builtins.format(self)
|
|
27
|
+
|
|
14
28
|
@setdoc.basic
|
|
15
29
|
def __eq__(self: Self, other: Any) -> bool:
|
|
16
30
|
ans: bool
|
|
@@ -80,9 +80,12 @@ class Base(SlotList):
|
|
|
80
80
|
self._release = Release()
|
|
81
81
|
self.data = data
|
|
82
82
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
83
|
+
def _format(self: Self, format_spec: str) -> str:
|
|
84
|
+
ans: str = ""
|
|
85
|
+
if self.epoch:
|
|
86
|
+
ans += "%s!" % self.epoch
|
|
87
|
+
ans += format(self.release, format_spec)
|
|
88
|
+
return ans
|
|
86
89
|
|
|
87
90
|
@property
|
|
88
91
|
@setdoc.basic
|
|
@@ -95,7 +98,8 @@ class Base(SlotList):
|
|
|
95
98
|
self.epoch, self.release = parse_data(value)
|
|
96
99
|
|
|
97
100
|
@property
|
|
98
|
-
def epoch(self: Self) ->
|
|
101
|
+
def epoch(self: Self) -> int:
|
|
102
|
+
"This property represents the epoch."
|
|
99
103
|
return self._epoch
|
|
100
104
|
|
|
101
105
|
@epoch.setter
|
|
@@ -103,15 +107,9 @@ class Base(SlotList):
|
|
|
103
107
|
def epoch(self: Self, value: Any) -> None:
|
|
104
108
|
self._epoch = parse_epoch(value)
|
|
105
109
|
|
|
106
|
-
def format(self: Self, cutoff: Any = None) -> str:
|
|
107
|
-
ans: str = ""
|
|
108
|
-
if self.epoch:
|
|
109
|
-
ans += "%s!" % self.epoch
|
|
110
|
-
ans += self.release.format(cutoff)
|
|
111
|
-
return ans
|
|
112
|
-
|
|
113
110
|
@property
|
|
114
111
|
def release(self: Self) -> Release:
|
|
112
|
+
"This property represents the release."
|
|
115
113
|
return self._release
|
|
116
114
|
|
|
117
115
|
@release.setter
|
|
@@ -12,6 +12,40 @@ from v440._utils.VList import VList
|
|
|
12
12
|
|
|
13
13
|
__all__ = ["Local"]
|
|
14
14
|
|
|
15
|
+
parse_data: Digest = Digest("parse_data")
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@parse_data.overload()
|
|
19
|
+
def parse_data() -> list:
|
|
20
|
+
return list()
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@parse_data.overload(int)
|
|
24
|
+
def parse_data(value: int) -> list:
|
|
25
|
+
return [value]
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@parse_data.overload(list)
|
|
29
|
+
def parse_data(value: list) -> list:
|
|
30
|
+
ans: list = list(map(utils.segment, value))
|
|
31
|
+
if None in ans:
|
|
32
|
+
raise ValueError
|
|
33
|
+
return ans
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@parse_data.overload(str)
|
|
37
|
+
def parse_data(value: str) -> list:
|
|
38
|
+
v: str = value
|
|
39
|
+
if v.startswith("+"):
|
|
40
|
+
v = v[1:]
|
|
41
|
+
v = v.replace("_", ".")
|
|
42
|
+
v = v.replace("-", ".")
|
|
43
|
+
ans: list = v.split(".")
|
|
44
|
+
ans = list(map(utils.segment, ans))
|
|
45
|
+
if None in ans:
|
|
46
|
+
raise ValueError
|
|
47
|
+
return ans
|
|
48
|
+
|
|
15
49
|
|
|
16
50
|
class Local(VList):
|
|
17
51
|
__slots__ = ()
|
|
@@ -34,42 +68,13 @@ class Local(VList):
|
|
|
34
68
|
ans = self._cmp() <= alt._cmp()
|
|
35
69
|
return ans
|
|
36
70
|
|
|
37
|
-
@setdoc.basic
|
|
38
|
-
def __str__(self: Self) -> str:
|
|
39
|
-
return ".".join(map(str, self))
|
|
40
|
-
|
|
41
71
|
def _cmp(self: Self) -> list:
|
|
42
72
|
return list(map(self._sortkey, self))
|
|
43
73
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
@_data_calc.overload()
|
|
47
|
-
def _data_calc(self: Self) -> list:
|
|
48
|
-
return list()
|
|
49
|
-
|
|
50
|
-
@_data_calc.overload(int)
|
|
51
|
-
def _data_calc(self: Self, value: int) -> list:
|
|
52
|
-
return [value]
|
|
53
|
-
|
|
54
|
-
@_data_calc.overload(list)
|
|
55
|
-
def _data_calc(self: Self, value: list) -> list:
|
|
56
|
-
ans: list = list(map(utils.segment, value))
|
|
57
|
-
if None in ans:
|
|
74
|
+
def _format(self: Self, format_spec: str) -> str:
|
|
75
|
+
if format_spec:
|
|
58
76
|
raise ValueError
|
|
59
|
-
return
|
|
60
|
-
|
|
61
|
-
@_data_calc.overload(str)
|
|
62
|
-
def _data_calc(self: Self, value: str) -> list:
|
|
63
|
-
v: str = value
|
|
64
|
-
if v.startswith("+"):
|
|
65
|
-
v = v[1:]
|
|
66
|
-
v = v.replace("_", ".")
|
|
67
|
-
v = v.replace("-", ".")
|
|
68
|
-
ans: list = v.split(".")
|
|
69
|
-
ans = list(map(utils.segment, ans))
|
|
70
|
-
if None in ans:
|
|
71
|
-
raise ValueError
|
|
72
|
-
return ans
|
|
77
|
+
return ".".join(map(str, self))
|
|
73
78
|
|
|
74
79
|
@staticmethod
|
|
75
80
|
def _sortkey(value: Any) -> tuple[bool, Any]:
|
|
@@ -83,7 +88,7 @@ class Local(VList):
|
|
|
83
88
|
@data.setter
|
|
84
89
|
@guard
|
|
85
90
|
def data(self: Self, value: Any) -> None:
|
|
86
|
-
self._data =
|
|
91
|
+
self._data = parse_data(value)
|
|
87
92
|
|
|
88
93
|
@functools.wraps(VList.sort)
|
|
89
94
|
def sort(self: Self, /, *, key: Any = None, **kwargs: Any) -> None:
|
|
@@ -52,11 +52,12 @@ class Public(SlotList):
|
|
|
52
52
|
self._qual = Qual()
|
|
53
53
|
self.data = data
|
|
54
54
|
|
|
55
|
-
def
|
|
56
|
-
return self.format()
|
|
55
|
+
def _format(self: Self, format_spec: str) -> str:
|
|
56
|
+
return format(self.base, format_spec) + format(self.qual)
|
|
57
57
|
|
|
58
58
|
@property
|
|
59
59
|
def base(self: Self) -> Base:
|
|
60
|
+
"This property represents the version base."
|
|
60
61
|
return self._base
|
|
61
62
|
|
|
62
63
|
@base.setter
|
|
@@ -74,11 +75,9 @@ class Public(SlotList):
|
|
|
74
75
|
def data(self: Self, value: Any) -> None:
|
|
75
76
|
self.base, self.qual = parse_data(value)
|
|
76
77
|
|
|
77
|
-
def format(self: Self, cutoff: Any = None) -> str:
|
|
78
|
-
return self.base.format(cutoff) + str(self.qual)
|
|
79
|
-
|
|
80
78
|
@property
|
|
81
79
|
def qual(self: Self) -> Qual:
|
|
80
|
+
"This property represents the qualification."
|
|
82
81
|
return self._qual
|
|
83
82
|
|
|
84
83
|
@qual.setter
|
|
@@ -16,6 +16,7 @@ class Qual(SlotList):
|
|
|
16
16
|
__slots__ = ("_prephase", "_presubphase", "_post", "_dev")
|
|
17
17
|
|
|
18
18
|
data: list
|
|
19
|
+
pre: tuple
|
|
19
20
|
prephase: Optional[str]
|
|
20
21
|
presubphase: Optional[int]
|
|
21
22
|
post: Optional[int]
|
|
@@ -33,19 +34,6 @@ class Qual(SlotList):
|
|
|
33
34
|
self._dev = None
|
|
34
35
|
self.data = data
|
|
35
36
|
|
|
36
|
-
@setdoc.basic
|
|
37
|
-
def __str__(self: Self) -> str:
|
|
38
|
-
ans: str = ""
|
|
39
|
-
if self.prephase is not None:
|
|
40
|
-
ans += self.prephase
|
|
41
|
-
if self.presubphase is not None:
|
|
42
|
-
ans += str(self.presubphase)
|
|
43
|
-
if self.post is not None:
|
|
44
|
-
ans += ".post%s" % self.post
|
|
45
|
-
if self.dev is not None:
|
|
46
|
-
ans += ".dev%s" % self.dev
|
|
47
|
-
return ans
|
|
48
|
-
|
|
49
37
|
def _cmp(self: Self) -> list:
|
|
50
38
|
ans: list = list()
|
|
51
39
|
if not self.pre.isempty():
|
|
@@ -60,6 +48,20 @@ class Qual(SlotList):
|
|
|
60
48
|
ans.append(float("inf") if self.dev is None else self.dev)
|
|
61
49
|
return ans
|
|
62
50
|
|
|
51
|
+
def _format(self: Self, format_spec: str) -> str:
|
|
52
|
+
if format_spec:
|
|
53
|
+
raise ValueError
|
|
54
|
+
ans: str = ""
|
|
55
|
+
if self.prephase is not None:
|
|
56
|
+
ans += self.prephase
|
|
57
|
+
if self.presubphase is not None:
|
|
58
|
+
ans += str(self.presubphase)
|
|
59
|
+
if self.post is not None:
|
|
60
|
+
ans += ".post%s" % self.post
|
|
61
|
+
if self.dev is not None:
|
|
62
|
+
ans += ".dev%s" % self.dev
|
|
63
|
+
return ans
|
|
64
|
+
|
|
63
65
|
@property
|
|
64
66
|
@setdoc.basic
|
|
65
67
|
def data(self: Self) -> list:
|
|
@@ -102,7 +104,7 @@ class Qual(SlotList):
|
|
|
102
104
|
|
|
103
105
|
@property
|
|
104
106
|
def pre(self: Self) -> tuple:
|
|
105
|
-
return
|
|
107
|
+
return self._prephase, self._presubphase
|
|
106
108
|
|
|
107
109
|
@pre.setter
|
|
108
110
|
@guard
|
|
@@ -148,9 +148,18 @@ class Release(VList):
|
|
|
148
148
|
k: range = utils.torange(key, len(self))
|
|
149
149
|
self._setitem_range(k, value)
|
|
150
150
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
151
|
+
def _format(self: Self, format_spec: str) -> str:
|
|
152
|
+
i: Optional[int]
|
|
153
|
+
if format_spec:
|
|
154
|
+
i = int(format_spec)
|
|
155
|
+
else:
|
|
156
|
+
i = None
|
|
157
|
+
l: list = self[:i]
|
|
158
|
+
if len(l) == 0:
|
|
159
|
+
l += [0]
|
|
160
|
+
l = list(map(str, l))
|
|
161
|
+
ans: str = ".".join(l)
|
|
162
|
+
return ans
|
|
154
163
|
|
|
155
164
|
def _getitem_int(self: Self, key: int) -> int:
|
|
156
165
|
if key < len(self):
|
|
@@ -222,13 +231,3 @@ class Release(VList):
|
|
|
222
231
|
while v and v[-1] == 0:
|
|
223
232
|
v.pop()
|
|
224
233
|
self._data = v
|
|
225
|
-
|
|
226
|
-
def format(self: Self, cutoff: Any = None) -> str:
|
|
227
|
-
s: str = str(cutoff) if cutoff else ""
|
|
228
|
-
i: Optional[int] = int(s) if s else None
|
|
229
|
-
l: list = self[:i]
|
|
230
|
-
if len(l) == 0:
|
|
231
|
-
l += [0]
|
|
232
|
-
l = list(map(str, l))
|
|
233
|
-
ans: str = ".".join(l)
|
|
234
|
-
return ans
|
|
@@ -52,9 +52,14 @@ class Version(SlotList):
|
|
|
52
52
|
self._local = Local()
|
|
53
53
|
self.data = data
|
|
54
54
|
|
|
55
|
-
@setdoc.basic
|
|
56
55
|
def __str__(self: Self) -> str:
|
|
57
|
-
return
|
|
56
|
+
return format(self)
|
|
57
|
+
|
|
58
|
+
def _format(self: Self, format_spec: str) -> str:
|
|
59
|
+
ans: str = format(self.public, format_spec)
|
|
60
|
+
if self.local:
|
|
61
|
+
ans += "+" + format(self.local)
|
|
62
|
+
return ans
|
|
58
63
|
|
|
59
64
|
@property
|
|
60
65
|
@setdoc.basic
|
|
@@ -66,12 +71,6 @@ class Version(SlotList):
|
|
|
66
71
|
def data(self: Self, value: Any) -> None:
|
|
67
72
|
self.public, self.local = parse_data(value)
|
|
68
73
|
|
|
69
|
-
def format(self: Self, cutoff: Any = None) -> str:
|
|
70
|
-
ans: str = self.public.format(cutoff)
|
|
71
|
-
if self.local:
|
|
72
|
-
ans += "+%s" % self.local
|
|
73
|
-
return ans
|
|
74
|
-
|
|
75
74
|
@property
|
|
76
75
|
def local(self: Self) -> Local:
|
|
77
76
|
return self._local
|
|
@@ -96,7 +96,7 @@ class TestExample(unittest.TestCase):
|
|
|
96
96
|
def test_example_1(self: Self) -> None:
|
|
97
97
|
v: Version = Version("v1.0.0")
|
|
98
98
|
self.assertEqual(str(v), "1") # Initial version
|
|
99
|
-
self.assertEqual(
|
|
99
|
+
self.assertEqual(format(v, "3"), "1.0.0") # Initial version formatted
|
|
100
100
|
|
|
101
101
|
def test_example_2(self: Self) -> None:
|
|
102
102
|
v: Version = Version("2.5.3")
|
|
@@ -163,7 +163,7 @@ class TestExample(unittest.TestCase):
|
|
|
163
163
|
v.public.qual.post = "post1"
|
|
164
164
|
v.local = "local.7.dev"
|
|
165
165
|
self.assertEqual(str(v), "1.2.3.post1+local.7.dev") # Post-release version
|
|
166
|
-
self.assertEqual(
|
|
166
|
+
self.assertEqual(format(v, "-1"), "1.2.post1+local.7.dev") # Formatted version
|
|
167
167
|
v.public.qual.post = "post.2"
|
|
168
168
|
self.assertEqual(str(v), "1.2.3.post2+local.7.dev") # Modified version
|
|
169
169
|
v.public.qual.post = None
|
|
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
|