plain 0.38.0__tar.gz → 0.39.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.
- {plain-0.38.0 → plain-0.39.0}/PKG-INFO +1 -1
- plain-0.39.0/plain/chores/__init__.py +3 -0
- plain-0.39.0/plain/chores/registry.py +79 -0
- plain-0.39.0/plain/cli/chores.py +91 -0
- {plain-0.38.0 → plain-0.39.0}/plain/cli/core.py +2 -0
- {plain-0.38.0 → plain-0.39.0}/plain/views/base.py +2 -11
- {plain-0.38.0 → plain-0.39.0}/pyproject.toml +1 -1
- {plain-0.38.0 → plain-0.39.0}/.gitignore +0 -0
- {plain-0.38.0 → plain-0.39.0}/LICENSE +0 -0
- {plain-0.38.0 → plain-0.39.0}/README.md +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/README.md +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/__main__.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/assets/README.md +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/assets/__init__.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/assets/compile.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/assets/finders.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/assets/fingerprints.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/assets/urls.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/assets/views.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/cli/README.md +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/cli/__init__.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/cli/build.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/cli/docs.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/cli/formatting.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/cli/preflight.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/cli/print.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/cli/registry.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/cli/scaffold.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/cli/settings.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/cli/shell.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/cli/startup.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/cli/urls.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/cli/utils.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/csrf/README.md +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/csrf/middleware.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/csrf/views.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/debug.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/exceptions.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/forms/README.md +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/forms/__init__.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/forms/boundfield.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/forms/exceptions.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/forms/fields.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/forms/forms.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/http/README.md +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/http/__init__.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/http/cookie.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/http/multipartparser.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/http/request.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/http/response.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/internal/__init__.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/internal/files/__init__.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/internal/files/base.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/internal/files/locks.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/internal/files/move.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/internal/files/temp.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/internal/files/uploadedfile.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/internal/files/uploadhandler.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/internal/files/utils.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/internal/handlers/__init__.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/internal/handlers/base.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/internal/handlers/exception.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/internal/handlers/wsgi.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/internal/middleware/__init__.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/internal/middleware/headers.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/internal/middleware/https.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/internal/middleware/slash.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/json.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/logs/README.md +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/logs/__init__.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/logs/configure.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/logs/loggers.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/logs/utils.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/packages/README.md +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/packages/__init__.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/packages/config.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/packages/registry.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/paginator.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/preflight/README.md +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/preflight/__init__.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/preflight/files.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/preflight/messages.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/preflight/registry.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/preflight/security.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/preflight/urls.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/runtime/README.md +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/runtime/__init__.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/runtime/global_settings.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/runtime/user_settings.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/signals/README.md +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/signals/__init__.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/signals/dispatch/__init__.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/signals/dispatch/dispatcher.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/signals/dispatch/license.txt +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/signing.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/templates/README.md +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/templates/__init__.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/templates/core.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/templates/jinja/__init__.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/templates/jinja/environments.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/templates/jinja/extensions.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/templates/jinja/filters.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/templates/jinja/globals.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/test/README.md +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/test/__init__.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/test/client.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/test/encoding.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/test/exceptions.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/urls/README.md +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/urls/__init__.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/urls/converters.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/urls/exceptions.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/urls/patterns.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/urls/resolvers.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/urls/routers.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/urls/utils.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/utils/README.md +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/utils/__init__.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/utils/cache.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/utils/connection.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/utils/crypto.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/utils/datastructures.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/utils/dateparse.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/utils/deconstruct.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/utils/decorators.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/utils/duration.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/utils/encoding.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/utils/functional.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/utils/hashable.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/utils/html.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/utils/http.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/utils/inspect.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/utils/ipv6.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/utils/itercompat.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/utils/module_loading.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/utils/regex_helper.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/utils/safestring.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/utils/text.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/utils/timesince.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/utils/timezone.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/utils/tree.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/validators.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/views/README.md +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/views/__init__.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/views/csrf.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/views/errors.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/views/exceptions.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/views/forms.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/views/objects.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/views/redirect.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/views/templates.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/plain/wsgi.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/tests/.bolt/assets_collected/assets.json +0 -0
- {plain-0.38.0 → plain-0.39.0}/tests/.gitignore +0 -0
- {plain-0.38.0 → plain-0.39.0}/tests/app/.gitignore +0 -0
- {plain-0.38.0 → plain-0.39.0}/tests/app/settings.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/tests/app/test/__init__.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/tests/app/test/default_settings.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/tests/app/urls.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/tests/conftest.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/tests/test_cli.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/tests/test_runtime.py +0 -0
- {plain-0.38.0 → plain-0.39.0}/tests/test_wsgi.py +0 -0
@@ -0,0 +1,79 @@
|
|
1
|
+
from importlib import import_module
|
2
|
+
from importlib.util import find_spec
|
3
|
+
|
4
|
+
from plain.packages import packages_registry
|
5
|
+
|
6
|
+
|
7
|
+
class Chore:
|
8
|
+
def __init__(self, *, group, func):
|
9
|
+
self.group = group
|
10
|
+
self.func = func
|
11
|
+
self.name = f"{group}.{func.__name__}"
|
12
|
+
self.description = func.__doc__.strip() if func.__doc__ else ""
|
13
|
+
|
14
|
+
def __str__(self):
|
15
|
+
return self.name
|
16
|
+
|
17
|
+
def run(self):
|
18
|
+
"""
|
19
|
+
Run the chore.
|
20
|
+
"""
|
21
|
+
return self.func()
|
22
|
+
|
23
|
+
|
24
|
+
class ChoresRegistry:
|
25
|
+
def __init__(self):
|
26
|
+
self._chores = {}
|
27
|
+
|
28
|
+
def register_chore(self, chore):
|
29
|
+
"""
|
30
|
+
Register a chore with the specified name.
|
31
|
+
"""
|
32
|
+
self._chores[chore.func] = chore
|
33
|
+
|
34
|
+
def import_modules(self):
|
35
|
+
"""
|
36
|
+
Import modules from installed packages and app to trigger registration.
|
37
|
+
"""
|
38
|
+
# Import from installed packages
|
39
|
+
for package_config in packages_registry.get_package_configs():
|
40
|
+
import_name = f"{package_config.name}.chores"
|
41
|
+
try:
|
42
|
+
import_module(import_name)
|
43
|
+
except ModuleNotFoundError:
|
44
|
+
pass
|
45
|
+
|
46
|
+
# Import from app
|
47
|
+
import_name = "app.chores"
|
48
|
+
if find_spec(import_name):
|
49
|
+
try:
|
50
|
+
import_module(import_name)
|
51
|
+
except ModuleNotFoundError:
|
52
|
+
pass
|
53
|
+
|
54
|
+
def get_chores(self):
|
55
|
+
"""
|
56
|
+
Get all registered chores.
|
57
|
+
"""
|
58
|
+
return list(self._chores.values())
|
59
|
+
|
60
|
+
|
61
|
+
chores_registry = ChoresRegistry()
|
62
|
+
|
63
|
+
|
64
|
+
def register_chore(group):
|
65
|
+
"""
|
66
|
+
Register a chore with a given group.
|
67
|
+
|
68
|
+
Usage:
|
69
|
+
@register_chore("clear_expired")
|
70
|
+
def clear_expired():
|
71
|
+
pass
|
72
|
+
"""
|
73
|
+
|
74
|
+
def wrapper(func):
|
75
|
+
chore = Chore(group=group, func=func)
|
76
|
+
chores_registry.register_chore(chore)
|
77
|
+
return func
|
78
|
+
|
79
|
+
return wrapper
|
@@ -0,0 +1,91 @@
|
|
1
|
+
import logging
|
2
|
+
import sys
|
3
|
+
|
4
|
+
import click
|
5
|
+
|
6
|
+
logger = logging.getLogger("plain.chores")
|
7
|
+
|
8
|
+
|
9
|
+
@click.group()
|
10
|
+
def chores():
|
11
|
+
"""Routine maintenance tasks"""
|
12
|
+
pass
|
13
|
+
|
14
|
+
|
15
|
+
@chores.command("list")
|
16
|
+
@click.option("--group", default=None, type=str, help="Group to run", multiple=True)
|
17
|
+
@click.option(
|
18
|
+
"--name", default=None, type=str, help="Name of the chore to run", multiple=True
|
19
|
+
)
|
20
|
+
def list_chores(group, name):
|
21
|
+
"""
|
22
|
+
List all registered chores.
|
23
|
+
"""
|
24
|
+
from plain.chores.registry import chores_registry
|
25
|
+
|
26
|
+
chores_registry.import_modules()
|
27
|
+
|
28
|
+
if group or name:
|
29
|
+
chores = [
|
30
|
+
chore
|
31
|
+
for chore in chores_registry.get_chores()
|
32
|
+
if (chore.group in group or not group) and (chore.name in name or not name)
|
33
|
+
]
|
34
|
+
else:
|
35
|
+
chores = chores_registry.get_chores()
|
36
|
+
|
37
|
+
for chore in chores:
|
38
|
+
click.secho(f"{chore}", bold=True, nl=False)
|
39
|
+
if chore.description:
|
40
|
+
click.echo(f": {chore.description}")
|
41
|
+
else:
|
42
|
+
click.echo("")
|
43
|
+
|
44
|
+
|
45
|
+
@chores.command("run")
|
46
|
+
@click.option("--group", default=None, type=str, help="Group to run", multiple=True)
|
47
|
+
@click.option(
|
48
|
+
"--name", default=None, type=str, help="Name of the chore to run", multiple=True
|
49
|
+
)
|
50
|
+
@click.option(
|
51
|
+
"--dry-run", is_flag=True, help="Show what would be done without executing"
|
52
|
+
)
|
53
|
+
def run_chores(group, name, dry_run):
|
54
|
+
"""
|
55
|
+
Run the specified chores.
|
56
|
+
"""
|
57
|
+
from plain.chores.registry import chores_registry
|
58
|
+
|
59
|
+
chores_registry.import_modules()
|
60
|
+
|
61
|
+
if group or name:
|
62
|
+
chores = [
|
63
|
+
chore
|
64
|
+
for chore in chores_registry.get_chores()
|
65
|
+
if (chore.group in group or not group) and (chore.name in name or not name)
|
66
|
+
]
|
67
|
+
else:
|
68
|
+
chores = chores_registry.get_chores()
|
69
|
+
|
70
|
+
chores_failed = []
|
71
|
+
|
72
|
+
for chore in chores:
|
73
|
+
click.echo(f"{chore.name}:", nl=False)
|
74
|
+
if dry_run:
|
75
|
+
click.echo(" (dry run)", fg="yellow")
|
76
|
+
else:
|
77
|
+
try:
|
78
|
+
result = chore.run()
|
79
|
+
except Exception:
|
80
|
+
click.secho(" Failed", fg="red")
|
81
|
+
chores_failed.append(chore)
|
82
|
+
logger.exception(f"Error running chore {chore.name}")
|
83
|
+
continue
|
84
|
+
|
85
|
+
if result is None:
|
86
|
+
click.secho(" Done", fg="green")
|
87
|
+
else:
|
88
|
+
click.secho(f" {result}", fg="green")
|
89
|
+
|
90
|
+
if chores_failed:
|
91
|
+
sys.exit(1)
|
@@ -7,6 +7,7 @@ import plain.runtime
|
|
7
7
|
from plain.exceptions import ImproperlyConfigured
|
8
8
|
|
9
9
|
from .build import build
|
10
|
+
from .chores import chores
|
10
11
|
from .docs import docs
|
11
12
|
from .formatting import PlainContext
|
12
13
|
from .preflight import preflight_checks
|
@@ -26,6 +27,7 @@ def plain_cli():
|
|
26
27
|
plain_cli.add_command(docs)
|
27
28
|
plain_cli.add_command(preflight_checks)
|
28
29
|
plain_cli.add_command(create)
|
30
|
+
plain_cli.add_command(chores)
|
29
31
|
plain_cli.add_command(build)
|
30
32
|
plain_cli.add_command(utils)
|
31
33
|
plain_cli.add_command(urls)
|
@@ -1,4 +1,5 @@
|
|
1
1
|
import logging
|
2
|
+
from http import HTTPMethod
|
2
3
|
|
3
4
|
from plain.http import (
|
4
5
|
HttpRequest,
|
@@ -100,14 +101,4 @@ class View:
|
|
100
101
|
return response
|
101
102
|
|
102
103
|
def _allowed_methods(self) -> list[str]:
|
103
|
-
|
104
|
-
"get",
|
105
|
-
"post",
|
106
|
-
"put",
|
107
|
-
"patch",
|
108
|
-
"delete",
|
109
|
-
"head",
|
110
|
-
"options",
|
111
|
-
"trace",
|
112
|
-
]
|
113
|
-
return [m.upper() for m in known_http_methods if hasattr(self, m)]
|
104
|
+
return [m.upper() for m in HTTPMethod if hasattr(self, m.lower())]
|
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
|
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
|
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
|