easterobot 1.0.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.
Files changed (74) hide show
  1. easterobot-1.0.0/.dockerignore +9 -0
  2. easterobot-1.0.0/.editorconfig +49 -0
  3. easterobot-1.0.0/.github/actions/setup-project/action.yml +30 -0
  4. easterobot-1.0.0/.github/workflows/docs.yml +35 -0
  5. easterobot-1.0.0/.github/workflows/lint.yml +23 -0
  6. easterobot-1.0.0/.github/workflows/publish.yml +35 -0
  7. easterobot-1.0.0/.github/workflows/tests.yml +39 -0
  8. easterobot-1.0.0/.gitignore +115 -0
  9. easterobot-1.0.0/.pre-commit-config.yaml +50 -0
  10. easterobot-1.0.0/.vscode/extensions.json +31 -0
  11. easterobot-1.0.0/.vscode/ltex.dictionary.en-US.txt +5 -0
  12. easterobot-1.0.0/.vscode/ltex.hiddenFalsePositives.en-US.txt +1 -0
  13. easterobot-1.0.0/.vscode/settings.json +98 -0
  14. easterobot-1.0.0/Dockerfile +39 -0
  15. easterobot-1.0.0/LICENSE +21 -0
  16. easterobot-1.0.0/PKG-INFO +242 -0
  17. easterobot-1.0.0/README.rst +205 -0
  18. easterobot-1.0.0/conftest.py +13 -0
  19. easterobot-1.0.0/docker-compose.yml +11 -0
  20. easterobot-1.0.0/docs/conf.py +65 -0
  21. easterobot-1.0.0/docs/index.rst +15 -0
  22. easterobot-1.0.0/docs/references.rst +9 -0
  23. easterobot-1.0.0/docs/resources/favicon.png +0 -0
  24. easterobot-1.0.0/easterobot/__init__.py +19 -0
  25. easterobot-1.0.0/easterobot/__main__.py +6 -0
  26. easterobot-1.0.0/easterobot/bot.py +584 -0
  27. easterobot-1.0.0/easterobot/cli.py +127 -0
  28. easterobot-1.0.0/easterobot/commands/__init__.py +28 -0
  29. easterobot-1.0.0/easterobot/commands/base.py +171 -0
  30. easterobot-1.0.0/easterobot/commands/basket.py +99 -0
  31. easterobot-1.0.0/easterobot/commands/disable.py +29 -0
  32. easterobot-1.0.0/easterobot/commands/edit.py +68 -0
  33. easterobot-1.0.0/easterobot/commands/enable.py +35 -0
  34. easterobot-1.0.0/easterobot/commands/help.py +33 -0
  35. easterobot-1.0.0/easterobot/commands/reset.py +121 -0
  36. easterobot-1.0.0/easterobot/commands/search.py +127 -0
  37. easterobot-1.0.0/easterobot/commands/top.py +105 -0
  38. easterobot-1.0.0/easterobot/config.py +401 -0
  39. easterobot-1.0.0/easterobot/info.py +18 -0
  40. easterobot-1.0.0/easterobot/logger.py +16 -0
  41. easterobot-1.0.0/easterobot/models.py +58 -0
  42. easterobot-1.0.0/easterobot/py.typed +1 -0
  43. easterobot-1.0.0/easterobot/resources/config.example.yml +226 -0
  44. easterobot-1.0.0/easterobot/resources/credits.txt +1 -0
  45. easterobot-1.0.0/easterobot/resources/eggs/egg_01.png +0 -0
  46. easterobot-1.0.0/easterobot/resources/eggs/egg_02.png +0 -0
  47. easterobot-1.0.0/easterobot/resources/eggs/egg_03.png +0 -0
  48. easterobot-1.0.0/easterobot/resources/eggs/egg_04.png +0 -0
  49. easterobot-1.0.0/easterobot/resources/eggs/egg_05.png +0 -0
  50. easterobot-1.0.0/easterobot/resources/eggs/egg_06.png +0 -0
  51. easterobot-1.0.0/easterobot/resources/eggs/egg_07.png +0 -0
  52. easterobot-1.0.0/easterobot/resources/eggs/egg_08.png +0 -0
  53. easterobot-1.0.0/easterobot/resources/eggs/egg_09.png +0 -0
  54. easterobot-1.0.0/easterobot/resources/eggs/egg_10.png +0 -0
  55. easterobot-1.0.0/easterobot/resources/eggs/egg_11.png +0 -0
  56. easterobot-1.0.0/easterobot/resources/eggs/egg_12.png +0 -0
  57. easterobot-1.0.0/easterobot/resources/eggs/egg_13.png +0 -0
  58. easterobot-1.0.0/easterobot/resources/eggs/egg_14.png +0 -0
  59. easterobot-1.0.0/easterobot/resources/eggs/egg_15.png +0 -0
  60. easterobot-1.0.0/easterobot/resources/eggs/egg_16.png +0 -0
  61. easterobot-1.0.0/easterobot/resources/eggs/egg_17.png +0 -0
  62. easterobot-1.0.0/easterobot/resources/eggs/egg_18.png +0 -0
  63. easterobot-1.0.0/easterobot/resources/eggs/egg_19.png +0 -0
  64. easterobot-1.0.0/easterobot/resources/eggs/egg_20.png +0 -0
  65. easterobot-1.0.0/easterobot/resources/logging.conf +47 -0
  66. easterobot-1.0.0/easterobot/resources/logo.png +0 -0
  67. easterobot-1.0.0/entrypoint.sh +6 -0
  68. easterobot-1.0.0/pyproject.toml +406 -0
  69. easterobot-1.0.0/tests/__init__.py +1 -0
  70. easterobot-1.0.0/tests/test_cli.py +48 -0
  71. easterobot-1.0.0/tests/test_config.py +12 -0
  72. easterobot-1.0.0/tools/chatgpt.txt +19 -0
  73. easterobot-1.0.0/tools/cropping.py +94 -0
  74. easterobot-1.0.0/uv.lock +2071 -0
