comcheck-api 1.0.0__py3-none-any.whl

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 (54) hide show
  1. comcheck_api/DISCLAIMER.md +24 -0
  2. comcheck_api/__init__.py +99 -0
  3. comcheck_api/ai/__init__.py +30 -0
  4. comcheck_api/ai/skill/SKILL.md +285 -0
  5. comcheck_api/ai/skill/__init__.py +5 -0
  6. comcheck_api/ai/skill/reference/operations.md +101 -0
  7. comcheck_api/ai/skill/reference/simulation.md +99 -0
  8. comcheck_api/ai/skill/reference/types.md +90 -0
  9. comcheck_api/ai/skill/scripts/__init__.py +1 -0
  10. comcheck_api/ai/skill/scripts/validate_code.py +210 -0
  11. comcheck_api/api/__init__.py +1 -0
  12. comcheck_api/api/api_services.py +273 -0
  13. comcheck_api/cli.py +136 -0
  14. comcheck_api/client/__init__.py +1 -0
  15. comcheck_api/client/comcheck_client.py +335 -0
  16. comcheck_api/constants/__init__.py +0 -0
  17. comcheck_api/constants/building_area_constants.py +35 -0
  18. comcheck_api/constants/common_constants.py +116 -0
  19. comcheck_api/constants/envelope_constants.py +250 -0
  20. comcheck_api/defaults.py +150 -0
  21. comcheck_api/exceptions.py +54 -0
  22. comcheck_api/introspection.py +188 -0
  23. comcheck_api/managers/__init__.py +0 -0
  24. comcheck_api/managers/components/__init__.py +0 -0
  25. comcheck_api/managers/components/building_area.py +11 -0
  26. comcheck_api/managers/components/envelope/__init__.py +0 -0
  27. comcheck_api/managers/components/envelope/ag_wall.py +97 -0
  28. comcheck_api/managers/components/envelope/bg_wall.py +39 -0
  29. comcheck_api/managers/components/envelope/door.py +11 -0
  30. comcheck_api/managers/components/envelope/floor.py +11 -0
  31. comcheck_api/managers/components/envelope/roof.py +30 -0
  32. comcheck_api/managers/components/envelope/skylight.py +11 -0
  33. comcheck_api/managers/components/envelope/window.py +11 -0
  34. comcheck_api/managers/data_manager.py +369 -0
  35. comcheck_api/project_operations/__init__.py +8 -0
  36. comcheck_api/project_operations/project_building_area_operations.py +107 -0
  37. comcheck_api/project_operations/project_envelope_operations.py +899 -0
  38. comcheck_api/schemas/comCheck.schema.json +6463 -0
  39. comcheck_api/types/__init__.py +49 -0
  40. comcheck_api/types/api_types.py +127 -0
  41. comcheck_api/types/common_types.py +32 -0
  42. comcheck_api/types/core_types.py +4198 -0
  43. comcheck_api/types/custom_base_model.py +314 -0
  44. comcheck_api/utilities/__init__.py +5 -0
  45. comcheck_api/utilities/common.py +50 -0
  46. comcheck_api/utilities/envelope_utilities.py +46 -0
  47. comcheck_api/utilities/id_registry.py +79 -0
  48. comcheck_api/utilities/project_utilities.py +60 -0
  49. comcheck_api/validation.py +64 -0
  50. comcheck_api-1.0.0.dist-info/METADATA +244 -0
  51. comcheck_api-1.0.0.dist-info/RECORD +54 -0
  52. comcheck_api-1.0.0.dist-info/WHEEL +4 -0
  53. comcheck_api-1.0.0.dist-info/entry_points.txt +2 -0
  54. comcheck_api-1.0.0.dist-info/licenses/LICENSE +24 -0
