nodepick-cli 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.
- nodepick_cli-0.1.1/.gitignore +219 -0
- nodepick_cli-0.1.1/CHANGELOG.md +17 -0
- nodepick_cli-0.1.1/PKG-INFO +134 -0
- nodepick_cli-0.1.1/README.md +122 -0
- nodepick_cli-0.1.1/install.sh +239 -0
- nodepick_cli-0.1.1/pyproject.toml +32 -0
- nodepick_cli-0.1.1/src/nodepick_cli/__init__.py +11 -0
- nodepick_cli-0.1.1/src/nodepick_cli/auth/__init__.py +3 -0
- nodepick_cli-0.1.1/src/nodepick_cli/auth/login.py +112 -0
- nodepick_cli-0.1.1/src/nodepick_cli/commands/__init__.py +8 -0
- nodepick_cli-0.1.1/src/nodepick_cli/commands/ai.py +168 -0
- nodepick_cli-0.1.1/src/nodepick_cli/commands/node.py +235 -0
- nodepick_cli-0.1.1/src/nodepick_cli/commands/ssh.py +102 -0
- nodepick_cli-0.1.1/src/nodepick_cli/core/__init__.py +16 -0
- nodepick_cli-0.1.1/src/nodepick_cli/core/config.py +74 -0
- nodepick_cli-0.1.1/src/nodepick_cli/core/exceptions.py +73 -0
- nodepick_cli-0.1.1/src/nodepick_cli/core/formatters.py +39 -0
- nodepick_cli-0.1.1/src/nodepick_cli/main.py +62 -0
- nodepick_cli-0.1.1/test_cli.py +209 -0
- nodepick_cli-0.1.1/uv.lock +1166 -0
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[codz]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
.Python
|
|
11
|
+
build/
|
|
12
|
+
develop-eggs/
|
|
13
|
+
dist/
|
|
14
|
+
downloads/
|
|
15
|
+
eggs/
|
|
16
|
+
.eggs/
|
|
17
|
+
lib/
|
|
18
|
+
lib64/
|
|
19
|
+
parts/
|
|
20
|
+
sdist/
|
|
21
|
+
var/
|
|
22
|
+
wheels/
|
|
23
|
+
share/python-wheels/
|
|
24
|
+
*.egg-info/
|
|
25
|
+
.installed.cfg
|
|
26
|
+
*.egg
|
|
27
|
+
MANIFEST
|
|
28
|
+
|
|
29
|
+
# PyInstaller
|
|
30
|
+
# Usually these files are written by a python script from a template
|
|
31
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
32
|
+
*.manifest
|
|
33
|
+
*.spec
|
|
34
|
+
|
|
35
|
+
# Installer logs
|
|
36
|
+
pip-log.txt
|
|
37
|
+
pip-delete-this-directory.txt
|
|
38
|
+
|
|
39
|
+
# Unit test / coverage reports
|
|
40
|
+
htmlcov/
|
|
41
|
+
.tox/
|
|
42
|
+
.nox/
|
|
43
|
+
.coverage
|
|
44
|
+
.coverage.*
|
|
45
|
+
.cache
|
|
46
|
+
nosetests.xml
|
|
47
|
+
coverage.xml
|
|
48
|
+
*.cover
|
|
49
|
+
*.py.cover
|
|
50
|
+
.hypothesis/
|
|
51
|
+
.pytest_cache/
|
|
52
|
+
cover/
|
|
53
|
+
|
|
54
|
+
# Translations
|
|
55
|
+
*.mo
|
|
56
|
+
*.pot
|
|
57
|
+
|
|
58
|
+
# Django stuff:
|
|
59
|
+
*.log
|
|
60
|
+
local_settings.py
|
|
61
|
+
db.sqlite3
|
|
62
|
+
db.sqlite3-journal
|
|
63
|
+
|
|
64
|
+
# Flask stuff:
|
|
65
|
+
instance/
|
|
66
|
+
.webassets-cache
|
|
67
|
+
|
|
68
|
+
# Scrapy stuff:
|
|
69
|
+
.scrapy
|
|
70
|
+
|
|
71
|
+
# Sphinx documentation
|
|
72
|
+
docs/_build/
|
|
73
|
+
|
|
74
|
+
# PyBuilder
|
|
75
|
+
.pybuilder/
|
|
76
|
+
target/
|
|
77
|
+
|
|
78
|
+
# Jupyter Notebook
|
|
79
|
+
.ipynb_checkpoints
|
|
80
|
+
|
|
81
|
+
# IPython
|
|
82
|
+
profile_default/
|
|
83
|
+
ipython_config.py
|
|
84
|
+
|
|
85
|
+
# pyenv
|
|
86
|
+
# For a library or package, you might want to ignore these files since the code is
|
|
87
|
+
# intended to run in multiple environments; otherwise, check them in:
|
|
88
|
+
# .python-version
|
|
89
|
+
|
|
90
|
+
# pipenv
|
|
91
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
92
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
93
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
94
|
+
# install all needed dependencies.
|
|
95
|
+
# Pipfile.lock
|
|
96
|
+
|
|
97
|
+
# UV
|
|
98
|
+
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
|
|
99
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
100
|
+
# commonly ignored for libraries.
|
|
101
|
+
# uv.lock
|
|
102
|
+
|
|
103
|
+
# poetry
|
|
104
|
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
|
105
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
106
|
+
# commonly ignored for libraries.
|
|
107
|
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
|
108
|
+
# poetry.lock
|
|
109
|
+
# poetry.toml
|
|
110
|
+
|
|
111
|
+
# pdm
|
|
112
|
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
|
113
|
+
# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
|
|
114
|
+
# https://pdm-project.org/en/latest/usage/project/#working-with-version-control
|
|
115
|
+
# pdm.lock
|
|
116
|
+
# pdm.toml
|
|
117
|
+
.pdm-python
|
|
118
|
+
.pdm-build/
|
|
119
|
+
|
|
120
|
+
# pixi
|
|
121
|
+
# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
|
|
122
|
+
# pixi.lock
|
|
123
|
+
# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
|
|
124
|
+
# in the .venv directory. It is recommended not to include this directory in version control.
|
|
125
|
+
.pixi
|
|
126
|
+
|
|
127
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
|
128
|
+
__pypackages__/
|
|
129
|
+
|
|
130
|
+
# Celery stuff
|
|
131
|
+
celerybeat-schedule
|
|
132
|
+
celerybeat.pid
|
|
133
|
+
|
|
134
|
+
# Redis
|
|
135
|
+
*.rdb
|
|
136
|
+
*.aof
|
|
137
|
+
*.pid
|
|
138
|
+
|
|
139
|
+
# RabbitMQ
|
|
140
|
+
mnesia/
|
|
141
|
+
rabbitmq/
|
|
142
|
+
rabbitmq-data/
|
|
143
|
+
|
|
144
|
+
# ActiveMQ
|
|
145
|
+
activemq-data/
|
|
146
|
+
|
|
147
|
+
# SageMath parsed files
|
|
148
|
+
*.sage.py
|
|
149
|
+
|
|
150
|
+
# Environments
|
|
151
|
+
.env
|
|
152
|
+
.envrc
|
|
153
|
+
.venv
|
|
154
|
+
env/
|
|
155
|
+
venv/
|
|
156
|
+
ENV/
|
|
157
|
+
env.bak/
|
|
158
|
+
venv.bak/
|
|
159
|
+
|
|
160
|
+
# Spyder project settings
|
|
161
|
+
.spyderproject
|
|
162
|
+
.spyproject
|
|
163
|
+
|
|
164
|
+
# Rope project settings
|
|
165
|
+
.ropeproject
|
|
166
|
+
|
|
167
|
+
# mkdocs documentation
|
|
168
|
+
/site
|
|
169
|
+
|
|
170
|
+
# mypy
|
|
171
|
+
.mypy_cache/
|
|
172
|
+
.dmypy.json
|
|
173
|
+
dmypy.json
|
|
174
|
+
|
|
175
|
+
# Pyre type checker
|
|
176
|
+
.pyre/
|
|
177
|
+
|
|
178
|
+
# pytype static type analyzer
|
|
179
|
+
.pytype/
|
|
180
|
+
|
|
181
|
+
# Cython debug symbols
|
|
182
|
+
cython_debug/
|
|
183
|
+
|
|
184
|
+
# PyCharm
|
|
185
|
+
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
|
186
|
+
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
|
187
|
+
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
|
188
|
+
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
|
189
|
+
# .idea/
|
|
190
|
+
|
|
191
|
+
# Abstra
|
|
192
|
+
# Abstra is an AI-powered process automation framework.
|
|
193
|
+
# Ignore directories containing user credentials, local state, and settings.
|
|
194
|
+
# Learn more at https://abstra.io/docs
|
|
195
|
+
.abstra/
|
|
196
|
+
|
|
197
|
+
# Visual Studio Code
|
|
198
|
+
# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
|
|
199
|
+
# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
|
|
200
|
+
# and can be added to the global gitignore or merged into this file. However, if you prefer,
|
|
201
|
+
# you could uncomment the following to ignore the entire vscode folder
|
|
202
|
+
# .vscode/
|
|
203
|
+
# Temporary file for partial code execution
|
|
204
|
+
tempCodeRunnerFile.py
|
|
205
|
+
|
|
206
|
+
# Ruff stuff:
|
|
207
|
+
.ruff_cache/
|
|
208
|
+
|
|
209
|
+
# PyPI configuration file
|
|
210
|
+
.pypirc
|
|
211
|
+
|
|
212
|
+
# Marimo
|
|
213
|
+
marimo/_static/
|
|
214
|
+
marimo/_lsp/
|
|
215
|
+
__marimo__/
|
|
216
|
+
|
|
217
|
+
# Streamlit
|
|
218
|
+
.streamlit/secrets.toml
|
|
219
|
+
.DS_Store
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# CHANGELOG.md
|
|
2
|
+
|
|
3
|
+
## [Unreleased]
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
- Changed authentication command from `np auth save` to `np auth configure`.
|
|
7
|
+
|
|
8
|
+
### Added
|
|
9
|
+
- Added `np --version` (`-v`) flag.
|
|
10
|
+
- Added `np ai mcp configure <agent> [nodes...]` command to configure MCP servers on AI agents (such as Antigravity) over HTTP Stream with self-signed certificate verification bypassed.
|
|
11
|
+
|
|
12
|
+
## [0.1.0] - 2026-07-31
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
- Created `np` CLI tool in `cli/` using Typer and Rich.
|
|
16
|
+
- Added commands: `list`, `create`, `get`, `delete`, `shutdown`, `reboot`.
|
|
17
|
+
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: nodepick-cli
|
|
3
|
+
Version: 0.1.1
|
|
4
|
+
Summary: CLI tool for nodepick.ai Node orchestration
|
|
5
|
+
Requires-Python: >=3.10
|
|
6
|
+
Requires-Dist: httpx>=0.24.0
|
|
7
|
+
Requires-Dist: keyring>=25.0.0
|
|
8
|
+
Requires-Dist: nodepick
|
|
9
|
+
Requires-Dist: rich>=13.0.0
|
|
10
|
+
Requires-Dist: typer>=0.9.0
|
|
11
|
+
Description-Content-Type: text/markdown
|
|
12
|
+
|
|
13
|
+
# nodepick.ai CLI (`np`)
|
|
14
|
+
|
|
15
|
+
`np` is a command-line interface tool built with Python for managing Compute nodes.
|
|
16
|
+
|
|
17
|
+
## Installation
|
|
18
|
+
|
|
19
|
+
### Recommended Method using Shell Installer (`curl`)
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
# Install using auto-detection (uv -> pipx -> pip)
|
|
23
|
+
curl -sSL https://raw.githubusercontent.com/nodepick/developer/main/cli/install.sh | bash
|
|
24
|
+
|
|
25
|
+
# Install latest from Git repo
|
|
26
|
+
curl -sSL https://raw.githubusercontent.com/nodepick/developer/main/cli/install.sh | bash -s -- --mode git
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### Recommended Method using (`uv`)
|
|
30
|
+
|
|
31
|
+
Using [`uv`](https://github.com/astral-sh/uv) is the recommended way to install and manage the `np` CLI tool globally in an isolated environment:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# Install published package from PyPI
|
|
35
|
+
uv tool install nodepick-cli
|
|
36
|
+
|
|
37
|
+
# Or install from inside the cli directory:
|
|
38
|
+
uv tool install -e . --with ../sdk/python
|
|
39
|
+
|
|
40
|
+
# Or re-install
|
|
41
|
+
uv tool install -e . --with ../sdk/python --reinstall
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### `pip` Method
|
|
45
|
+
|
|
46
|
+
Installing published package from PyPI:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
pip install nodepick-cli
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
When installing from a local git repository, first install the local `nodepick` SDK dependency before installing `nodepick-cli`:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
# Install from the "cli" folder using pip:
|
|
56
|
+
pip install -e ../sdk/python .
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
## Usage
|
|
61
|
+
|
|
62
|
+
[`nodepick.ai Documentation`](https://docs.nodepick.ai/cli-reference/overview)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
### Basic Usage
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
# List all compute nodes (table view with SSH connect command)
|
|
69
|
+
np --version
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Authentication
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
# Configure API key (and optional base URL) securely in OS keyring
|
|
76
|
+
np auth configure
|
|
77
|
+
|
|
78
|
+
# Test API authentication status & organization details
|
|
79
|
+
np auth test
|
|
80
|
+
|
|
81
|
+
# Clear stored API key from OS keyring
|
|
82
|
+
np auth clear
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### SSH Key Management
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
# Register an SSH public key from a file
|
|
89
|
+
np ssh add -n "MBA 2026" --file ~/.ssh/id_ed25519.pub
|
|
90
|
+
|
|
91
|
+
# Register an SSH public key directly
|
|
92
|
+
np ssh add -n "Desktop" --key "ssh-ed25519 AAAAC3... user@host"
|
|
93
|
+
|
|
94
|
+
# List registered SSH keys
|
|
95
|
+
np ssh list
|
|
96
|
+
|
|
97
|
+
# Delete an SSH key by ID
|
|
98
|
+
np ssh delete <key_id>
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Compute Nodes
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
# List all compute nodes
|
|
105
|
+
np node list
|
|
106
|
+
|
|
107
|
+
# Create a new compute node
|
|
108
|
+
np node create --name "my-sandbox" --cpu 2 --memory 2048
|
|
109
|
+
|
|
110
|
+
# Get details & connection info for a node
|
|
111
|
+
np node get <node_id>
|
|
112
|
+
|
|
113
|
+
# Reboot a node
|
|
114
|
+
np node reboot <node_id>
|
|
115
|
+
|
|
116
|
+
# Shutdown a node
|
|
117
|
+
np node shutdown <node_id>
|
|
118
|
+
|
|
119
|
+
# Delete a node
|
|
120
|
+
np node delete <node_id>
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### [BETA] AI & Model Context Protocol (MCP)
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
# Configure Antigravity to connect to a specific node MCP server over HTTP Stream
|
|
127
|
+
np ai mcp configure antigravity dev
|
|
128
|
+
|
|
129
|
+
# Configure Antigravity to connect to multiple nodes
|
|
130
|
+
np ai mcp configure antigravity dev prod
|
|
131
|
+
|
|
132
|
+
# Configure Antigravity for all available compute nodes
|
|
133
|
+
np ai mcp configure antigravity
|
|
134
|
+
```
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# nodepick.ai CLI (`np`)
|
|
2
|
+
|
|
3
|
+
`np` is a command-line interface tool built with Python for managing Compute nodes.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
### Recommended Method using Shell Installer (`curl`)
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# Install using auto-detection (uv -> pipx -> pip)
|
|
11
|
+
curl -sSL https://raw.githubusercontent.com/nodepick/developer/main/cli/install.sh | bash
|
|
12
|
+
|
|
13
|
+
# Install latest from Git repo
|
|
14
|
+
curl -sSL https://raw.githubusercontent.com/nodepick/developer/main/cli/install.sh | bash -s -- --mode git
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### Recommended Method using (`uv`)
|
|
18
|
+
|
|
19
|
+
Using [`uv`](https://github.com/astral-sh/uv) is the recommended way to install and manage the `np` CLI tool globally in an isolated environment:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
# Install published package from PyPI
|
|
23
|
+
uv tool install nodepick-cli
|
|
24
|
+
|
|
25
|
+
# Or install from inside the cli directory:
|
|
26
|
+
uv tool install -e . --with ../sdk/python
|
|
27
|
+
|
|
28
|
+
# Or re-install
|
|
29
|
+
uv tool install -e . --with ../sdk/python --reinstall
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### `pip` Method
|
|
33
|
+
|
|
34
|
+
Installing published package from PyPI:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
pip install nodepick-cli
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
When installing from a local git repository, first install the local `nodepick` SDK dependency before installing `nodepick-cli`:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
# Install from the "cli" folder using pip:
|
|
44
|
+
pip install -e ../sdk/python .
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
## Usage
|
|
49
|
+
|
|
50
|
+
[`nodepick.ai Documentation`](https://docs.nodepick.ai/cli-reference/overview)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
### Basic Usage
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
# List all compute nodes (table view with SSH connect command)
|
|
57
|
+
np --version
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Authentication
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
# Configure API key (and optional base URL) securely in OS keyring
|
|
64
|
+
np auth configure
|
|
65
|
+
|
|
66
|
+
# Test API authentication status & organization details
|
|
67
|
+
np auth test
|
|
68
|
+
|
|
69
|
+
# Clear stored API key from OS keyring
|
|
70
|
+
np auth clear
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### SSH Key Management
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
# Register an SSH public key from a file
|
|
77
|
+
np ssh add -n "MBA 2026" --file ~/.ssh/id_ed25519.pub
|
|
78
|
+
|
|
79
|
+
# Register an SSH public key directly
|
|
80
|
+
np ssh add -n "Desktop" --key "ssh-ed25519 AAAAC3... user@host"
|
|
81
|
+
|
|
82
|
+
# List registered SSH keys
|
|
83
|
+
np ssh list
|
|
84
|
+
|
|
85
|
+
# Delete an SSH key by ID
|
|
86
|
+
np ssh delete <key_id>
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Compute Nodes
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
# List all compute nodes
|
|
93
|
+
np node list
|
|
94
|
+
|
|
95
|
+
# Create a new compute node
|
|
96
|
+
np node create --name "my-sandbox" --cpu 2 --memory 2048
|
|
97
|
+
|
|
98
|
+
# Get details & connection info for a node
|
|
99
|
+
np node get <node_id>
|
|
100
|
+
|
|
101
|
+
# Reboot a node
|
|
102
|
+
np node reboot <node_id>
|
|
103
|
+
|
|
104
|
+
# Shutdown a node
|
|
105
|
+
np node shutdown <node_id>
|
|
106
|
+
|
|
107
|
+
# Delete a node
|
|
108
|
+
np node delete <node_id>
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### [BETA] AI & Model Context Protocol (MCP)
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
# Configure Antigravity to connect to a specific node MCP server over HTTP Stream
|
|
115
|
+
np ai mcp configure antigravity dev
|
|
116
|
+
|
|
117
|
+
# Configure Antigravity to connect to multiple nodes
|
|
118
|
+
np ai mcp configure antigravity dev prod
|
|
119
|
+
|
|
120
|
+
# Configure Antigravity for all available compute nodes
|
|
121
|
+
np ai mcp configure antigravity
|
|
122
|
+
```
|