gapit 0.2.2__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 (64) hide show
  1. gapit/__init__.py +3 -0
  2. gapit/blast.py +239 -0
  3. gapit/cli.py +128 -0
  4. gapit/cmd_db.py +113 -0
  5. gapit/cmd_db_build.py +72 -0
  6. gapit/cmd_db_install.py +126 -0
  7. gapit/cmd_db_outdated.py +51 -0
  8. gapit/cmd_db_search.py +66 -0
  9. gapit/cmd_screen.py +214 -0
  10. gapit/cmd_summary.py +65 -0
  11. gapit/config.py +51 -0
  12. gapit/data/snapshots/card.tar.gz +0 -0
  13. gapit/data/snapshots/vfdb.tar.gz +0 -0
  14. gapit/db.py +226 -0
  15. gapit/db_build_ops.py +210 -0
  16. gapit/db_ops.py +128 -0
  17. gapit/db_query_ops.py +252 -0
  18. gapit/dbbuild.py +207 -0
  19. gapit/dbcodec.py +117 -0
  20. gapit/dispatch.py +31 -0
  21. gapit/errors.py +87 -0
  22. gapit/fasta.py +123 -0
  23. gapit/formats/__init__.py +1 -0
  24. gapit/formats/json.py +309 -0
  25. gapit/formats/md.py +190 -0
  26. gapit/formats/schemas.py +30 -0
  27. gapit/formats/summary.py +103 -0
  28. gapit/formats/tsv.py +45 -0
  29. gapit/hits.py +107 -0
  30. gapit/mcp.py +158 -0
  31. gapit/mcp_schemas.py +123 -0
  32. gapit/mcp_tools.py +289 -0
  33. gapit/minimap.py +20 -0
  34. gapit/minimap2_run.py +114 -0
  35. gapit/paf.py +115 -0
  36. gapit/proctools.py +24 -0
  37. gapit/providers/__init__.py +39 -0
  38. gapit/providers/argannot.py +94 -0
  39. gapit/providers/bacmet2.py +59 -0
  40. gapit/providers/card.py +150 -0
  41. gapit/providers/common.py +245 -0
  42. gapit/providers/ecoh.py +63 -0
  43. gapit/providers/ecoli_vf.py +74 -0
  44. gapit/providers/megares.py +71 -0
  45. gapit/providers/ncbi.py +103 -0
  46. gapit/providers/plasmidfinder.py +69 -0
  47. gapit/providers/resfinder.py +123 -0
  48. gapit/providers/snapshots.py +119 -0
  49. gapit/providers/upec_expec_vf.py +85 -0
  50. gapit/providers/vfdb.py +92 -0
  51. gapit/providers/victors.py +109 -0
  52. gapit/py.typed +0 -0
  53. gapit/reads.py +221 -0
  54. gapit/records.py +152 -0
  55. gapit/report.py +25 -0
  56. gapit/screening.py +145 -0
  57. gapit/screening_reads.py +255 -0
  58. gapit/seqconvert.py +203 -0
  59. gapit/summary.py +151 -0
  60. gapit-0.2.2.dist-info/METADATA +183 -0
  61. gapit-0.2.2.dist-info/RECORD +64 -0
  62. gapit-0.2.2.dist-info/WHEEL +4 -0
  63. gapit-0.2.2.dist-info/entry_points.txt +3 -0
  64. gapit-0.2.2.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,183 @@
