cfa-kernel 0.1.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 (98) hide show
  1. cfa/__init__.py +39 -0
  2. cfa/_lazy.py +39 -0
  3. cfa/adapters/__init__.py +104 -0
  4. cfa/adapters/autogen.py +19 -0
  5. cfa/adapters/crewai.py +19 -0
  6. cfa/adapters/dspy.py +19 -0
  7. cfa/adapters/langgraph.py +19 -0
  8. cfa/adapters/openai_agents.py +19 -0
  9. cfa/audit/__init__.py +15 -0
  10. cfa/audit/context.py +205 -0
  11. cfa/audit/hashing.py +41 -0
  12. cfa/audit/trail.py +194 -0
  13. cfa/backends/__init__.py +132 -0
  14. cfa/backends/dbt.py +338 -0
  15. cfa/backends/pyspark.py +240 -0
  16. cfa/backends/sql.py +270 -0
  17. cfa/behavior/__init__.py +49 -0
  18. cfa/behavior/llm.py +244 -0
  19. cfa/behavior/spec.py +235 -0
  20. cfa/behavior/systematizer.py +222 -0
  21. cfa/cli/__init__.py +296 -0
  22. cfa/cli/__main__.py +6 -0
  23. cfa/cli/_helpers.py +109 -0
  24. cfa/cli/core/__init__.py +0 -0
  25. cfa/cli/core/evaluate.py +72 -0
  26. cfa/cli/core/validate.py +29 -0
  27. cfa/cli/formatters.py +280 -0
  28. cfa/cli/governance/__init__.py +0 -0
  29. cfa/cli/governance/audit.py +65 -0
  30. cfa/cli/governance/catalog.py +28 -0
  31. cfa/cli/governance/policy.py +119 -0
  32. cfa/cli/governance/rules.py +42 -0
  33. cfa/cli/governance/signature.py +31 -0
  34. cfa/cli/infrastructure/__init__.py +0 -0
  35. cfa/cli/infrastructure/backend_list.py +24 -0
  36. cfa/cli/infrastructure/storage.py +87 -0
  37. cfa/cli/project/__init__.py +0 -0
  38. cfa/cli/project/init.py +73 -0
  39. cfa/cli/project/lifecycle.py +92 -0
  40. cfa/cli/project/status.py +75 -0
  41. cfa/cli/project/taxonomy.py +38 -0
  42. cfa/cli/reporting/__init__.py +0 -0
  43. cfa/cli/reporting/report.py +109 -0
  44. cfa/cli/reporting/serve.py +43 -0
  45. cfa/config.py +103 -0
  46. cfa/core/__init__.py +19 -0
  47. cfa/core/codegen.py +65 -0
  48. cfa/core/conditions.py +129 -0
  49. cfa/core/kernel.py +224 -0
  50. cfa/core/phases/__init__.py +0 -0
  51. cfa/core/phases/runner.py +477 -0
  52. cfa/core/planner.py +290 -0
  53. cfa/execution/__init__.py +12 -0
  54. cfa/execution/partial.py +339 -0
  55. cfa/execution/state_projection.py +216 -0
  56. cfa/governance/__init__.py +76 -0
  57. cfa/lifecycle/__init__.py +51 -0
  58. cfa/mcp/__init__.py +347 -0
  59. cfa/mcp/__main__.py +4 -0
  60. cfa/normalizer/__init__.py +15 -0
  61. cfa/normalizer/base.py +441 -0
  62. cfa/normalizer/llm.py +426 -0
  63. cfa/observability/__init__.py +14 -0
  64. cfa/observability/indices.py +177 -0
  65. cfa/observability/metrics.py +91 -0
  66. cfa/observability/notify.py +79 -0
  67. cfa/observability/otel.py +81 -0
  68. cfa/observability/promotion.py +367 -0
  69. cfa/policy/__init__.py +12 -0
  70. cfa/policy/bundle.py +317 -0
  71. cfa/policy/catalog.py +117 -0
  72. cfa/policy/engine.py +306 -0
  73. cfa/reporting/__init__.py +42 -0
  74. cfa/reporting/charts.py +223 -0
  75. cfa/reporting/engine.py +456 -0
  76. cfa/resolution/__init__.py +62 -0
  77. cfa/runtime/__init__.py +13 -0
  78. cfa/runtime/gate.py +287 -0
  79. cfa/sandbox/__init__.py +189 -0
  80. cfa/sandbox/executor.py +92 -0
  81. cfa/sandbox/mock.py +89 -0
  82. cfa/sandbox/panic.py +52 -0
  83. cfa/storage/__init__.py +591 -0
  84. cfa/testing/__init__.py +60 -0
  85. cfa/testing/asserts.py +77 -0
  86. cfa/testing/evaluate.py +168 -0
  87. cfa/testing/fixtures.py +89 -0
  88. cfa/testing/markers.py +36 -0
  89. cfa/types.py +489 -0
  90. cfa/validation/__init__.py +14 -0
  91. cfa/validation/runtime.py +285 -0
  92. cfa/validation/signature.py +146 -0
  93. cfa/validation/static.py +252 -0
  94. cfa_kernel-0.1.0.dist-info/METADATA +32 -0
  95. cfa_kernel-0.1.0.dist-info/RECORD +98 -0
  96. cfa_kernel-0.1.0.dist-info/WHEEL +4 -0
  97. cfa_kernel-0.1.0.dist-info/entry_points.txt +3 -0
  98. cfa_kernel-0.1.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,32 @@
