From d0e3628f26c42d3ace3c8ab66b6e17b92e56679a Mon Sep 17 00:00:00 2001
From: Archmonger <16909269+Archmonger@users.noreply.github.com>
Date: Wed, 14 Jun 2023 14:00:46 -0700
Subject: [PATCH 01/49] `Archmonger/reactpy-docs/main` to
`reactive-python/reactpy/new-docs`
---
.github/workflows/.hatch-run.yml | 59 -
.github/workflows/check.yml | 45 -
.github/workflows/codeql-analysis.yml | 71 -
.github/workflows/deploy-docs.yml | 30 -
.github/workflows/publish.yml | 20 -
CHANGELOG.md | 199 ++
README.md | 73 +-
docs/.gitignore | 4 -
docs/Dockerfile | 40 -
docs/LICENSE.md | 393 +++
docs/README.md | 20 -
docs/docs_app/app.py | 59 -
docs/docs_app/dev.py | 104 -
docs/docs_app/examples.py | 177 -
docs/docs_app/prod.py | 14 -
.../css/quick_start/adding_styles.css | 4 +
.../css/quick_start/displaying_data.css | 7 +
.../sharing_data_between_components.css | 4 +
.../css/quick_start/updating_the_screen.css | 4 +
.../css/tutorial-tic-tac-toe/tic_tac_toe.css | 42 +
.../{docs_app => examples/python}/__init__.py | 0
docs/examples/python/quick_start/__init__.py | 0
.../python/quick_start/adding_styles.py | 4 +
.../quick_start/conditional_rendering.py | 22 +
.../conditional_rendering_logical_and.py | 14 +
.../conditional_rendering_ternary.py | 18 +
.../creating_and_nesting_components.py | 21 +
.../python/quick_start/displaying_data.py | 32 +
docs/examples/python/quick_start/my_app.py | 12 +
docs/examples/python/quick_start/my_button.py | 7 +
.../python/quick_start/rendering_lists.py | 30 +
.../quick_start/rendering_lists_list_items.py | 6 +
.../quick_start/rendering_lists_products.py | 5 +
.../quick_start/responding_to_events.py | 13 +
.../sharing_data_between_components.py | 27 +
.../sharing_data_between_components_button.py | 7 +
...ring_data_between_components_move_state.py | 20 +
.../sharing_data_between_components_props.py | 22 +
.../python/quick_start/updating_the_screen.py | 27 +
.../quick_start/updating_the_screen_event.py | 12 +
.../updating_the_screen_use_state.py | 5 +
.../updating_the_screen_use_state_button.py | 8 +
.../tutorial-tic-tac-toe/tic_tac_toe.py | 117 +
docs/main.py | 9 -
docs/overrides/main.html | 13 +
docs/poetry.lock | 2269 -------------
docs/pyproject.toml | 23 -
docs/requirements.txt | 8 +
docs/source/_custom_js/README.md | 9 -
docs/source/_custom_js/package-lock.json | 766 -----
docs/source/_custom_js/package.json | 20 -
docs/source/_custom_js/rollup.config.js | 26 -
docs/source/_custom_js/src/index.js | 94 -
docs/source/_exts/async_doctest.py | 47 -
docs/source/_exts/autogen_api_docs.py | 146 -
docs/source/_exts/build_custom_js.py | 12 -
docs/source/_exts/copy_vdom_json_schema.py | 17 -
docs/source/_exts/custom_autosectionlabel.py | 80 -
docs/source/_exts/patched_html_translator.py | 24 -
docs/source/_exts/reactpy_example.py | 180 -
docs/source/_exts/reactpy_view.py | 63 -
.../_static/css/furo-theme-overrides.css | 6 -
.../source/_static/css/larger-api-margins.css | 7 -
docs/source/_static/css/larger-headings.css | 9 -
docs/source/_static/css/reactpy-view.css | 43 -
.../_static/css/sphinx-design-overrides.css | 14 -
.../css/widget-output-css-overrides.css | 8 -
.../_static/install-and-run-reactpy.gif | Bin 1049193 -> 0 bytes
docs/source/about/changelog.rst | 1124 -------
docs/source/about/contributor-guide.rst | 331 --
docs/source/about/credits-and-licenses.rst | 16 -
docs/source/conf.py | 330 --
.../_examples/adding_state_variable/data.json | 72 -
.../_examples/adding_state_variable/main.py | 35 -
.../_examples/isolated_state/data.json | 72 -
.../_examples/isolated_state/main.py | 53 -
.../multiple_state_variables/data.json | 72 -
.../multiple_state_variables/main.py | 45 -
.../when_variables_are_not_enough/data.json | 72 -
.../when_variables_are_not_enough/main.py | 42 -
.../components-with-state/index.rst | 351 --
.../_examples/dict_remove.py | 58 -
.../_examples/dict_update.py | 44 -
.../_examples/list_insert.py | 25 -
.../_examples/list_re_order.py | 24 -
.../_examples/list_remove.py | 44 -
.../_examples/list_replace.py | 27 -
.../_examples/moving_dot.py | 45 -
.../_examples/moving_dot_broken.py | 43 -
.../_examples/set_remove.py | 41 -
.../_examples/set_update.py | 38 -
.../dangers-of-mutability/index.rst | 569 ----
.../guides/adding-interactivity/index.rst | 210 --
.../_examples/delay_before_count_updater.py | 20 -
.../_examples/delay_before_set_count.py | 20 -
.../_examples/set_color_3_times.py | 27 -
.../_examples/set_state_function.py | 24 -
.../multiple-state-updates/index.rst | 109 -
.../_examples/audio_player.py | 21 -
.../_examples/button_async_handlers.py | 23 -
.../_examples/button_does_nothing.py | 9 -
.../_examples/button_handler_as_arg.py | 33 -
.../_examples/button_prints_event.py | 12 -
.../_examples/button_prints_message.py | 20 -
.../prevent_default_event_actions.py | 18 -
.../_examples/stop_event_propagation.py | 42 -
.../responding-to-events/index.rst | 144 -
.../_examples/delayed_print_after_set.py | 22 -
.../_examples/print_chat_message.py | 44 -
.../_examples/print_count_after_set.py | 18 -
.../_examples/send_message.py | 35 -
.../_examples/set_counter_3_times.py | 19 -
.../_static/direct-state-change.png | Bin 181824 -> 0 bytes
.../_static/reactpy-state-change.png | Bin 569027 -> 0 bytes
.../state-as-a-snapshot/index.rst | 158 -
.../html-with-reactpy/index.rst | 131 -
.../guides/creating-interfaces/index.rst | 128 -
.../sorted_and_filtered_todo_list.py | 32 -
.../_examples/todo_from_list.py | 28 -
.../_examples/todo_list_with_keys.py | 32 -
.../rendering-data/index.rst | 297 --
.../_examples/bad_conditional_todo_list.py | 24 -
.../_examples/good_conditional_todo_list.py | 21 -
.../_examples/nested_photos.py | 25 -
.../_examples/parametrized_photos.py | 25 -
.../_examples/simple_photo.py | 15 -
.../_examples/todo_list.py | 21 -
.../_examples/wrap_in_div.py | 13 -
.../_examples/wrap_in_fragment.py | 13 -
.../your-first-components/index.rst | 134 -
.../_examples/material_ui_button_no_action.py | 16 -
.../_examples/material_ui_button_on_click.py | 30 -
.../_examples/super_simple_chart/main.py | 32 -
.../super_simple_chart/super-simple-chart.js | 82 -
.../distributing-javascript.rst | 307 --
docs/source/guides/escape-hatches/index.rst | 14 -
.../escape-hatches/javascript-components.rst | 146 -
.../escape-hatches/using-a-custom-backend.rst | 9 -
.../escape-hatches/using-a-custom-client.rst | 9 -
.../_examples/debug_error_example.py | 20 -
.../getting-started/_examples/hello_world.py | 9 -
.../getting-started/_examples/run_fastapi.py | 22 -
.../getting-started/_examples/run_flask.py | 22 -
.../getting-started/_examples/run_sanic.py | 26 -
.../_examples/run_starlette.py | 22 -
.../getting-started/_examples/run_tornado.py | 31 -
.../getting-started/_examples/sample_app.py | 3 -
.../getting-started/_static/embed-doc-ex.html | 8 -
.../_static/embed-reactpy-view/index.html | 31 -
.../_static/embed-reactpy-view/main.py | 22 -
.../_static/embed-reactpy-view/screenshot.png | Bin 13161 -> 0 bytes
.../getting-started/_static/logo-django.svg | 38 -
.../getting-started/_static/logo-jupyter.svg | 88 -
.../getting-started/_static/logo-plotly.svg | 11 -
.../_static/reactpy-in-jupyterlab.gif | Bin 551674 -> 0 bytes
.../shared-client-state-server-slider.gif | Bin 98006 -> 0 bytes
docs/source/guides/getting-started/index.rst | 123 -
.../getting-started/installing-reactpy.rst | 121 -
.../getting-started/running-reactpy.rst | 221 --
.../combining-contexts-and-reducers/index.rst | 6 -
.../index.rst | 6 -
.../how-to-structure-state/index.rst | 8 -
docs/source/guides/managing-state/index.rst | 127 -
.../_examples/filterable_list/data.json | 22 -
.../_examples/filterable_list/main.py | 44 -
.../_examples/synced_inputs/main.py | 23 -
.../sharing-component-state/index.rst | 38 -
.../index.rst | 6 -
.../when-and-how-to-reset-state/index.rst | 8 -
.../_static/idom-flow-diagram.svg | 383 ---
.../_static/live-examples-in-docs.gif | Bin 182779 -> 0 bytes
.../_static/mvc-flow-diagram.svg | 425 ---
.../_static/npm-download-trends.png | Bin 64372 -> 0 bytes
.../guides/understanding-reactpy/index.rst | 17 -
.../layout-render-servers.rst | 8 -
.../representing-html.rst | 76 -
.../the-rendering-pipeline.rst | 10 -
.../the-rendering-process.rst | 10 -
.../what-are-components.rst | 8 -
.../why-reactpy-needs-keys.rst | 8 -
.../understanding-reactpy/writing-tests.rst | 8 -
docs/source/index.rst | 206 --
.../_examples/character_movement/main.py | 73 -
.../character_movement/static/bunny.png | Bin 474 -> 0 bytes
.../source/reference/_examples/click_count.py | 13 -
.../reference/_examples/material_ui_switch.py | 22 -
.../reference/_examples/matplotlib_plot.py | 85 -
.../reference/_examples/network_graph.py | 40 -
.../source/reference/_examples/pigeon_maps.py | 46 -
.../reference/_examples/simple_dashboard.py | 102 -
docs/source/reference/_examples/slideshow.py | 20 -
docs/source/reference/_examples/snake_game.py | 188 --
docs/source/reference/_examples/todo.py | 35 -
.../_examples/use_reducer_counter.py | 27 -
.../reference/_examples/use_state_counter.py | 26 -
.../reference/_examples/victory_chart.py | 7 -
.../reference/_static/vdom-json-schema.json | 106 -
docs/source/reference/browser-events.rst | 65 -
docs/source/reference/hooks-api.rst | 379 ---
docs/source/reference/html-attributes.rst | 197 --
docs/source/reference/javascript-api.rst | 8 -
docs/source/reference/specifications.rst | 170 -
docs/src/about/changelog.md | 11 +
docs/src/about/code.md | 3 +
docs/src/about/community.md | 3 +
docs/src/about/docs.md | 3 +
docs/src/about/running-tests.md | 3 +
docs/src/dictionary.txt | 28 +
docs/src/index.md | 57 +
.../learn/add-react-to-an-existing-project.md | 153 +
.../src/learn/choosing-the-state-structure.md | 2866 ++++++++++++++++
...municate-data-between-server-and-client.md | 3 +
docs/src/learn/conditional-rendering.md | 576 ++++
.../learn/convert-between-vdom-and-html.md | 3 +
docs/src/learn/creating-backends.md | 3 +
docs/src/learn/creating-html-tags.md | 3 +
.../src/learn/creating-vdom-event-handlers.md | 3 +
docs/src/learn/editor-setup.md | 62 +
.../extracting-state-logic-into-a-reducer.md | 2644 +++++++++++++++
docs/src/learn/get-started.md | 303 ++
.../importing-and-exporting-components.md | 382 +++
docs/src/learn/keeping-components-pure.md | 815 +++++
.../learn/lifecycle-of-reactive-effects.md | 2252 +++++++++++++
.../learn/manipulating-the-dom-with-refs.md | 1078 ++++++
docs/src/learn/manually-register-a-client.md | 3 +
.../learn/passing-data-deeply-with-context.md | 1092 ++++++
.../src/learn/passing-props-to-a-component.md | 1080 ++++++
.../learn/preserving-and-resetting-state.md | 2027 +++++++++++
.../learn/python-in-psx-with-curly-braces.md | 591 ++++
.../queueing-a-series-of-state-updates.md | 560 +++
docs/src/learn/react-developer-tools.md | 85 +
.../src/learn/reacting-to-input-with-state.md | 1179 +++++++
.../src/learn/referencing-values-with-refs.md | 569 ++++
.../src/learn/removing-effect-dependencies.md | 2421 +++++++++++++
docs/src/learn/render-and-commit.md | 201 ++
docs/src/learn/rendering-lists.md | 1272 +++++++
docs/src/learn/responding-to-events.md | 648 ++++
.../learn/reusing-logic-with-custom-hooks.md | 2519 ++++++++++++++
.../scaling-up-with-reducer-and-context.md | 1373 ++++++++
.../learn/separating-events-from-effects.md | 1888 +++++++++++
.../learn/sharing-state-between-components.md | 579 ++++
docs/src/learn/start-a-new-react-project.md | 133 +
docs/src/learn/state-a-components-memory.md | 1652 +++++++++
docs/src/learn/state-as-a-snapshot.md | 472 +++
docs/src/learn/synchronizing-with-effects.md | 1550 +++++++++
docs/src/learn/thinking-in-react.md | 631 ++++
docs/src/learn/tutorial-material-ui.md | 3 +
docs/src/learn/tutorial-react-bootstrap.md | 3 +
docs/src/learn/tutorial-tic-tac-toe.md | 2996 +++++++++++++++++
docs/src/learn/updating-arrays-in-state.md | 1853 ++++++++++
docs/src/learn/updating-objects-in-state.md | 1569 +++++++++
docs/src/learn/vdom-mutations.md | 3 +
docs/src/learn/writing-markup-with-psx.md | 326 ++
.../src/learn/you-might-not-need-an-effect.md | 1702 ++++++++++
docs/src/learn/your-first-component.md | 404 +++
docs/src/reference/client-api.md | 3 +
docs/src/reference/common-events.md | 3 +
docs/src/reference/common-props.md | 3 +
docs/src/reference/common-types.md | 3 +
docs/src/reference/django.md | 3 +
docs/src/reference/fastapi.md | 3 +
docs/src/reference/flask.md | 3 +
docs/src/reference/jupyter.md | 3 +
docs/src/reference/plotly-dash.md | 3 +
docs/src/reference/protocol-structure.md | 3 +
docs/src/reference/sanic.md | 3 +
docs/src/reference/starlette.md | 3 +
docs/src/reference/tornado.md | 3 +
docs/src/reference/usage.md | 3 +
docs/src/reference/use-callback.md | 3 +
docs/src/reference/use-connection.md | 3 +
docs/src/reference/use-context.md | 3 +
docs/src/reference/use-debug-value.md | 3 +
docs/src/reference/use-effect.md | 3 +
docs/src/reference/use-location.md | 3 +
docs/src/reference/use-memo.md | 3 +
docs/src/reference/use-reducer.md | 3 +
docs/src/reference/use-ref.md | 3 +
docs/src/reference/use-scope.md | 3 +
docs/src/reference/use-state.md | 3 +
docs/src/static/css/extra.css | 323 ++
.../static/images/s_thinking-in-react_ui.png | Bin 0 -> 25981 bytes
.../images/s_thinking-in-react_ui_outline.png | Bin 0 -> 83418 bytes
docs/src/static/js/extra.js | 19 +
mkdocs.yml | 178 +
285 files changed, 44339 insertions(+), 14644 deletions(-)
delete mode 100644 .github/workflows/.hatch-run.yml
delete mode 100644 .github/workflows/check.yml
delete mode 100644 .github/workflows/codeql-analysis.yml
delete mode 100644 .github/workflows/deploy-docs.yml
delete mode 100644 .github/workflows/publish.yml
create mode 100644 CHANGELOG.md
delete mode 100644 docs/.gitignore
delete mode 100644 docs/Dockerfile
create mode 100644 docs/LICENSE.md
delete mode 100644 docs/README.md
delete mode 100644 docs/docs_app/app.py
delete mode 100644 docs/docs_app/dev.py
delete mode 100644 docs/docs_app/examples.py
delete mode 100644 docs/docs_app/prod.py
create mode 100644 docs/examples/css/quick_start/adding_styles.css
create mode 100644 docs/examples/css/quick_start/displaying_data.css
create mode 100644 docs/examples/css/quick_start/sharing_data_between_components.css
create mode 100644 docs/examples/css/quick_start/updating_the_screen.css
create mode 100644 docs/examples/css/tutorial-tic-tac-toe/tic_tac_toe.css
rename docs/{docs_app => examples/python}/__init__.py (100%)
create mode 100644 docs/examples/python/quick_start/__init__.py
create mode 100644 docs/examples/python/quick_start/adding_styles.py
create mode 100644 docs/examples/python/quick_start/conditional_rendering.py
create mode 100644 docs/examples/python/quick_start/conditional_rendering_logical_and.py
create mode 100644 docs/examples/python/quick_start/conditional_rendering_ternary.py
create mode 100644 docs/examples/python/quick_start/creating_and_nesting_components.py
create mode 100644 docs/examples/python/quick_start/displaying_data.py
create mode 100644 docs/examples/python/quick_start/my_app.py
create mode 100644 docs/examples/python/quick_start/my_button.py
create mode 100644 docs/examples/python/quick_start/rendering_lists.py
create mode 100644 docs/examples/python/quick_start/rendering_lists_list_items.py
create mode 100644 docs/examples/python/quick_start/rendering_lists_products.py
create mode 100644 docs/examples/python/quick_start/responding_to_events.py
create mode 100644 docs/examples/python/quick_start/sharing_data_between_components.py
create mode 100644 docs/examples/python/quick_start/sharing_data_between_components_button.py
create mode 100644 docs/examples/python/quick_start/sharing_data_between_components_move_state.py
create mode 100644 docs/examples/python/quick_start/sharing_data_between_components_props.py
create mode 100644 docs/examples/python/quick_start/updating_the_screen.py
create mode 100644 docs/examples/python/quick_start/updating_the_screen_event.py
create mode 100644 docs/examples/python/quick_start/updating_the_screen_use_state.py
create mode 100644 docs/examples/python/quick_start/updating_the_screen_use_state_button.py
create mode 100644 docs/examples/python/tutorial-tic-tac-toe/tic_tac_toe.py
delete mode 100644 docs/main.py
create mode 100644 docs/overrides/main.html
delete mode 100644 docs/poetry.lock
delete mode 100644 docs/pyproject.toml
create mode 100644 docs/requirements.txt
delete mode 100644 docs/source/_custom_js/README.md
delete mode 100644 docs/source/_custom_js/package-lock.json
delete mode 100644 docs/source/_custom_js/package.json
delete mode 100644 docs/source/_custom_js/rollup.config.js
delete mode 100644 docs/source/_custom_js/src/index.js
delete mode 100644 docs/source/_exts/async_doctest.py
delete mode 100644 docs/source/_exts/autogen_api_docs.py
delete mode 100644 docs/source/_exts/build_custom_js.py
delete mode 100644 docs/source/_exts/copy_vdom_json_schema.py
delete mode 100644 docs/source/_exts/custom_autosectionlabel.py
delete mode 100644 docs/source/_exts/patched_html_translator.py
delete mode 100644 docs/source/_exts/reactpy_example.py
delete mode 100644 docs/source/_exts/reactpy_view.py
delete mode 100644 docs/source/_static/css/furo-theme-overrides.css
delete mode 100644 docs/source/_static/css/larger-api-margins.css
delete mode 100644 docs/source/_static/css/larger-headings.css
delete mode 100644 docs/source/_static/css/reactpy-view.css
delete mode 100644 docs/source/_static/css/sphinx-design-overrides.css
delete mode 100644 docs/source/_static/css/widget-output-css-overrides.css
delete mode 100644 docs/source/_static/install-and-run-reactpy.gif
delete mode 100644 docs/source/about/changelog.rst
delete mode 100644 docs/source/about/contributor-guide.rst
delete mode 100644 docs/source/about/credits-and-licenses.rst
delete mode 100644 docs/source/conf.py
delete mode 100644 docs/source/guides/adding-interactivity/components-with-state/_examples/adding_state_variable/data.json
delete mode 100644 docs/source/guides/adding-interactivity/components-with-state/_examples/adding_state_variable/main.py
delete mode 100644 docs/source/guides/adding-interactivity/components-with-state/_examples/isolated_state/data.json
delete mode 100644 docs/source/guides/adding-interactivity/components-with-state/_examples/isolated_state/main.py
delete mode 100644 docs/source/guides/adding-interactivity/components-with-state/_examples/multiple_state_variables/data.json
delete mode 100644 docs/source/guides/adding-interactivity/components-with-state/_examples/multiple_state_variables/main.py
delete mode 100644 docs/source/guides/adding-interactivity/components-with-state/_examples/when_variables_are_not_enough/data.json
delete mode 100644 docs/source/guides/adding-interactivity/components-with-state/_examples/when_variables_are_not_enough/main.py
delete mode 100644 docs/source/guides/adding-interactivity/components-with-state/index.rst
delete mode 100644 docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/dict_remove.py
delete mode 100644 docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/dict_update.py
delete mode 100644 docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/list_insert.py
delete mode 100644 docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/list_re_order.py
delete mode 100644 docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/list_remove.py
delete mode 100644 docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/list_replace.py
delete mode 100644 docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/moving_dot.py
delete mode 100644 docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/moving_dot_broken.py
delete mode 100644 docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/set_remove.py
delete mode 100644 docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/set_update.py
delete mode 100644 docs/source/guides/adding-interactivity/dangers-of-mutability/index.rst
delete mode 100644 docs/source/guides/adding-interactivity/index.rst
delete mode 100644 docs/source/guides/adding-interactivity/multiple-state-updates/_examples/delay_before_count_updater.py
delete mode 100644 docs/source/guides/adding-interactivity/multiple-state-updates/_examples/delay_before_set_count.py
delete mode 100644 docs/source/guides/adding-interactivity/multiple-state-updates/_examples/set_color_3_times.py
delete mode 100644 docs/source/guides/adding-interactivity/multiple-state-updates/_examples/set_state_function.py
delete mode 100644 docs/source/guides/adding-interactivity/multiple-state-updates/index.rst
delete mode 100644 docs/source/guides/adding-interactivity/responding-to-events/_examples/audio_player.py
delete mode 100644 docs/source/guides/adding-interactivity/responding-to-events/_examples/button_async_handlers.py
delete mode 100644 docs/source/guides/adding-interactivity/responding-to-events/_examples/button_does_nothing.py
delete mode 100644 docs/source/guides/adding-interactivity/responding-to-events/_examples/button_handler_as_arg.py
delete mode 100644 docs/source/guides/adding-interactivity/responding-to-events/_examples/button_prints_event.py
delete mode 100644 docs/source/guides/adding-interactivity/responding-to-events/_examples/button_prints_message.py
delete mode 100644 docs/source/guides/adding-interactivity/responding-to-events/_examples/prevent_default_event_actions.py
delete mode 100644 docs/source/guides/adding-interactivity/responding-to-events/_examples/stop_event_propagation.py
delete mode 100644 docs/source/guides/adding-interactivity/responding-to-events/index.rst
delete mode 100644 docs/source/guides/adding-interactivity/state-as-a-snapshot/_examples/delayed_print_after_set.py
delete mode 100644 docs/source/guides/adding-interactivity/state-as-a-snapshot/_examples/print_chat_message.py
delete mode 100644 docs/source/guides/adding-interactivity/state-as-a-snapshot/_examples/print_count_after_set.py
delete mode 100644 docs/source/guides/adding-interactivity/state-as-a-snapshot/_examples/send_message.py
delete mode 100644 docs/source/guides/adding-interactivity/state-as-a-snapshot/_examples/set_counter_3_times.py
delete mode 100644 docs/source/guides/adding-interactivity/state-as-a-snapshot/_static/direct-state-change.png
delete mode 100644 docs/source/guides/adding-interactivity/state-as-a-snapshot/_static/reactpy-state-change.png
delete mode 100644 docs/source/guides/adding-interactivity/state-as-a-snapshot/index.rst
delete mode 100644 docs/source/guides/creating-interfaces/html-with-reactpy/index.rst
delete mode 100644 docs/source/guides/creating-interfaces/index.rst
delete mode 100644 docs/source/guides/creating-interfaces/rendering-data/_examples/sorted_and_filtered_todo_list.py
delete mode 100644 docs/source/guides/creating-interfaces/rendering-data/_examples/todo_from_list.py
delete mode 100644 docs/source/guides/creating-interfaces/rendering-data/_examples/todo_list_with_keys.py
delete mode 100644 docs/source/guides/creating-interfaces/rendering-data/index.rst
delete mode 100644 docs/source/guides/creating-interfaces/your-first-components/_examples/bad_conditional_todo_list.py
delete mode 100644 docs/source/guides/creating-interfaces/your-first-components/_examples/good_conditional_todo_list.py
delete mode 100644 docs/source/guides/creating-interfaces/your-first-components/_examples/nested_photos.py
delete mode 100644 docs/source/guides/creating-interfaces/your-first-components/_examples/parametrized_photos.py
delete mode 100644 docs/source/guides/creating-interfaces/your-first-components/_examples/simple_photo.py
delete mode 100644 docs/source/guides/creating-interfaces/your-first-components/_examples/todo_list.py
delete mode 100644 docs/source/guides/creating-interfaces/your-first-components/_examples/wrap_in_div.py
delete mode 100644 docs/source/guides/creating-interfaces/your-first-components/_examples/wrap_in_fragment.py
delete mode 100644 docs/source/guides/creating-interfaces/your-first-components/index.rst
delete mode 100644 docs/source/guides/escape-hatches/_examples/material_ui_button_no_action.py
delete mode 100644 docs/source/guides/escape-hatches/_examples/material_ui_button_on_click.py
delete mode 100644 docs/source/guides/escape-hatches/_examples/super_simple_chart/main.py
delete mode 100644 docs/source/guides/escape-hatches/_examples/super_simple_chart/super-simple-chart.js
delete mode 100644 docs/source/guides/escape-hatches/distributing-javascript.rst
delete mode 100644 docs/source/guides/escape-hatches/index.rst
delete mode 100644 docs/source/guides/escape-hatches/javascript-components.rst
delete mode 100644 docs/source/guides/escape-hatches/using-a-custom-backend.rst
delete mode 100644 docs/source/guides/escape-hatches/using-a-custom-client.rst
delete mode 100644 docs/source/guides/getting-started/_examples/debug_error_example.py
delete mode 100644 docs/source/guides/getting-started/_examples/hello_world.py
delete mode 100644 docs/source/guides/getting-started/_examples/run_fastapi.py
delete mode 100644 docs/source/guides/getting-started/_examples/run_flask.py
delete mode 100644 docs/source/guides/getting-started/_examples/run_sanic.py
delete mode 100644 docs/source/guides/getting-started/_examples/run_starlette.py
delete mode 100644 docs/source/guides/getting-started/_examples/run_tornado.py
delete mode 100644 docs/source/guides/getting-started/_examples/sample_app.py
delete mode 100644 docs/source/guides/getting-started/_static/embed-doc-ex.html
delete mode 100644 docs/source/guides/getting-started/_static/embed-reactpy-view/index.html
delete mode 100644 docs/source/guides/getting-started/_static/embed-reactpy-view/main.py
delete mode 100644 docs/source/guides/getting-started/_static/embed-reactpy-view/screenshot.png
delete mode 100644 docs/source/guides/getting-started/_static/logo-django.svg
delete mode 100644 docs/source/guides/getting-started/_static/logo-jupyter.svg
delete mode 100644 docs/source/guides/getting-started/_static/logo-plotly.svg
delete mode 100644 docs/source/guides/getting-started/_static/reactpy-in-jupyterlab.gif
delete mode 100644 docs/source/guides/getting-started/_static/shared-client-state-server-slider.gif
delete mode 100644 docs/source/guides/getting-started/index.rst
delete mode 100644 docs/source/guides/getting-started/installing-reactpy.rst
delete mode 100644 docs/source/guides/getting-started/running-reactpy.rst
delete mode 100644 docs/source/guides/managing-state/combining-contexts-and-reducers/index.rst
delete mode 100644 docs/source/guides/managing-state/deeply-sharing-state-with-contexts/index.rst
delete mode 100644 docs/source/guides/managing-state/how-to-structure-state/index.rst
delete mode 100644 docs/source/guides/managing-state/index.rst
delete mode 100644 docs/source/guides/managing-state/sharing-component-state/_examples/filterable_list/data.json
delete mode 100644 docs/source/guides/managing-state/sharing-component-state/_examples/filterable_list/main.py
delete mode 100644 docs/source/guides/managing-state/sharing-component-state/_examples/synced_inputs/main.py
delete mode 100644 docs/source/guides/managing-state/sharing-component-state/index.rst
delete mode 100644 docs/source/guides/managing-state/simplifying-updates-with-reducers/index.rst
delete mode 100644 docs/source/guides/managing-state/when-and-how-to-reset-state/index.rst
delete mode 100644 docs/source/guides/understanding-reactpy/_static/idom-flow-diagram.svg
delete mode 100644 docs/source/guides/understanding-reactpy/_static/live-examples-in-docs.gif
delete mode 100644 docs/source/guides/understanding-reactpy/_static/mvc-flow-diagram.svg
delete mode 100644 docs/source/guides/understanding-reactpy/_static/npm-download-trends.png
delete mode 100644 docs/source/guides/understanding-reactpy/index.rst
delete mode 100644 docs/source/guides/understanding-reactpy/layout-render-servers.rst
delete mode 100644 docs/source/guides/understanding-reactpy/representing-html.rst
delete mode 100644 docs/source/guides/understanding-reactpy/the-rendering-pipeline.rst
delete mode 100644 docs/source/guides/understanding-reactpy/the-rendering-process.rst
delete mode 100644 docs/source/guides/understanding-reactpy/what-are-components.rst
delete mode 100644 docs/source/guides/understanding-reactpy/why-reactpy-needs-keys.rst
delete mode 100644 docs/source/guides/understanding-reactpy/writing-tests.rst
delete mode 100644 docs/source/index.rst
delete mode 100644 docs/source/reference/_examples/character_movement/main.py
delete mode 100644 docs/source/reference/_examples/character_movement/static/bunny.png
delete mode 100644 docs/source/reference/_examples/click_count.py
delete mode 100644 docs/source/reference/_examples/material_ui_switch.py
delete mode 100644 docs/source/reference/_examples/matplotlib_plot.py
delete mode 100644 docs/source/reference/_examples/network_graph.py
delete mode 100644 docs/source/reference/_examples/pigeon_maps.py
delete mode 100644 docs/source/reference/_examples/simple_dashboard.py
delete mode 100644 docs/source/reference/_examples/slideshow.py
delete mode 100644 docs/source/reference/_examples/snake_game.py
delete mode 100644 docs/source/reference/_examples/todo.py
delete mode 100644 docs/source/reference/_examples/use_reducer_counter.py
delete mode 100644 docs/source/reference/_examples/use_state_counter.py
delete mode 100644 docs/source/reference/_examples/victory_chart.py
delete mode 100644 docs/source/reference/_static/vdom-json-schema.json
delete mode 100644 docs/source/reference/browser-events.rst
delete mode 100644 docs/source/reference/hooks-api.rst
delete mode 100644 docs/source/reference/html-attributes.rst
delete mode 100644 docs/source/reference/javascript-api.rst
delete mode 100644 docs/source/reference/specifications.rst
create mode 100644 docs/src/about/changelog.md
create mode 100644 docs/src/about/code.md
create mode 100644 docs/src/about/community.md
create mode 100644 docs/src/about/docs.md
create mode 100644 docs/src/about/running-tests.md
create mode 100644 docs/src/dictionary.txt
create mode 100644 docs/src/index.md
create mode 100644 docs/src/learn/add-react-to-an-existing-project.md
create mode 100644 docs/src/learn/choosing-the-state-structure.md
create mode 100644 docs/src/learn/communicate-data-between-server-and-client.md
create mode 100644 docs/src/learn/conditional-rendering.md
create mode 100644 docs/src/learn/convert-between-vdom-and-html.md
create mode 100644 docs/src/learn/creating-backends.md
create mode 100644 docs/src/learn/creating-html-tags.md
create mode 100644 docs/src/learn/creating-vdom-event-handlers.md
create mode 100644 docs/src/learn/editor-setup.md
create mode 100644 docs/src/learn/extracting-state-logic-into-a-reducer.md
create mode 100644 docs/src/learn/get-started.md
create mode 100644 docs/src/learn/importing-and-exporting-components.md
create mode 100644 docs/src/learn/keeping-components-pure.md
create mode 100644 docs/src/learn/lifecycle-of-reactive-effects.md
create mode 100644 docs/src/learn/manipulating-the-dom-with-refs.md
create mode 100644 docs/src/learn/manually-register-a-client.md
create mode 100644 docs/src/learn/passing-data-deeply-with-context.md
create mode 100644 docs/src/learn/passing-props-to-a-component.md
create mode 100644 docs/src/learn/preserving-and-resetting-state.md
create mode 100644 docs/src/learn/python-in-psx-with-curly-braces.md
create mode 100644 docs/src/learn/queueing-a-series-of-state-updates.md
create mode 100644 docs/src/learn/react-developer-tools.md
create mode 100644 docs/src/learn/reacting-to-input-with-state.md
create mode 100644 docs/src/learn/referencing-values-with-refs.md
create mode 100644 docs/src/learn/removing-effect-dependencies.md
create mode 100644 docs/src/learn/render-and-commit.md
create mode 100644 docs/src/learn/rendering-lists.md
create mode 100644 docs/src/learn/responding-to-events.md
create mode 100644 docs/src/learn/reusing-logic-with-custom-hooks.md
create mode 100644 docs/src/learn/scaling-up-with-reducer-and-context.md
create mode 100644 docs/src/learn/separating-events-from-effects.md
create mode 100644 docs/src/learn/sharing-state-between-components.md
create mode 100644 docs/src/learn/start-a-new-react-project.md
create mode 100644 docs/src/learn/state-a-components-memory.md
create mode 100644 docs/src/learn/state-as-a-snapshot.md
create mode 100644 docs/src/learn/synchronizing-with-effects.md
create mode 100644 docs/src/learn/thinking-in-react.md
create mode 100644 docs/src/learn/tutorial-material-ui.md
create mode 100644 docs/src/learn/tutorial-react-bootstrap.md
create mode 100644 docs/src/learn/tutorial-tic-tac-toe.md
create mode 100644 docs/src/learn/updating-arrays-in-state.md
create mode 100644 docs/src/learn/updating-objects-in-state.md
create mode 100644 docs/src/learn/vdom-mutations.md
create mode 100644 docs/src/learn/writing-markup-with-psx.md
create mode 100644 docs/src/learn/you-might-not-need-an-effect.md
create mode 100644 docs/src/learn/your-first-component.md
create mode 100644 docs/src/reference/client-api.md
create mode 100644 docs/src/reference/common-events.md
create mode 100644 docs/src/reference/common-props.md
create mode 100644 docs/src/reference/common-types.md
create mode 100644 docs/src/reference/django.md
create mode 100644 docs/src/reference/fastapi.md
create mode 100644 docs/src/reference/flask.md
create mode 100644 docs/src/reference/jupyter.md
create mode 100644 docs/src/reference/plotly-dash.md
create mode 100644 docs/src/reference/protocol-structure.md
create mode 100644 docs/src/reference/sanic.md
create mode 100644 docs/src/reference/starlette.md
create mode 100644 docs/src/reference/tornado.md
create mode 100644 docs/src/reference/usage.md
create mode 100644 docs/src/reference/use-callback.md
create mode 100644 docs/src/reference/use-connection.md
create mode 100644 docs/src/reference/use-context.md
create mode 100644 docs/src/reference/use-debug-value.md
create mode 100644 docs/src/reference/use-effect.md
create mode 100644 docs/src/reference/use-location.md
create mode 100644 docs/src/reference/use-memo.md
create mode 100644 docs/src/reference/use-reducer.md
create mode 100644 docs/src/reference/use-ref.md
create mode 100644 docs/src/reference/use-scope.md
create mode 100644 docs/src/reference/use-state.md
create mode 100644 docs/src/static/css/extra.css
create mode 100644 docs/src/static/images/s_thinking-in-react_ui.png
create mode 100644 docs/src/static/images/s_thinking-in-react_ui_outline.png
create mode 100644 docs/src/static/js/extra.js
create mode 100644 mkdocs.yml
diff --git a/.github/workflows/.hatch-run.yml b/.github/workflows/.hatch-run.yml
deleted file mode 100644
index b312869e4..000000000
--- a/.github/workflows/.hatch-run.yml
+++ /dev/null
@@ -1,59 +0,0 @@
-name: hatch-run
-
-on:
- workflow_call:
- inputs:
- job-name:
- required: true
- type: string
- hatch-run:
- required: true
- type: string
- runs-on-array:
- required: false
- type: string
- default: '["ubuntu-latest"]'
- python-version-array:
- required: false
- type: string
- default: '["3.x"]'
- node-registry-url:
- required: false
- type: string
- default: ""
- secrets:
- node-auth-token:
- required: false
- pypi-username:
- required: false
- pypi-password:
- required: false
-
-jobs:
- hatch:
- name: ${{ format(inputs.job-name, matrix.python-version, matrix.runs-on) }}
- strategy:
- matrix:
- python-version: ${{ fromJson(inputs.python-version-array) }}
- runs-on: ${{ fromJson(inputs.runs-on-array) }}
- runs-on: ${{ matrix.runs-on }}
- steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-node@v2
- with:
- node-version: "14.x"
- registry-url: ${{ inputs.node-registry-url }}
- - name: Pin NPM Version
- run: npm install -g npm@8.19.3
- - name: Use Python ${{ matrix.python-version }}
- uses: actions/setup-python@v2
- with:
- python-version: ${{ matrix.python-version }}
- - name: Install Python Dependencies
- run: pip install hatch poetry
- - name: Run Scripts
- env:
- NODE_AUTH_TOKEN: ${{ secrets.node-auth-token }}
- PYPI_USERNAME: ${{ secrets.pypi-username }}
- PYPI_PASSWORD: ${{ secrets.pypi-password }}
- run: hatch run ${{ inputs.hatch-run }}
diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml
deleted file mode 100644
index af768579c..000000000
--- a/.github/workflows/check.yml
+++ /dev/null
@@ -1,45 +0,0 @@
-name: check
-
-on:
- push:
- branches:
- - main
- pull_request:
- branches:
- - main
- schedule:
- - cron: "0 0 * * 0"
-
-jobs:
- test-py-cov:
- uses: ./.github/workflows/.hatch-run.yml
- with:
- job-name: "python-{0}"
- hatch-run: "test-py"
- lint-py:
- uses: ./.github/workflows/.hatch-run.yml
- with:
- job-name: "python-{0}"
- hatch-run: "lint-py"
- test-py-matrix:
- uses: ./.github/workflows/.hatch-run.yml
- with:
- job-name: "python-{0} {1}"
- hatch-run: "test-py --no-cov"
- runs-on-array: '["ubuntu-latest", "macos-latest", "windows-latest"]'
- python-version-array: '["3.9", "3.10", "3.11"]'
- test-docs:
- uses: ./.github/workflows/.hatch-run.yml
- with:
- job-name: "python-{0}"
- hatch-run: "test-docs"
- test-js:
- uses: ./.github/workflows/.hatch-run.yml
- with:
- job-name: "{1}"
- hatch-run: "test-js"
- lint-js:
- uses: ./.github/workflows/.hatch-run.yml
- with:
- job-name: "{1}"
- hatch-run: "lint-js"
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
deleted file mode 100644
index b4f77ee00..000000000
--- a/.github/workflows/codeql-analysis.yml
+++ /dev/null
@@ -1,71 +0,0 @@
-# For most projects, this workflow file will not need changing; you simply need
-# to commit it to your repository.
-#
-# You may wish to alter this file to override the set of languages analyzed,
-# or to provide custom queries or build logic.
-#
-# ******** NOTE ********
-# We have attempted to detect the languages in your repository. Please check
-# the `language` matrix defined below to confirm you have the correct set of
-# supported CodeQL languages.
-#
-name: codeql
-
-on:
- push:
- branches: [main]
- pull_request:
- # The branches below must be a subset of the branches above
- branches: [main]
- schedule:
- - cron: "43 3 * * 3"
-
-jobs:
- analyze:
- name: Analyze
- runs-on: ubuntu-latest
- permissions:
- actions: read
- contents: read
- security-events: write
-
- strategy:
- fail-fast: false
- matrix:
- language: ["javascript", "python"]
- # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
- # Learn more:
- # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
-
- steps:
- - name: Checkout repository
- uses: actions/checkout@v2
-
- # Initializes the CodeQL tools for scanning.
- - name: Initialize CodeQL
- uses: github/codeql-action/init@v1
- with:
- languages: ${{ matrix.language }}
- # If you wish to specify custom queries, you can do so here or in a config file.
- # By default, queries listed here will override any specified in a config file.
- # Prefix the list here with "+" to use these queries and those in the config file.
- # queries: ./path/to/local/query, your-org/your-repo/queries@main
-
- # Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
- # If this step fails, then you should remove it and run the build manually (see below)
- - name: Autobuild
- uses: github/codeql-action/autobuild@v1
-
- # ℹ️ Command-line programs to run using the OS shell.
- # 📚 https://git.io/JvXDl
-
- # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
- # and modify them (or add more) to build your code if your project
- # uses a compiled language
-
- #- run: |
- # make bootstrap
- # make release
-
- - name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@v1
diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml
deleted file mode 100644
index 7337f505b..000000000
--- a/.github/workflows/deploy-docs.yml
+++ /dev/null
@@ -1,30 +0,0 @@
-# This workflows will upload a Python Package using Twine when a release is created
-# For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries
-
-name: deploy-docs
-
-on:
- push:
- branches:
- - "main"
- tags:
- - "*"
-
-jobs:
- deploy-documentation:
- runs-on: ubuntu-latest
- steps:
- - name: Check out src from Git
- uses: actions/checkout@v2
- - name: Get history and tags for SCM versioning to work
- run: |
- git fetch --prune --unshallow
- git fetch --depth=1 origin +refs/tags/*:refs/tags/*
- - name: Login to Heroku Container Registry
- run: echo ${{ secrets.HEROKU_API_KEY }} | docker login -u ${{ secrets.HEROKU_EMAIL }} --password-stdin registry.heroku.com
- - name: Build Docker Image
- run: docker build . --file docs/Dockerfile --tag registry.heroku.com/${{ secrets.HEROKU_APP_NAME }}/web
- - name: Push Docker Image
- run: docker push registry.heroku.com/${{ secrets.HEROKU_APP_NAME }}/web
- - name: Deploy
- run: HEROKU_API_KEY=${{ secrets.HEROKU_API_KEY }} heroku container:release web --app ${{ secrets.HEROKU_APP_NAME }}
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
deleted file mode 100644
index e9271cbd5..000000000
--- a/.github/workflows/publish.yml
+++ /dev/null
@@ -1,20 +0,0 @@
-# This workflows will upload a Javscript Package using NPM to npmjs.org when a release is created
-# For more information see: https://docs.github.com/en/actions/guides/publishing-nodejs-packages
-
-name: publish
-
-on:
- release:
- types: [published]
-
-jobs:
- publish:
- uses: ./.github/workflows/.hatch-run.yml
- with:
- job-name: "publish"
- hatch-run: "publish"
- node-registry-url: "https://registry.npmjs.org"
- secrets:
- node-auth-token: ${{ secrets.NODE_AUTH_TOKEN }}
- pypi-username: ${{ secrets.PYPI_USERNAME }}
- pypi-password: ${{ secrets.PYPI_PASSWORD }}
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 000000000..5ae0eb0af
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,199 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+
+
+
+
+
+
+## [Unreleased]
+
+- Nothing (yet)
+
+## [2.2.0] - 2022-12-28
+
+### Added
+
+- Add `options: QueryOptions` parameter to `use_query` to allow for configuration of this hook.
+
+### Changed
+
+- By default, `use_query` will recursively prefetch all many-to-many or many-to-one relationships to prevent `SynchronousOnlyOperation` exceptions.
+
+### Removed
+
+- `django_idom.hooks._fetch_lazy_fields` has been deleted. The equivalent replacement is `django_idom.utils.django_query_postprocessor`.
+
+## [2.1.0] - 2022-11-01
+
+### Changed
+
+- Minimum `channels` version is now `4.0.0`.
+
+### Fixed
+
+- Change type hint on `view_to_component` callable to have `request` argument be optional.
+- Change type hint on `view_to_component` to represent it as a decorator with parenthesis (such as `@view_to_component(compatibility=True)`)
+
+### Security
+
+- Add note to docs about potential information exposure via `view_to_component` when using `compatibility=True`.
+
+## [2.0.1] - 2022-10-18
+
+### Fixed
+
+- Ability to use `key=...` parameter on all prefabricated components.
+
+## [2.0.0] - 2022-10-17
+
+### Added
+
+- `use_origin` hook for returning the browser's `location.origin`.
+
+### Changed
+
+- `view_to_component` now returns a `Callable`, instead of directly returning a `Component`. Check the docs for new usage info.
+- `use_mutation` and `use_query` will now log any query failures.
+
+### Fixed
+
+- Allow `use_mutation` to have `refetch=None`, as the docs suggest is possible.
+- `use_query` will now prefetch all fields to prevent `SynchronousOnlyOperation` exceptions.
+- `view_to_component`, `django_css`, and `django_js` type hints will now display like normal functions.
+- IDOM preloader no longer attempts to parse commented out IDOM components.
+- Tests are now fully functional on Windows
+
+## [1.2.0] - 2022-09-19
+
+### Added
+
+- `auth_required` decorator to prevent your components from rendering to unauthenticated users.
+- `use_query` hook for fetching database values.
+- `use_mutation` hook for modifying database values.
+- `view_to_component` utility to convert legacy Django views to IDOM components.
+
+### Changed
+
+- Bumped the minimum IDOM version to 0.40.2
+- Testing suite now uses `playwright` instead of `selenium`
+
+### Fixed
+
+- IDOM preloader is no longer sensitive to whitespace within template tags.
+
+## [1.1.0] - 2022-07-01
+
+### Added
+
+- `django_css` and `django_js` components to defer loading CSS & JS files until needed.
+
+### Changed
+
+- Bumped the minimum IDOM version to 0.39.0
+
+## [1.0.0] - 2022-05-22
+
+### Added
+
+- Django-specific hooks! `use_websocket`, `use_scope`, and `use_location` are now available within the `django_idom.hooks` module.
+- Documentation has been placed into a formal docs webpage.
+- Logging for when a component fails to import, or if no components were found within Django.
+
+### Changed
+
+- `idom_component` template tag has been renamed to `component`
+- Bumped the minimum IDOM version to 0.38.0
+
+### Removed
+
+- `websocket` parameter for components has been removed. Functionally, it is replaced with `django_idom.hooks.use_websocket`.
+
+## [0.0.5] - 2022-04-04
+
+### Changed
+
+- Bumped the minimum IDOM version to 0.37.2
+
+### Fixed
+
+- ModuleNotFoundError: No module named `idom.core.proto` caused by IDOM 0.37.2
+
+## [0.0.4] - 2022-03-05
+
+### Changed
+
+- Bumped the minimum IDOM version to 0.37.1
+
+## [0.0.3] - 2022-02-19
+
+### Changed
+
+- Bumped the minimum IDOM version to 0.36.3
+
+## [0.0.2] - 2022-01-30
+
+### Added
+
+- Ability to declare the HTML class of the top-level component `div`
+- `name = ...` parameter to IDOM HTTP paths for use with `django.urls.reverse()`
+- Cache versioning to automatically invalidate old web module files from the cache back-end
+- Automatic pre-population of the IDOM component registry
+- Type hinting for `IdomWebsocket`
+
+### Changed
+
+- Fetching web modules from disk and/or cache is now fully async
+- Static files are now contained within a `django_idom/` parent folder
+- Upgraded IDOM to version `0.36.0`
+- Minimum Django version required is now `4.0`
+- Minimum Python version required is now `3.8`
+
+### Removed
+
+- `IDOM_WEB_MODULES_PATH` has been replaced with Django `include(...)`
+- `IDOM_WS_MAX_RECONNECT_DELAY` has been renamed to `IDOM_WS_MAX_RECONNECT_TIMEOUT`
+- `idom_web_modules` cache back-end has been renamed to `idom`
+
+### Fixed
+
+- Increase test timeout values to prevent false positives
+- Windows compatibility for building Django-IDOM
+
+### Security
+
+- Fixed potential directory traversal attack on the IDOM web modules URL
+
+## [0.0.1] - 2021-08-18
+
+### Added
+
+- Support for IDOM within the Django
+
+[unreleased]: https://github.com/idom-team/django-idom/compare/2.2.0...HEAD
+[2.2.0]: https://github.com/idom-team/django-idom/compare/2.1.0...2.2.0
+[2.1.0]: https://github.com/idom-team/django-idom/compare/2.0.1...2.1.0
+[2.0.1]: https://github.com/idom-team/django-idom/compare/2.0.0...2.0.1
+[2.0.0]: https://github.com/idom-team/django-idom/compare/1.2.0...2.0.0
+[1.2.0]: https://github.com/idom-team/django-idom/compare/1.1.0...1.2.0
+[1.1.0]: https://github.com/idom-team/django-idom/compare/1.0.0...1.1.0
+[1.0.0]: https://github.com/idom-team/django-idom/compare/0.0.5...1.0.0
+[0.0.5]: https://github.com/idom-team/django-idom/compare/0.0.4...0.0.5
+[0.0.4]: https://github.com/idom-team/django-idom/compare/0.0.3...0.0.4
+[0.0.3]: https://github.com/idom-team/django-idom/compare/0.0.2...0.0.3
+[0.0.2]: https://github.com/idom-team/django-idom/compare/0.0.1...0.0.2
+[0.0.1]: https://github.com/idom-team/django-idom/releases/tag/0.0.1
diff --git a/README.md b/README.md
index 83241e19a..0086a306a 100644
--- a/README.md
+++ b/README.md
@@ -1,72 +1,5 @@
-#
ReactPy
+Temporary branch being used to rewrite ReactPy's documentation.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+Many of these pages are in progress, and are using the [original ReactJS pages](https://beta.reactjs.org/learn) as placeholders.
-
-[ReactPy](https://reactpy.dev/) is a library for building user interfaces in Python without Javascript. ReactPy interfaces are made from components that look and behave similar to those found in [ReactJS](https://reactjs.org/). Designed with simplicity in mind, ReactPy can be used by those without web development experience while also being powerful enough to grow with your ambitions.
-
-
-
-# At a Glance
-
-To get a rough idea of how to write apps in ReactPy, take a look at this tiny _Hello World_ application.
-
-```python
-from reactpy import component, html, run
-
-@component
-def hello_world():
- return html.h1("Hello, World!")
-
-run(hello_world)
-```
-
-# Resources
-
-Follow the links below to find out more about this project.
-
-- [Try ReactPy (Jupyter Notebook)](https://mybinder.org/v2/gh/reactive-python/reactpy-jupyter/main?urlpath=lab/tree/notebooks/introduction.ipynb)
-- [Documentation](https://reactpy.dev/)
-- [GitHub Discussions](https://github.com/reactive-python/reactpy/discussions)
-- [Discord](https://discord.gg/uNb5P4hA9X)
-- [Contributor Guide](https://reactpy.dev/docs/about/contributor-guide.html)
-- [Code of Conduct](https://github.com/reactive-python/reactpy/blob/main/CODE_OF_CONDUCT.md)
+See live preview here: https://archmonger.github.io/reactpy-docs/
diff --git a/docs/.gitignore b/docs/.gitignore
deleted file mode 100644
index ea38eebf8..000000000
--- a/docs/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-build
-source/_auto
-source/_static/custom.js
-source/vdom-json-schema.json
diff --git a/docs/Dockerfile b/docs/Dockerfile
deleted file mode 100644
index 76a8ad7ee..000000000
--- a/docs/Dockerfile
+++ /dev/null
@@ -1,40 +0,0 @@
-FROM python:3.9
-
-WORKDIR /app/
-
-# Install NodeJS
-# --------------
-RUN curl -sL https://deb.nodesource.com/setup_14.x | bash -
-RUN apt-get install -yq nodejs build-essential
-RUN npm install -g npm@8.5.0
-
-# Install Poetry
-# --------------
-RUN pip install poetry
-
-# Create/Activate Python Venv
-# ---------------------------
-ENV VIRTUAL_ENV=/opt/venv
-RUN python3 -m venv $VIRTUAL_ENV
-ENV PATH="$VIRTUAL_ENV/bin:$PATH"
-RUN pip install --upgrade pip
-
-# Copy Files
-# ----------
-COPY LICENSE ./
-COPY src ./src
-COPY docs ./docs
-COPY branding ./branding
-
-# Install and Build Docs
-# ----------------------
-WORKDIR /app/docs
-RUN poetry install
-RUN sphinx-build -v -W -b html source build
-
-# Define Entrypoint
-# -----------------
-ENV PORT 5000
-ENV REACTPY_DEBUG_MODE=1
-ENV REACTPY_CHECK_VDOM_SPEC=0
-CMD python main.py
diff --git a/docs/LICENSE.md b/docs/LICENSE.md
new file mode 100644
index 000000000..d21a91a91
--- /dev/null
+++ b/docs/LICENSE.md
@@ -0,0 +1,393 @@
+Attribution 4.0 International
+
+=======================================================================
+
+Creative Commons Corporation ("Creative Commons") is not a law firm and
+does not provide legal services or legal advice. Distribution of
+Creative Commons public licenses does not create a lawyer-client or
+other relationship. Creative Commons makes its licenses and related
+information available on an "as-is" basis. Creative Commons gives no
+warranties regarding its licenses, any material licensed under their
+terms and conditions, or any related information. Creative Commons
+disclaims all liability for damages resulting from their use to the
+fullest extent possible.
+
+Using Creative Commons Public Licenses
+
+Creative Commons public licenses provide a standard set of terms and
+conditions that creators and other rights holders may use to share
+original works of authorship and other material subject to copyright
+and certain other rights specified in the public license below. The
+following considerations are for informational purposes only, are not
+exhaustive, and do not form part of our licenses.
+
+ Considerations for licensors: Our public licenses are
+ intended for use by those authorized to give the public
+ permission to use material in ways otherwise restricted by
+ copyright and certain other rights. Our licenses are
+ irrevocable. Licensors should read and understand the terms
+ and conditions of the license they choose before applying it.
+ Licensors should also secure all rights necessary before
+ applying our licenses so that the public can reuse the
+ material as expected. Licensors should clearly mark any
+ material not subject to the license. This includes other CC-
+ licensed material, or material used under an exception or
+ limitation to copyright. More considerations for licensors:
+ wiki.creativecommons.org/Considerations_for_licensors
+
+ Considerations for the public: By using one of our public
+ licenses, a licensor grants the public permission to use the
+ licensed material under specified terms and conditions. If
+ the licensor's permission is not necessary for any reason--for
+ example, because of any applicable exception or limitation to
+ copyright--then that use is not regulated by the license. Our
+ licenses grant only permissions under copyright and certain
+ other rights that a licensor has authority to grant. Use of
+ the licensed material may still be restricted for other
+ reasons, including because others have copyright or other
+ rights in the material. A licensor may make special requests,
+ such as asking that all changes be marked or described.
+ Although not required by our licenses, you are encouraged to
+ respect those requests where reasonable. More_considerations
+ for the public:
+ wiki.creativecommons.org/Considerations_for_licensees
+
+=======================================================================
+
+Creative Commons Attribution 4.0 International Public License
+
+By exercising the Licensed Rights (defined below), You accept and agree
+to be bound by the terms and conditions of this Creative Commons
+Attribution 4.0 International Public License ("Public License"). To the
+extent this Public License may be interpreted as a contract, You are
+granted the Licensed Rights in consideration of Your acceptance of
+these terms and conditions, and the Licensor grants You such rights in
+consideration of benefits the Licensor receives from making the
+Licensed Material available under these terms and conditions.
+
+
+Section 1 -- Definitions.
+
+ a. Adapted Material means material subject to Copyright and Similar
+ Rights that is derived from or based upon the Licensed Material
+ and in which the Licensed Material is translated, altered,
+ arranged, transformed, or otherwise modified in a manner requiring
+ permission under the Copyright and Similar Rights held by the
+ Licensor. For purposes of this Public License, where the Licensed
+ Material is a musical work, performance, or sound recording,
+ Adapted Material is always produced where the Licensed Material is
+ synched in timed relation with a moving image.
+
+ b. Adapter's License means the license You apply to Your Copyright
+ and Similar Rights in Your contributions to Adapted Material in
+ accordance with the terms and conditions of this Public License.
+
+ c. Copyright and Similar Rights means copyright and/or similar rights
+ closely related to copyright including, without limitation,
+ performance, broadcast, sound recording, and Sui Generis Database
+ Rights, without regard to how the rights are labeled or
+ categorized. For purposes of this Public License, the rights
+ specified in Section 2(b)(1)-(2) are not Copyright and Similar
+ Rights.
+
+ d. Effective Technological Measures means those measures that, in the
+ absence of proper authority, may not be circumvented under laws
+ fulfilling obligations under Article 11 of the WIPO Copyright
+ Treaty adopted on December 20, 1996, and/or similar international
+ agreements.
+
+ e. Exceptions and Limitations means fair use, fair dealing, and/or
+ any other exception or limitation to Copyright and Similar Rights
+ that applies to Your use of the Licensed Material.
+
+ f. Licensed Material means the artistic or literary work, database,
+ or other material to which the Licensor applied this Public
+ License.
+
+ g. Licensed Rights means the rights granted to You subject to the
+ terms and conditions of this Public License, which are limited to
+ all Copyright and Similar Rights that apply to Your use of the
+ Licensed Material and that the Licensor has authority to license.
+
+ h. Licensor means the individual(s) or entity(ies) granting rights
+ under this Public License.
+
+ i. Share means to provide material to the public by any means or
+ process that requires permission under the Licensed Rights, such
+ as reproduction, public display, public performance, distribution,
+ dissemination, communication, or importation, and to make material
+ available to the public including in ways that members of the
+ public may access the material from a place and at a time
+ individually chosen by them.
+
+ j. Sui Generis Database Rights means rights other than copyright
+ resulting from Directive 96/9/EC of the European Parliament and of
+ the Council of 11 March 1996 on the legal protection of databases,
+ as amended and/or succeeded, as well as other essentially
+ equivalent rights anywhere in the world.
+
+ k. You means the individual or entity exercising the Licensed Rights
+ under this Public License. Your has a corresponding meaning.
+
+
+Section 2 -- Scope.
+
+ a. License grant.
+
+ 1. Subject to the terms and conditions of this Public License,
+ the Licensor hereby grants You a worldwide, royalty-free,
+ non-sublicensable, non-exclusive, irrevocable license to
+ exercise the Licensed Rights in the Licensed Material to:
+
+ a. reproduce and Share the Licensed Material, in whole or
+ in part; and
+
+ b. produce, reproduce, and Share Adapted Material.
+
+ 2. Exceptions and Limitations. For the avoidance of doubt, where
+ Exceptions and Limitations apply to Your use, this Public
+ License does not apply, and You do not need to comply with
+ its terms and conditions.
+
+ 3. Term. The term of this Public License is specified in Section
+ 6(a).
+
+ 4. Media and formats; technical modifications allowed. The
+ Licensor authorizes You to exercise the Licensed Rights in
+ all media and formats whether now known or hereafter created,
+ and to make technical modifications necessary to do so. The
+ Licensor waives and/or agrees not to assert any right or
+ authority to forbid You from making technical modifications
+ necessary to exercise the Licensed Rights, including
+ technical modifications necessary to circumvent Effective
+ Technological Measures. For purposes of this Public License,
+ simply making modifications authorized by this Section 2(a)
+ (4) never produces Adapted Material.
+
+ 5. Downstream recipients.
+
+ a. Offer from the Licensor -- Licensed Material. Every
+ recipient of the Licensed Material automatically
+ receives an offer from the Licensor to exercise the
+ Licensed Rights under the terms and conditions of this
+ Public License.
+
+ b. No downstream restrictions. You may not offer or impose
+ any additional or different terms or conditions on, or
+ apply any Effective Technological Measures to, the
+ Licensed Material if doing so restricts exercise of the
+ Licensed Rights by any recipient of the Licensed
+ Material.
+
+ 6. No endorsement. Nothing in this Public License constitutes or
+ may be construed as permission to assert or imply that You
+ are, or that Your use of the Licensed Material is, connected
+ with, or sponsored, endorsed, or granted official status by,
+ the Licensor or others designated to receive attribution as
+ provided in Section 3(a)(1)(A)(i).
+
+ b. Other rights.
+
+ 1. Moral rights, such as the right of integrity, are not
+ licensed under this Public License, nor are publicity,
+ privacy, and/or other similar personality rights; however, to
+ the extent possible, the Licensor waives and/or agrees not to
+ assert any such rights held by the Licensor to the limited
+ extent necessary to allow You to exercise the Licensed
+ Rights, but not otherwise.
+
+ 2. Patent and trademark rights are not licensed under this
+ Public License.
+
+ 3. To the extent possible, the Licensor waives any right to
+ collect royalties from You for the exercise of the Licensed
+ Rights, whether directly or through a collecting society
+ under any voluntary or waivable statutory or compulsory
+ licensing scheme. In all other cases the Licensor expressly
+ reserves any right to collect such royalties.
+
+
+Section 3 -- License Conditions.
+
+Your exercise of the Licensed Rights is expressly made subject to the
+following conditions.
+
+ a. Attribution.
+
+ 1. If You Share the Licensed Material (including in modified
+ form), You must:
+
+ a. retain the following if it is supplied by the Licensor
+ with the Licensed Material:
+
+ i. identification of the creator(s) of the Licensed
+ Material and any others designated to receive
+ attribution, in any reasonable manner requested by
+ the Licensor (including by pseudonym if
+ designated);
+
+ ii. a copyright notice;
+
+ iii. a notice that refers to this Public License;
+
+ iv. a notice that refers to the disclaimer of
+ warranties;
+
+ v. a URI or hyperlink to the Licensed Material to the
+ extent reasonably practicable;
+
+ b. indicate if You modified the Licensed Material and
+ retain an indication of any previous modifications; and
+
+ c. indicate the Licensed Material is licensed under this
+ Public License, and include the text of, or the URI or
+ hyperlink to, this Public License.
+
+ 2. You may satisfy the conditions in Section 3(a)(1) in any
+ reasonable manner based on the medium, means, and context in
+ which You Share the Licensed Material. For example, it may be
+ reasonable to satisfy the conditions by providing a URI or
+ hyperlink to a resource that includes the required
+ information.
+
+ 3. If requested by the Licensor, You must remove any of the
+ information required by Section 3(a)(1)(A) to the extent
+ reasonably practicable.
+
+ 4. If You Share Adapted Material You produce, the Adapter's
+ License You apply must not prevent recipients of the Adapted
+ Material from complying with this Public License.
+
+
+Section 4 -- Sui Generis Database Rights.
+
+Where the Licensed Rights include Sui Generis Database Rights that
+apply to Your use of the Licensed Material:
+
+ a. for the avoidance of doubt, Section 2(a)(1) grants You the right
+ to extract, reuse, reproduce, and Share all or a substantial
+ portion of the contents of the database;
+
+ b. if You include all or a substantial portion of the database
+ contents in a database in which You have Sui Generis Database
+ Rights, then the database in which You have Sui Generis Database
+ Rights (but not its individual contents) is Adapted Material; and
+
+ c. You must comply with the conditions in Section 3(a) if You Share
+ all or a substantial portion of the contents of the database.
+
+For the avoidance of doubt, this Section 4 supplements and does not
+replace Your obligations under this Public License where the Licensed
+Rights include other Copyright and Similar Rights.
+
+
+Section 5 -- Disclaimer of Warranties and Limitation of Liability.
+
+ a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
+ EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
+ AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
+ ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
+ IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
+ WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
+ PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
+ ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
+ KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
+ ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
+
+ b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
+ TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
+ NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
+ INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
+ COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
+ USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
+ ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
+ DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
+ IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
+
+ c. The disclaimer of warranties and limitation of liability provided
+ above shall be interpreted in a manner that, to the extent
+ possible, most closely approximates an absolute disclaimer and
+ waiver of all liability.
+
+
+Section 6 -- Term and Termination.
+
+ a. This Public License applies for the term of the Copyright and
+ Similar Rights licensed here. However, if You fail to comply with
+ this Public License, then Your rights under this Public License
+ terminate automatically.
+
+ b. Where Your right to use the Licensed Material has terminated under
+ Section 6(a), it reinstates:
+
+ 1. automatically as of the date the violation is cured, provided
+ it is cured within 30 days of Your discovery of the
+ violation; or
+
+ 2. upon express reinstatement by the Licensor.
+
+ For the avoidance of doubt, this Section 6(b) does not affect any
+ right the Licensor may have to seek remedies for Your violations
+ of this Public License.
+
+ c. For the avoidance of doubt, the Licensor may also offer the
+ Licensed Material under separate terms or conditions or stop
+ distributing the Licensed Material at any time; however, doing so
+ will not terminate this Public License.
+
+ d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
+ License.
+
+
+Section 7 -- Other Terms and Conditions.
+
+ a. The Licensor shall not be bound by any additional or different
+ terms or conditions communicated by You unless expressly agreed.
+
+ b. Any arrangements, understandings, or agreements regarding the
+ Licensed Material not stated herein are separate from and
+ independent of the terms and conditions of this Public License.
+
+
+Section 8 -- Interpretation.
+
+ a. For the avoidance of doubt, this Public License does not, and
+ shall not be interpreted to, reduce, limit, restrict, or impose
+ conditions on any use of the Licensed Material that could lawfully
+ be made without permission under this Public License.
+
+ b. To the extent possible, if any provision of this Public License is
+ deemed unenforceable, it shall be automatically reformed to the
+ minimum extent necessary to make it enforceable. If the provision
+ cannot be reformed, it shall be severed from this Public License
+ without affecting the enforceability of the remaining terms and
+ conditions.
+
+ c. No term or condition of this Public License will be waived and no
+ failure to comply consented to unless expressly agreed to by the
+ Licensor.
+
+ d. Nothing in this Public License constitutes or may be interpreted
+ as a limitation upon, or waiver of, any privileges and immunities
+ that apply to the Licensor or You, including from the legal
+ processes of any jurisdiction or authority.
+
+
+=======================================================================
+
+Creative Commons is not a party to its public licenses.
+Notwithstanding, Creative Commons may elect to apply one of its public
+licenses to material it publishes and in those instances will be
+considered the "Licensor." Except for the limited purpose of indicating
+that material is shared under a Creative Commons public license or as
+otherwise permitted by the Creative Commons policies published at
+creativecommons.org/policies, Creative Commons does not authorize the
+use of the trademark "Creative Commons" or any other trademark or logo
+of Creative Commons without its prior written consent including,
+without limitation, in connection with any unauthorized modifications
+to any of its public licenses or any other arrangements,
+understandings, or agreements concerning use of licensed material. For
+the avoidance of doubt, this paragraph does not form part of the public
+licenses.
+
+Creative Commons may be contacted at creativecommons.org.
diff --git a/docs/README.md b/docs/README.md
deleted file mode 100644
index 1360bc825..000000000
--- a/docs/README.md
+++ /dev/null
@@ -1,20 +0,0 @@
-# ReactPy's Documentation
-
-We provide two main ways to run the docs. Both use
-[`nox`](https://pypi.org/project/nox/):
-
-- `nox -s docs` - displays the docs and rebuilds when files are modified.
-- `nox -s docs-in-docker` - builds a docker image and runs the docs from there.
-
-If any changes to the core of the documentation are made (i.e. to non-`*.rst` files),
-then you should run a manual test of the documentation using the `docs_in_docker`
-session.
-
-If you wish to build and run the docs by hand you need to perform two commands, each
-being run from the root of the repository:
-
-- `sphinx-build -b html docs/source docs/build`
-- `python scripts/run_docs.py`
-
-The first command constructs the static HTML and any Javascript. The latter actually
-runs the web server that serves the content.
diff --git a/docs/docs_app/app.py b/docs/docs_app/app.py
deleted file mode 100644
index 3fe4669ff..000000000
--- a/docs/docs_app/app.py
+++ /dev/null
@@ -1,59 +0,0 @@
-from logging import getLogger
-from pathlib import Path
-
-from sanic import Sanic, response
-
-from docs_app.examples import get_normalized_example_name, load_examples
-from reactpy import component
-from reactpy.backend.sanic import Options, configure, use_request
-from reactpy.core.types import ComponentConstructor
-
-THIS_DIR = Path(__file__).parent
-DOCS_DIR = THIS_DIR.parent
-DOCS_BUILD_DIR = DOCS_DIR / "build"
-
-REACTPY_MODEL_SERVER_URL_PREFIX = "/_reactpy"
-
-logger = getLogger(__name__)
-
-
-REACTPY_MODEL_SERVER_URL_PREFIX = "/_reactpy"
-
-
-@component
-def Example():
- raw_view_id = use_request().get_args().get("view_id")
- view_id = get_normalized_example_name(raw_view_id)
- return _get_examples()[view_id]()
-
-
-def _get_examples():
- if not _EXAMPLES:
- _EXAMPLES.update(load_examples())
- return _EXAMPLES
-
-
-def reload_examples():
- _EXAMPLES.clear()
- _EXAMPLES.update(load_examples())
-
-
-_EXAMPLES: dict[str, ComponentConstructor] = {}
-
-
-def make_app(name: str):
- app = Sanic(name)
-
- app.static("/docs", str(DOCS_BUILD_DIR))
-
- @app.route("/")
- async def forward_to_index(_):
- return response.redirect("/docs/index.html")
-
- configure(
- app,
- Example,
- Options(url_prefix=REACTPY_MODEL_SERVER_URL_PREFIX),
- )
-
- return app
diff --git a/docs/docs_app/dev.py b/docs/docs_app/dev.py
deleted file mode 100644
index 5d661924d..000000000
--- a/docs/docs_app/dev.py
+++ /dev/null
@@ -1,104 +0,0 @@
-import asyncio
-import os
-import threading
-import time
-import webbrowser
-
-from sphinx_autobuild.cli import (
- Server,
- _get_build_args,
- _get_ignore_handler,
- find_free_port,
- get_builder,
- get_parser,
-)
-
-from docs_app.app import make_app, reload_examples
-from reactpy.backend.sanic import serve_development_app
-from reactpy.testing import clear_reactpy_web_modules_dir
-
-# these environment variable are used in custom Sphinx extensions
-os.environ["REACTPY_DOC_EXAMPLE_SERVER_HOST"] = "127.0.0.1:5555"
-os.environ["REACTPY_DOC_STATIC_SERVER_HOST"] = ""
-
-
-def wrap_builder(old_builder):
- # This is the bit that we're injecting to get the example components to reload too
-
- app = make_app("docs_dev_app")
-
- thread_started = threading.Event()
-
- def run_in_thread():
- loop = asyncio.new_event_loop()
- asyncio.set_event_loop(loop)
-
- server_started = asyncio.Event()
-
- async def set_thread_event_when_started():
- await server_started.wait()
- thread_started.set()
-
- loop.run_until_complete(
- asyncio.gather(
- serve_development_app(app, "127.0.0.1", 5555, server_started),
- set_thread_event_when_started(),
- )
- )
-
- threading.Thread(target=run_in_thread, daemon=True).start()
-
- thread_started.wait()
-
- def new_builder():
- clear_reactpy_web_modules_dir()
- reload_examples()
- old_builder()
-
- return new_builder
-
-
-def main():
- # Mostly copied from https://github.com/executablebooks/sphinx-autobuild/blob/b54fb08afc5112bfcda1d844a700c5a20cd6ba5e/src/sphinx_autobuild/cli.py
- parser = get_parser()
- args = parser.parse_args()
-
- srcdir = os.path.realpath(args.sourcedir)
- outdir = os.path.realpath(args.outdir)
- if not os.path.exists(outdir):
- os.makedirs(outdir)
-
- server = Server()
-
- build_args, pre_build_commands = _get_build_args(args)
- builder = wrap_builder(
- get_builder(
- server.watcher,
- build_args,
- host=args.host,
- port=args.port,
- pre_build_commands=pre_build_commands,
- )
- )
-
- ignore_handler = _get_ignore_handler(args)
- server.watch(srcdir, builder, ignore=ignore_handler)
- for dirpath in args.additional_watched_dirs:
- real_dirpath = os.path.realpath(dirpath)
- server.watch(real_dirpath, builder, ignore=ignore_handler)
- server.watch(outdir, ignore=ignore_handler)
-
- if not args.no_initial_build:
- builder()
-
- # Find the free port
- portn = args.port or find_free_port()
- if args.openbrowser is True:
-
- def opener():
- time.sleep(args.delay)
- webbrowser.open(f"http://{args.host}:{args.port}/index.html")
-
- threading.Thread(target=opener, daemon=True).start()
-
- server.serve(port=portn, host=args.host, root=outdir)
diff --git a/docs/docs_app/examples.py b/docs/docs_app/examples.py
deleted file mode 100644
index a71a0b111..000000000
--- a/docs/docs_app/examples.py
+++ /dev/null
@@ -1,177 +0,0 @@
-from __future__ import annotations
-
-from collections.abc import Iterator
-from io import StringIO
-from pathlib import Path
-from traceback import format_exc
-from typing import Callable
-
-import reactpy
-from reactpy.types import ComponentType
-
-HERE = Path(__file__)
-SOURCE_DIR = HERE.parent.parent / "source"
-CONF_FILE = SOURCE_DIR / "conf.py"
-RUN_ReactPy = reactpy.run
-
-
-def load_examples() -> Iterator[tuple[str, Callable[[], ComponentType]]]:
- for name in all_example_names():
- yield name, load_one_example(name)
-
-
-def all_example_names() -> set[str]:
- names = set()
- for file in _iter_example_files(SOURCE_DIR):
- path = file.parent if file.name == "main.py" else file
- names.add("/".join(path.relative_to(SOURCE_DIR).with_suffix("").parts))
- return names
-
-
-def load_one_example(file_or_name: Path | str) -> Callable[[], ComponentType]:
- return lambda: (
- # we use a lambda to ensure each instance is fresh
- _load_one_example(file_or_name)
- )
-
-
-def get_normalized_example_name(
- name: str, relative_to: str | Path | None = SOURCE_DIR
-) -> str:
- return "/".join(
- _get_root_example_path_by_name(name, relative_to).relative_to(SOURCE_DIR).parts
- )
-
-
-def get_main_example_file_by_name(
- name: str, relative_to: str | Path | None = SOURCE_DIR
-) -> Path:
- path = _get_root_example_path_by_name(name, relative_to)
- if path.is_dir():
- return path / "main.py"
- else:
- return path.with_suffix(".py")
-
-
-def get_example_files_by_name(
- name: str, relative_to: str | Path | None = SOURCE_DIR
-) -> list[Path]:
- path = _get_root_example_path_by_name(name, relative_to)
- if path.is_dir():
- return [p for p in path.glob("*") if not p.is_dir()]
- else:
- path = path.with_suffix(".py")
- return [path] if path.exists() else []
-
-
-def _iter_example_files(root: Path) -> Iterator[Path]:
- for path in root.iterdir():
- if path.is_dir():
- if not path.name.startswith("_") or path.name == "_examples":
- yield from _iter_example_files(path)
- elif path.suffix == ".py" and path != CONF_FILE:
- yield path
-
-
-def _load_one_example(file_or_name: Path | str) -> ComponentType:
- if isinstance(file_or_name, str):
- file = get_main_example_file_by_name(file_or_name)
- else:
- file = file_or_name
-
- if not file.exists():
- raise FileNotFoundError(str(file))
-
- print_buffer = _PrintBuffer()
-
- def capture_print(*args, **kwargs):
- buffer = StringIO()
- print(*args, file=buffer, **kwargs)
- print_buffer.write(buffer.getvalue())
-
- captured_component_constructor = None
-
- def capture_component(component_constructor):
- nonlocal captured_component_constructor
- captured_component_constructor = component_constructor
-
- reactpy.run = capture_component
- try:
- code = compile(file.read_text(), str(file), "exec")
- exec(
- code,
- {
- "print": capture_print,
- "__file__": str(file),
- "__name__": file.stem,
- },
- )
- except Exception:
- return _make_error_display(format_exc())
- finally:
- reactpy.run = RUN_ReactPy
-
- if captured_component_constructor is None:
- return _make_example_did_not_run(str(file))
-
- @reactpy.component
- def Wrapper():
- return reactpy.html.div(captured_component_constructor(), PrintView())
-
- @reactpy.component
- def PrintView():
- text, set_text = reactpy.hooks.use_state(print_buffer.getvalue())
- print_buffer.set_callback(set_text)
- return (
- reactpy.html.pre({"class_name": "printout"}, text)
- if text
- else reactpy.html.div()
- )
-
- return Wrapper()
-
-
-def _get_root_example_path_by_name(name: str, relative_to: str | Path | None) -> Path:
- if not name.startswith("/") and relative_to is not None:
- rel_path = Path(relative_to)
- rel_path = rel_path.parent if rel_path.is_file() else rel_path
- else:
- rel_path = SOURCE_DIR
- return rel_path.joinpath(*name.split("/")).resolve()
-
-
-class _PrintBuffer:
- def __init__(self, max_lines: int = 10):
- self._callback = None
- self._lines = ()
- self._max_lines = max_lines
-
- def set_callback(self, function: Callable[[str], None]) -> None:
- self._callback = function
-
- def getvalue(self) -> str:
- return "".join(self._lines)
-
- def write(self, text: str) -> None:
- if len(self._lines) == self._max_lines:
- self._lines = self._lines[1:] + (text,)
- else:
- self._lines += (text,)
- if self._callback is not None:
- self._callback(self.getvalue())
-
-
-def _make_example_did_not_run(example_name):
- @reactpy.component
- def ExampleDidNotRun():
- return reactpy.html.code(f"Example {example_name} did not run")
-
- return ExampleDidNotRun()
-
-
-def _make_error_display(message):
- @reactpy.component
- def ShowError():
- return reactpy.html.pre(message)
-
- return ShowError()
diff --git a/docs/docs_app/prod.py b/docs/docs_app/prod.py
deleted file mode 100644
index 0acf12432..000000000
--- a/docs/docs_app/prod.py
+++ /dev/null
@@ -1,14 +0,0 @@
-import os
-
-from docs_app.app import make_app
-
-app = make_app("docs_prod_app")
-
-
-def main() -> None:
- app.run(
- host="0.0.0.0", # noqa: S104
- port=int(os.environ.get("PORT", 5000)),
- workers=int(os.environ.get("WEB_CONCURRENCY", 1)),
- debug=bool(int(os.environ.get("DEBUG", "0"))),
- )
diff --git a/docs/examples/css/quick_start/adding_styles.css b/docs/examples/css/quick_start/adding_styles.css
new file mode 100644
index 000000000..4d02060e1
--- /dev/null
+++ b/docs/examples/css/quick_start/adding_styles.css
@@ -0,0 +1,4 @@
+/* In your CSS */
+.avatar {
+ border-radius: 50%;
+}
diff --git a/docs/examples/css/quick_start/displaying_data.css b/docs/examples/css/quick_start/displaying_data.css
new file mode 100644
index 000000000..9f5a392c1
--- /dev/null
+++ b/docs/examples/css/quick_start/displaying_data.css
@@ -0,0 +1,7 @@
+.avatar {
+ border-radius: 50%;
+}
+
+.large {
+ border: 4px solid gold;
+}
diff --git a/docs/examples/css/quick_start/sharing_data_between_components.css b/docs/examples/css/quick_start/sharing_data_between_components.css
new file mode 100644
index 000000000..6081b7ef4
--- /dev/null
+++ b/docs/examples/css/quick_start/sharing_data_between_components.css
@@ -0,0 +1,4 @@
+button {
+ display: block;
+ margin-bottom: 5px;
+}
diff --git a/docs/examples/css/quick_start/updating_the_screen.css b/docs/examples/css/quick_start/updating_the_screen.css
new file mode 100644
index 000000000..6081b7ef4
--- /dev/null
+++ b/docs/examples/css/quick_start/updating_the_screen.css
@@ -0,0 +1,4 @@
+button {
+ display: block;
+ margin-bottom: 5px;
+}
diff --git a/docs/examples/css/tutorial-tic-tac-toe/tic_tac_toe.css b/docs/examples/css/tutorial-tic-tac-toe/tic_tac_toe.css
new file mode 100644
index 000000000..87876ec02
--- /dev/null
+++ b/docs/examples/css/tutorial-tic-tac-toe/tic_tac_toe.css
@@ -0,0 +1,42 @@
+* {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ margin: 20px;
+ padding: 0;
+}
+
+.square {
+ background: #fff;
+ border: 1px solid #999;
+ float: left;
+ font-size: 24px;
+ font-weight: bold;
+ line-height: 34px;
+ height: 34px;
+ margin-right: -1px;
+ margin-top: -1px;
+ padding: 0;
+ text-align: center;
+ width: 34px;
+}
+
+.board-row:after {
+ clear: both;
+ content: "";
+ display: table;
+}
+
+.status {
+ margin-bottom: 10px;
+}
+.game {
+ display: flex;
+ flex-direction: row;
+}
+
+.game-info {
+ margin-left: 20px;
+}
diff --git a/docs/docs_app/__init__.py b/docs/examples/python/__init__.py
similarity index 100%
rename from docs/docs_app/__init__.py
rename to docs/examples/python/__init__.py
diff --git a/docs/examples/python/quick_start/__init__.py b/docs/examples/python/quick_start/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/examples/python/quick_start/adding_styles.py b/docs/examples/python/quick_start/adding_styles.py
new file mode 100644
index 000000000..cdc9a7b99
--- /dev/null
+++ b/docs/examples/python/quick_start/adding_styles.py
@@ -0,0 +1,4 @@
+from reactpy import html
+
+# start
+html.img({"class_name": "avatar"})
diff --git a/docs/examples/python/quick_start/conditional_rendering.py b/docs/examples/python/quick_start/conditional_rendering.py
new file mode 100644
index 000000000..d89e097a4
--- /dev/null
+++ b/docs/examples/python/quick_start/conditional_rendering.py
@@ -0,0 +1,22 @@
+from reactpy import component, html
+
+
+def admin_panel():
+ return []
+
+
+def login_form():
+ return []
+
+
+is_logged_in = True
+
+
+# start
+@component
+def my_component():
+ if is_logged_in:
+ content = admin_panel()
+ else:
+ content = login_form()
+ return html.div(content)
diff --git a/docs/examples/python/quick_start/conditional_rendering_logical_and.py b/docs/examples/python/quick_start/conditional_rendering_logical_and.py
new file mode 100644
index 000000000..07e752bba
--- /dev/null
+++ b/docs/examples/python/quick_start/conditional_rendering_logical_and.py
@@ -0,0 +1,14 @@
+from reactpy import component, html
+
+
+def admin_panel():
+ return []
+
+
+is_logged_in = True
+
+
+# start
+@component
+def my_component():
+ return html.div(is_logged_in and admin_panel())
diff --git a/docs/examples/python/quick_start/conditional_rendering_ternary.py b/docs/examples/python/quick_start/conditional_rendering_ternary.py
new file mode 100644
index 000000000..2490cb5f9
--- /dev/null
+++ b/docs/examples/python/quick_start/conditional_rendering_ternary.py
@@ -0,0 +1,18 @@
+from reactpy import component, html
+
+
+def admin_panel():
+ return []
+
+
+def login_form():
+ return []
+
+
+is_logged_in = True
+
+
+# start
+@component
+def my_component():
+ return html.div(admin_panel() if is_logged_in else login_form())
diff --git a/docs/examples/python/quick_start/creating_and_nesting_components.py b/docs/examples/python/quick_start/creating_and_nesting_components.py
new file mode 100644
index 000000000..0841e9514
--- /dev/null
+++ b/docs/examples/python/quick_start/creating_and_nesting_components.py
@@ -0,0 +1,21 @@
+from reactpy import component, html
+
+
+@component
+def my_button():
+ return html.button("I'm a button!")
+
+
+@component
+def my_app():
+ return html.div(
+ html.h1("Welcome to my app"),
+ my_button(),
+ )
+
+
+# end
+if __name__ == "__main__":
+ from reactpy import run
+
+ run(my_app)
diff --git a/docs/examples/python/quick_start/displaying_data.py b/docs/examples/python/quick_start/displaying_data.py
new file mode 100644
index 000000000..d4caa09c9
--- /dev/null
+++ b/docs/examples/python/quick_start/displaying_data.py
@@ -0,0 +1,32 @@
+from reactpy import component, html
+
+user = {
+ "name": "Hedy Lamarr",
+ "image_url": "https://i.imgur.com/yXOvdOSs.jpg",
+ "image_size": 90,
+}
+
+
+@component
+def profile():
+ return html.div(
+ html.h3(user["name"]),
+ html.img(
+ {
+ "class_name": "avatar",
+ "src": user["image_url"],
+ "alt": f"Photo of {user['name']}",
+ "style": {
+ "width": user["image_size"],
+ "height": user["image_size"],
+ },
+ }
+ ),
+ )
+
+
+# end
+if __name__ == "__main__":
+ from reactpy import run
+
+ run(profile)
diff --git a/docs/examples/python/quick_start/my_app.py b/docs/examples/python/quick_start/my_app.py
new file mode 100644
index 000000000..1616d54d1
--- /dev/null
+++ b/docs/examples/python/quick_start/my_app.py
@@ -0,0 +1,12 @@
+from reactpy import component, html
+
+from .my_button import my_button
+
+
+# start
+@component
+def my_app():
+ return html.div(
+ html.h1("Welcome to my app"),
+ my_button(),
+ )
diff --git a/docs/examples/python/quick_start/my_button.py b/docs/examples/python/quick_start/my_button.py
new file mode 100644
index 000000000..0016632ca
--- /dev/null
+++ b/docs/examples/python/quick_start/my_button.py
@@ -0,0 +1,7 @@
+from reactpy import component, html
+
+
+# start
+@component
+def my_button():
+ return html.button("I'm a button!")
diff --git a/docs/examples/python/quick_start/rendering_lists.py b/docs/examples/python/quick_start/rendering_lists.py
new file mode 100644
index 000000000..35ec3e069
--- /dev/null
+++ b/docs/examples/python/quick_start/rendering_lists.py
@@ -0,0 +1,30 @@
+from reactpy import component, html
+
+products = [
+ {"title": "Cabbage", "is_fruit": False, "id": 1},
+ {"title": "Garlic", "is_fruit": False, "id": 2},
+ {"title": "Apple", "is_fruit": True, "id": 3},
+]
+
+
+@component
+def shopping_list():
+ list_items = [
+ html.li(
+ {
+ "key": product["id"],
+ "style": {"color": "magenta" if product["is_fruit"] else "darkgreen"},
+ },
+ product["title"],
+ )
+ for product in products
+ ]
+
+ return html.ul(list_items)
+
+
+# end
+if __name__ == "__main__":
+ from reactpy import run
+
+ run(shopping_list)
diff --git a/docs/examples/python/quick_start/rendering_lists_list_items.py b/docs/examples/python/quick_start/rendering_lists_list_items.py
new file mode 100644
index 000000000..43e108f36
--- /dev/null
+++ b/docs/examples/python/quick_start/rendering_lists_list_items.py
@@ -0,0 +1,6 @@
+from reactpy import html
+
+from .rendering_lists_products import products
+
+# start
+list_items = [html.li({"key": product["id"]}, product["title"]) for product in products]
diff --git a/docs/examples/python/quick_start/rendering_lists_products.py b/docs/examples/python/quick_start/rendering_lists_products.py
new file mode 100644
index 000000000..c2d6a5e31
--- /dev/null
+++ b/docs/examples/python/quick_start/rendering_lists_products.py
@@ -0,0 +1,5 @@
+products = [
+ {"title": "Cabbage", "id": 1},
+ {"title": "Garlic", "id": 2},
+ {"title": "Apple", "id": 3},
+]
diff --git a/docs/examples/python/quick_start/responding_to_events.py b/docs/examples/python/quick_start/responding_to_events.py
new file mode 100644
index 000000000..c893353cf
--- /dev/null
+++ b/docs/examples/python/quick_start/responding_to_events.py
@@ -0,0 +1,13 @@
+from reactpy import component, html
+
+
+# start
+@component
+def my_button():
+ def handle_click(event):
+ print("You clicked me!")
+
+ return html.button(
+ {"on_click": handle_click},
+ "Click me",
+ )
diff --git a/docs/examples/python/quick_start/sharing_data_between_components.py b/docs/examples/python/quick_start/sharing_data_between_components.py
new file mode 100644
index 000000000..7c4d9904d
--- /dev/null
+++ b/docs/examples/python/quick_start/sharing_data_between_components.py
@@ -0,0 +1,27 @@
+from reactpy import component, html, use_state
+
+
+@component
+def my_app():
+ count, set_count = use_state(0)
+
+ def handle_click(event):
+ set_count(count + 1)
+
+ return html.div(
+ html.h1("Counters that update together"),
+ my_button(count, handle_click),
+ my_button(count, handle_click),
+ )
+
+
+@component
+def my_button(count, on_click):
+ return html.button({"on_click": on_click}, f"Clicked {count} times")
+
+
+# end
+if __name__ == "__main__":
+ from reactpy import run
+
+ run(my_app)
diff --git a/docs/examples/python/quick_start/sharing_data_between_components_button.py b/docs/examples/python/quick_start/sharing_data_between_components_button.py
new file mode 100644
index 000000000..b96dadfa6
--- /dev/null
+++ b/docs/examples/python/quick_start/sharing_data_between_components_button.py
@@ -0,0 +1,7 @@
+from reactpy import component, html
+
+
+# start
+@component
+def my_button(count, on_click):
+ return html.button({"on_click": on_click}, f"Clicked {count} times")
diff --git a/docs/examples/python/quick_start/sharing_data_between_components_move_state.py b/docs/examples/python/quick_start/sharing_data_between_components_move_state.py
new file mode 100644
index 000000000..a3c6126c2
--- /dev/null
+++ b/docs/examples/python/quick_start/sharing_data_between_components_move_state.py
@@ -0,0 +1,20 @@
+from reactpy import component, html, use_state
+
+# start
+@component
+def my_app():
+ count, set_count = use_state(0)
+
+ def handle_click(event):
+ set_count(count + 1)
+
+ return html.div(
+ html.h1("Counters that update separately"),
+ my_button(),
+ my_button(),
+ )
+
+
+@component
+def my_button():
+ # ... we're moving code from here ...
diff --git a/docs/examples/python/quick_start/sharing_data_between_components_props.py b/docs/examples/python/quick_start/sharing_data_between_components_props.py
new file mode 100644
index 000000000..52294076a
--- /dev/null
+++ b/docs/examples/python/quick_start/sharing_data_between_components_props.py
@@ -0,0 +1,22 @@
+from reactpy import component, html, use_state
+
+
+# start
+@component
+def my_app():
+ count, set_count = use_state(0)
+
+ def handle_click(event):
+ set_count(count + 1)
+
+ return html.div(
+ html.h1("Counters that update together"),
+ my_button(count, handle_click),
+ my_button(count, handle_click),
+ )
+ # end
+
+
+@component
+def my_button(count, on_click):
+ ...
diff --git a/docs/examples/python/quick_start/updating_the_screen.py b/docs/examples/python/quick_start/updating_the_screen.py
new file mode 100644
index 000000000..906a0718f
--- /dev/null
+++ b/docs/examples/python/quick_start/updating_the_screen.py
@@ -0,0 +1,27 @@
+from reactpy import component, html, use_state
+
+
+@component
+def my_app():
+ return html.div(
+ html.h1("Counters that update separately"),
+ my_button(),
+ my_button(),
+ )
+
+
+@component
+def my_button():
+ count, set_count = use_state(0)
+
+ def handle_click(event):
+ set_count(count + 1)
+
+ return html.button({"on_click": handle_click}, f"Clicked {count} times")
+
+
+# end
+if __name__ == "__main__":
+ from reactpy import run
+
+ run(my_app)
diff --git a/docs/examples/python/quick_start/updating_the_screen_event.py b/docs/examples/python/quick_start/updating_the_screen_event.py
new file mode 100644
index 000000000..2829c481c
--- /dev/null
+++ b/docs/examples/python/quick_start/updating_the_screen_event.py
@@ -0,0 +1,12 @@
+from reactpy import component, html, use_state
+
+
+# start
+@component
+def my_button():
+ count, set_count = use_state(0)
+
+ def handle_click(event):
+ set_count(count + 1)
+
+ return html.button({"on_click": handle_click}, f"Clicked {count} times")
diff --git a/docs/examples/python/quick_start/updating_the_screen_use_state.py b/docs/examples/python/quick_start/updating_the_screen_use_state.py
new file mode 100644
index 000000000..010487c33
--- /dev/null
+++ b/docs/examples/python/quick_start/updating_the_screen_use_state.py
@@ -0,0 +1,5 @@
+from reactpy import use_state
+
+# end
+
+use_state()
diff --git a/docs/examples/python/quick_start/updating_the_screen_use_state_button.py b/docs/examples/python/quick_start/updating_the_screen_use_state_button.py
new file mode 100644
index 000000000..c331ee6c9
--- /dev/null
+++ b/docs/examples/python/quick_start/updating_the_screen_use_state_button.py
@@ -0,0 +1,8 @@
+from reactpy import component, use_state
+
+
+# start
+@component
+def my_button():
+ count, set_count = use_state(0)
+ # ...
diff --git a/docs/examples/python/tutorial-tic-tac-toe/tic_tac_toe.py b/docs/examples/python/tutorial-tic-tac-toe/tic_tac_toe.py
new file mode 100644
index 000000000..9a5fc40cc
--- /dev/null
+++ b/docs/examples/python/tutorial-tic-tac-toe/tic_tac_toe.py
@@ -0,0 +1,117 @@
+from copy import deepcopy
+
+from reactpy import component, html, use_state
+
+
+@component
+def square(value, on_square_click):
+ return html.button(
+ {"className": "square", "on_click": on_square_click},
+ value or "",
+ )
+
+
+@component
+def board(x_is_next, squares, on_play):
+ def handle_click(i):
+ def event(_event):
+ if calculate_winner(squares) or squares[i]:
+ return
+
+ next_squares = squares.copy()
+ next_squares[i] = "X" if x_is_next else "O"
+ on_play(next_squares)
+
+ return event
+
+ winner = calculate_winner(squares)
+ status = (
+ f"Winner: {winner}" if winner else "Next player: " + ("X" if x_is_next else "O")
+ )
+
+ return html._(
+ html.div({"className": "status"}, status),
+ html.div(
+ {"className": "board-row"},
+ square(squares[0], handle_click(0)),
+ square(squares[1], handle_click(1)),
+ square(squares[2], handle_click(2)),
+ ),
+ html.div(
+ {"className": "board-row"},
+ square(squares[3], handle_click(3)),
+ square(squares[4], handle_click(4)),
+ square(squares[5], handle_click(5)),
+ ),
+ html.div(
+ {"className": "board-row"},
+ square(squares[6], handle_click(6)),
+ square(squares[7], handle_click(7)),
+ square(squares[8], handle_click(8)),
+ ),
+ )
+
+
+@component
+def game():
+ history, set_history = use_state([[None] * 9])
+ current_move, set_current_move = use_state(0)
+ x_is_next = current_move % 2 == 0
+ current_squares = history[current_move]
+
+ def handle_play(next_squares):
+ next_history = deepcopy(history[: current_move + 1])
+ next_history.append(next_squares)
+ set_history(next_history)
+ set_current_move(len(next_history) - 1)
+
+ def jump_to(next_move):
+ return lambda _event: set_current_move(next_move)
+
+ moves = []
+ for move, _squares in enumerate(history):
+ description = f"Go to move #{move}" if move > 0 else "Go to game start"
+
+ moves.append(
+ html.li(
+ {"key": move},
+ html.button({"on_click": jump_to(move)}, description),
+ )
+ )
+
+ return html.div(
+ {"className": "game"},
+ html.div(
+ {"className": "game-board"},
+ board(x_is_next, current_squares, handle_play),
+ ),
+ html.div({"className": "game-info"}, html.ol(moves)),
+ )
+
+
+def calculate_winner(squares):
+ lines = [
+ [0, 1, 2],
+ [3, 4, 5],
+ [6, 7, 8],
+ [0, 3, 6],
+ [1, 4, 7],
+ [2, 5, 8],
+ [0, 4, 8],
+ [2, 4, 6],
+ ]
+ for line in lines:
+ a, b, c = line
+ if not squares:
+ continue
+ if squares[a] and squares[a] == squares[b] and squares[a] == squares[c]:
+ return squares[a]
+
+ return None
+
+
+# end
+if __name__ == "__main__":
+ from reactpy import run
+
+ run(game)
diff --git a/docs/main.py b/docs/main.py
deleted file mode 100644
index e3181f393..000000000
--- a/docs/main.py
+++ /dev/null
@@ -1,9 +0,0 @@
-import sys
-
-from docs_app import dev, prod
-
-if __name__ == "__main__":
- if len(sys.argv) == 1:
- prod.main()
- else:
- dev.main()
diff --git a/docs/overrides/main.html b/docs/overrides/main.html
new file mode 100644
index 000000000..e70aa10c8
--- /dev/null
+++ b/docs/overrides/main.html
@@ -0,0 +1,13 @@
+{% extends "base.html" %}
+
+{% block content %}
+{{ super() }}
+
+{% if git_page_authors %}
+
+
+ Authors: {{ git_page_authors | default('enable mkdocs-git-authors-plugin') }}
+
+
+{% endif %}
+{% endblock %}
diff --git a/docs/poetry.lock b/docs/poetry.lock
deleted file mode 100644
index 8e1daef24..000000000
--- a/docs/poetry.lock
+++ /dev/null
@@ -1,2269 +0,0 @@
-# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand.
-
-[[package]]
-name = "aiofiles"
-version = "23.1.0"
-description = "File support for asyncio."
-optional = false
-python-versions = ">=3.7,<4.0"
-files = [
- {file = "aiofiles-23.1.0-py3-none-any.whl", hash = "sha256:9312414ae06472eb6f1d163f555e466a23aed1c8f60c30cccf7121dba2e53eb2"},
- {file = "aiofiles-23.1.0.tar.gz", hash = "sha256:edd247df9a19e0db16534d4baaf536d6609a43e1de5401d7a4c1c148753a1635"},
-]
-
-[[package]]
-name = "alabaster"
-version = "0.7.13"
-description = "A configurable sidebar-enabled Sphinx theme"
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"},
- {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"},
-]
-
-[[package]]
-name = "anyio"
-version = "3.7.0"
-description = "High level compatibility layer for multiple asynchronous event loop implementations"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "anyio-3.7.0-py3-none-any.whl", hash = "sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0"},
- {file = "anyio-3.7.0.tar.gz", hash = "sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce"},
-]
-
-[package.dependencies]
-exceptiongroup = {version = "*", markers = "python_version < \"3.11\""}
-idna = ">=2.8"
-sniffio = ">=1.1"
-
-[package.extras]
-doc = ["Sphinx (>=6.1.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme", "sphinxcontrib-jquery"]
-test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"]
-trio = ["trio (<0.22)"]
-
-[[package]]
-name = "asgiref"
-version = "3.7.2"
-description = "ASGI specs, helper code, and adapters"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "asgiref-3.7.2-py3-none-any.whl", hash = "sha256:89b2ef2247e3b562a16eef663bc0e2e703ec6468e2fa8a5cd61cd449786d4f6e"},
- {file = "asgiref-3.7.2.tar.gz", hash = "sha256:9e0ce3aa93a819ba5b45120216b23878cf6e8525eb3848653452b4192b92afed"},
-]
-
-[package.dependencies]
-typing-extensions = {version = ">=4", markers = "python_version < \"3.11\""}
-
-[package.extras]
-tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"]
-
-[[package]]
-name = "babel"
-version = "2.12.1"
-description = "Internationalization utilities"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "Babel-2.12.1-py3-none-any.whl", hash = "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610"},
- {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"},
-]
-
-[[package]]
-name = "beautifulsoup4"
-version = "4.12.2"
-description = "Screen-scraping library"
-optional = false
-python-versions = ">=3.6.0"
-files = [
- {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"},
- {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"},
-]
-
-[package.dependencies]
-soupsieve = ">1.2"
-
-[package.extras]
-html5lib = ["html5lib"]
-lxml = ["lxml"]
-
-[[package]]
-name = "certifi"
-version = "2023.5.7"
-description = "Python package for providing Mozilla's CA Bundle."
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"},
- {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"},
-]
-
-[[package]]
-name = "charset-normalizer"
-version = "3.1.0"
-description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
-optional = false
-python-versions = ">=3.7.0"
-files = [
- {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"},
- {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"},
- {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"},
- {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"},
- {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"},
- {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"},
- {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"},
- {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"},
- {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"},
- {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"},
- {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"},
- {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"},
- {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"},
- {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"},
- {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"},
- {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"},
- {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"},
- {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"},
- {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"},
- {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"},
- {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"},
- {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"},
- {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"},
- {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"},
- {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"},
- {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"},
- {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"},
- {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"},
- {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"},
- {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"},
- {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"},
- {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"},
- {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"},
- {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"},
- {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"},
- {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"},
- {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"},
- {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"},
- {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"},
- {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"},
- {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"},
- {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"},
- {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"},
- {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"},
- {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"},
- {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"},
- {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"},
- {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"},
- {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"},
- {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"},
- {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"},
- {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"},
- {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"},
- {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"},
- {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"},
- {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"},
- {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"},
- {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"},
- {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"},
- {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"},
- {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"},
- {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"},
- {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"},
- {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"},
- {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"},
- {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"},
- {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"},
- {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"},
- {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"},
- {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"},
- {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"},
- {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"},
- {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"},
- {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"},
- {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"},
-]
-
-[[package]]
-name = "click"
-version = "8.1.3"
-description = "Composable command line interface toolkit"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"},
- {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"},
-]
-
-[package.dependencies]
-colorama = {version = "*", markers = "platform_system == \"Windows\""}
-
-[[package]]
-name = "colorama"
-version = "0.4.6"
-description = "Cross-platform colored terminal text."
-optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
-files = [
- {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
- {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
-]
-
-[[package]]
-name = "colorlog"
-version = "6.7.0"
-description = "Add colours to the output of Python's logging module."
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "colorlog-6.7.0-py2.py3-none-any.whl", hash = "sha256:0d33ca236784a1ba3ff9c532d4964126d8a2c44f1f0cb1d2b0728196f512f662"},
- {file = "colorlog-6.7.0.tar.gz", hash = "sha256:bd94bd21c1e13fac7bd3153f4bc3a7dc0eb0974b8bc2fdf1a989e474f6e582e5"},
-]
-
-[package.dependencies]
-colorama = {version = "*", markers = "sys_platform == \"win32\""}
-
-[package.extras]
-development = ["black", "flake8", "mypy", "pytest", "types-colorama"]
-
-[[package]]
-name = "contourpy"
-version = "1.0.7"
-description = "Python library for calculating contours of 2D quadrilateral grids"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:95c3acddf921944f241b6773b767f1cbce71d03307270e2d769fd584d5d1092d"},
- {file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fc1464c97579da9f3ab16763c32e5c5d5bb5fa1ec7ce509a4ca6108b61b84fab"},
- {file = "contourpy-1.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8acf74b5d383414401926c1598ed77825cd530ac7b463ebc2e4f46638f56cce6"},
- {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c71fdd8f1c0f84ffd58fca37d00ca4ebaa9e502fb49825484da075ac0b0b803"},
- {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f99e9486bf1bb979d95d5cffed40689cb595abb2b841f2991fc894b3452290e8"},
- {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87f4d8941a9564cda3f7fa6a6cd9b32ec575830780677932abdec7bcb61717b0"},
- {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9e20e5a1908e18aaa60d9077a6d8753090e3f85ca25da6e25d30dc0a9e84c2c6"},
- {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a877ada905f7d69b2a31796c4b66e31a8068b37aa9b78832d41c82fc3e056ddd"},
- {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6381fa66866b0ea35e15d197fc06ac3840a9b2643a6475c8fff267db8b9f1e69"},
- {file = "contourpy-1.0.7-cp310-cp310-win32.whl", hash = "sha256:3c184ad2433635f216645fdf0493011a4667e8d46b34082f5a3de702b6ec42e3"},
- {file = "contourpy-1.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:3caea6365b13119626ee996711ab63e0c9d7496f65641f4459c60a009a1f3e80"},
- {file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ed33433fc3820263a6368e532f19ddb4c5990855e4886088ad84fd7c4e561c71"},
- {file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:38e2e577f0f092b8e6774459317c05a69935a1755ecfb621c0a98f0e3c09c9a5"},
- {file = "contourpy-1.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ae90d5a8590e5310c32a7630b4b8618cef7563cebf649011da80874d0aa8f414"},
- {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:130230b7e49825c98edf0b428b7aa1125503d91732735ef897786fe5452b1ec2"},
- {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58569c491e7f7e874f11519ef46737cea1d6eda1b514e4eb5ac7dab6aa864d02"},
- {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54d43960d809c4c12508a60b66cb936e7ed57d51fb5e30b513934a4a23874fae"},
- {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:152fd8f730c31fd67fe0ffebe1df38ab6a669403da93df218801a893645c6ccc"},
- {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9056c5310eb1daa33fc234ef39ebfb8c8e2533f088bbf0bc7350f70a29bde1ac"},
- {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a9d7587d2fdc820cc9177139b56795c39fb8560f540bba9ceea215f1f66e1566"},
- {file = "contourpy-1.0.7-cp311-cp311-win32.whl", hash = "sha256:4ee3ee247f795a69e53cd91d927146fb16c4e803c7ac86c84104940c7d2cabf0"},
- {file = "contourpy-1.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:5caeacc68642e5f19d707471890f037a13007feba8427eb7f2a60811a1fc1350"},
- {file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fd7dc0e6812b799a34f6d12fcb1000539098c249c8da54f3566c6a6461d0dbad"},
- {file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0f9d350b639db6c2c233d92c7f213d94d2e444d8e8fc5ca44c9706cf72193772"},
- {file = "contourpy-1.0.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e96a08b62bb8de960d3a6afbc5ed8421bf1a2d9c85cc4ea73f4bc81b4910500f"},
- {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:031154ed61f7328ad7f97662e48660a150ef84ee1bc8876b6472af88bf5a9b98"},
- {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e9ebb4425fc1b658e13bace354c48a933b842d53c458f02c86f371cecbedecc"},
- {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efb8f6d08ca7998cf59eaf50c9d60717f29a1a0a09caa46460d33b2924839dbd"},
- {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6c180d89a28787e4b73b07e9b0e2dac7741261dbdca95f2b489c4f8f887dd810"},
- {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b8d587cc39057d0afd4166083d289bdeff221ac6d3ee5046aef2d480dc4b503c"},
- {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:769eef00437edf115e24d87f8926955f00f7704bede656ce605097584f9966dc"},
- {file = "contourpy-1.0.7-cp38-cp38-win32.whl", hash = "sha256:62398c80ef57589bdbe1eb8537127321c1abcfdf8c5f14f479dbbe27d0322e66"},
- {file = "contourpy-1.0.7-cp38-cp38-win_amd64.whl", hash = "sha256:57119b0116e3f408acbdccf9eb6ef19d7fe7baf0d1e9aaa5381489bc1aa56556"},
- {file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:30676ca45084ee61e9c3da589042c24a57592e375d4b138bd84d8709893a1ba4"},
- {file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e927b3868bd1e12acee7cc8f3747d815b4ab3e445a28d2e5373a7f4a6e76ba1"},
- {file = "contourpy-1.0.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:366a0cf0fc079af5204801786ad7a1c007714ee3909e364dbac1729f5b0849e5"},
- {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89ba9bb365446a22411f0673abf6ee1fea3b2cf47b37533b970904880ceb72f3"},
- {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:71b0bf0c30d432278793d2141362ac853859e87de0a7dee24a1cea35231f0d50"},
- {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7281244c99fd7c6f27c1c6bfafba878517b0b62925a09b586d88ce750a016d2"},
- {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b6d0f9e1d39dbfb3977f9dd79f156c86eb03e57a7face96f199e02b18e58d32a"},
- {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7f6979d20ee5693a1057ab53e043adffa1e7418d734c1532e2d9e915b08d8ec2"},
- {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5dd34c1ae752515318224cba7fc62b53130c45ac6a1040c8b7c1a223c46e8967"},
- {file = "contourpy-1.0.7-cp39-cp39-win32.whl", hash = "sha256:c5210e5d5117e9aec8c47d9156d1d3835570dd909a899171b9535cb4a3f32693"},
- {file = "contourpy-1.0.7-cp39-cp39-win_amd64.whl", hash = "sha256:60835badb5ed5f4e194a6f21c09283dd6e007664a86101431bf870d9e86266c4"},
- {file = "contourpy-1.0.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ce41676b3d0dd16dbcfabcc1dc46090aaf4688fd6e819ef343dbda5a57ef0161"},
- {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a011cf354107b47c58ea932d13b04d93c6d1d69b8b6dce885e642531f847566"},
- {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:31a55dccc8426e71817e3fe09b37d6d48ae40aae4ecbc8c7ad59d6893569c436"},
- {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69f8ff4db108815addd900a74df665e135dbbd6547a8a69333a68e1f6e368ac2"},
- {file = "contourpy-1.0.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efe99298ba37e37787f6a2ea868265465410822f7bea163edcc1bd3903354ea9"},
- {file = "contourpy-1.0.7-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a1e97b86f73715e8670ef45292d7cc033548266f07d54e2183ecb3c87598888f"},
- {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc331c13902d0f50845099434cd936d49d7a2ca76cb654b39691974cb1e4812d"},
- {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24847601071f740837aefb730e01bd169fbcaa610209779a78db7ebb6e6a7051"},
- {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abf298af1e7ad44eeb93501e40eb5a67abbf93b5d90e468d01fc0c4451971afa"},
- {file = "contourpy-1.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:64757f6460fc55d7e16ed4f1de193f362104285c667c112b50a804d482777edd"},
- {file = "contourpy-1.0.7.tar.gz", hash = "sha256:d8165a088d31798b59e91117d1f5fc3df8168d8b48c4acc10fc0df0d0bdbcc5e"},
-]
-
-[package.dependencies]
-numpy = ">=1.16"
-
-[package.extras]
-bokeh = ["bokeh", "chromedriver", "selenium"]
-docs = ["furo", "sphinx-copybutton"]
-mypy = ["contourpy[bokeh]", "docutils-stubs", "mypy (==0.991)", "types-Pillow"]
-test = ["Pillow", "matplotlib", "pytest"]
-test-no-images = ["pytest"]
-
-[[package]]
-name = "cycler"
-version = "0.11.0"
-description = "Composable style cycles"
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"},
- {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"},
-]
-
-[[package]]
-name = "docutils"
-version = "0.17.1"
-description = "Docutils -- Python Documentation Utilities"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
-files = [
- {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"},
- {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"},
-]
-
-[[package]]
-name = "exceptiongroup"
-version = "1.1.1"
-description = "Backport of PEP 654 (exception groups)"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"},
- {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"},
-]
-
-[package.extras]
-test = ["pytest (>=6)"]
-
-[[package]]
-name = "fastapi"
-version = "0.96.0"
-description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "fastapi-0.96.0-py3-none-any.whl", hash = "sha256:b8e11fe81e81eab4e1504209917338e0b80f783878a42c2b99467e5e1019a1e9"},
- {file = "fastapi-0.96.0.tar.gz", hash = "sha256:71232d47c2787446991c81c41c249f8a16238d52d779c0e6b43927d3773dbe3c"},
-]
-
-[package.dependencies]
-pydantic = ">=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0"
-starlette = ">=0.27.0,<0.28.0"
-
-[package.extras]
-all = ["email-validator (>=1.1.1)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"]
-dev = ["pre-commit (>=2.17.0,<3.0.0)", "ruff (==0.0.138)", "uvicorn[standard] (>=0.12.0,<0.21.0)"]
-doc = ["mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.3.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pyyaml (>=5.3.1,<7.0.0)", "typer-cli (>=0.0.13,<0.0.14)", "typer[all] (>=0.6.1,<0.8.0)"]
-test = ["anyio[trio] (>=3.2.1,<4.0.0)", "black (==23.1.0)", "coverage[toml] (>=6.5.0,<8.0)", "databases[sqlite] (>=0.3.2,<0.7.0)", "email-validator (>=1.1.1,<2.0.0)", "flask (>=1.1.2,<3.0.0)", "httpx (>=0.23.0,<0.24.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.982)", "orjson (>=3.2.1,<4.0.0)", "passlib[bcrypt] (>=1.7.2,<2.0.0)", "peewee (>=3.13.3,<4.0.0)", "pytest (>=7.1.3,<8.0.0)", "python-jose[cryptography] (>=3.3.0,<4.0.0)", "python-multipart (>=0.0.5,<0.0.7)", "pyyaml (>=5.3.1,<7.0.0)", "ruff (==0.0.138)", "sqlalchemy (>=1.3.18,<1.4.43)", "types-orjson (==3.6.2)", "types-ujson (==5.7.0.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)"]
-
-[[package]]
-name = "fastjsonschema"
-version = "2.17.1"
-description = "Fastest Python implementation of JSON schema"
-optional = false
-python-versions = "*"
-files = [
- {file = "fastjsonschema-2.17.1-py3-none-any.whl", hash = "sha256:4b90b252628ca695280924d863fe37234eebadc29c5360d322571233dc9746e0"},
- {file = "fastjsonschema-2.17.1.tar.gz", hash = "sha256:f4eeb8a77cef54861dbf7424ac8ce71306f12cbb086c45131bcba2c6a4f726e3"},
-]
-
-[package.extras]
-devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"]
-
-[[package]]
-name = "flask"
-version = "2.1.3"
-description = "A simple framework for building complex web applications."
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "Flask-2.1.3-py3-none-any.whl", hash = "sha256:9013281a7402ad527f8fd56375164f3aa021ecfaff89bfe3825346c24f87e04c"},
- {file = "Flask-2.1.3.tar.gz", hash = "sha256:15972e5017df0575c3d6c090ba168b6db90259e620ac8d7ea813a396bad5b6cb"},
-]
-
-[package.dependencies]
-click = ">=8.0"
-importlib-metadata = {version = ">=3.6.0", markers = "python_version < \"3.10\""}
-itsdangerous = ">=2.0"
-Jinja2 = ">=3.0"
-Werkzeug = ">=2.0"
-
-[package.extras]
-async = ["asgiref (>=3.2)"]
-dotenv = ["python-dotenv"]
-
-[[package]]
-name = "flask-cors"
-version = "3.0.10"
-description = "A Flask extension adding a decorator for CORS support"
-optional = false
-python-versions = "*"
-files = [
- {file = "Flask-Cors-3.0.10.tar.gz", hash = "sha256:b60839393f3b84a0f3746f6cdca56c1ad7426aa738b70d6c61375857823181de"},
- {file = "Flask_Cors-3.0.10-py2.py3-none-any.whl", hash = "sha256:74efc975af1194fc7891ff5cd85b0f7478be4f7f59fe158102e91abb72bb4438"},
-]
-
-[package.dependencies]
-Flask = ">=0.9"
-Six = "*"
-
-[[package]]
-name = "flask-sock"
-version = "0.6.0"
-description = "WebSocket support for Flask"
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "flask-sock-0.6.0.tar.gz", hash = "sha256:435cf81bb497ac7622cd1dda554fbfa3e369e629daea0a1d21b73a24f1bd6229"},
- {file = "flask_sock-0.6.0-py3-none-any.whl", hash = "sha256:593fffb186928080a5b5b03d717efc56dac2d5ed690ce6bfff333b3597a2f518"},
-]
-
-[package.dependencies]
-flask = ">=2"
-simple-websocket = ">=0.5.1"
-
-[[package]]
-name = "fonttools"
-version = "4.39.4"
-description = "Tools to manipulate font files"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "fonttools-4.39.4-py3-none-any.whl", hash = "sha256:106caf6167c4597556b31a8d9175a3fdc0356fdcd70ab19973c3b0d4c893c461"},
- {file = "fonttools-4.39.4.zip", hash = "sha256:dba8d7cdb8e2bac1b3da28c5ed5960de09e59a2fe7e63bb73f5a59e57b0430d2"},
-]
-
-[package.extras]
-all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.0.0)", "xattr", "zopfli (>=0.1.4)"]
-graphite = ["lz4 (>=1.7.4.2)"]
-interpolatable = ["munkres", "scipy"]
-lxml = ["lxml (>=4.0,<5)"]
-pathops = ["skia-pathops (>=0.5.0)"]
-plot = ["matplotlib"]
-repacker = ["uharfbuzz (>=0.23.0)"]
-symfont = ["sympy"]
-type1 = ["xattr"]
-ufo = ["fs (>=2.2.0,<3)"]
-unicode = ["unicodedata2 (>=15.0.0)"]
-woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"]
-
-[[package]]
-name = "furo"
-version = "2022.4.7"
-description = "A clean customisable Sphinx documentation theme."
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "furo-2022.4.7-py3-none-any.whl", hash = "sha256:7f3e3d2fb977483590f8ecb2c2cd511bd82661b79c18efb24de9558bc9cdf2d7"},
- {file = "furo-2022.4.7.tar.gz", hash = "sha256:96204ab7cd047e4b6c523996e0279c4c629a8fc31f4f109b2efd470c17f49c80"},
-]
-
-[package.dependencies]
-beautifulsoup4 = "*"
-pygments = ">=2.7,<3.0"
-sphinx = ">=4.0,<5.0"
-
-[[package]]
-name = "greenlet"
-version = "2.0.2"
-description = "Lightweight in-process concurrent programming"
-optional = false
-python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*"
-files = [
- {file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"},
- {file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"},
- {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"},
- {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"},
- {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"},
- {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"},
- {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"},
- {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"},
- {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470"},
- {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a"},
- {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"},
- {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"},
- {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"},
- {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"},
- {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"},
- {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"},
- {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19"},
- {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3"},
- {file = "greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5"},
- {file = "greenlet-2.0.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6"},
- {file = "greenlet-2.0.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43"},
- {file = "greenlet-2.0.2-cp35-cp35m-win32.whl", hash = "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a"},
- {file = "greenlet-2.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394"},
- {file = "greenlet-2.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0"},
- {file = "greenlet-2.0.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3"},
- {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db"},
- {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099"},
- {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75"},
- {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf"},
- {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292"},
- {file = "greenlet-2.0.2-cp36-cp36m-win32.whl", hash = "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9"},
- {file = "greenlet-2.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f"},
- {file = "greenlet-2.0.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b"},
- {file = "greenlet-2.0.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1"},
- {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7"},
- {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca"},
- {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73"},
- {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86"},
- {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33"},
- {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"},
- {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"},
- {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"},
- {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"},
- {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"},
- {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"},
- {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857"},
- {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a"},
- {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"},
- {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"},
- {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"},
- {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"},
- {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"},
- {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"},
- {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b"},
- {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b"},
- {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8"},
- {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9"},
- {file = "greenlet-2.0.2-cp39-cp39-win32.whl", hash = "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5"},
- {file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"},
- {file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"},
-]
-
-[package.extras]
-docs = ["Sphinx", "docutils (<0.18)"]
-test = ["objgraph", "psutil"]
-
-[[package]]
-name = "h11"
-version = "0.14.0"
-description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"},
- {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"},
-]
-
-[[package]]
-name = "html5tagger"
-version = "1.3.0"
-description = "Pythonic HTML generation/templating (no template files)"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "html5tagger-1.3.0-py3-none-any.whl", hash = "sha256:ce14313515edffec8ed8a36c5890d023922641171b4e6e5774ad1a74998f5351"},
- {file = "html5tagger-1.3.0.tar.gz", hash = "sha256:84fa3dfb49e5c83b79bbd856ab7b1de8e2311c3bb46a8be925f119e3880a8da9"},
-]
-
-[[package]]
-name = "httptools"
-version = "0.5.0"
-description = "A collection of framework independent HTTP protocol utils."
-optional = false
-python-versions = ">=3.5.0"
-files = [
- {file = "httptools-0.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8f470c79061599a126d74385623ff4744c4e0f4a0997a353a44923c0b561ee51"},
- {file = "httptools-0.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e90491a4d77d0cb82e0e7a9cb35d86284c677402e4ce7ba6b448ccc7325c5421"},
- {file = "httptools-0.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1d2357f791b12d86faced7b5736dea9ef4f5ecdc6c3f253e445ee82da579449"},
- {file = "httptools-0.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f90cd6fd97c9a1b7fe9215e60c3bd97336742a0857f00a4cb31547bc22560c2"},
- {file = "httptools-0.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5230a99e724a1bdbbf236a1b58d6e8504b912b0552721c7c6b8570925ee0ccde"},
- {file = "httptools-0.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3a47a34f6015dd52c9eb629c0f5a8a5193e47bf2a12d9a3194d231eaf1bc451a"},
- {file = "httptools-0.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:24bb4bb8ac3882f90aa95403a1cb48465de877e2d5298ad6ddcfdebec060787d"},
- {file = "httptools-0.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e67d4f8734f8054d2c4858570cc4b233bf753f56e85217de4dfb2495904cf02e"},
- {file = "httptools-0.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7e5eefc58d20e4c2da82c78d91b2906f1a947ef42bd668db05f4ab4201a99f49"},
- {file = "httptools-0.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0297822cea9f90a38df29f48e40b42ac3d48a28637368f3ec6d15eebefd182f9"},
- {file = "httptools-0.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:557be7fbf2bfa4a2ec65192c254e151684545ebab45eca5d50477d562c40f986"},
- {file = "httptools-0.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:54465401dbbec9a6a42cf737627fb0f014d50dc7365a6b6cd57753f151a86ff0"},
- {file = "httptools-0.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4d9ebac23d2de960726ce45f49d70eb5466725c0087a078866043dad115f850f"},
- {file = "httptools-0.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:e8a34e4c0ab7b1ca17b8763613783e2458e77938092c18ac919420ab8655c8c1"},
- {file = "httptools-0.5.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f659d7a48401158c59933904040085c200b4be631cb5f23a7d561fbae593ec1f"},
- {file = "httptools-0.5.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef1616b3ba965cd68e6f759eeb5d34fbf596a79e84215eeceebf34ba3f61fdc7"},
- {file = "httptools-0.5.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3625a55886257755cb15194efbf209584754e31d336e09e2ffe0685a76cb4b60"},
- {file = "httptools-0.5.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:72ad589ba5e4a87e1d404cc1cb1b5780bfcb16e2aec957b88ce15fe879cc08ca"},
- {file = "httptools-0.5.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:850fec36c48df5a790aa735417dca8ce7d4b48d59b3ebd6f83e88a8125cde324"},
- {file = "httptools-0.5.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f222e1e9d3f13b68ff8a835574eda02e67277d51631d69d7cf7f8e07df678c86"},
- {file = "httptools-0.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3cb8acf8f951363b617a8420768a9f249099b92e703c052f9a51b66342eea89b"},
- {file = "httptools-0.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:550059885dc9c19a072ca6d6735739d879be3b5959ec218ba3e013fd2255a11b"},
- {file = "httptools-0.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a04fe458a4597aa559b79c7f48fe3dceabef0f69f562daf5c5e926b153817281"},
- {file = "httptools-0.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d0c1044bce274ec6711f0770fd2d5544fe392591d204c68328e60a46f88843b"},
- {file = "httptools-0.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c6eeefd4435055a8ebb6c5cc36111b8591c192c56a95b45fe2af22d9881eee25"},
- {file = "httptools-0.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:5b65be160adcd9de7a7e6413a4966665756e263f0d5ddeffde277ffeee0576a5"},
- {file = "httptools-0.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fe9c766a0c35b7e3d6b6939393c8dfdd5da3ac5dec7f971ec9134f284c6c36d6"},
- {file = "httptools-0.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:85b392aba273566c3d5596a0a490978c085b79700814fb22bfd537d381dd230c"},
- {file = "httptools-0.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5e3088f4ed33947e16fd865b8200f9cfae1144f41b64a8cf19b599508e096bc"},
- {file = "httptools-0.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c2a56b6aad7cc8f5551d8e04ff5a319d203f9d870398b94702300de50190f63"},
- {file = "httptools-0.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9b571b281a19762adb3f48a7731f6842f920fa71108aff9be49888320ac3e24d"},
- {file = "httptools-0.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa47ffcf70ba6f7848349b8a6f9b481ee0f7637931d91a9860a1838bfc586901"},
- {file = "httptools-0.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:bede7ee075e54b9a5bde695b4fc8f569f30185891796b2e4e09e2226801d09bd"},
- {file = "httptools-0.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:64eba6f168803a7469866a9c9b5263a7463fa8b7a25b35e547492aa7322036b6"},
- {file = "httptools-0.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4b098e4bb1174096a93f48f6193e7d9aa7071506a5877da09a783509ca5fff42"},
- {file = "httptools-0.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9423a2de923820c7e82e18980b937893f4aa8251c43684fa1772e341f6e06887"},
- {file = "httptools-0.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca1b7becf7d9d3ccdbb2f038f665c0f4857e08e1d8481cbcc1a86a0afcfb62b2"},
- {file = "httptools-0.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:50d4613025f15f4b11f1c54bbed4761c0020f7f921b95143ad6d58c151198142"},
- {file = "httptools-0.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8ffce9d81c825ac1deaa13bc9694c0562e2840a48ba21cfc9f3b4c922c16f372"},
- {file = "httptools-0.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:1af91b3650ce518d226466f30bbba5b6376dbd3ddb1b2be8b0658c6799dd450b"},
- {file = "httptools-0.5.0.tar.gz", hash = "sha256:295874861c173f9101960bba332429bb77ed4dcd8cdf5cee9922eb00e4f6bc09"},
-]
-
-[package.extras]
-test = ["Cython (>=0.29.24,<0.30.0)"]
-
-[[package]]
-name = "idna"
-version = "3.4"
-description = "Internationalized Domain Names in Applications (IDNA)"
-optional = false
-python-versions = ">=3.5"
-files = [
- {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"},
- {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"},
-]
-
-[[package]]
-name = "imagesize"
-version = "1.4.1"
-description = "Getting image size from png/jpeg/jpeg2000/gif file"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
-files = [
- {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"},
- {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"},
-]
-
-[[package]]
-name = "importlib-metadata"
-version = "6.6.0"
-description = "Read metadata from Python packages"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "importlib_metadata-6.6.0-py3-none-any.whl", hash = "sha256:43dd286a2cd8995d5eaef7fee2066340423b818ed3fd70adf0bad5f1fac53fed"},
- {file = "importlib_metadata-6.6.0.tar.gz", hash = "sha256:92501cdf9cc66ebd3e612f1b4f0c0765dfa42f0fa38ffb319b6bd84dd675d705"},
-]
-
-[package.dependencies]
-zipp = ">=0.5"
-
-[package.extras]
-docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
-perf = ["ipython"]
-testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"]
-
-[[package]]
-name = "importlib-resources"
-version = "5.12.0"
-description = "Read resources from Python packages"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "importlib_resources-5.12.0-py3-none-any.whl", hash = "sha256:7b1deeebbf351c7578e09bf2f63fa2ce8b5ffec296e0d349139d43cca061a81a"},
- {file = "importlib_resources-5.12.0.tar.gz", hash = "sha256:4be82589bf5c1d7999aedf2a45159d10cb3ca4f19b2271f8792bc8e6da7b22f6"},
-]
-
-[package.dependencies]
-zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""}
-
-[package.extras]
-docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
-testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"]
-
-[[package]]
-name = "itsdangerous"
-version = "2.1.2"
-description = "Safely pass data to untrusted environments and back."
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "itsdangerous-2.1.2-py3-none-any.whl", hash = "sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44"},
- {file = "itsdangerous-2.1.2.tar.gz", hash = "sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a"},
-]
-
-[[package]]
-name = "jinja2"
-version = "3.1.2"
-description = "A very fast and expressive template engine."
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"},
- {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"},
-]
-
-[package.dependencies]
-MarkupSafe = ">=2.0"
-
-[package.extras]
-i18n = ["Babel (>=2.7)"]
-
-[[package]]
-name = "jsonpatch"
-version = "1.32"
-description = "Apply JSON-Patches (RFC 6902)"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
-files = [
- {file = "jsonpatch-1.32-py2.py3-none-any.whl", hash = "sha256:26ac385719ac9f54df8a2f0827bb8253aa3ea8ab7b3368457bcdb8c14595a397"},
- {file = "jsonpatch-1.32.tar.gz", hash = "sha256:b6ddfe6c3db30d81a96aaeceb6baf916094ffa23d7dd5fa2c13e13f8b6e600c2"},
-]
-
-[package.dependencies]
-jsonpointer = ">=1.9"
-
-[[package]]
-name = "jsonpointer"
-version = "2.3"
-description = "Identify specific nodes in a JSON document (RFC 6901)"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
-files = [
- {file = "jsonpointer-2.3-py2.py3-none-any.whl", hash = "sha256:51801e558539b4e9cd268638c078c6c5746c9ac96bc38152d443400e4f3793e9"},
- {file = "jsonpointer-2.3.tar.gz", hash = "sha256:97cba51526c829282218feb99dab1b1e6bdf8efd1c43dc9d57be093c0d69c99a"},
-]
-
-[[package]]
-name = "kiwisolver"
-version = "1.4.4"
-description = "A fast implementation of the Cassowary constraint solver"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2f5e60fabb7343a836360c4f0919b8cd0d6dbf08ad2ca6b9cf90bf0c76a3c4f6"},
- {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:10ee06759482c78bdb864f4109886dff7b8a56529bc1609d4f1112b93fe6423c"},
- {file = "kiwisolver-1.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c79ebe8f3676a4c6630fd3f777f3cfecf9289666c84e775a67d1d358578dc2e3"},
- {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abbe9fa13da955feb8202e215c4018f4bb57469b1b78c7a4c5c7b93001699938"},
- {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7577c1987baa3adc4b3c62c33bd1118c3ef5c8ddef36f0f2c950ae0b199e100d"},
- {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ad8285b01b0d4695102546b342b493b3ccc6781fc28c8c6a1bb63e95d22f09"},
- {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed58b8acf29798b036d347791141767ccf65eee7f26bde03a71c944449e53de"},
- {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a68b62a02953b9841730db7797422f983935aeefceb1679f0fc85cbfbd311c32"},
- {file = "kiwisolver-1.4.4-cp310-cp310-win32.whl", hash = "sha256:e92a513161077b53447160b9bd8f522edfbed4bd9759e4c18ab05d7ef7e49408"},
- {file = "kiwisolver-1.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:3fe20f63c9ecee44560d0e7f116b3a747a5d7203376abeea292ab3152334d004"},
- {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ea21f66820452a3f5d1655f8704a60d66ba1191359b96541eaf457710a5fc6"},
- {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bc9db8a3efb3e403e4ecc6cd9489ea2bac94244f80c78e27c31dcc00d2790ac2"},
- {file = "kiwisolver-1.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d5b61785a9ce44e5a4b880272baa7cf6c8f48a5180c3e81c59553ba0cb0821ca"},
- {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2dbb44c3f7e6c4d3487b31037b1bdbf424d97687c1747ce4ff2895795c9bf69"},
- {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6295ecd49304dcf3bfbfa45d9a081c96509e95f4b9d0eb7ee4ec0530c4a96514"},
- {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bd472dbe5e136f96a4b18f295d159d7f26fd399136f5b17b08c4e5f498cd494"},
- {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf7d9fce9bcc4752ca4a1b80aabd38f6d19009ea5cbda0e0856983cf6d0023f5"},
- {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d6601aed50c74e0ef02f4204da1816147a6d3fbdc8b3872d263338a9052c51"},
- {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:877272cf6b4b7e94c9614f9b10140e198d2186363728ed0f701c6eee1baec1da"},
- {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:db608a6757adabb32f1cfe6066e39b3706d8c3aa69bbc353a5b61edad36a5cb4"},
- {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5853eb494c71e267912275e5586fe281444eb5e722de4e131cddf9d442615626"},
- {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f0a1dbdb5ecbef0d34eb77e56fcb3e95bbd7e50835d9782a45df81cc46949750"},
- {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:283dffbf061a4ec60391d51e6155e372a1f7a4f5b15d59c8505339454f8989e4"},
- {file = "kiwisolver-1.4.4-cp311-cp311-win32.whl", hash = "sha256:d06adcfa62a4431d404c31216f0f8ac97397d799cd53800e9d3efc2fbb3cf14e"},
- {file = "kiwisolver-1.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:e7da3fec7408813a7cebc9e4ec55afed2d0fd65c4754bc376bf03498d4e92686"},
- {file = "kiwisolver-1.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:62ac9cc684da4cf1778d07a89bf5f81b35834cb96ca523d3a7fb32509380cbf6"},
- {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41dae968a94b1ef1897cb322b39360a0812661dba7c682aa45098eb8e193dbdf"},
- {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02f79693ec433cb4b5f51694e8477ae83b3205768a6fb48ffba60549080e295b"},
- {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0611a0a2a518464c05ddd5a3a1a0e856ccc10e67079bb17f265ad19ab3c7597"},
- {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:db5283d90da4174865d520e7366801a93777201e91e79bacbac6e6927cbceede"},
- {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1041feb4cda8708ce73bb4dcb9ce1ccf49d553bf87c3954bdfa46f0c3f77252c"},
- {file = "kiwisolver-1.4.4-cp37-cp37m-win32.whl", hash = "sha256:a553dadda40fef6bfa1456dc4be49b113aa92c2a9a9e8711e955618cd69622e3"},
- {file = "kiwisolver-1.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:03baab2d6b4a54ddbb43bba1a3a2d1627e82d205c5cf8f4c924dc49284b87166"},
- {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:841293b17ad704d70c578f1f0013c890e219952169ce8a24ebc063eecf775454"},
- {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f4f270de01dd3e129a72efad823da90cc4d6aafb64c410c9033aba70db9f1ff0"},
- {file = "kiwisolver-1.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f9f39e2f049db33a908319cf46624a569b36983c7c78318e9726a4cb8923b26c"},
- {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c97528e64cb9ebeff9701e7938653a9951922f2a38bd847787d4a8e498cc83ae"},
- {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d1573129aa0fd901076e2bfb4275a35f5b7aa60fbfb984499d661ec950320b0"},
- {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad881edc7ccb9d65b0224f4e4d05a1e85cf62d73aab798943df6d48ab0cd79a1"},
- {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b428ef021242344340460fa4c9185d0b1f66fbdbfecc6c63eff4b7c29fad429d"},
- {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2e407cb4bd5a13984a6c2c0fe1845e4e41e96f183e5e5cd4d77a857d9693494c"},
- {file = "kiwisolver-1.4.4-cp38-cp38-win32.whl", hash = "sha256:75facbe9606748f43428fc91a43edb46c7ff68889b91fa31f53b58894503a191"},
- {file = "kiwisolver-1.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:5bce61af018b0cb2055e0e72e7d65290d822d3feee430b7b8203d8a855e78766"},
- {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8c808594c88a025d4e322d5bb549282c93c8e1ba71b790f539567932722d7bd8"},
- {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0a71d85ecdd570ded8ac3d1c0f480842f49a40beb423bb8014539a9f32a5897"},
- {file = "kiwisolver-1.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b533558eae785e33e8c148a8d9921692a9fe5aa516efbdff8606e7d87b9d5824"},
- {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:efda5fc8cc1c61e4f639b8067d118e742b812c930f708e6667a5ce0d13499e29"},
- {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7c43e1e1206cd421cd92e6b3280d4385d41d7166b3ed577ac20444b6995a445f"},
- {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc8d3bd6c72b2dd9decf16ce70e20abcb3274ba01b4e1c96031e0c4067d1e7cd"},
- {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ea39b0ccc4f5d803e3337dd46bcce60b702be4d86fd0b3d7531ef10fd99a1ac"},
- {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:968f44fdbf6dd757d12920d63b566eeb4d5b395fd2d00d29d7ef00a00582aac9"},
- {file = "kiwisolver-1.4.4-cp39-cp39-win32.whl", hash = "sha256:da7e547706e69e45d95e116e6939488d62174e033b763ab1496b4c29b76fabea"},
- {file = "kiwisolver-1.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:ba59c92039ec0a66103b1d5fe588fa546373587a7d68f5c96f743c3396afc04b"},
- {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:91672bacaa030f92fc2f43b620d7b337fd9a5af28b0d6ed3f77afc43c4a64b5a"},
- {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:787518a6789009c159453da4d6b683f468ef7a65bbde796bcea803ccf191058d"},
- {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da152d8cdcab0e56e4f45eb08b9aea6455845ec83172092f09b0e077ece2cf7a"},
- {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ecb1fa0db7bf4cff9dac752abb19505a233c7f16684c5826d1f11ebd9472b871"},
- {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:28bc5b299f48150b5f822ce68624e445040595a4ac3d59251703779836eceff9"},
- {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:81e38381b782cc7e1e46c4e14cd997ee6040768101aefc8fa3c24a4cc58e98f8"},
- {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2a66fdfb34e05b705620dd567f5a03f239a088d5a3f321e7b6ac3239d22aa286"},
- {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:872b8ca05c40d309ed13eb2e582cab0c5a05e81e987ab9c521bf05ad1d5cf5cb"},
- {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:70e7c2e7b750585569564e2e5ca9845acfaa5da56ac46df68414f29fea97be9f"},
- {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9f85003f5dfa867e86d53fac6f7e6f30c045673fa27b603c397753bebadc3008"},
- {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e307eb9bd99801f82789b44bb45e9f541961831c7311521b13a6c85afc09767"},
- {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1792d939ec70abe76f5054d3f36ed5656021dcad1322d1cc996d4e54165cef9"},
- {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cb459eea32a4e2cf18ba5fcece2dbdf496384413bc1bae15583f19e567f3b2"},
- {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36dafec3d6d6088d34e2de6b85f9d8e2324eb734162fba59d2ba9ed7a2043d5b"},
- {file = "kiwisolver-1.4.4.tar.gz", hash = "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955"},
-]
-
-[[package]]
-name = "livereload"
-version = "2.6.3"
-description = "Python LiveReload is an awesome tool for web developers"
-optional = false
-python-versions = "*"
-files = [
- {file = "livereload-2.6.3-py2.py3-none-any.whl", hash = "sha256:ad4ac6f53b2d62bb6ce1a5e6e96f1f00976a32348afedcb4b6d68df2a1d346e4"},
- {file = "livereload-2.6.3.tar.gz", hash = "sha256:776f2f865e59fde56490a56bcc6773b6917366bce0c267c60ee8aaf1a0959869"},
-]
-
-[package.dependencies]
-six = "*"
-tornado = {version = "*", markers = "python_version > \"2.7\""}
-
-[[package]]
-name = "lxml"
-version = "4.9.2"
-description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API."
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*"
-files = [
- {file = "lxml-4.9.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:76cf573e5a365e790396a5cc2b909812633409306c6531a6877c59061e42c4f2"},
- {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b1f42b6921d0e81b1bcb5e395bc091a70f41c4d4e55ba99c6da2b31626c44892"},
- {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9f102706d0ca011de571de32c3247c6476b55bb6bc65a20f682f000b07a4852a"},
- {file = "lxml-4.9.2-cp27-cp27m-win32.whl", hash = "sha256:8d0b4612b66ff5d62d03bcaa043bb018f74dfea51184e53f067e6fdcba4bd8de"},
- {file = "lxml-4.9.2-cp27-cp27m-win_amd64.whl", hash = "sha256:4c8f293f14abc8fd3e8e01c5bd86e6ed0b6ef71936ded5bf10fe7a5efefbaca3"},
- {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2899456259589aa38bfb018c364d6ae7b53c5c22d8e27d0ec7609c2a1ff78b50"},
- {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6749649eecd6a9871cae297bffa4ee76f90b4504a2a2ab528d9ebe912b101975"},
- {file = "lxml-4.9.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a08cff61517ee26cb56f1e949cca38caabe9ea9fbb4b1e10a805dc39844b7d5c"},
- {file = "lxml-4.9.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:85cabf64adec449132e55616e7ca3e1000ab449d1d0f9d7f83146ed5bdcb6d8a"},
- {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8340225bd5e7a701c0fa98284c849c9b9fc9238abf53a0ebd90900f25d39a4e4"},
- {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1ab8f1f932e8f82355e75dda5413a57612c6ea448069d4fb2e217e9a4bed13d4"},
- {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:699a9af7dffaf67deeae27b2112aa06b41c370d5e7633e0ee0aea2e0b6c211f7"},
- {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9cc34af337a97d470040f99ba4282f6e6bac88407d021688a5d585e44a23184"},
- {file = "lxml-4.9.2-cp310-cp310-win32.whl", hash = "sha256:d02a5399126a53492415d4906ab0ad0375a5456cc05c3fc0fc4ca11771745cda"},
- {file = "lxml-4.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:a38486985ca49cfa574a507e7a2215c0c780fd1778bb6290c21193b7211702ab"},
- {file = "lxml-4.9.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c83203addf554215463b59f6399835201999b5e48019dc17f182ed5ad87205c9"},
- {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:2a87fa548561d2f4643c99cd13131acb607ddabb70682dcf1dff5f71f781a4bf"},
- {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:d6b430a9938a5a5d85fc107d852262ddcd48602c120e3dbb02137c83d212b380"},
- {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3efea981d956a6f7173b4659849f55081867cf897e719f57383698af6f618a92"},
- {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:df0623dcf9668ad0445e0558a21211d4e9a149ea8f5666917c8eeec515f0a6d1"},
- {file = "lxml-4.9.2-cp311-cp311-win32.whl", hash = "sha256:da248f93f0418a9e9d94b0080d7ebc407a9a5e6d0b57bb30db9b5cc28de1ad33"},
- {file = "lxml-4.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:3818b8e2c4b5148567e1b09ce739006acfaa44ce3156f8cbbc11062994b8e8dd"},
- {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca989b91cf3a3ba28930a9fc1e9aeafc2a395448641df1f387a2d394638943b0"},
- {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:822068f85e12a6e292803e112ab876bc03ed1f03dddb80154c395f891ca6b31e"},
- {file = "lxml-4.9.2-cp35-cp35m-win32.whl", hash = "sha256:be7292c55101e22f2a3d4d8913944cbea71eea90792bf914add27454a13905df"},
- {file = "lxml-4.9.2-cp35-cp35m-win_amd64.whl", hash = "sha256:998c7c41910666d2976928c38ea96a70d1aa43be6fe502f21a651e17483a43c5"},
- {file = "lxml-4.9.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:b26a29f0b7fc6f0897f043ca366142d2b609dc60756ee6e4e90b5f762c6adc53"},
- {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:ab323679b8b3030000f2be63e22cdeea5b47ee0abd2d6a1dc0c8103ddaa56cd7"},
- {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:689bb688a1db722485e4610a503e3e9210dcc20c520b45ac8f7533c837be76fe"},
- {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:f49e52d174375a7def9915c9f06ec4e569d235ad428f70751765f48d5926678c"},
- {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36c3c175d34652a35475a73762b545f4527aec044910a651d2bf50de9c3352b1"},
- {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a35f8b7fa99f90dd2f5dc5a9fa12332642f087a7641289ca6c40d6e1a2637d8e"},
- {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:58bfa3aa19ca4c0f28c5dde0ff56c520fbac6f0daf4fac66ed4c8d2fb7f22e74"},
- {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc718cd47b765e790eecb74d044cc8d37d58562f6c314ee9484df26276d36a38"},
- {file = "lxml-4.9.2-cp36-cp36m-win32.whl", hash = "sha256:d5bf6545cd27aaa8a13033ce56354ed9e25ab0e4ac3b5392b763d8d04b08e0c5"},
- {file = "lxml-4.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:3ab9fa9d6dc2a7f29d7affdf3edebf6ece6fb28a6d80b14c3b2fb9d39b9322c3"},
- {file = "lxml-4.9.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:05ca3f6abf5cf78fe053da9b1166e062ade3fa5d4f92b4ed688127ea7d7b1d03"},
- {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:a5da296eb617d18e497bcf0a5c528f5d3b18dadb3619fbdadf4ed2356ef8d941"},
- {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:04876580c050a8c5341d706dd464ff04fd597095cc8c023252566a8826505726"},
- {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c9ec3eaf616d67db0764b3bb983962b4f385a1f08304fd30c7283954e6a7869b"},
- {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a29ba94d065945944016b6b74e538bdb1751a1db6ffb80c9d3c2e40d6fa9894"},
- {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a82d05da00a58b8e4c0008edbc8a4b6ec5a4bc1e2ee0fb6ed157cf634ed7fa45"},
- {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:223f4232855ade399bd409331e6ca70fb5578efef22cf4069a6090acc0f53c0e"},
- {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d17bc7c2ccf49c478c5bdd447594e82692c74222698cfc9b5daae7ae7e90743b"},
- {file = "lxml-4.9.2-cp37-cp37m-win32.whl", hash = "sha256:b64d891da92e232c36976c80ed7ebb383e3f148489796d8d31a5b6a677825efe"},
- {file = "lxml-4.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a0a336d6d3e8b234a3aae3c674873d8f0e720b76bc1d9416866c41cd9500ffb9"},
- {file = "lxml-4.9.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:da4dd7c9c50c059aba52b3524f84d7de956f7fef88f0bafcf4ad7dde94a064e8"},
- {file = "lxml-4.9.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:821b7f59b99551c69c85a6039c65b75f5683bdc63270fec660f75da67469ca24"},
- {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:e5168986b90a8d1f2f9dc1b841467c74221bd752537b99761a93d2d981e04889"},
- {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8e20cb5a47247e383cf4ff523205060991021233ebd6f924bca927fcf25cf86f"},
- {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13598ecfbd2e86ea7ae45ec28a2a54fb87ee9b9fdb0f6d343297d8e548392c03"},
- {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:880bbbcbe2fca64e2f4d8e04db47bcdf504936fa2b33933efd945e1b429bea8c"},
- {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d2278d59425777cfcb19735018d897ca8303abe67cc735f9f97177ceff8027f"},
- {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5344a43228767f53a9df6e5b253f8cdca7dfc7b7aeae52551958192f56d98457"},
- {file = "lxml-4.9.2-cp38-cp38-win32.whl", hash = "sha256:925073b2fe14ab9b87e73f9a5fde6ce6392da430f3004d8b72cc86f746f5163b"},
- {file = "lxml-4.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:9b22c5c66f67ae00c0199f6055705bc3eb3fcb08d03d2ec4059a2b1b25ed48d7"},
- {file = "lxml-4.9.2-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:5f50a1c177e2fa3ee0667a5ab79fdc6b23086bc8b589d90b93b4bd17eb0e64d1"},
- {file = "lxml-4.9.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:090c6543d3696cbe15b4ac6e175e576bcc3f1ccfbba970061b7300b0c15a2140"},
- {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:63da2ccc0857c311d764e7d3d90f429c252e83b52d1f8f1d1fe55be26827d1f4"},
- {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:5b4545b8a40478183ac06c073e81a5ce4cf01bf1734962577cf2bb569a5b3bbf"},
- {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2e430cd2824f05f2d4f687701144556646bae8f249fd60aa1e4c768ba7018947"},
- {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6804daeb7ef69e7b36f76caddb85cccd63d0c56dedb47555d2fc969e2af6a1a5"},
- {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a6e441a86553c310258aca15d1c05903aaf4965b23f3bc2d55f200804e005ee5"},
- {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ca34efc80a29351897e18888c71c6aca4a359247c87e0b1c7ada14f0ab0c0fb2"},
- {file = "lxml-4.9.2-cp39-cp39-win32.whl", hash = "sha256:6b418afe5df18233fc6b6093deb82a32895b6bb0b1155c2cdb05203f583053f1"},
- {file = "lxml-4.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:f1496ea22ca2c830cbcbd473de8f114a320da308438ae65abad6bab7867fe38f"},
- {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b264171e3143d842ded311b7dccd46ff9ef34247129ff5bf5066123c55c2431c"},
- {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0dc313ef231edf866912e9d8f5a042ddab56c752619e92dfd3a2c277e6a7299a"},
- {file = "lxml-4.9.2-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:16efd54337136e8cd72fb9485c368d91d77a47ee2d42b057564aae201257d419"},
- {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0f2b1e0d79180f344ff9f321327b005ca043a50ece8713de61d1cb383fb8ac05"},
- {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:7b770ed79542ed52c519119473898198761d78beb24b107acf3ad65deae61f1f"},
- {file = "lxml-4.9.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efa29c2fe6b4fdd32e8ef81c1528506895eca86e1d8c4657fda04c9b3786ddf9"},
- {file = "lxml-4.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7e91ee82f4199af8c43d8158024cbdff3d931df350252288f0d4ce656df7f3b5"},
- {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b23e19989c355ca854276178a0463951a653309fb8e57ce674497f2d9f208746"},
- {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:01d36c05f4afb8f7c20fd9ed5badca32a2029b93b1750f571ccc0b142531caf7"},
- {file = "lxml-4.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7b515674acfdcadb0eb5d00d8a709868173acece5cb0be3dd165950cbfdf5409"},
- {file = "lxml-4.9.2.tar.gz", hash = "sha256:2455cfaeb7ac70338b3257f41e21f0724f4b5b0c0e7702da67ee6c3640835b67"},
-]
-
-[package.extras]
-cssselect = ["cssselect (>=0.7)"]
-html5 = ["html5lib"]
-htmlsoup = ["BeautifulSoup4"]
-source = ["Cython (>=0.29.7)"]
-
-[[package]]
-name = "markupsafe"
-version = "2.0.1"
-description = "Safely add untrusted strings to HTML/XML markup."
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"},
- {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"},
- {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"},
- {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"},
- {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"},
- {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"},
- {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"},
- {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"},
- {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"},
- {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"},
- {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"},
- {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"},
- {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"},
- {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"},
- {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"},
- {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"},
- {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"},
- {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"},
- {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"},
- {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"},
- {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"},
- {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"},
- {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"},
- {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"},
- {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"},
- {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"},
- {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"},
- {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"},
- {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"},
- {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"},
- {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"},
- {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"},
- {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"},
- {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"},
- {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"},
- {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"},
- {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"},
- {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"},
- {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"},
- {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"},
- {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"},
- {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"},
- {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"},
- {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"},
- {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"},
- {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"},
- {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"},
- {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"},
- {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"},
- {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"},
- {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"},
- {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"},
- {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"},
- {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"},
- {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"},
- {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"},
- {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"},
- {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"},
- {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"},
- {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"},
- {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"},
- {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"},
- {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"},
- {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"},
- {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"},
- {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"},
- {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"},
- {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"},
- {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"},
-]
-
-[[package]]
-name = "matplotlib"
-version = "3.7.1"
-description = "Python plotting package"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "matplotlib-3.7.1-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:95cbc13c1fc6844ab8812a525bbc237fa1470863ff3dace7352e910519e194b1"},
- {file = "matplotlib-3.7.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:08308bae9e91aca1ec6fd6dda66237eef9f6294ddb17f0d0b3c863169bf82353"},
- {file = "matplotlib-3.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:544764ba51900da4639c0f983b323d288f94f65f4024dc40ecb1542d74dc0500"},
- {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56d94989191de3fcc4e002f93f7f1be5da476385dde410ddafbb70686acf00ea"},
- {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e99bc9e65901bb9a7ce5e7bb24af03675cbd7c70b30ac670aa263240635999a4"},
- {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb7d248c34a341cd4c31a06fd34d64306624c8cd8d0def7abb08792a5abfd556"},
- {file = "matplotlib-3.7.1-cp310-cp310-win32.whl", hash = "sha256:ce463ce590f3825b52e9fe5c19a3c6a69fd7675a39d589e8b5fbe772272b3a24"},
- {file = "matplotlib-3.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:3d7bc90727351fb841e4d8ae620d2d86d8ed92b50473cd2b42ce9186104ecbba"},
- {file = "matplotlib-3.7.1-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:770a205966d641627fd5cf9d3cb4b6280a716522cd36b8b284a8eb1581310f61"},
- {file = "matplotlib-3.7.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f67bfdb83a8232cb7a92b869f9355d677bce24485c460b19d01970b64b2ed476"},
- {file = "matplotlib-3.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2bf092f9210e105f414a043b92af583c98f50050559616930d884387d0772aba"},
- {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89768d84187f31717349c6bfadc0e0d8c321e8eb34522acec8a67b1236a66332"},
- {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83111e6388dec67822e2534e13b243cc644c7494a4bb60584edbff91585a83c6"},
- {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a867bf73a7eb808ef2afbca03bcdb785dae09595fbe550e1bab0cd023eba3de0"},
- {file = "matplotlib-3.7.1-cp311-cp311-win32.whl", hash = "sha256:fbdeeb58c0cf0595efe89c05c224e0a502d1aa6a8696e68a73c3efc6bc354304"},
- {file = "matplotlib-3.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:c0bd19c72ae53e6ab979f0ac6a3fafceb02d2ecafa023c5cca47acd934d10be7"},
- {file = "matplotlib-3.7.1-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:6eb88d87cb2c49af00d3bbc33a003f89fd9f78d318848da029383bfc08ecfbfb"},
- {file = "matplotlib-3.7.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:cf0e4f727534b7b1457898c4f4ae838af1ef87c359b76dcd5330fa31893a3ac7"},
- {file = "matplotlib-3.7.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:46a561d23b91f30bccfd25429c3c706afe7d73a5cc64ef2dfaf2b2ac47c1a5dc"},
- {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8704726d33e9aa8a6d5215044b8d00804561971163563e6e6591f9dcf64340cc"},
- {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4cf327e98ecf08fcbb82685acaf1939d3338548620ab8dfa02828706402c34de"},
- {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:617f14ae9d53292ece33f45cba8503494ee199a75b44de7717964f70637a36aa"},
- {file = "matplotlib-3.7.1-cp38-cp38-win32.whl", hash = "sha256:7c9a4b2da6fac77bcc41b1ea95fadb314e92508bf5493ceff058e727e7ecf5b0"},
- {file = "matplotlib-3.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:14645aad967684e92fc349493fa10c08a6da514b3d03a5931a1bac26e6792bd1"},
- {file = "matplotlib-3.7.1-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:81a6b377ea444336538638d31fdb39af6be1a043ca5e343fe18d0f17e098770b"},
- {file = "matplotlib-3.7.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:28506a03bd7f3fe59cd3cd4ceb2a8d8a2b1db41afede01f66c42561b9be7b4b7"},
- {file = "matplotlib-3.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8c587963b85ce41e0a8af53b9b2de8dddbf5ece4c34553f7bd9d066148dc719c"},
- {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8bf26ade3ff0f27668989d98c8435ce9327d24cffb7f07d24ef609e33d582439"},
- {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:def58098f96a05f90af7e92fd127d21a287068202aa43b2a93476170ebd99e87"},
- {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f883a22a56a84dba3b588696a2b8a1ab0d2c3d41be53264115c71b0a942d8fdb"},
- {file = "matplotlib-3.7.1-cp39-cp39-win32.whl", hash = "sha256:4f99e1b234c30c1e9714610eb0c6d2f11809c9c78c984a613ae539ea2ad2eb4b"},
- {file = "matplotlib-3.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:3ba2af245e36990facf67fde840a760128ddd71210b2ab6406e640188d69d136"},
- {file = "matplotlib-3.7.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3032884084f541163f295db8a6536e0abb0db464008fadca6c98aaf84ccf4717"},
- {file = "matplotlib-3.7.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a2cb34336110e0ed8bb4f650e817eed61fa064acbefeb3591f1b33e3a84fd96"},
- {file = "matplotlib-3.7.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b867e2f952ed592237a1828f027d332d8ee219ad722345b79a001f49df0936eb"},
- {file = "matplotlib-3.7.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:57bfb8c8ea253be947ccb2bc2d1bb3862c2bccc662ad1b4626e1f5e004557042"},
- {file = "matplotlib-3.7.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:438196cdf5dc8d39b50a45cb6e3f6274edbcf2254f85fa9b895bf85851c3a613"},
- {file = "matplotlib-3.7.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:21e9cff1a58d42e74d01153360de92b326708fb205250150018a52c70f43c290"},
- {file = "matplotlib-3.7.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75d4725d70b7c03e082bbb8a34639ede17f333d7247f56caceb3801cb6ff703d"},
- {file = "matplotlib-3.7.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:97cc368a7268141afb5690760921765ed34867ffb9655dd325ed207af85c7529"},
- {file = "matplotlib-3.7.1.tar.gz", hash = "sha256:7b73305f25eab4541bd7ee0b96d87e53ae9c9f1823be5659b806cd85786fe882"},
-]
-
-[package.dependencies]
-contourpy = ">=1.0.1"
-cycler = ">=0.10"
-fonttools = ">=4.22.0"
-importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""}
-kiwisolver = ">=1.0.1"
-numpy = ">=1.20"
-packaging = ">=20.0"
-pillow = ">=6.2.0"
-pyparsing = ">=2.3.1"
-python-dateutil = ">=2.7"
-
-[[package]]
-name = "multidict"
-version = "6.0.4"
-description = "multidict implementation"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"},
- {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"},
- {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"},
- {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"},
- {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"},
- {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"},
- {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"},
- {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"},
- {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"},
- {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"},
- {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"},
- {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"},
- {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"},
- {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"},
- {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"},
- {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"},
- {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"},
- {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"},
- {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"},
- {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"},
- {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"},
- {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"},
- {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"},
- {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"},
- {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"},
- {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"},
- {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"},
- {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"},
- {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"},
- {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"},
- {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"},
- {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"},
- {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"},
- {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"},
- {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"},
- {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"},
- {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"},
- {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"},
- {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"},
- {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"},
- {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"},
- {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"},
- {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"},
- {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"},
- {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"},
- {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"},
- {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"},
- {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"},
- {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"},
- {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"},
- {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"},
- {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"},
- {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"},
- {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"},
- {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"},
- {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"},
- {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"},
- {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"},
- {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"},
- {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"},
- {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"},
- {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"},
- {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"},
- {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"},
- {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"},
- {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"},
- {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"},
- {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"},
- {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"},
- {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"},
- {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"},
- {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"},
- {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"},
- {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"},
-]
-
-[[package]]
-name = "mypy-extensions"
-version = "1.0.0"
-description = "Type system extensions for programs checked with the mypy type checker."
-optional = false
-python-versions = ">=3.5"
-files = [
- {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"},
- {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"},
-]
-
-[[package]]
-name = "numpy"
-version = "1.24.3"
-description = "Fundamental package for array computing in Python"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "numpy-1.24.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3c1104d3c036fb81ab923f507536daedc718d0ad5a8707c6061cdfd6d184e570"},
- {file = "numpy-1.24.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:202de8f38fc4a45a3eea4b63e2f376e5f2dc64ef0fa692838e31a808520efaf7"},
- {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8535303847b89aa6b0f00aa1dc62867b5a32923e4d1681a35b5eef2d9591a463"},
- {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d926b52ba1367f9acb76b0df6ed21f0b16a1ad87c6720a1121674e5cf63e2b6"},
- {file = "numpy-1.24.3-cp310-cp310-win32.whl", hash = "sha256:f21c442fdd2805e91799fbe044a7b999b8571bb0ab0f7850d0cb9641a687092b"},
- {file = "numpy-1.24.3-cp310-cp310-win_amd64.whl", hash = "sha256:ab5f23af8c16022663a652d3b25dcdc272ac3f83c3af4c02eb8b824e6b3ab9d7"},
- {file = "numpy-1.24.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9a7721ec204d3a237225db3e194c25268faf92e19338a35f3a224469cb6039a3"},
- {file = "numpy-1.24.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d6cc757de514c00b24ae8cf5c876af2a7c3df189028d68c0cb4eaa9cd5afc2bf"},
- {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76e3f4e85fc5d4fd311f6e9b794d0c00e7002ec122be271f2019d63376f1d385"},
- {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1d3c026f57ceaad42f8231305d4653d5f05dc6332a730ae5c0bea3513de0950"},
- {file = "numpy-1.24.3-cp311-cp311-win32.whl", hash = "sha256:c91c4afd8abc3908e00a44b2672718905b8611503f7ff87390cc0ac3423fb096"},
- {file = "numpy-1.24.3-cp311-cp311-win_amd64.whl", hash = "sha256:5342cf6aad47943286afa6f1609cad9b4266a05e7f2ec408e2cf7aea7ff69d80"},
- {file = "numpy-1.24.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7776ea65423ca6a15255ba1872d82d207bd1e09f6d0894ee4a64678dd2204078"},
- {file = "numpy-1.24.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ae8d0be48d1b6ed82588934aaaa179875e7dc4f3d84da18d7eae6eb3f06c242c"},
- {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecde0f8adef7dfdec993fd54b0f78183051b6580f606111a6d789cd14c61ea0c"},
- {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4749e053a29364d3452c034827102ee100986903263e89884922ef01a0a6fd2f"},
- {file = "numpy-1.24.3-cp38-cp38-win32.whl", hash = "sha256:d933fabd8f6a319e8530d0de4fcc2e6a61917e0b0c271fded460032db42a0fe4"},
- {file = "numpy-1.24.3-cp38-cp38-win_amd64.whl", hash = "sha256:56e48aec79ae238f6e4395886b5eaed058abb7231fb3361ddd7bfdf4eed54289"},
- {file = "numpy-1.24.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4719d5aefb5189f50887773699eaf94e7d1e02bf36c1a9d353d9f46703758ca4"},
- {file = "numpy-1.24.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ec87a7084caa559c36e0a2309e4ecb1baa03b687201d0a847c8b0ed476a7187"},
- {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea8282b9bcfe2b5e7d491d0bf7f3e2da29700cec05b49e64d6246923329f2b02"},
- {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210461d87fb02a84ef243cac5e814aad2b7f4be953b32cb53327bb49fd77fbb4"},
- {file = "numpy-1.24.3-cp39-cp39-win32.whl", hash = "sha256:784c6da1a07818491b0ffd63c6bbe5a33deaa0e25a20e1b3ea20cf0e43f8046c"},
- {file = "numpy-1.24.3-cp39-cp39-win_amd64.whl", hash = "sha256:d5036197ecae68d7f491fcdb4df90082b0d4960ca6599ba2659957aafced7c17"},
- {file = "numpy-1.24.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:352ee00c7f8387b44d19f4cada524586f07379c0d49270f87233983bc5087ca0"},
- {file = "numpy-1.24.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7d6acc2e7524c9955e5c903160aa4ea083736fde7e91276b0e5d98e6332812"},
- {file = "numpy-1.24.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:35400e6a8d102fd07c71ed7dcadd9eb62ee9a6e84ec159bd48c28235bbb0f8e4"},
- {file = "numpy-1.24.3.tar.gz", hash = "sha256:ab344f1bf21f140adab8e47fdbc7c35a477dc01408791f8ba00d018dd0bc5155"},
-]
-
-[[package]]
-name = "packaging"
-version = "23.1"
-description = "Core utilities for Python packages"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"},
- {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"},
-]
-
-[[package]]
-name = "pillow"
-version = "9.5.0"
-description = "Python Imaging Library (Fork)"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "Pillow-9.5.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16"},
- {file = "Pillow-9.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa"},
- {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38"},
- {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062"},
- {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e"},
- {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5"},
- {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d"},
- {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903"},
- {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a"},
- {file = "Pillow-9.5.0-cp310-cp310-win32.whl", hash = "sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44"},
- {file = "Pillow-9.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb"},
- {file = "Pillow-9.5.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32"},
- {file = "Pillow-9.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c"},
- {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3"},
- {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a"},
- {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1"},
- {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99"},
- {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625"},
- {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579"},
- {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296"},
- {file = "Pillow-9.5.0-cp311-cp311-win32.whl", hash = "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec"},
- {file = "Pillow-9.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4"},
- {file = "Pillow-9.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089"},
- {file = "Pillow-9.5.0-cp312-cp312-win32.whl", hash = "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb"},
- {file = "Pillow-9.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b"},
- {file = "Pillow-9.5.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906"},
- {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf"},
- {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78"},
- {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270"},
- {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392"},
- {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47"},
- {file = "Pillow-9.5.0-cp37-cp37m-win32.whl", hash = "sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7"},
- {file = "Pillow-9.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6"},
- {file = "Pillow-9.5.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597"},
- {file = "Pillow-9.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c"},
- {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a"},
- {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082"},
- {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf"},
- {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf"},
- {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51"},
- {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96"},
- {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f"},
- {file = "Pillow-9.5.0-cp38-cp38-win32.whl", hash = "sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc"},
- {file = "Pillow-9.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569"},
- {file = "Pillow-9.5.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66"},
- {file = "Pillow-9.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e"},
- {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115"},
- {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3"},
- {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef"},
- {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705"},
- {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1"},
- {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a"},
- {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865"},
- {file = "Pillow-9.5.0-cp39-cp39-win32.whl", hash = "sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964"},
- {file = "Pillow-9.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d"},
- {file = "Pillow-9.5.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5"},
- {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140"},
- {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba"},
- {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829"},
- {file = "Pillow-9.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd"},
- {file = "Pillow-9.5.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572"},
- {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe"},
- {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1"},
- {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7"},
- {file = "Pillow-9.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799"},
- {file = "Pillow-9.5.0.tar.gz", hash = "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1"},
-]
-
-[package.extras]
-docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"]
-tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"]
-
-[[package]]
-name = "playwright"
-version = "1.34.0"
-description = "A high-level API to automate web browsers"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "playwright-1.34.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:69bb9b3296e366a23a99277b4c7673cb54ce71a3f5d630f114f7701b61f98f25"},
- {file = "playwright-1.34.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:402d946631c8458436e099d7731bbf54cf79c9e62e3acae0ea8421e72616926b"},
- {file = "playwright-1.34.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:462251cda0fcbb273497d357dbe14b11e43ebceb0bac9b892beda041ff209aa9"},
- {file = "playwright-1.34.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:a8ba124ea302596a03a66993cd500484fb255cbc10fe0757fa4d49f974267a80"},
- {file = "playwright-1.34.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf0cb6aac49d24335fe361868aea72b11f276a95e7809f1a5d1c69b4120c46ac"},
- {file = "playwright-1.34.0-py3-none-win32.whl", hash = "sha256:c50fef189d87243cc09ae0feb8e417fbe434359ccbcc863fb19ba06d46d31c33"},
- {file = "playwright-1.34.0-py3-none-win_amd64.whl", hash = "sha256:42e16c930e1e910461f4c551a72fc1b900f37124431bf2b6a6d9ddae70042db4"},
-]
-
-[package.dependencies]
-greenlet = "2.0.2"
-pyee = "9.0.4"
-
-[[package]]
-name = "pydantic"
-version = "1.10.8"
-description = "Data validation and settings management using python type hints"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "pydantic-1.10.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1243d28e9b05003a89d72e7915fdb26ffd1d39bdd39b00b7dbe4afae4b557f9d"},
- {file = "pydantic-1.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0ab53b609c11dfc0c060d94335993cc2b95b2150e25583bec37a49b2d6c6c3f"},
- {file = "pydantic-1.10.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9613fadad06b4f3bc5db2653ce2f22e0de84a7c6c293909b48f6ed37b83c61f"},
- {file = "pydantic-1.10.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df7800cb1984d8f6e249351139667a8c50a379009271ee6236138a22a0c0f319"},
- {file = "pydantic-1.10.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0c6fafa0965b539d7aab0a673a046466d23b86e4b0e8019d25fd53f4df62c277"},
- {file = "pydantic-1.10.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e82d4566fcd527eae8b244fa952d99f2ca3172b7e97add0b43e2d97ee77f81ab"},
- {file = "pydantic-1.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:ab523c31e22943713d80d8d342d23b6f6ac4b792a1e54064a8d0cf78fd64e800"},
- {file = "pydantic-1.10.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:666bdf6066bf6dbc107b30d034615d2627e2121506c555f73f90b54a463d1f33"},
- {file = "pydantic-1.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:35db5301b82e8661fa9c505c800d0990bc14e9f36f98932bb1d248c0ac5cada5"},
- {file = "pydantic-1.10.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f90c1e29f447557e9e26afb1c4dbf8768a10cc676e3781b6a577841ade126b85"},
- {file = "pydantic-1.10.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93e766b4a8226e0708ef243e843105bf124e21331694367f95f4e3b4a92bbb3f"},
- {file = "pydantic-1.10.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:88f195f582851e8db960b4a94c3e3ad25692c1c1539e2552f3df7a9e972ef60e"},
- {file = "pydantic-1.10.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:34d327c81e68a1ecb52fe9c8d50c8a9b3e90d3c8ad991bfc8f953fb477d42fb4"},
- {file = "pydantic-1.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:d532bf00f381bd6bc62cabc7d1372096b75a33bc197a312b03f5838b4fb84edd"},
- {file = "pydantic-1.10.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7d5b8641c24886d764a74ec541d2fc2c7fb19f6da2a4001e6d580ba4a38f7878"},
- {file = "pydantic-1.10.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b1f6cb446470b7ddf86c2e57cd119a24959af2b01e552f60705910663af09a4"},
- {file = "pydantic-1.10.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c33b60054b2136aef8cf190cd4c52a3daa20b2263917c49adad20eaf381e823b"},
- {file = "pydantic-1.10.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1952526ba40b220b912cdc43c1c32bcf4a58e3f192fa313ee665916b26befb68"},
- {file = "pydantic-1.10.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bb14388ec45a7a0dc429e87def6396f9e73c8c77818c927b6a60706603d5f2ea"},
- {file = "pydantic-1.10.8-cp37-cp37m-win_amd64.whl", hash = "sha256:16f8c3e33af1e9bb16c7a91fc7d5fa9fe27298e9f299cff6cb744d89d573d62c"},
- {file = "pydantic-1.10.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1ced8375969673929809d7f36ad322934c35de4af3b5e5b09ec967c21f9f7887"},
- {file = "pydantic-1.10.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:93e6bcfccbd831894a6a434b0aeb1947f9e70b7468f274154d03d71fabb1d7c6"},
- {file = "pydantic-1.10.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:191ba419b605f897ede9892f6c56fb182f40a15d309ef0142212200a10af4c18"},
- {file = "pydantic-1.10.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:052d8654cb65174d6f9490cc9b9a200083a82cf5c3c5d3985db765757eb3b375"},
- {file = "pydantic-1.10.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ceb6a23bf1ba4b837d0cfe378329ad3f351b5897c8d4914ce95b85fba96da5a1"},
- {file = "pydantic-1.10.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f2e754d5566f050954727c77f094e01793bcb5725b663bf628fa6743a5a9108"},
- {file = "pydantic-1.10.8-cp38-cp38-win_amd64.whl", hash = "sha256:6a82d6cda82258efca32b40040228ecf43a548671cb174a1e81477195ed3ed56"},
- {file = "pydantic-1.10.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e59417ba8a17265e632af99cc5f35ec309de5980c440c255ab1ca3ae96a3e0e"},
- {file = "pydantic-1.10.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:84d80219c3f8d4cad44575e18404099c76851bc924ce5ab1c4c8bb5e2a2227d0"},
- {file = "pydantic-1.10.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e4148e635994d57d834be1182a44bdb07dd867fa3c2d1b37002000646cc5459"},
- {file = "pydantic-1.10.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12f7b0bf8553e310e530e9f3a2f5734c68699f42218bf3568ef49cd9b0e44df4"},
- {file = "pydantic-1.10.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:42aa0c4b5c3025483240a25b09f3c09a189481ddda2ea3a831a9d25f444e03c1"},
- {file = "pydantic-1.10.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17aef11cc1b997f9d574b91909fed40761e13fac438d72b81f902226a69dac01"},
- {file = "pydantic-1.10.8-cp39-cp39-win_amd64.whl", hash = "sha256:66a703d1983c675a6e0fed8953b0971c44dba48a929a2000a493c3772eb61a5a"},
- {file = "pydantic-1.10.8-py3-none-any.whl", hash = "sha256:7456eb22ed9aaa24ff3e7b4757da20d9e5ce2a81018c1b3ebd81a0b88a18f3b2"},
- {file = "pydantic-1.10.8.tar.gz", hash = "sha256:1410275520dfa70effadf4c21811d755e7ef9bb1f1d077a21958153a92c8d9ca"},
-]
-
-[package.dependencies]
-typing-extensions = ">=4.2.0"
-
-[package.extras]
-dotenv = ["python-dotenv (>=0.10.4)"]
-email = ["email-validator (>=1.0.3)"]
-
-[[package]]
-name = "pyee"
-version = "9.0.4"
-description = "A port of node.js's EventEmitter to python."
-optional = false
-python-versions = "*"
-files = [
- {file = "pyee-9.0.4-py2.py3-none-any.whl", hash = "sha256:9f066570130c554e9cc12de5a9d86f57c7ee47fece163bbdaa3e9c933cfbdfa5"},
- {file = "pyee-9.0.4.tar.gz", hash = "sha256:2770c4928abc721f46b705e6a72b0c59480c4a69c9a83ca0b00bb994f1ea4b32"},
-]
-
-[package.dependencies]
-typing-extensions = "*"
-
-[[package]]
-name = "pygments"
-version = "2.15.1"
-description = "Pygments is a syntax highlighting package written in Python."
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"},
- {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"},
-]
-
-[package.extras]
-plugins = ["importlib-metadata"]
-
-[[package]]
-name = "pyparsing"
-version = "3.0.9"
-description = "pyparsing module - Classes and methods to define and execute parsing grammars"
-optional = false
-python-versions = ">=3.6.8"
-files = [
- {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"},
- {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"},
-]
-
-[package.extras]
-diagrams = ["jinja2", "railroad-diagrams"]
-
-[[package]]
-name = "python-dateutil"
-version = "2.8.2"
-description = "Extensions to the standard Python datetime module"
-optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
-files = [
- {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"},
- {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"},
-]
-
-[package.dependencies]
-six = ">=1.5"
-
-[[package]]
-name = "python-dotenv"
-version = "1.0.0"
-description = "Read key-value pairs from a .env file and set them as environment variables"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "python-dotenv-1.0.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"},
- {file = "python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"},
-]
-
-[package.extras]
-cli = ["click (>=5.0)"]
-
-[[package]]
-name = "pyyaml"
-version = "6.0"
-description = "YAML parser and emitter for Python"
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"},
- {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"},
- {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"},
- {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"},
- {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"},
- {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"},
- {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"},
- {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"},
- {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"},
- {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"},
- {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"},
- {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"},
- {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"},
- {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"},
- {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"},
- {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"},
- {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"},
- {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"},
- {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"},
- {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"},
- {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"},
- {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"},
- {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"},
- {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"},
- {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"},
- {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"},
- {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"},
- {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"},
- {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"},
- {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"},
- {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"},
- {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"},
- {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"},
- {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"},
- {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"},
- {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"},
- {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"},
- {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"},
- {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"},
- {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"},
-]
-
-[[package]]
-name = "reactpy"
-version = "1.0.0"
-description = "Reactive user interfaces with pure Python"
-optional = false
-python-versions = ">=3.9"
-files = []
-develop = false
-
-[package.dependencies]
-anyio = ">=3"
-asgiref = ">=3"
-colorlog = ">=6"
-fastapi = {version = ">=0.63.0", optional = true, markers = "extra == \"fastapi\""}
-fastjsonschema = ">=2.14.5"
-flask = {version = "*", optional = true, markers = "extra == \"flask\""}
-flask-cors = {version = "*", optional = true, markers = "extra == \"flask\""}
-flask-sock = {version = "*", optional = true, markers = "extra == \"flask\""}
-jsonpatch = ">=1.32"
-lxml = ">=4"
-markupsafe = {version = ">=1.1.1,<2.1", optional = true, markers = "extra == \"flask\""}
-mypy-extensions = ">=0.4.3"
-playwright = {version = "*", optional = true, markers = "extra == \"testing\""}
-requests = ">=2"
-sanic = {version = ">=21", optional = true, markers = "extra == \"sanic\""}
-sanic-cors = {version = "*", optional = true, markers = "extra == \"sanic\""}
-starlette = {version = ">=0.13.6", optional = true, markers = "extra == \"starlette\""}
-tornado = {version = "*", optional = true, markers = "extra == \"tornado\""}
-typing-extensions = ">=3.10"
-uvicorn = {version = ">=0.19.0", extras = ["standard"], optional = true, markers = "extra == \"fastapi\" or extra == \"sanic\" or extra == \"starlette\""}
-
-[package.extras]
-all = ["reactpy[fastapi,flask,sanic,starlette,testing,tornado]"]
-fastapi = ["fastapi (>=0.63.0)", "uvicorn[standard] (>=0.19.0)"]
-flask = ["flask", "flask-cors", "flask-sock", "markupsafe (>=1.1.1,<2.1)"]
-sanic = ["sanic (>=21)", "sanic-cors", "uvicorn[standard] (>=0.19.0)"]
-starlette = ["starlette (>=0.13.6)", "uvicorn[standard] (>=0.19.0)"]
-testing = ["playwright"]
-tornado = ["tornado"]
-
-[package.source]
-type = "directory"
-url = "../src/py/reactpy"
-
-[[package]]
-name = "requests"
-version = "2.31.0"
-description = "Python HTTP for Humans."
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"},
- {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"},
-]
-
-[package.dependencies]
-certifi = ">=2017.4.17"
-charset-normalizer = ">=2,<4"
-idna = ">=2.5,<4"
-urllib3 = ">=1.21.1,<3"
-
-[package.extras]
-socks = ["PySocks (>=1.5.6,!=1.5.7)"]
-use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
-
-[[package]]
-name = "sanic"
-version = "23.3.0"
-description = "A web server and web framework that's written to go fast. Build fast. Run fast."
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "sanic-23.3.0-py3-none-any.whl", hash = "sha256:7cafbd63da9c6c6d8aeb8cb4304addf8a274352ab812014386c63e55f474fbee"},
- {file = "sanic-23.3.0.tar.gz", hash = "sha256:b80ebc5c38c983cb45ae5ecc7a669a54c823ec1dff297fbd5f817b1e9e9e49af"},
-]
-
-[package.dependencies]
-aiofiles = ">=0.6.0"
-html5tagger = ">=1.2.1"
-httptools = ">=0.0.10"
-multidict = ">=5.0,<7.0"
-sanic-routing = ">=22.8.0"
-tracerite = ">=1.0.0"
-ujson = {version = ">=1.35", markers = "sys_platform != \"win32\" and implementation_name == \"cpython\""}
-uvloop = {version = ">=0.15.0", markers = "sys_platform != \"win32\" and implementation_name == \"cpython\""}
-websockets = ">=10.0"
-
-[package.extras]
-all = ["bandit", "beautifulsoup4", "black", "chardet (==3.*)", "coverage", "cryptography", "docutils", "enum-tools[sphinx]", "flake8", "isort (>=5.0.0)", "m2r2", "mistune (<2.0.0)", "mypy (>=0.901,<0.910)", "pygments", "pytest (==7.1.*)", "pytest-benchmark", "pytest-sanic", "sanic-testing (>=23.3.0)", "slotscheck (>=0.8.0,<1)", "sphinx (>=2.1.2)", "sphinx-rtd-theme (>=0.4.3)", "towncrier", "tox", "types-ujson", "uvicorn (<0.15.0)"]
-dev = ["bandit", "beautifulsoup4", "black", "chardet (==3.*)", "coverage", "cryptography", "docutils", "flake8", "isort (>=5.0.0)", "mypy (>=0.901,<0.910)", "pygments", "pytest (==7.1.*)", "pytest-benchmark", "pytest-sanic", "sanic-testing (>=23.3.0)", "slotscheck (>=0.8.0,<1)", "towncrier", "tox", "types-ujson", "uvicorn (<0.15.0)"]
-docs = ["docutils", "enum-tools[sphinx]", "m2r2", "mistune (<2.0.0)", "pygments", "sphinx (>=2.1.2)", "sphinx-rtd-theme (>=0.4.3)"]
-ext = ["sanic-ext"]
-http3 = ["aioquic"]
-test = ["bandit", "beautifulsoup4", "black", "chardet (==3.*)", "coverage", "docutils", "flake8", "isort (>=5.0.0)", "mypy (>=0.901,<0.910)", "pygments", "pytest (==7.1.*)", "pytest-benchmark", "pytest-sanic", "sanic-testing (>=23.3.0)", "slotscheck (>=0.8.0,<1)", "types-ujson", "uvicorn (<0.15.0)"]
-
-[[package]]
-name = "sanic-cors"
-version = "2.2.0"
-description = "A Sanic extension adding a decorator for CORS support. Based on flask-cors by Cory Dolphin."
-optional = false
-python-versions = "*"
-files = [
- {file = "Sanic-Cors-2.2.0.tar.gz", hash = "sha256:f8d7515da4c8b837871d422c66314c4b5704396a78894b59c50e26aa72a95873"},
- {file = "Sanic_Cors-2.2.0-py2.py3-none-any.whl", hash = "sha256:c3b133ff1f0bb609a53db35f727f5c371dc4ebeb6be4cc2c37c19dd8b9301115"},
-]
-
-[package.dependencies]
-packaging = ">=21.3"
-sanic = ">=21.9.3"
-
-[[package]]
-name = "sanic-routing"
-version = "22.8.0"
-description = "Core routing component for Sanic"
-optional = false
-python-versions = "*"
-files = [
- {file = "sanic-routing-22.8.0.tar.gz", hash = "sha256:305729b4e0bf01f074044a2a315ff401fa7eeffb009eec1d2c81d35e1038ddfc"},
- {file = "sanic_routing-22.8.0-py3-none-any.whl", hash = "sha256:9a928ed9e19a36bc019223be90a5da0ab88cdd76b101e032510b6a7073c017e9"},
-]
-
-[[package]]
-name = "simple-websocket"
-version = "0.10.0"
-description = "Simple WebSocket server and client for Python"
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "simple-websocket-0.10.0.tar.gz", hash = "sha256:82c0b0b1006d5490f09ff66392394d90dd758285635edad241e093e9a8abd3eb"},
- {file = "simple_websocket-0.10.0-py3-none-any.whl", hash = "sha256:fc1bc56c393a187e7268f8ab99da1a8e8da9b5dfb7769a2f3b8dada00067745b"},
-]
-
-[package.dependencies]
-wsproto = "*"
-
-[[package]]
-name = "six"
-version = "1.16.0"
-description = "Python 2 and 3 compatibility utilities"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
-files = [
- {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
- {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
-]
-
-[[package]]
-name = "sniffio"
-version = "1.3.0"
-description = "Sniff out which async library your code is running under"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"},
- {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"},
-]
-
-[[package]]
-name = "snowballstemmer"
-version = "2.2.0"
-description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms."
-optional = false
-python-versions = "*"
-files = [
- {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"},
- {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"},
-]
-
-[[package]]
-name = "soupsieve"
-version = "2.4.1"
-description = "A modern CSS selector implementation for Beautiful Soup."
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "soupsieve-2.4.1-py3-none-any.whl", hash = "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8"},
- {file = "soupsieve-2.4.1.tar.gz", hash = "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea"},
-]
-
-[[package]]
-name = "sphinx"
-version = "4.5.0"
-description = "Python documentation generator"
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "Sphinx-4.5.0-py3-none-any.whl", hash = "sha256:ebf612653238bcc8f4359627a9b7ce44ede6fdd75d9d30f68255c7383d3a6226"},
- {file = "Sphinx-4.5.0.tar.gz", hash = "sha256:7bf8ca9637a4ee15af412d1a1d9689fec70523a68ca9bb9127c2f3eeb344e2e6"},
-]
-
-[package.dependencies]
-alabaster = ">=0.7,<0.8"
-babel = ">=1.3"
-colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""}
-docutils = ">=0.14,<0.18"
-imagesize = "*"
-importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""}
-Jinja2 = ">=2.3"
-packaging = "*"
-Pygments = ">=2.0"
-requests = ">=2.5.0"
-snowballstemmer = ">=1.1"
-sphinxcontrib-applehelp = "*"
-sphinxcontrib-devhelp = "*"
-sphinxcontrib-htmlhelp = ">=2.0.0"
-sphinxcontrib-jsmath = "*"
-sphinxcontrib-qthelp = "*"
-sphinxcontrib-serializinghtml = ">=1.1.5"
-
-[package.extras]
-docs = ["sphinxcontrib-websupport"]
-lint = ["docutils-stubs", "flake8 (>=3.5.0)", "isort", "mypy (>=0.931)", "types-requests", "types-typed-ast"]
-test = ["cython", "html5lib", "pytest", "pytest-cov", "typed-ast"]
-
-[[package]]
-name = "sphinx-autobuild"
-version = "2021.3.14"
-description = "Rebuild Sphinx documentation on changes, with live-reload in the browser."
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "sphinx-autobuild-2021.3.14.tar.gz", hash = "sha256:de1ca3b66e271d2b5b5140c35034c89e47f263f2cd5db302c9217065f7443f05"},
- {file = "sphinx_autobuild-2021.3.14-py3-none-any.whl", hash = "sha256:8fe8cbfdb75db04475232f05187c776f46f6e9e04cacf1e49ce81bdac649ccac"},
-]
-
-[package.dependencies]
-colorama = "*"
-livereload = "*"
-sphinx = "*"
-
-[package.extras]
-test = ["pytest", "pytest-cov"]
-
-[[package]]
-name = "sphinx-autodoc-typehints"
-version = "1.19.1"
-description = "Type hints (PEP 484) support for the Sphinx autodoc extension"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "sphinx_autodoc_typehints-1.19.1-py3-none-any.whl", hash = "sha256:9be46aeeb1b315eb5df1f3a7cb262149895d16c7d7dcd77b92513c3c3a1e85e6"},
- {file = "sphinx_autodoc_typehints-1.19.1.tar.gz", hash = "sha256:6c841db55e0e9be0483ff3962a2152b60e79306f4288d8c4e7e86ac84486a5ea"},
-]
-
-[package.dependencies]
-Sphinx = ">=4.5"
-
-[package.extras]
-testing = ["covdefaults (>=2.2)", "coverage (>=6.3)", "diff-cover (>=6.4)", "nptyping (>=2.1.2)", "pytest (>=7.1)", "pytest-cov (>=3)", "sphobjinv (>=2)", "typing-extensions (>=4.1)"]
-type-comments = ["typed-ast (>=1.5.2)"]
-
-[[package]]
-name = "sphinx-copybutton"
-version = "0.5.2"
-description = "Add a copy button to each of your code cells."
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd"},
- {file = "sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e"},
-]
-
-[package.dependencies]
-sphinx = ">=1.8"
-
-[package.extras]
-code-style = ["pre-commit (==2.12.1)"]
-rtd = ["ipython", "myst-nb", "sphinx", "sphinx-book-theme", "sphinx-examples"]
-
-[[package]]
-name = "sphinx-design"
-version = "0.4.1"
-description = "A sphinx extension for designing beautiful, view size responsive web components."
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "sphinx_design-0.4.1-py3-none-any.whl", hash = "sha256:23bf5705eb31296d4451f68b0222a698a8a84396ffe8378dfd9319ba7ab8efd9"},
- {file = "sphinx_design-0.4.1.tar.gz", hash = "sha256:5b6418ba4a2dc3d83592ea0ff61a52a891fe72195a4c3a18b2fa1c7668ce4708"},
-]
-
-[package.dependencies]
-sphinx = ">=4,<7"
-
-[package.extras]
-code-style = ["pre-commit (>=2.12,<3.0)"]
-rtd = ["myst-parser (>=0.18.0,<2)"]
-testing = ["myst-parser (>=0.18.0,<2)", "pytest (>=7.1,<8.0)", "pytest-cov", "pytest-regressions"]
-theme-furo = ["furo (>=2022.06.04,<2022.07)"]
-theme-pydata = ["pydata-sphinx-theme (>=0.9.0,<0.10.0)"]
-theme-rtd = ["sphinx-rtd-theme (>=1.0,<2.0)"]
-theme-sbt = ["sphinx-book-theme (>=0.3.0,<0.4.0)"]
-
-[[package]]
-name = "sphinx-reredirects"
-version = "0.1.2"
-description = "Handles redirects for moved pages in Sphinx documentation projects"
-optional = false
-python-versions = ">=3.5"
-files = [
- {file = "sphinx_reredirects-0.1.2-py3-none-any.whl", hash = "sha256:3a22161771aadd448bb608a4fe7277252182a337af53c18372b7104531d71489"},
- {file = "sphinx_reredirects-0.1.2.tar.gz", hash = "sha256:a0e7213304759b01edc22f032f1715a1c61176fc8f167164e7a52b9feec9ac64"},
-]
-
-[package.dependencies]
-sphinx = "*"
-
-[[package]]
-name = "sphinx-resolve-py-references"
-version = "0.1.0"
-description = "Better python object resolution in Sphinx"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "sphinx_resolve_py_references-0.1.0-py2.py3-none-any.whl", hash = "sha256:ccf44a6b62d75c3a568285f4e1815734088c1a7cab7bbb7935bb22fbf0d78bc2"},
- {file = "sphinx_resolve_py_references-0.1.0.tar.gz", hash = "sha256:0f87c06b29ec128964aee2e40d170d1d3c0e5f4955b2618a89ca724f42385372"},
-]
-
-[package.dependencies]
-sphinx = "*"
-
-[[package]]
-name = "sphinxcontrib-applehelp"
-version = "1.0.4"
-description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "sphinxcontrib-applehelp-1.0.4.tar.gz", hash = "sha256:828f867945bbe39817c210a1abfd1bc4895c8b73fcaade56d45357a348a07d7e"},
- {file = "sphinxcontrib_applehelp-1.0.4-py3-none-any.whl", hash = "sha256:29d341f67fb0f6f586b23ad80e072c8e6ad0b48417db2bde114a4c9746feb228"},
-]
-
-[package.extras]
-lint = ["docutils-stubs", "flake8", "mypy"]
-test = ["pytest"]
-
-[[package]]
-name = "sphinxcontrib-devhelp"
-version = "1.0.2"
-description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document."
-optional = false
-python-versions = ">=3.5"
-files = [
- {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"},
- {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"},
-]
-
-[package.extras]
-lint = ["docutils-stubs", "flake8", "mypy"]
-test = ["pytest"]
-
-[[package]]
-name = "sphinxcontrib-htmlhelp"
-version = "2.0.1"
-description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "sphinxcontrib-htmlhelp-2.0.1.tar.gz", hash = "sha256:0cbdd302815330058422b98a113195c9249825d681e18f11e8b1f78a2f11efff"},
- {file = "sphinxcontrib_htmlhelp-2.0.1-py3-none-any.whl", hash = "sha256:c38cb46dccf316c79de6e5515e1770414b797162b23cd3d06e67020e1d2a6903"},
-]
-
-[package.extras]
-lint = ["docutils-stubs", "flake8", "mypy"]
-test = ["html5lib", "pytest"]
-
-[[package]]
-name = "sphinxcontrib-jsmath"
-version = "1.0.1"
-description = "A sphinx extension which renders display math in HTML via JavaScript"
-optional = false
-python-versions = ">=3.5"
-files = [
- {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"},
- {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"},
-]
-
-[package.extras]
-test = ["flake8", "mypy", "pytest"]
-
-[[package]]
-name = "sphinxcontrib-qthelp"
-version = "1.0.3"
-description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document."
-optional = false
-python-versions = ">=3.5"
-files = [
- {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"},
- {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"},
-]
-
-[package.extras]
-lint = ["docutils-stubs", "flake8", "mypy"]
-test = ["pytest"]
-
-[[package]]
-name = "sphinxcontrib-serializinghtml"
-version = "1.1.5"
-description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)."
-optional = false
-python-versions = ">=3.5"
-files = [
- {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"},
- {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"},
-]
-
-[package.extras]
-lint = ["docutils-stubs", "flake8", "mypy"]
-test = ["pytest"]
-
-[[package]]
-name = "sphinxext-opengraph"
-version = "0.8.2"
-description = "Sphinx Extension to enable OGP support"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "sphinxext-opengraph-0.8.2.tar.gz", hash = "sha256:45a693b6704052c426576f0a1f630649c55b4188bc49eb63e9587e24a923db39"},
- {file = "sphinxext_opengraph-0.8.2-py3-none-any.whl", hash = "sha256:6a05bdfe5176d9dd0a1d58a504f17118362ab976631213cd36fb44c4c40544c9"},
-]
-
-[package.dependencies]
-matplotlib = "*"
-sphinx = ">=4.0"
-
-[[package]]
-name = "starlette"
-version = "0.27.0"
-description = "The little ASGI library that shines."
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "starlette-0.27.0-py3-none-any.whl", hash = "sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91"},
- {file = "starlette-0.27.0.tar.gz", hash = "sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75"},
-]
-
-[package.dependencies]
-anyio = ">=3.4.0,<5"
-typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""}
-
-[package.extras]
-full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"]
-
-[[package]]
-name = "tornado"
-version = "6.3.2"
-description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed."
-optional = false
-python-versions = ">= 3.8"
-files = [
- {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:c367ab6c0393d71171123ca5515c61ff62fe09024fa6bf299cd1339dc9456829"},
- {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b46a6ab20f5c7c1cb949c72c1994a4585d2eaa0be4853f50a03b5031e964fc7c"},
- {file = "tornado-6.3.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2de14066c4a38b4ecbbcd55c5cc4b5340eb04f1c5e81da7451ef555859c833f"},
- {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05615096845cf50a895026f749195bf0b10b8909f9be672f50b0fe69cba368e4"},
- {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b17b1cf5f8354efa3d37c6e28fdfd9c1c1e5122f2cb56dac121ac61baa47cbe"},
- {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:29e71c847a35f6e10ca3b5c2990a52ce38b233019d8e858b755ea6ce4dcdd19d"},
- {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:834ae7540ad3a83199a8da8f9f2d383e3c3d5130a328889e4cc991acc81e87a0"},
- {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6a0848f1aea0d196a7c4f6772197cbe2abc4266f836b0aac76947872cd29b411"},
- {file = "tornado-6.3.2-cp38-abi3-win32.whl", hash = "sha256:7efcbcc30b7c654eb6a8c9c9da787a851c18f8ccd4a5a3a95b05c7accfa068d2"},
- {file = "tornado-6.3.2-cp38-abi3-win_amd64.whl", hash = "sha256:0c325e66c8123c606eea33084976c832aa4e766b7dff8aedd7587ea44a604cdf"},
- {file = "tornado-6.3.2.tar.gz", hash = "sha256:4b927c4f19b71e627b13f3db2324e4ae660527143f9e1f2e2fb404f3a187e2ba"},
-]
-
-[[package]]
-name = "tracerite"
-version = "1.1.0"
-description = "Human-readable HTML tracebacks for Python exceptions"
-optional = false
-python-versions = "*"
-files = [
- {file = "tracerite-1.1.0-py3-none-any.whl", hash = "sha256:4cccac04db05eeeabda45e72b57199e147fa2f73cf64d89cfd625df321bd2ab6"},
- {file = "tracerite-1.1.0.tar.gz", hash = "sha256:041dab8fd4bb405f73506293ac7438a2d311e5f9044378ba7d9a6540392f9e4b"},
-]
-
-[package.dependencies]
-html5tagger = ">=1.2.1"
-
-[[package]]
-name = "typing-extensions"
-version = "4.6.3"
-description = "Backported and Experimental Type Hints for Python 3.7+"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "typing_extensions-4.6.3-py3-none-any.whl", hash = "sha256:88a4153d8505aabbb4e13aacb7c486c2b4a33ca3b3f807914a9b4c844c471c26"},
- {file = "typing_extensions-4.6.3.tar.gz", hash = "sha256:d91d5919357fe7f681a9f2b5b4cb2a5f1ef0a1e9f59c4d8ff0d3491e05c0ffd5"},
-]
-
-[[package]]
-name = "ujson"
-version = "5.7.0"
-description = "Ultra fast JSON encoder and decoder for Python"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "ujson-5.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5eba5e69e4361ac3a311cf44fa71bc619361b6e0626768a494771aacd1c2f09b"},
- {file = "ujson-5.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aae4d9e1b4c7b61780f0a006c897a4a1904f862fdab1abb3ea8f45bd11aa58f3"},
- {file = "ujson-5.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2e43ccdba1cb5c6d3448eadf6fc0dae7be6c77e357a3abc968d1b44e265866d"},
- {file = "ujson-5.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54384ce4920a6d35fa9ea8e580bc6d359e3eb961fa7e43f46c78e3ed162d56ff"},
- {file = "ujson-5.7.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24ad1aa7fc4e4caa41d3d343512ce68e41411fb92adf7f434a4d4b3749dc8f58"},
- {file = "ujson-5.7.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:afff311e9f065a8f03c3753db7011bae7beb73a66189c7ea5fcb0456b7041ea4"},
- {file = "ujson-5.7.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e80f0d03e7e8646fc3d79ed2d875cebd4c83846e129737fdc4c2532dbd43d9e"},
- {file = "ujson-5.7.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:137831d8a0db302fb6828ee21c67ad63ac537bddc4376e1aab1c8573756ee21c"},
- {file = "ujson-5.7.0-cp310-cp310-win32.whl", hash = "sha256:7df3fd35ebc14dafeea031038a99232b32f53fa4c3ecddb8bed132a43eefb8ad"},
- {file = "ujson-5.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:af4639f684f425177d09ae409c07602c4096a6287027469157bfb6f83e01448b"},
- {file = "ujson-5.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9b0f2680ce8a70f77f5d70aaf3f013d53e6af6d7058727a35d8ceb4a71cdd4e9"},
- {file = "ujson-5.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:67a19fd8e7d8cc58a169bea99fed5666023adf707a536d8f7b0a3c51dd498abf"},
- {file = "ujson-5.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6abb8e6d8f1ae72f0ed18287245f5b6d40094e2656d1eab6d99d666361514074"},
- {file = "ujson-5.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8cd622c069368d5074bd93817b31bdb02f8d818e57c29e206f10a1f9c6337dd"},
- {file = "ujson-5.7.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14f9082669f90e18e64792b3fd0bf19f2b15e7fe467534a35ea4b53f3bf4b755"},
- {file = "ujson-5.7.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d7ff6ebb43bc81b057724e89550b13c9a30eda0f29c2f506f8b009895438f5a6"},
- {file = "ujson-5.7.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f7f241488879d91a136b299e0c4ce091996c684a53775e63bb442d1a8e9ae22a"},
- {file = "ujson-5.7.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5593263a7fcfb934107444bcfba9dde8145b282de0ee9f61e285e59a916dda0f"},
- {file = "ujson-5.7.0-cp311-cp311-win32.whl", hash = "sha256:26c2b32b489c393106e9cb68d0a02e1a7b9d05a07429d875c46b94ee8405bdb7"},
- {file = "ujson-5.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:ed24406454bb5a31df18f0a423ae14beb27b28cdfa34f6268e7ebddf23da807e"},
- {file = "ujson-5.7.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:18679484e3bf9926342b1c43a3bd640f93a9eeeba19ef3d21993af7b0c44785d"},
- {file = "ujson-5.7.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ee295761e1c6c30400641f0a20d381633d7622633cdf83a194f3c876a0e4b7e"},
- {file = "ujson-5.7.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b738282e12a05f400b291966630a98d622da0938caa4bc93cf65adb5f4281c60"},
- {file = "ujson-5.7.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00343501dbaa5172e78ef0e37f9ebd08040110e11c12420ff7c1f9f0332d939e"},
- {file = "ujson-5.7.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c0d1f7c3908357ee100aa64c4d1cf91edf99c40ac0069422a4fd5fd23b263263"},
- {file = "ujson-5.7.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a5d2f44331cf04689eafac7a6596c71d6657967c07ac700b0ae1c921178645da"},
- {file = "ujson-5.7.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:16b2254a77b310f118717715259a196662baa6b1f63b1a642d12ab1ff998c3d7"},
- {file = "ujson-5.7.0-cp37-cp37m-win32.whl", hash = "sha256:6faf46fa100b2b89e4db47206cf8a1ffb41542cdd34dde615b2fc2288954f194"},
- {file = "ujson-5.7.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ff0004c3f5a9a6574689a553d1b7819d1a496b4f005a7451f339dc2d9f4cf98c"},
- {file = "ujson-5.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:75204a1dd7ec6158c8db85a2f14a68d2143503f4bafb9a00b63fe09d35762a5e"},
- {file = "ujson-5.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7312731c7826e6c99cdd3ac503cd9acd300598e7a80bcf41f604fee5f49f566c"},
- {file = "ujson-5.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b9dc5a90e2149643df7f23634fe202fed5ebc787a2a1be95cf23632b4d90651"},
- {file = "ujson-5.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6a6961fc48821d84b1198a09516e396d56551e910d489692126e90bf4887d29"},
- {file = "ujson-5.7.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b01a9af52a0d5c46b2c68e3f258fdef2eacaa0ce6ae3e9eb97983f5b1166edb6"},
- {file = "ujson-5.7.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7316d3edeba8a403686cdcad4af737b8415493101e7462a70ff73dd0609eafc"},
- {file = "ujson-5.7.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4ee997799a23227e2319a3f8817ce0b058923dbd31904761b788dc8f53bd3e30"},
- {file = "ujson-5.7.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dda9aa4c33435147262cd2ea87c6b7a1ca83ba9b3933ff7df34e69fee9fced0c"},
- {file = "ujson-5.7.0-cp38-cp38-win32.whl", hash = "sha256:bea8d30e362180aafecabbdcbe0e1f0b32c9fa9e39c38e4af037b9d3ca36f50c"},
- {file = "ujson-5.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:c96e3b872bf883090ddf32cc41957edf819c5336ab0007d0cf3854e61841726d"},
- {file = "ujson-5.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6411aea4c94a8e93c2baac096fbf697af35ba2b2ed410b8b360b3c0957a952d3"},
- {file = "ujson-5.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d3b3499c55911f70d4e074c626acdb79a56f54262c3c83325ffb210fb03e44d"},
- {file = "ujson-5.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:341f891d45dd3814d31764626c55d7ab3fd21af61fbc99d070e9c10c1190680b"},
- {file = "ujson-5.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f242eec917bafdc3f73a1021617db85f9958df80f267db69c76d766058f7b19"},
- {file = "ujson-5.7.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3af9f9f22a67a8c9466a32115d9073c72a33ae627b11de6f592df0ee09b98b6"},
- {file = "ujson-5.7.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4a3d794afbf134df3056a813e5c8a935208cddeae975bd4bc0ef7e89c52f0ce0"},
- {file = "ujson-5.7.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:800bf998e78dae655008dd10b22ca8dc93bdcfcc82f620d754a411592da4bbf2"},
- {file = "ujson-5.7.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b5ac3d5c5825e30b438ea92845380e812a476d6c2a1872b76026f2e9d8060fc2"},
- {file = "ujson-5.7.0-cp39-cp39-win32.whl", hash = "sha256:cd90027e6d93e8982f7d0d23acf88c896d18deff1903dd96140613389b25c0dd"},
- {file = "ujson-5.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:523ee146cdb2122bbd827f4dcc2a8e66607b3f665186bce9e4f78c9710b6d8ab"},
- {file = "ujson-5.7.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e87cec407ec004cf1b04c0ed7219a68c12860123dfb8902ef880d3d87a71c172"},
- {file = "ujson-5.7.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bab10165db6a7994e67001733f7f2caf3400b3e11538409d8756bc9b1c64f7e8"},
- {file = "ujson-5.7.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b522be14a28e6ac1cf818599aeff1004a28b42df4ed4d7bc819887b9dac915fc"},
- {file = "ujson-5.7.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7592f40175c723c032cdbe9fe5165b3b5903604f774ab0849363386e99e1f253"},
- {file = "ujson-5.7.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ed22f9665327a981f288a4f758a432824dc0314e4195a0eaeb0da56a477da94d"},
- {file = "ujson-5.7.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:adf445a49d9a97a5a4c9bb1d652a1528de09dd1c48b29f79f3d66cea9f826bf6"},
- {file = "ujson-5.7.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64772a53f3c4b6122ed930ae145184ebaed38534c60f3d859d8c3f00911eb122"},
- {file = "ujson-5.7.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35209cb2c13fcb9d76d249286105b4897b75a5e7f0efb0c0f4b90f222ce48910"},
- {file = "ujson-5.7.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90712dfc775b2c7a07d4d8e059dd58636bd6ff1776d79857776152e693bddea6"},
- {file = "ujson-5.7.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:0e4e8981c6e7e9e637e637ad8ffe948a09e5434bc5f52ecbb82b4b4cfc092bfb"},
- {file = "ujson-5.7.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:581c945b811a3d67c27566539bfcb9705ea09cb27c4be0002f7a553c8886b817"},
- {file = "ujson-5.7.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d36a807a24c7d44f71686685ae6fbc8793d784bca1adf4c89f5f780b835b6243"},
- {file = "ujson-5.7.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b4257307e3662aa65e2644a277ca68783c5d51190ed9c49efebdd3cbfd5fa44"},
- {file = "ujson-5.7.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea7423d8a2f9e160c5e011119741682414c5b8dce4ae56590a966316a07a4618"},
- {file = "ujson-5.7.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4c592eb91a5968058a561d358d0fef59099ed152cfb3e1cd14eee51a7a93879e"},
- {file = "ujson-5.7.0.tar.gz", hash = "sha256:e788e5d5dcae8f6118ac9b45d0b891a0d55f7ac480eddcb7f07263f2bcf37b23"},
-]
-
-[[package]]
-name = "urllib3"
-version = "2.0.2"
-description = "HTTP library with thread-safe connection pooling, file post, and more."
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "urllib3-2.0.2-py3-none-any.whl", hash = "sha256:d055c2f9d38dc53c808f6fdc8eab7360b6fdbbde02340ed25cfbcd817c62469e"},
- {file = "urllib3-2.0.2.tar.gz", hash = "sha256:61717a1095d7e155cdb737ac7bb2f4324a858a1e2e6466f6d03ff630ca68d3cc"},
-]
-
-[package.extras]
-brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"]
-secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"]
-socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"]
-zstd = ["zstandard (>=0.18.0)"]
-
-[[package]]
-name = "uvicorn"
-version = "0.22.0"
-description = "The lightning-fast ASGI server."
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "uvicorn-0.22.0-py3-none-any.whl", hash = "sha256:e9434d3bbf05f310e762147f769c9f21235ee118ba2d2bf1155a7196448bd996"},
- {file = "uvicorn-0.22.0.tar.gz", hash = "sha256:79277ae03db57ce7d9aa0567830bbb51d7a612f54d6e1e3e92da3ef24c2c8ed8"},
-]
-
-[package.dependencies]
-click = ">=7.0"
-colorama = {version = ">=0.4", optional = true, markers = "sys_platform == \"win32\" and extra == \"standard\""}
-h11 = ">=0.8"
-httptools = {version = ">=0.5.0", optional = true, markers = "extra == \"standard\""}
-python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"standard\""}
-pyyaml = {version = ">=5.1", optional = true, markers = "extra == \"standard\""}
-uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "(sys_platform != \"win32\" and sys_platform != \"cygwin\") and platform_python_implementation != \"PyPy\" and extra == \"standard\""}
-watchfiles = {version = ">=0.13", optional = true, markers = "extra == \"standard\""}
-websockets = {version = ">=10.4", optional = true, markers = "extra == \"standard\""}
-
-[package.extras]
-standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"]
-
-[[package]]
-name = "uvloop"
-version = "0.17.0"
-description = "Fast implementation of asyncio event loop on top of libuv"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "uvloop-0.17.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce9f61938d7155f79d3cb2ffa663147d4a76d16e08f65e2c66b77bd41b356718"},
- {file = "uvloop-0.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:68532f4349fd3900b839f588972b3392ee56042e440dd5873dfbbcd2cc67617c"},
- {file = "uvloop-0.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0949caf774b9fcefc7c5756bacbbbd3fc4c05a6b7eebc7c7ad6f825b23998d6d"},
- {file = "uvloop-0.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff3d00b70ce95adce264462c930fbaecb29718ba6563db354608f37e49e09024"},
- {file = "uvloop-0.17.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a5abddb3558d3f0a78949c750644a67be31e47936042d4f6c888dd6f3c95f4aa"},
- {file = "uvloop-0.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8efcadc5a0003d3a6e887ccc1fb44dec25594f117a94e3127954c05cf144d811"},
- {file = "uvloop-0.17.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3378eb62c63bf336ae2070599e49089005771cc651c8769aaad72d1bd9385a7c"},
- {file = "uvloop-0.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6aafa5a78b9e62493539456f8b646f85abc7093dd997f4976bb105537cf2635e"},
- {file = "uvloop-0.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c686a47d57ca910a2572fddfe9912819880b8765e2f01dc0dd12a9bf8573e539"},
- {file = "uvloop-0.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:864e1197139d651a76c81757db5eb199db8866e13acb0dfe96e6fc5d1cf45fc4"},
- {file = "uvloop-0.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2a6149e1defac0faf505406259561bc14b034cdf1d4711a3ddcdfbaa8d825a05"},
- {file = "uvloop-0.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6708f30db9117f115eadc4f125c2a10c1a50d711461699a0cbfaa45b9a78e376"},
- {file = "uvloop-0.17.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:23609ca361a7fc587031429fa25ad2ed7242941adec948f9d10c045bfecab06b"},
- {file = "uvloop-0.17.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2deae0b0fb00a6af41fe60a675cec079615b01d68beb4cc7b722424406b126a8"},
- {file = "uvloop-0.17.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45cea33b208971e87a31c17622e4b440cac231766ec11e5d22c76fab3bf9df62"},
- {file = "uvloop-0.17.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9b09e0f0ac29eee0451d71798878eae5a4e6a91aa275e114037b27f7db72702d"},
- {file = "uvloop-0.17.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:dbbaf9da2ee98ee2531e0c780455f2841e4675ff580ecf93fe5c48fe733b5667"},
- {file = "uvloop-0.17.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a4aee22ece20958888eedbad20e4dbb03c37533e010fb824161b4f05e641f738"},
- {file = "uvloop-0.17.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:307958f9fc5c8bb01fad752d1345168c0abc5d62c1b72a4a8c6c06f042b45b20"},
- {file = "uvloop-0.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ebeeec6a6641d0adb2ea71dcfb76017602ee2bfd8213e3fcc18d8f699c5104f"},
- {file = "uvloop-0.17.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1436c8673c1563422213ac6907789ecb2b070f5939b9cbff9ef7113f2b531595"},
- {file = "uvloop-0.17.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8887d675a64cfc59f4ecd34382e5b4f0ef4ae1da37ed665adba0c2badf0d6578"},
- {file = "uvloop-0.17.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3db8de10ed684995a7f34a001f15b374c230f7655ae840964d51496e2f8a8474"},
- {file = "uvloop-0.17.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7d37dccc7ae63e61f7b96ee2e19c40f153ba6ce730d8ba4d3b4e9738c1dccc1b"},
- {file = "uvloop-0.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cbbe908fda687e39afd6ea2a2f14c2c3e43f2ca88e3a11964b297822358d0e6c"},
- {file = "uvloop-0.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d97672dc709fa4447ab83276f344a165075fd9f366a97b712bdd3fee05efae8"},
- {file = "uvloop-0.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1e507c9ee39c61bfddd79714e4f85900656db1aec4d40c6de55648e85c2799c"},
- {file = "uvloop-0.17.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c092a2c1e736086d59ac8e41f9c98f26bbf9b9222a76f21af9dfe949b99b2eb9"},
- {file = "uvloop-0.17.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:30babd84706115626ea78ea5dbc7dd8d0d01a2e9f9b306d24ca4ed5796c66ded"},
- {file = "uvloop-0.17.0.tar.gz", hash = "sha256:0ddf6baf9cf11a1a22c71487f39f15b2cf78eb5bde7e5b45fbb99e8a9d91b9e1"},
-]
-
-[package.extras]
-dev = ["Cython (>=0.29.32,<0.30.0)", "Sphinx (>=4.1.2,<4.2.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=22.0.0,<22.1.0)", "pycodestyle (>=2.7.0,<2.8.0)", "pytest (>=3.6.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"]
-docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"]
-test = ["Cython (>=0.29.32,<0.30.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=22.0.0,<22.1.0)", "pycodestyle (>=2.7.0,<2.8.0)"]
-
-[[package]]
-name = "watchfiles"
-version = "0.19.0"
-description = "Simple, modern and high performance file watching and code reload in python."
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "watchfiles-0.19.0-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:91633e64712df3051ca454ca7d1b976baf842d7a3640b87622b323c55f3345e7"},
- {file = "watchfiles-0.19.0-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:b6577b8c6c8701ba8642ea9335a129836347894b666dd1ec2226830e263909d3"},
- {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:18b28f6ad871b82df9542ff958d0c86bb0d8310bb09eb8e87d97318a3b5273af"},
- {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fac19dc9cbc34052394dbe81e149411a62e71999c0a19e1e09ce537867f95ae0"},
- {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:09ea3397aecbc81c19ed7f025e051a7387feefdb789cf768ff994c1228182fda"},
- {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c0376deac92377817e4fb8f347bf559b7d44ff556d9bc6f6208dd3f79f104aaf"},
- {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c75eff897786ee262c9f17a48886f4e98e6cfd335e011c591c305e5d083c056"},
- {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb5d45c4143c1dd60f98a16187fd123eda7248f84ef22244818c18d531a249d1"},
- {file = "watchfiles-0.19.0-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:79c533ff593db861ae23436541f481ec896ee3da4e5db8962429b441bbaae16e"},
- {file = "watchfiles-0.19.0-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3d7d267d27aceeeaa3de0dd161a0d64f0a282264d592e335fff7958cc0cbae7c"},
- {file = "watchfiles-0.19.0-cp37-abi3-win32.whl", hash = "sha256:176a9a7641ec2c97b24455135d58012a5be5c6217fc4d5fef0b2b9f75dbf5154"},
- {file = "watchfiles-0.19.0-cp37-abi3-win_amd64.whl", hash = "sha256:945be0baa3e2440151eb3718fd8846751e8b51d8de7b884c90b17d271d34cae8"},
- {file = "watchfiles-0.19.0-cp37-abi3-win_arm64.whl", hash = "sha256:0089c6dc24d436b373c3c57657bf4f9a453b13767150d17284fc6162b2791911"},
- {file = "watchfiles-0.19.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:cae3dde0b4b2078f31527acff6f486e23abed307ba4d3932466ba7cdd5ecec79"},
- {file = "watchfiles-0.19.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:7f3920b1285a7d3ce898e303d84791b7bf40d57b7695ad549dc04e6a44c9f120"},
- {file = "watchfiles-0.19.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9afd0d69429172c796164fd7fe8e821ade9be983f51c659a38da3faaaaac44dc"},
- {file = "watchfiles-0.19.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68dce92b29575dda0f8d30c11742a8e2b9b8ec768ae414b54f7453f27bdf9545"},
- {file = "watchfiles-0.19.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:5569fc7f967429d4bc87e355cdfdcee6aabe4b620801e2cf5805ea245c06097c"},
- {file = "watchfiles-0.19.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:5471582658ea56fca122c0f0d0116a36807c63fefd6fdc92c71ca9a4491b6b48"},
- {file = "watchfiles-0.19.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b538014a87f94d92f98f34d3e6d2635478e6be6423a9ea53e4dd96210065e193"},
- {file = "watchfiles-0.19.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20b44221764955b1e703f012c74015306fb7e79a00c15370785f309b1ed9aa8d"},
- {file = "watchfiles-0.19.0.tar.gz", hash = "sha256:d9b073073e048081e502b6c6b0b88714c026a1a4c890569238d04aca5f9ca74b"},
-]
-
-[package.dependencies]
-anyio = ">=3.0.0"
-
-[[package]]
-name = "websockets"
-version = "11.0.3"
-description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3ccc8a0c387629aec40f2fc9fdcb4b9d5431954f934da3eaf16cdc94f67dbfac"},
- {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d67ac60a307f760c6e65dad586f556dde58e683fab03323221a4e530ead6f74d"},
- {file = "websockets-11.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84d27a4832cc1a0ee07cdcf2b0629a8a72db73f4cf6de6f0904f6661227f256f"},
- {file = "websockets-11.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffd7dcaf744f25f82190856bc26ed81721508fc5cbf2a330751e135ff1283564"},
- {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7622a89d696fc87af8e8d280d9b421db5133ef5b29d3f7a1ce9f1a7bf7fcfa11"},
- {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bceab846bac555aff6427d060f2fcfff71042dba6f5fca7dc4f75cac815e57ca"},
- {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:54c6e5b3d3a8936a4ab6870d46bdd6ec500ad62bde9e44462c32d18f1e9a8e54"},
- {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:41f696ba95cd92dc047e46b41b26dd24518384749ed0d99bea0a941ca87404c4"},
- {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:86d2a77fd490ae3ff6fae1c6ceaecad063d3cc2320b44377efdde79880e11526"},
- {file = "websockets-11.0.3-cp310-cp310-win32.whl", hash = "sha256:2d903ad4419f5b472de90cd2d40384573b25da71e33519a67797de17ef849b69"},
- {file = "websockets-11.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:1d2256283fa4b7f4c7d7d3e84dc2ece74d341bce57d5b9bf385df109c2a1a82f"},
- {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e848f46a58b9fcf3d06061d17be388caf70ea5b8cc3466251963c8345e13f7eb"},
- {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa5003845cdd21ac0dc6c9bf661c5beddd01116f6eb9eb3c8e272353d45b3288"},
- {file = "websockets-11.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b58cbf0697721120866820b89f93659abc31c1e876bf20d0b3d03cef14faf84d"},
- {file = "websockets-11.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:660e2d9068d2bedc0912af508f30bbeb505bbbf9774d98def45f68278cea20d3"},
- {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1f0524f203e3bd35149f12157438f406eff2e4fb30f71221c8a5eceb3617b6b"},
- {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:def07915168ac8f7853812cc593c71185a16216e9e4fa886358a17ed0fd9fcf6"},
- {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b30c6590146e53149f04e85a6e4fcae068df4289e31e4aee1fdf56a0dead8f97"},
- {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:619d9f06372b3a42bc29d0cd0354c9bb9fb39c2cbc1a9c5025b4538738dbffaf"},
- {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:01f5567d9cf6f502d655151645d4e8b72b453413d3819d2b6f1185abc23e82dd"},
- {file = "websockets-11.0.3-cp311-cp311-win32.whl", hash = "sha256:e1459677e5d12be8bbc7584c35b992eea142911a6236a3278b9b5ce3326f282c"},
- {file = "websockets-11.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:e7837cb169eca3b3ae94cc5787c4fed99eef74c0ab9506756eea335e0d6f3ed8"},
- {file = "websockets-11.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9f59a3c656fef341a99e3d63189852be7084c0e54b75734cde571182c087b152"},
- {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2529338a6ff0eb0b50c7be33dc3d0e456381157a31eefc561771ee431134a97f"},
- {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34fd59a4ac42dff6d4681d8843217137f6bc85ed29722f2f7222bd619d15e95b"},
- {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:332d126167ddddec94597c2365537baf9ff62dfcc9db4266f263d455f2f031cb"},
- {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6505c1b31274723ccaf5f515c1824a4ad2f0d191cec942666b3d0f3aa4cb4007"},
- {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f467ba0050b7de85016b43f5a22b46383ef004c4f672148a8abf32bc999a87f0"},
- {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9d9acd80072abcc98bd2c86c3c9cd4ac2347b5a5a0cae7ed5c0ee5675f86d9af"},
- {file = "websockets-11.0.3-cp37-cp37m-win32.whl", hash = "sha256:e590228200fcfc7e9109509e4d9125eace2042fd52b595dd22bbc34bb282307f"},
- {file = "websockets-11.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:b16fff62b45eccb9c7abb18e60e7e446998093cdcb50fed33134b9b6878836de"},
- {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fb06eea71a00a7af0ae6aefbb932fb8a7df3cb390cc217d51a9ad7343de1b8d0"},
- {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8a34e13a62a59c871064dfd8ffb150867e54291e46d4a7cf11d02c94a5275bae"},
- {file = "websockets-11.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4841ed00f1026dfbced6fca7d963c4e7043aa832648671b5138008dc5a8f6d99"},
- {file = "websockets-11.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a073fc9ab1c8aff37c99f11f1641e16da517770e31a37265d2755282a5d28aa"},
- {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68b977f21ce443d6d378dbd5ca38621755f2063d6fdb3335bda981d552cfff86"},
- {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a99a7a71631f0efe727c10edfba09ea6bee4166a6f9c19aafb6c0b5917d09c"},
- {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bee9fcb41db2a23bed96c6b6ead6489702c12334ea20a297aa095ce6d31370d0"},
- {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4b253869ea05a5a073ebfdcb5cb3b0266a57c3764cf6fe114e4cd90f4bfa5f5e"},
- {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1553cb82942b2a74dd9b15a018dce645d4e68674de2ca31ff13ebc2d9f283788"},
- {file = "websockets-11.0.3-cp38-cp38-win32.whl", hash = "sha256:f61bdb1df43dc9c131791fbc2355535f9024b9a04398d3bd0684fc16ab07df74"},
- {file = "websockets-11.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:03aae4edc0b1c68498f41a6772d80ac7c1e33c06c6ffa2ac1c27a07653e79d6f"},
- {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:777354ee16f02f643a4c7f2b3eff8027a33c9861edc691a2003531f5da4f6bc8"},
- {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c82f11964f010053e13daafdc7154ce7385ecc538989a354ccc7067fd7028fd"},
- {file = "websockets-11.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3580dd9c1ad0701169e4d6fc41e878ffe05e6bdcaf3c412f9d559389d0c9e016"},
- {file = "websockets-11.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f1a3f10f836fab6ca6efa97bb952300b20ae56b409414ca85bff2ad241d2a61"},
- {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df41b9bc27c2c25b486bae7cf42fccdc52ff181c8c387bfd026624a491c2671b"},
- {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279e5de4671e79a9ac877427f4ac4ce93751b8823f276b681d04b2156713b9dd"},
- {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1fdf26fa8a6a592f8f9235285b8affa72748dc12e964a5518c6c5e8f916716f7"},
- {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69269f3a0b472e91125b503d3c0b3566bda26da0a3261c49f0027eb6075086d1"},
- {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:97b52894d948d2f6ea480171a27122d77af14ced35f62e5c892ca2fae9344311"},
- {file = "websockets-11.0.3-cp39-cp39-win32.whl", hash = "sha256:c7f3cb904cce8e1be667c7e6fef4516b98d1a6a0635a58a57528d577ac18a128"},
- {file = "websockets-11.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c792ea4eabc0159535608fc5658a74d1a81020eb35195dd63214dcf07556f67e"},
- {file = "websockets-11.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f2e58f2c36cc52d41f2659e4c0cbf7353e28c8c9e63e30d8c6d3494dc9fdedcf"},
- {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de36fe9c02995c7e6ae6efe2e205816f5f00c22fd1fbf343d4d18c3d5ceac2f5"},
- {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ac56b661e60edd453585f4bd68eb6a29ae25b5184fd5ba51e97652580458998"},
- {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e052b8467dd07d4943936009f46ae5ce7b908ddcac3fda581656b1b19c083d9b"},
- {file = "websockets-11.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:42cc5452a54a8e46a032521d7365da775823e21bfba2895fb7b77633cce031bb"},
- {file = "websockets-11.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e6316827e3e79b7b8e7d8e3b08f4e331af91a48e794d5d8b099928b6f0b85f20"},
- {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8531fdcad636d82c517b26a448dcfe62f720e1922b33c81ce695d0edb91eb931"},
- {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c114e8da9b475739dde229fd3bc6b05a6537a88a578358bc8eb29b4030fac9c9"},
- {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e063b1865974611313a3849d43f2c3f5368093691349cf3c7c8f8f75ad7cb280"},
- {file = "websockets-11.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:92b2065d642bf8c0a82d59e59053dd2fdde64d4ed44efe4870fa816c1232647b"},
- {file = "websockets-11.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0ee68fe502f9031f19d495dae2c268830df2760c0524cbac5d759921ba8c8e82"},
- {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcacf2c7a6c3a84e720d1bb2b543c675bf6c40e460300b628bab1b1efc7c034c"},
- {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b67c6f5e5a401fc56394f191f00f9b3811fe843ee93f4a70df3c389d1adf857d"},
- {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d5023a4b6a5b183dc838808087033ec5df77580485fc533e7dab2567851b0a4"},
- {file = "websockets-11.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ed058398f55163a79bb9f06a90ef9ccc063b204bb346c4de78efc5d15abfe602"},
- {file = "websockets-11.0.3-py3-none-any.whl", hash = "sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6"},
- {file = "websockets-11.0.3.tar.gz", hash = "sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016"},
-]
-
-[[package]]
-name = "werkzeug"
-version = "2.1.2"
-description = "The comprehensive WSGI web application library."
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "Werkzeug-2.1.2-py3-none-any.whl", hash = "sha256:72a4b735692dd3135217911cbeaa1be5fa3f62bffb8745c5215420a03dc55255"},
- {file = "Werkzeug-2.1.2.tar.gz", hash = "sha256:1ce08e8093ed67d638d63879fd1ba3735817f7a80de3674d293f5984f25fb6e6"},
-]
-
-[package.extras]
-watchdog = ["watchdog"]
-
-[[package]]
-name = "wsproto"
-version = "1.2.0"
-description = "WebSockets state-machine based protocol implementation"
-optional = false
-python-versions = ">=3.7.0"
-files = [
- {file = "wsproto-1.2.0-py3-none-any.whl", hash = "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736"},
- {file = "wsproto-1.2.0.tar.gz", hash = "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065"},
-]
-
-[package.dependencies]
-h11 = ">=0.9.0,<1"
-
-[[package]]
-name = "zipp"
-version = "3.15.0"
-description = "Backport of pathlib-compatible object wrapper for zip files"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"},
- {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"},
-]
-
-[package.extras]
-docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
-testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"]
-
-[metadata]
-lock-version = "2.0"
-python-versions = "^3.9"
-content-hash = "629118cfac10f1dab4c39c6ccd50bd69ca68a7fc05dd2baf1d020082d6b19e4e"
diff --git a/docs/pyproject.toml b/docs/pyproject.toml
deleted file mode 100644
index d2f47c577..000000000
--- a/docs/pyproject.toml
+++ /dev/null
@@ -1,23 +0,0 @@
-[tool.poetry]
-name = "docs"
-version = "0.0.0"
-description = "docs"
-authors = ["rmorshea "]
-readme = "README.md"
-
-[tool.poetry.dependencies]
-python = "^3.9"
-reactpy = { path = "../src/py/reactpy", extras = ["starlette", "sanic", "fastapi", "flask", "tornado", "testing"], develop = false }
-furo = "2022.04.07"
-sphinx = "*"
-sphinx-autodoc-typehints = "*"
-sphinx-copybutton = "*"
-sphinx-autobuild = "*"
-sphinx-reredirects = "*"
-sphinx-design = "*"
-sphinx-resolve-py-references = "*"
-sphinxext-opengraph = "*"
-
-[build-system]
-requires = ["poetry-core"]
-build-backend = "poetry.core.masonry.api"
diff --git a/docs/requirements.txt b/docs/requirements.txt
new file mode 100644
index 000000000..9ae8fcf17
--- /dev/null
+++ b/docs/requirements.txt
@@ -0,0 +1,8 @@
+mkdocs
+mkdocs-git-revision-date-localized-plugin
+mkdocs-material
+mkdocs-include-markdown-plugin
+linkcheckmd
+mkdocs-spellcheck[all]
+mkdocs-git-authors-plugin
+mkdocs-minify-plugin
diff --git a/docs/source/_custom_js/README.md b/docs/source/_custom_js/README.md
deleted file mode 100644
index 4d5d75dc2..000000000
--- a/docs/source/_custom_js/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Custom Javascript for ReactPy's Docs
-
-Build the javascript with
-
-```
-npm run build
-```
-
-This will drop a javascript bundle into `../_static/custom.js`
diff --git a/docs/source/_custom_js/package-lock.json b/docs/source/_custom_js/package-lock.json
deleted file mode 100644
index 98cbb7014..000000000
--- a/docs/source/_custom_js/package-lock.json
+++ /dev/null
@@ -1,766 +0,0 @@
-{
- "name": "reactpy-docs-example-loader",
- "version": "1.0.0",
- "lockfileVersion": 2,
- "requires": true,
- "packages": {
- "": {
- "name": "reactpy-docs-example-loader",
- "version": "1.0.0",
- "dependencies": {
- "@reactpy/client": "file:../../../src/js/packages/@reactpy/client"
- },
- "devDependencies": {
- "@rollup/plugin-commonjs": "^21.0.1",
- "@rollup/plugin-node-resolve": "^13.1.1",
- "@rollup/plugin-replace": "^3.0.0",
- "prettier": "^2.2.1",
- "rollup": "^2.35.1"
- }
- },
- "../../../src/client/packages/@reactpy/client": {
- "version": "0.3.1",
- "integrity": "sha512-pIK5eNwFSHKXg7ClpASWFVKyZDYxz59MSFpVaX/OqJFkrJaAxBuhKGXNTMXmuyWOL5Iyvb/ErwwDRxQRzMNkfQ==",
- "extraneous": true,
- "license": "MIT",
- "dependencies": {
- "event-to-object": "^0.1.2",
- "json-pointer": "^0.6.2"
- },
- "devDependencies": {
- "@types/json-pointer": "^1.0.31",
- "@types/react": "^17.0",
- "@types/react-dom": "^17.0",
- "typescript": "^4.9.5"
- },
- "peerDependencies": {
- "react": ">=16 <18",
- "react-dom": ">=16 <18"
- }
- },
- "../../../src/client/packages/client": {
- "name": "@reactpy/client",
- "version": "0.2.0",
- "extraneous": true,
- "license": "MIT",
- "dependencies": {
- "event-to-object": "^0.1.0",
- "json-pointer": "^0.6.2"
- },
- "devDependencies": {
- "@types/json-pointer": "^1.0.31",
- "@types/react": "^17.0",
- "@types/react-dom": "^17.0",
- "prettier": "^3.0.0-alpha.6",
- "typescript": "^4.9.5"
- },
- "peerDependencies": {
- "react": ">=16 <18",
- "react-dom": ">=16 <18"
- }
- },
- "../../../src/js/packages/@reactpy/client": {
- "version": "0.3.1",
- "license": "MIT",
- "dependencies": {
- "event-to-object": "^0.1.2",
- "json-pointer": "^0.6.2"
- },
- "devDependencies": {
- "@types/json-pointer": "^1.0.31",
- "@types/react": "^17.0",
- "@types/react-dom": "^17.0",
- "typescript": "^4.9.5"
- },
- "peerDependencies": {
- "react": ">=16 <18",
- "react-dom": ">=16 <18"
- }
- },
- "node_modules/@reactpy/client": {
- "resolved": "../../../src/js/packages/@reactpy/client",
- "link": true
- },
- "node_modules/@rollup/plugin-commonjs": {
- "version": "21.0.1",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.0.1.tgz",
- "integrity": "sha512-EA+g22lbNJ8p5kuZJUYyhhDK7WgJckW5g4pNN7n4mAFUM96VuwUnNT3xr2Db2iCZPI1pJPbGyfT5mS9T1dHfMg==",
- "dev": true,
- "dependencies": {
- "@rollup/pluginutils": "^3.1.0",
- "commondir": "^1.0.1",
- "estree-walker": "^2.0.1",
- "glob": "^7.1.6",
- "is-reference": "^1.2.1",
- "magic-string": "^0.25.7",
- "resolve": "^1.17.0"
- },
- "engines": {
- "node": ">= 8.0.0"
- },
- "peerDependencies": {
- "rollup": "^2.38.3"
- }
- },
- "node_modules/@rollup/plugin-commonjs/node_modules/estree-walker": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
- "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
- "dev": true
- },
- "node_modules/@rollup/plugin-node-resolve": {
- "version": "13.1.1",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.1.1.tgz",
- "integrity": "sha512-6QKtRevXLrmEig9UiMYt2fSvee9TyltGRfw+qSs6xjUnxwjOzTOqy+/Lpxsgjb8mJn1EQNbCDAvt89O4uzL5kw==",
- "dev": true,
- "dependencies": {
- "@rollup/pluginutils": "^3.1.0",
- "@types/resolve": "1.17.1",
- "builtin-modules": "^3.1.0",
- "deepmerge": "^4.2.2",
- "is-module": "^1.0.0",
- "resolve": "^1.19.0"
- },
- "engines": {
- "node": ">= 10.0.0"
- },
- "peerDependencies": {
- "rollup": "^2.42.0"
- }
- },
- "node_modules/@rollup/plugin-node-resolve/node_modules/@types/resolve": {
- "version": "1.17.1",
- "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
- "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==",
- "dev": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@rollup/plugin-replace": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-3.0.0.tgz",
- "integrity": "sha512-3c7JCbMuYXM4PbPWT4+m/4Y6U60SgsnDT/cCyAyUKwFHg7pTSfsSQzIpETha3a3ig6OdOKzZz87D9ZXIK3qsDg==",
- "dev": true,
- "dependencies": {
- "@rollup/pluginutils": "^3.1.0",
- "magic-string": "^0.25.7"
- },
- "peerDependencies": {
- "rollup": "^1.20.0 || ^2.0.0"
- }
- },
- "node_modules/@rollup/pluginutils": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
- "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
- "dev": true,
- "dependencies": {
- "@types/estree": "0.0.39",
- "estree-walker": "^1.0.1",
- "picomatch": "^2.2.2"
- },
- "engines": {
- "node": ">= 8.0.0"
- },
- "peerDependencies": {
- "rollup": "^1.20.0||^2.0.0"
- }
- },
- "node_modules/@rollup/pluginutils/node_modules/@types/estree": {
- "version": "0.0.39",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
- "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
- "dev": true
- },
- "node_modules/@rollup/pluginutils/node_modules/estree-walker": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
- "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==",
- "dev": true
- },
- "node_modules/@types/estree": {
- "version": "0.0.48",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.48.tgz",
- "integrity": "sha512-LfZwXoGUDo0C3me81HXgkBg5CTQYb6xzEl+fNmbO4JdRiSKQ8A0GD1OBBvKAIsbCUgoyAty7m99GqqMQe784ew==",
- "dev": true
- },
- "node_modules/@types/node": {
- "version": "15.12.2",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.2.tgz",
- "integrity": "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww==",
- "dev": true
- },
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true
- },
- "node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/builtin-modules": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz",
- "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==",
- "dev": true,
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/commondir": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
- "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
- "dev": true
- },
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
- "dev": true
- },
- "node_modules/deepmerge": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
- "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
- "dev": true
- },
- "node_modules/fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
- "dev": true,
- "hasInstallScript": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
- },
- "node_modules/glob": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
- "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
- "dev": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dev": true,
- "dependencies": {
- "function-bind": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "dev": true,
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
- },
- "node_modules/is-core-module": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz",
- "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==",
- "dev": true,
- "dependencies": {
- "has": "^1.0.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-module": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
- "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=",
- "dev": true
- },
- "node_modules/is-reference": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz",
- "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==",
- "dev": true,
- "dependencies": {
- "@types/estree": "*"
- }
- },
- "node_modules/magic-string": {
- "version": "0.25.7",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
- "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
- "dev": true,
- "dependencies": {
- "sourcemap-codec": "^1.4.4"
- }
- },
- "node_modules/minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "dev": true,
- "dependencies": {
- "wrappy": "1"
- }
- },
- "node_modules/path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true
- },
- "node_modules/picomatch": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
- "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
- "dev": true,
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/prettier": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz",
- "integrity": "sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==",
- "dev": true,
- "bin": {
- "prettier": "bin-prettier.js"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/resolve": {
- "version": "1.20.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
- "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
- "dev": true,
- "dependencies": {
- "is-core-module": "^2.2.0",
- "path-parse": "^1.0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/rollup": {
- "version": "2.52.1",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.52.1.tgz",
- "integrity": "sha512-/SPqz8UGnp4P1hq6wc9gdTqA2bXQXGx13TtoL03GBm6qGRI6Hm3p4Io7GeiHNLl0BsQAne1JNYY+q/apcY933w==",
- "dev": true,
- "bin": {
- "rollup": "dist/bin/rollup"
- },
- "engines": {
- "node": ">=10.0.0"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/sourcemap-codec": {
- "version": "1.4.8",
- "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
- "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
- "dev": true
- },
- "node_modules/wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
- "dev": true
- }
- },
- "dependencies": {
- "@reactpy/client": {
- "version": "file:../../../src/js/packages/@reactpy/client",
- "requires": {
- "@types/json-pointer": "^1.0.31",
- "@types/react": "^17.0",
- "@types/react-dom": "^17.0",
- "event-to-object": "^0.1.2",
- "json-pointer": "^0.6.2",
- "typescript": "^4.9.5"
- }
- },
- "@rollup/plugin-commonjs": {
- "version": "21.0.1",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.0.1.tgz",
- "integrity": "sha512-EA+g22lbNJ8p5kuZJUYyhhDK7WgJckW5g4pNN7n4mAFUM96VuwUnNT3xr2Db2iCZPI1pJPbGyfT5mS9T1dHfMg==",
- "dev": true,
- "requires": {
- "@rollup/pluginutils": "^3.1.0",
- "commondir": "^1.0.1",
- "estree-walker": "^2.0.1",
- "glob": "^7.1.6",
- "is-reference": "^1.2.1",
- "magic-string": "^0.25.7",
- "resolve": "^1.17.0"
- },
- "dependencies": {
- "estree-walker": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
- "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
- "dev": true
- }
- }
- },
- "@rollup/plugin-node-resolve": {
- "version": "13.1.1",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.1.1.tgz",
- "integrity": "sha512-6QKtRevXLrmEig9UiMYt2fSvee9TyltGRfw+qSs6xjUnxwjOzTOqy+/Lpxsgjb8mJn1EQNbCDAvt89O4uzL5kw==",
- "dev": true,
- "requires": {
- "@rollup/pluginutils": "^3.1.0",
- "@types/resolve": "1.17.1",
- "builtin-modules": "^3.1.0",
- "deepmerge": "^4.2.2",
- "is-module": "^1.0.0",
- "resolve": "^1.19.0"
- },
- "dependencies": {
- "@types/resolve": {
- "version": "1.17.1",
- "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
- "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- }
- }
- },
- "@rollup/plugin-replace": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-3.0.0.tgz",
- "integrity": "sha512-3c7JCbMuYXM4PbPWT4+m/4Y6U60SgsnDT/cCyAyUKwFHg7pTSfsSQzIpETha3a3ig6OdOKzZz87D9ZXIK3qsDg==",
- "dev": true,
- "requires": {
- "@rollup/pluginutils": "^3.1.0",
- "magic-string": "^0.25.7"
- }
- },
- "@rollup/pluginutils": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
- "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
- "dev": true,
- "requires": {
- "@types/estree": "0.0.39",
- "estree-walker": "^1.0.1",
- "picomatch": "^2.2.2"
- },
- "dependencies": {
- "@types/estree": {
- "version": "0.0.39",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
- "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
- "dev": true
- },
- "estree-walker": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
- "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==",
- "dev": true
- }
- }
- },
- "@types/estree": {
- "version": "0.0.48",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.48.tgz",
- "integrity": "sha512-LfZwXoGUDo0C3me81HXgkBg5CTQYb6xzEl+fNmbO4JdRiSKQ8A0GD1OBBvKAIsbCUgoyAty7m99GqqMQe784ew==",
- "dev": true
- },
- "@types/node": {
- "version": "15.12.2",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.2.tgz",
- "integrity": "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww==",
- "dev": true
- },
- "balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "builtin-modules": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz",
- "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==",
- "dev": true
- },
- "commondir": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
- "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
- "dev": true
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
- "dev": true
- },
- "deepmerge": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
- "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
- "dev": true
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
- "dev": true
- },
- "fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
- "dev": true,
- "optional": true
- },
- "function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
- },
- "glob": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
- "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dev": true,
- "requires": {
- "function-bind": "^1.1.1"
- }
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "dev": true,
- "requires": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
- },
- "is-core-module": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz",
- "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==",
- "dev": true,
- "requires": {
- "has": "^1.0.3"
- }
- },
- "is-module": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
- "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=",
- "dev": true
- },
- "is-reference": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz",
- "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==",
- "dev": true,
- "requires": {
- "@types/estree": "*"
- }
- },
- "magic-string": {
- "version": "0.25.7",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
- "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
- "dev": true,
- "requires": {
- "sourcemap-codec": "^1.4.4"
- }
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "dev": true,
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "dev": true,
- "requires": {
- "wrappy": "1"
- }
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
- "dev": true
- },
- "path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true
- },
- "picomatch": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
- "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
- "dev": true
- },
- "prettier": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz",
- "integrity": "sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==",
- "dev": true
- },
- "resolve": {
- "version": "1.20.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
- "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
- "dev": true,
- "requires": {
- "is-core-module": "^2.2.0",
- "path-parse": "^1.0.6"
- }
- },
- "rollup": {
- "version": "2.52.1",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.52.1.tgz",
- "integrity": "sha512-/SPqz8UGnp4P1hq6wc9gdTqA2bXQXGx13TtoL03GBm6qGRI6Hm3p4Io7GeiHNLl0BsQAne1JNYY+q/apcY933w==",
- "dev": true,
- "requires": {
- "fsevents": "~2.3.2"
- }
- },
- "sourcemap-codec": {
- "version": "1.4.8",
- "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
- "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
- "dev": true
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
- "dev": true
- }
- }
-}
diff --git a/docs/source/_custom_js/package.json b/docs/source/_custom_js/package.json
deleted file mode 100644
index 78d72b961..000000000
--- a/docs/source/_custom_js/package.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "name": "reactpy-docs-example-loader",
- "version": "1.0.0",
- "description": "simple javascript client for ReactPy's documentation",
- "main": "index.js",
- "scripts": {
- "build": "rollup --config",
- "format": "prettier --ignore-path .gitignore --write ."
- },
- "devDependencies": {
- "@rollup/plugin-commonjs": "^21.0.1",
- "@rollup/plugin-node-resolve": "^13.1.1",
- "@rollup/plugin-replace": "^3.0.0",
- "prettier": "^2.2.1",
- "rollup": "^2.35.1"
- },
- "dependencies": {
- "@reactpy/client": "file:../../../src/js/packages/@reactpy/client"
- }
-}
diff --git a/docs/source/_custom_js/rollup.config.js b/docs/source/_custom_js/rollup.config.js
deleted file mode 100644
index 48dd535cf..000000000
--- a/docs/source/_custom_js/rollup.config.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import resolve from "@rollup/plugin-node-resolve";
-import commonjs from "@rollup/plugin-commonjs";
-import replace from "@rollup/plugin-replace";
-
-export default {
- input: "src/index.js",
- output: {
- file: "../_static/custom.js",
- format: "esm",
- },
- plugins: [
- resolve(),
- commonjs(),
- replace({
- "process.env.NODE_ENV": JSON.stringify("production"),
- preventAssignment: true,
- }),
- ],
- onwarn: function (warning) {
- if (warning.code === "THIS_IS_UNDEFINED") {
- // skip warning where `this` is undefined at the top level of a module
- return;
- }
- console.warn(warning.message);
- },
-};
diff --git a/docs/source/_custom_js/src/index.js b/docs/source/_custom_js/src/index.js
deleted file mode 100644
index 505adedd0..000000000
--- a/docs/source/_custom_js/src/index.js
+++ /dev/null
@@ -1,94 +0,0 @@
-import { SimpleReactPyClient, mount } from "@reactpy/client";
-
-let didMountDebug = false;
-
-export function mountWidgetExample(
- mountID,
- viewID,
- reactpyServerHost,
- useActivateButton,
-) {
- let reactpyHost, reactpyPort;
- if (reactpyServerHost) {
- [reactpyHost, reactpyPort] = reactpyServerHost.split(":", 2);
- } else {
- reactpyHost = window.location.hostname;
- reactpyPort = window.location.port;
- }
-
- const client = new SimpleReactPyClient({
- serverLocation: {
- url: `${window.location.protocol}//${reactpyHost}:${reactpyPort}`,
- route: "/",
- query: `?view_id=${viewID}`,
- },
- });
-
- const mountEl = document.getElementById(mountID);
- let isMounted = false;
- triggerIfInViewport(mountEl, () => {
- if (!isMounted) {
- activateView(mountEl, client, useActivateButton);
- isMounted = true;
- }
- });
-}
-
-function activateView(mountEl, client, useActivateButton) {
- if (!useActivateButton) {
- mount(mountEl, client);
- return;
- }
-
- const enableWidgetButton = document.createElement("button");
- enableWidgetButton.appendChild(document.createTextNode("Activate"));
- enableWidgetButton.setAttribute("class", "enable-widget-button");
-
- enableWidgetButton.addEventListener("click", () =>
- fadeOutElementThenCallback(enableWidgetButton, () => {
- {
- mountEl.removeChild(enableWidgetButton);
- mountEl.setAttribute("class", "interactive widget-container");
- mountWithLayoutServer(mountEl, serverInfo);
- }
- }),
- );
-
- function fadeOutElementThenCallback(element, callback) {
- {
- var op = 1; // initial opacity
- var timer = setInterval(function () {
- {
- if (op < 0.001) {
- {
- clearInterval(timer);
- element.style.display = "none";
- callback();
- }
- }
- element.style.opacity = op;
- element.style.filter = "alpha(opacity=" + op * 100 + ")";
- op -= op * 0.5;
- }
- }, 50);
- }
- }
-
- mountEl.appendChild(enableWidgetButton);
-}
-
-function triggerIfInViewport(element, callback) {
- const observer = new window.IntersectionObserver(
- ([entry]) => {
- if (entry.isIntersecting) {
- callback();
- }
- },
- {
- root: null,
- threshold: 0.1, // set offset 0.1 means trigger if at least 10% of element in viewport
- },
- );
-
- observer.observe(element);
-}
diff --git a/docs/source/_exts/async_doctest.py b/docs/source/_exts/async_doctest.py
deleted file mode 100644
index 96024d488..000000000
--- a/docs/source/_exts/async_doctest.py
+++ /dev/null
@@ -1,47 +0,0 @@
-from doctest import DocTest, DocTestRunner
-from textwrap import indent
-from typing import Any
-
-from sphinx.application import Sphinx
-from sphinx.ext.doctest import DocTestBuilder
-from sphinx.ext.doctest import setup as doctest_setup
-
-test_template = """
-import asyncio as __test_template_asyncio
-
-async def __test_template__main():
-
- {test}
-
- globals().update(locals())
-
-__test_template_asyncio.run(__test_template__main())
-"""
-
-
-class TestRunnerWrapper:
- def __init__(self, runner: DocTestRunner):
- self._runner = runner
-
- def __getattr__(self, name: str) -> Any:
- return getattr(self._runner, name)
-
- def run(self, test: DocTest, *args: Any, **kwargs: Any) -> Any:
- for ex in test.examples:
- ex.source = test_template.format(test=indent(ex.source, " ").strip())
- return self._runner.run(test, *args, **kwargs)
-
-
-class AsyncDoctestBuilder(DocTestBuilder):
- @property
- def test_runner(self) -> DocTestRunner:
- return self._test_runner
-
- @test_runner.setter
- def test_runner(self, value: DocTestRunner) -> None:
- self._test_runner = TestRunnerWrapper(value)
-
-
-def setup(app: Sphinx) -> None:
- doctest_setup(app)
- app.add_builder(AsyncDoctestBuilder, override=True)
diff --git a/docs/source/_exts/autogen_api_docs.py b/docs/source/_exts/autogen_api_docs.py
deleted file mode 100644
index b95d85a99..000000000
--- a/docs/source/_exts/autogen_api_docs.py
+++ /dev/null
@@ -1,146 +0,0 @@
-from __future__ import annotations
-
-import sys
-from collections.abc import Collection, Iterator
-from pathlib import Path
-
-from sphinx.application import Sphinx
-
-HERE = Path(__file__).parent
-SRC = HERE.parent.parent.parent / "src"
-PYTHON_PACKAGE = SRC / "py" / "reactpy" / "reactpy"
-
-AUTO_DIR = HERE.parent / "_auto"
-AUTO_DIR.mkdir(exist_ok=True)
-
-API_FILE = AUTO_DIR / "apis.rst"
-
-# All valid RST section symbols - it shouldn't be realistically possible to exhaust them
-SECTION_SYMBOLS = r"""!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~"""
-
-AUTODOC_TEMPLATE_WITH_MEMBERS = """\
-.. automodule:: {module}
- :members:
- :ignore-module-all:
-"""
-
-AUTODOC_TEMPLATE_WITHOUT_MEMBERS = """\
-.. automodule:: {module}
- :ignore-module-all:
-"""
-
-TITLE = """\
-==========
-Python API
-==========
-"""
-
-
-def generate_api_docs():
- content = [TITLE]
-
- for file in walk_python_files(PYTHON_PACKAGE, ignore_dirs={"__pycache__"}):
- if file.name == "__init__.py":
- if file.parent != PYTHON_PACKAGE:
- content.append(make_package_section(file))
- else:
- content.append(make_module_section(file))
-
- API_FILE.write_text("\n".join(content))
-
-
-def make_package_section(file: Path) -> str:
- parent_dir = file.parent
- symbol = get_section_symbol(parent_dir)
- section_name = f"``{parent_dir.name}``"
- module_name = get_module_name(parent_dir)
- return (
- section_name
- + "\n"
- + (symbol * len(section_name))
- + "\n"
- + AUTODOC_TEMPLATE_WITHOUT_MEMBERS.format(module=module_name)
- )
-
-
-def make_module_section(file: Path) -> str:
- symbol = get_section_symbol(file)
- section_name = f"``{file.stem}``"
- module_name = get_module_name(file)
- return (
- section_name
- + "\n"
- + (symbol * len(section_name))
- + "\n"
- + AUTODOC_TEMPLATE_WITH_MEMBERS.format(module=module_name)
- )
-
-
-def get_module_name(path: Path) -> str:
- return ".".join(path.with_suffix("").relative_to(PYTHON_PACKAGE.parent).parts)
-
-
-def get_section_symbol(path: Path) -> str:
- rel_path = path.relative_to(PYTHON_PACKAGE)
- rel_path_parts = rel_path.parts
- if len(rel_path_parts) > len(SECTION_SYMBOLS):
- msg = f"package structure is too deep - ran out of section symbols: {rel_path}"
- raise RuntimeError(msg)
- return SECTION_SYMBOLS[len(rel_path_parts) - 1]
-
-
-def walk_python_files(root: Path, ignore_dirs: Collection[str]) -> Iterator[Path]:
- """Iterate over Python files
-
- We yield in a particular order to get the correction title section structure. Given
- a directory structure of the form::
-
- project/
- __init__.py
- /package
- __init__.py
- module_a.py
- module_b.py
-
- We yield the files in this order::
-
- project/__init__.py
- project/package/__init__.py
- project/package/module_a.py
- project/module_b.py
-
- In this way we generate the section titles in the appropriate order::
-
- project
- =======
-
- project.package
- ---------------
-
- project.package.module_a
- ------------------------
-
- """
- for path in sorted(
- root.iterdir(),
- key=lambda path: (
- # __init__.py files first
- int(not path.name == "__init__.py"),
- # then directories
- int(not path.is_dir()),
- # sort by file name last
- path.name,
- ),
- ):
- if path.is_dir():
- if (path / "__init__.py").exists() and path.name not in ignore_dirs:
- yield from walk_python_files(path, ignore_dirs)
- elif path.suffix == ".py":
- yield path
-
-
-def setup(app: Sphinx) -> None:
- if sys.platform == "win32" and sys.version_info[:2] == (3, 7):
- return None
- generate_api_docs()
- return None
diff --git a/docs/source/_exts/build_custom_js.py b/docs/source/_exts/build_custom_js.py
deleted file mode 100644
index 97857ba74..000000000
--- a/docs/source/_exts/build_custom_js.py
+++ /dev/null
@@ -1,12 +0,0 @@
-import subprocess
-from pathlib import Path
-
-from sphinx.application import Sphinx
-
-SOURCE_DIR = Path(__file__).parent.parent
-CUSTOM_JS_DIR = SOURCE_DIR / "_custom_js"
-
-
-def setup(app: Sphinx) -> None:
- subprocess.run("npm install", cwd=CUSTOM_JS_DIR, shell=True) # noqa S607
- subprocess.run("npm run build", cwd=CUSTOM_JS_DIR, shell=True) # noqa S607
diff --git a/docs/source/_exts/copy_vdom_json_schema.py b/docs/source/_exts/copy_vdom_json_schema.py
deleted file mode 100644
index 38fc171ac..000000000
--- a/docs/source/_exts/copy_vdom_json_schema.py
+++ /dev/null
@@ -1,17 +0,0 @@
-import json
-from pathlib import Path
-
-from sphinx.application import Sphinx
-
-from reactpy.core.vdom import VDOM_JSON_SCHEMA
-
-
-def setup(app: Sphinx) -> None:
- schema_file = Path(__file__).parent.parent / "vdom-json-schema.json"
- current_schema = json.dumps(VDOM_JSON_SCHEMA, indent=2, sort_keys=True)
-
- # We need to make this check because the autoreload system for the docs checks
- # to see if the file has changed to determine whether to re-build. Thus we should
- # only write to the file if its contents will be different.
- if not schema_file.exists() or schema_file.read_text() != current_schema:
- schema_file.write_text(current_schema)
diff --git a/docs/source/_exts/custom_autosectionlabel.py b/docs/source/_exts/custom_autosectionlabel.py
deleted file mode 100644
index 92ff5e2df..000000000
--- a/docs/source/_exts/custom_autosectionlabel.py
+++ /dev/null
@@ -1,80 +0,0 @@
-"""Mostly copied from sphinx.ext.autosectionlabel
-
-See Sphinx BSD license:
-https://github.com/sphinx-doc/sphinx/blob/f9968594206e538f13fa1c27c065027f10d4ea27/LICENSE
-"""
-
-from __future__ import annotations
-
-from fnmatch import fnmatch
-from typing import Any, cast
-
-from docutils import nodes
-from docutils.nodes import Node
-from sphinx.application import Sphinx
-from sphinx.domains.std import StandardDomain
-from sphinx.locale import __
-from sphinx.util import logging
-from sphinx.util.nodes import clean_astext
-
-logger = logging.getLogger(__name__)
-
-
-def get_node_depth(node: Node) -> int:
- i = 0
- cur_node = node
- while cur_node.parent != node.document:
- cur_node = cur_node.parent
- i += 1
- return i
-
-
-def register_sections_as_label(app: Sphinx, document: Node) -> None:
- docname = app.env.docname
-
- for pattern in app.config.autosectionlabel_skip_docs:
- if fnmatch(docname, pattern):
- return None
-
- domain = cast(StandardDomain, app.env.get_domain("std"))
- for node in document.traverse(nodes.section):
- if (
- app.config.autosectionlabel_maxdepth
- and get_node_depth(node) >= app.config.autosectionlabel_maxdepth
- ):
- continue
- labelid = node["ids"][0]
-
- title = cast(nodes.title, node[0])
- ref_name = getattr(title, "rawsource", title.astext())
- if app.config.autosectionlabel_prefix_document:
- name = nodes.fully_normalize_name(docname + ":" + ref_name)
- else:
- name = nodes.fully_normalize_name(ref_name)
- sectname = clean_astext(title)
-
- if name in domain.labels:
- logger.warning(
- __("duplicate label %s, other instance in %s"),
- name,
- app.env.doc2path(domain.labels[name][0]),
- location=node,
- type="autosectionlabel",
- subtype=docname,
- )
-
- domain.anonlabels[name] = docname, labelid
- domain.labels[name] = docname, labelid, sectname
-
-
-def setup(app: Sphinx) -> dict[str, Any]:
- app.add_config_value("autosectionlabel_prefix_document", False, "env")
- app.add_config_value("autosectionlabel_maxdepth", None, "env")
- app.add_config_value("autosectionlabel_skip_docs", [], "env")
- app.connect("doctree-read", register_sections_as_label)
-
- return {
- "version": "builtin",
- "parallel_read_safe": True,
- "parallel_write_safe": True,
- }
diff --git a/docs/source/_exts/patched_html_translator.py b/docs/source/_exts/patched_html_translator.py
deleted file mode 100644
index e2f8ed9a4..000000000
--- a/docs/source/_exts/patched_html_translator.py
+++ /dev/null
@@ -1,24 +0,0 @@
-from sphinx.util.docutils import is_html5_writer_available
-from sphinx.writers.html import HTMLTranslator
-from sphinx.writers.html5 import HTML5Translator
-
-
-class PatchedHTMLTranslator(
- HTML5Translator if is_html5_writer_available() else HTMLTranslator
-):
- def starttag(self, node, tagname, *args, **attrs):
- if (
- tagname == "a"
- and "target" not in attrs
- and (
- "external" in attrs.get("class", "")
- or "external" in attrs.get("classes", [])
- )
- ):
- attrs["target"] = "_blank"
- attrs["ref"] = "noopener noreferrer"
- return super().starttag(node, tagname, *args, **attrs)
-
-
-def setup(app):
- app.set_translator("html", PatchedHTMLTranslator)
diff --git a/docs/source/_exts/reactpy_example.py b/docs/source/_exts/reactpy_example.py
deleted file mode 100644
index c6b054c07..000000000
--- a/docs/source/_exts/reactpy_example.py
+++ /dev/null
@@ -1,180 +0,0 @@
-from __future__ import annotations
-
-import re
-from pathlib import Path
-from typing import Any
-
-from docs_app.examples import (
- SOURCE_DIR,
- get_example_files_by_name,
- get_normalized_example_name,
-)
-from docutils.parsers.rst import directives
-from docutils.statemachine import StringList
-from sphinx.application import Sphinx
-from sphinx.util.docutils import SphinxDirective
-from sphinx_design.tabs import TabSetDirective
-
-
-class WidgetExample(SphinxDirective):
- has_content = False
- required_arguments = 1
- _next_id = 0
-
- option_spec = {
- "result-is-default-tab": directives.flag,
- "activate-button": directives.flag,
- }
-
- def run(self):
- example_name = get_normalized_example_name(
- self.arguments[0],
- # only used if example name starts with "/"
- self.get_source_info()[0],
- )
-
- show_linenos = "linenos" in self.options
- live_example_is_default_tab = "result-is-default-tab" in self.options
- activate_result = "activate-button" not in self.options
-
- ex_files = get_example_files_by_name(example_name)
- if not ex_files:
- src_file, line_num = self.get_source_info()
- msg = f"Missing example named {example_name!r} referenced by document {src_file}:{line_num}"
- raise ValueError(msg)
-
- labeled_tab_items: list[tuple[str, Any]] = []
- if len(ex_files) == 1:
- labeled_tab_items.append(
- (
- "main.py",
- _literal_include(
- path=ex_files[0],
- linenos=show_linenos,
- ),
- )
- )
- else:
- for path in sorted(
- ex_files, key=lambda p: "" if p.name == "main.py" else p.name
- ):
- labeled_tab_items.append(
- (
- path.name,
- _literal_include(
- path=path,
- linenos=show_linenos,
- ),
- )
- )
-
- result_tab_item = (
- "🚀 result",
- _interactive_widget(
- name=example_name,
- with_activate_button=not activate_result,
- ),
- )
- if live_example_is_default_tab:
- labeled_tab_items.insert(0, result_tab_item)
- else:
- labeled_tab_items.append(result_tab_item)
-
- return TabSetDirective(
- "WidgetExample",
- [],
- {},
- _make_tab_items(labeled_tab_items),
- self.lineno - 2,
- self.content_offset,
- "",
- self.state,
- self.state_machine,
- ).run()
-
-
-def _make_tab_items(labeled_content_tuples):
- tab_items = ""
- for label, content in labeled_content_tuples:
- tab_items += _tab_item_template.format(
- label=label,
- content=content.replace("\n", "\n "),
- )
- return _string_to_nested_lines(tab_items)
-
-
-def _literal_include(path: Path, linenos: bool):
- try:
- language = {
- ".py": "python",
- ".js": "javascript",
- ".json": "json",
- }[path.suffix]
- except KeyError:
- msg = f"Unknown extension type {path.suffix!r}"
- raise ValueError(msg) from None
-
- return _literal_include_template.format(
- name=str(path.relative_to(SOURCE_DIR)),
- language=language,
- options=_join_options(_get_file_options(path)),
- )
-
-
-def _join_options(option_strings: list[str]) -> str:
- return "\n ".join(option_strings)
-
-
-OPTION_PATTERN = re.compile(r"#\s:[\w-]+:.*")
-
-
-def _get_file_options(file: Path) -> list[str]:
- options = []
-
- for line in file.read_text().split("\n"):
- if not line.strip():
- continue
- if not line.startswith("#"):
- break
- if not OPTION_PATTERN.match(line):
- continue
- option_string = line[1:].strip()
- if option_string:
- options.append(option_string)
-
- return options
-
-
-def _interactive_widget(name, with_activate_button):
- return _interactive_widget_template.format(
- name=name,
- activate_button_opt=":activate-button:" if with_activate_button else "",
- )
-
-
-_tab_item_template = """
-.. tab-item:: {label}
-
- {content}
-"""
-
-
-_interactive_widget_template = """
-.. reactpy-view:: {name}
- {activate_button_opt}
-"""
-
-
-_literal_include_template = """
-.. literalinclude:: /{name}
- :language: {language}
- {options}
-"""
-
-
-def _string_to_nested_lines(content):
- return StringList(content.split("\n"))
-
-
-def setup(app: Sphinx) -> None:
- app.add_directive("reactpy", WidgetExample)
diff --git a/docs/source/_exts/reactpy_view.py b/docs/source/_exts/reactpy_view.py
deleted file mode 100644
index 7a2bf85a4..000000000
--- a/docs/source/_exts/reactpy_view.py
+++ /dev/null
@@ -1,63 +0,0 @@
-import os
-import sys
-
-print(sys.path)
-
-from docs_app.examples import get_normalized_example_name
-from docutils.nodes import raw
-from docutils.parsers.rst import directives
-from sphinx.application import Sphinx
-from sphinx.util.docutils import SphinxDirective
-
-_REACTPY_EXAMPLE_HOST = os.environ.get("REACTPY_DOC_EXAMPLE_SERVER_HOST", "")
-_REACTPY_STATIC_HOST = os.environ.get("REACTPY_DOC_STATIC_SERVER_HOST", "/docs").rstrip(
- "/"
-)
-
-
-class IteractiveWidget(SphinxDirective):
- has_content = False
- required_arguments = 1
- _next_id = 0
-
- option_spec = {
- "activate-button": directives.flag,
- "margin": float,
- }
-
- def run(self):
- IteractiveWidget._next_id += 1
- container_id = f"reactpy-widget-{IteractiveWidget._next_id}"
- view_id = get_normalized_example_name(
- self.arguments[0],
- # only used if example name starts with "/"
- self.get_source_info()[0],
- )
- return [
- raw(
- "",
- f"""
-
- """,
- format="html",
- )
- ]
-
-
-def setup(app: Sphinx) -> None:
- app.add_directive("reactpy-view", IteractiveWidget)
diff --git a/docs/source/_static/css/furo-theme-overrides.css b/docs/source/_static/css/furo-theme-overrides.css
deleted file mode 100644
index a258e025e..000000000
--- a/docs/source/_static/css/furo-theme-overrides.css
+++ /dev/null
@@ -1,6 +0,0 @@
-.sidebar-container {
- width: 18em;
-}
-.sidebar-brand-text {
- display: none;
-}
diff --git a/docs/source/_static/css/larger-api-margins.css b/docs/source/_static/css/larger-api-margins.css
deleted file mode 100644
index f8b75d592..000000000
--- a/docs/source/_static/css/larger-api-margins.css
+++ /dev/null
@@ -1,7 +0,0 @@
-:is(.data, .function, .class, .exception).py {
- margin-top: 3em;
-}
-
-:is(.attribute, .method).py {
- margin-top: 1.8em;
-}
diff --git a/docs/source/_static/css/larger-headings.css b/docs/source/_static/css/larger-headings.css
deleted file mode 100644
index 297ab7202..000000000
--- a/docs/source/_static/css/larger-headings.css
+++ /dev/null
@@ -1,9 +0,0 @@
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
- margin-top: 1.5em !important;
- font-weight: 900 !important;
-}
diff --git a/docs/source/_static/css/reactpy-view.css b/docs/source/_static/css/reactpy-view.css
deleted file mode 100644
index 56df74970..000000000
--- a/docs/source/_static/css/reactpy-view.css
+++ /dev/null
@@ -1,43 +0,0 @@
-.interactive {
- -webkit-transition: 0.1s ease-out;
- -moz-transition: 0.1s ease-out;
- -o-transition: 0.1s ease-out;
- transition: 0.1s ease-out;
-}
-.widget-container {
- padding: 15px;
- overflow: auto;
- background-color: var(--color-code-background);
- min-height: 75px;
-}
-
-.widget-container .printout {
- margin-top: 20px;
- border-top: solid 2px var(--color-foreground-border);
- padding-top: 20px;
-}
-
-.widget-container > div {
- width: 100%;
-}
-
-.enable-widget-button {
- padding: 10px;
- color: #ffffff !important;
- text-transform: uppercase;
- text-decoration: none;
- background: #526cfe;
- border: 2px solid #526cfe !important;
- transition: all 0.1s ease 0s;
- box-shadow: 0 5px 10px var(--color-foreground-border);
-}
-.enable-widget-button:hover {
- color: #526cfe !important;
- background: #ffffff;
- transition: all 0.1s ease 0s;
-}
-.enable-widget-button:focus {
- outline: 0 !important;
- transform: scale(0.98);
- transition: all 0.1s ease 0s;
-}
diff --git a/docs/source/_static/css/sphinx-design-overrides.css b/docs/source/_static/css/sphinx-design-overrides.css
deleted file mode 100644
index 767d9d16c..000000000
--- a/docs/source/_static/css/sphinx-design-overrides.css
+++ /dev/null
@@ -1,14 +0,0 @@
-.sd-card-body {
- display: flex;
- flex-direction: column;
- align-items: stretch;
-}
-
-.sd-tab-content .highlight pre {
- max-height: 700px;
- overflow: auto;
-}
-
-.sd-card-title .sd-badge {
- font-size: 1em;
-}
diff --git a/docs/source/_static/css/widget-output-css-overrides.css b/docs/source/_static/css/widget-output-css-overrides.css
deleted file mode 100644
index 7ddf1a792..000000000
--- a/docs/source/_static/css/widget-output-css-overrides.css
+++ /dev/null
@@ -1,8 +0,0 @@
-.widget-container h1,
-.widget-container h2,
-.widget-container h3,
-.widget-container h4,
-.widget-container h5,
-.widget-container h6 {
- margin: 0 !important;
-}
diff --git a/docs/source/_static/install-and-run-reactpy.gif b/docs/source/_static/install-and-run-reactpy.gif
deleted file mode 100644
index 49d431341636da4a56becf7fdfb24f3fa7fc6685..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 1049193
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