sinatra-dev 0.1.0__tar.gz → 0.1.1__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.
- sinatra_dev-0.1.0/README.md → sinatra_dev-0.1.1/PKG-INFO +49 -5
- sinatra_dev-0.1.0/PKG-INFO → sinatra_dev-0.1.1/README.md +21 -31
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/pyproject.toml +19 -5
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/.gitignore +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/LICENSE +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/__init__.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_client.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_errors.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/__init__.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/api/__init__.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/api/me/__init__.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/api/me/me_get.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/api/me/me_revoke_token.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/api/messages/__init__.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/api/messages/messages_create.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/api/messages/messages_list.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/api/tasks/__init__.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/api/tasks/tasks_create.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/api/tasks/tasks_get.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/api/tasks/tasks_list.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/api/tasks/tasks_stop.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/api/tickets/__init__.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/api/tickets/tickets_delegate.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/api/tickets/tickets_search.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/client.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/errors.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/models/__init__.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/models/create_message_request.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/models/create_message_response.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/models/create_task_request.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/models/create_task_response.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/models/delegate_github_ticket.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/models/delegate_linear_ticket.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/models/delegate_ticket_response.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/models/error.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/models/me.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/models/me_user.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/models/message.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/models/message_list.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/models/pull_request.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/models/stop_task_response.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/models/task.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/models/task_list.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/models/ticket.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/models/ticket_search_result.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/models/ticket_search_result_github.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/models/ticket_search_result_linear.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/models/workspace.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/types.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_retry.py +0 -0
- {sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/py.typed +0 -0
|
@@ -1,8 +1,38 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: sinatra-dev
|
|
3
|
+
Version: 0.1.1
|
|
4
|
+
Summary: Official Python client for sinatra.dev, the AI coding agent that turns Linear and GitHub issues into pull requests: start, follow and stop tasks, and delegate issues.
|
|
5
|
+
Project-URL: Homepage, https://www.sinatra.dev
|
|
6
|
+
Project-URL: Documentation, https://docs.sinatra.dev/docs/api-reference
|
|
7
|
+
Project-URL: Repository, https://github.com/sinatra-dev/sinatra-python
|
|
8
|
+
Project-URL: Issues, https://github.com/sinatra-dev/sinatra-python/issues
|
|
9
|
+
Author-email: Sinatra <contact@sinatra.dev>
|
|
10
|
+
License-Expression: MIT
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Keywords: ai-coding-agent,api-client,automation,background-agent,coding-agent,github,linear,pull-request,sdk,sinatra,sinatra.dev
|
|
13
|
+
Classifier: Development Status :: 4 - Beta
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
21
|
+
Classifier: Topic :: Software Development
|
|
22
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
23
|
+
Classifier: Typing :: Typed
|
|
24
|
+
Requires-Python: >=3.11
|
|
25
|
+
Requires-Dist: attrs>=22.2.0
|
|
26
|
+
Requires-Dist: httpx<0.29.0,>=0.23.1
|
|
27
|
+
Description-Content-Type: text/markdown
|
|
28
|
+
|
|
29
|
+
# Sinatra Python SDK
|
|
30
|
+
|
|
31
|
+
`sinatra-dev` is the official Python client for [sinatra.dev](https://www.sinatra.dev), the hosted AI coding agent that turns Linear and GitHub issues into pull requests. Assign Sinatra an issue, mention it in Slack, or start a task from code, and it writes the change in its own sandbox and opens a draft pull request for your team to review.
|
|
32
|
+
|
|
33
|
+
With this client you can start, follow and stop Sinatra tasks and delegate Linear and GitHub issues from your own scripts, CI jobs and tools, through the [Sinatra API](https://docs.sinatra.dev/docs/api-reference).
|
|
34
|
+
|
|
35
|
+
It runs on Python 3.11 and later, is typed (`py.typed`), and depends only on `httpx` and `attrs`. The client is generated from the API's [OpenAPI spec](https://api.sinatra.dev/openapi.json) and released automatically when the spec changes. There are also official SDKs for [Node.js / TypeScript](https://github.com/sinatra-dev/sinatra-node) and [Go](https://github.com/sinatra-dev/sinatra-go); see [SDKs](https://docs.sinatra.dev/docs/sdks).
|
|
6
36
|
|
|
7
37
|
## Install
|
|
8
38
|
|
|
@@ -44,6 +74,20 @@ with Sinatra() as sinatra: # reads SINATRA_TOKEN
|
|
|
44
74
|
|
|
45
75
|
The API has no streaming. To wait for a reply, read the conversation after the last entry you've seen, and check the task's `status`: the agent posts one reply per turn, and the turn is done when the task stops working. The loop reads the status before the conversation, so it never stops before printing the reply that ended the turn. An unknown status counts as done, so the loop can't wait forever on a status added after this was written. See [How replies work](https://docs.sinatra.dev/docs/cli-and-api#how-replies-work).
|
|
46
76
|
|
|
77
|
+
## Examples
|
|
78
|
+
|
|
79
|
+
[`examples/`](https://github.com/sinatra-dev/sinatra-python/tree/main/examples) has small programs you can run as they are:
|
|
80
|
+
|
|
81
|
+
- [`delegate_issue.py`](https://github.com/sinatra-dev/sinatra-python/blob/main/examples/delegate_issue.py): hand Sinatra a Linear issue (`ENG-123`) or a GitHub issue (`acme/web#42`), for example from a CI job.
|
|
82
|
+
- [`search_issues.py`](https://github.com/sinatra-dev/sinatra-python/blob/main/examples/search_issues.py): list the open issues you could delegate, yours first.
|
|
83
|
+
- [`open_prs.py`](https://github.com/sinatra-dev/sinatra-python/blob/main/examples/open_prs.py): print the pull requests Sinatra has open in each workspace as a Markdown list, for a standup or a Slack post.
|
|
84
|
+
|
|
85
|
+
With the package installed (`pip install sinatra-dev`), or from a checkout with `uv run`:
|
|
86
|
+
|
|
87
|
+
```sh
|
|
88
|
+
SINATRA_TOKEN=sntr_... uv run python examples/open_prs.py
|
|
89
|
+
```
|
|
90
|
+
|
|
47
91
|
## Authentication
|
|
48
92
|
|
|
49
93
|
Create a personal access token on the [Access tokens](https://app.sinatra.dev/tokens) page (**CLI & API** in the dashboard). It starts with `sntr_` and acts as you in every workspace you belong to. The client reads it from the `SINATRA_TOKEN` environment variable, or you can pass it:
|
|
@@ -1,34 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
Project-URL: Issues, https://github.com/sinatra-dev/sinatra-python/issues
|
|
9
|
-
Author-email: Sinatra <contact@sinatra.dev>
|
|
10
|
-
License-Expression: MIT
|
|
11
|
-
License-File: LICENSE
|
|
12
|
-
Keywords: api-client,coding-agent,sdk,sinatra,sinatra.dev
|
|
13
|
-
Classifier: Development Status :: 4 - Beta
|
|
14
|
-
Classifier: Intended Audience :: Developers
|
|
15
|
-
Classifier: Programming Language :: Python :: 3
|
|
16
|
-
Classifier: Programming Language :: Python :: 3 :: Only
|
|
17
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
-
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
-
Classifier: Programming Language :: Python :: 3.14
|
|
21
|
-
Classifier: Typing :: Typed
|
|
22
|
-
Requires-Python: >=3.11
|
|
23
|
-
Requires-Dist: attrs>=22.2.0
|
|
24
|
-
Requires-Dist: httpx<0.29.0,>=0.23.1
|
|
25
|
-
Description-Content-Type: text/markdown
|
|
26
|
-
|
|
27
|
-
# sinatra-dev
|
|
28
|
-
|
|
29
|
-
A Python client for the [Sinatra API](https://docs.sinatra.dev/docs/api-reference): start, follow and stop Sinatra tasks, and delegate Linear and GitHub issues.
|
|
30
|
-
|
|
31
|
-
It runs on Python 3.11 and later, is typed (`py.typed`), and depends only on `httpx` and `attrs`. The client is generated from the API's [OpenAPI spec](https://api.sinatra.dev/openapi.json) and released automatically when the spec changes.
|
|
1
|
+
# Sinatra Python SDK
|
|
2
|
+
|
|
3
|
+
`sinatra-dev` is the official Python client for [sinatra.dev](https://www.sinatra.dev), the hosted AI coding agent that turns Linear and GitHub issues into pull requests. Assign Sinatra an issue, mention it in Slack, or start a task from code, and it writes the change in its own sandbox and opens a draft pull request for your team to review.
|
|
4
|
+
|
|
5
|
+
With this client you can start, follow and stop Sinatra tasks and delegate Linear and GitHub issues from your own scripts, CI jobs and tools, through the [Sinatra API](https://docs.sinatra.dev/docs/api-reference).
|
|
6
|
+
|
|
7
|
+
It runs on Python 3.11 and later, is typed (`py.typed`), and depends only on `httpx` and `attrs`. The client is generated from the API's [OpenAPI spec](https://api.sinatra.dev/openapi.json) and released automatically when the spec changes. There are also official SDKs for [Node.js / TypeScript](https://github.com/sinatra-dev/sinatra-node) and [Go](https://github.com/sinatra-dev/sinatra-go); see [SDKs](https://docs.sinatra.dev/docs/sdks).
|
|
32
8
|
|
|
33
9
|
## Install
|
|
34
10
|
|
|
@@ -70,6 +46,20 @@ with Sinatra() as sinatra: # reads SINATRA_TOKEN
|
|
|
70
46
|
|
|
71
47
|
The API has no streaming. To wait for a reply, read the conversation after the last entry you've seen, and check the task's `status`: the agent posts one reply per turn, and the turn is done when the task stops working. The loop reads the status before the conversation, so it never stops before printing the reply that ended the turn. An unknown status counts as done, so the loop can't wait forever on a status added after this was written. See [How replies work](https://docs.sinatra.dev/docs/cli-and-api#how-replies-work).
|
|
72
48
|
|
|
49
|
+
## Examples
|
|
50
|
+
|
|
51
|
+
[`examples/`](https://github.com/sinatra-dev/sinatra-python/tree/main/examples) has small programs you can run as they are:
|
|
52
|
+
|
|
53
|
+
- [`delegate_issue.py`](https://github.com/sinatra-dev/sinatra-python/blob/main/examples/delegate_issue.py): hand Sinatra a Linear issue (`ENG-123`) or a GitHub issue (`acme/web#42`), for example from a CI job.
|
|
54
|
+
- [`search_issues.py`](https://github.com/sinatra-dev/sinatra-python/blob/main/examples/search_issues.py): list the open issues you could delegate, yours first.
|
|
55
|
+
- [`open_prs.py`](https://github.com/sinatra-dev/sinatra-python/blob/main/examples/open_prs.py): print the pull requests Sinatra has open in each workspace as a Markdown list, for a standup or a Slack post.
|
|
56
|
+
|
|
57
|
+
With the package installed (`pip install sinatra-dev`), or from a checkout with `uv run`:
|
|
58
|
+
|
|
59
|
+
```sh
|
|
60
|
+
SINATRA_TOKEN=sntr_... uv run python examples/open_prs.py
|
|
61
|
+
```
|
|
62
|
+
|
|
73
63
|
## Authentication
|
|
74
64
|
|
|
75
65
|
Create a personal access token on the [Access tokens](https://app.sinatra.dev/tokens) page (**CLI & API** in the dashboard). It starts with `sntr_` and acts as you in every workspace you belong to. The client reads it from the `SINATRA_TOKEN` environment variable, or you can pass it:
|
|
@@ -1,16 +1,30 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "sinatra-dev"
|
|
3
|
-
version = "0.1.
|
|
4
|
-
description = "Python client for the
|
|
3
|
+
version = "0.1.1"
|
|
4
|
+
description = "Official Python client for sinatra.dev, the AI coding agent that turns Linear and GitHub issues into pull requests: start, follow and stop tasks, and delegate issues."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = "MIT"
|
|
7
7
|
license-files = ["LICENSE"]
|
|
8
8
|
requires-python = ">=3.11"
|
|
9
9
|
authors = [{ name = "Sinatra", email = "contact@sinatra.dev" }]
|
|
10
|
-
keywords = [
|
|
10
|
+
keywords = [
|
|
11
|
+
"sinatra",
|
|
12
|
+
"sinatra.dev",
|
|
13
|
+
"sdk",
|
|
14
|
+
"api-client",
|
|
15
|
+
"coding-agent",
|
|
16
|
+
"ai-coding-agent",
|
|
17
|
+
"background-agent",
|
|
18
|
+
"linear",
|
|
19
|
+
"github",
|
|
20
|
+
"pull-request",
|
|
21
|
+
"automation",
|
|
22
|
+
]
|
|
11
23
|
classifiers = [
|
|
12
24
|
"Development Status :: 4 - Beta",
|
|
13
25
|
"Intended Audience :: Developers",
|
|
26
|
+
"Topic :: Software Development",
|
|
27
|
+
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
14
28
|
"Programming Language :: Python :: 3",
|
|
15
29
|
"Programming Language :: Python :: 3 :: Only",
|
|
16
30
|
"Programming Language :: Python :: 3.11",
|
|
@@ -27,7 +41,7 @@ dependencies = [
|
|
|
27
41
|
]
|
|
28
42
|
|
|
29
43
|
[project.urls]
|
|
30
|
-
Homepage = "https://sinatra.dev"
|
|
44
|
+
Homepage = "https://www.sinatra.dev"
|
|
31
45
|
Documentation = "https://docs.sinatra.dev/docs/api-reference"
|
|
32
46
|
Repository = "https://github.com/sinatra-dev/sinatra-python"
|
|
33
47
|
Issues = "https://github.com/sinatra-dev/sinatra-python/issues"
|
|
@@ -68,7 +82,7 @@ select = ["E", "F", "W", "I", "B", "UP", "SIM", "RUF"]
|
|
|
68
82
|
[tool.mypy]
|
|
69
83
|
python_version = "3.11"
|
|
70
84
|
strict = true
|
|
71
|
-
files = ["src/sinatra_dev", "tests"]
|
|
85
|
+
files = ["src/sinatra_dev", "tests", "examples"]
|
|
72
86
|
|
|
73
87
|
# The generated httpx Client/AuthenticatedClient wrappers don't pass strict
|
|
74
88
|
# mypy, and the wrapper never uses them (it sends requests itself). The rest
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/api/me/me_revoke_token.py
RENAMED
|
File without changes
|
|
File without changes
|
{sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/api/messages/messages_create.py
RENAMED
|
File without changes
|
{sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/api/messages/messages_list.py
RENAMED
|
File without changes
|
|
File without changes
|
{sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/api/tasks/tasks_create.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/api/tickets/tickets_delegate.py
RENAMED
|
File without changes
|
{sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/api/tickets/tickets_search.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/models/create_message_request.py
RENAMED
|
File without changes
|
{sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/models/create_message_response.py
RENAMED
|
File without changes
|
{sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/models/create_task_request.py
RENAMED
|
File without changes
|
{sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/models/create_task_response.py
RENAMED
|
File without changes
|
{sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/models/delegate_github_ticket.py
RENAMED
|
File without changes
|
{sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/models/delegate_linear_ticket.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
|
{sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/models/stop_task_response.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sinatra_dev-0.1.0 → sinatra_dev-0.1.1}/src/sinatra_dev/_generated/models/ticket_search_result.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|