From b3d0f977b9d063aff3d3167558458eea7688a4af Mon Sep 17 00:00:00 2001 From: luandro Date: Sun, 15 Dec 2024 12:05:33 -0300 Subject: [PATCH] feat: add product support plugin using fast-graphrag --- plugins/product_support_plugin/.dockerignore | 3 + plugins/product_support_plugin/.env.example | 1 + .../product_support_plugin/.python-version | 1 + plugins/product_support_plugin/Dockerfile | 17 + plugins/product_support_plugin/README.md | 41 + plugins/product_support_plugin/cli.py | 28 + .../documentation/mapeo.txt | 7960 +++++++++++++++++ plugins/product_support_plugin/main.py | 42 + plugins/product_support_plugin/pyproject.toml | 13 + .../product_support_plugin/telegram_bot.py | 91 + plugins/product_support_plugin/uv.lock | 1358 +++ 11 files changed, 9555 insertions(+) create mode 100644 plugins/product_support_plugin/.dockerignore create mode 100644 plugins/product_support_plugin/.env.example create mode 100644 plugins/product_support_plugin/.python-version create mode 100644 plugins/product_support_plugin/Dockerfile create mode 100644 plugins/product_support_plugin/README.md create mode 100644 plugins/product_support_plugin/cli.py create mode 100644 plugins/product_support_plugin/documentation/mapeo.txt create mode 100644 plugins/product_support_plugin/main.py create mode 100644 plugins/product_support_plugin/pyproject.toml create mode 100644 plugins/product_support_plugin/telegram_bot.py create mode 100644 plugins/product_support_plugin/uv.lock diff --git a/plugins/product_support_plugin/.dockerignore b/plugins/product_support_plugin/.dockerignore new file mode 100644 index 0000000..e343752 --- /dev/null +++ b/plugins/product_support_plugin/.dockerignore @@ -0,0 +1,3 @@ +.venv +docs +.env \ No newline at end of file diff --git a/plugins/product_support_plugin/.env.example b/plugins/product_support_plugin/.env.example new file mode 100644 index 0000000..6a0a209 --- /dev/null +++ b/plugins/product_support_plugin/.env.example @@ -0,0 +1 @@ +TELEGRAM_BOT_TOKEN= \ No newline at end of file diff --git a/plugins/product_support_plugin/.python-version b/plugins/product_support_plugin/.python-version new file mode 100644 index 0000000..c8cfe39 --- /dev/null +++ b/plugins/product_support_plugin/.python-version @@ -0,0 +1 @@ +3.10 diff --git a/plugins/product_support_plugin/Dockerfile b/plugins/product_support_plugin/Dockerfile new file mode 100644 index 0000000..982707a --- /dev/null +++ b/plugins/product_support_plugin/Dockerfile @@ -0,0 +1,17 @@ +FROM python:3.10.1-slim + +# Install build dependencies +RUN apt-get update && apt-get install -y \ + build-essential \ + && rm -rf /var/lib/apt/lists/* + +COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ +WORKDIR /app + +# Copy project files +COPY pyproject.toml . +COPY . . +RUN uv venv +RUN uv sync --frozen +# Run the application +CMD ["uv", "run", "telegram_bot.py"] diff --git a/plugins/product_support_plugin/README.md b/plugins/product_support_plugin/README.md new file mode 100644 index 0000000..3d3df53 --- /dev/null +++ b/plugins/product_support_plugin/README.md @@ -0,0 +1,41 @@ +# Product Support Plugin + +A RAG (Retrieval Augmented Generation) plugin for analyzing product support based on given documentation to identify key features, user interactions, data collection methods, and how different components of the platform work together. + +## Overview + +This plugin processes documentation from Mapeo, an offline-first mapping and monitoring platform, to provide insights about: + +- Key features and functionality +- User interaction patterns +- Data collection methodologies +- Component integrations +- System architecture + +## Requirements + +- Python 3.10.1 or higher +- uv package manager (recommended) +- Dependencies listed in pyproject.toml + +## Installation + +1. Clone the repository: + +## Usage + +The plugin can be used in three ways: + +- As a CLI tool for direct queries +- Through the Telegram bot interface +- By importing and calling from your Python code + +To install dependencies with uv (recommended): + +### Docker + +To run the Awana Telegram Bot using Docker, you can use the following command: + +```bash +docker run -v ./bot:/app/mapeo_docs -e TELEGRAM_BOT_TOKEN=xxx:xxx-xxx -e OPENAI_API_KEY=sk-proj-xxx communityfirst/awana_telegram_bot +``` diff --git a/plugins/product_support_plugin/cli.py b/plugins/product_support_plugin/cli.py new file mode 100644 index 0000000..d06e51d --- /dev/null +++ b/plugins/product_support_plugin/cli.py @@ -0,0 +1,28 @@ +from main import initialize_grag, query + +def main(): + print("Welcome to Product Support Assistant!") + print("Ask questions about the product. Type 'exit' or 'quit' to end the session.") + + # Initialize the GraphRAG once + grag = initialize_grag() + + while True: + question = input("\nYour question: ").strip() + + if question.lower() in ['exit', 'quit']: + print("Goodbye!") + break + + if not question: + print("Please enter a valid question.") + continue + + try: + response = query(question, grag) + print("\nAnswer:", response) + except Exception as e: + print(f"An error occurred: {str(e)}") + +if __name__ == "__main__": + main() diff --git a/plugins/product_support_plugin/documentation/mapeo.txt b/plugins/product_support_plugin/documentation/mapeo.txt new file mode 100644 index 0000000..3b3aa2f --- /dev/null +++ b/plugins/product_support_plugin/documentation/mapeo.txt @@ -0,0 +1,7960 @@ +Mapeo Mobile + +Install + +To install Mapeo Mobile on your Android device,download the latest +version on Google Play​. ​You can also download the app as an APKand +install it manually on your phone. ​For more on installation, see +installing-mapeo-mobile.md. + +Collect data + +You collect data with Mapeo Mobile in the form of observations. An +observation is based on a geographic location (a point on the map) and +can have associated photos, notes and details. + +To create a new observation, tap the Create observation button, then +select a category. + +Add a description, photos and details, then tap the Save button. + +View observations + +Each observation will be marked on the map with a dot. Observations can +also be viewed in list form by tapping the Observations list button. + +Tap on an observation from the map or list to view its details. + +Edit an observation + +With the details of an observation open, tap the Edit button to make +changes. + +Share data externally + +Tap on the Share observation button to send the details of a single +observation to a contact outside of Mapeo using one of the +communications apps installed on your phone (WhatsApp, Signal, Email, +etc.). + +Delete an observation + +Tap the Delete button to delete an observation and its associated media. + +{% hint style=“warning” %} Deleting observations cannot be undone, so +exercise caution when using delete. {% endhint %} + +Synchronize data + +Mapeo Mobile allows you to synchronize data with other Mapeo users that +are participants of the same project. During synchronization, ALL data +from one device will be sent to the other device and vice versa. For +more on synchronization, see: peer-to-peer-and-mapeo-sync.md. + +To synchronize data between 2 Mapeo Mobile devices that are near each +other: + +1. Connect both devices to the same Wi-Fi network. (You do not need to + have an internet connection.) + +2. Tap the Synchronize button on both devices. + +3. On the Synchronize screen, identify the device you wish to + synchronize with in the list and tap the Sync button beside its + name. + +4. Keep the Synchronize screen open on both devices until the + synchronization has completed. + +- + +{% hint style=“info” %} For detailed instructions on how to use all +features of Mapeo Mobile, see below sections in the Complete Reference +Guide: + +mapeo-mobile-installation-setup + +mapeo-mobile-use {% endhint %} # Mapeo Desktop + +Install + +Download Mapeo Desktop from the Mapeo website and double click the file +to launch the installer. For more on installation, see +installing-mapeo-desktop.md. + +Mapeo Desktop for managing Mapeo Mobile data (Observations mode) + +Observations mode in Mapeo Desktop is designed for viewing, managing and +exporting data collected with Mapeo Mobile. The steps below will cover +the basics for testing Observations mode. + +{% hint style=“info” %} For more detailed instructions and information +on how to use Mapeo Desktop for creating territory data (Territory +mode), see the Complete Reference Guide section on mapeo-desktop-use. {% +endhint %} + +Synchronize Mapeo Mobile data + +To get started, synchronize collected data from a Mapeo Mobile device. +To synchronize via Wi-Fi, as detailed below, the Mapeo Mobile and Mapeo +Desktop devices must be near each other. + +Connect to Wi-Fi + +Make sure both the Mapeo Mobile device and the Mapeo Desktop device are +connected to the same Wi-Fi network. (An internet connection is not +required.) + +Enter Synchronize mode + +In Mapeo Mobile, tap the Synchronize button to enter the Synchronize +screen. + +In Mapeo Desktop, click on Synchronize in the Mapeo modes panel. + +Start synchronization + +On the Mapeo Desktop Synchronize screen, identify the mobile device you +would like to synchronize with and click on the Synchronize button below +its name. + +{% hint style=“warning” %} IMPORTANT: Keep the Synchronize screen open +on BOTH devices until the synchronization is complete. Interrupting the +sync process can result in permanently corrupted data. {% endhint %} + +{% hint style=“info” %} In order to synchronize, Mapeo devices must be +connected to the same Wi-Fi network, and using the same project +configuration. + +For more detailed instructions on synchronizing in Mapeo Desktop, see +syncing-data.md. {% endhint %} + +View observations + +To view synchronized data, click on Observations in the Mapeo modes +panel. + +Map view + +By default, observations are displayed as dots on a map. Click on an +individual dot to view the details of that observation. + +Media view + +To view observations as a gallery of images, click on Media in the +Toolbar above the map. Click on an individual image to view the details +of that observation. + +Report view + +To view observations in the form of a report, click on Report in the +Toolbar. + +Filter observations + +To look at a subset of your observations in Map, Media or Report view, +use the Filter panel to select a specific data range, a subset of +categories, or specific data values from details fields. + +Edit observations + +From Map or Media view, click on a dot or image to view the full details +of the corresponding observation. From Report view, use the EDIT button +in the grey toolbar to open the details of the observation shown in the +current page of the report. + +With the observation details open, click on a field to add or edit +information. Click SAVE to save changes. + +{% hint style=“info” %} In Mapeo Desktop you cannot modify the creation +date, category type or geographic location of an observation. {% endhint +%} + +Delete observations + +To delete an observation, open the observation details and click on +theMore options menu. Select Delete observation and confirm deletion in +the pop-up window. + +{% hint style=“warning” %} Deleting observations cannot be undone, so +exercise caution when using delete. + +By deleting observations, you will permanently remove them from your +device and all devices you synchronize data with in the future. For more +on synchronization, see peer-to-peer-and-mapeo-sync.md {% endhint %} + +Export data + +Data can be exported to multiple formats from Observations mode in Mapeo +Desktop. Basic export instructions are included below. + +- Save as PDF Report +- Export to GeoJSON, CSV, or SMART CSV +- Export as Web Map (In Complete Reference Guide) + +{% hint style=“info” %} For more details on Mapeo export formats and +process, see exporting-and-sharing-externally.md in the Complete +Reference Guide. {% endhint %} + +Save as PDF Report + +To save a PDF report with the observations collected, go to Report view. +Filter observations if desired using the Filter panel. Hide any fields +you don’t wish to appear by using the Hide fields option in the grey +panel above the report. +To save, click on Save PDF. + +Export to GeoJSON, CSV, or SMART CSV + +To export observations to GeoJSON, CSV or SMART CSV format, click on the +Export options menu at the top right corner of the Mapeo Desktop window. + +Select Export Observations… then select the desired data format and +options in the Export Observations pop-up window. Click SAVE to name the +export file and choose the location on your computer where it will be +saved. + +{% hint style=“info” %} For detailed instructions on all features and +uses of Mapeo Desktop, see mapeo-desktop-use in the Complete Reference +Guide. {% endhint %} # Getting started + +The Quick Start Guide is intended to help you install and test the +basic, out-of-the-box functionality of Mapeo in order to evaluate +whether it will be a good fit. This section will not touch on all +features or customization of the tools. + +The Complete Reference Guide below includes critical information about +how to design and implement a project using Mapeo as well as detailed +guides for setup and customization of the tools. We recommend using it +for starting a new initiative or as a training reference. # Translating +Mapeo & default configurations + +Mapeo aims to be accessible to a wide range of communities in their +native languages, and to facilitate the process of translating the app +and the default configuration into new languages as needed. + +While developing custom configurations currently requires significant +technical knowledge, the process of translating Mapeo and the default +configuration into a new local language can be an easier way to +customize the tool for use in your project. + +Translation using Crowdin + +Translations for Mapeo are handled through the Crowdin platform. It is +free to create an account on Crowdin and anyone can contribute +translations to Mapeo for new or existing languages. + +To begin translating, visit the project page for the area you would like +to translate. + +- Mapeo Mobile + Text and titles for screens and buttons in the mobile app +- Mapeo Desktop + Text and titles for screens and buttons in the dekstop app +- Mapeo’s default configuration + Names of data collection categories, and details fields + + ----------------------------------------------------------------------- + Project page for Mapeo Mobile on Crowdin + + ----------------------------------------------------------------------- + + : Project page for Mapeo Mobile on Crowdin + +Viewing available languages + +On the project home page you can view all languages currently available +for the project and how complete translations are. + +Adding a new language + +If the language you wish to translate is not available on the project +home page, contact the Project Owner (listed on the bottom right of the +page) to request an addition to the list. + +Contributing translations + +To start translating, create an account with Crowdin, visit the relevant +project home page, and select the target language. Click on Translate +All to bring up all relevant text strings. # Custom configurations + +About custom configurations + +Custom configurations are a powerful tool for customization in Mapeo, +allowing users to define specific categories, icons, and questionnaires +for their projects. Custom category and questionnaire text can be +written in any language that can be typed, ensuring that key parts of +the Mapeo data collection interface can appear in the native language of +the groups using it. + +In the current version of Mapeo, configurations also contain a project +key that allows participants of the same Mapeo project to synchronize +data with each other and prevents synchronization with other devices. ​ + +Creating custom configurations + +If you have determined that Mapeo’s default-configuration.md will not +suit the needs of your project, you have the option of authoring a +custom configuration. + +{% hint style=“warning” %} Creating custom configurations currently +requires significant technical knowledge and will not be accessible to +all users. {% endhint %} + +The customization process, detailed in creating-custom-configurations, +requires comfort editing JSON files, generating SVG image files, and +using GitHub Actions or installing and using node packages via the +command line. # Creating custom configurations + +{% hint style=“warning” %} Please note that creating custom +configurations currently requires significant technical knowledge and +will not be accessible to all users. {% endhint %} + +Overview of the process + +There are several steps to creating a custom configuration that will +require different skills and the involvement of different actors within +a project. You should leave plenty of time prior to the intended start +of data collection to allow for community consultation, testing, and +iterations of your configuration. + +While data structures in Mapeo can be modified during the course of a +project, many changes over time can result in messy data outputs. It is +worthwhile to test and refine your configuration to the extent possible +before putting it into use for data collection. + +Once you have completed this process, you will have a Mapeo +configuration file (.mapeosettings) that can be imported and used in +Mapeo Mobile and Destop. + +The pages that follow will walk you through the key steps for authoring +a custom configuration: + +- planning-configuration-and-data-structure + This section will outline the key customizable elements in a + configuration and some considerations when mapping out each area. + *No technical knowledge is required. + +- coding-configuration + This section will guide you through translating the planned data + structure into the required format and compiling the Mapeo + configuration file. + *Editing JSON files, generating .svg files and working with command + line or GitHub is required. + +{% hint style=“info” %} For instructions on how to import a +configuration file (.mapeosettings) into Mapeo, see: + +importing-configurations.md + +importing-configurations.md {% endhint %} # Testing and iterating + +Once you’ve compiled your custom configuration, you will have a +.mapeosettings file that can be imported into Mapeo Mobile and Desktop +for testing and use. + +What is a .mapeosettings file? + +A .mapeosettings file is a tar file, similar to a zip file. For +debugging purposes you can see the contents of the file by changing the +file extension to .tar and using any application that can extract tar +files. + +Importing a configuration into Mapeo + +For instructions on how to import a configuration file (.mapeosettings) +into Mapeo, see: + +importing-configurations.md + +importing-configurations.md + +Testing out your configuration + +It’s worthwhile to thoroughly kick the tires of your new configuration +prior to introducing it into your project and beginning formal data +collection. + +A few things to look for when testing configurations: + +- Icons + ****Do icons render clearly? **** Check how icons appear, especially + in Mapeo Mobile on devices with smaller screens. +- Categories + ****Do categories appear in a logical order on the Categories screen + of Mapeo Mobile? **** Changes can be made via the sort property in + creating-categories.md. +- Details fields + ****Are text labels and placeholders easy to understand? Do details + fields appear in a logical order? Fields will be displayed to users + in the order they are listed in the fields array in + creating-categories.md. +- Colors + If you added color to category map markers, are they distinguishable + from one another and visible on your map background? +- Name and version + Does the name and version of your configuration appear as desired on + the Project configuration screen of Mapeo Mobile or the Synchronize + screen of Mapeo Desktop? + +Making changes + +Changes can easily be made to your configuration via steps in the +coding-configurationsection. We often test, modify, recompile and retest +several times before releasing a new config version. + +As noted in planning-configuration-and-data-structure, configurations +can and often will evolve over time. As you begin collecting data, you +will likely find categories, details fields and options you would like +to add or modify. + +Unlike some other survey or data collection tools, Mapeo allows a lot of +flexibility for changing configurations over time and does not require +that the database be wiped when changes are made. While changes to icons +or color, name, label, or placeholder fields will be minor, more +significant modifications like removing a category will impact how +existing data is displayed in Mapeo and data exports. Regardless of +these changes, no previous data will be lost or unviewable. # Creating +details fields + +{% hint style=“info” %} To review key information on defining details +fields, see details-fields.md. {% endhint %} + +In fields directory customize the .json files + +Each .json file in the fields directory needs a key, type, label, and +placeholder. + +type can be one of select_multiple, select_one, or text. + +For select_one and select_multiple fields, you will need to define an +array of answer options. + +Example fields file (name.json): + + { + "key": "name", + "type": "text", + "label": "Name", + "placeholder": "Common name of this place" + } + +Example fields file (sample-type.json): + + { + "key": "sample-type", + "type": "select_one", + "label": "Sample type", + "placeholder": "Select the type of testing", + "options": [ + "Meteorological", + "Air", + "Soil", + "Water", + "Mineral", + "Forestry/vegetation", + "Other" + ] + } + +Adding a project key + +What is a Project Key? + +In the metadata.json file in your Mapeo configuration, you can include a +projectKey, which is a random cryptographic string of characters to +prevent unwanted devices from getting access to the data. + +Once a Mapeo Mobile or Mapeo Desktop device has imported a configuration +with a project key, it can only sync with another Mapeo Mobile or Mapeo +Desktop device that has the same project key. + +You can edit the project key (for example, if you want to make first 4 +characters identifiable to a project) but it can only contain letters +a-f and numbers 0-9. + +It can also only be 64 characters long – no more, no less. + +Creating a Project Key + +To create a projectKey, first open the Terminal. + +Using mapeo-settings-builder + +{% hint style=“info” %} For instructions on how to install +mapeo-settings-builder, see Building configuration file +preparing-computer.md. {% endhint %} + +Copy and paste the following command into the terminal + + mapeo-settings-builder generate-key + +You’ll see something like this (but with x replaced with real characters +and numbers) + + '380c02d32xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1d' + +Copy this string and add it to the metadata.json file so it looks like +this: + + { + "dataset_id": "mapeo-jungle", + "projectKey": "380c02d32xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1d" + } + +Notice that there are double quotes " around each value. # Coding +configuration + +Mapeo configuration files (.mapeosettings) are compiled from a set of +files and folders that contain all the information Mapeo needs to +display the categories, icons and details fields you want users to see +when collecting and viewing data. This section will walk you through +translating all of the information you’ve defined in +planning-configuration-and-data-structure into a Mapeo configuration +file. + +Configuration folder structure + +To begin preparing your files, you can download or clone our **** +default configuration repository or this empty configuration repository +from GitHub. These repositories contain the core files and folders you +will need for editing. + +When authoring custom configurations, you will edit files within the +following configuration folders: + +- icons +- fields +- presets (categories) + +And the following configuration files: + +- metadata.json +- defaults.json +- package.json + +Prepare folder structure + +Using the file explorer + +1. Download the default configuration repository or empty configuration + repository. +2. Unzip the contents to a new folder using a program like 7zip. +3. Rename the folder from “mapeo-default-settings” to use your own + project name, “mapeo-config-projectname”. + +Using the terminal (linux and mac) + + wget https://github.com/digidem/mapeo-default-settings/archive/v2.1.0.zip + unzip v2.1.0.zip + mv mapeo-default-settings-v2.1.0 mapeo-settings-myprojectname + +Creating and exporting SVG files using Inkscape + +Inkscape is a free and open-source vector graphics editor used to create +vector images, primarily in Scalable Vector Graphics (.svg) format. +Inkscape is an alternative to the commercial software Adobe Illustrator, +and can be used to generate .svg files that work in Mapeo. + +Using Inkscape to vectorize images + +A common workflow for generating Mapeo icons is to find photos or other +raster images, and turn them into vector images, simplifying them until +they will render well at a small size. In Adobe Illustrator, this can be +done using the Image Trace tool. + +In Inkscape, this can be done using the Trace Bitmap tool found in the +Path menu. There are some options to manipulate like Smoothing corners, +Optimizing corners, and setting the number of colors. + +Saving .svg files with the right size and Viewbox in Document Properties + +Once you have a vector image that is to your satisfaction (and in a +square format), you need to set the correct width & height and Viewbox +size before saving the .svg file. You can do this in Document Properties +(File menu). + +First, set the Display units to pixels (px). This dropdown is located at +the very top of the Document Properties menu. + +Locate the “Custom Size” and “Scale” boxes in Document Properties. + +First, you may need to set the unit of measurement for the Custom size, +if it is not in pixels. If Units is in a format like milimeters (mm), +change this to px. + +Set the Width and Height to 100 each. + +Next, the Viewbox needs to be set to 100 as well. The easiest way to do +this — once you’ve set the Display units and Custom size units to pixels +— is to set the Scale x to 1. It should copy over the Width and Height +values from the Custom Size to the Viewbox. If that didn’t do the trick, +manually enter 100 for both Width and Height here. + +Once you’ve done this, you may need to resize the art to match the full +size of the Viewbox: + +The easiest way to do this is to use the sizing and placement parameters +right above the Viewbox, as shown in the screenshot above. Set W and H +to 100 (px), and make sure X and Y are set to 0 (px). The image will +then fill the entire Viewbox: + +You can now save the .svg file by going to File → Save / Save As / Save +A Copy. + +Your .svg file should now be ready to be used by Mapeo. See +#naming-icon-files for more information on how to name the files and +where to place them in the configuration directory. + +Verify that your SVG file is built correctly + +{% hint style=“info” %} If you want to verify that the parameters in +your .svg file are correct, open it in a text editor like Visual Studio +Code or Notepad++. {% endhint %} + +It should have an initial tag with width and height set to 100, +and viewBox set to “0 0 100 100.” + +After some tags like , , , which +don’t matter for the purposes of creating icons for Mapeo, you should +see tags like with layer properties, and a series of with +vertices and style properties, which constitute your vectors. + +If your .svg file looks like this, the Mapeo configurations builder +script should process your icons just fine. + +Additional resources + +- Troubleshooting SVG image errors in Mapbox Studio # Adding icon + files + +{% hint style=“info” %} To review key information on designing icons, +see icons.md. {% endhint %} + +Once you’ve settled on the design or concept for your icons, you’ll need +to generate .svg files for each one to be saved in the icons directory. +Icons should be created as 100x100 pixel graphics that are clear when +viewing at 100%. + +To generate .svg icons for Mapeo, there is an online Mapeo Icons +Generator tool accessible here. + +We have also documented two workflows to generate Mapeo-compatible .svg +files using software, one using a commercial product (Adobe Illustrator) +and another using a open-source product (Inkscape). + +- creating-and-exporting-svg-files-using-adobe-illustrator.md +- creating-and-exporting-svg-files-using-inkscape.md + +Naming icon files + +Icons need to be read by MAPEO in two sizes: 100 pixels and 24 pixels. +For that reason there is a specific file naming convention: + +- icon-name-100px.svg +- icon-name-24px.svg + +Each icon can be duplicated and renamed so that there is one of each +size. They are opened and read by the .json files in the presets folder. +Verify that name is correctly entered where needed (more on this in the +next section). The build script will process the pixel size suffix. + +Additional resources + +- Troubleshooting SVG image errors in Mapbox Studio # Creating and + exporting SVG files using Adobe Illustrator + +Adobe Illustrator is a vector graphics editor and design program +developed by Adobe Inc. Although it is a commercial, licensed product, +it is very commonly used to put together vector graphics, and many users +utilize this tool for creating icons for Mapeo as well. + + Exporting .svg files with the right properties + +When you’re ready to export a vector graphic file into a +Mapeo-compatible .svg file format, the process is as follows: + +- On the Adobe Illustrator top menu, click on File and then select + Export, followed by Export As. +- Ensure that Use Artboards is checked. + +- Save your .svg file in the correct directory (icons for Mapeo + configurations) and with your desired filename, and click Export. +- In the following window, ensure that the following properties are + set, and then click OK: + +Your .svg file should now be ready to be used by Mapeo. See +#naming-icon-files for more information on how to name the files and +where to place them in the configuration directory. # Defining geometry +defaults + +The defaults.json file is currently used by Mapeo Desktop to determine +which categories (presets) to list for each type of map geometry (point, +line, area). + +Before building your configuration, ensure that defaults.json includes +an array of presets for each geometry that corresponds to the geometries +you’ve listed in your preset files. + +Example defaults.json file: + + { + "area": [ + "area", + "airstrip", + "animal", + "community", + "fishing-site", + "gathering-site", + "hills", + "hunting-site", + "lake", + "palm", + "special-site", + "swidden", + "threat", + "tree", + "plant" + ], + "line": [ + "line", + "boundary-line", + "river", + "path", + "stream", + "threat" + ], + "point": [ + "point", + "airstrip", + "animal", + "boundary-line", + "building", + "camp", + "clay", + "community", + "fishing-site", + "gathering-site", + "house", + "hunting-site", + "palm", + "cave", + "plant", + "salt-lick", + "waterfall", + "special-site", + "swidden", + "threat", + "tree" + ], + "vertex": [ + ], + "relation": [ + ] + } + +Building configuration file + +Compiling your configuration into a .mapeosettings file is the final +step for testing and using your configuration in Mapeo Mobile and +Desktop. + +Building a configuration can be done in two ways: + +- ****preparing-computer.md(with Node.js and mapeo-settings-builder) +- ****using-github-actions.md + +Using GitHub Actions + +It is possible to build a Mapeo configuration file using GitHub Actions. +This requires setting up your custom configuration directory as a +repository on Github.com, adding a /.github/workflows/build.yml script +to your repository, and committing changes to that repository. + +{% hint style=“info” %} If you haven’t already used GitHub, you may want +to study the basics of how GitHub works before proceeding. {% endhint %} + +{% hint style=“warning” %} Note that since this process relies on using +github.com, that you will need internet access to run the build action +and download the .mapeosettings configuration file. Hence, unlike +building a configuration preparing-computer.md, this process will not +work in an offline context. {% endhint %} + +Setting up a configuration repository on GitHub + +The first step will be to set up your configuration as a repository on +github.com, with the requisite build script files that will trigger a +GitHub Actions Workflow to generate your .mapeosettings file. There are +a few ways to do this. + +If you do not have your own custom configuration already, and are +starting from scratch: + +1. You can fork or upload either the Mapeo Default Configuration or the + Empty Mapeo Configuration template to your own GitHub account. The + choice you make will depend on how you will go about creating your + own configuration, as detailed in + planning-configuration-and-data-structure. +2. Make sure that you have the .github/workflows directory in your + configuration repository. + +If you already have your own custom configuration: + +1. Create a repository on GitHub for your custom configuration. +2. Commit your existing configuration content to the repository. +3. Download either the Mapeo Default Configuration or the Empty Mapeo + Configuration, and copy over the .github directory to the root + directory of your custom configuration. +4. Commit these files to your repository on Github.com. (Github may ask + you for additional permissions to add these files, by confirming via + the browser.) + +{% hint style=“info” %} NOTE: Depending on your operating system and +setup, it is possible that you do not see a .github/ directory anywhere. +You may need to enable viewing hidden files in your system file manager. +On MacOS, you can do so by pressing Command + Shift + . (period) in your +Finder window. {% endhint %} + +Getting ready to build + +Navigate to the Actions screen, and Click “I understand my workflows, go +ahead and enable them.” + +This will bring you to a view of your Workflows. You should see a +message “There are no workflow runs yet” if you just enabled Workflows +for the first time. You are now ready to start building .mapeoconfig +files. + +How it works + +Once you have enabled Action Workflows on your configuration repository, +GitHub will generate a Workflow to build a new version of your +configuration every single time that you commit a change to your +repository. + +Once you have committed a change to your repository, and navigate to the +Actions tab, you should see your commit message listed as a workflow. + +- :white_check_mark: a circular check indicates that the build has + completed successfully. +- :yellow_circle: a yellow circle indicates that the build is in + process. +- :red_circle: a red circle with an X indicates that the build has + encountered an error. + +You can click on your commit message to find out more about the status +of your build. For example, if your build has encountered an error, +there will be a log that can give you an idea of what went wrong. You +can commit a change to fix the error, and return to the Actions screen +to see if a new Workflow successfully bypasses the problem. + +{% hint style=“info” %} This is the same log that you would see when +building a configuration preparing-computer.md. {% endhint %} + +By opening the Workflow with your commit message, you can also download +a .zip file of your configuration, which includes a temporary +.mapeosettings file. This is helpful for testing out your configuration +before building a versioned file to distribute to users, as described in +testing-and-iterating.md. + +Use conventional commit messages to increment your configuration version + +The Mapeo GitHub Actions Workflow is set up to dynamically bump the +version of your configuration per each workflow. It does so using +conventional commit messaging of adding feat:, fix:, or chore: before +your commit message. For example, if you have a configuration with +version 1.1.0, the specific version bumps are as follows: + +- feat: this will increase your version to 1.2.0. This commit prefix + could be used for major configuration updates. +- fix: this will increase your version to 1.1.1. This commit prefix + could be used for small updates like changing an icon, or adding a + field to a category. +- chore: this will not increase your version. This commit prefix could + be used for correcting typos or fixing errors. + +{% hint style=“info” %} To see a few examples of configuration +conventional commit messaging, see the screenshot above in +#how-it-works, or check out the commit history on the Mapeo Default +Configuration repository. {% endhint %} + +You can also manually update the first number in your 1.1.0 version in +your package.json file, but Digital Democracy’s convention is to only do +so to indicate breaking changes. That said, you are free to choose a +versioning convention that makes the most sense to you. + +Compile a final, versioned release of your configuration + +Once you are done making changes, have tested your configuration using a +temporary .mapeosettings file (as described in #how-it-works) and in +accordance to the process described in testing-and-iterating.md, you can +generate a versioned release of your configuration. The way to do so is +as follows: + +- Navigate to the Actions tab for your GitHub repository. You should + see all of your Workflows again. +- On the left sidebar, click on the Build & Release link. +- You should now see a box with the text “This workflow has a + workflow_dispatch event trigger” and a button Run workflow. Click + the button, and then click Run workflow again in the popup that will + appear. + +- Doing so will trigger another Workflow titled “Build and Release.” +- When that finished with a :white_check_mark: green check mark, your + versioned build release will be ready. On the top navigation bar, + click on Code and your release should appear under the Releases + panel in the right sidebar. + +- Click on the release to download the versioned .mapeosettings file. + # Via the command line + +Prepare computer for building the configuration + +Mapeo is built with JavaScript programming language. To get started, +you’ll need to installNode.jsdevelopment environment. If you already +have Node.js installed you can skip this section. + +You need to be at least on Node.js version 8 (or higher) for the +mapeo-settings-builder to work properly. Head over to Node.js download +page and select installer for your operating system. + +Alternatively you can also use NVM (Node Version Manager) to install and +manage multiple versions of Node.js on your computer. + +Install nvm + + touch ~/.bash_profile + curl -o- | bash + +Then close terminal and open again + +Install homebrew (macOS) + +http://brew.sh/ + +Install puppeteer dependencies (Windows Subsystem for Linux) + +If you are using Windows Subsystem for Linux (WSL) to build a +configuration, you need to install some dependencies for puppeteer. + + sudo apt install libgtk-3-dev libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2 + +Install npm + +https://docs.npmjs.com/cli/install + +Install and use node 12 + + nvm install 12 + nvm alias default 12 + +Install Mapeo Settings Builder + +You’ll see output on the terminal, but this is OK + + npm install -g mapeo-settings-builder + +Is your computer ready? + +If your computer is ready to create configurations, type + + mapeo-settings-builder + +You should see output that looks something like + + → Using version x.x.x of mapeo-settings-builder + Usage: mapeo-settings-builder [options] [command] + + Options: + -h, --help display help for command + + Commands: + build [options] [sourceDir] Build config from presets in current working dir + lint [sourceDir] Lint preset files for errors + extract-messages [options] Extract messages for translation + generate-key Generate a random project key + help [command] display help for command + +Now you’re ready to move to build your configuration! + +Package Config Assets for MAPEO + +Prep folder and build + +Type, ’cd`, then a space, then drag and drop the folder where the +prepared assets are and press enter. It will look something like this + + cd /Users/jen/Documents/Dd_LOCAL_project-files/Dd-Tools/Mapeo/Presets/CREATION\\ LAB/Strathcona-KX-v1.0.0 + +You will then be ready to run scripts directly in the folder. + + npm install + npm run -s build + +This -s tells npm to be silent, so that you only see errors that are +meaningful to you. + +You will see something like the following output. Errors will be +highlighted in RED with hopefully some helpful description so that you +can remedy the issue. + + → Using version x.x.x. of mapeo-settings-builder + ! Warning: no category json files found in /home/okdistribute/node_modules/mapeo-default-settings/mapeo-default-settings-2.1.0/categories + ✓ Built presets and categories (37ms) + ✓ Generated svg sprite for iD (544ms) + ✓ Generated png sprite for Mapbox (81ms) + ✓ Generated png icons for Mapeo Mobile (607ms) + ✓ Successfully created file 'build/mapeo-default-settings-v2.1.0.mapeosettings' (total 1299ms) + +You’ll also see a .mapeosettings file inside of the build directory. + +What is a .mapeosettings file? + +A .mapeosettings file is a tar file, similar to a zip file. You can see +the contents of the file by changing the file extension to .tar and +using any application that can extract tar files (such as 7zip, +mentioned above). + +Troubleshooting Checklist + +Type the following into the terminal + + node -v + +You need to be at least on Node version 8 for the mapeo-settings-builder +to work properly. If you need help, review the ‘Preparing Computer’ +section and ensure you’re on the latest version of +mapeo-settings-builder. + + npm install -g mapeo-settings-builder@latest + +You also may want to delete node_modules and install updated versions of +the dependencies. + +In Mac or Linux, in the terminal: + + npm install + +If you’re having more issues, please open an issue on the GitHub +repository or e-mail our support hotline. + +Versioning + +It’s important to increment the version when releasing new changes to +your configuration. When you are ready to release a new version, you can +use standard-version in the command line to automatically increment your +config version and update the CHANGELOG.md file in your repository. + +{% hint style=“info” %} For more on versions with standard-version, see +#use-conventional-commit-messages-to-increment-your-configuration-version +{% endhint %} # Creating categories + +{% hint style=“info” %} To review key information on defining +categories, see categories.md. {% endhint %} + +In the presets directory, customize the .json files + +In the presets directory, each .json file needs: + +- icon must mach the name of an icon in the icons folder - use prefix + only, excluding the size refernce and file extension (eg. for + fishing-24px.svg/fishing-100px.svg use fishing). +- name will be the human-readable label shown to the user +- geometry must be an array of point ,area, and/or line (All + categories for use in Mapeo Mobile must include point.) +- sort (optional) is an integer that will determine the order in which + categories are displayed on the Categories screen of Mapeo Mobile. + If no sort is included, categories will be listed alphabetically by + name. +- an array of fields (optional) which should match the key created in + the fields directory. Fields will be displayed to users in the order + they are listed in the fields array. +- color (optional) determines the color of observation dots on the + map. (Dots fall back to orange if no color is defined.) Value can be + a hex code, CSS color name or any string supported by + validate-color. + +Example preset file (fishing-site.json): + + { + "icon": "fishing", + "name": "Fishing Site", + "sort": 10, + "color": "#13D5CF", + "fields": [ + "name" + ], + "geometry": [ + "point", + "area" + ] + } + +Adding project name and version + +The package.json file stores the name and version information users will +see in Mapeo when using the configuration. + +Edit the name and version properties when creating a new configuration. +Additional information on incrementing versions will be covered in +building-configuration-file. + +You can also add description, author, and license information to this +file but these properties will not be rendered in the Mapeo interface. + +Example package.json file: + + { + "name": "project-config", + "version": "1.0.0", + "description": "Mapeo configuration", + "dependencies": { + "mapeo-settings-builder": "^3.0.0", + "mkdirp": "^0.5.1" + }, + "devDependencies": {}, + "scripts": { + "build": "basename=\"${npm_package_name}-v${npm_package_version}\"; mkdirp build/${basename}; mapeo-settings build -l 'en' -o build/${basename}.mapeosettings && tar -C \"build/${basename}\" -xf build/${basename}.mapeosettings", + "test": "mapeo-settings lint" + }, + "author": "Your Name", + "license": "UNLICENSED", + "private": true + } + +Details fields + +What are details fields? + +For each category in your configuration, you can include one or more +structured data fields (like a mini form or questionnaire) that users +can optionally fill out when creating a new observation or map element +with that category. +Details fields can be text fields (type in your own answer) or multiple +choice (select one or select many from a set of pre-defined answers). + +How details fields are viewed in Mapeo + +Details field screen displayed during data collection with Mapeo Mobile: + +Considerations when defining details fields + +When planning your data structure, you should think through which (if +any) details fields you would like to include for each category. The +same details field can be used for many categories. + +For each details field you would like to include, you’ll need to define +the following: + +- Label + The primary text to be displayed to users (“Name” in the above + image). +- Placeholder + A hint or subtext that can clarify the field to users or provide + guidance on how to use it (“Common name of this place” in the above + image). +- Field type + How users will be able to enter information for the field or + question. + - Text or type in your own answer (Pictured in the image above) + + - Select one from a list of options + + - Select multiple from a list of options + + - Options + For Select one and Select multiple fields, you will need to + define a list of possible answers to display. + +When defining details fields, keep in mind the following: + +- It can be very challenging for users to type in detailed information + when collecting data in the field. Users may be under significant + stress, in risky situations, or interacting with the Mapeo screen in + bright sun or rain. When creating Text fields, keep in mind the + conditions users will be facing and have reasonable expectations for + the amount of detail and work required to fill out your details + fields. +- If there are a consistent set of answers you can anticipate for a + field or question, it can be much faster or easier for users to + select from a list as part of a Select one or Select multiple field. + Please note that there is no automatic option for typing in + information for “Other” or an option not included in the list. +- It may be very clear to you when authoring your configuration what + each details field means or intends to communicate. Keep in mind, + however, who will be collecting data as part of your project and how + they might read or interpret each field. Very clear and explicit + language can go a long way towards ensuring your configuration is + used as intended. +- Mapeo Desktop currently allows you to filter observations by options + in Select one fields. To filter by options in Select multiple or + Text fields, you will need to export your data and view it in + another software tool. + +Generating details field files + +All information you define for details fields will be formatted in JSON +in the coding-configuration process, detailed in the following section. + +{% hint style=“info” %} If you are not comfortable working with JSON, +this information can be be passed off to someone with technical skills +to complete the steps in coding-configuration. {% endhint %} # Planning +configuration & data structure + +Though some key steps of coding configurations require technical skills, +initial planning and consultation with project participants is essential +to designing effective data structures and does not require coding +skills. + +To start the customization process, project participants should reflect +on the project goals, what kind of data will be needed, and what +properties might be required for data outputs. + +If you have not already done so, work through the +what-information-to-collect section of this guide as a first step. + +Data structure + +When planning your configuration, you will need to think through what to +include for each of the key customizable areas of Mapeo. The pages that +follow will walk you through some considerations when determining +content for each area: + +- categories.md + When collecting or creating data with Mapeo, users assign a + top-level category to each observation or element on the map. +- icons.md + Each category you include must have an icon, or a small graphic to + display to users when selecting a category. +- details-fields.md (optional) + For each category in your configuration, you can include one or more + structured data fields (like a mini form or questionnaire) that + users can optionally fill out when creating a new observation or map + element with that category. + +{% hint style=“info” %} Configurations can and often will evolve over +time. As you begin collecting data, you will likely find categories, +details fields and options you would like to add or modify. Unlike some +other survey or data collection tools, Mapeo allows a lot of flexibility +for changing configurations over time and does not require that the +database be wiped when changes are made. {% endhint %} + +Documenting data structure + +In order to create a Mapeo configuration file, the information you map +out for the above areas will need to be translated into JSON files and +.svg image files and then compiled. The details of this process will be +covered in coding-configuration. + +If you do not have the technical skills required to code the +configuration yourself, the information you define in the following +pages for for categories.md, icons.md and details-fields.md can be +documented and passed off to a developer or individual with technical +skills to code and compile the configuration file. # Icons + +What is an icon? + +Each of the categories you include in your configuration needs to be +assigned an icon, or a small graphic to display to users when selecting +a category. You can assign the same icon to various cateogries, or each +category can have it’s own icon. + +How icons are viewed in Mapeo + +Categories list with icons in Mapeo Mobile (using the default +configuration): + +Examples of the icon files from our default configuration can be found +here. + +Considerations when designing icons + +Though creating the .svg icon files requires some knowledge of image +editing tools, sketching and brainstorming ideas for icons can be a +great way to involve community members and project participants who may +not have technical skills. With paper and pencils, groups can come up +with ideas for icons to represent each category in your project. + +If you’re not up for designing your own icon images, there are libraries +of images online with Creative Commons licenses that you can draw from. + +When designing icons, keep in mind the following: + +- Icons are displayed as very small images in Mapeo Mobile (24x24px) + and Mapeo Desktop (100x100px). Very simple designs with minimal + detail will render more clearly to users. + - When thinking about size and scale, imagine drawing your icons + with a marker on a dime. +- Bold and solid-color lines and shapes will be most clearly visible. + +Generating icon files + +Once you’ve settled on the design or concept for your icons, you’ll need +to generate .svg files required to include as part of the +coding-configuration process. + +To do so, you can use our online Mapeo Icons Generator, here. + +Or, jump to creating-and-exporting-svg-files-using-adobe-illustrator.md +or creating-and-exporting-svg-files-using-inkscape.md for technical +guidelines in generating your own suitable SVG files. + +{% hint style=“info” %} If you do not have skills to prepare the digital +icon files, paper sketches can be passed off to someone with technical +skills to complete the steps of generating icon files, outlined in +coding-configuration. {% endhint %} # Categories + +What are categories? + +When collecting or creating data with Mapeo, each observation or element +on the map is assigned a category. Users must select a single category +when creating a new observation or map element. Categories can be broad +or specific, depending on your context and project needs. + +How categories are viewed in Mapeo + +Categories list in Mapeo Mobile (using the default configuration): + +Categories list in the Filters panel of Mapeo Desktop (using the default +configuration): + +Considerations when defining categories + +For each category you choose to include in your configuration, you’ll +need to determine the following: + +- Name + ****The label users will see in Mapeo when viewing or selecting the + category + +- Geometry + ****Each element on the map will be marked as a + ****point, line (eg. a path), or area (eg. a zone or lake). You will + need to determine which of these geometries users will be able to + use for each category. + + - All data collected with Mapeo Mobile will be points. If you are + using Mapeo Mobile, you should include point as a geometry for + every category. + - If you are using Mapeo Desktop Territory mode as part of your + project, you can also include line or area for categories where + relevant. + +- Color (optional) + You have the option of setting a custom color for the map dots or + markers for each category in Mapeo Mobile and Mapeo Desktop + Observations mode. + +- Sort order (optional) + You have the option of determining the order in which you would like + categories to appear on the Mapeo Mobile Categories screen (pictured + above). If no order is added, categories will appear alphabetically + by name. + +When defining categories, keep in mind the following: + +- Categories are one of the key ways data can be filtered in Mapeo. + Thinking through how you will view and use data once it has been + created offers useful perspective when defining categories. +- As a general rule, categories should not overlap - users should see + only one option that fits when making a selection. +- Categories and what would fall within them should be clear to those + who will be collecting data. Training and information sessions may + be critical for ensuring that project participants know how to + gather data in consistent ways, but clarity and simplicity in + configuration authoring goes a long way. +- The space available to display category names is limited, especially + in Mapeo Mobile, so names should be generally be brief. + +Generating category files + +All information you define for categories will be formatted in JSON in +the coding-configuration process, detailed in the following section. + +{% hint style=“info” %} If you are not comfortable working with JSON, +this information can be be passed off to someone with technical skills +to complete the steps in coding-configuration. {% endhint %} # ⚙ +Customization options + +Mapeo was built to be highly customizable and allow users to adapt its +interface to meet the needs of specific projects. This section covers +both translation of the application and the development of custom +configurations and base maps in the pages below: + +- translating.md (novice, intermediate) +- custom-configurations(advanced) +- custom-base-maps (advanced) + +{% hint style=“warning” %} Please note that the customization process +for configurations and base maps currently requires significant +technical knowledge and will not be accessible to all users. {% endhint +%} + +Custom background maps + +About custom background maps + +Custom background maps allow Mapeo users to incorporate a wide range of +geographical datasets and relevant elements into the maps used for +displaying current position and data collected. Once added to Mapeo, +custom background maps are available completely offline within the +application. + +Creating custom background maps + +{% hint style=“warning” %} Creating custom background maps currently +requires significant technical knowledge and will not be accessible to +all users. + +The current process, detailed in creating-custom-maps, requires comfort +installing and using node packages via the command line. {% endhint %} # +Creating custom background maps + +We are currently working on a new user interface to simplify the process +of generating and adding custom background maps to Mapeo. This page +covers the generation of custom map files for both for the current +(non-experimental) map server AND for the new experimental Background +maps feature in Mapeo Mobile. + +Current (non-experimental) workflow + +For creating custom background maps that work with the current +(non-experimental) map server, you can view documentation of the +existing process here. + +- For instructions on how to add these maps to Mapeo, see: + adding-custom-base-maps-to-mapeo-mobile.md + adding-custom-base-maps-to-mapeo-desktop.md + +New experimental Background Maps feature + +For generating map files in .mbtiles format to test out the new +experimental Mapeo Mobile Background Maps feature, see here. + +- For instructions on how to add these maps to Mapeo, see: + background-maps.md + +Generating map files in .mbtiles format for the experimental Background Maps feature + +{% hint style=“warning” %} Generating custom background maps currently +requires significant technical knowledge and will not be accessible to +all users. {% endhint %} + +Generating custom background maps in mbtiles format for the new Background Maps feature + +{% hint style=“info” %} For creating custom background maps that work +with the current (non-experimental) map server, you can view +documentation of the existing process here. {% endhint %} + +Mapeo Mobile 5.5.0 introduces a new Map Manager user interface for +importing and managing multiple background maps. The Background Maps +feature is currently experimental and needs to be activated in +Experiments; once that has been done, Mapeo Mobile will start to use the +new user interface. To find out more about the new feature, see +background-maps.md. + +The Background Maps feature comes with a new map server that uses a tile +format called mbtiles. This is a different format than what Mapeo was +using before, so if you’ve added your own custom map tiles (either in +.asar or in a directory format), they will not work with the new map +server. You will need to convert these to mbtiles, or make new tiles in +the mbtiles format. This applies to both raster and vector map tiles. + +{% hint style=“info” %} Note: the Background Maps map server is able to +load both raster and vector tiles; however, the experimental version can +only import an unstyled vector mbtiles file. This means that the +geometries in your mbtiles map tiles can be shown as a background map, +but instead of being styled by means a style.json file, the Map Manager +will use randomized colors to visualize the different geometries. + +In future releases of Mapeo, we will make it possible to add a vector +map style as well. {% endhint %} + +Generating new mbtiles using QGIS + +One easy and free way to have access to use mbtiles with the new +Background Maps feature, which does not require using any command line +tools or scripts, is to generate them using QGIS. + +QGIS is a free and open-source cross-platform desktop geographic +information system application that supports viewing, editing, printing, +and analysis of geospatial data. It is often used in tandem with Mapeo; +for example, once a lot of data has already been collected, and the next +step is to visualize that data or create cartographic maps. + +{% hint style=“info” %} QGIS has extensive documentation for use of the +tool, accessible at https://docs.qgis.org/. {% endhint %} + +QGIS can also be used to generate both raster and vector mbtiles using +an easy user interface. + +First, ensure that you have some map data loaded on your QGIS map +canvas. This can be either vector data (such as Esri shapefiles) or +raster data, such as satellite imagery or XYZ tiles loaded through a +source on the internet. + +In what follows, we will be creating raster mbtiles using XYZ tiles +(raster) from Bing maps, loaded through the internet. At the end of this +section, some information on generating vector mbtiles is provided. + +{% hint style=“info” %} This page has guidance on how to add a number of +different XYZ tile sources to QGIS, including Bing maps, OpenStreetMaps, +Google Terrain, and more. {% endhint %} + +Next, open the Processing menu and select Toolbox. Search for mbtiles in +the search box of the sidebar that opens up. + +In what follows, we are going to generate Raster mbtiles. However, the +process is the same if you have Vector data to generate as mbtiles. + +Double click on Generate XYZ Tiles and enter the following values in the +modal box that opens up. Leave all of the other values (such as DPI, +metatile size) be, there is no need to change these. + +- Extent: This is the extent at which your map tiles will be + downloaded. At lower zoom levels, it will actually exceed this + extent as it will download very large areas as one tile, which + intersect with that extent; but as you get to higher zoom levels, + only map tiles within that extent will be downloaded. + This field takes four coordinates, and the easiest way to set them + is to either use the current map canvas extent, or to drawn them + directory on the map. You could also use a vector geometry to set + the coordinates. +- Minimum zoom: Best practice is to set this to 0, which is the whole + world. Lower zoom levels do not take up much space at all, and it’s + a good user experience to be able to see more of the world at lower + levels. +- Maximum zoom: As with all background map tiles, this is an important + thing to get right, and there are trade-offs between level of detail + (zoom level) and file size. Each zoom level increases your mbtiles + file size by 4. It is recommended to do some calculations on how big + your file will be in advance, for example using Mapbox’s offline + tile estimator tool. + - It can also be handy to consider OpenStreetMap’s guide on Zoom + Levels for considering an optimal zoom level for your map data. + Depending on the m / pixel of your data, you may not need to go + very high. For example, PlanetScope data from Planet is only 3m + in resolution, and so using either zoom level 13 or 14 is + sufficient to capture the full detail of the imagery. This will + also depend on your use case, and what kind of detail is helpful + for your mapping scenario. +- Tile format: It is recommended to change this to JPG because JPG + files take up less space. +- Output: Here, you want to define the path and name of your mbtiles + file. + +When you are finished inputting the values, you can click Run at the +bottom, and the tile generation script should commence. Depending on +your extent and maximum zoom level, it may take quite a while, but you +should see at least the first zoom levels (0 to 8 or so) be generated +rather quickly in the Log tab which opens up automatically when you +clicked Run. + +When the process is finished, you should see messaging that the +“Algorithm ‘Generate XYZ tiles (MBTiles)’ finished,” and you should find +your mbtiles file in the directory that you specified. + +{% hint style=“success” %} For generating vector mbtiles, the process is +even more straightforward. The only thing you need to set in the Write +Vector Tiles (MBTiles) are minimum zoom level and maximum zoom level; +and, you need to select the vector input layers on your map canvas that +you want to generate tiles from. For vector tiles, extent is optional. +The other thing worth adding is Metadata: name. Your background map will +inherit this name when added to Mapeo, so it will be good to provide a +specific name to distinguish it from other background maps. {% endhint +%} + +Converting your existing Mapeo tiles into mbtiles format + +{% hint style=“warning” %} This workflow involves running command-line +tools such as Python and Node. +While it’s possible to follow this workflow without familiarity of these +tools, you should at least be familiar with the basics of working in a +Unix terminal. You may also encounter difficulties that require +additional troubleshooting. +Some technical experience is therefore recommended. {% endhint %} + +If you have existing map tiles in asar or directory (xyz) format, there +is a command-line tool called mbutil you can use to convert those to +mbtiles. The workflow for using this tool is as follows. + +Dependencies: + +- Make sure you have Python installed (ideally 3, but 2 works too). +- You need to have npm installed if your vector tiles are in a + .vector.pbf format. + +Steps to follow: + +1. First, ensure that your tiles are in xyz format. If they are still + compressed as an asar file, first unpack the file through the + command: + asar extract [filename].asar [directory name] +2. Navigate to the root of the tile directory in the terminal: + cd path/to/directory +3. Identify what format your tiles are in by opening up one of the zoom + level directories (e.g. 0, 1, 2…) and then going one directory + deeper, until you see files ending in pbf. + - If your files end in .pbf, you may proceed to step 4. + - If your files end in .vector.pbf, first follow to the next + section + #extra-step-for-vector-tiles-if-they-are-in-.vector.pbf-format + on renaming .vector.pbf to .pbf, before proceeding to step 4. +4. Create a virtual Python environment. NAME_OF_ENV can be an arbitrary + name. + python3 -m venv NAME_OF_ENV +5. Activate the virtual environment. You need to run this whenever + working in this project. This ensures dependencies and other + project-specific tooling are properly referenced. + source ./NAME_OF_ENV/bin/activate +6. Install dependencies, which will include the mbutil tool: + python3 -m pip install -r requirements.txt +7. Use the installed mb-util executable to create the mbtiles file: + ./env/bin/mb-util DIRECTORY OUTPUT.mbtiles + - DIRECTORY points to the path containing the tiles directory you + wish to convert. It’s relative to where the command is run. + - OUTPUT can be any name that you want your mbtiles file to be + called. + - See mbutil documentation for additional relevant flags related + to tile scheme, image format, etc. +8. When you’re done, you can deactivate the virtual environment by + running: + deactivate + +Extra step for vector tiles if they are in .vector.pbf format + +If your vector tiles end in .vector.pbf, you need to first run a script +to change the suffix to just .pbf instead. In the future, we will make +it easier to handle this when importing tiles, so you won’t have to do +anything. However, for now you have to use a node tool called +recursive-rename. + +1. In the terminal, navigate to the directory containing your XYZ tile + directory, and install the tool npm install recursive-rename. +2. Run the following command: rename vector.pbf pbf. This will batch + rename all of the individual tile files in each of the + subdirectories per zoom level (0, 1, 2, …). +3. Now you are ready to use mbutil to convert the XYZ directory to + mbtiles. + +{% hint style=“info” %} For instructions on how to import your .mbtiles +file into Mapeo for use in the experimental Background Maps feature, +see: + +Broken link {% endhint %} + +Welcome – Introduction + +Welcome land defenders, community mappers, resource and impact monitors, +data collectors, students, scientists - whoever you are, we hope you +have enjoyed playing around with Mapeo using the Quickstart guide above. + +If you think that Mapeo might be the right tool for your project, this +Complete Reference Guide is designed to provide you with learning and +training materials, suggested workflows, and some examples of real +projects in order to help get you set up and using Mapeo in the best +possible way for your needs. + +There is a LOT of information in the sections below, and there are many +different ways of using Mapeo. We don’t expect users to make use of +every Mapeo feature nor need to read every section, but we do hope that +what we are providing here can help users be well informed about +technical details that will impact your projects. # Installing Mapeo +Desktop + +Mapeo Desktop is available for Windows, MacOS and Linux and can be +downloaded for free from the Mapeo website. + +{% hint style=“info” %} If you are planning to install the application +on a computer that does not have an internet connection, make sure to +download the installation file prior to going offline. +For more details on offline installation, see #installing-offline below. +{% endhint %} + +Download the installation file + +If you have an internet connection, you can download the Mapeo Desktop +installation file for free from http://mapeo.app. + +{% hint style=“info” %} It is important to select and use the correct +installation file for your operating system: + +- Windows:.exe +- macOS: .dmg or .zip +- Linux:.AppImage {% endhint %} + +Go to the mapeo.app website and click on Download. A download of the +installation file for your operating system should start automatically. +If the download does not start automatically, or if you’d like to +download installation files to use on another operating system, you can +find download options at the bottom of the page. + +[] + +Once you have the installation file downloaded, follow the detailed +steps in the sections below to install Mapeo Desktop on the appropriate +operating system for your computer: + +- **** Install on Windows +- **** Install on macOS +- **** Install on Linux + +Install on Windows + +1. If you don’t yet have the installation file for Windows, download + it. +2. Find the Mapeo installation file (.exe) on your computer and double + click on it to install. If you get a security message from your + operating system, click on Execute anyway.\ + +[] + +Mapeo Desktop will open automatically when the installation process +finishes. If not, go to your computer’s desktop or Apps and click the +Mapeo Desktop icon to open the application. + +Install on macOS ​ + +1. If you don’t yet have the installation file for macOS, download it. +2. Find the Mapeo installation file (.dmg) on your computer and double + click on it to open. +3. Drag the Mapeo icon into your Applications folder. +4. Once the install is complete, find Mapeo in your Applications folder + and double click it to open. + +{% hint style=“warning” %} If you receive a security message that Mapeo +cannot be opened, go to System Preferences, then select Security & +Privacy. + +On the bottom half of the window, you should see the message “Mapeo was +blocked from use because it is not from an identified developer.” Click +on Open anyway, then on Open in the pop-up confirmation window. Mapeo +Desktop will then open automatically. +{% endhint %} + +Install on Linux + +Download installation file + +If you don’t have the installation file for Linux, download it. + +Enable executable permissions + +In order to install from the .AppImage file, you’ll need to ensure that +the file has permissions to run as a program. Find where the +installation file was saved on your computer and right-click the file. +Select Properties from the menu. + +Click on the Permissions tab at the top of the Properties window, then +click the checkbox to Allow this file to run as a program. + +Install + +Double click the .AppImage file and Mapeo Desktop should open +automatically. + +Installing offline + +If you previously downloaded or have access to an installation file, you +can use it install Mapeo Desktop on other computers without an internet +connection. + +{% hint style=“info” %} You can copy the installation file to another +computer using a USB drive or send it via Bluetooth. This does not +require an internet connection. For more on these methods, see +sharing-files-between-devices.md. {% endhint %} + +Now that you have pasted the installation file onto another computer, +follow these steps to install Mapeo: + +- Install on Windows +- **** Install on macOS +- **** Install on Linux # 💻 Mapeo Desktop installation & setup + +This section will cover all the necessary steps to install and set up +Mapeo Desktop on your computer: + +- installing-mapeo-desktop.md +- app-settings.md +- importing-configurations.md +- adding-custom-base-maps-to-mapeo-desktop.md +- updating-mapeo-desktop.md + +Before you start, make sure that: + +- Your computer battery is fully charged or you have access to a + charger and electrical outlet. +- Your computer is virus-free. # Updating Mapeo Desktop + +Like most existing apps, Mapeo Desktop is in continuous development. We +frequently release new versions of the application to fix technical +issues or add new functionality. + +When you update Mapeo Desktop, you do not lose data you have collected +or synchronized using a previous version. + +To update Mapeo Desktop, follow the same steps of the installation +process using a newer installation file. Before starting, ensure that +the Mapeo Desktop application is not open. Then, follow the steps below +for: + +{% content-ref url=“installing-mapeo-desktop.md” %} +installing-mapeo-desktop.md {% endcontent-ref %} + +{% hint style=“info” %} To update files used within Mapeo Desktop, such +as configurations or background maps, follow the same steps detailed in +the sections below using the new files: +importing-configurations.mdadding-custom-base-maps-to-mapeo-desktop.md +{% endhint %} + +Mapeo versions - information and naming conventions + +For details on Mapeo version numbers and naming conventions, +see:#mapeo-versions-information-and-naming-conventions + +Installation files for older versions of Mapeo Desktop + +To view all previous versions of Mapeo Desktop, including release notes +for changes made in each version, see the Mapeo Desktop Releases page on +GitHub. # Adding custom background maps to Mapeo Desktop + +By default, Mapeo Desktop in Observations mode uses abackground map that +shows some geographical elements such as rivers and hills, as well as +some political and urban elements such as borders, cities, roads, etc. +Mapeo Desktop in Territory mode offers a range of background maps +including satellite imagery, OpenStreetMap, and more. + +If you have a custom background map, you can add it and use it in Mapeo +Desktop without affecting the data collected. (For more on creating +custom background maps, see custom-base-maps.) + +{% hint style=“danger” %} Adding a background map to Mapeo Desktop +requires some technical skills and should be done by someone comfortable +copying and pasting files within the internal file system. A mistake in +this process could cause irreversible undesired effects. {% endhint %} + +To add a background map to Mapeo Desktop, follow the instructions below +for your operating system: + +- Windows computer +- macOS computer + +Windows computer + +Locate and copy the contents of the Mapeo background map package + +Mapeo background maps will often be shared as a compressed file(.zip). +If your background map is a .zip file, double click the file to unzip +it. + +Standard vector background maps for Mapeo will contain the file elements +listed below: 3 folders and 2 files. + +{% hint style=“info” %} Raster background maps will contain different +files and folders than those pictured above. Raster maps for Mapeo +consist of one folder (tiles) and one file (style.json). {% endhint %} + +Select and copy all of the elements found inside your background map +folder. + +Paste the copied elements into the Mapeo/styles/default folder + +1. In the Windows search engine, type %APPDATA% , and open the folder + that appears with this name. +2. Inside the AppData folder, click on the Mapeo subfolder, then click + on the styles subfolder. +3. If there is not already a default folder inside your styles folder, + you will need to create one. To do so, right-click inside the styles + folder and create a new folder named default. +4. Paste the background map elements you copied into the default + folder. + +Reload Mapeo Desktop + +Use Ctrl + R on your keyboard to reload Mapeo or restart Mapeo Desktop +to begin using the custom background map. + +{% hint style=“info” %} For more on loading custom background maps into +Territory mode in Mapeo Desktop, see changing-basemaps.md in the +using-mapeo-desktop-to-create-territory-information section. {% endhint +%} + +macOS computer + +Locate and copy the contents of the Mapeo background map package + +Mapeo background maps will often be shared as a compressed file(.zip). +If your background map is a .zip file, double click the file to unzip +it. + +A Mapeo background map consists of several folders and files that need +to be copied into the file system of Mapeo Desktop. Standard vector +background maps for Mapeo will contain the file elements listed below - +3 folders and 2 files. + +{% hint style=“info” %} Raster background maps will contain different +files and folders than those pictured above. Raster maps for Mapeo +consist of one folder (tiles) and one file (style.json). {% endhint %} + +Select and copy all of the elements found inside your background map +folder. + +Navigate to the Mapeo/styles folder + +1. Click on Finder on your computer. +2. In the top menu bar, click on Go, then select Go to Folder… +3. Type in ~/Library/Application Support/Mapeo/styles in the address + bar and click on Go. + +Paste the copied elements into the Mapeo/styles/default folder + +If there is not already a default folder inside your styles folder, you +will need to create one. To do so, control-click inside the styles +folder and create a new folder named default. + +Paste the background map elements you copied into the default folder. + +Restart Mapeo Desktop + +Use Command (⌘)-R on your keyboard to reload Mapeo or restart Mapeo +Desktop to begin using the custom background map. + +{% hint style=“info” %} For more on loading custom background maps into +Territory mode in Mapeo Desktop, see changing-basemaps.md in the +using-mapeo-desktop-to-create-territory-information section. {% endhint +%} # Choosing Mapeo Desktop language + +Mapeo Desktop is currently available in Spanish (es), English (en), +Portuguese (pt) and French (fr), Thai (th), Vietnamese (vi) and Khmer +(km), but it can be translated into any language using Crowdin. For more +on translation, see: translating.md. + +Changing the language of Mapping Desktop is a simple step and does not +affect the data collected or the categories used to create observations. +Mapeo Desktop should open initially in the current language you have +selected for your computer’s operating system. +To change the Mapeo Desktop language: + +1. Open Mapeo Desktop. +2. On the Top menu bar, click on View and select Change language. +3. Select the desired language and click on SUBMIT. You may see a white + screen for a few seconds as the interface language changes. + +[] + +{% hint style=“warning” %} If the language does not change +automatically, restart Mapeo Desktop. {% endhint %} # Importing +configurations to Mapeo Desktop + +To start using a custom configuration, you’ll need to import the new +configuration file into Mapeo Desktop. For more on configurations, see +custom-configurations. + +Locate the configuration file + +Download or copy the custom configuration file (eg. +example_project.mapeosettings) onto your computer. Note which folder the +file was saved in. + +{% hint style=“info” %} For sending configuration files (.mapeosettings) +between computers that have an internet connection, we recommend using +email or the Telegram Desktop app, as other messaging applications have +problems with this file format. You can also share a link to a Drive +directory where the configuration is located. + +If you have no internet connection, you can copy the file from a +computer using a USB drive or send the file via Bluetooth. For more on +these methods, see: sharing-files-between-devices.md. {% endhint %} + +Import the configuration + +1. Open Mapeo Desktop. +2. On the Top menu bar, click File and select Import Configuration. +3. In the pop-up window, navigate to the folder on the computer where + you saved the configuration file (.mapeosettings) you want to + import. Click on the file, then click Open. You may see a white + screen for a few seconds while the configuration changes. + +[] # 🗒 Essentials for a successful Mapeo project + +In the pages below you’ll find a collection of resources to support in +getting a Mapeo project started. + +- planning +- security-and-risk-assessment.md (Coming soon) +- creating-user-protocols.md (Coming soon) + +Additional information on running trainings in Mapeo can be found in +training-and-information-sessions. # Creating user protocols + +{% hint style=“info” %} Coming soon {% endhint %} # Security & risk +assessment + +{% hint style=“info” %} Coming soon {% endhint %} + +What are the parameters? + +No two Mapeo projects will look the same even if they have the same aims +and are using the same configuration. There are so many factors which +will influence how a project is run including timeline; budget; +technology; landscape; seasons; climate; culture; social and political +context; etc. + +Whilst we can provide some ideas here, any project should be tailored to +your particular context taking into account answers to the following +questions. Thinking through these questions in advance will also be +useful if you ask for help to put together a mapping project from an +ally or other organisation. + +What is your timeline? + +Is there a particular urgency for the work, a date you need to produce a +map or collect data by? If there isn’t an internal deadline, are there +significant dates external to the project that you might want to work +towards or include within your calendar (eg. visits by authorities to +the area, International meetings such as COP or UN Working Groups, World +Social Forums etc.). + +What does the geographical landscape look like? What accessibility issues are there? + +Think about what the land looks like and how you plan to travel around. +Some projects might be focused on a small area in town, where people can +just travel around on foot on paved roads, other projects might cover +tens of thousands of hectares and require travel by river, up steep +hills, into swamps etc. Perhaps there are areas you want to access that +are off limits (eg. National borders or Industrial installations can +have no-go zones around them, or have rules about using GPS or drones +etc) Drawing a quick sketchmap of the the area you plan to work within, +and marking any significant landmarks, access routes, barriers etc. can +help you plan out how you or your team is going to get around and how +long this will take, and help identify any challenges you might +encounter ahead of time. + +Do the seasons affect your work? + +If you plan to collect data at a particular time of year consider how +the season or climate might affect this. For example the dry / rainy +seasons might impact how easily you can move around the land, and might +also impact the type of data you can collect (for example travel by +river might be easier in the rainy season, but travel by road or foot +might be harder); likewise some operations or activities you want to map +or monitor might only occur at certain times of year (eg. illegal +logging is linked to seasons, as are fruiting trees and fish/animal +movements). + +Do you have a budget? + +Do you have or need a budget, and if so how much? Do you intend to pay +people to take part or is it volunteer-led? If you don’t already have a +budget are there parts of the work that are going to need funds such as +for purchasing equipment, travelling around or for any meetings you +intend to hold. + +Do you have or need equipment for your project? + +Mapeo Mobile works on Android phones & tablets and Mapeo Desktop on +Windows/Mac/Linux operating systems. Whilst essentially you might just +need one smart phone for your project (which you might already have in +your back pocket!), depending upon your plan, and particularly if you +are going to work with teams in complicated environments you might need +to think about other equipment such as spare battery packs if you are +doing multi-day trips in remote areas; usb or hard drives for backups; +trekking and medical kits for teams; waterproofing for tech that might +be exposed to the elements etc., large sheets of paper, marker pens and +notebooks for community workshops. + +See equipment list for a list of things partners we have worked with +have found useful. + +What is the security situation? + +Unfortunately, many frontline defenders are targeted for their work, +often risking their lives to defend their peoples rights, lands and +futures. Please consider your own safety and that of anyone else +involved in the project and take what measures you can to identify risks +ahead of time and mitigate them where possible, whilst doing the work +that you need to do. + +For example: + +- Do you need to keep team members, or the names of people interviewed + or otherwise involved in the project, or would it be better to + involve the media and ensure there is a spotlight on the work? +- Are there places you can avoid going to and questions can avoid + asking so as to not trigger dangerous responses? +- Do your teams need some kind of backup to keep them safe, a + satellite phone, tracker or civil society accompaniment? + +Data security + +Sometimes it is not people that are at risk but data - consider +therefore if you are collecting data that could be valuable to others +and how you can best keep it safe. + +Information can be sensitive in other ways too: perhaps only certain +members of a community normally have access to it (but still want it +documented) or perhaps it is information that the community does not +want to make public. + +Mapeo does not make any of your data public unless you choose to share +it, you can create reports or export data which is filtered to exclude +sensitive places or pieces of information, and you can share information +with team members without it going online. + +However there are other measures you can take to protect your +information if needed, creating passwords for your devices … what else? +# What outputs do you want? + +It might be too early to start thinking about outputs, but if you +already have a sense of what these might be then they might give some +useful direction to your planning process. By output we don’t mean the +goal or results of your project, although these might overlap, we are +referring particularly to concrete materials that result from your Mapeo +project. + +For example these could be: + +- Printed map / maps: These might be for an external audience such as + the government or a legal body, or they might be for the community + itself to use for other purposes. If you are planning on creating a + map then consider what information you can show on the map - perhaps + you spend a long time collecting stores which then are hard to find + space for, or you collect so much information that the map is hard + to read. +- Data reports: You might want to produce regular reports on the data + you collect, or wait until the end of your project and then produce + a report with all the data or the highlights. Do your reports + include quantitative data that you want to analyse and present in a + particular way or is it mainly qualitative data that will need + editing or compiling before presentation. Thinking about these can + help you to organise your teams and data collection so that you have + the data when you need it, in the right format. +- Alerts: If you are collecting evidence of something that needs fast + action then having an alert system built into your methodology could + help. Mapeo Mobile can export datapoints to WhatsApp and other apps + so you could potentially send alerts of illegalities straight to law + enforcers for immediate action. +- Interactive webmap: This could be a good output if you are hoping to + build a campaign and want to share some of the project with the + public or media - or even for your own community such as for an + educational or storytelling resource. It also enables different + kinds of information to be present than on a printed map as you can + include videos and audio more easily. However it may involve a level + of technical expertise or budget beyond the scope of your project, + and it is definitely not the right output for every goal. + +------------------------------------------------------------------------ + +Planning + +You may be keen to jump in and get started with data collection, however +spending a bit of time upfront thinking through how the project will +run, the methodology, team set-up, logistics of gathering data, and how +the data collected or created with Mapeo will be used can save you a lot +of time and avoid problems and issues later on. + +This guide does not aim to give you a blueprint of how to run your +project. There are so many different uses of Mapeo, some of these we +(Digital Democracy) can imagine, some of them we can’t, and each one has +its own particular needs, priorities and local contexts. What works in +one place might need to be set up very differently for another place, +even if the desired outcome is very similar. And likewise what works +somewhere at one time, might have to be adjusted for another time as +local situations, politics, etc. change. + +Hopefully spending time thinking through the questions below will enable +you to create a process tailored to your needs and project, and give it +the best possible chance of success. + +We are going to run through the following questions: + +- Why collect information? What is the aim of your mapping, monitoring + or data collection, what is your goal or desired end product or + result? +- What outputs do you want? If you already know that you want to build + an interactive story map, or produce a quantitative report or file a + legal case, this can help shape your project design. +- What information do you need to collect in order to meet this aim? +- Who should be involved? What project structure will best meet your + aims, who should be involved, what roles do you need, who is making + decisions and who are you accountable to? +- What are the parameters or limiting factors you are working with? + This refers to your geographical context, infrastructure, + accessibility to areas, budgets and equipment availability, time + constraints, security risks, etc. +- Is Mapeo the right tool for you?We think Mapeo is great :) but we + know that it has limits and it isn’t the right tool for every job. + We want to make sure that if you choose Mapeo you understand what it + excels at doing and also its weaknesses, to make sure you are set up + in the best possible way for success in your project. + +Provisos + +Mapeo was co-developed with community land defenders in the Amazon. We +have tested, piloted and received feedback on it from people around the +world using it for a variety of purposes, and we hope it can serve a +wide range of needs. However it is built with the needs of land and +rights defenders at its heart, and therefore this guide, and many of the +materials produced for Mapeo are also built with these needs at the +forefront. + +In part because of its design process, and the partners with whom +Digital Democracy has worked, we often refer to community and +collaborative processes. Mapeo can definitely also be used by +individuals, and a variety of different teams, but many of our partners +are using it in local, frontline community contexts, and so the language +of this guide centers them. We also understand that communities are not +homogenous and mean different things in different places, and hope that +you can read between the lines where necessary to extract the useful +parts of this guide for whatever it means to you. + +This guide draws on work from our team over the last two decades in +indigenous and community land rights and defense. However indigenous and +marginalized communities have been defending their land for centuries. +There are many projects and initiatives from which the development of +Mapeo and the methodologies suggested here have been guided, received +inspiration and learned. This reference guide does not aim to provide an +exhaustive list of such projects, but at the end of the guide there is a +Reference Section which highlights some materials from other sources and +initiatives which may be of help to you in planning your project. + +All the examples included in the guide are just that, examples. We hope they are helpful and provide some context and illustration to the processes described, but are not intended to be taken and copied as ‘out of the box’ methodologies. As we hope this planning section will describe, context is everything, and methodology should be carefully considered and adapted to best fit the needs of the project and particular community context. + +description: >- What team structure will best meet your aims; who should +be involved, what roles do you need; who is making decisions and who are +you accountable to? — + +Who should be involved and how? + +The answer to this question of who should be involved could vary wildly. +Perhaps it is just you and your mobile phone, or perhaps it is going to +involve thousands of people across multiple countries working together +to compile a mass of data. Most of the partners we have worked with +directly are somewhere in between, often a community or group of +communities with a dedicated team of collaborating to collect data. + +However even the projects we have partnered on directly, which might +look superficially very similar, have set up their project structures in +very different ways, sometimes out of need and sometimes out of +preference. So here are some things to consider. + +Are there any traditional or other authorities that should be consulted +before you start, or who should be involved in some role? This is +particularly relevant if you are collecting data from indigenous lands +(your own or belonging to others) and/or might be collecting potentially +sensitive data. + +Who is your project accountable to and how can you ensure you meet their +needs? The answer to this might be the traditional authorities mentioned +above, or it could be particular sectors of your community, funders, the +future generations or others. Consider how to keep them up to date with +project progress if relevant and how to produce materials they will find +accessible and useful. + +Do different members of your community hold different knowledge that you +want to ensure is represented. How can you honour and involve these +people and their knowledge? Think here about women, elders and young +people in particular, and how to ensure they are involved in the work +and that they are not simply used to extract information from. Then +depending upon the details of your project other groups might arise: +traditional healers; skilled artisans; storytellers; health workers etc. + +Consider the ownership of the project: If the project is meeting needs +identified by your community, or collecting data intrinsic to them or +their future consider how to ensure the community feels involved in the +work and feels ownership over any results. Mapeo was built to try and +facilitate community ownership of both projects and data by having a +simple interface that could be explained to people without data +collection training and people who might be non-literate or unused to +computers or smartphones. Involving people at different stages of the +project, including the planning phase can help increase this feeling of +ownership, as can keeping the data locally, providing frequent feedback +and reports back on what is happening, and creating outputs that people +can use themselves or see at work. + +What other stakeholders or people with interest or authority do you want +to involve? Perhaps there are people who it would be useful to involve +because they could help the project reach its goal such as local +authorities, law enforcement, press, park rangers. Think about what role +they might have in the project, whether they are consulted about things +in advance or are simply informed and kept up to date with project +progress. Consider too if there are people you want to keep the work and +data secret from due to security or other considerations. + +Who is going to collect your data? Unless yours is a solo project you +are going to need to work with a team or teams of people to collect your +data. This will be particularly necessary if you need to cover a large +area of land, have time constraints or need different skills on your +team. Think about the composition of the team and how you are going to +build it - is it something people will volunteer for or will they be +asked? Do you need to ensure diverse representation and if so how will +you do this? Do you want to involve as many people as possible or have a +small team that moves around? + +What other roles do you need? If you are working with a team or teams of +data collectors or mappers you are likely to need someone to coordinate +them, help plan trips, collate the data they collect, analyse it and +prepare any reports or outputs. This might be the role of a single +coordinator, or you might need multiple ones due to the number of people +involved or because of cultural or political sensitivities or the way +the project ownership is set up. You might also have people involved in +training, decision making, liaising with external bodies, helping with +legal and communications work etc. + +What skills do people need? We hope Mapeo is to learn and use, but if +you are working in a team and want to collect comparable data people +will need some training in how to use the app, and how to use it in the +way your project needs. There might be other trainings necessary such as +training in basic smartphone usage if people aren’t accustomed to it; +training in taking good photographs that illustrate what you want to +show; training in gps; drones; video; audio recording; oral history +recording; GIS software etc. conflict resolution, de-escalation etc +depending on the details of your project. + +Create a project protocol: Writing a protocol, if possible in a +collaborative manner, which lays out any different roles within the +project, their relationship to the data, agreements about use and +ownership of data, any payments that are being made, what will happen to +equipment and data at the end of a project etc. can be a way to keep +things transparent and accountable and help avoid issues during and +after the work. + +Why - what is the project goal? + +So you want to start collecting information, perhaps you are going to be +making a map, or perhaps you want to collect evidence of impacts on your +land or gather other data or information. The first question to clearly +ask of yourself or your community is WHY? What is it that you hope to +gain or change or learn through the project? + +The more detailed an answer you can give to this question the better set +up you can get; making sure anyone involved in the project is working +towards the same goal and being able to determine the best methodology +for meeting it. + +For example, if you want to make a map – what is your map for, what +impact do you want it to have for you, your team, in the world, etc. +Perhaps the map is the end product, or perhaps just one step in a longer +process, or maybe the main aim is building relationships, and the map is +the means to bring people a focus for working together. + +What if you don’t know yet? Perhaps you know you want to gather data +about something that interests you but are not yet sure how you are +going to use it. Don’t worry, you can refine your aim and build on your +project as you go along and learn more. + +And remember - all plans change and it is impossible to predict +everything in advance. There will be unforeseen outcomes, some +beneficial, some possibly challenging, of your project. However having +your main goal in mind as you begin to plan your methodology and define +what information you are going to collect sets you up to meet any +challenges, and welcome any positive changes, in the best way. # What +information to collect? + +When you have clarified the main goal for the project, the next step is +to think through carefully what data you want to collect or create. This +will not just be dependent upon the final goal, but also on other +factors such as the time and funding available, the security situation, +and any legal guidelines. So it may be a good idea to read this section +again after reading the “What are your parameters” section. + +Depending on your needs and capacity you may find that the default +configuration and categories that come with Mapeo do the job well +enough, or you might want to set up a custom configuration with your own +icons and questions tailored to your specific needs. For more on how to +do this, see creating-custom-configurations. Perhaps, if your project is +new and you are still figuring out what is needed, you may want to start +collecting data using the default configurations, and learn from that +process about what categories and questions you really need. + +The simple answer to the question of what information to collect is +probably quite obvious from your goal, but when you dig down the answer +isn’t always that easy. So if you need a territory map for a land claim +then you probably need to collect information about territory use, as +well as the territory boundaries or limits - but exactly what +information do you need, what format should it be in, how much detail do +you need, etc. And if you want to collect evidence of illegal gold +mining, then you may want to collect georeferenced photos and answer a +series of questions about the scale and nature of any impacts found, but +what is the best way of framing questions to get you the answers your +community and perhaps legal team need to evaluate what is going on and +how to take action, and what should you be taking photos of exactly? + +Collecting data can be a time-consuming and expensive process, and can +raise expectations about outcomes. So thinking this through carefully in +advance will help ensure you are a) not wasting your own or others time +and resources collecting information that isn’t going to be useful and +b) not in the situation where you realize at the end of a month-long +trip that you need to go back to all the places again because you forgot +to collect a crucial bit of data. + +Think about the following questions to further clarify exactly what data +you should be gathering and how to set up any custom configurations: + +- First think about your goal and what you know of your needs. + Brainstorm with any other team members or with the community about + all the possible things you could collect information about, + categories and questions, and then start organizing and refining. +- If possible do some research by talking to allies, or looking online + to see how other similar projects were set up and what data they + collected. +- Are there any rules, restrictions or guidelines that might determine + the kind of information you collect and how to ensure it is usable. + For example some governments/authorities might require data to be + collected in a particular GPS format, or follow a particular + information template, in order to be accepted or easily acted upon. +- Might the data need to be used in a legal process, if so there may + be specific ways of collecting it, or additional questions you ask, + which will enable it to be used more effectively. If possible get + local legal advice about this, as it will differ depending on the + type of data and the country you are in. +- Knowing how much information is too much. Once you start making a + map or collecting information it quite fun… maybe a little too fun + 🙂. If you have all the time in the world then this may not be a + problem, but if people or lands are being threatened you may need to + make compromises in terms limiting the data you collect to that + which is urgently needed. # Data types within Mapeo + +In terms of data types, Mapeo Mobile can collect: + +- GPS points: so you can georeference particular points and places, + and gather data associated with them. When saving a GPS point in + Mapeo Mobile you need to categorize it with an icon. +- Photographs: photographs get tagged with the GPS point of their + particular location - is this right? - as well as being attached to + the place they are associated with. +- Details fields: if you set up a custom configuration you can add any + number of questions into Mapeo so that you could carry out household + surveys, collect quantitative information or evidence, or likewise + write down detailed stories. Your questions can be text fields for + open descriptions; select one or select many. **** + +Mapeo Desktop can display and manage the above data types and +additionally you can create georeferenced points, lines and areas with a +basemap in the background. These data types can similarly have questions +or fields associated with them that you fill in, and which can then be +used for analysis. # 📱 Mapeo Mobile installation & setup + +In this section, you will find all the needed resources to learn how to +install and set up Mapeo Mobile: + +- installing-mapeo-mobile.md +- app-settings.md + - Language + - GPS coordinate format +- importing-configurations.md +- adding-custom-base-maps-to-mapeo-mobile.md +- updating-mapeo-mobile.md + +Before you start, make sure that: + +- The battery of the smartphone is charged and/or you have access to a + charger and an electrical outlet or portable battery. +- The smartphone is virus-free. + +{% hint style=“warning” %} Mapeo Mobile is currently available for +Android only and works on Android version 5.0 or above. {% endhint %} # +Updating Mapeo Mobile + +Like most existing apps, Mapeo Mobile is in continuous development. We +frequently release new versions of the application to fix technical +issues or add new functionality. When you update Mapeo Mobile, you do +not lose data you have collected or synchronized using a previous +version. + +The process to update Mapeo Mobile is very similar to the installation +process and there are 3 ways to do it: + +- Update from Play Store + If you have an internet connection, update to the latest version of + Mapeo Mobile from the Google Play Store. The steps are the same as + for installing Mapeo: #install-from-play-store + +- Update from an APK file + To update Mapeo Mobile on smartphones that have no internet + connection, follow the same steps as for installing the app using an + installation file (.apk), this time using a more recent installation + file: #install-from-apk-file + +- ****Update via P2P App Updates (*Experimental) + Mapeo Mobile currently includes an experimental feature that allows + you to update the version of the application offline via a + peer-to-peer connection over Wi-Fi. For more on how to update this + way, see#updating-mapeo-mobile-via-p2p-peer-to-peer-app-updates + +{% hint style=“info” %} To update files used within Mapeo Mobile, such +as configurations or background maps, follow the same steps detailed in +the sections below using the new files: +importing-configurations.mdadding-custom-base-maps-to-mapeo-mobile.md {% +endhint %} + +Other content related to Mapeo updates + +- #mapeo-versions-information-and-naming-conventions +- #installation-files-for-older-versions-of-mapeo-mobile + +Mapeo versions - information and naming conventions + +Mapeo uses a numerical system to name versions ( for example v.5.4.0). +The numbers are labeled as follows: v.MAJOR.MINOR.PATCH. + +- The MAJOR number indicates a breaking change - a change in this + number could be related to how the software work or a change in how + you use it. The MAJOR number increases if features that were + previously part of the app are now removed. +- The MINOR number increases when new features have been added to + Mapeo. +- The PACTH number increases if there are small updates or fixes that + don’t introduce any new behavior or features. + +If the MAJOR number increases, the MINOR and PATCH numbers are reset to +0. If the MINOR number increases, the PATH number is reset to 0. + +{% hint style=“info” %} To identify which version is more recent, +compare the version numbers (excluding the dots between digits). The +bigger the number is, the newer the version is. For example, Mapeo +v.5.4.0 is newer than Mapeo v.5.3.2, because 540 is a bigger number than +532. {% endhint %} + +Installation files for older versions of Mapeo Mobile + +To view all previous versions of Mapeo Mobile, including release notes +for changes made in each version, see the Mapeo Mobile Releases page on +GitHub. + +Updating Mapeo Mobile via P2P (peer-to-peer) App Updates + +Peer-to-peer (P2P) App Updates is an experimental feature that allows +you to share and receive newer versions of the Mapeo app by connecting +to other Mapeo devices via Wi-Fi (no internet connection required). + +When updating the Mapeo app version in this way, NONE of your Mapeo data +(observations, configurations, or maps) is shared between devices. + +For step-by-step instructions on using P2P App Updates, see: +p2p-peer-to-peer-app-updates.md # Adding custom background maps to Mapeo +Mobile + +By default, Mapeo Mobile uses abackground **** map that shows some +geographic elements such as rivers and mountains, as well as some +political and urban elements such as borders, cities, roads, etc. + +If you have a custom background map prepared, you can add it and use it +in Mapeo Mobile without affecting the data you have collected. (For more +on creating custom background maps, see custom-base-maps.) + +{% hint style=“info” %} November 2022 update: We have just added a new +experimental feature to manage multiple background maps, as part of a +greater effort to simplify the process of generating and adding custom +background maps to Mapeo. +For more on how to test this feature, see: background-maps.md. {% +endhint %} + +{% hint style=“warning” %} Adding a background map to Mapeo currently +requires navigating the File Manager on your smartphone and copy-pasting +elements in the internal file system. A mistake in this process could +cause irreversible undesired effects. {% endhint %} + +- ****************Using a computer, a USB cable, and your + smartphone**** + +Adding a background map using a computer + +Connect your smartphone to a computer + +Unlock the screen of the smartphone and connect the device to a computer +using a USB cable. Tap the Charging this device via USB notification. +Under “Use USB for,” select File Transfer. + +{% hint style=“info” %} On Mac computers, you will need to have Android +File Transfer installed to view and transfer files to your Android +phone. {% endhint %} + +{% hint style=“warning” %} For troubleshooting with transferring files +to your Android device from a computer, see the Android Help page here. +{% endhint %} + +On your computer, locate and copy the contents of the Mapeo background map package + +Mapeo background maps will often be shared as a compressed file(.zip). +If your background map is a .zip file, double-click the file to unzip +it. + +A Mapeo background map consists of several folders and files that need +to be copied into the file system of Mapeo Mobile. Standard vector +background maps for Mapeo will contain the file elements listed below - +3 folders and 2 files. + +{% hint style=“info” %} Raster background maps will contain different +files and folders than those pictured above. Raster tile background maps +for Mapeo consist of one folder (tiles) and one file (style.json). {% +endhint %} + +Select and copy all of the elements found inside your background map +folder. + +Paste the background map elements onto your smartphone + +Once you have copied the contents of the background map folder, use the +computer to browse through your smartphone to the correct folder within +the Mapeo Mobile file system. + +Click on Internal Shared Storage, then on Android, data, com.mapeo. Then +click on files, then on styles, and finally on default. Paste the +background map elements into the default folder. + +The complete path of the default folder where you will paste the map +elements is +Internal Shared Storage/Android/data/com.mapeo/files/styles/default + +Restart Mapeo Mobile + +Restart the Mapeo Mobile app. The new background map will appear on the +home Map screen. + +{% hint style=“info” %} Loading a new background map for the first time +in Mapeo Mobile can take several minutes. {% endhint %} # Security + +The following features introduce options for further layers of security +to protect Mapeo data: + +- app-passcode.md +- obscure-passcode.md # App Passcode + +App Passcode allows you # Obscure Passcode + +P2P (peer-to-peer) App Updates + +Peer-to-peer (P2P) App Updates is an experimental feature that allows +you to share and receive newer versions of the Mapeo app by connecting +to other Mapeo devices via Wi-Fi (no internet connection required). + +When updating the Mapeo app version in this way, NONE of your Mapeo data +(observations, configurations, or maps) is shared between devices. + +To search for and share Mapeo app updates between Mapeo Mobile devices, +both smartphones must: + +- have the P2P App Updates feature enabled +- have Mapeo open to the Synchronize screen +- be connected to the same Wi-Fi network + +Turn on the P2P App Updates feature + +To use this feature, you will need to enable it within the Experiments +menu. To do so, tap the Observations list button, then tap Settings, and +select Experiments. Select P2P App Updates, then check the box to Use +P2P App Updater. + +Check for available updates + +Once you have enabled the P2P App Updates feature, you will be able to +use it on the Synchronize screen. +To search for and share Mapeo app updates between Mapeo Mobile devices, +both smartphones must have the P2P App Updates feature enabled, have +Mapeo open to the Synchronize screen, and be connected to the same Wi-Fi +network. + +If a newer version of the app is available from another Mapeo device on +the network, the update will be automatically downloaded. + +(If your device has a newer version than other devices the network, you +will see the message “Sharing app updates with other devices.”) + +Install app update + +To install the newer version of Mapeo, wait until the download +completes, then tap INSTALL on the Synchronize screen. + +Allow installs from Mapeo + +After tapping INSTALL, you may see a security pop-up window saying that +your phone is not allowed to install apps from this source. + +To enable Mapeo to install updates, tap Settings in the pop-up window +and toggle the switch to Allow from this source in the following Android +Settings screen. + +Tap the Back button to return to Mapeo and confirm that you would like +to install the update. + +Reopen Mapeo + +When the installation is complete, Mapeo will close automatically. When +you re-open Mapeo, you will see an update confirmation window. Tap OK to +close the window and start using the new version of Mapeo. + +# Directional Arrow + +The new Directional Arrow feature uses your smartphone’s digital compass +to provide information about which direction your phone is facing. Close +proximity to large metal objects or strong magnetic field can affect the +precision of the compass. + +If your smartphone doesn’t have a compass, the Directional Arrow may +still be able to determine direction based on movement. Direction based +on movement may be less accurate. + +{% hint style=“info” %} NOTE: Directional Arrow is not reliable enough +to be used exclusively for navigation, and it may drain your device +battery faster. {% endhint %} + +Turn on Directional Arrow + +To activate the Directional Arrow feature: + +1. Click on Observations List, then click on Settings and select + Experiments. +2. Select Directional Arrow, then click the checkbox to Use Directional + Arrow. +3. Click on Back as many times as necessary to return to the home Map + screen to view the arrow. # Experiments: Turning on experimental + features + +Experiments + +The Experiments screen within the Settings menu contains new, +experimental features that are in ongoing development. They can be +activated and used in their current state and will be improved and moved +out of the Experiments section in future app updates. + +The features currently available in Experiments are: + +- ****directional-arrow.md**** +- ****p2p-peer-to-peer-app-updates.md**** +- background-maps.md # Background Maps + +Mapeo Mobile 5.5.0 introduces a new Map Manager user interface for +importing and managing multiple background maps. The new experimental +Background Maps feature allows you to add your own custom maps and +switch between multiple maps. + +WARNING: When this feature is enabled, you will not have access to the +map you had previously been using in Mapeo. Turn off Map Manager to +switch back to your previous map. + +{% hint style=“info” %} For info on how to generate a map file in for +use in the new Background Maps feature, see creating-mbtiles.md {% +endhint %} + +{% hint style=“info” %} Instructions on using the new Background Maps +feature coming soon. {% endhint %} # Choosing Mapeo Mobile settings + +The following settings can be easily changed in Mapeo Mobile: + +- #language +- #gps-coordinate-format +- #experiments (activate experimental features) + +Language + +Mapeo Mobile is currently available in more than 15 languages, but it +can be translated into any additional language using the Crowdin +platform. For more on translation, see: translating.md + +To change the language of Mapeo Mobile: + +1. Click on Observations List, then click on Settings and select + Language. +2. On the Language screen, select the language you would like to use + for Mapeo Mobile. The language of the application will change + automatically. +3. To return to the home screen of the application, click on Back as + many times as necessary. + + ▶ Video available: How to change the language of Mapeo Mobile + +GPS coordinate format + +Mapeo Mobile supports three GPS coordinate formats: Universal Transverse +Mercator (UTM), Degrees/Minutes/Seconds (DMS), and Decimal Degrees (DD). + +To change the coordinate format used: + +1. Click on Observations List, then click on Settings and select + Coordinate Format. +2. On the Coordinate Format screen, click on the format you would like + to use and it will automatically change inside the application. +3. To return to the home screen of the application, click on Back as + many times as necessary. + +Experiments + +The Experiments screen contains new, experimental features that are in +ongoing development. + +For more on how to activate and test these features, see +experiments-turning-on-experimental-features + +Installing Mapeo Mobile + +There are 2 ways to install Mapeo Mobile on your smartphone: + +- Install from Play Store + If you have an internet connection, you can download and install + Mapeo Mobile for free from the Google Play Store. +- Install from a APK file + To install Mapeo Mobile on smartphones that have no internet + connection, you can use an installation file (.apk). + +Install from Play Store + +Before you start, make sure that: + +- You have a good internet connection. +- You have enough space available on your smartphone for the Mapeo + application and data you will collect - we recommend that you have + at least 1 GB (gigabyte) available. + +To install Mapeo Mobile on your smartphone from the Google Play Store: + +1. Open the Play Store application on your smartphone. +2. In the search bar at the top of the Play Store window, type Mapeo, + and click on the magnifying glass icon at the bottom right of the + keyboard. +3. Click Mapeo in the list of applications. +4. On the Mapeo Mobile screen in the Play Store application, click on + Install. +5. When the installation process is complete, click on Open. +6. When Mapeo Mobile opens, you will be prompted to allow Mapeo access + to your phone’s camera and GPS for proper functioning of the app. + After that, the Mapeo Mobile home screen will open automatically. + +{% hint style=“info” %} The installation process can take a long time +(more than 15 min), depending on the quality of your internet +connection. {% endhint %} + +{% hint style=“warning” %} If you don’t have enough space available on +your smartphone, you will receive a message from Play Store inviting you +to delete content or applications from your device to free up space. {% +endhint %} + + ▶ Video available: How to install Mapeo Mobile from Play Store + +Install from APK file + +You can install Mapeo Mobile on a smartphone that does not have an +internet connection using a previously downloaded installation file +(.apk). + +If you already have the installation file on your device, continue here: +#install-from-an-apk-file. + +Download the installation file + +While an internet connection is available, download the Mapeo +installation file(.apk). + +{% hint style=“info” %} Once downloaded, the APK file can be shared with +other devices and used to install Mapeo offline. + +- If you have an internet connection, use any messaging app (such as + Telegram or WhatsApp) for sending installation files (.apk) between + smartphones. +- If you have no internet connection, you can copy the file from a + computer using a USB cable or send the installation file using + Bluetooth. Read more about how to send a file using these methods in + sharing-files-between-devices.md. {% endhint %} + +Install from APK file + +1. Locate the Mapeo installation file (.apk) on the device. +2. Tap on the installation file (.apk) to open it. +3. In the pop-up window, click on INSTALL. The installation process may + take several minutes. +4. Once the installation is complete, click on OPEN in the pop-up + window. +5. When Mapeo Mobile opens, you will be prompted to allow Mapeo access + to your phone’s camera and GPS for proper functioning of the app. + After that, the Mapeo Mobile home screen will open automatically. + + ▶ Video available: How to install Mapeo Mobile from an APK file # + Importing configurations into Mapeo Mobile + +To start using a custom configuration, you’ll need to import the new +configuration file into Mapeo Mobile. For more on configurations, see +custom-configurations. + +Locate the configuration file + +Download or copy the configuration file (eg. +example_project.mapeosettings) onto your Android device. Note which +folder the file was saved in. + +{% hint style=“info” %} For sending configuration files (.mapeosettings) +between smartphones with an internet connection, we recommend using the +Telegram app, as other messaging applications have problems with this +file format. + +If you don’t have an internet connection, you can copy the file from a +computer using a USB cable or send the file using Bluetooth. Read more +about how to send a file using these methods in +sharing-files-between-devices.md. {% endhint %} + +Go to Settings + +In the Mapeo Mobile app, tap the Observations list button, then the +Settings button. + +Import configuration file + +Select Project configuration, then tap Import config. + +Navigate to the folder that contains your configuration file and tap on +the file. + +{% hint style=“info” %} Files downloaded from the internet or a +messaging application can generally be found in the Downloads folder. {% +endhint %} + +Confirm import + +Click OK on the import confirmation window and verify that the Project +configuration screen now displays the name of the new configuration. + +To start using the updated configuration, tap Back as many times as +needed to return to the home screen and tap Create observation. The +Categories screen will now display the icons and category names of your +custom configuration. + + ▶ Video available: How to identify which configuration is Mapeo Mobile + using + + ▶ Video available: How to import a custom configuration to Mapeo + Mobile # 💻 Mapeo Desktop use + +Mapeo Desktop is a computer application that can be used for two +different purposes: + +- using-mapeo-desktop-to-manage-mapeo-mobile-data + Mapeo Desktop allows you to aggregate, view, and manage data + collected with Mapeo Mobile. Observations mode offers options to + filter and export data into multiple formats, such as GeoJSON, CSV, + and PDF, and also allows the publication of online interactive maps + containing data collected with Mapeo Mobile. + +- using-mapeo-desktop-to-create-territory-information + Mapeo Desktop also offers an interface for adding or creating + territory data directly within the Desktop application. Territory + mode provides a basic toolkit for mapping features that are more + accessible to new tech users than other available geographic + information systems (GIS) tools. It also offers the option to import + geographic information from an external source, and export map data + in a .GeoJSON file format. Further manipulation or visualization of + exported map data requires knowledge of other software. # Creating + and editing territory data + +We use the word features to describe things that appear on the map, such +as rivers, buildings, or points of interest. In Territory mode, you can +create features in the form of points, lines and areas by drawing these +directly on a background map. + +- Points are features associated with a single location (coordinate). + These could be specific places of interest like a building, place + name, plant, or rapid. +- Lines are features associated with a linear path (composed of a set + of coordinates). Lines are used to represent features such as roads, + trails, and rivers. +- Areas are features associated with a bounded area (composed of a set + of coordinates, and sometimes also called a “polygon”). Areas are + used to show the boundaries of features like lakes, natural zones, + and settlement areas. + +Zoom in to edit + +In order to get started creating features in Territory mode, you first +have to zoom in on the map until you get to a sufficiently high zoom +level at which your data will be precise. + +You can either navigate the map using your mouse or keyboard as +described in navigating-around-the-map.md, or you can click on the Zoom +in to edit button that will show at the top if you are not yet at a high +enough zoom level. Clicking this button will zoom in the map at the +center of your current view. + +Note: if you already have territory data in Mapeo, this data will +disappear from view if you are no longer zoomed in to a level where you +can make edits. It will appear again once you return to a sufficiently +high zoom level. You can also use the Zoom to data feature (located in +the View menu) to zoom to the maximum extent of your data to help find +your way back to your data at a sufficiently high zoom level. + +Creating features + +Creating point features + +To create a new point feature, click the Point button [or press the 1 +key on your keyboard]. This will change the mouse cursor to a cross +symbol. Also, the point button will now be highlighted in blue. + +To place the new point on the map, position the mouse cursor where the +point should go, then left-click [or press Space on your keyboard]. + +Creating line features + +To add a line, click the Line button on the toolbar above the map [or +press the 2 key on the keyboard]. This will change the mouse cursor to a +cross symbol. + +Next, position the mouse cursor where the line should begin and +left-click [or press Space on the keyboard] to begin automatically +placing nodes along the line of your mouse. Continue placing more nodes +by clicking on the map [or pressing Space on your keyboard]. While +drawing, you can zoom in or drag the map in order to add more detail. + +To finish a line, click again on the last node [or press Enter on your +keyboard]. + +Creating area features + +To add an area, click the Area button on the toolbar above the map [or +press the 3 key on your keyboard]. This will change the mouse cursor to +a cross symbol. + +Next, position the mouse cursor at one of the corners of the feature you +want to create and left-click [or press Space to begin placing nodes +around the outer edge of the area]. Continue placing more nodes by +clicking on the map [or pressing Space in your keyboard]. While drawing, +you can zoom in or drag the map in order to add more detail. + +To finish an area, click again on either the first or last node [or +press Enter]. Mapeo will automatically join your last point to your +first point to create a closed area. + +Adding a category and details to a feature + +After you create a feature on the map, the Select category panel will +appear on the left, and you will be able to assign a category to the +feature. Scroll down the list of categories to find the right one, or if +you know its name you can search by starting to type its name in the +search box. Recently used categories will appear at the top of the list, +and the others are listed in alphabetical order. + +Select the category that best represents what you are documenting in the +feature you are creating. Mapeo comes with a default set of categories +and associated icons that can be used for collecting and classifying +data. + +{% hint style=“info” %} It is possible to create custom categories and +icons to tailor Mapeo to your specific data collection needs. This +customization currently requires significant technical knowledge. For +more on customization, see custom-configurations. {% endhint %} + +Depending on the category you have selected, you may see specific +questions associated with the category. These could be text fields, +“select one” buttons, or “select multiple” checkboxes. All of these +fields are optional. + +{% hint style=“info” %} Depending on the Mapeo configuration you are +using, different types of features may be mapped using the same +category. For example, in the current default configuration of Mapeo, +you can assign the Lake category for both point and area features, +depending on your use case: you may want to create a point dataset of +all the names of lakes across a region, or, you may want to draw the +boundaries of lakes to show them on a cartographic map. + +{% endhint %} + +After selecting a category and filling in any information you can click +on the :heavy_check_mark: confirm button in the top right of the Select +category panel to stop editing that point. Clicking elsewhere on the map +will also navigate you away from the panel. + +To learn more about how data types work in Mapeo configurations, and how +to customize these to meet your own needs, see +creating-custom-configurations. + +Viewing and editing a feature + +Select a feature + +Left-click on a feature to select it. This will highlight it with a +pulsing glow, and the Edit feature panel will display details about that +feature. + +Right-click on a feature to display the Feature commands menu, which +shows the commands that are available, such as rotating, moving, and +deleting. + +Moving points + +To move a point, place the mouse cursor over the point, then press and +hold the left mouse button while dragging the point to its new location. + +Moving lines + +To move an entire line, right-click the line and select the Move command +from the Feature commands menu. Then move the mouse, and left-click to +place the line in a new location. + +Modifying lines or areas + +To adjust the shape of a line or area, first left-click to select it. +All nodes of the feature will be drawn as small circles. You can then +drag the nodes to better locations. + +You can also create new nodes along a line or area either by +double-clicking on the line or edge of the area, or by dragging the +small triangles at the midpoints between nodes. + +Accessing measurement information for a feature + +It is possible to activate a box of measurement information for a +feature, such as the geometry type (point, line, area), the length or +area, and the coordinates, by pressing Ctrl + I while a feature is +selected. + +Deleting features + +To delete a feature (point, line, or area), right-click on the point to +select it and show the Feature commands menu, then use the Delete +command. + +Editing feature details + +Once you have selected a feature, you can also edit the feature details, +such as the category and any of the detail fields, shown on the Edit +feature panel left to the map. + +To change the category, click on the category that is currently +selected. This will show the same list of categories available when +creating a feature. Select the category that you want to change the +feature to by clicking on one of them. + +Undo & Redo + +You can undo any edits to features by clicking the Undo button, and redo +them by clicking the Redo button. + +Confirming feature details + +To confirm a feature after adding or editing, simply click on the +:heavy_check_mark:Confirm located at the top right of Edit feature +panel. Note that this will not save the feature in your Territory +database until you go through the next step of +#saving-all-of-your-changes. + +Also note that to confirm a new feature, you first need to select a +category (see #adding-a-category-and-details-to-a-feature). + +Saving all of your changes + +Click Save to finish your edits and save them permanently to your +computer. You should remember to save your work frequently! + +On the Save your edits panel, you’ll have a chance to review what you’ve +done. Mapeo will also perform some basic checks for missing data and may +offer helpful suggestions and warnings if something doesn’t seem right +(for example, if there is any data that is missing a category). + +Before saving your changes you must enter a Changeset Comment, or a +short description of the changes you have made. Then click Save so your +changes will be saved on the map, and can be synchronized with other +devices or exported. + +Automatic Backups + +If you can’t finish your edits in one sitting, for example if your +computer crashes or you close the browser tab, your edits are still +saved by Mapeo. When you open Mapeo again later and access the Territory +mode, Mapeo will offer to restore your work. + +# Changing background maps in Territory mode + +The standard background map that appears in Territory mode when you are +connected to the internet is an imagery map provided by Bing, composed +of various sources of satellite imagery and aerial photography. + +For territory mapping, high resolution imagery is frequently one of the +best background maps because you can clearly identify features in the +landscape. + +There are also other background map options available in the Background +map window, which you can open by clicking on the Background settings +icon or pressing the B key on your keyboard. + +You can change your background map at any time while you are adding or +editing features in Territory mode. + +Standard background map options + +Some of the standard background maps include: + +- Bing aerial imagery: An excellent source of satellite and aerial + imagery at low, mid and high resolutions provided by the company + Bing. Satellite imagery can be helpful for mapping both natural and + artificial features in many different kinds of landscapes. +- Esri World Imagery: An alternative imagery layer provided by the + company Esri, sometimes providing different imagery sources. +- Mapbox Satellite: Yet another alternative imagery layer provided by + the company Mapbox; as with the Esri imagery layer, it is possible + that there are different sources from the other two. +- OpenStreetMap: A vector map composed of data from the OpenStreetMap + service. Depending on where you are creating territory mapping data + and the quality of OpenStreetMap data there, this may be a helpful + reference for orientation or direct mapping, especially in urban + settings or anywhere where there is a lot of human infrastructure. +- OpenTopoMap: a vector map composed of data from OpenStreetMap + combined with a multi-directional hillshade layer which highlights + the landscape topography, and can be helpful for mapping features in + mountainous regions. The available background maps will vary + depending on your map location in the world. In some countries, + there will be additional regional maps made available for you to use + as a map background. + + ----------------------------------------------------------------------- + Shown here is the OpenStreetMap background map panned to an area of + Manaus, Brazil. + + ----------------------------------------------------------------------- + + : Shown here is the OpenStreetMap background map panned to an area of + Manaus, Brazil. + +Using a minimap and overlays + +There are several additional options in the Background map window that +may be useful to you: + +- You can enable and disable a Minimap which will show a small-scale + (more zoomed out) map to give you an overview of your location. This + minimap will use the same map as the Background map you have + selected. + +- You can enable and disable Overlays which may add additional layers + to contextualize your background map. The most useful of these to + use in conjunction with satellite imagery background maps is the + Locator Overlay option, which adds administrative boundaries, roads, + and labels on top of your background map. + +Custom background maps + +You can also provide your own custom background map, with the +information most relevant to your project. This can be an online map +source, or a directory composed of offline map tiles. There are two +different ways to do this: + +(1) Add a path to your map tiles (typically a directory of files in a + {z}/{x}/{y}.jpg format, or a singular .asar file) using the Custom + background option. Map tiles can either be hosted online, or offline + on your machine, and so the path could either be an online path + (with an http protocol) or a local file path. + +- To use a map tiles path as a custom background, click on the […]Edit + custom background button next to the Custom option in the Background + map window. + +- Then, enter a path in the text field in the pop-up window, click on + OK and then select the option Custom in the Background map window. + +(2) You can also add background map options by specifying them in a + custom configuration. Learn more about this by visiting + creating-custom-maps. + +{% hint style=“info” %} To learn more about custom and offline maps in +Mapeo, visit creating-custom-maps and +adding-custom-base-maps-to-mapeo-desktop.md. {% endhint %} # Mapeo +Desktop for creating territory data (Territory mode) + +This section explores how to use Mapeo Desktop to create, edit and +manage mapping data directly within the Desktop application, using +Territory mode. The information is contained in the following pages: + +- navigating-around-the-map.md +- creating-and-editing-territory-data.md +- changing-basemaps.md +- importing-external-territory-information.md +- exporting-data.md # Exporting and syncing data + +Exporting territory data as a .GeoJSON file + +Once you are finished creating and editing data in Territory mode, you +may export your data to a .GeoJSON file format. This is a commonly used +file format which can be opened using other GIS or cartography software +or platforms such as QGIS, Mapbox Studio, or ArcGIS. + +To export territory data, click on the Export map data button on the top +right of your screen, and select Export Territory Data as GeoJSON. Next, +in the pop-up window, rename and save the .GeoJSON file where you want. + +{% hint style=“info” %} Note: this will export all of your territory +data at once. There currently is no way to export a selection of your +territory data. {% endhint %} + +About synchronizing territory data with other devices + +It is possible to synchronize data created using Mapeo Desktop Territory +mode with other devices: + +- If two Mapeo Desktop devices synchronize with each other in the + Mapeo Desktop Synchronize mode, they will each exchange all of their + territory data (as well as the observation data) with each other. +- If a Mapeo Desktop device (computer 1) synchronizes with a Mapeo + Mobile device (phone 1), then that Mapeo Mobile device will receive + all of the territory data from the Mapeo Desktop device, and will + store this data. The Mapeo Mobile device will not display this data + on the map nor show any of the features in the Observations list + screen. However: + - When this Mapeo Mobile device synchronizes with another Mapeo + Desktop device (computer 2), it will share all of the territory + data from that first device (computer 1), and the second device + will be able to see, edit, export, and synchronize that data as + well. + - When this Mapeo Mobile device (phone 1) synchronizes with + another Mapeo Mobile device (phone 2), that second device + (phone 2) will receive all of the territory data that was + synchronized with the first device (phone 1), but won’t be able + to see it or edit it. The second Mapeo Mobile device (phone 2) + may now synchronize this data with other Mapeo devices. + +{% hint style=“info” %} Note: Synchronized territory data will also +include any external geospatial data that was added to Mapeo Territory +mode; see importing-external-territory-information.md. {% endhint %} + +{% hint style=“info” %} To learn more about how synchronizing data works +in Mapeo, seesynchronizing-data-with-mapeo-desktop.md. {% endhint %} # +Navigating around the map + +The background map that appears underneath the territory data is a +vitally important resource for creating features. This map serves as +your primary reference to where features might be located when you are +creating or editing data. + +You move around the map by dragging it and by pressing and holding down +the left mouse button and moving the mouse around. You can also use the +↓, ↑, ←, → arrow keys on your keyboard. + +You can zoom in or out by scrolling with the mouse wheel or trackpad, or +by clicking the + Zoom in and - Zoom out buttons in the Map controls +menu on the right side of the map. You can also use the + and - keys on +your keyboard. + +If your computer provides your geolocation, you can also click on +theShow my Location button to pan to your location on the map. + +You can also zoom to a set of geographic coordinates (in decimal +degrees) by accessing the Zoom to Coordinates feature located in the +View menu. Enter a pair of longitude and latitude coordinates separated +by a comma and with longitude going first, and then click Submit. The +background map should travel to the coordinates. + +The + Zoom in to edit button appears at the top of your screen when you +are not sufficiently zoomed in. You can press it to zoom in to a minimum +high zoom level where editing is possible. Once you have created +territory data, you can also use the Zoom to Data feature located in the +View menu to zoom to the maximum extent of your territory data on the +map. + +Lastly, it is possible to activate an overview map at the top of the +map, by pressing the / key. + +You can change the background map used in Territory mode at any time. +For more information on this, visit changing-basemaps.md. # Importing +and using external geospatial data + +When creating data in Territory mode, you may want to incorporate or +utilize geospatial data from a source outside of Mapeo Desktop Territory +Mode. + +One key source of data that you may want to access in Mapeo Desktop +Territory mode is data that was collected via Mapeo Mobile, synchronized +with your Mapeo Desktop device, and available in Mapeo Desktop +Observations mode. + +Additional data sources to use could be any of the following: + +- .GeoJSON (a commonly used format by many GIS tools such as QGIS or + Mapbox, and also available as an export option in both Mapeo Desktop + Territory and Observations modes) +- .kml / .kmz (A file extension used by Google Earth Pro and related + tools, but commonly used by many applications) +- Shapefile (.shp and several other files, created by Esri for use in + their ArcGIS software but commonly used by many applications) +- .gpx (a GPS data file that contains waypoints, routes, and tracks; + generated by handheld GPS devices by Garmin and others) + +There are currently three different ways to work with the above kinds of +external data. + +Importing .GeoJSON or shapefile data as territory data + +You can import a file containing geospatial data (in .GeoJSON and +shapefile formats) directly into your Mapeo Desktop Territory mode +database. This will add all of the data (points, lines, and areas) to +your Mapeo Desktop territory data set as uncategorized features. You can +then edit the features in the same way as any features that were created +directly in Territory mode. + +- In the Top menu bar, click on File and then select Import territory + data. + +- In the file browser pop-up window, navigate to the directory where + the file you want to import is located. Select the file you wish to + import (in either .GeoJSON or shapefile format). + +- Currently, Mapeo does not provide any messaging once you have done + so, but if the file you have selected has geospatial data that can + be imported, Mapeo will begin importing the data. You may see a + processing icon at the bottom right of the map, indicating that data + is being imported. +- Upon successful import, the data will not show up right away; you + may have to reload Mapeo by pressing CTRL-R or restarting. +- Once imported and refreshed, the data will appear as uncategorized + features on your map. Remember that you will need to be zoomed in to + the area where they are located in order to see them on the + background map. + +- You can then edit the features in the same way as any features that + were created directly in Territory mode. + +{% hint style=“info” %} Note: to import a shapefile, Mapeo Desktop is +configured to look for .shp file. However, a shapefile consists of a +number of additional files with other extensions including .shx, .dbf, +.sbn and several additional optional files. Make sure these files are in +the same directory as your .shp file or the import will fail. {% endhint +%} + +{% hint style=“info” %} Note: currently, it is not possible to import +.kml / .kmz or .gpx data directly into your Territory database. See the +next section for more information on how to use these as a map data +overlay. {% endhint %} + +Using geospatial data as a temporary custom map data overlay + +You can add geospatial data as a temporary data layer that is displayed +on top of your background, as a reference for creating Territory data +but without including this data directly into your database. This could +be useful if you have some geospatial data that you want to display for +reference when creating data, such as place names, rivers and creeks, +roads and paths, or zonal data. In Territory mode, this is currently +known as custom map data. + +There are four types of data that can be added as custom map data: .gpx, +.kml, .geojson and .json. + +There are two ways to add custom map data to Territory mode: + +(1) Using the Map Data window + +- Click on Map Data [or use the F key shortcut on your keyboard]. + +- Click on the […] Edit custom data layer button next to Custom Map + Data. This button will be grayed out if no custom map data has been + added. +- From here, you can click the Choose File button to select a file, or + add a data file URL if it is hosted on a server. + +- If you are adding a file, in the file browser pop-up window, + navigate to the directory where the file you want to import is + located. Select the file you wish to import. + +- Click Ok. Now, you should be able to check the Custom Map Data + option to show or hide the geospatial data that you’ve added. + +(2) You also can drag the files from a file explorer window directly + onto the map view. This will automatically add the file to the + Custom Map Data option in the Map Data panel. + +On the Territory mode map, custom map data is shown with a pink outline +and fill. If you hover over or click over any custom map data shapes, +you will see attributes of the data in the Edit feature panel. + +However, neither the attributes nor the geometries of custom map data +can be edited, as this data is only made available as a visual reference +for creating territory data. If you want to include this data directly +into your territory database, then you need to import the data as +described in #importing-.geojson-or-shapefile-data-as-territory-data(and +if your data is not in either of those formats, you may need to convert +it using another software such as QGIS, ArcGIS, or web-based conversion +tools such as toGeoJSON). + +If you are unable to convert the file, then you can create new features +by tracing over these overlain points, lines and areas. If you choose +this route, you should make sure you are very zoomed in when you trace +features to ensure you are as accurate as possible. + +About observation data in Territory mode + +While there is a different workflow for working with observation data in +Mapeo that is documented in the +using-mapeo-desktop-to-manage-mapeo-mobile-data section, you can access +Mapeo observation data in the Territory mode as well. Currently, Mapeo +observation data will be displayed in the same style as Territory data. + +It is also possible to edit Mapeo observations data in Territory mode, +to a limited degree: you can edit feature details, and these changes +will be reflected in Observation mode, and will also be synchronized +with other Mapeo devices. However, if you move the location of a +feature, or delete a feature in Territory mode, these changes will not +be reflected in Observation mode; and, when you close and open Territory +mode again, moved features will reappear in their original location as +they were in Observation mode, and deleted features will reappear on the +map. # Mapeo Desktop for managing Mapeo Mobile data (Observations mode) + +This section explores how to use Mapeo Desktop to view and manage Mapeo +Mobile data, as well as the available options for exporting data into +different formats. The information is contained in the following pages: + +- syncing-data.md +- viewing-observations.md +- editing-and-deleting-observations.md +- exporting-and-sharing-externally.md # Editing and deleting + observations + +Edit observation details + +To edit an observation, open its full details in the View observation +window. + +{% hint style=“info” %} From Map or Media view, click on a dot or image +to open the View observation window for the associated observation. From +Report view, use the EDIT button in the grey toolbar to open the View +observation window for the observation shown in the current page of the +report. {% endhint %} + +With the View observation window open, click on a field to add or edit +information. Click SAVE to save changes. + +{% hint style=“info” %} In Mapeo Desktop you cannot modify the creation +date, category type or geographic location of an observation. {% endhint +%} + +Delete an observation + +To delete an observation, go to the View observation window and click on +theMore options menu. Select Delete observation and confirm deletion by +clicking Yes, delete in the pop-up window. + +{% hint style=“danger” %} Deleting observations cannot be undone, so +exercise caution when using delete. + +By deleting observations, you will permanently remove them from your +device and all devices you synchronize data with in the future. For more +on synchronization, see peer-to-peer-and-mapeo-sync.md {% endhint %} # +Synchronizing data + +To load observations into Mapeo Desktop for the first time, you will +need to synchronize data with another computer or smartphone that uses +Mapeo. + +Mapeo allows you to synchronize collected data with other Mapeo users or +devices that are members of the same project. Synchronizing is used +regularly throughout the course of projects to aggregate data collected +by different participants and ensure that multiple copies of the +complete database exist. Syncing data does not always require an +internet connection and can be done in entirely offline areas. + +{% hint style=“warning” %} Please note that by synchronizing with +another Mapeo user, ALL DATA is shared in both directions. You will +receive all of the observations present on the other Mapeo device and +they will receive all of the observations present on your device. Only +synchronize with members of your project whom you trust with all of your +data. For more on synchronization, see: peer-to-peer-and-mapeo-sync.md. + +Any edits that have been made to the data will also be transferred to +the other device during synchronization. For example, if a person +deletes or edits an observation and then syncs with other devices, this +observation will be deleted or edited on all synced devices. + +It is important to create project synchronization protocols to ensure +that all data becomes part of the project database. {% endhint %} + +There are 2 ways to synchronize with Mapeo Desktop: + +- Synchronization via Wi-Fi () + For syncing with another computer or smartphone + Can be used if both devices are in the same place and have access to + a Wi-Fi network. (An internet connection is not required.) +- Synchronization with a file () + Only for syncing between computers + Useful in these two contexts: + - If devices are in the same place, even without a Wi-Fi network. + - If devices are not in the same place and both have an internet + connection. + +Viewing observations + +To view and manage synchronized observations in Mapeo Desktop, click on +Observations in the Mapeo modes panel on the left side of the screen. + +Observations mode offers 3 different options for viewing observations in +your database. In the Toolbar, you can choose between the following +views: + +- Map view +- Media view +- Report view + +Map view + +In the default Map view, observations are displayed as dots on a map. +Use your computer’s mouse or the Zoom controls at the top right of the +map to zoom in and zoom out and navigate to different locations on the +map. + +Hover your mouse over an individual dot on the map to preview the +associated observation. Click on a dot to view the full details of that +observation in the View observation window. Click on the Expand button +to view all fields in each section. + +Media view + +To view observations as a gallery of images, click on Media in the +Toolbar. Click on an individual image to view the details of that +observation in the View observation window. + +Report view + +To view observations in the form of a report, click on Report in the +Toolbar. Report view displays one observation per page and includes the +category, coordinates, date, a map of the location, and any images +associated with the observation. + +Use the Next and Previous buttons at the bottom of the screen to step +through each page of the report. + +You can filter observations included in the report using the Filter +panel, and hide additional data fields using the Hide fields controls in +the grey panel above the report. + +{% hint style=“info” %} For more on how to hide fields and save a +report, see#save-as-pdf-report. {% endhint %} + +Filter observations + +To look at a subset of your observations in Map, Media or Report view, +use the Filter panel. Observations can be filtered by date, category, +and some details fields used to collect the data. + +To apply a filter, click the Expand button beside the desired filter +section and adjust the filter criteria. Multiple filters can be used at +the same time. + +Filter by date + +To filter observations by a specific date range, click Expand beside +Date of observation to open the filter section. Click on the From and To +date fields and use the pop-up calendar to define the start date and end +date for the timeframe you would like to view. Only observations +collected between these dates will be visible. + +Click ALL to reset the filter and show observations for all dates. + +Filter by category + +To filter observations by a category, click Expand beside Category to +open the list of the categories used in your project. + +- Use the checkboxes to select the categories that you want to make + visible. +- Click ONLY to show observations for a single selected category. +- Click ALL to reset the filter and show observations for all + categories. + +Filter by details field + +You may also have the option to filter by some of the details fields +used in your project. Only details that are “select one” fields (ie. you +can only select one of the available answer options) will be available +in the Filter panel. + +{% hint style=“info” %} For more on creating custom details fields, see +custom-configurations. {% endhint %} # Synchronizing via Wi-Fi + +Synchronizing via Wi-Fi + +Mapeo Desktop can synchronize data via Wi-Fi with other computers or +smartphones that use Mapeo. This is a good sync option when devices are +near each other and it works with no internet connection. + +Requirements: + +- Both devices need to be connected to the same Wi-Fi network + For devices to sync, both need to be connected to the same Wi-Fi + network. This Wi-Fi network does not need to have an internet + connection. + +- Both devices must be using the same configuration + ****It is only possible to synchronize with devices that use the + same configuration. For more on how to import configurations, see + importing-configurations.md. + +To synchronize, follow the steps below: + +Connect to Wi-Fi + +Connect both Mapeo devices to the same Wi-Fi network. In offline +environments, a local Wi-Fi network can be created using a mobile +wireless router or a third device capable of serving as an offline +hotspot. + +{% hint style=“info” %} For more on how to create a local Wi-Fi network +or connect to Wi-Fi, see +creating-local-wi-fi-networks +connecting-to-wi-fi.md {% endhint %} + +Enter Synchronize mode + +In order to synchronize, both devices must have the Synchronize screen +open. + +In Mapeo Desktop: Click on Synchronize in the Mapeo modes panel. + +In Mapeo Mobile: Tap the Synchronize button on the home screen. + +Devices available for syncing will be listed on the Synchronize screen. + + ----------------------------------------------------------------------- + Synchronize screen of Mapeo Desktop showing an available smartphone for + syncing + + ----------------------------------------------------------------------- + + : Synchronize screen of Mapeo Desktop showing an available smartphone + for syncing + +{% hint style=“info” %} Remember that in order for a device to appear in +the list, it must be connected to the same Wi-Fi network, have the +Synchronize screen open, and be using the same project configuration. +You can confirm which configuration Mapeo Desktop is currently using by +consulting the white bar at the bottom of the Synchronize screen. +For troubleshooting on this step, see solving-sync-issues. {% endhint %} + +Start synchronization + +Once available devices appear in the list, confirm the identity of the +device you plan to synchronize with by consulting the unique +identification number on the other user’s device. + +{% hint style=“info” %} To see the unique identification number of a +Mapeo Mobile device, check the right side of the navy blue bar on the +Synchronize screen in Mapeo Mobile. {% endhint %} + + ----------------------------------------------------------------------- + Matching the unique ID of a Mapeo Mobile device as it appears on Mapeo + Desktop + + ----------------------------------------------------------------------- + + : Matching the unique ID of a Mapeo Mobile device as it appears on + Mapeo Desktop + +In Mapeo Desktop, click on the SYNCHRONIZE **** button below the device +name to begin the exchange of data. + +{% hint style=“warning” %} Important: Keep the Synchronize screen open +on both devices until the synchronization process is complete. {% +endhint %} + +View synced observations + +To learn about viewing and managing synchronized data: + +- In Mapeo Desktop, continue to viewing-observations.md +- In Mapeo Mobile, see #view-synced-observations # Synchronizing with + a file + +While other options allow the synchronization between smartphones and +computers, synchronizing with a file is only possible between computers. + +In this option, a sync file is created in Mapeo Desktop on one computer +and then it is used by another computer with Mapeo to exchange data. +During the synchronization, all data contained in the sync file is +transferred to the computer that is syncing with it, and all data in the +Mapeo database of the computer will also be transferred to the sync +file. It uses the same two-way method as synchronization via Wi-Fi. To +learn more about how synchronization works, see +peer-to-peer-and-mapeo-sync.md. + +- If devices are near each other, this is a good sync option when you + can’t create a local Wi-Fi network. You can instead use a USB drive + to copy and paste the sync file between different devices. It works + with no internet connection. +- If devices are not near each other, this is also a good sync option. + In this case, you will either need to transport a USB drive to the + location of the second device or have access to an internet + connection. + +Other requirements: + +- Both devices must be using the same configuration + ****It is only possible to sync with sync files created by devices + that use the same configuration. For more on how to import + configurations, + seeimporting-configurations.mdimporting-configurations.md. + +Create a sync file + +1. Open Mapeo Desktop on computer 1, the computer on which you want to + create a sync file. The generated sync file will include all the + Mapeo data from that computer. +2. Click on Synchronize on the Mapeo modes panel + +3. Click on the Create a sync file button and choose the name and +location where the generated file will be saved. + +Send or copy the sync file to the second device + +There are two options for sharing a sync file: + +- Send sync file via email or file sharing service + (Requires an internet connection) +- Copy and paste sync file using a USB drive + (Works with no internet connection) + +Option 1. Send sync file via email or file sharing service + + ----------------------------------------------------------------------- + Computer 1 (black) generates sync file and sends it via email to + Computer 2 (blue). Computer 2 then syncs with the file. + + ----------------------------------------------------------------------- + + : Computer 1 (black) generates sync file and sends it via email to + Computer 2 (blue). Computer 2 then syncs with the file. + +1. Locate the generated sync file on computer 1. +2. In your email app (Gmail, Hotmail, etc.), create a new email and + attach the sync file. Send it to the user of the computer 2, the + computer with which you want to sync. +3. Computer 2 must receive the sync file and save it. It is important + to remember where has it been saved. + +{% hint style=“info” %} If the sync file is too large to be sent by +email, you can use other platforms such as WeTransfer, Google Drive, or +Dropbox. You can send files up to 2GB for free using these apps. {% +endhint %} + +Option 2. Copy and paste sync file using a USB drive + + ----------------------------------------------------------------------- + Computer 1 (black) generates sync file and transfers it via USB drive + to Computer 2 (blue). Computer 2 then syncs with the file. + + ----------------------------------------------------------------------- + + : Computer 1 (black) generates sync file and transfers it via USB + drive to Computer 2 (blue). Computer 2 then syncs with the file. + +- Connect a USB drive to computer 1, where you generated the sync + file. +- Locate the generated sync file on computer 1 and click on it using + the right button of the mouse. Select Copy. +- Navigate to the USB drive in the file system. Right-click on the + location and select Paste to paste the sync file onto the drive. +- Disconnect the USB drive and connect it to the computer you want to + sync with ( computer 2). +- Navigate to the USB drive folder and locate the sync file. + Right-click on the file and select Copy. Navigate to where you would + like to save the sync file on computer 2. Right-click on the + location and select Paste. + +Start synchronization + +1. Locate the received or pasted sync file on computer 2, the computer + you want to sync with. +2. Open Mapeo Desktop on computer 2. +3. Click on Synchronize in the Mapeo modes panel. + +4. Click on the Sync from a file button and in the pop-up window, +navigate until you find the desired sync file. Then click on it and +click Open.Start synchronization + +The synchronization with the file will automatically begin. + +{% hint style=“warning” %} Important: Keep the Synchronize screen open +on both devices until the synchronization process is complete. {% +endhint %} + +{% hint style=“info” %} When the synchronization is complete, computer 2 +and the sync file will have identical copies of the Mapeo database. To +complete a 2-way synchronization between the two computers, repeat the +process to copy the sync file back to computer 1 and use it to Sync from +a file. {% endhint %} + +View synced observations + +To learn about viewing and managing synchronized data in Mapeo Desktop +Observations mode, continue to: + +{% content-ref url=“../viewing-observations.md” %} +viewing-observations.md {% endcontent-ref %} # Exporting data & sharing +externally + +This section covers the available options and formats for exporting data +from Observations mode in Mapeo Desktop. + +- Save as PDF report: if you want to download or print a PDF report + with the observations collected. +- Export as GeoJSON: if you want to continue working on your data in + another mapping software (such as QGIS, ArcGIS, and others) +- Export as CSV: if you want to view and manage your data using a + spreadsheet in Microsoft Excel, Google Sheets, or other data + analysis tools. +- Export as Web Map: if you want to publish an interactive online map + with the observation data. + + Save as PDF report + +In Mapeo Desktop you can view your data as a report. Each page of the +report contains the details of one observation. From the Report view, +you can: + +- Edit the details of the observation on the current report page by + clicking on EDIT in the grey panel above the report. +- Control which observations are included in the report using the + Filters panel. For more on filtering, see #filter-observations. +- Decide which detail fields you want to show or hide. To do so, click + on the Hide Fields button in the grey panel above the report and + toggle on off/on the fields that you want to hide/show. Click on + SHOW ALL to show all fields and click on HIDE ALL to hide them all. + + ----------------------------------------------------------------------- + Hide Fields options in Report view + + ----------------------------------------------------------------------- + + : Hide Fields options in Report view + +- To save the report as a PDF, click on Save PDF in the grey panel + above the report. In the pop-up window, give a name to the PDF file + and choose where to save it. Once you are done, click on Save. To + view, share or print the report, locate the saved file on your + computer and click on it to open it. + + Export as GeoJSON + +This is a useful export option if you want to continue working on your +data in another mapping software (such as QGIS, ArcGIS, or others). + +To export your observation data as .GeoJSON: + +1. In the Observations mode of Mapeo Desktop, click on Export options + in the Toolbar on the top right of the Mapeo Desktop window. +2. Select Export observations… + +3. In the Export Observations pop-up window: + +- For the Data format field, select GeoJSON. +- In the Only filtered data or all data? field, choose if you want the + exported file to contain only filtered data or all data. +- In the Also export photos? field, choose between including no + photos, full-size photos, or preview-size photos in the exported + file. + +4. Click on SAVE. + +5. In the pop-up window, give a name to the .GeoJSON file and choose +where to save it. Once you are done, click on Save. + +You can now load and use this file in mapping software. + + Export as CSV + +This is a useful export option if you want to view and manage your data +using a spreadsheet and doing graphs and statistic analysis in software +such as Microsoft Excel, Google Sheets, and others. + +To export your observation data as .csv: + +1. In the Observations mode of Mapeo Desktop, click on theExport + Observation Data menu at the top right corner of the screen. +2. Select Export observations… + +3. In the Export Observations pop-up window: + +- For the Data format field, select CSV. +- In the Only filtered data or all data? field, choose if you want the + exported file to contain only filtered data or all data. +- In the Also export photos? field, choose between including no + photos, full-size photos, or preview-size photos in the exported + file. + +4. Click on SAVE. + +5. In the pop-up window, give a name to the .csv file and choose where +to save it. Once you are done, click on Save. + +You can now load and use this file in other software. + + Export as Web Map + +This is a useful export option if you want to publish an interactive +online map with the observation data. To export observation data to a +Web Map: + +Create a Mapeo Web Package file + +1. In the Observations mode of Mapeo Desktop, on the toolbar, click on + Export options. +2. Select Export Webmap… +3. In the pop-up window, give a title and a description to the map and + click on SAVE. + +4. In the pop-up window, give a name to the Mapeo Web Package +(.mapeomap) file and choose where to save it. Once you are done, click +on SAVE. + +Publish your map online + +1. Go to the website maps.mapeo.app and sign in or sign up. It’s free + and you only need an e-mail account and a password. +2. Click on + ADD MAP. + +3. In the pop-up window, navigate in your computer’s file system to +locate the Mapeo Web Package (.mapeomap) file. Select it and click on +Open. Wait until the uploading process is complete. + +4. Click on Publish link to Map to open the website with your published +map! + +5. Copy the URL link of the online map to share it with other people + +You can also: + +- Click on Edit map details to edit the title, description, terms & + limitations, and style of the background map. +- Click on Menu to delete the map. + +​# Synchronizing data with Mapeo Desktop + +Mapeo Desktop allows you to synchronize collected data with other Mapeo +users or devices that are members of the same project. Synchronizing is +used regularly throughout the course of projects to aggregate data +collected by different participants and ensure that multiple copies of +the complete database exist. Syncing data does not always require an +internet connection and can be done in entirely offline areas. + +{% hint style=“warning” %} Please note that by synchronizing with +another Mapeo user, ALL DATA is shared in both directions. You will +receive all of the observations present on the other Mapeo device and +they will receive all of the observations present on your device. Only +synchronize with members of your project whom you trust with all of your +data. For more on synchronization, see: peer-to-peer-and-mapeo-sync.md. + +Any edits that have been made to the data will also be transferred to +the other device during synchronization. For example, if a person +deletes or edits an observation and then syncs with other devices, this +observation will be deleted or edited on all synced devices. + +It is important to create project synchronization protocols to ensure +that all data becomes part of the project database. {% endhint %} + +There are 2 ways to synchronize with Mapeo Desktop: + +- ****Synchronization via Wi-Fi **** () + ****For syncing with another computer or smartphone + ****Can be used if both devices are in the same place and have + access to a Wi-Fi network. (An internet connection is not required.) + +- ****Synchronization with a file **** () + Only for syncing between computers + Useful in these two contexts: + + - If devices are in the same place, even without a Wi-Fi network. + - If devices are not in the same place and both have an internet + connection. # Default background map + +About background maps + +Mapeo uses background maps to show users their current location in the +mobile app and as a background for displaying data collected or created +with Mapeo. + +Mapeo’s default background map + +By default, when the device has access to the internet, Mapeo Mobile and +Mapeo Desktop in Observations mode use a detailed background map that +includes geographic elements such as rivers and mountains, as well as +some political and urban elements such as borders, cities, roads, and +others. + +If the device is not connected to the internet, the background map shown +by default is much less detailed. In Mapeo Mobile, the offline +background map shows country borders and the main water bodies. In Mapeo +Desktop, there is currently no default offline background map. + +Online background map example: + +**** +Offline background map example: + +Beyond the default background map + +Mapeo offers the option to add a custom background map for use both +offline and online. For more on creating and adding custom background +maps, see custom-base-maps. # ✔ Will Mapeo work out-of-the-box for me? + +When you install Mapeo, it comes with default options that can be used +right away, without any customization. In the following pages, this +section details what is automatically included with Mapeo so you can +determine whether the app will meet your needs out-of-the-box. + +- default-configuration.md +- default-base-map.md + +Mapeo offers many options for customizing categories, icons, questions +and background maps but the current customization process requires +significant technical knowledge and will not be accessible to all users. + +{% hint style=“info” %} For more on customization, see the following +section on customization-options. {% endhint %} + +Default configuration + +About configurations + +Mapeo uses configurations to determine which categories, icons and +questions users see when they are collecting data. For each data point +collected with Mapeo, users select a category to classify the point, and +may answer questions or respond to prompts to provide more detail about +what is being documented. + +Mapeo’s default configuration + +When you install Mapeo, it comes with a default configuration that +includes general categories and questions for territory mapping and +monitoring. + +Categories + +The default configuration includes the following data collection +categories: + +Observations that do not fit these categories can always be collected +using the New point category. + +Questions + +For every data point collected, users can enter a description of what +they are documenting. Default categories also include some additional +optional questions or fields that users may fill out when collecting +data. For example, the category Fishing Site includes the field: Name +(Common name of this place). + +To review all fields included in the default configuration, install +Mapeo and explore the Add Details section for each category. + +Beyond the default configuration + +Mapeo offers the option to create custom configurations to fit the needs +of specific projects. For more information on customization, see +custom-configurations. # 📱 Mapeo Mobile use + +This section provides step-by-step guidance on the use of the main +features of Mapeo Mobile: + +- activating-gps-and-viewing-current-location.md +- creating-observations.md +- viewing-observations.md +- editing-and-deleting-observations.md +- sharing-data-externally.md +- wifi-sync.md + +{% hint style=“info” %} If you don’t yet have Mapeo Mobile installed on +your smartphone, see: mapeo-mobile-installation-setup {% endhint %} # +Activating GPS and viewing current location + +Enable GPS on your device + +Mapeo Mobile uses the GPS of your device, so before you start using the +application make sure that GPS or Location on your smartphone is +enabled. + +It will be different on each smartphone, but GPS or Location services +can generally be found in the Quick Settings menu, which can be accessed +by swiping down from the top of your screen. + +Confirm GPS access in Mapeo Mobile + +On the home screen of Mapeo Mobile, you will be able to see if Mapeo is +successfully accessing your device’s GPS. + +- If GPS is activated, the GPS details button at the top of the screen + will show a green dot and the precision of the GPS signal: +- If the GPS is deactivated, the GPS details button will be red: + +{% hint style=“info” %} If you activate the GPS on your device while you +are using Mapeo, you might have to restart Mapeo for the app to +recognize that the GPS is activated and change the status of the GPS +details button. {% endhint %} + +{% hint style=“danger” %} If you didn’t allow Mapeo Mobile access to +your phone’s camera and GPS the first time you opened Mapeo, you won’t +be able to use GPS information or include pictures in your collected +data. For more on modifying app permissions, see +updating-mapeo-mobile-permissions.md. {% endhint %} + +View GPS details in Mapeo Mobile + +Tap the GPS details button to see more information on your current +location. + +Viewing your current location + +By default, Mapeo Mobile will mark your current position with a blue dot +at the center of the map and adjust the map as you move. + +If you pan to a different area on the map, you can always return to +viewing your current location by tapping the Show my current position +button on the bottom right of the map. + +# Editing and deleting observations + +Edit details + +Select the observation you would like to edit and open it. You can open +the observation by tapping on the dot marking the observation on the +home Map screen: + +or by tapping the observation on the Observations list screen: + +Once you are on the View observation screen, tap Edit observation to +modify the information collected. + +In the Edit observation screen, you can change the category of the +point, edit the description and details, or add additional photos. + +{% hint style=“info” %} In Mapeo Mobile, you can only edit or delete +observations that have been created on your device. You cannot change +the geographic location saved with the observation or the date and time +of the original observation. {% endhint %} + +Save changes + +Tap Save to save the changes you have made. Tap Back to return the Map +view. + +To exit without saving your changes, tap Back and confirm you want to +discard changes. + +Delete observations + +To delete an observation you have collected, scroll to the bottom of the +View observation screen and tap Delete. + +{% hint style=“info” %} In Mapeo Mobile, you can only delete +observations that have been created on your device. {% endhint %} + +{% hint style=“danger” %} Deleting observations cannot be undone, so +exercise caution when using delete. + +As Mapeo uses a peer-to-peer database, all data is stored directly on +your device and there is no backup on a centralized server. By deleting +observations, you will permanently remove them from your device and all +devices you synchronize data with in the future. +For more on synchronization, see peer-to-peer-and-mapeo-sync.md {% +endhint %} # Viewing observations + +Once you have created one or more observations, you can view the data +you have collected on the home Map screen or in a list. + +View observations on the map + +On the home Map screen of Mapeo Mobile, each observation you collect +will be marked on the map with an orange dot. + +{% hint style=“info” %} Note that observations you have just collected +may appear directly below the blue dot marking your current location. +Zoom in on the map to view better {% endhint %} + +To view the details of an observation, tap on the orange dot marking the +observation to open the View observation screen. + +{% hint style=“info” %} If you have collected several observations in a +small geographic area, you may need to zoom in on the map to see the +different points. {% endhint %} + +View observations in a list + +Tap Observations list on the home screen to view your observations in +list form. + +To view the details of an observation, tap on any observation in the +list to open the View observation screen. + +------------------------------------------------------------------------ + +Sharing data externally + +In Mapeo Mobile, you can share the details of a single observation +(location, images, description, and details) with a contact outside of +Mapeo by using the Share observation feature. Share uses the +communication apps you have installed on your phone (email, WhatsApp, +Signal, Telegram, or others) to send information. + +{% hint style=“info” %} Remember that communication apps will require an +internet connection or cell signal to work. {% endhint %} + +Open the View observation screen for the selected observation and tap +Share, which is located at the bottom left of the screen. + +Select the desired sharing app and enter the contact’s information. +WhatsApp, Signal and Gmail are the apps that currently work best for +sharing Mapeo observations. + +{% hint style=“warning” %} Always exercise caution when sharing data +collected, as observations could include sensitive information about +locations, activities, or natural resources. Prior to sharing any data, +think through basic security precautions. + +For more on risk assessment and security concerns, see +security-and-risk-assessment.md {% endhint %} # Syncing data via Wi-Fi + +About Mapeo Sync + +Mapeo Mobile allows you to synchronize the data you have collected with +other Mapeo users that are members of the same project. Syncing data +does not require an internet connection and can be done in entirely +offline areas. + +For devices to sync, both need to be in the same place and connected to +the same Wi-Fi network. This Wi-Fi network does not need to have an +internet connection. In offline environments, a local WiFi network can +be created using a mobile wireless router, or by creating a hotspot +using a third smartphone. + + ----------------------------------------------------------------------- + In offline environments, you can create a local WiFi network (without + internet) using a mobile wireless router. + + ----------------------------------------------------------------------- + + : In offline environments, you can create a local WiFi network + (without internet) using a mobile wireless router. + +{% hint style=“warning” %} Please note that by synchronizing with +another Mapeo user, ALL DATA is shared in both directions. You will +receive all of the observations created by that user and they will +receive all of your observations. Only synchronize with members of your +project whom you trust with all of your data. For more about this +process, see peer-to-peer-and-mapeo-sync.md. + +All edits that have been made to collected data will also be transferred +to the other device during sync. For example, if a person deletes or +edits an observation and then syncs with other devices, this observation +will be deleted or edited on all synced devices. If multiple users edit +the same observation before syncing with each other, the changes that +will prevail after syncing are the newest ones. If you encounter +difficulties with this, see solving-sync-issues. + +It is important to create project synchronization protocols to ensure +that all data becomes part of the project database. For more on that, +see creating-user-protocols.md. {% endhint %} + +Connect to WiFi + +Connect both devices to the same Wi-Fi network. Wi-Fi settings can +generally be found in the Quick Settings menu, which can be accessed by +swiping down from the top of your screen. + +{% hint style=“info” %} For more on how to connect to Wi-Fi, see +#connect-to-wi-fi-on-a-smartphone. {% endhint %} + +{% hint style=“info” %} For more on how to create a local Wi-Fi network, +see creating-local-wi-fi-networks {% endhint %} + +Enter Synchronize mode + +Tap the Synchronize button on the Mapeo home screen of both devices to +go to the Synchronize screen. + +The Synchronize screen will show whether you are connected to a Wi-Fi +network. If connected, you will be able to see the name of the network +you are connected to in the top left of the navy blue bar. You will also +be able to see the unique identification number of your device on the +right side of the navy bar. + +Devices available for synchronization will be listed below. +​[]​ + +{% hint style=“info” %} Remember that in order for a device to appear in +the list, it must be connected to the same network, have the Synchronize +screen open, and be using the same project configuration. For +troubleshooting on this step, see solving-sync-issues. {% endhint %} + +Synchronize data + +Once available devices appear in the list, confirm the identity of the +device you plan to synchronize with by consulting the unique +identification number on the other user’s phone. + +Click on the Sync button beside the device name to begin the exchange of +data. + +{% hint style=“warning” %} IMPORTANT: Keep the Synchronize screen open +on BOTH devices until the synchronization is complete. Interrupting the +sync process can result in permanently corrupted data. {% endhint %} + +View synced observations + +You can view new observation data received in the synchronization by +looking at the points on the home Map screen or at the Observations list +screen. + +In the Observations list screen, observations collected by other devices +will appear with a blue bar on the left side. + +{% hint style=“info” %} In Mapeo Mobile, you cannot edit or delete +observations collected by other users. +Remember that you can always view, edit and manage collected data in +Mapeo Desktop. For more on that, see: +using-mapeo-desktop-to-manage-mapeo-mobile-data {% endhint %} # Creating +observations + +You collect data with Mapeo Mobile in the form of observations. An +observation is based on a geographic location (a point on the map) and +can have associated photos, notes, and details. + +Create a new observation + +To create a new observation, tap the Create observation button. + +{% hint style=“info” %} Observations can be created from the home Map +screen or from the Camera screen. Tap Camera at the bottom of the home +screen to change the view. {% endhint %} + +Select a category + +Select the category that best represents what you are documenting in the +observation. Mapeo comes with a default set of categories and associated +icons that can be used for collecting and classifying data. + +{% hint style=“info” %} It is possible to create custom categories and +icons to tailor Mapeo to specific data collection needs. This +customization currently requires significant technical knowledge. For +more on customization, see custom-configurations. {% endhint %} + +Add a description + +Tap on the placeholder What is happening here? to add a description of +what you are documenting. + +Add photos + +Tap Add Photo to take one or more photos to attach to the observation. + +{% hint style=“info” %} Photos must be taken in the moment using your +phone’s camera. Mapeo Mobile does not currently allow you to attach +existing images from a gallery or other source. {% endhint %} + +To remove a photo from a draft observation, tap on the thumbnail of the +image. On the View image screen, tap the Delete Image button. + +{% hint style=“info” %} If the Delete Image button is not visible on the +View image screen, tap anywhere on the screen to show. +*Deleting images from draft observations is only available in Mapeo +Mobile version 5.4.0 or higher. {% endhint %} + +To confirm deletion, tap Delete Image in the confirmation window. Please +note that once deleted, images cannot be recovered. + +If you don’t wish to proceed with the deletion, tap Cancel then tap the +Close button to return to the New observation screen. + +{% hint style=“info” %} Images cannot be removed once an observation has +been saved. {% endhint %} + +Add details + +Depending on the category you have selected, you may see the option to +Add details at the bottom of the screen. Observation details consist of +specific questions for each observation category. Mapeo Mobile comes +with basic questions for some categories. Adding details is not required +when creating observations. + +Tap NEXT to move to the next question and tap DONE once you have +answered the last one. + +{% hint style=“info” %} In order to set up your own custom questions or +details fields, you must customize Mapeo. For more information, see +custom-configurations {% endhint %} + +Save observation + +Once you have added all desired information, tap Save. + +* Note on GPS precision + +If the GPS signal at the moment of saving the observation has an +accuracy worse than ± 10 m, Mapeo will automatically offer you three +options: + +1. Tap CONTINUE WAITING to wait until the GPS signal improves. +2. Tap SAVE to use the current GPS data, even if the accuracy is worse + than ± 10 m. +3. Tap MANUAL COORDS to manually enter the coordinates that you want to + use. + You can choose which GPS data format you want to use to enter the + coordinates. This is a useful option if you have a GPS device or + another smartphone with a better GPS signal accuracy. + Tap Save once you have manually entered the coordinates to return to + the Edit observation screen. # Sharing files between devices + +See the sections below for different file sharing options: + +- Sharing files between devices with an internet connection +- Sharing files between devices with no internet connection + +Sharing files between devices with an internet connection + +If you have access to an internet connection, you can share files in +multiple ways. The optimal way depends on the size and type of the file. +Below are our recommendations: + +- From a smartphone +- From a computer + + FROM A SMARTPHONE + +Some Mapeo files can be tricky to share from a Mapeo Mobile smartphone, +because of their special formats. We recommend using Telegram app, +email, or Google Drive to share the following files: + +- Configuration files (.mapeosettings) +- Installation files for Mapeo Mobile (.apk) +- Base maps (folder .zip) + +To share and add base maps to Mapeo Mobile, we recommend using a +computer and a USB cable, because it requires navigation inside the file +system of the smartphone and pasting the base map elements in a specific +location. For instructions on that process, see +adding-custom-base-maps-to-mapeo-mobile.md +You can also share larger files (up to 2GB) for free via Dropbox, +WeTransfer, or other online platforms. + +{% hint style=“info” %} Sending installation (.apk) and configuration +(.mapeosettings) files with other apps encounter problems with the size +and type of the files. {% endhint %} + + FROM A COMPUTER + +These are the most common Mapeo files that you will want to share from a +Mapeo Desktop computer: + +- Configuration files (.mapeosettings) +- Installation files for Mapeo Desktop (.exe, .dmg , .zip , .AppImage) +- Base map folders +- Sync files (.mapeodata) + +You can use multiple platforms to share files. + +- We recommend using email apps such as Gmail or Hotmail for sharing + lightweight files (smaller than 10MB). +- We recommend using Drive, Dropbox, WeTransfer to share heavier files + as they allow you to send up to 2GB for free. You can use the + Telegram Desktop app to send up to 1.5GB. + +Sharing files between devices with no internet connection + +If you do not have access to an internet connection, there are multiple +ways to share files between devices. + +- Copy and paste files using a USB drive or cable (this is easier to + do if you have a computer) +- Send via Bluetooth, SHAREit or other apps + +USING A USB CABLE/DRIVE + +For transferring files between computers without an internet connection, +we recommend using a USB drive or a cable. Although most computers can +also share files via Bluetoothwith other devices that are nearby, +commonly shared files for Mapeo Desktop can be very heavy (e.g. Sync +files (.mapeodata)) and Bluetooth could take much longer than using a +USB cable or drive. + +Example: In this example, we will share a Mapeo installation file from +one computer to another one completely offline, using a USB drive. + +[] + +1. Connect a ​USB stick to the ​computer where you already have the +installation file and open it. + +2. Localize the ​installation file on the ​computer, click on it with the +right button of the mouse, select Copy. + +3. Use the right button of the mouse to Paste the previously copied +installation file into your ​USB stick folder. + +4. Disconnect the ​USB stick from ​the computer and connect it to the +​computer in which you want to install Mapeo Desktop. + +6. Open the USB stick folder and localize the previously pasted +​installation file. Click on it with the right button of the mouse and +select Copy. + +7. On the desktop screen of the ​computer in which you want to install +Mapeo Desktop, click on an empty space with the right button of the +mouse and select Paste. + + USING BLUETOOTH + +Android devices that are near each other can use Bluetooth to transfer +files without an internet connection. The Bluetooth transfer will be +quicker for lighter weight files, such as: + +- Configuration files (.mapeosettings) +- Installation files for Mapeo Mobile (.apk) + +To transfer files using Android’s Bluetooth: + +1. Activate Bluetooth on both devices. Bluetooth settings can generally + be found in the Quick Settings menu, accessed by swiping down from + the top of your screen. +2. On the Bluetooth settings screen, tap Pair new device and wait for + the list of AVAILABLE DEVICES to populate. + The screen of both devices should be open and unlocked to appear + available for syncing. +3. Once you see the device you would like to share files with and + confirm its identity, tap on the device name to pair. +4. Confirm the code and the pair request on both devices. +5. Locate and select the file you wish to send and tap Share. Select + Bluetooth in the share options and tap the name of the other device + in the list. + +You can also use Android apps for Bluetooth sharing, including SHAREit +or others. + +{% hint style=“warning” %} For transferring larger files (bigger than +10MB) such as base map folders, we recommend connecting to a computer +and transferring via cable if possible. +For more on adding base maps to Mapeo Mobile, see +#adding-a-base-map-using-a-computer. {% endhint %} + +I want to connect to Wi-Fi + +See below for details on how to connect to a WiFi network: + +- Connect to Wi-Fi on a smartphone +- **** Connect to Wi-Fi on a computer + +Connect to Wi-Fi on a smartphone + +The details may vary for each smartphone, but Wi-Fi settings can +generally be found in the Quick Settings menu, which can be accessed by +swiping down from the top of your screen. + +Tap the toggle to turn on Wi-Fi, then tap the name of the Wi-Fi network +you would like to connect to. Enter the password if required and tap +Connect. + +------------------------------------------------------------------------ + +Connect to Wi-Fi on a computer + +On Windows + +- Click on the Windows menu button, select Settings, click on Network + and Internet. In the left menu panel, click on the Wi-Fi option. + Toggle the Wi-Fi option to On to enable your Wi-Fi adapter. Connect + to the WiFi network you prefer. You might be asked for the password. +- A short path is to click on the Wi-Fi icon in the toolbar in the + lower-left corner of your computer screen. If it isn’t there, click + the arrow to see if it’s grouped with the other icons on your + toolbar. Click on the larger Wi-Fi box that appears in the pop-up + menu and select the WiFi network you want to connect to. + +[] + +The person I want to sync with has deleted valuable data + +As you know, when synchronizing with another Mapeo user, ALL DATA is +shared in both directions. When you sync with someone, you will receive +all of the observations on their phone and they will receive all of your +observations. All edits and deletions that have been made to data will +also be transferred to the other device during sync. For example, if a +person deletes or edits an observation and then syncs with other +devices, this observation will be deleted or edited on all synced +devices. + +- Let’s give a practical example: + +It can happen that someone misunderstood the behavior of data syncing +and deleted some of the data they collected in Mapeo Mobile after having +synced with their peers, thinking that data would already be safe in a +central database. This is not how Mapeo works. What will happen is that +the data you delete on your phone, will be deleted from everyone’s +phones after syncing with them. + +- How to prevent the data deleted on one device from being deleted + from other devices after syncing? + +There is a work-around to prevent this, but it can be very +time-consuming. Mapeo sync works under the premise that if multiple +users edit the same observation before syncing with each other, the +changes that will prevail after syncing are the most recent ones. + +Knowing this, before syncing with the person that deleted the data, you +can explore your database in Mapeo Desktop, identify the observations +created and deleted by the person that deleted data, and make a small +edit to each of them. After that, sync your Mapeo Desktop device with +the other person’s device. This way, after syncing with the person that +deleted the data, not only will your data will not be deleted, but the +person that deleted the data will get the data back. + +Here you have an example of an activity that you can practice with your +team to clarify this behavior: + +💡 Activity on syncing hierarchy + +This activity shows which edits take priority when synced data has been +edited on multiple devices. + +1. First, you need to have all participants create observations and + sync with each other. +2. Once all participants have synced and have the same database, one of + them deletes one of the observations they created for training + purposes. +3. The team verifies that the observation has been deleted and after + that, the participant syncs with a second participant. +4. Right after, a third participant that still has the complete + database, edits the observation that was deleted by the first + participant. +5. The team verifies that the observation has been edited and after + that, the third participant syncs with both the first and the second + participants. +6. After that, everyone verifies that the deleted observation reappears + on their devices with the changes made by the third participant. +7. Discuss the need or utility of this workaround to avoid losing your + data when you know you are going to sync with someone that has + deleted data. + +- How can you prevent this from happening again? + +Mapeo sync can be a tricky and complex process and the functioning of +the peer-to-peer database is not always easy to understand. It is +important to create project synchronization protocols to ensure that all +data becomes part of the project database. For more on that, see +creating-user-protocols.md. # I can’t sync with the sync file + +Currently, only computers with Mapeo Desktop installed can sync with a +sync file (.mapeodata). If you’re having trouble syncing with a sync +file, explore the various solutions, in this order: + +1. Check that both devices use the same configuration +2. Check that they use the same version of Mapeo +3. Make sure the sync file is not corrupted + +Check that both devices use the same configuration + +To sync with a sync file, the configuration the sync file was created +with must be the same as the configuration used by the device you want +to sync with. + +First of all, check that this is the case. To do this, check what +configuration the computer you want to sync with is using, and find out +what configuration the computer that created the sync file uses. You can +check the configuration used in Mapeo Desktop at the bottom of the +Synchronization screen. + +If the configuration is not the same, you have two possible options: + +Option A: Change the settings on the target computer + +On the computer where you want to sync the file, import the +configuration used to create the sync file. For it: + +1. On Mapeo Desktop, on the Top menu bar, click File and select Import + Configuration. +2. In the popup window, navigate to the folder on the computer where + you saved the configuration file (.mapeosettings) that you want to + import. Click the file, then click Open. You may see a white screen + for a few seconds while the configuration is changed. +3. Restart Mapeo Desktop. +4. Try again to sync with the desired sync file. + +[] + +Option B: Change settings on the source computer + +On the computer where the sync file was created, import the +configuration you’re using on the computer you want to sync with and +recreate the sync file. To do so, follow the next steps: + +1. On Mapeo Desktop, on the Top menu bar, click File and select Import + Configuration. +2. In the popup window, navigate to the folder on the computer where + you saved the configuration file (.mapeosettings) that you want to + import. Click the file, then click Open. You may see a white screen + for a few seconds while the configuration is changed. +3. Restart Mapeo Desktop. +4. Re-create the sync file, from the Synchronization screen, by + clicking the Create Sync File button. Do not close or exit the + Synchronization screen until the process is complete. Closing in the + middle of the process could create a corrupt sync file. +5. Share the sync file with the computer you want to sync with. For + more information on this point, see sharing-files-between-devices.md +6. On the destination computer, on the Synchronize screen, click + Synchronize with synchronization file. +7. Browse the popup window until you find the desired file and click + Open. Do not close the synchronization screen until you have + finished the synchronization process. Closing in the middle of the + process could corrupt data. + +Check that they use the same version of Mapeo + +Normally, the use of different versions does not cause problems when +synchronizing, although if the versions are very different from each +other, it can be problematic. If the sync file was created with a +version of Mapeo that is very old or different from the one you use on +the computer you want to sync with, you could have problems. To fix this +problem, follow the steps below: + +1. Make sure the sync file was created using the same version of Mapeo + that the computer you want to sync with is using. In Mapeo Desktop, + you can see the version used at the bottom left of the Mapeo modes + panel. + +- + +If they use the same version, skip to the next step. + +2. If they are not using the same version, you will need to update Mapeo +on the device that is using the older version. For more information +visit updating-mapeo-desktop.md + +Make sure the sync file is not corrupted + +There may be a few factors that lead to a corrupt sync file. One of them +could be leaving the synchronization page before the process of creating +a synchronization file has been completed. Another could be that you +have synced the file with a corrupted database. But there could be more +factors. + +To address this issue, follow the steps below: + +1. If possible, create a new sync file and try to sync with the + destination computer again. Do not close the synchronization screen + until you have finished the process. Closing in the middle of the + process could create a corrupt sync file. +2. If it is not possible to create a new sync file again, or if you + have tried it and it does not work, contact the Digital Democracy + technical team through our multilingual mapeo-users chat on Discord. + +Indicators of corrupted data + +To investigate on your own if the sync file is corrupted, you can use +the following clues: + +- If when creating the synchronization file, Mapeo has been frozen for + many hours, it is likely that you have corrupted data. +- If when synchronizing with a synchronization file, Mapeo Desktop + freezes for many hours in the synchronization process, without + increasing the number of Data or Images, it is likely that the + synchronization file contains corrupted data. +- If there are observations with photographs in your Mapeo Desktop or + Mobile database that you cannot open, it is likely that those + observations are corrupted. +- If in your Mapeo Desktop or Mobile database there are observations + with dates that don’t make any sense (for example, 1970), it is + likely that those observations are corrupted. + +You can try deleting that data and creating a new sync file +(.mapeodata), but we think it’s safer to contact Digital Democracy’s +technical team via our multilingual Discord mapeo-users chat for advice. +# I have sync issues + +See the pages below for troubleshooting tips on some common +Synchronization issues: + +- connecting-to-wi-fi.md +- creating-local-wi-fi-networks + - with-a-portable-router.md + - with-a-smartphone.md +- the-device-i-want-to-sync-with-does-not-show-up-on-my-synchronize-screen.md +- i-get-an-error-when-i-try-to-sync-with-another-device.md +- i-cant-sync-with-the-sync-file.md +- the-person-i-want-to-sync-with-has-deleted-valuable-data.md + +I get an error when I try to sync with another device + +An error message during synchronization between two Mapeo devices can +occur due to several factors. In addition, the messages may be different +depending on the situation. The most common are: + +- Errors with a yellow or red symbol with the message + "Error sync terminated" or "Error: read ECONNRES...", occur when one + of the devices has lost Wi-Fi connection or left the Synchronization + screen during the synchronization process and when the + synchronization has not been successful. +- The white screen with the text + "Something is happening with the Mapeo database" also indicates a + failed or interrupted synchronization. + +​[]​[]​[]​[]​​ + +Solutions: + +- Make sure both devices are connected to the same Wi-Fi network. + Check that the Wi-Fi hotspot is working properly. You can see the + Wi-Fi signal on the Synchronization screen of Mapeo Desktop. The + higher the signal quality, the more secure the synchronization + process will be. +- Try to sync the devices again. It is very important that you do not + close the Synchronization screen on any device while the + synchronization is taking place. +- If you still have problems, check the status of the database on + Mapeo Desktop. To do this, click Help on the Mapeo Desktop top menu + bar and select Database Status. +- Check that your Mapeo database is not damaged. To learn more, see + #indicators-of-corrupted-data +- If the problem is not resolved, please contact the Digital Democracy + technical team via our multilingual mapeo-users chat on Discordfor + advice. # The device I want to sync with does not show up on my + Synchronize screen + +If Mapeo is not displaying the device you are trying to sync with on the +Synchronize screen, start by confirming the following: + +- Both devices are connected to the same Wi-Fi network +- Both devices have the Synchronize screen open +- Both devices are using the same configuration + +Both devices are connected to the same Wi-Fi network + +For two devices to sync via Wi-Fi, both need to be connected to the same +Wi-Fi network. This Wi-Fi network does not need to have an internet +connection. + +{% hint style=“info” %} For more info on how to connect to Wi-Fi, see +connecting-to-wi-fi.md. {% endhint %} + +- View current Wi-Fi status in Mapeo Mobile +- View current Wi-Fi status in Mapeo Desktop + +View current Wi-Fi status in Mapeo Mobile: + +On the Synchronize screen you can view your device’s current Wi-Fi +status. If connected to Wi-Fi, the name of the network will appear on +the left-hand side of the navy blue bar. +If your device is not connected to Wi-Fi, you will see a “No WiFi” +message with a prompt to open your device’s Wi-Fi settings. + +View current Wi-Fi status in Mapeo Desktop: + +Wi-Fi status for your computer may be displayed at the top of the +Synchronize screen, under the “Available Devices” header. + +If you are currently connected, you may see the name of the Wi-Fi +network and the current strength of the signal. (Eg. FIOS 7S5YS +**QUALITY: 70% ** ). + +{% hint style=“warning” %} In some cases, Mapeo Desktop will not be able +to access your computer’s Wi-Fi information and no Wi-Fi details will be +displayed on the Synchronize screen. This does not mean that your +computer is not connected. +For more on confirming Wi-Fi status from your computer’s operating +system, see connecting-to-wi-fi.md. {% endhint %} + +Both devices have the Synchronize screen open + +Mapeo devices will only appear as available to sync if both devices have +the Synchronize screen open. The Synchronize screen should be kept open +until the sync process is complete. + +See below for instructions on how to open the Synchronize screen: + +- Open the Synchronize screen in Mapeo Mobile +- Open the Synchronize screen in Mapeo Desktop + +Both devices are using the same configuration + +In order for two Mapeo devices to sync, they must be using the same +configuration. A Mapeo device using a different configuration file will +not show up in the list of Available devices on the Synchronize screen. + +{% hint style=“info” %} To learn more about configurations, see +custom-configurations. {% endhint %} + +See below for instructions on how to confirm which configuration is +currently in use: + +- View current configuration in Mapeo Mobile +- View current configuration in Mapeo Desktop + +View current configuration in Mapeo Mobile: + +To confirm which configuration Mapeo Mobile is currently using, tap +Observations list on the home screen, then tap Settings. On the Settings +screen, select Project configuration to view the name and version of the +configuration in use. + +{% hint style=“info” %} For more on how to import a new configuration +file into Mapeo Mobile, see importing-configurations.md. {% endhint %} + +View current configuration in Mapeo Desktop: + +To confirm which configuration Mapeo Mobile is currently using, consult +the white bar at the bottom of the Synchronize screen. + +{% hint style=“info” %} For more on how to import a new configuration +file into Mapeo Desktop, see importing-configurations.md. {% endhint %} + +Restarting Mapeo + +If you have confirmed all of the steps above and the device you are +trying to sync with still does not show up on your Synchronize screen, +try restarting Mapeo on both devices. # I want to create local Wi-Fi +networks + +Creating a local Wi-Fi network is especially useful when it comes to +synchronization since Mapeo allows multiple devices to synchronize with +each other without the need for the internet, simply by using a Wi-Fi +network. Here are two ways to create a Wi-Fi network: + +- With a portable router +- With a smartphone + +With a portable router + +We recommend using portable wireless routers of the TP-LINK type. + +To connect to the router, follow the steps below: + +1. Connect the router to a power source, such as a computer, using the + USB cable. +2. Make sure the router is in 3G/4G mode (there is a button on the side + of the router). +3. On the phones and/or computers you want to synchronize, search for + the Wi-Fi network created by the router. The router has a label + attached to it, with the name of your Wi-Fi network and the + password. + SSID indicates the name of the WiFi Network, in this example, it is + TP-Link_2088 + KEY / PIN indicates the password, in this example, it is 57880457 +4. Enter the password on the cell phones and/or computers you want to + sync. Now they should be ready to be able to sync Mapeo data. + +# With a smartphone + +Creating a hotspot, or portable Wi-Fi area from your smartphone, can be +useful when synchronizing. Especially, if you don’t have access to a +Wi-Fi network or a portable router, you can use a third cell phone to +create a hotspot and create a network to which other devices can connect +and sync. + +{% hint style=“info” %} You cannot create a hotspot and sync at the same +time, so you will need an extra phone to create the hotspot. {% endhint +%} + +To create a hotspot, follow the steps below: + +On the cell phone with which you want to create the hotspot + +1. Turn off Mobile Data on your phone. Details will vary for each + phone, but Mobile Data settings can usually be found in the Quick + Settings menu, which can be accessed by swiping down from the top of + the screen. Click the switch to disable Mobile Data. +2. On the main screen of your mobile, click on Settings +3. Click Portable Wi-Fi hotspot and turn it on using the toggle +4. Click Set up portable Wi-Fi hotspot and edit or review the password + and hotspot name (SSID). You can view the password by clicking View. + +On the phone with which you want to connect to the hotspot + +1. On the main screen of your mobile, click on Settings +2. Click Wi-Fi. Activate it and check the list of Available networks +3. If the hotspot network created does not appear, click Refresh +4. Click on the hotspot network created and enter the password +5. Click Connect. The connection will start shortly + +With this method, you can share your phone’s mobile data with up to 10 +devices using a Wi-Fi hotspot. + +{% hint style=“warning” %} Important note: +Make sure to turn off Mobile Data on the phone that creates the hotspot. + +Your telephone company may charge additional fees for using this +feature. + +Some of these steps only work on Android 9 and later versions. {% +endhint %} — description: Common technical issues — + +🔧 Troubleshooting + +{% hint style=“warning” %} Very important: If you uninstall Mapeo trying +to solve problems, you will lose all data if you have not synchronized +with someone before or you have not created a backup. {% endhint %} + +See additional information and troubleshooting steps for some common +technical issues in the pages below: + +- i-cant-start-mapeo.md + +- mapeo-closes-automatically.md + +- i-have-problems-with-the-gps-in-mapeo + + - gps-is-not-activated-in-mapeo.md + - my-gps-signal-is-very-weak.md + +- i-have-problems-with-the-camera-in-mapeo + + - i-get-a-black-screen-when-using-the-camera.md + +- updating-mapeo-mobile-permissions.md + +- solving-sync-issues + + - connecting-to-wi-fi.md + - creating-local-wi-fi-networks + - with-a-portable-router.md + - with-a-smartphone.md + - the-device-i-want-to-sync-with-does-not-show-up-on-my-synchronize-screen.md + - i-get-an-error-when-i-try-to-sync-with-another-device.md + - i-cant-sync-with-the-sync-file.md + - the-person-i-want-to-sync-with-has-deleted-valuable-data.md + +- sharing-files-between-devices.md + +- saving-and-printing-mapeo-reference-materials.md # I have problems + with the camera in Mapeo + +- i-get-a-black-screen-when-using-the-camera.md # I get a black screen + when using the camera + +Typically, this is because you have not given Mapeo permission to use +the phone’s camera, or the permissions have expired due to not using +Mapeo for a long period of time. To change this, you have to follow +these steps: updating-mapeo-mobile-permissions.md # I can’t start Mapeo + +1. Make sure you have Mapeo installed on your phone or computer. If you + are not clear about the steps to install Mapeo, check: ​ + +- installing-mapeo-mobile.md +- installing-mapeo-desktop.md + +Once installed, you have to click on the Mapeo icon on your cell phone +(Mapeo Mobile) or on your computer (Mapeo Desktop). If despite this, it +does not work, go to the next point. + +2. Reboot your device and try again. + +3. Make sure your device has enough free space available. + +If none of this works, there are unfortunately few solutions: + +a) You can uninstall Mapeo Mobile from your cell phone, but YOU WILL + LOSE ALL THE DATA you have collected so far. You will only be able + to recover them if you have previously synchronized with another + device. + +b) You can contact Digital Democracy using our multilingual + mapping-users chat at Discord. # Saving and printing Mapeo reference + materials + +All content in this guide can be saved in PDF format or printed for use +offline. + +Save a PDF + +To save a PDF, click on the Page actions menu to the right of a page +title and select Export as PDF. + +Choose one of the options from the Export as PDF window: + +- Only this page + Export only the content of the current page +- This page and it’s subpages + Export this page and all of its subpages (only available for pages + with subpages) +- Entire space + Export all pages from the Mapeo Materials guide + +Click on Export. Once your file is ready to be downloaded, click on +Download to save the file. + +{% hint style=“info” %} Please note that when exporting multiple pages, +the export preparation may take several minutes. {% endhint %} + +The resulting PDF file will be saved in your Downloads folder by +default. + +Print a PDF + +Once you have exported a PDF of the desired material, locate the saved +PDF file on your device and double click it to open. Go to File and +select Print. # Mapeo closes automatically + +Unfortunately, when this occurs there are few solutions. + +a) You can uninstall Mapeo Mobile from your cell phone, but YOU WILL + LOSE ALL THE DATA you have collected so far. You will only be able + to recover them if you have previously synchronized with another + device. + +b) You can contact Digital Democracy using our multilingual mapeo-users + chat at Discord. # Updating Mapeo Mobile permissions + +If you didn’t allow Mapeo Mobile access to your phone’s camera and GPS +the first time you opened Mapeo, you won’t be able to include pictures +or GPS information in your collected data. + +To change that, go to Settings on your device, then click on Apps, +Manage Apps and select Mapeo. Click on App permissions and allow access +to Camera and Location. + +# My GPS signal is very weak + +Why does this happen? + +Normally, it happens when there is no good communication between the GPS +and the satellite. There may be one or more factors that cause the +problem: problems with low satellite coverage, being indoors or in +places with a lot of vegetation, not having activated the phone’s GPS, +or damage to the device’s hardware and software, among others. + +How is it solved? + +To solve this problem, we suggest you explore the different solutions, +in this order: + +1. First of all, make sure that you have GPS enabled on your cell + phone. + It will be different on each phone, but GPS or Location services can + usually be found in the Quick Settings menu, which can be accessed + by swiping down from the top of the screen. ​​ ​ +2. Confirm that Mapeo Mobile has access to the GPS. The GPS details + button at the top of the home screen will display a green dot and + the accuracy of the GPS signal: ​ + +{% hint style=“info” %} If you turn on GPS on your device while using +Mapeo, you may need to restart Mapeo for the app to recognize that GPS +is turned on and for it to change the state of the GPS details button. ​ +{% endhint %} + +3. Confirm that the GPS sensors are enabled. For it: + + 1. Click on GPS Details + 2. On the GPS Details screen, make sure that in the Sensor Status + section at the end of each line, it says YES. + 3. In the event that one or more sensors are not activated or + enabled, please check the manufacturer’s manual for your device + to activate it. + +- If you still have a weak GPS signal, try these tips: + +Tips to improve the GPS signal: + +- Locate in clear places or without vegetation. +- In the field, if you have a bad signal, take the phone out of the + case (especially useful for CAD phones, rugged phones, etc). +- Perform a calibration of the GPS sensor. For more information check + this link. +- Validate that the date and time of your device are updated. For + this, follow these steps: + - Open the Settings app on your phone. + - Click System and then select Date and time. + - Click Automatic. If the option is disabled, check that the + correct date, time, and time zone are selected. + - In the event that it fails to update the time and date, turn off + the Automatic date and time option, then manually change the + corresponding time and date. +- Activate the high-precision function in the GPS. For more + information check this link. + +If the GPS signal still does not improve… + +If, despite having tried several solutions, the GPS signal does not +improve, you always have the option of using another phone or GPS device +to identify the GPS data and enter it manually in Mapeo. If the GPS +signal at the time of saving the observation has an accuracy less than ± +10 m, Mapeo will automatically offer you three options. Click MANUAL +COORDS to manually enter the coordinates you want to use. + +You can choose which GPS data format you want to use to enter the +coordinates. This is a useful option if you have a GPS or other phone +device with better GPS signal accuracy. + +Click Save once you have manually entered the coordinates to return to +the Edit Observation screen. + +I have problems with the GPS in Mapeo + +Check these links to solve the most common problems with the use of GPS +in Mapeo: ​​ ​ + +- gps-is-not-activated-in-mapeo.md +- my-gps-signal-is-very-weak.md # GPS is not activated in Mapeo + +To solve this problem, we suggest you explore the different solutions, +in this order: + +1. First of all, make sure that you have GPS enabled on your cell + phone. It will be different on each phone, but GPS or Location + services can usually be found in the Quick Settings menu, which can + be accessed by swiping down from the top of the screen. ​​ +2. Confirm that Mapeo Mobile has access to the GPS. The GPS details + button at the top of the home screen will change from red to a green + dot and the accuracy of the GPS signal + +{% hint style=“info” %} If you turn on the GPS on your device while +using Mapeo, you may need to restart Mapeo for the app to recognize that +the GPS is turned on and change the status of the GPS details button. ​ +{% endhint %} + +3. If the GPS details button at the top of the home screen remains red + , make sure you have given Mapeo permission to use your phone’s GPS. + To learn more, see: updating-mapeo-mobile-permissions.md​ + +4. Confirm that the GPS sensors are enabled. For it: + + 1. Click on GPS Details + 2. On the GPS Details screen, make sure that in the Sensor Status + section at the end of each line, it says YES. + 3. In the event that one or more sensors are not activated or + enabled, please check the manufacturer’s manual for your device + to activate it. ​​ + +- If you have managed to enable GPS in Mapeo but only manage to have a + very weak signal, please visit my-gps-signal-is-very-weak.md # 💡 + Mapeo trainings + +A key piece of a successful Mapeo project is ensuring that participants +have the skills they need in Mapeo and a clear understanding of the +workflows they are expected to perform. It will often be necessary to +run one or more training sessions to cover these aspects. + +Training sessions generally take place at the beginning of a Mapeo +project or when a new participant joins a project. Trainings can cover +different types of content, ranging from a general introduction to the +Mapeo tools and main features, to explaining how Mapeo is used in a +specific project and the workflows that need to be followed when +participating in it. In this sense, trainings can be tool-centered, or +context-centered. Sessions can be virtual or in-person, periodical or +punctual. These aspects of format and focus will depend on the details +of each case. + +Mapeo is designed with a focus on being easy to use to help communities +spend less time learning technical skills, and reduce their need to have +budget and access to outside trainers to get started using Mapeo. The +aim is to increase user and community autonomy. + +Digital Democracy has been delivering many types of information and +training events based on the needs of different groups and communities. +We have documented the content in this section because we believe that +access to good information and training should not be limited to the +relatively small number of training and support requests we are able to +accommodate. With a diversely skilled and motivated team, we hope the +contents shared here will help you deliver a Mapeo training event that +will work well for your community or audience. + +Remember that everyone can learn and train Mapeo and all skill levels of +participants can become Mapeo users in some way. Those who can’t read +and write may be an important part of the project and can also learn to +use Mapeo if demonstrations are tailored to engage them (eg. elders +sharing stories, leading walks, etc.). You will find some tips on this +in the subsections that follow. + +In the subsections below, you’ll find useful resources and information +on how to plan, prepare and deliver training sessions based on your +goals, participants, training etc. + +- defining-goals-and-format.md + - What are the goals of the training? + - Who will be involved? + - What will be the format of the session(s)? +- ****structuring-a-training**** + - best-practices-for-planning-a-training.md + - General training tips when planning a training + - Tips for engaging with participants with various skill + levels + - Tips for virtual events + - structuring-the-agenda-content-and-activities + - Suggestions for different sections of a training event + - Tips on how to train different important features and + workflows in Mapeo + - Available materials and resources for the training event +- ****preparing-equipment-and-supplies-for-a-training**** + - recommended-equipment-and-supplies.md + - In-person events + - Virtual events + - tech-preparation-before-doing-in-person-training.md + - Participants devices + - Trainer devices + - Tech support devices # Structuring a training + +In this section, you will find a collection of best practices, tips, +ideas and resources that you can use when planning and conducting a +training event. From tips on how to engage with participants in an +in-person event to recommendations for virtual events, from suggestions +on how to tackle the different sections of the agenda, to tips and +exercises that you can use to practice different Mapeo workflows. +Moreover, we also have compiled a list of useful presentations and other +resources that you can use during the training. + +- best-practices-for-planning-a-training.md + - General tips when planning a training + - Tips on engaging with participants with various skill levels + - Tips for virtual events +- structuring-the-agenda-content-and-activities + - Suggestions for the different sections of a training event + - Tips on how to train different important features and workflows + in Mapeo + - Available materials and resources for the training event # Best + practices for planning a training +- General tips +- Tips on engaging with participants with various skill levels +- Tips for virtual events + +General tips + +- Mapeo, like many applications, is best learned in with an emphasis + on practice, so plan to include hands-on exercises and simulations. +- Scale event goals and be transparent about expectations. Be + selective and realistic about what can be covered. +- Mapeo tools each have a lot of features and possible uses for + individuals and communities. Having clear priorities will help in + designing a Mapeo training plan that is relevant to learners. Get + clear on participants’ goals in order to incorporate these into the + training plan. + +Tips on engaging with participants with various skill levels + +- All skill levels of participants can become Mapeo users in some way. + Some tasks like collecting data are accessible to new users who are + comfortable using their devices. Other tasks like setting up + customizations, data synchronization, and generating data outputs + may be tasks a user is ready to do after they are comfortable with + the Mapeo interfaces, and understand what kind of information they + are working with. +- If community members who can’t read or write are important to the + project (eg. elders sharing stories, leading walks, etc.), make sure + that use demonstrations are tailored to engage them, so that they + are also able to use Mapeo. +- It is important to present information and instruction at a + vocabulary and skill level that is accessible to participants. +- Newly learned skills can be affirmed by asking participants to share + with their peers what they were able to do using Mapeo. Even if they + are unsure, it’s good to remind them that making mistakes or asking + for help in the learning environment is much better than getting + stuck when alone. +- Be mindful of different abilities and disabilities in the group. + Impaired vision, hearing, dexterity, and mobility, as well as + diverse levels of literacy and language fluency can impact one’s + ability to learn new skills and be a confident Mapeo user. Mapeo + trainers are encouraged to use accessible training techniques and + support learners with their device’s accessibility feature settings + and where possible, access specialized equipment. + +Tips for virtual events + +- It is always better to use virtual platforms with whom participants + are already familiar or to separate dedicated training time to train + them on the use of new platforms. +- Mapeo, like many applications, is best learned in with an emphasis + on practice. You can promote this even in virtual events. +- If you use Zoom, you can use breakout rooms, polls, and other tools + to make the session more interactive. +- Make sure to use visual materials to share the content in different + formats (oral, visual, etc.). You can find some useful visual + materials in additional-references.md +- Use screen sharing software and connections to make demonstrations + of Mapeo on your smartphone and computer +- Pre-recorded videos of demos are recommended to have on hand in the + case that live demos are not working well* + - Consider that it can be very demanding on your computer’s video + card to participate in a live video conference while doing a + screen share and local screen mirroring. This can often affect + the computer’s capacity to perform well. Also, most software + will be slower and less responsive in this context and Mapeo is + no exception. + - Any WiFi-based screen mirroring tool will prevent Mapeo from + being able to use Mapeo’s synchronization via WiFi. It is highly + recommended to prerecord this on both devices used. +- We encourage you to sample content that can be seen, recorded or + captured by attendees. # Suggestions for the different sections of a + training event + +A training activity generally begins with an opening and introduction, +followed by demonstrations and walkthroughs, a practice time, and time +for questions and discussion. When possible, it also can include a +demonstration by the participants. Here you will find some tips for +these different sections: + +Opening and Introduction + +Take time for making an appropriate and meaningful opening that is +directed by local leaders. Mapeo is a tool designed for communities to +use in their unique contexts. What is shared in the opening can help +participants contextualize the possible application and impact of their +use of Mapeo. + +Participatory introductions are an opportunity for the trainer to hear +from participants why they are participating in a Mapeo training. This +becomes a collective affirmation of the effort everyone is giving in +sharing the learning process. + +When introducing or reintroducing Mapeo to a group, give concrete +examples from other places about how Mapeo works or helped a community +achieve their goal, followed by goals and expectations about what the +participants will be learning about Mapeo at the current event. Allow +time in this section for questions or concerns to make sure that the +agenda is going to work. + +For events that will include hands-on practice with Mapeo, take a moment +to remind participants to charge their devices. + +Demonstration + +Show a user task or workflow once with everyone watching first. + +Be specific when describing what you want to do and what you have to +click/tap to do it. Often describing the shape, color, location, and +when available, a label of a button in a demonstration will make it +easier for participants to recall more options for interacting with +Mapeo. + +You can also use some support for the demonstrations, such as using a +slide or a printed demo to show people on, or if you only have one +device, you can walk around so everyone sees it. + +Walkthrough + +Have all participants’ equipment ready to use and distributed to +participants. (see #participant-devices ) + +Ask leading questions - I want to do x, Where should I click/tap? + +Having a dedicated support person to help participants resolve equipment +issues, and walk around the room to offer support if it’s an in-person +training, is essential for maintaining a flow during instructional time. + +Practice + +Make use of consistent learning teams. Groups of 3-6 people generally +work best for Mapeo Mobile, groups of 2-3 people work well for Mapeo +Desktop. You will find some ideas for exercises in +tips-and-suggested-activities-for-training-key-features-of-mapeo.md + +Practice time is a good moment for you as a trainer to observe the +participants and get a sense of which processes are harder to follow and +where to dive a little deeper. + +Facilitating Q&A during a workshop + +A lot of questions that come up about Mapeo revolve around design, +possible use cases, and if it has the features needed by the user (check +is-mapeo-right-for-me.md). Depending on the training agenda, your +familiarity with Mapeo, and your access to Mapeo resources, you may be +able to answer these questions when they come up, or document the +questions and return to them at the end or at a different time. + +Equipment issues are often the first issues that arise so provide +adequate time to troubleshoot. + +You can take a look at thisfaqs.md section, where we gathered some of +the most common questions about Mapeo. + +Participant Demonstration + +Newly learned skills can be affirmed by asking participants to share +with their peers what they were able to do using Mapeo. Even if they are +unsure, it’s good to remind them that making mistakes or asking for help +in the learning environment is much better than getting stuck when +alone. + +Mapeo is designed for community-owned data and so it is important that +users are able to see the data on Mapeo and be able to talk about it in +their own words. + +Before finishing the practical part, consider if you want everyone to +delete the data created during the simulation so that it is not mixed +with the project data. + +Evaluation of the event + +Review what was shared or learned in the session and highlight any +reminders about Mapeo tasks that were particularly difficult for the +participants. + +Gather feedback about Mapeo and about how the learning experience went. + +This can be tricky depending on the context. So, here are some practices +that have worked for us: + +- Instead of testing/evaluating skills gained, ask questions about + where participants found pain points with Mapeo, and what could be + improved. This way you can encourage discussion on the most + difficult processes in Mapeo. +- Make questions around the time used to deliver each section + (e.g. did we invest enough time to practice the synchronization + between devices?), to identify which are the things that were more + difficult to follow and require more time and attention in the next + training session. +- Ask the participants to compare things. They might not want to say + that something was bad, but maybe you can come up with a clear + ranking by asking questions like “what was easier to learn, this + aspect or that aspect?” +- Ask how effective the training session has been for them, or how + useful the Mapeo tool and its processes are to them. This also opens + a space to discuss where the focus of the training should be next + time. + +Identify any needed follow-up and how that will happen. + +Closing a training event + +Give that final word to the local leaders that are present. Often during +technical training, local leaders observe and identify obstacles, +behaviors, possibilities, and solutions. They are the best at +articulating the importance of Mapeo in the project and getting specific +about the responsibilities the participants have in maintaining skills +and making the quality of information high. # Structuring the agenda, +content and activities + +In this section, we put together a few suggestions on how to plan the +agenda and different sections of a training, and included some tips and +proposed exercises for training some of the key features and workflows +in Mapeo. + +- suggestions-for-the-different-sections-of-a-training-event.md +- tips-and-suggested-activities-for-training-key-features-of-mapeo.md +- materials-and-resources-available-for-the-training-event.md # Tips + and suggested activities for training key features of Mapeo + +Different features and workflows of Mapeo differ in terms of complexity, +difficulty, and relative importance depending on your project. In order +to help you plan the training activity, we have put together some +reflections on the most commonly used Mapeo workflows and features, as +well as some ideas for exercises that you can do with your group to +practice the specific workflows during a training activity. + +- Collecting data + - 💡 Activity 1 - Collect data with Mapeo Mobile + - 💡 Activity 2 - Create territory data with Mapeo Desktop +- Synchronizing data + - 💡 Activity 3 - Sync data with Mapeo Mobile + - 💡 Activity 4 - Sync data with Mapeo Desktop +- Viewing and editing data + - 💡 Activity 5 - Filter observations in Mapeo Desktop +- Generating outputs and exporting data + - 💡 Activity 6 - Share observations with Mapeo Mobile + +Collecting data + +- Normally it is a quick to learn workflow. +- It can be time-consuming to get an agreed understanding of the use + of categories and the level of detail that is needed for the Mapeo + data. Having dedicated time to discuss this as a group after is + recommended. + +💡 Activity 1 - Collect data with Mapeo Mobile + +Platform: Mapeo Mobile + +Goal: To get familiar with data collection. + +Format: Individual hands-on exercise + +Expected time: 10-30 minutes + +Description: Participants create observations, include details and +pictures, and practice editing and deleting observations. + +Support guide section: creating-observations.md + +Steps for each participant: + +1. Create 5 observations, each belonging to a different category. Fill + in the details for all the observations, and include 1 photo for the + first one, 2 photos for the second one, and so on. +2. Create a 6th observation, fill in the details and add a picture. + This time, delete the picture before saving the observation. +3. Edit the category of the first observation you created and save the + edits. +4. Delete the last observation you created. + +💡 Activity 2- Create territory data with Mapeo Desktop + +Platform: Mapeo Desktop + +Goal: To get familiar with the creation of territory data with Mapeo +Desktop. + +Format: Individual hands-on exercise, computer based, internet (or +offline map) dependent + +Expected time: 15 minutes - 1 hour - depends how much you get into it! + +Description: Participants navigate to an area they know well and then +practice drawing points, lines and areas (polygons) on the map and +classifying them with information. + +Support guide section: creating-and-editing-territory-data.md**** + +Steps: + +1. Navigate to an area on the map that you know well, for example your + community or the area you live in. +2. Choose a background online map which has good satellite detail of + the area (eg. bing) and zoom in so that you can see things close up + and editing becomes possible. +3. What can you identify? Can you see any houses, buildings, created + structures (football pitches/gardens) or natural features + (mountains/lakes/rivers) that you recognise? +4. Use the editing tool to create some points on the map of things that + you know - such as your home or school or an important location. Do + the same for some line features (paths, roads, rivers, pipelines) + and some areas (garden, village limits, forested area etc). +5. Choose categories for each feature you create from the default list, + and add any details you wish. +6. When you have created at least 6 features (a mixture of points, + lines, areas) save your edits. +7. Then go back and see if you can delete any, and edit the + information. +8. Change the background map so that you have a sense of what different + options you have. + +Synchronizing data + +- Synchronizing is the most difficult feature to fully understand + because it is an offline feature that is not typical for most + internet-dependent consumer-based technology. Peer-to-peer (P2P) can + be very abstract to talk about and is more intuitive to understand + when in action. +- This functionality has a relatively steep learning curve for new + users. +- It is best to do it early in a training agenda in case more time is + needed or the agenda requires this to be repeated towards the end of + the event. +- This is essential for understanding how data is aggregated on phones + and/or computers with Mapeo when used in a community GIS data + project. +- Hands-on exercises are the best way to show and clarify that any + edits or deletions made in the database on any device, will be shown + on the other devices after syncing. +- Having participants practice data sharing and data syncing is useful + to visually illustrate the different behavior of the data in these + two processes. +- This is the most technically demanding module, and it requires + careful preparation. (See #participant-devices) +- Pay extra attention to synchronization via Wi-Fi equipment + requirements (See#synchronizing-via-wi-fi). +- For Mapeo Desktop, take time to get an agreement on file naming + conventions. + +💡 Activity 3 - Sync data with Mapeo Mobile + +Platform: Mapeo Mobile + +Goal: To get familiar with data syncing on Mapeo Mobile and understand +how data flows, and the need for having clear protocols around syncing +to make sure data isn’t lost. + +Warning: In this exercise, ALL Mapeo data will flow between devices that +sync. If there is Mapeo data on one of the devices that shouldn’t be +shared with other participants, you need to reformulate the exercise. + +Format: 2-4 person groups, hands-on exercise & group discussion + +Expected time: +Part 1: 10-30 minutes +Part 2: 10-30 minutes + +Description: Participants practice syncing with other teammates, and +understand the behavior of synced data. + +Support guide section: wifi-sync.md**** + +Steps: + +Part 1: + +1. Divide the group into smaller groups of 2-4 people. +2. In small groups, participants sync the information they collected + with each other. +3. View the data received. +4. Try to edit the received data. + +Part 2: + +1. One participant in each subgroup deletes one of the observations + they created in the previous activity for training purposes. +2. A second participant from each group syncs with the participant that + deleted the observation. +3. The second participant verifies that the observation has been + removed from the database after syncing. +4. The remaining members of the subgroup sync with the two participants + with the edited database to confirm that changes made will affect + all devices after syncing. + +💡 Activity 4 - Sync data with Mapeo Desktop + +Platform: Mapeo Desktop (& Mapeo Mobile if desired) + +Goal: To get familiar with data syncing on Mapeo Desktop, and understand +how data flows and the need for having clear protocols around syncing to +make sure data isn’t lost. + +Warning: In this exercise, ALL Mapeo data will flow between devices. If +there is Mapeo data in one of the devices that shouldn’t be shared with +the participants, you need to reformulate the exercise. + +Format: 2-4 people groups, hands-on exercise & group discussion + +Expected time: +Part 1: 10-30 minutes +Part 2: 10-30 minutes + +Description: In subgroups, Wi-Fi sync and sync files will be explored. +Discussions around syncing methods, naming conventions, and backup +creation can take place. + +Support guide section: synchronizing-data-with-mapeo-desktop.md**** + +Steps: + +Part 1: Wi-Fi sync + +1. Divide the group into smaller groups of 2-4 people. +2. In small groups, participants sync the information they collected + with each other. They can sync using both Mapeo Mobile and Mapeo + Desktop. +3. View the data received. +4. Try to edit the received data, and realize that, unlike in Mapeo + Mobile, they can edit the received observations in Mapeo Desktop. + +[For more exercises on data syncing, see 💡 Activity 3] + +Part 2: Sync files + +1. Continue in groups of 2-4 people. +2. In Mapeo Desktop, each subgroup creates a sync file. When saving the + file, you can have a discussion about naming conventions for sync + files. +3. Each subgroup shares the sync file with the other subgroups (e.g. by + email, or using a USB stick). +4. In Mapeo Desktop, each subgroup syncs with the received sync files. +5. View the data received. +6. Discuss the use of this alternative way of syncing and its utility + as an option to create backups. + +For more on syncing with a file, see synchronizing-with-a-file.md. + +Viewing and editing data + +- This is generally a workflow that is quick to learn. +- It’s a great opportunity to discuss the quality of data. +- If the training event is more than one day, it is recommended to + maximize full exploration of filtering possibilities and potentials + for outputs. + +{% hint style=“info” %} If training is just going to be one day, having +sample data collected on a few different days before the event will make +it possible for participants to practice using the filter by date +feature. {% endhint %} + +💡 Activity 5 - Filter observations in Mapeo Desktop + +Platform: Mapeo Desktop + +Goal: To get familiar with all the filtering options offered by Mapeo +Desktop in Observations mode. + +Format: Small group hands-on exercise & group discussion + +Expected time: 10-30 minutes + +Description: In subgroups, participants explore the different filtering +options in Mapeo Desktop to view their data and extract some conclusions +from the existing database. + +Support guide section: #filter-observations + +Steps: + +1. Divide the group into smaller groups of 2-4 people. +2. In Mapeo Desktop, each subgroup uses the Filter by date option to + filter observations collected under relevant periods of time. +3. In Mapeo Desktop, each subgroup uses the Filter by category option + to filter observations collected from specific categories - first + filtering by one category, then filtering by more than one category, + and finally excluding only one category from the view. +4. In the bigger group, representatives from each subgroup share the + experience with the rest of the group. +5. In the bigger group, begin a discussion on the types of analysis + that are possible when viewing filtered data. + +- Editing & deleting on Mapeo Mobile is best demonstrated after + synchronization so that participants can see how editing permissions + work and understand their responsibility to the community project. + +{% hint style=“info” %} Check out the proposed 💡Activities for syncing +edited/deleted data. {% endhint %} + +Generating outputs and exporting data + +- Mapeo Mobile and Desktop are designed very differently in terms of + generating outputs because of typical user contexts. In both cases, + it is important that there is a clear distinction between generating + an external data output, and data synchronization. +- Mapeo Mobile currently only creates one external output - Mobile + alerts shared via messaging apps - designed for time-sensitive + information that can help expedite crisis response to an incident. + This can be quick to learn if the participants are already familiar + with the use of other involved tools, such as email or Whatsapp. + +💡 Activity 6 - Share observations with Mapeo Mobile + +Platform: Mapeo Mobile + +Goal: To get familiar with external data sharing options on Mapeo Mobile + +Format: Individual hands-on exercise + +Expected time: 5 - 15 minutes (If the used messaging apps aren’t +installed in the smartphones, plan for a longer time) + +Description: Each participant explores the different options to share +selected observations from Mapeo Mobile with other people. + +Support guide section: sharing-data-externally.md**** + +Steps for each participant: + +1. Each participant shares one observation via Whatsapp/Signal to the + participants’ Whatsapp/Signal group. +2. Each participant shares one observation with the trainer via email. +3. You can discuss best practices around sharing observations via + Mobile alerts. + +- Mapeo Desktop allows the creation of several types of outputs (PDF + reports, CSV, SMART CSV and GeoJSON files, and web maps). Read more + about it inexporting-and-sharing-externally.md. You can discuss + which of these options are a priority to learn for the participants + considering the goals and needs of the project. Depending on the + goals, the skills, and the available time, you can also focus on how + to use the data exports on other platforms such as Google Sheets, + Excel, SMART, QGIS, ArcGIS, etc. # Materials and resources available + for the training event + +We have prepared a list of resources that can be useful for Mapeo +trainings. Check it out here: additional-references.md. They range from +short illustrative videos giving an overview of Mapeo, to Google sheet +slides that you can adapt for your training activity, and templates for +creating training resources on textiles to use in outdoor training +events under any weather conditions. + +Moreover, you can also use the sections and content of this Mapeo +Support Materials site as a menu of possible content and as a support +resource when having questions on specific features and workflows. +Remember that this guide has also a faqs.md section, where the most +common questions are answered, and a troubleshootingsection to help +solve the most frequent Mapeo issues. + +Training events can be run by walking through each topic of interest in +the Complete Reference Guide on this site. However, it is not as +engaging as a participatory event, where the trainer fully understands +the topics of interest and tailors activities around them. # Preparing +equipment and supplies for a training + +Before a training event, lots of energy and time go into preparing the +equipment and supplies needed for the event and ensuring that the +technical preparation is done in advance. The checklists contained in +this section can be helpful for working through these steps. + +- recommended-equipment-and-supplies.md + - In-person events + - Virtual events +- tech-preparation-before-doing-in-person-training.md + - Participants devices + - Trainer devices + - Tech support devices # Recommended equipment and supplies + +We have compiled a list of items that are very useful to have when +organizing in-person and virtual events. + +In-person events + +- Make sure you don’t run out of power! Some important items are: + - Power strips (enough to accommodate participants’ needs) + - International voltage and plug adaptors + - USB charging hubs + - Portable USB chargers + - Surge protector +- Some equipment to practice synchronization via WiFi: + - For small groups of 5 or fewer - access to 1-2 routers + - For group 6 or more - portable routers, power sources, and + charging cables. +- For file transfer, device storage, and troubleshooting, make sure + you have: + - OTG adaptors for troubleshooting (MicroUSB and USB C are common) + - External hard drive with space + - USB sticks with space +- For demonstration outdoors or in low-tech spaces you can use: + - Tabloid (11”x17”) printouts of Mapeo screen or presentation + slides and a wall or laundry line to display them. We recommend + you laminate them to make them more resistant to use and weather + conditions + - You can also use big textile prints - they are easy to carry + around, can be used rain or shine and you can use Velcro pieces + to make them more interactive. + - A clean dry surface with shelter from rain or sun to stage + equipment + - For Mapeo Desktop training, tables and seating where + participants can work in pairs +- For demonstration indoors or in spaces where projection is possible, + you might need: + - Projector and power cable + - Projection surface in a shaded or dark area. White walls are + best. White with fabric backed with black light-blocking fabric + works well hung properly. + - Video cables and adapters + - For demonstrations with smartphones, make sure your device has + video projection capabilities. This is an advanced device + feature and requires a video signal adaptor +- Other workshop supplies that are handy: + - Notepad and thick marker (for organizing teams and activities) + - Masking tape and utility tape + - Spare notebooks and pens for participants + - If expected, printed guides, protective case folders, and labels + +Virtual events + +For demonstration in virtual events: + +- Screen sharing software and connections for devices demonstration +- Sample content that can be seen, recorded, or captured by attendees +- Pre-recorded videos of demos are recommended to have on hand in the + case that live demos are not working well. + - Consider that it can be very demanding on your computer’s video + card to participate in a live video conference while doing a + screen share and local screen mirroring. This can often affect + the computer’s capacity to perform well. Also, most software + will be slower and less responsive in this context and Mapeo is + no exception. + - Any WiFi-based screen mirroring tool will prevent Mapeo from + being able to use Mapeo’s synchronization via WiFi. It is highly + recommended to prerecord a demo of this process on both devices + used. # Tech preparation before doing in-person training + +To minimize the risk of unexpected tech issues spoiling your agenda and +consuming valuable training time, make sure to prepare all the devices +involved in a training event. + +Here there is a checklist to review before the event: + +Participant devices + +Ensure that: + +- ☐ The operative system is updated +- ☐ The correct language is set up on phone and within Mapeo +- ☐ The device passwords are known +- ☐ The device is fully charged +- ☐ You have added the needed files to the device’s memory (Mm: SD or + Internal memory, Md: USB) + - ☐ Create a folder with needed files and guides. (i.e Mapeo for + Community [Name]) + - ☐ The most important Mapeo files needed for training are the + latest installation files (they can have different formats, such + as .apk, .exe, . dmg, etc.) + - ☐ If a customized configuration and maps are being used in the + Mapeo project, include that in a clearly labeled subfolder (.i.e + Mapeo Configuration or Community x Configuration) + +Trainer devices + +On top of the checklist for “participant devices”, make sure of the +following: + +- ☐ Presentation files in dynamic and static formats are loaded on + your device. + +Tech support devices + +{% hint style=“info” %} Coming soon {% endhint %} # Defining goals and +format + +Training plans are naturally unique for every participant group, and +Mapeo training sessions can go in many different directions depending on +the trainer’s strengths and participants’ needs. Working through the +questions below can be a good first step in defining your training plan. + +What are the goals of the session? + +The goals of a Mapeo training often fall under one the umbrellas below, +but of course your goals will vary depending on your team’s priorities +and needs: + +- Tool-centered: Provide a general overview of the Mapeo tools or + focus on specific Mapeo features. For example, training on how to + collect observations, or on how to synchronize Mapeo Mobile with + Mapeo Desktop +- Context-centered: Train on the workflow and concrete tasks that + users are expected to perform in a specific context or project. For + example, training to the monitors on the workflow they are expected + to carry out (e.g. collect observations with Mapeo in the case of X + or X, send an alert to X person via the X app, sync with X person, + etc.) + +Who will be involved? + +When planning a training session, it’s important to know who the +participants will be and what their interests, needs, and skills are. +Mapeo can be used by participants of all skill levels if training +sessions are tailored appropriately. You can find tips on this on +#tips-on-engaging-with-participants-with-various-skill-levels. + +Participants’ goals are also important to get clear on. With good +communication, the participants’ realistic goals become the goals for a +Mapeo trainer and are incorporated into the training plan. + +It is the responsibility of the trainer to design and adapt sessions +based on the participants, to ensure they are able to gain the skills +and confidence needed to accomplish the necessary tasks in a mapping or +monitoring project. + +What will be the format of the training? + +Mapeo training events can be in-person or virtual. Each has its benefits +and limitations, which must be considered when deciding the goals, +participants, and scope of the activity. For example, virtual events +allow participants to join from anywhere with an internet connection, +while in-person training sessions allow for better hands-on +demonstrations and exercises with participants. + +- IN-PERSON training event + - Strengths + + - Mapeo is an offline-first tool that makes it possible for + people in remote areas with limited or no internet to + collect and exchange data, and these offline workflows are + much better trained in person in the same context. + - A safe, friendly, and relaxed space with ample opportunity + for peer learning can be easier to foster in person than in + virtual contexts. + - It is much easier for a trainer to observe participants in + person in order read the room, identify which aspects are + harder to learn, and change plans if needed. + + - Weaknesses + + - Normally it is more expensive, as it has to gather people + from different places. + - Depending on the context, it might be impossible to do this + given time or logistics required, or because of location of + the trainer, etc. +- VIRTUAL training event + - Strengths + - It allows the involvement of participants located in + distinct areas. + - It tends to be cheaper than organizing an in-person + training. + - Weaknesses + - Virtual training events have the challenge of requiring that + participants have knowledge of virtual learning platforms. + If you end up organizing a virtual session, remember that it + is always better to use the virtual platforms that are + already known by the participants or to separate dedicated + training time to train them on the use of these new + platforms. + - It is more difficult to read the room and have a sense of + how people are following the session. + - The Internet signal can be weak in some areas, so expect + sudden losses of connection by participants joining from + rural areas. + - It can be more challenging to maintain momentum, have people + work together, and remain focused. Participants’ ability to + remain focused on a computer screen for training is likely + less than in a face-face meeting. # Overview of Mapeo + Desktop Territory mode screen + +[] + +(Clockwise rotation from left to right): + +- On the Mapeo modes panel, you can select the mode of Mapeo Desktop + that you want to access. Here, the Territory mode is highlighted. + +- The Point, Line, and Area buttons are for creating data and will be + available when you are sufficiently zoomed in for editing. + +- To edit, you must zoom into the area where you want to create data. + +- Use the Undo and Redo buttons to go back or forward a step. + +- Save your edits. + +- Export territory data to a .GeoJSON file. + +- + Zoom in or + Zoom out on the map. + +- Use the Background map window to select background map layers. + +- The Map Data window can be used to turn map layers on and off on the + map. + +- The Issues window shows you if any of your current features being + edited have any issues, such as a missing category. + +- Click Bug report if you are online and want to report a bug on + Github. + +- The spatial coordinates at the location of the cursor / mouse. + +- The background map might be an online or offline map, depending on + your set-up and configuration. + +- When you are editing data, the list of categories or details of your + data will appear here. + +- Details of the version of Mapeo which you are using. # Glossary & + quick reference sheets + +- Glossary of Mapeo related terms + +- Overview of Mapeo Desktop Territory mode screen # Glossary of Mapeo + related terms + +- APK + +- Application (app) + +- Background map + +- Background map package + +- Bluetooth + +- Bug + +- Category + +- Compressed file (.zip) + +- Configuration + +- Coordinates + +- Crowdin + +- Data + +- Device accessibility feature settings + +- Feature + +- File extension + +- Folder/Directory + +- GPS + +- Keyboard + +- Observation + +- Offline + +- Online + +- Peer-to-peer + +- Play Store + +- Portable battery + +- Project key + +- Router + +- Synchronization + +- Sync file + +- USB drive + +- Virus + +- Wi-Fi network + +APK + +APK files, also called here “Installation files (.apk)”, have a .apk +extensionand can be used by Android phones to distribute and install +mobile apps. For example, you can download the Mapeo Mobile APK file to +install Mapeo on Android smartphones offline. Learn more about it in +#install-from-apk-file + +Application (app) + +An app is a type of software that can be installed and used on a +computer, a smartphone, or on another electronic device and has been +designed for a specific function. For example, Mapeo Mobile is an app +for Android smartphones and Mapeo Desktop is an app for computers. Both +have been designed for and with earth-defenders to map and monitor their +lands. Some very famous apps that have been designed for communication +purposes are Whatsapp, TikTok, and Zoom. + +Background map + +In a Mapeo project, they are the maps used in the background of the home +screen. In Mapeo Mobile, background maps are used to show users their +current location and that of the collected data. In Mapeo Desktop, they +are used as a background in the map screen for displaying data +collected, created, or imported to Mapeo. Background maps can be +customized (see more about it in custom-base-maps) and usually, they +include geographic elements such as rivers and mountains, as well as +some political and urban elements such as borders, cities, roads, and +others. + +Background map package + +A Mapeo background map package consists of several folders and files +that, used at the same time, create a background map. They are often +shared as a compressed file(.zip). + +Bluetooth + +It is a wireless technology used for exchanging databetween devices over +short distances (less than 10 meters) using radio waves. Currently, most +smartphones and computers offer this option, but you might need to +activate the **** Bluetooth in your device before sharing or receiving +data. Bluetooth can be a useful way to exchange files in +offlineconditions. For example, even with an internet connection, you +can share a Mapeo configurationfile (.mapeosettings) via Bluetooth with +other devices. + +Bug + +In this context, a bug is an error or flaw in the software that causes +it to produce an unexpected result, or to behave in unintended ways. We +call “debugging” the process of finding and correcting bugs. Mapeo is +under development and it may have some bugs that need to be fixed. If +you ever encounter unexpected or incorrect behaviors, you can share them +with us via Discordor Github, so that we can debug them. + +Category + +In a Mapeo project, categories are the different groups or classes in +which you can classify the datacollected or created using Mapeo. For +example, when you create a new point on the map, you can choose among +categories such as “house”, “tree”, “hunting site” and many others to +classify it. Each category is represented by a different icon and has +different questions attached to it. By default, Mapeo comes with a set +of categories, but they can be customized. For more information on +customization, see custom-configurations. + +Compressed file (.zip) + +Compressed or zipped files and folders are commonly used because they +take up less storage space than uncompressed files and can be +transferred to other computers more quickly. They often have an .zip +extension(they can sometimes have an .7z or .rar extension as well) and +can be easily created and unzipped. In Mapeo, we use compressed folders +to share background map packages, since they are composed of many files, +and it is easier to share them as a folder. + +Configuration + +In Mapeo, the configuration of a project determines which categories, +icons, and questions users see when they are collecting data. For each +data point collected with Mapeo, users can select a category to classify +the point and may answer questions or respond to prompts to provide more +detail about what is being documented. When you install Mapeo, it comes +with a default configuration that includes general categories and +questions for territory mapping and monitoring. Mapeo offers the option +to create custom configurations to fit the needs of specific projects. +For more information on customization, see custom-configurations. + +Coordinates + +[Content coming soon] + +Crowdin + +It is a platform that helps companies and organizations to translate +their software. We use the Crowdin platform to translate Mapeo into +different languages. It is free to create an account on Crowdin and +anyone can contribute translations to Mapeo for new or existing +languages. For more information, see translating.md + +Data + +It refers to information in digital form that can be transmitted or +processed. In Mapeo, the word “data” is used for both +observationscollected by Mapeo Mobile (observation data) as well as +lines, points, and polygons created using Mapeo Desktop (territory +data). Data can be organized and stored in databases and be accessed +electronically. + +Device Accessibility Feature Settings + +Most phones and computers have an Accessibility settings menu to help +users change the settings of their devices to adapt to their needs. For +example, there are often features for blind or low-vision computer +users, such as Text-to-speech or Enlarged cursors, icons, and text. +There are features for deaf or low-hearing computer users, such as +Closed-captioning to convey audio information into a visual form or Mono +audio, and there are also features for limited-mobility computer users, +such as Keyboard shortcuts. + +You can read more about the Accessibility options on a laptop (here) and +on a smartphone (here). + +Feature + +We use the word features to describe things that appear on the map, such +as rivers, buildings, or points of interest. In Mapeo Desktop - +Territory mode, you can create features in the form of points, lines, +and areas. + +File extension + +It refers to the letters appearing at the end of a file’s name, after +the dot. It indicates the type of file. Common examples are .doc for +Word documents, and .pdf for PDF files. In a Mapeo project, some files +have very uncommon extensions, such as .mapeosettings for the +configurationsand .mapeodata for sync files. + +Folder/Directory + +[Content coming soon] + +GPS + +The GPS acronym stands for “Global Positioning System”, which is a +satellite navigation system that allows determining the ground position +(or coordinates) of an object. When we here talk about a GPS device, we +are referring to a portable tool that allows gathering information on +the user’s current position, allows saving specific locations as points +as well as tracks of the paths traveled. Most smartphones have a GPS +feature that gathers the user’s current position. This feature normally +appears under the names GPS or Location. This is what Mapeo Mobile uses +to gather the coordinates of a point when creating a new observation. In +Mapeo Mobile, the accuracy of the GPS signal received by our smartphone +is shown with a ±number of meters (e.g.), and it refers to the margin of +error of the given coordinates. The bigger the number, the less accurate +the GPS signal is. + +Keyboard + + ----------------------------------------------------------------------- + Keyboard in Windows (credits: image from finallylearn.com modified by + Digital Democracy) + + ----------------------------------------------------------------------- + + : Keyboard in Windows (credits: image from finallylearn.com modified + by Digital Democracy) + + ----------------------------------------------------------------------- + Keyboard in Mac (credits: image from finallylearn.com modified by + Digital Democracy) + + ----------------------------------------------------------------------- + + : Keyboard in Mac (credits: image from finallylearn.com modified by + Digital Democracy) + +Observation + +In a Mapeo project, an observation refers to a point on the map +collected by Mapeo Mobile. It is based on a geographic location (it has +coordinates) and can have associated photos, notes, and other details. + +Offline + +Not connected to the internet. + +Online + +Connected to the internet. + +Peer-to-peer: + +Also called P2P, it refers to a databaseor network that connects all +different devices participating in a project, such as cell phones or +computers. This is the type of database used by Mapeo and it allows +users to transfer data to other users offline, and also allows several +users with computers or smartphones to all work on the same dataset and +share edits. For more on this, read peer-to-peer-and-mapeo-sync.md + +Play Store + +Also called Google Play, or Google Play Store, it is the official app +store for Android and Chrome OS devices. There you can browse and +download many applications, including Mapeo Mobile. Some of them are +free, like Mapeo, and others are at a cost. You can access the Play +Store space from any Android and Chrome smartphone by clicking on the +Play Store icon n your device. + +Portable battery + +It is a form of portable power supply that provides charging for +smartphones, tablets, and other devices. If you plan to use Mapeo and +you won’t have access to a charger and an electrical outlet (e.g. if you +are on a patrol or you are in the woods), it’s good to take a +fully-charged portable battery with you, so that you can recharge your +device if needed. + +Project key + +In Mapeo, a project key is a random cryptographic string of characters +that prevents unwanted devices from getting access to your dataand +allows you to synchronizedata with your teammates. It offers more +security since synchronization will only happen between Mapeo devices +using the same project key, ergo, participating in the same project. + +Router + +A router is a device that is designed to receive, analyze, and forward +datapackets between networks. In an offlinecontext, you can use a +portable router to create a Wi-Fi internet-free network to which devices +can be connected and share data with each other. For example, by using a +network created by a portable router, Mapeo allows synchronizingdata +between devices anywhere, without the need for an internet connection, +as long as the devices are connected to the same network. + +Synchronization + +In a Mapeo project, synchronization is a process in which information is +shared directly between different devices, and each device receives and +shares data. In this non-hierarchical process, all devices that +synchronize end up having the same information, and changes made on one +device will be reflected on the other devices after syncing. To know +more about it, visit peer-to-peer-and-mapeo-sync.md + +Sync files + +It is a type of file created in Mapeo Desktop that allows the +synchronizationof Mapeo databetween computers. It has an .mapeodata +extension and, similarly to synchronization via Wi-Fi, it uses a two-way +sync method. To learn more about how synchronization works, see Broken +link + +USB drive + +Also called USB flash drive, is a small datastorage device with an +integrated USB interface. You can connect it easily to most computers, +and many smartphones (you might need an adapter). It is rewritable and +very useful to transfer files from one device to another or to create +backups. For more information on how to transfer data using a USB stick, +visit Sharing files between devices in troubleshooting. + +Virus + +A computer or smartphone virus, similar to a flu virus, is designed to +spread from device to device and causes problems, often impeding the +proper functioning of a file, a program, an app, or the device itself. + +Wi-Fi network + +It is a wireless connection that’s shared with multiple devices via a +router. If the router is connected to an internet modem, your Wi-Fi +network would have internet. Otherwise, it would be an offline network. +Even using an offline Wi-Fi network, Mapeo allows you to synchronizedata +with other Mapeo devices connected to the same network. + +Introduction + +Mapeo is a free, easy-to-use, open source set of tools for collecting and mapping information. + +Mapeo was built by Digital Democracy with and for earth defenders to +easily document environmental & human rights information and to collect +data about their land. It was designed to work in entirely offline +environments, is highly customizable, and built on a decentralized +peer-to-peer database that allows communities to own their own data. + +[Mapeo used to document illegal activities in Northern Ecuador, +supported by Alianza Ceibo and Amazon Frontlines.] + +About this Guide + +This site provides an introduction to the Mapeo tools and a collection +of training & technical resources to support Mapeo users. + +The site is divided into the following sections: + +- Overview + Basic information about the Mapeo tools +- Quick Start Guide + Instructions for installing and testing Mapeo’s default + functionality +- Complete Reference Guide + A complete collection of resources on planning & implementing + projects using Mapeo and customization of the tools + +Use of this guide + +Digital Democracy would like both Mapeo and the Mapeo reference +materials we develop to help communities find ways to support autonomy, +accesibility and collaboration in their projects. We know that people +accessing this online resource will have diverse interests, goals, +needs, and technical literacy. For this reason, there are a variety of +paths to access information and levels of details users may be looking +for. All pages in this guide can also be saved in PDF format and printed +for use offline. + +Feel free to make use of these resources under the creative commons +license terms: Attribution-NonCommercial 4.0 International. + +Translation +We strive to make our tools & resources accessible and available to +communities in their local languages. If you’d like to contribute to +translating this guide, please see the section on Translating Mapeo to +learn how to get started. + +Open Source Development + +Mapeo and all of Digital Democracy’s technical development is open +source. Visit the FOR DEVELOPERS section for more information. + +Mapeo is a project of Digital Democracy, a non-profit organization that +partners with earth defenders to co-develop technology for social +justice. For more information on Digital Democracy, and how to support +our user-centered co-development process visit our website. # About +Mapeo + +Mapeo is a free, easy-to-use set of tools for collecting and mapping information. + +Mapeo was co-designed and developed with Indigenous communities who face +threats to their land such as illegal gold mining, oil contamination and +poaching. It was built to support frontline groups to document these +activities in order to take community action against them, report key +information to authorities, file lawsuits, launch media campaigns, or +create maps for land claims. To learn more about how Mapeo is currently +being used, see how-mapeo-is-being-used.md. + +Mapeo is open source software that benefits from continued feedback from +our users across the world. + +Key features of Mapeo + +- Simple to use and learn + ****Even if you have never used a smartphone phone before, you can + learn to collect data, GPS points and photos with Mapeo Mobile in a + few hours. Mapeo Desktop does require some computer skills, but has + a simple interface with a limited number of features. For more + complex analysis or mapping work you can export your data to other + tools. The simplicity of the tools helps support wide community + involvement and ownership of projects. + +- Works in completely offline environments + All data collected or created with Mapeo is stored directly on your + device in Mapeo’s embedded database, without the need for an + internet connection or centralized server. Users of Mapeo Mobile and + Desktop can synchronize or exchange data over a local Wi-Fi network. + The data never leaves your local Wi-Fi network and does not require + an internet connection. Mapeo Desktop can also exchange information + via a file using a USB drive. + +- Uses a peer-to-peer database + All the data you collect using Mapeo is stored locally on your + device, not on a server or on the internet. When you synchronize + with other Mapeo users in your project, you each get a copy of the + data that each person has collected, so every device ends up with a + complete copy of all the data in the project. + +- Highly customizable + You can customize the language, maps and information you collect. + You can add detailed offline maps of your area, and change the icons + and questions used for data collection. Mapeo has been translated + into a number of languages already and anyone can add more. + +- Secure, unfalsifiable data + All data collected with Mapeo has encrypted logs that can be + verified for authenticity. Similar to a blockchain, data is secured + by cryptographic proofs, so you can verify that no record in the log + has been changed or tampered with. Private projects can be created + using secure project keys which limit who one can synchronize data + with. # Peer-to-peer & Mapeo sync + +Mapeo’s peer-to-peer database + +Unlike traditional apps where all the data is stored on a central server +(in the cloud or in an office), the Mapeo database is integrated into +the application on your device, and every device (smartphone or +computer) participating in your project can have a copy of all the data. +This is called a peer-to-peer database. We made this choice so that +Mapeo can work entirely offline and does not require the user to set up +any database or machine for storing data. + +This peer-to-peer database allows users to transfer data to other users +in the field without internet, and several users with computers or +smartphones can all work on the same dataset and share edits. + +Main characteristics: + +- Data ownership and control + Data collected with Mapeo is stored directly on the devices used for + data collection and can be shared with other smartphones or + computers that participate in the same project. This way, the + information does not exist solely on one device. No one else, not + even us, has access to this data. Mapeo users are the owners of the + information collected and have total control over it. In other + words, your data stays in your team, in your community. To learn + more about the embedded database Mapeo is built on, see the + #mapeo-core section. + +- Peer-to-peer data sharing + All devices connected to a peer-to-peer network can have the same + hierarchical position within the network. Information is shared + directly between different devices using a synchronization process + in which each device receives and shares data. Two Mapeo devices can + sync with each other at a time, and devices must be part of the same + project (ie. using same configuration) to sync with one another. All + devices that synchronize end up having the same information, and + changes made on one device will be reflected on the other devices + after syncing. + +- Offline synchronization + Through synchronization, users can transfer data to a computer or + smartphone in the field completely offline, and several users with + computers and smartphones can all work on the same dataset and share + edits. Offline synchronization between smartphones and computers is + currently done via Wi-Fi. You can create a Wi-Fi network in the + field using a cheap ($25) mobile router or a third device capable of + serving as an offline hotspot. The Wi-Fi network does not need to + have to have an internet connection. Mapeo computers can also + synchronize offline using a generated sync file. + +- Requires a sync protocol + We strongly encourage having a methodical synchronization protocol + for devices within your project to guarantee that all data is + included in the shared database and no data is lost along the way. + For all the information collected in a project to be present on the + different devices, it is essential to plan how, when, and where the + synchronization process between devices will occur. This is + especially important in projects where participants work in distant + places and do not coincide with other members of their team on a + regular basis. + +- Data back-up + By synchronizing systematically and on a regular basis with other + devices, you ensure that there is a back-up copy of all data. If a + device in your project is lost, you can synchronize a new device + with another device in the project to restore the data. Any data + that has not been synchronized with other devices will not have a + backup. + # How Mapeo is being used + +Mapeo is currently being used by a variety of communities around the +globe to support territory mapping and monitoring efforts. Below are a +few examples. For more detailed case studies, partner stories and +information about other tool for mapping and monitoring, check out our +Earth Defenders Toolkit website. + +Environmental Monitoring in Peru + + ----------------------------------------------------------------------- + Community monitors from Puerto Luz, Madre de Dios learn to use Mapeo to + document unregulated gold mining encroaching on their community. June + 2019 + + ----------------------------------------------------------------------- + + : Community monitors from Puerto Luz, Madre de Dios learn to use Mapeo + to document unregulated gold mining encroaching on their community. + June 2019 + + Indigenous Community monitors working within ECA Amarakaeri in South + East Peru are using Mapeo Mobile and Desktop as part of a + co-management program of a Reserved area. Together with park rangers, + they collect data on illegal gold mining and other impacts to the + Reserve and use these for internal decision making and action as well + as sharing with the authorities for any illegalities to be addressed. + +Territory Mapping in Kenya + + ----------------------------------------------------------------------- + Ogiek Indigenous People of Mount Elgon learning to use Mapeo to map + their land. Credit: Chepkitale Indigenous Peoples Development Project + + ----------------------------------------------------------------------- + + : Ogiek Indigenous People of Mount Elgon learning to use Mapeo to map + their land. Credit: Chepkitale Indigenous Peoples Development Project + + The Ogiek Indigenous People of Mount Elgon are using Mapeo Mobile and + Desktop to map important sites on their lands as part of a historical + land claim. + +Ancestral Mapping in Ecuador + + ----------------------------------------------------------------------- + The Siekopai in Northern Ecuador using Mapeo to gather knowledge from + elders before mapping their ancestral lands in Lagarto Cocha (with + Alianza Ceibo and Amazon Frontlines). + + ----------------------------------------------------------------------- + + : The Siekopai in Northern Ecuador using Mapeo to gather knowledge + from elders before mapping their ancestral lands in Lagarto Cocha + (with Alianza Ceibo and Amazon Frontlines). + + The Siekopai people of Northern Ecuador used Mapeo Desktop in their + villages to explore satellite imagery of their ancestral lands with + the elders, and document stories associated with lakes and old + settlements. Watch video. + +Disaster-Risk Management for Climate-Vulnerable Populations in Thailand + + ----------------------------------------------------------------------- + Mapeo users in Krabi. Photo by Raks Thai Foundation, Krabi Office, + under CC BY-SA 4.0. + + ----------------------------------------------------------------------- + + : Mapeo users in Krabi. Photo by Raks Thai Foundation, Krabi Office, + under CC BY-SA 4.0. + + Village health volunteers in coastal Thailand are using Mapeo to + collect data on vulnerable people, to ensure they can receive + immediate and targeted help in case of natural disaster. + +Mapeo tools + +Mapeo is a set of digital tools, designed to support collaborative data +collection and mapping in offline environments. + +There are two highly-customizable Mapeo apps that can be used together +or individually, depending on your goals: + +- ****Mapeo Mobile**** +- ****Mapeo Desktop**** + +Mapeo Mobile and Desktop are built on top of **** Mapeo Core, an +embedded peer-to-peer database that allows users to own their own data, +directly on their devices, without the need for an internet connection +or to share information with a centralized server. + +Mapeo Mobile + +Mapeo Mobile is a smartphone application (currently for Android only) +that allows you to collect and map information. Using your phone’s GPS, +you can mark points on a map for your current location and add photos, +notes and other details about what is happening. Information can be +shared with collaborators who are using Mapeo, or with external contacts +via email or other messaging apps. + +Mapeo Mobile can be translated into local languages, customized to use +offline maps, and tailored to collect specific types of information. + +Mapeo Desktop + +Mapeo Desktop is a computer application that allows you to aggregate, +view and manage data collected with Mapeo Mobile. Data from Mapeo +Desktop can be shared with collaborators who are using Mapeo or exported +to PDF reports, CSV files, GeoJSON files or published to the web using +Mapeo Webmaps. + +Mapeo Desktop also offers a simple interface for adding or creating +territory information for making maps. It provides a basic set of +mapping features that are more accessible to new tech users than other +available geographic information tools, but exporting maps requires +knowledge of other software. + +Like Mapeo Mobile, Mapeo Desktop can be translated into local languages, +customized to use offline maps, and tailored to collect specific types +of information. + + ----------------------------------------------------------------------- + Left: Mapeo Desktop is being used to view, manage and export data + collected using Mapeo Mobile. Right: Mapeo Desktop is being used to + create and export territory information. + + ----------------------------------------------------------------------- + + : Left: Mapeo Desktop is being used to view, manage and export data + collected using Mapeo Mobile. Right: Mapeo Desktop is being used to + create and export territory information. + +Mapeo Core + +Mapeo Mobile and Mapeo Desktop are both built on top of Mapeo Core to +securely store the geographic data, details and media created by users. +Mapeo Core is an offline-first, peer-to-peer embedded database that +allows users to own their own data, directly on their devices, without +the need for an internet connection or to share information with a +centralized server. + +Mapeo Core is built upon Hypercore, which is an append-only log of +actions (create, edit, delete data). Data is secured by cryptographic +proofs – every record written has a signature that also references the +signature of every previous record/row in the log – so you can never +change or edit anything already written to the log. For more on Mapeo +Core and data integrity, see here. + +{% hint style=“info” %} To learn more about additional tools and modules +that support use of Mapeo, see mapeo-repositories.md in the FOR +DEVELOPERS section. {% endhint %} # Is Mapeo right for me? + +There are many tools and pieces of software that you could use for +making maps and collecting data. Mapeo was designed to meet the needs of +specific users, who: + +- are collecting data in primarily offline environments +- often have limited previous experience with technology +- are working collaboratively on mapping or monitoring projects and + using shared data sets +- want ownership over their data and the power to decide if and when + data is shared with external actors or centralized servers +- have specific data collection requirements +- want to view and gather information in their native languages +- need a tool that is free to use + +Mapeo may not be the right tool for all projects. When evaluating +whether Mapeo will be a good choice, we encourage you to try out the +tools (see the Quick Start Guide) and please keep in mind the following: + +- Equipment requirements + Mapeo Mobile is currently available for Android only. (An iOS + version is in development for 2022.) Mapeo Desktop works on Windows, + Mac and Linux machines. + Mapeo Mobile uses Wi-Fi networks to synchronize data between + devices. To synchronize data with Mapeo Mobile in offline areas, you + will need a portable router (this does not require an internet + connection) or a third device capable of creating a local network + offline or hotspot. + +- Peer-to-peer architecture + The Mapeo tools are based on a peer-to-peer database, which means + there is no centralized server aggregating information collected by + users. Two devices that are participating in the same Mapeo project + can synchronize or exchange data at a time. + Synchronized devices have identical copies of the Mapeo database and + can serve as backups if a device is lost or damaged. Please note + that data that has not been synchronized will not have a backup. For + more details on peer-to-peer architecture and syncing, see + peer-to-peer-and-mapeo-sync.md. + It is important to think through in advance how the participating + users or devices in your project will share information, as there + are a variety of possible synchronizing patterns. For more on this, + see creating-user-protocols.md. + +- Customization and required technical skills + Mapeo comes with out-of-the box options that can be used right away, + without any customization. To learn more about whether these default + options will work for your project, see + will-mapeo-work-out-of-the-box-for-me**** + **** + ****Mapeo was also built to be highly customizable and allow users + to adapt its interface to meet the needs of specific projects. Mapeo + is currently available in many languages and can easily be + translated into new ones. + Adapting Mapeo to use custom categories, icons, questions and + background maps currently requires significant technical knowledge + and will not be accessible to all users. If you believe + customization will be necessary for your project, please consult the + section on customization-options to determine whether your team has + the required technical skills. + +- Security + As an offline-first, peer-to-peer set of tools, Mapeo can offer a + path for data collection and exchange with fewer technological + vulnerabilities than other available tools. + However, the use of any technology can introduce new security + concerns and risks. Before choosing to use Mapeo or other + alternatives, we strongly encourage reviewing the section on + security-and-risk-assessment.md. + +Alternative tools + +If Mapeo doesn’t seem like the right fit for your needs, check out the Toolfinder on our Earth Defenders Toolkitsite to learn more about other tools for territory mapping and monitoring. + +description: Frequently asked questions about Mapeo. + +FAQs + +{% hint style=“info” %} For help with technical issues using Mapeo, see +the troubleshooting section. {% endhint %} + +- Who made Mapeo? +- Is Mapeo free to use? +- What kind of data can Mapeo collect? +- What languages is Mapeo available in? +- Is Mapeo Mobile available for iOS? +- Do I need to customize Mapeo to use it? +- How does Mapeo work offline? +- Does Mapeo use a Blockchain? +- Who will have access to my data? +- Does Mapeo collect information on users? +- What happens if Mapeo loses financial support? Will my data be + inaccessible? +- Can you help me deploy Mapeo? +- How can I report bugs or problems using Mapeo? + +Who made Mapeo? + +Mapeo was built by Digital Democracy in close collaboration with +Indigenous partners in the Amazon who are on the front lines of +defending their rights and territories. +Digital Democracy is a non-profit organization that works in solidarity +with marginalized communities to use technology to defend their rights. +For more information on Digital Democracy and our partners, visit our +website. + +Is Mapeo free to use? + +Yes, all Mapeo tools and features are free to install and use. + +What kind of data can Mapeo collect? + +With Mapeo Mobile, you can collect geographic points to mark your +current location, and add associated photos, description, and details. +Users assign each point collected to a category. Check out the Mapeo +Mobile Quick Start Guide to see an overview of mobile data collection. + +With Mapeo Desktop Territory mode, you can create points, lines and +areas (polygons) on a map and add an associated category, description, +and details. + +For more on Mapeo’s default categories and details fields, see +default-configuration.md. To learn about customizing these options, see +custom-configurations. + +What languages is Mapeo available in? + +Mapeo is currently available in over 8 languages, including: + +- English +- Spanish +- Portuguese + +Mapeo can be translated into additional languages on Crowdin. For more +information, see translating.md + +Is Mapeo Mobile available for iOS? + +Mapeo Mobile is currently available for Android only. It is on our +roadmap to release a version for iOS in the future. + +Do I need to customize Mapeo to use it? + +When you install Mapeo, it comes with default options that can be used +right away, without any customization. To learn more about whether these +options will work for you, see will-mapeo-work-out-of-the-box-for-me + +Some projects may require customization of data fields or background +maps in order to best meet the needs of the project or context. +Customization currently requires some technical skills. For more on +customization options and technical requirements, see +customization-options. + +How does Mapeo work offline? + +Mapeo is built on an embedded peer-to-peer database, so all data +collected with Mapeo is stored directly on your device, with no need for +an internet connection or centralized server. Users of Mapeo Mobile and +Mapeo Desktop can synchronize or exchange data over a local Wi-Fi +network. The data never leaves your local Wi-Fi network and does not +require an internet connection. Mapeo Desktop can also exchange +information via a synchronization file using a USB drive. + +For more on how Mapeo stores and synchronizes data, see +peer-to-peer-and-mapeo-sync.md. + +Does Mapeo use a Blockchain? + +Mapeo uses secure peer-to-peer technology with a distributed ledger, +which does not include a public blockchain or consensus. + +Public blockchains are designed for a scenario where public transactions +must be mediated between participants which are all potentially +malicious. These “trustless” transactions are the key assumption of a +blockchain that distinguishes it from peer-to-peer technology. + +Applications like Mapeo assume that data is managed by the community +generating it - and some of that data may never be publicly accessible. +Mapeo’s approach, in contrast, creates a closed group, where data +creators are also data stewards, managing their own data and controlling +who has access. We take security seriously and maintain protections from +third-party attacks such as targeted hacks and surveillance by +third-parties. For users of Mapeo, privacy is critical for protecting +their ancestral knowledge and environmental monitoring information until +it’s ready to be shared with trusted partners. + +For more information, read this blog post and this paper from Article 19 +about why blockchain is not a recommended tool for human rights and +freedom of expression. + +Who will have access to my data? + +Mapeo was designed to be an offline-first set of tools that centers data +sovereignty for its users. That means that the data you collect with +Mapeo will only exist on the device it is collected or created with +until you choose to share it with other Mapeo project participants or +external actors. The data you create will never be stored on external +servers or shared with app maintainers or other actors, unless you +choose to send it or enable and use Web sync options through Mapeo. + +Does Mapeo collect information on users? + +Mapeo collects only basic, anonymized statistics for debugging, +designing and understanding to what extent the applications are being +used. + +What happens if Mapeo loses financial support? Will my data be inaccessible? + +Mapeo is built with long-term sustainability as a focus. This goes +beyond financial sustainability - we ensure that no single entity or +technology is responsible for data storage or access. + +Mapeo does not lock your data into a particular data format. You can +easily move your data around, and it is kept in its original form. Mapeo +Desktop can export data to SMART, Shapefile, CSV, and GeoJSON. You’ll +never be locked into using Mapeo software. For more on export options, +see exporting-and-sharing-externally.md. + +Can you help me deploy Mapeo? + +There is a community of active users and maintainers of Mapeo that +participate in our public chat channel on Discord and on our Earth +Defenders Toolkit Forum. We encourage you to consult these spaces for +additional tips and ideas on how people are using Mapeo. + +Digital Democracy’s core team is very small and we have limited capacity +to provide direct accompaniment for implementing Mapeo outside of our +existing partnerships. In some cases we are able to offer support. To +read more about the way we work with partners and different levels of +support, see here. + +How can I report bugs or problems using Mapeo? + +There is community of active users and maintainers of Mapeo that +participate in our public chat channel on Discord. To join the +conversation or seek help on technical issues, you can access the +channel here. # Table of contents + +- Introduction + +Overview + +- About Mapeo + - Mapeo tools + - Peer-to-peer & Mapeo sync + - How Mapeo is being used +- Is Mapeo right for me? +- FAQs + +Quick start guide + +- Getting started +- Mapeo Mobile +- Mapeo Desktop + +Complete Reference guide + +- Welcome – Introduction +- 🗒 Essentials for a successful Mapeo project + - Planning a Mapeo project + - What is the project goal? + - What outputs do you want? + - What information to collect? + - Data types within Mapeo + - Who should be involved and how? + - What are the parameters? + - Security & risk assessment + - Creating user protocols +- ✔ Will Mapeo work out-of-the-box for me? + - Default configuration + - Default background map +- ⚙ Customization options + - Translating Mapeo & default configurations + - Custom configurations + - Creating custom configurations + - Planning configuration & data structure + - Categories + - Icons + - Details fields + - Coding configuration + - Adding icon files + - Creating and exporting SVG files using Adobe + Illustrator + - Creating and exporting SVG files using Inkscape + - Creating details fields + - Creating categories + - Defining geometry defaults + - Adding a project key + - Adding project name and version + - Building configuration file + - Via the command line + - Using GitHub Actions + - Testing and iterating + - Custom background maps + - Creating custom background maps + - Generating map files in .mbtiles format for the + experimental Background Maps feature +- 📱 Mapeo Mobile installation & setup + - Installing Mapeo Mobile + - Choosing Mapeo Mobile settings + - Experiments: Turning on experimental features + - Directional Arrow + - P2P (peer-to-peer) App Updates + - Background Maps + - Security + - App Passcode + - Obscure Passcode + - Importing configurations into Mapeo Mobile + - Adding custom background maps to Mapeo Mobile + - Updating Mapeo Mobile +- 📱 Mapeo Mobile use + - Activating GPS and viewing current location + - Creating observations + - Viewing observations + - Editing and deleting observations + - Sharing data externally + - Syncing data via Wi-Fi +- 💻 Mapeo Desktop installation & setup + - Installing Mapeo Desktop + - Choosing Mapeo Desktop language + - Importing configurations to Mapeo Desktop + - Adding custom background maps to Mapeo Desktop + - Updating Mapeo Desktop +- 💻 Mapeo Desktop use + - Mapeo Desktop for managing Mapeo Mobile data (Observations mode) + - Synchronizing data + - Synchronizing via Wi-Fi + - Synchronizing with a file + - Viewing observations + - Editing and deleting observations + - Exporting data & sharing externally + - Mapeo Desktop for creating territory data (Territory mode) + - Navigating around the map + - Creating and editing territory data + - Changing background maps in Territory mode + - Importing and using external geospatial data + - Exporting and syncing data + - Synchronizing data with Mapeo Desktop +- 💡 Mapeo trainings + - Defining goals and format + - Structuring a training + - Best practices for planning a training + - Structuring the agenda, content and activities + - Suggestions for the different sections of a training + event + - Tips and suggested activities for training key features + of Mapeo + - Materials and resources available for the training event + - Preparing equipment and supplies for a training + - Recommended equipment and supplies + - Tech preparation before doing in-person training +- 🔧 Troubleshooting + - I can’t start Mapeo + - Mapeo closes automatically + - I have problems with the GPS in Mapeo + - GPS is not activated in Mapeo + - My GPS signal is very weak + - I have problems with the camera in Mapeo + - I get a black screen when using the camera + - I want to update Mapeo Mobile permissions + - I have sync issues + - I want to connect to Wi-Fi + - I want to create local Wi-Fi networks + - With a portable router + - With a smartphone + - The device I want to sync with does not show up on my + Synchronize screen + - I get an error when I try to sync with another device + - I can’t sync with the sync file + - The person I want to sync with has deleted valuable data + - Sharing files between devices + - Saving and printing Mapeo reference materials +- Glossary & quick reference sheets + - Glossary of Mapeo related terms + - Overview of Mapeo Desktop Territory mode screen + +For developers + +- Mapeo architecture overview +- Mapeo repositories + +------------------------------------------------------------------------ + +- Support +- Additional references +- Digital Democracy website # Support + +Technical support + +For help with common technical issues, see the troubleshooting section +of this guide. For additional support, please check out the community of +active users and maintainers of Mapeo on our public Discord channel. + +If you’re a developer or comfortable using GitHub, you can file an issue +in the corresponding repository here. + +Support starting a Mapeo project + +In addition to all of the resources compiled in this guide, there is a +community of active users and maintainers of Mapeo that participate in +our public chat channel on Discord and on our Earth Defenders Toolkit +Forum. We encourage you to consult these spaces for additional tips and +ideas on how people are using Mapeo. + +Digital Democracy’s core team is very small and we have limited capacity to provide direct accompaniment for implementing Mapeo outside of our existing partnerships. In some cases we are able to offer support. To read more about the way we work with partners and different levels of support, see here. + +description: >- Some other guides, references and manuals about +community mapping, monitoring and data collection that could be of use +as you design your project. — + +Additional references + +About Mapeo + +Overview + +- :arrow_forward: MAPEO: An innovative tool for rights defense(6-min + video) [EN / ES / PT] +- :arrow_forward: Mapeo: Indigenous-led mapping (1 min-video) [EN] +- :arrow_forward: The Story of Mapeo (5-min video) [EN] +- :arrow_forward: Mapeo Preview - Desktop and Mobile (8-min video) + [EN] +- :book: Mapeo: Monitor and document the world around you (text, GIFs + and images) [EN / ES / PT / FR / SW / KHM / TH] +- 🔊 Peer To Peer Mapping and Digital Democracy (40-min podcast) **** + [EN] + +Using Mapeo + +- :arrow_forward: Monitoring with Mapeo (workshop, 45-min video) [EN] +- :arrow_forward: Customizing configurations for Mapeo (workshop, + 45-min video) [EN] +- :arrow_forward: Short video tutorials on Mapeo Mobile(ES) + +Training on Mapeo + +- 👩🏽‍🏫 Full presentation on Mapeo (editable Google sheets) [EN] + - 👩🏽‍🏫 Mapeo overview - presentation (editable Google sheets) [EN] + - 👩🏽‍🏫Mapeo Mobile - presentation (editable Google sheets) [EN] + - 👩🏽‍🏫Mapeo Desktop - presentation (editable Google sheets) [EN] +- 👩🏽‍🏫Animations (GIFs) and videos on Mapeo +- 👩🏽‍🏫Mapeo training tapestry textiles (Textile slides to use in outside + workshops) [ES] +- 💡Mapeo trainings (section on this site with resources and + information on how to plan, prepare and deliver training sessions, + depending on your goals, the participants, the format of training, + etc.) [EN] + +Examples of Mapeo projects + +- :book: ECA-Amarakaeri: Monitoring the Amarakaeri Communal Reserve in + Peru (case study) [EN / ES] +- :book: Waorani: Mapping Ancestral Lands in Ecuador (case study) [EN + / ES] +- :arrow_forward: MAPEO: herramienta tecnología para la vigilancia y + control de la Reserva Comunal Amarakaeri (75-min video) [ES] + +Other resources + +- :books: Earth Defenders Toolkit (a website that includes multiple + guides, videos, case studies, etc.) [EN / ES / PT / FR] +- :arrow_forward: Train the Trainers methodology (30-min video) [EN] +- :arrow_forward: Train the Trainers methodology - summary(5-min + video) [EN] + +Mapeo architecture overview + +{% hint style=“info” %} We are currently redesigning Mapeo’s core +architecture and will relese updated documentation once changes are +complete. {% endhint %} + +Behind the scenes of the user interfaces for working with mapping and +monitoring data, you’ll find Mapeo’s core infrastructure. This document +is a work in progress. + +[Architecture Diagram September, 2020] + +Schema + +1. Observation. Mapeo extends the OpenStreetMap specification to add + ‘Observations’ – a new data type that is like a node or point, but + with extra metadata and media. +2. Field. Called a ‘question’ (ODK) or ‘tag’ (OSM), a Field is how we + structure metadata about Observations and OSM Elements. +3. Preset. Called a ‘Category’ in the Mapeo interface, but in code we + call this a ‘preset.’ This type defines a set of Fields and an Icon. +4. Filter. An expression that can be applied on the values in one or + more Field across a set of observations. + +Database + +KappaDB is one of the fundamental primitives of Mapeo Core that handles +indexing of data that isn’t media (i.e., it does not handle images). +KappaDB is a flexible database for peer-to-peer applications that we +developed in 2018, and is considered stable. If you haven’t yet, go +ahead and try the workshop to familiarize yourself with how it works. + +Configuration + +Each ‘project’ has a set of configuration files. It is identified by a +project key which is a shared secret amongst all devices. It authorizes +devices to read and write to the database. There is no way at this time +to revoke a configuration from a device remotely. + +{% hint style=“info” %} For more on configurations, see +custom-configurations. {% endhint %} + +Discovery + +Each device announces itself on the local network using MDNS. It +announces itself using a hash of the project key, which is also called a +discovery key. This means that 3rd-party observers will not be able to +discern the project key. + +Replication + +Replication requires advance knowledge of the project key. Replication +will be refused if a peer’s project key is not the same. + +Multifeed is the module that manages replication across multiple Mapeo +devices. It depends upon hypercore, a distributed append-only log. +Hypercore only allows one writer; multifeed syncronizes a set of +hypercores – by a variety of authors – across all devices with the same +project key. This forms the basis for creating a view of a single +dataset that incorporates changes from multiple writers across multiple +feeds. + +Media + +A project also contains media files which are handled separately from +the multifeed module, which concerns itself primarily with structured +data (e.g., json, protobuf, etc). Media files are replicated using +blob-store-replication-stream. This is a simple module that announces +the list of files available on both sides of a duplex stream, and then +replicates the files that are missing. + +Clients can provide filters for which files they want to accept on either end; by default, Mobile to Mobile sync does not send original images, only preview and thumbnail sizes. Original images are always syncronized from Mobile to Desktop. + +description: >- Here is an overview of the Mapeo ecosystem, including +various modules and utilities — + +Mapeo repositories + +Apps + +- mapeo-desktop: Source code for Linux, MacOS, and Windows +- mapeo-mobile: Source code for Mobile + +Configuration + +- mapeo-settings-builder: Build presets and sprites for the Mapeo apps +- mapeo-migrate: Commandline tool for mapeo migrating databases from + older formats to the latest. + +Modules + +- mapeo-core: Library for creating custom geo data and synchronizing + via a peer to peer network +- mapeo-server: Mapping web server for managing observations, media, + tiles, and various static files. +- mapeo-settings: Manage settings files for Mapeo +- iD-mapeo: Fork of OpenStreetMap editor, for offline use with Mapeo +- mapeo-schema: Data schemas for mapeo data types +- mapeo-styles: Default styles & tiles for mapeo backgrounds +- mapeo-openmaptiles: Lightweight map tiles for mapeo-mobile for + global offline map +- osm-p2p: High-level p2p OpenStreetMap database for node and the + browser +- osm-p2p-server: Peer-to-peer OpenStreetMap API v0.6 Server for + osm-p2p-db + +Demos + +- mapeo-print-preview: Demo of web vector tiles for osm-p2p data. + +Documentation + +- mapeo-docs-new: Docs site for Mapeo (mirrored with GitBook) + +Use Cases +​ +Home Toolkit Mapeo: Monitor and document the world around you + +What is Mapeo? + +Mapeo was built with and for earth defenders to easily document +environmental and human rights information and to collect data about +their land. + +It can be used by individuals or by teams who want to collaborate and +share information, and is particularly good at working in offline and +remote environments. It is simple to use, free and accessible, and can +be customized with local languages and settings. + +There is a Mapeo Mobile app, used to gather evidence in the field, to +take photographs or record GPS points of significant places; and there +is a Mapeo Desktop app, used to organize data collected on mobile or +GPS, and to visualize, edit and create reports on which action can be +taken which would be hard to do on a mobile. Both tools can work for +individual or team projects as you can synchronize data between mobile +devices, and from mobile to computer, and computer to computer. + +Mapeo was co-designed and developed with Indigenous communities who face +threats to their land such as illegal gold mining, oil contamination and +poaching. It was built to support them to document these activities in +order to take community action against them, to report them to +authorities, file lawsuits, launch media campaigns, or create maps for +land claims. + +Mapeo is an open source software that benefits from continued feedback +from our users across the world. The next feature of Mapeo could be +suggested by you!Members of the Sinangoe Land patrol using Mapeo Mobile to map their +ancestral territory (with Alianza Ceibo and Amazon Frontlines) + +Why you might want to use Mapeo + +There are many tools and pieces of software that you could use for +making maps or documenting information, however after working with earth +defenders for many years, Digital Democracy never found a tool that was +built with the needs and priorities of earth defenders at the forefront, +so we decided to build one in close collaboration with our local +partners. + +Other tools may require frequent internet access, which isn’t available +in many remote or marginalized areas; they may depend upon an online or +centralized server which takes data out of your hands and into the +hands/offices of corporations; they might be unnecessarily complicated +for your needs, alienating and disempowering to community members with +less experience with computers, or they might tie you into dependencies +on costly software or external expertise instead of promoting your own +autonomy.Mapeo used to document illegal activities in Northern Ecuador, +supported by Alianza Ceibo and Amazon Frontlines + +The Mapeo apps are built to address these points. + +1. Simple to use and learn + +Mapeo Mobile is designed to be learned easily, even if you haven’t used +smartphones much before. It uses many icons so it can be easy to +understand visually. Mapeo Desktop does require some computer skills, +but has a simple interface with a limited number of features. There are +plenty of other tools you can export your data to from Mapeo if more +complex analysis or mapping work is required. This simplicity helps +support wide community involvement and ownership of projects.A training session in the first version of Mapeo Mobile, with the +Kofan team, Alianza Ceibo and Amazon Frontlines in Sinangoe + +2. Mapeo works in completely offline environments + +Mapeo Mobile shares information by using WiFi networks between devices. +These could be internet based, but can also be offline networks set up +using simple portable routers that work with a computer or small battery +as a power source. Mapeo Desktop can use these same networks for sharing +data, and can also export data to files that can be shared on USB +sticks.A Siona land monitor uses Mapeo Mobile in the forest, with support +from Alianza Ceibo and Amazon Frontlines + +3. Mapeo uses a Peer-to-peer database + +This means that there is no centralized source of data, to which all +team members or devices connect. Instead all members of a project who +synchronize with each other get copies of all the data on their mobile +devices - it moves around the project network. The advantage of this is +that data you have collected on Mapeo Mobile stays on your phone, and +you can also see (but not edit) data collected by others on your team. +It is a less hierarchical system of storing data than being stored +externally on a server or online, and means that your community can +maintain total ownership and control over the data if you wish.Siona monitors synchronise the points collected with Mapeo Mobile to +Mapeo Desktop back in their village (with Alianza Ceibo and Amazon +Frontlines) + +4 . Mapeo is customizable + +Much of the Mapeo app is customizable in terms of language, maps and +information you collect. When you download it, it comes with an offline +map of the world, and a default configuration which you can use +immediately to collect information about threats to land or rights. +Mapeo has been translated into a number of languages already (including +English, Spanish, Portuguese, Thai, Khmer and more) and can be +translated into other languages.[][] + +Mapeo can be customized by: + +- Translating the app into your local language using an online tool + called Crowdin. +- Creating your own list of things you want to collect information + about, and design your own associated questionnaires and icons for + them. +- Designing an offline map, or maps, with the right type of + information or detail on them to support your documentation. For + example you might want a detailed satellite map, or a map with the + boundaries of mining concessions and land titles, or a map with + elevation data to help you plan field trips.Mapeo used to document illegal activities in Northern Ecuador, +supported by Alianza Ceibo and Amazon Frontlines + +How it works + +Mapeo can be used in many different workflows to help you defend your +lands and rights. To give you a sense of how it can be used, here is one +example of a workflow for collecting evidence of rights violations: + +Download and install Mapeo + +You can use Mapeo with the default configuration it comes with +immediately, or you can set it up with customized configurations and +offline maps relevant to the information you want to collect. This last +step requires more technical knowledge, so you may need support if you +want to customize Mapeo. + +Collect data using Mapeo Mobile + +Depending upon your needs and work, this might involve trips out to +remote areas, or visiting sites around your village. Mapeo Mobile allows +you to take a GPS point and categorize it, adding written notes and +photographs which are linked to the point and timestamped. For example +you could collect information about oil spills impacting your land, take +photographs as evidence and document when the spills happen. Or you +could use Mapeo to map important sites in your territory such as hunting +areas - documenting who uses them and what animals are found there - or +places with historical or spiritual significance. + +Synchronize your data + +You can share data with other team members using your phones, or connect +to Mapeo Desktop and pass all your data there. + +Edit, Visualize and Analyze + +Use Mapeo Desktop to edit and view data you have collected using Mapeo +Mobile. You can filter the data to help visualize what’s happening, and +analyze the information for trends. + +Export your data + +From Mapeo Desktop you can create simple printed or PDF reports to share +with others; you can also create a file to upload to a simple web map +for online sharing. The data can also be exported as a GeoJSON, CSV or +Shapefile for use in other GIS or data analysis applications. From Mapeo +Mobile you can share single data points and associated photos and notes +with others using email or Whatsapp if there is emergency action needed +or if you don’t have access to Mapeo Desktop. + +How to get started + +The easiest way to start using Mapeo for mapping or monitoring work is +to download Mapeo Mobile from the Google Play Store and have a go. We +hope it is quite intuitive to use but here is a manual to talk you +through all it does and how to work with it as a team. If you want to +use it alongside Mapeo Desktop, or use the Desktop version on its own +for mapping, you can download Mapeo Desktop from our website and learn +how to use it in this guide. Some things aren’t yet covered in the +guides, so if there are things that aren’t clear, ask our community of +users. + +You can also find information here if you’d like to make a bespoke +configuration for Mapeo with your own icons and offline maps and have +the technical skills or support to do so. We would love to hear about +your project, and hope you enjoy Mapeo. Sign up to our Mapeo mailing +list if you want to be kept up to date with news and improvements.The Waroani Mapping team from Alianza Ceibo used Mapeo Desktop to +check details of the map with villagers (with Alianza Ceibo and Amazon +Frontlines)[]Community monitors from Puerto Luz, Madre de Dios learn to +use Mapeo to document unregulated gold mining encroaching on their +community. June 2019 + +Examples of how Mapeo is used + +Environmental Monitoring in Peru + + Indigenous Community monitors working within ECA-RCA in South East + Peru are using Mapeo Mobile and Desktop as part of a co-management + program of a Reserved area. Together with park rangers, they collect + data on illegal gold mining and other impacts to the Reserve and use + these for internal decision making and action as well as sharing with + the authorities for any illegalities to be addressed. + +Territory Mapping in Kenya + + The Ogiek Indigenous People of Mount Elgon are using Mapeo Mobile and + Desktop to map important sites on their lands as part of a historical + land claim. + +Ancestral Mapping in Ecuador + + The Siekopai people of Northern Ecuador used Mapeo Desktop in their + villages to explore satellite imagery of their ancestral lands with + the elders, and document stories associated with lakes and old + settlements. Watch video. + +Disaster-Risk Management for Climate-Vulnerable Populations in Thailand: + + Village health volunteers in coastal Thailand are using Mapeo to + collect data on vulnerable people, to ensure they can receive + immediate and targeted help in case of natural disaster.The Siekopai in Northern Ecuador using Mapeo to gather knowledge from +elders before mapping their ancestral lands in Lagarto Cocha (with +Alianza Ceibo and Amazon Frontlines) + +Specs + +Software requirements: Mapeo Desktop can be installed on PC, Mac, and +Linux. Mapeo Mobile currently works on Android. + +Security: Data collected by Mapeo Mobile is non-falsifiable and +cryptographically signed to prove that it has not been tampered with. +All data, whether created on Mapeo Desktop or Mapeo Mobile has encrypted +logs that can be verified for authenticity. Private projects can be +created using secure project keys which limit who one can synchronize +data with. + +Main features: Completely offline functionality. Decentralized data +storage. Custom maps and configurations. Peer-to-peer synchronization. + +Languages: Can be translated into any language. Currently available in +Burmese, Dutch, English, French, German, Hindi, Indonesian, Khmer, +Malay, Nepali, Portuguese, Spanish, Swahili, Thai, and Vietnamese. + +Media: Possible to add photographs. + +Import options: Possible to import GPS tracks and shapefiles to Mapeo +Desktop. + +Export options: Mapeo Desktop: PDF or print report, GeoJSON, CSV or +Shapefile export. Mapeo Mobile: single point export to email, Whatsapp +and other mobile sharing apps. + +Digital Democracy would like to thank all the Indigenous communities +involved in the development of Mapeo Mobile and Desktop. + +Home Community Waorani: Mapping Ancestral Lands in Ecuador + + Over the course of four years we partnered closely with the Waorani + people of Ecuador to pilot innovative software, Mapeo Desktop, and map + their ancestral territory. After 4 years of gathering map data the + Waorani won a decisive and historic victory when they won a legal case + against the Ecuadorian government and saved half a million acres of + Amazonian rainforest from oil drilling. + +Who are the Waorani and What are they Defending + +The Waorani are an Indigenous people living in the headwaters of the +Ecuadorian Amazon. Originally nomadic hunter-gatherers, they started +setting up more permanent villages after being contacted by missionaries +and oil workers from the 1950s onwards.They effectively fought against +different waves of invasion, from the Inca to the Spanish +conquistadores, from rubber tappers to American missionaries and oil +companies. However, since contact, their territories have been greatly +reduced, and their remaining lands are now impacted by logging, oil +extraction, and colonist settlement. + +Even as Waorani people increasingly interact with national society and +the monetary economy, they maintain many customary practices and a deep +connection to their territory. Today, most Waorani still depend on their +lands, rivers and forests for most of the resources they need to live, +from hunting and fishing resources, to medicinal plants and materials +for ceremonial items. + +The Waorani, whose 6000-strong population now lives in about 50 small +villages, have legally recognized rights to much of their ancestral +territory in a single land title of nearly one million hectares of rich +and megadiverse Amazon rainforest. However the Ecuadorian State retains +rights to subsoil resources, including oil and gas, which it can +concession to private companies to exploit. + +How the Mapping Started + +There has been oil extraction within Waorani territory since the 1980s, +but the western part, known as the Pastaza region, remains free from oil +platforms. However in 2012 the Ecuadorian State created an oil +concession, Block 22, covering much of this region. At that time a group +of Waorani elders visited other Indigenous territories in Northern +Ecuador and witnessed the devastating and ongoing social, environmental +and health impacts of decades of oil extraction. The elders returned +home and shared their experiences, and their communities determined to +prevent similar contamination from impacting their lives and lands. + +As a part of their strategy to prevent drilling in their territory the +Waorani set about  creating “a map full of things that don’t have a +price.” They began working with the support of two local partners: +Alianza Ceibo, an umbrella coordinating group made up of representatives +from four Ecuadorian indigenous peoples, the Kofan, Siekopai, Siona and +Waorani, and Amazon Frontlines, an international, multidisciplinary team +living and working alongside Alianza Ceibo on a variety of programs from +installation of clean water systems to legal defense. A Waorani mapping +team was established, and they reached out to Digital Democracy to ask +for support to design a methodology. + +The Development of Mapeo + + The Waorani tested a variety of different mapping tools and + applications but none were a good fit for their very remote, offline + environment and collaborative process. Digital Democracy had seen + similar needs with local partners elsewhere, and had just begun to + develop a new, more appropriate piece of software: Mapeo. The Waorani + Mapping project became the main pilot use-case for the development of + Mapeo, and the team started to use it and contribute to its design in + 2015, using it for four years during the mapping of twenty villages. + +The Role of Maps and Mapping in the Waorani Land Defense + +The Waorani intended the maps to be a tool to communicate their +relationship to land and territory to others, and to gain support for +their vision. In 2018, this was put to the test when the Ecuadorian +government announced a massive sale of new oil blocks that encompassed +over 7 million acres of rainforest, including Block 22 – the western +part of Waorani territory where the mapping had taken place. + +The community decided to launch a legal case against the government to +fight the sale, and Amazon Frontlines and Digital Democracy helped them +publish an online mapstory showcasing their message for the accompanying +campaign. The Waorani map told a different story from that of the +government — one that showed their land to be rich in biodiversity and +steeped in cultural history, and in which every single vibrant acre of +forest in question would be threatened by oil production. + +In 2019 the Waorani won the lawsuit when the national court ruled that +the Government had not carried out adequate consultation before creating +the oil blocks, violating the communities’ rights to Free, Prior, and +Informed Consent (FPIC). The oil block was removed and half a million +acres of the Amazon were protected. The case set a major precedent for +Indigenous action within Ecuador and across the globe. + +Although the maps themselves were the physical outcome of the mapping +work, and played an important role in the court case, the process of +map-making was equally significant. The process included multiple +workshops at the village level to discuss the mapping and look at +drafts. Over the course of hundreds of miles of footpaths trodden by +elders and young people visiting important sites to share and document +biocultural knowledge, a rich shared awareness and language relating to +territory and the threats to it emerged. This proved critical when the +Waorani started preparing for the court case as there was general +consensus on actions and strategy needed to defend their land for future +generations. + +The Waorani Mapping Methods + +As of 2020, the Waorani Mapping Team has completed the following process +with 20 out of the 52 Waorani villages. + +Elements + +People: The most significant ‘ingredient’ by far in the mapping was the +Waorani people themselves: the deep knowledge and love of territory that +they brought to the project and their determination to keep it clean and +healthy for the future. The Mapping Team gained expert technical, +facilitation and training skills, and worked with as wide a group within +each village population as possible to draw territory maps and carry out +trips to map ancestral knowledge with a GPS. + +Values: The values underlying the project were critical to its success. +One of the most important of these was that of autonomy, which guided +how the Waorani team started the work in each community, agreeing on all +protocols and discussing the methods and clarifying the communities’ +role in the ownership of both the project and the knowledge mapped. +Supporting community autonomy and sovereignty and local data ownership +was also a core value in the development of Mapeo. + +Technology: + +- Large sheets of paper, colored marker pens +- GPS handheld devices (Garmin etrex, various models) +- Weather-proof notebooks +- A laptop and backup drives +- Lightweight, portable projectors so that an entire village could + watch the map editing in real time +- GIS and cartography software: Mapeo Desktop, QGIS, Mapbox Studio +- Design software: Adobe Illustrator + +Workshop and Trip Resources + +- Boat, fuel and food supplies +- Emergency kit: First Aid Kits including snake antivenom; Satellite + phones +- Walking kits, rubber boots, rucksacks, waterproofing etc. + +[]There is space for all community members, young and old, to +participate in drawing the territory map, as here on a massive floor map +in Akaro. + +Methodology in each village + +Community Agreements : The Waorani mapping team starts by holding a +preliminary meeting in each village to ensure understanding about the +project and agree upon the conditions and methods of the mapping. + +Sketch Mapping: The process begins in a participatory way with paper & +markers. Everyone in the community — men, women, elders, children — is +invited to come and draw maps of their community lands, marking rivers +and streams, hunting and fishing grounds and areas containing important +resources across large sheets of paper. Once the paper mapping is +complete, the community decides which areas and paths to visit on foot, +and makes a plan for the ground truthing based on the paper maps. + +[]Here a group of women draw the first map of the spaces and places +significant to them within their community, upon which the walks are +determined and the digital maps are based. + +Creating a Mapeo Configuration: With the paper maps as a reference, the +community decides which features are important to document (eg. +waterfalls, hunting grounds etc). A designer works with the Mapping Team +to turn these items into unique symbols that will comprise the legend - +this process is returned to regularly as each village has some new +resource they want to add to the map. The Waorani legend currently +contains over 150 items. + +GPS Training and Ground truthing: The paper mapping is followed by walks +in which village elders and knowledge-holders are joined by a team of  +young people from the village, trained in GIS and GPS by the core +Waorani Mapping Team. They visit important areas, track hunting and +other paths to collect stories and GPS points to help digitize the +hand-drawn maps. + +Data Entry: Back in the village, the team enters the data from the GPS +and hand-drawn maps into Mapeo Desktop, as well as additional +information and stories. A variety of offline background maps including +satellite images, and analyses showing river basins and elevation, are +used to help locate geographical features. Once the data points are +uploaded, the map is projected onto a wall for the whole community to +see. + +Export: The data is exported from Mapeo to a GeoJSON file, and then +uploaded into Mapbox Studio. The Waorani Team worked with Digital +Democracy to create a design template in Mapbox and agree on color +schemes and fonts etc. Maptiles of the area relevant to the community +are exported to Adobe Illustrator, where a legend and titles are added. + +Print: The Mapping Team takes draft maps back to each village for +further editing and verification before the final maps are prepared and +printed. Each family is given a copy of the map and a larger version is +printed for communal use. + +[]Here a couple in the village of Kenaweno receive their copy of the +community territory map which they contributed to at the end of the +mapping process.[] + +Here is a detail from one of the first maps created during the process +with the village of Nemonpare: + +Just a few of the over 150 icons the Waorani have created over time: + +Further reading: + +- Our Rivers are not Blue: Lessons, Reflections and Challenges from + Waorani Map Making in the Ecuadorian Amazon , Aliya Ryan. Bulletin + of the Society of Cartographers (2018) +- “ Indigenous Cartography & Decolonizing Mapmaking”, Emily Jacobi. + Digital Democracy(June 24, 2020) +- Waorani Interactive Map - Amazon Frontlines & Digital Democracy. +- “‘ Our land is not for sale’: Waorani Resistance in Ecuador”, Emily + Jacobi. Digital Democracy (May 23, 2018) +- “ Maps in Court and the Waorani Victory”, Aliya Ryan. Digital + Democracy(May 26, 2019) +- “From spears to maps: the case of Waorani resistance in Ecuador for + the defence of their right to prior consultation”, Margherita Scazza + and Oswando Nenquimo. International Institute for Environment and + Development (2021) +- “Waorani People Win Landmark Legal Victory Against Ecuadorian + Government”, Amazon Frontlines (April 26, 2019) +- “Waorani Territorial Mapping” - Opi Nenquimo Magazine of the + University of Mexico (July 2018) + +Kofan Case Study + +South America + +The Kofan community of Sinangoe was the first community to start piloting Mapeo Mobile in 2018, after being involved in a design workshop the year before. Sinangoe territory is located in the foothills of the Andes in Northern Ecuador, overlapped by the hugely biodiverse Cayambe Coca National park and alongside the rushing river Aguarico and its tributaries. The river is the source of life for the Kofan people, but in 2017 became the site of conflict and potential ecocide when illegal miners started crossing into their territory to prospect for gold, and then in 2018 the Ecuadorian State created mining concessions all the way down the River Aguarico, with large machinery and companies moving in fast. + +Sinangoe, a small community of only 200 people, with support from Alianza Ceibo, Amazon Frontlines and Digital Democracy, sprang into action, first creating a local ‘guardia’ team to patrol their territory, collect evidence with GPS, drones and camera traps, and confront and evict the illegal miners. Then in partnership with the State Ombudsman they took the Ecuadorian Government to court for the creation of mining concessions that would put their lives, culture and future at risk without adequate consultation. The Kofan won this case, and the appeal, in landmark rulings in 2018. The community is now using Mapeo to continuously monitor mining and other territorial invasions and to map the important resources and historical sites on their land. + +#### The Kofan process + +- The community ran a workshop to define all the different resources they wanted to map, such as special plants and historical sites and all the risks and problems they wanted to monitor (gold mining, logging, poaching etc.). +- Digital Democracy helped create a list of all these categories with simple icons for Mapeo Mobile, and an offline map they can use in the field. +- The team goes out on patrols: anything from a day on the river to a 10 day trek to the other side of their land. They take with them android phones with Mapeo, backup battery chargers, GPS and cameras, and they use Mapeo to record points, photos and details of any important territory sites or impacts of illegal activities they encounter. +- The Kofan guardia team has different roles, including those who know how to use the android and GPS devices, those with the traditional knowledge to identify resources and know the history, and those trained in how to deescalate the situation if they meet illegal invaders. +- Back in the village they connect the phones and computer to a local network using a portable mini-router and syncronise the new data in Mapeo Mobile with Mapeo Desktop. +- The team can then use Mapeo Desktop to examine the data, see the walks in context, create reports of any illegal activities, edit the data or export it to geojson for use in another mapping programme. + +The Kofan guardia has created a focus for the community around which conversations about land, resources, and their future can happen, and given them back a sense of ownership and autonomy over their territory, after years of being sidelined by the national park authorities. The case they won against the Ecuadorian State also demonstrates the power that indigenous people have when supported with good evidence and connections to legal support and advocacy. Apps such as Mapeo and the evidence it collects can become powerful tools in their hands, but are only effective because of the dedication of the Kofan team, the months spent trekking in the forest, their patience in collecting points under a dense forest canopy and commitment to the process despite threats, government inaction and a legal system in which respect for indigenous rights is the exception not the norm. diff --git a/plugins/product_support_plugin/main.py b/plugins/product_support_plugin/main.py new file mode 100644 index 0000000..0fe63d8 --- /dev/null +++ b/plugins/product_support_plugin/main.py @@ -0,0 +1,42 @@ +from fast_graphrag import GraphRAG +import json +import os + +DOMAIN = "Analyze product documentation to understand features, usage patterns, technical capabilities, integrations, and provide accurate support responses." + +with open("qa.json") as f: + qa_data = json.load(f) + EXAMPLE_QUERIES = [example["query"] for example in qa_data["examples"]] + +ENTITY_TYPES = ["Feature", "Component", "User", "Action", "Platform", "Data"] +def initialize_grag(): + print("Initializing GraphRAG...") + # Create docs directory if it doesn't exist + if not os.path.exists("./graph"): + os.makedirs("./graph") + + grag = GraphRAG( + working_dir="./graph", + domain=DOMAIN, + example_queries="\n".join(EXAMPLE_QUERIES), + entity_types=ENTITY_TYPES + ) + + # Read all txt files in docs directory + for filename in os.listdir("./documentation"): + if filename.endswith(".txt"): + file_path = os.path.join("./documentation", filename) + try: + with open(file_path) as f: + content = f.read() + print(f"Processing file: {filename}") + grag.insert(content) + print(f"Successfully inserted content from {filename}") + except Exception as e: + print(f"Error processing file {filename}: {str(e)}") + return grag + +def query(question: str, grag: GraphRAG = None): + if grag is None: + grag = initialize_grag() + return grag.query(question).response diff --git a/plugins/product_support_plugin/pyproject.toml b/plugins/product_support_plugin/pyproject.toml new file mode 100644 index 0000000..3106427 --- /dev/null +++ b/plugins/product_support_plugin/pyproject.toml @@ -0,0 +1,13 @@ +[project] +name = "awana-rag-plugin" +version = "0.1.0" +description = "A RAG plugin for analyzing Mapeo documentation to identify key features, user interactions, data collection methods, and how different components of the platform work together" +readme = "README.md" +requires-python = ">=3.10.1,<4.0.0" +dependencies = [ + "fast-graphrag", + "python-dotenv", + "python-telegram-bot>=21.7", +] +[project.scripts] +product-support-cli = "cli:main" diff --git a/plugins/product_support_plugin/telegram_bot.py b/plugins/product_support_plugin/telegram_bot.py new file mode 100644 index 0000000..2f1f03c --- /dev/null +++ b/plugins/product_support_plugin/telegram_bot.py @@ -0,0 +1,91 @@ +import os +from telegram.ext import Application, CommandHandler, MessageHandler, filters +from main import initialize_grag, query +from dotenv import load_dotenv +import asyncio +from concurrent.futures import ThreadPoolExecutor +load_dotenv() + +# Initialize the GraphRAG once +grag = initialize_grag() +# Create a thread pool executor for running sync code +executor = ThreadPoolExecutor() + +async def start_command(update, context): + """Send a message when the command /start is issued.""" + await update.message.reply_text( + "Welcome to Mapeo Documentation Assistant! Ask me any questions about Mapeo." + ) + +async def help_command(update, context): + """Send a message when the command /help is issued.""" + await update.message.reply_text( + "I can answer questions about Mapeo's features, components, and functionality.\n" + "Just ask your question and I'll try to help!" + ) + +async def handle_message(update, context): + """Handle incoming messages and respond with answers from GraphRAG.""" + try: + question = update.message.text + if not question: + await update.message.reply_text("Please enter a valid question.") + return + + if question.lower() in ['exit', 'quit']: + await update.message.reply_text("Goodbye!") + return + + try: + # Add thumbs up reaction to user's message + # await update.message.set_message_reaction(reaction=["👍"]) + + # Run the synchronous query in a thread pool + loop = asyncio.get_running_loop() + response = await loop.run_in_executor(executor, query, question, grag) + + # Reply with markdown formatting, quoting the original message + await update.message.reply_text( + response, + parse_mode='Markdown', + do_quote=True + ) + except Exception as e: + await update.message.reply_text(f"An error occurred while processing your question: {str(e)}") + except Exception as e: + await update.message.reply_text(f"An error occurred: {str(e)}") + +def main(): + """Start the bot.""" + print("Starting Mapeo Documentation Assistant bot...") + + # Get bot token from environment variable + token = os.environ.get("TELEGRAM_BOT_TOKEN") + if not token: + print("ERROR: TELEGRAM_BOT_TOKEN environment variable not found") + raise ValueError("Please set the TELEGRAM_BOT_TOKEN environment variable") + print("Successfully loaded bot token") + + # Create application and pass it your bot's token + print("Building Telegram application...") + application = Application.builder().token(token).build() + print("Successfully built Telegram application") + + # Add command handlers + print("Registering command handlers...") + application.add_handler(CommandHandler("start", start_command)) + application.add_handler(CommandHandler("help", help_command)) + print("Successfully registered command handlers") + + # Add message handler + print("Registering message handler...") + application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message)) + print("Successfully registered message handler") + + # Start the bot + print("Starting bot polling...") + application.run_polling() + print("Bot stopped") + +if __name__ == "__main__": + main() diff --git a/plugins/product_support_plugin/uv.lock b/plugins/product_support_plugin/uv.lock new file mode 100644 index 0000000..1d99977 --- /dev/null +++ b/plugins/product_support_plugin/uv.lock @@ -0,0 +1,1358 @@ +version = 1 +requires-python = ">=3.10.1, <4.0.0" + +[[package]] +name = "aiohappyeyeballs" +version = "2.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7f/55/e4373e888fdacb15563ef6fa9fa8c8252476ea071e96fb46defac9f18bf2/aiohappyeyeballs-2.4.4.tar.gz", hash = "sha256:5fdd7d87889c63183afc18ce9271f9b0a7d32c2303e394468dd45d514a757745", size = 21977 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/74/fbb6559de3607b3300b9be3cc64e97548d55678e44623db17820dbd20002/aiohappyeyeballs-2.4.4-py3-none-any.whl", hash = "sha256:a980909d50efcd44795c4afeca523296716d50cd756ddca6af8c65b996e27de8", size = 14756 }, +] + +[[package]] +name = "aiohttp" +version = "3.11.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohappyeyeballs" }, + { name = "aiosignal" }, + { name = "async-timeout", marker = "python_full_version < '3.11'" }, + { name = "attrs" }, + { name = "frozenlist" }, + { name = "multidict" }, + { name = "propcache" }, + { name = "yarl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/94/c4/3b5a937b16f6c2a0ada842a9066aad0b7a5708427d4a202a07bf09c67cbb/aiohttp-3.11.10.tar.gz", hash = "sha256:b1fc6b45010a8d0ff9e88f9f2418c6fd408c99c211257334aff41597ebece42e", size = 7668832 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/f2/ba44492f257a296c4bb910bf47acf41672421fd455540911b3f13d10d6cd/aiohttp-3.11.10-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cbad88a61fa743c5d283ad501b01c153820734118b65aee2bd7dbb735475ce0d", size = 708322 }, + { url = "https://files.pythonhosted.org/packages/2b/c7/22b0ed548c8660e978e736671f166907fb272d0a4281b2b6833310bce529/aiohttp-3.11.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80886dac673ceaef499de2f393fc80bb4481a129e6cb29e624a12e3296cc088f", size = 468211 }, + { url = "https://files.pythonhosted.org/packages/c9/0b/d326251888bb86ff7cb00b171e1cf3b0f0ed695622857f84a98bbc5f254b/aiohttp-3.11.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:61b9bae80ed1f338c42f57c16918853dc51775fb5cb61da70d590de14d8b5fb4", size = 455370 }, + { url = "https://files.pythonhosted.org/packages/4e/83/28feef5a0bda728adf76e0d076566c26c6da3d29f0ccd998d07c260cae9d/aiohttp-3.11.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e2e576caec5c6a6b93f41626c9c02fc87cd91538b81a3670b2e04452a63def6", size = 1584399 }, + { url = "https://files.pythonhosted.org/packages/dc/97/6bdd39c4134ef243ffa9fd19a072ac9a0758d64b6d51eaaaaa34e67b8bcb/aiohttp-3.11.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02c13415b5732fb6ee7ff64583a5e6ed1c57aa68f17d2bda79c04888dfdc2769", size = 1632131 }, + { url = "https://files.pythonhosted.org/packages/1b/f1/8c3a1623b9d526986f03d8158c9c856e00531217998275cc6b4a14b2fb85/aiohttp-3.11.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4cfce37f31f20800a6a6620ce2cdd6737b82e42e06e6e9bd1b36f546feb3c44f", size = 1668081 }, + { url = "https://files.pythonhosted.org/packages/9c/3e/a2f4cee0dca934b1d2c4b6a7821040ce4452b9b2e4347c9be6cb10eaa835/aiohttp-3.11.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3bbbfff4c679c64e6e23cb213f57cc2c9165c9a65d63717108a644eb5a7398df", size = 1589313 }, + { url = "https://files.pythonhosted.org/packages/fd/9c/93e9a8f39c78f0c6d938721101e28c57597046f78057ffced8a3fd571839/aiohttp-3.11.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49c7dbbc1a559ae14fc48387a115b7d4bbc84b4a2c3b9299c31696953c2a5219", size = 1544349 }, + { url = "https://files.pythonhosted.org/packages/68/d2/2054efe02be87a1af92cfcaf6875d7b2c34906c3ee2b90ce82afbc8927a5/aiohttp-3.11.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:68386d78743e6570f054fe7949d6cb37ef2b672b4d3405ce91fafa996f7d9b4d", size = 1529018 }, + { url = "https://files.pythonhosted.org/packages/10/b0/a258bfd5ddd3d9c871a8d24e96531cb6e6f0cd98dc3028f0b98302454b23/aiohttp-3.11.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9ef405356ba989fb57f84cac66f7b0260772836191ccefbb987f414bcd2979d9", size = 1536357 }, + { url = "https://files.pythonhosted.org/packages/76/7f/8b60b93e7dc58d371813a9b8d451b7c9c9c4350f9c505edf6fae80e0812b/aiohttp-3.11.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5d6958671b296febe7f5f859bea581a21c1d05430d1bbdcf2b393599b1cdce77", size = 1607214 }, + { url = "https://files.pythonhosted.org/packages/2a/10/97a11dba0f6d16878164b92ce75e2e0196a2fd25560cae8283388a24289b/aiohttp-3.11.10-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:99b7920e7165be5a9e9a3a7f1b680f06f68ff0d0328ff4079e5163990d046767", size = 1628573 }, + { url = "https://files.pythonhosted.org/packages/45/66/70419d6cb9495ddcebfa54d3db07e6a9716049ef341ded1edd8982f9b7f9/aiohttp-3.11.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0dc49f42422163efb7e6f1df2636fe3db72713f6cd94688e339dbe33fe06d61d", size = 1564058 }, + { url = "https://files.pythonhosted.org/packages/2d/d6/d94506afaea3aca15ab3f4732d666ad80acd5a035a7478aa6377c9816cf3/aiohttp-3.11.10-cp310-cp310-win32.whl", hash = "sha256:40d1c7a7f750b5648642586ba7206999650208dbe5afbcc5284bcec6579c9b91", size = 416360 }, + { url = "https://files.pythonhosted.org/packages/55/03/731d1116d09ea7a3c6be731ab0eb1faa37b844d3e54fed28e3a6785ba5ab/aiohttp-3.11.10-cp310-cp310-win_amd64.whl", hash = "sha256:68ff6f48b51bd78ea92b31079817aff539f6c8fc80b6b8d6ca347d7c02384e33", size = 441763 }, + { url = "https://files.pythonhosted.org/packages/db/7c/584d5ca19343c9462d054337828f72628e6dc204424f525df59ebfe75d1e/aiohttp-3.11.10-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:77c4aa15a89847b9891abf97f3d4048f3c2d667e00f8a623c89ad2dccee6771b", size = 708395 }, + { url = "https://files.pythonhosted.org/packages/cd/2d/61c33e01baeb23aebd07620ee4d780ff40f4c17c42289bf02a405f2ac312/aiohttp-3.11.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:909af95a72cedbefe5596f0bdf3055740f96c1a4baa0dd11fd74ca4de0b4e3f1", size = 468281 }, + { url = "https://files.pythonhosted.org/packages/ab/70/0ddb3a61b835068eb0badbe8016b4b65b966bad5f8af0f2d63998ff4cfa4/aiohttp-3.11.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:386fbe79863eb564e9f3615b959e28b222259da0c48fd1be5929ac838bc65683", size = 455345 }, + { url = "https://files.pythonhosted.org/packages/44/8c/4e14e9c1767d9a6ab1af1fbad9df9c77e050b39b6afe9e8343ec1ba96508/aiohttp-3.11.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3de34936eb1a647aa919655ff8d38b618e9f6b7f250cc19a57a4bf7fd2062b6d", size = 1685464 }, + { url = "https://files.pythonhosted.org/packages/ef/6e/1bab78ebb4f5a1c54f0fc10f8d52abc06816a9cb1db52b9c908e3d69f9a8/aiohttp-3.11.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c9527819b29cd2b9f52033e7fb9ff08073df49b4799c89cb5754624ecd98299", size = 1743427 }, + { url = "https://files.pythonhosted.org/packages/5d/5e/c1b03bef621a8cc51ff551ef223c6ac606fabe0e35c950f56d01423ec2aa/aiohttp-3.11.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65a96e3e03300b41f261bbfd40dfdbf1c301e87eab7cd61c054b1f2e7c89b9e8", size = 1785188 }, + { url = "https://files.pythonhosted.org/packages/7c/b8/df6d76a149cbd969a58da478baec0be617287c496c842ddf21fe6bce07b3/aiohttp-3.11.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98f5635f7b74bcd4f6f72fcd85bea2154b323a9f05226a80bc7398d0c90763b0", size = 1674911 }, + { url = "https://files.pythonhosted.org/packages/ee/8e/e460e7bb820a08cec399971fc3176afc8090dc32fb941f386e0c68bc4ecc/aiohttp-3.11.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:03b6002e20938fc6ee0918c81d9e776bebccc84690e2b03ed132331cca065ee5", size = 1619570 }, + { url = "https://files.pythonhosted.org/packages/c2/ae/3b597e09eae4e75b77ee6c65443593d245bfa067ae6a5d895abaf27cce6c/aiohttp-3.11.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6362cc6c23c08d18ddbf0e8c4d5159b5df74fea1a5278ff4f2c79aed3f4e9f46", size = 1653772 }, + { url = "https://files.pythonhosted.org/packages/b8/d1/99852f2925992c4d7004e590344e5398eb163750de2a7c1fbe07f182d3c8/aiohttp-3.11.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3691ed7726fef54e928fe26344d930c0c8575bc968c3e239c2e1a04bd8cf7838", size = 1649787 }, + { url = "https://files.pythonhosted.org/packages/39/c0/ea24627e08d722d5a6a00b3f6c9763fe3ad4650b8485f7a7a56ff932e3af/aiohttp-3.11.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31d5093d3acd02b31c649d3a69bb072d539d4c7659b87caa4f6d2bcf57c2fa2b", size = 1732666 }, + { url = "https://files.pythonhosted.org/packages/f1/27/ab52dee4443ef8bdb26473b53c841caafd2bb637a8d85751694e089913bb/aiohttp-3.11.10-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8b3cf2dc0f0690a33f2d2b2cb15db87a65f1c609f53c37e226f84edb08d10f52", size = 1754910 }, + { url = "https://files.pythonhosted.org/packages/cd/08/57c919d6b1f3b70bc14433c080a6152bf99454b636eb8a88552de8baaca9/aiohttp-3.11.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:fbbaea811a2bba171197b08eea288b9402faa2bab2ba0858eecdd0a4105753a3", size = 1692502 }, + { url = "https://files.pythonhosted.org/packages/ae/37/015006f669275735049e0549c37cb79c7a4a9350cbee070bbccb5a5b4b8a/aiohttp-3.11.10-cp311-cp311-win32.whl", hash = "sha256:4b2c7ac59c5698a7a8207ba72d9e9c15b0fc484a560be0788b31312c2c5504e4", size = 416178 }, + { url = "https://files.pythonhosted.org/packages/cf/8d/7bb48ae503989b15114baf9f9b19398c86ae93d30959065bc061b31331ee/aiohttp-3.11.10-cp311-cp311-win_amd64.whl", hash = "sha256:974d3a2cce5fcfa32f06b13ccc8f20c6ad9c51802bb7f829eae8a1845c4019ec", size = 442269 }, + { url = "https://files.pythonhosted.org/packages/25/17/1dbe2f619f77795409c1a13ab395b98ed1b215d3e938cacde9b8ffdac53d/aiohttp-3.11.10-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b78f053a7ecfc35f0451d961dacdc671f4bcbc2f58241a7c820e9d82559844cf", size = 704448 }, + { url = "https://files.pythonhosted.org/packages/e3/9b/112247ad47e9d7f6640889c6e42cc0ded8c8345dd0033c66bcede799b051/aiohttp-3.11.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ab7485222db0959a87fbe8125e233b5a6f01f4400785b36e8a7878170d8c3138", size = 463829 }, + { url = "https://files.pythonhosted.org/packages/8a/36/a64b583771fc673062a7a1374728a6241d49e2eda5a9041fbf248e18c804/aiohttp-3.11.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cf14627232dfa8730453752e9cdc210966490992234d77ff90bc8dc0dce361d5", size = 455774 }, + { url = "https://files.pythonhosted.org/packages/e5/75/ee1b8f510978b3de5f185c62535b135e4fc3f5a247ca0c2245137a02d800/aiohttp-3.11.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:076bc454a7e6fd646bc82ea7f98296be0b1219b5e3ef8a488afbdd8e81fbac50", size = 1682134 }, + { url = "https://files.pythonhosted.org/packages/87/46/65e8259432d5f73ca9ebf5edb645ef90e5303724e4e52477516cb4042240/aiohttp-3.11.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:482cafb7dc886bebeb6c9ba7925e03591a62ab34298ee70d3dd47ba966370d2c", size = 1736757 }, + { url = "https://files.pythonhosted.org/packages/03/f6/a6d1e791b7153fb2d101278f7146c0771b0e1569c547f8a8bc3035651984/aiohttp-3.11.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf3d1a519a324af764a46da4115bdbd566b3c73fb793ffb97f9111dbc684fc4d", size = 1793033 }, + { url = "https://files.pythonhosted.org/packages/a8/e9/1ac90733e36e7848693aece522936a13bf17eeb617da662f94adfafc1c25/aiohttp-3.11.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24213ba85a419103e641e55c27dc7ff03536c4873470c2478cce3311ba1eee7b", size = 1691609 }, + { url = "https://files.pythonhosted.org/packages/6d/a6/77b33da5a0bc04566c7ddcca94500f2c2a2334eecab4885387fffd1fc600/aiohttp-3.11.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b99acd4730ad1b196bfb03ee0803e4adac371ae8efa7e1cbc820200fc5ded109", size = 1619082 }, + { url = "https://files.pythonhosted.org/packages/48/94/5bf5f927d9a2fedd2c978adfb70a3680e16f46d178361685b56244eb52ed/aiohttp-3.11.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:14cdb5a9570be5a04eec2ace174a48ae85833c2aadc86de68f55541f66ce42ab", size = 1641186 }, + { url = "https://files.pythonhosted.org/packages/99/2d/e85103aa01d1064e51bc50cb51e7b40150a8ff5d34e5a3173a46b241860b/aiohttp-3.11.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7e97d622cb083e86f18317282084bc9fbf261801b0192c34fe4b1febd9f7ae69", size = 1646280 }, + { url = "https://files.pythonhosted.org/packages/7b/e0/44651fda8c1d865a51b3a81f1956ea55ce16fc568fe7a3e05db7fc22f139/aiohttp-3.11.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:012f176945af138abc10c4a48743327a92b4ca9adc7a0e078077cdb5dbab7be0", size = 1701862 }, + { url = "https://files.pythonhosted.org/packages/4e/1e/0804459ae325a5b95f6f349778fb465f29d2b863e522b6a349db0aaad54c/aiohttp-3.11.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44224d815853962f48fe124748227773acd9686eba6dc102578defd6fc99e8d9", size = 1734373 }, + { url = "https://files.pythonhosted.org/packages/07/87/b8f6721668cad74bcc9c7cfe6d0230b304d1250196b221e54294a0d78dbe/aiohttp-3.11.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c87bf31b7fdab94ae3adbe4a48e711bfc5f89d21cf4c197e75561def39e223bc", size = 1694343 }, + { url = "https://files.pythonhosted.org/packages/4b/20/42813fc60d9178ba9b1b86c58a5441ddb6cf8ffdfe66387345bff173bcff/aiohttp-3.11.10-cp312-cp312-win32.whl", hash = "sha256:06a8e2ee1cbac16fe61e51e0b0c269400e781b13bcfc33f5425912391a542985", size = 411118 }, + { url = "https://files.pythonhosted.org/packages/3a/51/df9c263c861ce93998b5ad2ba3212caab2112d5b66dbe91ddbe90c41ded4/aiohttp-3.11.10-cp312-cp312-win_amd64.whl", hash = "sha256:be2b516f56ea883a3e14dda17059716593526e10fb6303189aaf5503937db408", size = 437424 }, + { url = "https://files.pythonhosted.org/packages/8c/1d/88bfdbe28a3d1ba5b94a235f188f27726caf8ade9a0e13574848f44fe0fe/aiohttp-3.11.10-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8cc5203b817b748adccb07f36390feb730b1bc5f56683445bfe924fc270b8816", size = 697755 }, + { url = "https://files.pythonhosted.org/packages/86/00/4c4619d6fe5c5be32f74d1422fc719b3e6cd7097af0c9e03877ca9bd4ebc/aiohttp-3.11.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ef359ebc6949e3a34c65ce20230fae70920714367c63afd80ea0c2702902ccf", size = 460440 }, + { url = "https://files.pythonhosted.org/packages/aa/1c/2f927408f50593a29465d198ec3c57c835c8602330233163e8d89c1093db/aiohttp-3.11.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9bca390cb247dbfaec3c664326e034ef23882c3f3bfa5fbf0b56cad0320aaca5", size = 452726 }, + { url = "https://files.pythonhosted.org/packages/06/6a/ff00ed0a2ba45c34b3c366aa5b0004b1a4adcec5a9b5f67dd0648ee1c88a/aiohttp-3.11.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:811f23b3351ca532af598405db1093f018edf81368e689d1b508c57dcc6b6a32", size = 1664944 }, + { url = "https://files.pythonhosted.org/packages/02/c2/61923f2a7c2e14d7424b3a526e054f0358f57ccdf5573d4d3d033b01921a/aiohttp-3.11.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddf5f7d877615f6a1e75971bfa5ac88609af3b74796ff3e06879e8422729fd01", size = 1717707 }, + { url = "https://files.pythonhosted.org/packages/8a/08/0d3d074b24d377569ec89d476a95ca918443099c0401bb31b331104e35d1/aiohttp-3.11.10-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6ab29b8a0beb6f8eaf1e5049252cfe74adbaafd39ba91e10f18caeb0e99ffb34", size = 1774890 }, + { url = "https://files.pythonhosted.org/packages/e8/49/052ada2b6e90ed65f0e6a7e548614621b5f8dcd193cb9415d2e6bcecc94a/aiohttp-3.11.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c49a76c1038c2dd116fa443eba26bbb8e6c37e924e2513574856de3b6516be99", size = 1676945 }, + { url = "https://files.pythonhosted.org/packages/7c/9e/0c48e1a48e072a869b8b5e3920c9f6a8092861524a4a6f159cd7e6fda939/aiohttp-3.11.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f3dc0e330575f5b134918976a645e79adf333c0a1439dcf6899a80776c9ab39", size = 1602959 }, + { url = "https://files.pythonhosted.org/packages/ab/98/791f979093ff7f67f80344c182cb0ca4c2c60daed397ecaf454cc8d7a5cd/aiohttp-3.11.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:efb15a17a12497685304b2d976cb4939e55137df7b09fa53f1b6a023f01fcb4e", size = 1618058 }, + { url = "https://files.pythonhosted.org/packages/7b/5d/2d4b05feb3fd68eb7c8335f73c81079b56e582633b91002da695ccb439ef/aiohttp-3.11.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:db1d0b28fcb7f1d35600150c3e4b490775251dea70f894bf15c678fdd84eda6a", size = 1616289 }, + { url = "https://files.pythonhosted.org/packages/50/83/68cc28c00fe681dce6150614f105efe98282da19252cd6e32dfa893bb328/aiohttp-3.11.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:15fccaf62a4889527539ecb86834084ecf6e9ea70588efde86e8bc775e0e7542", size = 1685239 }, + { url = "https://files.pythonhosted.org/packages/16/f9/68fc5c8928f63238ce9314f04f3f59d9190a4db924998bb9be99c7aacce8/aiohttp-3.11.10-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:593c114a2221444f30749cc5e5f4012488f56bd14de2af44fe23e1e9894a9c60", size = 1715078 }, + { url = "https://files.pythonhosted.org/packages/3f/e0/3dd3f0451c532c77e35780bafb2b6469a046bc15a6ec2e039475a1d2f161/aiohttp-3.11.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7852bbcb4d0d2f0c4d583f40c3bc750ee033265d80598d0f9cb6f372baa6b836", size = 1672544 }, + { url = "https://files.pythonhosted.org/packages/a5/b1/3530ab040dd5d7fb016b47115016f9b3a07ea29593b0e07e53dbe06a380c/aiohttp-3.11.10-cp313-cp313-win32.whl", hash = "sha256:65e55ca7debae8faaffee0ebb4b47a51b4075f01e9b641c31e554fd376595c6c", size = 409984 }, + { url = "https://files.pythonhosted.org/packages/49/1f/deed34e9fca639a7f873d01150d46925d3e1312051eaa591c1aa1f2e6ddc/aiohttp-3.11.10-cp313-cp313-win_amd64.whl", hash = "sha256:beb39a6d60a709ae3fb3516a1581777e7e8b76933bb88c8f4420d875bb0267c6", size = 435837 }, +] + +[[package]] +name = "aiosignal" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "frozenlist" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ba/b5/6d55e80f6d8a08ce22b982eafa278d823b541c925f11ee774b0b9c43473d/aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54", size = 19424 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/6a/bc7e17a3e87a2985d3e8f4da4cd0f481060eb78fb08596c42be62c90a4d9/aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5", size = 7597 }, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, +] + +[[package]] +name = "anyio" +version = "4.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "idna" }, + { name = "sniffio" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f6/40/318e58f669b1a9e00f5c4453910682e2d9dd594334539c7b7817dabb765f/anyio-4.7.0.tar.gz", hash = "sha256:2f834749c602966b7d456a7567cafcb309f96482b5081d14ac93ccd457f9dd48", size = 177076 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/7a/4daaf3b6c08ad7ceffea4634ec206faeff697526421c20f07628c7372156/anyio-4.7.0-py3-none-any.whl", hash = "sha256:ea60c3723ab42ba6fff7e8ccb0488c898ec538ff4df1f1d5e642c3601d07e352", size = 93052 }, +] + +[[package]] +name = "async-timeout" +version = "5.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a5/ae/136395dfbfe00dfc94da3f3e136d0b13f394cba8f4841120e34226265780/async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3", size = 9274 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/ba/e2081de779ca30d473f21f5b30e0e737c438205440784c7dfc81efc2b029/async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c", size = 6233 }, +] + +[[package]] +name = "attrs" +version = "24.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/0f/aafca9af9315aee06a89ffde799a10a582fe8de76c563ee80bbcdc08b3fb/attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346", size = 792678 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2", size = 63001 }, +] + +[[package]] +name = "awana-rag-plugin" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "fast-graphrag" }, + { name = "python-dotenv" }, + { name = "python-telegram-bot" }, +] + +[package.metadata] +requires-dist = [ + { name = "fast-graphrag" }, + { name = "python-dotenv" }, + { name = "python-telegram-bot", specifier = ">=21.7" }, +] + +[[package]] +name = "certifi" +version = "2024.12.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/bd/1d41ee578ce09523c81a15426705dd20969f5abf006d1afe8aeff0dd776a/certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db", size = 166010 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/32/8f6669fc4798494966bf446c8c4a162e0b5d893dff088afddf76414f70e1/certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56", size = 164927 }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/4f/e1808dc01273379acc506d18f1504eb2d299bd4131743b9fc54d7be4df1e/charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", size = 106620 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/8b/825cc84cf13a28bfbcba7c416ec22bf85a9584971be15b21dd8300c65b7f/charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6", size = 196363 }, + { url = "https://files.pythonhosted.org/packages/23/81/d7eef6a99e42c77f444fdd7bc894b0ceca6c3a95c51239e74a722039521c/charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b", size = 125639 }, + { url = "https://files.pythonhosted.org/packages/21/67/b4564d81f48042f520c948abac7079356e94b30cb8ffb22e747532cf469d/charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99", size = 120451 }, + { url = "https://files.pythonhosted.org/packages/c2/72/12a7f0943dd71fb5b4e7b55c41327ac0a1663046a868ee4d0d8e9c369b85/charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca", size = 140041 }, + { url = "https://files.pythonhosted.org/packages/67/56/fa28c2c3e31217c4c52158537a2cf5d98a6c1e89d31faf476c89391cd16b/charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d", size = 150333 }, + { url = "https://files.pythonhosted.org/packages/f9/d2/466a9be1f32d89eb1554cf84073a5ed9262047acee1ab39cbaefc19635d2/charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7", size = 142921 }, + { url = "https://files.pythonhosted.org/packages/f8/01/344ec40cf5d85c1da3c1f57566c59e0c9b56bcc5566c08804a95a6cc8257/charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3", size = 144785 }, + { url = "https://files.pythonhosted.org/packages/73/8b/2102692cb6d7e9f03b9a33a710e0164cadfce312872e3efc7cfe22ed26b4/charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907", size = 146631 }, + { url = "https://files.pythonhosted.org/packages/d8/96/cc2c1b5d994119ce9f088a9a0c3ebd489d360a2eb058e2c8049f27092847/charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b", size = 140867 }, + { url = "https://files.pythonhosted.org/packages/c9/27/cde291783715b8ec30a61c810d0120411844bc4c23b50189b81188b273db/charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912", size = 149273 }, + { url = "https://files.pythonhosted.org/packages/3a/a4/8633b0fc1a2d1834d5393dafecce4a1cc56727bfd82b4dc18fc92f0d3cc3/charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95", size = 152437 }, + { url = "https://files.pythonhosted.org/packages/64/ea/69af161062166b5975ccbb0961fd2384853190c70786f288684490913bf5/charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e", size = 150087 }, + { url = "https://files.pythonhosted.org/packages/3b/fd/e60a9d9fd967f4ad5a92810138192f825d77b4fa2a557990fd575a47695b/charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe", size = 145142 }, + { url = "https://files.pythonhosted.org/packages/6d/02/8cb0988a1e49ac9ce2eed1e07b77ff118f2923e9ebd0ede41ba85f2dcb04/charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc", size = 94701 }, + { url = "https://files.pythonhosted.org/packages/d6/20/f1d4670a8a723c46be695dff449d86d6092916f9e99c53051954ee33a1bc/charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749", size = 102191 }, + { url = "https://files.pythonhosted.org/packages/9c/61/73589dcc7a719582bf56aae309b6103d2762b526bffe189d635a7fcfd998/charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c", size = 193339 }, + { url = "https://files.pythonhosted.org/packages/77/d5/8c982d58144de49f59571f940e329ad6e8615e1e82ef84584c5eeb5e1d72/charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944", size = 124366 }, + { url = "https://files.pythonhosted.org/packages/bf/19/411a64f01ee971bed3231111b69eb56f9331a769072de479eae7de52296d/charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee", size = 118874 }, + { url = "https://files.pythonhosted.org/packages/4c/92/97509850f0d00e9f14a46bc751daabd0ad7765cff29cdfb66c68b6dad57f/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c", size = 138243 }, + { url = "https://files.pythonhosted.org/packages/e2/29/d227805bff72ed6d6cb1ce08eec707f7cfbd9868044893617eb331f16295/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6", size = 148676 }, + { url = "https://files.pythonhosted.org/packages/13/bc/87c2c9f2c144bedfa62f894c3007cd4530ba4b5351acb10dc786428a50f0/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea", size = 141289 }, + { url = "https://files.pythonhosted.org/packages/eb/5b/6f10bad0f6461fa272bfbbdf5d0023b5fb9bc6217c92bf068fa5a99820f5/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc", size = 142585 }, + { url = "https://files.pythonhosted.org/packages/3b/a0/a68980ab8a1f45a36d9745d35049c1af57d27255eff8c907e3add84cf68f/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5", size = 144408 }, + { url = "https://files.pythonhosted.org/packages/d7/a1/493919799446464ed0299c8eef3c3fad0daf1c3cd48bff9263c731b0d9e2/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594", size = 139076 }, + { url = "https://files.pythonhosted.org/packages/fb/9d/9c13753a5a6e0db4a0a6edb1cef7aee39859177b64e1a1e748a6e3ba62c2/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c", size = 146874 }, + { url = "https://files.pythonhosted.org/packages/75/d2/0ab54463d3410709c09266dfb416d032a08f97fd7d60e94b8c6ef54ae14b/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365", size = 150871 }, + { url = "https://files.pythonhosted.org/packages/8d/c9/27e41d481557be53d51e60750b85aa40eaf52b841946b3cdeff363105737/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129", size = 148546 }, + { url = "https://files.pythonhosted.org/packages/ee/44/4f62042ca8cdc0cabf87c0fc00ae27cd8b53ab68be3605ba6d071f742ad3/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236", size = 143048 }, + { url = "https://files.pythonhosted.org/packages/01/f8/38842422988b795220eb8038745d27a675ce066e2ada79516c118f291f07/charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99", size = 94389 }, + { url = "https://files.pythonhosted.org/packages/0b/6e/b13bd47fa9023b3699e94abf565b5a2f0b0be6e9ddac9812182596ee62e4/charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27", size = 101752 }, + { url = "https://files.pythonhosted.org/packages/d3/0b/4b7a70987abf9b8196845806198975b6aab4ce016632f817ad758a5aa056/charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6", size = 194445 }, + { url = "https://files.pythonhosted.org/packages/50/89/354cc56cf4dd2449715bc9a0f54f3aef3dc700d2d62d1fa5bbea53b13426/charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf", size = 125275 }, + { url = "https://files.pythonhosted.org/packages/fa/44/b730e2a2580110ced837ac083d8ad222343c96bb6b66e9e4e706e4d0b6df/charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db", size = 119020 }, + { url = "https://files.pythonhosted.org/packages/9d/e4/9263b8240ed9472a2ae7ddc3e516e71ef46617fe40eaa51221ccd4ad9a27/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1", size = 139128 }, + { url = "https://files.pythonhosted.org/packages/6b/e3/9f73e779315a54334240353eaea75854a9a690f3f580e4bd85d977cb2204/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03", size = 149277 }, + { url = "https://files.pythonhosted.org/packages/1a/cf/f1f50c2f295312edb8a548d3fa56a5c923b146cd3f24114d5adb7e7be558/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284", size = 142174 }, + { url = "https://files.pythonhosted.org/packages/16/92/92a76dc2ff3a12e69ba94e7e05168d37d0345fa08c87e1fe24d0c2a42223/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15", size = 143838 }, + { url = "https://files.pythonhosted.org/packages/a4/01/2117ff2b1dfc61695daf2babe4a874bca328489afa85952440b59819e9d7/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8", size = 146149 }, + { url = "https://files.pythonhosted.org/packages/f6/9b/93a332b8d25b347f6839ca0a61b7f0287b0930216994e8bf67a75d050255/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2", size = 140043 }, + { url = "https://files.pythonhosted.org/packages/ab/f6/7ac4a01adcdecbc7a7587767c776d53d369b8b971382b91211489535acf0/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719", size = 148229 }, + { url = "https://files.pythonhosted.org/packages/9d/be/5708ad18161dee7dc6a0f7e6cf3a88ea6279c3e8484844c0590e50e803ef/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631", size = 151556 }, + { url = "https://files.pythonhosted.org/packages/5a/bb/3d8bc22bacb9eb89785e83e6723f9888265f3a0de3b9ce724d66bd49884e/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b", size = 149772 }, + { url = "https://files.pythonhosted.org/packages/f7/fa/d3fc622de05a86f30beea5fc4e9ac46aead4731e73fd9055496732bcc0a4/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565", size = 144800 }, + { url = "https://files.pythonhosted.org/packages/9a/65/bdb9bc496d7d190d725e96816e20e2ae3a6fa42a5cac99c3c3d6ff884118/charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7", size = 94836 }, + { url = "https://files.pythonhosted.org/packages/3e/67/7b72b69d25b89c0b3cea583ee372c43aa24df15f0e0f8d3982c57804984b/charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9", size = 102187 }, + { url = "https://files.pythonhosted.org/packages/f3/89/68a4c86f1a0002810a27f12e9a7b22feb198c59b2f05231349fbce5c06f4/charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114", size = 194617 }, + { url = "https://files.pythonhosted.org/packages/4f/cd/8947fe425e2ab0aa57aceb7807af13a0e4162cd21eee42ef5b053447edf5/charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed", size = 125310 }, + { url = "https://files.pythonhosted.org/packages/5b/f0/b5263e8668a4ee9becc2b451ed909e9c27058337fda5b8c49588183c267a/charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250", size = 119126 }, + { url = "https://files.pythonhosted.org/packages/ff/6e/e445afe4f7fda27a533f3234b627b3e515a1b9429bc981c9a5e2aa5d97b6/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920", size = 139342 }, + { url = "https://files.pythonhosted.org/packages/a1/b2/4af9993b532d93270538ad4926c8e37dc29f2111c36f9c629840c57cd9b3/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64", size = 149383 }, + { url = "https://files.pythonhosted.org/packages/fb/6f/4e78c3b97686b871db9be6f31d64e9264e889f8c9d7ab33c771f847f79b7/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23", size = 142214 }, + { url = "https://files.pythonhosted.org/packages/2b/c9/1c8fe3ce05d30c87eff498592c89015b19fade13df42850aafae09e94f35/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc", size = 144104 }, + { url = "https://files.pythonhosted.org/packages/ee/68/efad5dcb306bf37db7db338338e7bb8ebd8cf38ee5bbd5ceaaaa46f257e6/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d", size = 146255 }, + { url = "https://files.pythonhosted.org/packages/0c/75/1ed813c3ffd200b1f3e71121c95da3f79e6d2a96120163443b3ad1057505/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88", size = 140251 }, + { url = "https://files.pythonhosted.org/packages/7d/0d/6f32255c1979653b448d3c709583557a4d24ff97ac4f3a5be156b2e6a210/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90", size = 148474 }, + { url = "https://files.pythonhosted.org/packages/ac/a0/c1b5298de4670d997101fef95b97ac440e8c8d8b4efa5a4d1ef44af82f0d/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b", size = 151849 }, + { url = "https://files.pythonhosted.org/packages/04/4f/b3961ba0c664989ba63e30595a3ed0875d6790ff26671e2aae2fdc28a399/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d", size = 149781 }, + { url = "https://files.pythonhosted.org/packages/d8/90/6af4cd042066a4adad58ae25648a12c09c879efa4849c705719ba1b23d8c/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482", size = 144970 }, + { url = "https://files.pythonhosted.org/packages/cc/67/e5e7e0cbfefc4ca79025238b43cdf8a2037854195b37d6417f3d0895c4c2/charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67", size = 94973 }, + { url = "https://files.pythonhosted.org/packages/65/97/fc9bbc54ee13d33dc54a7fcf17b26368b18505500fc01e228c27b5222d80/charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b", size = 102308 }, + { url = "https://files.pythonhosted.org/packages/bf/9b/08c0432272d77b04803958a4598a51e2a4b51c06640af8b8f0f908c18bf2/charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", size = 49446 }, +] + +[[package]] +name = "click" +version = "8.1.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "platform_system == 'Windows'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/96/d3/f04c7bfcf5c1862a2a5b845c6b2b360488cf47af55dfa79c98f6a6bf98b5/click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de", size = 336121 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", size = 97941 }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, +] + +[[package]] +name = "distro" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277 }, +] + +[[package]] +name = "docstring-parser" +version = "0.16" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/08/12/9c22a58c0b1e29271051222d8906257616da84135af9ed167c9e28f85cb3/docstring_parser-0.16.tar.gz", hash = "sha256:538beabd0af1e2db0146b6bd3caa526c35a34d61af9fd2887f3a8a27a739aa6e", size = 26565 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d5/7c/e9fcff7623954d86bdc17782036cbf715ecab1bec4847c008557affe1ca8/docstring_parser-0.16-py3-none-any.whl", hash = "sha256:bf0a1387354d3691d102edef7ec124f219ef639982d096e26e3b60aeffa90637", size = 36533 }, +] + +[[package]] +name = "exceptiongroup" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/09/35/2495c4ac46b980e4ca1f6ad6db102322ef3ad2410b79fdde159a4b0f3b92/exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc", size = 28883 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/cc/b7e31358aac6ed1ef2bb790a9746ac2c69bcb3c8588b41616914eb106eaf/exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", size = 16453 }, +] + +[[package]] +name = "fast-graphrag" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "hnswlib" }, + { name = "igraph" }, + { name = "instructor" }, + { name = "openai" }, + { name = "pydantic" }, + { name = "python-dotenv" }, + { name = "requests" }, + { name = "scikit-learn" }, + { name = "scipy" }, + { name = "scipy-stubs" }, + { name = "tenacity" }, + { name = "xxhash" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/07/92/7db6db86cfbcecf518a4955f7aa77b4285eef9b8bbd050f6f4b6c62ef2e3/fast_graphrag-0.0.4.tar.gz", hash = "sha256:639fd05f543558219dbd3c31c40460afe7c74317825d44d449fe5882ec530953", size = 39725 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d5/0e/52c4888f5f584a9ecc0df0a1fea9ce2be5ba0676995561a90a184cb9b093/fast_graphrag-0.0.4-py3-none-any.whl", hash = "sha256:7cd000752028361e1907e053de01e8a9449225fd5855999a3c641917bfe0a0e1", size = 49461 }, +] + +[[package]] +name = "frozenlist" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8f/ed/0f4cec13a93c02c47ec32d81d11c0c1efbadf4a471e3f3ce7cad366cbbd3/frozenlist-1.5.0.tar.gz", hash = "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817", size = 39930 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/79/29d44c4af36b2b240725dce566b20f63f9b36ef267aaaa64ee7466f4f2f8/frozenlist-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a", size = 94451 }, + { url = "https://files.pythonhosted.org/packages/47/47/0c999aeace6ead8a44441b4f4173e2261b18219e4ad1fe9a479871ca02fc/frozenlist-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb", size = 54301 }, + { url = "https://files.pythonhosted.org/packages/8d/60/107a38c1e54176d12e06e9d4b5d755b677d71d1219217cee063911b1384f/frozenlist-1.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:15538c0cbf0e4fa11d1e3a71f823524b0c46299aed6e10ebb4c2089abd8c3bec", size = 52213 }, + { url = "https://files.pythonhosted.org/packages/17/62/594a6829ac5679c25755362a9dc93486a8a45241394564309641425d3ff6/frozenlist-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e79225373c317ff1e35f210dd5f1344ff31066ba8067c307ab60254cd3a78ad5", size = 240946 }, + { url = "https://files.pythonhosted.org/packages/7e/75/6c8419d8f92c80dd0ee3f63bdde2702ce6398b0ac8410ff459f9b6f2f9cb/frozenlist-1.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9272fa73ca71266702c4c3e2d4a28553ea03418e591e377a03b8e3659d94fa76", size = 264608 }, + { url = "https://files.pythonhosted.org/packages/88/3e/82a6f0b84bc6fb7e0be240e52863c6d4ab6098cd62e4f5b972cd31e002e8/frozenlist-1.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:498524025a5b8ba81695761d78c8dd7382ac0b052f34e66939c42df860b8ff17", size = 261361 }, + { url = "https://files.pythonhosted.org/packages/fd/85/14e5f9ccac1b64ff2f10c927b3ffdf88772aea875882406f9ba0cec8ad84/frozenlist-1.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92b5278ed9d50fe610185ecd23c55d8b307d75ca18e94c0e7de328089ac5dcba", size = 231649 }, + { url = "https://files.pythonhosted.org/packages/ee/59/928322800306f6529d1852323014ee9008551e9bb027cc38d276cbc0b0e7/frozenlist-1.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f3c8c1dacd037df16e85227bac13cca58c30da836c6f936ba1df0c05d046d8d", size = 241853 }, + { url = "https://files.pythonhosted.org/packages/7d/bd/e01fa4f146a6f6c18c5d34cab8abdc4013774a26c4ff851128cd1bd3008e/frozenlist-1.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f2ac49a9bedb996086057b75bf93538240538c6d9b38e57c82d51f75a73409d2", size = 243652 }, + { url = "https://files.pythonhosted.org/packages/a5/bd/e4771fd18a8ec6757033f0fa903e447aecc3fbba54e3630397b61596acf0/frozenlist-1.5.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e66cc454f97053b79c2ab09c17fbe3c825ea6b4de20baf1be28919460dd7877f", size = 241734 }, + { url = "https://files.pythonhosted.org/packages/21/13/c83821fa5544af4f60c5d3a65d054af3213c26b14d3f5f48e43e5fb48556/frozenlist-1.5.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5a3ba5f9a0dfed20337d3e966dc359784c9f96503674c2faf015f7fe8e96798c", size = 260959 }, + { url = "https://files.pythonhosted.org/packages/71/f3/1f91c9a9bf7ed0e8edcf52698d23f3c211d8d00291a53c9f115ceb977ab1/frozenlist-1.5.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6321899477db90bdeb9299ac3627a6a53c7399c8cd58d25da094007402b039ab", size = 262706 }, + { url = "https://files.pythonhosted.org/packages/4c/22/4a256fdf5d9bcb3ae32622c796ee5ff9451b3a13a68cfe3f68e2c95588ce/frozenlist-1.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:76e4753701248476e6286f2ef492af900ea67d9706a0155335a40ea21bf3b2f5", size = 250401 }, + { url = "https://files.pythonhosted.org/packages/af/89/c48ebe1f7991bd2be6d5f4ed202d94960c01b3017a03d6954dd5fa9ea1e8/frozenlist-1.5.0-cp310-cp310-win32.whl", hash = "sha256:977701c081c0241d0955c9586ffdd9ce44f7a7795df39b9151cd9a6fd0ce4cfb", size = 45498 }, + { url = "https://files.pythonhosted.org/packages/28/2f/cc27d5f43e023d21fe5c19538e08894db3d7e081cbf582ad5ed366c24446/frozenlist-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:189f03b53e64144f90990d29a27ec4f7997d91ed3d01b51fa39d2dbe77540fd4", size = 51622 }, + { url = "https://files.pythonhosted.org/packages/79/43/0bed28bf5eb1c9e4301003b74453b8e7aa85fb293b31dde352aac528dafc/frozenlist-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fd74520371c3c4175142d02a976aee0b4cb4a7cc912a60586ffd8d5929979b30", size = 94987 }, + { url = "https://files.pythonhosted.org/packages/bb/bf/b74e38f09a246e8abbe1e90eb65787ed745ccab6eaa58b9c9308e052323d/frozenlist-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2f3f7a0fbc219fb4455264cae4d9f01ad41ae6ee8524500f381de64ffaa077d5", size = 54584 }, + { url = "https://files.pythonhosted.org/packages/2c/31/ab01375682f14f7613a1ade30149f684c84f9b8823a4391ed950c8285656/frozenlist-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f47c9c9028f55a04ac254346e92977bf0f166c483c74b4232bee19a6697e4778", size = 52499 }, + { url = "https://files.pythonhosted.org/packages/98/a8/d0ac0b9276e1404f58fec3ab6e90a4f76b778a49373ccaf6a563f100dfbc/frozenlist-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0996c66760924da6e88922756d99b47512a71cfd45215f3570bf1e0b694c206a", size = 276357 }, + { url = "https://files.pythonhosted.org/packages/ad/c9/c7761084fa822f07dac38ac29f841d4587570dd211e2262544aa0b791d21/frozenlist-1.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2fe128eb4edeabe11896cb6af88fca5346059f6c8d807e3b910069f39157869", size = 287516 }, + { url = "https://files.pythonhosted.org/packages/a1/ff/cd7479e703c39df7bdab431798cef89dc75010d8aa0ca2514c5b9321db27/frozenlist-1.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a8ea951bbb6cacd492e3948b8da8c502a3f814f5d20935aae74b5df2b19cf3d", size = 283131 }, + { url = "https://files.pythonhosted.org/packages/59/a0/370941beb47d237eca4fbf27e4e91389fd68699e6f4b0ebcc95da463835b/frozenlist-1.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de537c11e4aa01d37db0d403b57bd6f0546e71a82347a97c6a9f0dcc532b3a45", size = 261320 }, + { url = "https://files.pythonhosted.org/packages/b8/5f/c10123e8d64867bc9b4f2f510a32042a306ff5fcd7e2e09e5ae5100ee333/frozenlist-1.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c2623347b933fcb9095841f1cc5d4ff0b278addd743e0e966cb3d460278840d", size = 274877 }, + { url = "https://files.pythonhosted.org/packages/fa/79/38c505601ae29d4348f21706c5d89755ceded02a745016ba2f58bd5f1ea6/frozenlist-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cee6798eaf8b1416ef6909b06f7dc04b60755206bddc599f52232606e18179d3", size = 269592 }, + { url = "https://files.pythonhosted.org/packages/19/e2/39f3a53191b8204ba9f0bb574b926b73dd2efba2a2b9d2d730517e8f7622/frozenlist-1.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f5f9da7f5dbc00a604fe74aa02ae7c98bcede8a3b8b9666f9f86fc13993bc71a", size = 265934 }, + { url = "https://files.pythonhosted.org/packages/d5/c9/3075eb7f7f3a91f1a6b00284af4de0a65a9ae47084930916f5528144c9dd/frozenlist-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:90646abbc7a5d5c7c19461d2e3eeb76eb0b204919e6ece342feb6032c9325ae9", size = 283859 }, + { url = "https://files.pythonhosted.org/packages/05/f5/549f44d314c29408b962fa2b0e69a1a67c59379fb143b92a0a065ffd1f0f/frozenlist-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:bdac3c7d9b705d253b2ce370fde941836a5f8b3c5c2b8fd70940a3ea3af7f4f2", size = 287560 }, + { url = "https://files.pythonhosted.org/packages/9d/f8/cb09b3c24a3eac02c4c07a9558e11e9e244fb02bf62c85ac2106d1eb0c0b/frozenlist-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03d33c2ddbc1816237a67f66336616416e2bbb6beb306e5f890f2eb22b959cdf", size = 277150 }, + { url = "https://files.pythonhosted.org/packages/37/48/38c2db3f54d1501e692d6fe058f45b6ad1b358d82cd19436efab80cfc965/frozenlist-1.5.0-cp311-cp311-win32.whl", hash = "sha256:237f6b23ee0f44066219dae14c70ae38a63f0440ce6750f868ee08775073f942", size = 45244 }, + { url = "https://files.pythonhosted.org/packages/ca/8c/2ddffeb8b60a4bce3b196c32fcc30d8830d4615e7b492ec2071da801b8ad/frozenlist-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:0cc974cc93d32c42e7b0f6cf242a6bd941c57c61b618e78b6c0a96cb72788c1d", size = 51634 }, + { url = "https://files.pythonhosted.org/packages/79/73/fa6d1a96ab7fd6e6d1c3500700963eab46813847f01ef0ccbaa726181dd5/frozenlist-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21", size = 94026 }, + { url = "https://files.pythonhosted.org/packages/ab/04/ea8bf62c8868b8eada363f20ff1b647cf2e93377a7b284d36062d21d81d1/frozenlist-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d", size = 54150 }, + { url = "https://files.pythonhosted.org/packages/d0/9a/8e479b482a6f2070b26bda572c5e6889bb3ba48977e81beea35b5ae13ece/frozenlist-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e", size = 51927 }, + { url = "https://files.pythonhosted.org/packages/e3/12/2aad87deb08a4e7ccfb33600871bbe8f0e08cb6d8224371387f3303654d7/frozenlist-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a", size = 282647 }, + { url = "https://files.pythonhosted.org/packages/77/f2/07f06b05d8a427ea0060a9cef6e63405ea9e0d761846b95ef3fb3be57111/frozenlist-1.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a", size = 289052 }, + { url = "https://files.pythonhosted.org/packages/bd/9f/8bf45a2f1cd4aa401acd271b077989c9267ae8463e7c8b1eb0d3f561b65e/frozenlist-1.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee", size = 291719 }, + { url = "https://files.pythonhosted.org/packages/41/d1/1f20fd05a6c42d3868709b7604c9f15538a29e4f734c694c6bcfc3d3b935/frozenlist-1.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6", size = 267433 }, + { url = "https://files.pythonhosted.org/packages/af/f2/64b73a9bb86f5a89fb55450e97cd5c1f84a862d4ff90d9fd1a73ab0f64a5/frozenlist-1.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e", size = 283591 }, + { url = "https://files.pythonhosted.org/packages/29/e2/ffbb1fae55a791fd6c2938dd9ea779509c977435ba3940b9f2e8dc9d5316/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9", size = 273249 }, + { url = "https://files.pythonhosted.org/packages/2e/6e/008136a30798bb63618a114b9321b5971172a5abddff44a100c7edc5ad4f/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039", size = 271075 }, + { url = "https://files.pythonhosted.org/packages/ae/f0/4e71e54a026b06724cec9b6c54f0b13a4e9e298cc8db0f82ec70e151f5ce/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784", size = 285398 }, + { url = "https://files.pythonhosted.org/packages/4d/36/70ec246851478b1c0b59f11ef8ade9c482ff447c1363c2bd5fad45098b12/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631", size = 294445 }, + { url = "https://files.pythonhosted.org/packages/37/e0/47f87544055b3349b633a03c4d94b405956cf2437f4ab46d0928b74b7526/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f", size = 280569 }, + { url = "https://files.pythonhosted.org/packages/f9/7c/490133c160fb6b84ed374c266f42800e33b50c3bbab1652764e6e1fc498a/frozenlist-1.5.0-cp312-cp312-win32.whl", hash = "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8", size = 44721 }, + { url = "https://files.pythonhosted.org/packages/b1/56/4e45136ffc6bdbfa68c29ca56ef53783ef4c2fd395f7cbf99a2624aa9aaa/frozenlist-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f", size = 51329 }, + { url = "https://files.pythonhosted.org/packages/da/3b/915f0bca8a7ea04483622e84a9bd90033bab54bdf485479556c74fd5eaf5/frozenlist-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953", size = 91538 }, + { url = "https://files.pythonhosted.org/packages/c7/d1/a7c98aad7e44afe5306a2b068434a5830f1470675f0e715abb86eb15f15b/frozenlist-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0", size = 52849 }, + { url = "https://files.pythonhosted.org/packages/3a/c8/76f23bf9ab15d5f760eb48701909645f686f9c64fbb8982674c241fbef14/frozenlist-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2", size = 50583 }, + { url = "https://files.pythonhosted.org/packages/1f/22/462a3dd093d11df623179d7754a3b3269de3b42de2808cddef50ee0f4f48/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f", size = 265636 }, + { url = "https://files.pythonhosted.org/packages/80/cf/e075e407fc2ae7328155a1cd7e22f932773c8073c1fc78016607d19cc3e5/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608", size = 270214 }, + { url = "https://files.pythonhosted.org/packages/a1/58/0642d061d5de779f39c50cbb00df49682832923f3d2ebfb0fedf02d05f7f/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b", size = 273905 }, + { url = "https://files.pythonhosted.org/packages/ab/66/3fe0f5f8f2add5b4ab7aa4e199f767fd3b55da26e3ca4ce2cc36698e50c4/frozenlist-1.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840", size = 250542 }, + { url = "https://files.pythonhosted.org/packages/f6/b8/260791bde9198c87a465224e0e2bb62c4e716f5d198fc3a1dacc4895dbd1/frozenlist-1.5.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439", size = 267026 }, + { url = "https://files.pythonhosted.org/packages/2e/a4/3d24f88c527f08f8d44ade24eaee83b2627793fa62fa07cbb7ff7a2f7d42/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de", size = 257690 }, + { url = "https://files.pythonhosted.org/packages/de/9a/d311d660420b2beeff3459b6626f2ab4fb236d07afbdac034a4371fe696e/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641", size = 253893 }, + { url = "https://files.pythonhosted.org/packages/c6/23/e491aadc25b56eabd0f18c53bb19f3cdc6de30b2129ee0bc39cd387cd560/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e", size = 267006 }, + { url = "https://files.pythonhosted.org/packages/08/c4/ab918ce636a35fb974d13d666dcbe03969592aeca6c3ab3835acff01f79c/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9", size = 276157 }, + { url = "https://files.pythonhosted.org/packages/c0/29/3b7a0bbbbe5a34833ba26f686aabfe982924adbdcafdc294a7a129c31688/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03", size = 264642 }, + { url = "https://files.pythonhosted.org/packages/ab/42/0595b3dbffc2e82d7fe658c12d5a5bafcd7516c6bf2d1d1feb5387caa9c1/frozenlist-1.5.0-cp313-cp313-win32.whl", hash = "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c", size = 44914 }, + { url = "https://files.pythonhosted.org/packages/17/c4/b7db1206a3fea44bf3b838ca61deb6f74424a8a5db1dd53ecb21da669be6/frozenlist-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28", size = 51167 }, + { url = "https://files.pythonhosted.org/packages/c6/c8/a5be5b7550c10858fcf9b0ea054baccab474da77d37f1e828ce043a3a5d4/frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3", size = 11901 }, +] + +[[package]] +name = "h11" +version = "0.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 }, +] + +[[package]] +name = "hnswlib" +version = "0.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cf/7a/1a9b1405f2eb59515f06c3074750b03e0e96edf7fee0f6dd6df81d9c21d7/hnswlib-0.8.0.tar.gz", hash = "sha256:cb6d037eedebb34a7134e7dc78966441dfd04c9cf5ee93911be911ced951c44c", size = 36206 } + +[[package]] +name = "httpcore" +version = "1.0.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6a/41/d7d0a89eb493922c37d343b607bc1b5da7f5be7e383740b4753ad8943e90/httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c", size = 85196 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd", size = 78551 }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, +] + +[[package]] +name = "igraph" +version = "0.11.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "texttable" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b8/8e/8810c9ccdef97c614423ca82fca693608db9546a1a9716671035e3630499/igraph-0.11.8.tar.gz", hash = "sha256:d7dc1404567ba3b0ea1bf8b5fa6e101617915c8ad11ea5a9f925a40bf4adad7d", size = 4568774 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/f4/0c39bd163de47bf2e293813a9b4ae61e34575142dde2b744151c872f9da9/igraph-0.11.8-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:92c47ceb9f4c95ff7461cd94eaec55e901dbc59f6e51f4244d2dd064f31c5491", size = 1948579 }, + { url = "https://files.pythonhosted.org/packages/dd/7e/8ee4e8f03b03feca33bb9dcc730724353ac36cbe7da7b38397f8ae5cd58b/igraph-0.11.8-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:3a2afdb046b602fea71ca18aff6c72165de5002ec38d0dcf1275e34ecd0d9d02", size = 1753346 }, + { url = "https://files.pythonhosted.org/packages/ea/7d/9d23c0936070f5beb99559c1064c9057374dfa435c7e3b13504d5a2c839e/igraph-0.11.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7870fb72fd9e9218940262671fb79baf281ef066aa1cd35adc092ce9ad39a038", size = 2984081 }, + { url = "https://files.pythonhosted.org/packages/88/b0/210f242123b14d3ff4b36f97410f928e9bf446414c066dc8d3b8c9cad2ab/igraph-0.11.8-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c8108138ad605714761bc6d526feab54074904a99c47dcaabc269ed7b45e7650", size = 3060225 }, + { url = "https://files.pythonhosted.org/packages/90/61/ec7edb5233ec2dc3d2129d94211801fb46a1c2b9beec40989707c82271f7/igraph-0.11.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2e3abe641622cd9c95eb152c97caa22e68257a524cc1851a099b066f8f5c5f3", size = 3142403 }, + { url = "https://files.pythonhosted.org/packages/6b/89/09f1d251c48f239238cf75714e8cee8fcaacb3513620e0f59dbf1ef0c51d/igraph-0.11.8-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:b546eaa9461473a65bb56a51672c6aeb898b737d5e86c3efa1b1bf520ee4b031", size = 3893169 }, + { url = "https://files.pythonhosted.org/packages/e2/90/3e913fd9698fb91f002fc7a96b2c81bdd77bb8f60f7cb3ec922b6e218666/igraph-0.11.8-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:178ef859135ac5075a7159e6826a546b7340cf45a01a928c2a0c24c32e3dfa63", size = 4168476 }, + { url = "https://files.pythonhosted.org/packages/4f/76/35ae678a78bd1d221af92f3ab98bedbce24968d9d096a2ddfde8580fbe5b/igraph-0.11.8-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a68ae7b6324e9c4cb1d04ce75b6e0f67974433fc7667895f1e25bf4f4c6fd530", size = 4056329 }, + { url = "https://files.pythonhosted.org/packages/b5/f5/8c79fd8cdb3708cb404a31538c11eec4283e72dfc8cb47307966f0a3af74/igraph-0.11.8-cp39-abi3-win32.whl", hash = "sha256:cc93d2f97f93bf30c2027c31e9e1aa088a3c60cdfeb6b33e0259e4b40b4c5597", size = 1597440 }, + { url = "https://files.pythonhosted.org/packages/b0/17/621d3a59430851a327421fdbec9ec8494d7fadaffc6dfdd42d4a95accbf2/igraph-0.11.8-cp39-abi3-win_amd64.whl", hash = "sha256:248831a6162130f16909c1f776cc246b48f692339ea4baca489cad4ed8dc0e13", size = 1976778 }, + { url = "https://files.pythonhosted.org/packages/54/0c/d293db1a7353632387afc00ae92a2d024bf098fd9336ab98c047c8e7f87d/igraph-0.11.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f0a8cad10406fba28c4b0199dfb491bcfdf1cdd3a56feeb52bb3b1cd724d04b4", size = 1936005 }, + { url = "https://files.pythonhosted.org/packages/c9/e6/492b224f2d4fac430ce93cfd462dcb35fd73746baefe8f5a26e09226b312/igraph-0.11.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1c11127a58ac2fc8062dac9f20ef612aff1b09f5f9d3e90800c4817229d0a0bc", size = 1741196 }, + { url = "https://files.pythonhosted.org/packages/bd/35/0f6bc83d217c853b527f01a73cdc970894374e627b8751363e3e017bbf0f/igraph-0.11.8-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17d79bfb170b8c195fe6bacfa1c906817e8e812417c7e6a8e15f0bcf9b0775a8", size = 2595984 }, + { url = "https://files.pythonhosted.org/packages/c6/80/d94a1ff1d9502a880e175054667167f097f12bf67243bc70d22cc005bba8/igraph-0.11.8-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9de09a26d7aae4d83338497cfd2d107d3ee3a2e9335b9db4b6c73a089e8cf47", size = 2759711 }, + { url = "https://files.pythonhosted.org/packages/1a/9e/2d51720ec198b8ee9fe8d15044c0b69673876d303b7b69587c34c1a2239a/igraph-0.11.8-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6559e2c925ed2ac608103adfd1dec9ccb9a04ddc7ad1d9d2a7db46dda6b1955", size = 2764832 }, + { url = "https://files.pythonhosted.org/packages/ba/77/af680ee6e6d81bf803dcc0ae9c116e7c160f86014bdd3a584bcac93077ad/igraph-0.11.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:6c17658b367be4f725a253678bfe799d9fe4d4e5c01ad82449cf8f2e9917937c", size = 1976705 }, +] + +[[package]] +name = "instructor" +version = "1.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohttp" }, + { name = "docstring-parser" }, + { name = "jinja2" }, + { name = "jiter" }, + { name = "openai" }, + { name = "pydantic" }, + { name = "pydantic-core" }, + { name = "requests" }, + { name = "rich" }, + { name = "tenacity" }, + { name = "typer" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b5/5f/5326d811f8cd59fc4fffbd629c91eeb82a345a2375ad34500c2755aab4d8/instructor-1.7.0.tar.gz", hash = "sha256:51b308ae9c5e4d56096514be785ac4f28f710c91bed80af74412fc21593431b3", size = 57079 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/84/2351df1678678f4a0a2c251f986d05e0ba090199f7a9f39e6d152b314946/instructor-1.7.0-py3-none-any.whl", hash = "sha256:0bff965d71a5398aed9d3f728e07ffb7b5050569c81f306c0e5a8d022071fe29", size = 70145 }, +] + +[[package]] +name = "jinja2" +version = "3.1.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ed/55/39036716d19cab0747a5020fc7e907f362fbf48c984b14e62127f7e68e5d/jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", size = 240245 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d", size = 133271 }, +] + +[[package]] +name = "jiter" +version = "0.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/ef/64458dfad180debd70d9dd1ca4f607e52bb6de748e5284d748556a0d5173/jiter-0.6.1.tar.gz", hash = "sha256:e19cd21221fc139fb032e4112986656cb2739e9fe6d84c13956ab30ccc7d4449", size = 161306 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/1d/9dede54580112c1403a9b6ef0cab33d10c58e3e7e55548d6b97bfd890748/jiter-0.6.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:d08510593cb57296851080018006dfc394070178d238b767b1879dc1013b106c", size = 290507 }, + { url = "https://files.pythonhosted.org/packages/b2/28/cf5586637c8c21ad1d68bcc3361d60ade8e81524340454f21c68e8368b70/jiter-0.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:adef59d5e2394ebbad13b7ed5e0306cceb1df92e2de688824232a91588e77aa7", size = 301642 }, + { url = "https://files.pythonhosted.org/packages/6b/ab/07e67b0a9ad816f5130def05537177f2efdfe451480a584ae9fbb31cdaf8/jiter-0.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3e02f7a27f2bcc15b7d455c9df05df8ffffcc596a2a541eeda9a3110326e7a3", size = 337364 }, + { url = "https://files.pythonhosted.org/packages/25/3a/bb625446b95b7f964ac8c5e9260190262b629c1aecc9f7e9fd7730e2e2b1/jiter-0.6.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed69a7971d67b08f152c17c638f0e8c2aa207e9dd3a5fcd3cba294d39b5a8d2d", size = 353782 }, + { url = "https://files.pythonhosted.org/packages/44/78/fb2bf870418360ac523ac1591a7418add2e9385e207ca6320907d22a0699/jiter-0.6.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2019d966e98f7c6df24b3b8363998575f47d26471bfb14aade37630fae836a1", size = 370761 }, + { url = "https://files.pythonhosted.org/packages/ae/c3/4e68a0e52a3790df68b95a5fa0d70aae3f6d1f376adf515fb9016080ccf3/jiter-0.6.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:36c0b51a285b68311e207a76c385650322734c8717d16c2eb8af75c9d69506e7", size = 392957 }, + { url = "https://files.pythonhosted.org/packages/bd/5a/d2fe7904a3f12cb2a425e83382186d23325c3316d40382cd17cd4a2205b9/jiter-0.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:220e0963b4fb507c525c8f58cde3da6b1be0bfddb7ffd6798fb8f2531226cdb1", size = 325211 }, + { url = "https://files.pythonhosted.org/packages/d6/4a/9db9f1f7034187290ffb370c9b579e647b3e5889a541b54d113353d29a14/jiter-0.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aa25c7a9bf7875a141182b9c95aed487add635da01942ef7ca726e42a0c09058", size = 366109 }, + { url = "https://files.pythonhosted.org/packages/0c/4b/487e2623703da76405d3ccd5f6047a7c7f9e238eda7a3043b806542e53ac/jiter-0.6.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e90552109ca8ccd07f47ca99c8a1509ced93920d271bb81780a973279974c5ab", size = 514433 }, + { url = "https://files.pythonhosted.org/packages/33/18/ed55ecd669f5ce963045f9cd3404c937d51509324070af5bba17cda789fd/jiter-0.6.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:67723a011964971864e0b484b0ecfee6a14de1533cff7ffd71189e92103b38a8", size = 496282 }, + { url = "https://files.pythonhosted.org/packages/c1/8e/2854fe24b38e7180396a991e34363f3e7a72ea99c4a05f2c3940ae01fda8/jiter-0.6.1-cp310-none-win32.whl", hash = "sha256:33af2b7d2bf310fdfec2da0177eab2fedab8679d1538d5b86a633ebfbbac4edd", size = 197413 }, + { url = "https://files.pythonhosted.org/packages/5b/bd/ff2f6a84574e0e01759dd81255c3145cacd9f374d01efc49574b03638105/jiter-0.6.1-cp310-none-win_amd64.whl", hash = "sha256:7cea41c4c673353799906d940eee8f2d8fd1d9561d734aa921ae0f75cb9732f4", size = 200042 }, + { url = "https://files.pythonhosted.org/packages/95/91/d1605f3cabcf47193ecab3712e5a4c55a19cf1a4d86ef67402325e28a44e/jiter-0.6.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:b03c24e7da7e75b170c7b2b172d9c5e463aa4b5c95696a368d52c295b3f6847f", size = 290963 }, + { url = "https://files.pythonhosted.org/packages/91/35/85ef9eaef7dec14f28dd9b8a2116c07075bb2731a405b650a55fda4c74d7/jiter-0.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:47fee1be677b25d0ef79d687e238dc6ac91a8e553e1a68d0839f38c69e0ee491", size = 302639 }, + { url = "https://files.pythonhosted.org/packages/3b/c7/87a809bf95eb6fbcd8b30ea1d0f922c2187590de64a7f0944615008fde45/jiter-0.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25f0d2f6e01a8a0fb0eab6d0e469058dab2be46ff3139ed2d1543475b5a1d8e7", size = 337048 }, + { url = "https://files.pythonhosted.org/packages/bf/70/c31f21c109a01e6ebb0e032c8296d24761b5244b37d16bb3e9b0789a0eb0/jiter-0.6.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0b809e39e342c346df454b29bfcc7bca3d957f5d7b60e33dae42b0e5ec13e027", size = 354239 }, + { url = "https://files.pythonhosted.org/packages/b9/86/6e4ef77c86175bbcc2cff6e8c6a8f98a554f88ce99b9c892c9330858d07c/jiter-0.6.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e9ac7c2f092f231f5620bef23ce2e530bd218fc046098747cc390b21b8738a7a", size = 370842 }, + { url = "https://files.pythonhosted.org/packages/ba/e3/ef93fc307278d98c981b09b4f965f49312d0639ba31c2db4fe073b78a833/jiter-0.6.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e51a2d80d5fe0ffb10ed2c82b6004458be4a3f2b9c7d09ed85baa2fbf033f54b", size = 392489 }, + { url = "https://files.pythonhosted.org/packages/63/6d/bff2bce7cc17bd7e0f517490cfa4444ad94d20720eb2ccd3152a6cd57a30/jiter-0.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3343d4706a2b7140e8bd49b6c8b0a82abf9194b3f0f5925a78fc69359f8fc33c", size = 325493 }, + { url = "https://files.pythonhosted.org/packages/49/4b/56e8a5e2be5439e503b77d2c9479197e0d8199827d7f79b06592747c5210/jiter-0.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82521000d18c71e41c96960cb36e915a357bc83d63a8bed63154b89d95d05ad1", size = 365974 }, + { url = "https://files.pythonhosted.org/packages/d3/9b/967752fb36ddb4b6ea7a2a8cd0ef3f167a112a2d3a2131ee544969203659/jiter-0.6.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3c843e7c1633470708a3987e8ce617ee2979ee18542d6eb25ae92861af3f1d62", size = 514144 }, + { url = "https://files.pythonhosted.org/packages/58/55/9b7e0021e567731b076a8bf017a1df7d6f148bb175be2ac647a0c6433bbd/jiter-0.6.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a2e861658c3fe849efc39b06ebb98d042e4a4c51a8d7d1c3ddc3b1ea091d0784", size = 496072 }, + { url = "https://files.pythonhosted.org/packages/ca/37/9e0638d2a129a1b72344a90a03b2b518c048066db0858aaf0877cb9d4acd/jiter-0.6.1-cp311-none-win32.whl", hash = "sha256:7d72fc86474862c9c6d1f87b921b70c362f2b7e8b2e3c798bb7d58e419a6bc0f", size = 197571 }, + { url = "https://files.pythonhosted.org/packages/65/8a/78d337464e2b2e552d2988148e3e51da5445d910345c0d00f1982fd9aad4/jiter-0.6.1-cp311-none-win_amd64.whl", hash = "sha256:3e36a320634f33a07794bb15b8da995dccb94f944d298c8cfe2bd99b1b8a574a", size = 201994 }, + { url = "https://files.pythonhosted.org/packages/2e/d5/fcdfbcea637f8b9b833597797d6b77fd7e22649b4794fc571674477c8520/jiter-0.6.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1fad93654d5a7dcce0809aff66e883c98e2618b86656aeb2129db2cd6f26f867", size = 289279 }, + { url = "https://files.pythonhosted.org/packages/9a/47/8e4a7704a267b8d1d3287b4353fc07f1f4a3541b27988ea3e49ccbf3164a/jiter-0.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4e6e340e8cd92edab7f6a3a904dbbc8137e7f4b347c49a27da9814015cc0420c", size = 300931 }, + { url = "https://files.pythonhosted.org/packages/ea/4f/fbb1e11fcc3881d108359d3db8456715c9d30ddfce84dc5f9e0856e08e11/jiter-0.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:691352e5653af84ed71763c3c427cff05e4d658c508172e01e9c956dfe004aba", size = 336534 }, + { url = "https://files.pythonhosted.org/packages/29/8a/4c1e1229f89127187df166de760438b2a20e5a311391ba10d2b69db0da6f/jiter-0.6.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:defee3949313c1f5b55e18be45089970cdb936eb2a0063f5020c4185db1b63c9", size = 354266 }, + { url = "https://files.pythonhosted.org/packages/19/15/3f27f4b9d40bc7709a30fda99876cbe9e9f75a0ea2ef7d55f3dd4d04f927/jiter-0.6.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26d2bdd5da097e624081c6b5d416d3ee73e5b13f1703bcdadbb1881f0caa1933", size = 370492 }, + { url = "https://files.pythonhosted.org/packages/1f/9d/9ec03c07325bc3a3c5b5082840b8ecb7e7ad38f3071c149b7c6fb9e78706/jiter-0.6.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18aa9d1626b61c0734b973ed7088f8a3d690d0b7f5384a5270cd04f4d9f26c86", size = 390330 }, + { url = "https://files.pythonhosted.org/packages/bd/3b/612ea6daa52d64bc0cc46f2bd2e138952c58f1edbe86b17fd89e07c33d86/jiter-0.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a3567c8228afa5ddcce950631c6b17397ed178003dc9ee7e567c4c4dcae9fa0", size = 324245 }, + { url = "https://files.pythonhosted.org/packages/21/0f/f3a1ffd9f203d4014b4e5045c0ea2c67ee71a7eee8bf3408dbf11007cf07/jiter-0.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e5c0507131c922defe3f04c527d6838932fcdfd69facebafd7d3574fa3395314", size = 368232 }, + { url = "https://files.pythonhosted.org/packages/62/12/5d75729e0a57804852de0affc6f03b3df8518259e47ed4cd89aeeb671a71/jiter-0.6.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:540fcb224d7dc1bcf82f90f2ffb652df96f2851c031adca3c8741cb91877143b", size = 513820 }, + { url = "https://files.pythonhosted.org/packages/5f/e8/e47734280e19cd465832e610e1c69367ee72947de738785c4b6fc4031e25/jiter-0.6.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e7b75436d4fa2032b2530ad989e4cb0ca74c655975e3ff49f91a1a3d7f4e1df2", size = 496023 }, + { url = "https://files.pythonhosted.org/packages/52/01/5f65dd1387d39aa3fd4a98a5be1d8470e929a0cb0dd6cbfebaccd9a20ac5/jiter-0.6.1-cp312-none-win32.whl", hash = "sha256:883d2ced7c21bf06874fdeecab15014c1c6d82216765ca6deef08e335fa719e0", size = 197425 }, + { url = "https://files.pythonhosted.org/packages/43/b2/bd6665030f7d7cd5d9182c62a869c3d5ceadd7bff9f1b305de9192e7dbf8/jiter-0.6.1-cp312-none-win_amd64.whl", hash = "sha256:91e63273563401aadc6c52cca64a7921c50b29372441adc104127b910e98a5b6", size = 198966 }, + { url = "https://files.pythonhosted.org/packages/23/38/7b48e0149778ff4b893567c9fd997ecfcc013e290375aa7823e1f681b3d3/jiter-0.6.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:852508a54fe3228432e56019da8b69208ea622a3069458252f725d634e955b31", size = 288674 }, + { url = "https://files.pythonhosted.org/packages/85/3b/96d15b483d82a637279da53a1d299dd5da6e029b9905bcd1a4e1f89b8e4f/jiter-0.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f491cc69ff44e5a1e8bc6bf2b94c1f98d179e1aaf4a554493c171a5b2316b701", size = 301531 }, + { url = "https://files.pythonhosted.org/packages/cf/54/9681f112cbec4e197259e9db679bd4bc314f4bd24f74b9aa5e93073990b5/jiter-0.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc56c8f0b2a28ad4d8047f3ae62d25d0e9ae01b99940ec0283263a04724de1f3", size = 335954 }, + { url = "https://files.pythonhosted.org/packages/4a/4d/f9c0ba82b154c66278e28348086086264ccf50622ae468ec215e4bbc2873/jiter-0.6.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:51b58f7a0d9e084a43b28b23da2b09fc5e8df6aa2b6a27de43f991293cab85fd", size = 353996 }, + { url = "https://files.pythonhosted.org/packages/ee/be/7f26b258ef190f6d582e21c76c7dd1097753a2203bad3e1643f45392720a/jiter-0.6.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f79ce15099154c90ef900d69c6b4c686b64dfe23b0114e0971f2fecd306ec6c", size = 369733 }, + { url = "https://files.pythonhosted.org/packages/5f/85/037ed5261fa622312471ef5520b2135c26b29256c83adc16c8cc55dc4108/jiter-0.6.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:03a025b52009f47e53ea619175d17e4ded7c035c6fbd44935cb3ada11e1fd592", size = 389920 }, + { url = "https://files.pythonhosted.org/packages/a8/f3/2e01294712faa476be9e6ceb49e424c3919e03415ded76d103378a06bb80/jiter-0.6.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c74a8d93718137c021d9295248a87c2f9fdc0dcafead12d2930bc459ad40f885", size = 324138 }, + { url = "https://files.pythonhosted.org/packages/00/45/50377814f21b6412c7785be27f2dace225af52e0af20be7af899a7e3f264/jiter-0.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:40b03b75f903975f68199fc4ec73d546150919cb7e534f3b51e727c4d6ccca5a", size = 367610 }, + { url = "https://files.pythonhosted.org/packages/af/fc/51ba30875125381bfe21a1572c176de1a7dd64a386a7498355fc100decc4/jiter-0.6.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:825651a3f04cf92a661d22cad61fc913400e33aa89b3e3ad9a6aa9dc8a1f5a71", size = 512945 }, + { url = "https://files.pythonhosted.org/packages/69/60/af26168bd4916f9199ed433161e9f8a4eeda581a4e5982560d0f22dd146c/jiter-0.6.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:928bf25eb69ddb292ab8177fe69d3fbf76c7feab5fce1c09265a7dccf25d3991", size = 494963 }, + { url = "https://files.pythonhosted.org/packages/f3/2f/4f3cc5c9067a6fd1020d3c4365546535a69ed77da7fba2bec24368f3662c/jiter-0.6.1-cp313-none-win32.whl", hash = "sha256:352cd24121e80d3d053fab1cc9806258cad27c53cad99b7a3cac57cf934b12e4", size = 196869 }, + { url = "https://files.pythonhosted.org/packages/7a/fc/8709ee90837e94790d8b50db51c7b8a70e86e41b2c81e824c20b0ecfeba7/jiter-0.6.1-cp313-none-win_amd64.whl", hash = "sha256:be7503dd6f4bf02c2a9bacb5cc9335bc59132e7eee9d3e931b13d76fd80d7fda", size = 198919 }, +] + +[[package]] +name = "joblib" +version = "1.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/64/33/60135848598c076ce4b231e1b1895170f45fbcaeaa2c9d5e38b04db70c35/joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e", size = 2116621 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6", size = 301817 }, +] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, +] + +[[package]] +name = "markupsafe" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/90/d08277ce111dd22f77149fd1a5d4653eeb3b3eaacbdfcbae5afb2600eebd/MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8", size = 14357 }, + { url = "https://files.pythonhosted.org/packages/04/e1/6e2194baeae0bca1fae6629dc0cbbb968d4d941469cbab11a3872edff374/MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158", size = 12393 }, + { url = "https://files.pythonhosted.org/packages/1d/69/35fa85a8ece0a437493dc61ce0bb6d459dcba482c34197e3efc829aa357f/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579", size = 21732 }, + { url = "https://files.pythonhosted.org/packages/22/35/137da042dfb4720b638d2937c38a9c2df83fe32d20e8c8f3185dbfef05f7/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d", size = 20866 }, + { url = "https://files.pythonhosted.org/packages/29/28/6d029a903727a1b62edb51863232152fd335d602def598dade38996887f0/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb", size = 20964 }, + { url = "https://files.pythonhosted.org/packages/cc/cd/07438f95f83e8bc028279909d9c9bd39e24149b0d60053a97b2bc4f8aa51/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b", size = 21977 }, + { url = "https://files.pythonhosted.org/packages/29/01/84b57395b4cc062f9c4c55ce0df7d3108ca32397299d9df00fedd9117d3d/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c", size = 21366 }, + { url = "https://files.pythonhosted.org/packages/bd/6e/61ebf08d8940553afff20d1fb1ba7294b6f8d279df9fd0c0db911b4bbcfd/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171", size = 21091 }, + { url = "https://files.pythonhosted.org/packages/11/23/ffbf53694e8c94ebd1e7e491de185124277964344733c45481f32ede2499/MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50", size = 15065 }, + { url = "https://files.pythonhosted.org/packages/44/06/e7175d06dd6e9172d4a69a72592cb3f7a996a9c396eee29082826449bbc3/MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a", size = 15514 }, + { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353 }, + { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392 }, + { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984 }, + { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120 }, + { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032 }, + { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057 }, + { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359 }, + { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306 }, + { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094 }, + { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521 }, + { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274 }, + { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348 }, + { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149 }, + { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118 }, + { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993 }, + { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178 }, + { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319 }, + { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352 }, + { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097 }, + { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601 }, + { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274 }, + { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352 }, + { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122 }, + { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085 }, + { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978 }, + { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208 }, + { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357 }, + { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344 }, + { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101 }, + { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603 }, + { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510 }, + { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486 }, + { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480 }, + { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914 }, + { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796 }, + { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473 }, + { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114 }, + { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098 }, + { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208 }, + { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, +] + +[[package]] +name = "multidict" +version = "6.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d6/be/504b89a5e9ca731cd47487e91c469064f8ae5af93b7259758dcfc2b9c848/multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a", size = 64002 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/29/68/259dee7fd14cf56a17c554125e534f6274c2860159692a414d0b402b9a6d/multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60", size = 48628 }, + { url = "https://files.pythonhosted.org/packages/50/79/53ba256069fe5386a4a9e80d4e12857ced9de295baf3e20c68cdda746e04/multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1", size = 29327 }, + { url = "https://files.pythonhosted.org/packages/ff/10/71f1379b05b196dae749b5ac062e87273e3f11634f447ebac12a571d90ae/multidict-6.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53", size = 29689 }, + { url = "https://files.pythonhosted.org/packages/71/45/70bac4f87438ded36ad4793793c0095de6572d433d98575a5752629ef549/multidict-6.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5", size = 126639 }, + { url = "https://files.pythonhosted.org/packages/80/cf/17f35b3b9509b4959303c05379c4bfb0d7dd05c3306039fc79cf035bbac0/multidict-6.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581", size = 134315 }, + { url = "https://files.pythonhosted.org/packages/ef/1f/652d70ab5effb33c031510a3503d4d6efc5ec93153562f1ee0acdc895a57/multidict-6.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56", size = 129471 }, + { url = "https://files.pythonhosted.org/packages/a6/64/2dd6c4c681688c0165dea3975a6a4eab4944ea30f35000f8b8af1df3148c/multidict-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429", size = 124585 }, + { url = "https://files.pythonhosted.org/packages/87/56/e6ee5459894c7e554b57ba88f7257dc3c3d2d379cb15baaa1e265b8c6165/multidict-6.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748", size = 116957 }, + { url = "https://files.pythonhosted.org/packages/36/9e/616ce5e8d375c24b84f14fc263c7ef1d8d5e8ef529dbc0f1df8ce71bb5b8/multidict-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db", size = 128609 }, + { url = "https://files.pythonhosted.org/packages/8c/4f/4783e48a38495d000f2124020dc96bacc806a4340345211b1ab6175a6cb4/multidict-6.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056", size = 123016 }, + { url = "https://files.pythonhosted.org/packages/3e/b3/4950551ab8fc39862ba5e9907dc821f896aa829b4524b4deefd3e12945ab/multidict-6.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76", size = 133542 }, + { url = "https://files.pythonhosted.org/packages/96/4d/f0ce6ac9914168a2a71df117935bb1f1781916acdecbb43285e225b484b8/multidict-6.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160", size = 130163 }, + { url = "https://files.pythonhosted.org/packages/be/72/17c9f67e7542a49dd252c5ae50248607dfb780bcc03035907dafefb067e3/multidict-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7", size = 126832 }, + { url = "https://files.pythonhosted.org/packages/71/9f/72d719e248cbd755c8736c6d14780533a1606ffb3fbb0fbd77da9f0372da/multidict-6.1.0-cp310-cp310-win32.whl", hash = "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0", size = 26402 }, + { url = "https://files.pythonhosted.org/packages/04/5a/d88cd5d00a184e1ddffc82aa2e6e915164a6d2641ed3606e766b5d2f275a/multidict-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d", size = 28800 }, + { url = "https://files.pythonhosted.org/packages/93/13/df3505a46d0cd08428e4c8169a196131d1b0c4b515c3649829258843dde6/multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6", size = 48570 }, + { url = "https://files.pythonhosted.org/packages/f0/e1/a215908bfae1343cdb72f805366592bdd60487b4232d039c437fe8f5013d/multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156", size = 29316 }, + { url = "https://files.pythonhosted.org/packages/70/0f/6dc70ddf5d442702ed74f298d69977f904960b82368532c88e854b79f72b/multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb", size = 29640 }, + { url = "https://files.pythonhosted.org/packages/d8/6d/9c87b73a13d1cdea30b321ef4b3824449866bd7f7127eceed066ccb9b9ff/multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b", size = 131067 }, + { url = "https://files.pythonhosted.org/packages/cc/1e/1b34154fef373371fd6c65125b3d42ff5f56c7ccc6bfff91b9b3c60ae9e0/multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72", size = 138507 }, + { url = "https://files.pythonhosted.org/packages/fb/e0/0bc6b2bac6e461822b5f575eae85da6aae76d0e2a79b6665d6206b8e2e48/multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304", size = 133905 }, + { url = "https://files.pythonhosted.org/packages/ba/af/73d13b918071ff9b2205fcf773d316e0f8fefb4ec65354bbcf0b10908cc6/multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351", size = 129004 }, + { url = "https://files.pythonhosted.org/packages/74/21/23960627b00ed39643302d81bcda44c9444ebcdc04ee5bedd0757513f259/multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb", size = 121308 }, + { url = "https://files.pythonhosted.org/packages/8b/5c/cf282263ffce4a596ed0bb2aa1a1dddfe1996d6a62d08842a8d4b33dca13/multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3", size = 132608 }, + { url = "https://files.pythonhosted.org/packages/d7/3e/97e778c041c72063f42b290888daff008d3ab1427f5b09b714f5a8eff294/multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399", size = 127029 }, + { url = "https://files.pythonhosted.org/packages/47/ac/3efb7bfe2f3aefcf8d103e9a7162572f01936155ab2f7ebcc7c255a23212/multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423", size = 137594 }, + { url = "https://files.pythonhosted.org/packages/42/9b/6c6e9e8dc4f915fc90a9b7798c44a30773dea2995fdcb619870e705afe2b/multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3", size = 134556 }, + { url = "https://files.pythonhosted.org/packages/1d/10/8e881743b26aaf718379a14ac58572a240e8293a1c9d68e1418fb11c0f90/multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753", size = 130993 }, + { url = "https://files.pythonhosted.org/packages/45/84/3eb91b4b557442802d058a7579e864b329968c8d0ea57d907e7023c677f2/multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80", size = 26405 }, + { url = "https://files.pythonhosted.org/packages/9f/0b/ad879847ecbf6d27e90a6eabb7eff6b62c129eefe617ea45eae7c1f0aead/multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926", size = 28795 }, + { url = "https://files.pythonhosted.org/packages/fd/16/92057c74ba3b96d5e211b553895cd6dc7cc4d1e43d9ab8fafc727681ef71/multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa", size = 48713 }, + { url = "https://files.pythonhosted.org/packages/94/3d/37d1b8893ae79716179540b89fc6a0ee56b4a65fcc0d63535c6f5d96f217/multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436", size = 29516 }, + { url = "https://files.pythonhosted.org/packages/a2/12/adb6b3200c363062f805275b4c1e656be2b3681aada66c80129932ff0bae/multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761", size = 29557 }, + { url = "https://files.pythonhosted.org/packages/47/e9/604bb05e6e5bce1e6a5cf80a474e0f072e80d8ac105f1b994a53e0b28c42/multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e", size = 130170 }, + { url = "https://files.pythonhosted.org/packages/7e/13/9efa50801785eccbf7086b3c83b71a4fb501a4d43549c2f2f80b8787d69f/multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef", size = 134836 }, + { url = "https://files.pythonhosted.org/packages/bf/0f/93808b765192780d117814a6dfcc2e75de6dcc610009ad408b8814dca3ba/multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95", size = 133475 }, + { url = "https://files.pythonhosted.org/packages/d3/c8/529101d7176fe7dfe1d99604e48d69c5dfdcadb4f06561f465c8ef12b4df/multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925", size = 131049 }, + { url = "https://files.pythonhosted.org/packages/ca/0c/fc85b439014d5a58063e19c3a158a889deec399d47b5269a0f3b6a2e28bc/multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966", size = 120370 }, + { url = "https://files.pythonhosted.org/packages/db/46/d4416eb20176492d2258fbd47b4abe729ff3b6e9c829ea4236f93c865089/multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305", size = 125178 }, + { url = "https://files.pythonhosted.org/packages/5b/46/73697ad7ec521df7de5531a32780bbfd908ded0643cbe457f981a701457c/multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2", size = 119567 }, + { url = "https://files.pythonhosted.org/packages/cd/ed/51f060e2cb0e7635329fa6ff930aa5cffa17f4c7f5c6c3ddc3500708e2f2/multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2", size = 129822 }, + { url = "https://files.pythonhosted.org/packages/df/9e/ee7d1954b1331da3eddea0c4e08d9142da5f14b1321c7301f5014f49d492/multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6", size = 128656 }, + { url = "https://files.pythonhosted.org/packages/77/00/8538f11e3356b5d95fa4b024aa566cde7a38aa7a5f08f4912b32a037c5dc/multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3", size = 125360 }, + { url = "https://files.pythonhosted.org/packages/be/05/5d334c1f2462d43fec2363cd00b1c44c93a78c3925d952e9a71caf662e96/multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133", size = 26382 }, + { url = "https://files.pythonhosted.org/packages/a3/bf/f332a13486b1ed0496d624bcc7e8357bb8053823e8cd4b9a18edc1d97e73/multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1", size = 28529 }, + { url = "https://files.pythonhosted.org/packages/22/67/1c7c0f39fe069aa4e5d794f323be24bf4d33d62d2a348acdb7991f8f30db/multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008", size = 48771 }, + { url = "https://files.pythonhosted.org/packages/3c/25/c186ee7b212bdf0df2519eacfb1981a017bda34392c67542c274651daf23/multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f", size = 29533 }, + { url = "https://files.pythonhosted.org/packages/67/5e/04575fd837e0958e324ca035b339cea174554f6f641d3fb2b4f2e7ff44a2/multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28", size = 29595 }, + { url = "https://files.pythonhosted.org/packages/d3/b2/e56388f86663810c07cfe4a3c3d87227f3811eeb2d08450b9e5d19d78876/multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b", size = 130094 }, + { url = "https://files.pythonhosted.org/packages/6c/ee/30ae9b4186a644d284543d55d491fbd4239b015d36b23fea43b4c94f7052/multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c", size = 134876 }, + { url = "https://files.pythonhosted.org/packages/84/c7/70461c13ba8ce3c779503c70ec9d0345ae84de04521c1f45a04d5f48943d/multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3", size = 133500 }, + { url = "https://files.pythonhosted.org/packages/4a/9f/002af221253f10f99959561123fae676148dd730e2daa2cd053846a58507/multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44", size = 131099 }, + { url = "https://files.pythonhosted.org/packages/82/42/d1c7a7301d52af79d88548a97e297f9d99c961ad76bbe6f67442bb77f097/multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2", size = 120403 }, + { url = "https://files.pythonhosted.org/packages/68/f3/471985c2c7ac707547553e8f37cff5158030d36bdec4414cb825fbaa5327/multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3", size = 125348 }, + { url = "https://files.pythonhosted.org/packages/67/2c/e6df05c77e0e433c214ec1d21ddd203d9a4770a1f2866a8ca40a545869a0/multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa", size = 119673 }, + { url = "https://files.pythonhosted.org/packages/c5/cd/bc8608fff06239c9fb333f9db7743a1b2eafe98c2666c9a196e867a3a0a4/multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa", size = 129927 }, + { url = "https://files.pythonhosted.org/packages/44/8e/281b69b7bc84fc963a44dc6e0bbcc7150e517b91df368a27834299a526ac/multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4", size = 128711 }, + { url = "https://files.pythonhosted.org/packages/12/a4/63e7cd38ed29dd9f1881d5119f272c898ca92536cdb53ffe0843197f6c85/multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6", size = 125519 }, + { url = "https://files.pythonhosted.org/packages/38/e0/4f5855037a72cd8a7a2f60a3952d9aa45feedb37ae7831642102604e8a37/multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81", size = 26426 }, + { url = "https://files.pythonhosted.org/packages/7e/a5/17ee3a4db1e310b7405f5d25834460073a8ccd86198ce044dfaf69eac073/multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774", size = 28531 }, + { url = "https://files.pythonhosted.org/packages/99/b7/b9e70fde2c0f0c9af4cc5277782a89b66d35948ea3369ec9f598358c3ac5/multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506", size = 10051 }, +] + +[[package]] +name = "numpy" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/47/1b/1d565e0f6e156e1522ab564176b8b29d71e13d8caf003a08768df3d5cec5/numpy-2.2.0.tar.gz", hash = "sha256:140dd80ff8981a583a60980be1a655068f8adebf7a45a06a6858c873fcdcd4a0", size = 20225497 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/81/3882353e097204fe4d7a5fe026b694b0104b78f930c969faadeed1538e00/numpy-2.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1e25507d85da11ff5066269d0bd25d06e0a0f2e908415534f3e603d2a78e4ffa", size = 21212476 }, + { url = "https://files.pythonhosted.org/packages/2c/64/5577dc71240272749e07fcacb47c0f29e31ba4fbd1613fefbd1aa88efc29/numpy-2.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a62eb442011776e4036af5c8b1a00b706c5bc02dc15eb5344b0c750428c94219", size = 14351441 }, + { url = "https://files.pythonhosted.org/packages/c9/43/850c040481c19c1c2289203a606df1a202eeb3aa81440624bac891024f83/numpy-2.2.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:b606b1aaf802e6468c2608c65ff7ece53eae1a6874b3765f69b8ceb20c5fa78e", size = 5390304 }, + { url = "https://files.pythonhosted.org/packages/73/96/a4c8a86300dbafc7e4f44d8986f8b64950b7f4640a2dc5c91e036afe28c6/numpy-2.2.0-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:36b2b43146f646642b425dd2027730f99bac962618ec2052932157e213a040e9", size = 6925476 }, + { url = "https://files.pythonhosted.org/packages/0c/0a/22129c3107c4fb237f97876df4399a5c3a83f3d95f86e0353ae6fbbd202f/numpy-2.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fe8f3583e0607ad4e43a954e35c1748b553bfe9fdac8635c02058023277d1b3", size = 14329997 }, + { url = "https://files.pythonhosted.org/packages/4c/49/c2adeccc8a47bcd9335ec000dfcb4de34a7c34aeaa23af57cd504017e8c3/numpy-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:122fd2fcfafdefc889c64ad99c228d5a1f9692c3a83f56c292618a59aa60ae83", size = 16378908 }, + { url = "https://files.pythonhosted.org/packages/8d/85/b65f4596748cc5468c0a978a16b3be45f6bcec78339b0fe7bce71d121d89/numpy-2.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3f2f5cddeaa4424a0a118924b988746db6ffa8565e5829b1841a8a3bd73eb59a", size = 15540949 }, + { url = "https://files.pythonhosted.org/packages/ff/b3/3b18321c94a6a6a1d972baf1b39a6de50e65c991002c014ffbcce7e09be8/numpy-2.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7fe4bb0695fe986a9e4deec3b6857003b4cfe5c5e4aac0b95f6a658c14635e31", size = 18167677 }, + { url = "https://files.pythonhosted.org/packages/41/f0/fa2a76e893a05764e4474f6011575c4e4ccf32af9c95bfcc8ef4b8a99f69/numpy-2.2.0-cp310-cp310-win32.whl", hash = "sha256:b30042fe92dbd79f1ba7f6898fada10bdaad1847c44f2dff9a16147e00a93661", size = 6570288 }, + { url = "https://files.pythonhosted.org/packages/97/4e/0b7debcd013214db224997b0d3e39bb7b3656d37d06dfc31bb57d42d143b/numpy-2.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:54dc1d6d66f8d37843ed281773c7174f03bf7ad826523f73435deb88ba60d2d4", size = 12912730 }, + { url = "https://files.pythonhosted.org/packages/80/1b/736023977a96e787c4e7653a1ac2d31d4f6ab6b4048f83c8359f7c0af2e3/numpy-2.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9874bc2ff574c40ab7a5cbb7464bf9b045d617e36754a7bc93f933d52bd9ffc6", size = 21216607 }, + { url = "https://files.pythonhosted.org/packages/85/4f/5f0be4c5c93525e663573bab9e29bd88a71f85de3a0d01413ee05bce0c2f/numpy-2.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0da8495970f6b101ddd0c38ace92edea30e7e12b9a926b57f5fabb1ecc25bb90", size = 14387756 }, + { url = "https://files.pythonhosted.org/packages/36/78/c38af7833c4f29999cdacdf12452b43b660cd25a1990ea9a7edf1fb01f17/numpy-2.2.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:0557eebc699c1c34cccdd8c3778c9294e8196df27d713706895edc6f57d29608", size = 5388483 }, + { url = "https://files.pythonhosted.org/packages/e9/b5/306ac6ee3f8f0c51abd3664ee8a9b8e264cbf179a860674827151ecc0a9c/numpy-2.2.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:3579eaeb5e07f3ded59298ce22b65f877a86ba8e9fe701f5576c99bb17c283da", size = 6929721 }, + { url = "https://files.pythonhosted.org/packages/ea/15/e33a7d86d8ce91de82c34ce94a87f2b8df891e603675e83ec7039325ff10/numpy-2.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40deb10198bbaa531509aad0cd2f9fadb26c8b94070831e2208e7df543562b74", size = 14334667 }, + { url = "https://files.pythonhosted.org/packages/52/33/10825f580f42a353f744abc450dcd2a4b1e6f1931abb0ccbd1d63bd3993c/numpy-2.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2aed8fcf8abc3020d6a9ccb31dbc9e7d7819c56a348cc88fd44be269b37427e", size = 16390204 }, + { url = "https://files.pythonhosted.org/packages/b4/24/36cce77559572bdc6c8bcdd2f3e0db03c7079d14b9a1cd342476d7f451e8/numpy-2.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a222d764352c773aa5ebde02dd84dba3279c81c6db2e482d62a3fa54e5ece69b", size = 15556123 }, + { url = "https://files.pythonhosted.org/packages/05/51/2d706d14adee8f5c70c5de3831673d4d57051fc9ac6f3f6bff8811d2f9bd/numpy-2.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4e58666988605e251d42c2818c7d3d8991555381be26399303053b58a5bbf30d", size = 18179898 }, + { url = "https://files.pythonhosted.org/packages/8a/e7/ea8b7652564113f218e75b296e3545a256d88b233021f792fd08591e8f33/numpy-2.2.0-cp311-cp311-win32.whl", hash = "sha256:4723a50e1523e1de4fccd1b9a6dcea750c2102461e9a02b2ac55ffeae09a4410", size = 6568146 }, + { url = "https://files.pythonhosted.org/packages/d0/06/3d1ff6ed377cb0340baf90487a35f15f9dc1db8e0a07de2bf2c54a8e490f/numpy-2.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:16757cf28621e43e252c560d25b15f18a2f11da94fea344bf26c599b9cf54b73", size = 12916677 }, + { url = "https://files.pythonhosted.org/packages/7f/bc/a20dc4e1d051149052762e7647455311865d11c603170c476d1e910a353e/numpy-2.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cff210198bb4cae3f3c100444c5eaa573a823f05c253e7188e1362a5555235b3", size = 20909153 }, + { url = "https://files.pythonhosted.org/packages/60/3d/ac4fb63f36db94f4c7db05b45e3ecb3f88f778ca71850664460c78cfde41/numpy-2.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58b92a5828bd4d9aa0952492b7de803135038de47343b2aa3cc23f3b71a3dc4e", size = 14095021 }, + { url = "https://files.pythonhosted.org/packages/41/6d/a654d519d24e4fcc7a83d4a51209cda086f26cf30722b3d8ffc1aa9b775e/numpy-2.2.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:ebe5e59545401fbb1b24da76f006ab19734ae71e703cdb4a8b347e84a0cece67", size = 5125491 }, + { url = "https://files.pythonhosted.org/packages/e6/22/fab7e1510a62e5092f4e6507a279020052b89f11d9cfe52af7f52c243b04/numpy-2.2.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:e2b8cd48a9942ed3f85b95ca4105c45758438c7ed28fff1e4ce3e57c3b589d8e", size = 6658534 }, + { url = "https://files.pythonhosted.org/packages/fc/29/a3d938ddc5a534cd53df7ab79d20a68db8c67578de1df0ae0118230f5f54/numpy-2.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57fcc997ffc0bef234b8875a54d4058afa92b0b0c4223fc1f62f24b3b5e86038", size = 14046306 }, + { url = "https://files.pythonhosted.org/packages/90/24/d0bbb56abdd8934f30384632e3c2ca1ebfeb5d17e150c6e366ba291de36b/numpy-2.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ad7d11b309bd132d74397fcf2920933c9d1dc865487128f5c03d580f2c3d03", size = 16095819 }, + { url = "https://files.pythonhosted.org/packages/99/9c/58a673faa9e8a0e77248e782f7a17410cf7259b326265646fd50ed49c4e1/numpy-2.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cb24cca1968b21355cc6f3da1a20cd1cebd8a023e3c5b09b432444617949085a", size = 15243215 }, + { url = "https://files.pythonhosted.org/packages/9c/61/f311693f78cbf635cfb69ce9e1e857ff83937a27d93c96ac5932fd33e330/numpy-2.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0798b138c291d792f8ea40fe3768610f3c7dd2574389e37c3f26573757c8f7ef", size = 17860175 }, + { url = "https://files.pythonhosted.org/packages/11/3e/491c34262cb1fc9dd13a00beb80d755ee0517b17db20e54cac7aa524533e/numpy-2.2.0-cp312-cp312-win32.whl", hash = "sha256:afe8fb968743d40435c3827632fd36c5fbde633b0423da7692e426529b1759b1", size = 6273281 }, + { url = "https://files.pythonhosted.org/packages/89/ea/00537f599eb230771157bc509f6ea5b2dddf05d4b09f9d2f1d7096a18781/numpy-2.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:3a4199f519e57d517ebd48cb76b36c82da0360781c6a0353e64c0cac30ecaad3", size = 12613227 }, + { url = "https://files.pythonhosted.org/packages/bd/4c/0d1eef206545c994289e7a9de21b642880a11e0ed47a2b0c407c688c4f69/numpy-2.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f8c8b141ef9699ae777c6278b52c706b653bf15d135d302754f6b2e90eb30367", size = 20895707 }, + { url = "https://files.pythonhosted.org/packages/16/cb/88f6c1e6df83002c421d5f854ccf134aa088aa997af786a5dac3f32ec99b/numpy-2.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0f0986e917aca18f7a567b812ef7ca9391288e2acb7a4308aa9d265bd724bdae", size = 14110592 }, + { url = "https://files.pythonhosted.org/packages/b4/54/817e6894168a43f33dca74199ba0dd0f1acd99aa6323ed6d323d63d640a2/numpy-2.2.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:1c92113619f7b272838b8d6702a7f8ebe5edea0df48166c47929611d0b4dea69", size = 5110858 }, + { url = "https://files.pythonhosted.org/packages/c7/99/00d8a1a8eb70425bba7880257ed73fed08d3e8d05da4202fb6b9a81d5ee4/numpy-2.2.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5a145e956b374e72ad1dff82779177d4a3c62bc8248f41b80cb5122e68f22d13", size = 6645143 }, + { url = "https://files.pythonhosted.org/packages/34/86/5b9c2b7c56e7a9d9297a0a4be0b8433f498eba52a8f5892d9132b0f64627/numpy-2.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18142b497d70a34b01642b9feabb70156311b326fdddd875a9981f34a369b671", size = 14042812 }, + { url = "https://files.pythonhosted.org/packages/df/54/13535f74391dbe5f479ceed96f1403267be302c840040700d4fd66688089/numpy-2.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7d41d1612c1a82b64697e894b75db6758d4f21c3ec069d841e60ebe54b5b571", size = 16093419 }, + { url = "https://files.pythonhosted.org/packages/dd/37/dfb2056842ac61315f225aa56f455da369f5223e4c5a38b91d20da1b628b/numpy-2.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a98f6f20465e7618c83252c02041517bd2f7ea29be5378f09667a8f654a5918d", size = 15238969 }, + { url = "https://files.pythonhosted.org/packages/5a/3d/d20d24ee313992f0b7e7b9d9eef642d9b545d39d5b91c4a2cc8c98776328/numpy-2.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e09d40edfdb4e260cb1567d8ae770ccf3b8b7e9f0d9b5c2a9992696b30ce2742", size = 17855705 }, + { url = "https://files.pythonhosted.org/packages/5b/40/944c9ee264f875a2db6f79380944fd2b5bb9d712bb4a134d11f45ad5b693/numpy-2.2.0-cp313-cp313-win32.whl", hash = "sha256:3905a5fffcc23e597ee4d9fb3fcd209bd658c352657548db7316e810ca80458e", size = 6270078 }, + { url = "https://files.pythonhosted.org/packages/30/04/e1ee6f8b22034302d4c5c24e15782bdedf76d90b90f3874ed0b48525def0/numpy-2.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:a184288538e6ad699cbe6b24859206e38ce5fba28f3bcfa51c90d0502c1582b2", size = 12605791 }, + { url = "https://files.pythonhosted.org/packages/ef/fb/51d458625cd6134d60ac15180ae50995d7d21b0f2f92a6286ae7b0792d19/numpy-2.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7832f9e8eb00be32f15fdfb9a981d6955ea9adc8574c521d48710171b6c55e95", size = 20920160 }, + { url = "https://files.pythonhosted.org/packages/b4/34/162ae0c5d2536ea4be98c813b5161c980f0443cd5765fde16ddfe3450140/numpy-2.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f0dd071b95bbca244f4cb7f70b77d2ff3aaaba7fa16dc41f58d14854a6204e6c", size = 14119064 }, + { url = "https://files.pythonhosted.org/packages/17/6c/4195dd0e1c41c55f466d516e17e9e28510f32af76d23061ea3da67438e3c/numpy-2.2.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:b0b227dcff8cdc3efbce66d4e50891f04d0a387cce282fe1e66199146a6a8fca", size = 5152778 }, + { url = "https://files.pythonhosted.org/packages/2f/47/ea804ae525832c8d05ed85b560dfd242d34e4bb0962bc269ccaa720fb934/numpy-2.2.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:6ab153263a7c5ccaf6dfe7e53447b74f77789f28ecb278c3b5d49db7ece10d6d", size = 6667605 }, + { url = "https://files.pythonhosted.org/packages/76/99/34d20e50b3d894bb16b5374bfbee399ab8ff3a33bf1e1f0b8acfe7bbd70d/numpy-2.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e500aba968a48e9019e42c0c199b7ec0696a97fa69037bea163b55398e390529", size = 14013275 }, + { url = "https://files.pythonhosted.org/packages/69/8f/a1df7bd02d434ab82539517d1b98028985700cfc4300bc5496fb140ca648/numpy-2.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:440cfb3db4c5029775803794f8638fbdbf71ec702caf32735f53b008e1eaece3", size = 16074900 }, + { url = "https://files.pythonhosted.org/packages/04/94/b419e7a76bf21a00fcb03c613583f10e389fdc8dfe420412ff5710c8ad3d/numpy-2.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a55dc7a7f0b6198b07ec0cd445fbb98b05234e8b00c5ac4874a63372ba98d4ab", size = 15219122 }, + { url = "https://files.pythonhosted.org/packages/65/d9/dddf398b2b6c5d750892a207a469c2854a8db0f033edaf72103af8cf05aa/numpy-2.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4bddbaa30d78c86329b26bd6aaaea06b1e47444da99eddac7bf1e2fab717bd72", size = 17851668 }, + { url = "https://files.pythonhosted.org/packages/d4/dc/09a4e5819a9782a213c0eb4eecacdc1cd75ad8dac99279b04cfccb7eeb0a/numpy-2.2.0-cp313-cp313t-win32.whl", hash = "sha256:30bf971c12e4365153afb31fc73f441d4da157153f3400b82db32d04de1e4066", size = 6325288 }, + { url = "https://files.pythonhosted.org/packages/ce/e1/e0d06ec34036c92b43aef206efe99a5f5f04e12c776eab82a36e00c40afc/numpy-2.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d35717333b39d1b6bb8433fa758a55f1081543de527171543a2b710551d40881", size = 12692303 }, + { url = "https://files.pythonhosted.org/packages/f3/18/6d4e1274f221073058b621f4df8050958b7564b24b4fa25be9f1b7639274/numpy-2.2.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e12c6c1ce84628c52d6367863773f7c8c8241be554e8b79686e91a43f1733773", size = 21043901 }, + { url = "https://files.pythonhosted.org/packages/19/3e/2b20599e7ead7ae1b89a77bb34f88c5ec12e43fbb320576ed646388d2cb7/numpy-2.2.0-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:b6207dc8fb3c8cb5668e885cef9ec7f70189bec4e276f0ff70d5aa078d32c88e", size = 6789122 }, + { url = "https://files.pythonhosted.org/packages/c9/5a/378954132c192fafa6c3d5c160092a427c7562e5bda0cc6ad9cc37008a7a/numpy-2.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a50aeff71d0f97b6450d33940c7181b08be1441c6c193e678211bff11aa725e7", size = 16194018 }, + { url = "https://files.pythonhosted.org/packages/67/17/209bda34fc83f3436834392f44643e66dcf3c77465f232102e7f1c7d8eae/numpy-2.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:df12a1f99b99f569a7c2ae59aa2d31724e8d835fc7f33e14f4792e3071d11221", size = 12819486 }, +] + +[[package]] +name = "openai" +version = "1.57.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "distro" }, + { name = "httpx" }, + { name = "jiter" }, + { name = "pydantic" }, + { name = "sniffio" }, + { name = "tqdm" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/29/e4/267d7f3f93432454f6dde95f08c737f48f031090693e558e2da7e63909ec/openai-1.57.4.tar.gz", hash = "sha256:a8f071a3e9198e2818f63aade68e759417b9f62c0971bdb83de82504b70b77f7", size = 316459 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3e/be/b466c8b64b224d285a338fbc705dc9d58cd60068bbfb8be2e47b1691e55c/openai-1.57.4-py3-none-any.whl", hash = "sha256:7def1ab2d52f196357ce31b9cfcf4181529ce00838286426bb35be81c035dafb", size = 390267 }, +] + +[[package]] +name = "optype" +version = "0.7.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/08/b7/3053b7d8b648b077422cfd7235f83909b6b192c2fa42bb9dba51cdc773bf/optype-0.7.3.tar.gz", hash = "sha256:51c8dd104ac197457059bcee5e256160a641ca72c6c852012d952790a5e0cac0", size = 80608 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2b/92/466c23b21b341d062f33be00a307b1581b90ca86b07f27a4a71ecbec830b/optype-0.7.3-py3-none-any.whl", hash = "sha256:856416484131038799e0e9cefc19d0ef37e7b4fde2144f25e8bb0e8981ebbe95", size = 70043 }, +] + +[[package]] +name = "propcache" +version = "0.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/c8/2a13f78d82211490855b2fb303b6721348d0787fdd9a12ac46d99d3acde1/propcache-0.2.1.tar.gz", hash = "sha256:3f77ce728b19cb537714499928fe800c3dda29e8d9428778fc7c186da4c09a64", size = 41735 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/a5/0ea64c9426959ef145a938e38c832fc551843481d356713ececa9a8a64e8/propcache-0.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6b3f39a85d671436ee3d12c017f8fdea38509e4f25b28eb25877293c98c243f6", size = 79296 }, + { url = "https://files.pythonhosted.org/packages/76/5a/916db1aba735f55e5eca4733eea4d1973845cf77dfe67c2381a2ca3ce52d/propcache-0.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d51fbe4285d5db5d92a929e3e21536ea3dd43732c5b177c7ef03f918dff9f2", size = 45622 }, + { url = "https://files.pythonhosted.org/packages/2d/62/685d3cf268b8401ec12b250b925b21d152b9d193b7bffa5fdc4815c392c2/propcache-0.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6445804cf4ec763dc70de65a3b0d9954e868609e83850a47ca4f0cb64bd79fea", size = 45133 }, + { url = "https://files.pythonhosted.org/packages/4d/3d/31c9c29ee7192defc05aa4d01624fd85a41cf98e5922aaed206017329944/propcache-0.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9479aa06a793c5aeba49ce5c5692ffb51fcd9a7016e017d555d5e2b0045d212", size = 204809 }, + { url = "https://files.pythonhosted.org/packages/10/a1/e4050776f4797fc86140ac9a480d5dc069fbfa9d499fe5c5d2fa1ae71f07/propcache-0.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9631c5e8b5b3a0fda99cb0d29c18133bca1e18aea9effe55adb3da1adef80d3", size = 219109 }, + { url = "https://files.pythonhosted.org/packages/c9/c0/e7ae0df76343d5e107d81e59acc085cea5fd36a48aa53ef09add7503e888/propcache-0.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3156628250f46a0895f1f36e1d4fbe062a1af8718ec3ebeb746f1d23f0c5dc4d", size = 217368 }, + { url = "https://files.pythonhosted.org/packages/fc/e1/e0a2ed6394b5772508868a977d3238f4afb2eebaf9976f0b44a8d347ad63/propcache-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b6fb63ae352e13748289f04f37868099e69dba4c2b3e271c46061e82c745634", size = 205124 }, + { url = "https://files.pythonhosted.org/packages/50/c1/e388c232d15ca10f233c778bbdc1034ba53ede14c207a72008de45b2db2e/propcache-0.2.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:887d9b0a65404929641a9fabb6452b07fe4572b269d901d622d8a34a4e9043b2", size = 195463 }, + { url = "https://files.pythonhosted.org/packages/0a/fd/71b349b9def426cc73813dbd0f33e266de77305e337c8c12bfb0a2a82bfb/propcache-0.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a96dc1fa45bd8c407a0af03b2d5218392729e1822b0c32e62c5bf7eeb5fb3958", size = 198358 }, + { url = "https://files.pythonhosted.org/packages/02/f2/d7c497cd148ebfc5b0ae32808e6c1af5922215fe38c7a06e4e722fe937c8/propcache-0.2.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a7e65eb5c003a303b94aa2c3852ef130230ec79e349632d030e9571b87c4698c", size = 195560 }, + { url = "https://files.pythonhosted.org/packages/bb/57/f37041bbe5e0dfed80a3f6be2612a3a75b9cfe2652abf2c99bef3455bbad/propcache-0.2.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:999779addc413181912e984b942fbcc951be1f5b3663cd80b2687758f434c583", size = 196895 }, + { url = "https://files.pythonhosted.org/packages/83/36/ae3cc3e4f310bff2f064e3d2ed5558935cc7778d6f827dce74dcfa125304/propcache-0.2.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:19a0f89a7bb9d8048d9c4370c9c543c396e894c76be5525f5e1ad287f1750ddf", size = 207124 }, + { url = "https://files.pythonhosted.org/packages/8c/c4/811b9f311f10ce9d31a32ff14ce58500458443627e4df4ae9c264defba7f/propcache-0.2.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1ac2f5fe02fa75f56e1ad473f1175e11f475606ec9bd0be2e78e4734ad575034", size = 210442 }, + { url = "https://files.pythonhosted.org/packages/18/dd/a1670d483a61ecac0d7fc4305d91caaac7a8fc1b200ea3965a01cf03bced/propcache-0.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:574faa3b79e8ebac7cb1d7930f51184ba1ccf69adfdec53a12f319a06030a68b", size = 203219 }, + { url = "https://files.pythonhosted.org/packages/f9/2d/30ced5afde41b099b2dc0c6573b66b45d16d73090e85655f1a30c5a24e07/propcache-0.2.1-cp310-cp310-win32.whl", hash = "sha256:03ff9d3f665769b2a85e6157ac8b439644f2d7fd17615a82fa55739bc97863f4", size = 40313 }, + { url = "https://files.pythonhosted.org/packages/23/84/bd9b207ac80da237af77aa6e153b08ffa83264b1c7882495984fcbfcf85c/propcache-0.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:2d3af2e79991102678f53e0dbf4c35de99b6b8b58f29a27ca0325816364caaba", size = 44428 }, + { url = "https://files.pythonhosted.org/packages/bc/0f/2913b6791ebefb2b25b4efd4bb2299c985e09786b9f5b19184a88e5778dd/propcache-0.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ffc3cca89bb438fb9c95c13fc874012f7b9466b89328c3c8b1aa93cdcfadd16", size = 79297 }, + { url = "https://files.pythonhosted.org/packages/cf/73/af2053aeccd40b05d6e19058419ac77674daecdd32478088b79375b9ab54/propcache-0.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f174bbd484294ed9fdf09437f889f95807e5f229d5d93588d34e92106fbf6717", size = 45611 }, + { url = "https://files.pythonhosted.org/packages/3c/09/8386115ba7775ea3b9537730e8cf718d83bbf95bffe30757ccf37ec4e5da/propcache-0.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:70693319e0b8fd35dd863e3e29513875eb15c51945bf32519ef52927ca883bc3", size = 45146 }, + { url = "https://files.pythonhosted.org/packages/03/7a/793aa12f0537b2e520bf09f4c6833706b63170a211ad042ca71cbf79d9cb/propcache-0.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b480c6a4e1138e1aa137c0079b9b6305ec6dcc1098a8ca5196283e8a49df95a9", size = 232136 }, + { url = "https://files.pythonhosted.org/packages/f1/38/b921b3168d72111769f648314100558c2ea1d52eb3d1ba7ea5c4aa6f9848/propcache-0.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d27b84d5880f6d8aa9ae3edb253c59d9f6642ffbb2c889b78b60361eed449787", size = 239706 }, + { url = "https://files.pythonhosted.org/packages/14/29/4636f500c69b5edea7786db3c34eb6166f3384b905665ce312a6e42c720c/propcache-0.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:857112b22acd417c40fa4595db2fe28ab900c8c5fe4670c7989b1c0230955465", size = 238531 }, + { url = "https://files.pythonhosted.org/packages/85/14/01fe53580a8e1734ebb704a3482b7829a0ef4ea68d356141cf0994d9659b/propcache-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf6c4150f8c0e32d241436526f3c3f9cbd34429492abddbada2ffcff506c51af", size = 231063 }, + { url = "https://files.pythonhosted.org/packages/33/5c/1d961299f3c3b8438301ccfbff0143b69afcc30c05fa28673cface692305/propcache-0.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66d4cfda1d8ed687daa4bc0274fcfd5267873db9a5bc0418c2da19273040eeb7", size = 220134 }, + { url = "https://files.pythonhosted.org/packages/00/d0/ed735e76db279ba67a7d3b45ba4c654e7b02bc2f8050671ec365d8665e21/propcache-0.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c2f992c07c0fca81655066705beae35fc95a2fa7366467366db627d9f2ee097f", size = 220009 }, + { url = "https://files.pythonhosted.org/packages/75/90/ee8fab7304ad6533872fee982cfff5a53b63d095d78140827d93de22e2d4/propcache-0.2.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:4a571d97dbe66ef38e472703067021b1467025ec85707d57e78711c085984e54", size = 212199 }, + { url = "https://files.pythonhosted.org/packages/eb/ec/977ffaf1664f82e90737275873461695d4c9407d52abc2f3c3e24716da13/propcache-0.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bb6178c241278d5fe853b3de743087be7f5f4c6f7d6d22a3b524d323eecec505", size = 214827 }, + { url = "https://files.pythonhosted.org/packages/57/48/031fb87ab6081764054821a71b71942161619549396224cbb242922525e8/propcache-0.2.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ad1af54a62ffe39cf34db1aa6ed1a1873bd548f6401db39d8e7cd060b9211f82", size = 228009 }, + { url = "https://files.pythonhosted.org/packages/1a/06/ef1390f2524850838f2390421b23a8b298f6ce3396a7cc6d39dedd4047b0/propcache-0.2.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e7048abd75fe40712005bcfc06bb44b9dfcd8e101dda2ecf2f5aa46115ad07ca", size = 231638 }, + { url = "https://files.pythonhosted.org/packages/38/2a/101e6386d5a93358395da1d41642b79c1ee0f3b12e31727932b069282b1d/propcache-0.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:160291c60081f23ee43d44b08a7e5fb76681221a8e10b3139618c5a9a291b84e", size = 222788 }, + { url = "https://files.pythonhosted.org/packages/db/81/786f687951d0979007e05ad9346cd357e50e3d0b0f1a1d6074df334b1bbb/propcache-0.2.1-cp311-cp311-win32.whl", hash = "sha256:819ce3b883b7576ca28da3861c7e1a88afd08cc8c96908e08a3f4dd64a228034", size = 40170 }, + { url = "https://files.pythonhosted.org/packages/cf/59/7cc7037b295d5772eceb426358bb1b86e6cab4616d971bd74275395d100d/propcache-0.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:edc9fc7051e3350643ad929df55c451899bb9ae6d24998a949d2e4c87fb596d3", size = 44404 }, + { url = "https://files.pythonhosted.org/packages/4c/28/1d205fe49be8b1b4df4c50024e62480a442b1a7b818e734308bb0d17e7fb/propcache-0.2.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:081a430aa8d5e8876c6909b67bd2d937bfd531b0382d3fdedb82612c618bc41a", size = 79588 }, + { url = "https://files.pythonhosted.org/packages/21/ee/fc4d893f8d81cd4971affef2a6cb542b36617cd1d8ce56b406112cb80bf7/propcache-0.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2ccec9ac47cf4e04897619c0e0c1a48c54a71bdf045117d3a26f80d38ab1fb0", size = 45825 }, + { url = "https://files.pythonhosted.org/packages/4a/de/bbe712f94d088da1d237c35d735f675e494a816fd6f54e9db2f61ef4d03f/propcache-0.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:14d86fe14b7e04fa306e0c43cdbeebe6b2c2156a0c9ce56b815faacc193e320d", size = 45357 }, + { url = "https://files.pythonhosted.org/packages/7f/14/7ae06a6cf2a2f1cb382586d5a99efe66b0b3d0c6f9ac2f759e6f7af9d7cf/propcache-0.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:049324ee97bb67285b49632132db351b41e77833678432be52bdd0289c0e05e4", size = 241869 }, + { url = "https://files.pythonhosted.org/packages/cc/59/227a78be960b54a41124e639e2c39e8807ac0c751c735a900e21315f8c2b/propcache-0.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cd9a1d071158de1cc1c71a26014dcdfa7dd3d5f4f88c298c7f90ad6f27bb46d", size = 247884 }, + { url = "https://files.pythonhosted.org/packages/84/58/f62b4ffaedf88dc1b17f04d57d8536601e4e030feb26617228ef930c3279/propcache-0.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98110aa363f1bb4c073e8dcfaefd3a5cea0f0834c2aab23dda657e4dab2f53b5", size = 248486 }, + { url = "https://files.pythonhosted.org/packages/1c/07/ebe102777a830bca91bbb93e3479cd34c2ca5d0361b83be9dbd93104865e/propcache-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:647894f5ae99c4cf6bb82a1bb3a796f6e06af3caa3d32e26d2350d0e3e3faf24", size = 243649 }, + { url = "https://files.pythonhosted.org/packages/ed/bc/4f7aba7f08f520376c4bb6a20b9a981a581b7f2e385fa0ec9f789bb2d362/propcache-0.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfd3223c15bebe26518d58ccf9a39b93948d3dcb3e57a20480dfdd315356baff", size = 229103 }, + { url = "https://files.pythonhosted.org/packages/fe/d5/04ac9cd4e51a57a96f78795e03c5a0ddb8f23ec098b86f92de028d7f2a6b/propcache-0.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d71264a80f3fcf512eb4f18f59423fe82d6e346ee97b90625f283df56aee103f", size = 226607 }, + { url = "https://files.pythonhosted.org/packages/e3/f0/24060d959ea41d7a7cc7fdbf68b31852331aabda914a0c63bdb0e22e96d6/propcache-0.2.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e73091191e4280403bde6c9a52a6999d69cdfde498f1fdf629105247599b57ec", size = 221153 }, + { url = "https://files.pythonhosted.org/packages/77/a7/3ac76045a077b3e4de4859a0753010765e45749bdf53bd02bc4d372da1a0/propcache-0.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3935bfa5fede35fb202c4b569bb9c042f337ca4ff7bd540a0aa5e37131659348", size = 222151 }, + { url = "https://files.pythonhosted.org/packages/e7/af/5e29da6f80cebab3f5a4dcd2a3240e7f56f2c4abf51cbfcc99be34e17f0b/propcache-0.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f508b0491767bb1f2b87fdfacaba5f7eddc2f867740ec69ece6d1946d29029a6", size = 233812 }, + { url = "https://files.pythonhosted.org/packages/8c/89/ebe3ad52642cc5509eaa453e9f4b94b374d81bae3265c59d5c2d98efa1b4/propcache-0.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1672137af7c46662a1c2be1e8dc78cb6d224319aaa40271c9257d886be4363a6", size = 238829 }, + { url = "https://files.pythonhosted.org/packages/e9/2f/6b32f273fa02e978b7577159eae7471b3cfb88b48563b1c2578b2d7ca0bb/propcache-0.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b74c261802d3d2b85c9df2dfb2fa81b6f90deeef63c2db9f0e029a3cac50b518", size = 230704 }, + { url = "https://files.pythonhosted.org/packages/5c/2e/f40ae6ff5624a5f77edd7b8359b208b5455ea113f68309e2b00a2e1426b6/propcache-0.2.1-cp312-cp312-win32.whl", hash = "sha256:d09c333d36c1409d56a9d29b3a1b800a42c76a57a5a8907eacdbce3f18768246", size = 40050 }, + { url = "https://files.pythonhosted.org/packages/3b/77/a92c3ef994e47180862b9d7d11e37624fb1c00a16d61faf55115d970628b/propcache-0.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:c214999039d4f2a5b2073ac506bba279945233da8c786e490d411dfc30f855c1", size = 44117 }, + { url = "https://files.pythonhosted.org/packages/0f/2a/329e0547cf2def8857157f9477669043e75524cc3e6251cef332b3ff256f/propcache-0.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aca405706e0b0a44cc6bfd41fbe89919a6a56999157f6de7e182a990c36e37bc", size = 77002 }, + { url = "https://files.pythonhosted.org/packages/12/2d/c4df5415e2382f840dc2ecbca0eeb2293024bc28e57a80392f2012b4708c/propcache-0.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:12d1083f001ace206fe34b6bdc2cb94be66d57a850866f0b908972f90996b3e9", size = 44639 }, + { url = "https://files.pythonhosted.org/packages/d0/5a/21aaa4ea2f326edaa4e240959ac8b8386ea31dedfdaa636a3544d9e7a408/propcache-0.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d93f3307ad32a27bda2e88ec81134b823c240aa3abb55821a8da553eed8d9439", size = 44049 }, + { url = "https://files.pythonhosted.org/packages/4e/3e/021b6cd86c0acc90d74784ccbb66808b0bd36067a1bf3e2deb0f3845f618/propcache-0.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba278acf14471d36316159c94a802933d10b6a1e117b8554fe0d0d9b75c9d536", size = 224819 }, + { url = "https://files.pythonhosted.org/packages/3c/57/c2fdeed1b3b8918b1770a133ba5c43ad3d78e18285b0c06364861ef5cc38/propcache-0.2.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4e6281aedfca15301c41f74d7005e6e3f4ca143584ba696ac69df4f02f40d629", size = 229625 }, + { url = "https://files.pythonhosted.org/packages/9d/81/70d4ff57bf2877b5780b466471bebf5892f851a7e2ca0ae7ffd728220281/propcache-0.2.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b750a8e5a1262434fb1517ddf64b5de58327f1adc3524a5e44c2ca43305eb0b", size = 232934 }, + { url = "https://files.pythonhosted.org/packages/3c/b9/bb51ea95d73b3fb4100cb95adbd4e1acaf2cbb1fd1083f5468eeb4a099a8/propcache-0.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf72af5e0fb40e9babf594308911436c8efde3cb5e75b6f206c34ad18be5c052", size = 227361 }, + { url = "https://files.pythonhosted.org/packages/f1/20/3c6d696cd6fd70b29445960cc803b1851a1131e7a2e4ee261ee48e002bcd/propcache-0.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2d0a12018b04f4cb820781ec0dffb5f7c7c1d2a5cd22bff7fb055a2cb19ebce", size = 213904 }, + { url = "https://files.pythonhosted.org/packages/a1/cb/1593bfc5ac6d40c010fa823f128056d6bc25b667f5393781e37d62f12005/propcache-0.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e800776a79a5aabdb17dcc2346a7d66d0777e942e4cd251defeb084762ecd17d", size = 212632 }, + { url = "https://files.pythonhosted.org/packages/6d/5c/e95617e222be14a34c709442a0ec179f3207f8a2b900273720501a70ec5e/propcache-0.2.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:4160d9283bd382fa6c0c2b5e017acc95bc183570cd70968b9202ad6d8fc48dce", size = 207897 }, + { url = "https://files.pythonhosted.org/packages/8e/3b/56c5ab3dc00f6375fbcdeefdede5adf9bee94f1fab04adc8db118f0f9e25/propcache-0.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:30b43e74f1359353341a7adb783c8f1b1c676367b011709f466f42fda2045e95", size = 208118 }, + { url = "https://files.pythonhosted.org/packages/86/25/d7ef738323fbc6ebcbce33eb2a19c5e07a89a3df2fded206065bd5e868a9/propcache-0.2.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:58791550b27d5488b1bb52bc96328456095d96206a250d28d874fafe11b3dfaf", size = 217851 }, + { url = "https://files.pythonhosted.org/packages/b3/77/763e6cef1852cf1ba740590364ec50309b89d1c818e3256d3929eb92fabf/propcache-0.2.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0f022d381747f0dfe27e99d928e31bc51a18b65bb9e481ae0af1380a6725dd1f", size = 222630 }, + { url = "https://files.pythonhosted.org/packages/4f/e9/0f86be33602089c701696fbed8d8c4c07b6ee9605c5b7536fd27ed540c5b/propcache-0.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:297878dc9d0a334358f9b608b56d02e72899f3b8499fc6044133f0d319e2ec30", size = 216269 }, + { url = "https://files.pythonhosted.org/packages/cc/02/5ac83217d522394b6a2e81a2e888167e7ca629ef6569a3f09852d6dcb01a/propcache-0.2.1-cp313-cp313-win32.whl", hash = "sha256:ddfab44e4489bd79bda09d84c430677fc7f0a4939a73d2bba3073036f487a0a6", size = 39472 }, + { url = "https://files.pythonhosted.org/packages/f4/33/d6f5420252a36034bc8a3a01171bc55b4bff5df50d1c63d9caa50693662f/propcache-0.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:556fc6c10989f19a179e4321e5d678db8eb2924131e64652a51fe83e4c3db0e1", size = 43363 }, + { url = "https://files.pythonhosted.org/packages/41/b6/c5319caea262f4821995dca2107483b94a3345d4607ad797c76cb9c36bcc/propcache-0.2.1-py3-none-any.whl", hash = "sha256:52277518d6aae65536e9cea52d4e7fd2f7a66f4aa2d30ed3f2fcea620ace3c54", size = 11818 }, +] + +[[package]] +name = "pydantic" +version = "2.10.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/45/0f/27908242621b14e649a84e62b133de45f84c255eecb350ab02979844a788/pydantic-2.10.3.tar.gz", hash = "sha256:cb5ac360ce894ceacd69c403187900a02c4b20b693a9dd1d643e1effab9eadf9", size = 786486 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/51/72c18c55cf2f46ff4f91ebcc8f75aa30f7305f3d726be3f4ebffb4ae972b/pydantic-2.10.3-py3-none-any.whl", hash = "sha256:be04d85bbc7b65651c5f8e6b9976ed9c6f41782a55524cef079a34a0bb82144d", size = 456997 }, +] + +[[package]] +name = "pydantic-core" +version = "2.27.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a6/9f/7de1f19b6aea45aeb441838782d68352e71bfa98ee6fa048d5041991b33e/pydantic_core-2.27.1.tar.gz", hash = "sha256:62a763352879b84aa31058fc931884055fd75089cccbd9d58bb6afd01141b235", size = 412785 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6e/ce/60fd96895c09738648c83f3f00f595c807cb6735c70d3306b548cc96dd49/pydantic_core-2.27.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:71a5e35c75c021aaf400ac048dacc855f000bdfed91614b4a726f7432f1f3d6a", size = 1897984 }, + { url = "https://files.pythonhosted.org/packages/fd/b9/84623d6b6be98cc209b06687d9bca5a7b966ffed008d15225dd0d20cce2e/pydantic_core-2.27.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f82d068a2d6ecfc6e054726080af69a6764a10015467d7d7b9f66d6ed5afa23b", size = 1807491 }, + { url = "https://files.pythonhosted.org/packages/01/72/59a70165eabbc93b1111d42df9ca016a4aa109409db04304829377947028/pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:121ceb0e822f79163dd4699e4c54f5ad38b157084d97b34de8b232bcaad70278", size = 1831953 }, + { url = "https://files.pythonhosted.org/packages/7c/0c/24841136476adafd26f94b45bb718a78cb0500bd7b4f8d667b67c29d7b0d/pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4603137322c18eaf2e06a4495f426aa8d8388940f3c457e7548145011bb68e05", size = 1856071 }, + { url = "https://files.pythonhosted.org/packages/53/5e/c32957a09cceb2af10d7642df45d1e3dbd8596061f700eac93b801de53c0/pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a33cd6ad9017bbeaa9ed78a2e0752c5e250eafb9534f308e7a5f7849b0b1bfb4", size = 2038439 }, + { url = "https://files.pythonhosted.org/packages/e4/8f/979ab3eccd118b638cd6d8f980fea8794f45018255a36044dea40fe579d4/pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15cc53a3179ba0fcefe1e3ae50beb2784dede4003ad2dfd24f81bba4b23a454f", size = 2787416 }, + { url = "https://files.pythonhosted.org/packages/02/1d/00f2e4626565b3b6d3690dab4d4fe1a26edd6a20e53749eb21ca892ef2df/pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45d9c5eb9273aa50999ad6adc6be5e0ecea7e09dbd0d31bd0c65a55a2592ca08", size = 2134548 }, + { url = "https://files.pythonhosted.org/packages/9d/46/3112621204128b90898adc2e721a3cd6cf5626504178d6f32c33b5a43b79/pydantic_core-2.27.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8bf7b66ce12a2ac52d16f776b31d16d91033150266eb796967a7e4621707e4f6", size = 1989882 }, + { url = "https://files.pythonhosted.org/packages/49/ec/557dd4ff5287ffffdf16a31d08d723de6762bb1b691879dc4423392309bc/pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:655d7dd86f26cb15ce8a431036f66ce0318648f8853d709b4167786ec2fa4807", size = 1995829 }, + { url = "https://files.pythonhosted.org/packages/6e/b2/610dbeb74d8d43921a7234555e4c091cb050a2bdb8cfea86d07791ce01c5/pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:5556470f1a2157031e676f776c2bc20acd34c1990ca5f7e56f1ebf938b9ab57c", size = 2091257 }, + { url = "https://files.pythonhosted.org/packages/8c/7f/4bf8e9d26a9118521c80b229291fa9558a07cdd9a968ec2d5c1026f14fbc/pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f69ed81ab24d5a3bd93861c8c4436f54afdf8e8cc421562b0c7504cf3be58206", size = 2143894 }, + { url = "https://files.pythonhosted.org/packages/1f/1c/875ac7139c958f4390f23656fe696d1acc8edf45fb81e4831960f12cd6e4/pydantic_core-2.27.1-cp310-none-win32.whl", hash = "sha256:f5a823165e6d04ccea61a9f0576f345f8ce40ed533013580e087bd4d7442b52c", size = 1816081 }, + { url = "https://files.pythonhosted.org/packages/d7/41/55a117acaeda25ceae51030b518032934f251b1dac3704a53781383e3491/pydantic_core-2.27.1-cp310-none-win_amd64.whl", hash = "sha256:57866a76e0b3823e0b56692d1a0bf722bffb324839bb5b7226a7dbd6c9a40b17", size = 1981109 }, + { url = "https://files.pythonhosted.org/packages/27/39/46fe47f2ad4746b478ba89c561cafe4428e02b3573df882334bd2964f9cb/pydantic_core-2.27.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ac3b20653bdbe160febbea8aa6c079d3df19310d50ac314911ed8cc4eb7f8cb8", size = 1895553 }, + { url = "https://files.pythonhosted.org/packages/1c/00/0804e84a78b7fdb394fff4c4f429815a10e5e0993e6ae0e0b27dd20379ee/pydantic_core-2.27.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a5a8e19d7c707c4cadb8c18f5f60c843052ae83c20fa7d44f41594c644a1d330", size = 1807220 }, + { url = "https://files.pythonhosted.org/packages/01/de/df51b3bac9820d38371f5a261020f505025df732ce566c2a2e7970b84c8c/pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f7059ca8d64fea7f238994c97d91f75965216bcbe5f695bb44f354893f11d52", size = 1829727 }, + { url = "https://files.pythonhosted.org/packages/5f/d9/c01d19da8f9e9fbdb2bf99f8358d145a312590374d0dc9dd8dbe484a9cde/pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bed0f8a0eeea9fb72937ba118f9db0cb7e90773462af7962d382445f3005e5a4", size = 1854282 }, + { url = "https://files.pythonhosted.org/packages/5f/84/7db66eb12a0dc88c006abd6f3cbbf4232d26adfd827a28638c540d8f871d/pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a3cb37038123447cf0f3ea4c74751f6a9d7afef0eb71aa07bf5f652b5e6a132c", size = 2037437 }, + { url = "https://files.pythonhosted.org/packages/34/ac/a2537958db8299fbabed81167d58cc1506049dba4163433524e06a7d9f4c/pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84286494f6c5d05243456e04223d5a9417d7f443c3b76065e75001beb26f88de", size = 2780899 }, + { url = "https://files.pythonhosted.org/packages/4a/c1/3e38cd777ef832c4fdce11d204592e135ddeedb6c6f525478a53d1c7d3e5/pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acc07b2cfc5b835444b44a9956846b578d27beeacd4b52e45489e93276241025", size = 2135022 }, + { url = "https://files.pythonhosted.org/packages/7a/69/b9952829f80fd555fe04340539d90e000a146f2a003d3fcd1e7077c06c71/pydantic_core-2.27.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4fefee876e07a6e9aad7a8c8c9f85b0cdbe7df52b8a9552307b09050f7512c7e", size = 1987969 }, + { url = "https://files.pythonhosted.org/packages/05/72/257b5824d7988af43460c4e22b63932ed651fe98804cc2793068de7ec554/pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:258c57abf1188926c774a4c94dd29237e77eda19462e5bb901d88adcab6af919", size = 1994625 }, + { url = "https://files.pythonhosted.org/packages/73/c3/78ed6b7f3278a36589bcdd01243189ade7fc9b26852844938b4d7693895b/pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:35c14ac45fcfdf7167ca76cc80b2001205a8d5d16d80524e13508371fb8cdd9c", size = 2090089 }, + { url = "https://files.pythonhosted.org/packages/8d/c8/b4139b2f78579960353c4cd987e035108c93a78371bb19ba0dc1ac3b3220/pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d1b26e1dff225c31897696cab7d4f0a315d4c0d9e8666dbffdb28216f3b17fdc", size = 2142496 }, + { url = "https://files.pythonhosted.org/packages/3e/f8/171a03e97eb36c0b51981efe0f78460554a1d8311773d3d30e20c005164e/pydantic_core-2.27.1-cp311-none-win32.whl", hash = "sha256:2cdf7d86886bc6982354862204ae3b2f7f96f21a3eb0ba5ca0ac42c7b38598b9", size = 1811758 }, + { url = "https://files.pythonhosted.org/packages/6a/fe/4e0e63c418c1c76e33974a05266e5633e879d4061f9533b1706a86f77d5b/pydantic_core-2.27.1-cp311-none-win_amd64.whl", hash = "sha256:3af385b0cee8df3746c3f406f38bcbfdc9041b5c2d5ce3e5fc6637256e60bbc5", size = 1980864 }, + { url = "https://files.pythonhosted.org/packages/50/fc/93f7238a514c155a8ec02fc7ac6376177d449848115e4519b853820436c5/pydantic_core-2.27.1-cp311-none-win_arm64.whl", hash = "sha256:81f2ec23ddc1b476ff96563f2e8d723830b06dceae348ce02914a37cb4e74b89", size = 1864327 }, + { url = "https://files.pythonhosted.org/packages/be/51/2e9b3788feb2aebff2aa9dfbf060ec739b38c05c46847601134cc1fed2ea/pydantic_core-2.27.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9cbd94fc661d2bab2bc702cddd2d3370bbdcc4cd0f8f57488a81bcce90c7a54f", size = 1895239 }, + { url = "https://files.pythonhosted.org/packages/7b/9e/f8063952e4a7d0127f5d1181addef9377505dcce3be224263b25c4f0bfd9/pydantic_core-2.27.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5f8c4718cd44ec1580e180cb739713ecda2bdee1341084c1467802a417fe0f02", size = 1805070 }, + { url = "https://files.pythonhosted.org/packages/2c/9d/e1d6c4561d262b52e41b17a7ef8301e2ba80b61e32e94520271029feb5d8/pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15aae984e46de8d376df515f00450d1522077254ef6b7ce189b38ecee7c9677c", size = 1828096 }, + { url = "https://files.pythonhosted.org/packages/be/65/80ff46de4266560baa4332ae3181fffc4488ea7d37282da1a62d10ab89a4/pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1ba5e3963344ff25fc8c40da90f44b0afca8cfd89d12964feb79ac1411a260ac", size = 1857708 }, + { url = "https://files.pythonhosted.org/packages/d5/ca/3370074ad758b04d9562b12ecdb088597f4d9d13893a48a583fb47682cdf/pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:992cea5f4f3b29d6b4f7f1726ed8ee46c8331c6b4eed6db5b40134c6fe1768bb", size = 2037751 }, + { url = "https://files.pythonhosted.org/packages/b1/e2/4ab72d93367194317b99d051947c071aef6e3eb95f7553eaa4208ecf9ba4/pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0325336f348dbee6550d129b1627cb8f5351a9dc91aad141ffb96d4937bd9529", size = 2733863 }, + { url = "https://files.pythonhosted.org/packages/8a/c6/8ae0831bf77f356bb73127ce5a95fe115b10f820ea480abbd72d3cc7ccf3/pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7597c07fbd11515f654d6ece3d0e4e5093edc30a436c63142d9a4b8e22f19c35", size = 2161161 }, + { url = "https://files.pythonhosted.org/packages/f1/f4/b2fe73241da2429400fc27ddeaa43e35562f96cf5b67499b2de52b528cad/pydantic_core-2.27.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3bbd5d8cc692616d5ef6fbbbd50dbec142c7e6ad9beb66b78a96e9c16729b089", size = 1993294 }, + { url = "https://files.pythonhosted.org/packages/77/29/4bb008823a7f4cc05828198153f9753b3bd4c104d93b8e0b1bfe4e187540/pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:dc61505e73298a84a2f317255fcc72b710b72980f3a1f670447a21efc88f8381", size = 2001468 }, + { url = "https://files.pythonhosted.org/packages/f2/a9/0eaceeba41b9fad851a4107e0cf999a34ae8f0d0d1f829e2574f3d8897b0/pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:e1f735dc43da318cad19b4173dd1ffce1d84aafd6c9b782b3abc04a0d5a6f5bb", size = 2091413 }, + { url = "https://files.pythonhosted.org/packages/d8/36/eb8697729725bc610fd73940f0d860d791dc2ad557faaefcbb3edbd2b349/pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f4e5658dbffe8843a0f12366a4c2d1c316dbe09bb4dfbdc9d2d9cd6031de8aae", size = 2154735 }, + { url = "https://files.pythonhosted.org/packages/52/e5/4f0fbd5c5995cc70d3afed1b5c754055bb67908f55b5cb8000f7112749bf/pydantic_core-2.27.1-cp312-none-win32.whl", hash = "sha256:672ebbe820bb37988c4d136eca2652ee114992d5d41c7e4858cdd90ea94ffe5c", size = 1833633 }, + { url = "https://files.pythonhosted.org/packages/ee/f2/c61486eee27cae5ac781305658779b4a6b45f9cc9d02c90cb21b940e82cc/pydantic_core-2.27.1-cp312-none-win_amd64.whl", hash = "sha256:66ff044fd0bb1768688aecbe28b6190f6e799349221fb0de0e6f4048eca14c16", size = 1986973 }, + { url = "https://files.pythonhosted.org/packages/df/a6/e3f12ff25f250b02f7c51be89a294689d175ac76e1096c32bf278f29ca1e/pydantic_core-2.27.1-cp312-none-win_arm64.whl", hash = "sha256:9a3b0793b1bbfd4146304e23d90045f2a9b5fd5823aa682665fbdaf2a6c28f3e", size = 1883215 }, + { url = "https://files.pythonhosted.org/packages/0f/d6/91cb99a3c59d7b072bded9959fbeab0a9613d5a4935773c0801f1764c156/pydantic_core-2.27.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f216dbce0e60e4d03e0c4353c7023b202d95cbaeff12e5fd2e82ea0a66905073", size = 1895033 }, + { url = "https://files.pythonhosted.org/packages/07/42/d35033f81a28b27dedcade9e967e8a40981a765795c9ebae2045bcef05d3/pydantic_core-2.27.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a2e02889071850bbfd36b56fd6bc98945e23670773bc7a76657e90e6b6603c08", size = 1807542 }, + { url = "https://files.pythonhosted.org/packages/41/c2/491b59e222ec7e72236e512108ecad532c7f4391a14e971c963f624f7569/pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42b0e23f119b2b456d07ca91b307ae167cc3f6c846a7b169fca5326e32fdc6cf", size = 1827854 }, + { url = "https://files.pythonhosted.org/packages/e3/f3/363652651779113189cefdbbb619b7b07b7a67ebb6840325117cc8cc3460/pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:764be71193f87d460a03f1f7385a82e226639732214b402f9aa61f0d025f0737", size = 1857389 }, + { url = "https://files.pythonhosted.org/packages/5f/97/be804aed6b479af5a945daec7538d8bf358d668bdadde4c7888a2506bdfb/pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c00666a3bd2f84920a4e94434f5974d7bbc57e461318d6bb34ce9cdbbc1f6b2", size = 2037934 }, + { url = "https://files.pythonhosted.org/packages/42/01/295f0bd4abf58902917e342ddfe5f76cf66ffabfc57c2e23c7681a1a1197/pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ccaa88b24eebc0f849ce0a4d09e8a408ec5a94afff395eb69baf868f5183107", size = 2735176 }, + { url = "https://files.pythonhosted.org/packages/9d/a0/cd8e9c940ead89cc37812a1a9f310fef59ba2f0b22b4e417d84ab09fa970/pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c65af9088ac534313e1963443d0ec360bb2b9cba6c2909478d22c2e363d98a51", size = 2160720 }, + { url = "https://files.pythonhosted.org/packages/73/ae/9d0980e286627e0aeca4c352a60bd760331622c12d576e5ea4441ac7e15e/pydantic_core-2.27.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:206b5cf6f0c513baffaeae7bd817717140770c74528f3e4c3e1cec7871ddd61a", size = 1992972 }, + { url = "https://files.pythonhosted.org/packages/bf/ba/ae4480bc0292d54b85cfb954e9d6bd226982949f8316338677d56541b85f/pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:062f60e512fc7fff8b8a9d680ff0ddaaef0193dba9fa83e679c0c5f5fbd018bc", size = 2001477 }, + { url = "https://files.pythonhosted.org/packages/55/b7/e26adf48c2f943092ce54ae14c3c08d0d221ad34ce80b18a50de8ed2cba8/pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:a0697803ed7d4af5e4c1adf1670af078f8fcab7a86350e969f454daf598c4960", size = 2091186 }, + { url = "https://files.pythonhosted.org/packages/ba/cc/8491fff5b608b3862eb36e7d29d36a1af1c945463ca4c5040bf46cc73f40/pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:58ca98a950171f3151c603aeea9303ef6c235f692fe555e883591103da709b23", size = 2154429 }, + { url = "https://files.pythonhosted.org/packages/78/d8/c080592d80edd3441ab7f88f865f51dae94a157fc64283c680e9f32cf6da/pydantic_core-2.27.1-cp313-none-win32.whl", hash = "sha256:8065914ff79f7eab1599bd80406681f0ad08f8e47c880f17b416c9f8f7a26d05", size = 1833713 }, + { url = "https://files.pythonhosted.org/packages/83/84/5ab82a9ee2538ac95a66e51f6838d6aba6e0a03a42aa185ad2fe404a4e8f/pydantic_core-2.27.1-cp313-none-win_amd64.whl", hash = "sha256:ba630d5e3db74c79300d9a5bdaaf6200172b107f263c98a0539eeecb857b2337", size = 1987897 }, + { url = "https://files.pythonhosted.org/packages/df/c3/b15fb833926d91d982fde29c0624c9f225da743c7af801dace0d4e187e71/pydantic_core-2.27.1-cp313-none-win_arm64.whl", hash = "sha256:45cf8588c066860b623cd11c4ba687f8d7175d5f7ef65f7129df8a394c502de5", size = 1882983 }, + { url = "https://files.pythonhosted.org/packages/7c/60/e5eb2d462595ba1f622edbe7b1d19531e510c05c405f0b87c80c1e89d5b1/pydantic_core-2.27.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3fa80ac2bd5856580e242dbc202db873c60a01b20309c8319b5c5986fbe53ce6", size = 1894016 }, + { url = "https://files.pythonhosted.org/packages/61/20/da7059855225038c1c4326a840908cc7ca72c7198cb6addb8b92ec81c1d6/pydantic_core-2.27.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d950caa237bb1954f1b8c9227b5065ba6875ac9771bb8ec790d956a699b78676", size = 1771648 }, + { url = "https://files.pythonhosted.org/packages/8f/fc/5485cf0b0bb38da31d1d292160a4d123b5977841ddc1122c671a30b76cfd/pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e4216e64d203e39c62df627aa882f02a2438d18a5f21d7f721621f7a5d3611d", size = 1826929 }, + { url = "https://files.pythonhosted.org/packages/a1/ff/fb1284a210e13a5f34c639efc54d51da136074ffbe25ec0c279cf9fbb1c4/pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02a3d637bd387c41d46b002f0e49c52642281edacd2740e5a42f7017feea3f2c", size = 1980591 }, + { url = "https://files.pythonhosted.org/packages/f1/14/77c1887a182d05af74f6aeac7b740da3a74155d3093ccc7ee10b900cc6b5/pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:161c27ccce13b6b0c8689418da3885d3220ed2eae2ea5e9b2f7f3d48f1d52c27", size = 1981326 }, + { url = "https://files.pythonhosted.org/packages/06/aa/6f1b2747f811a9c66b5ef39d7f02fbb200479784c75e98290d70004b1253/pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:19910754e4cc9c63bc1c7f6d73aa1cfee82f42007e407c0f413695c2f7ed777f", size = 1989205 }, + { url = "https://files.pythonhosted.org/packages/7a/d2/8ce2b074d6835f3c88d85f6d8a399790043e9fdb3d0e43455e72d19df8cc/pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:e173486019cc283dc9778315fa29a363579372fe67045e971e89b6365cc035ed", size = 2079616 }, + { url = "https://files.pythonhosted.org/packages/65/71/af01033d4e58484c3db1e5d13e751ba5e3d6b87cc3368533df4c50932c8b/pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:af52d26579b308921b73b956153066481f064875140ccd1dfd4e77db89dbb12f", size = 2133265 }, + { url = "https://files.pythonhosted.org/packages/33/72/f881b5e18fbb67cf2fb4ab253660de3c6899dbb2dba409d0b757e3559e3d/pydantic_core-2.27.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:981fb88516bd1ae8b0cbbd2034678a39dedc98752f264ac9bc5839d3923fa04c", size = 2001864 }, +] + +[[package]] +name = "pygments" +version = "2.18.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/62/8336eff65bcbc8e4cb5d05b55faf041285951b6e80f33e2bff2024788f31/pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", size = 4891905 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a", size = 1205513 }, +] + +[[package]] +name = "python-dotenv" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", size = 39115 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863 }, +] + +[[package]] +name = "python-telegram-bot" +version = "21.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "httpx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/45/a6/369aa090e2c2d34bcfbeadd7d8c75ca2f771424c1a985a98a0adb3712463/python_telegram_bot-21.9.tar.gz", hash = "sha256:82588faca44069492b2aea7f3a5d6212e68884f296b9ccd444658d89170f158d", size = 436648 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/4e/b94c6925e3d75a07c3bc8e3f96234c926f627e7ddd05bbf2878e93b3fc15/python_telegram_bot-21.9-py3-none-any.whl", hash = "sha256:6a5e71056fbd138c78dbdefa3c7834d77022622997c60003c9b442061ee91633", size = 662715 }, +] + +[[package]] +name = "requests" +version = "2.32.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, +] + +[[package]] +name = "rich" +version = "13.9.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424 }, +] + +[[package]] +name = "scikit-learn" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "joblib" }, + { name = "numpy" }, + { name = "scipy" }, + { name = "threadpoolctl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fa/19/5aa2002044afc297ecaf1e3517ed07bba4aece3b5613b5160c1212995fc8/scikit_learn-1.6.0.tar.gz", hash = "sha256:9d58481f9f7499dff4196927aedd4285a0baec8caa3790efbe205f13de37dd6e", size = 7074944 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/97/55060f91a5e7c4df945e5a69b16148b5f2256e6e1ea3f17da8e27edf9953/scikit_learn-1.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:366fb3fa47dce90afed3d6106183f4978d6f24cfd595c2373424171b915ee718", size = 12060299 }, + { url = "https://files.pythonhosted.org/packages/36/7b/8c5dfc64a8344ebf2ae493d59af4b3650588051f654e164ff4f9952877b3/scikit_learn-1.6.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:59cd96a8d9f8dfd546f5d6e9787e1b989e981388d7803abbc9efdcde61e47460", size = 11105443 }, + { url = "https://files.pythonhosted.org/packages/25/9f/61544f2a5cae1bc27c97f0ec9ffcc9837e469f215817608840a4ccbb277a/scikit_learn-1.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efa7a579606c73a0b3d210e33ea410ea9e1af7933fe324cb7e6fbafae4ea5948", size = 12637137 }, + { url = "https://files.pythonhosted.org/packages/50/79/d21599fc44d2d497ced440480670b6314ebc00308e3bae0d0ebca44cd481/scikit_learn-1.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a46d3ca0f11a540b8eaddaf5e38172d8cd65a86cb3e3632161ec96c0cffb774c", size = 13490128 }, + { url = "https://files.pythonhosted.org/packages/ff/87/788da20cfefcd261123d4bb015b2de076e49cdd3b811b55e6811acd3cb21/scikit_learn-1.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:5be4577769c5dde6e1b53de8e6520f9b664ab5861dd57acee47ad119fd7405d6", size = 11118524 }, + { url = "https://files.pythonhosted.org/packages/07/95/070d6e70f735d13f1c10afebb65ba3526125b7d6c6fc7022651a4a061148/scikit_learn-1.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1f50b4f24cf12a81c3c09958ae3b864d7534934ca66ded3822de4996d25d7285", size = 12095168 }, + { url = "https://files.pythonhosted.org/packages/72/3d/0381e3a59ebd4154e6a61b0ceaf299c3c141035033dd3b868776cd9af02d/scikit_learn-1.6.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:eb9ae21f387826da14b0b9cb1034f5048ddb9182da429c689f5f4a87dc96930b", size = 11108880 }, + { url = "https://files.pythonhosted.org/packages/fe/2d/0999ae3eed2ac67b1b3cd7fc33370bd5ca59a7514ffe43ae2b6f3cd85b9b/scikit_learn-1.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0baa91eeb8c32632628874a5c91885eaedd23b71504d24227925080da075837a", size = 12585449 }, + { url = "https://files.pythonhosted.org/packages/0e/ec/1b15b59c6cc7a993320a52234369e787f50345a4753e50d5a015a91e1a20/scikit_learn-1.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c716d13ba0a2f8762d96ff78d3e0cde90bc9c9b5c13d6ab6bb9b2d6ca6705fd", size = 13489728 }, + { url = "https://files.pythonhosted.org/packages/96/a2/cbfb5743de748d574ffdfd557e9cb29ba4f8b8a3e07836c6c176f713de2f/scikit_learn-1.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:9aafd94bafc841b626681e626be27bf1233d5a0f20f0a6fdb4bee1a1963c6643", size = 11132946 }, + { url = "https://files.pythonhosted.org/packages/18/0c/a5de627aa57b028aea7026cb3bbeaf63be3158adc118212d6cc7843d939a/scikit_learn-1.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:04a5ba45c12a5ff81518aa4f1604e826a45d20e53da47b15871526cda4ff5174", size = 12096999 }, + { url = "https://files.pythonhosted.org/packages/a3/7d/02a96e6fb28ddb213e84b1b4a44148d26ec96fc9db9c74e050277e009892/scikit_learn-1.6.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:21fadfc2ad7a1ce8bd1d90f23d17875b84ec765eecbbfc924ff11fb73db582ce", size = 11160579 }, + { url = "https://files.pythonhosted.org/packages/70/28/77b071f541d75247e6c3403f19aaa634371e972691f6aa1838ca9fd4cc52/scikit_learn-1.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30f34bb5fde90e020653bb84dcb38b6c83f90c70680dbd8c38bd9becbad7a127", size = 12246543 }, + { url = "https://files.pythonhosted.org/packages/17/0e/e6bb84074f1081245a165c0ee775ecef24beae9d2f2e24bcac0c9f155f13/scikit_learn-1.6.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1dad624cffe3062276a0881d4e441bc9e3b19d02d17757cd6ae79a9d192a0027", size = 13140402 }, + { url = "https://files.pythonhosted.org/packages/21/1d/3df58df8bd425f425df9f90b316618ace62b7f1f838ac1580191025cc735/scikit_learn-1.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:2fce7950a3fad85e0a61dc403df0f9345b53432ac0e47c50da210d22c60b6d85", size = 11103596 }, + { url = "https://files.pythonhosted.org/packages/2e/f4/c3b51920cf310169d19d07855a7bdf51a9b065314877d9a58c0c60d08eea/scikit_learn-1.6.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e5453b2e87ef8accedc5a8a4e6709f887ca01896cd7cc8a174fe39bd4bb00aef", size = 12002532 }, + { url = "https://files.pythonhosted.org/packages/e4/76/cfb0778a84c30df272f1c41fc7b3bd3ffac6e8b02ee6a078a592d35cf73f/scikit_learn-1.6.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:5fe11794236fb83bead2af26a87ced5d26e3370b8487430818b915dafab1724e", size = 11088997 }, + { url = "https://files.pythonhosted.org/packages/2b/8d/4563419d742b852e50871fa3494a8dd0304610601359209a2e614e200260/scikit_learn-1.6.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61fe3dcec0d82ae280877a818ab652f4988371e32dd5451e75251bece79668b1", size = 12203192 }, + { url = "https://files.pythonhosted.org/packages/15/a4/f4fdcdd11d82837804c888097ad02aa6381c4bbd57b9d3074ecf9eba8f42/scikit_learn-1.6.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b44e3a51e181933bdf9a4953cc69c6025b40d2b49e238233f149b98849beb4bf", size = 13164436 }, + { url = "https://files.pythonhosted.org/packages/1a/e1/32bdcf8f918de5a156da6886aba24a3b5718d267954bd34555be896289f0/scikit_learn-1.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:a17860a562bac54384454d40b3f6155200c1c737c9399e6a97962c63fce503ac", size = 11064779 }, + { url = "https://files.pythonhosted.org/packages/c6/8d/14464bea220bc02879f9e8d905c4b0a44b5c12afde6c375720b6f41d9407/scikit_learn-1.6.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:98717d3c152f6842d36a70f21e1468fb2f1a2f8f2624d9a3f382211798516426", size = 11962472 }, + { url = "https://files.pythonhosted.org/packages/b4/69/66899cdc65986188e0e255e52ee93dee5101a72f139ee05f263dfff2053a/scikit_learn-1.6.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:34e20bfac8ff0ebe0ff20fb16a4d6df5dc4cc9ce383e00c2ab67a526a3c67b18", size = 11104864 }, + { url = "https://files.pythonhosted.org/packages/3c/32/2c63bc108cc5438b116a0c6fd25c6126dd14c03118724385f10a3d218ee8/scikit_learn-1.6.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eba06d75815406091419e06dd650b91ebd1c5f836392a0d833ff36447c2b1bfa", size = 12435734 }, + { url = "https://files.pythonhosted.org/packages/0c/f5/9434dff19e04a334bfb30df90511904263c48a422a9952d91d8de5c3aa62/scikit_learn-1.6.0-cp313-cp313t-win_amd64.whl", hash = "sha256:b6916d1cec1ff163c7d281e699d7a6a709da2f2c5ec7b10547e08cc788ddd3ae", size = 11329803 }, +] + +[[package]] +name = "scipy" +version = "1.14.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/62/11/4d44a1f274e002784e4dbdb81e0ea96d2de2d1045b2132d5af62cc31fd28/scipy-1.14.1.tar.gz", hash = "sha256:5a275584e726026a5699459aa72f828a610821006228e841b94275c4a7c08417", size = 58620554 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/68/3bc0cfaf64ff507d82b1e5d5b64521df4c8bf7e22bc0b897827cbee9872c/scipy-1.14.1-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:b28d2ca4add7ac16ae8bb6632a3c86e4b9e4d52d3e34267f6e1b0c1f8d87e389", size = 39069598 }, + { url = "https://files.pythonhosted.org/packages/43/a5/8d02f9c372790326ad405d94f04d4339482ec082455b9e6e288f7100513b/scipy-1.14.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d0d2821003174de06b69e58cef2316a6622b60ee613121199cb2852a873f8cf3", size = 29879676 }, + { url = "https://files.pythonhosted.org/packages/07/42/0e0bea9666fcbf2cb6ea0205db42c81b1f34d7b729ba251010edf9c80ebd/scipy-1.14.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8bddf15838ba768bb5f5083c1ea012d64c9a444e16192762bd858f1e126196d0", size = 23088696 }, + { url = "https://files.pythonhosted.org/packages/15/47/298ab6fef5ebf31b426560e978b8b8548421d4ed0bf99263e1eb44532306/scipy-1.14.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:97c5dddd5932bd2a1a31c927ba5e1463a53b87ca96b5c9bdf5dfd6096e27efc3", size = 25470699 }, + { url = "https://files.pythonhosted.org/packages/d8/df/cdb6be5274bc694c4c22862ac3438cb04f360ed9df0aecee02ce0b798380/scipy-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ff0a7e01e422c15739ecd64432743cf7aae2b03f3084288f399affcefe5222d", size = 35606631 }, + { url = "https://files.pythonhosted.org/packages/47/78/b0c2c23880dd1e99e938ad49ccfb011ae353758a2dc5ed7ee59baff684c3/scipy-1.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e32dced201274bf96899e6491d9ba3e9a5f6b336708656466ad0522d8528f69", size = 41178528 }, + { url = "https://files.pythonhosted.org/packages/5d/aa/994b45c34b897637b853ec04334afa55a85650a0d11dacfa67232260fb0a/scipy-1.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8426251ad1e4ad903a4514712d2fa8fdd5382c978010d1c6f5f37ef286a713ad", size = 42784535 }, + { url = "https://files.pythonhosted.org/packages/e7/1c/8daa6df17a945cb1a2a1e3bae3c49643f7b3b94017ff01a4787064f03f84/scipy-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:a49f6ed96f83966f576b33a44257d869756df6cf1ef4934f59dd58b25e0327e5", size = 44772117 }, + { url = "https://files.pythonhosted.org/packages/b2/ab/070ccfabe870d9f105b04aee1e2860520460ef7ca0213172abfe871463b9/scipy-1.14.1-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:2da0469a4ef0ecd3693761acbdc20f2fdeafb69e6819cc081308cc978153c675", size = 39076999 }, + { url = "https://files.pythonhosted.org/packages/a7/c5/02ac82f9bb8f70818099df7e86c3ad28dae64e1347b421d8e3adf26acab6/scipy-1.14.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:c0ee987efa6737242745f347835da2cc5bb9f1b42996a4d97d5c7ff7928cb6f2", size = 29894570 }, + { url = "https://files.pythonhosted.org/packages/ed/05/7f03e680cc5249c4f96c9e4e845acde08eb1aee5bc216eff8a089baa4ddb/scipy-1.14.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3a1b111fac6baec1c1d92f27e76511c9e7218f1695d61b59e05e0fe04dc59617", size = 23103567 }, + { url = "https://files.pythonhosted.org/packages/5e/fc/9f1413bef53171f379d786aabc104d4abeea48ee84c553a3e3d8c9f96a9c/scipy-1.14.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8475230e55549ab3f207bff11ebfc91c805dc3463ef62eda3ccf593254524ce8", size = 25499102 }, + { url = "https://files.pythonhosted.org/packages/c2/4b/b44bee3c2ddc316b0159b3d87a3d467ef8d7edfd525e6f7364a62cd87d90/scipy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:278266012eb69f4a720827bdd2dc54b2271c97d84255b2faaa8f161a158c3b37", size = 35586346 }, + { url = "https://files.pythonhosted.org/packages/93/6b/701776d4bd6bdd9b629c387b5140f006185bd8ddea16788a44434376b98f/scipy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fef8c87f8abfb884dac04e97824b61299880c43f4ce675dd2cbeadd3c9b466d2", size = 41165244 }, + { url = "https://files.pythonhosted.org/packages/06/57/e6aa6f55729a8f245d8a6984f2855696c5992113a5dc789065020f8be753/scipy-1.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b05d43735bb2f07d689f56f7b474788a13ed8adc484a85aa65c0fd931cf9ccd2", size = 42817917 }, + { url = "https://files.pythonhosted.org/packages/ea/c2/5ecadc5fcccefaece775feadcd795060adf5c3b29a883bff0e678cfe89af/scipy-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:716e389b694c4bb564b4fc0c51bc84d381735e0d39d3f26ec1af2556ec6aad94", size = 44781033 }, + { url = "https://files.pythonhosted.org/packages/c0/04/2bdacc8ac6387b15db6faa40295f8bd25eccf33f1f13e68a72dc3c60a99e/scipy-1.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:631f07b3734d34aced009aaf6fedfd0eb3498a97e581c3b1e5f14a04164a456d", size = 39128781 }, + { url = "https://files.pythonhosted.org/packages/c8/53/35b4d41f5fd42f5781dbd0dd6c05d35ba8aa75c84ecddc7d44756cd8da2e/scipy-1.14.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:af29a935803cc707ab2ed7791c44288a682f9c8107bc00f0eccc4f92c08d6e07", size = 29939542 }, + { url = "https://files.pythonhosted.org/packages/66/67/6ef192e0e4d77b20cc33a01e743b00bc9e68fb83b88e06e636d2619a8767/scipy-1.14.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:2843f2d527d9eebec9a43e6b406fb7266f3af25a751aa91d62ff416f54170bc5", size = 23148375 }, + { url = "https://files.pythonhosted.org/packages/f6/32/3a6dedd51d68eb7b8e7dc7947d5d841bcb699f1bf4463639554986f4d782/scipy-1.14.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:eb58ca0abd96911932f688528977858681a59d61a7ce908ffd355957f7025cfc", size = 25578573 }, + { url = "https://files.pythonhosted.org/packages/f0/5a/efa92a58dc3a2898705f1dc9dbaf390ca7d4fba26d6ab8cfffb0c72f656f/scipy-1.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30ac8812c1d2aab7131a79ba62933a2a76f582d5dbbc695192453dae67ad6310", size = 35319299 }, + { url = "https://files.pythonhosted.org/packages/8e/ee/8a26858ca517e9c64f84b4c7734b89bda8e63bec85c3d2f432d225bb1886/scipy-1.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f9ea80f2e65bdaa0b7627fb00cbeb2daf163caa015e59b7516395fe3bd1e066", size = 40849331 }, + { url = "https://files.pythonhosted.org/packages/a5/cd/06f72bc9187840f1c99e1a8750aad4216fc7dfdd7df46e6280add14b4822/scipy-1.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:edaf02b82cd7639db00dbff629995ef185c8df4c3ffa71a5562a595765a06ce1", size = 42544049 }, + { url = "https://files.pythonhosted.org/packages/aa/7d/43ab67228ef98c6b5dd42ab386eae2d7877036970a0d7e3dd3eb47a0d530/scipy-1.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:2ff38e22128e6c03ff73b6bb0f85f897d2362f8c052e3b8ad00532198fbdae3f", size = 44521212 }, + { url = "https://files.pythonhosted.org/packages/50/ef/ac98346db016ff18a6ad7626a35808f37074d25796fd0234c2bb0ed1e054/scipy-1.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1729560c906963fc8389f6aac023739ff3983e727b1a4d87696b7bf108316a79", size = 39091068 }, + { url = "https://files.pythonhosted.org/packages/b9/cc/70948fe9f393b911b4251e96b55bbdeaa8cca41f37c26fd1df0232933b9e/scipy-1.14.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:4079b90df244709e675cdc8b93bfd8a395d59af40b72e339c2287c91860deb8e", size = 29875417 }, + { url = "https://files.pythonhosted.org/packages/3b/2e/35f549b7d231c1c9f9639f9ef49b815d816bf54dd050da5da1c11517a218/scipy-1.14.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e0cf28db0f24a38b2a0ca33a85a54852586e43cf6fd876365c86e0657cfe7d73", size = 23084508 }, + { url = "https://files.pythonhosted.org/packages/3f/d6/b028e3f3e59fae61fb8c0f450db732c43dd1d836223a589a8be9f6377203/scipy-1.14.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:0c2f95de3b04e26f5f3ad5bb05e74ba7f68b837133a4492414b3afd79dfe540e", size = 25503364 }, + { url = "https://files.pythonhosted.org/packages/a7/2f/6c142b352ac15967744d62b165537a965e95d557085db4beab2a11f7943b/scipy-1.14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b99722ea48b7ea25e8e015e8341ae74624f72e5f21fc2abd45f3a93266de4c5d", size = 35292639 }, + { url = "https://files.pythonhosted.org/packages/56/46/2449e6e51e0d7c3575f289f6acb7f828938eaab8874dbccfeb0cd2b71a27/scipy-1.14.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5149e3fd2d686e42144a093b206aef01932a0059c2a33ddfa67f5f035bdfe13e", size = 40798288 }, + { url = "https://files.pythonhosted.org/packages/32/cd/9d86f7ed7f4497c9fd3e39f8918dd93d9f647ba80d7e34e4946c0c2d1a7c/scipy-1.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4f5a7c49323533f9103d4dacf4e4f07078f360743dec7f7596949149efeec06", size = 42524647 }, + { url = "https://files.pythonhosted.org/packages/f5/1b/6ee032251bf4cdb0cc50059374e86a9f076308c1512b61c4e003e241efb7/scipy-1.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:baff393942b550823bfce952bb62270ee17504d02a1801d7fd0719534dfb9c84", size = 44469524 }, +] + +[[package]] +name = "scipy-stubs" +version = "1.14.1.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "optype" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2e/79/d9a73d6c215b00b21ed16c6638c72a2ea25392f44348bd512fb7802f2ec4/scipy_stubs-1.14.1.5.tar.gz", hash = "sha256:66c160c6b72b1406edc7827879ef25ea81dc3d95ab7e4af3a2de836f27c26ce6", size = 211659 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/01/166738cea89ca8acacd46ef048b9ea37b5817373c7052bfaadbc6a95bc74/scipy_stubs-1.14.1.5-py3-none-any.whl", hash = "sha256:ca927802cae4c83e75b2a4b8c41271f36ebe0d928cee25ef3968e143b1793a75", size = 386065 }, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755 }, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }, +] + +[[package]] +name = "tenacity" +version = "9.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/94/91fccdb4b8110642462e653d5dcb27e7b674742ad68efd146367da7bdb10/tenacity-9.0.0.tar.gz", hash = "sha256:807f37ca97d62aa361264d497b0e31e92b8027044942bfa756160d908320d73b", size = 47421 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b6/cb/b86984bed139586d01532a587464b5805f12e397594f19f931c4c2fbfa61/tenacity-9.0.0-py3-none-any.whl", hash = "sha256:93de0c98785b27fcf659856aa9f54bfbd399e29969b0621bc7f762bd441b4539", size = 28169 }, +] + +[[package]] +name = "texttable" +version = "1.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/dc/0aff23d6036a4d3bf4f1d8c8204c5c79c4437e25e0ae94ffe4bbb55ee3c2/texttable-1.7.0.tar.gz", hash = "sha256:2d2068fb55115807d3ac77a4ca68fa48803e84ebb0ee2340f858107a36522638", size = 12831 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/99/4772b8e00a136f3e01236de33b0efda31ee7077203ba5967fcc76da94d65/texttable-1.7.0-py2.py3-none-any.whl", hash = "sha256:72227d592c82b3d7f672731ae73e4d1f88cd8e2ef5b075a7a7f01a23a3743917", size = 10768 }, +] + +[[package]] +name = "threadpoolctl" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/55/b5148dcbf72f5cde221f8bfe3b6a540da7aa1842f6b491ad979a6c8b84af/threadpoolctl-3.5.0.tar.gz", hash = "sha256:082433502dd922bf738de0d8bcc4fdcbf0979ff44c42bd40f5af8a282f6fa107", size = 41936 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/2c/ffbf7a134b9ab11a67b0cf0726453cedd9c5043a4fe7a35d1cefa9a1bcfb/threadpoolctl-3.5.0-py3-none-any.whl", hash = "sha256:56c1e26c150397e58c4926da8eeee87533b1e32bef131bd4bf6a2f45f3185467", size = 18414 }, +] + +[[package]] +name = "tqdm" +version = "4.67.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "platform_system == 'Windows'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540 }, +] + +[[package]] +name = "typer" +version = "0.15.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "rich" }, + { name = "shellingham" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cb/ce/dca7b219718afd37a0068f4f2530a727c2b74a8b6e8e0c0080a4c0de4fcd/typer-0.15.1.tar.gz", hash = "sha256:a0588c0a7fa68a1978a069818657778f86abe6ff5ea6abf472f940a08bfe4f0a", size = 99789 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/cc/0a838ba5ca64dc832aa43f727bd586309846b0ffb2ce52422543e6075e8a/typer-0.15.1-py3-none-any.whl", hash = "sha256:7994fb7b8155b64d3402518560648446072864beefd44aa2dc36972a5972e847", size = 44908 }, +] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, +] + +[[package]] +name = "urllib3" +version = "2.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ed/63/22ba4ebfe7430b76388e7cd448d5478814d3032121827c12a2cc287e2260/urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9", size = 300677 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", size = 126338 }, +] + +[[package]] +name = "xxhash" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/00/5e/d6e5258d69df8b4ed8c83b6664f2b47d30d2dec551a29ad72a6c69eafd31/xxhash-3.5.0.tar.gz", hash = "sha256:84f2caddf951c9cbf8dc2e22a89d4ccf5d86391ac6418fe81e3c67d0cf60b45f", size = 84241 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bb/8a/0e9feca390d512d293afd844d31670e25608c4a901e10202aa98785eab09/xxhash-3.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ece616532c499ee9afbb83078b1b952beffef121d989841f7f4b3dc5ac0fd212", size = 31970 }, + { url = "https://files.pythonhosted.org/packages/16/e6/be5aa49580cd064a18200ab78e29b88b1127e1a8c7955eb8ecf81f2626eb/xxhash-3.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3171f693dbc2cef6477054a665dc255d996646b4023fe56cb4db80e26f4cc520", size = 30801 }, + { url = "https://files.pythonhosted.org/packages/20/ee/b8a99ebbc6d1113b3a3f09e747fa318c3cde5b04bd9c197688fadf0eeae8/xxhash-3.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c5d3e570ef46adaf93fc81b44aca6002b5a4d8ca11bd0580c07eac537f36680", size = 220927 }, + { url = "https://files.pythonhosted.org/packages/58/62/15d10582ef159283a5c2b47f6d799fc3303fe3911d5bb0bcc820e1ef7ff4/xxhash-3.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7cb29a034301e2982df8b1fe6328a84f4b676106a13e9135a0d7e0c3e9f806da", size = 200360 }, + { url = "https://files.pythonhosted.org/packages/23/41/61202663ea9b1bd8e53673b8ec9e2619989353dba8cfb68e59a9cbd9ffe3/xxhash-3.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d0d307d27099bb0cbeea7260eb39ed4fdb99c5542e21e94bb6fd29e49c57a23", size = 428528 }, + { url = "https://files.pythonhosted.org/packages/f2/07/d9a3059f702dec5b3b703737afb6dda32f304f6e9da181a229dafd052c29/xxhash-3.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0342aafd421795d740e514bc9858ebddfc705a75a8c5046ac56d85fe97bf196", size = 194149 }, + { url = "https://files.pythonhosted.org/packages/eb/58/27caadf78226ecf1d62dbd0c01d152ed381c14c1ee4ad01f0d460fc40eac/xxhash-3.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3dbbd9892c5ebffeca1ed620cf0ade13eb55a0d8c84e0751a6653adc6ac40d0c", size = 207703 }, + { url = "https://files.pythonhosted.org/packages/b1/08/32d558ce23e1e068453c39aed7b3c1cdc690c177873ec0ca3a90d5808765/xxhash-3.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4cc2d67fdb4d057730c75a64c5923abfa17775ae234a71b0200346bfb0a7f482", size = 216255 }, + { url = "https://files.pythonhosted.org/packages/3f/d4/2b971e2d2b0a61045f842b622ef11e94096cf1f12cd448b6fd426e80e0e2/xxhash-3.5.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:ec28adb204b759306a3d64358a5e5c07d7b1dd0ccbce04aa76cb9377b7b70296", size = 202744 }, + { url = "https://files.pythonhosted.org/packages/19/ae/6a6438864a8c4c39915d7b65effd85392ebe22710412902487e51769146d/xxhash-3.5.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:1328f6d8cca2b86acb14104e381225a3d7b42c92c4b86ceae814e5c400dbb415", size = 210115 }, + { url = "https://files.pythonhosted.org/packages/48/7d/b3c27c27d1fc868094d02fe4498ccce8cec9fcc591825c01d6bcb0b4fc49/xxhash-3.5.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8d47ebd9f5d9607fd039c1fbf4994e3b071ea23eff42f4ecef246ab2b7334198", size = 414247 }, + { url = "https://files.pythonhosted.org/packages/a1/05/918f9e7d2fbbd334b829997045d341d6239b563c44e683b9a7ef8fe50f5d/xxhash-3.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b96d559e0fcddd3343c510a0fe2b127fbff16bf346dd76280b82292567523442", size = 191419 }, + { url = "https://files.pythonhosted.org/packages/08/29/dfe393805b2f86bfc47c290b275f0b7c189dc2f4e136fd4754f32eb18a8d/xxhash-3.5.0-cp310-cp310-win32.whl", hash = "sha256:61c722ed8d49ac9bc26c7071eeaa1f6ff24053d553146d5df031802deffd03da", size = 30114 }, + { url = "https://files.pythonhosted.org/packages/7b/d7/aa0b22c4ebb7c3ccb993d4c565132abc641cd11164f8952d89eb6a501909/xxhash-3.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:9bed5144c6923cc902cd14bb8963f2d5e034def4486ab0bbe1f58f03f042f9a9", size = 30003 }, + { url = "https://files.pythonhosted.org/packages/69/12/f969b81541ee91b55f1ce469d7ab55079593c80d04fd01691b550e535000/xxhash-3.5.0-cp310-cp310-win_arm64.whl", hash = "sha256:893074d651cf25c1cc14e3bea4fceefd67f2921b1bb8e40fcfeba56820de80c6", size = 26773 }, + { url = "https://files.pythonhosted.org/packages/b8/c7/afed0f131fbda960ff15eee7f304fa0eeb2d58770fade99897984852ef23/xxhash-3.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02c2e816896dc6f85922ced60097bcf6f008dedfc5073dcba32f9c8dd786f3c1", size = 31969 }, + { url = "https://files.pythonhosted.org/packages/8c/0c/7c3bc6d87e5235672fcc2fb42fd5ad79fe1033925f71bf549ee068c7d1ca/xxhash-3.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6027dcd885e21581e46d3c7f682cfb2b870942feeed58a21c29583512c3f09f8", size = 30800 }, + { url = "https://files.pythonhosted.org/packages/04/9e/01067981d98069eec1c20201f8c145367698e9056f8bc295346e4ea32dd1/xxhash-3.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1308fa542bbdbf2fa85e9e66b1077eea3a88bef38ee8a06270b4298a7a62a166", size = 221566 }, + { url = "https://files.pythonhosted.org/packages/d4/09/d4996de4059c3ce5342b6e1e6a77c9d6c91acce31f6ed979891872dd162b/xxhash-3.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c28b2fdcee797e1c1961cd3bcd3d545cab22ad202c846235197935e1df2f8ef7", size = 201214 }, + { url = "https://files.pythonhosted.org/packages/62/f5/6d2dc9f8d55a7ce0f5e7bfef916e67536f01b85d32a9fbf137d4cadbee38/xxhash-3.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:924361811732ddad75ff23e90efd9ccfda4f664132feecb90895bade6a1b4623", size = 429433 }, + { url = "https://files.pythonhosted.org/packages/d9/72/9256303f10e41ab004799a4aa74b80b3c5977d6383ae4550548b24bd1971/xxhash-3.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89997aa1c4b6a5b1e5b588979d1da048a3c6f15e55c11d117a56b75c84531f5a", size = 194822 }, + { url = "https://files.pythonhosted.org/packages/34/92/1a3a29acd08248a34b0e6a94f4e0ed9b8379a4ff471f1668e4dce7bdbaa8/xxhash-3.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:685c4f4e8c59837de103344eb1c8a3851f670309eb5c361f746805c5471b8c88", size = 208538 }, + { url = "https://files.pythonhosted.org/packages/53/ad/7fa1a109663366de42f724a1cdb8e796a260dbac45047bce153bc1e18abf/xxhash-3.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dbd2ecfbfee70bc1a4acb7461fa6af7748ec2ab08ac0fa298f281c51518f982c", size = 216953 }, + { url = "https://files.pythonhosted.org/packages/35/02/137300e24203bf2b2a49b48ce898ecce6fd01789c0fcd9c686c0a002d129/xxhash-3.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:25b5a51dc3dfb20a10833c8eee25903fd2e14059e9afcd329c9da20609a307b2", size = 203594 }, + { url = "https://files.pythonhosted.org/packages/23/03/aeceb273933d7eee248c4322b98b8e971f06cc3880e5f7602c94e5578af5/xxhash-3.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a8fb786fb754ef6ff8c120cb96629fb518f8eb5a61a16aac3a979a9dbd40a084", size = 210971 }, + { url = "https://files.pythonhosted.org/packages/e3/64/ed82ec09489474cbb35c716b189ddc1521d8b3de12b1b5ab41ce7f70253c/xxhash-3.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a905ad00ad1e1c34fe4e9d7c1d949ab09c6fa90c919860c1534ff479f40fd12d", size = 415050 }, + { url = "https://files.pythonhosted.org/packages/71/43/6db4c02dcb488ad4e03bc86d70506c3d40a384ee73c9b5c93338eb1f3c23/xxhash-3.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:963be41bcd49f53af6d795f65c0da9b4cc518c0dd9c47145c98f61cb464f4839", size = 192216 }, + { url = "https://files.pythonhosted.org/packages/22/6d/db4abec29e7a567455344433d095fdb39c97db6955bb4a2c432e486b4d28/xxhash-3.5.0-cp311-cp311-win32.whl", hash = "sha256:109b436096d0a2dd039c355fa3414160ec4d843dfecc64a14077332a00aeb7da", size = 30120 }, + { url = "https://files.pythonhosted.org/packages/52/1c/fa3b61c0cf03e1da4767213672efe186b1dfa4fc901a4a694fb184a513d1/xxhash-3.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:b702f806693201ad6c0a05ddbbe4c8f359626d0b3305f766077d51388a6bac58", size = 30003 }, + { url = "https://files.pythonhosted.org/packages/6b/8e/9e6fc572acf6e1cc7ccb01973c213f895cb8668a9d4c2b58a99350da14b7/xxhash-3.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:c4dcb4120d0cc3cc448624147dba64e9021b278c63e34a38789b688fd0da9bf3", size = 26777 }, + { url = "https://files.pythonhosted.org/packages/07/0e/1bfce2502c57d7e2e787600b31c83535af83746885aa1a5f153d8c8059d6/xxhash-3.5.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:14470ace8bd3b5d51318782cd94e6f94431974f16cb3b8dc15d52f3b69df8e00", size = 31969 }, + { url = "https://files.pythonhosted.org/packages/3f/d6/8ca450d6fe5b71ce521b4e5db69622383d039e2b253e9b2f24f93265b52c/xxhash-3.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:59aa1203de1cb96dbeab595ded0ad0c0056bb2245ae11fac11c0ceea861382b9", size = 30787 }, + { url = "https://files.pythonhosted.org/packages/5b/84/de7c89bc6ef63d750159086a6ada6416cc4349eab23f76ab870407178b93/xxhash-3.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08424f6648526076e28fae6ea2806c0a7d504b9ef05ae61d196d571e5c879c84", size = 220959 }, + { url = "https://files.pythonhosted.org/packages/fe/86/51258d3e8a8545ff26468c977101964c14d56a8a37f5835bc0082426c672/xxhash-3.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61a1ff00674879725b194695e17f23d3248998b843eb5e933007ca743310f793", size = 200006 }, + { url = "https://files.pythonhosted.org/packages/02/0a/96973bd325412feccf23cf3680fd2246aebf4b789122f938d5557c54a6b2/xxhash-3.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2f2c61bee5844d41c3eb015ac652a0229e901074951ae48581d58bfb2ba01be", size = 428326 }, + { url = "https://files.pythonhosted.org/packages/11/a7/81dba5010f7e733de88af9555725146fc133be97ce36533867f4c7e75066/xxhash-3.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d32a592cac88d18cc09a89172e1c32d7f2a6e516c3dfde1b9adb90ab5df54a6", size = 194380 }, + { url = "https://files.pythonhosted.org/packages/fb/7d/f29006ab398a173f4501c0e4977ba288f1c621d878ec217b4ff516810c04/xxhash-3.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70dabf941dede727cca579e8c205e61121afc9b28516752fd65724be1355cc90", size = 207934 }, + { url = "https://files.pythonhosted.org/packages/8a/6e/6e88b8f24612510e73d4d70d9b0c7dff62a2e78451b9f0d042a5462c8d03/xxhash-3.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e5d0ddaca65ecca9c10dcf01730165fd858533d0be84c75c327487c37a906a27", size = 216301 }, + { url = "https://files.pythonhosted.org/packages/af/51/7862f4fa4b75a25c3b4163c8a873f070532fe5f2d3f9b3fc869c8337a398/xxhash-3.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e5b5e16c5a480fe5f59f56c30abdeba09ffd75da8d13f6b9b6fd224d0b4d0a2", size = 203351 }, + { url = "https://files.pythonhosted.org/packages/22/61/8d6a40f288f791cf79ed5bb113159abf0c81d6efb86e734334f698eb4c59/xxhash-3.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149b7914451eb154b3dfaa721315117ea1dac2cc55a01bfbd4df7c68c5dd683d", size = 210294 }, + { url = "https://files.pythonhosted.org/packages/17/02/215c4698955762d45a8158117190261b2dbefe9ae7e5b906768c09d8bc74/xxhash-3.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:eade977f5c96c677035ff39c56ac74d851b1cca7d607ab3d8f23c6b859379cab", size = 414674 }, + { url = "https://files.pythonhosted.org/packages/31/5c/b7a8db8a3237cff3d535261325d95de509f6a8ae439a5a7a4ffcff478189/xxhash-3.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fa9f547bd98f5553d03160967866a71056a60960be00356a15ecc44efb40ba8e", size = 192022 }, + { url = "https://files.pythonhosted.org/packages/78/e3/dd76659b2811b3fd06892a8beb850e1996b63e9235af5a86ea348f053e9e/xxhash-3.5.0-cp312-cp312-win32.whl", hash = "sha256:f7b58d1fd3551b8c80a971199543379be1cee3d0d409e1f6d8b01c1a2eebf1f8", size = 30170 }, + { url = "https://files.pythonhosted.org/packages/d9/6b/1c443fe6cfeb4ad1dcf231cdec96eb94fb43d6498b4469ed8b51f8b59a37/xxhash-3.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:fa0cafd3a2af231b4e113fba24a65d7922af91aeb23774a8b78228e6cd785e3e", size = 30040 }, + { url = "https://files.pythonhosted.org/packages/0f/eb/04405305f290173acc0350eba6d2f1a794b57925df0398861a20fbafa415/xxhash-3.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:586886c7e89cb9828bcd8a5686b12e161368e0064d040e225e72607b43858ba2", size = 26796 }, + { url = "https://files.pythonhosted.org/packages/c9/b8/e4b3ad92d249be5c83fa72916c9091b0965cb0faeff05d9a0a3870ae6bff/xxhash-3.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:37889a0d13b0b7d739cfc128b1c902f04e32de17b33d74b637ad42f1c55101f6", size = 31795 }, + { url = "https://files.pythonhosted.org/packages/fc/d8/b3627a0aebfbfa4c12a41e22af3742cf08c8ea84f5cc3367b5de2d039cce/xxhash-3.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:97a662338797c660178e682f3bc180277b9569a59abfb5925e8620fba00b9fc5", size = 30792 }, + { url = "https://files.pythonhosted.org/packages/c3/cc/762312960691da989c7cd0545cb120ba2a4148741c6ba458aa723c00a3f8/xxhash-3.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f85e0108d51092bdda90672476c7d909c04ada6923c14ff9d913c4f7dc8a3bc", size = 220950 }, + { url = "https://files.pythonhosted.org/packages/fe/e9/cc266f1042c3c13750e86a535496b58beb12bf8c50a915c336136f6168dc/xxhash-3.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2fd827b0ba763ac919440042302315c564fdb797294d86e8cdd4578e3bc7f3", size = 199980 }, + { url = "https://files.pythonhosted.org/packages/bf/85/a836cd0dc5cc20376de26b346858d0ac9656f8f730998ca4324921a010b9/xxhash-3.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82085c2abec437abebf457c1d12fccb30cc8b3774a0814872511f0f0562c768c", size = 428324 }, + { url = "https://files.pythonhosted.org/packages/b4/0e/15c243775342ce840b9ba34aceace06a1148fa1630cd8ca269e3223987f5/xxhash-3.5.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07fda5de378626e502b42b311b049848c2ef38784d0d67b6f30bb5008642f8eb", size = 194370 }, + { url = "https://files.pythonhosted.org/packages/87/a1/b028bb02636dfdc190da01951d0703b3d904301ed0ef6094d948983bef0e/xxhash-3.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c279f0d2b34ef15f922b77966640ade58b4ccdfef1c4d94b20f2a364617a493f", size = 207911 }, + { url = "https://files.pythonhosted.org/packages/80/d5/73c73b03fc0ac73dacf069fdf6036c9abad82de0a47549e9912c955ab449/xxhash-3.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:89e66ceed67b213dec5a773e2f7a9e8c58f64daeb38c7859d8815d2c89f39ad7", size = 216352 }, + { url = "https://files.pythonhosted.org/packages/b6/2a/5043dba5ddbe35b4fe6ea0a111280ad9c3d4ba477dd0f2d1fe1129bda9d0/xxhash-3.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bcd51708a633410737111e998ceb3b45d3dbc98c0931f743d9bb0a209033a326", size = 203410 }, + { url = "https://files.pythonhosted.org/packages/a2/b2/9a8ded888b7b190aed75b484eb5c853ddd48aa2896e7b59bbfbce442f0a1/xxhash-3.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ff2c0a34eae7df88c868be53a8dd56fbdf592109e21d4bfa092a27b0bf4a7bf", size = 210322 }, + { url = "https://files.pythonhosted.org/packages/98/62/440083fafbc917bf3e4b67c2ade621920dd905517e85631c10aac955c1d2/xxhash-3.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4e28503dccc7d32e0b9817aa0cbfc1f45f563b2c995b7a66c4c8a0d232e840c7", size = 414725 }, + { url = "https://files.pythonhosted.org/packages/75/db/009206f7076ad60a517e016bb0058381d96a007ce3f79fa91d3010f49cc2/xxhash-3.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a6c50017518329ed65a9e4829154626f008916d36295b6a3ba336e2458824c8c", size = 192070 }, + { url = "https://files.pythonhosted.org/packages/1f/6d/c61e0668943a034abc3a569cdc5aeae37d686d9da7e39cf2ed621d533e36/xxhash-3.5.0-cp313-cp313-win32.whl", hash = "sha256:53a068fe70301ec30d868ece566ac90d873e3bb059cf83c32e76012c889b8637", size = 30172 }, + { url = "https://files.pythonhosted.org/packages/96/14/8416dce965f35e3d24722cdf79361ae154fa23e2ab730e5323aa98d7919e/xxhash-3.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:80babcc30e7a1a484eab952d76a4f4673ff601f54d5142c26826502740e70b43", size = 30041 }, + { url = "https://files.pythonhosted.org/packages/27/ee/518b72faa2073f5aa8e3262408d284892cb79cf2754ba0c3a5870645ef73/xxhash-3.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:4811336f1ce11cac89dcbd18f3a25c527c16311709a89313c3acaf771def2d4b", size = 26801 }, + { url = "https://files.pythonhosted.org/packages/ab/9a/233606bada5bd6f50b2b72c45de3d9868ad551e83893d2ac86dc7bb8553a/xxhash-3.5.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:2014c5b3ff15e64feecb6b713af12093f75b7926049e26a580e94dcad3c73d8c", size = 29732 }, + { url = "https://files.pythonhosted.org/packages/0c/67/f75276ca39e2c6604e3bee6c84e9db8a56a4973fde9bf35989787cf6e8aa/xxhash-3.5.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fab81ef75003eda96239a23eda4e4543cedc22e34c373edcaf744e721a163986", size = 36214 }, + { url = "https://files.pythonhosted.org/packages/0f/f8/f6c61fd794229cc3848d144f73754a0c107854372d7261419dcbbd286299/xxhash-3.5.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e2febf914ace002132aa09169cc572e0d8959d0f305f93d5828c4836f9bc5a6", size = 32020 }, + { url = "https://files.pythonhosted.org/packages/79/d3/c029c99801526f859e6b38d34ab87c08993bf3dcea34b11275775001638a/xxhash-3.5.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5d3a10609c51da2a1c0ea0293fc3968ca0a18bd73838455b5bca3069d7f8e32b", size = 40515 }, + { url = "https://files.pythonhosted.org/packages/62/e3/bef7b82c1997579c94de9ac5ea7626d01ae5858aa22bf4fcb38bf220cb3e/xxhash-3.5.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5a74f23335b9689b66eb6dbe2a931a88fcd7a4c2cc4b1cb0edba8ce381c7a1da", size = 30064 }, +] + +[[package]] +name = "yarl" +version = "1.18.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "multidict" }, + { name = "propcache" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b7/9d/4b94a8e6d2b51b599516a5cb88e5bc99b4d8d4583e468057eaa29d5f0918/yarl-1.18.3.tar.gz", hash = "sha256:ac1801c45cbf77b6c99242eeff4fffb5e4e73a800b5c4ad4fc0be5def634d2e1", size = 181062 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/98/e005bc608765a8a5569f58e650961314873c8469c333616eb40bff19ae97/yarl-1.18.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7df647e8edd71f000a5208fe6ff8c382a1de8edfbccdbbfe649d263de07d8c34", size = 141458 }, + { url = "https://files.pythonhosted.org/packages/df/5d/f8106b263b8ae8a866b46d9be869ac01f9b3fb7f2325f3ecb3df8003f796/yarl-1.18.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c69697d3adff5aa4f874b19c0e4ed65180ceed6318ec856ebc423aa5850d84f7", size = 94365 }, + { url = "https://files.pythonhosted.org/packages/56/3e/d8637ddb9ba69bf851f765a3ee288676f7cf64fb3be13760c18cbc9d10bd/yarl-1.18.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:602d98f2c2d929f8e697ed274fbadc09902c4025c5a9963bf4e9edfc3ab6f7ed", size = 92181 }, + { url = "https://files.pythonhosted.org/packages/76/f9/d616a5c2daae281171de10fba41e1c0e2d8207166fc3547252f7d469b4e1/yarl-1.18.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c654d5207c78e0bd6d749f6dae1dcbbfde3403ad3a4b11f3c5544d9906969dde", size = 315349 }, + { url = "https://files.pythonhosted.org/packages/bb/b4/3ea5e7b6f08f698b3769a06054783e434f6d59857181b5c4e145de83f59b/yarl-1.18.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5094d9206c64181d0f6e76ebd8fb2f8fe274950a63890ee9e0ebfd58bf9d787b", size = 330494 }, + { url = "https://files.pythonhosted.org/packages/55/f1/e0fc810554877b1b67420568afff51b967baed5b53bcc983ab164eebf9c9/yarl-1.18.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35098b24e0327fc4ebdc8ffe336cee0a87a700c24ffed13161af80124b7dc8e5", size = 326927 }, + { url = "https://files.pythonhosted.org/packages/a9/42/b1753949b327b36f210899f2dd0a0947c0c74e42a32de3f8eb5c7d93edca/yarl-1.18.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3236da9272872443f81fedc389bace88408f64f89f75d1bdb2256069a8730ccc", size = 319703 }, + { url = "https://files.pythonhosted.org/packages/f0/6d/e87c62dc9635daefb064b56f5c97df55a2e9cc947a2b3afd4fd2f3b841c7/yarl-1.18.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2c08cc9b16f4f4bc522771d96734c7901e7ebef70c6c5c35dd0f10845270bcd", size = 310246 }, + { url = "https://files.pythonhosted.org/packages/e3/ef/e2e8d1785cdcbd986f7622d7f0098205f3644546da7919c24b95790ec65a/yarl-1.18.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80316a8bd5109320d38eef8833ccf5f89608c9107d02d2a7f985f98ed6876990", size = 319730 }, + { url = "https://files.pythonhosted.org/packages/fc/15/8723e22345bc160dfde68c4b3ae8b236e868f9963c74015f1bc8a614101c/yarl-1.18.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c1e1cc06da1491e6734f0ea1e6294ce00792193c463350626571c287c9a704db", size = 321681 }, + { url = "https://files.pythonhosted.org/packages/86/09/bf764e974f1516efa0ae2801494a5951e959f1610dd41edbfc07e5e0f978/yarl-1.18.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fea09ca13323376a2fdfb353a5fa2e59f90cd18d7ca4eaa1fd31f0a8b4f91e62", size = 324812 }, + { url = "https://files.pythonhosted.org/packages/f6/4c/20a0187e3b903c97d857cf0272d687c1b08b03438968ae8ffc50fe78b0d6/yarl-1.18.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e3b9fd71836999aad54084906f8663dffcd2a7fb5cdafd6c37713b2e72be1760", size = 337011 }, + { url = "https://files.pythonhosted.org/packages/c9/71/6244599a6e1cc4c9f73254a627234e0dad3883ece40cc33dce6265977461/yarl-1.18.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:757e81cae69244257d125ff31663249b3013b5dc0a8520d73694aed497fb195b", size = 338132 }, + { url = "https://files.pythonhosted.org/packages/af/f5/e0c3efaf74566c4b4a41cb76d27097df424052a064216beccae8d303c90f/yarl-1.18.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b1771de9944d875f1b98a745bc547e684b863abf8f8287da8466cf470ef52690", size = 331849 }, + { url = "https://files.pythonhosted.org/packages/8a/b8/3d16209c2014c2f98a8f658850a57b716efb97930aebf1ca0d9325933731/yarl-1.18.3-cp310-cp310-win32.whl", hash = "sha256:8874027a53e3aea659a6d62751800cf6e63314c160fd607489ba5c2edd753cf6", size = 84309 }, + { url = "https://files.pythonhosted.org/packages/fd/b7/2e9a5b18eb0fe24c3a0e8bae994e812ed9852ab4fd067c0107fadde0d5f0/yarl-1.18.3-cp310-cp310-win_amd64.whl", hash = "sha256:93b2e109287f93db79210f86deb6b9bbb81ac32fc97236b16f7433db7fc437d8", size = 90484 }, + { url = "https://files.pythonhosted.org/packages/40/93/282b5f4898d8e8efaf0790ba6d10e2245d2c9f30e199d1a85cae9356098c/yarl-1.18.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8503ad47387b8ebd39cbbbdf0bf113e17330ffd339ba1144074da24c545f0069", size = 141555 }, + { url = "https://files.pythonhosted.org/packages/6d/9c/0a49af78df099c283ca3444560f10718fadb8a18dc8b3edf8c7bd9fd7d89/yarl-1.18.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02ddb6756f8f4517a2d5e99d8b2f272488e18dd0bfbc802f31c16c6c20f22193", size = 94351 }, + { url = "https://files.pythonhosted.org/packages/5a/a1/205ab51e148fdcedad189ca8dd587794c6f119882437d04c33c01a75dece/yarl-1.18.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:67a283dd2882ac98cc6318384f565bffc751ab564605959df4752d42483ad889", size = 92286 }, + { url = "https://files.pythonhosted.org/packages/ed/fe/88b690b30f3f59275fb674f5f93ddd4a3ae796c2b62e5bb9ece8a4914b83/yarl-1.18.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d980e0325b6eddc81331d3f4551e2a333999fb176fd153e075c6d1c2530aa8a8", size = 340649 }, + { url = "https://files.pythonhosted.org/packages/07/eb/3b65499b568e01f36e847cebdc8d7ccb51fff716dbda1ae83c3cbb8ca1c9/yarl-1.18.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b643562c12680b01e17239be267bc306bbc6aac1f34f6444d1bded0c5ce438ca", size = 356623 }, + { url = "https://files.pythonhosted.org/packages/33/46/f559dc184280b745fc76ec6b1954de2c55595f0ec0a7614238b9ebf69618/yarl-1.18.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c017a3b6df3a1bd45b9fa49a0f54005e53fbcad16633870104b66fa1a30a29d8", size = 354007 }, + { url = "https://files.pythonhosted.org/packages/af/ba/1865d85212351ad160f19fb99808acf23aab9a0f8ff31c8c9f1b4d671fc9/yarl-1.18.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75674776d96d7b851b6498f17824ba17849d790a44d282929c42dbb77d4f17ae", size = 344145 }, + { url = "https://files.pythonhosted.org/packages/94/cb/5c3e975d77755d7b3d5193e92056b19d83752ea2da7ab394e22260a7b824/yarl-1.18.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ccaa3a4b521b780a7e771cc336a2dba389a0861592bbce09a476190bb0c8b4b3", size = 336133 }, + { url = "https://files.pythonhosted.org/packages/19/89/b77d3fd249ab52a5c40859815765d35c91425b6bb82e7427ab2f78f5ff55/yarl-1.18.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2d06d3005e668744e11ed80812e61efd77d70bb7f03e33c1598c301eea20efbb", size = 347967 }, + { url = "https://files.pythonhosted.org/packages/35/bd/f6b7630ba2cc06c319c3235634c582a6ab014d52311e7d7c22f9518189b5/yarl-1.18.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:9d41beda9dc97ca9ab0b9888cb71f7539124bc05df02c0cff6e5acc5a19dcc6e", size = 346397 }, + { url = "https://files.pythonhosted.org/packages/18/1a/0b4e367d5a72d1f095318344848e93ea70da728118221f84f1bf6c1e39e7/yarl-1.18.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ba23302c0c61a9999784e73809427c9dbedd79f66a13d84ad1b1943802eaaf59", size = 350206 }, + { url = "https://files.pythonhosted.org/packages/b5/cf/320fff4367341fb77809a2d8d7fe75b5d323a8e1b35710aafe41fdbf327b/yarl-1.18.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6748dbf9bfa5ba1afcc7556b71cda0d7ce5f24768043a02a58846e4a443d808d", size = 362089 }, + { url = "https://files.pythonhosted.org/packages/57/cf/aadba261d8b920253204085268bad5e8cdd86b50162fcb1b10c10834885a/yarl-1.18.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0b0cad37311123211dc91eadcb322ef4d4a66008d3e1bdc404808992260e1a0e", size = 366267 }, + { url = "https://files.pythonhosted.org/packages/54/58/fb4cadd81acdee6dafe14abeb258f876e4dd410518099ae9a35c88d8097c/yarl-1.18.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0fb2171a4486bb075316ee754c6d8382ea6eb8b399d4ec62fde2b591f879778a", size = 359141 }, + { url = "https://files.pythonhosted.org/packages/9a/7a/4c571597589da4cd5c14ed2a0b17ac56ec9ee7ee615013f74653169e702d/yarl-1.18.3-cp311-cp311-win32.whl", hash = "sha256:61b1a825a13bef4a5f10b1885245377d3cd0bf87cba068e1d9a88c2ae36880e1", size = 84402 }, + { url = "https://files.pythonhosted.org/packages/ae/7b/8600250b3d89b625f1121d897062f629883c2f45339623b69b1747ec65fa/yarl-1.18.3-cp311-cp311-win_amd64.whl", hash = "sha256:b9d60031cf568c627d028239693fd718025719c02c9f55df0a53e587aab951b5", size = 91030 }, + { url = "https://files.pythonhosted.org/packages/33/85/bd2e2729752ff4c77338e0102914897512e92496375e079ce0150a6dc306/yarl-1.18.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1dd4bdd05407ced96fed3d7f25dbbf88d2ffb045a0db60dbc247f5b3c5c25d50", size = 142644 }, + { url = "https://files.pythonhosted.org/packages/ff/74/1178322cc0f10288d7eefa6e4a85d8d2e28187ccab13d5b844e8b5d7c88d/yarl-1.18.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7c33dd1931a95e5d9a772d0ac5e44cac8957eaf58e3c8da8c1414de7dd27c576", size = 94962 }, + { url = "https://files.pythonhosted.org/packages/be/75/79c6acc0261e2c2ae8a1c41cf12265e91628c8c58ae91f5ff59e29c0787f/yarl-1.18.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25b411eddcfd56a2f0cd6a384e9f4f7aa3efee14b188de13048c25b5e91f1640", size = 92795 }, + { url = "https://files.pythonhosted.org/packages/6b/32/927b2d67a412c31199e83fefdce6e645247b4fb164aa1ecb35a0f9eb2058/yarl-1.18.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:436c4fc0a4d66b2badc6c5fc5ef4e47bb10e4fd9bf0c79524ac719a01f3607c2", size = 332368 }, + { url = "https://files.pythonhosted.org/packages/19/e5/859fca07169d6eceeaa4fde1997c91d8abde4e9a7c018e371640c2da2b71/yarl-1.18.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e35ef8683211db69ffe129a25d5634319a677570ab6b2eba4afa860f54eeaf75", size = 342314 }, + { url = "https://files.pythonhosted.org/packages/08/75/76b63ccd91c9e03ab213ef27ae6add2e3400e77e5cdddf8ed2dbc36e3f21/yarl-1.18.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84b2deecba4a3f1a398df819151eb72d29bfeb3b69abb145a00ddc8d30094512", size = 341987 }, + { url = "https://files.pythonhosted.org/packages/1a/e1/a097d5755d3ea8479a42856f51d97eeff7a3a7160593332d98f2709b3580/yarl-1.18.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e5a1fea0fd4f5bfa7440a47eff01d9822a65b4488f7cff83155a0f31a2ecba", size = 336914 }, + { url = "https://files.pythonhosted.org/packages/0b/42/e1b4d0e396b7987feceebe565286c27bc085bf07d61a59508cdaf2d45e63/yarl-1.18.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0e883008013c0e4aef84dcfe2a0b172c4d23c2669412cf5b3371003941f72bb", size = 325765 }, + { url = "https://files.pythonhosted.org/packages/7e/18/03a5834ccc9177f97ca1bbb245b93c13e58e8225276f01eedc4cc98ab820/yarl-1.18.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a3f356548e34a70b0172d8890006c37be92995f62d95a07b4a42e90fba54272", size = 344444 }, + { url = "https://files.pythonhosted.org/packages/c8/03/a713633bdde0640b0472aa197b5b86e90fbc4c5bc05b727b714cd8a40e6d/yarl-1.18.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ccd17349166b1bee6e529b4add61727d3f55edb7babbe4069b5764c9587a8cc6", size = 340760 }, + { url = "https://files.pythonhosted.org/packages/eb/99/f6567e3f3bbad8fd101886ea0276c68ecb86a2b58be0f64077396cd4b95e/yarl-1.18.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b958ddd075ddba5b09bb0be8a6d9906d2ce933aee81100db289badbeb966f54e", size = 346484 }, + { url = "https://files.pythonhosted.org/packages/8e/a9/84717c896b2fc6cb15bd4eecd64e34a2f0a9fd6669e69170c73a8b46795a/yarl-1.18.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d79f7d9aabd6011004e33b22bc13056a3e3fb54794d138af57f5ee9d9032cb", size = 359864 }, + { url = "https://files.pythonhosted.org/packages/1e/2e/d0f5f1bef7ee93ed17e739ec8dbcb47794af891f7d165fa6014517b48169/yarl-1.18.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4891ed92157e5430874dad17b15eb1fda57627710756c27422200c52d8a4e393", size = 364537 }, + { url = "https://files.pythonhosted.org/packages/97/8a/568d07c5d4964da5b02621a517532adb8ec5ba181ad1687191fffeda0ab6/yarl-1.18.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ce1af883b94304f493698b00d0f006d56aea98aeb49d75ec7d98cd4a777e9285", size = 357861 }, + { url = "https://files.pythonhosted.org/packages/7d/e3/924c3f64b6b3077889df9a1ece1ed8947e7b61b0a933f2ec93041990a677/yarl-1.18.3-cp312-cp312-win32.whl", hash = "sha256:f91c4803173928a25e1a55b943c81f55b8872f0018be83e3ad4938adffb77dd2", size = 84097 }, + { url = "https://files.pythonhosted.org/packages/34/45/0e055320daaabfc169b21ff6174567b2c910c45617b0d79c68d7ab349b02/yarl-1.18.3-cp312-cp312-win_amd64.whl", hash = "sha256:7e2ee16578af3b52ac2f334c3b1f92262f47e02cc6193c598502bd46f5cd1477", size = 90399 }, + { url = "https://files.pythonhosted.org/packages/30/c7/c790513d5328a8390be8f47be5d52e141f78b66c6c48f48d241ca6bd5265/yarl-1.18.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:90adb47ad432332d4f0bc28f83a5963f426ce9a1a8809f5e584e704b82685dcb", size = 140789 }, + { url = "https://files.pythonhosted.org/packages/30/aa/a2f84e93554a578463e2edaaf2300faa61c8701f0898725842c704ba5444/yarl-1.18.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:913829534200eb0f789d45349e55203a091f45c37a2674678744ae52fae23efa", size = 94144 }, + { url = "https://files.pythonhosted.org/packages/c6/fc/d68d8f83714b221a85ce7866832cba36d7c04a68fa6a960b908c2c84f325/yarl-1.18.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ef9f7768395923c3039055c14334ba4d926f3baf7b776c923c93d80195624782", size = 91974 }, + { url = "https://files.pythonhosted.org/packages/56/4e/d2563d8323a7e9a414b5b25341b3942af5902a2263d36d20fb17c40411e2/yarl-1.18.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a19f62ff30117e706ebc9090b8ecc79aeb77d0b1f5ec10d2d27a12bc9f66d0", size = 333587 }, + { url = "https://files.pythonhosted.org/packages/25/c9/cfec0bc0cac8d054be223e9f2c7909d3e8442a856af9dbce7e3442a8ec8d/yarl-1.18.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e17c9361d46a4d5addf777c6dd5eab0715a7684c2f11b88c67ac37edfba6c482", size = 344386 }, + { url = "https://files.pythonhosted.org/packages/ab/5d/4c532190113b25f1364d25f4c319322e86232d69175b91f27e3ebc2caf9a/yarl-1.18.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a74a13a4c857a84a845505fd2d68e54826a2cd01935a96efb1e9d86c728e186", size = 345421 }, + { url = "https://files.pythonhosted.org/packages/23/d1/6cdd1632da013aa6ba18cee4d750d953104a5e7aac44e249d9410a972bf5/yarl-1.18.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41f7ce59d6ee7741af71d82020346af364949314ed3d87553763a2df1829cc58", size = 339384 }, + { url = "https://files.pythonhosted.org/packages/9a/c4/6b3c39bec352e441bd30f432cda6ba51681ab19bb8abe023f0d19777aad1/yarl-1.18.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f52a265001d830bc425f82ca9eabda94a64a4d753b07d623a9f2863fde532b53", size = 326689 }, + { url = "https://files.pythonhosted.org/packages/23/30/07fb088f2eefdc0aa4fc1af4e3ca4eb1a3aadd1ce7d866d74c0f124e6a85/yarl-1.18.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:82123d0c954dc58db301f5021a01854a85bf1f3bb7d12ae0c01afc414a882ca2", size = 345453 }, + { url = "https://files.pythonhosted.org/packages/63/09/d54befb48f9cd8eec43797f624ec37783a0266855f4930a91e3d5c7717f8/yarl-1.18.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2ec9bbba33b2d00999af4631a3397d1fd78290c48e2a3e52d8dd72db3a067ac8", size = 341872 }, + { url = "https://files.pythonhosted.org/packages/91/26/fd0ef9bf29dd906a84b59f0cd1281e65b0c3e08c6aa94b57f7d11f593518/yarl-1.18.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fbd6748e8ab9b41171bb95c6142faf068f5ef1511935a0aa07025438dd9a9bc1", size = 347497 }, + { url = "https://files.pythonhosted.org/packages/d9/b5/14ac7a256d0511b2ac168d50d4b7d744aea1c1aa20c79f620d1059aab8b2/yarl-1.18.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:877d209b6aebeb5b16c42cbb377f5f94d9e556626b1bfff66d7b0d115be88d0a", size = 359981 }, + { url = "https://files.pythonhosted.org/packages/ca/b3/d493221ad5cbd18bc07e642894030437e405e1413c4236dd5db6e46bcec9/yarl-1.18.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b464c4ab4bfcb41e3bfd3f1c26600d038376c2de3297760dfe064d2cb7ea8e10", size = 366229 }, + { url = "https://files.pythonhosted.org/packages/04/56/6a3e2a5d9152c56c346df9b8fb8edd2c8888b1e03f96324d457e5cf06d34/yarl-1.18.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8d39d351e7faf01483cc7ff7c0213c412e38e5a340238826be7e0e4da450fdc8", size = 360383 }, + { url = "https://files.pythonhosted.org/packages/fd/b7/4b3c7c7913a278d445cc6284e59b2e62fa25e72758f888b7a7a39eb8423f/yarl-1.18.3-cp313-cp313-win32.whl", hash = "sha256:61ee62ead9b68b9123ec24bc866cbef297dd266175d53296e2db5e7f797f902d", size = 310152 }, + { url = "https://files.pythonhosted.org/packages/f5/d5/688db678e987c3e0fb17867970700b92603cadf36c56e5fb08f23e822a0c/yarl-1.18.3-cp313-cp313-win_amd64.whl", hash = "sha256:578e281c393af575879990861823ef19d66e2b1d0098414855dd367e234f5b3c", size = 315723 }, + { url = "https://files.pythonhosted.org/packages/f5/4b/a06e0ec3d155924f77835ed2d167ebd3b211a7b0853da1cf8d8414d784ef/yarl-1.18.3-py3-none-any.whl", hash = "sha256:b57f4f58099328dfb26c6a771d09fb20dbbae81d20cfb66141251ea063bd101b", size = 45109 }, +]