1
+ Metadata-Version: 2.4
2
+ Name: cfa-kernel
3
+ Version: 0.1.0
4
+ Summary: CFA — Governed execution for AI agents and data systems
5
+ Project-URL: Homepage, https://marquesantero.github.io/cfa/
6
+ Project-URL: Repository, https://github.com/marquesantero/cfa
7
+ Project-URL: Documentation, https://marquesantero.github.io/cfa/docs/intro
8
+ License: MIT
9
+ License-File: LICENSE
10
+ Requires-Python: >=3.11
11
+ Provides-Extra: all
12
+ Requires-Dist: mcp>=1.0; extra == 'all'
13
+ Requires-Dist: openai>=1.0; extra == 'all'
14
+ Requires-Dist: opentelemetry-api>=1.20; extra == 'all'
15
+ Requires-Dist: opentelemetry-exporter-otlp-proto-grpc>=1.20; extra == 'all'
16
+ Requires-Dist: opentelemetry-sdk>=1.20; extra == 'all'
17
+ Requires-Dist: pyyaml>=6.0; extra == 'all'
18
+ Provides-Extra: dev
19
+ Requires-Dist: pytest-cov>=5.0; extra == 'dev'
20
+ Requires-Dist: pytest>=8.0; extra == 'dev'
21
+ Requires-Dist: pyyaml>=6.0; extra == 'dev'
22
+ Requires-Dist: ruff>=0.8; extra == 'dev'
23
+ Provides-Extra: llm
24
+ Requires-Dist: openai>=1.0; extra == 'llm'
25
+ Provides-Extra: mcp
26
+ Requires-Dist: mcp>=1.0; extra == 'mcp'
27
+ Provides-Extra: otel
28
+ Requires-Dist: opentelemetry-api>=1.20; extra == 'otel'
29
+ Requires-Dist: opentelemetry-exporter-otlp-proto-grpc>=1.20; extra == 'otel'
30
+ Requires-Dist: opentelemetry-sdk>=1.20; extra == 'otel'
31
+ Provides-Extra: yaml
32
+ Requires-Dist: pyyaml>=6.0; extra == 'yaml'
@@ -0,0 +1,98 @@
1
+ cfa/__init__.py,sha256=72LkxMso-lf6IPKTKxhscVhT2vi0l7-KuIDLh8yV0JE,1826
2
+ cfa/_lazy.py,sha256=deZgPcLeo98fp3BZa1YSuUka-vO-ZM_1bl3K0MAMhe0,1056
3
+ cfa/config.py,sha256=tNKaEdA4tuAGkL3XnnCkj3EoYEFNNmXBuczuJOENeUU,3565
4
+ cfa/types.py,sha256=yy6eUMocM9hW6v7HgnnXGgp2164Lo0gfCoJosABda8g,17966
5
+ cfa/adapters/__init__.py,sha256=bMq_8w7Pt92BqOigKvpnLxVLlCdCbufI2r1eEl0k6XM,3253
6
+ cfa/adapters/autogen.py,sha256=XR-ARC21hu7wDhp87TrEZd__6s1QTjlBZ66s3rt5mg4,459
7
+ cfa/adapters/crewai.py,sha256=QulTnXh07LYCVjAX-InysHpKoXygq-Y52RKPPfvSMp0,447
8
+ cfa/adapters/dspy.py,sha256=IvbmtsyJsUM4OO_WsQ-cL9wggRmQerJ7HlCRDRYUl2U,466
9
+ cfa/adapters/langgraph.py,sha256=6pPM05-rUxeisrS7hocmAz5_CEgeT_yUpYrDA9tM6D0,581
10
+ cfa/adapters/openai_agents.py,sha256=fpeE-9NJlyueeKrx2KyYdVrgLjSiaOZbKY3JVxfnn_M,547
11
+ cfa/audit/__init__.py,sha256=11RQxbjoVmj29W86Bt23RsSfHsLmRbPJ3-WPNoCOiG4,813
12
+ cfa/audit/context.py,sha256=sBVaHk0wLqsvA7NgkxjLygkAtpDxlvWVRS_U0fawTbQ,7046
13
+ cfa/audit/hashing.py,sha256=qjySaeaInZvaGAijCZc5YrLKG8I3mEYNWQABH8Cd1xE,1473
14
+ cfa/audit/trail.py,sha256=0y2gXSm0LaVYOXng6Kl7G1xmjZepx91Zp5CTvgjVYhs,6272
15
+ cfa/backends/__init__.py,sha256=o5eAQmi0Qk2LjQmEeIbA6rVU3RDcuWJodxHxZYDj5wA,4069
16
+ cfa/backends/dbt.py,sha256=XPbPvynpSplv4JG9HTcdLh7PcBUJhoz4d55SiT5VWCg,13218
17
+ cfa/backends/pyspark.py,sha256=2iW6UBVBpkQjEQwHuWaXpF9_grZwkrrmmN-qZQiUhto,9852
18
+ cfa/backends/sql.py,sha256=EjbHhCc3UzjnoY04r1y3DIvW-lrvst05fvFslCpw-CI,11155
19
+ cfa/behavior/__init__.py,sha256=-DvdzOSbcKdXsXWeMBO3ConJDgVOOES0NN4qNlyg6UA,1297
20
+ cfa/behavior/llm.py,sha256=P1x23-P4EO0y7Ipgj5C94OLmZv1IMDaogNpOuNZ9scM,8435
21
+ cfa/behavior/spec.py,sha256=uaL0L857YyGODr_jeQou7IdmuakEY1yBq8AA_1hSytU,8336
22
+ cfa/behavior/systematizer.py,sha256=hbTenoxBfU2tOCqFjn2ILtqOCrB_sUB4gZSXJ9vW9fg,7526
23
+ cfa/cli/__init__.py,sha256=-E3pSXua3fwAPxcSCEqUjjLQRKOw0tGpJKNAn6mtX0I,16840
24
+ cfa/cli/__main__.py,sha256=LDZEEY1QBSRbuD6gvZqQvmB8WPeIbGTW-4EiF8Bngoc,95
25
+ cfa/cli/_helpers.py,sha256=N2rfG8L6IyoN9IZkRuTN21UtIVVT0BAKLKqg4qi0_QA,3894
26
+ cfa/cli/formatters.py,sha256=lJbwVdSh5PIaqZXmNNgreOmMQqE7suVD203789okCv4,9766
27
+ cfa/cli/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
+ cfa/cli/core/evaluate.py,sha256=-8zdxSe3PHgJht_H253lrashHlzK94eKG7eIb-qpIRE,2440
29
+ cfa/cli/core/validate.py,sha256=uQJ-ug_j7Zb__RCgSi4skQv-E37ymMwsPpGaGHtLADc,970
30
+ cfa/cli/governance/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
+ cfa/cli/governance/audit.py,sha256=I1aDBTinrA29f0aEH7ZCUCa7UhKxRV5gt3ECoOomIEY,2170
32
+ cfa/cli/governance/catalog.py,sha256=yRRYTZeR9aTPQr8lJgq1OAbf-wLJH2KO0LCapHiRI_4,866
33
+ cfa/cli/governance/policy.py,sha256=ZVAhIFpkRYNTSMeEqD4kxd-_fqGIc1ZzcbId9FyNMnA,7089
34
+ cfa/cli/governance/rules.py,sha256=qu2ZT-rKZNVW3faOdwU_Gbbjne8A8U91Xe74rKBzSnI,1414
35
+ cfa/cli/governance/signature.py,sha256=zOsnf_fIJmXlRABp7HqIB3CH8pIGt9mdNV6Ax6RY8I8,1012
36
+ cfa/cli/infrastructure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
+ cfa/cli/infrastructure/backend_list.py,sha256=J_UrEHg1zlwC56gQu-qOL7y8XkNHS84QTh01YjRLiYQ,1030
38
+ cfa/cli/infrastructure/storage.py,sha256=4QROy2_4DLMr7g5143EkZmjB4NBo0zRGDrhYdH3Olho,2854
39
+ cfa/cli/project/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
+ cfa/cli/project/init.py,sha256=oGvA46YzAHtP8oLmsdzyhl3R4Qb126O7GvrFPmkn8Pc,3034
41
+ cfa/cli/project/lifecycle.py,sha256=Qxuur4hQMr0jG2AglaYYS_Z1N8yD67yiF0jpuuPvQOk,2877
42
+ cfa/cli/project/status.py,sha256=tRDjQZrxvj9fnGrgEU_svG-0bi6FJ7JBxR_YJKX9qoI,3347
43
+ cfa/cli/project/taxonomy.py,sha256=z83uo0nm6rbADcLyUTKRA34L1LN9YOn1TCQGx9T95oc,1560
44
+ cfa/cli/reporting/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
+ cfa/cli/reporting/report.py,sha256=zyQIhhRVyEJjaEIVeBjvlp-NQhYw5FGYdCzMv-fAFJQ,5582
46
+ cfa/cli/reporting/serve.py,sha256=4X4jilctluLljZeSQCpmN0KWG2zYvWE_QI5WmyEyG-4,1962
47
+ cfa/core/__init__.py,sha256=z4iYbxyOnTyBMWo8JDDb6h2GO9qQxTWpFhfH7mnC18w,968
48
+ cfa/core/codegen.py,sha256=glscJLdIamWWSrfLRW8Y7sK6hCW48Qvcvung9w_E3ns,2266
49
+ cfa/core/conditions.py,sha256=aPlR3BjmZgABTCzS0DdzJrArRSf5gsy8gXXOcQhmoMA,4591
50
+ cfa/core/kernel.py,sha256=5zMB2xIVDrvEHW2OVv8S9e46JyUGPu_ztUepemvNj38,9007
51
+ cfa/core/planner.py,sha256=NBF6yhVRmM9bJpEZ4aKwutcAIYWBVOUyWH3or5jO_BI,10351
52
+ cfa/core/phases/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
53
+ cfa/core/phases/runner.py,sha256=MxyoTdwEw8GbSfsjTuK7PKLTQ6H3V5KoqN_fAFLNpTs,23322
54
+ cfa/execution/__init__.py,sha256=qbCTwCijABn1P8RKYfPx-p0ulJQk4K7tugdTo_J6Ipw,657
55
+ cfa/execution/partial.py,sha256=_ohzIgChayldaKeGJf_gLaRQxWt9gcO-TH9ms8UCQfs,14282
56
+ cfa/execution/state_projection.py,sha256=goxcrmeiEOYC8DzHdvgjfKmVttOhAvvb05qvPktyzf0,7733
57
+ cfa/governance/__init__.py,sha256=f9nZvaN-UXqJVnTeBHLEMSzlazKuiH1uI9IC4322imY,2187
58
+ cfa/lifecycle/__init__.py,sha256=ipWxQeebCQNVnuoCNN2syRkpfkw5_1GqZ_JEE1IV5P4,1323
59
+ cfa/mcp/__init__.py,sha256=tI2dpj5J4mE_iH4eJ7vIq8cRrkmKfMWZk1fAtw7GZ0g,12616
60
+ cfa/mcp/__main__.py,sha256=tGDQkl7QzW9siXPK_YT959ktBK0E7g2AjK2Gux1TRaw,75
61
+ cfa/normalizer/__init__.py,sha256=ZZPvgPgnkEcVR-QFxexgAxCJWfI9t5-9DoDzh8mWi_s,850
62
+ cfa/normalizer/base.py,sha256=b6lrtJXTZOoFwaMx-6ZIyf5vy8TLZqsxP7d2ctlu3Tc,16812
63
+ cfa/normalizer/llm.py,sha256=k-iDpnvvoP9JaO_12KuMsVNFtRtNSCAEbyJamA-CdmU,15905
64
+ cfa/observability/__init__.py,sha256=htr_7-yRU4zLnaEMRmUROPxEM3qYd5opZ0anHJ56730,768
65
+ cfa/observability/indices.py,sha256=3TAzBCgZe7pjbs7UXFjdZrNQXmr_ULAakx2vAM5oMwg,6426
66
+ cfa/observability/metrics.py,sha256=mgPTb3eWj8Q7DMKDUOXqRhW2lsMz4_OGZnL4heV-CIY,3009
67
+ cfa/observability/notify.py,sha256=iGLEOwaoeKYhVcVM7cm-w2iEsvawkT_q_vSlFLFHjFo,3062
68
+ cfa/observability/otel.py,sha256=wS_GdtXsfu2B5DCK5mb6ctT5ZhQzM-GEh3XYHJVzFkk,2670
69
+ cfa/observability/promotion.py,sha256=nYqzmhLdIj0y2Xkq071xGUDv0BVeJagENwpIDplxbuc,16246
70
+ cfa/policy/__init__.py,sha256=l4szIOlc2Bhiu44D8CjLJXPSdkL--h6n24ni5Ug6fic,608
71
+ cfa/policy/bundle.py,sha256=fAmP7IcjWVjuNSdAC_8k-l7iIWMFEflpGuqG3XEPcLI,12234
72
+ cfa/policy/catalog.py,sha256=ARbx0YnFhTL0rUNWW6SjpzEgh3bEF75RMTmO3OM_cMc,4657
73
+ cfa/policy/engine.py,sha256=ufVaIT2GU60EzhJjwh1bj7N5SMsGMfpFxNhnQy7l5oI,11930
74
+ cfa/reporting/__init__.py,sha256=9phqdnVakmvAPecUFUrDXVpDGrlyT6fTrc-OI_XkcwM,1228
75
+ cfa/reporting/charts.py,sha256=PTvRywhTrkfQd5ztY9GU72tK3XAkX3UreUpYBXnNAIk,7489
76
+ cfa/reporting/engine.py,sha256=tLRIkKnZVUJ8MxwDcX9dJji8aXC74B295BID87zBqRI,21159
77
+ cfa/resolution/__init__.py,sha256=Fx_-x6pnlVWdnNUHAXOEwLVk9g98DCefFlEMbH5Xex0,1557
78
+ cfa/runtime/__init__.py,sha256=mMo0OjP8umIxAhDgIs81R-1DmZ2zNiGfQV7GweY4MaQ,604
79
+ cfa/runtime/gate.py,sha256=kOWo8DyI0BB5B0RDh9dyy8Zjr3eTn3RiKMAY4wRVtNs,9458
80
+ cfa/sandbox/__init__.py,sha256=xHkW43yaQptJ_RsQ-G5r82pSf6PWwnqrjJF3TkXnMvE,6343
81
+ cfa/sandbox/executor.py,sha256=pUzvuodcovtW9NMZ1MqV-Wr9ZUpo3LVx3hAXnn5fazs,2997
82
+ cfa/sandbox/mock.py,sha256=AkaJ8Gv1vjhEJeOCwsqxnF5nCIf_4xTyZcF8PsDD6CU,3013
83
+ cfa/sandbox/panic.py,sha256=F5GLWiqhCKJ4lQGK2Z-dljHVoK0F34RMNj9_3zFb1yI,1949
84
+ cfa/storage/__init__.py,sha256=3gqns8XHhT-2Fvq92q7po5VyNxKTeDytyiskC5d9qbc,22843
85
+ cfa/testing/__init__.py,sha256=aNBLS6OhF9A7MnggU9rUcJOlxsADkouoXW50xxuMEiM,1479
86
+ cfa/testing/asserts.py,sha256=xSYXIKlJhhlF5arVNQLU4WL9Q0_R1u0XZWSoz9MHzfA,2939
87
+ cfa/testing/evaluate.py,sha256=-Ag9y7v9S_etFmHMEeJIYeyaVjDL7r6YPGxtx1NZF0c,5238
88
+ cfa/testing/fixtures.py,sha256=GfkCIqewm9FddgG9sDzDr7tMoo48koGQbArsnutuevE,2490
89
+ cfa/testing/markers.py,sha256=LftQqfOmeAsaiS-QwGby_ccH0sMG_JA6vgnfPX0uBd0,1039
90
+ cfa/validation/__init__.py,sha256=lGjLojaKSnhb5O9XuhypBrAfO-rLSLQQJW9uYjGzJI0,809
91
+ cfa/validation/runtime.py,sha256=9sH4pWdcyNKvR97nPvCEZraS19R4WN6yvDMlAQkf7JA,11762
92
+ cfa/validation/signature.py,sha256=YanX-4rBu16tJGdm8fkprC785c8-_ykf6kHTBzwgf9E,6643
93
+ cfa/validation/static.py,sha256=jiANO5iEbgW842yCepf2EOIdqp02Ys5ADmcDdRRz2Q0,9515
94
+ cfa_kernel-0.1.0.dist-info/METADATA,sha256=xcdbbXg0z2oGyqdjlWm0Dnz5joT6jmdGQbvXppfLSTs,1301
95
+ cfa_kernel-0.1.0.dist-info/WHEEL,sha256=mffPy8wBnZQn2VnJUU5jE99KsxaSfiyMHV9Yt0aLVxs,87
96
+ cfa_kernel-0.1.0.dist-info/entry_points.txt,sha256=siIOuzesuRnhyOO7yyvecOucNbxu38H3-zzEgH4TnD0,61
97
+ cfa_kernel-0.1.0.dist-info/licenses/LICENSE,sha256=yNUiRD0FmItcSR8Wh1KAGgzXR-tLMcae4krfVVMmPKw,1071
98
+ cfa_kernel-0.1.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,3 @@
1
+ [console_scripts]
2
+ cfa = cfa.cli:main
3
+ cfa-mcp = cfa.mcp:serve
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Antero Marques
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.