@@ -0,0 +1,9 @@
1
+ *
2
+ !uv.lock
3
+ !pyproject.toml
4
+ !LICENSE
5
+ !/easterobot/*.py
6
+ !/easterobot/commands/*.py
7
+ !/easterobot/resources
8
+ !README.rst
9
+ !entrypoint.sh
@@ -0,0 +1,49 @@
1
+ # https://editorconfig.org/
2
+ root = true
3
+
4
+ [*]
5
+ charset = utf-8
6
+ end_of_line = lf
7
+ indent_size = 2
8
+ indent_style = space
9
+
10
+ [*.py]
11
+ indent_size = 4
12
+ max_line_length = 79
13
+ insert_final_newline = true
14
+ trim_trailing_whitespace = true
15
+
16
+ [*.{tex,bib,toml}]
17
+ indent_size = 4
18
+ insert_final_newline = true
19
+ trim_trailing_whitespace = true
20
+
21
+ [Dockerfile]
22
+ indent_size = 4
23
+
24
+ [*.{yml,yaml,json,jsonc,jsonl,js,ts}]
25
+ indent_size = 2
26
+ insert_final_newline = true
27
+ trim_trailing_whitespace = true
28
+
29
+ [*.{bat,cmd,ps1}]
30
+ indent_style = tab
31
+ end_of_line = crlf
32
+ insert_final_newline = true
33
+ trim_trailing_whitespace = true
34
+
35
+ [*.{md,txt,rst}]
36
+ insert_final_newline = true
37
+ trim_trailing_whitespace = false
38
+
39
+ [*.tsv]
40
+ indent_style = tab
41
+
42
+ [Makefile]
43
+ indent_style = tab
44
+ insert_final_newline = true
45
+ trim_trailing_whitespace = true
46
+
47
+ [LICENSE]
48
+ insert_final_newline = false
49
+ trim_trailing_whitespace = true
@@ -0,0 +1,30 @@
1
+ name: "Setup Python Environment"
2
+ description: "Set up Python environment for the given Python version"
3
+
4
+ inputs:
5
+ python-version:
6
+ description: "Python version to use"
7
+ required: true
8
+ default: "3.12"
9
+ uv-version:
10
+ description: "uv version to use"
11
+ required: true
12
+ default: "0.6.5"
13
+
14
+ runs:
15
+ using: "composite"
16
+ steps:
17
+ - uses: actions/setup-python@v5
18
+ with:
19
+ python-version: ${{ inputs.python-version }}
20
+
21
+ - name: Install uv
22
+ uses: astral-sh/setup-uv@v2
23
+ with:
24
+ version: ${{ inputs.uv-version }}
25
+ enable-cache: "true"
26
+ cache-suffix: ${{ matrix.python-version }}
27
+
28
+ - name: Install Python dependencies
29
+ run: uv sync --frozen
30
+ shell: bash
@@ -0,0 +1,35 @@
1
+ name: docs
2
+
3
+ on:
4
+ - push
5
+
6
+ permissions:
7
+ contents: write
8
+
9
+ jobs:
10
+ docs:
11
+ name: Docs
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - name: Check out repository
15
+ uses: actions/checkout@v4
16
+
17
+ - uses: actions/cache@v4
18
+ with:
19
+ path: ~/.cache/pre-commit
20
+ key: pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
21
+
22
+ - name: Set up project and environment
23
+ uses: ./.github/actions/setup-project
24
+
25
+ - name: Build documentation
26
+ run: uv run poe docs
27
+
28
+ - name: Deploy docs
29
+ uses: peaceiris/actions-gh-pages@v3
30
+ if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
31
+ with:
32
+ publish_branch: gh-pages
33
+ github_token: ${{ secrets.GITHUB_TOKEN }}
34
+ publish_dir: ./public
35
+ force_orphan: true
@@ -0,0 +1,23 @@
1
+ name: lint
2
+
3
+ on:
4
+ - push
5
+
6
+ jobs:
7
+ lint:
8
+ name: Lint
9
+ runs-on: ubuntu-latest
10
+ steps:
11
+ - name: Check out repository
12
+ uses: actions/checkout@v4
13
+
14
+ - uses: actions/cache@v4
15
+ with:
16
+ path: ~/.cache/pre-commit
17
+ key: pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
18
+
19
+ - name: Set up project and environment
20
+ uses: ./.github/actions/setup-project
21
+
22
+ - name: Run linting
23
+ run: uv run poe lint
@@ -0,0 +1,35 @@
1
+ name: publish
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "**"
7
+
8
+ jobs:
9
+ publish:
10
+ name: Publish on PyPI
11
+ runs-on: ubuntu-latest
12
+ environment:
13
+ name: pypi
14
+ url: https://pypi.org/p/easterobot
15
+ permissions:
16
+ id-token: write
17
+ steps:
18
+
19
+ - name: Check out repository
20
+ uses: actions/checkout@v4
21
+
22
+ - name: Set up project and environment
23
+ uses: ./.github/actions/setup-project
24
+
25
+ - name: Check the tag
26
+ run: uv run poe check-tag
27
+
28
+ - name: Runn all tests
29
+ run: uv run poe check
30
+
31
+ - name: Build package
32
+ run: uv build
33
+
34
+ - name: Publish package to PyPI
35
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,39 @@
1
+ name: tests
2
+
3
+ on:
4
+ - push
5
+
6
+ jobs:
7
+ tests:
8
+ name: Tests on ${{ matrix.os }} (${{ matrix.python-version }})
9
+ runs-on: ${{ matrix.os }}
10
+ strategy:
11
+ matrix:
12
+ include:
13
+ - os: macos-latest
14
+ python-version: "3.9"
15
+ - os: windows-latest
16
+ python-version: "3.9"
17
+ - os: ubuntu-latest
18
+ python-version: "3.9"
19
+ - os: ubuntu-latest
20
+ python-version: "3.13"
21
+ defaults:
22
+ run:
23
+ shell: bash
24
+ steps:
25
+ - name: Check out repository
26
+ uses: actions/checkout@v4
27
+
28
+ - uses: actions/cache@v4
29
+ with:
30
+ path: ~/.cache/pre-commit
31
+ key: pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
32
+
33
+ - name: Set up project and environment
34
+ uses: ./.github/actions/setup-project
35
+ with:
36
+ python-version: ${{ matrix.python-version }}
37
+
38
+ - name: Run tests
39
+ run: uv run poe test
@@ -0,0 +1,115 @@
1
+ # cached files
2
+ __pycache__/
3
+ *.py[cod]
4
+ .cache
5
+ .DS_Store
6
+ *~
7
+ .*.sw[po]
8
+ .build
9
+ .ve
10
+ .env
11
+ .pytest
12
+ .benchmarks
13
+ .bootstrap
14
+ .appveyor.token
15
+ *.bak
16
+
17
+ # installation package
18
+ *.egg-info/
19
+ dist/
20
+ build/
21
+
22
+ # environments
23
+ .env
24
+ .venv
25
+ env/
26
+ venv/
27
+ ENV/
28
+ env.bak/
29
+ venv.bak/
30
+
31
+ # C extensions
32
+ *.so
33
+
34
+ # pycharm
35
+ .idea/
36
+
37
+ # vscode
38
+ *.code-workspace
39
+
40
+ # Packages
41
+ *.egg
42
+ *.egg-info
43
+ dist
44
+ build
45
+ .eggs
46
+ parts
47
+ bin
48
+ var
49
+ sdist
50
+ wheelhouse
51
+ develop-eggs
52
+ .installed.cfg
53
+ lib
54
+ lib64
55
+ venv*/
56
+ .venv*/
57
+ pyvenv*/
58
+ pip-wheel-metadata/
59
+ poetry.lock
60
+
61
+ # Installer logs
62
+ pip-log.txt
63
+
64
+ # mypy
65
+ .mypy_cache/
66
+ .dmypy.json
67
+ dmypy.json
68
+ mypy.ini
69
+
70
+ # test caches
71
+ .tox/
72
+ .pytest_cache/
73
+ .coverage
74
+ htmlcov
75
+ report.xml
76
+ nosetests.xml
77
+ coverage.xml
78
+ htmlcov
79
+
80
+ # Translations
81
+ *.mo
82
+
83
+ # Buildout
84
+ .mr.developer.cfg
85
+
86
+ # IDE project files
87
+ .project
88
+ .pydevproject
89
+ .idea
90
+ *.iml
91
+ *.komodoproject
92
+
93
+ # Complexity
94
+ output/*.html
95
+ output/*/index.html
96
+
97
+ # Sphinx
98
+ docs/_build
99
+ public/
100
+ web/
101
+
102
+ # Docs
103
+ public/
104
+
105
+ # Mypy Cache
106
+ .mypy_cache/
107
+
108
+ # Ruff cache
109
+ .ruff_cache/
110
+
111
+ config.yaml
112
+ config.yml
113
+ logs
114
+ *.db
115
+ /bot
@@ -0,0 +1,50 @@
1
+ repos:
2
+ # https://github.com/pre-commit/pre-commit-hooks
3
+ - repo: local
4
+ hooks:
5
+ - id: trailing-whitespace
6
+ name: trim trailing whitespace
7
+ entry: uv run trailing-whitespace-fixer
8
+ language: system
9
+ types: [text]
10
+ stages: [pre-commit, pre-push, manual]
11
+ - id: end-of-file-fixer
12
+ name: fix end of files
13
+ entry: uv run end-of-file-fixer
14
+ language: system
15
+ types: [text]
16
+ stages: [pre-commit, pre-push, manual]
17
+ - id: check-yaml
18
+ name: check yaml
19
+ entry: uv run check-yaml
20
+ language: system
21
+ types: [yaml]
22
+ - id: check-json
23
+ name: check json
24
+ entry: uv run check-json
25
+ language: system
26
+ types: [json]
27
+ exclude: "^.vscode"
28
+ - id: check-toml
29
+ name: check toml
30
+ entry: uv run check-toml
31
+ language: system
32
+ types: [toml]
33
+ # https://github.com/commitizen-tools/commitizen
34
+ - repo: local
35
+ hooks:
36
+ - id: commitizen
37
+ name: commitizen check
38
+ entry: uv run cz check
39
+ args: [--allow-abort, --commit-msg-file]
40
+ stages: [commit-msg]
41
+ language: system
42
+ # https://github.com/astral-sh/ruff-pre-commit
43
+ - repo: local
44
+ hooks:
45
+ - id: poe-format
46
+ name: ruff linter, ruff formatter and mypy
47
+ entry: uv run poe format
48
+ language: system
49
+ pass_filenames: false
50
+ types: [python]
@@ -0,0 +1,31 @@
1
+ {
2
+ "recommendations": [
3
+ "aaron-bond.better-comments",
4
+ "benspaulding.python-manifest-template",
5
+ "charliermarsh.ruff",
6
+ "DavidAnson.vscode-markdownlint",
7
+ "EditorConfig.EditorConfig",
8
+ "github.vscode-github-actions",
9
+ "jebbs.plantuml",
10
+ "KevinRose.vsc-python-indent",
11
+ "matangover.mypy",
12
+ "ms-python.vscode-pylance",
13
+ "ms-python.python",
14
+ "njpwerner.autodocstring",
15
+ "redhat.vscode-yaml",
16
+ "streetsidesoftware.code-spell-checker",
17
+ "tamasfe.even-better-toml",
18
+ "trond-snekvik.simple-rst",
19
+ "usernamehw.errorlens",
20
+ "VisualStudioExptTeam.vscodeintellicode"
21
+ ],
22
+ "unwantedRecommendations": [
23
+ "bungcip.better-toml",
24
+ "ms-python.mypy-type-checker",
25
+ "ms-python.autopep8",
26
+ "ms-python.pylint",
27
+ "ms-python.isort",
28
+ "ms-python.black-formatter",
29
+ "ms-pyright.pyright"
30
+ ]
31
+ }
@@ -0,0 +1,5 @@
1
+ noqa
2
+ fmt
3
+ pragma
4
+ doctest
5
+ mypy
@@ -0,0 +1 @@
1
+ {"rule":"UPPERCASE_SENTENCE_START","sentence":"^\\Qbash(code)\n:language: bash\\E$"}
@@ -0,0 +1,98 @@
1
+ {
2
+ // Don't format on save for formatters we don't explicitely control
3
+ "editor.formatOnSave": false,
4
+ "editor.codeActionsOnSave": {
5
+ "source.fixAll": "always"
6
+ },
7
+ // Set file associations to support comments syntax highlight
8
+ "files.associations": {
9
+ "settings.json": "jsonc",
10
+ "extensions.json": "jsonc",
11
+ "LICENSE": "txt"
12
+ },
13
+ // Files to exclude
14
+ "files.exclude": {
15
+ ".bzr": true,
16
+ ".direnv": true,
17
+ ".eggs": true,
18
+ ".git": true,
19
+ ".hg": true,
20
+ ".mypy_cache": true,
21
+ ".nox": true,
22
+ ".pants.d": true,
23
+ ".pytype": true,
24
+ ".ruff_cache": true,
25
+ ".pytest_cache": true,
26
+ ".svn": true,
27
+ ".tox": true,
28
+ ".venv": true,
29
+ "__pypackages__": true,
30
+ "_build": true,
31
+ "buck-out": true,
32
+ "build": true,
33
+ "dist": true,
34
+ "node_modules": true,
35
+ "venv": true
36
+ },
37
+ // Conventional rulers for python
38
+ "editor.rulers": [72, 79, 120],
39
+ "ruff.fixAll": true,
40
+ // Conflict between Ruff and isort
41
+ "ruff.organizeImports": false,
42
+ "evenBetterToml.formatter.alignComments": false,
43
+ "evenBetterToml.formatter.alignEntries": false,
44
+ "evenBetterToml.formatter.allowedBlankLines": 1,
45
+ "evenBetterToml.formatter.arrayAutoCollapse": true,
46
+ "evenBetterToml.formatter.arrayAutoExpand": true,
47
+ "evenBetterToml.formatter.arrayTrailingComma": true,
48
+ "evenBetterToml.formatter.columnWidth": 79,
49
+ "evenBetterToml.formatter.compactArrays": true,
50
+ "evenBetterToml.formatter.compactEntries": false,
51
+ "evenBetterToml.formatter.compactInlineTables": false,
52
+ "evenBetterToml.formatter.indentEntries": false,
53
+ "evenBetterToml.formatter.indentTables": false,
54
+ "evenBetterToml.formatter.inlineTableExpand": false,
55
+ "evenBetterToml.formatter.reorderArrays": true,
56
+ "evenBetterToml.formatter.trailingNewline": true,
57
+ // We like keeping TOML keys in a certain non-alphabetical order that feels more natural
58
+ "evenBetterToml.formatter.reorderKeys": false,
59
+ "redhat.telemetry.enabled": false,
60
+ "ltex.language": "en",
61
+ "cSpell.language": "en",
62
+ "cSpell.words": [
63
+ "anyio",
64
+ "automodule",
65
+ "autouse",
66
+ "bysource",
67
+ "caplog",
68
+ "checkfirst",
69
+ "commitizen",
70
+ "Conjugable",
71
+ "cooldown",
72
+ "Coro",
73
+ "Dashstrom",
74
+ "docstrings",
75
+ "doctest",
76
+ "Easterbot",
77
+ "easterobot",
78
+ "elle",
79
+ "genindex",
80
+ "IMREAD",
81
+ "imwrite",
82
+ "levelname",
83
+ "modindex",
84
+ "mypy",
85
+ "noqa",
86
+ "parseable",
87
+ "pyarg",
88
+ "pypi",
89
+ "pyproject",
90
+ "sourcelink",
91
+ "sphinxcontrib",
92
+ "todos",
93
+ "typehints",
94
+ "undoc",
95
+ "viewcode",
96
+ "webbrowser"
97
+ ]
98
+ }
@@ -0,0 +1,39 @@
1
+ # Install uv
2
+ FROM python:3.12-slim
3
+
4
+ # Metadata for clarity and documentation
5
+ LABEL maintainer="your_email@example.com"
6
+ LABEL description="Docker image for easterobot using uv for dependency management"
7
+
8
+ # Add the UV binary
9
+ COPY --from=ghcr.io/astral-sh/uv:latest /uv /bin/uv
10
+
11
+ # Add non-root user
12
+ RUN useradd --create-home easterobot
13
+
14
+ # Create directory
15
+ RUN mkdir /data
16
+
17
+ # Make it read-only
18
+ RUN chown easterobot:easterobot /data
19
+
20
+ # Use non-root user for security
21
+ USER easterobot
22
+
23
+ # Change the working directory to the `src` directory
24
+ WORKDIR /src
25
+
26
+ # Copy only project definition files (improves caching)
27
+ COPY pyproject.toml uv.lock ./
28
+
29
+ # Install dependencies
30
+ RUN uv sync --frozen --no-install-project
31
+
32
+ # Copy the project into the image
33
+ COPY . .
34
+
35
+ # Sync the project
36
+ RUN uv sync --frozen
37
+
38
+ # Default command (use exec form for signal handling)
39
+ CMD ["/src/entrypoint.sh"]
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024, Dashstrom <dashstrom.pro@gmail.com>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.