1
+ Metadata-Version: 2.5
2
+ Name: gapit
3
+ Version: 0.2.2
4
+ Summary: Mass screening of contigs for antimicrobial resistance and virulence genes — agent-first Python reimplementation of abricate
5
+ Project-URL: Homepage, https://github.com/indexofire/gapit
6
+ Project-URL: Documentation, https://indexofire.github.io/gapit/
7
+ Project-URL: Changelog, https://github.com/indexofire/gapit/blob/main/CHANGELOG.md
8
+ Project-URL: Source, https://github.com/indexofire/gapit
9
+ Project-URL: Issues, https://github.com/indexofire/gapit/issues
10
+ Author-email: indexofire <indexofire@gmail.com>
11
+ License-Expression: MIT
12
+ License-File: LICENSE
13
+ Keywords: AMR,bioinformatics,blast,genomics,virulence
14
+ Classifier: Development Status :: 4 - Beta
15
+ Classifier: Intended Audience :: Science/Research
16
+ Classifier: License :: OSI Approved :: MIT License
17
+ Classifier: Operating System :: MacOS
18
+ Classifier: Operating System :: POSIX :: Linux
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3.11
21
+ Classifier: Programming Language :: Python :: 3.12
22
+ Classifier: Programming Language :: Python :: 3.13
23
+ Classifier: Programming Language :: Python :: 3.14
24
+ Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
25
+ Requires-Python: >=3.11
26
+ Requires-Dist: pydantic>=2.7
27
+ Requires-Dist: rich>=13
28
+ Requires-Dist: typer>=0.12
29
+ Description-Content-Type: text/markdown
30
+
31
+ # gapit
32
+
33
+ Mass screening of contigs and reads for antimicrobial resistance and virulence genes. An
34
+ agent-first Python reimplementation of [abricate](https://github.com/tseemann/abricate):
35
+ byte-compatible TSV plus first-class JSON and Markdown.
36
+
37
+ ## Why gapit
38
+
39
+ - **Drop-in abricate replacement.** Same BLAST pipeline, same hit rules, abricate-format
40
+ TSV on stdout. Parity with abricate 1.4.0 is a release gate, checked by diffing gene
41
+ calls against real abricate (`pixi run -e parity parity`).
42
+ - **Machine-readable by design.** Versioned output schemas (`gapit.report/1`,
43
+ `gapit.reads/1`, `gapit.summary/1`), self-describing via `gapit schema`, typed JSON error
44
+ envelopes on stderr, documented exit codes. An agent can discover the whole contract
45
+ without reading docs.
46
+ - **Reads, not just contigs.** `gapit screen --r1/--r2` screens FASTQ through minimap2, and
47
+ `--r1` accepts assembly FASTA directly (content-detected, `map-ont` forced) for a fast
48
+ presence survey. abricate cannot screen raw reads.
49
+
50
+ ## Install
51
+
52
+ [pixi](https://pixi.sh) manages the environment, including the external binaries
53
+ (BLAST+, minimap2):
54
+
55
+ ```bash
56
+ git clone https://github.com/indexofire/gapit.git
57
+ cd gapit
58
+ pixi install
59
+ pixi run gapit --version
60
+ ```
61
+
62
+ The package supports Python 3.11+; the dev environment pins 3.14.
63
+
64
+ ## Quick start
65
+
66
+ ```bash
67
+ # Screen contigs (abricate-compatible TSV on stdout, --db defaults to ncbi)
68
+ gapit screen contigs.fa --db ncbi
69
+
70
+ # Agent- and human-readable outputs
71
+ gapit screen contigs.fa --db ncbi --format json
72
+ gapit screen contigs.fa --format md
73
+
74
+ # Screen FASTQ reads; --read-type picks the minimap2 preset
75
+ gapit screen --r1 sample_R1.fastq.gz --r2 sample_R2.fastq.gz --read-type sr --db card
76
+ gapit screen --r1 ont_reads.fastq.gz --read-type map-ont --format json
77
+
78
+ # Summarize report tables into a gene presence/absence matrix
79
+ gapit summary *.tsv
80
+
81
+ # Databases: card + vfdb install offline from bundled snapshots, others fetch on demand
82
+ gapit db fetch
83
+ gapit db fetch ncbi
84
+ gapit db list
85
+ gapit db outdated # flag stale databases and newer bundled snapshots
86
+ gapit db search "tet(M)" # look up genes across every installed database
87
+ gapit db build mydb my_genes.fa --tsv my_meta.tsv # custom db from any FASTA
88
+
89
+ # Introspection
90
+ gapit list # installed databases (abricate --list compatible)
91
+ gapit schema report # JSON Schema of gapit.report/1
92
+ ```
93
+
94
+ Contig screening follows abricate defaults (`--minid 80`, `--mincov 80`). Reads-mode
95
+ presence defaults to 90% alignment breadth (`--min-breadth 90`).
96
+
97
+ ## Databases
98
+
99
+ A database is a directory under the datadir, resolved from `$GAPIT_DATADIR`, then
100
+ `~/.local/share/gapit/db` (override per call with `--datadir`). Twelve providers exist;
101
+ `card` and `vfdb` ship inside the wheel and install with zero network, the rest download
102
+ from upstream when fetched.
103
+
104
+ | Name | Content | dbtype |
105
+ |---|---|---|
106
+ | `ncbi` | NCBI AMRFinderPlus curated AMR (default db) | nucl |
107
+ | `card` | CARD protein homolog resistance models | nucl |
108
+ | `resfinder` | CGE ResFinder acquired resistance genes | nucl |
109
+ | `argannot` | ARG-ANNOT acquired resistance genes | nucl |
110
+ | `plasmidfinder` | CGE PlasmidFinder replicons | nucl |
111
+ | `megares` | MEGARes antimicrobial resistance genes | nucl |
112
+ | `ecoh` | E. coli O and H antigens (srst2 EcOH) | nucl |
113
+ | `vfdb` | VFDB virulence factors (set A, nucleotide) | nucl |
114
+ | `ecoli_vf` | E. coli virulence factors | nucl |
115
+ | `bacmet2` | BacMet2 biocide/resistance genes (protein) | prot |
116
+ | `victors` | Victors virulence factors | nucl |
117
+ | `upec_expec_vf` | UPEC/ExPEC virulence genes | nucl |
118
+
119
+ gapit also reads datadirs built by abricate itself (legacy `~~~` headers). The reverse
120
+ does not hold: gapit-native databases use the `gapit/v1` header format (see SPEC.md §11),
121
+ which abricate cannot read. Protein databases such as `bacmet2` screen through blastx.
122
+
123
+ ## Output contract
124
+
125
+ - **stdout purity.** Data on stdout, diagnostics on stderr, always. `--quiet` silences
126
+ stderr only.
127
+ - **Deterministic.** Stable sort orders, fixed tool parameters, no wall-clock timestamps
128
+ inside data payloads.
129
+ - **Errors** print a JSON envelope to stderr and exit nonzero:
130
+
131
+ ```text
132
+ {"schema": "gapit.error/1", "code": "...", "message": "...", "context": {...}}
133
+ ```
134
+
135
+ | Exit code | Meaning |
136
+ |---|---|
137
+ | 0 | success |
138
+ | 1 | unexpected error |
139
+ | 2 | usage error |
140
+ | 3 | missing dependency |
141
+ | 4 | database error |
142
+ | 5 | input error |
143
+
144
+ ## MCP server
145
+
146
+ gapit ships an MCP (Model Context Protocol) stdio server so agent runtimes can
147
+ screen assemblies without parsing CLI output: `gapit mcp` or the `gapit-mcp`
148
+ console script speaks newline-delimited JSON-RPC 2.0 on stdin/stdout (no extra
149
+ dependencies — the protocol is hand-rolled). It exposes nine tools:
150
+ `screen` (gapit.report/1 by default; `aligner minimap2` for a fast assembly
151
+ survey), `screen_reads` (FASTQ via minimap2, gapit.reads/1), `summary`
152
+ (gapit.summary/1), `schema`, `db_list`, plus the database tools `db_fetch`,
153
+ `db_build`, `db_search`, and `db_outdated` so an agent can self-provision
154
+ and inspect databases mid-session.
155
+ Tool failures return `isError: true` with the `gapit.error/1` envelope as text.
156
+ Register it with an MCP client:
157
+
158
+ ```json
159
+ {"mcpServers": {"gapit": {"command": "gapit-mcp"}}}
160
+ ```
161
+
162
+ ## Development
163
+
164
+ | Task | Runs |
165
+ |---|---|
166
+ | `pixi run lint` | ruff check |
167
+ | `pixi run fmt` | ruff format |
168
+ | `pixi run typecheck` | basedpyright (strict) |
169
+ | `pixi run test` | pytest, 374 offline tests |
170
+ | `pixi run -e parity parity` | byte-diff screening vs real abricate |
171
+ | `pixi run -e parity summary-parity` | byte-diff summary vs real abricate |
172
+
173
+ User documentation lives in [`docs/index.md`](docs/index.md), rendered at
174
+ <https://indexofire.github.io/gapit/>.
175
+
176
+ `SPEC.md` is the parity contract, `PLAN.md` the roadmap, `AGENTS.md` the contributor
177
+ guide, `CHANGELOG.md` the change history.
178
+
179
+ ## License
180
+
181
+ gapit is MIT-licensed. It is a behavioral reimplementation of abricate (GPL-2.0) and
182
+ copies no Perl code; abricate itself remains GPL-2.0. Bundled database content retains
183
+ its original upstream licenses (SPEC.md §9).
@@ -0,0 +1,64 @@
1
+ gapit/__init__.py,sha256=npy8tLO68kPYUyXgBsYuFbzzd9AvxXloH74thCKEVnU,88
2
+ gapit/blast.py,sha256=gyZs-7qpSWXFMJ3ioYjFi1_CRCj2K701z8VKn23X0iQ,7324
3
+ gapit/cli.py,sha256=igE1dxq3WNtiaDFRUCGJxnQkVih61VRyoHt2ODCWWks,3871
4
+ gapit/cmd_db.py,sha256=o8tSQkLTL6sab_HJKzS07EPgDFTXBCAtv1wQ4btELiI,4268
5
+ gapit/cmd_db_build.py,sha256=YRyrO-4d9RIEhN900HV6-5llP-ktTmkiQr7-M2ClqOw,2205
6
+ gapit/cmd_db_install.py,sha256=8G4vb4RiKWu0PvprT7RNWLJQS5yyNhI0vUikPRQmgBY,4354
7
+ gapit/cmd_db_outdated.py,sha256=UDDps01d4VCtGjcnfehvGas5GprwzEI2V4NFempgQLE,1700
8
+ gapit/cmd_db_search.py,sha256=DXKgYVjxq2GBPhOYi0MrjK2u5Bp07SCrqK96vUYYz8g,2064
9
+ gapit/cmd_screen.py,sha256=Yc7bXv1eMSUnPno9Wm3cBLsQZQEBQrCsJvXeQ9yTDII,7324
10
+ gapit/cmd_summary.py,sha256=GTYCLco1A4ReNReDhe-HTQMN9TwPmXhiiUz_eHmLewY,2350
11
+ gapit/config.py,sha256=5MIkCNpaepiLcPfIHcD3j37DCPArq7fOQsklQDuLQjw,1748
12
+ gapit/db.py,sha256=iWbFQGZUoNIMovYXXa08DBEpFfrwqUz7oPai194Qiac,7605
13
+ gapit/db_build_ops.py,sha256=D2oqK9w-P7FtW9edqIALuPYhPy8WkRDb4uQ0CHcTmCc,8118
14
+ gapit/db_ops.py,sha256=rtqkMkPjQzBVMpEJ3B5BczT7GwlqVW2qO5K2Ul-5qCo,4298
15
+ gapit/db_query_ops.py,sha256=psFCO-oHKmQA_9O1cB6Di2pLmFVTxe8r30sVJtahqa0,8877
16
+ gapit/dbbuild.py,sha256=1hpeExTeYaoZX6tkGT-tSu8k-25X6WTNKjDBZwfVc4g,8646
17
+ gapit/dbcodec.py,sha256=R3zpGdQzYmWScXzFNxqdBxVyXGO1W2NeRa4EN7FHxrM,4352
18
+ gapit/dispatch.py,sha256=Wsr80ir-6PlCGCXv0ke_hwPsRqugKxNRjpIcf2Zwc9Y,975
19
+ gapit/errors.py,sha256=mgnjfrkKUeSGF_jWNY5Y6EdSASadqLd98syMCUQ9mO8,2495
20
+ gapit/fasta.py,sha256=Yp0TYHIETdgQCJdRUEiRdH73DXqAc_rcavpXz2H4obE,4827
21
+ gapit/hits.py,sha256=Rz6OhNT1eDJt8WN-LJ7pXXqTLkxpJFmGwLoHIROX7uE,3961
22
+ gapit/mcp.py,sha256=qTwNwgROWw1UWqvE9MgmBMJY9YLymolF66y0IcbySlU,6128
23
+ gapit/mcp_schemas.py,sha256=Iui7BVHMV5QqA2wGyoOGygaVJkzvPjBedmaLYupLVo8,5024
24
+ gapit/mcp_tools.py,sha256=H2PSr57Q2JVBGAZqssoCWcnoBYzAkXST9QrpxO8NC6I,10641
25
+ gapit/minimap.py,sha256=D02SblppMQO2xXXBPn1qkwMrm3NGffoUDjQAGywAa2Q,766
26
+ gapit/minimap2_run.py,sha256=kybiGQzOT6e9Hk4sUsn4KCEUmPTE0iET8G_Bt4rd43w,4415
27
+ gapit/paf.py,sha256=BeF0aPssqtkFB5y72sp5MceMYocx6ahynb61mgsqyqc,3970
28
+ gapit/proctools.py,sha256=MiNCxf3exIgvO7AE-4v1nKf3P-OXgIpcr2MSpQOLfX8,806
29
+ gapit/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
+ gapit/reads.py,sha256=mS3-BfR5_faDkTHZPuZtkfmGenbdrLxn_dZQQEqbwnY,7508
31
+ gapit/records.py,sha256=-y_jX33m6Lho2E2nKRL4VAgl7YhUkkIdBOa8koDKq3Q,5334
32
+ gapit/report.py,sha256=JCFfUynaE9u48BXAhBl3SVPcM4GMFp-UMvOC5GYmpn0,677
33
+ gapit/screening.py,sha256=SuNBI0j3gt8RsGkAUu0jAYPpWfczdJi7fWfWvQ_A4x8,5318
34
+ gapit/screening_reads.py,sha256=frEaYTOWnIc4eV2i0_ixnfTMNitS-frb9kOgz5TMi7w,9395
35
+ gapit/seqconvert.py,sha256=X8OQKCHuoEe6Ymy6EHAetc2cJsOLw_M922EoaNuRN5g,8076
36
+ gapit/summary.py,sha256=0FC4hGA5Xe8LUk1f6obh0PU6-ATRhgxJ-pXBGLAqX4s,5413
37
+ gapit/data/snapshots/card.tar.gz,sha256=ZYOMjU8WCSP7-MKWwPmGvVtV9_W1oVp7vrNUErlF4CU,778549
38
+ gapit/data/snapshots/vfdb.tar.gz,sha256=4YMiajFNmeUW1cYs8cG-0jX4LxVuNCrMjDpULqYseg4,1877853
39
+ gapit/formats/__init__.py,sha256=Vm0CRfUcoFVCFUW5fm0cIOkc5EijTvFD_A9dLrQp1Z0,89
40
+ gapit/formats/json.py,sha256=2t9ZZ0p16vqUHZTiMx7ygE-fAVb4vpq3Ie3sDtgZDkM,8986
41
+ gapit/formats/md.py,sha256=CFYsB0JixOECruqF0CyOXOKCyqnBsJsvTFFheJrPWS4,5693
42
+ gapit/formats/schemas.py,sha256=EzlT009nrY0QVz2R4vP1TQ9FbgdbjxsEYYDQIt0aBQ8,961
43
+ gapit/formats/summary.py,sha256=4o8g58rHwwZqrtGb6f-cp1-aecE4sgk-j83s7jXR9ok,3708
44
+ gapit/formats/tsv.py,sha256=xT9QkYdwxwU_wK1d4T7zOcSXvh2t6zb5xuIQel0-z74,1737
45
+ gapit/providers/__init__.py,sha256=aO6z2RsYHLlMeZlNybMuujaXeuhZNjvQ2UYyuEyMhyQ,1245
46
+ gapit/providers/argannot.py,sha256=DUfRJiRdhGv0oISr_iEhUv50frzAlzx4QXSo6Ixdl-k,3784
47
+ gapit/providers/bacmet2.py,sha256=uQuGV_H6h-JKKVkxRXA-YJB1vRLuSBPDRXeUsGW8fqc,2195
48
+ gapit/providers/card.py,sha256=-5Fm8pvkfElKPF8JMqib_2th6bTwHQJE_8vBYM6-GoA,5879
49
+ gapit/providers/common.py,sha256=ji6g-p4JaMHDRI8_6siYntUrLBY-5z5i5IsxloVIMa8,9784
50
+ gapit/providers/ecoh.py,sha256=3EoDbMqetrg5UwRbHrZS0ziOJxkQ4nD7N3KCyn7fezs,2332
51
+ gapit/providers/ecoli_vf.py,sha256=E-8Oxy7d2bPE3EWL5Z7j_KhVRgt-L9ls0M6BAxOOH0k,2849
52
+ gapit/providers/megares.py,sha256=B8IH_EGG1WFGFhy4A8M3_rjqRxJWH-GBVwiinuJze-c,2862
53
+ gapit/providers/ncbi.py,sha256=ziP7FBtO7pZBybgIfSrr8-7TO99Ggjd5z9xSeY_c_as,3953
54
+ gapit/providers/plasmidfinder.py,sha256=F7eFcHl0lg8wEk_ec1ug4dqIMYDem8fZnaj_d4BxQcE,2740
55
+ gapit/providers/resfinder.py,sha256=V1jyfIbHZQ-JdUlFI2PLhskf8MOv5q-fH1GsooEPItk,5144
56
+ gapit/providers/snapshots.py,sha256=KlTkmSJ5eCFw3AfHzMvtzRxcrSIQYf3pJwC_eRtURIs,4902
57
+ gapit/providers/upec_expec_vf.py,sha256=ZYdnKln-aXqxruHjnc_OMut9fgb3HR3yR-nwRv6X-lY,3035
58
+ gapit/providers/vfdb.py,sha256=00R9LrJ--Wj258xfvXI_HNZN9yNdBl1xgDgdW1Awe1s,3389
59
+ gapit/providers/victors.py,sha256=ljy5ORYgcnTFFe8zxD7HMrg4nwAhhTsyhmwfPtK3SbE,4316
60
+ gapit-0.2.2.dist-info/METADATA,sha256=cgkVLiAsyiiKyzw6bbyoRkaPCpJ9zjgKPDfMhRWe4Go,7426
61
+ gapit-0.2.2.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
62
+ gapit-0.2.2.dist-info/entry_points.txt,sha256=ZQFVrkUS1WgnRjxqbvK8tE0lPLmauKu5t2KSvjXlgxg,67
63
+ gapit-0.2.2.dist-info/licenses/LICENSE,sha256=BRqfGirnTzDMG2sCEWjasDGFmbGA0r9gQT_65tTsih4,1067
64
+ gapit-0.2.2.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.32.4
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ gapit = gapit.cli:app
3
+ gapit-mcp = gapit.mcp:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 indexofire
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.