se-interpretive-kernel 0.1.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 (26) hide show
  1. se_interpretive_kernel-0.1.0/.gitignore +369 -0
  2. se_interpretive_kernel-0.1.0/CHANGELOG.md +137 -0
  3. se_interpretive_kernel-0.1.0/CITATION.cff +51 -0
  4. se_interpretive_kernel-0.1.0/LICENSE +21 -0
  5. se_interpretive_kernel-0.1.0/PKG-INFO +261 -0
  6. se_interpretive_kernel-0.1.0/README.md +227 -0
  7. se_interpretive_kernel-0.1.0/SE_MANIFEST.toml +103 -0
  8. se_interpretive_kernel-0.1.0/pyproject.toml +157 -0
  9. se_interpretive_kernel-0.1.0/src/se_interpretive_kernel/__init__.py +7 -0
  10. se_interpretive_kernel-0.1.0/src/se_interpretive_kernel/_version.py +24 -0
  11. se_interpretive_kernel-0.1.0/src/se_interpretive_kernel/artifact.py +76 -0
  12. se_interpretive_kernel-0.1.0/src/se_interpretive_kernel/cases.py +120 -0
  13. se_interpretive_kernel-0.1.0/src/se_interpretive_kernel/check.py +293 -0
  14. se_interpretive_kernel-0.1.0/src/se_interpretive_kernel/cli.py +5 -0
  15. se_interpretive_kernel-0.1.0/src/se_interpretive_kernel/demand.py +66 -0
  16. se_interpretive_kernel-0.1.0/src/se_interpretive_kernel/differences.py +69 -0
  17. se_interpretive_kernel-0.1.0/src/se_interpretive_kernel/explain.py +224 -0
  18. se_interpretive_kernel-0.1.0/src/se_interpretive_kernel/generated.py +100 -0
  19. se_interpretive_kernel-0.1.0/src/se_interpretive_kernel/kernel.py +52 -0
  20. se_interpretive_kernel-0.1.0/src/se_interpretive_kernel/lifting.py +374 -0
  21. se_interpretive_kernel-0.1.0/src/se_interpretive_kernel/literal.py +87 -0
  22. se_interpretive_kernel-0.1.0/src/se_interpretive_kernel/loader.py +238 -0
  23. se_interpretive_kernel-0.1.0/src/se_interpretive_kernel/partition.py +363 -0
  24. se_interpretive_kernel-0.1.0/src/se_interpretive_kernel/probes.py +124 -0
  25. se_interpretive_kernel-0.1.0/src/se_interpretive_kernel/sampling.py +36 -0
  26. se_interpretive_kernel-0.1.0/src/se_interpretive_kernel/witness.py +69 -0
