xtr-security-oauth2-server 4.0.2__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.
- xtr_security_oauth2_server-4.0.2/LICENSE +24 -0
- xtr_security_oauth2_server-4.0.2/PKG-INFO +667 -0
- xtr_security_oauth2_server-4.0.2/README.md +626 -0
- xtr_security_oauth2_server-4.0.2/pyproject.toml +185 -0
- xtr_security_oauth2_server-4.0.2/pyproject.toml.orig +184 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/.agents/skills/xtr-security-oauth2-server/SKILL.md +373 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/.agents/skills/xtr-security-oauth2-server/references/configuration.md +104 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/.agents/skills/xtr-security-oauth2-server/references/events.md +105 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/.agents/skills/xtr-security-oauth2-server/references/extending.md +199 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/.agents/skills/xtr-security-oauth2-server/references/persistence.md +122 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/__init__.py +14 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/_endpoint_paths.py +82 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/_service_qualifier.py +18 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/authorization_server_metadata.py +174 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/bundle/__init__.py +43 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/bundle/_application_stores.py +82 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/bundle/_command_wiring.py +74 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/bundle/_endpoint_wiring.py +79 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/bundle/_grant_factories.py +210 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/bundle/_metadata_factories.py +163 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/bundle/_no_persistence.py +68 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/bundle/_parameters.py +42 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/bundle/_persistence_factories.py +168 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/bundle/_persistence_wiring.py +272 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/bundle/_required_settings.py +87 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/bundle/_server_factories.py +226 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/bundle/_service_factories.py +219 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/bundle/_service_wiring.py +230 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/bundle/_signing_factories.py +151 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/bundle/authorization_server_config.py +205 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/bundle/client_config.py +63 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/bundle/encryption_key_pass.py +79 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/bundle/grant_type_pass.py +149 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/bundle/metadata_pass.py +104 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/bundle/oauth2_authenticator_config.py +27 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/bundle/oauth2_server_bundle.py +191 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/bundle/oauth2_server_config.py +85 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/bundle/persistence_configs.py +99 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/bundle/resource_server_config.py +50 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/bundle/scopes_config.py +68 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/command/__init__.py +19 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/command/_key_files.py +85 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/command/_key_paths.py +73 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/command/_registry.py +16 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/command/clear_expired_tokens_command.py +122 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/command/create_client_command.py +220 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/command/delete_client_command.py +49 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/command/generate_key_pair_command.py +230 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/command/list_clients_command.py +133 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/command/update_client_command.py +178 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/controller/__init__.py +28 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/controller/_served_response.py +53 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/controller/authorization_controller.py +264 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/controller/device_code_controller.py +67 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/controller/introspection_controller.py +70 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/controller/jwks_controller.py +66 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/controller/metadata_controller.py +111 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/controller/revocation_controller.py +71 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/controller/token_controller.py +74 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/converter/__init__.py +22 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/converter/scope_converter.py +55 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/converter/scope_converter_interface.py +47 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/converter/user_converter.py +43 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/converter/user_converter_interface.py +30 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/entity/__init__.py +33 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/entity/access_token.py +35 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/entity/auth_code.py +27 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/entity/client.py +76 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/entity/device_code.py +27 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/entity/refresh_token.py +26 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/entity/scope.py +24 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/entity/user.py +23 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/event/__init__.py +28 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/event/access_token_extra_claims_resolve_event.py +86 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/event/authorization_request_resolve_event.py +153 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/event/authorization_request_resolve_event_factory.py +89 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/event/pre_save_client_event.py +47 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/event/scope_resolve_event.py +80 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/event/token_request_resolve_event.py +51 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/event/user_resolve_event.py +82 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/event_listener/__init__.py +16 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/event_listener/add_client_default_scopes_listener.py +60 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/exception/__init__.py +21 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/exception/client_already_registered_error.py +29 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/exception/invalid_configuration_error.py +32 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/factory/__init__.py +12 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/factory/oauth2_factory.py +130 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/manager/__init__.py +41 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/manager/access_token_manager_interface.py +36 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/manager/authorization_code_manager_interface.py +35 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/manager/client_filter.py +79 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/manager/client_manager_interface.py +51 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/manager/device_code_manager_interface.py +38 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/manager/in_memory/__init__.py +29 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/manager/in_memory/access_token_manager.py +82 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/manager/in_memory/authorization_code_manager.py +68 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/manager/in_memory/client_manager.py +95 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/manager/in_memory/device_code_manager.py +73 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/manager/in_memory/refresh_token_manager.py +80 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/manager/in_memory/scope_manager.py +45 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/manager/null/__init__.py +12 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/manager/null/access_token_manager.py +56 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/manager/orm/__init__.py +31 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/manager/orm/_changed_rows.py +20 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/manager/orm/access_token_manager.py +133 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/manager/orm/authorization_code_manager.py +83 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/manager/orm/client_manager.py +195 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/manager/orm/device_code_manager.py +91 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/manager/orm/refresh_token_manager.py +114 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/manager/refresh_token_manager_interface.py +48 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/manager/scope_manager_interface.py +28 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/metadata_contributor_interface.py +44 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/model/__init__.py +49 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/model/_short_identifier.py +19 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/model/abstract_client.py +152 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/model/access_token.py +92 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/model/access_token_interface.py +65 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/model/authorization_code.py +91 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/model/authorization_code_interface.py +65 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/model/client.py +18 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/model/client_interface.py +103 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/model/device_code.py +167 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/model/device_code_interface.py +100 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/model/refresh_token.py +79 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/model/refresh_token_interface.py +55 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/null_metadata_contributor.py +45 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/oauth2_events.py +69 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/persistence/__init__.py +15 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/persistence/mapping/__init__.py +20 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/persistence/mapping/_fields.py +85 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/persistence/mapping/_tables.py +259 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/persistence/mapping/client_mapping_mixin.py +72 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/persistence/mapping/driver.py +280 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/persistence/mapping/mapped_table.py +28 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/persistence/type/__init__.py +26 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/persistence/type/grant.py +30 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/persistence/type/imploded_array.py +81 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/persistence/type/redirect_uri.py +34 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/persistence/type/scope.py +34 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/persistence/type/utc_datetime.py +65 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/py.typed +0 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/recipe/__init__.py +19 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/recipe/files/config/oauth2_server.py.tmpl +63 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/recipe/files/config/routes/oauth2_server.py.tmpl +27 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/recipe/manifest.toml +53 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/repository/__init__.py +39 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/repository/_stored_client.py +47 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/repository/access_token_repository.py +165 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/repository/auth_code_repository.py +116 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/repository/client_repository.py +150 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/repository/device_code_repository.py +207 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/repository/null_access_token_repository.py +90 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/repository/refresh_token_repository.py +114 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/repository/scope_repository.py +148 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/repository/user_repository.py +92 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/routing/__init__.py +14 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/routing/_endpoints.py +118 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/routing/oauth2_server_route_loader.py +52 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/routing/well_known_route_loader.py +32 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/security/__init__.py +22 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/security/authentication/__init__.py +7 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/security/authentication/token/__init__.py +7 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/security/authentication/token/oauth2_token.py +117 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/security/authenticator/__init__.py +7 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/security/authenticator/oauth2_authenticator.py +277 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/security/exception/__init__.py +16 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/security/exception/oauth2_authentication_error.py +93 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/security/exception/oauth2_authentication_failed_error.py +44 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/security/user/__init__.py +7 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/security/user/client_credentials_user.py +53 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/service/__init__.py +16 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/service/credentials_revoker/__init__.py +12 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/service/credentials_revoker/orm_credentials_revoker.py +152 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/service/credentials_revoker_interface.py +41 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/value_object/__init__.py +21 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/value_object/grant.py +45 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/value_object/redirect_uri.py +54 -0
- xtr_security_oauth2_server-4.0.2/src/xtr_security_oauth2_server/value_object/scope.py +46 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 xterr
|
|
4
|
+
Copyright (C) Alex Bilbie
|
|
5
|
+
Copyright (c) 2020 Robin Chalas
|
|
6
|
+
Portions Copyright (c) 2018-2020 Trikoder
|
|
7
|
+
|
|
8
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
9
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
10
|
+
in the Software without restriction, including without limitation the rights
|
|
11
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
12
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
13
|
+
furnished to do so, subject to the following conditions:
|
|
14
|
+
|
|
15
|
+
The above copyright notice and this permission notice shall be included in all
|
|
16
|
+
copies or substantial portions of the Software.
|
|
17
|
+
|
|
18
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
19
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
20
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
21
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
22
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
23
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
24
|
+
SOFTWARE.
|