` by the listening port on the [Syslog Forwarding](/integration/ingestion_methods/syslog/sekoiaio_forwarder.md) for the Skyhigh raw events.
!!!Note
The double at characters without spaces (@@) indicates that syslog messages are transferred to a host using the TCP protocol. To use the UDP protocol, use single at character (@).
@@ -51,7 +51,7 @@ To forward your logs to your log concentrator, in our MWG console:
## Forward logs to Sekoia.io
-Please consult the [Syslog Forwarding](/integration/ingestion_methods/syslog/sekoiaio_forwarder) documentation to forward these logs to Sekoia.io.
+Please consult the [Syslog Forwarding](/integration/ingestion_methods/syslog/sekoiaio_forwarder.md) documentation to forward these logs to Sekoia.io.
{!_shared_content/operations_center/integrations/generated/40bac399-2d8e-40e3-af3b-f73a622c9687_sample.md!}
diff --git a/docs/integration/categories/network_security/sonicwall_fw.md b/docs/integration/categories/network_security/sonicwall_fw.md
index fd472f3b76..30e5d22f6d 100644
--- a/docs/integration/categories/network_security/sonicwall_fw.md
+++ b/docs/integration/categories/network_security/sonicwall_fw.md
@@ -39,7 +39,7 @@ Go to the [intake page](https://app.sekoia.io/operations/intakes) and create a n
### Forward logs to Sekoia.io
-Please consult the [Syslog Forwarding](/integration/ingestion_methods/syslog/sekoiaio_forwarder) documentation to forward these logs to Sekoia.io.
+Please consult the [Syslog Forwarding](/integration/ingestion_methods/syslog/sekoiaio_forwarder.md) documentation to forward these logs to Sekoia.io.
{!_shared_content/operations_center/integrations/generated/ee0b3023-524c-40f6-baf5-b69c7b679887_sample.md!}
diff --git a/docs/integration/categories/network_security/sonicwall_sma.md b/docs/integration/categories/network_security/sonicwall_sma.md
index e5db9c6373..00a00ab26a 100644
--- a/docs/integration/categories/network_security/sonicwall_sma.md
+++ b/docs/integration/categories/network_security/sonicwall_sma.md
@@ -37,7 +37,7 @@ Go to the [intake page](https://app.sekoia.io/operations/intakes) and create a n
### Forward logs to Sekoia.io
-Please consult the [Syslog Forwarding](/integration/ingestion_methods/syslog/sekoiaio_forwarder) documentation to forward these logs to Sekoia.io.
+Please consult the [Syslog Forwarding](/integration/ingestion_methods/syslog/sekoiaio_forwarder.md) documentation to forward these logs to Sekoia.io.
{!_shared_content/operations_center/integrations/generated/622999fe-d383-4d41-9f2d-eed5013fe463_sample.md!}
diff --git a/docs/integration/categories/network_security/sophos_fw.md b/docs/integration/categories/network_security/sophos_fw.md
index aed2832d9b..e9aafe3512 100644
--- a/docs/integration/categories/network_security/sophos_fw.md
+++ b/docs/integration/categories/network_security/sophos_fw.md
@@ -36,7 +36,7 @@ You can configure a syslog server in Sophos Firewall by following the instructio
### Forward logs to Sekoia.io
-Please consult the [Syslog Forwarding](/integration/ingestion_methods/syslog/sekoiaio_forwarder) documentation to forward these logs to Sekoia.io.
+Please consult the [Syslog Forwarding](/integration/ingestion_methods/syslog/sekoiaio_forwarder.md) documentation to forward these logs to Sekoia.io.
{!_shared_content/operations_center/integrations/generated/325369ba-8515-45b4-b750-5db882ea1266_sample.md!}
diff --git a/docs/integration/categories/network_security/stormshield_network_security.md b/docs/integration/categories/network_security/stormshield_network_security.md
index e9f6628404..80803f366f 100644
--- a/docs/integration/categories/network_security/stormshield_network_security.md
+++ b/docs/integration/categories/network_security/stormshield_network_security.md
@@ -19,7 +19,7 @@ In this documentation we will explain how to collect and send Stormshield Networ
### Instruction on Sekoia
#### Create your intake
-Everything you need to do for this part of the configuration is described [here](/xdr/features/collect/intakes).
+Everything you need to do for this part of the configuration is described [here](/xdr/features/collect/intakes.md).
1. Go to the [intake page](https://app.sekoia.io/operations/intakes) and create a new intake from the `Stormshield Network Security`.
2. Copy the associated Intake key
diff --git a/docs/integration/categories/network_security/trellix_epo.md b/docs/integration/categories/network_security/trellix_epo.md
index aa4ba04855..124dda2689 100644
--- a/docs/integration/categories/network_security/trellix_epo.md
+++ b/docs/integration/categories/network_security/trellix_epo.md
@@ -38,7 +38,7 @@ Go to the [intake page](https://app.sekoia.io/operations/intakes) and create a n
To start to pull events, you have to:
-1. Go to the [playbooks page](https://app.sekoia.io/operations/playbooks) and create a new playbook with the [Trellix](/integration/action_library/endpoint/trellix) trigger
+1. Go to the [playbooks page](https://app.sekoia.io/operations/playbooks) and create a new playbook with the [Trellix](/integration/action_library/trellix.md) trigger
2. Set up the module configuration with the Client Id and Client Secret. Set up the trigger configuration with the intake key
3. Start the playbook and enjoy your events
@@ -49,4 +49,3 @@ To start to pull events, you have to:
{!_shared_content/operations_center/detection/generated/suggested_rules_ba40ab72-1456-11ee-be56-0242ac120002_do_not_edit_manually.md!}
{!_shared_content/operations_center/integrations/generated/ba40ab72-1456-11ee-be56-0242ac120002.md!}
-
diff --git a/docs/integration/categories/network_security/trellix_nx.md b/docs/integration/categories/network_security/trellix_nx.md
index 30d90828a6..e006ecb0a2 100644
--- a/docs/integration/categories/network_security/trellix_nx.md
+++ b/docs/integration/categories/network_security/trellix_nx.md
@@ -40,7 +40,7 @@ You should have:
Go to the [intake page](https://app.sekoia.io/operations/intakes) and create a new intake from the format Trellix Network Security.
### Configure the Rsyslog server
-Please consult the [Rsyslog Transport](/integration/ingestion_methods/syslog/overview) documentation to forward these logs to Sekoia.io.
+Please consult the [Rsyslog Transport](/integration/ingestion_methods/syslog/overview.md) documentation to forward these logs to Sekoia.io.
{!_shared_content/operations_center/integrations/generated/bae128bb-98c6-45f7-9763-aad3451821e5_sample.md!}
diff --git a/docs/integration/categories/network_security/trend_micro_deep_security.md b/docs/integration/categories/network_security/trend_micro_deep_security.md
index 7b51033c3c..e2313d6382 100644
--- a/docs/integration/categories/network_security/trend_micro_deep_security.md
+++ b/docs/integration/categories/network_security/trend_micro_deep_security.md
@@ -62,7 +62,7 @@ Go to the [intake page](https://app.sekoia.io/operations/intakes) and create a n
## Forward logs to Sekoia.io
-Please consult the [Syslog Forwarding](/integration/ingestion_methods/syslog/sekoiaio_forwarder) documentation to forward these logs to Sekoia.io.
+Please consult the [Syslog Forwarding](/integration/ingestion_methods/syslog/sekoiaio_forwarder.md) documentation to forward these logs to Sekoia.io.
{!_shared_content/operations_center/integrations/generated/b2d961ae-0f7e-400b-879a-f97be24cc02d_sample.md!}
diff --git a/docs/integration/categories/network_security/ubika_waap.md b/docs/integration/categories/network_security/ubika_waap.md
index 50c42ae2d9..5f6bbf7fe9 100644
--- a/docs/integration/categories/network_security/ubika_waap.md
+++ b/docs/integration/categories/network_security/ubika_waap.md
@@ -38,7 +38,7 @@ Go to the [intake page](https://app.sekoia.io/operations/intakes) and create a n
### Forward logs to Sekoia.io
-Please consult the [Syslog Forwarding](/integration/ingestion_methods/syslog/sekoiaio_forwarder) documentation to forward these logs to Sekoia.io.
+Please consult the [Syslog Forwarding](/integration/ingestion_methods/syslog/sekoiaio_forwarder.md) documentation to forward these logs to Sekoia.io.
{!_shared_content/operations_center/integrations/generated/6dbdd199-77ae-4705-a5de-5c2722fa020e_sample.md!}
diff --git a/docs/integration/categories/network_security/varonis_data_security.md b/docs/integration/categories/network_security/varonis_data_security.md
index 9527dd6246..09dfcf4a63 100644
--- a/docs/integration/categories/network_security/varonis_data_security.md
+++ b/docs/integration/categories/network_security/varonis_data_security.md
@@ -51,9 +51,9 @@ Go to the [intake page](https://app.sekoia.io/operations/intakes) and create a n
### Forward logs to Sekoia.io
-Please consult the [Syslog Forwarding](/integration/ingestion_methods/syslog/sekoiaio_forwarder) documentation to forward these logs to Sekoia.io.
+Please consult the [Syslog Forwarding](/integration/ingestion_methods/syslog/sekoiaio_forwarder.md) documentation to forward these logs to Sekoia.io.
-Currently, the syslog format generated by Varonis does not comply with RFC standards. As a result, the transmitted data is not inherently compatible with the Sekoia forwarder. Therefore, it is necessary to refer to [this documentation](/integration/ingestion_methods/syslog/sekoiaio_forwarder#import-a-custom-rsyslog-configuration) in order to extend the default configuration of the forwarder (available since version 2.4) and add this specific configuration for Varonis logs:
+Currently, the syslog format generated by Varonis does not comply with RFC standards. As a result, the transmitted data is not inherently compatible with the Sekoia forwarder. Therefore, it is necessary to refer to [this documentation](/integration/ingestion_methods/syslog/sekoiaio_forwarder.md#import-a-custom-rsyslog-configuration) in order to extend the default configuration of the forwarder (available since version 2.4) and add this specific configuration for Varonis logs:
```bash
input(type="im$PROTOCOL" port="$PORT" ruleset="remoteVaronis")
@@ -84,4 +84,3 @@ action(
{!_shared_content/operations_center/detection/generated/suggested_rules_7b75d498-4a65-4d44-aa81-31090d723a60_do_not_edit_manually.md!}
{!_shared_content/operations_center/integrations/generated/7b75d498-4a65-4d44-aa81-31090d723a60.md!}
-
diff --git a/docs/integration/categories/network_security/vectra.md b/docs/integration/categories/network_security/vectra.md
index a446d9e53a..00d1d3b7d7 100644
--- a/docs/integration/categories/network_security/vectra.md
+++ b/docs/integration/categories/network_security/vectra.md
@@ -16,7 +16,7 @@ Vectra provides AI-powered incident detection and resolution support for native
This setup guide will show you how to forward logs produced by your Vectra Appliance server to Sekoia.io by means of an rsyslog transport channel.
### Configure the Rsyslog server
-Please consult the [Rsyslog Transport](/integration/ingestion_methods/syslog/overview) documentation to forward these logs to Sekoia.io.
+Please consult the [Rsyslog Transport](/integration/ingestion_methods/syslog/overview.md) documentation to forward these logs to Sekoia.io.
{!_shared_content/operations_center/integrations/generated/bf8867ee-43b7-444c-9475-a7f43754ab6d_sample.md!}
diff --git a/docs/integration/categories/network_security/watchguard_firebox.md b/docs/integration/categories/network_security/watchguard_firebox.md
index afe11041ef..fcdc5c365b 100644
--- a/docs/integration/categories/network_security/watchguard_firebox.md
+++ b/docs/integration/categories/network_security/watchguard_firebox.md
@@ -36,7 +36,7 @@ Go to the [intake page](https://app.sekoia.io/operations/intakes) and create a n
## Forward logs to Sekoia.io
-Please consult the [Rsyslog Transport](/integration/ingestion_methods/syslog/overview) documentation or [Syslog Forwarding](/integration/ingestion_methods/syslog/sekoiaio_forwarder) documentation to forward these logs to Sekoia.io.
+Please consult the [Rsyslog Transport](/integration/ingestion_methods/syslog/overview.md) documentation or [Syslog Forwarding](/integration/ingestion_methods/syslog/sekoiaio_forwarder.md) documentation to forward these logs to Sekoia.io.
{!_shared_content/operations_center/integrations/generated/d719e8b5-85a1-4dad-bf71-46155af56570_sample.md!}
diff --git a/docs/integration/categories/network_security/zscaler_zia.md b/docs/integration/categories/network_security/zscaler_zia.md
index aa37ce9bee..4407635728 100644
--- a/docs/integration/categories/network_security/zscaler_zia.md
+++ b/docs/integration/categories/network_security/zscaler_zia.md
@@ -99,7 +99,7 @@ In the Zscaler ZIA console:
#### Forward logs to Sekoia.io
-For more information on forwarding logs to Sekoia.io, see [Syslog Forwarding](/integration/ingestion_methods/syslog/sekoiaio_forwarder)
+For more information on forwarding logs to Sekoia.io, see [Syslog Forwarding](/integration/ingestion_methods/syslog/sekoiaio_forwarder.md)
### Forward events with Cloud NSS Feed
diff --git a/docs/integration/categories/overview.md b/docs/integration/categories/overview.md
index 489452e15b..81c67af198 100644
--- a/docs/integration/categories/overview.md
+++ b/docs/integration/categories/overview.md
@@ -4,7 +4,7 @@ Welcome to the Intake Categories section of our documentation! This section prov
## Structure of the Intake Categories Section
-The Intake Categories section is organized into several sub-categories as explained in the [Best Practices for Using Sekoia SOC Platform page](getting_started/best_practices/), each representing a different type of data source. Below is the structure of the folder:
+The Intake Categories section is organized into several sub-categories as explained in the [Best Practices for Using Sekoia SOC Platform page](/getting_started/best_practices.md), each representing a different type of data source. Below is the structure of the folder:
- **Applicative**: This category includes documentation on various application-level technologies like Apache HTTP Server, Salesforce, JumpCloud.
- **Email**: Documentation related to email data sources can be found here.
diff --git a/docs/integration/develop_integration/automation/action.md b/docs/integration/develop_integration/automation/action.md
index 21711b0127..bc7679335b 100644
--- a/docs/integration/develop_integration/automation/action.md
+++ b/docs/integration/develop_integration/automation/action.md
@@ -1,6 +1,6 @@
# Action
-An action helps to execute specific tasks (see [definition](https://docs.sekoia.io/xdr/features/automate/actions/)). It composes one of the three items of a playbook.
+An action helps to execute specific tasks (see [definition](/xdr/features/automate/actions.md)). It composes one of the three items of a playbook.
In a module, each action consists of 2 elements:
@@ -13,25 +13,19 @@ In a module, each action consists of 2 elements:
- A description of the arguments of the action (field `arguments`). This description is a [JSON schema model](https://json-schema.org/)
- A description of the output of the action (field `results`). This description is a [JSON schema model](https://json-schema.org/) and may be empty if the action returns no data.
- See [Azure Active Directory «Enable User» action’s manifest](../AzureActiveDirectory/action_enable_user.json)
-
-- A python code
+- A python code
## Python code
-An action is a class based on [`Action`](https://github.com/SEKOIA-IO/sekoia-automation-sdk/blob/main/sekoia_automation/action.py) from [sekoia-automation-sdk](https://github.com/SEKOIA-IO/sekoia-automation-sdk/).
+An action is a class based on [`Action`](https://github.com/SEKOIA-IO/sekoia-automation-sdk/blob/main/sekoia_automation/action.py) from [sekoia-automation-sdk](https://github.com/SEKOIA-IO/sekoia-automation-sdk/).
This class must implement the class properties `name` and `description`.
It also must implement the method `run` that accepts the arguments and may returns a result.
The arguments and the result must be declared as a [pydantic model](https://docs.pydantic.dev/), holding the same properties declared in the JSON schema model for the arguments and the result in the manifest.
-(See [Azure Active Directory «Enable User» code](../AzureActiveDirectory/azure_ad/user.py))
-
## Entrypoint
To expose an action of the module, the action must be declared in `main.py` at the root of the module.
Import the class in `main.py` and register the class, against the module, with the unique command name of the action as second argument.
-
-(See [Azure Active Directory main.py](../AzureActiveDirectory/main.py))
diff --git a/docs/integration/develop_integration/automation/trigger.md b/docs/integration/develop_integration/automation/trigger.md
index c0db7e94af..2bb58ba592 100644
--- a/docs/integration/develop_integration/automation/trigger.md
+++ b/docs/integration/develop_integration/automation/trigger.md
@@ -27,12 +27,9 @@ A Connector is a class based on [`Connector`](https://github.com/SEKOIA-IO/sekoi
It must implement the method `run` and call the method `publish_events_to_intake` to forward events.
-(See [OKTA system log connector](../Okta/okta_modules/system_log_trigger.py))
## Entrypoint
To expose a trigger of the module, the trigger must be declared in `main.py` at the root of the module.
Import the class in `main.py` and register the class, against the module, with the unique command name of the trigger as second argument.
-
-(See [Okta main.py](../Okta/main.py))
diff --git a/docs/integration/develop_integration/overview.md b/docs/integration/develop_integration/overview.md
index 3c0635f475..251424d62a 100644
--- a/docs/integration/develop_integration/overview.md
+++ b/docs/integration/develop_integration/overview.md
@@ -19,9 +19,9 @@
#### Step 1. Understand the general concepts
!!! warning
- For this usecase, you must already be able to forward your data into Sekoia SOC platform with an existing [ingestion methods](/integration/ingestion_methods/)
+ For this usecase, you must already be able to forward your data into Sekoia SOC platform with an existing [ingestion methods](/integration/ingestion_methods/index.md)
-Before starting, read this [overview of intake format](../formats/overview/) to get a grasp of the general concepts.
+Before starting, read this [overview of intake format](formats/overview.md) to get a grasp of the general concepts.
#### Step 2. Create your custom intake
@@ -29,13 +29,13 @@ To ingest a format of data, you will first create a custom format with the custo
Create a custom format to describe the format of the data to extract:
-- Start by creating a [custom format](../formats/create_a_format/#custom-format-creation-on-the-platform)
-- Write the parser of the custom format by following this [guide](../formats/parser/)
+- Start by creating a [custom format](formats/create_a_format.md#custom-format-creation-on-the-platform)
+- Write the parser of the custom format by following this [guide](formats/parser.md)
!!! info
Additional resources to support development:
- - Best practices for [Authentications](../formats/best_practices/authentications/) logs
+ - Best practices for [Authentications](formats/best_practices/authentications.md) logs
- An E-learning module for the development of custom format is available in our training catalog, you can request an access [here](https://www.sekoia.io/en/lets-talk-about-your-training-project/)
Once you are done, you will create a custom intake based using this custom format. A custom intake is an instance of your custom format.
@@ -55,10 +55,10 @@ You have now successfully ingested data from a new product. If you would like to
If you have created a new format and want Sekoia to manage its maintenance, you can request homologation for your custom format. Once approved, the format will be added to Sekoia's public catalog.
!!! info
- To homologate your custom format, you will need to contribute through our Github repository
+ To homologate your custom format, you will need to contribute through our Github repository
- Fork the Github repository [SEKOIA-IO/intake-formats](https://github.com/SEKOIA-IO/intake-formats)
-- Follow this [guide](../formats/create_a_format/#custom-format-creation-with-the-github-repository) to add the custom format in Github and request an homologation
+- Follow this [guide](formats/create_a_format.md#custom-format-creation-with-the-github-repository) to add the custom format in Github and request an homologation
### Usecase 2. You want to modify an existing intake
@@ -68,7 +68,7 @@ You would like to parse additional fields in an existing intake or modify the wa
2. Search for the intake you wish to modify
3. Click on the `See format` button at the top right of the card
4. Click on the `Duplicate` button at the top right of the custom parser editor
-5. Modify the parser by using this [guide](../formats/parser/)
+5. Modify the parser by using this [guide](formats/parser.md)
Once you have finished your modifications, [create a custom intake](#step-2-create-your-custom-intake) based on this new custom format.
@@ -79,17 +79,17 @@ Once you have finished your modifications, [create a custom intake](#step-2-crea
#### Step 1. Understand the general concepts
-Before developing a new playbook trigger or playbook action, read this [overview of automations](../automation/overview) to get a grasp of the general concepts of automations.
+Before developing a new playbook trigger or playbook action, read this [overview of automations](automation/overview.md) to get a grasp of the general concepts of automations.
#### Step 2. Create your automation
Once you have acquired a basic understanding of automations:
- Fork the Github repository [SEKOIA-IO/automation-library](https://github.com/SEKOIA-IO/automation-library)
-- Follow this guide to [create your module](../automation/create_a_module/)
+- Follow this guide to [create your module](automation/create_a_module.md)
#### Step 3. Homologate your automation in the Sekoia catalog
The last step is to homologate your automation in order to make it available in the automation library.
-- Follow these [instructions](../automation/create_a_module/#homologation-request) to homologate your automation
\ No newline at end of file
+- Follow these [instructions](automation/create_a_module.md#homologation-request) to homologate your automation
\ No newline at end of file
diff --git a/docs/integration/faq/general_questions/bug_and_improvement_requests.md b/docs/integration/faq/general_questions/bug_and_improvement_requests.md
index 2cdd415964..0999da09b8 100644
--- a/docs/integration/faq/general_questions/bug_and_improvement_requests.md
+++ b/docs/integration/faq/general_questions/bug_and_improvement_requests.md
@@ -37,10 +37,10 @@ In the context of an intake or automation, an improvement is defined by the foll
In the functional category, distinguishing between a bug and an improvement request can sometimes be nuanced, particularly concerning the extraction of new fields in the context of an intake. Here is a more precise explanation:
- **Bug**: A new field extraction request will be considered a bug if the field is part of the list of ECS fields present in the sections "Required Fields" or "Required Fields depending on context" of the documentation pages found in the section "How to develop a new Integration" > "Formats" > "Best Practices". For instance:
- - For technologies of type Endpoints, see the [Required Fields](/integration/develop_integration/formats/best_practices/endpoints#required-fields).
- - For network technologies, see the [Required Fields](/integration/develop_integration/formats/best_practices/networks#required-fields).
+ - For technologies of type Endpoints, see the [Required Fields](/integration/develop_integration/formats/best_practices/endpoints.md#required-fields).
+ - For network technologies, see the [Required Fields](/integration/develop_integration/formats/best_practices/networks.md#required-fields).
- **Improvement**: A request to add a field that does not fall under the aforementioned mandatory ECS fields will be considered an improvement. This can include optional fields or new fields that enhance the functionality but are not strictly required by the ECS standard.
- - Clients have the flexibility to create custom formats to meet their specific needs. Additionally, they can be supported by our Professional Services team. Furthermore, clients can request the homologation of their custom format by following the process described in our documentation: [Homologate Your Custom Format in the SEKOIA Catalog](/integration/develop_integration/overview#step-3-homologate-your-custom-format-in-the-sekoia-catalog-optional)
+ - Clients have the flexibility to create custom formats to meet their specific needs. Additionally, they can be supported by our Professional Services team. Furthermore, clients can request the homologation of their custom format by following the process described in our documentation: [Homologate Your Custom Format in the SEKOIA Catalog](/integration/develop_integration/overview.md#step-3-homologate-your-custom-format-in-the-sekoia-catalog-optional)
Understanding whether an issue is a bug or an improvement request is crucial for effective problem resolution and enhancement planning. Should you encounter issues or have suggestions, please consult this guide and reach out to our support team if needed.
diff --git a/docs/integration/index.md b/docs/integration/index.md
index ef4d841617..ff4dc7b9e2 100644
--- a/docs/integration/index.md
+++ b/docs/integration/index.md
@@ -6,19 +6,19 @@ Welcome to the Integrations section of our documentation! This section is design
### Ingestion Methods
-In this section, you'll find detailed information on the various methods (pushing on [HTTPS](/integration/ingestion_methods/https/overview/) or [Syslog](/integration/ingestion_methods/syslog/overview/), or pulling a [remote external cloud storage](/integration/ingestion_methods/cloud_saas/overview/)) you can use to ingest data into Sekoia.io SOC Platform. We provide [comprehensive guides and examples](/integration/ingestion_methods/) to help you set up and manage your data ingestion processes efficiently.
+In this section, you'll find detailed information on the various methods (pushing on [HTTPS](/integration/ingestion_methods/https/overview.md) or [Syslog](/integration/ingestion_methods/syslog/overview.md), or pulling a [remote external cloud storage](/integration/ingestion_methods/cloud_saas/overview.md)) you can use to ingest data into Sekoia.io SOC Platform. We provide [comprehensive guides and examples](/integration/ingestion_methods/index.md) to help you set up and manage your data ingestion processes efficiently.
### Intake Categories
-This section offers an organized view of different [intake categories](/integration/categories/overview/), that are used for log collection and processing purposes. You'll find documentation on various types of data (endpoint, network, email...) and how to configure each one, ensuring you a smooth BUILD phase of Third party logs collection.
+This section offers an organized view of different [intake categories](/integration/categories/overview.md), that are used for log collection and processing purposes. You'll find documentation on various types of data (endpoint, network, email...) and how to configure each one, ensuring you a smooth BUILD phase of Third party logs collection.
### Automation Categories
-This section contains a wealth of [automation actions](/integration/action_library/overview/) to interract with Third party directly from and without leaving the Sekoia.io SOC Platform. These resources are designed to help you streamline your workflows and automate repetitive tasks, allowing you to focus on more strategic activities.
+This section contains a wealth of [automation actions](/integration/action_library/overview.md) to interract with Third party directly from and without leaving the Sekoia.io SOC Platform. These resources are designed to help you streamline your workflows and automate repetitive tasks, allowing you to focus on more strategic activities.
### How to Develop A New Integration
-For those looking to extend the capabilities of Sekoia.io SOC Platform, this section provides a [step-by-step guide on how to develop custom integrations](/integration/develop_integration/overview/). You'll learn about our integration framework, best practices, and how to contribute to our ecosystem.
+For those looking to extend the capabilities of Sekoia.io SOC Platform, this section provides a [step-by-step guide on how to develop custom integrations](/integration/develop_integration/overview.md). You'll learn about our integration framework, best practices, and how to contribute to our ecosystem.
### FAQ Section
diff --git a/docs/integration/ingestion_methods/cloud_saas/overview.md b/docs/integration/ingestion_methods/cloud_saas/overview.md
index 568cb38593..147ade36e6 100644
--- a/docs/integration/ingestion_methods/cloud_saas/overview.md
+++ b/docs/integration/ingestion_methods/cloud_saas/overview.md
@@ -2,7 +2,7 @@
In addition to the previously documented push modes (HTTPS, Syslog, Relp), Sekoia.io also possesses the capability to ingest data using a pulling mode.
-Indeed, many tools and equipment have APIs to enable direct data consumption. However, using these endpoints can be a bit tricky. Therefore, Sekoia.io has developed numerous integrations that include out-of-the-box connectors, known as triggers, responsible for collecting data. You can easily configure them in [Sekoia.io playbooks](/xdr/features/automate/) with just a few clicks. Make sure to follow the documentation associated with your integration to verify the complete procedure.
+Indeed, many tools and equipment have APIs to enable direct data consumption. However, using these endpoints can be a bit tricky. Therefore, Sekoia.io has developed numerous integrations that include out-of-the-box connectors, known as triggers, responsible for collecting data. You can easily configure them in [Sekoia.io playbooks](/xdr/features/automate/index.md) with just a few clicks. Make sure to follow the documentation associated with your integration to verify the complete procedure.
Sekoia.io can also retrieve logs and data from cloud platforms, including Microsoft Azure, Amazon Web Services, or Google Cloud. To consume this type of data, as a prerequisites you need to define a location to centralize data coming from your managed services on your cloud provider:
@@ -11,5 +11,3 @@ Sekoia.io can also retrieve logs and data from cloud platforms, including Micros
- [Google Pub/Sub](gcp.md)
Finally, you have to configure the associated out-of-the-box trigger as explained in the previous section. You can find a end to end documentation for each integration in his specific page covering the configuration of these prerequisites
-
-
diff --git a/docs/integration/ingestion_methods/https/logstash.md b/docs/integration/ingestion_methods/https/logstash.md
index 1a0af370b7..055df6038d 100644
--- a/docs/integration/ingestion_methods/https/logstash.md
+++ b/docs/integration/ingestion_methods/https/logstash.md
@@ -6,14 +6,14 @@ To push logs, you have to configure some filters in Logstash that will add the p
## Example
-In the following example, we have multiple inputs to handle logs collected via Syslog (Apache HTTP Server and NGINX logs) and via [Beats (Winlogbeat)](/integration/integrations/endpoint/winlogbeat.md) and forward them to Sekoia.io.
+In the following example, we have multiple inputs to handle logs collected via Syslog (Apache HTTP Server and NGINX logs) and via [Beats (Winlogbeat)](/integration/categories/endpoint/winlogbeat.md) and forward them to Sekoia.io.
In order to filter events effectively, Logstash uses tags as a key component. To ensure proper functionality, make sure to update the intake key value by editing the placeholder `CHANGE_ME_INTAKE_KEY` mentioned below. Additionally, you have the flexibility to incorporate multiple filters within the `filter` section as per your requirements.
-!!! tip
+!!! tip
By adding additional filters, you can enhance the filtering capabilities of Logstash and customize the processing of events to suit your requirements.
-!!! note
+!!! note
Beats agents require a specific output configuration as you need to forward the complete JSON event to Sekoia.io.
```
@@ -77,7 +77,7 @@ The above configuration will send your logs one at a time (one HTTP request per
For more advanced use cases, where you want to send logs to Sekoia.io and to an Elasticsearch instance for example, a more advanced Logstash configuration is recommended to achieve higher throughput. This configuration uses multiple pipelines and pipeline-to-pipeline communications to duplicate events and format them to the expected payload format required by Sekoia.io. Events will be sent in batch mode, providing better performance.
-!!! note
+!!! note
Beats events do not need to be duplicated into a second pipeline as the complete JSON event is sent to Sekoia.io.
*pipelines.yml*
diff --git a/docs/integration/ingestion_methods/index.md b/docs/integration/ingestion_methods/index.md
index 9a4b41dbe9..091f4534c0 100644
--- a/docs/integration/ingestion_methods/index.md
+++ b/docs/integration/ingestion_methods/index.md
@@ -10,10 +10,10 @@ Sekoia.io is able to collect logs through various mechanisms, configuration on y
Sekoia.io supports the following log collecting methods:
-- [HTTPS](/integration/ingestion_methods/https/overview/) (`https://intake.sekoia.io`): `POST` your JSON events to Sekoia.io.
-- [Syslog](/integration/ingestion_methods/syslog/overview/) over TLS (`intake.sekoia.io:10514`): forward your events with the Syslog protocol specified in RFC 5424.
-- [RELP](/integration/ingestion_methods/syslog/rsyslog/#how-to-forward-logs-to-sekoiaio-using-relp) over TLS (`relp.intake.sekoia.io:11514`): forward your events with Rsyslog’s reliable protocol called RELP.
-- [Cloud hosting and API polling](/integration/ingestion_methods/cloud_saas/overview/): configure Sekoia.io to regularly retrieve your logs.
+- [HTTPS](/integration/ingestion_methods/https/overview.md) (`https://intake.sekoia.io`): `POST` your JSON events to Sekoia.io.
+- [Syslog](/integration/ingestion_methods/syslog/overview.md) over TLS (`intake.sekoia.io:10514`): forward your events with the Syslog protocol specified in RFC 5424.
+- [RELP](/integration/ingestion_methods/syslog/rsyslog.md#how-to-forward-logs-to-sekoiaio-using-relp) over TLS (`relp.intake.sekoia.io:11514`): forward your events with Rsyslog’s reliable protocol called RELP.
+- [Cloud hosting and API polling](/integration/ingestion_methods/cloud_saas/overview.md): configure Sekoia.io to regularly retrieve your logs.
If these solutions do not meet your needs, contact our support.
@@ -30,16 +30,16 @@ and after
<%pri%>1 %timestamp:::date-rfc3339% %hostname% %app-name% %procid% LOG [SEKOIA@53288 intake_key=\"YOUR_INTAKE_KEY\"] RAW_MESSAGE
```
-We provide [documentation and example configurations](/integration/ingestion_methods/syslog/overview/) on how to configure your log system for Rsyslog, syslog-ng or use our [Sekoia.io Forwarder](/integration/ingestion_methods/syslog/sekoiaio_forwarder/), but it should be easy to configure other log collectors to forward their events to Sekoia.io.
+We provide [documentation and example configurations](/integration/ingestion_methods/syslog/overview.md) on how to configure your log system for Rsyslog, syslog-ng or use our [Sekoia.io Forwarder](/integration/ingestion_methods/syslog/sekoiaio_forwarder.md), but it should be easy to configure other log collectors to forward their events to Sekoia.io.
## HTTPS integration
-To push your events through our [HTTPS log collector](/integration/ingestion_methods/https/overview/), you have to `POST` your logs in the JSON format. To send us events, you should set `Content-Type` HTTP header to `application/json`.
+To push your events through our [HTTPS log collector](/integration/ingestion_methods/https/overview.md), you have to `POST` your logs in the JSON format. To send us events, you should set `Content-Type` HTTP header to `application/json`.
## Cloud & SaaS integration
-Sekoia.io is also able to retrieve logs and data from [Cloud platform](/integration/ingestion_methods/cloud_saas/overview/), such as Microsoft Azure, Amazon Web Services or Google Cloud.
+Sekoia.io is also able to retrieve logs and data from [Cloud platform](/integration/ingestion_methods/cloud_saas/overview.md), such as Microsoft Azure, Amazon Web Services or Google Cloud.
## Datetime representation in the events
-Sekoia.io accepts any representation of a datetime; see [Datetime representation](/xdr/FAQ/datetime/) for more details.
+Sekoia.io accepts any representation of a datetime; see [Datetime representation](/xdr/FAQ/datetime.md) for more details.
diff --git a/docs/integration/ingestion_methods/syslog/sekoiaio_forwarder.md b/docs/integration/ingestion_methods/syslog/sekoiaio_forwarder.md
index 1f1902c144..d11e291d7e 100644
--- a/docs/integration/ingestion_methods/syslog/sekoiaio_forwarder.md
+++ b/docs/integration/ingestion_methods/syslog/sekoiaio_forwarder.md
@@ -25,18 +25,18 @@ Please find our English tutorial video below to see how to configure the forward
| 10 000 | 4 | 8 | 1000 | MEMORY_MESSAGES=5000000 / DISK_SPACE=980g |
| 50 000 | 6 | 16 | 5000 | MEMORY_MESSAGES=12000000 / DISK_SPACE=4980g |
- !!! info
+ !!! info
These data are recommendations based on standards and observed averages on Sekoia.io, so they may change depending on use cases.
-
+
* Last version of Docker Engine. Please follow [this section](#docker-engine-installation) to install it if needed
* INBOUND TCP or UDP flows opened between the systems/applications and the concentrator on the ports of your choice
* OUTBOUND TCP flow opened towards:
- * **FRA1** intake.sekoia.io on port 10514
- * **FRA2** fra2.app.sekoia.io on port 10514
- * **MCO1** mco1.app.sekoia.io on port 10514
- * **EUA1** app.uae1.sekoia.io on port 10514
+ * **FRA1** intake.sekoia.io on port 10514
+ * **FRA2** fra2.app.sekoia.io on port 10514
+ * **MCO1** mco1.app.sekoia.io on port 10514
+ * **EUA1** app.uae1.sekoia.io on port 10514
- !!! note
+ !!! note
The disk choice (SSD or HDD type) has no impact on the performance of Sekoia.io Forwarder.
However, SSD type would be useful when an issue arise for recovery or catchup.
Please choose accordingly to your usage and cost.
@@ -90,7 +90,7 @@ intakes:
You are not limited to 3 entries. Feel free to adapt it to your needs.
#### Debug
-A debug variable is available in order to debug a specific intake, for example
+A debug variable is available in order to debug a specific intake, for example
```yaml
---
intakes:
@@ -165,7 +165,7 @@ ports:
- "20516-20566:20516-20566/udp"
```
-As specified in the Overview section, the concentrator will be run in an isolated environment. That means, by default, no flow is open between the host and the concentrator.
+As specified in the Overview section, the concentrator will be run in an isolated environment. That means, by default, no flow is open between the host and the concentrator.
`20516-20518:20516-20566` means that every packets coming through the TCP port form `20516` to `20566` to the host will be forwarded to the concentrator container from port `20516` to `20566`.
If you want to open a UDP flow, please add a line with `/udp` at the end.
@@ -187,9 +187,9 @@ Volumes are used to share files and folders between the host and the container:
* `./conf:/etc/rsyslog.d` is mapped if you want to customize some rsyslog configuration (ADVANCED)
* `./disk_queue:/var/spool/rsyslog` is used when the concentrator queue stores data on disk. The mapping avoids data loss if logs are stored on disk and the container is deleted.
-#### Import a custom rsyslog configuration
+#### Import a custom rsyslog configuration
-You can add your own additional rsyslog configuration. It can be useful to deal with specific use cases which are not supported natively by the Sekoia.io concentrator. To enable it, you simply have to create a new folder called `extended_conf` and put an additional your rsyslog file into (your file must have the extension *.conf). You do not have to deal with the `intake.yaml` file. Your custom configuration will be added in addition to the intake definition and will not erase exisiting ones.
+You can add your own additional rsyslog configuration. It can be useful to deal with specific use cases which are not supported natively by the Sekoia.io concentrator. To enable it, you simply have to create a new folder called `extended_conf` and put an additional your rsyslog file into (your file must have the extension *.conf). You do not have to deal with the `intake.yaml` file. Your custom configuration will be added in addition to the intake definition and will not erase exisiting ones.
You can define your own method for obtaining logs using rsyslog modules, but you still need to forward events to Sekoia.io by providing a syslog-valid message with your intake key as a header, as follows:
@@ -213,7 +213,7 @@ action(
}
```
-Once additional configuration has been added, you simply have to mount them in the docker as following:
+Once additional configuration has been added, you simply have to mount them in the docker as following:
```yaml
volumes:
@@ -274,7 +274,7 @@ mkdir certs && cd certs
```
=== "Fedora, Red Hat, CentOS (dnf)"
-
+
```bash
sudo dnf update
sudo dnf install -y openssl
@@ -328,14 +328,14 @@ tls_ca_name: server.crt
The forwarder is a critical component in the architecture between your information system and the Sekoia platform. A prolonged service interruption could lead to data loss, potentially causing missed detection of an attack within your environment.
-In this context, please find below the instructions to enable monitoring of your forwarder.
+In this context, please find below the instructions to enable monitoring of your forwarder.
This will allow health status information of the component to be transmitted to Sekoia, enabling you to set up alerts based on the values of the transmitted metrics.
-### Create the forwarder logs intake
+### Create the forwarder logs intake
The first step is to create the intake on the Sekoia platform and save the associated intake key
-For detailed information on this process, please refer to the following [documentation](/integration/categories/applicative/sekoiaio_forwarder_logs/)
+For detailed information on this process, please refer to the following [documentation](/integration/categories/applicative/sekoiaio_forwarder_logs.md)
### Configuration of the intake.yml file
@@ -366,7 +366,7 @@ By leveraging these metrics, you can easily define custom rules to detect specif
!!! Note
To understand the detailed meaning of each counter, please refer to the [associated rsyslog documentation](https://www.rsyslog.com/doc/configuration/rsyslog_statistic_counter.html).
-
+
### Extract concentrator metrics in case of outage
In extreme cases, the forwarder may cease to function entirely, and as a result, it will also stop sending its metrics to Sekoia (e.g., a full queue). While an alert from Sekoia will notify you of this issue, you will still need to investigate and understand the root cause to resolve the problem.
@@ -478,14 +478,14 @@ sudo docker compose logs -f
1. Check that the forwarder is correctly configured
- * Check the `intakes.yaml` file to see if you have declared the protocols and ports you wanted.
+ * Check the `intakes.yaml` file to see if you have declared the protocols and ports you wanted.
* Verify if this information is taken into account by the concentrator. At start-up, the concentrator always shows the list of Intakes with the protocols and ports.
```bash
sudo docker compose logs | more
```
- * Check that you correctly declared the `ports` section in the `docker-compose.yml` file. They MUST be the same as the ports declared in the `intakes.yaml` file. For instance, if you declared 4 technologies on ports `25020`, `25021`, `25022` and `25023`, the ports line the `docker-compose.yml` has to be at least `"25020-25023:25020-25023"` for TCP and `"25020-25023:25020-25023/udp"` if using UDP.
+ * Check that you correctly declared the `ports` section in the `docker-compose.yml` file. They MUST be the same as the ports declared in the `intakes.yaml` file. For instance, if you declared 4 technologies on ports `25020`, `25021`, `25022` and `25023`, the ports line the `docker-compose.yml` has to be at least `"25020-25023:25020-25023"` for TCP and `"25020-25023:25020-25023/udp"` if using UDP.
2. Verify that traffic is incoming from your log source, **meaning no firewall is blocking the events**.
```bash
@@ -495,7 +495,7 @@ sudo docker compose logs -f
`remote_ip`is the IP from which the logs should be incoming.
3. If you are sure that no firewall blocks the events but you still don't see any logs, verify on the source that you are forwarding the logs to the right IP and port using the correct protocol.
-
+
**Example**
You want to forward your firewall logs to Sekoia. You decided to use the `TCP/20524` port.
@@ -671,7 +671,7 @@ Connect to the remote server where you would like to install the Sekoia.io Forwa
2. Edit the configuration files
- - `sekoiaio-concentrator/intakes.yaml` by replacing the `name`, `protocol`, `port` and `intake_key` for each intake you would like to collect
+ - `sekoiaio-concentrator/intakes.yaml` by replacing the `name`, `protocol`, `port` and `intake_key` for each intake you would like to collect
- `sekoiaio-concentrator/docker-compose.yml` by remplacing the value `"20516-20518:20516-20518"` by a relevant content according to the `sekoiaio-concentrator/intakes.yaml` previously edited
3. Start the docker
diff --git a/docs/javascript/openapi.js b/docs/javascript/openapi.js
new file mode 100644
index 0000000000..0d60835fec
--- /dev/null
+++ b/docs/javascript/openapi.js
@@ -0,0 +1,732 @@
+// Declare officially documented regions
+const REGIONS = ["FRA1", "FRA2", "MCO1", "UAE1"];
+
+// Declare default tagGroups for mapping OpenAPI tags to left menu groups
+const X_TAG_GROUPS = [
+ {
+ name: "User",
+ tags: [
+ "User Authentication",
+ "me",
+ "mfa", // TODO: split 'mfa' into administration and self
+ "permissions",
+ ],
+ },
+ {
+ name: "Workspace",
+ tags: [
+ "customers", // TODO deprecated, get rid of it
+ "communities",
+ "api-keys",
+ "licenses",
+ "invitations",
+ "plans",
+ "sub-communities",
+ "avatars",
+ "users", // TODO set this tag on all user administration stuff
+ "roles",
+ ],
+ },
+ {
+ name: "Intelligence",
+ tags: [
+ "Observables",
+ "CTI Objects",
+ "Bundles",
+ "Collections",
+ "Exports",
+ "Outgoing Feeds",
+ "Graphs",
+ "MISP",
+ "Objects",
+ "Observable relationships",
+ "Indicators",
+ "Images",
+ "support",
+ "Labels",
+ "Kill Chains",
+ ],
+ },
+ {
+ name: "Collect",
+ tags: [
+ "Intakes",
+ "Assets",
+ "Atoms",
+ "Intakes by status",
+ "Intakes errors and warnings",
+ "Intakes lag and processing lag",
+ "formats",
+ "IOC Collections",
+ ],
+ },
+
+ {
+ name: "Detection rules",
+ tags: [
+ "Rules",
+ "datasources",
+ "generation-modes",
+ "rules-catalog",
+ "alert-filter", // TODO: to create, this tag doesn't exist yet
+ ],
+ },
+ {
+ name: "Alerts",
+ tags: [
+ "Alert",
+ "Alert Entities",
+ "Alert Rules",
+ "Alert Sources and Targets",
+ "Countermeasures",
+ "Cyber Kill Chain",
+ "Stats",
+ "Alert Status",
+ "Alert Type",
+ ]
+ },{
+ name:"Cases",
+ tags: [
+ "Case",
+ "Comments",
+ "Statistics",
+ "Enrichers",
+ "Callbacks",
+ "Services",
+ "Tasks",
+ ]
+ },
+ {
+ name: "Playbooks",
+ tags: [
+ "Playbook actions telemetry",
+ "modules",
+ "Action Runs",
+ "Actions",
+ "Changes",
+ "Connector Configurations",
+ "Connectors",
+ "Module Configurations",
+ "Modules",
+ "Node Runs",
+ "Playbooks Runs",
+ "Playbooks",
+ "Trigger Configurations",
+ "Triggers",
+ ],
+ },
+
+ {
+ name: "AI assistant", // TODO: Make that private
+ tags: ["Roy tokens use telemetry"],
+ },
+];
+
+function $element(tag, content = "", cls = "") {
+ const el = document.createElement(tag);
+ if (content) el.innerHTML = content;
+ if (cls) el.className = cls;
+ return el;
+}
+
+function merge_openapi_schemas(schemas) {
+ const paths = {};
+ const definitions = {};
+
+ for (const s of schemas) {
+ if (!s?.info?.title) continue;
+ console.log("Merge", s.info.title);
+
+ const ref_mapping = {};
+ const prefix = s.info.title.replace(/\s+/, "_") + "_";
+
+ // Prefix colliding component names
+ for (let key in s.components?.schemas || {}) {
+ const def = s.components?.schemas[key];
+ if (definitions[key]) {
+ ref_mapping[key] = prefix + key;
+ key = prefix + key;
+ }
+ if (definitions[key]) {
+ console.error(`Definition collision for ${key}`);
+ continue;
+ }
+ definitions[key] = def;
+ }
+
+ // Rewrite components refs accordingly
+ object_walk(
+ s,
+ (k, v) => {
+ if (
+ k === "$ref" &&
+ typeof v === "string" &&
+ v.startsWith("#/components/schemas/")
+ ) {
+ const ref = v.substring("#/components/schemas/".length);
+ return "#/components/schemas/" + (ref_mapping[ref] || ref);
+ }
+ return v;
+ },
+ true
+ );
+
+ // Merge endpoints paths
+ for (const p in s.paths || {}) {
+ for (const method in s.paths[p]) {
+ if (method !== "parameters" && !s.paths[p][method].tags?.length) {
+ console.warn(`Endpoint ${method} ${p} has no tag, skipping`);
+ continue;
+ }
+ if (paths[p]?.[method]) {
+ console.error(`Endpoint collision for ${method} ${p}`);
+ continue;
+ }
+ paths[p] ||= {};
+ paths[p][method] = s.paths[p][method];
+ }
+ }
+ }
+
+ const schema = {
+ ...schemas[0],
+ openapi: "3.1.0",
+ info: {
+ title: "Sekoia.io API Documentation",
+ description: "Documentation of all Sekoia.io REST API endpoints",
+ version: "1.0",
+ },
+ servers: [
+ {
+ url: "https://api.sekoia.io",
+ description: "Sekoia.io API",
+ },
+ ],
+ paths,
+ components: {
+ schemas: definitions,
+ },
+
+ "x-tagGroups": X_TAG_GROUPS,
+ };
+
+ return schema;
+}
+
+async function init_openapi_documentation() {
+ let _APIKEY = "";
+ const region = (
+ new URLSearchParams(location.search).get("region") || "fra1"
+ ).toLowerCase();
+
+ const openapi_el = document.querySelector("#openapi");
+ if (!openapi_el) return;
+
+ // Collect services OpenAPI schema URLs from rendered markdown
+ let schema_urls = Array.from(
+ new Set(
+ openapi_el
+ .querySelector("& > section")
+ .innerText.split("\n")
+ .map((x) => x.trim())
+ .filter((x) => x.length > 0)
+ )
+ );
+
+ // Replace with the selected region's URLs
+ if (region !== "fra1") {
+ schema_urls = schema_urls.map((url) =>
+ url.replace("https://app.sekoia.io/", `https://app.${region}.sekoia.io/`)
+ );
+ }
+
+ // Convert legacy Swagger 2.0 schemas to OpenAPI 3.1
+ const schemas = (
+ await Promise.all(
+ schema_urls.map(async (url) => {
+ try {
+ let schema = await fetch(url).then((x) => x.json());
+ if (schema.swagger) schema = convert_swagger_to_openapi(schema);
+
+ // Lint the resulting OpenAPI 3.1 schema to polish parameters
+ Object.values(schema.paths).forEach((p) => {
+ Object.values(p).forEach((endpoint) => {
+ // Gather scattered body params into one object body param
+ let params = [...(endpoint.parameters || [])];
+ let bodyParams = params.filter((p) => p.in === "body");
+ if (bodyParams?.length > 0) {
+ endpoint.requestBody = {
+ content: {
+ "application/json": {
+ schema: {
+ type: "object",
+ properties: Object.fromEntries(
+ bodyParams.map((p) => [p.name, { type: p.type }])
+ ),
+ },
+ },
+ },
+ };
+ params = params.filter((p) => p.in !== "body");
+ }
+
+ // Get rid of authentication-related fields
+ endpoint.parameters = params.filter(
+ (p) => !["header", "cookie"].includes(p.in)
+ );
+ });
+ });
+
+ return schema;
+ } catch (e) {
+ console.error(e);
+ console.warn(`Couldn't gather OpenAPI schema at ${url}`);
+ }
+ })
+ )
+ ).filter((x) => !!x);
+
+ // Generate Redoc DOM
+ const schema = merge_openapi_schemas(schemas);
+
+ if (region !== "fra1")
+ schema.servers[0].url = `https://app.${region}.sekoia.io/api`;
+
+ await new Promise((done) =>
+ Redoc.init(schema, { hideLoading: true }, openapi_el, done)
+ );
+
+ // Gather params for a given {method}+{endpoint}
+ function gather_params(method, endpoint) {
+ const doc = schema.paths[endpoint][method];
+ const params = [];
+ // Always prepend API Key field
+ params.push({ name: "API Key", in: "header" });
+ // ... query params
+ params.push(...(doc.parameters || []));
+
+ // ... path params
+ for (const pathParam of endpoint.matchAll(/\{([^:\}]+)(:([^:\}]+))?\}/g)) {
+ if (!params.find((p) => p.name === pathParam[1] && p.in === "path")) {
+ params.push({
+ name: pathParam[1],
+ in: "path",
+ schema: { type: pathParam[3] || "any" },
+ });
+ }
+ }
+
+ // ... body params
+ let bodySchema = doc.requestBody?.content?.["application/json"]?.schema;
+ if (bodySchema?.["$ref"]) {
+ bodySchema = bodySchema?.["$ref"]?.replace(
+ /^#\/components\/schemas\//,
+ ""
+ );
+ const body = schema.components?.schemas?.[bodySchema]?.properties || {};
+ for (const k in body) {
+ params.push({ name: k, in: "body" });
+ }
+ } else {
+ const body = bodySchema?.properties || {};
+ for (const k in body) {
+ params.push({ name: k, in: "body" });
+ }
+ }
+
+ // Filter-out authentication fields
+ return params.filter(
+ (p) => !["authorization", "access_token_cookie"].includes(p.name)
+ );
+ }
+
+ // Generate a try-it query from entered {params} for the given {method}+{endpoint}
+ function generate_query(
+ method,
+ endpoint,
+ params,
+ { inline_query_params = true } = {}
+ ) {
+ method = method.toUpperCase();
+ let url = (schema.servers[0]?.url || "") + endpoint;
+ const hasBodyParams = !!params?.find((p) => p.in === "body");
+ const bodyParams = params?.filter(
+ (p) => p.in === "body" && ![undefined, ""].includes(p.value)
+ );
+ let headers = { Authorization: "Bearer <YOUR_API_KEY>" };
+ let body, query_params;
+
+ // Interpolate path params
+ url = url.replaceAll(
+ /\{([^:\}]+)(:[^\}:]+)?\}/g,
+ (m, placeholder) =>
+ params.find((p) => p.in === "path" && p.name === placeholder)?.value ||
+ ""
+ );
+
+ // Interpolate query params
+ if (method === "GET") {
+ query_params = params
+ .filter(
+ (p) => p.in === "query" && p.value !== "" && p.value !== undefined
+ )
+ .map((p) => [p.name, p.value]);
+ if (inline_query_params) {
+ url += "?" + new URLSearchParams(Object.fromEntries(query_params));
+ }
+ }
+
+ // Generate JSON body
+ else if (hasBodyParams) {
+ body = Object.fromEntries(bodyParams.map((p) => [p.name, p.value]));
+
+ // Try to JSON parse each body param, in case it expects arrays or other composite values
+ for (const k in body) {
+ try {
+ body[k] = JSON.parse(body[k]);
+ } catch {}
+ }
+ headers["Content-Type"] = "application/json";
+ body = JSON.stringify(body);
+ }
+
+ return { method, url, headers, body, query_params };
+ }
+
+ // Generate a CURL command line for an OpenAPI endpoint
+ function generate_curl(method, endpoint, params, el) {
+ let { url, headers, body } = generate_query(method, endpoint, params);
+ let out = `curl -X ${method.toUpperCase()} ${url}`;
+ Object.entries(headers).forEach(([h, v]) => (out += ` -H '${h}:${v}'`));
+ if (body) out += ` --data-raw '${body}'`;
+ return hljs.highlight(out, { language: "bash" }).value;
+ }
+
+ // Generate a Python example code for an OpenAPI endpoint
+ function generate_python(method, endpoint, params, el) {
+ let { url, headers, body, query_params } = generate_query(
+ method,
+ endpoint,
+ params,
+ {
+ inline_query_params: false,
+ }
+ );
+ let out = `import requests
+import json
+
+result = requests.request(
+ "${method.toUpperCase()}",
+ "${url}",
+`;
+ if (query_params) {
+ out += ` params=${JSON.stringify(
+ Object.fromEntries(query_params),
+ null,
+ 4
+ ).replaceAll("\n", "\n ")},\n`;
+ }
+ if (body) {
+ out += ` json=${JSON.stringify(JSON.parse(body), null, 4).replaceAll(
+ "\n",
+ "\n "
+ )},\n`;
+ }
+ if (headers) {
+ out += ` headers=${JSON.stringify(headers, null, 4).replaceAll(
+ "\n",
+ "\n "
+ )},\n`;
+ }
+ out += `).json()
+print(json.dumps(result, indent=4))
+`;
+ return hljs.highlight(out, { language: "python" }).value;
+ }
+
+ // Generate a Javascript example code for an OpenAPI endpoint
+ function generate_js(method, endpoint, params, el) {
+ let { url, headers, body } = generate_query(method, endpoint, params);
+ let out = `await fetch("${url}", {
+ method: "${method.toUpperCase()}",
+`;
+ if (body) {
+ out += ` body: \`${JSON.stringify(
+ JSON.parse(body),
+ null,
+ 4
+ ).replaceAll("\n", "\n ")}\`,\n`;
+ }
+ if (headers) {
+ out += ` headers: ${JSON.stringify(headers, null, 4).replaceAll(
+ "\n",
+ "\n "
+ )},\n`;
+ }
+
+ out += `}).then(res=>res.json())
+`;
+ return hljs.highlight(out, { language: "javascript" }).value;
+ }
+
+ async function execute_endpoint(method, endpoint, params, el) {
+ document
+ .querySelectorAll(".try-it-wrapper button")
+ .forEach((b) => b.setAttribute("disabled", ""));
+
+ // Spinner
+ el.querySelector(".results")?.remove();
+ const results = document.createElement("div");
+ results.className = "results";
+ results.innerHTML = ``;
+ el.appendChild(results);
+
+ let { url, headers, body } = generate_query(method, endpoint, params);
+ headers = {
+ ...headers,
+ accept: "application/json",
+ Authorization: `Bearer ${_APIKEY}`,
+ };
+
+ let status = "success";
+ error = null;
+ const res = await fetch(url, { method, body, headers })
+ .then(async (x) => {
+ if (x.status >= 400) {
+ status = "error";
+ return `Error ${x.status}\n${await x.text()}}`;
+ }
+ return JSON.stringify(await x.json(), null, 4);
+ })
+ .catch((e) => {
+ status = "error";
+ return e;
+ });
+
+ results.innerHTML = `Response
`;
+ results.querySelector("pre").innerText = res;
+
+ document
+ .querySelectorAll(".try-it-wrapper button")
+ .forEach((b) => b.removeAttribute("disabled"));
+ }
+
+ // Generate a TryIt form
+ function generate_try_it(e) {
+ const method = e.querySelector(".sc-EgOXT").innerText.trim().toLowerCase();
+ const endpoint = e.querySelector(".sc-ejfMa-d").innerText.trim();
+ const el = document.createElement("form");
+ el.classList.add("try-it-wrapper");
+
+ const params = gather_params(method, endpoint);
+
+ function get_params_data() {
+ const data = [...params];
+ el.querySelectorAll("input").forEach((input) => {
+ const p = data.find((x) => x.name === input.name);
+ if (p) {
+ p.value = input.value;
+ }
+ });
+ return data;
+ }
+
+ el.appendChild(
+ $element(
+ "div",
+ `
+
+ Path parameters
+ Query parameters
+ Body parameters
+ `,
+ "parameters"
+ )
+ );
+ const [elHeaders, elPathParams, elQueryParams, elBodyParams] = Array.from(
+ el.querySelectorAll(".parameters > .params")
+ );
+
+ // Generate params inputs
+ params?.forEach((p) => {
+ const div = document.createElement("div");
+ div.className = "param";
+ const input = document.createElement("input");
+
+ input.name = p.name;
+ input.title = p.name;
+ if (p.name === "API Key") {
+ input.type = "password";
+ input.value = _APIKEY;
+ }
+
+ const type = p.schema?.anyOf?.[0]?.type || p.schema?.type;
+ if (type && type !== "any") {
+ div.innerHTML = ``;
+ } else {
+ div.innerHTML = ``;
+ }
+
+ if (p.in === "query") elQueryParams.appendChild(div);
+ else if (p.in === "path") elPathParams.appendChild(div);
+ else if (p.in === "body") elBodyParams.appendChild(div);
+ else if (p.in === "header") elHeaders.appendChild(div);
+ div.appendChild(input);
+
+ // Update cURL when input changes
+ input.oninput = () => {
+ curl.innerHTML = generate_curl(method, endpoint, get_params_data(), el);
+ python.innerHTML = generate_python(
+ method,
+ endpoint,
+ get_params_data(),
+ el
+ );
+ js.innerHTML = generate_js(method, endpoint, get_params_data(), el);
+
+ // Propagate API KEY to all endpoints form
+ if (p.name === "API Key") {
+ document
+ .querySelectorAll(
+ ".try-it-wrapper input[type=password][name='API Key']"
+ )
+ .forEach((elt) => (_APIKEY = elt.value = input.value));
+ }
+ };
+ });
+
+ [elBodyParams, elQueryParams, elPathParams].forEach((e) => {
+ if (Array.from(e.querySelectorAll("&>div"))?.length === 0) e.remove();
+ });
+
+ // Code examples
+ el.appendChild($element("h3", "Code examples"));
+ el.appendChild(
+ $element(
+ "div",
+ `
+
+ - cURL
+ - Python
+ - Javascript
+
+
+ `,
+ "code-examples"
+ )
+ );
+
+ const [curl, python, js] = Array.from(
+ el.querySelectorAll(".code-examples > div > pre > code")
+ );
+
+ curl.innerHTML = generate_curl(method, endpoint, get_params_data(), el);
+ python.innerHTML = generate_python(method, endpoint, get_params_data(), el);
+ js.innerHTML = generate_js(method, endpoint, get_params_data(), el);
+
+ Array.from(el.querySelectorAll(".code-examples > ul > li")).forEach(
+ (e, i) => {
+ e.onclick = () => {
+ el.querySelectorAll(".code-examples > ul > li").forEach((e) =>
+ e.classList.remove("selected")
+ );
+ el.querySelectorAll(".code-examples > div > pre").forEach((e) =>
+ e.classList.remove("selected")
+ );
+ e.classList.add("selected");
+ Array.from(el.querySelectorAll(".code-examples > div > pre"))[
+ i
+ ].classList.add("selected");
+ };
+ }
+ );
+
+ // Send button
+ const btn = document.createElement("button");
+ btn.type = "submit";
+ btn.innerText = "Send";
+ el.onsubmit = (e) => {
+ execute_endpoint(method, endpoint, get_params_data(), el);
+ e.stopPropagation();
+ e.preventDefault();
+ };
+ el.append(btn);
+ return el;
+ }
+
+ // Instrument Redoc DOM with Try it extension
+ document.querySelectorAll("main .bOFhJE").forEach((e) => {
+ function switchTab(tab) {
+ tabs.querySelectorAll("li").forEach((e) => e.classList.remove("active"));
+ tab.classList.add("active");
+ }
+
+ e.classList.add("examples");
+ const tabs = document.createElement("ul");
+ tabs.className = "tabs";
+ let tab;
+ tabs.appendChild((tab = document.createElement("li")));
+ tab.innerText = "Samples";
+ tab.classList.add("active");
+ tab.onclick = (ev) => {
+ switchTab(ev.target);
+ e.classList.remove("mode-try-it");
+ };
+ tabs.appendChild((tab = document.createElement("li")));
+ tab.innerText = "Try it";
+ tab.classList.add("try-it");
+ tab.onclick = (ev) => {
+ switchTab(ev.target);
+ e.classList.add("mode-try-it");
+ if (!e.querySelector(".try-it-wrapper")) {
+ e.appendChild(generate_try_it(e));
+ }
+ };
+ e.prepend(tabs);
+ e.querySelectorAll(".sc-iGgWBj > div").forEach((e) => {
+ if (e.querySelector("h3")?.innerText.includes("Response samples"))
+ e.classList.add("response-samples");
+ if (e.querySelector("h3")?.innerText.includes("Request samples"))
+ e.classList.add("request-samples");
+ });
+ });
+
+ // Custom left menu additions
+ const menu = document.querySelector(".redoc-wrap .menu-content");
+ const region_picker = $element(
+ "div",
+ `
+
+
+ `,
+ "region-picker"
+ );
+
+ menu
+ .querySelector(".scrollbar-container")
+ .parentNode.insertBefore(
+ region_picker,
+ menu.querySelector(".scrollbar-container")
+ );
+ region_picker.onchange = () => {
+ document.location.search = `region=${
+ region_picker.querySelector("select").selectedOptions[0].innerText
+ }`;
+ };
+ region_picker.querySelectorAll("option").forEach((e) => {
+ if (
+ ((
+ new URLSearchParams(location.search).get("region") || "fra1"
+ ).toLowerCase() || "fra1") === (e.innerText.toLowerCase() || "fra1")
+ )
+ e.setAttribute("selected", true);
+ });
+}
+
+window.addEventListener("load", init_openapi_documentation);
diff --git a/docs/javascript/swagger-converter.js b/docs/javascript/swagger-converter.js
new file mode 100644
index 0000000000..57978d7ce7
--- /dev/null
+++ b/docs/javascript/swagger-converter.js
@@ -0,0 +1,86 @@
+// Swagger 2.0 to OpenAPI 3.1 in-browser conversion
+
+function object_walk(obj, fn, replace = false) {
+ if (Array.isArray(obj)) {
+ if (replace) return obj.map((x, i) => fn(i, x));
+ else obj.forEach((x, i) => fn(i, x));
+ }
+ if (typeof obj === "object") {
+ for (const k in obj) {
+ const r = fn(k, obj[k]);
+ if (replace) obj[k] = r;
+ object_walk(obj[k], fn, replace);
+ }
+ }
+}
+
+function convert_swagger_to_openapi(swagger) {
+ if (swagger.swagger !== "2.0") throw new Error("Not a swagger spec");
+
+ object_walk(
+ swagger,
+ (k, v) => {
+ if (k === "$ref" && typeof v === "string") {
+ return v.replace(/^#\/definitions\//, "#/components/schemas/");
+ }
+ return v;
+ },
+ true
+ );
+
+ const openapi = {
+ openapi: "3.1.0",
+ info: {
+ ...swagger.info,
+ },
+ servers: [
+ {
+ url: "https://api.sekoia.io",
+ description: "Sekoia.io API",
+ },
+ ],
+ paths: Object.fromEntries(
+ Object.entries(swagger.paths).map(([path, spec]) => {
+ const commonParams = spec.parameters;
+ Object.entries(spec).forEach(([method, endpoint]) => {
+ if (
+ !["get", "post", "put", "delete", "patch"].includes(
+ method.toLowerCase()
+ )
+ )
+ return;
+
+ if (endpoint.parameters) {
+ // Enforce non-querystring params for every methods other than GET
+ if (method !== "get") {
+ for (const p of endpoint.parameters) {
+ if (p.in === "query") p.in = "body";
+ }
+ }
+ }
+
+ // Incorporate common params defined at path level
+ if (commonParams) {
+ endpoint.parameters = [
+ ...(endpoint.parameters || []),
+ ...commonParams,
+ ];
+ }
+
+ Object.entries(endpoint.responses).forEach(([code, res]) => {
+ if (!res.schema) return;
+ res.content = {
+ "application/json": { schema: res.schema },
+ };
+ delete res.schema;
+ });
+ });
+ return [swagger.basePath + path, spec];
+ })
+ ),
+ components: {
+ schemas: swagger.definitions,
+ },
+ };
+ return openapi;
+}
diff --git a/docs/stylesheets/inter.min.css b/docs/stylesheets/inter.min.css
index c098cead60..17ce922301 100644
--- a/docs/stylesheets/inter.min.css
+++ b/docs/stylesheets/inter.min.css
@@ -2,62 +2,62 @@
font-family: 'Inter';
font-style: normal;
font-weight: 100;
- src: url(/assets/fonts/Inter-thin.ttf) format('opentype');
+ src: url(../assets/fonts/Inter-thin.ttf) format('opentype');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 200;
- src: url(/assets/fonts/Inter-ExtraLight.ttf) format('opentype');
+ src: url(../assets/fonts/Inter-ExtraLight.ttf) format('opentype');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 300;
- src: url(/assets/fonts/Inter-Light.ttf) format('opentype');
+ src: url(../assets/fonts/Inter-Light.ttf) format('opentype');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 400;
- src: url(/assets/fonts/Inter-Regular.ttf) format('opentype');
+ src: url(../assets/fonts/Inter-Regular.ttf) format('opentype');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 500;
- src: url(/assets/fonts/Inter-Medium.ttf) format('opentype');
+ src: url(../assets/fonts/Inter-Medium.ttf) format('opentype');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 600;
- src: url(/assets/fonts/Inter-SemiBold.ttf) format('opentype');
+ src: url(../assets/fonts/Inter-SemiBold.ttf) format('opentype');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 700;
- src: url(/assets/fonts/Inter-Bold.ttf) format('opentype');
+ src: url(../assets/fonts/Inter-Bold.ttf) format('opentype');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 800;
- src: url(/assets/fonts/Inter-ExtraBold.ttf) format('opentype');
+ src: url(../assets/fonts/Inter-ExtraBold.ttf) format('opentype');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 900;
- src: url(/assets/fonts/Inter-Black.ttf) format('opentype');
+ src: url(../assets/fonts/Inter-Black.ttf) format('opentype');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
\ No newline at end of file
diff --git a/docs/stylesheets/lightgallery.min.css b/docs/stylesheets/lightgallery.min.css
index 104d68f817..e10ab3df27 100644
--- a/docs/stylesheets/lightgallery.min.css
+++ b/docs/stylesheets/lightgallery.min.css
@@ -1 +1 @@
-@font-face{font-family:lg;src:url(../fonts/lg.ttf?22t19m) format("truetype"),url(../fonts/lg.woff?22t19m) format("woff"),url(../fonts/lg.svg?22t19m#lg) format("svg");font-weight:400;font-style:normal;font-display:block}.lg-icon{font-family:lg!important;speak:never;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.lg-actions .lg-next,.lg-actions .lg-prev{border-radius:2px;color:#999;cursor:pointer;display:block;font-size:22px;margin-top:-10px;padding:8px 10px 9px;position:absolute;top:50%;z-index:1080;outline:0;border:none;background-color:transparent}.lg-actions .lg-next.disabled,.lg-actions .lg-prev.disabled{pointer-events:none;opacity:.5}.lg-actions .lg-next:hover,.lg-actions .lg-prev:hover{color:#FFF}.lg-actions .lg-next{right:20px}.lg-actions .lg-next:before{content:"\e095"}.lg-actions .lg-prev{left:20px}.lg-actions .lg-prev:after{content:"\e094"}@-webkit-keyframes lg-right-end{0%,100%{left:0}50%{left:-30px}}@-moz-keyframes lg-right-end{0%,100%{left:0}50%{left:-30px}}@-ms-keyframes lg-right-end{0%,100%{left:0}50%{left:-30px}}@keyframes lg-right-end{0%,100%{left:0}50%{left:-30px}}@-webkit-keyframes lg-left-end{0%,100%{left:0}50%{left:30px}}@-moz-keyframes lg-left-end{0%,100%{left:0}50%{left:30px}}@-ms-keyframes lg-left-end{0%,100%{left:0}50%{left:30px}}@keyframes lg-left-end{0%,100%{left:0}50%{left:30px}}.lg-outer.lg-right-end .lg-object{-webkit-animation:lg-right-end .3s;-o-animation:lg-right-end .3s;animation:lg-right-end .3s;position:relative}.lg-outer.lg-left-end .lg-object{-webkit-animation:lg-left-end .3s;-o-animation:lg-left-end .3s;animation:lg-left-end .3s;position:relative}.lg-toolbar{z-index:1082;left:0;position:absolute;top:0;width:100%;background-color:rgba(0,0,0,.45)}.lg-toolbar .lg-icon{color:#999;cursor:pointer;float:right;font-size:24px;height:47px;line-height:27px;padding:10px 0;text-align:center;width:50px;text-decoration:none!important;outline:0;background:0 0;border:none;box-shadow:none;-webkit-transition:color .2s linear;-o-transition:color .2s linear;transition:color .2s linear}.lg-toolbar .lg-icon:hover{color:#FFF}.lg-toolbar .lg-close:after{content:"\e070"}.lg-toolbar .lg-download:after{content:"\e0f2"}.lg-sub-html{background-color:rgba(0,0,0,.45);bottom:0;color:#EEE;font-size:16px;left:0;padding:10px 40px;position:fixed;right:0;text-align:center;z-index:1080}.lg-sub-html h4{margin:0;font-size:13px;font-weight:700}.lg-sub-html p{font-size:12px;margin:5px 0 0}#lg-counter{color:#999;display:inline-block;font-size:16px;padding-left:20px;padding-top:12px;vertical-align:middle}.lg-next,.lg-prev,.lg-toolbar{opacity:1;-webkit-transition:-webkit-transform .35s cubic-bezier(0,0,.25,1) 0s,opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear;-moz-transition:-moz-transform .35s cubic-bezier(0,0,.25,1) 0s,opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear;-o-transition:-o-transform .35s cubic-bezier(0,0,.25,1) 0s,opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear;transition:transform .35s cubic-bezier(0,0,.25,1) 0s,opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear}.lg-hide-items .lg-prev{opacity:0;-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}.lg-hide-items .lg-next{opacity:0;-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}.lg-hide-items .lg-toolbar{opacity:0;-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}body:not(.lg-from-hash) .lg-outer.lg-start-zoom .lg-object{-webkit-transform:scale3d(.5,.5,.5);transform:scale3d(.5,.5,.5);opacity:0;-webkit-transition:-webkit-transform 250ms cubic-bezier(0,0,.25,1) 0s,opacity 250ms cubic-bezier(0,0,.25,1)!important;-moz-transition:-moz-transform 250ms cubic-bezier(0,0,.25,1) 0s,opacity 250ms cubic-bezier(0,0,.25,1)!important;-o-transition:-o-transform 250ms cubic-bezier(0,0,.25,1) 0s,opacity 250ms cubic-bezier(0,0,.25,1)!important;transition:transform 250ms cubic-bezier(0,0,.25,1) 0s,opacity 250ms cubic-bezier(0,0,.25,1)!important;-webkit-transform-origin:50% 50%;-moz-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}body:not(.lg-from-hash) .lg-outer.lg-start-zoom .lg-item.lg-complete .lg-object{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);opacity:1}.lg-outer .lg-thumb-outer{background-color:#0D0A0A;bottom:0;position:absolute;width:100%;z-index:1080;max-height:350px;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);-webkit-transition:-webkit-transform .25s cubic-bezier(0,0,.25,1) 0s;-moz-transition:-moz-transform .25s cubic-bezier(0,0,.25,1) 0s;-o-transition:-o-transform .25s cubic-bezier(0,0,.25,1) 0s;transition:transform .25s cubic-bezier(0,0,.25,1) 0s}.lg-outer .lg-thumb-outer.lg-grab .lg-thumb-item{cursor:-webkit-grab;cursor:-moz-grab;cursor:-o-grab;cursor:-ms-grab;cursor:grab}.lg-outer .lg-thumb-outer.lg-grabbing .lg-thumb-item{cursor:move;cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:-o-grabbing;cursor:-ms-grabbing;cursor:grabbing}.lg-outer .lg-thumb-outer.lg-dragging .lg-thumb{-webkit-transition-duration:0s!important;transition-duration:0s!important}.lg-outer.lg-thumb-open .lg-thumb-outer{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.lg-outer .lg-thumb{padding:10px 0;height:100%;margin-bottom:-5px}.lg-outer .lg-thumb-item{cursor:pointer;float:left;overflow:hidden;height:100%;border:2px solid #FFF;border-radius:4px;margin-bottom:5px}@media (min-width:1025px){.lg-outer .lg-thumb-item{-webkit-transition:border-color .25s ease;-o-transition:border-color .25s ease;transition:border-color .25s ease}}.lg-outer .lg-thumb-item.active,.lg-outer .lg-thumb-item:hover{border-color:#a90707}.lg-outer .lg-thumb-item img{width:100%;height:100%;object-fit:cover}.lg-outer.lg-has-thumb .lg-item{padding-bottom:120px}.lg-outer.lg-can-toggle .lg-item{padding-bottom:0}.lg-outer.lg-pull-caption-up .lg-sub-html{-webkit-transition:bottom .25s ease;-o-transition:bottom .25s ease;transition:bottom .25s ease}.lg-outer.lg-pull-caption-up.lg-thumb-open .lg-sub-html{bottom:100px}.lg-outer .lg-toggle-thumb{background-color:#0D0A0A;border-radius:2px 2px 0 0;color:#999;cursor:pointer;font-size:24px;height:39px;line-height:27px;padding:5px 0;position:absolute;right:20px;text-align:center;top:-39px;width:50px;outline:0;border:none}.lg-outer .lg-toggle-thumb:after{content:"\e1ff"}.lg-outer .lg-toggle-thumb:hover{color:#FFF}.lg-outer .lg-video-cont{display:inline-block;vertical-align:middle;max-width:1140px;max-height:100%;width:100%;padding:0 5px}.lg-outer .lg-video{width:100%;height:0;padding-bottom:56.25%;overflow:hidden;position:relative}.lg-outer .lg-video .lg-object{display:inline-block;position:absolute;top:0;left:0;width:100%!important;height:100%!important}.lg-outer .lg-video .lg-video-play{width:84px;height:59px;position:absolute;left:50%;top:50%;margin-left:-42px;margin-top:-30px;z-index:1080;cursor:pointer}.lg-outer .lg-has-vimeo .lg-video-play{background:url(../img/vimeo-play.png) no-repeat}.lg-outer .lg-has-vimeo:hover .lg-video-play{background:url(../img/vimeo-play.png) 0 -58px no-repeat}.lg-outer .lg-has-html5 .lg-video-play{background:url(../img/video-play.png) no-repeat;height:64px;margin-left:-32px;margin-top:-32px;width:64px;opacity:.8}.lg-outer .lg-has-html5:hover .lg-video-play{opacity:1}.lg-outer .lg-has-youtube .lg-video-play{background:url(../img/youtube-play.png) no-repeat}.lg-outer .lg-has-youtube:hover .lg-video-play{background:url(../img/youtube-play.png) 0 -60px no-repeat}.lg-outer .lg-video-object{width:100%!important;height:100%!important;position:absolute;top:0;left:0}.lg-outer .lg-has-video .lg-video-object{visibility:hidden}.lg-outer .lg-has-video.lg-video-playing .lg-object,.lg-outer .lg-has-video.lg-video-playing .lg-video-play{display:none}.lg-outer .lg-has-video.lg-video-playing .lg-video-object{visibility:visible}.lg-progress-bar{background-color:#333;height:5px;left:0;position:absolute;top:0;width:100%;z-index:1083;opacity:0;-webkit-transition:opacity 80ms ease 0s;-moz-transition:opacity 80ms ease 0s;-o-transition:opacity 80ms ease 0s;transition:opacity 80ms ease 0s}.lg-progress-bar .lg-progress{background-color:#a90707;height:5px;width:0}.lg-progress-bar.lg-start .lg-progress{width:100%}.lg-show-autoplay .lg-progress-bar{opacity:1}.lg-autoplay-button:after{content:"\e01d"}.lg-show-autoplay .lg-autoplay-button:after{content:"\e01a"}.lg-outer.lg-css3.lg-zoom-dragging .lg-item.lg-complete.lg-zoomable .lg-image,.lg-outer.lg-css3.lg-zoom-dragging .lg-item.lg-complete.lg-zoomable .lg-img-wrap{-webkit-transition-duration:0s;transition-duration:0s}.lg-outer.lg-use-transition-for-zoom .lg-item.lg-complete.lg-zoomable .lg-img-wrap{-webkit-transition:-webkit-transform .3s cubic-bezier(0,0,.25,1) 0s;-moz-transition:-moz-transform .3s cubic-bezier(0,0,.25,1) 0s;-o-transition:-o-transform .3s cubic-bezier(0,0,.25,1) 0s;transition:transform .3s cubic-bezier(0,0,.25,1) 0s}.lg-outer.lg-use-left-for-zoom .lg-item.lg-complete.lg-zoomable .lg-img-wrap{-webkit-transition:left .3s cubic-bezier(0,0,.25,1) 0s,top .3s cubic-bezier(0,0,.25,1) 0s;-moz-transition:left .3s cubic-bezier(0,0,.25,1) 0s,top .3s cubic-bezier(0,0,.25,1) 0s;-o-transition:left .3s cubic-bezier(0,0,.25,1) 0s,top .3s cubic-bezier(0,0,.25,1) 0s;transition:left .3s cubic-bezier(0,0,.25,1) 0s,top .3s cubic-bezier(0,0,.25,1) 0s}.lg-outer .lg-item.lg-complete.lg-zoomable .lg-img-wrap{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden}.lg-outer .lg-item.lg-complete.lg-zoomable .lg-image{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);-webkit-transition:-webkit-transform .3s cubic-bezier(0,0,.25,1) 0s,opacity .15s!important;-moz-transition:-moz-transform .3s cubic-bezier(0,0,.25,1) 0s,opacity .15s!important;-o-transition:-o-transform .3s cubic-bezier(0,0,.25,1) 0s,opacity .15s!important;transition:transform .3s cubic-bezier(0,0,.25,1) 0s,opacity .15s!important;-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden}#lg-zoom-in:after{content:"\e311"}#lg-actual-size{font-size:20px}#lg-actual-size:after{content:"\e033"}#lg-zoom-out{opacity:.5;pointer-events:none}#lg-zoom-out:after{content:"\e312"}.lg-zoomed #lg-zoom-out{opacity:1;pointer-events:auto}.lg-outer .lg-pager-outer{bottom:60px;left:0;position:absolute;right:0;text-align:center;z-index:1080;height:10px}.lg-outer .lg-pager-outer.lg-pager-hover .lg-pager-cont{overflow:visible}.lg-outer .lg-pager-cont{cursor:pointer;display:inline-block;overflow:hidden;position:relative;vertical-align:top;margin:0 5px}.lg-outer .lg-pager-cont:hover .lg-pager-thumb-cont{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.lg-outer .lg-pager-cont.lg-pager-active .lg-pager{box-shadow:0 0 0 2px #fff inset}.lg-outer .lg-pager-thumb-cont{background-color:#fff;color:#FFF;bottom:100%;height:83px;left:0;margin-bottom:20px;margin-left:-60px;opacity:0;padding:5px;position:absolute;width:120px;border-radius:3px;-webkit-transition:opacity .15s ease 0s,-webkit-transform .15s ease 0s;-moz-transition:opacity .15s ease 0s,-moz-transform .15s ease 0s;-o-transition:opacity .15s ease 0s,-o-transform .15s ease 0s;transition:opacity .15s ease 0s,transform .15s ease 0s;-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}.lg-outer .lg-pager-thumb-cont img{width:100%;height:100%}.lg-outer .lg-pager{background-color:rgba(255,255,255,.5);border-radius:50%;box-shadow:0 0 0 8px rgba(255,255,255,.7) inset;display:block;height:12px;-webkit-transition:box-shadow .3s ease 0s;-o-transition:box-shadow .3s ease 0s;transition:box-shadow .3s ease 0s;width:12px}.lg-outer .lg-pager:focus,.lg-outer .lg-pager:hover{box-shadow:0 0 0 8px #fff inset}.lg-outer .lg-caret{border-left:10px solid transparent;border-right:10px solid transparent;border-top:10px dashed;bottom:-10px;display:inline-block;height:0;left:50%;margin-left:-5px;position:absolute;vertical-align:middle;width:0}.lg-fullscreen:after{content:"\e20c"}.lg-fullscreen-on .lg-fullscreen:after{content:"\e20d"}.lg-outer #lg-dropdown-overlay{background-color:rgba(0,0,0,.25);bottom:0;cursor:default;left:0;position:fixed;right:0;top:0;z-index:1081;opacity:0;visibility:hidden;-webkit-transition:visibility 0s linear .18s,opacity .18s linear 0s;-o-transition:visibility 0s linear .18s,opacity .18s linear 0s;transition:visibility 0s linear .18s,opacity .18s linear 0s}.lg-outer.lg-dropdown-active #lg-dropdown-overlay,.lg-outer.lg-dropdown-active .lg-dropdown{-webkit-transition-delay:0s;transition-delay:0s;-moz-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1;visibility:visible}.lg-outer.lg-dropdown-active #lg-share{color:#FFF}.lg-outer .lg-dropdown{background-color:#fff;border-radius:2px;font-size:14px;list-style-type:none;margin:0;padding:10px 0;position:absolute;right:0;text-align:left;top:50px;opacity:0;visibility:hidden;-moz-transform:translate3d(0,5px,0);-o-transform:translate3d(0,5px,0);-ms-transform:translate3d(0,5px,0);-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0);-webkit-transition:-webkit-transform .18s linear 0s,visibility 0s linear .5s,opacity .18s linear 0s;-moz-transition:-moz-transform .18s linear 0s,visibility 0s linear .5s,opacity .18s linear 0s;-o-transition:-o-transform .18s linear 0s,visibility 0s linear .5s,opacity .18s linear 0s;transition:transform .18s linear 0s,visibility 0s linear .5s,opacity .18s linear 0s}.lg-outer .lg-dropdown:after{content:"";display:block;height:0;width:0;position:absolute;border:8px solid transparent;border-bottom-color:#FFF;right:16px;top:-16px}.lg-outer .lg-dropdown>li:last-child{margin-bottom:0}.lg-outer .lg-dropdown>li:hover .lg-icon,.lg-outer .lg-dropdown>li:hover a{color:#333}.lg-outer .lg-dropdown a{color:#333;display:block;white-space:pre;padding:4px 12px;font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px}.lg-outer .lg-dropdown a:hover{background-color:rgba(0,0,0,.07)}.lg-outer .lg-dropdown .lg-dropdown-text{display:inline-block;line-height:1;margin-top:-3px;vertical-align:middle}.lg-outer .lg-dropdown .lg-icon{color:#333;display:inline-block;float:none;font-size:20px;height:auto;line-height:1;margin-right:8px;padding:0;vertical-align:middle;width:auto}.lg-outer,.lg-outer .lg,.lg-outer .lg-inner{height:100%;width:100%}.lg-outer #lg-share{position:relative}.lg-outer #lg-share:after{content:"\e80d"}.lg-outer #lg-share-facebook .lg-icon{color:#3b5998}.lg-outer #lg-share-facebook .lg-icon:after{content:"\e904"}.lg-outer #lg-share-twitter .lg-icon{color:#00aced}.lg-outer #lg-share-twitter .lg-icon:after{content:"\e907"}.lg-outer #lg-share-googleplus .lg-icon{color:#dd4b39}.lg-outer #lg-share-googleplus .lg-icon:after{content:"\e905"}.lg-outer #lg-share-pinterest .lg-icon{color:#cb2027}.lg-outer #lg-share-pinterest .lg-icon:after{content:"\e906"}.lg-outer .lg-img-rotate{position:absolute;padding:0 5px;left:0;right:0;top:0;bottom:0;-webkit-transition:-webkit-transform .3s cubic-bezier(.32,0,.67,0) 0s;-moz-transition:-moz-transform .3s cubic-bezier(.32,0,.67,0) 0s;-o-transition:-o-transform .3s cubic-bezier(.32,0,.67,0) 0s;transition:transform .3s cubic-bezier(.32,0,.67,0) 0s}.lg-rotate-left:after{content:"\e900"}.lg-rotate-right:after{content:"\e901"}.lg-icon.lg-flip-hor,.lg-icon.lg-flip-ver{font-size:26px}.lg-flip-hor:after{content:"\e902"}.lg-flip-ver:after{content:"\e903"}.lg-group:after,.lg-group:before{display:table;content:"";line-height:0}.lg-group:after{clear:both}.lg-outer{position:fixed;top:0;left:0;z-index:1050;opacity:0;outline:0;-webkit-transition:opacity .15s ease 0s;-o-transition:opacity .15s ease 0s;transition:opacity .15s ease 0s}.lg-outer *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.lg-outer.lg-visible{opacity:1}.lg-outer.lg-css3 .lg-item.lg-current,.lg-outer.lg-css3 .lg-item.lg-next-slide,.lg-outer.lg-css3 .lg-item.lg-prev-slide{-webkit-transition-duration:inherit!important;transition-duration:inherit!important;-webkit-transition-timing-function:inherit!important;transition-timing-function:inherit!important}.lg-outer.lg-css3.lg-dragging .lg-item.lg-current,.lg-outer.lg-css3.lg-dragging .lg-item.lg-next-slide,.lg-outer.lg-css3.lg-dragging .lg-item.lg-prev-slide{-webkit-transition-duration:0s!important;transition-duration:0s!important;opacity:1}.lg-outer.lg-grab img.lg-object{cursor:-webkit-grab;cursor:-moz-grab;cursor:-o-grab;cursor:-ms-grab;cursor:grab}.lg-outer.lg-grabbing img.lg-object{cursor:move;cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:-o-grabbing;cursor:-ms-grabbing;cursor:grabbing}.lg-outer .lg{position:relative;overflow:hidden;margin-left:auto;margin-right:auto;max-width:100%;max-height:100%}.lg-outer .lg-inner{position:absolute;left:0;top:0;white-space:nowrap}.lg-outer .lg-item{background:url(../img/loading.gif) center center no-repeat;display:none!important}.lg-outer.lg-css .lg-current,.lg-outer.lg-css3 .lg-current,.lg-outer.lg-css3 .lg-next-slide,.lg-outer.lg-css3 .lg-prev-slide{display:inline-block!important}.lg-outer .lg-img-wrap,.lg-outer .lg-item{display:inline-block;text-align:center;position:absolute;width:100%;height:100%}.lg-outer .lg-img-wrap:before,.lg-outer .lg-item:before{content:"";display:inline-block;height:50%;width:1px;margin-right:-1px}.lg-outer .lg-img-wrap{position:absolute;padding:0 5px;left:0;right:0;top:0;bottom:0}.lg-outer .lg-item.lg-complete{background-image:none}.lg-outer .lg-item.lg-current{z-index:1060}.lg-outer .lg-image{display:inline-block;vertical-align:middle;max-width:100%;max-height:100%;width:auto!important;height:auto!important}.lg-outer.lg-show-after-load .lg-item .lg-object,.lg-outer.lg-show-after-load .lg-item .lg-video-play{opacity:0;-webkit-transition:opacity .15s ease 0s;-o-transition:opacity .15s ease 0s;transition:opacity .15s ease 0s}.lg-outer.lg-show-after-load .lg-item.lg-complete .lg-object,.lg-outer.lg-show-after-load .lg-item.lg-complete .lg-video-play{opacity:1}.lg-outer .lg-empty-html,.lg-outer.lg-hide-download #lg-download{display:none}.lg-backdrop{position:fixed;top:0;left:0;right:0;bottom:0;z-index:1040;background-color:#000;opacity:0;-webkit-transition:opacity .15s ease 0s;-o-transition:opacity .15s ease 0s;transition:opacity .15s ease 0s}.lg-backdrop.in{opacity:1}.lg-css3.lg-no-trans .lg-current,.lg-css3.lg-no-trans .lg-next-slide,.lg-css3.lg-no-trans .lg-prev-slide{-webkit-transition:none 0s ease 0s!important;-moz-transition:none 0s ease 0s!important;-o-transition:none 0s ease 0s!important;transition:none 0s ease 0s!important}.lg-css3.lg-use-css3 .lg-item,.lg-css3.lg-use-left .lg-item{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden}.lg-css3.lg-fade .lg-item{opacity:0}.lg-css3.lg-fade .lg-item.lg-current{opacity:1}.lg-css3.lg-fade .lg-item.lg-current,.lg-css3.lg-fade .lg-item.lg-next-slide,.lg-css3.lg-fade .lg-item.lg-prev-slide{-webkit-transition:opacity .1s ease 0s;-moz-transition:opacity .1s ease 0s;-o-transition:opacity .1s ease 0s;transition:opacity .1s ease 0s}.lg-css3.lg-slide.lg-use-css3 .lg-item{opacity:0}.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-prev-slide{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-next-slide{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-current{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-current,.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-next-slide,.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-moz-transition:-moz-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s}.lg-css3.lg-slide.lg-use-left .lg-item{opacity:0;position:absolute;left:0}.lg-css3.lg-slide.lg-use-left .lg-item.lg-prev-slide{left:-100%}.lg-css3.lg-slide.lg-use-left .lg-item.lg-next-slide{left:100%}.lg-css3.lg-slide.lg-use-left .lg-item.lg-current{left:0;opacity:1}.lg-css3.lg-slide.lg-use-left .lg-item.lg-current,.lg-css3.lg-slide.lg-use-left .lg-item.lg-next-slide,.lg-css3.lg-slide.lg-use-left .lg-item.lg-prev-slide{-webkit-transition:left 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-moz-transition:left 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:left 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:left 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s}
\ No newline at end of file
+@font-face{font-family:lg;src:url(../assets/fonts/lg.ttf?22t19m) format("truetype"),url(../assets/fonts/lg.woff?22t19m) format("woff"),url(../assets/fonts/lg.svg?22t19m#lg) format("svg");font-weight:400;font-style:normal;font-display:block}.lg-icon{font-family:lg!important;speak:never;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.lg-actions .lg-next,.lg-actions .lg-prev{border-radius:2px;color:#999;cursor:pointer;display:block;font-size:22px;margin-top:-10px;padding:8px 10px 9px;position:absolute;top:50%;z-index:1080;outline:0;border:none;background-color:transparent}.lg-actions .lg-next.disabled,.lg-actions .lg-prev.disabled{pointer-events:none;opacity:.5}.lg-actions .lg-next:hover,.lg-actions .lg-prev:hover{color:#FFF}.lg-actions .lg-next{right:20px}.lg-actions .lg-next:before{content:"\e095"}.lg-actions .lg-prev{left:20px}.lg-actions .lg-prev:after{content:"\e094"}@-webkit-keyframes lg-right-end{0%,100%{left:0}50%{left:-30px}}@-moz-keyframes lg-right-end{0%,100%{left:0}50%{left:-30px}}@-ms-keyframes lg-right-end{0%,100%{left:0}50%{left:-30px}}@keyframes lg-right-end{0%,100%{left:0}50%{left:-30px}}@-webkit-keyframes lg-left-end{0%,100%{left:0}50%{left:30px}}@-moz-keyframes lg-left-end{0%,100%{left:0}50%{left:30px}}@-ms-keyframes lg-left-end{0%,100%{left:0}50%{left:30px}}@keyframes lg-left-end{0%,100%{left:0}50%{left:30px}}.lg-outer.lg-right-end .lg-object{-webkit-animation:lg-right-end .3s;-o-animation:lg-right-end .3s;animation:lg-right-end .3s;position:relative}.lg-outer.lg-left-end .lg-object{-webkit-animation:lg-left-end .3s;-o-animation:lg-left-end .3s;animation:lg-left-end .3s;position:relative}.lg-toolbar{z-index:1082;left:0;position:absolute;top:0;width:100%;background-color:rgba(0,0,0,.45)}.lg-toolbar .lg-icon{color:#999;cursor:pointer;float:right;font-size:24px;height:47px;line-height:27px;padding:10px 0;text-align:center;width:50px;text-decoration:none!important;outline:0;background:0 0;border:none;box-shadow:none;-webkit-transition:color .2s linear;-o-transition:color .2s linear;transition:color .2s linear}.lg-toolbar .lg-icon:hover{color:#FFF}.lg-toolbar .lg-close:after{content:"\e070"}.lg-toolbar .lg-download:after{content:"\e0f2"}.lg-sub-html{background-color:rgba(0,0,0,.45);bottom:0;color:#EEE;font-size:16px;left:0;padding:10px 40px;position:fixed;right:0;text-align:center;z-index:1080}.lg-sub-html h4{margin:0;font-size:13px;font-weight:700}.lg-sub-html p{font-size:12px;margin:5px 0 0}#lg-counter{color:#999;display:inline-block;font-size:16px;padding-left:20px;padding-top:12px;vertical-align:middle}.lg-next,.lg-prev,.lg-toolbar{opacity:1;-webkit-transition:-webkit-transform .35s cubic-bezier(0,0,.25,1) 0s,opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear;-moz-transition:-moz-transform .35s cubic-bezier(0,0,.25,1) 0s,opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear;-o-transition:-o-transform .35s cubic-bezier(0,0,.25,1) 0s,opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear;transition:transform .35s cubic-bezier(0,0,.25,1) 0s,opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear}.lg-hide-items .lg-prev{opacity:0;-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}.lg-hide-items .lg-next{opacity:0;-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}.lg-hide-items .lg-toolbar{opacity:0;-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}body:not(.lg-from-hash) .lg-outer.lg-start-zoom .lg-object{-webkit-transform:scale3d(.5,.5,.5);transform:scale3d(.5,.5,.5);opacity:0;-webkit-transition:-webkit-transform 250ms cubic-bezier(0,0,.25,1) 0s,opacity 250ms cubic-bezier(0,0,.25,1)!important;-moz-transition:-moz-transform 250ms cubic-bezier(0,0,.25,1) 0s,opacity 250ms cubic-bezier(0,0,.25,1)!important;-o-transition:-o-transform 250ms cubic-bezier(0,0,.25,1) 0s,opacity 250ms cubic-bezier(0,0,.25,1)!important;transition:transform 250ms cubic-bezier(0,0,.25,1) 0s,opacity 250ms cubic-bezier(0,0,.25,1)!important;-webkit-transform-origin:50% 50%;-moz-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}body:not(.lg-from-hash) .lg-outer.lg-start-zoom .lg-item.lg-complete .lg-object{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);opacity:1}.lg-outer .lg-thumb-outer{background-color:#0D0A0A;bottom:0;position:absolute;width:100%;z-index:1080;max-height:350px;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);-webkit-transition:-webkit-transform .25s cubic-bezier(0,0,.25,1) 0s;-moz-transition:-moz-transform .25s cubic-bezier(0,0,.25,1) 0s;-o-transition:-o-transform .25s cubic-bezier(0,0,.25,1) 0s;transition:transform .25s cubic-bezier(0,0,.25,1) 0s}.lg-outer .lg-thumb-outer.lg-grab .lg-thumb-item{cursor:-webkit-grab;cursor:-moz-grab;cursor:-o-grab;cursor:-ms-grab;cursor:grab}.lg-outer .lg-thumb-outer.lg-grabbing .lg-thumb-item{cursor:move;cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:-o-grabbing;cursor:-ms-grabbing;cursor:grabbing}.lg-outer .lg-thumb-outer.lg-dragging .lg-thumb{-webkit-transition-duration:0s!important;transition-duration:0s!important}.lg-outer.lg-thumb-open .lg-thumb-outer{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.lg-outer .lg-thumb{padding:10px 0;height:100%;margin-bottom:-5px}.lg-outer .lg-thumb-item{cursor:pointer;float:left;overflow:hidden;height:100%;border:2px solid #FFF;border-radius:4px;margin-bottom:5px}@media (min-width:1025px){.lg-outer .lg-thumb-item{-webkit-transition:border-color .25s ease;-o-transition:border-color .25s ease;transition:border-color .25s ease}}.lg-outer .lg-thumb-item.active,.lg-outer .lg-thumb-item:hover{border-color:#a90707}.lg-outer .lg-thumb-item img{width:100%;height:100%;object-fit:cover}.lg-outer.lg-has-thumb .lg-item{padding-bottom:120px}.lg-outer.lg-can-toggle .lg-item{padding-bottom:0}.lg-outer.lg-pull-caption-up .lg-sub-html{-webkit-transition:bottom .25s ease;-o-transition:bottom .25s ease;transition:bottom .25s ease}.lg-outer.lg-pull-caption-up.lg-thumb-open .lg-sub-html{bottom:100px}.lg-outer .lg-toggle-thumb{background-color:#0D0A0A;border-radius:2px 2px 0 0;color:#999;cursor:pointer;font-size:24px;height:39px;line-height:27px;padding:5px 0;position:absolute;right:20px;text-align:center;top:-39px;width:50px;outline:0;border:none}.lg-outer .lg-toggle-thumb:after{content:"\e1ff"}.lg-outer .lg-toggle-thumb:hover{color:#FFF}.lg-outer .lg-video-cont{display:inline-block;vertical-align:middle;max-width:1140px;max-height:100%;width:100%;padding:0 5px}.lg-outer .lg-video{width:100%;height:0;padding-bottom:56.25%;overflow:hidden;position:relative}.lg-outer .lg-video .lg-object{display:inline-block;position:absolute;top:0;left:0;width:100%!important;height:100%!important}.lg-outer .lg-video .lg-video-play{width:84px;height:59px;position:absolute;left:50%;top:50%;margin-left:-42px;margin-top:-30px;z-index:1080;cursor:pointer}.lg-outer .lg-has-vimeo .lg-video-play{background:url(../img/vimeo-play.png) no-repeat}.lg-outer .lg-has-vimeo:hover .lg-video-play{background:url(../img/vimeo-play.png) 0 -58px no-repeat}.lg-outer .lg-has-html5 .lg-video-play{background:url(../img/video-play.png) no-repeat;height:64px;margin-left:-32px;margin-top:-32px;width:64px;opacity:.8}.lg-outer .lg-has-html5:hover .lg-video-play{opacity:1}.lg-outer .lg-has-youtube .lg-video-play{background:url(../img/youtube-play.png) no-repeat}.lg-outer .lg-has-youtube:hover .lg-video-play{background:url(../img/youtube-play.png) 0 -60px no-repeat}.lg-outer .lg-video-object{width:100%!important;height:100%!important;position:absolute;top:0;left:0}.lg-outer .lg-has-video .lg-video-object{visibility:hidden}.lg-outer .lg-has-video.lg-video-playing .lg-object,.lg-outer .lg-has-video.lg-video-playing .lg-video-play{display:none}.lg-outer .lg-has-video.lg-video-playing .lg-video-object{visibility:visible}.lg-progress-bar{background-color:#333;height:5px;left:0;position:absolute;top:0;width:100%;z-index:1083;opacity:0;-webkit-transition:opacity 80ms ease 0s;-moz-transition:opacity 80ms ease 0s;-o-transition:opacity 80ms ease 0s;transition:opacity 80ms ease 0s}.lg-progress-bar .lg-progress{background-color:#a90707;height:5px;width:0}.lg-progress-bar.lg-start .lg-progress{width:100%}.lg-show-autoplay .lg-progress-bar{opacity:1}.lg-autoplay-button:after{content:"\e01d"}.lg-show-autoplay .lg-autoplay-button:after{content:"\e01a"}.lg-outer.lg-css3.lg-zoom-dragging .lg-item.lg-complete.lg-zoomable .lg-image,.lg-outer.lg-css3.lg-zoom-dragging .lg-item.lg-complete.lg-zoomable .lg-img-wrap{-webkit-transition-duration:0s;transition-duration:0s}.lg-outer.lg-use-transition-for-zoom .lg-item.lg-complete.lg-zoomable .lg-img-wrap{-webkit-transition:-webkit-transform .3s cubic-bezier(0,0,.25,1) 0s;-moz-transition:-moz-transform .3s cubic-bezier(0,0,.25,1) 0s;-o-transition:-o-transform .3s cubic-bezier(0,0,.25,1) 0s;transition:transform .3s cubic-bezier(0,0,.25,1) 0s}.lg-outer.lg-use-left-for-zoom .lg-item.lg-complete.lg-zoomable .lg-img-wrap{-webkit-transition:left .3s cubic-bezier(0,0,.25,1) 0s,top .3s cubic-bezier(0,0,.25,1) 0s;-moz-transition:left .3s cubic-bezier(0,0,.25,1) 0s,top .3s cubic-bezier(0,0,.25,1) 0s;-o-transition:left .3s cubic-bezier(0,0,.25,1) 0s,top .3s cubic-bezier(0,0,.25,1) 0s;transition:left .3s cubic-bezier(0,0,.25,1) 0s,top .3s cubic-bezier(0,0,.25,1) 0s}.lg-outer .lg-item.lg-complete.lg-zoomable .lg-img-wrap{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden}.lg-outer .lg-item.lg-complete.lg-zoomable .lg-image{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);-webkit-transition:-webkit-transform .3s cubic-bezier(0,0,.25,1) 0s,opacity .15s!important;-moz-transition:-moz-transform .3s cubic-bezier(0,0,.25,1) 0s,opacity .15s!important;-o-transition:-o-transform .3s cubic-bezier(0,0,.25,1) 0s,opacity .15s!important;transition:transform .3s cubic-bezier(0,0,.25,1) 0s,opacity .15s!important;-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden}#lg-zoom-in:after{content:"\e311"}#lg-actual-size{font-size:20px}#lg-actual-size:after{content:"\e033"}#lg-zoom-out{opacity:.5;pointer-events:none}#lg-zoom-out:after{content:"\e312"}.lg-zoomed #lg-zoom-out{opacity:1;pointer-events:auto}.lg-outer .lg-pager-outer{bottom:60px;left:0;position:absolute;right:0;text-align:center;z-index:1080;height:10px}.lg-outer .lg-pager-outer.lg-pager-hover .lg-pager-cont{overflow:visible}.lg-outer .lg-pager-cont{cursor:pointer;display:inline-block;overflow:hidden;position:relative;vertical-align:top;margin:0 5px}.lg-outer .lg-pager-cont:hover .lg-pager-thumb-cont{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.lg-outer .lg-pager-cont.lg-pager-active .lg-pager{box-shadow:0 0 0 2px #fff inset}.lg-outer .lg-pager-thumb-cont{background-color:#fff;color:#FFF;bottom:100%;height:83px;left:0;margin-bottom:20px;margin-left:-60px;opacity:0;padding:5px;position:absolute;width:120px;border-radius:3px;-webkit-transition:opacity .15s ease 0s,-webkit-transform .15s ease 0s;-moz-transition:opacity .15s ease 0s,-moz-transform .15s ease 0s;-o-transition:opacity .15s ease 0s,-o-transform .15s ease 0s;transition:opacity .15s ease 0s,transform .15s ease 0s;-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}.lg-outer .lg-pager-thumb-cont img{width:100%;height:100%}.lg-outer .lg-pager{background-color:rgba(255,255,255,.5);border-radius:50%;box-shadow:0 0 0 8px rgba(255,255,255,.7) inset;display:block;height:12px;-webkit-transition:box-shadow .3s ease 0s;-o-transition:box-shadow .3s ease 0s;transition:box-shadow .3s ease 0s;width:12px}.lg-outer .lg-pager:focus,.lg-outer .lg-pager:hover{box-shadow:0 0 0 8px #fff inset}.lg-outer .lg-caret{border-left:10px solid transparent;border-right:10px solid transparent;border-top:10px dashed;bottom:-10px;display:inline-block;height:0;left:50%;margin-left:-5px;position:absolute;vertical-align:middle;width:0}.lg-fullscreen:after{content:"\e20c"}.lg-fullscreen-on .lg-fullscreen:after{content:"\e20d"}.lg-outer #lg-dropdown-overlay{background-color:rgba(0,0,0,.25);bottom:0;cursor:default;left:0;position:fixed;right:0;top:0;z-index:1081;opacity:0;visibility:hidden;-webkit-transition:visibility 0s linear .18s,opacity .18s linear 0s;-o-transition:visibility 0s linear .18s,opacity .18s linear 0s;transition:visibility 0s linear .18s,opacity .18s linear 0s}.lg-outer.lg-dropdown-active #lg-dropdown-overlay,.lg-outer.lg-dropdown-active .lg-dropdown{-webkit-transition-delay:0s;transition-delay:0s;-moz-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1;visibility:visible}.lg-outer.lg-dropdown-active #lg-share{color:#FFF}.lg-outer .lg-dropdown{background-color:#fff;border-radius:2px;font-size:14px;list-style-type:none;margin:0;padding:10px 0;position:absolute;right:0;text-align:left;top:50px;opacity:0;visibility:hidden;-moz-transform:translate3d(0,5px,0);-o-transform:translate3d(0,5px,0);-ms-transform:translate3d(0,5px,0);-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0);-webkit-transition:-webkit-transform .18s linear 0s,visibility 0s linear .5s,opacity .18s linear 0s;-moz-transition:-moz-transform .18s linear 0s,visibility 0s linear .5s,opacity .18s linear 0s;-o-transition:-o-transform .18s linear 0s,visibility 0s linear .5s,opacity .18s linear 0s;transition:transform .18s linear 0s,visibility 0s linear .5s,opacity .18s linear 0s}.lg-outer .lg-dropdown:after{content:"";display:block;height:0;width:0;position:absolute;border:8px solid transparent;border-bottom-color:#FFF;right:16px;top:-16px}.lg-outer .lg-dropdown>li:last-child{margin-bottom:0}.lg-outer .lg-dropdown>li:hover .lg-icon,.lg-outer .lg-dropdown>li:hover a{color:#333}.lg-outer .lg-dropdown a{color:#333;display:block;white-space:pre;padding:4px 12px;font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px}.lg-outer .lg-dropdown a:hover{background-color:rgba(0,0,0,.07)}.lg-outer .lg-dropdown .lg-dropdown-text{display:inline-block;line-height:1;margin-top:-3px;vertical-align:middle}.lg-outer .lg-dropdown .lg-icon{color:#333;display:inline-block;float:none;font-size:20px;height:auto;line-height:1;margin-right:8px;padding:0;vertical-align:middle;width:auto}.lg-outer,.lg-outer .lg,.lg-outer .lg-inner{height:100%;width:100%}.lg-outer #lg-share{position:relative}.lg-outer #lg-share:after{content:"\e80d"}.lg-outer #lg-share-facebook .lg-icon{color:#3b5998}.lg-outer #lg-share-facebook .lg-icon:after{content:"\e904"}.lg-outer #lg-share-twitter .lg-icon{color:#00aced}.lg-outer #lg-share-twitter .lg-icon:after{content:"\e907"}.lg-outer #lg-share-googleplus .lg-icon{color:#dd4b39}.lg-outer #lg-share-googleplus .lg-icon:after{content:"\e905"}.lg-outer #lg-share-pinterest .lg-icon{color:#cb2027}.lg-outer #lg-share-pinterest .lg-icon:after{content:"\e906"}.lg-outer .lg-img-rotate{position:absolute;padding:0 5px;left:0;right:0;top:0;bottom:0;-webkit-transition:-webkit-transform .3s cubic-bezier(.32,0,.67,0) 0s;-moz-transition:-moz-transform .3s cubic-bezier(.32,0,.67,0) 0s;-o-transition:-o-transform .3s cubic-bezier(.32,0,.67,0) 0s;transition:transform .3s cubic-bezier(.32,0,.67,0) 0s}.lg-rotate-left:after{content:"\e900"}.lg-rotate-right:after{content:"\e901"}.lg-icon.lg-flip-hor,.lg-icon.lg-flip-ver{font-size:26px}.lg-flip-hor:after{content:"\e902"}.lg-flip-ver:after{content:"\e903"}.lg-group:after,.lg-group:before{display:table;content:"";line-height:0}.lg-group:after{clear:both}.lg-outer{position:fixed;top:0;left:0;z-index:1050;opacity:0;outline:0;-webkit-transition:opacity .15s ease 0s;-o-transition:opacity .15s ease 0s;transition:opacity .15s ease 0s}.lg-outer *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.lg-outer.lg-visible{opacity:1}.lg-outer.lg-css3 .lg-item.lg-current,.lg-outer.lg-css3 .lg-item.lg-next-slide,.lg-outer.lg-css3 .lg-item.lg-prev-slide{-webkit-transition-duration:inherit!important;transition-duration:inherit!important;-webkit-transition-timing-function:inherit!important;transition-timing-function:inherit!important}.lg-outer.lg-css3.lg-dragging .lg-item.lg-current,.lg-outer.lg-css3.lg-dragging .lg-item.lg-next-slide,.lg-outer.lg-css3.lg-dragging .lg-item.lg-prev-slide{-webkit-transition-duration:0s!important;transition-duration:0s!important;opacity:1}.lg-outer.lg-grab img.lg-object{cursor:-webkit-grab;cursor:-moz-grab;cursor:-o-grab;cursor:-ms-grab;cursor:grab}.lg-outer.lg-grabbing img.lg-object{cursor:move;cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:-o-grabbing;cursor:-ms-grabbing;cursor:grabbing}.lg-outer .lg{position:relative;overflow:hidden;margin-left:auto;margin-right:auto;max-width:100%;max-height:100%}.lg-outer .lg-inner{position:absolute;left:0;top:0;white-space:nowrap}.lg-outer .lg-item{background:url(../img/loading.gif) center center no-repeat;display:none!important}.lg-outer.lg-css .lg-current,.lg-outer.lg-css3 .lg-current,.lg-outer.lg-css3 .lg-next-slide,.lg-outer.lg-css3 .lg-prev-slide{display:inline-block!important}.lg-outer .lg-img-wrap,.lg-outer .lg-item{display:inline-block;text-align:center;position:absolute;width:100%;height:100%}.lg-outer .lg-img-wrap:before,.lg-outer .lg-item:before{content:"";display:inline-block;height:50%;width:1px;margin-right:-1px}.lg-outer .lg-img-wrap{position:absolute;padding:0 5px;left:0;right:0;top:0;bottom:0}.lg-outer .lg-item.lg-complete{background-image:none}.lg-outer .lg-item.lg-current{z-index:1060}.lg-outer .lg-image{display:inline-block;vertical-align:middle;max-width:100%;max-height:100%;width:auto!important;height:auto!important}.lg-outer.lg-show-after-load .lg-item .lg-object,.lg-outer.lg-show-after-load .lg-item .lg-video-play{opacity:0;-webkit-transition:opacity .15s ease 0s;-o-transition:opacity .15s ease 0s;transition:opacity .15s ease 0s}.lg-outer.lg-show-after-load .lg-item.lg-complete .lg-object,.lg-outer.lg-show-after-load .lg-item.lg-complete .lg-video-play{opacity:1}.lg-outer .lg-empty-html,.lg-outer.lg-hide-download #lg-download{display:none}.lg-backdrop{position:fixed;top:0;left:0;right:0;bottom:0;z-index:1040;background-color:#000;opacity:0;-webkit-transition:opacity .15s ease 0s;-o-transition:opacity .15s ease 0s;transition:opacity .15s ease 0s}.lg-backdrop.in{opacity:1}.lg-css3.lg-no-trans .lg-current,.lg-css3.lg-no-trans .lg-next-slide,.lg-css3.lg-no-trans .lg-prev-slide{-webkit-transition:none 0s ease 0s!important;-moz-transition:none 0s ease 0s!important;-o-transition:none 0s ease 0s!important;transition:none 0s ease 0s!important}.lg-css3.lg-use-css3 .lg-item,.lg-css3.lg-use-left .lg-item{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden}.lg-css3.lg-fade .lg-item{opacity:0}.lg-css3.lg-fade .lg-item.lg-current{opacity:1}.lg-css3.lg-fade .lg-item.lg-current,.lg-css3.lg-fade .lg-item.lg-next-slide,.lg-css3.lg-fade .lg-item.lg-prev-slide{-webkit-transition:opacity .1s ease 0s;-moz-transition:opacity .1s ease 0s;-o-transition:opacity .1s ease 0s;transition:opacity .1s ease 0s}.lg-css3.lg-slide.lg-use-css3 .lg-item{opacity:0}.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-prev-slide{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-next-slide{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-current{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-current,.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-next-slide,.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-moz-transition:-moz-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s}.lg-css3.lg-slide.lg-use-left .lg-item{opacity:0;position:absolute;left:0}.lg-css3.lg-slide.lg-use-left .lg-item.lg-prev-slide{left:-100%}.lg-css3.lg-slide.lg-use-left .lg-item.lg-next-slide{left:100%}.lg-css3.lg-slide.lg-use-left .lg-item.lg-current{left:0;opacity:1}.lg-css3.lg-slide.lg-use-left .lg-item.lg-current,.lg-css3.lg-slide.lg-use-left .lg-item.lg-next-slide,.lg-css3.lg-slide.lg-use-left .lg-item.lg-prev-slide{-webkit-transition:left 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-moz-transition:left 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:left 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:left 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s}
\ No newline at end of file
diff --git a/docs/stylesheets/openapi.css b/docs/stylesheets/openapi.css
new file mode 100644
index 0000000000..f0bffb632d
--- /dev/null
+++ b/docs/stylesheets/openapi.css
@@ -0,0 +1 @@
+#openapi{position:relative;background:white}#openapi h1{display:none}#openapi .md-typeset h1,#openapi .md-content__button,#openapi .md-footer{display:none}#openapi .md-main__inner{max-width:100%;margin:0}#openapi .redoc-wrap{background:white}#openapi .redoc-wrap>div:last-of-type{background:none !important}#openapi .redoc-wrap .sc-iGgWBj.sc-gsFSXq.lbpUdJ.bOFhJE{padding:20px;border-radius:20px}#openapi .redoc-wrap .sc-ikkxIA.daqcVd{margin:0 12px;padding:0px;padding-left:24px}#openapi .redoc-wrap tr:first-of-type>.sc-dLMFU,#openapi .redoc-wrap tr.last>.sc-dLMFU,#openapi .redoc-wrap .bvNJXm{background:none;border:none}#openapi .redoc-wrap .sc-gFqAkR{visibility:hidden;display:none}#openapi .redoc-wrap .property-name{font-weight:bold;font-size:15px}#openapi .redoc-wrap .examples code{font-family:monospace;font-size:13px !important;background:none !important;color:white !important}#openapi .redoc-wrap .examples code .token.punctuation{opacity:1 !important}#openapi .redoc-wrap .examples .tabs{background:white;margin:-20px;margin-bottom:22px;overflow:hidden;display:flex;padding:0;border:none;list-style-type:none;user-select:none}#openapi .redoc-wrap .examples .tabs li{color:#2d2e83;background:white;border-top:4px solid transparent;opacity:0.6;cursor:pointer;font-weight:bold;margin:0;padding:6px 16px}#openapi .redoc-wrap .examples .tabs li:hover{opacity:1}#openapi .redoc-wrap .examples .tabs li.active{opacity:1;border-top:4px solid #12005e;background:#e2e2e9;color:#12005e;border-top-left-radius:8px;border-top-right-radius:8px}#openapi .redoc-wrap .examples .jhTHfM,#openapi .redoc-wrap .examples h3{color:#12005e;font-weight:bold;font-size:14px}#openapi .redoc-wrap .examples.mode-try-it .response-samples,#openapi .redoc-wrap .examples.mode-try-it .request-samples{display:none}#openapi .redoc-wrap .examples:not(.mode-try-it) .try-it-wrapper{display:none}#openapi .redoc-wrap .examples .try-it-wrapper button{background:#5d4ff2;color:white;height:36px;font-weight:600;font-family:'Inter', sans-serif;border-radius:8px;padding:0px 16px;float:right;cursor:pointer;transition:background 6e2ms;margin:8px 0px}#openapi .redoc-wrap .examples .try-it-wrapper button:hover{background:#3b00bd}#openapi .redoc-wrap .examples .try-it-wrapper button:active{background:#140050}#openapi .redoc-wrap .examples .try-it-wrapper button:disabled{opacity:0.4}#openapi .redoc-wrap .examples .try-it-wrapper input{padding:4px;font-size:15px;border:1px solid #12005e;border-radius:4px;margin:2px 12px}#openapi .redoc-wrap .examples .try-it-wrapper label{display:inline-block;font-size:15px;font-weight:bold;min-width:85px;color:#11171a}#openapi .redoc-wrap .examples .try-it-wrapper .ui-spinner{position:relative !important;left:50%;top:24px}#openapi .redoc-wrap .examples .try-it-wrapper .results pre,#openapi .redoc-wrap .examples .try-it-wrapper .results .output,#openapi .redoc-wrap .examples .try-it-wrapper>code.curl{background:#11171a !important;padding:14px;position:static;min-width:100%;width:100%;display:block;border-radius:8px;color:white;font-family:monospace;font-size:11px;max-height:40vh;overflow:auto}#openapi .redoc-wrap .examples .try-it-wrapper .results pre.error,#openapi .redoc-wrap .examples .try-it-wrapper .results .output.error,#openapi .redoc-wrap .examples .try-it-wrapper>code.curl.error{background:red !important}#openapi .redoc-wrap .examples .try-it-wrapper .code-examples{margin-top:12px}#openapi .redoc-wrap .examples .try-it-wrapper .code-examples>ul{display:flex;padding:0;list-style-type:none;margin:0}#openapi .redoc-wrap .examples .try-it-wrapper .code-examples>ul>li{cursor:pointer;padding:2px 12px;border-top:4px solid transparent;margin:0px;background:transparent;border-top-left-radius:8px;border-top-right-radius:8px;font-weight:bold;color:#8182b5;transition:all 90ms ease-in-out}#openapi .redoc-wrap .examples .try-it-wrapper .code-examples>ul>li:hover{color:#12005e}#openapi .redoc-wrap .examples .try-it-wrapper .code-examples>ul>li.selected{border-top-color:#5d4ff2;background:#11171a;color:white}#openapi .redoc-wrap .examples .try-it-wrapper .code-examples>div>pre{background:#11171a !important;padding:14px;position:static;min-width:100%;width:100%;display:block;border-radius:8px;color:white;font-family:monospace;font-size:11px;max-height:40vh;overflow:auto;border-top-left-radius:0px;margin:0;white-space:break-spaces}#openapi .redoc-wrap .examples .try-it-wrapper .code-examples>div>pre:not(.selected){display:none}#openapi .redoc-wrap .region-picker{padding:16px 29px}#openapi h2::after{border-bottom:2px solid #2d2e83 !important}.ui-spinner{width:38px;height:38px;border:5px solid #d8d8e922;border-bottom-color:#5d4ff2;border-radius:50%;display:inline-block;box-sizing:border-box;animation:spinner-rotate 1s linear infinite;margin:12px;margin-left:-19px;margin-right:auto;position:absolute;left:50%;top:40vh}@keyframes spinner-rotate{0%{transform:rotate(0deg)}100%{transform:rotate(1turn)}}main>.md-grid{max-width:90vw}main .md-sidebar{display:none !important}main .gdNLsg{position:initial}main .kJndnU{position:absolute}main .kNjBFu:last-child{min-height:initial}main .menu-content{top:70px !important;border-radius:20px;width:353px;background:none}main .menu-content label:not(.active){background:none}main .menu-content>.scrollbar-container>ul{margin:0px}main div[data-role='search:results']{background:#F5F5FA;border-radius:8px}main div[role=search]{padding:5px 31px}main div[role=search] input{font-weight:normal;color:black;padding:10px 27px;font-size:110%;margin:6px -19px}main div[role=search] input::placeholder{font-weight:normal;color:black}main div[role=search] svg{position:relative;top:5px;width:18px;left:0}main ul.sc-iHmpnF{font-size:16px}main span.sc-ehixzo.CHBVM{padding:3px 6px;font-size:10px;margin-right:8px;height:18px;width:8ex}main ul.sc-iHmpnF.bQdsWB{padding:0;margin:0;font-size:10px;user-select:none}main ul.sc-iHmpnF.bQdsWB>li>ul>li>ul{margin-bottom:16px}main ul.sc-iHmpnF.bQdsWB>li>ul>li>ul>li{padding:0px;margin:0px}main ul.sc-iHmpnF.bQdsWB>li>ul>li>ul>li>label{padding:9px;margin:0px}main ul.sc-iHmpnF.bQdsWB>li>ul>li>ul>li>label .sc-eyvILC{font-size:13px;color:#21225F}main label.-depth0{padding:0px 9px;margin:8px}main label.-depth0 span.sc-eyvILC.cyMuFj{font-size:14px;font-weight:bold;color:#6D6E9C}main label.-depth1{display:flex;padding:6px;margin:0;padding-right:16px;align-items:center;padding-left:18px}main label.-depth1 span.sc-eyvILC.cyMuFj{font-size:14px;font-weight:normal;color:#21225F}main label.-depth1.active span.sc-eyvILC.cyMuFj{font-weight:bold}main .sc-kYxDKI.eoKbCJ{margin-left:0px}main ul.sc-iHmpnF.bKAJhU{display:none}main h2.copjkU{color:#2d2e83;font-size:20px;margin-top:30px;font-weight:bold}main .sc-dcJsrY.eVrqat .sc-kAyceB.XMnSL h2{font-size:28px;text-transform:uppercase}main .sc-dcJsrY.eVrqat .sc-kAyceB.XMnSL h2:after{border:none}main .sc-bpUBKd.-depth2>.sc-eyvILC{font-size:14px}main .sc-bpUBKd.-depth2.active{border-top-left-radius:8px;border-bottom-left-radius:8px;border-right:4px solid #2d2e83;background:#F5F5FA}main .sc-bpUBKd.-depth1.active{border-top-left-radius:8px;border-bottom-left-radius:8px;border-right:4px solid #2d2e83;background:#F5F5FA}main .sc-bpUBKd.-depth1:hover{border-top-left-radius:8px;border-bottom-left-radius:8px;background:#F5F5FAaa}main .bOFhJE{background-color:#e2e2e9}main .bOFhJE button.sc-iEXKAA{border-radius:8px}main .cJteCP>.react-tabs__tab-panel.react-tabs__tab-panel--selected{border-radius:8px;border-top-left-radius:0px}main .cJteCP>ul{margin:0px !important}main .cJteCP>ul>li{padding:5px 10px;display:inline-block;background-color:#11171a;cursor:pointer;text-align:center;outline:none;color:#ccc;min-width:60px;font-size:0.9em;font-weight:bold;border:none;border-top:4px solid;margin:0px !important;border-radius:0}main .cJteCP>ul>li:not([aria-selected=true]){border-top-color:transparent;background:none}main button.sc-gdyeKB p{margin:0px}main .sc-kzqdkY{clear:both}select{padding:6.5px 12px;margin:0px 12px;display:inline-flex;align-items:center;width:111px;cursor:pointer;background:url("data:image/svg+xml,") no-repeat #f8f9fc;background-position:calc(100% - 10px) center !important;-moz-appearance:none !important;-webkit-appearance:none !important;appearance:none !important;border:1px solid #cbcfe1;line-height:1.5;color:#21225f;border-radius:8px}
diff --git a/docs/stylesheets/poppins.min.css b/docs/stylesheets/poppins.min.css
index abe859cd38..51dd2323ae 100644
--- a/docs/stylesheets/poppins.min.css
+++ b/docs/stylesheets/poppins.min.css
@@ -4,7 +4,7 @@
font-family: 'Poppins';
font-style: normal;
font-weight: 200;
- src: url(/assets/fonts/Poppins-ExtraLight.ttf) format('opentype');
+ src: url(../assets/fonts/Poppins-ExtraLight.ttf) format('opentype');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@@ -13,7 +13,7 @@
font-family: 'Poppins';
font-style: normal;
font-weight: 400;
- src: url(/assets/fonts/Poppins-Regular.ttf) format('opentype');
+ src: url(../assets/fonts/Poppins-Regular.ttf) format('opentype');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@@ -22,7 +22,7 @@
font-family: 'Poppins';
font-style: normal;
font-weight: 600;
- src: url(/assets/fonts/Poppins-SemiBold.ttf) format('opentype');
+ src: url(../assets/fonts/Poppins-SemiBold.ttf) format('opentype');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@@ -31,6 +31,6 @@
font-family: 'Poppins';
font-style: normal;
font-weight: 700;
- src: url(/assets/fonts/Poppins-Bold.ttf) format('opentype');
+ src: url(../assets/fonts/Poppins-Bold.ttf) format('opentype');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
\ No newline at end of file
diff --git a/docs/tip/develop/rest_api/community.md b/docs/tip/develop/rest_api/community.md
deleted file mode 100644
index a3a89223a0..0000000000
--- a/docs/tip/develop/rest_api/community.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-hide:
- - navigation
- - toc
- - footer
----
-
-!!redoc https://api.sekoia.io/v1/swagger.json?context=public!!
diff --git a/docs/tip/develop/rest_api/dashboard.md b/docs/tip/develop/rest_api/dashboard.md
deleted file mode 100644
index 039f6762fb..0000000000
--- a/docs/tip/develop/rest_api/dashboard.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-hide:
- - navigation
- - toc
- - footer
----
-
-!!redoc https://api.sekoia.io/v1/dashboard/swagger.json?context=public!!
diff --git a/docs/tip/develop/rest_api/enrichments.md b/docs/tip/develop/rest_api/enrichments.md
deleted file mode 100644
index 0c5e23a4c1..0000000000
--- a/docs/tip/develop/rest_api/enrichments.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-hide:
- - navigation
- - toc
- - footer
----
-
-!!redoc https://api.sekoia.io/v1/enricher/swagger.json?context=tip!!
diff --git a/docs/tip/develop/rest_api/intelligence.md b/docs/tip/develop/rest_api/intelligence.md
deleted file mode 100644
index 61bcbd807d..0000000000
--- a/docs/tip/develop/rest_api/intelligence.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-hide:
- - navigation
- - toc
- - footer
----
-
-!!redoc https://api.sekoia.io/v2/inthreat/swagger.json?context=tip!!
diff --git a/docs/tip/develop/rest_api/playbooks.md b/docs/tip/develop/rest_api/playbooks.md
deleted file mode 100644
index c6ed570753..0000000000
--- a/docs/tip/develop/rest_api/playbooks.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-hide:
- - navigation
- - toc
- - footer
----
-
-!!redoc https://api.sekoia.io/v1/symphony/swagger.json?context=public!!
diff --git a/docs/tip/develop/rest_api/quickstart.md b/docs/tip/develop/rest_api/quickstart.md
deleted file mode 120000
index 96a65c28c1..0000000000
--- a/docs/tip/develop/rest_api/quickstart.md
+++ /dev/null
@@ -1 +0,0 @@
-../../../../_shared_content/develop/rest_api/quickstart.md
\ No newline at end of file
diff --git a/docs/tip/features/automate b/docs/tip/features/automate
deleted file mode 120000
index 9604f57df8..0000000000
--- a/docs/tip/features/automate
+++ /dev/null
@@ -1 +0,0 @@
-../../../_shared_content/automate
\ No newline at end of file
diff --git a/docs/tip/features/consume b/docs/tip/features/consume
deleted file mode 120000
index 98d1f74fbf..0000000000
--- a/docs/tip/features/consume
+++ /dev/null
@@ -1 +0,0 @@
-../../../_shared_content/intelligence_center/consume
\ No newline at end of file
diff --git a/docs/tip/features/data_model.md b/docs/tip/features/data_model.md
deleted file mode 100644
index ad46dcfee9..0000000000
--- a/docs/tip/features/data_model.md
+++ /dev/null
@@ -1,101 +0,0 @@
-# Data Model
-
-The Intelligence Center uses the industry standard STIX ([version 2.1](https://oasis-open.github.io/cti-documentation/stix/intro.html)) to represent information.
-
-## Objects
-
-STIX uses JSON objects with pre-defined schemas to represent Cyber Threat Intelligence data. The knowledge graph is based on nodes (STIX Domain Objects or SDO) and relationships (STIX Relationship Objects or SRO).
-
-The Intelligence Center supports the following STIX Domain Objects:
-
-![objects-types](/assets/intelligence_center/data-model-objects.png){: style="max-width:100%"}
-
-## Observables
-
-An observable is a technical information that can detect a potential threat. They are derived from all data contained in the Intelligence Center but are not always contextualized.
-
-!!! note
- If an observable clearly represent a malicious activity then it is an IoC (Indicator of Compromise).
-
-Observables are automatically extracted from various sources : public, subscriptions, partners, SEKOIA internal analysis.
-
-The Intelligence Center supports the following observables:
-
-![observables-types](/assets/intelligence_center/data-model-observables.png){: style="max-width:100%"}
-
-### What is the difference between an indicator and an observable?
-To understand the difference between an indicator (an object type) and an observable, we have to dig deeper into the definition of each one of these.
-
-**Observables**
-
-- These are different kinds of technical artifacts
-- They are not necessary malicious (example: `google.com`)
-- They can be enriched with tags to contextualize the (non)-threat
- - These tags allow you to enrich logs/events in Sekoia.io XDR
-- They are not provided in the CTI feed (API / TAXII / MISP, etc.)
-- They don’t directly raise alerts in Sekoia.io XDR but tag-based detection rules can be created to allow that
-- They can be manually enriched through the web application and can have dedicated relations (for example : `resolves-to`, `belongs-to`, etc.)
-- They are usable (thanks to the tags system) within Sekoia.io XDR to create warning rules that provide context to the analysts who are in charge of producing Intelligence or to avoid false positives creation.
-
-**Indicators**
-
-- These are Indicators of Compromise (IoC)
-- They are always related to a threat (malware, campaign, intrusion set, threat actor, vulnerability, etc.) and they are always contextualized with a confidence rating, a validity date and a Kill chain phase
-- They are based on observables
-- They are exported in the CTI feed (API / TAXII / MISP, etc.) to allow a contextualized detection
-- They raise real-time alerts in Sekoia.io XDR but also in the past through retro hunting which depends on the validity period of the indicator and the log retention duration
-
-## External Sources
-
-One of the founding principle of the Intelligence Center is the consolidation of information coming from several sources.
-
-Sources are represented in STIX by `Identity` objects.
-
-Our consolidation strategy means that the `created_by_ref` field of the STIX objects will always be set to the SEKOIA identity. The sources that contributed to one of our STIX object are available, as references, in the `x_inthreat_sources_refs` custom field.
-
-As an exemple, here are parts of a `Spearphishing Link` object:
-
-```json
-{
- "type": "attack-pattern",
- "name": "Spearphishing Link",
- "id": "attack-pattern--6cd1a813-ccdf-4ba0-9b54-cb808f1059cc",
-
- "created_by_ref": "identity--357447d7-9229-4ce1-b7fa-f1b83587048e", # SEKOIA
-
- "x_inthreat_sources_refs": [
- "identity--357447d7-9229-4ce1-b7fa-f1b83587048e", # SEKOIA
- "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5" # The MITRE Corporation
- ],
-
- [...]
-}
-```
-
-## Confidence
-
-STIX 2.1 adds an optional `confidence` field for an object creator to express how confident we are about the information.
-
-When specified, this confidence level on objects should be read with the [Admiralty Credibility](https://docs.google.com/document/d/1Cqi89CU6FwEdLjGFqMnxpl3T4iSWE_gbImBq2WXEXYk/edit#heading=h.1v6elyto0uqg) scale.
-
-| Number | Meaning | Details |
-| --- | --- | --- |
-| 1 | Confirmed by other sources | Confirmed by other independent sources; logical in itself; Consistent with other information on the subject |
-| 2 | Probably true | Not confirmed; logical in itself; consistent with other information on the subject |
-| 3 | Possibly true | Not confirmed; reasonably logical in itself; agrees with some other information on the subject |
-| 4 | Doubtful | Not confirmed; possible but not logical; no other information on the subject |
-| 5 | Improbable | Not confirmed; not logical in itself; contradicted by other information on the subject |
-| 6 | Truth cannot be judged | No basis exists for evaluating the validity of the information |
-
-## Reliability
-
-Next to the source (object type: `Identity`), the `confidence` score may be specified to express the source's reliability. When specified, this reliability level should be read with the [Admiralty Reliability](https://docs.google.com/document/d/1Cqi89CU6FwEdLjGFqMnxpl3T4iSWE_gbImBq2WXEXYk/edit#heading=h.1v6elyto0uqg) scale.
-
-| Letter | Meaning | Details |
-| --- | --- | --- |
-| A | Completely reliable | No doubt of authenticity, trustworthiness, or competency; has a history of complete reliability |
-| B | Usually reliable | Minor doubt about authenticity, trustworthiness, or competency; has a history of valid information most of the time |
-| C | Fairly reliable | Doubt of authenticity, trustworthiness, or competency but has provided valid information in the past |
-| D | Not usually reliable | Significant doubt about authenticity, trustworthiness, or competency but has provided valid information in the past |
-| E | Unreliable | Lacking in authenticity, trustworthiness, and competency; history of invalid information |
-| F | Reliability cannot be judged | No basis exists for evaluating the reliability of the source |
diff --git a/docs/tip/features/integrations b/docs/tip/features/integrations
deleted file mode 120000
index 468ccb3f14..0000000000
--- a/docs/tip/features/integrations
+++ /dev/null
@@ -1 +0,0 @@
-../../../_shared_content/intelligence_center/integrations
\ No newline at end of file
diff --git a/docs/tip/features/monitor b/docs/tip/features/monitor
deleted file mode 120000
index e058f4757b..0000000000
--- a/docs/tip/features/monitor
+++ /dev/null
@@ -1 +0,0 @@
-../../../_shared_content/intelligence_center/monitor
\ No newline at end of file
diff --git a/docs/tip/features/produce/content_proposals.md b/docs/tip/features/produce/content_proposals.md
deleted file mode 100644
index a6d38454a4..0000000000
--- a/docs/tip/features/produce/content_proposals.md
+++ /dev/null
@@ -1,139 +0,0 @@
-# Content Proposals
-
-Content Proposals (CP) allow analysts to produce and capitalize on their own CTI.
-
-## Listing and filtering
-
-The Content Proposals homepage lists all the contributions and suggestions made to add content to your TIP CTI database.
-
-### Types of Content Proposals
-
-There are two types of content proposals:
-
-- CPs that are **manually** made by analysts
-- CPs that are **automatically** pushed by playbooks
-
-### Content Proposals statuses
-
-A Content Proposal has three possible statuses. You can filter your CPs by status by clicking on one of the tabs.
-
-- **Pending**: CPs are still being updated and have not been merged yet
-- **Merged**: CPs have been approved and their content is now part of the CTI database
-- **Rejected**: CPs have been rejected and their content has not been deployed in the database
-
-### Available filters on Content Proposals
-
-You can also filter your content proposals based on different filters:
-
-- The source of the CP
-- The assigned analyst in charge of the CP
-- The reviewed assigned to the CP
-
-Each Content Proposal can be assigned to a member of your team and a reviewer.
-
-## Create an empty Content Proposal
-
-In the listing page, the `Create button allows you to create a new empty Content Proposal.
-
-In the left panel of the layout, you have access to different tabs:
-
-### The Objects tab
-
-The Objects tab allows you to:
-
-- Add existing objects from the CTI database to your Content Proposal
-- Create new objects
-- Create relationships (one by one or in chain)
-- Update objects
-
-In this tab, you can display all the objects present in the Content Proposals and filter them by type, review status or whether or not objects have an associated warning.
-
-A button also allows multiple selection to perform different `bulk` actions such as:
-
-- Adding existing relationships
-- Creating new relationships
-- Deleting objects
-- Updating objects
-
-### The Observables tab
-
-The Observables tab allows you to:
-
-- Create Observables individually
-- Import Observables in bulk
-- Assign tags to Observables
-- Transform Observables into Indicators
-
-A button also allows multiple selection to perform different “bulk” actions such as creating indicators from Observables, adding one or more tags or deleting Observables.
-
-### The Relationships tab
-
-The Relationships tab gives you the possibility to create relationships between two objects of the CTI database.
-
-This phase of creating Objects and Relations can also be done directly from the Graph view.
-
-## Import content to create a Content Proposal
-
-To create a Content Proposal, you can also import content.
-
-There are three possible options to import content:
-
-- From a file
-- From a free text
-- From a URL
-
-The imported content will be parsed in order to recognize as many [Observables](https://docs.sekoia.io/tip/features/consume/observables/) as possible (IP, domain names, file hash, e-mail address, URL, etc.) as well as objects already known to the CTI database (malware, intrusion set, attack pattern ATT&CK, location, etc.).
-
-## Comments on CP
-
-To improve the review of a content proposal and allow interactions between the assignee and the reviewer, a comment feature has been recently implemented inside the Content Proposal page.
-
-### Post a comment
-To be able to comment or to see comments on a Content Proposal:
-
-1. Go to a Content Proposal
-2. In the Content Proposal's header, a button `Comments` shows next to the graph icon and the `Reject` and `Merge` buttons
-3. Write down your comment and press `Enter` or click on `Comment`
-
-### Edit a comment
-To edit a comment posted on a Content Proposal:
-
-1. Click on the comment panel
-2. Hover over the comment you wrote that you want to edit
-3. Click on the `Edit` icon
-4. Edit your comment and `Enter` or click on `Comment`
-
-### Delete a comment
-To delete a comment left on a Content Proposal:
-
-1. Click on the comment panel
-2. Hover over the comment you wrote that you want to delete
-3. Click on the `Delete` icon
-4. Confirm your choice by clicking on `Delete` in the confirmation modal
-
-!!! note
- If you delete a comment, you will not be able to recover it.
-
-## Request for Intelligence
-
-In order to enable end users to make direct requests to our analysts to create an intelligence report or take a specific action, we added a new functionality “RFI” - short for **Request For Intelligence** - that we integrated into the Intelligence Center.
-
-### Create an RFI
-
-In the Content Proposals listing page, there is a button on the top right of the page called `Request for Intelligence.
-To create an RFI, click on that button and fill out the form with the following information:
-
-- Type of request: could be a situational awareness report, a request for investigation, a threat assesment or a request for action
-- Assignee: who's in charge of making the Content Proposal
-- Summary of your request: the title of the content proposal
-- A description of the request
-- Priority of the request: `low`, `medium`or `high`
-- Traffic Light Protocol (TLP)
-
-Once you’ve created the request, a new content proposal will be automatically created.
-
-### Filter on RFI
-You can filter the RFI Content Proposals using the checkbox: `Show only RFI`.
-
-!!! note
- This feature is available to the TIP users that have the `INTHREAT_WRITE_REQUEST_FOR_INTELLIGENCE` permission. This permission will be delivered to all Sekoia.io TIPs.
diff --git a/docs/tip/features/produce/expiration_rules.md b/docs/tip/features/produce/expiration_rules.md
deleted file mode 100644
index 296af4e8ad..0000000000
--- a/docs/tip/features/produce/expiration_rules.md
+++ /dev/null
@@ -1,24 +0,0 @@
-# Expiration Rules
-
-Indicators don’t stay valid forever. For most of them, they have a defined validity period.
-
-When creating/adding an Indicator to a Content Proposal, analysts have to provide a `valid_from` (required) and `valid_until` (optional) date which is the time from which this Indicator is considered a valid indicator of the behaviors it is related to or represents.
-
-This is when Expiration Rules come to play. They have been designed to set default validity periods for Indicators depending on the type of observable they related to.
-
-### Default Expiration Rules
-
-By default, these validity periods are:
-
-| Observable type | Time to live |
-| --- | --- |
-| URL | 6 months |
-| IPv4 | 1 month |
-| IPv6 | 1 month |
-| Domain name | 6 months |
-| Others | 6 months |
-| File (hash) | 5 years |
-
-### Example
-
-When importing an IP address into a Content Proposal, if you don't change the fields corresponding to the validity date, it will be automatically set to 1 month in the CTI database.
diff --git a/docs/tip/features/produce/incoming_feeds.md b/docs/tip/features/produce/incoming_feeds.md
deleted file mode 100644
index 9cde775fff..0000000000
--- a/docs/tip/features/produce/incoming_feeds.md
+++ /dev/null
@@ -1,76 +0,0 @@
-# Incoming feeds
-
-Incoming feeds allow to ingest data from other sources in the TIP.
-
-## Creating a feed
-
-The first step consists in creating a new incoming feed. To do so, click on `Settings` at the top right and `+ Feed`.
-
-When creating a new incoming feed, it is possible to choose between:
-
-- A Sekoia.io TIP feed
-- A TAXII 2.1 server
-
-Depending on the feed type chosen, different options will be offered to contact the remote server. It is possible to choose:
-
-- To activate the feed or not once it is created
-- If the content proposals from the feed should be merged automatically or not. If set, it is also possible to choose to ignore the warnings during the merge. In this case all the [warning rules](./warning_rules.md) will be ignored.
-- To skip expired objects (TIP only): Objects that are expired on the remote TIP instance will not be synchronized in this TIP.
-- To start the synchroniztion from a specific point in time (TIP only): It allows to only retreive fresh data and avoid having the intial synchronization taking too much time.
-
-## Enabling/disabling a feed
-
-To enable or disable an incoming feed:
-
-1. Go to `Incoming feeds`listing
-2. Click on the `Settings` button on top of the table
-3. In the `Settings` table, all incoming feeds are listed
-4. Click on the toggle in the last column of the table to enable or disable a feed
-
-## Tracking synchronization results
-
-### Synchronization tasks list
-
-On the main page of the incoming feeds are listed synchronization tasks that ran or are still running.
-
-Each line in the table allows to see:
-
-- To which feed this synchronization task belongs to
-- When it started
-- Its duration
-- The number of bundles this task created and how many of them have been processed
-- The number of bundles in error
-- The status of this synchronization task. Possible statuses are:
-
-| Status | Description |
-| --- | --- |
-| Fetching bundles | The synchronization is fetching bundles from the remote source |
-| Ingesting bundles | All the bundles have been retrieved and they are being ingested |
-| Finished | The synchronization is done |
-| Canceled | A synchronization task is already running for this feed so this one has been canceled |
-| Error | Something wrong happened during the synchronization. More information are available in the details of this synchronization task |
-
-You can filter results either by `Feed` or by `Status`.
-
-### Synchronization task details
-
-When clicking on a specific line in the synchronization task details, it is possible to get the details of the synchronization task.
-
-For all tasks, there are common information like the URL that was contacted, when it started, the output...
-
-Tasks in error have a stack trace allowing to troubleshoot what went wrong.
-
-There are also details about the bundles that have been ingested:
-
-- The ingestion status of the bundle. Possible statuses are:
-
-| Status | Description |
-| --- | --- |
-| Pending | The bundle is waiting to be processed by a worker |
-| Running | The bundle is being processed |
-| Success | The bundle has been processed successfully |
-| Retrying | An error occurred when processing the bundle but it will be retried later |
-| Failed | It was not possible to process the bundle, even after many tries |
-
-- When the bundle is not in `Success`, it is possible to download the JSON bundle.
-- When the bundle is not in `Pending`, it is possible to see the created content proposal.
diff --git a/docs/tip/features/produce/warning_rules.md b/docs/tip/features/produce/warning_rules.md
deleted file mode 100644
index 07e72a0897..0000000000
--- a/docs/tip/features/produce/warning_rules.md
+++ /dev/null
@@ -1,26 +0,0 @@
-# Warning Rules
-
-Warning Rules are designed to help analysts when producing intelligence in Content Proposals. They make it possible to avoid adding false positives to the CTI database and they also provide more context during an investigation.
-
-In a Content Proposal, Sekoia.io’s default Warning Rules let you know if an Indicator has no relationship with another object present in the Content Proposal. They also warn you if the Kill Chain step has not been defined.
-
-## Create a warning rule
-
-You can create Warning Rules via the Warning Rules’ listing page.
-
-The `Add warning rule` button allows you to create new rules and define several elements to configure its triggering.
-
-To create a Warning Rule, you’ll have to:
-
-- Write the explicit warning message that will inform the analyst of the context around the observable
-- Define what type of Observable can trigger this Warning Rule
-- Define what type of relationship can trigger this Warning Rule
-- Define a tag associated with the observable that will trigger this Warning Rule
-- Indicate whether the tag validity date must be valid or not to trigger this Warning Rule
-- Add exclusions regexes (optional): they will be applied on the pattern of the indicator and, if they match, they can prevent the warning from being created.
-
-### Examples of Warning Rules with tag values
-
-- This indicator contains a domain name used by a University
-- This indicator contains a domain-name that is used by Google Services
-- This indicator contains an IP address used by Cloudflare. It’s probably a false positive.
diff --git a/docs/tip/index.md b/docs/tip/index.md
deleted file mode 100644
index 6805e52ffe..0000000000
--- a/docs/tip/index.md
+++ /dev/null
@@ -1,43 +0,0 @@
-# Sekoia.io TIP
-
-The Threat Intelligence Platform is an app made by [Sekoia.io](http://Sekoia.io) to help you build and disseminate your own Cyber Threat Intelligence.
-
-It is meant to store all levels of Cyber Threat Intelligence (CTI), from strategic (targets, motivations) to technical (indicator of compromises). It also provides you with Content Creation tools as well as Investigation means to help you stay up-to-date when it comes to analyzing Cyber threats.
-
-## Product Features
-
-### Consume and Investigate
-
-To fully protect your business, you need to have a deep knowledge and understanding of attackers groups. Consume world class and daily updated intelligence through the Intelligence database and our reports. All the intelligence produced by Sekoia.io is contextualized and exploitable, which is useful to both strategic and operational teams.
-
-Discover the fully open cyber threat knowledge base and benefit from intuitive interfaces to browse and find the information you are looking for.
-
-- Search through the [Intelligence database](features/consume/intelligence.md): Continuously updated by hundreds of qualified intelligence sources and processed and enriched by Sekoia.io, this database is enhanced with research and analysis carried out by our analysts on a daily basis.
-- Stay up to date with our [feeds](features/consume/feeds.md): Setup custom feeds to be able to receive and read the latest news directly in your app. Get notified whenever a new report is updated.
-- Investigate trends and cases with [Graph Explorations](features/consume/graph_explorations.md).
-
-### Produce Content
-
-To be able to produce your own Intelligence and start complex investigations on topics of interest to you, we have developed a mechanism to allow your analysts to suggest content, review others’ content and merge it to the database once it’s approved by the team.
-
-- Create complex [Content Proposals](features/produce/content_proposals.md) to enrich the CTI database.
-
-### Customize
-
-Adapt and customize your intelligence flows based on your needs. To get more information about a specific sector, activity, source or geographical area, you can use our filters to have access to content 100% tailored to your needs.
-
-- Filter the content you see in the database by setting up [feeds](features/consume/feeds.md).
-
-### Automate
-
-To automate recurrent processes and tasks (enrichment, contextualization, investigation…), you can rely on tools we developed to optimize your time and do an efficient work using our TIP platform.
-
-- Configure [Playbooks](features/automate/index.md) to automate repetitive tasks and enrich the CTI database.
-- Avoid false positives and provide more context with [Warning Rules](features/produce/warning_rules.md).
-- Define an indicator’s validity by setting up [Expiration Rules](features/produce/expiration_rules.md).
-
-### Report
-
-The spread of security products within a system can make it hard to follow the actual state of your security stance. With Sekoia.io, you can use the dashboard module and its widgets to customize your reportings in order to visualize your own KPIs.
-
-- Create and edit your [dashboards](features/monitor/dashboard.md) to monitor sectors, content being produced or your threat database evolution.
diff --git a/docs/xdr/FAQ/Alerts_qa.md b/docs/xdr/FAQ/Alerts_qa.md
index ce92c7764d..5e52e5e3fd 100644
--- a/docs/xdr/FAQ/Alerts_qa.md
+++ b/docs/xdr/FAQ/Alerts_qa.md
@@ -1,10 +1,10 @@
## Alert date
-When an alert is triggered, additional events can enrich this alert but the date of the alert will not be updated (date= 1st trigger).
+When an alert is triggered, additional events can enrich this alert but the date of the alert will not be updated (date= 1st trigger).
## Bell icon in alerts page
-The bell icon means that "the event is involved in an alert".
+The bell icon means that "the event is involved in an alert".
When a bell on an event is displayed on an alert page, the event is involved in the current alert AND in another alert.
@@ -12,12 +12,12 @@ If it is involved in the current alert, the bell is not displayed.
## How an alert is triggered with a delay ?
-Besides matching a rule in real time, an alert can be triggered with a delay when:
+Besides matching a rule in real time, an alert can be triggered with a delay when:
- An IOC is published, old events are scanned and if an event matches, the rule will automatically trigger an alert.
- - Logs from the source were received by Sekoia with a delay. Common route causes:
- * the log collection was interrupted, if logs are buffered loccaly on customer's side, before being sent later when the collection restarts
+ - Logs from the source were received by Sekoia with a delay. Common route causes:
+ * the log collection was interrupted, if logs are buffered loccaly on customer's side, before being sent later when the collection restarts
* Reingestion of old logs
!!! Note
- See more informaiton on `timestamp` and `event.created`fields [here](Events_qa.md#timestampeventcreated-eventstart-eventend-meaning).
+ See more informaiton on `timestamp` and `event.created`fields [here](Events_qa.md).
diff --git a/docs/xdr/develop/rest_api/alert.md b/docs/xdr/develop/rest_api/alert.md
deleted file mode 100644
index b469e4e294..0000000000
--- a/docs/xdr/develop/rest_api/alert.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-hide:
- - navigation
- - toc
- - footer
----
-
-!!redoc https://api.sekoia.io/v1/sic/swagger.json?context=public!!
diff --git a/docs/xdr/develop/rest_api/assets_v2.md b/docs/xdr/develop/rest_api/assets_v2.md
deleted file mode 100644
index 81de47cbf6..0000000000
--- a/docs/xdr/develop/rest_api/assets_v2.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-hide:
- - navigation
- - toc
- - footer
----
-
-!!redoc https://api.sekoia.io/v2/asset-management/openapi.json?context=public!!
diff --git a/docs/xdr/develop/rest_api/community.md b/docs/xdr/develop/rest_api/community.md
deleted file mode 100644
index a3a89223a0..0000000000
--- a/docs/xdr/develop/rest_api/community.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-hide:
- - navigation
- - toc
- - footer
----
-
-!!redoc https://api.sekoia.io/v1/swagger.json?context=public!!
diff --git a/docs/xdr/develop/rest_api/configuration.md b/docs/xdr/develop/rest_api/configuration.md
deleted file mode 100644
index 3b7f08c3bc..0000000000
--- a/docs/xdr/develop/rest_api/configuration.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-hide:
- - navigation
- - toc
- - footer
----
-
-!!redoc https://api.sekoia.io/v1/sic/conf/swagger.json?context=public!!
diff --git a/docs/xdr/develop/rest_api/dashboard.md b/docs/xdr/develop/rest_api/dashboard.md
deleted file mode 100644
index 039f6762fb..0000000000
--- a/docs/xdr/develop/rest_api/dashboard.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-hide:
- - navigation
- - toc
- - footer
----
-
-!!redoc https://api.sekoia.io/v1/dashboard/swagger.json?context=public!!
diff --git a/docs/xdr/develop/rest_api/enrichments.md b/docs/xdr/develop/rest_api/enrichments.md
deleted file mode 100644
index 0c5e23a4c1..0000000000
--- a/docs/xdr/develop/rest_api/enrichments.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-hide:
- - navigation
- - toc
- - footer
----
-
-!!redoc https://api.sekoia.io/v1/enricher/swagger.json?context=tip!!
diff --git a/docs/xdr/develop/rest_api/parser.md b/docs/xdr/develop/rest_api/parser.md
deleted file mode 100644
index daf0249349..0000000000
--- a/docs/xdr/develop/rest_api/parser.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-hide:
- - navigation
- - toc
- - footer
----
-
-!!redoc https://api.sekoia.io/v1/ingest/swagger.json?context=public!!
diff --git a/docs/xdr/develop/rest_api/playbooks.md b/docs/xdr/develop/rest_api/playbooks.md
deleted file mode 100644
index c6ed570753..0000000000
--- a/docs/xdr/develop/rest_api/playbooks.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-hide:
- - navigation
- - toc
- - footer
----
-
-!!redoc https://api.sekoia.io/v1/symphony/swagger.json?context=public!!
diff --git a/docs/xdr/develop/rest_api/query_builder.md b/docs/xdr/develop/rest_api/query_builder.md
deleted file mode 100644
index 5d588bfd1a..0000000000
--- a/docs/xdr/develop/rest_api/query_builder.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-hide:
- - navigation
- - toc
- - footer
----
-
-!!redoc https://api.sekoia.io/api/v1/notebooks/openapi.json?context=public!!
diff --git a/docs/xdr/develop/rest_api/quickstart.md b/docs/xdr/develop/rest_api/quickstart.md
deleted file mode 120000
index 96a65c28c1..0000000000
--- a/docs/xdr/develop/rest_api/quickstart.md
+++ /dev/null
@@ -1 +0,0 @@
-../../../../_shared_content/develop/rest_api/quickstart.md
\ No newline at end of file
diff --git a/docs/xdr/develop/rest_api/telemetry.md b/docs/xdr/develop/rest_api/telemetry.md
deleted file mode 100644
index 23ea8cb442..0000000000
--- a/docs/xdr/develop/rest_api/telemetry.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-hide:
- - navigation
- - toc
- - footer
----
-
-!!redoc https://api.sekoia.io/v1/telemetry/openapi.json?context=public!!
diff --git a/docs/xdr/features/collect/assets.md b/docs/xdr/features/collect/assets.md
index db79af39dd..777d3b199d 100644
--- a/docs/xdr/features/collect/assets.md
+++ b/docs/xdr/features/collect/assets.md
@@ -40,7 +40,7 @@ For each category, there are additional sub-categories to add an optional additi
The asset criticality value is a numerical indicator that represents the level of criticality or importance of each asset within the organization's IT infrastructure. It ranges from 0 to 100, where 0 indicates that the asset has no criticality or minimal importance, and 100 signifies maximum criticality, denoting assets crucial for the organization's operations.
-This value contribues to the [urgency score of alerts](/xdr/features/investigate/alerts). Hence it plays a key role in computing and prioritizing alerts related to assets, ensuring that your SOC team focuses on addressing the most critical security incidents promptly.
+This value contribues to the [urgency score of alerts](/xdr/features/investigate/alerts.md). Hence it plays a key role in computing and prioritizing alerts related to assets, ensuring that your SOC team focuses on addressing the most critical security incidents promptly.
### Detection Properties
diff --git a/docs/xdr/features/collect/intakes.md b/docs/xdr/features/collect/intakes.md
index 1eae43d06f..47df9fd311 100644
--- a/docs/xdr/features/collect/intakes.md
+++ b/docs/xdr/features/collect/intakes.md
@@ -112,8 +112,8 @@ To create an intake, you have to:
![intakes_creation](/assets/operation_center/intakes/modal-intake-creation.png){: style="max-width:100%"}
!!! Note
- The documentation about the integration of your data sources is also available in the [integrations](integrations/index.md) page.
-
+ The documentation about the integration of your data sources is also available in the [integrations](/integration/index.md) page.
+Pin
## Configure a notification to report on inactive intake
An inactive intake may have devastating consequences on your security monitoring. To prevent incidents from happening, you can set up notifications to get alerted when an intake stops sending events to Sekoia.io.
@@ -121,7 +121,7 @@ To set up your notification, you can:
1. Go to the Intakes listing page and click on: ![Card menu](/assets/operation_center/intakes/intakes-card-menu.png){: style="max-width:10%"} on the right side of the card and click on the `Notifications` menu
2. Specify how long the intake should be inactive before sending a notification. The duration can go from 15 min to 24 hours.
-3. Select how you want to be notified. Triggered actions that are available are mentioned in the page [Turn on notifications](/getting_started/notifications-Listing_Creation).
+3. Select how you want to be notified. Triggered actions that are available are mentioned in the page [Turn on notifications](/getting_started/notifications-Listing_Creation.md).
!!! note
You can also set up this notification from the **intake details page** or the **User Center** > Notifications by selecting the trigger `No events are received`.
@@ -130,7 +130,7 @@ To set up your notification, you can:
## Create a custom intake
-To learn more about how to create a custom intake, please refer to this [section.](/../../../integration/develop_integration/formats/create_a_format/)
+To learn more about how to create a custom intake, please refer to this [section.](/integration/develop_integration/formats/create_a_format.md)
## Intake details page
@@ -205,7 +205,7 @@ The `Connector log` tab is only available for Pull intakes.
![intakes_connector](/assets/operation_center/intakes/intakes-connector.png){: style="max-width:100%"}
In this tab, you will find the latest logs of the connector. These logs help you check that the connector is functioning properly by checking the `Info` level messages.
-But they also help you troubleshoot issues by checking the `Error` level messages.
+But they also help you troubleshoot issues by checking the `Error` level messages.
Use the filter button to filter `Error` logs.
@@ -231,7 +231,7 @@ The intake menu allows you to perform different kind of actions:
#### Edit entity
-To modify the entity of the intake:
+To modify the entity of the intake:
1. Click on `Edit entity` in the menu
2. Select a new entity in the list
@@ -254,7 +254,7 @@ This menu is only available for Pull intakes. Use this menu to modify the parame
#### Notifications
-To create a new notification on the intake:
+To create a new notification on the intake:
1. Click on `Notifications` in the menu
2. Configure the notification settings
@@ -262,7 +262,7 @@ To create a new notification on the intake:
#### Rename intake
-To rename the intake:
+To rename the intake:
1. Click on `Rename` in the menu
2. Enter the new name of the intake
@@ -272,7 +272,7 @@ To rename the intake:
#### Delete intake
-To delete the intake:
+To delete the intake:
1. Click on `Delete` in the menu
2. Confirm the deletion
diff --git a/docs/xdr/features/detect/built_in_detection_rules.md b/docs/xdr/features/detect/built_in_detection_rules.md
index 9501c4ac1b..340618a8aa 100644
--- a/docs/xdr/features/detect/built_in_detection_rules.md
+++ b/docs/xdr/features/detect/built_in_detection_rules.md
@@ -2,7 +2,7 @@
Sekoia.io provides built-in detection rules to illuminate intrusions, adversarial behaviours and suspicious activity escalation chains so you can immediately take steps to remediate. Built-in rules can be customized to your context and according to your security posture.
-Please check the [dedicated FAQ page](../../../FAQ/Detection_qa/) related to detection rule strategy.
+Please check the [dedicated FAQ page](../../FAQ/Detection_qa.md) related to detection rule strategy.
For Windows-related rules, Sekoia.io automatically produces [this regularly updated list](built_in_detection_rules_eventids.md) of the needed EventIDs by rule but also globally as some statistics are provided.
diff --git a/docs/xdr/features/detect/iocdetection.md b/docs/xdr/features/detect/iocdetection.md
index d95d569374..215504bf95 100644
--- a/docs/xdr/features/detect/iocdetection.md
+++ b/docs/xdr/features/detect/iocdetection.md
@@ -2,11 +2,11 @@
IOC detection is a critical mechanism in detecting attacks that are trying to harm your system or have already breached it. The Sekoia SOC platform is powered by our Threat Detection & Research (TDR) team, which constantly enriches our IOC database with its state-of-the-art investigations and extensive expertise in Intelligence.
-With IOC detection, you can automatically identify potential threats in your past and future events by monitoring active IOCs.
+With IOC detection, you can automatically identify potential threats in your past and future events by monitoring active IOCs.
## How does IOC detection at Sekoia work?
-Sekoia Threat Detection & Research (TDR) team maintains the CTI database with millions of IOCs through their investigation and dedicated expertise.
+Sekoia Threat Detection & Research (TDR) team maintains the CTI database with millions of IOCs through their investigation and dedicated expertise.
All this incredible work benefits Sekoia XDR clients, who can consult the number of IOCs available on the Rules catalog page in the section `Active IOCs`.
![verified iocs](/assets/operation_center/rules_catalog/verified_iocs.gif){: style="max-width:100%"}
@@ -25,7 +25,7 @@ On the Alerts page, look for the Detection type of the alert. `CTI Retrohunt` al
#### Would your SOC team like to scan a specific list of IOCs to perform retrohunt?
That’s possible via the IOC collections. You can import a specific list of IOCs to perform retrohunting.
-Please see the dedicated documentation on [IOC Collections](../ioccollections).
+Please see the dedicated documentation on [IOC Collections](ioccollections.md).
## Technical dive into IOC detection
@@ -55,7 +55,7 @@ The tables below list the ECS event fields that are verified by IOC detection.
#### Observable type: Domain Name
-| STIX path | ECS event field |
+| STIX path | ECS event field |
| --- | --- |
| domain-name:value | client.domain
client.registered_domain
destination.domain
destination.registered_domain
dns.question.name
dns.question.registered_domain
server.domain
server.registered_domain
source.domain
source.registered_domain
tls.[*client/server*].x509.alternative_names
tls.[*client/server*].x509.subject.common_name
url.domain
url.registered_domain |
@@ -75,8 +75,8 @@ The tables below list the ECS event fields that are verified by IOC detection.
| file:hashes.SSDEEP | file.hash.ssdeep |
| file.hash.SHA-1 | file.hash.sha1
dll.hash.sha1
email.attachments.file.hash.sha1
process.hash.sha1 |
| file.hash.SHA-256 | file.hash.sha256
dll.hash.sha256
email.attachments.file.hash.sha256
process.hash.sha256 |
-| file.hash.SHA-512 | file.hash.sha512
dll.hash.sha512
email.attachments.file.hash.sha512
process.hash.sha512 |
-| file:mime_type | file.mime_type |
+| file.hash.SHA-512 | file.hash.sha512
dll.hash.sha512
email.attachments.file.hash.sha512
process.hash.sha512 |
+| file:mime_type | file.mime_type |
| file:mtime | file.ctime |
| file:name | file.name |
| file:size | file.size |
@@ -97,7 +97,7 @@ The tables below list the ECS event fields that are verified by IOC detection.
| network-traffic:dst_port | destination.port |
| network-traffic:dst_ref.value | destination.ip |
| network-traffic:extensions.http-request-ext.request_header.User-Agent | user_agent.original |
-| network-traffic:src_port | source.port |
+| network-traffic:src_port | source.port |
| network-traffic:src_ref.value | source.ip |
#### Observable type: URL
@@ -110,18 +110,18 @@ The tables below list the ECS event fields that are verified by IOC detection.
| STIX path | ECS event field |
| --- | --- |
-| windows-registry-key:key | registry.key |
+| windows-registry-key:key | registry.key |
| windows-registry-key:values | registry.value |
#### Observable type: X.509 Certificate
| STIX path | ECS event field |
| --- | --- |
-| x509-certificate:issuer | x509.issuer.common_name
x509.issuer.distinguished_name |
-| x509-certificate:serial_number | x509.serial_number |
+| x509-certificate:issuer | x509.issuer.common_name
x509.issuer.distinguished_name |
+| x509-certificate:serial_number | x509.serial_number |
| x509-certificate:signature_algorithm | x509.signature_algorithm |
| x509-certificate:subject | x509.subject.common_name
x509.subject.distinguished_name |
-| x509-certificate:subject_public_key_algorithm | x509.public_key_algorithm |
+| x509-certificate:subject_public_key_algorithm | x509.public_key_algorithm |
| x509-certificate:subject_public_key_exponent | x509.public_key_exponent |
-| x509-certificate:validity_not_before | x509.not_before |
-| x509-certificate:validity_not_after | x509.not_after |
+| x509-certificate:validity_not_before | x509.not_before |
+| x509-certificate:validity_not_after | x509.not_after |
diff --git a/docs/xdr/features/detect/rules_catalog.md b/docs/xdr/features/detect/rules_catalog.md
index 6516e8b2f2..ce9bdd6f82 100644
--- a/docs/xdr/features/detect/rules_catalog.md
+++ b/docs/xdr/features/detect/rules_catalog.md
@@ -4,7 +4,7 @@ Once your event logs are collected and normalized by Sekoia.io, you probably wan
All rules are applied to your event stream in real-time, so that you can detect - and respond to - threats as fast as possible.
-Please check the [dedicated FAQ page](../../../FAQ/Detection_qa/) related to detection rule strategy.
+Please check the [dedicated FAQ page](../../FAQ/Detection_qa.md) related to detection rule strategy.
## Rule Types
@@ -20,15 +20,15 @@ The Rules Catalog page can be used to list and manage all detection rules. Many
![rules_catalog](/assets/operation_center/rules_catalog/rules-catalog-layout.png){: style="max-width:100%"}
!!! tip
- You can enable or disable rules one by one or all at once according to current filters.
+ You can enable or disable rules one by one or all at once according to current filters.
### Rules Attributes
#### Available and verified rules
-The Rules Catalog lists all detection rules available to your organization:
-.
+The Rules Catalog lists all detection rules available to your organization:
+.
- **Verified Rules**: rules with the following logo ![verified_logo](/assets/operation_center/rules_catalog/verified_logo.PNG) are verified. These rules are created for you by Sekoia.io's Threat & Detection Research team and already built-in. Verified rules are constantly updated to improve detection. Furthermore, they follow a specific process to test them and be certain they won't cause many false positives. This process is described in our blogpost [XDR detection engineering at scale: crafting detection rules for SecOps efficiency](https://blog.sekoia.io/xdr-detection-rules-at-scale/). This set of more than 900+ rules can be used to detect known threats, attack patterns, etc.
- **Your Rules**: rules created by your team that are specific to your organization.
@@ -46,7 +46,7 @@ Description of each effort level:
- `Elementary`: rule requires no effort to enable rule and raises fewer alerts. Those rules are built to be effective and designed to raise as little false positives as possible
- `Intermediate`: similar to `Elementary` effort but a rule could raise more alerts
- `Advanced`: rule could require more effort to be enabled and could raise alerts frequently depending on the IT configuration
-- `Master`: rule could require a specific configuration to be enabled and/or could raise a high number of alerts, but is designed to detect weaker signals. `Master` rules usually require an additional customization effort, depending on the IT context and configuration. They are designed for more mature organizations.
+- `Master`: rule could require a specific configuration to be enabled and/or could raise a high number of alerts, but is designed to detect weaker signals. `Master` rules usually require an additional customization effort, depending on the IT context and configuration. They are designed for more mature organizations.
#### Intake formats
@@ -70,7 +70,7 @@ Use the associated search filter to list rules associated to specific threats.
#### Tags
-To have a filtered view of your rules, you can rely on filters cited before ([Available/Verified](#available-and-verified-rules), [Effort level](#effort-level), [Capabilities](#capabilities)) but also on tags associated with rules.
+To have a filtered view of your rules, you can rely on filters cited before ([Available/Verified](#available-and-verified-rules), [Effort level](#effort-level), Capabilities) but also on tags associated with rules.
These tags are defined by Sekoia.io analysts to help make searching for a rule easier and provide categories such as `AWS`, `CVE`, `O365` and `phishing`.
@@ -82,7 +82,7 @@ To filter rules using tags, there are two ways:
![tag_selector](/assets/operation_center/rules_catalog/tag_selector1.png){: style="max-width:100%"}
!!! tip
- To remove filters, simply click on `Clear all filters` next to the tags' list or deselect one tag at a time by clicking on the close icon inside the tag.
+ To remove filters, simply click on `Clear all filters` next to the tags' list or deselect one tag at a time by clicking on the close icon inside the tag.
----
@@ -107,14 +107,14 @@ The color changes depending on the number of rules contained in one cell:
### Rule Details
You can click on the name of a rule to display additional details, such as, but not limited to:
-- The severity which should be used to later determine the [Alert's Urgency](../../investigate/alerts/#alert-urgency)
+- The severity which should be used to later determine the [Alert's Urgency](../investigate/alerts.md#alert-urgency)
- The category of created alerts
- Associated Threats
- Associated Data Sources
- Known False Positives
- The actual detection logic (the pattern)
- Alert filters
-- [Similarity strategy](../../investigate/alerts/#similarity-strategies) for the produced alerts
+- [Similarity strategy](../investigate/alerts.md#similarity-strategies) for the produced alerts
![rule details](/assets/operation_center/rules_catalog/rule_details2.png)
@@ -160,13 +160,13 @@ Rules are automatically enabled based on the configured effort level, or you can
#### Manually
-To ensure that activated rules comply with your security policy, you can choose which rules you want to enable.
-For an MSSP Community, you can easily enable your custom and verified rules in multiple managed communities.
+To ensure that activated rules comply with your security policy, you can choose which rules you want to enable.
+For an MSSP Community, you can easily enable your custom and verified rules in multiple managed communities.
![Enable rules for MSSP community](/assets/operation_center/rules_catalog/enable_multi_communities.png){: style="max-width:70%"}
### Enable / Disable all rules
-As seen previously, rules can be filtered by type, status, effort level and tags. To enable or disable these filtered rules, you can simply click on the button `Enable all` or `Disable all` that are displayed under the search bar.
+As seen previously, rules can be filtered by type, status, effort level and tags. To enable or disable these filtered rules, you can simply click on the button `Enable all` or `Disable all` that are displayed under the search bar.
![enable-disable](/assets/operation_center/rules_catalog/rules-enable-disable.png){: style="max-width:100%"}
@@ -179,12 +179,12 @@ In addition to the verified rules that are already built-in, you can create your
The Rule creation form has the following sections:
-#### General definition of the rule
+#### General definition of the rule
- The rule name is mandatory during the creation, it will be used to name the corresponding raised alerts by default. You can add an optional description below.
- Select the effort level required and the threats detected with this rule if any, by selecting it from the MITRE ATT&CK or by using the search bar through keywords or the drop-down list.
- For an MSSP community, first select the community you want to create your rule in.
--
-Two options are available: select `All communities` or select a specific community.
+-
+Two options are available: select `All communities` or select a specific community.
If you choose `All communities`, your rule will be available for all your communities and you can enable it later on the desired community.
@@ -193,23 +193,23 @@ If you choose `All communities`, your rule will be available for all your commun
#### Detection Pattern
This is the detection logic itself. It varies according to the selected rule type.
-
-!!! note
- Fields available to create a detection pattern follow the ECS standard and can be found on Events page > **Show fields and top values**.
-
+
+!!! note
+ Fields available to create a detection pattern follow the ECS standard and can be found on Events page > **Show fields and top values**.
+
#### Security alerts
In the Alert properties part, you should indicate the category and type of the alerts raised by the rule and the severity of the rule, which is used to calculate the urgency of the corresponding raised alerts in association with assets criticality for events matching assets.
-##### Fields displayed in alert events
-
+##### Fields displayed in alert events
+
You can select fields that will be displayed in events present inside your raised alerts to speed up alert qualification.
To search for fields you want to display, click on the select and type in your event field. This field works as an auto-complete.
-
+
##### Custom similarity strategy
-Alerts are considered similar when some event fields have identical values.
+Alerts are considered similar when some event fields have identical values.
-You can select these event fields in your rule configuration. To do so, click on the select and type in your event field. You can select as many fields as needed.
+You can select these event fields in your rule configuration. To do so, click on the select and type in your event field. You can select as many fields as needed.
In addition to that, these event fields can be added to the `Swappable fields`. A typical example of that is `source.ip` and `destination.ip`.
@@ -218,16 +218,16 @@ In addition to that, these event fields can be added to the `Swappable fields`.
Fields used in the `group-by` clause of the pattern will be used as similarity strategy.
!!! note
- You can learn more about similarity strategies in this [section](../../investigate/alerts/#similarity-strategies).
-
+ You can learn more about similarity strategies in this [section](../investigate/alerts.md#similarity-strategies).
+
### Edit your custom rules
-When the Rule Details panel is open, you can click on the `Configure` icon at the top right to edit the rule's configuration.
-For Custom rule, you will be able to edit its main definition:
+When the Rule Details panel is open, you can click on the `Configure` icon at the top right to edit the rule's configuration.
+For Custom rule, you will be able to edit its main definition:
- General definition of the rule
- Detection Pattern
-- Security alerts (event fields can be selected to define the similarity strategy in the section `Similarity strategy`).
+- Security alerts (event fields can be selected to define the similarity strategy in the section `Similarity strategy`).
For an MSSP communty, when you edit this part and your rule is multi-communities, changes will be shared with all your managed communities.
@@ -237,7 +237,7 @@ For an MSSP communty, when you edit this part and your rule is multi-communities
For all types of rules, You will be able to limit its applicable scope with the following filters. For an MSSP community, these filters will be applied only on the community selected:
-- **Alert Filters**: are additional patterns that you can add to any rule to exclude matching events. This is useful to exclude known false positives so that your detections are always spot on. It is often easier to create Alert Filters [directly from an Alert](../../investigate/alerts/#create-an-alert-filter).
+- **Alert Filters**: are additional patterns that you can add to any rule to exclude matching events. This is useful to exclude known false positives so that your detections are always spot on. It is often easier to create Alert Filters [directly from an Alert](../investigate/alerts.md#create-an-alert-filter).
- **Entities**: select the entities this rule should apply to. By default, rules apply to all entities.
- **Assets**: select the assets this rule should apply to. By default, rules apply to all assets
@@ -259,7 +259,7 @@ To prevent known false positives from raising alerts in the future:
![notif_rules](/assets/operation_center/rules_catalog/notification_rules.png){ align=right }
-We continuously update the rules catalog with new rules.
+We continuously update the rules catalog with new rules.
To keep posted, we introduced a dedicated trigger in the Notification Center.
This new notification trigger enables the creation of notification rules that triggers when a new detection rule is added to the Rules Catalog by Sekoia.io.
diff --git a/docs/xdr/features/integrations/interconnect_sekoia_with_xsoar.md b/docs/xdr/features/integrations/interconnect_sekoia_with_xsoar.md
index c1cdd5b045..475d9eeabd 100644
--- a/docs/xdr/features/integrations/interconnect_sekoia_with_xsoar.md
+++ b/docs/xdr/features/integrations/interconnect_sekoia_with_xsoar.md
@@ -15,21 +15,21 @@ This integration serves as an extension that leverages the **SEKOIA.IO Defend (X
* `IoC Collections`
!!! Note
- To create your API Key, follow this [documentation](../../../../getting_started/manage_api_keys/#create-an-api-key).
+ To create your API Key, follow this [documentation](/getting_started/manage_api_keys.md#create-an-api-key).
## Configure
This section of the documentation will guide you through the steps required to configure the SEKOIA.IO DEFEND (XDR) extension.
1. In your Palo Alto Cortex XSOAR instance, navigate to the Marketplace and search for **SekoiaXDR**.
-![!View of Sekoia.io XDR extension in the marketplace](../../../assets/operation_center/external_integrations/sekoia_extension_marketplace.png)
+![!View of Sekoia.io XDR extension in the marketplace](/assets/operation_center/external_integrations/sekoia_extension_marketplace.png)
2. Select the **SEKOIAXDR** pack to open its description, then click the Install button to add the pack to your instance.
-![!View of Sekoia.io XDR extension install button](../../../assets/operation_center/external_integrations/sekoia_installation.png)
+![!View of Sekoia.io XDR extension install button](/assets/operation_center/external_integrations/sekoia_installation.png)
3. Once installed, go to Settings. You should see **SEKOIAXDR** listed. Click the Add instance button to create a new instance.
-![!View of Sekoia.io XDR instance in XSOAR UI](../../../assets/operation_center/external_integrations/sekoia_pack_instance.png)
+![!View of Sekoia.io XDR instance in XSOAR UI](/assets/operation_center/external_integrations/sekoia_pack_instance.png)
4. Complete the required fields in the configuration form, including the API key, and then save your configuration.
-![!View of Sekoia.io XDR configuration part](../../../assets/operation_center/external_integrations/xsoar_config_part.png)
+![!View of Sekoia.io XDR configuration part](/assets/operation_center/external_integrations/xsoar_config_part.png)
5. Use the Test button to validate your configuration (a successful test result should display in green).
-![!View of Sekoia.io XDR test button](../../../assets/operation_center/external_integrations/xsoar_test_button.png)
+![!View of Sekoia.io XDR test button](/assets/operation_center/external_integrations/xsoar_test_button.png)
You can now utilize the integration. For example, you can run a command like `!sekoia-xdr-list-assets limit=5 assets_type="computer"`.
diff --git a/docs/xdr/features/investigate/alerts.md b/docs/xdr/features/investigate/alerts.md
index fe445111a9..8d55e87832 100644
--- a/docs/xdr/features/investigate/alerts.md
+++ b/docs/xdr/features/investigate/alerts.md
@@ -61,7 +61,7 @@ There are three possibilities to define the similarity strategy to use. By order
Rules written by Sekoia.io and available in the Rules Catalog may define specific similarity strategies.
-Similarity strategies by rule can be defined during the rule creation process. Learn more about how to do it in [this section](../../detect/rules_catalog/#custom-similarity-strategy).
+Similarity strategies by rule can be defined during the rule creation process. Learn more about how to do it in [this section](../detect/rules_catalog.md#custom-similarity-strategy).
#### Similarity by event
diff --git a/docs/xdr/features/investigate/cases.md b/docs/xdr/features/investigate/cases.md
index d405bc79ba..9f4ba56714 100644
--- a/docs/xdr/features/investigate/cases.md
+++ b/docs/xdr/features/investigate/cases.md
@@ -78,7 +78,7 @@ The Events tab lists the events that are associated with the case in a display s
Events associated with the case are:
- Events that raised an alert that was added to the case.
-- Events that were [directly added to the case](../events/#adding-events-to-cases).
+- Events that were [directly added to the case](events.md#adding-events-to-cases).
When interacting with individual values, it is possible to:
@@ -97,11 +97,11 @@ The "Search Events with this value" feature can be used to perform a search into
![search-events](/assets/operation_center/alerts/search-events.png){align=right}
-The search query is automatically created from selected values.
+The search query is automatically created from selected values.
-To search events with a value:
+To search events with a value:
-- On the `case` page, go to `events` tab
+- On the `case` page, go to `events` tab
- Click on `Toggle value selection` button in the upper right of the logs list
- Select `values` you want to search for by clicking on them in the logs list
- Click on the button `Perform a search` as shown in the screenshot
@@ -117,7 +117,7 @@ The Graph Investigation Tab is presenting the analyst with a graphical visualiza
The following items appear on the graph:
- `Observables`: these are automatically extracted from events (IP addresses, Domain Names, URLs, User Account, etc.)
-- `Observable Relationships`: relationships between observables are represented by arrows linking them on the graph. Relationships are extracted from events using the [Smart Description](../../collect/intakes/#smart-descriptions) definitions
+- `Observable Relationships`: relationships between observables are represented by arrows linking them on the graph. Relationships are extracted from events using the [Smart Description](../collect/intakes.md) definitions
- `CTI Objects`: STIX objects from the Intelligence Center that provide additional context
- `STIX relationships` between Threat Objects
diff --git a/docs/xdr/features/investigate/events.md b/docs/xdr/features/investigate/events.md
index e910de1c9e..c1388031c1 100644
--- a/docs/xdr/features/investigate/events.md
+++ b/docs/xdr/features/investigate/events.md
@@ -8,7 +8,7 @@ In this documentation, we will dive into the different parts that constitute the
- The [Search bar](#search-bar) and its filtering and sharing options
- The [list of events](#log-listing) and the detailed view of your parsed events
- The mechanism behind [events enrichment](#events-enrichment) or how events are contextualized in Sekoia.io
-- The [aggregation](#aggregation) feature and how to create an [anomaly detection rule](#Create-Anomaly-Detection-rule-from-the-aggregation-view) from your query
+- The [aggregation](#aggregation) feature and how to create an [anomaly detection rule](#create-anomaly-detection-rule-from-the-aggregation-view) from your query
!!! note
To send your logs to Sekoia.io, please refer to this [section](https://docs.sekoia.io/integration/ingestion_methods/).
diff --git a/docs/xdr/features/investigate/query_builder.md b/docs/xdr/features/investigate/query_builder.md
index f3ee1b0d1f..51071a5883 100644
--- a/docs/xdr/features/investigate/query_builder.md
+++ b/docs/xdr/features/investigate/query_builder.md
@@ -4,7 +4,7 @@ Start exploring your data with the Query Builder. Hunt for threats, obtain analy
With this form, you can aggregate data to extract new insights, helping you make informed decisions. Additionally, the Query Builder enables the visualization of data through various types of charts, enriching your reporting capabilities.
-Currently, the Alerts data source is available, along with the Events source and the Cases source, with plans to introduce more sources in the future.
+Currently, the Alerts data source is available, along with the Events source and the Cases source, with plans to introduce more sources in the future.
![query builder](/assets/operation_center/events/qb-run.gif){: style="max-width:100%"}
@@ -62,7 +62,7 @@ Use the following operators to define your conditions in the `WHERE` clause.
| > | Strictly more than |
| >= | More than or equal to |
-### Alert properties
+### Alert properties
When using the Query Builder with Alerts as a source, users can filter and manipulate queries based on the following alert properties:
@@ -187,10 +187,10 @@ The Line Chart is designed to visualize data points over a continuous range, mak
- In the **`X-axis`**, select the column you want to use for the time or continuous variable. This column can be of any data type.
- In the **`Y-axis`**, select the column that contains the numeric values. This column must consist of numeric data.
-### Options
+### Options
#### Breakdown by
-The **Breakdown By** feature allows you to analyze your data in more depth across multiple visualization types, including Bar Charts, Column Charts, and Line Charts.
+The **Breakdown By** feature allows you to analyze your data in more depth across multiple visualization types, including Bar Charts, Column Charts, and Line Charts.
When you include a **Group By** clause in your query, you can break down your data by a specific attribute. This enables you to visualize how different categories or values contribute to the overall dataset.
@@ -220,7 +220,7 @@ Choose a title for your query and click on the `Save` button.
Your last result is also saved and will be displayed when you open your saved query.
-!!! note
+!!! note
- Saved queries are visible to all users of your community.
- In MSSP multi-tenancy, saved queries are not visible in sub-communities.
@@ -234,6 +234,6 @@ JSON Lines is a convenient format for storing structured data that may be proces
See [JSON Lines documentation](https://jsonlines.org/) for more details.
-## Add query to dashboard
+## Add query to dashboard
-Queries can be added to dashboards. To read more about this feature, check our documentation on [dashboards](/xdr/features/report/dashboards/#query-builders-widgets).
+Queries can be added to dashboards. To read more about this feature, check our documentation on [dashboards](/xdr/features/report/dashboards.md#query-builders-widgets).
diff --git a/docs/xdr/features/report/dashboards.md b/docs/xdr/features/report/dashboards.md
index 6fde9ef8f8..b1b3107e18 100644
--- a/docs/xdr/features/report/dashboards.md
+++ b/docs/xdr/features/report/dashboards.md
@@ -1,6 +1,6 @@
# Dashboards
-Dashboards provide a powerful and intuitive way to visualize and monitor key metrics and data in real-time.
+Dashboards provide a powerful and intuitive way to visualize and monitor key metrics and data in real-time.
Users can create customized views by combining various widgets, offering insights into different aspects of their operations, security posture, or other critical areas.
A key aspect of dashboards is the ability to use query builders, which enable users to create custom data queries directly within the dashboard. This allows for highly tailored data analysis and visualization, empowering users to explore specific datasets and derive insights that are most relevant to their needs.
@@ -11,7 +11,7 @@ With features like time range configuration, manual and automatic data refresh,
Accounts on Sekoia.io come with a preconfigured dashboard that gives a synthetic view of the current community activity, either from an operational security perspective (risk level, number of alerts, etc.) or from an activity perspective (list of last posted comments, last created alerts, etc.).
## Time Range
-Managing the time range for data displayed in your dashboard is essential for analyzing trends and patterns over specific periods.
+Managing the time range for data displayed in your dashboard is essential for analyzing trends and patterns over specific periods.
The dashboard offers flexible options for configuring the time range for each widget and the overall dashboard.
**Widget-Specific Time Range**
@@ -27,7 +27,7 @@ The dashboard's overall date range can be set using the range selector, which is
By configuring these settings, you can ensure that your dashboard provides the most relevant and consistent view of data, tailored to the specific time periods that matter most to your analysis.
## Refreshing Data
-Ensuring that the data displayed on your dashboard is up-to-date is critical for accurate monitoring and analysis.
+Ensuring that the data displayed on your dashboard is up-to-date is critical for accurate monitoring and analysis.
The dashboard provides several options for refreshing the data presented in the widgets.
By default, the dashboard shows data that was computed during the last refresh. This means that when you first view a dashboard, the information is based on the most recent refresh that occurred.
@@ -56,7 +56,7 @@ To create a new dashboard, you have to:
5. Click on `Add widget` and select a widget from the list in the right panel
6. Drag the needed widget in the workspace and edit it following your needs
7. Click on `Save`
-
+
To access your dashboards, you have to click on the name of the dashboard in the upper left of the screen and choose a dashboard from the list.
!!! note
@@ -83,31 +83,31 @@ The Default Dashboard cannot be deleted.
## Add, edit and organize widgets
-Dashboards can be easily customized using a variety of widgets, allowing users to tailor the interface to their specific needs.
+Dashboards can be easily customized using a variety of widgets, allowing users to tailor the interface to their specific needs.
-### Add widgets
+### Add widgets
To add widgets to your dashboard, click on the `Add New Widget` button located in the top right corner of the screen. From the panel, select the desired widgets from the available queries and presets.
-### Edit widgets
+### Edit widgets
To edit an existing widget, click the `three dots` in the upper right corner of the widget, and then select **Edit Widget**.
- If the widget is a **query visualization**, you will be redirected to the query settings page, where you can edit the query parameters as needed.
- If the widget is a **preset** from the widgets' library, the editing panel will appear, allowing you to adjust options such as the time range or visualization type.
-### Reorganize widgets
+### Reorganize widgets
To reorganize the layout of widgets on your dashboard, click the `Edit button` in the top right corner of the screen. This mode enables you to change both the position and size of each widget. You can easily drag and drop widgets to your preferred locations. Don’t forget to click `Save` to apply your changes!
-### Remove widgets
-To remove widgets from your dashboard, click the `three dots` and select **Delete from dashboard**.
+### Remove widgets
+To remove widgets from your dashboard, click the `three dots` and select **Delete from dashboard**.
## Query Builders Widgets
Query builders can be inserted into dashboards to streamline data visualization and management. It allows you to easily integrate existing query builders into multiple dashboards, ensuring that any updates made to a query on the query page are automatically reflected across all dashboards where it is used. By leveraging this integration, you maintain consistency and reduce the need for manual updates, enhancing the efficiency and accuracy of your data visualizations.
-The Query widget in the dashboard utilizes the visualization settings saved with the query builder on the query page. For detailed information on how visualizations are managed, refer to the [documentation of Query Builders](/xdr/features/investigate/query_builder/).
+The Query widget in the dashboard utilizes the visualization settings saved with the query builder on the query page. For detailed information on how visualizations are managed, refer to the [documentation of Query Builders](/xdr/features/investigate/query_builder.md).
Changes made to a query builder on the query builder page are automatically propagated to all dashboards that use that query builder. It ensures that updates are reflected without requiring manual intervention.
On the query builder’s edit page, you can view a list of all dashboards utilizing the query builder. This helps track where changes will take effect.
@@ -117,7 +117,7 @@ On the query builder’s edit page, you can view a list of all dashboards utiliz
## Built-in Widgets
-Dashboards come equipped with a variety of built-in widgets designed to provide immediate access to critical data and insights.
+Dashboards come equipped with a variety of built-in widgets designed to provide immediate access to critical data and insights.
These widgets are pre-configured for common use cases, allowing users to quickly add valuable information to their dashboards without the need for custom queries or extensive configuration.
The built-in widgets are organized into categories to help users easily find the tools they need:
diff --git a/docs/xdr/index.md b/docs/xdr/index.md
index c23fb3ecfe..407af4d5e6 100644
--- a/docs/xdr/index.md
+++ b/docs/xdr/index.md
@@ -11,8 +11,8 @@ It allows you to easily integrate and analyze the events produced by your applic
To defend your business, you need to know what's going on. Monitoring your assets is a prerequisite for their security.
Sekoia.io is able to collect logs via various mechanisms, setting it up on your end is easy!
-1. Find out the supported [ingestion methods](/integration/ingestion_methods/).
-2. Take a look at our pre-defined [Integrations](/integration/categories/)' list that keeps growing to suit all of your needs.
+1. Find out the supported [ingestion methods](/integration/ingestion_methods/index.md).
+2. Take a look at our pre-defined [Integrations](/integration/categories/index.md)' list that keeps growing to suit all of your needs.
3. Configure your [Intakes](features/collect/intakes.md) to collect your logs.
4. Organize your intakes in [Entities](features/collect/entities.md).
5. Enrich your events with your [Assets](features/collect/assets.md).
diff --git a/docs/xdr/usecases/playbook/Add_UserAgent_in_comment.md b/docs/xdr/usecases/playbook/Add_UserAgent_in_comment.md
index 4459285393..aa31233c0a 100644
--- a/docs/xdr/usecases/playbook/Add_UserAgent_in_comment.md
+++ b/docs/xdr/usecases/playbook/Add_UserAgent_in_comment.md
@@ -12,11 +12,11 @@ This use case describes how to enrich the comments of an alert with the User age
* `SIC_WRITE_ALERTS_COMMENT`
!!!note
- To create your API Key, follow this [documentation](/getting_started/manage_api_keys/#create-an-api-key).
+ To create your API Key, follow this [documentation](/getting_started/manage_api_keys.md#create-an-api-key).
## Playbook configuration
-Find the playbook configuration below:
+Find the playbook configuration below:
![Playbook Add_UserAgent_in_comment](/assets/playbooks/library/UseCases/Add_UserAgent_in_comment.png)
@@ -29,14 +29,14 @@ Find the playbook configuration below:
!!!note
- The query could vary according to the event types / intakes.
+ The query could vary according to the event types / intakes.
If the events does not contain user Agent, it will not retrieve any events
`Get Event Field Common Values`
- **earliest_time** `{{ ((node.2.first_seen_at | iso8601_to_timestamp) - 3600000) | timestamp_to_iso8601 }}`
- **fields** `user_agent.original`
- - **latest_time** `now`
+ - **latest_time** `now`
- **query** `source.ip:"{{ node.2['source'] }}" AND destination.ip:"{{ node.2['target'] }}" AND entity.uuid:"{{ node.2['entity']['uuid'] }}"`
-
+
`Comment Alert`
- **content** `{{ node.3| jsonpath("$.fields[*].common_values[*]['value']", True) }}% of time this user-agent "{{ node.3| jsonpath("$.fields[*].common_values[*]['name']", True) }}}" was seen on these events during the last 60 minutes.`
diff --git a/docs/xdr/usecases/playbook/ExtractIP_from_Url_country.md b/docs/xdr/usecases/playbook/ExtractIP_from_Url_country.md
index 54038e1ac0..ab798d13ed 100644
--- a/docs/xdr/usecases/playbook/ExtractIP_from_Url_country.md
+++ b/docs/xdr/usecases/playbook/ExtractIP_from_Url_country.md
@@ -1,6 +1,6 @@
-# Extract IP from URL & Country
+# Extract IP from URL & Country
-This use case describes how to extract an IP address from a URL and a country.
+This use case describes how to extract an IP address from a URL and a country.
## Prerequisites
@@ -10,7 +10,7 @@ This use case describes how to extract an IP address from a URL and a country.
* Be an Administrator or an Analyst of the community.
* Have an API Key with a role that contains at least the permission "View alerts"
-> To create your API Key, follow this [documentation](/getting_started/manage_api_keys/).
+> To create your API Key, follow this [documentation](/getting_started/manage_api_keys.md).
## Playbook configuration
@@ -29,12 +29,12 @@ For example, we would like to extract the IP `65.74.70.888` from `url.original :
Read JSON File module, **Jsonpath** = `{{ value.split()[0].split("/ManageIP/New/")[1] }}`
```
-This Jinja recipe consists in splitting the URL into 2 strings: the one preceding the string /ManageIP/New/ and the one succeeding it, which corresponds to the IP address.
+This Jinja recipe consists in splitting the URL into 2 strings: the one preceding the string /ManageIP/New/ and the one succeeding it, which corresponds to the IP address.
The value is set with the second string stored in the array, with the use of [1].
```
!!!note
- You can find the CODE Feature section in documentation page and in particular built-in filters existing in Jinja [here](https://jinja.palletsprojects.com/en/3.0.x/templates/#builtin-filters).
+ You can find the CODE Feature section in documentation page and in particular built-in filters existing in Jinja [here](https://jinja.palletsprojects.com/en/3.0.x/templates/#builtin-filters).
(split is coming from Python)
### Extract IP from Country
diff --git a/docs/xdr/usecases/playbook/Get_events_information_from_alert.md b/docs/xdr/usecases/playbook/Get_events_information_from_alert.md
index 496ac70e8b..9e1e54fa28 100644
--- a/docs/xdr/usecases/playbook/Get_events_information_from_alert.md
+++ b/docs/xdr/usecases/playbook/Get_events_information_from_alert.md
@@ -14,7 +14,7 @@ This use case describes how to get the MAC address of events associated with an
* `SIC_READ_EVENT_STATS`
!!! note
- To create your API Key, follow this [documentation](/getting_started/manage_api_keys).
+ To create your API Key, follow this [documentation](/getting_started/manage_api_keys.md).
## Playbook configuration
diff --git a/mkdocs.yml b/mkdocs.yml
index 9c25cb86c7..2bdb7cebd2 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -14,6 +14,8 @@ extra_javascript:
- javascript/lightgallery.min.js
- javascript/hotjar.js
- javascript/posthog.js
+- javascript/swagger-converter.js
+- javascript/openapi.js
markdown_extensions:
- admonition
- attr_list
@@ -27,8 +29,12 @@ markdown_extensions:
- pymdownx.tabbed:
alternate_style: true
- markdown_include.include
-- lightgallery
- pymdownx.snippets
+- plugins.custom_lightgallery
+validation:
+ omitted_files: ignore
+ links:
+ absolute_links: relative_to_docs
nav:
- Getting started:
- Overview: getting_started/index.md
@@ -119,18 +125,6 @@ nav:
- Assets: xdr/FAQ/Assets_qa.md
- Sekoia.io Endpoint agent: xdr/FAQ/SEKOIA_Endpoint_Agent.md
- Datetime representation: xdr/FAQ/datetime.md
- - Develop:
- - REST API:
- - Quickstart: xdr/develop/rest_api/quickstart.md
- - Authentication and Community: xdr/develop/rest_api/community.md
- - Dashboard: xdr/develop/rest_api/dashboard.md
- - Configuration: xdr/develop/rest_api/configuration.md
- - Parser: xdr/develop/rest_api/parser.md
- - Alert: xdr/develop/rest_api/alert.md
- - Assets: xdr/develop/rest_api/assets_v2.md
- - Playbooks: xdr/develop/rest_api/playbooks.md
- - Query Builder: xdr/develop/rest_api/query_builder.md
- - Telemetry: xdr/develop/rest_api/telemetry.md
- Sekoia Intelligence (CTI):
- Introduction: cti/index.md
- Features:
@@ -161,121 +155,6 @@ nav:
- Anomali ThreatStream: cti/features/integrations/anomali.md
- PaloAlto Cortex XSOAR: cti/features/integrations/paloalto_xsoar.md
- ThreatQuotient: cti/features/integrations/threatquotient.md
- - Develop:
- - REST API:
- - Quickstart: cti/develop/rest_api/quickstart.md
- - Authentication and Community: cti/develop/rest_api/community.md
- - Intelligence: cti/develop/rest_api/intelligence.md
- - Enrichment: cti/develop/rest_api/enrichments.md
- - Telemetry: cti/develop/rest_api/telemetry.md
- - Dashboard: cti/develop/rest_api/dashboard.md
- - Playbooks: cti/develop/rest_api/playbooks.md
- - External Dynamic List: cti/develop/rest_api/edl-gateway.md
-- Sekoia.io TIP:
- - Introduction: tip/index.md
- - Features:
- - Data Models: tip/features/data_model.md
- - Consume:
- - Intelligence: tip/features/consume/intelligence.md
- - Observables: tip/features/consume/observables.md
- - Outgoing Feeds: tip/features/consume/feeds.md
- - Graph Explorations: tip/features/consume/graph_explorations.md
- - Enrichers: tip/features/consume/enrichers.md
- - Export: tip/features/consume/export.md
- - IOCs Collections: tip/features/consume/ioccollections.md
- - Produce and investigate:
- - Content Proposals: tip/features/produce/content_proposals.md
- - Incoming Feeds: tip/features/produce/incoming_feeds.md
- - Warning Rules: tip/features/produce/warning_rules.md
- - Expiration Rules: tip/features/produce/expiration_rules.md
- - Monitor:
- - Dashboards: tip/features/monitor/dashboard.md
- - Threat Landscape: tip/features/monitor/threat_landscape.md
- - External Integrations:
- - Overview: tip/features/integrations/index.md
- - API: tip/features/integrations/api.md
- - TAXII: tip/features/integrations/taxii.md
- - Cortex Analyzer: tip/features/integrations/thehive.md
- - MISP Feed: tip/features/integrations/misp.md
- - Microsoft Sentinel: tip/features/integrations/microsoft-sentinel.md
- - OpenCTI: tip/features/integrations/opencti.md
- - Splunk: tip/features/integrations/splunk.md
- - PaloAlto Cortex XSOAR: tip/features/integrations/paloalto_xsoar.md
- - Automate:
- - Playbooks: tip/features/automate/index.md
- - Manage accounts: tip/features/automate/manage-accounts.md
- - Navigate playbooks: tip/features/automate/navigate-playbooks.md
- - Build playbooks: tip/features/automate/build-playbooks.md
- - Triggers: tip/features/automate/triggers.md
- - Operators: tip/features/automate/operators.md
- - Actions: tip/features/automate/actions.md
- - Actions Library:
- - Applicative:
- - Mandrill: tip/features/automate/library/mandrill.md
- - Mattermost: tip/features/automate/library/mattermost.md
- - Microsoft Windows Server: tip/features/automate/library/microsoft-windows-server.md
- - PagerDuty: tip/features/automate/library/pagerduty.md
- - Cloud Providers:
- - AWS: tip/features/automate/library/aws.md
- - Google: tip/features/automate/library/google.md
- - Collaboration Tools:
- - Atlassian JIRA: tip/features/automate/library/atlassian-jira.md
- - Git: tip/features/automate/library/git.md
- - ServiceNow: tip/features/automate/library/servicenow.md
- - The Hive: tip/features/automate/library/the-hive.md
- - The Hive V5: tip/features/automate/library/the-hive-v5.md
- - Email:
- - Vade Secure: tip/features/automate/library/vade-secure.md
- - Endpoint:
- - CrowdStrike Falcon: tip/features/automate/library/crowdstrike-falcon.md
- - HarfangLab: tip/features/automate/library/harfanglab.md
- - Panda Security: tip/features/automate/library/panda-security.md
- - SentinelOne: tip/features/automate/library/sentinelone.md
- - Sophos: tip/features/automate/library/sophos.md
- - WithSecure: tip/features/automate/library/withsecure.md
- - Generic:
- - HTTP: tip/features/automate/library/http.md
- - OpenAI: tip/features/automate/library/openai.md
- - RSS: tip/features/automate/library/rss.md
- - Sekoia.io: tip/features/automate/library/sekoia-io.md
- - Utils: tip/features/automate/library/utils.md
- - IAM:
- - Microsoft Active Directory: tip/features/automate/library/microsoft-active-directory.md
- - Microsoft Entra ID: tip/features/automate/library/microsoft-entra-id.md
- - Network:
- - Fortigate Firewalls: tip/features/automate/library/fortigate-firewalls.md
- - Zscaler: tip/features/automate/library/zscaler.md
- - Overview: tip/features/automate/library/overview.md
- - Threat Intelligence:
- - BinaryEdge's API: tip/features/automate/library/binaryedge-s-api.md
- - Censys: tip/features/automate/library/censys.md
- - Certificate Transparency: tip/features/automate/library/certificate-transparency.md
- - Detection Rules: tip/features/automate/library/detection-rules.md
- - Digital Shadows: tip/features/automate/library/digital-shadows.md
- - GLIMPS: tip/features/automate/library/glimps.md
- - IKnowWhatYouDownload: tip/features/automate/library/iknowwhatyoudownload.md
- - IPInfo: tip/features/automate/library/ipinfo.md
- - IPtoASN: tip/features/automate/library/iptoasn.md
- - MISP: tip/features/automate/library/misp.md
- - MWDB: tip/features/automate/library/mwdb.md
- - Nybble: tip/features/automate/library/nybble.md
- - OSINT: tip/features/automate/library/osint.md
- - Onyphe: tip/features/automate/library/onyphe.md
- - Public Suffix: tip/features/automate/library/public-suffix.md
- - RiskIQ: tip/features/automate/library/riskiq.md
- - Shodan: tip/features/automate/library/shodan.md
- - Tranco: tip/features/automate/library/tranco.md
- - Triage: tip/features/automate/library/triage.md
- - VirusTotal: tip/features/automate/library/virustotal.md
- - Whois: tip/features/automate/library/whois.md
- - Develop:
- - REST API:
- - Quickstart: tip/develop/rest_api/quickstart.md
- - Authentication and Community: tip/develop/rest_api/community.md
- - Intelligence: tip/develop/rest_api/intelligence.md
- - Enrichment: tip/develop/rest_api/enrichments.md
- - Dashboard: tip/develop/rest_api/dashboard.md
- - Playbooks: tip/develop/rest_api/playbooks.md
- Integrations:
- Introduction: integration/index.md
- Ingestion methods:
@@ -564,38 +443,16 @@ nav:
- Overview: integration/faq/overview.md
- General Questions:
- Bug VS Improvement Requests: integration/faq/general_questions/bug_and_improvement_requests.md
+- API Documentation: developer/api.md
plugins:
- search: null
- redirects:
redirect_maps:
- 'api/automation: symphony orchestrator': xdr/develop/rest_api/playbooks.md
- api/dashboards: xdr/develop/rest_api/dashboard.md
- api/identity & authentication: xdr/develop/rest_api/community.md
- 'api/ingest: manage and test event parsers': xdr/develop/rest_api/parser.md
- 'api/intelligence center: cyber threat intelligence database': cti/develop/rest_api/intelligence.md
- 'api/intelligence center: enrichment': cti/develop/rest_api/enrichments.md
- 'api/operation center: alerts & case management': xdr/develop/rest_api/alert.md
- 'api/operation center: asset management': xdr/develop/rest_api/assets_v2.md
- 'api/operation center: rules, entities, intakes, events.md': xdr/develop/rest_api/configuration.md
- api/profile & permissions: xdr/develop/rest_api/community.md
- cti/develop/rest_api/identity_and_authentication.md: cti/develop/rest_api/community.md
- develop/rest_api/community.md: xdr/develop/rest_api/community.md
- develop/rest_api/dashboard.md: xdr/develop/rest_api/community.md
- develop/rest_api/identity_and_authentication.md: xdr/develop/rest_api/community.md
- develop/rest_api/intelligence_center/enrichments.md: cti/develop/rest_api/enrichments.md
- develop/rest_api/intelligence_center/intelligence.md: cti/develop/rest_api/intelligence.md
- develop/rest_api/operation_center/alert.md: xdr/develop/rest_api/alert.md
- develop/rest_api/operation_center/assets.md: xdr/develop/rest_api/assets_v2.md
- develop/rest_api/operation_center/configuration.md: xdr/develop/rest_api/configuration.md
- develop/rest_api/operation_center/parser.md: xdr/develop/rest_api/parser.md
- develop/rest_api/playbooks.md: xdr/develop/rest_api/playbooks.md
- develop/rest_api/quickstart.md: xdr/develop/rest_api/quickstart.md
getting_started/2fa.md: getting_started/account_security.md
getting_started/apikey_creation.md: getting_started/manage_api_keys.md
getting_started/first_steps.md: getting_started/index.md
getting_started/inviting_users_to_join_your_community.md: getting_started/invite_users.md
intelligence_center.md: cti/index.md
- intelligence_center/api.md: cti/develop/index.md
intelligence_center/dashboard.md: cti/features/monitor/dashboard.md
intelligence_center/data_export.md: cti/features/consume/export.md
intelligence_center/data_model.md: cti/features/data_model.md
@@ -632,11 +489,9 @@ plugins:
playbooks/overview.md: xdr/features/automate/index.md
playbooks/triggers.md: xdr/features/automate/triggers.md
searching/search_events.md: xdr/features/investigate/events.md
- tip/develop/rest_api/identity_and_authentication.md: tip/develop/rest_api/community.md
user_center.md: getting_started/index.md
user_center/apikeys.md: getting_started/manage_api_keys.md
user_center/multi_factor_authentication.md: getting_started/account_security.md
- xdr/develop/rest_api/identity_and_authentication.md: xdr/develop/rest_api/community.md
xdr/features/collect/ingestion_methods/https/format.md: integration/ingestion_methods/https/format.md
xdr/features/collect/ingestion_methods/index.md: integration/ingestion_methods/index.md
xdr/features/collect/ingestion_methods/sekoiaio_forwarder.md: integration/ingestion_methods/syslog/sekoiaio_forwarder.md
@@ -774,7 +629,7 @@ plugins:
xdr/features/collect/integrations/network/cisco/cisco_nx_os.md: integration/categories/network/cisco_nx_os.md
xdr/features/collect/integrations/network/cisco/cisco_wsa.md: integration/categories/network_security/cisco_wsa.md
xdr/features/collect/integrations/network/citrix_netscaler_adc.md: integration/categories/network/citrix_netscaler_adc.md
- xdr/features/collect/integrations/network/clavister_ng_fw.md: integration/categories/network/clavister_ng_fw.md
+ xdr/features/collect/integrations/network/clavister_ng_fw.md: integration/categories/network_security/clavister_ng_fw.md
xdr/features/collect/integrations/network/efficientip_solidserver_ddi.md: integration/categories/network/efficientip_solidserver_ddi.md
xdr/features/collect/integrations/network/ekinops_oneos.md: integration/categories/network/ekinops_oneos.md
xdr/features/collect/integrations/network/f5-big-ip.md: integration/categories/network/f5-big-ip.md
@@ -807,8 +662,8 @@ plugins:
xdr/features/collect/integrations/network/watchguard_firebox.md: integration/categories/network_security/watchguard_firebox.md
xdr/features/investigate/dork_language.md: xdr/features/investigate/events_query_language.md
- redoc
-- intakes_by_uuid
-- modules_by_uuid
+- integration_by_uuid
+- sass
repo_url: https://github.com/SEKOIA-IO/documentation
site_name: Sekoia.io Documentation
site_url: https://docs.sekoia.io
@@ -822,6 +677,7 @@ theme:
- content.code.annotate
- content.action.edit
- content.code.copy
+ - navigation.sections
font: false
include_search_page: true
lang: en
diff --git a/plugins/custom_lightgallery.py b/plugins/custom_lightgallery.py
new file mode 100644
index 0000000000..f414982c79
--- /dev/null
+++ b/plugins/custom_lightgallery.py
@@ -0,0 +1,77 @@
+from markdown import Extension
+from markdown.treeprocessors import Treeprocessor
+from xml.etree.ElementTree import Element
+import re
+
+
+class ImagesTreeprocessor(Treeprocessor):
+ """
+ Rewritten from https://github.com/g-provost/lightgallery-markdown
+ to be compatible with python-markdown >= 3.3.7
+
+ Enables lightgallery.js on image tags of the form ![!blah](img.png)
+ """
+
+ def __init__(self, md, config):
+ super().__init__(md)
+ self.re = re.compile(r"^!.*")
+ self.config = config
+
+ def run(self, root):
+ parent_map = {c: p for p in root.iter() for c in p}
+ images = root.iter("img")
+ for image in images:
+ desc = image.attrib.get("alt", "")
+ if self.re.match(desc):
+ desc = desc.lstrip("!")
+ image.set("alt", desc)
+ parent = parent_map[image]
+ ix = list(parent).index(image)
+
+ div_node = Element("div")
+ div_node.set("class", "lightgallery")
+ new_node = Element("a")
+ new_node.set("href", image.attrib["src"])
+
+ if self.config["show_description_in_lightgallery"]:
+ new_node.set("data-sub-html", desc)
+
+ new_node.append(image)
+ div_node.append(new_node)
+ parent.insert(ix, div_node)
+ parent.remove(image)
+
+ if self.config["show_description_as_inline_caption"]:
+ inline_caption_node = Element("p")
+ inline_caption_node.set(
+ "class", self.config["custom_inline_caption_css_class"]
+ )
+ inline_caption_node.text = desc
+ parent.insert(ix + 1, inline_caption_node)
+
+
+class LightGalleryExtension(Extension):
+ def __init__(self, **kwargs):
+ self.config = {
+ "show_description_in_lightgallery": [
+ True,
+ "Adds the description as caption in lightgallery dialog. Default: True",
+ ],
+ "show_description_as_inline_caption": [
+ False,
+ "Adds the description as inline caption below the image. Default: False",
+ ],
+ "custom_inline_caption_css_class": [
+ "",
+ "Custom CSS classes which are applied to the inline caption paragraph. Multiple classes are separated via space. Default: empty",
+ ],
+ }
+ super().__init__(**kwargs)
+
+ def extendMarkdown(self, md):
+ config = self.getConfigs()
+ md.treeprocessors.register(ImagesTreeprocessor(md, config), "lightbox", 15)
+
+
+def makeExtension(*_, **kwargs):
+ return LightGalleryExtension(**kwargs)
diff --git a/plugins/intakes_by_uuid.py b/plugins/intakes_by_uuid.py
deleted file mode 100644
index c37f03962f..0000000000
--- a/plugins/intakes_by_uuid.py
+++ /dev/null
@@ -1,93 +0,0 @@
-import re
-import string
-from pathlib import Path
-
-import mkdocs
-from mkdocs.config import Config
-from mkdocs.structure.files import File, Files
-from mkdocs.utils.meta import get_data
-
-
-class IntakesByUUIDPlugin(mkdocs.plugins.BasePlugin):
- """Reading Markdown files that contains an `uuid` metadata to provide
- a redirection.
-
- When such a file is identified, a new
- `operation_center/integration_catalog/uuid/$uuid.md` file is faked
- which will redirect to it."""
-
- template = """
-
-
-
- Redirecting...
-
-
-
-
-
-
-Redirecting...
-
-"""
-
- _redirection_table: dict[str, str] = {}
- _integrations: list[dict[str, str]] = []
-
- def on_files(self, files: Files, config: Config):
- new_files = []
-
- for source_file in files:
- if not source_file.src_path.endswith(".md"):
- continue
-
- filename = Path(config["docs_dir"]) / Path(source_file.src_path)
- with filename.open() as f:
- _, metadata = get_data(f.read())
-
- if "uuid" not in metadata or metadata.get("type").lower() != "intake":
- continue
-
- dialect_uuids = (uuid.strip() for uuid in metadata["uuid"].split(","))
-
- for dialect_uuid in dialect_uuids:
- self._redirection_table[dialect_uuid] = source_file.url
- self._integrations.append(
- {
- "uuid": dialect_uuid,
- "name": metadata.get("name"),
- "destination": source_file.url,
- }
- )
-
- newfile = File(
- path=f"operation_center/integration_catalog/uuid/{dialect_uuid}.md",
- src_dir="operation_center/integration_catalog/uuid",
- dest_dir=config["site_dir"],
- use_directory_urls=True,
- )
- new_files.append(newfile)
-
- new_files.append(File(
- path="integration/categories/index.md",
- src_dir="operation_center/integration_catalog/",
- dest_dir=config["site_dir"],
- use_directory_urls=True,
- ))
- files._files += new_files
-
- def on_page_read_source(self, page, config):
- if page.file.src_path.startswith("operation_center/integration_catalog/uuid/"):
- if page.file.name in self._redirection_table:
- return self.template.format(
- destination=self._redirection_table[page.file.name]
- )
-
- if page.file.src_path == "integration/categories/index.md":
- filename = Path(config["docs_dir"]) / Path(page.file.src_path)
- content = filename.open().read()
-
- for page in sorted(self._integrations, key=lambda x: x["name"]):
- content += f"- [{page['name']}](/{page['destination']})\n"
-
- return content
diff --git a/plugins/integration_by_uuid.py b/plugins/integration_by_uuid.py
new file mode 100644
index 0000000000..a6d6663251
--- /dev/null
+++ b/plugins/integration_by_uuid.py
@@ -0,0 +1,149 @@
+from pathlib import Path
+
+import mkdocs
+from mkdocs.config import Config
+from mkdocs.structure.files import File, Files
+from mkdocs.utils.meta import get_data
+
+
+class IntegrationByUUIDPlugin(mkdocs.plugins.BasePlugin):
+ """
+ Reading Markdown files that contains an `uuid` metadata to provide
+ a redirection.
+
+ When such a file is identified, a new
+ `operation_center/integration_catalog/uuid/$uuid.md` file is faked
+ which will redirect to it.
+ """
+
+ template = """
+
+
+
+ Redirecting...
+
+
+
+
+
+
+Redirecting...
+
+"""
+
+ _redirection_table: dict[str, str] = {}
+ _integrations: list[dict[str, str]] = []
+
+ def process_intake_file(
+ self,
+ source_file: File,
+ metadata: dict,
+ config: Config,
+ ):
+ new_files = []
+ dialect_uuids = (uuid.strip() for uuid in metadata["uuid"].split(","))
+
+ for dialect_uuid in dialect_uuids:
+ self._redirection_table[dialect_uuid] = source_file.url
+ self._integrations.append(
+ {
+ "uuid": dialect_uuid,
+ "name": metadata.get("name"),
+ "destination": source_file.url,
+ }
+ )
+
+ newfile = File(
+ path=f"operation_center/integration_catalog/uuid/{dialect_uuid}.md",
+ src_dir="operation_center/integration_catalog/uuid",
+ dest_dir=config["site_dir"],
+ use_directory_urls=True,
+ )
+ new_files.append(newfile)
+
+ new_files.append(
+ File(
+ path="integration/categories/index.md",
+ src_dir="operation_center/integration_catalog/",
+ dest_dir=config["site_dir"],
+ use_directory_urls=True,
+ )
+ )
+
+ return new_files
+
+ def process_module_file(
+ self,
+ source_file: File,
+ metadata: dict,
+ config: Config,
+ ):
+ self._redirection_table[metadata["uuid"]] = source_file.url
+
+ return [
+ File(
+ path=f"integration/action_library/uuid/{metadata['uuid']}.md",
+ src_dir="integration/action_library/uuid",
+ dest_dir=config["site_dir"],
+ use_directory_urls=True,
+ )
+ ]
+
+ def on_files(self, files: Files, config: Config):
+ new_files: list[File] = []
+ source_files = [
+ source_file for source_file in files if source_file.src_path.endswith(".md")
+ ]
+
+ for source_file in files:
+ if not source_file.src_path.endswith(".md"):
+ continue
+
+ filename = Path(config["docs_dir"]) / Path(source_file.src_path)
+ with filename.open() as f:
+ _, metadata = get_data(f.read())
+
+ if "uuid" not in metadata:
+ continue
+
+ if metadata.get("type").lower() == "intake":
+ new_files += self.process_intake_file(source_file, metadata, config)
+ elif metadata.get(
+ "type"
+ ).lower() == "playbook" and source_file.url.startswith(
+ "integration/action_library/"
+ ):
+ new_files += self.process_module_file(source_file, metadata, config)
+
+ for file in new_files:
+ if file.src_uri in files._src_uris:
+ files.remove(file)
+ files.append(file)
+
+ def on_page_read_source(self, page, config):
+ if page.file.src_path.startswith("operation_center/integration_catalog/uuid/"):
+ if page.file.name in self._redirection_table:
+ return self.template.format(
+ destination=self._redirection_table[page.file.name]
+ )
+
+ if page.file.src_path == "integration/categories/index.md":
+ filename = Path(config["docs_dir"]) / Path(page.file.src_path)
+ content = filename.open().read()
+
+ for page in sorted(self._integrations, key=lambda x: x["name"]):
+ href = (
+ f"/{page['destination']}".replace(
+ "/integration/categories/", ""
+ ).rstrip("/")
+ + ".md"
+ )
+ content += f"- [{page['name']}]({href})\n"
+
+ return content
+
+ if page.file.src_path.startswith("integration/action_library/uuid/"):
+ if page.file.name in self._redirection_table:
+ return self.template.format(
+ destination=self._redirection_table[page.file.name]
+ )
diff --git a/plugins/modules_by_uuid.py b/plugins/modules_by_uuid.py
deleted file mode 100644
index a155823c2e..0000000000
--- a/plugins/modules_by_uuid.py
+++ /dev/null
@@ -1,72 +0,0 @@
-import re
-import string
-from pathlib import Path
-
-import mkdocs
-from mkdocs.config import Config
-from mkdocs.structure.files import File, Files
-from mkdocs.utils.meta import get_data
-
-
-class ModulesByUUIDPlugin(mkdocs.plugins.BasePlugin):
- """Reading Markdown files that contains an `uuid` metadata to provide
- a redirection.
-
- When such a file is identified, a new
- `integration/action_library/uuid//uuid/$uuid.md` file is faked
- which will redirect to it."""
-
- template = """
-
-
-
- Redirecting...
-
-
-
-
-
-
-Redirecting...
-
-"""
-
- _redirection_table: dict[str, str] = {}
-
- def on_files(self, files: Files, config: Config):
- for source_file in files:
- if not source_file.src_path.endswith(".md"):
- continue
-
- filename = Path(config["docs_dir"]) / Path(source_file.src_path)
- try:
- with filename.open() as f:
- _, metadata = get_data(f.read())
- except:
- # File may have been generated by an other plugin
- continue
-
- if (
- "uuid" not in metadata
- or metadata.get("type").lower() != "playbook"
- or not source_file.url.startswith("integration/action_library/")
- ):
- continue
-
- self._redirection_table[metadata["uuid"]] = source_file.url
-
- files._files.append(
- File(
- path=f"integration/action_library/uuid/{metadata['uuid']}.md",
- src_dir="integration/action_library/uuid",
- dest_dir=config["site_dir"],
- use_directory_urls=True,
- )
- )
-
- def on_page_read_source(self, page, config):
- if page.file.src_path.startswith("integration/action_library/uuid/"):
- if page.file.name in self._redirection_table:
- return self.template.format(
- destination=self._redirection_table[page.file.name]
- )
diff --git a/plugins/sass.py b/plugins/sass.py
new file mode 100644
index 0000000000..146d684555
--- /dev/null
+++ b/plugins/sass.py
@@ -0,0 +1,31 @@
+import glob
+import logging
+import os
+from pathlib import Path
+from mkdocs import plugins
+import sass
+
+STYLE_DIR = (Path(__file__).parent.parent / "style").absolute()
+OUT_DIR = (Path(__file__).parent.parent / "docs" / "stylesheets").absolute()
+
+
+class CompileSCSSPlugin(plugins.BasePlugin):
+ def on_pre_build(self, config):
+ os.makedirs(OUT_DIR, exist_ok=True)
+ for f in glob.glob(f"{STYLE_DIR}/*.scss"):
+ outf = f.replace(".scss", ".css").replace(
+ str(STYLE_DIR),
+ str(OUT_DIR),
+ )
+ logging.info(f"Compile SCSS {f} to {outf}")
+ with open(f) as fd:
+ css = sass.compile(string=fd.read(), output_style="compressed")
+
+ # Skip writing if no change is detected
+ if os.path.isfile(outf):
+ with open(outf) as fd:
+ if css.strip() == fd.read().strip():
+ continue
+
+ with open(outf, "w") as fd:
+ fd.write(css)
diff --git a/poetry.lock b/poetry.lock
index 7a3429454e..097900959d 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,14 +1,14 @@
-# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand.
+# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand.
[[package]]
name = "babel"
-version = "2.14.0"
+version = "2.16.0"
description = "Internationalization utilities"
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
files = [
- {file = "Babel-2.14.0-py3-none-any.whl", hash = "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287"},
- {file = "Babel-2.14.0.tar.gz", hash = "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363"},
+ {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"},
+ {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"},
]
[package.extras]
@@ -16,112 +16,127 @@ dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"]
[[package]]
name = "certifi"
-version = "2024.2.2"
+version = "2024.8.30"
description = "Python package for providing Mozilla's CA Bundle."
optional = false
python-versions = ">=3.6"
files = [
- {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"},
- {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"},
+ {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"},
+ {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"},
]
[[package]]
name = "charset-normalizer"
-version = "3.3.2"
+version = "3.4.0"
description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
optional = false
python-versions = ">=3.7.0"
files = [
- {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"},
- {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"},
- {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"},
- {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"},
- {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"},
- {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"},
- {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"},
- {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"},
- {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"},
- {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"},
- {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"},
- {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"},
- {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"},
- {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"},
- {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"},
- {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"},
- {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"},
- {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"},
- {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"},
- {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"},
- {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"},
- {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"},
- {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"},
- {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"},
- {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"},
- {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"},
- {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"},
- {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"},
- {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"},
- {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"},
- {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"},
- {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"},
- {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"},
- {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"},
- {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"},
- {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"},
- {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"},
- {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"},
- {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"},
- {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"},
- {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"},
- {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"},
- {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"},
- {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"},
- {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"},
- {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"},
- {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"},
- {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"},
- {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"},
- {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"},
- {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"},
- {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"},
- {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"},
- {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"},
- {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"},
- {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"},
- {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"},
- {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"},
- {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"},
- {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"},
- {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"},
- {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"},
- {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"},
- {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"},
- {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"},
- {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"},
- {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"},
- {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"},
- {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"},
- {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"},
- {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"},
- {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"},
- {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"},
- {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"},
- {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"},
- {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"},
- {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"},
- {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"},
- {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"},
- {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"},
- {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"},
- {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"},
- {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"},
- {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"},
- {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"},
- {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"},
- {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"},
- {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"},
- {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"},
- {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"},
+ {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"},
+ {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"},
]
[[package]]
@@ -168,24 +183,27 @@ dev = ["flake8", "markdown", "twine", "wheel"]
[[package]]
name = "idna"
-version = "3.6"
+version = "3.10"
description = "Internationalized Domain Names in Applications (IDNA)"
optional = false
-python-versions = ">=3.5"
+python-versions = ">=3.6"
files = [
- {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"},
- {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"},
+ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"},
+ {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"},
]
+[package.extras]
+all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"]
+
[[package]]
name = "jinja2"
-version = "3.1.3"
+version = "3.1.4"
description = "A very fast and expressive template engine."
optional = false
python-versions = ">=3.7"
files = [
- {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"},
- {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"},
+ {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"},
+ {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"},
]
[package.dependencies]
@@ -194,6 +212,21 @@ MarkupSafe = ">=2.0"
[package.extras]
i18n = ["Babel (>=2.7)"]
+[[package]]
+name = "libsass"
+version = "0.23.0"
+description = "Sass for Python: A straightforward binding of libsass for Python."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "libsass-0.23.0-cp38-abi3-macosx_11_0_x86_64.whl", hash = "sha256:34cae047cbbfc4ffa832a61cbb110f3c95f5471c6170c842d3fed161e40814dc"},
+ {file = "libsass-0.23.0-cp38-abi3-macosx_14_0_arm64.whl", hash = "sha256:ea97d1b45cdc2fc3590cb9d7b60f1d8915d3ce17a98c1f2d4dd47ee0d9c68ce6"},
+ {file = "libsass-0.23.0-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:4a218406d605f325d234e4678bd57126a66a88841cb95bee2caeafdc6f138306"},
+ {file = "libsass-0.23.0-cp38-abi3-win32.whl", hash = "sha256:31e86d92a5c7a551df844b72d83fc2b5e50abc6fbbb31e296f7bebd6489ed1b4"},
+ {file = "libsass-0.23.0-cp38-abi3-win_amd64.whl", hash = "sha256:a2ec85d819f353cbe807432d7275d653710d12b08ec7ef61c124a580a8352f3c"},
+ {file = "libsass-0.23.0.tar.gz", hash = "sha256:6f209955ede26684e76912caf329f4ccb57e4a043fd77fe0e7348dd9574f1880"},
+]
+
[[package]]
name = "lightgallery"
version = "0.5"
@@ -210,16 +243,17 @@ markdown = ">=3.0"
[[package]]
name = "markdown"
-version = "3.3.7"
-description = "Python implementation of Markdown."
+version = "3.7"
+description = "Python implementation of John Gruber's Markdown."
optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.8"
files = [
- {file = "Markdown-3.3.7-py3-none-any.whl", hash = "sha256:f5da449a6e1c989a4cea2631aa8ee67caa5a2ef855d551c88f9e309f4634c621"},
- {file = "Markdown-3.3.7.tar.gz", hash = "sha256:cbb516f16218e643d8e0a95b309f77eb118cb138d39a4f27851e6a63581db874"},
+ {file = "Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803"},
+ {file = "markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2"},
]
[package.extras]
+docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"]
testing = ["coverage", "pyyaml"]
[[package]]
@@ -241,71 +275,72 @@ tests = ["pytest"]
[[package]]
name = "markupsafe"
-version = "2.1.5"
+version = "3.0.2"
description = "Safely add untrusted strings to HTML/XML markup."
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.9"
files = [
- {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"},
- {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"},
- {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"},
- {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"},
- {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"},
- {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"},
- {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"},
- {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"},
- {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"},
- {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"},
- {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"},
- {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"},
- {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"},
- {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"},
- {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"},
- {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"},
- {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"},
- {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"},
- {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"},
- {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"},
- {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"},
- {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"},
- {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"},
- {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"},
- {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"},
- {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"},
- {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"},
- {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"},
- {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"},
- {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"},
- {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"},
- {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"},
- {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"},
- {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"},
- {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"},
- {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"},
- {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"},
- {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"},
- {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"},
- {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"},
- {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"},
- {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"},
- {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"},
- {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"},
- {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"},
- {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"},
- {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"},
- {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"},
- {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"},
- {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"},
- {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"},
- {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"},
- {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"},
- {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"},
- {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"},
- {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"},
- {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"},
- {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"},
- {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"},
- {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"},
+ {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"},
]
[[package]]
@@ -321,13 +356,13 @@ files = [
[[package]]
name = "mkdocs"
-version = "1.5.3"
+version = "1.6.1"
description = "Project documentation with Markdown."
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
files = [
- {file = "mkdocs-1.5.3-py3-none-any.whl", hash = "sha256:3b3a78e736b31158d64dbb2f8ba29bd46a379d0c6e324c2246c3bc3d2189cfc1"},
- {file = "mkdocs-1.5.3.tar.gz", hash = "sha256:eb7c99214dcb945313ba30426c2451b735992c73c2e10838f76d09e39ff4d0e2"},
+ {file = "mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e"},
+ {file = "mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2"},
]
[package.dependencies]
@@ -335,29 +370,45 @@ click = ">=7.0"
colorama = {version = ">=0.4", markers = "platform_system == \"Windows\""}
ghp-import = ">=1.0"
jinja2 = ">=2.11.1"
-markdown = ">=3.2.1"
+markdown = ">=3.3.6"
markupsafe = ">=2.0.1"
mergedeep = ">=1.3.4"
+mkdocs-get-deps = ">=0.2.0"
packaging = ">=20.5"
pathspec = ">=0.11.1"
-platformdirs = ">=2.2.0"
pyyaml = ">=5.1"
pyyaml-env-tag = ">=0.1"
watchdog = ">=2.0"
[package.extras]
i18n = ["babel (>=2.9.0)"]
-min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.3)", "jinja2 (==2.11.1)", "markdown (==3.2.1)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "packaging (==20.5)", "pathspec (==0.11.1)", "platformdirs (==2.2.0)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "typing-extensions (==3.10)", "watchdog (==2.0)"]
+min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.4)", "jinja2 (==2.11.1)", "markdown (==3.3.6)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "mkdocs-get-deps (==0.2.0)", "packaging (==20.5)", "pathspec (==0.11.1)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "watchdog (==2.0)"]
+
+[[package]]
+name = "mkdocs-get-deps"
+version = "0.2.0"
+description = "MkDocs extension that lists all dependencies according to a mkdocs.yml file"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134"},
+ {file = "mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c"},
+]
+
+[package.dependencies]
+mergedeep = ">=1.3.4"
+platformdirs = ">=2.2.0"
+pyyaml = ">=5.1"
[[package]]
name = "mkdocs-material"
-version = "9.5.14"
+version = "9.5.44"
description = "Documentation that simply works"
optional = false
python-versions = ">=3.8"
files = [
- {file = "mkdocs_material-9.5.14-py3-none-any.whl", hash = "sha256:a45244ac221fda46ecf8337f00ec0e5cb5348ab9ffb203ca2a0c313b0d4dbc27"},
- {file = "mkdocs_material-9.5.14.tar.gz", hash = "sha256:2a1f8e67cda2587ab93ecea9ba42d0ca61d1d7b5fad8cf690eeaeb39dcd4b9af"},
+ {file = "mkdocs_material-9.5.44-py3-none-any.whl", hash = "sha256:47015f9c167d58a5ff5e682da37441fc4d66a1c79334bfc08d774763cacf69ca"},
+ {file = "mkdocs_material-9.5.44.tar.gz", hash = "sha256:f3a6c968e524166b3f3ed1fb97d3ed3e0091183b0545cedf7156a2a6804c56c0"},
]
[package.dependencies]
@@ -365,7 +416,7 @@ babel = ">=2.10,<3.0"
colorama = ">=0.4,<1.0"
jinja2 = ">=3.0,<4.0"
markdown = ">=3.2,<4.0"
-mkdocs = ">=1.5.3,<1.6.0"
+mkdocs = ">=1.6,<2.0"
mkdocs-material-extensions = ">=1.3,<2.0"
paginate = ">=0.5,<1.0"
pygments = ">=2.16,<3.0"
@@ -391,44 +442,44 @@ files = [
[[package]]
name = "mkdocs-redirects"
-version = "1.2.1"
-description = "A MkDocs plugin for dynamic page redirects to prevent broken links."
+version = "1.2.2"
+description = "A MkDocs plugin for dynamic page redirects to prevent broken links"
optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.8"
files = [
- {file = "mkdocs-redirects-1.2.1.tar.gz", hash = "sha256:9420066d70e2a6bb357adf86e67023dcdca1857f97f07c7fe450f8f1fb42f861"},
- {file = "mkdocs_redirects-1.2.1-py3-none-any.whl", hash = "sha256:497089f9e0219e7389304cffefccdfa1cac5ff9509f2cb706f4c9b221726dffb"},
+ {file = "mkdocs_redirects-1.2.2-py3-none-any.whl", hash = "sha256:7dbfa5647b79a3589da4401403d69494bd1f4ad03b9c15136720367e1f340ed5"},
+ {file = "mkdocs_redirects-1.2.2.tar.gz", hash = "sha256:3094981b42ffab29313c2c1b8ac3969861109f58b2dd58c45fc81cd44bfa0095"},
]
[package.dependencies]
mkdocs = ">=1.1.1"
-[package.extras]
-dev = ["autoflake", "black", "isort", "pytest", "twine (>=1.13.0)"]
-release = ["twine (>=1.13.0)"]
-test = ["autoflake", "black", "isort", "pytest"]
-
[[package]]
name = "packaging"
-version = "24.0"
+version = "24.2"
description = "Core utilities for Python packages"
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
files = [
- {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"},
- {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"},
+ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"},
+ {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"},
]
[[package]]
name = "paginate"
-version = "0.5.6"
+version = "0.5.7"
description = "Divides large result sets into pages for easier browsing"
optional = false
python-versions = "*"
files = [
- {file = "paginate-0.5.6.tar.gz", hash = "sha256:5e6007b6a9398177a7e1648d04fdd9f8c9766a1a945bceac82f1929e8c78af2d"},
+ {file = "paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591"},
+ {file = "paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945"},
]
+[package.extras]
+dev = ["pytest", "tox"]
+lint = ["black"]
+
[[package]]
name = "pathspec"
version = "0.12.1"
@@ -442,32 +493,32 @@ files = [
[[package]]
name = "platformdirs"
-version = "4.2.0"
-description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
+version = "4.3.6"
+description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`."
optional = false
python-versions = ">=3.8"
files = [
- {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"},
- {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"},
+ {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"},
+ {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"},
]
[package.extras]
-docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"]
-test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"]
+docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"]
+test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"]
+type = ["mypy (>=1.11.2)"]
[[package]]
name = "pygments"
-version = "2.17.2"
+version = "2.18.0"
description = "Pygments is a syntax highlighting package written in Python."
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
files = [
- {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"},
- {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"},
+ {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"},
+ {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"},
]
[package.extras]
-plugins = ["importlib-metadata"]
windows-terminal = ["colorama (>=0.4.6)"]
[[package]]
@@ -504,62 +555,64 @@ six = ">=1.5"
[[package]]
name = "pyyaml"
-version = "6.0.1"
+version = "6.0.2"
description = "YAML parser and emitter for Python"
optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.8"
files = [
- {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"},
- {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"},
- {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"},
- {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"},
- {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"},
- {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"},
- {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"},
- {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"},
- {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"},
- {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"},
- {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"},
- {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"},
- {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"},
- {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"},
- {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"},
- {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"},
- {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"},
- {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"},
- {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"},
- {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"},
- {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"},
- {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"},
- {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"},
- {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"},
- {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"},
- {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"},
- {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"},
- {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"},
- {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"},
- {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"},
- {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"},
- {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"},
- {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"},
- {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"},
- {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"},
- {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"},
- {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"},
- {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"},
- {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"},
- {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"},
- {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"},
- {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"},
- {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"},
- {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"},
- {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"},
- {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"},
- {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"},
- {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"},
- {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"},
- {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"},
- {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"},
+ {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"},
+ {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"},
+ {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"},
+ {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"},
+ {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"},
+ {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"},
+ {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"},
+ {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"},
+ {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"},
+ {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"},
+ {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"},
+ {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"},
+ {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"},
+ {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"},
+ {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"},
+ {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"},
+ {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"},
+ {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"},
+ {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"},
+ {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"},
+ {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"},
+ {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"},
+ {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"},
+ {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"},
+ {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"},
+ {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"},
+ {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"},
+ {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"},
+ {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"},
+ {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"},
+ {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"},
+ {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"},
+ {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"},
+ {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"},
+ {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"},
+ {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"},
+ {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"},
+ {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"},
+ {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"},
+ {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"},
+ {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"},
+ {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"},
+ {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"},
+ {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"},
+ {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"},
+ {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"},
+ {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"},
+ {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"},
+ {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"},
+ {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"},
+ {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"},
+ {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"},
+ {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"},
]
[[package]]
@@ -578,115 +631,116 @@ pyyaml = "*"
[[package]]
name = "regex"
-version = "2023.12.25"
+version = "2024.11.6"
description = "Alternative regular expression module, to replace re."
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
files = [
- {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5"},
- {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8"},
- {file = "regex-2023.12.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d865984b3f71f6d0af64d0d88f5733521698f6c16f445bb09ce746c92c97c586"},
- {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e0eabac536b4cc7f57a5f3d095bfa557860ab912f25965e08fe1545e2ed8b4c"},
- {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c25a8ad70e716f96e13a637802813f65d8a6760ef48672aa3502f4c24ea8b400"},
- {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9b6d73353f777630626f403b0652055ebfe8ff142a44ec2cf18ae470395766e"},
- {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9cc99d6946d750eb75827cb53c4371b8b0fe89c733a94b1573c9dd16ea6c9e4"},
- {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88d1f7bef20c721359d8675f7d9f8e414ec5003d8f642fdfd8087777ff7f94b5"},
- {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cb3fe77aec8f1995611f966d0c656fdce398317f850d0e6e7aebdfe61f40e1cd"},
- {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7aa47c2e9ea33a4a2a05f40fcd3ea36d73853a2aae7b4feab6fc85f8bf2c9704"},
- {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:df26481f0c7a3f8739fecb3e81bc9da3fcfae34d6c094563b9d4670b047312e1"},
- {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c40281f7d70baf6e0db0c2f7472b31609f5bc2748fe7275ea65a0b4601d9b392"},
- {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:d94a1db462d5690ebf6ae86d11c5e420042b9898af5dcf278bd97d6bda065423"},
- {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ba1b30765a55acf15dce3f364e4928b80858fa8f979ad41f862358939bdd1f2f"},
- {file = "regex-2023.12.25-cp310-cp310-win32.whl", hash = "sha256:150c39f5b964e4d7dba46a7962a088fbc91f06e606f023ce57bb347a3b2d4630"},
- {file = "regex-2023.12.25-cp310-cp310-win_amd64.whl", hash = "sha256:09da66917262d9481c719599116c7dc0c321ffcec4b1f510c4f8a066f8768105"},
- {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1b9d811f72210fa9306aeb88385b8f8bcef0dfbf3873410413c00aa94c56c2b6"},
- {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d902a43085a308cef32c0d3aea962524b725403fd9373dea18110904003bac97"},
- {file = "regex-2023.12.25-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d166eafc19f4718df38887b2bbe1467a4f74a9830e8605089ea7a30dd4da8887"},
- {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7ad32824b7f02bb3c9f80306d405a1d9b7bb89362d68b3c5a9be53836caebdb"},
- {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:636ba0a77de609d6510235b7f0e77ec494d2657108f777e8765efc060094c98c"},
- {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fda75704357805eb953a3ee15a2b240694a9a514548cd49b3c5124b4e2ad01b"},
- {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f72cbae7f6b01591f90814250e636065850c5926751af02bb48da94dfced7baa"},
- {file = "regex-2023.12.25-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db2a0b1857f18b11e3b0e54ddfefc96af46b0896fb678c85f63fb8c37518b3e7"},
- {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7502534e55c7c36c0978c91ba6f61703faf7ce733715ca48f499d3dbbd7657e0"},
- {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e8c7e08bb566de4faaf11984af13f6bcf6a08f327b13631d41d62592681d24fe"},
- {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:283fc8eed679758de38fe493b7d7d84a198b558942b03f017b1f94dda8efae80"},
- {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f44dd4d68697559d007462b0a3a1d9acd61d97072b71f6d1968daef26bc744bd"},
- {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:67d3ccfc590e5e7197750fcb3a2915b416a53e2de847a728cfa60141054123d4"},
- {file = "regex-2023.12.25-cp311-cp311-win32.whl", hash = "sha256:68191f80a9bad283432385961d9efe09d783bcd36ed35a60fb1ff3f1ec2efe87"},
- {file = "regex-2023.12.25-cp311-cp311-win_amd64.whl", hash = "sha256:7d2af3f6b8419661a0c421584cfe8aaec1c0e435ce7e47ee2a97e344b98f794f"},
- {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8a0ccf52bb37d1a700375a6b395bff5dd15c50acb745f7db30415bae3c2b0715"},
- {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c3c4a78615b7762740531c27cf46e2f388d8d727d0c0c739e72048beb26c8a9d"},
- {file = "regex-2023.12.25-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ad83e7545b4ab69216cef4cc47e344d19622e28aabec61574b20257c65466d6a"},
- {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7a635871143661feccce3979e1727c4e094f2bdfd3ec4b90dfd4f16f571a87a"},
- {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d498eea3f581fbe1b34b59c697512a8baef88212f92e4c7830fcc1499f5b45a5"},
- {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43f7cd5754d02a56ae4ebb91b33461dc67be8e3e0153f593c509e21d219c5060"},
- {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51f4b32f793812714fd5307222a7f77e739b9bc566dc94a18126aba3b92b98a3"},
- {file = "regex-2023.12.25-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba99d8077424501b9616b43a2d208095746fb1284fc5ba490139651f971d39d9"},
- {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4bfc2b16e3ba8850e0e262467275dd4d62f0d045e0e9eda2bc65078c0110a11f"},
- {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8c2c19dae8a3eb0ea45a8448356ed561be843b13cbc34b840922ddf565498c1c"},
- {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:60080bb3d8617d96f0fb7e19796384cc2467447ef1c491694850ebd3670bc457"},
- {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b77e27b79448e34c2c51c09836033056a0547aa360c45eeeb67803da7b0eedaf"},
- {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:518440c991f514331f4850a63560321f833979d145d7d81186dbe2f19e27ae3d"},
- {file = "regex-2023.12.25-cp312-cp312-win32.whl", hash = "sha256:e2610e9406d3b0073636a3a2e80db05a02f0c3169b5632022b4e81c0364bcda5"},
- {file = "regex-2023.12.25-cp312-cp312-win_amd64.whl", hash = "sha256:cc37b9aeebab425f11f27e5e9e6cf580be7206c6582a64467a14dda211abc232"},
- {file = "regex-2023.12.25-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:da695d75ac97cb1cd725adac136d25ca687da4536154cdc2815f576e4da11c69"},
- {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d126361607b33c4eb7b36debc173bf25d7805847346dd4d99b5499e1fef52bc7"},
- {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4719bb05094d7d8563a450cf8738d2e1061420f79cfcc1fa7f0a44744c4d8f73"},
- {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dd58946bce44b53b06d94aa95560d0b243eb2fe64227cba50017a8d8b3cd3e2"},
- {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22a86d9fff2009302c440b9d799ef2fe322416d2d58fc124b926aa89365ec482"},
- {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2aae8101919e8aa05ecfe6322b278f41ce2994c4a430303c4cd163fef746e04f"},
- {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e692296c4cc2873967771345a876bcfc1c547e8dd695c6b89342488b0ea55cd8"},
- {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:263ef5cc10979837f243950637fffb06e8daed7f1ac1e39d5910fd29929e489a"},
- {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d6f7e255e5fa94642a0724e35406e6cb7001c09d476ab5fce002f652b36d0c39"},
- {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:88ad44e220e22b63b0f8f81f007e8abbb92874d8ced66f32571ef8beb0643b2b"},
- {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:3a17d3ede18f9cedcbe23d2daa8a2cd6f59fe2bf082c567e43083bba3fb00347"},
- {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d15b274f9e15b1a0b7a45d2ac86d1f634d983ca40d6b886721626c47a400bf39"},
- {file = "regex-2023.12.25-cp37-cp37m-win32.whl", hash = "sha256:ed19b3a05ae0c97dd8f75a5d8f21f7723a8c33bbc555da6bbe1f96c470139d3c"},
- {file = "regex-2023.12.25-cp37-cp37m-win_amd64.whl", hash = "sha256:a6d1047952c0b8104a1d371f88f4ab62e6275567d4458c1e26e9627ad489b445"},
- {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b43523d7bc2abd757119dbfb38af91b5735eea45537ec6ec3a5ec3f9562a1c53"},
- {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:efb2d82f33b2212898f1659fb1c2e9ac30493ac41e4d53123da374c3b5541e64"},
- {file = "regex-2023.12.25-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7fca9205b59c1a3d5031f7e64ed627a1074730a51c2a80e97653e3e9fa0d415"},
- {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086dd15e9435b393ae06f96ab69ab2d333f5d65cbe65ca5a3ef0ec9564dfe770"},
- {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e81469f7d01efed9b53740aedd26085f20d49da65f9c1f41e822a33992cb1590"},
- {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34e4af5b27232f68042aa40a91c3b9bb4da0eeb31b7632e0091afc4310afe6cb"},
- {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9852b76ab558e45b20bf1893b59af64a28bd3820b0c2efc80e0a70a4a3ea51c1"},
- {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff100b203092af77d1a5a7abe085b3506b7eaaf9abf65b73b7d6905b6cb76988"},
- {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cc038b2d8b1470364b1888a98fd22d616fba2b6309c5b5f181ad4483e0017861"},
- {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:094ba386bb5c01e54e14434d4caabf6583334090865b23ef58e0424a6286d3dc"},
- {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5cd05d0f57846d8ba4b71d9c00f6f37d6b97d5e5ef8b3c3840426a475c8f70f4"},
- {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:9aa1a67bbf0f957bbe096375887b2505f5d8ae16bf04488e8b0f334c36e31360"},
- {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:98a2636994f943b871786c9e82bfe7883ecdaba2ef5df54e1450fa9869d1f756"},
- {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37f8e93a81fc5e5bd8db7e10e62dc64261bcd88f8d7e6640aaebe9bc180d9ce2"},
- {file = "regex-2023.12.25-cp38-cp38-win32.whl", hash = "sha256:d78bd484930c1da2b9679290a41cdb25cc127d783768a0369d6b449e72f88beb"},
- {file = "regex-2023.12.25-cp38-cp38-win_amd64.whl", hash = "sha256:b521dcecebc5b978b447f0f69b5b7f3840eac454862270406a39837ffae4e697"},
- {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f7bc09bc9c29ebead055bcba136a67378f03d66bf359e87d0f7c759d6d4ffa31"},
- {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e14b73607d6231f3cc4622809c196b540a6a44e903bcfad940779c80dffa7be7"},
- {file = "regex-2023.12.25-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9eda5f7a50141291beda3edd00abc2d4a5b16c29c92daf8d5bd76934150f3edc"},
- {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc6bb9aa69aacf0f6032c307da718f61a40cf970849e471254e0e91c56ffca95"},
- {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298dc6354d414bc921581be85695d18912bea163a8b23cac9a2562bbcd5088b1"},
- {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f4e475a80ecbd15896a976aa0b386c5525d0ed34d5c600b6d3ebac0a67c7ddf"},
- {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:531ac6cf22b53e0696f8e1d56ce2396311254eb806111ddd3922c9d937151dae"},
- {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22f3470f7524b6da61e2020672df2f3063676aff444db1daa283c2ea4ed259d6"},
- {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:89723d2112697feaa320c9d351e5f5e7b841e83f8b143dba8e2d2b5f04e10923"},
- {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0ecf44ddf9171cd7566ef1768047f6e66975788258b1c6c6ca78098b95cf9a3d"},
- {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:905466ad1702ed4acfd67a902af50b8db1feeb9781436372261808df7a2a7bca"},
- {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:4558410b7a5607a645e9804a3e9dd509af12fb72b9825b13791a37cd417d73a5"},
- {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7e316026cc1095f2a3e8cc012822c99f413b702eaa2ca5408a513609488cb62f"},
- {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3b1de218d5375cd6ac4b5493e0b9f3df2be331e86520f23382f216c137913d20"},
- {file = "regex-2023.12.25-cp39-cp39-win32.whl", hash = "sha256:11a963f8e25ab5c61348d090bf1b07f1953929c13bd2309a0662e9ff680763c9"},
- {file = "regex-2023.12.25-cp39-cp39-win_amd64.whl", hash = "sha256:e693e233ac92ba83a87024e1d32b5f9ab15ca55ddd916d878146f4e3406b5c91"},
- {file = "regex-2023.12.25.tar.gz", hash = "sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5"},
+ {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"},
+ {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"},
+ {file = "regex-2024.11.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:164d8b7b3b4bcb2068b97428060b2a53be050085ef94eca7f240e7947f1b080e"},
+ {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3660c82f209655a06b587d55e723f0b813d3a7db2e32e5e7dc64ac2a9e86fde"},
+ {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d22326fcdef5e08c154280b71163ced384b428343ae16a5ab2b3354aed12436e"},
+ {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ac758ef6aebfc8943560194e9fd0fa18bcb34d89fd8bd2af18183afd8da3a2"},
+ {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:997d6a487ff00807ba810e0f8332c18b4eb8d29463cfb7c820dc4b6e7562d0cf"},
+ {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02a02d2bb04fec86ad61f3ea7f49c015a0681bf76abb9857f945d26159d2968c"},
+ {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f02f93b92358ee3f78660e43b4b0091229260c5d5c408d17d60bf26b6c900e86"},
+ {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:06eb1be98df10e81ebaded73fcd51989dcf534e3c753466e4b60c4697a003b67"},
+ {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:040df6fe1a5504eb0f04f048e6d09cd7c7110fef851d7c567a6b6e09942feb7d"},
+ {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabbfc59f2c6edba2a6622c647b716e34e8e3867e0ab975412c5c2f79b82da2"},
+ {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8447d2d39b5abe381419319f942de20b7ecd60ce86f16a23b0698f22e1b70008"},
+ {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:da8f5fc57d1933de22a9e23eec290a0d8a5927a5370d24bda9a6abe50683fe62"},
+ {file = "regex-2024.11.6-cp310-cp310-win32.whl", hash = "sha256:b489578720afb782f6ccf2840920f3a32e31ba28a4b162e13900c3e6bd3f930e"},
+ {file = "regex-2024.11.6-cp310-cp310-win_amd64.whl", hash = "sha256:5071b2093e793357c9d8b2929dfc13ac5f0a6c650559503bb81189d0a3814519"},
+ {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638"},
+ {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7"},
+ {file = "regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20"},
+ {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114"},
+ {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3"},
+ {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f"},
+ {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0"},
+ {file = "regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55"},
+ {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89"},
+ {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d"},
+ {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34"},
+ {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d"},
+ {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45"},
+ {file = "regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9"},
+ {file = "regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60"},
+ {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a"},
+ {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9"},
+ {file = "regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2"},
+ {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4"},
+ {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577"},
+ {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3"},
+ {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e"},
+ {file = "regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe"},
+ {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e"},
+ {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29"},
+ {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39"},
+ {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51"},
+ {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad"},
+ {file = "regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54"},
+ {file = "regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b"},
+ {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84"},
+ {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4"},
+ {file = "regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0"},
+ {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0"},
+ {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7"},
+ {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7"},
+ {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c"},
+ {file = "regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3"},
+ {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07"},
+ {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e"},
+ {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6"},
+ {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4"},
+ {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d"},
+ {file = "regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff"},
+ {file = "regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a"},
+ {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3a51ccc315653ba012774efca4f23d1d2a8a8f278a6072e29c7147eee7da446b"},
+ {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ad182d02e40de7459b73155deb8996bbd8e96852267879396fb274e8700190e3"},
+ {file = "regex-2024.11.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba9b72e5643641b7d41fa1f6d5abda2c9a263ae835b917348fc3c928182ad467"},
+ {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40291b1b89ca6ad8d3f2b82782cc33807f1406cf68c8d440861da6304d8ffbbd"},
+ {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cdf58d0e516ee426a48f7b2c03a332a4114420716d55769ff7108c37a09951bf"},
+ {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a36fdf2af13c2b14738f6e973aba563623cb77d753bbbd8d414d18bfaa3105dd"},
+ {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1cee317bfc014c2419a76bcc87f071405e3966da434e03e13beb45f8aced1a6"},
+ {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50153825ee016b91549962f970d6a4442fa106832e14c918acd1c8e479916c4f"},
+ {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea1bfda2f7162605f6e8178223576856b3d791109f15ea99a9f95c16a7636fb5"},
+ {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:df951c5f4a1b1910f1a99ff42c473ff60f8225baa1cdd3539fe2819d9543e9df"},
+ {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:072623554418a9911446278f16ecb398fb3b540147a7828c06e2011fa531e773"},
+ {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f654882311409afb1d780b940234208a252322c24a93b442ca714d119e68086c"},
+ {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:89d75e7293d2b3e674db7d4d9b1bee7f8f3d1609428e293771d1a962617150cc"},
+ {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:f65557897fc977a44ab205ea871b690adaef6b9da6afda4790a2484b04293a5f"},
+ {file = "regex-2024.11.6-cp38-cp38-win32.whl", hash = "sha256:6f44ec28b1f858c98d3036ad5d7d0bfc568bdd7a74f9c24e25f41ef1ebfd81a4"},
+ {file = "regex-2024.11.6-cp38-cp38-win_amd64.whl", hash = "sha256:bb8f74f2f10dbf13a0be8de623ba4f9491faf58c24064f32b65679b021ed0001"},
+ {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5704e174f8ccab2026bd2f1ab6c510345ae8eac818b613d7d73e785f1310f839"},
+ {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:220902c3c5cc6af55d4fe19ead504de80eb91f786dc102fbd74894b1551f095e"},
+ {file = "regex-2024.11.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7e351589da0850c125f1600a4c4ba3c722efefe16b297de54300f08d734fbf"},
+ {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5056b185ca113c88e18223183aa1a50e66507769c9640a6ff75859619d73957b"},
+ {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e34b51b650b23ed3354b5a07aab37034d9f923db2a40519139af34f485f77d0"},
+ {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5670bce7b200273eee1840ef307bfa07cda90b38ae56e9a6ebcc9f50da9c469b"},
+ {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08986dce1339bc932923e7d1232ce9881499a0e02925f7402fb7c982515419ef"},
+ {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93c0b12d3d3bc25af4ebbf38f9ee780a487e8bf6954c115b9f015822d3bb8e48"},
+ {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:764e71f22ab3b305e7f4c21f1a97e1526a25ebdd22513e251cf376760213da13"},
+ {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f056bf21105c2515c32372bbc057f43eb02aae2fda61052e2f7622c801f0b4e2"},
+ {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:69ab78f848845569401469da20df3e081e6b5a11cb086de3eed1d48f5ed57c95"},
+ {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:86fddba590aad9208e2fa8b43b4c098bb0ec74f15718bb6a704e3c63e2cef3e9"},
+ {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:684d7a212682996d21ca12ef3c17353c021fe9de6049e19ac8481ec35574a70f"},
+ {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a03e02f48cd1abbd9f3b7e3586d97c8f7a9721c436f51a5245b3b9483044480b"},
+ {file = "regex-2024.11.6-cp39-cp39-win32.whl", hash = "sha256:41758407fc32d5c3c5de163888068cfee69cb4c2be844e7ac517a52770f9af57"},
+ {file = "regex-2024.11.6-cp39-cp39-win_amd64.whl", hash = "sha256:b2837718570f95dd41675328e111345f9b7095d821bac435aac173ac80b19983"},
+ {file = "regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519"},
]
[[package]]
name = "requests"
-version = "2.32.0"
+version = "2.32.3"
description = "Python HTTP for Humans."
optional = false
python-versions = ">=3.8"
files = [
- {file = "requests-2.32.0-py3-none-any.whl", hash = "sha256:f2c3881dddb70d056c5bd7600a4fae312b2a300e39be6a118d30b90bd27262b5"},
- {file = "requests-2.32.0.tar.gz", hash = "sha256:fa5490319474c82ef1d2c9bc459d3652e3ae4ef4c4ebdd18a21145a47ca4b6b8"},
+ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"},
+ {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"},
]
[package.dependencies]
@@ -712,13 +766,13 @@ files = [
[[package]]
name = "urllib3"
-version = "2.2.2"
+version = "2.2.3"
description = "HTTP library with thread-safe connection pooling, file post, and more."
optional = false
python-versions = ">=3.8"
files = [
- {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"},
- {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"},
+ {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"},
+ {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"},
]
[package.extras]
@@ -729,40 +783,41 @@ zstd = ["zstandard (>=0.18.0)"]
[[package]]
name = "watchdog"
-version = "4.0.0"
+version = "6.0.0"
description = "Filesystem events monitoring"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
files = [
- {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:39cb34b1f1afbf23e9562501673e7146777efe95da24fab5707b88f7fb11649b"},
- {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c522392acc5e962bcac3b22b9592493ffd06d1fc5d755954e6be9f4990de932b"},
- {file = "watchdog-4.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6c47bdd680009b11c9ac382163e05ca43baf4127954c5f6d0250e7d772d2b80c"},
- {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8350d4055505412a426b6ad8c521bc7d367d1637a762c70fdd93a3a0d595990b"},
- {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c17d98799f32e3f55f181f19dd2021d762eb38fdd381b4a748b9f5a36738e935"},
- {file = "watchdog-4.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4986db5e8880b0e6b7cd52ba36255d4793bf5cdc95bd6264806c233173b1ec0b"},
- {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:11e12fafb13372e18ca1bbf12d50f593e7280646687463dd47730fd4f4d5d257"},
- {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5369136a6474678e02426bd984466343924d1df8e2fd94a9b443cb7e3aa20d19"},
- {file = "watchdog-4.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76ad8484379695f3fe46228962017a7e1337e9acadafed67eb20aabb175df98b"},
- {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:45cc09cc4c3b43fb10b59ef4d07318d9a3ecdbff03abd2e36e77b6dd9f9a5c85"},
- {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eed82cdf79cd7f0232e2fdc1ad05b06a5e102a43e331f7d041e5f0e0a34a51c4"},
- {file = "watchdog-4.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba30a896166f0fee83183cec913298151b73164160d965af2e93a20bbd2ab605"},
- {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d18d7f18a47de6863cd480734613502904611730f8def45fc52a5d97503e5101"},
- {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2895bf0518361a9728773083908801a376743bcc37dfa252b801af8fd281b1ca"},
- {file = "watchdog-4.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87e9df830022488e235dd601478c15ad73a0389628588ba0b028cb74eb72fed8"},
- {file = "watchdog-4.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6e949a8a94186bced05b6508faa61b7adacc911115664ccb1923b9ad1f1ccf7b"},
- {file = "watchdog-4.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6a4db54edea37d1058b08947c789a2354ee02972ed5d1e0dca9b0b820f4c7f92"},
- {file = "watchdog-4.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d31481ccf4694a8416b681544c23bd271f5a123162ab603c7d7d2dd7dd901a07"},
- {file = "watchdog-4.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8fec441f5adcf81dd240a5fe78e3d83767999771630b5ddfc5867827a34fa3d3"},
- {file = "watchdog-4.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:6a9c71a0b02985b4b0b6d14b875a6c86ddea2fdbebd0c9a720a806a8bbffc69f"},
- {file = "watchdog-4.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:557ba04c816d23ce98a06e70af6abaa0485f6d94994ec78a42b05d1c03dcbd50"},
- {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:d0f9bd1fd919134d459d8abf954f63886745f4660ef66480b9d753a7c9d40927"},
- {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f9b2fdca47dc855516b2d66eef3c39f2672cbf7e7a42e7e67ad2cbfcd6ba107d"},
- {file = "watchdog-4.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:73c7a935e62033bd5e8f0da33a4dcb763da2361921a69a5a95aaf6c93aa03a87"},
- {file = "watchdog-4.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6a80d5cae8c265842c7419c560b9961561556c4361b297b4c431903f8c33b269"},
- {file = "watchdog-4.0.0-py3-none-win32.whl", hash = "sha256:8f9a542c979df62098ae9c58b19e03ad3df1c9d8c6895d96c0d51da17b243b1c"},
- {file = "watchdog-4.0.0-py3-none-win_amd64.whl", hash = "sha256:f970663fa4f7e80401a7b0cbeec00fa801bf0287d93d48368fc3e6fa32716245"},
- {file = "watchdog-4.0.0-py3-none-win_ia64.whl", hash = "sha256:9a03e16e55465177d416699331b0f3564138f1807ecc5f2de9d55d8f188d08c7"},
- {file = "watchdog-4.0.0.tar.gz", hash = "sha256:e3e7065cbdabe6183ab82199d7a4f6b3ba0a438c5a512a68559846ccb76a78ec"},
+ {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26"},
+ {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112"},
+ {file = "watchdog-6.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c897ac1b55c5a1461e16dae288d22bb2e412ba9807df8397a635d88f671d36c3"},
+ {file = "watchdog-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c"},
+ {file = "watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2"},
+ {file = "watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c"},
+ {file = "watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948"},
+ {file = "watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860"},
+ {file = "watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0"},
+ {file = "watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c"},
+ {file = "watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134"},
+ {file = "watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b"},
+ {file = "watchdog-6.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e6f0e77c9417e7cd62af82529b10563db3423625c5fce018430b249bf977f9e8"},
+ {file = "watchdog-6.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:90c8e78f3b94014f7aaae121e6b909674df5b46ec24d6bebc45c44c56729af2a"},
+ {file = "watchdog-6.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e7631a77ffb1f7d2eefa4445ebbee491c720a5661ddf6df3498ebecae5ed375c"},
+ {file = "watchdog-6.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c7ac31a19f4545dd92fc25d200694098f42c9a8e391bc00bdd362c5736dbf881"},
+ {file = "watchdog-6.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9513f27a1a582d9808cf21a07dae516f0fab1cf2d7683a742c498b93eedabb11"},
+ {file = "watchdog-6.0.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7a0e56874cfbc4b9b05c60c8a1926fedf56324bb08cfbc188969777940aef3aa"},
+ {file = "watchdog-6.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:e6439e374fc012255b4ec786ae3c4bc838cd7309a540e5fe0952d03687d8804e"},
+ {file = "watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13"},
+ {file = "watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379"},
+ {file = "watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e"},
+ {file = "watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f"},
+ {file = "watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26"},
+ {file = "watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c"},
+ {file = "watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2"},
+ {file = "watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a"},
+ {file = "watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680"},
+ {file = "watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f"},
+ {file = "watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282"},
]
[package.extras]
@@ -771,4 +826,4 @@ watchmedo = ["PyYAML (>=3.10)"]
[metadata]
lock-version = "2.0"
python-versions = "^3.11"
-content-hash = "67e7374da66e939057b27d8b65999b003b090535efa382f85dfb021407cbfcad"
+content-hash = "1c86f3d92aad7a281961332545bc687241a0d24166e7faeb96fc63d6d86bf8c5"
diff --git a/pyproject.toml b/pyproject.toml
index 8ffefbd733..293bf9c9a2 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -9,17 +9,18 @@ packages = [
[tool.poetry.plugins."mkdocs.plugins"]
redoc = "plugins.redoc:RedocPlugin"
-intakes_by_uuid = "plugins.intakes_by_uuid:IntakesByUUIDPlugin"
-modules_by_uuid = "plugins.modules_by_uuid:ModulesByUUIDPlugin"
+integration_by_uuid = "plugins.integration_by_uuid:IntegrationByUUIDPlugin"
+sass = "plugins.sass:CompileSCSSPlugin"
[tool.poetry.dependencies]
python = "^3.11"
-mkdocs = "^1.5.3"
+mkdocs = "^1.6.0"
mkdocs-material = "^9.1.21"
mkdocs-redirects = "^1.2.1"
markdown-include = "^0.8.1"
lightgallery = "^0.5"
-markdown = "3.3.7" # Newer versions are not compatible with lightgallery
+markdown = "^3.7"
+libsass = "^0.23.0"
[build-system]
requires = [ "poetry-core>=1.0.0",]
diff --git a/scripts/update_mkdocs/templates/intake.md.jinja b/scripts/update_mkdocs/templates/intake.md.jinja
index 8cff5b79e6..8a43ec0604 100644
--- a/scripts/update_mkdocs/templates/intake.md.jinja
+++ b/scripts/update_mkdocs/templates/intake.md.jinja
@@ -26,7 +26,7 @@ In details, the following table denotes the type of events produced by this inte
{% if tests %}
### Transformed Events Samples after Ingestion
-This section demonstrates how the raw logs will be transformed by our parsers. It shows the extracted fields that will be available for use in the [built-in detection rules](/xdr/features/detect/rules_catalog) and hunting activities in the [events page](/xdr/features/investigate/events). Understanding these transformations is essential for analysts to create effective detection mechanisms with [custom detection rules](/xdr/features/detect/sigma) and to leverage the full potential of the collected data.
+This section demonstrates how the raw logs will be transformed by our parsers. It shows the extracted fields that will be available for use in the [built-in detection rules](/xdr/features/detect/rules_catalog.md) and hunting activities in the [events page](/xdr/features/investigate/events.md). Understanding these transformations is essential for analysts to create effective detection mechanisms with [custom detection rules](/xdr/features/detect/sigma.md) and to leverage the full potential of the collected data.
{% for test in tests %}
=== "{{test['name']}}"
diff --git a/style/openapi.scss b/style/openapi.scss
new file mode 100644
index 0000000000..5e42bf0d2f
--- /dev/null
+++ b/style/openapi.scss
@@ -0,0 +1,562 @@
+#openapi {
+ position: relative;
+ background: white;
+
+ h1 {
+ display: none;
+ }
+
+ .md-typeset h1,
+ .md-content__button,
+ .md-footer {
+ display: none;
+ }
+
+ .md-main__inner {
+ max-width: 100%;
+ margin: 0;
+ }
+
+ .redoc-wrap {
+ background: white;
+
+ >div:last-of-type {
+ background: none !important;
+ }
+
+ .sc-iGgWBj.sc-gsFSXq.lbpUdJ.bOFhJE {
+ padding: 20px;
+ border-radius: 20px;
+
+ }
+
+ .sc-ikkxIA.daqcVd {
+ margin: 0 12px;
+ padding: 0px;
+ padding-left: 24px;
+ }
+
+ tr:first-of-type>.sc-dLMFU,
+ tr.last>.sc-dLMFU,
+ .bvNJXm {
+ background: none;
+ border: none;
+ }
+
+ .sc-gFqAkR {
+ visibility: hidden;
+ display: none;
+ }
+
+ .property-name {
+ font-weight: bold;
+ font-size: 15px;
+ }
+
+ .examples {
+ code {
+ font-family: monospace;
+ font-size: 13px !important;
+ background: none !important;
+ color: white !important;
+
+ .token.punctuation {
+ opacity: 1 !important;
+ }
+ }
+
+ .tabs {
+ background: white;
+ margin: -20px;
+ margin-bottom: 22px;
+ overflow: hidden;
+ display: flex;
+ padding: 0;
+ border: none;
+ list-style-type: none;
+ user-select: none;
+
+ li {
+ color: #2d2e83;
+ background: white;
+ border-top: 4px solid transparent;
+ opacity: 0.6;
+ cursor: pointer;
+
+ &:hover {
+ opacity: 1;
+ }
+
+ &.active {
+ opacity: 1;
+ border-top: 4px solid #12005e;
+ background: #e2e2e9;
+ color: #12005e;
+ border-top-left-radius: 8px;
+ border-top-right-radius: 8px;
+ }
+
+ font-weight: bold;
+ margin: 0;
+ padding: 6px 16px;
+ }
+ }
+
+ .jhTHfM,
+ h3 {
+ color: #12005e;
+ font-weight: bold;
+ font-size: 14px;
+ }
+
+
+ &.mode-try-it {
+
+ .response-samples,
+ .request-samples {
+ display: none;
+ }
+ }
+
+ &:not(.mode-try-it) .try-it-wrapper {
+ display: none;
+ }
+
+ .try-it-wrapper {
+ button {
+ background: #5d4ff2;
+ color: white;
+ height: 36px;
+ font-weight: 600;
+ font-family: 'Inter', sans-serif;
+ border-radius: 8px;
+ padding: 0px 16px;
+ float: right;
+ cursor: pointer;
+ transition: background 6e2ms;
+ margin: 8px 0px;
+
+ &:hover {
+ background: #3b00bd;
+ }
+
+ &:active {
+ background: #140050;
+ }
+
+ &:disabled {
+ opacity: 0.4;
+ }
+ }
+
+ input {
+ padding: 4px;
+ font-size: 15px;
+ border: 1px solid #12005e;
+ border-radius: 4px;
+ margin: 2px 12px;
+ }
+
+ label {
+ display: inline-block;
+ font-size: 15px;
+ font-weight: bold;
+ min-width: 85px;
+ color: #11171a;
+ }
+
+ .ui-spinner {
+ position: relative !important;
+ left: 50%;
+ top: 24px;
+ }
+
+ .results pre,
+ .results .output,
+ >code.curl {
+ background: #11171a !important;
+ padding: 14px;
+ position: static;
+ min-width: 100%;
+ width: 100%;
+ display: block;
+ border-radius: 8px;
+ color: white;
+ font-family: monospace;
+ font-size: 11px;
+ max-height: 40vh;
+ overflow: auto;
+
+ &.error {
+ background: red !important;
+ }
+ }
+
+ .code-examples {
+ margin-top: 12px;
+
+ >ul {
+ display: flex;
+ padding: 0;
+ list-style-type: none;
+ margin: 0;
+
+ >li {
+ cursor: pointer;
+ padding: 2px 12px;
+ border-top: 4px solid transparent;
+ margin: 0px;
+ background: transparent;
+ border-top-left-radius: 8px;
+ border-top-right-radius: 8px;
+ font-weight: bold;
+ color: #8182b5;
+ transition: all 90ms ease-in-out;
+
+ &:hover {
+ color: #12005e;
+ }
+
+ &.selected {
+ border-top-color: #5d4ff2;
+ background: #11171a;
+ color: white;
+ }
+ }
+ }
+
+ >div {
+ >pre {
+ &:not(.selected) {
+ display: none;
+ }
+
+ background: #11171a !important;
+ padding: 14px;
+ position: static;
+ min-width: 100%;
+ width: 100%;
+ display: block;
+ border-radius: 8px;
+ color: white;
+ font-family: monospace;
+ font-size: 11px;
+ max-height: 40vh;
+ overflow: auto;
+ border-top-left-radius: 0px;
+ margin: 0;
+ white-space: break-spaces;
+ }
+ }
+ }
+ }
+ }
+
+ .region-picker {
+ padding: 16px 29px;
+ }
+
+ }
+
+ h2::after {
+ border-bottom: 2px solid #2d2e83 !important;
+ }
+
+}
+
+.ui-spinner {
+ width: 38px;
+ height: 38px;
+ border: 5px solid #d8d8e922;
+ border-bottom-color: #5d4ff2;
+ border-radius: 50%;
+ display: inline-block;
+ box-sizing: border-box;
+ animation: spinner-rotate 1s linear infinite;
+ margin: 12px;
+ margin-left: -19px;
+ margin-right: auto;
+ position: absolute;
+ left: 50%;
+ top: 40vh;
+}
+
+
+@keyframes spinner-rotate {
+ 0% {
+ transform: rotate(0deg);
+ }
+
+ 100% {
+ transform: rotate(1turn);
+ }
+}
+
+main {
+ >.md-grid {
+ max-width: 90vw;
+ }
+
+ .md-sidebar {
+ display: none !important;
+ }
+
+ .gdNLsg {
+ position: initial;
+ }
+
+ .kJndnU {
+ position: absolute;
+ }
+
+ .kNjBFu:last-child {
+ min-height: initial;
+ }
+
+ .menu-content {
+ top: 70px !important;
+ border-radius: 20px;
+ width: 353px;
+ background: none;
+
+ label {
+ &:not(.active) {
+ background: none;
+ }
+ }
+
+ >.scrollbar-container {
+ >ul {
+ margin: 0px;
+ }
+ }
+
+ }
+
+ div[data-role='search:results'] {
+ background: #F5F5FA;
+ border-radius: 8px;
+ }
+
+ div[role=search] {
+ padding: 5px 31px;
+
+ input {
+ font-weight: normal;
+ color: black;
+ padding: 10px 27px;
+ font-size: 110%;
+ margin: 6px -19px;
+
+ &::placeholder {
+ font-weight: normal;
+ color: black;
+ }
+ }
+
+ svg {
+ position: relative;
+ top: 5px;
+ width: 18px;
+ left: 0;
+ }
+ }
+
+ ul.sc-iHmpnF {
+ font-size: 16px;
+ }
+
+ span.sc-ehixzo.CHBVM {
+ padding: 3px 6px;
+ font-size: 10px;
+ margin-right: 8px;
+ height: 18px;
+ width: 8ex;
+ }
+
+ ul.sc-iHmpnF.bQdsWB {
+ padding: 0;
+ margin: 0;
+ font-size: 10px;
+ user-select: none;
+
+ >li>ul {
+ >li {
+ >ul {
+ margin-bottom: 16px;
+
+ >li {
+ padding: 0px;
+ margin: 0px;
+
+ >label {
+ padding: 9px;
+ margin: 0px;
+
+ .sc-eyvILC {
+ font-size: 13px;
+ color: #21225F;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ label.-depth0 {
+ padding: 0px 9px;
+ margin: 8px;
+
+ span.sc-eyvILC.cyMuFj {
+ font-size: 14px;
+ font-weight: bold;
+ color: #6D6E9C;
+ }
+ }
+
+ label.-depth1 {
+ display: flex;
+ padding: 6px;
+ margin: 0;
+ padding-right: 16px;
+ align-items: center;
+ padding-left: 18px;
+
+ span.sc-eyvILC.cyMuFj {
+ font-size: 14px;
+ font-weight: normal;
+ color: #21225F;
+ }
+
+ &.active {
+ span.sc-eyvILC.cyMuFj {
+ font-weight: bold;
+ }
+ }
+ }
+
+ .sc-kYxDKI.eoKbCJ {
+ margin-left: 0px;
+ }
+
+ ul.sc-iHmpnF.bKAJhU {
+ display: none;
+ }
+
+ h2.copjkU {
+ color: #2d2e83;
+ font-size: 20px;
+ margin-top: 30px;
+ font-weight: bold;
+ }
+
+ .sc-dcJsrY.eVrqat .sc-kAyceB.XMnSL h2 {
+ font-size: 28px;
+ text-transform: uppercase;
+
+ &:after {
+ border: none;
+ }
+ }
+
+ .sc-bpUBKd.-depth2 {
+ >.sc-eyvILC {
+ font-size: 14px;
+ }
+
+ &.active {
+ border-top-left-radius: 8px;
+ border-bottom-left-radius: 8px;
+ border-right: 4px solid #2d2e83;
+ background: #F5F5FA;
+ }
+ }
+
+ .sc-bpUBKd.-depth1 {
+ &.active {
+ border-top-left-radius: 8px;
+ border-bottom-left-radius: 8px;
+ border-right: 4px solid #2d2e83;
+ background: #F5F5FA;
+ }
+
+ &:hover {
+ border-top-left-radius: 8px;
+ border-bottom-left-radius: 8px;
+ background: #F5F5FAaa;
+ }
+ }
+
+ .bOFhJE {
+ background-color: #e2e2e9;
+
+ button.sc-iEXKAA {
+ border-radius: 8px;
+ }
+ }
+
+ .cJteCP {
+ >.react-tabs__tab-panel.react-tabs__tab-panel--selected {
+ border-radius: 8px;
+ border-top-left-radius: 0px;
+ }
+
+ >ul {
+ margin: 0px !important;
+
+ >li {
+ padding: 5px 10px;
+ display: inline-block;
+ background-color: rgb(17, 23, 26);
+ cursor: pointer;
+ text-align: center;
+ outline: none;
+ color: rgb(204, 204, 204);
+ min-width: 60px;
+ font-size: 0.9em;
+ font-weight: bold;
+ border: none;
+ border-top: 4px solid;
+ margin: 0px !important;
+ border-radius: 0;
+
+ &:not([aria-selected=true]) {
+ border-top-color: transparent;
+ background: none;
+ }
+ }
+ }
+ }
+
+ button.sc-gdyeKB {
+ p {
+ margin: 0px;
+ }
+ }
+
+ .sc-kzqdkY {
+ clear: both;
+ }
+
+
+}
+
+
+select {
+ padding: 6.5px 12px;
+ margin: 0px 12px;
+ display: inline-flex;
+ align-items: center;
+ width: 111px;
+ cursor: pointer;
+ background: url("data:image/svg+xml,") no-repeat #f8f9fc;
+ background-position: calc(100% - 10px) center !important;
+ -moz-appearance: none !important;
+ -webkit-appearance: none !important;
+ appearance: none !important;
+ border: 1px solid #cbcfe1;
+ line-height: 1.5;
+ color: #21225f;
+ border-radius: 8px;
+}
\ No newline at end of file
diff --git a/src/sekoiaio.scss b/style/sekoiaio.scss
similarity index 100%
rename from src/sekoiaio.scss
rename to style/sekoiaio.scss
diff --git a/theme/overrides/develop/cti.html b/theme/overrides/develop/cti.html
deleted file mode 100644
index 7444822cdd..0000000000
--- a/theme/overrides/develop/cti.html
+++ /dev/null
@@ -1,63 +0,0 @@
-{% extends "base.html" %}
-
-{% block content %}
-SEKOIA.IO CTI – Develop
-
-To develop, integrate and automate your workflows, build with the SEKOIA.IO REST API.
-
-Quickstart
-
-
-
-
-
-
-
- {% include ".icons/fontawesome/solid/book.svg" %}
- Popular Guides
-
-
-
-
-
-
-
-
-
-
-
-
-
- Filtering
-
- The filtering method used by SEKOIA.IO REST API.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {% include ".icons/fontawesome/solid/dna.svg" %}
-
- Popular REST APIs
-
-
-
-
-
-{% endblock %}
diff --git a/theme/overrides/develop/tip.html b/theme/overrides/develop/tip.html
deleted file mode 100644
index 6b69e65035..0000000000
--- a/theme/overrides/develop/tip.html
+++ /dev/null
@@ -1,62 +0,0 @@
-{% extends "base.html" %}
-
-{% block content %}
-SEKOIA.IO TIP – Develop
-
-To develop, integrate and automate your workflows, build with the SEKOIA.IO REST API.
-
-Quickstart
-
-
-
-
-
-
-
- {% include ".icons/fontawesome/solid/book.svg" %}
- Popular Guides
-
-
-
-
-
-
-
-
-
-
-
-
-
- Filtering
-
- The filtering method used by SEKOIA.IO REST API.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {% include ".icons/fontawesome/solid/dna.svg" %}
-
- Popular REST APIs
-
-
-
-
-
-{% endblock %}
diff --git a/theme/overrides/home.html b/theme/overrides/home.html
index 6cd67131a7..c34d27082e 100644
--- a/theme/overrides/home.html
+++ b/theme/overrides/home.html
@@ -24,6 +24,7 @@ Explore by category
Sekoia Defend (XDR)
Sekoia Intelligence (CTI)
Sekoia Integrations
+ Developer documentation
Changelog
diff --git a/theme/overrides/openapi.html b/theme/overrides/openapi.html
new file mode 100644
index 0000000000..58d8b47e87
--- /dev/null
+++ b/theme/overrides/openapi.html
@@ -0,0 +1,12 @@
+{% extends "base.html" %}
+
+{% block styles %}
+{{ super() }}
+
+
+
+
+
+
+
+{% endblock %}