@@ -0,0 +1,369 @@
1
+ # ============================================================
2
+ # .gitignore (ALL-REPOS)
3
+ # ============================================================
4
+ # Updated: 2026-10-11
5
+ #
6
+ # WHAT: A Git configuration file that identifies files and directories
7
+ # that should not be included in the repository's version history.
8
+ # Git uses this file to determine which untracked files to ignore.
9
+ #
10
+ # WHEN: Use in professional repositories managed with Git.
11
+ # Git automatically applies these rules when working with files.
12
+ #
13
+ # WHY: Version the files we create and maintain for this project.
14
+ # Avoid tracking downloaded dependencies, generated output,
15
+ # temporary files, local settings, and sensitive information.
16
+ # Other projects maintain the source code and version history
17
+ # of their own dependencies.
18
+ #
19
+ # HOW: List file and directory patterns below.
20
+ # Patterns work across different languages, tools, and project types.
21
+ # Sections are organized by purpose for easier maintenance.
22
+ #
23
+ # In VS Code, open the 'Outline view' in the Explorer sidebar to
24
+ # see and navigate the different sections of this file.
25
+ # Requires the recommended 'Comment Section Outline' extension
26
+ # (see .vscode/extensions.json).
27
+ #
28
+ # TOOLS: Git tracks changes to project files and maintains version history.
29
+ # .gitignore controls which untracked files Git ignores.
30
+ #
31
+ # SKILLS: Git, version control, repository management,
32
+ # file patterns, dependency management, and project maintenance.
33
+ #
34
+ # REQ: All professional GitHub project repositories MUST include .gitignore.
35
+ # REQ: Never commit secrets or private credentials.
36
+ #
37
+ # OBS: .gitignore does not remove files already tracked by Git.
38
+ # OBS: Dependency manifests and lockfiles should generally be committed
39
+ # even when downloaded dependencies are ignored.
40
+ # OBS: Patterns for unused tools or languages are generally harmless.
41
+ #
42
+ # ALT: Repositories may customize ignores while preserving safety rules.
43
+ # CUSTOM: Delete sections that are not needed for the project.
44
+ # CUSTOM: Add project-specific patterns when necessary.
45
+ #
46
+ # ============================================================
47
+ # === INTRO: How .gitignore patterns work ===
48
+ # ============================================================
49
+ # NOTE: .gitignore uses glob-style patterns, not regular expressions.
50
+ #
51
+ # /name
52
+ # WHY: A leading slash anchors the pattern to the directory containing this
53
+ # .gitignore file. In a repository-root .gitignore, /name matches only name
54
+ # at the repository root.
55
+ # EXAMPLE: /pyproject.toml.ruff ignores only the root-level temporary fragment.
56
+ #
57
+ # name/
58
+ # WHY: A trailing slash means the pattern matches directories, not files.
59
+ # EXAMPLE: bin/ ignores directories named bin and their contents.
60
+ #
61
+ # *.ext
62
+ # WHY: An asterisk (*) matches any number of characters within one path component.
63
+ # EXAMPLE: *.log ignores files ending in .log.
64
+ #
65
+ # **
66
+ # WHY: A double asterisk (**) can match across directory levels.
67
+ # EXAMPLE: **/src/**/_version.py matches generated _version.py files inside
68
+ # src trees regardless of repository depth or package name.
69
+ #
70
+ # ?
71
+ # WHY: A question mark (?) matches exactly one character within a path component.
72
+ # EXAMPLE: temp?.txt matches temp1.txt and tempa.txt, but not temp10.txt.
73
+ #
74
+ # [abc]
75
+ # WHY: Square brackets match one character from the listed set or range.
76
+ # EXAMPLE: file[0-9].txt matches file0.txt through file9.txt.
77
+ #
78
+ # !pattern
79
+ # WHY: An exclamation point (!) negates an earlier ignore rule and re-includes
80
+ # a matching file when its parent directory has not itself been excluded.
81
+ # EXAMPLE: !.env.example keeps the safe example file even though .env.* is ignored.
82
+ #
83
+ # # text
84
+ # WHY: A leading # makes the line a comment unless the # is escaped.
85
+ #
86
+ # NOTE: Prefer the narrowest pattern that expresses the intent.
87
+ # Anchored patterns such as /name are safer when
88
+ # only a repository-root file should be ignored.
89
+ # ============================================================
90
+
91
+ # ============================================================
92
+ # === SECTION: UNIVERSAL ===
93
+ # ============================================================
94
+
95
+ # === Environment variables and secrets ===
96
+
97
+ # WHY: Never commit credentials or environment-specific configuration.
98
+ *.env
99
+ .env
100
+ .env.*
101
+
102
+ # WHY: Commit .env.example as a safe template showing which variables to set.
103
+ # NOTE: Copy .env.example to .env locally and customize the local copy.
104
+ !.env.example
105
+
106
+
107
+ # === Private notes and local-only files ===
108
+
109
+ # WHY: Private working notes should remain local unless intentionally published.
110
+ PRIVATE-NOTES.md
111
+ PRIVATE_NOTES.md
112
+
113
+ # WHY: The root-level refs directory holds local reference papers and source
114
+ # materials that should be cited or linked to rather than committed.
115
+ # NOTE: The leading slash limits this rule to the repository-root refs directory.
116
+ # ALT: Commit only reference material that is intentionally redistributable and
117
+ # appropriate to include in the repository.
118
+ /refs/
119
+
120
+
121
+ # === Operating-system files ===
122
+
123
+ # WHY: OS-generated metadata files are machine-specific and should not be tracked.
124
+ .AppleDouble
125
+ .DS_Store
126
+ .LSOverride
127
+ .Spotlight-V100/
128
+ .Trashes
129
+ ._*
130
+ Icon\r
131
+ Thumbs.db
132
+ desktop.ini
133
+ ehthumbs.db
134
+
135
+
136
+ # === Editors and IDEs ===
137
+
138
+ # WHY: IDE metadata is generally machine-local and should not be tracked.
139
+ *.code-workspace
140
+ .idea/
141
+
142
+
143
+ # === VS Code ===
144
+
145
+ # WHY: Ignore editor state by default while allowing shared project configuration.
146
+ # NOTE: Use .vscode/* (contents), not .vscode/ (directory). Git will not
147
+ # re-include a file whose parent directory is excluded.
148
+ .vscode/*
149
+ !.vscode/ABOUT_THIS_FOLDER.md
150
+ !.vscode/extensions.json
151
+ !.vscode/settings.json
152
+ !.vscode/launch.json
153
+ !.vscode/tasks.json
154
+ !.vscode/*.code-snippets
155
+
156
+
157
+ # === Temporary, lock, and swap files ===
158
+
159
+ # WHY: Temporary and swap files are machine-local noise and create meaningless diffs.
160
+ *.swo
161
+ *.swp
162
+ *.tmp
163
+ *~
164
+
165
+ # WHY: Microsoft Office creates temporary owner/lock files beside open documents.
166
+ # NOTE: These patterns cover Word, Excel, and PowerPoint temporary files without
167
+ # ignoring the actual Office documents.
168
+ ~$*.doc*
169
+ ~$*.xls*
170
+ ~$*.ppt*
171
+
172
+ # WHY: LibreOffice and OpenOffice create temporary lock files beside open documents.
173
+ .~lock.*#
174
+
175
+
176
+ # === Logs and generated runtime output ===
177
+
178
+ # WHY: Ignore logs and runtime output by default.
179
+ # ALT: Explicitly re-include a specific log only when it is intentionally used
180
+ # as project evidence.
181
+ *.log
182
+ logs/
183
+ # !/project.log
184
+
185
+
186
+ # === Generic caches ===
187
+
188
+ # WHY: Generic caches are machine-local and should not be tracked.
189
+ .cache/
190
+
191
+
192
+ # === Generic bin (binary) folder ===
193
+
194
+ # WHY: The root-level bin directory contains generated executable or build output.
195
+ # NOTE: The leading slash limits this rule to the repository-root bin directory
196
+ # and avoids ignoring a nested source directory that happens to be named bin.
197
+ /bin/
198
+
199
+
200
+ # ============================================================
201
+ # === SECTION: PROJECT DOCS ===
202
+ # ============================================================
203
+
204
+ # WHY: Static site build output is generated from the documentation source.
205
+ # NOTE: Zensical uses site/ as the generated site output directory.
206
+ site/
207
+
208
+ # ============================================================
209
+ # === SECTION: PYTHON ===
210
+ # ============================================================
211
+
212
+ # === Python environments ===
213
+
214
+ # WHY: Virtual environments are machine-local and reproducible from project files.
215
+ .venv/
216
+ venv/
217
+
218
+
219
+ # === Python project state ===
220
+
221
+ # REQ: Do NOT git ignore .python-version.
222
+ # WHY: Commit .python-version to declare the Python version used by the project.
223
+
224
+ # REQ: Do NOT git ignore uv.lock.
225
+ # WHY: Commit uv.lock to preserve the resolved dependency environment and use it
226
+ # in CI/CD pipelines.
227
+
228
+ # WHY: Generated SCM version modules should not be tracked.
229
+ # NOTE: This recursive pattern works regardless of repository depth or package name.
230
+ **/src/**/_version.py
231
+
232
+
233
+ # === Python bytecode ===
234
+
235
+ # WHY: Python bytecode is generated automatically and is machine-specific.
236
+ *.pyc
237
+ *.pyd
238
+ *.pyo
239
+ __pycache__/
240
+
241
+
242
+ # === Python build and packaging artifacts ===
243
+
244
+ # WHY: Build and packaging artifacts are generated from project source.
245
+ *.egg
246
+ *.egg-info/
247
+ *.whl
248
+ .eggs/
249
+ build/
250
+ dist/
251
+
252
+
253
+ # === Python testing and coverage output ===
254
+
255
+ # WHY: Test and coverage reports are generated and can be reproduced.
256
+ .coverage
257
+ .coverage.*
258
+ .pytest_cache/
259
+ htmlcov/
260
+ coverage.xml
261
+ coverage.json
262
+ coverage.lcov
263
+
264
+
265
+ # === Python tooling caches ===
266
+
267
+ # WHY: Tooling caches improve local performance but should not be tracked.
268
+ .mypy_cache/
269
+ .pytype/
270
+ .ruff_cache/
271
+ .tox/
272
+
273
+
274
+ # === Python notebooks and marimo ===
275
+
276
+ # WHY: Jupyter notebook checkpoint state is generated.
277
+ .ipynb_checkpoints/
278
+
279
+ # REQ: Do NOT git ignore layouts/ when using marimo custom layouts.
280
+ # WHY: Marimo layout files are project source and should be version controlled.
281
+
282
+ # REQ: Do NOT git ignore public/ when it contains source assets or data
283
+ # used by marimo or WASM applications.
284
+ # WHY: These files may be required to reproduce or publish the application.
285
+
286
+
287
+ # ============================================================
288
+ # === SECTION: NODE ===
289
+ # ============================================================
290
+ # Some tooling and projects require Node.js and its dependencies.
291
+
292
+ # WHY: Node dependencies are restored from package-lock.json with npm ci.
293
+ node_modules/
294
+
295
+ # REQ: Do NOT git ignore package-lock.json.
296
+ # WHY: Commit package-lock.json to preserve reproducible Node dependency
297
+ # resolution and use it in CI/CD pipelines.
298
+
299
+
300
+ # === Node package-manager caches ===
301
+
302
+ # WHY: Package-manager caches are machine-local and should not be tracked.
303
+ .npm/
304
+ .pnpm-store/
305
+ .yarn/cache/
306
+ .yarn/unplugged/
307
+ .yarn/build-state.yml
308
+ .yarn/install-state.gz
309
+
310
+ # ============================================================
311
+ # === SECTION: TYPESCRIPT AND JAVASCRIPT ===
312
+ # ============================================================
313
+
314
+ # === TypeScript and JavaScript build output ===
315
+
316
+ # WHY: Compiled JavaScript output is generated from TypeScript source.
317
+ out/
318
+
319
+ # WHY: TypeScript incremental build metadata is generated.
320
+ *.tsbuildinfo
321
+
322
+
323
+ # === TypeScript and JavaScript tooling caches ===
324
+
325
+ # WHY: Tooling caches and generated coverage output should not be tracked.
326
+ .eslintcache
327
+ .nyc_output/
328
+ coverage/
329
+
330
+
331
+ # === VS Code extension test and package output ===
332
+
333
+ # WHY: VS Code extension test-host files are generated by @vscode/test-electron.
334
+ .vscode-test/
335
+
336
+ # WHY: VSIX packages are generated release artifacts.
337
+ *.vsix
338
+
339
+ # ============================================================
340
+ # === SECTION: COMPUTER-CHECKED MATHEMATICAL PROOFS (LEAN) ===
341
+ # ============================================================
342
+
343
+ # === Lean ===
344
+
345
+ # WHAT: Lean is a programming language and proof assistant used to
346
+ # express mathematical definitions, theorems, and proofs.
347
+ # It can also verify properties of software and logical systems.
348
+ # Lean checks whether formal proofs satisfy their stated rules.
349
+ #
350
+ # WHY: Lake, Lean's project and build tool, generates build files
351
+ # and downloads dependencies that do not need to be committed.
352
+ .lake/
353
+ lake-packages/
354
+ /docbuild/
355
+
356
+
357
+ # ============================================================
358
+ # === SECTION: CUSTOM GENERATED ARTIFACTS ===
359
+ # ============================================================
360
+
361
+ # === Generated files for supported repositories ===
362
+
363
+ # WHY: Generated analytics and guide-context artifacts should be rebuilt rather
364
+ # than committed.
365
+ # NOTE: These entries are harmless in repositories that do not generate them.
366
+ docs/assets/data/view-analytics.json
367
+ docs/assets/data/guide-context.json
368
+ # marimo WASM export; built at deploy time, not committed
369
+ docs/app/
@@ -0,0 +1,137 @@
1
+ # Changelog
2
+
3
+ <!-- markdownlint-disable MD024 -->
4
+
5
+ All notable changes to this project will be documented in this file.
6
+
7
+ The format is based on **[Keep a Changelog](https://keepachangelog.com/en/1.1.0/)**
8
+ and this project adheres to **[Semantic Versioning](https://semver.org/spec/v2.0.0.html)**.
9
+
10
+ ---
11
+
12
+ ## [Unreleased]
13
+
14
+ ---
15
+
16
+ ## [0.1.0] - 2026-10-31
17
+
18
+ ### Added
19
+
20
+ - Added the initial Python package, the executable companion to the Lean
21
+ library `se-theory-interpretive-kernel`.
22
+ - Added the finite partition algebra and the comparison lifting protocol with
23
+ the three cost laws and their validators.
24
+ - Added the finite artifact: frames, outputs, probes, and a total
25
+ interpretation table.
26
+ - Added the interpretation-induced kernel, coherence, the generated occurrence
27
+ regime, and the interpretive threshold.
28
+ - Added finite incompatibility witnesses and pairwise interpretive demand with
29
+ the generalized ultrametric laws.
30
+ - Added an independent pair-set oracle for the partition-based
31
+ implementation.
32
+ - Added finite cases mirroring the Lean examples.
33
+ - Added exhaustive law checks over every probe family and every pair of
34
+ regimes, and seeded random artifacts, run by the command-line interface.
35
+ - Added documentation, CI, release automation, and the repository manifest.
36
+ - Added probe sensitivity: separating probes, load-bearing probes, minimal
37
+ probe sets, and the threshold each probe forces alone.
38
+ - Added derivations for forced identifications: the chain of probes and frame
39
+ pairs that connects two outputs in the threshold.
40
+ - Added a loader that builds an artifact and a frame regime from tabular data,
41
+ with declared handling of empty cells.
42
+ - Added a report of the differences between two frame regimes.
43
+
44
+ ---
45
+
46
+ ## Notes on Versioning and Releases
47
+
48
+ - We use **SemVer**:
49
+ - **MAJOR** - breaking changes
50
+ - **MINOR** - backward-compatible features
51
+ - **PATCH** - fixes, documentation, tests, tooling
52
+ - Versions are driven by git tags. Tag `vX.Y.Z` to release.
53
+ - Docs are deployed per version tag and aliased to **latest**.
54
+
55
+ ## Release Procedure (Required)
56
+
57
+ Follow these steps exactly when creating a new release.
58
+
59
+ ### Task 1. Update release metadata (manual edits)
60
+
61
+ 1.1. `CITATION.cff` - update `version` and `date-released`
62
+ 1.2. `CHANGELOG.md` - add section, move unreleased entries, update links
63
+ 1.3. `pyproject.toml` - update build system `fallback-version`
64
+ 1.4. `codemeta.json` - update `version` and `datePublished`
65
+
66
+ ### Task 2. Validate
67
+
68
+ ```pwsh
69
+ .\sit.ps1
70
+
71
+ uv lock
72
+ foreach ($v in '3.12','3.13','3.14','3.15') {
73
+ Write-Host "=== Python $v"
74
+ uv run --isolated --frozen --python $v --no-default-groups --group dev python -m pytest -q
75
+ }
76
+
77
+ uvx gha-tools autoupdate --pin=all --write .github/workflows
78
+
79
+ uvx zizmor@latest .github/
80
+ # suppressed and informational are okay
81
+
82
+ uvx cffconvert --validate
83
+ uvx se-manifest-schema validate-manifest --strict
84
+
85
+ # This may take a little time
86
+ uv run se-interpretive-kernel --random 2000 --seed 0
87
+
88
+ uv run python -c "import shutil; from pathlib import Path; shutil.rmtree(Path('dist'), ignore_errors=True)"
89
+
90
+ uv build
91
+ uvx twine check --strict dist/*
92
+
93
+ uv run python -c "import pathlib, zipfile; wheels=list(pathlib.Path('dist').glob('*.whl')); assert wheels, 'No wheel found'; wheel=wheels[-1]; names=zipfile.ZipFile(wheel).namelist(); packaged=[n for n in names if n.startswith('se_interpretive_kernel/')]; print(packaged); assert packaged, 'Package files missing from wheel'"
94
+ ```
95
+
96
+ ### Task 3. Commit, push, tag
97
+
98
+ ```shell
99
+ git add -A
100
+ git commit -m "Prepare X.Y.Z"
101
+ git push -u origin main
102
+ ```
103
+
104
+ Verify actions run on GitHub. After success:
105
+
106
+ ```shell
107
+ git tag vX.Y.Z -m "X.Y.Z"
108
+ git push origin vX.Y.Z
109
+ ```
110
+
111
+ ### Task 4. Verify the Release and Zenodo archive
112
+
113
+ The release workflow creates a GitHub Release automatically.
114
+ To verify:
115
+
116
+ ```shell
117
+ gh release view vX.Y.Z # confirm Release exists with notes + artifacts
118
+ gh run list --workflow=release-pypi.yml # confirm the workflow succeeded
119
+ ```
120
+
121
+ Confirm Zenodo shows a new version-specific DOI for this release
122
+ and that it remains linked under the
123
+ repository's concept DOI recorded in `CITATION.cff`.
124
+
125
+ ## Only As Needed (delete a tag)
126
+
127
+ ```shell
128
+ git tag -d vX.Y.Z
129
+ git push origin :refs/tags/vX.Y.Z
130
+ ```
131
+
132
+ ## Links
133
+
134
+ [Unreleased]: https://github.com/structural-explainability/se-interpretive-kernel/compare/v0.1.0...HEAD
135
+ [0.1.0]: https://github.com/structural-explainability/se-interpretive-kernel/releases/tag/v0.1.0
136
+
137
+ <!-- markdownlint-enable MD024 -->
@@ -0,0 +1,51 @@
1
+ # ============================================================
2
+ # CITATION.cff (How to cite this project)
3
+ # ============================================================
4
+ # REQ.UNIVERSAL: Professional open projects SHOULD include this file.
5
+ # May reference upstream dependencies, but must not refer to downstream.
6
+ # USAGE: See https://citation-file-format.github.io/ for details.
7
+ # check with:
8
+ # uvx cffconvert --validate
9
+
10
+ cff-version: "1.2.0"
11
+ type: software
12
+ message: "If you use this work, please cite it using the metadata in this file."
13
+
14
+ title: "Structural Explainability Verification: Interpretive Kernel"
15
+ version: "0.1.0"
16
+ date-released: "2026-10-31"
17
+
18
+ authors:
19
+ - family-names: Case
20
+ given-names: Denise M.
21
+ orcid: "https://orcid.org/0000-0001-6165-7389"
22
+ affiliation: "Northwest Missouri State University, School of Computer Science and Information Systems, Maryville, MO, USA"
23
+
24
+ repository-code: "https://github.com/structural-explainability/se-interpretive-kernel"
25
+ url: "https://github.com/structural-explainability/se-interpretive-kernel"
26
+
27
+ license: MIT
28
+
29
+ abstract: >
30
+ A Python implementation and verification harness for the finite
31
+ interpretive kernel of Structural Explainability.
32
+ Given finite frames, outputs, and probes with a total interpretation,
33
+ the software computes the interpretation-induced kernel of an output
34
+ regime, the generated occurrence regime and interpretive threshold of a
35
+ frame regime, finite incompatibility witnesses, and pairwise interpretive
36
+ demand.
37
+ It checks the adjunction between kernel and generated regime, their
38
+ preservation properties, and the laws a comparison lifting must satisfy,
39
+ exhaustively on small cases and on seeded random artifacts, against an
40
+ independent pair-set oracle.
41
+
42
+ keywords:
43
+ - structural-explainability
44
+ - interpretive-kernel
45
+ - interpretation
46
+ - equivalence-relations
47
+ - partitions
48
+ - refinement
49
+ - galois-connection
50
+ - verification
51
+ - differential-testing
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Denise Case
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.