@@ -0,0 +1,244 @@
1
+ Metadata-Version: 2.4
2
+ Name: comcheck_api
3
+ Version: 1.0.0
4
+ Summary: COMcheck Web API Python Client
5
+ Project-URL: Homepage, https://pnnl.github.io/comcheckweb-api-python/
6
+ Project-URL: Documentation, https://pnnl.github.io/comcheckweb-api-python/
7
+ Project-URL: Repository, https://github.com/pnnl/comcheckweb-api-python
8
+ Author-email: Yanyan Zhu <yanyan.zhu@pnnl.gov>
9
+ Maintainer-email: Yanyan Zhu <yanyan.zhu@pnnl.gov>, Weili Xu <weili.xu@pnnl.gov>
10
+ License-Expression: BSD-3-Clause
11
+ License-File: LICENSE
12
+ Keywords: IECC,ashrae 90.1,building,comcheck,compliance,simulation
13
+ Classifier: Development Status :: 5 - Production/Stable
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Operating System :: OS Independent
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Topic :: Scientific/Engineering
20
+ Classifier: Typing :: Typed
21
+ Requires-Python: >=3.12
22
+ Requires-Dist: httpx>=0.27.0
23
+ Requires-Dist: jsonschema>=4.23.0
24
+ Requires-Dist: pydantic>=2.12.5
25
+ Requires-Dist: python-dotenv>=1.0.0
26
+ Requires-Dist: types-jsonschema>=4.23.0
27
+ Description-Content-Type: text/markdown
28
+
29
+ # COMcheckWeb API — Python Package
30
+
31
+ This repository contains the COMcheckWeb API Python package. It provides tools and scripts for working with the COMcheckWeb API and is intended to be used as a Python package maintained with `uv` for package management.
32
+
33
+ **Requirements:**
34
+ - Python: `>=3.12`
35
+
36
+ **Package management:**
37
+ - This project uses `uv` (configured in `pyproject.toml`) for dependency and workspace management. The `tool.uv` settings in `pyproject.toml` control workspace members and local sources.
38
+
39
+ Quickly useful notes:
40
+ - If you reference this package from other workspace packages, keep the `tool.uv.sources` entry that maps `comcheck_api = { workspace = true }` so `uv` resolves it to the local workspace copy.
41
+ - For a single-package repo you can also rely on `members = ["."]` and omit additional sources, but leaving the explicit source entry is harmless and makes intent clear.
42
+
43
+ ## Usage
44
+
45
+ ### 1. Obtain an API Key
46
+
47
+ Get a Personal Access Token from the new
48
+ [COMcheck Web site](https://comcheck.energycode.pnl.gov):
49
+
50
+ 1. Log in (or register a new account if you don't have one).
51
+ 2. Click your **username** in the left-side navigation.
52
+ 3. From the menu that appears, choose **Settings**.
53
+ 4. Click **Developer Setting** to open the Personal Access Token
54
+ page.
55
+ 5. Click **Generate**, then immediately copy the token.
56
+
57
+ > **Important:** the token is shown **only once**. Save it somewhere
58
+ > safe (a password manager, your `.env`, etc.) before leaving the
59
+ > page. If you lose it, generate a new one — the old one will stop
60
+ > working.
61
+
62
+ ### 2. Configure the API Key
63
+
64
+ Create a `.env` file at the root of your project and add:
65
+
66
+ ```
67
+ COM_API_KEY=<your-api-key-here>
68
+ ```
69
+
70
+ The SDK does **not** auto-load this — you read it yourself and pass
71
+ it to the client. With `python-dotenv` this is two lines:
72
+
73
+ ```python
74
+ import os
75
+ from dotenv import load_dotenv
76
+ from comcheck_api import COMcheckClient
77
+
78
+ load_dotenv()
79
+ client = COMcheckClient(api_key=os.environ["COM_API_KEY"])
80
+ ```
81
+
82
+ (`client.set_api_key(api_key)` is the equivalent post-construction
83
+ setter if you'd rather defer.)
84
+
85
+ For more detail, see the
86
+ [Getting Started](https://pnnl.github.io/comcheckweb-api-python/getting-started/)
87
+ guide.
88
+
89
+ ### 3. Install the Package
90
+
91
+ ```bash
92
+ pip install comcheck-api
93
+ ```
94
+
95
+ ### 4. Start Using the Package
96
+
97
+ - **Simulation only:** You can use the simulation features directly without creating a project on COMcheck Web.
98
+ - **Updating a project:** You must first create the project under your account on [COMcheck Web](https://comcheck.energycode.pnl.gov) before using this package to update it. Project creation is not yet supported through this package.
99
+
100
+ For detailed usage examples and API reference, see the [documentation](https://pnnl.github.io/comcheckweb-api-python/).
101
+
102
+ ## Introspection helpers
103
+
104
+ The package ships typed helpers for discovering what the SDK exposes
105
+ and for validating project data — useful from notebooks, IDE plugins,
106
+ and AI agents alike. All return Pydantic models; call `.model_dump()`
107
+ when you need JSON.
108
+
109
+ ```python
110
+ import comcheck_api as cc
111
+
112
+ # What operation functions does the SDK ship?
113
+ for op in cc.list_operations():
114
+ print(op.group, op.signature)
115
+
116
+ # What does the ComBuilding model look like?
117
+ schema = cc.lookup_type("ComBuilding")
118
+ for field in schema.fields:
119
+ print(field.name, field.type, field.required)
120
+
121
+ # Does this dict satisfy the SDK schema?
122
+ result = cc.validate_project(project_dict)
123
+ if not result.ok:
124
+ for err in result.errors:
125
+ print(err.loc, err.msg)
126
+ ```
127
+
128
+ See [`api/introspection`](https://pnnl.github.io/comcheckweb-api-python/api/introspection/)
129
+ in the docs for the full reference.
130
+
131
+ ## AI integration: the bundled Skill
132
+
133
+ A bundled Skill teaches AI coding agents how to use this SDK correctly —
134
+ operation modules, default templates, the simulation polling loop,
135
+ common pitfalls. The Skill folder lives at
136
+ [`comcheck_api/ai/skill/`](comcheck_api/ai/skill/) and ships in the
137
+ wheel. It follows the open agent-skills standard (`SKILL.md` plus
138
+ `reference/` and `scripts/`), so the same folder works for both
139
+ **Claude Code** and **OpenAI Codex** — only the install location
140
+ differs.
141
+
142
+ ### Setup in your own repo
143
+
144
+ Run the installer once in the root of the project that consumes
145
+ `comcheck_api`. By default it installs the Skill for **both** agents:
146
+
147
+ ```bash
148
+ comcheck-api install-skill
149
+ ```
150
+
151
+ This writes:
152
+
153
+ - `.claude/skills/comcheck-api/` — Claude Code scans
154
+ `<project>/.claude/skills/` when a session opens against the repo.
155
+ - `.agents/skills/comcheck-api/` — Codex scans `.agents/skills` from
156
+ the working directory up to the repository root.
157
+
158
+ So the guidance kicks in only for projects that actually use this SDK,
159
+ not on every session everywhere. Commit both folders; teammates get the
160
+ same guidance the moment they open the repo, and the agent can pull in
161
+ the reference docs and `validate_code.py` script on demand — not just
162
+ the `SKILL.md` body.
163
+
164
+ To install for only one agent, pass `--claude` or `--codex`:
165
+
166
+ ```bash
167
+ comcheck-api install-skill --claude # Claude Code only
168
+ comcheck-api install-skill --codex # Codex only
169
+ ```
170
+
171
+ Re-run with `--force` after upgrading the package to refresh the Skill.
172
+ Pass `--global` to install into the user-global skills dirs
173
+ (`~/.claude/skills/` and/or `~/.agents/skills/`) for every session
174
+ instead of per-project.
175
+
176
+ ## Development
177
+
178
+ Clone the repository and follow the commands below to set up developer tooling.
179
+
180
+ ```bash
181
+ git clone https://github.com/pnnl/comcheckweb-api-python.git
182
+ cd comcheckweb-api-python
183
+ uv sync
184
+ ```
185
+
186
+ ## Common commands
187
+
188
+ - Setup pre-commit (run once after cloning):
189
+ `uv run pre-commit install`
190
+
191
+ - Fetch the latest COMcheck schema and regenerate types:
192
+ `./tools/fetch_comcheck_schema.sh`
193
+
194
+ - Regenerate types from existing schema (without fetching):
195
+ `uv run tools/generate_core_types.py`
196
+
197
+ - Run a file from `examples/`:
198
+ `uv run examples/<script>`
199
+
200
+ - Run tests:
201
+ `uv run pytest`
202
+
203
+ - Format the repository with Black:
204
+ `uv run black comcheck_api tests examples`
205
+
206
+ - Run type checking:
207
+ `uv run mypy comcheck_api`
208
+
209
+ ## Running the docs locally
210
+
211
+ The documentation site is built with MkDocs (Material theme +
212
+ mkdocstrings). The dependencies live in the optional `docs` group
213
+ defined in `pyproject.toml`.
214
+
215
+ ```bash
216
+ # Install the docs group (mkdocs, mkdocs-material, mkdocstrings).
217
+ uv sync --group docs
218
+
219
+ # Serve with live reload at http://127.0.0.1:8000
220
+ uv run mkdocs serve
221
+
222
+ # One-shot build into ./site/
223
+ uv run mkdocs build
224
+
225
+ # Fail on warnings (good before committing)
226
+ uv run mkdocs build --strict
227
+ ```
228
+
229
+ ## Support
230
+
231
+ This is a publicly available library maintained by PNNL. While the code is open source and free to use, **external contributions are not accepted** at this time.
232
+
233
+ ### Reporting Issues
234
+
235
+ If you encounter bugs or have questions:
236
+ - Open an issue on GitHub for bug reports
237
+ - Check the [examples/](examples/) directory for usage guidance
238
+ - Review the [documentation](docs/) for detailed information
239
+
240
+ **Note:** Issues are welcome, but pull requests from external contributors will not be accepted.
241
+
242
+ ## License
243
+
244
+ See the `LICENSE` file at the repository root for license details.
@@ -0,0 +1,54 @@
1
+ comcheck_api/__init__.py,sha256=rvfYAeE1eScktBFFSM_4JTd3fy4HAa-XJWoCDMlJ1YI,2369
2
+ comcheck_api/cli.py,sha256=YBXrXE1_y2x_EOJappWJWObxDXCswXMYlCZqZYXqTUc,4288
3
+ comcheck_api/defaults.py,sha256=VSVTokh_-VR5sQiZDktETlOskVyviKIcY5TCpEmh9v4,4550
4
+ comcheck_api/exceptions.py,sha256=-vd-_bdknvj0xSOpMF6p3EqQaaadMWnc0l-ZPX2eZJA,1577
5
+ comcheck_api/introspection.py,sha256=7gFuZ5_-BZCJ8GlFkUanr9avnLhFa3fOeEdWIBvI2bg,5064
6
+ comcheck_api/validation.py,sha256=42cuY1z8r5K52q5oRTsW0xDR_FCE4qybihIffF9hzR4,1739
7
+ comcheck_api/ai/__init__.py,sha256=_M_b7zKKUNIUlyQ7z-O3zMAtKAzmqfPfMr52eH89TJY,931
8
+ comcheck_api/ai/skill/SKILL.md,sha256=W_q8nYuzeVezBLeA2XPw5ZYYtb5dC3BJc8cQyvfwV10,12612
9
+ comcheck_api/ai/skill/__init__.py,sha256=sJyMmuuCEy01zKAomzupTnrIFeM6dGu6zrtQsacjJmo,146
10
+ comcheck_api/ai/skill/reference/operations.md,sha256=ktTM02dDuBEVVGzmm3EcZ5iNq7ZKzFkg15F3SWDcpv8,4033
11
+ comcheck_api/ai/skill/reference/simulation.md,sha256=enSLcNY6BauIQOUjnqHIX6F0dkTDyn566FTqzznJrp8,4196
12
+ comcheck_api/ai/skill/reference/types.md,sha256=Issvt-Lcrg2NJEtX0S8Qo18qiz4NPrcG1bggJwbZmmw,4155
13
+ comcheck_api/ai/skill/scripts/__init__.py,sha256=feMXCGSxtzsfkcpIxkUGQDL59auJK7ICdVch3-9WLjY,77
14
+ comcheck_api/ai/skill/scripts/validate_code.py,sha256=E4nq_k0VVVS-r8YVjFvUm9tlZ_86NDcHv0e9FhUZGf0,7054
15
+ comcheck_api/api/__init__.py,sha256=08pWupzr9ROTFTnQc1ur3ijbEPMU3VHyTVz9sTp9h0E,60
16
+ comcheck_api/api/api_services.py,sha256=hrLBuQ5FSpeHvFKAuqgV9YD4nDIwpaZgrPr9RZ9jOWw,8860
17
+ comcheck_api/client/__init__.py,sha256=-YeuOolE8awh4e5iRMyocNEbmvryN25fyuKcs-mRqek,62
18
+ comcheck_api/client/comcheck_client.py,sha256=0FyFehYA-CgyK6uL8wNdMNtY45u674q16SO0bZNaMQI,12480
19
+ comcheck_api/constants/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
+ comcheck_api/constants/building_area_constants.py,sha256=xzS3biZALxXbVB3Ebzb1VGfNrrbolhurfDcBmDIgSbM,1409
21
+ comcheck_api/constants/common_constants.py,sha256=WTNr936sCeFK_9hWeuDEfbPUySLbqoTQ9hp0gevbgQM,4101
22
+ comcheck_api/constants/envelope_constants.py,sha256=5aY55tZRzp9TmR0T4uq2yaC8bJxUMl96H88Om5Jjfhk,7498
23
+ comcheck_api/managers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
+ comcheck_api/managers/data_manager.py,sha256=n2Q2C3HgwVImnWs1cr6YQfvryfjpgOiedqUQTFgCNo4,12079
25
+ comcheck_api/managers/components/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
+ comcheck_api/managers/components/building_area.py,sha256=5wR3LUba37UDdXjPAW6aSmHzCQpXw31VhSdOQdVFDwY,343
27
+ comcheck_api/managers/components/envelope/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
+ comcheck_api/managers/components/envelope/ag_wall.py,sha256=ubqYStMhmY-75DSVfPsjNjX3LHFNWzgkJgjNI7o0WkE,3301
29
+ comcheck_api/managers/components/envelope/bg_wall.py,sha256=ezNUds12BbSf3svoibay2GtLii4ThpjCo_NZDfmqWSQ,1153
30
+ comcheck_api/managers/components/envelope/door.py,sha256=-J4ffHjuLtqf_Ml5qh0YpajK3IHkSbpwyuHghQbJXLM,282
31
+ comcheck_api/managers/components/envelope/floor.py,sha256=oEwOtL4PsCdx8wiO9iJaTcFssWoVD3v3ptEtbw1E9Ys,288
32
+ comcheck_api/managers/components/envelope/roof.py,sha256=PpQgxkEpXh51sOPx5BRo-74W0ugkUxvglBZsBUcpyCU,913
33
+ comcheck_api/managers/components/envelope/skylight.py,sha256=ukJNqPgaKo-8fQ7vd9DsKcEn1elkoC7vJzx2TEGjT1s,307
34
+ comcheck_api/managers/components/envelope/window.py,sha256=kIc3J9BKlyaj-uADIr3wUK1IaHRx1phajjKO6ZCWXQY,294
35
+ comcheck_api/project_operations/__init__.py,sha256=4JST01vNBx9gILUk1LSTnFIXqTfrxZulAzxum8XvSuY,200
36
+ comcheck_api/project_operations/project_building_area_operations.py,sha256=4WLtOGpqT_rWq_tZwWE-eeIqNXASZjqb9OgcIFU9dZc,3491
37
+ comcheck_api/project_operations/project_envelope_operations.py,sha256=0fjnjDxg0xIf-yCxOwKR2pbLQ-TI9HtKwSP4do6oYOQ,30025
38
+ comcheck_api/schemas/comCheck.schema.json,sha256=e3XLXznluuDB4unBNDJHP3REi43uvrCkk4LyHt8N6rM,292455
39
+ comcheck_api/types/__init__.py,sha256=FgsNKPFFGAGxTNXe-GqDASO5kfs30lbuIFJ6DGqfNj8,1379
40
+ comcheck_api/types/api_types.py,sha256=591y39iokXn6_My3IvYC20abzjx3qVbDI3hO33NBHRk,4054
41
+ comcheck_api/types/common_types.py,sha256=-CNWKzJ5a0kDcKnICC9SDQRFwhFfqoU7lBGj_5V07CU,780
42
+ comcheck_api/types/core_types.py,sha256=8Myca-KkUlLfqRmCc3nfBTdAQfpGHREtV2aXmLe0mic,167389
43
+ comcheck_api/types/custom_base_model.py,sha256=i0IozkQCCqzITzFcrzbRuyNUf4NzcHuOfnEExCvGrqs,11208
44
+ comcheck_api/utilities/__init__.py,sha256=dR0r3GORwgYDzSSmZZhtzBc-ip_56plGkjqnO3po1YQ,98
45
+ comcheck_api/utilities/common.py,sha256=fIa1-RZc-2-5qYlUN67xMem-H-Om-EKwVNNzwtSZN44,1412
46
+ comcheck_api/utilities/envelope_utilities.py,sha256=BYOutg4zKFYVf-Cr0MBH-95pI7R1QSfmiFNet0m3WqM,1338
47
+ comcheck_api/utilities/id_registry.py,sha256=gGKc2k90726AxafUTtUICeasu2Wf7mvpWkElCbyF1Ic,2244
48
+ comcheck_api/utilities/project_utilities.py,sha256=SpXsMeDMhNkNNPi2DjeP15Wd7Wc4EWOee1bYLiJKMN8,1957
49
+ comcheck_api/DISCLAIMER.md,sha256=0eBTxQiTBPWvv3AbKOcm13O-LNdXdHW9-ygqDR0GlBw,1348
50
+ comcheck_api-1.0.0.dist-info/METADATA,sha256=-T5wGcmsSVfbdrIcvdSt6aCL7e--JRzCL2LJgknntoI,8252
51
+ comcheck_api-1.0.0.dist-info/WHEEL,sha256=mffPy8wBnZQn2VnJUU5jE99KsxaSfiyMHV9Yt0aLVxs,87
52
+ comcheck_api-1.0.0.dist-info/entry_points.txt,sha256=ddgK3Qw_NvaitnyavNa4L9YQTZMHmndpOuH1BcuIejk,55
53
+ comcheck_api-1.0.0.dist-info/licenses/LICENSE,sha256=C6PeRixx39RBUkf6qLRWptgzH3IyWzvpzOrXadXsCeA,1302
54
+ comcheck_api-1.0.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.30.1
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ comcheck-api = comcheck_api.cli:main
@@ -0,0 +1,24 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright Battelle Memorial Institute 2026
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ 1. Redistributions of source code must retain the above copyright notice, this
9
+ list of conditions and the following disclaimer.
10
+
11
+ 2. Redistributions in binary form must reproduce the above copyright notice,
12
+ this list of conditions and the following disclaimer in the documentation
13
+ and/or other materials provided with the distribution.
14
+
15
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
16
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
19
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
22
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
23
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.