diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..2c9f709 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,53 @@ +name: Check code and Pytest + +on: [push] + +jobs: + build: + + runs-on: ubuntu-latest + + services: + postgres: + image: postgres:16.1 + env: + POSTGRES_USER: northwind + POSTGRES_PASSWORD: northwind + POSTGRES_DB: northwind + ports: + - 5432:5432 + # needed because the postgres container does not provide a healthcheck + options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 + + + steps: + - uses: actions/checkout@v3 + + - name: psycopg prerequisites + run: sudo apt-get install libpq-dev + + - name: Set up Python 3.12 + uses: actions/setup-python@v4 + with: + python-version: 3.12 + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + python -m pip install poetry ruff + poetry install + + - name: Lint with ruff + run: | + ruff check ./src + + - name: Test with pytest + working-directory: ./src + run: | + poetry run pytest -c pytest.github.ini + + # - name: SonarCloud Scan + # uses: SonarSource/sonarcloud-github-action@master + # env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any + # SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ee72a1b --- /dev/null +++ b/.gitignore @@ -0,0 +1,140 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +env-local +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# History extension +.history + +# Custom +\!* +.DS_Store +src/debug_scripts/ +env-api-dev +.vscode \ No newline at end of file diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..12aba42 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,57 @@ +exclude: "docs|node_modules|migrations|shared|.git|.tox|.hbs" +default_stages: [commit] +fail_fast: true + +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks # Refer to this repository for futher documentation about official pre-commit hooks + rev: v4.5.0 + hooks: + - id: check-added-large-files + - id: trailing-whitespace + - id: end-of-file-fixer + - id: double-quote-string-fixer + - id: mixed-line-ending + - id: check-toml + - id: check-yaml + args: + - --unsafe # Instead of loading the files, simply parse them for syntax. + - id: detect-private-key + + + - repo: https://github.com/myint/autoflake + rev: v2.2.1 + hooks: + - id: autoflake + args: + [ + "--in-place", + "--remove-all-unused-imports", + "--remove-unused-variable", + ] + + # - repo: https://github.com/psf/black # Refer to this repository for futher documentation about black hook + # rev: 23.12.1 + # hooks: + # - id: black + + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.1.11 + hooks: + # Run the linter. + - id: ruff + args: [--fix] # Enables autofix + # Run the formatter. + - id: ruff-format + + - repo: https://github.com/pycqa/bandit + rev: 1.7.6 + hooks: + - id: bandit + args: [ "-iii", "-ll" ] + + - repo: https://github.com/pre-commit/mirrors-mypy + rev: v1.8.0 + hooks: + - id: mypy + args: [--config-file=mypy.ini, --ignore-missing-imports] + additional_dependencies: [types-redis, types-pyyaml, types-sqlalchemy, types-click, types-python-jose] diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..bf561eb --- /dev/null +++ b/Dockerfile @@ -0,0 +1,43 @@ +ARG PYTHON_VERSION=3.12.1 + +FROM python:${PYTHON_VERSION}-bookworm AS build-image + +# Update and install dependencies +RUN apt-get -qq update && apt-get -qq install lsb-release && apt-get -qq install git + +RUN mkdir -m 700 /root/.ssh; \ + touch -m 600 /root/.ssh/known_hosts; \ + ssh-keyscan github.com > /root/.ssh/known_hosts + +# poetry +WORKDIR /srv +RUN pip install pip --upgrade && pip install poetry==1.4.2 +COPY poetry.lock pyproject.toml /srv/ +ARG POETRY_DEV=false +RUN --mount=type=ssh,id=default --mount=type=cache,mode=0777,target=/root/.cache/pip \ + poetry export -f requirements.txt -o requirements.txt --without-hashes $(test "$POETRY_DEV" = "true" && echo "--with dev,test") \ + && python -m venv venv && . venv/bin/activate && pip install -r requirements.txt +# end poetry + +# Optimized build +FROM python:${PYTHON_VERSION}-slim-bookworm +ARG WAIT_BIN=wait + +# Add wait script +ADD "https://github.com/ufoscout/docker-compose-wait/releases/download/2.12.0/${WAIT_BIN}" /wait +RUN chmod +x /wait +# wait script + +COPY --from=build-image /srv/venv/ /srv/venv/ + +ENV PATH="/srv/venv/bin:$PATH" + +# Set working directory to function root directory +WORKDIR /app + +# Copy the rest of the working directory contents into the container at /app +COPY src/ . +COPY docker/entrypoint.sh /entrypoint.sh + +ENTRYPOINT [ "/entrypoint.sh" ] +CMD ["run-asgi"] diff --git a/ER.png b/ER.png new file mode 100644 index 0000000..6fe4269 Binary files /dev/null and b/ER.png differ diff --git a/README.md b/README.md index ee65ec6..abd1f63 100644 --- a/README.md +++ b/README.md @@ -1 +1,55 @@ -# abusquets-nothwind +# abusquets-northwind + +To execute any command +```bash +docker-compose exec api bash +``` + + +# Users + +## Create admin User +```bash +python manage.py {user_email} {name} +``` + +# Migrations + + +```bash +alembic init -t async migrations +``` + +## Create the initial migration or add a migration +```bash +alembic revision --autogenerate -m "init" + +``` + +```bash + +alembic revision --autogenerate -m 'add northwind models' + +``` + +## Apply the migrations to the database: + +```bash +alembic upgrade head + +``` + +# Populate + +```bash +docker-compose up +``` + +```bash +docker-compose exec api alembic upgrade head +docker-compose exec postgres bash -c 'export PGPASSWORD=northwind && psql -U northwind northwind < /data/northwind_data.sql' +``` + +```bash +docker-compose exec api python manage.py {user_email} {name} +``` diff --git a/data/northwind_data.sql b/data/northwind_data.sql new file mode 100644 index 0000000..119eee5 --- /dev/null +++ b/data/northwind_data.sql @@ -0,0 +1,3537 @@ +-- +-- PostgreSQL database dump +-- + +-- Dumped from database version 16.1 (Debian 16.1-1.pgdg120+1) +-- Dumped by pg_dump version 16.1 (Debian 16.1-1.pgdg120+1) + +SET statement_timeout = 0; +SET lock_timeout = 0; +SET idle_in_transaction_session_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SELECT pg_catalog.set_config('search_path', '', false); +SET check_function_bodies = false; +SET xmloption = content; +SET client_min_messages = warning; +SET row_security = off; + + +-- +-- Data for Name: auth_user; Type: TABLE DATA; Schema: northwind; Owner: northwind +-- + + + +-- +-- Data for Name: categories; Type: TABLE DATA; Schema: northwind; Owner: northwind +-- + +INSERT INTO northwind.categories VALUES (1, 'Beverages', 'Soft drinks, coffees, teas, beers, and ales', '\x'); +INSERT INTO northwind.categories VALUES (2, 'Condiments', 'Sweet and savory sauces, relishes, spreads, and seasonings', '\x'); +INSERT INTO northwind.categories VALUES (3, 'Confections', 'Desserts, candies, and sweet breads', '\x'); +INSERT INTO northwind.categories VALUES (4, 'Dairy Products', 'Cheeses', '\x'); +INSERT INTO northwind.categories VALUES (5, 'Grains/Cereals', 'Breads, crackers, pasta, and cereal', '\x'); +INSERT INTO northwind.categories VALUES (6, 'Meat/Poultry', 'Prepared meats', '\x'); +INSERT INTO northwind.categories VALUES (7, 'Produce', 'Dried fruit and bean curd', '\x'); +INSERT INTO northwind.categories VALUES (8, 'Seafood', 'Seaweed and fish', '\x'); + + +-- +-- Data for Name: customer_demographics; Type: TABLE DATA; Schema: northwind; Owner: northwind +-- + + + +-- +-- Data for Name: customers; Type: TABLE DATA; Schema: northwind; Owner: northwind +-- + +INSERT INTO northwind.customers VALUES ('ALFKI', 'Alfreds Futterkiste', 'Maria Anders', 'Sales Representative', 'Obere Str. 57', 'Berlin', NULL, '12209', 'Germany', '030-0074321', '030-0076545'); +INSERT INTO northwind.customers VALUES ('ANATR', 'Ana Trujillo Emparedados y helados', 'Ana Trujillo', 'Owner', 'Avda. de la Constitución 2222', 'México D.F.', NULL, '05021', 'Mexico', '(5) 555-4729', '(5) 555-3745'); +INSERT INTO northwind.customers VALUES ('ANTON', 'Antonio Moreno Taquería', 'Antonio Moreno', 'Owner', 'Mataderos 2312', 'México D.F.', NULL, '05023', 'Mexico', '(5) 555-3932', NULL); +INSERT INTO northwind.customers VALUES ('AROUT', 'Around the Horn', 'Thomas Hardy', 'Sales Representative', '120 Hanover Sq.', 'London', NULL, 'WA1 1DP', 'UK', '(171) 555-7788', '(171) 555-6750'); +INSERT INTO northwind.customers VALUES ('BERGS', 'Berglunds snabbköp', 'Christina Berglund', 'Order Administrator', 'Berguvsvägen 8', 'Luleå', NULL, 'S-958 22', 'Sweden', '0921-12 34 65', '0921-12 34 67'); +INSERT INTO northwind.customers VALUES ('BLAUS', 'Blauer See Delikatessen', 'Hanna Moos', 'Sales Representative', 'Forsterstr. 57', 'Mannheim', NULL, '68306', 'Germany', '0621-08460', '0621-08924'); +INSERT INTO northwind.customers VALUES ('BLONP', 'Blondesddsl père et fils', 'Frédérique Citeaux', 'Marketing Manager', '24, place Kléber', 'Strasbourg', NULL, '67000', 'France', '88.60.15.31', '88.60.15.32'); +INSERT INTO northwind.customers VALUES ('BOLID', 'Bólido Comidas preparadas', 'Martín Sommer', 'Owner', 'C/ Araquil, 67', 'Madrid', NULL, '28023', 'Spain', '(91) 555 22 82', '(91) 555 91 99'); +INSERT INTO northwind.customers VALUES ('BONAP', 'Bon app''', 'Laurence Lebihan', 'Owner', '12, rue des Bouchers', 'Marseille', NULL, '13008', 'France', '91.24.45.40', '91.24.45.41'); +INSERT INTO northwind.customers VALUES ('BOTTM', 'Bottom-Dollar Markets', 'Elizabeth Lincoln', 'Accounting Manager', '23 Tsawassen Blvd.', 'Tsawassen', 'BC', 'T2F 8M4', 'Canada', '(604) 555-4729', '(604) 555-3745'); +INSERT INTO northwind.customers VALUES ('BSBEV', 'B''s Beverages', 'Victoria Ashworth', 'Sales Representative', 'Fauntleroy Circus', 'London', NULL, 'EC2 5NT', 'UK', '(171) 555-1212', NULL); +INSERT INTO northwind.customers VALUES ('CACTU', 'Cactus Comidas para llevar', 'Patricio Simpson', 'Sales Agent', 'Cerrito 333', 'Buenos Aires', NULL, '1010', 'Argentina', '(1) 135-5555', '(1) 135-4892'); +INSERT INTO northwind.customers VALUES ('CENTC', 'Centro comercial Moctezuma', 'Francisco Chang', 'Marketing Manager', 'Sierras de Granada 9993', 'México D.F.', NULL, '05022', 'Mexico', '(5) 555-3392', '(5) 555-7293'); +INSERT INTO northwind.customers VALUES ('CHOPS', 'Chop-suey Chinese', 'Yang Wang', 'Owner', 'Hauptstr. 29', 'Bern', NULL, '3012', 'Switzerland', '0452-076545', NULL); +INSERT INTO northwind.customers VALUES ('COMMI', 'Comércio Mineiro', 'Pedro Afonso', 'Sales Associate', 'Av. dos Lusíadas, 23', 'Sao Paulo', 'SP', '05432-043', 'Brazil', '(11) 555-7647', NULL); +INSERT INTO northwind.customers VALUES ('CONSH', 'Consolidated Holdings', 'Elizabeth Brown', 'Sales Representative', 'Berkeley Gardens 12 Brewery', 'London', NULL, 'WX1 6LT', 'UK', '(171) 555-2282', '(171) 555-9199'); +INSERT INTO northwind.customers VALUES ('DRACD', 'Drachenblut Delikatessen', 'Sven Ottlieb', 'Order Administrator', 'Walserweg 21', 'Aachen', NULL, '52066', 'Germany', '0241-039123', '0241-059428'); +INSERT INTO northwind.customers VALUES ('DUMON', 'Du monde entier', 'Janine Labrune', 'Owner', '67, rue des Cinquante Otages', 'Nantes', NULL, '44000', 'France', '40.67.88.88', '40.67.89.89'); +INSERT INTO northwind.customers VALUES ('EASTC', 'Eastern Connection', 'Ann Devon', 'Sales Agent', '35 King George', 'London', NULL, 'WX3 6FW', 'UK', '(171) 555-0297', '(171) 555-3373'); +INSERT INTO northwind.customers VALUES ('ERNSH', 'Ernst Handel', 'Roland Mendel', 'Sales Manager', 'Kirchgasse 6', 'Graz', NULL, '8010', 'Austria', '7675-3425', '7675-3426'); +INSERT INTO northwind.customers VALUES ('FAMIA', 'Familia Arquibaldo', 'Aria Cruz', 'Marketing Assistant', 'Rua Orós, 92', 'Sao Paulo', 'SP', '05442-030', 'Brazil', '(11) 555-9857', NULL); +INSERT INTO northwind.customers VALUES ('FISSA', 'FISSA Fabrica Inter. Salchichas S.A.', 'Diego Roel', 'Accounting Manager', 'C/ Moralzarzal, 86', 'Madrid', NULL, '28034', 'Spain', '(91) 555 94 44', '(91) 555 55 93'); +INSERT INTO northwind.customers VALUES ('FOLIG', 'Folies gourmandes', 'Martine Rancé', 'Assistant Sales Agent', '184, chaussée de Tournai', 'Lille', NULL, '59000', 'France', '20.16.10.16', '20.16.10.17'); +INSERT INTO northwind.customers VALUES ('FOLKO', 'Folk och fä HB', 'Maria Larsson', 'Owner', 'Åkergatan 24', 'Bräcke', NULL, 'S-844 67', 'Sweden', '0695-34 67 21', NULL); +INSERT INTO northwind.customers VALUES ('FRANK', 'Frankenversand', 'Peter Franken', 'Marketing Manager', 'Berliner Platz 43', 'München', NULL, '80805', 'Germany', '089-0877310', '089-0877451'); +INSERT INTO northwind.customers VALUES ('FRANR', 'France restauration', 'Carine Schmitt', 'Marketing Manager', '54, rue Royale', 'Nantes', NULL, '44000', 'France', '40.32.21.21', '40.32.21.20'); +INSERT INTO northwind.customers VALUES ('FRANS', 'Franchi S.p.A.', 'Paolo Accorti', 'Sales Representative', 'Via Monte Bianco 34', 'Torino', NULL, '10100', 'Italy', '011-4988260', '011-4988261'); +INSERT INTO northwind.customers VALUES ('FURIB', 'Furia Bacalhau e Frutos do Mar', 'Lino Rodriguez', 'Sales Manager', 'Jardim das rosas n. 32', 'Lisboa', NULL, '1675', 'Portugal', '(1) 354-2534', '(1) 354-2535'); +INSERT INTO northwind.customers VALUES ('GALED', 'Galería del gastrónomo', 'Eduardo Saavedra', 'Marketing Manager', 'Rambla de Cataluña, 23', 'Barcelona', NULL, '08022', 'Spain', '(93) 203 4560', '(93) 203 4561'); +INSERT INTO northwind.customers VALUES ('GODOS', 'Godos Cocina Típica', 'José Pedro Freyre', 'Sales Manager', 'C/ Romero, 33', 'Sevilla', NULL, '41101', 'Spain', '(95) 555 82 82', NULL); +INSERT INTO northwind.customers VALUES ('GOURL', 'Gourmet Lanchonetes', 'André Fonseca', 'Sales Associate', 'Av. Brasil, 442', 'Campinas', 'SP', '04876-786', 'Brazil', '(11) 555-9482', NULL); +INSERT INTO northwind.customers VALUES ('GREAL', 'Great Lakes Food Market', 'Howard Snyder', 'Marketing Manager', '2732 Baker Blvd.', 'Eugene', 'OR', '97403', 'USA', '(503) 555-7555', NULL); +INSERT INTO northwind.customers VALUES ('GROSR', 'GROSELLA-Restaurante', 'Manuel Pereira', 'Owner', '5ª Ave. Los Palos Grandes', 'Caracas', 'DF', '1081', 'Venezuela', '(2) 283-2951', '(2) 283-3397'); +INSERT INTO northwind.customers VALUES ('HANAR', 'Hanari Carnes', 'Mario Pontes', 'Accounting Manager', 'Rua do Paço, 67', 'Rio de Janeiro', 'RJ', '05454-876', 'Brazil', '(21) 555-0091', '(21) 555-8765'); +INSERT INTO northwind.customers VALUES ('HILAA', 'HILARION-Abastos', 'Carlos Hernández', 'Sales Representative', 'Carrera 22 con Ave. Carlos Soublette #8-35', 'San Cristóbal', 'Táchira', '5022', 'Venezuela', '(5) 555-1340', '(5) 555-1948'); +INSERT INTO northwind.customers VALUES ('HUNGC', 'Hungry Coyote Import Store', 'Yoshi Latimer', 'Sales Representative', 'City Center Plaza 516 Main St.', 'Elgin', 'OR', '97827', 'USA', '(503) 555-6874', '(503) 555-2376'); +INSERT INTO northwind.customers VALUES ('HUNGO', 'Hungry Owl All-Night Grocers', 'Patricia McKenna', 'Sales Associate', '8 Johnstown Road', 'Cork', 'Co. Cork', NULL, 'Ireland', '2967 542', '2967 3333'); +INSERT INTO northwind.customers VALUES ('ISLAT', 'Island Trading', 'Helen Bennett', 'Marketing Manager', 'Garden House Crowther Way', 'Cowes', 'Isle of Wight', 'PO31 7PJ', 'UK', '(198) 555-8888', NULL); +INSERT INTO northwind.customers VALUES ('KOENE', 'Königlich Essen', 'Philip Cramer', 'Sales Associate', 'Maubelstr. 90', 'Brandenburg', NULL, '14776', 'Germany', '0555-09876', NULL); +INSERT INTO northwind.customers VALUES ('LACOR', 'La corne d''abondance', 'Daniel Tonini', 'Sales Representative', '67, avenue de l''Europe', 'Versailles', NULL, '78000', 'France', '30.59.84.10', '30.59.85.11'); +INSERT INTO northwind.customers VALUES ('LAMAI', 'La maison d''Asie', 'Annette Roulet', 'Sales Manager', '1 rue Alsace-Lorraine', 'Toulouse', NULL, '31000', 'France', '61.77.61.10', '61.77.61.11'); +INSERT INTO northwind.customers VALUES ('LAUGB', 'Laughing Bacchus Wine Cellars', 'Yoshi Tannamuri', 'Marketing Assistant', '1900 Oak St.', 'Vancouver', 'BC', 'V3F 2K1', 'Canada', '(604) 555-3392', '(604) 555-7293'); +INSERT INTO northwind.customers VALUES ('LAZYK', 'Lazy K Kountry Store', 'John Steel', 'Marketing Manager', '12 Orchestra Terrace', 'Walla Walla', 'WA', '99362', 'USA', '(509) 555-7969', '(509) 555-6221'); +INSERT INTO northwind.customers VALUES ('LEHMS', 'Lehmanns Marktstand', 'Renate Messner', 'Sales Representative', 'Magazinweg 7', 'Frankfurt a.M.', NULL, '60528', 'Germany', '069-0245984', '069-0245874'); +INSERT INTO northwind.customers VALUES ('LETSS', 'Let''s Stop N Shop', 'Jaime Yorres', 'Owner', '87 Polk St. Suite 5', 'San Francisco', 'CA', '94117', 'USA', '(415) 555-5938', NULL); +INSERT INTO northwind.customers VALUES ('LILAS', 'LILA-Supermercado', 'Carlos González', 'Accounting Manager', 'Carrera 52 con Ave. Bolívar #65-98 Llano Largo', 'Barquisimeto', 'Lara', '3508', 'Venezuela', '(9) 331-6954', '(9) 331-7256'); +INSERT INTO northwind.customers VALUES ('LINOD', 'LINO-Delicateses', 'Felipe Izquierdo', 'Owner', 'Ave. 5 de Mayo Porlamar', 'I. de Margarita', 'Nueva Esparta', '4980', 'Venezuela', '(8) 34-56-12', '(8) 34-93-93'); +INSERT INTO northwind.customers VALUES ('LONEP', 'Lonesome Pine Restaurant', 'Fran Wilson', 'Sales Manager', '89 Chiaroscuro Rd.', 'Portland', 'OR', '97219', 'USA', '(503) 555-9573', '(503) 555-9646'); +INSERT INTO northwind.customers VALUES ('MAGAA', 'Magazzini Alimentari Riuniti', 'Giovanni Rovelli', 'Marketing Manager', 'Via Ludovico il Moro 22', 'Bergamo', NULL, '24100', 'Italy', '035-640230', '035-640231'); +INSERT INTO northwind.customers VALUES ('MAISD', 'Maison Dewey', 'Catherine Dewey', 'Sales Agent', 'Rue Joseph-Bens 532', 'Bruxelles', NULL, 'B-1180', 'Belgium', '(02) 201 24 67', '(02) 201 24 68'); +INSERT INTO northwind.customers VALUES ('MEREP', 'Mère Paillarde', 'Jean Fresnière', 'Marketing Assistant', '43 rue St. Laurent', 'Montréal', 'Québec', 'H1J 1C3', 'Canada', '(514) 555-8054', '(514) 555-8055'); +INSERT INTO northwind.customers VALUES ('MORGK', 'Morgenstern Gesundkost', 'Alexander Feuer', 'Marketing Assistant', 'Heerstr. 22', 'Leipzig', NULL, '04179', 'Germany', '0342-023176', NULL); +INSERT INTO northwind.customers VALUES ('NORTS', 'North/South', 'Simon Crowther', 'Sales Associate', 'South House 300 Queensbridge', 'London', NULL, 'SW7 1RZ', 'UK', '(171) 555-7733', '(171) 555-2530'); +INSERT INTO northwind.customers VALUES ('OCEAN', 'Océano Atlántico Ltda.', 'Yvonne Moncada', 'Sales Agent', 'Ing. Gustavo Moncada 8585 Piso 20-A', 'Buenos Aires', NULL, '1010', 'Argentina', '(1) 135-5333', '(1) 135-5535'); +INSERT INTO northwind.customers VALUES ('OLDWO', 'Old World Delicatessen', 'Rene Phillips', 'Sales Representative', '2743 Bering St.', 'Anchorage', 'AK', '99508', 'USA', '(907) 555-7584', '(907) 555-2880'); +INSERT INTO northwind.customers VALUES ('OTTIK', 'Ottilies Käseladen', 'Henriette Pfalzheim', 'Owner', 'Mehrheimerstr. 369', 'Köln', NULL, '50739', 'Germany', '0221-0644327', '0221-0765721'); +INSERT INTO northwind.customers VALUES ('PARIS', 'Paris spécialités', 'Marie Bertrand', 'Owner', '265, boulevard Charonne', 'Paris', NULL, '75012', 'France', '(1) 42.34.22.66', '(1) 42.34.22.77'); +INSERT INTO northwind.customers VALUES ('PERIC', 'Pericles Comidas clásicas', 'Guillermo Fernández', 'Sales Representative', 'Calle Dr. Jorge Cash 321', 'México D.F.', NULL, '05033', 'Mexico', '(5) 552-3745', '(5) 545-3745'); +INSERT INTO northwind.customers VALUES ('PICCO', 'Piccolo und mehr', 'Georg Pipps', 'Sales Manager', 'Geislweg 14', 'Salzburg', NULL, '5020', 'Austria', '6562-9722', '6562-9723'); +INSERT INTO northwind.customers VALUES ('PRINI', 'Princesa Isabel Vinhos', 'Isabel de Castro', 'Sales Representative', 'Estrada da saúde n. 58', 'Lisboa', NULL, '1756', 'Portugal', '(1) 356-5634', NULL); +INSERT INTO northwind.customers VALUES ('QUEDE', 'Que Delícia', 'Bernardo Batista', 'Accounting Manager', 'Rua da Panificadora, 12', 'Rio de Janeiro', 'RJ', '02389-673', 'Brazil', '(21) 555-4252', '(21) 555-4545'); +INSERT INTO northwind.customers VALUES ('QUEEN', 'Queen Cozinha', 'Lúcia Carvalho', 'Marketing Assistant', 'Alameda dos Canàrios, 891', 'Sao Paulo', 'SP', '05487-020', 'Brazil', '(11) 555-1189', NULL); +INSERT INTO northwind.customers VALUES ('QUICK', 'QUICK-Stop', 'Horst Kloss', 'Accounting Manager', 'Taucherstraße 10', 'Cunewalde', NULL, '01307', 'Germany', '0372-035188', NULL); +INSERT INTO northwind.customers VALUES ('RANCH', 'Rancho grande', 'Sergio Gutiérrez', 'Sales Representative', 'Av. del Libertador 900', 'Buenos Aires', NULL, '1010', 'Argentina', '(1) 123-5555', '(1) 123-5556'); +INSERT INTO northwind.customers VALUES ('RATTC', 'Rattlesnake Canyon Grocery', 'Paula Wilson', 'Assistant Sales Representative', '2817 Milton Dr.', 'Albuquerque', 'NM', '87110', 'USA', '(505) 555-5939', '(505) 555-3620'); +INSERT INTO northwind.customers VALUES ('REGGC', 'Reggiani Caseifici', 'Maurizio Moroni', 'Sales Associate', 'Strada Provinciale 124', 'Reggio Emilia', NULL, '42100', 'Italy', '0522-556721', '0522-556722'); +INSERT INTO northwind.customers VALUES ('RICAR', 'Ricardo Adocicados', 'Janete Limeira', 'Assistant Sales Agent', 'Av. Copacabana, 267', 'Rio de Janeiro', 'RJ', '02389-890', 'Brazil', '(21) 555-3412', NULL); +INSERT INTO northwind.customers VALUES ('RICSU', 'Richter Supermarkt', 'Michael Holz', 'Sales Manager', 'Grenzacherweg 237', 'Genève', NULL, '1203', 'Switzerland', '0897-034214', NULL); +INSERT INTO northwind.customers VALUES ('ROMEY', 'Romero y tomillo', 'Alejandra Camino', 'Accounting Manager', 'Gran Vía, 1', 'Madrid', NULL, '28001', 'Spain', '(91) 745 6200', '(91) 745 6210'); +INSERT INTO northwind.customers VALUES ('SANTG', 'Santé Gourmet', 'Jonas Bergulfsen', 'Owner', 'Erling Skakkes gate 78', 'Stavern', NULL, '4110', 'Norway', '07-98 92 35', '07-98 92 47'); +INSERT INTO northwind.customers VALUES ('SAVEA', 'Save-a-lot Markets', 'Jose Pavarotti', 'Sales Representative', '187 Suffolk Ln.', 'Boise', 'ID', '83720', 'USA', '(208) 555-8097', NULL); +INSERT INTO northwind.customers VALUES ('SEVES', 'Seven Seas Imports', 'Hari Kumar', 'Sales Manager', '90 Wadhurst Rd.', 'London', NULL, 'OX15 4NB', 'UK', '(171) 555-1717', '(171) 555-5646'); +INSERT INTO northwind.customers VALUES ('SIMOB', 'Simons bistro', 'Jytte Petersen', 'Owner', 'Vinbæltet 34', 'Kobenhavn', NULL, '1734', 'Denmark', '31 12 34 56', '31 13 35 57'); +INSERT INTO northwind.customers VALUES ('SPECD', 'Spécialités du monde', 'Dominique Perrier', 'Marketing Manager', '25, rue Lauriston', 'Paris', NULL, '75016', 'France', '(1) 47.55.60.10', '(1) 47.55.60.20'); +INSERT INTO northwind.customers VALUES ('SPLIR', 'Split Rail Beer & Ale', 'Art Braunschweiger', 'Sales Manager', 'P.O. Box 555', 'Lander', 'WY', '82520', 'USA', '(307) 555-4680', '(307) 555-6525'); +INSERT INTO northwind.customers VALUES ('SUPRD', 'Suprêmes délices', 'Pascale Cartrain', 'Accounting Manager', 'Boulevard Tirou, 255', 'Charleroi', NULL, 'B-6000', 'Belgium', '(071) 23 67 22 20', '(071) 23 67 22 21'); +INSERT INTO northwind.customers VALUES ('THEBI', 'The Big Cheese', 'Liz Nixon', 'Marketing Manager', '89 Jefferson Way Suite 2', 'Portland', 'OR', '97201', 'USA', '(503) 555-3612', NULL); +INSERT INTO northwind.customers VALUES ('THECR', 'The Cracker Box', 'Liu Wong', 'Marketing Assistant', '55 Grizzly Peak Rd.', 'Butte', 'MT', '59801', 'USA', '(406) 555-5834', '(406) 555-8083'); +INSERT INTO northwind.customers VALUES ('TOMSP', 'Toms Spezialitäten', 'Karin Josephs', 'Marketing Manager', 'Luisenstr. 48', 'Münster', NULL, '44087', 'Germany', '0251-031259', '0251-035695'); +INSERT INTO northwind.customers VALUES ('TORTU', 'Tortuga Restaurante', 'Miguel Angel Paolino', 'Owner', 'Avda. Azteca 123', 'México D.F.', NULL, '05033', 'Mexico', '(5) 555-2933', NULL); +INSERT INTO northwind.customers VALUES ('TRADH', 'Tradição Hipermercados', 'Anabela Domingues', 'Sales Representative', 'Av. Inês de Castro, 414', 'Sao Paulo', 'SP', '05634-030', 'Brazil', '(11) 555-2167', '(11) 555-2168'); +INSERT INTO northwind.customers VALUES ('TRAIH', 'Trail''s Head Gourmet Provisioners', 'Helvetius Nagy', 'Sales Associate', '722 DaVinci Blvd.', 'Kirkland', 'WA', '98034', 'USA', '(206) 555-8257', '(206) 555-2174'); +INSERT INTO northwind.customers VALUES ('VAFFE', 'Vaffeljernet', 'Palle Ibsen', 'Sales Manager', 'Smagsloget 45', 'Århus', NULL, '8200', 'Denmark', '86 21 32 43', '86 22 33 44'); +INSERT INTO northwind.customers VALUES ('VICTE', 'Victuailles en stock', 'Mary Saveley', 'Sales Agent', '2, rue du Commerce', 'Lyon', NULL, '69004', 'France', '78.32.54.86', '78.32.54.87'); +INSERT INTO northwind.customers VALUES ('VINET', 'Vins et alcools Chevalier', 'Paul Henriot', 'Accounting Manager', '59 rue de l''Abbaye', 'Reims', NULL, '51100', 'France', '26.47.15.10', '26.47.15.11'); +INSERT INTO northwind.customers VALUES ('WANDK', 'Die Wandernde Kuh', 'Rita Müller', 'Sales Representative', 'Adenauerallee 900', 'Stuttgart', NULL, '70563', 'Germany', '0711-020361', '0711-035428'); +INSERT INTO northwind.customers VALUES ('WARTH', 'Wartian Herkku', 'Pirkko Koskitalo', 'Accounting Manager', 'Torikatu 38', 'Oulu', NULL, '90110', 'Finland', '981-443655', '981-443655'); +INSERT INTO northwind.customers VALUES ('WELLI', 'Wellington Importadora', 'Paula Parente', 'Sales Manager', 'Rua do Mercado, 12', 'Resende', 'SP', '08737-363', 'Brazil', '(14) 555-8122', NULL); +INSERT INTO northwind.customers VALUES ('WHITC', 'White Clover Markets', 'Karl Jablonski', 'Owner', '305 - 14th Ave. S. Suite 3B', 'Seattle', 'WA', '98128', 'USA', '(206) 555-4112', '(206) 555-4115'); +INSERT INTO northwind.customers VALUES ('WILMK', 'Wilman Kala', 'Matti Karttunen', 'Owner/Marketing Assistant', 'Keskuskatu 45', 'Helsinki', NULL, '21240', 'Finland', '90-224 8858', '90-224 8858'); +INSERT INTO northwind.customers VALUES ('WOLZA', 'Wolski Zajazd', 'Zbyszek Piestrzeniewicz', 'Owner', 'ul. Filtrowa 68', 'Warszawa', NULL, '01-012', 'Poland', '(26) 642-7012', '(26) 642-7012'); + + +-- +-- Data for Name: customer_customer_demo; Type: TABLE DATA; Schema: northwind; Owner: northwind +-- + + + +-- +-- Data for Name: employees; Type: TABLE DATA; Schema: northwind; Owner: northwind +-- + +INSERT INTO northwind.employees VALUES (2, 'Fuller', 'Andrew', 'Vice President, Sales', 'Dr.', '1952-02-19', '1992-08-14', '908 W. Capital Way', 'Tacoma', 'WA', '98401', 'USA', '(206) 555-9482', '3457', '\x', 'Andrew received his BTS commercial in 1974 and a Ph.D. in international marketing from the University of Dallas in 1981. He is fluent in French and Italian and reads German. He joined the company as a sales representative, was promoted to sales manager in January 1992 and to vice president of sales in March 1993. Andrew is a member of the Sales Management Roundtable, the Seattle Chamber of Commerce, and the Pacific Rim Importers Association.', NULL, 'http://accweb/emmployees/fuller.bmp'); +INSERT INTO northwind.employees VALUES (3, 'Leverling', 'Janet', 'Sales Representative', 'Ms.', '1963-08-30', '1992-04-01', '722 Moss Bay Blvd.', 'Kirkland', 'WA', '98033', 'USA', '(206) 555-3412', '3355', '\x', 'Janet has a BS degree in chemistry from Boston College (1984). She has also completed a certificate program in food retailing management. Janet was hired as a sales associate in 1991 and promoted to sales representative in February 1992.', 2, 'http://accweb/emmployees/leverling.bmp'); +INSERT INTO northwind.employees VALUES (4, 'Peacock', 'Margaret', 'Sales Representative', 'Mrs.', '1937-09-19', '1993-05-03', '4110 Old Redmond Rd.', 'Redmond', 'WA', '98052', 'USA', '(206) 555-8122', '5176', '\x', 'Margaret holds a BA in English literature from Concordia College (1958) and an MA from the American Institute of Culinary Arts (1966). She was assigned to the London office temporarily from July through November 1992.', 2, 'http://accweb/emmployees/peacock.bmp'); +INSERT INTO northwind.employees VALUES (5, 'Buchanan', 'Steven', 'Sales Manager', 'Mr.', '1955-03-04', '1993-10-17', '14 Garrett Hill', 'London', NULL, 'SW1 8JR', 'UK', '(71) 555-4848', '3453', '\x', 'Steven Buchanan graduated from St. Andrews University, Scotland, with a BSC degree in 1976. Upon joining the company as a sales representative in 1992, he spent 6 months in an orientation program at the Seattle office and then returned to his permanent post in London. He was promoted to sales manager in March 1993. Mr. Buchanan has completed the courses Successful Telemarketing and International Sales Management. He is fluent in French.', 2, 'http://accweb/emmployees/buchanan.bmp'); +INSERT INTO northwind.employees VALUES (6, 'Suyama', 'Michael', 'Sales Representative', 'Mr.', '1963-07-02', '1993-10-17', 'Coventry House\nMiner Rd.', 'London', NULL, 'EC2 7JR', 'UK', '(71) 555-7773', '428', '\x', 'Michael is a graduate of Sussex University (MA, economics, 1983) and the University of California at Los Angeles (MBA, marketing, 1986). He has also taken the courses Multi-Cultural Selling and Time Management for the Sales Professional. He is fluent in Japanese and can read and write French, Portuguese, and Spanish.', 5, 'http://accweb/emmployees/davolio.bmp'); +INSERT INTO northwind.employees VALUES (7, 'King', 'Robert', 'Sales Representative', 'Mr.', '1960-05-29', '1994-01-02', 'Edgeham Hollow\nWinchester Way', 'London', NULL, 'RG1 9SP', 'UK', '(71) 555-5598', '465', '\x', 'Robert King served in the Peace Corps and traveled extensively before completing his degree in English at the University of Michigan in 1992, the year he joined the company. After completing a course entitled Selling in Europe, he was transferred to the London office in March 1993.', 5, 'http://accweb/emmployees/davolio.bmp'); +INSERT INTO northwind.employees VALUES (8, 'Callahan', 'Laura', 'Inside Sales Coordinator', 'Ms.', '1958-01-09', '1994-03-05', '4726 - 11th Ave. N.E.', 'Seattle', 'WA', '98105', 'USA', '(206) 555-1189', '2344', '\x', 'Laura received a BA in psychology from the University of Washington. She has also completed a course in business French. She reads and writes French.', 2, 'http://accweb/emmployees/davolio.bmp'); +INSERT INTO northwind.employees VALUES (9, 'Dodsworth', 'Anne', 'Sales Representative', 'Ms.', '1966-01-27', '1994-11-15', '7 Houndstooth Rd.', 'London', NULL, 'WG2 7LT', 'UK', '(71) 555-4444', '452', '\x', 'Anne has a BA degree in English from St. Lawrence College. She is fluent in French and German.', 5, 'http://accweb/emmployees/davolio.bmp'); +INSERT INTO northwind.employees VALUES (1, 'Davolio', 'Nancy', 'Sales Representative', 'Ms.', '1948-12-08', '1992-05-01', '507 - 20th Ave. E.\nApt. 2A', 'Seattle', 'WA', '98122', 'USA', '(206) 555-9857', '5467', '\x', 'Education includes a BA in psychology from Colorado State University in 1970. She also completed The Art of the Cold Call. Nancy is a member of Toastmasters International.', 2, 'http://accweb/emmployees/davolio.bmp'); + + +-- +-- Data for Name: region; Type: TABLE DATA; Schema: northwind; Owner: northwind +-- + +INSERT INTO northwind.region VALUES (1, 'Eastern'); +INSERT INTO northwind.region VALUES (2, 'Western'); +INSERT INTO northwind.region VALUES (3, 'Northern'); +INSERT INTO northwind.region VALUES (4, 'Southern'); + + +-- +-- Data for Name: territories; Type: TABLE DATA; Schema: northwind; Owner: northwind +-- + +INSERT INTO northwind.territories VALUES ('01581', 'Westboro', 1); +INSERT INTO northwind.territories VALUES ('01730', 'Bedford', 1); +INSERT INTO northwind.territories VALUES ('01833', 'Georgetow', 1); +INSERT INTO northwind.territories VALUES ('02116', 'Boston', 1); +INSERT INTO northwind.territories VALUES ('02139', 'Cambridge', 1); +INSERT INTO northwind.territories VALUES ('02184', 'Braintree', 1); +INSERT INTO northwind.territories VALUES ('02903', 'Providence', 1); +INSERT INTO northwind.territories VALUES ('03049', 'Hollis', 3); +INSERT INTO northwind.territories VALUES ('03801', 'Portsmouth', 3); +INSERT INTO northwind.territories VALUES ('06897', 'Wilton', 1); +INSERT INTO northwind.territories VALUES ('07960', 'Morristown', 1); +INSERT INTO northwind.territories VALUES ('08837', 'Edison', 1); +INSERT INTO northwind.territories VALUES ('10019', 'New York', 1); +INSERT INTO northwind.territories VALUES ('10038', 'New York', 1); +INSERT INTO northwind.territories VALUES ('11747', 'Mellvile', 1); +INSERT INTO northwind.territories VALUES ('14450', 'Fairport', 1); +INSERT INTO northwind.territories VALUES ('19428', 'Philadelphia', 3); +INSERT INTO northwind.territories VALUES ('19713', 'Neward', 1); +INSERT INTO northwind.territories VALUES ('20852', 'Rockville', 1); +INSERT INTO northwind.territories VALUES ('27403', 'Greensboro', 1); +INSERT INTO northwind.territories VALUES ('27511', 'Cary', 1); +INSERT INTO northwind.territories VALUES ('29202', 'Columbia', 4); +INSERT INTO northwind.territories VALUES ('30346', 'Atlanta', 4); +INSERT INTO northwind.territories VALUES ('31406', 'Savannah', 4); +INSERT INTO northwind.territories VALUES ('32859', 'Orlando', 4); +INSERT INTO northwind.territories VALUES ('33607', 'Tampa', 4); +INSERT INTO northwind.territories VALUES ('40222', 'Louisville', 1); +INSERT INTO northwind.territories VALUES ('44122', 'Beachwood', 3); +INSERT INTO northwind.territories VALUES ('45839', 'Findlay', 3); +INSERT INTO northwind.territories VALUES ('48075', 'Southfield', 3); +INSERT INTO northwind.territories VALUES ('48084', 'Troy', 3); +INSERT INTO northwind.territories VALUES ('48304', 'Bloomfield Hills', 3); +INSERT INTO northwind.territories VALUES ('53404', 'Racine', 3); +INSERT INTO northwind.territories VALUES ('55113', 'Roseville', 3); +INSERT INTO northwind.territories VALUES ('55439', 'Minneapolis', 3); +INSERT INTO northwind.territories VALUES ('60179', 'Hoffman Estates', 2); +INSERT INTO northwind.territories VALUES ('60601', 'Chicago', 2); +INSERT INTO northwind.territories VALUES ('72716', 'Bentonville', 4); +INSERT INTO northwind.territories VALUES ('75234', 'Dallas', 4); +INSERT INTO northwind.territories VALUES ('78759', 'Austin', 4); +INSERT INTO northwind.territories VALUES ('80202', 'Denver', 2); +INSERT INTO northwind.territories VALUES ('80909', 'Colorado Springs', 2); +INSERT INTO northwind.territories VALUES ('85014', 'Phoenix', 2); +INSERT INTO northwind.territories VALUES ('85251', 'Scottsdale', 2); +INSERT INTO northwind.territories VALUES ('90405', 'Santa Monica', 2); +INSERT INTO northwind.territories VALUES ('94025', 'Menlo Park', 2); +INSERT INTO northwind.territories VALUES ('94105', 'San Francisco', 2); +INSERT INTO northwind.territories VALUES ('95008', 'Campbell', 2); +INSERT INTO northwind.territories VALUES ('95054', 'Santa Clara', 2); +INSERT INTO northwind.territories VALUES ('95060', 'Santa Cruz', 2); +INSERT INTO northwind.territories VALUES ('98004', 'Bellevue', 2); +INSERT INTO northwind.territories VALUES ('98052', 'Redmond', 2); +INSERT INTO northwind.territories VALUES ('98104', 'Seattle', 2); + + +-- +-- Data for Name: employee_territories; Type: TABLE DATA; Schema: northwind; Owner: northwind +-- + +INSERT INTO northwind.employee_territories VALUES (1, '06897'); +INSERT INTO northwind.employee_territories VALUES (1, '19713'); +INSERT INTO northwind.employee_territories VALUES (2, '01581'); +INSERT INTO northwind.employee_territories VALUES (2, '01730'); +INSERT INTO northwind.employee_territories VALUES (2, '01833'); +INSERT INTO northwind.employee_territories VALUES (2, '02116'); +INSERT INTO northwind.employee_territories VALUES (2, '02139'); +INSERT INTO northwind.employee_territories VALUES (2, '02184'); +INSERT INTO northwind.employee_territories VALUES (2, '40222'); +INSERT INTO northwind.employee_territories VALUES (3, '30346'); +INSERT INTO northwind.employee_territories VALUES (3, '31406'); +INSERT INTO northwind.employee_territories VALUES (3, '32859'); +INSERT INTO northwind.employee_territories VALUES (3, '33607'); +INSERT INTO northwind.employee_territories VALUES (4, '20852'); +INSERT INTO northwind.employee_territories VALUES (4, '27403'); +INSERT INTO northwind.employee_territories VALUES (4, '27511'); +INSERT INTO northwind.employee_territories VALUES (5, '02903'); +INSERT INTO northwind.employee_territories VALUES (5, '07960'); +INSERT INTO northwind.employee_territories VALUES (5, '08837'); +INSERT INTO northwind.employee_territories VALUES (5, '10019'); +INSERT INTO northwind.employee_territories VALUES (5, '10038'); +INSERT INTO northwind.employee_territories VALUES (5, '11747'); +INSERT INTO northwind.employee_territories VALUES (5, '14450'); +INSERT INTO northwind.employee_territories VALUES (6, '85014'); +INSERT INTO northwind.employee_territories VALUES (6, '85251'); +INSERT INTO northwind.employee_territories VALUES (6, '98004'); +INSERT INTO northwind.employee_territories VALUES (6, '98052'); +INSERT INTO northwind.employee_territories VALUES (6, '98104'); +INSERT INTO northwind.employee_territories VALUES (7, '60179'); +INSERT INTO northwind.employee_territories VALUES (7, '60601'); +INSERT INTO northwind.employee_territories VALUES (7, '80202'); +INSERT INTO northwind.employee_territories VALUES (7, '80909'); +INSERT INTO northwind.employee_territories VALUES (7, '90405'); +INSERT INTO northwind.employee_territories VALUES (7, '94025'); +INSERT INTO northwind.employee_territories VALUES (7, '94105'); +INSERT INTO northwind.employee_territories VALUES (7, '95008'); +INSERT INTO northwind.employee_territories VALUES (7, '95054'); +INSERT INTO northwind.employee_territories VALUES (7, '95060'); +INSERT INTO northwind.employee_territories VALUES (8, '19428'); +INSERT INTO northwind.employee_territories VALUES (8, '44122'); +INSERT INTO northwind.employee_territories VALUES (8, '45839'); +INSERT INTO northwind.employee_territories VALUES (8, '53404'); +INSERT INTO northwind.employee_territories VALUES (9, '03049'); +INSERT INTO northwind.employee_territories VALUES (9, '03801'); +INSERT INTO northwind.employee_territories VALUES (9, '48075'); +INSERT INTO northwind.employee_territories VALUES (9, '48084'); +INSERT INTO northwind.employee_territories VALUES (9, '48304'); +INSERT INTO northwind.employee_territories VALUES (9, '55113'); +INSERT INTO northwind.employee_territories VALUES (9, '55439'); + + +-- +-- Data for Name: shippers; Type: TABLE DATA; Schema: northwind; Owner: northwind +-- + +INSERT INTO northwind.shippers VALUES (1, 'Speedy Express', '(503) 555-9831'); +INSERT INTO northwind.shippers VALUES (2, 'United Package', '(503) 555-3199'); +INSERT INTO northwind.shippers VALUES (3, 'Federal Shipping', '(503) 555-9931'); +INSERT INTO northwind.shippers VALUES (4, 'Alliance Shippers', '1-800-222-0451'); +INSERT INTO northwind.shippers VALUES (5, 'UPS', '1-800-782-7892'); +INSERT INTO northwind.shippers VALUES (6, 'DHL', '1-800-225-5345'); + + +-- +-- Data for Name: orders; Type: TABLE DATA; Schema: northwind; Owner: northwind +-- + +INSERT INTO northwind.orders VALUES (10248, 'VINET', 5, '1996-07-04', '1996-08-01', '1996-07-16', 3, 32.3800011, 'Vins et alcools Chevalier', '59 rue de l''Abbaye', 'Reims', NULL, '51100', 'France'); +INSERT INTO northwind.orders VALUES (10249, 'TOMSP', 6, '1996-07-05', '1996-08-16', '1996-07-10', 1, 11.6099997, 'Toms Spezialitäten', 'Luisenstr. 48', 'Münster', NULL, '44087', 'Germany'); +INSERT INTO northwind.orders VALUES (10250, 'HANAR', 4, '1996-07-08', '1996-08-05', '1996-07-12', 2, 65.8300018, 'Hanari Carnes', 'Rua do Paço, 67', 'Rio de Janeiro', 'RJ', '05454-876', 'Brazil'); +INSERT INTO northwind.orders VALUES (10251, 'VICTE', 3, '1996-07-08', '1996-08-05', '1996-07-15', 1, 41.3400002, 'Victuailles en stock', '2, rue du Commerce', 'Lyon', NULL, '69004', 'France'); +INSERT INTO northwind.orders VALUES (10252, 'SUPRD', 4, '1996-07-09', '1996-08-06', '1996-07-11', 2, 51.2999992, 'Suprêmes délices', 'Boulevard Tirou, 255', 'Charleroi', NULL, 'B-6000', 'Belgium'); +INSERT INTO northwind.orders VALUES (10253, 'HANAR', 3, '1996-07-10', '1996-07-24', '1996-07-16', 2, 58.1699982, 'Hanari Carnes', 'Rua do Paço, 67', 'Rio de Janeiro', 'RJ', '05454-876', 'Brazil'); +INSERT INTO northwind.orders VALUES (10254, 'CHOPS', 5, '1996-07-11', '1996-08-08', '1996-07-23', 2, 22.9799995, 'Chop-suey Chinese', 'Hauptstr. 31', 'Bern', NULL, '3012', 'Switzerland'); +INSERT INTO northwind.orders VALUES (10255, 'RICSU', 9, '1996-07-12', '1996-08-09', '1996-07-15', 3, 148.330002, 'Richter Supermarkt', 'Starenweg 5', 'Genève', NULL, '1204', 'Switzerland'); +INSERT INTO northwind.orders VALUES (10256, 'WELLI', 3, '1996-07-15', '1996-08-12', '1996-07-17', 2, 13.9700003, 'Wellington Importadora', 'Rua do Mercado, 12', 'Resende', 'SP', '08737-363', 'Brazil'); +INSERT INTO northwind.orders VALUES (10257, 'HILAA', 4, '1996-07-16', '1996-08-13', '1996-07-22', 3, 81.9100037, 'HILARION-Abastos', 'Carrera 22 con Ave. Carlos Soublette #8-35', 'San Cristóbal', 'Táchira', '5022', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10259, 'CENTC', 4, '1996-07-18', '1996-08-15', '1996-07-25', 3, 3.25, 'Centro comercial Moctezuma', 'Sierras de Granada 9993', 'México D.F.', NULL, '05022', 'Mexico'); +INSERT INTO northwind.orders VALUES (10260, 'OTTIK', 4, '1996-07-19', '1996-08-16', '1996-07-29', 1, 55.0900002, 'Ottilies Käseladen', 'Mehrheimerstr. 369', 'Köln', NULL, '50739', 'Germany'); +INSERT INTO northwind.orders VALUES (10261, 'QUEDE', 4, '1996-07-19', '1996-08-16', '1996-07-30', 2, 3.04999995, 'Que Delícia', 'Rua da Panificadora, 12', 'Rio de Janeiro', 'RJ', '02389-673', 'Brazil'); +INSERT INTO northwind.orders VALUES (10262, 'RATTC', 8, '1996-07-22', '1996-08-19', '1996-07-25', 3, 48.2900009, 'Rattlesnake Canyon Grocery', '2817 Milton Dr.', 'Albuquerque', 'NM', '87110', 'USA'); +INSERT INTO northwind.orders VALUES (10263, 'ERNSH', 9, '1996-07-23', '1996-08-20', '1996-07-31', 3, 146.059998, 'Ernst Handel', 'Kirchgasse 6', 'Graz', NULL, '8010', 'Austria'); +INSERT INTO northwind.orders VALUES (10264, 'FOLKO', 6, '1996-07-24', '1996-08-21', '1996-08-23', 3, 3.67000008, 'Folk och fä HB', 'Åkergatan 24', 'Bräcke', NULL, 'S-844 67', 'Sweden'); +INSERT INTO northwind.orders VALUES (10265, 'BLONP', 2, '1996-07-25', '1996-08-22', '1996-08-12', 1, 55.2799988, 'Blondel père et fils', '24, place Kléber', 'Strasbourg', NULL, '67000', 'France'); +INSERT INTO northwind.orders VALUES (10266, 'WARTH', 3, '1996-07-26', '1996-09-06', '1996-07-31', 3, 25.7299995, 'Wartian Herkku', 'Torikatu 38', 'Oulu', NULL, '90110', 'Finland'); +INSERT INTO northwind.orders VALUES (10267, 'FRANK', 4, '1996-07-29', '1996-08-26', '1996-08-06', 1, 208.580002, 'Frankenversand', 'Berliner Platz 43', 'München', NULL, '80805', 'Germany'); +INSERT INTO northwind.orders VALUES (10268, 'GROSR', 8, '1996-07-30', '1996-08-27', '1996-08-02', 3, 66.2900009, 'GROSELLA-Restaurante', '5ª Ave. Los Palos Grandes', 'Caracas', 'DF', '1081', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10269, 'WHITC', 5, '1996-07-31', '1996-08-14', '1996-08-09', 1, 4.55999994, 'White Clover Markets', '1029 - 12th Ave. S.', 'Seattle', 'WA', '98124', 'USA'); +INSERT INTO northwind.orders VALUES (10271, 'SPLIR', 6, '1996-08-01', '1996-08-29', '1996-08-30', 2, 4.53999996, 'Split Rail Beer & Ale', 'P.O. Box 555', 'Lander', 'WY', '82520', 'USA'); +INSERT INTO northwind.orders VALUES (10272, 'RATTC', 6, '1996-08-02', '1996-08-30', '1996-08-06', 2, 98.0299988, 'Rattlesnake Canyon Grocery', '2817 Milton Dr.', 'Albuquerque', 'NM', '87110', 'USA'); +INSERT INTO northwind.orders VALUES (10273, 'QUICK', 3, '1996-08-05', '1996-09-02', '1996-08-12', 3, 76.0699997, 'QUICK-Stop', 'Taucherstraße 10', 'Cunewalde', NULL, '01307', 'Germany'); +INSERT INTO northwind.orders VALUES (10274, 'VINET', 6, '1996-08-06', '1996-09-03', '1996-08-16', 1, 6.01000023, 'Vins et alcools Chevalier', '59 rue de l''Abbaye', 'Reims', NULL, '51100', 'France'); +INSERT INTO northwind.orders VALUES (10276, 'TORTU', 8, '1996-08-08', '1996-08-22', '1996-08-14', 3, 13.8400002, 'Tortuga Restaurante', 'Avda. Azteca 123', 'México D.F.', NULL, '05033', 'Mexico'); +INSERT INTO northwind.orders VALUES (10277, 'MORGK', 2, '1996-08-09', '1996-09-06', '1996-08-13', 3, 125.769997, 'Morgenstern Gesundkost', 'Heerstr. 22', 'Leipzig', NULL, '04179', 'Germany'); +INSERT INTO northwind.orders VALUES (10278, 'BERGS', 8, '1996-08-12', '1996-09-09', '1996-08-16', 2, 92.6900024, 'Berglunds snabbköp', 'Berguvsvägen 8', 'Luleå', NULL, 'S-958 22', 'Sweden'); +INSERT INTO northwind.orders VALUES (10279, 'LEHMS', 8, '1996-08-13', '1996-09-10', '1996-08-16', 2, 25.8299999, 'Lehmanns Marktstand', 'Magazinweg 7', 'Frankfurt a.M.', NULL, '60528', 'Germany'); +INSERT INTO northwind.orders VALUES (10280, 'BERGS', 2, '1996-08-14', '1996-09-11', '1996-09-12', 1, 8.97999954, 'Berglunds snabbköp', 'Berguvsvägen 8', 'Luleå', NULL, 'S-958 22', 'Sweden'); +INSERT INTO northwind.orders VALUES (10281, 'ROMEY', 4, '1996-08-14', '1996-08-28', '1996-08-21', 1, 2.94000006, 'Romero y tomillo', 'Gran Vía, 1', 'Madrid', NULL, '28001', 'Spain'); +INSERT INTO northwind.orders VALUES (10282, 'ROMEY', 4, '1996-08-15', '1996-09-12', '1996-08-21', 1, 12.6899996, 'Romero y tomillo', 'Gran Vía, 1', 'Madrid', NULL, '28001', 'Spain'); +INSERT INTO northwind.orders VALUES (10283, 'LILAS', 3, '1996-08-16', '1996-09-13', '1996-08-23', 3, 84.8099976, 'LILA-Supermercado', 'Carrera 52 con Ave. Bolívar #65-98 Llano Largo', 'Barquisimeto', 'Lara', '3508', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10284, 'LEHMS', 4, '1996-08-19', '1996-09-16', '1996-08-27', 1, 76.5599976, 'Lehmanns Marktstand', 'Magazinweg 7', 'Frankfurt a.M.', NULL, '60528', 'Germany'); +INSERT INTO northwind.orders VALUES (10286, 'QUICK', 8, '1996-08-21', '1996-09-18', '1996-08-30', 3, 229.240005, 'QUICK-Stop', 'Taucherstraße 10', 'Cunewalde', NULL, '01307', 'Germany'); +INSERT INTO northwind.orders VALUES (10287, 'RICAR', 8, '1996-08-22', '1996-09-19', '1996-08-28', 3, 12.7600002, 'Ricardo Adocicados', 'Av. Copacabana, 267', 'Rio de Janeiro', 'RJ', '02389-890', 'Brazil'); +INSERT INTO northwind.orders VALUES (10288, 'REGGC', 4, '1996-08-23', '1996-09-20', '1996-09-03', 1, 7.44999981, 'Reggiani Caseifici', 'Strada Provinciale 124', 'Reggio Emilia', NULL, '42100', 'Italy'); +INSERT INTO northwind.orders VALUES (10289, 'BSBEV', 7, '1996-08-26', '1996-09-23', '1996-08-28', 3, 22.7700005, 'B''s Beverages', 'Fauntleroy Circus', 'London', NULL, 'EC2 5NT', 'UK'); +INSERT INTO northwind.orders VALUES (10290, 'COMMI', 8, '1996-08-27', '1996-09-24', '1996-09-03', 1, 79.6999969, 'Comércio Mineiro', 'Av. dos Lusíadas, 23', 'Sao Paulo', 'SP', '05432-043', 'Brazil'); +INSERT INTO northwind.orders VALUES (10291, 'QUEDE', 6, '1996-08-27', '1996-09-24', '1996-09-04', 2, 6.4000001, 'Que Delícia', 'Rua da Panificadora, 12', 'Rio de Janeiro', 'RJ', '02389-673', 'Brazil'); +INSERT INTO northwind.orders VALUES (10294, 'RATTC', 4, '1996-08-30', '1996-09-27', '1996-09-05', 2, 147.259995, 'Rattlesnake Canyon Grocery', '2817 Milton Dr.', 'Albuquerque', 'NM', '87110', 'USA'); +INSERT INTO northwind.orders VALUES (10295, 'VINET', 2, '1996-09-02', '1996-09-30', '1996-09-10', 2, 1.14999998, 'Vins et alcools Chevalier', '59 rue de l''Abbaye', 'Reims', NULL, '51100', 'France'); +INSERT INTO northwind.orders VALUES (10296, 'LILAS', 6, '1996-09-03', '1996-10-01', '1996-09-11', 1, 0.119999997, 'LILA-Supermercado', 'Carrera 52 con Ave. Bolívar #65-98 Llano Largo', 'Barquisimeto', 'Lara', '3508', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10297, 'BLONP', 5, '1996-09-04', '1996-10-16', '1996-09-10', 2, 5.73999977, 'Blondel père et fils', '24, place Kléber', 'Strasbourg', NULL, '67000', 'France'); +INSERT INTO northwind.orders VALUES (10298, 'HUNGO', 6, '1996-09-05', '1996-10-03', '1996-09-11', 2, 168.220001, 'Hungry Owl All-Night Grocers', '8 Johnstown Road', 'Cork', 'Co. Cork', NULL, 'Ireland'); +INSERT INTO northwind.orders VALUES (10299, 'RICAR', 4, '1996-09-06', '1996-10-04', '1996-09-13', 2, 29.7600002, 'Ricardo Adocicados', 'Av. Copacabana, 267', 'Rio de Janeiro', 'RJ', '02389-890', 'Brazil'); +INSERT INTO northwind.orders VALUES (10300, 'MAGAA', 2, '1996-09-09', '1996-10-07', '1996-09-18', 2, 17.6800003, 'Magazzini Alimentari Riuniti', 'Via Ludovico il Moro 22', 'Bergamo', NULL, '24100', 'Italy'); +INSERT INTO northwind.orders VALUES (10301, 'WANDK', 8, '1996-09-09', '1996-10-07', '1996-09-17', 2, 45.0800018, 'Die Wandernde Kuh', 'Adenauerallee 900', 'Stuttgart', NULL, '70563', 'Germany'); +INSERT INTO northwind.orders VALUES (10302, 'SUPRD', 4, '1996-09-10', '1996-10-08', '1996-10-09', 2, 6.26999998, 'Suprêmes délices', 'Boulevard Tirou, 255', 'Charleroi', NULL, 'B-6000', 'Belgium'); +INSERT INTO northwind.orders VALUES (10303, 'GODOS', 7, '1996-09-11', '1996-10-09', '1996-09-18', 2, 107.830002, 'Godos Cocina Típica', 'C/ Romero, 33', 'Sevilla', NULL, '41101', 'Spain'); +INSERT INTO northwind.orders VALUES (10305, 'OLDWO', 8, '1996-09-13', '1996-10-11', '1996-10-09', 3, 257.619995, 'Old World Delicatessen', '2743 Bering St.', 'Anchorage', 'AK', '99508', 'USA'); +INSERT INTO northwind.orders VALUES (10307, 'LONEP', 2, '1996-09-17', '1996-10-15', '1996-09-25', 2, 0.560000002, 'Lonesome Pine Restaurant', '89 Chiaroscuro Rd.', 'Portland', 'OR', '97219', 'USA'); +INSERT INTO northwind.orders VALUES (10308, 'ANATR', 7, '1996-09-18', '1996-10-16', '1996-09-24', 3, 1.61000001, 'Ana Trujillo Emparedados y helados', 'Avda. de la Constitución 2222', 'México D.F.', NULL, '05021', 'Mexico'); +INSERT INTO northwind.orders VALUES (10309, 'HUNGO', 3, '1996-09-19', '1996-10-17', '1996-10-23', 1, 47.2999992, 'Hungry Owl All-Night Grocers', '8 Johnstown Road', 'Cork', 'Co. Cork', NULL, 'Ireland'); +INSERT INTO northwind.orders VALUES (10310, 'THEBI', 8, '1996-09-20', '1996-10-18', '1996-09-27', 2, 17.5200005, 'The Big Cheese', '89 Jefferson Way Suite 2', 'Portland', 'OR', '97201', 'USA'); +INSERT INTO northwind.orders VALUES (10312, 'WANDK', 2, '1996-09-23', '1996-10-21', '1996-10-03', 2, 40.2599983, 'Die Wandernde Kuh', 'Adenauerallee 900', 'Stuttgart', NULL, '70563', 'Germany'); +INSERT INTO northwind.orders VALUES (10313, 'QUICK', 2, '1996-09-24', '1996-10-22', '1996-10-04', 2, 1.96000004, 'QUICK-Stop', 'Taucherstraße 10', 'Cunewalde', NULL, '01307', 'Germany'); +INSERT INTO northwind.orders VALUES (10315, 'ISLAT', 4, '1996-09-26', '1996-10-24', '1996-10-03', 2, 41.7599983, 'Island Trading', 'Garden House Crowther Way', 'Cowes', 'Isle of Wight', 'PO31 7PJ', 'UK'); +INSERT INTO northwind.orders VALUES (10258, 'ERNSH', 1, '1996-07-17', '1996-08-14', '1996-07-23', 1, 140.509995, 'Ernst Handel', 'Kirchgasse 6', 'Graz', NULL, '8010', 'Austria'); +INSERT INTO northwind.orders VALUES (10317, 'LONEP', 6, '1996-09-30', '1996-10-28', '1996-10-10', 1, 12.6899996, 'Lonesome Pine Restaurant', '89 Chiaroscuro Rd.', 'Portland', 'OR', '97219', 'USA'); +INSERT INTO northwind.orders VALUES (10318, 'ISLAT', 8, '1996-10-01', '1996-10-29', '1996-10-04', 2, 4.73000002, 'Island Trading', 'Garden House Crowther Way', 'Cowes', 'Isle of Wight', 'PO31 7PJ', 'UK'); +INSERT INTO northwind.orders VALUES (10319, 'TORTU', 7, '1996-10-02', '1996-10-30', '1996-10-11', 3, 64.5, 'Tortuga Restaurante', 'Avda. Azteca 123', 'México D.F.', NULL, '05033', 'Mexico'); +INSERT INTO northwind.orders VALUES (10320, 'WARTH', 5, '1996-10-03', '1996-10-17', '1996-10-18', 3, 34.5699997, 'Wartian Herkku', 'Torikatu 38', 'Oulu', NULL, '90110', 'Finland'); +INSERT INTO northwind.orders VALUES (10321, 'ISLAT', 3, '1996-10-03', '1996-10-31', '1996-10-11', 2, 3.43000007, 'Island Trading', 'Garden House Crowther Way', 'Cowes', 'Isle of Wight', 'PO31 7PJ', 'UK'); +INSERT INTO northwind.orders VALUES (10322, 'PERIC', 7, '1996-10-04', '1996-11-01', '1996-10-23', 3, 0.400000006, 'Pericles Comidas clásicas', 'Calle Dr. Jorge Cash 321', 'México D.F.', NULL, '05033', 'Mexico'); +INSERT INTO northwind.orders VALUES (10323, 'KOENE', 4, '1996-10-07', '1996-11-04', '1996-10-14', 1, 4.88000011, 'Königlich Essen', 'Maubelstr. 90', 'Brandenburg', NULL, '14776', 'Germany'); +INSERT INTO northwind.orders VALUES (10324, 'SAVEA', 9, '1996-10-08', '1996-11-05', '1996-10-10', 1, 214.270004, 'Save-a-lot Markets', '187 Suffolk Ln.', 'Boise', 'ID', '83720', 'USA'); +INSERT INTO northwind.orders VALUES (10326, 'BOLID', 4, '1996-10-10', '1996-11-07', '1996-10-14', 2, 77.9199982, 'Bólido Comidas preparadas', 'C/ Araquil, 67', 'Madrid', NULL, '28023', 'Spain'); +INSERT INTO northwind.orders VALUES (10327, 'FOLKO', 2, '1996-10-11', '1996-11-08', '1996-10-14', 1, 63.3600006, 'Folk och fä HB', 'Åkergatan 24', 'Bräcke', NULL, 'S-844 67', 'Sweden'); +INSERT INTO northwind.orders VALUES (10328, 'FURIB', 4, '1996-10-14', '1996-11-11', '1996-10-17', 3, 87.0299988, 'Furia Bacalhau e Frutos do Mar', 'Jardim das rosas n. 32', 'Lisboa', NULL, '1675', 'Portugal'); +INSERT INTO northwind.orders VALUES (10329, 'SPLIR', 4, '1996-10-15', '1996-11-26', '1996-10-23', 2, 191.669998, 'Split Rail Beer & Ale', 'P.O. Box 555', 'Lander', 'WY', '82520', 'USA'); +INSERT INTO northwind.orders VALUES (10330, 'LILAS', 3, '1996-10-16', '1996-11-13', '1996-10-28', 1, 12.75, 'LILA-Supermercado', 'Carrera 52 con Ave. Bolívar #65-98 Llano Largo', 'Barquisimeto', 'Lara', '3508', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10331, 'BONAP', 9, '1996-10-16', '1996-11-27', '1996-10-21', 1, 10.1899996, 'Bon app''', '12, rue des Bouchers', 'Marseille', NULL, '13008', 'France'); +INSERT INTO northwind.orders VALUES (10332, 'MEREP', 3, '1996-10-17', '1996-11-28', '1996-10-21', 2, 52.8400002, 'Mère Paillarde', '43 rue St. Laurent', 'Montréal', 'Québec', 'H1J 1C3', 'Canada'); +INSERT INTO northwind.orders VALUES (10333, 'WARTH', 5, '1996-10-18', '1996-11-15', '1996-10-25', 3, 0.589999974, 'Wartian Herkku', 'Torikatu 38', 'Oulu', NULL, '90110', 'Finland'); +INSERT INTO northwind.orders VALUES (10334, 'VICTE', 8, '1996-10-21', '1996-11-18', '1996-10-28', 2, 8.56000042, 'Victuailles en stock', '2, rue du Commerce', 'Lyon', NULL, '69004', 'France'); +INSERT INTO northwind.orders VALUES (10335, 'HUNGO', 7, '1996-10-22', '1996-11-19', '1996-10-24', 2, 42.1100006, 'Hungry Owl All-Night Grocers', '8 Johnstown Road', 'Cork', 'Co. Cork', NULL, 'Ireland'); +INSERT INTO northwind.orders VALUES (10336, 'PRINI', 7, '1996-10-23', '1996-11-20', '1996-10-25', 2, 15.5100002, 'Princesa Isabel Vinhos', 'Estrada da saúde n. 58', 'Lisboa', NULL, '1756', 'Portugal'); +INSERT INTO northwind.orders VALUES (10337, 'FRANK', 4, '1996-10-24', '1996-11-21', '1996-10-29', 3, 108.260002, 'Frankenversand', 'Berliner Platz 43', 'München', NULL, '80805', 'Germany'); +INSERT INTO northwind.orders VALUES (10338, 'OLDWO', 4, '1996-10-25', '1996-11-22', '1996-10-29', 3, 84.2099991, 'Old World Delicatessen', '2743 Bering St.', 'Anchorage', 'AK', '99508', 'USA'); +INSERT INTO northwind.orders VALUES (10339, 'MEREP', 2, '1996-10-28', '1996-11-25', '1996-11-04', 2, 15.6599998, 'Mère Paillarde', '43 rue St. Laurent', 'Montréal', 'Québec', 'H1J 1C3', 'Canada'); +INSERT INTO northwind.orders VALUES (10341, 'SIMOB', 7, '1996-10-29', '1996-11-26', '1996-11-05', 3, 26.7800007, 'Simons bistro', 'Vinbæltet 34', 'Kobenhavn', NULL, '1734', 'Denmark'); +INSERT INTO northwind.orders VALUES (10342, 'FRANK', 4, '1996-10-30', '1996-11-13', '1996-11-04', 2, 54.8300018, 'Frankenversand', 'Berliner Platz 43', 'München', NULL, '80805', 'Germany'); +INSERT INTO northwind.orders VALUES (10343, 'LEHMS', 4, '1996-10-31', '1996-11-28', '1996-11-06', 1, 110.370003, 'Lehmanns Marktstand', 'Magazinweg 7', 'Frankfurt a.M.', NULL, '60528', 'Germany'); +INSERT INTO northwind.orders VALUES (10344, 'WHITC', 4, '1996-11-01', '1996-11-29', '1996-11-05', 2, 23.2900009, 'White Clover Markets', '1029 - 12th Ave. S.', 'Seattle', 'WA', '98124', 'USA'); +INSERT INTO northwind.orders VALUES (10345, 'QUICK', 2, '1996-11-04', '1996-12-02', '1996-11-11', 2, 249.059998, 'QUICK-Stop', 'Taucherstraße 10', 'Cunewalde', NULL, '01307', 'Germany'); +INSERT INTO northwind.orders VALUES (10346, 'RATTC', 3, '1996-11-05', '1996-12-17', '1996-11-08', 3, 142.080002, 'Rattlesnake Canyon Grocery', '2817 Milton Dr.', 'Albuquerque', 'NM', '87110', 'USA'); +INSERT INTO northwind.orders VALUES (10347, 'FAMIA', 4, '1996-11-06', '1996-12-04', '1996-11-08', 3, 3.0999999, 'Familia Arquibaldo', 'Rua Orós, 92', 'Sao Paulo', 'SP', '05442-030', 'Brazil'); +INSERT INTO northwind.orders VALUES (10348, 'WANDK', 4, '1996-11-07', '1996-12-05', '1996-11-15', 2, 0.779999971, 'Die Wandernde Kuh', 'Adenauerallee 900', 'Stuttgart', NULL, '70563', 'Germany'); +INSERT INTO northwind.orders VALUES (10349, 'SPLIR', 7, '1996-11-08', '1996-12-06', '1996-11-15', 1, 8.63000011, 'Split Rail Beer & Ale', 'P.O. Box 555', 'Lander', 'WY', '82520', 'USA'); +INSERT INTO northwind.orders VALUES (10350, 'LAMAI', 6, '1996-11-11', '1996-12-09', '1996-12-03', 2, 64.1900024, 'La maison d''Asie', '1 rue Alsace-Lorraine', 'Toulouse', NULL, '31000', 'France'); +INSERT INTO northwind.orders VALUES (10352, 'FURIB', 3, '1996-11-12', '1996-11-26', '1996-11-18', 3, 1.29999995, 'Furia Bacalhau e Frutos do Mar', 'Jardim das rosas n. 32', 'Lisboa', NULL, '1675', 'Portugal'); +INSERT INTO northwind.orders VALUES (10353, 'PICCO', 7, '1996-11-13', '1996-12-11', '1996-11-25', 3, 360.630005, 'Piccolo und mehr', 'Geislweg 14', 'Salzburg', NULL, '5020', 'Austria'); +INSERT INTO northwind.orders VALUES (10354, 'PERIC', 8, '1996-11-14', '1996-12-12', '1996-11-20', 3, 53.7999992, 'Pericles Comidas clásicas', 'Calle Dr. Jorge Cash 321', 'México D.F.', NULL, '05033', 'Mexico'); +INSERT INTO northwind.orders VALUES (10355, 'AROUT', 6, '1996-11-15', '1996-12-13', '1996-11-20', 1, 41.9500008, 'Around the Horn', 'Brook Farm Stratford St. Mary', 'Colchester', 'Essex', 'CO7 6JX', 'UK'); +INSERT INTO northwind.orders VALUES (10356, 'WANDK', 6, '1996-11-18', '1996-12-16', '1996-11-27', 2, 36.7099991, 'Die Wandernde Kuh', 'Adenauerallee 900', 'Stuttgart', NULL, '70563', 'Germany'); +INSERT INTO northwind.orders VALUES (10358, 'LAMAI', 5, '1996-11-20', '1996-12-18', '1996-11-27', 1, 19.6399994, 'La maison d''Asie', '1 rue Alsace-Lorraine', 'Toulouse', NULL, '31000', 'France'); +INSERT INTO northwind.orders VALUES (10359, 'SEVES', 5, '1996-11-21', '1996-12-19', '1996-11-26', 3, 288.429993, 'Seven Seas Imports', '90 Wadhurst Rd.', 'London', NULL, 'OX15 4NB', 'UK'); +INSERT INTO northwind.orders VALUES (10360, 'BLONP', 4, '1996-11-22', '1996-12-20', '1996-12-02', 3, 131.699997, 'Blondel père et fils', '24, place Kléber', 'Strasbourg', NULL, '67000', 'France'); +INSERT INTO northwind.orders VALUES (10362, 'BONAP', 3, '1996-11-25', '1996-12-23', '1996-11-28', 1, 96.0400009, 'Bon app''', '12, rue des Bouchers', 'Marseille', NULL, '13008', 'France'); +INSERT INTO northwind.orders VALUES (10363, 'DRACD', 4, '1996-11-26', '1996-12-24', '1996-12-04', 3, 30.5400009, 'Drachenblut Delikatessen', 'Walserweg 21', 'Aachen', NULL, '52066', 'Germany'); +INSERT INTO northwind.orders VALUES (10365, 'ANTON', 3, '1996-11-27', '1996-12-25', '1996-12-02', 2, 22, 'Antonio Moreno Taquería', 'Mataderos 2312', 'México D.F.', NULL, '05023', 'Mexico'); +INSERT INTO northwind.orders VALUES (10366, 'GALED', 8, '1996-11-28', '1997-01-09', '1996-12-30', 2, 10.1400003, 'Galería del gastronómo', 'Rambla de Cataluña, 23', 'Barcelona', NULL, '8022', 'Spain'); +INSERT INTO northwind.orders VALUES (10367, 'VAFFE', 7, '1996-11-28', '1996-12-26', '1996-12-02', 3, 13.5500002, 'Vaffeljernet', 'Smagsloget 45', 'Århus', NULL, '8200', 'Denmark'); +INSERT INTO northwind.orders VALUES (10368, 'ERNSH', 2, '1996-11-29', '1996-12-27', '1996-12-02', 2, 101.949997, 'Ernst Handel', 'Kirchgasse 6', 'Graz', NULL, '8010', 'Austria'); +INSERT INTO northwind.orders VALUES (10369, 'SPLIR', 8, '1996-12-02', '1996-12-30', '1996-12-09', 2, 195.679993, 'Split Rail Beer & Ale', 'P.O. Box 555', 'Lander', 'WY', '82520', 'USA'); +INSERT INTO northwind.orders VALUES (10370, 'CHOPS', 6, '1996-12-03', '1996-12-31', '1996-12-27', 2, 1.16999996, 'Chop-suey Chinese', 'Hauptstr. 31', 'Bern', NULL, '3012', 'Switzerland'); +INSERT INTO northwind.orders VALUES (10372, 'QUEEN', 5, '1996-12-04', '1997-01-01', '1996-12-09', 2, 890.780029, 'Queen Cozinha', 'Alameda dos Canàrios, 891', 'Sao Paulo', 'SP', '05487-020', 'Brazil'); +INSERT INTO northwind.orders VALUES (10373, 'HUNGO', 4, '1996-12-05', '1997-01-02', '1996-12-11', 3, 124.120003, 'Hungry Owl All-Night Grocers', '8 Johnstown Road', 'Cork', 'Co. Cork', NULL, 'Ireland'); +INSERT INTO northwind.orders VALUES (10375, 'HUNGC', 3, '1996-12-06', '1997-01-03', '1996-12-09', 2, 20.1200008, 'Hungry Coyote Import Store', 'City Center Plaza 516 Main St.', 'Elgin', 'OR', '97827', 'USA'); +INSERT INTO northwind.orders VALUES (10378, 'FOLKO', 5, '1996-12-10', '1997-01-07', '1996-12-19', 3, 5.44000006, 'Folk och fä HB', 'Åkergatan 24', 'Bräcke', NULL, 'S-844 67', 'Sweden'); +INSERT INTO northwind.orders VALUES (10379, 'QUEDE', 2, '1996-12-11', '1997-01-08', '1996-12-13', 1, 45.0299988, 'Que Delícia', 'Rua da Panificadora, 12', 'Rio de Janeiro', 'RJ', '02389-673', 'Brazil'); +INSERT INTO northwind.orders VALUES (10380, 'HUNGO', 8, '1996-12-12', '1997-01-09', '1997-01-16', 3, 35.0299988, 'Hungry Owl All-Night Grocers', '8 Johnstown Road', 'Cork', 'Co. Cork', NULL, 'Ireland'); +INSERT INTO northwind.orders VALUES (10381, 'LILAS', 3, '1996-12-12', '1997-01-09', '1996-12-13', 3, 7.98999977, 'LILA-Supermercado', 'Carrera 52 con Ave. Bolívar #65-98 Llano Largo', 'Barquisimeto', 'Lara', '3508', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10382, 'ERNSH', 4, '1996-12-13', '1997-01-10', '1996-12-16', 1, 94.7699966, 'Ernst Handel', 'Kirchgasse 6', 'Graz', NULL, '8010', 'Austria'); +INSERT INTO northwind.orders VALUES (10383, 'AROUT', 8, '1996-12-16', '1997-01-13', '1996-12-18', 3, 34.2400017, 'Around the Horn', 'Brook Farm Stratford St. Mary', 'Colchester', 'Essex', 'CO7 6JX', 'UK'); +INSERT INTO northwind.orders VALUES (10384, 'BERGS', 3, '1996-12-16', '1997-01-13', '1996-12-20', 3, 168.639999, 'Berglunds snabbköp', 'Berguvsvägen 8', 'Luleå', NULL, 'S-958 22', 'Sweden'); +INSERT INTO northwind.orders VALUES (10386, 'FAMIA', 9, '1996-12-18', '1997-01-01', '1996-12-25', 3, 13.9899998, 'Familia Arquibaldo', 'Rua Orós, 92', 'Sao Paulo', 'SP', '05442-030', 'Brazil'); +INSERT INTO northwind.orders VALUES (10270, 'WARTH', 1, '1996-08-01', '1996-08-29', '1996-08-02', 1, 136.539993, 'Wartian Herkku', 'Torikatu 38', 'Oulu', NULL, '90110', 'Finland'); +INSERT INTO northwind.orders VALUES (10388, 'SEVES', 2, '1996-12-19', '1997-01-16', '1996-12-20', 1, 34.8600006, 'Seven Seas Imports', '90 Wadhurst Rd.', 'London', NULL, 'OX15 4NB', 'UK'); +INSERT INTO northwind.orders VALUES (10389, 'BOTTM', 4, '1996-12-20', '1997-01-17', '1996-12-24', 2, 47.4199982, 'Bottom-Dollar Markets', '23 Tsawassen Blvd.', 'Tsawassen', 'BC', 'T2F 8M4', 'Canada'); +INSERT INTO northwind.orders VALUES (10390, 'ERNSH', 6, '1996-12-23', '1997-01-20', '1996-12-26', 1, 126.379997, 'Ernst Handel', 'Kirchgasse 6', 'Graz', NULL, '8010', 'Austria'); +INSERT INTO northwind.orders VALUES (10391, 'DRACD', 3, '1996-12-23', '1997-01-20', '1996-12-31', 3, 5.44999981, 'Drachenblut Delikatessen', 'Walserweg 21', 'Aachen', NULL, '52066', 'Germany'); +INSERT INTO northwind.orders VALUES (10392, 'PICCO', 2, '1996-12-24', '1997-01-21', '1997-01-01', 3, 122.459999, 'Piccolo und mehr', 'Geislweg 14', 'Salzburg', NULL, '5020', 'Austria'); +INSERT INTO northwind.orders VALUES (10395, 'HILAA', 6, '1996-12-26', '1997-01-23', '1997-01-03', 1, 184.410004, 'HILARION-Abastos', 'Carrera 22 con Ave. Carlos Soublette #8-35', 'San Cristóbal', 'Táchira', '5022', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10397, 'PRINI', 5, '1996-12-27', '1997-01-24', '1997-01-02', 1, 60.2599983, 'Princesa Isabel Vinhos', 'Estrada da saúde n. 58', 'Lisboa', NULL, '1756', 'Portugal'); +INSERT INTO northwind.orders VALUES (10398, 'SAVEA', 2, '1996-12-30', '1997-01-27', '1997-01-09', 3, 89.1600037, 'Save-a-lot Markets', '187 Suffolk Ln.', 'Boise', 'ID', '83720', 'USA'); +INSERT INTO northwind.orders VALUES (10399, 'VAFFE', 8, '1996-12-31', '1997-01-14', '1997-01-08', 3, 27.3600006, 'Vaffeljernet', 'Smagsloget 45', 'Århus', NULL, '8200', 'Denmark'); +INSERT INTO northwind.orders VALUES (10275, 'MAGAA', 1, '1996-08-07', '1996-09-04', '1996-08-09', 1, 26.9300003, 'Magazzini Alimentari Riuniti', 'Via Ludovico il Moro 22', 'Bergamo', NULL, '24100', 'Italy'); +INSERT INTO northwind.orders VALUES (10402, 'ERNSH', 8, '1997-01-02', '1997-02-13', '1997-01-10', 2, 67.8799973, 'Ernst Handel', 'Kirchgasse 6', 'Graz', NULL, '8010', 'Austria'); +INSERT INTO northwind.orders VALUES (10403, 'ERNSH', 4, '1997-01-03', '1997-01-31', '1997-01-09', 3, 73.7900009, 'Ernst Handel', 'Kirchgasse 6', 'Graz', NULL, '8010', 'Austria'); +INSERT INTO northwind.orders VALUES (10404, 'MAGAA', 2, '1997-01-03', '1997-01-31', '1997-01-08', 1, 155.970001, 'Magazzini Alimentari Riuniti', 'Via Ludovico il Moro 22', 'Bergamo', NULL, '24100', 'Italy'); +INSERT INTO northwind.orders VALUES (10406, 'QUEEN', 7, '1997-01-07', '1997-02-18', '1997-01-13', 1, 108.040001, 'Queen Cozinha', 'Alameda dos Canàrios, 891', 'Sao Paulo', 'SP', '05487-020', 'Brazil'); +INSERT INTO northwind.orders VALUES (10407, 'OTTIK', 2, '1997-01-07', '1997-02-04', '1997-01-30', 2, 91.4800034, 'Ottilies Käseladen', 'Mehrheimerstr. 369', 'Köln', NULL, '50739', 'Germany'); +INSERT INTO northwind.orders VALUES (10408, 'FOLIG', 8, '1997-01-08', '1997-02-05', '1997-01-14', 1, 11.2600002, 'Folies gourmandes', '184, chaussée de Tournai', 'Lille', NULL, '59000', 'France'); +INSERT INTO northwind.orders VALUES (10409, 'OCEAN', 3, '1997-01-09', '1997-02-06', '1997-01-14', 1, 29.8299999, 'Océano Atlántico Ltda.', 'Ing. Gustavo Moncada 8585 Piso 20-A', 'Buenos Aires', NULL, '1010', 'Argentina'); +INSERT INTO northwind.orders VALUES (10410, 'BOTTM', 3, '1997-01-10', '1997-02-07', '1997-01-15', 3, 2.4000001, 'Bottom-Dollar Markets', '23 Tsawassen Blvd.', 'Tsawassen', 'BC', 'T2F 8M4', 'Canada'); +INSERT INTO northwind.orders VALUES (10411, 'BOTTM', 9, '1997-01-10', '1997-02-07', '1997-01-21', 3, 23.6499996, 'Bottom-Dollar Markets', '23 Tsawassen Blvd.', 'Tsawassen', 'BC', 'T2F 8M4', 'Canada'); +INSERT INTO northwind.orders VALUES (10412, 'WARTH', 8, '1997-01-13', '1997-02-10', '1997-01-15', 2, 3.76999998, 'Wartian Herkku', 'Torikatu 38', 'Oulu', NULL, '90110', 'Finland'); +INSERT INTO northwind.orders VALUES (10413, 'LAMAI', 3, '1997-01-14', '1997-02-11', '1997-01-16', 2, 95.6600037, 'La maison d''Asie', '1 rue Alsace-Lorraine', 'Toulouse', NULL, '31000', 'France'); +INSERT INTO northwind.orders VALUES (10414, 'FAMIA', 2, '1997-01-14', '1997-02-11', '1997-01-17', 3, 21.4799995, 'Familia Arquibaldo', 'Rua Orós, 92', 'Sao Paulo', 'SP', '05442-030', 'Brazil'); +INSERT INTO northwind.orders VALUES (10415, 'HUNGC', 3, '1997-01-15', '1997-02-12', '1997-01-24', 1, 0.200000003, 'Hungry Coyote Import Store', 'City Center Plaza 516 Main St.', 'Elgin', 'OR', '97827', 'USA'); +INSERT INTO northwind.orders VALUES (10416, 'WARTH', 8, '1997-01-16', '1997-02-13', '1997-01-27', 3, 22.7199993, 'Wartian Herkku', 'Torikatu 38', 'Oulu', NULL, '90110', 'Finland'); +INSERT INTO northwind.orders VALUES (10417, 'SIMOB', 4, '1997-01-16', '1997-02-13', '1997-01-28', 3, 70.2900009, 'Simons bistro', 'Vinbæltet 34', 'Kobenhavn', NULL, '1734', 'Denmark'); +INSERT INTO northwind.orders VALUES (10418, 'QUICK', 4, '1997-01-17', '1997-02-14', '1997-01-24', 1, 17.5499992, 'QUICK-Stop', 'Taucherstraße 10', 'Cunewalde', NULL, '01307', 'Germany'); +INSERT INTO northwind.orders VALUES (10419, 'RICSU', 4, '1997-01-20', '1997-02-17', '1997-01-30', 2, 137.350006, 'Richter Supermarkt', 'Starenweg 5', 'Genève', NULL, '1204', 'Switzerland'); +INSERT INTO northwind.orders VALUES (10420, 'WELLI', 3, '1997-01-21', '1997-02-18', '1997-01-27', 1, 44.1199989, 'Wellington Importadora', 'Rua do Mercado, 12', 'Resende', 'SP', '08737-363', 'Brazil'); +INSERT INTO northwind.orders VALUES (10421, 'QUEDE', 8, '1997-01-21', '1997-03-04', '1997-01-27', 1, 99.2300034, 'Que Delícia', 'Rua da Panificadora, 12', 'Rio de Janeiro', 'RJ', '02389-673', 'Brazil'); +INSERT INTO northwind.orders VALUES (10422, 'FRANS', 2, '1997-01-22', '1997-02-19', '1997-01-31', 1, 3.01999998, 'Franchi S.p.A.', 'Via Monte Bianco 34', 'Torino', NULL, '10100', 'Italy'); +INSERT INTO northwind.orders VALUES (10423, 'GOURL', 6, '1997-01-23', '1997-02-06', '1997-02-24', 3, 24.5, 'Gourmet Lanchonetes', 'Av. Brasil, 442', 'Campinas', 'SP', '04876-786', 'Brazil'); +INSERT INTO northwind.orders VALUES (10424, 'MEREP', 7, '1997-01-23', '1997-02-20', '1997-01-27', 2, 370.609985, 'Mère Paillarde', '43 rue St. Laurent', 'Montréal', 'Québec', 'H1J 1C3', 'Canada'); +INSERT INTO northwind.orders VALUES (10425, 'LAMAI', 6, '1997-01-24', '1997-02-21', '1997-02-14', 2, 7.92999983, 'La maison d''Asie', '1 rue Alsace-Lorraine', 'Toulouse', NULL, '31000', 'France'); +INSERT INTO northwind.orders VALUES (10426, 'GALED', 4, '1997-01-27', '1997-02-24', '1997-02-06', 1, 18.6900005, 'Galería del gastronómo', 'Rambla de Cataluña, 23', 'Barcelona', NULL, '8022', 'Spain'); +INSERT INTO northwind.orders VALUES (10427, 'PICCO', 4, '1997-01-27', '1997-02-24', '1997-03-03', 2, 31.2900009, 'Piccolo und mehr', 'Geislweg 14', 'Salzburg', NULL, '5020', 'Austria'); +INSERT INTO northwind.orders VALUES (10428, 'REGGC', 7, '1997-01-28', '1997-02-25', '1997-02-04', 1, 11.0900002, 'Reggiani Caseifici', 'Strada Provinciale 124', 'Reggio Emilia', NULL, '42100', 'Italy'); +INSERT INTO northwind.orders VALUES (10429, 'HUNGO', 3, '1997-01-29', '1997-03-12', '1997-02-07', 2, 56.6300011, 'Hungry Owl All-Night Grocers', '8 Johnstown Road', 'Cork', 'Co. Cork', NULL, 'Ireland'); +INSERT INTO northwind.orders VALUES (10430, 'ERNSH', 4, '1997-01-30', '1997-02-13', '1997-02-03', 1, 458.779999, 'Ernst Handel', 'Kirchgasse 6', 'Graz', NULL, '8010', 'Austria'); +INSERT INTO northwind.orders VALUES (10431, 'BOTTM', 4, '1997-01-30', '1997-02-13', '1997-02-07', 2, 44.1699982, 'Bottom-Dollar Markets', '23 Tsawassen Blvd.', 'Tsawassen', 'BC', 'T2F 8M4', 'Canada'); +INSERT INTO northwind.orders VALUES (10432, 'SPLIR', 3, '1997-01-31', '1997-02-14', '1997-02-07', 2, 4.34000015, 'Split Rail Beer & Ale', 'P.O. Box 555', 'Lander', 'WY', '82520', 'USA'); +INSERT INTO northwind.orders VALUES (10433, 'PRINI', 3, '1997-02-03', '1997-03-03', '1997-03-04', 3, 73.8300018, 'Princesa Isabel Vinhos', 'Estrada da saúde n. 58', 'Lisboa', NULL, '1756', 'Portugal'); +INSERT INTO northwind.orders VALUES (10434, 'FOLKO', 3, '1997-02-03', '1997-03-03', '1997-02-13', 2, 17.9200001, 'Folk och fä HB', 'Åkergatan 24', 'Bräcke', NULL, 'S-844 67', 'Sweden'); +INSERT INTO northwind.orders VALUES (10435, 'CONSH', 8, '1997-02-04', '1997-03-18', '1997-02-07', 2, 9.21000004, 'Consolidated Holdings', 'Berkeley Gardens 12 Brewery', 'London', NULL, 'WX1 6LT', 'UK'); +INSERT INTO northwind.orders VALUES (10436, 'BLONP', 3, '1997-02-05', '1997-03-05', '1997-02-11', 2, 156.660004, 'Blondel père et fils', '24, place Kléber', 'Strasbourg', NULL, '67000', 'France'); +INSERT INTO northwind.orders VALUES (10437, 'WARTH', 8, '1997-02-05', '1997-03-05', '1997-02-12', 1, 19.9699993, 'Wartian Herkku', 'Torikatu 38', 'Oulu', NULL, '90110', 'Finland'); +INSERT INTO northwind.orders VALUES (10438, 'TOMSP', 3, '1997-02-06', '1997-03-06', '1997-02-14', 2, 8.23999977, 'Toms Spezialitäten', 'Luisenstr. 48', 'Münster', NULL, '44087', 'Germany'); +INSERT INTO northwind.orders VALUES (10439, 'MEREP', 6, '1997-02-07', '1997-03-07', '1997-02-10', 3, 4.07000017, 'Mère Paillarde', '43 rue St. Laurent', 'Montréal', 'Québec', 'H1J 1C3', 'Canada'); +INSERT INTO northwind.orders VALUES (10440, 'SAVEA', 4, '1997-02-10', '1997-03-10', '1997-02-28', 2, 86.5299988, 'Save-a-lot Markets', '187 Suffolk Ln.', 'Boise', 'ID', '83720', 'USA'); +INSERT INTO northwind.orders VALUES (10441, 'OLDWO', 3, '1997-02-10', '1997-03-24', '1997-03-14', 2, 73.0199966, 'Old World Delicatessen', '2743 Bering St.', 'Anchorage', 'AK', '99508', 'USA'); +INSERT INTO northwind.orders VALUES (10442, 'ERNSH', 3, '1997-02-11', '1997-03-11', '1997-02-18', 2, 47.9399986, 'Ernst Handel', 'Kirchgasse 6', 'Graz', NULL, '8010', 'Austria'); +INSERT INTO northwind.orders VALUES (10443, 'REGGC', 8, '1997-02-12', '1997-03-12', '1997-02-14', 1, 13.9499998, 'Reggiani Caseifici', 'Strada Provinciale 124', 'Reggio Emilia', NULL, '42100', 'Italy'); +INSERT INTO northwind.orders VALUES (10444, 'BERGS', 3, '1997-02-12', '1997-03-12', '1997-02-21', 3, 3.5, 'Berglunds snabbköp', 'Berguvsvägen 8', 'Luleå', NULL, 'S-958 22', 'Sweden'); +INSERT INTO northwind.orders VALUES (10445, 'BERGS', 3, '1997-02-13', '1997-03-13', '1997-02-20', 1, 9.30000019, 'Berglunds snabbköp', 'Berguvsvägen 8', 'Luleå', NULL, 'S-958 22', 'Sweden'); +INSERT INTO northwind.orders VALUES (10446, 'TOMSP', 6, '1997-02-14', '1997-03-14', '1997-02-19', 1, 14.6800003, 'Toms Spezialitäten', 'Luisenstr. 48', 'Münster', NULL, '44087', 'Germany'); +INSERT INTO northwind.orders VALUES (10447, 'RICAR', 4, '1997-02-14', '1997-03-14', '1997-03-07', 2, 68.6600037, 'Ricardo Adocicados', 'Av. Copacabana, 267', 'Rio de Janeiro', 'RJ', '02389-890', 'Brazil'); +INSERT INTO northwind.orders VALUES (10448, 'RANCH', 4, '1997-02-17', '1997-03-17', '1997-02-24', 2, 38.8199997, 'Rancho grande', 'Av. del Libertador 900', 'Buenos Aires', NULL, '1010', 'Argentina'); +INSERT INTO northwind.orders VALUES (10449, 'BLONP', 3, '1997-02-18', '1997-03-18', '1997-02-27', 2, 53.2999992, 'Blondel père et fils', '24, place Kléber', 'Strasbourg', NULL, '67000', 'France'); +INSERT INTO northwind.orders VALUES (10450, 'VICTE', 8, '1997-02-19', '1997-03-19', '1997-03-11', 2, 7.23000002, 'Victuailles en stock', '2, rue du Commerce', 'Lyon', NULL, '69004', 'France'); +INSERT INTO northwind.orders VALUES (10451, 'QUICK', 4, '1997-02-19', '1997-03-05', '1997-03-12', 3, 189.089996, 'QUICK-Stop', 'Taucherstraße 10', 'Cunewalde', NULL, '01307', 'Germany'); +INSERT INTO northwind.orders VALUES (10452, 'SAVEA', 8, '1997-02-20', '1997-03-20', '1997-02-26', 1, 140.259995, 'Save-a-lot Markets', '187 Suffolk Ln.', 'Boise', 'ID', '83720', 'USA'); +INSERT INTO northwind.orders VALUES (10454, 'LAMAI', 4, '1997-02-21', '1997-03-21', '1997-02-25', 3, 2.74000001, 'La maison d''Asie', '1 rue Alsace-Lorraine', 'Toulouse', NULL, '31000', 'France'); +INSERT INTO northwind.orders VALUES (10455, 'WARTH', 8, '1997-02-24', '1997-04-07', '1997-03-03', 2, 180.449997, 'Wartian Herkku', 'Torikatu 38', 'Oulu', NULL, '90110', 'Finland'); +INSERT INTO northwind.orders VALUES (10456, 'KOENE', 8, '1997-02-25', '1997-04-08', '1997-02-28', 2, 8.11999989, 'Königlich Essen', 'Maubelstr. 90', 'Brandenburg', NULL, '14776', 'Germany'); +INSERT INTO northwind.orders VALUES (10457, 'KOENE', 2, '1997-02-25', '1997-03-25', '1997-03-03', 1, 11.5699997, 'Königlich Essen', 'Maubelstr. 90', 'Brandenburg', NULL, '14776', 'Germany'); +INSERT INTO northwind.orders VALUES (10458, 'SUPRD', 7, '1997-02-26', '1997-03-26', '1997-03-04', 3, 147.059998, 'Suprêmes délices', 'Boulevard Tirou, 255', 'Charleroi', NULL, 'B-6000', 'Belgium'); +INSERT INTO northwind.orders VALUES (10459, 'VICTE', 4, '1997-02-27', '1997-03-27', '1997-02-28', 2, 25.0900002, 'Victuailles en stock', '2, rue du Commerce', 'Lyon', NULL, '69004', 'France'); +INSERT INTO northwind.orders VALUES (10460, 'FOLKO', 8, '1997-02-28', '1997-03-28', '1997-03-03', 1, 16.2700005, 'Folk och fä HB', 'Åkergatan 24', 'Bräcke', NULL, 'S-844 67', 'Sweden'); +INSERT INTO northwind.orders VALUES (10462, 'CONSH', 2, '1997-03-03', '1997-03-31', '1997-03-18', 1, 6.17000008, 'Consolidated Holdings', 'Berkeley Gardens 12 Brewery', 'London', NULL, 'WX1 6LT', 'UK'); +INSERT INTO northwind.orders VALUES (10463, 'SUPRD', 5, '1997-03-04', '1997-04-01', '1997-03-06', 3, 14.7799997, 'Suprêmes délices', 'Boulevard Tirou, 255', 'Charleroi', NULL, 'B-6000', 'Belgium'); +INSERT INTO northwind.orders VALUES (10464, 'FURIB', 4, '1997-03-04', '1997-04-01', '1997-03-14', 2, 89, 'Furia Bacalhau e Frutos do Mar', 'Jardim das rosas n. 32', 'Lisboa', NULL, '1675', 'Portugal'); +INSERT INTO northwind.orders VALUES (10466, 'COMMI', 4, '1997-03-06', '1997-04-03', '1997-03-13', 1, 11.9300003, 'Comércio Mineiro', 'Av. dos Lusíadas, 23', 'Sao Paulo', 'SP', '05432-043', 'Brazil'); +INSERT INTO northwind.orders VALUES (10467, 'MAGAA', 8, '1997-03-06', '1997-04-03', '1997-03-11', 2, 4.92999983, 'Magazzini Alimentari Riuniti', 'Via Ludovico il Moro 22', 'Bergamo', NULL, '24100', 'Italy'); +INSERT INTO northwind.orders VALUES (10468, 'KOENE', 3, '1997-03-07', '1997-04-04', '1997-03-12', 3, 44.1199989, 'Königlich Essen', 'Maubelstr. 90', 'Brandenburg', NULL, '14776', 'Germany'); +INSERT INTO northwind.orders VALUES (10470, 'BONAP', 4, '1997-03-11', '1997-04-08', '1997-03-14', 2, 64.5599976, 'Bon app''', '12, rue des Bouchers', 'Marseille', NULL, '13008', 'France'); +INSERT INTO northwind.orders VALUES (10471, 'BSBEV', 2, '1997-03-11', '1997-04-08', '1997-03-18', 3, 45.5900002, 'B''s Beverages', 'Fauntleroy Circus', 'London', NULL, 'EC2 5NT', 'UK'); +INSERT INTO northwind.orders VALUES (10472, 'SEVES', 8, '1997-03-12', '1997-04-09', '1997-03-19', 1, 4.19999981, 'Seven Seas Imports', '90 Wadhurst Rd.', 'London', NULL, 'OX15 4NB', 'UK'); +INSERT INTO northwind.orders VALUES (10474, 'PERIC', 5, '1997-03-13', '1997-04-10', '1997-03-21', 2, 83.4899979, 'Pericles Comidas clásicas', 'Calle Dr. Jorge Cash 321', 'México D.F.', NULL, '05033', 'Mexico'); +INSERT INTO northwind.orders VALUES (10475, 'SUPRD', 9, '1997-03-14', '1997-04-11', '1997-04-04', 1, 68.5199966, 'Suprêmes délices', 'Boulevard Tirou, 255', 'Charleroi', NULL, 'B-6000', 'Belgium'); +INSERT INTO northwind.orders VALUES (10476, 'HILAA', 8, '1997-03-17', '1997-04-14', '1997-03-24', 3, 4.40999985, 'HILARION-Abastos', 'Carrera 22 con Ave. Carlos Soublette #8-35', 'San Cristóbal', 'Táchira', '5022', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10477, 'PRINI', 5, '1997-03-17', '1997-04-14', '1997-03-25', 2, 13.0200005, 'Princesa Isabel Vinhos', 'Estrada da saúde n. 58', 'Lisboa', NULL, '1756', 'Portugal'); +INSERT INTO northwind.orders VALUES (10478, 'VICTE', 2, '1997-03-18', '1997-04-01', '1997-03-26', 3, 4.80999994, 'Victuailles en stock', '2, rue du Commerce', 'Lyon', NULL, '69004', 'France'); +INSERT INTO northwind.orders VALUES (10479, 'RATTC', 3, '1997-03-19', '1997-04-16', '1997-03-21', 3, 708.950012, 'Rattlesnake Canyon Grocery', '2817 Milton Dr.', 'Albuquerque', 'NM', '87110', 'USA'); +INSERT INTO northwind.orders VALUES (10480, 'FOLIG', 6, '1997-03-20', '1997-04-17', '1997-03-24', 2, 1.35000002, 'Folies gourmandes', '184, chaussée de Tournai', 'Lille', NULL, '59000', 'France'); +INSERT INTO northwind.orders VALUES (10481, 'RICAR', 8, '1997-03-20', '1997-04-17', '1997-03-25', 2, 64.3300018, 'Ricardo Adocicados', 'Av. Copacabana, 267', 'Rio de Janeiro', 'RJ', '02389-890', 'Brazil'); +INSERT INTO northwind.orders VALUES (10483, 'WHITC', 7, '1997-03-24', '1997-04-21', '1997-04-25', 2, 15.2799997, 'White Clover Markets', '1029 - 12th Ave. S.', 'Seattle', 'WA', '98124', 'USA'); +INSERT INTO northwind.orders VALUES (10484, 'BSBEV', 3, '1997-03-24', '1997-04-21', '1997-04-01', 3, 6.88000011, 'B''s Beverages', 'Fauntleroy Circus', 'London', NULL, 'EC2 5NT', 'UK'); +INSERT INTO northwind.orders VALUES (10485, 'LINOD', 4, '1997-03-25', '1997-04-08', '1997-03-31', 2, 64.4499969, 'LINO-Delicateses', 'Ave. 5 de Mayo Porlamar', 'I. de Margarita', 'Nueva Esparta', '4980', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10487, 'QUEEN', 2, '1997-03-26', '1997-04-23', '1997-03-28', 2, 71.0699997, 'Queen Cozinha', 'Alameda dos Canàrios, 891', 'Sao Paulo', 'SP', '05487-020', 'Brazil'); +INSERT INTO northwind.orders VALUES (10488, 'FRANK', 8, '1997-03-27', '1997-04-24', '1997-04-02', 2, 4.92999983, 'Frankenversand', 'Berliner Platz 43', 'München', NULL, '80805', 'Germany'); +INSERT INTO northwind.orders VALUES (10489, 'PICCO', 6, '1997-03-28', '1997-04-25', '1997-04-09', 2, 5.28999996, 'Piccolo und mehr', 'Geislweg 14', 'Salzburg', NULL, '5020', 'Austria'); +INSERT INTO northwind.orders VALUES (10490, 'HILAA', 7, '1997-03-31', '1997-04-28', '1997-04-03', 2, 210.190002, 'HILARION-Abastos', 'Carrera 22 con Ave. Carlos Soublette #8-35', 'San Cristóbal', 'Táchira', '5022', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10491, 'FURIB', 8, '1997-03-31', '1997-04-28', '1997-04-08', 3, 16.9599991, 'Furia Bacalhau e Frutos do Mar', 'Jardim das rosas n. 32', 'Lisboa', NULL, '1675', 'Portugal'); +INSERT INTO northwind.orders VALUES (10492, 'BOTTM', 3, '1997-04-01', '1997-04-29', '1997-04-11', 1, 62.8899994, 'Bottom-Dollar Markets', '23 Tsawassen Blvd.', 'Tsawassen', 'BC', 'T2F 8M4', 'Canada'); +INSERT INTO northwind.orders VALUES (10493, 'LAMAI', 4, '1997-04-02', '1997-04-30', '1997-04-10', 3, 10.6400003, 'La maison d''Asie', '1 rue Alsace-Lorraine', 'Toulouse', NULL, '31000', 'France'); +INSERT INTO northwind.orders VALUES (10494, 'COMMI', 4, '1997-04-02', '1997-04-30', '1997-04-09', 2, 65.9899979, 'Comércio Mineiro', 'Av. dos Lusíadas, 23', 'Sao Paulo', 'SP', '05432-043', 'Brazil'); +INSERT INTO northwind.orders VALUES (10495, 'LAUGB', 3, '1997-04-03', '1997-05-01', '1997-04-11', 3, 4.6500001, 'Laughing Bacchus Wine Cellars', '2319 Elm St.', 'Vancouver', 'BC', 'V3F 2K1', 'Canada'); +INSERT INTO northwind.orders VALUES (10496, 'TRADH', 7, '1997-04-04', '1997-05-02', '1997-04-07', 2, 46.7700005, 'Tradiçao Hipermercados', 'Av. Inês de Castro, 414', 'Sao Paulo', 'SP', '05634-030', 'Brazil'); +INSERT INTO northwind.orders VALUES (10497, 'LEHMS', 7, '1997-04-04', '1997-05-02', '1997-04-07', 1, 36.2099991, 'Lehmanns Marktstand', 'Magazinweg 7', 'Frankfurt a.M.', NULL, '60528', 'Germany'); +INSERT INTO northwind.orders VALUES (10498, 'HILAA', 8, '1997-04-07', '1997-05-05', '1997-04-11', 2, 29.75, 'HILARION-Abastos', 'Carrera 22 con Ave. Carlos Soublette #8-35', 'San Cristóbal', 'Táchira', '5022', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10499, 'LILAS', 4, '1997-04-08', '1997-05-06', '1997-04-16', 2, 102.019997, 'LILA-Supermercado', 'Carrera 52 con Ave. Bolívar #65-98 Llano Largo', 'Barquisimeto', 'Lara', '3508', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10500, 'LAMAI', 6, '1997-04-09', '1997-05-07', '1997-04-17', 1, 42.6800003, 'La maison d''Asie', '1 rue Alsace-Lorraine', 'Toulouse', NULL, '31000', 'France'); +INSERT INTO northwind.orders VALUES (10501, 'BLAUS', 9, '1997-04-09', '1997-05-07', '1997-04-16', 3, 8.85000038, 'Blauer See Delikatessen', 'Forsterstr. 57', 'Mannheim', NULL, '68306', 'Germany'); +INSERT INTO northwind.orders VALUES (10502, 'PERIC', 2, '1997-04-10', '1997-05-08', '1997-04-29', 1, 69.3199997, 'Pericles Comidas clásicas', 'Calle Dr. Jorge Cash 321', 'México D.F.', NULL, '05033', 'Mexico'); +INSERT INTO northwind.orders VALUES (10503, 'HUNGO', 6, '1997-04-11', '1997-05-09', '1997-04-16', 2, 16.7399998, 'Hungry Owl All-Night Grocers', '8 Johnstown Road', 'Cork', 'Co. Cork', NULL, 'Ireland'); +INSERT INTO northwind.orders VALUES (10504, 'WHITC', 4, '1997-04-11', '1997-05-09', '1997-04-18', 3, 59.1300011, 'White Clover Markets', '1029 - 12th Ave. S.', 'Seattle', 'WA', '98124', 'USA'); +INSERT INTO northwind.orders VALUES (10505, 'MEREP', 3, '1997-04-14', '1997-05-12', '1997-04-21', 3, 7.13000011, 'Mère Paillarde', '43 rue St. Laurent', 'Montréal', 'Québec', 'H1J 1C3', 'Canada'); +INSERT INTO northwind.orders VALUES (10506, 'KOENE', 9, '1997-04-15', '1997-05-13', '1997-05-02', 2, 21.1900005, 'Königlich Essen', 'Maubelstr. 90', 'Brandenburg', NULL, '14776', 'Germany'); +INSERT INTO northwind.orders VALUES (10507, 'ANTON', 7, '1997-04-15', '1997-05-13', '1997-04-22', 1, 47.4500008, 'Antonio Moreno Taquería', 'Mataderos 2312', 'México D.F.', NULL, '05023', 'Mexico'); +INSERT INTO northwind.orders VALUES (10509, 'BLAUS', 4, '1997-04-17', '1997-05-15', '1997-04-29', 1, 0.150000006, 'Blauer See Delikatessen', 'Forsterstr. 57', 'Mannheim', NULL, '68306', 'Germany'); +INSERT INTO northwind.orders VALUES (10510, 'SAVEA', 6, '1997-04-18', '1997-05-16', '1997-04-28', 3, 367.630005, 'Save-a-lot Markets', '187 Suffolk Ln.', 'Boise', 'ID', '83720', 'USA'); +INSERT INTO northwind.orders VALUES (10511, 'BONAP', 4, '1997-04-18', '1997-05-16', '1997-04-21', 3, 350.640015, 'Bon app''', '12, rue des Bouchers', 'Marseille', NULL, '13008', 'France'); +INSERT INTO northwind.orders VALUES (10512, 'FAMIA', 7, '1997-04-21', '1997-05-19', '1997-04-24', 2, 3.52999997, 'Familia Arquibaldo', 'Rua Orós, 92', 'Sao Paulo', 'SP', '05442-030', 'Brazil'); +INSERT INTO northwind.orders VALUES (10513, 'WANDK', 7, '1997-04-22', '1997-06-03', '1997-04-28', 1, 105.650002, 'Die Wandernde Kuh', 'Adenauerallee 900', 'Stuttgart', NULL, '70563', 'Germany'); +INSERT INTO northwind.orders VALUES (10514, 'ERNSH', 3, '1997-04-22', '1997-05-20', '1997-05-16', 2, 789.950012, 'Ernst Handel', 'Kirchgasse 6', 'Graz', NULL, '8010', 'Austria'); +INSERT INTO northwind.orders VALUES (10515, 'QUICK', 2, '1997-04-23', '1997-05-07', '1997-05-23', 1, 204.470001, 'QUICK-Stop', 'Taucherstraße 10', 'Cunewalde', NULL, '01307', 'Germany'); +INSERT INTO northwind.orders VALUES (10516, 'HUNGO', 2, '1997-04-24', '1997-05-22', '1997-05-01', 3, 62.7799988, 'Hungry Owl All-Night Grocers', '8 Johnstown Road', 'Cork', 'Co. Cork', NULL, 'Ireland'); +INSERT INTO northwind.orders VALUES (10517, 'NORTS', 3, '1997-04-24', '1997-05-22', '1997-04-29', 3, 32.0699997, 'North/South', 'South House 300 Queensbridge', 'London', NULL, 'SW7 1RZ', 'UK'); +INSERT INTO northwind.orders VALUES (10518, 'TORTU', 4, '1997-04-25', '1997-05-09', '1997-05-05', 2, 218.149994, 'Tortuga Restaurante', 'Avda. Azteca 123', 'México D.F.', NULL, '05033', 'Mexico'); +INSERT INTO northwind.orders VALUES (10519, 'CHOPS', 6, '1997-04-28', '1997-05-26', '1997-05-01', 3, 91.7600021, 'Chop-suey Chinese', 'Hauptstr. 31', 'Bern', NULL, '3012', 'Switzerland'); +INSERT INTO northwind.orders VALUES (10520, 'SANTG', 7, '1997-04-29', '1997-05-27', '1997-05-01', 1, 13.3699999, 'Santé Gourmet', 'Erling Skakkes gate 78', 'Stavern', NULL, '4110', 'Norway'); +INSERT INTO northwind.orders VALUES (10521, 'CACTU', 8, '1997-04-29', '1997-05-27', '1997-05-02', 2, 17.2199993, 'Cactus Comidas para llevar', 'Cerrito 333', 'Buenos Aires', NULL, '1010', 'Argentina'); +INSERT INTO northwind.orders VALUES (10522, 'LEHMS', 4, '1997-04-30', '1997-05-28', '1997-05-06', 1, 45.3300018, 'Lehmanns Marktstand', 'Magazinweg 7', 'Frankfurt a.M.', NULL, '60528', 'Germany'); +INSERT INTO northwind.orders VALUES (10523, 'SEVES', 7, '1997-05-01', '1997-05-29', '1997-05-30', 2, 77.6299973, 'Seven Seas Imports', '90 Wadhurst Rd.', 'London', NULL, 'OX15 4NB', 'UK'); +INSERT INTO northwind.orders VALUES (10285, 'QUICK', 1, '1996-08-20', '1996-09-17', '1996-08-26', 2, 76.8300018, 'QUICK-Stop', 'Taucherstraße 10', 'Cunewalde', NULL, '01307', 'Germany'); +INSERT INTO northwind.orders VALUES (10526, 'WARTH', 4, '1997-05-05', '1997-06-02', '1997-05-15', 2, 58.5900002, 'Wartian Herkku', 'Torikatu 38', 'Oulu', NULL, '90110', 'Finland'); +INSERT INTO northwind.orders VALUES (10527, 'QUICK', 7, '1997-05-05', '1997-06-02', '1997-05-07', 1, 41.9000015, 'QUICK-Stop', 'Taucherstraße 10', 'Cunewalde', NULL, '01307', 'Germany'); +INSERT INTO northwind.orders VALUES (10528, 'GREAL', 6, '1997-05-06', '1997-05-20', '1997-05-09', 2, 3.3499999, 'Great Lakes Food Market', '2732 Baker Blvd.', 'Eugene', 'OR', '97403', 'USA'); +INSERT INTO northwind.orders VALUES (10529, 'MAISD', 5, '1997-05-07', '1997-06-04', '1997-05-09', 2, 66.6900024, 'Maison Dewey', 'Rue Joseph-Bens 532', 'Bruxelles', NULL, 'B-1180', 'Belgium'); +INSERT INTO northwind.orders VALUES (10530, 'PICCO', 3, '1997-05-08', '1997-06-05', '1997-05-12', 2, 339.220001, 'Piccolo und mehr', 'Geislweg 14', 'Salzburg', NULL, '5020', 'Austria'); +INSERT INTO northwind.orders VALUES (10531, 'OCEAN', 7, '1997-05-08', '1997-06-05', '1997-05-19', 1, 8.11999989, 'Océano Atlántico Ltda.', 'Ing. Gustavo Moncada 8585 Piso 20-A', 'Buenos Aires', NULL, '1010', 'Argentina'); +INSERT INTO northwind.orders VALUES (10532, 'EASTC', 7, '1997-05-09', '1997-06-06', '1997-05-12', 3, 74.4599991, 'Eastern Connection', '35 King George', 'London', NULL, 'WX3 6FW', 'UK'); +INSERT INTO northwind.orders VALUES (10533, 'FOLKO', 8, '1997-05-12', '1997-06-09', '1997-05-22', 1, 188.039993, 'Folk och fä HB', 'Åkergatan 24', 'Bräcke', NULL, 'S-844 67', 'Sweden'); +INSERT INTO northwind.orders VALUES (10534, 'LEHMS', 8, '1997-05-12', '1997-06-09', '1997-05-14', 2, 27.9400005, 'Lehmanns Marktstand', 'Magazinweg 7', 'Frankfurt a.M.', NULL, '60528', 'Germany'); +INSERT INTO northwind.orders VALUES (10535, 'ANTON', 4, '1997-05-13', '1997-06-10', '1997-05-21', 1, 15.6400003, 'Antonio Moreno Taquería', 'Mataderos 2312', 'México D.F.', NULL, '05023', 'Mexico'); +INSERT INTO northwind.orders VALUES (10536, 'LEHMS', 3, '1997-05-14', '1997-06-11', '1997-06-06', 2, 58.8800011, 'Lehmanns Marktstand', 'Magazinweg 7', 'Frankfurt a.M.', NULL, '60528', 'Germany'); +INSERT INTO northwind.orders VALUES (10538, 'BSBEV', 9, '1997-05-15', '1997-06-12', '1997-05-16', 3, 4.86999989, 'B''s Beverages', 'Fauntleroy Circus', 'London', NULL, 'EC2 5NT', 'UK'); +INSERT INTO northwind.orders VALUES (10539, 'BSBEV', 6, '1997-05-16', '1997-06-13', '1997-05-23', 3, 12.3599997, 'B''s Beverages', 'Fauntleroy Circus', 'London', NULL, 'EC2 5NT', 'UK'); +INSERT INTO northwind.orders VALUES (10540, 'QUICK', 3, '1997-05-19', '1997-06-16', '1997-06-13', 3, 1007.64001, 'QUICK-Stop', 'Taucherstraße 10', 'Cunewalde', NULL, '01307', 'Germany'); +INSERT INTO northwind.orders VALUES (10541, 'HANAR', 2, '1997-05-19', '1997-06-16', '1997-05-29', 1, 68.6500015, 'Hanari Carnes', 'Rua do Paço, 67', 'Rio de Janeiro', 'RJ', '05454-876', 'Brazil'); +INSERT INTO northwind.orders VALUES (10543, 'LILAS', 8, '1997-05-21', '1997-06-18', '1997-05-23', 2, 48.1699982, 'LILA-Supermercado', 'Carrera 52 con Ave. Bolívar #65-98 Llano Largo', 'Barquisimeto', 'Lara', '3508', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10544, 'LONEP', 4, '1997-05-21', '1997-06-18', '1997-05-30', 1, 24.9099998, 'Lonesome Pine Restaurant', '89 Chiaroscuro Rd.', 'Portland', 'OR', '97219', 'USA'); +INSERT INTO northwind.orders VALUES (10545, 'LAZYK', 8, '1997-05-22', '1997-06-19', '1997-06-26', 2, 11.9200001, 'Lazy K Kountry Store', '12 Orchestra Terrace', 'Walla Walla', 'WA', '99362', 'USA'); +INSERT INTO northwind.orders VALUES (10547, 'SEVES', 3, '1997-05-23', '1997-06-20', '1997-06-02', 2, 178.429993, 'Seven Seas Imports', '90 Wadhurst Rd.', 'London', NULL, 'OX15 4NB', 'UK'); +INSERT INTO northwind.orders VALUES (10548, 'TOMSP', 3, '1997-05-26', '1997-06-23', '1997-06-02', 2, 1.42999995, 'Toms Spezialitäten', 'Luisenstr. 48', 'Münster', NULL, '44087', 'Germany'); +INSERT INTO northwind.orders VALUES (10549, 'QUICK', 5, '1997-05-27', '1997-06-10', '1997-05-30', 1, 171.240005, 'QUICK-Stop', 'Taucherstraße 10', 'Cunewalde', NULL, '01307', 'Germany'); +INSERT INTO northwind.orders VALUES (10550, 'GODOS', 7, '1997-05-28', '1997-06-25', '1997-06-06', 3, 4.32000017, 'Godos Cocina Típica', 'C/ Romero, 33', 'Sevilla', NULL, '41101', 'Spain'); +INSERT INTO northwind.orders VALUES (10551, 'FURIB', 4, '1997-05-28', '1997-07-09', '1997-06-06', 3, 72.9499969, 'Furia Bacalhau e Frutos do Mar', 'Jardim das rosas n. 32', 'Lisboa', NULL, '1675', 'Portugal'); +INSERT INTO northwind.orders VALUES (10552, 'HILAA', 2, '1997-05-29', '1997-06-26', '1997-06-05', 1, 83.2200012, 'HILARION-Abastos', 'Carrera 22 con Ave. Carlos Soublette #8-35', 'San Cristóbal', 'Táchira', '5022', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10553, 'WARTH', 2, '1997-05-30', '1997-06-27', '1997-06-03', 2, 149.490005, 'Wartian Herkku', 'Torikatu 38', 'Oulu', NULL, '90110', 'Finland'); +INSERT INTO northwind.orders VALUES (10554, 'OTTIK', 4, '1997-05-30', '1997-06-27', '1997-06-05', 3, 120.970001, 'Ottilies Käseladen', 'Mehrheimerstr. 369', 'Köln', NULL, '50739', 'Germany'); +INSERT INTO northwind.orders VALUES (10555, 'SAVEA', 6, '1997-06-02', '1997-06-30', '1997-06-04', 3, 252.490005, 'Save-a-lot Markets', '187 Suffolk Ln.', 'Boise', 'ID', '83720', 'USA'); +INSERT INTO northwind.orders VALUES (10556, 'SIMOB', 2, '1997-06-03', '1997-07-15', '1997-06-13', 1, 9.80000019, 'Simons bistro', 'Vinbæltet 34', 'Kobenhavn', NULL, '1734', 'Denmark'); +INSERT INTO northwind.orders VALUES (10557, 'LEHMS', 9, '1997-06-03', '1997-06-17', '1997-06-06', 2, 96.7200012, 'Lehmanns Marktstand', 'Magazinweg 7', 'Frankfurt a.M.', NULL, '60528', 'Germany'); +INSERT INTO northwind.orders VALUES (10559, 'BLONP', 6, '1997-06-05', '1997-07-03', '1997-06-13', 1, 8.05000019, 'Blondel père et fils', '24, place Kléber', 'Strasbourg', NULL, '67000', 'France'); +INSERT INTO northwind.orders VALUES (10560, 'FRANK', 8, '1997-06-06', '1997-07-04', '1997-06-09', 1, 36.6500015, 'Frankenversand', 'Berliner Platz 43', 'München', NULL, '80805', 'Germany'); +INSERT INTO northwind.orders VALUES (10561, 'FOLKO', 2, '1997-06-06', '1997-07-04', '1997-06-09', 2, 242.210007, 'Folk och fä HB', 'Åkergatan 24', 'Bräcke', NULL, 'S-844 67', 'Sweden'); +INSERT INTO northwind.orders VALUES (10563, 'RICAR', 2, '1997-06-10', '1997-07-22', '1997-06-24', 2, 60.4300003, 'Ricardo Adocicados', 'Av. Copacabana, 267', 'Rio de Janeiro', 'RJ', '02389-890', 'Brazil'); +INSERT INTO northwind.orders VALUES (10564, 'RATTC', 4, '1997-06-10', '1997-07-08', '1997-06-16', 3, 13.75, 'Rattlesnake Canyon Grocery', '2817 Milton Dr.', 'Albuquerque', 'NM', '87110', 'USA'); +INSERT INTO northwind.orders VALUES (10565, 'MEREP', 8, '1997-06-11', '1997-07-09', '1997-06-18', 2, 7.1500001, 'Mère Paillarde', '43 rue St. Laurent', 'Montréal', 'Québec', 'H1J 1C3', 'Canada'); +INSERT INTO northwind.orders VALUES (10566, 'BLONP', 9, '1997-06-12', '1997-07-10', '1997-06-18', 1, 88.4000015, 'Blondel père et fils', '24, place Kléber', 'Strasbourg', NULL, '67000', 'France'); +INSERT INTO northwind.orders VALUES (10292, 'TRADH', 1, '1996-08-28', '1996-09-25', '1996-09-02', 2, 1.35000002, 'Tradiçao Hipermercados', 'Av. Inês de Castro, 414', 'Sao Paulo', 'SP', '05634-030', 'Brazil'); +INSERT INTO northwind.orders VALUES (10568, 'GALED', 3, '1997-06-13', '1997-07-11', '1997-07-09', 3, 6.53999996, 'Galería del gastronómo', 'Rambla de Cataluña, 23', 'Barcelona', NULL, '8022', 'Spain'); +INSERT INTO northwind.orders VALUES (10569, 'RATTC', 5, '1997-06-16', '1997-07-14', '1997-07-11', 1, 58.9799995, 'Rattlesnake Canyon Grocery', '2817 Milton Dr.', 'Albuquerque', 'NM', '87110', 'USA'); +INSERT INTO northwind.orders VALUES (10570, 'MEREP', 3, '1997-06-17', '1997-07-15', '1997-06-19', 3, 188.990005, 'Mère Paillarde', '43 rue St. Laurent', 'Montréal', 'Québec', 'H1J 1C3', 'Canada'); +INSERT INTO northwind.orders VALUES (10571, 'ERNSH', 8, '1997-06-17', '1997-07-29', '1997-07-04', 3, 26.0599995, 'Ernst Handel', 'Kirchgasse 6', 'Graz', NULL, '8010', 'Austria'); +INSERT INTO northwind.orders VALUES (10572, 'BERGS', 3, '1997-06-18', '1997-07-16', '1997-06-25', 2, 116.43, 'Berglunds snabbköp', 'Berguvsvägen 8', 'Luleå', NULL, 'S-958 22', 'Sweden'); +INSERT INTO northwind.orders VALUES (10573, 'ANTON', 7, '1997-06-19', '1997-07-17', '1997-06-20', 3, 84.8399963, 'Antonio Moreno Taquería', 'Mataderos 2312', 'México D.F.', NULL, '05023', 'Mexico'); +INSERT INTO northwind.orders VALUES (10574, 'TRAIH', 4, '1997-06-19', '1997-07-17', '1997-06-30', 2, 37.5999985, 'Trail''s Head Gourmet Provisioners', '722 DaVinci Blvd.', 'Kirkland', 'WA', '98034', 'USA'); +INSERT INTO northwind.orders VALUES (10575, 'MORGK', 5, '1997-06-20', '1997-07-04', '1997-06-30', 1, 127.339996, 'Morgenstern Gesundkost', 'Heerstr. 22', 'Leipzig', NULL, '04179', 'Germany'); +INSERT INTO northwind.orders VALUES (10576, 'TORTU', 3, '1997-06-23', '1997-07-07', '1997-06-30', 3, 18.5599995, 'Tortuga Restaurante', 'Avda. Azteca 123', 'México D.F.', NULL, '05033', 'Mexico'); +INSERT INTO northwind.orders VALUES (10577, 'TRAIH', 9, '1997-06-23', '1997-08-04', '1997-06-30', 2, 25.4099998, 'Trail''s Head Gourmet Provisioners', '722 DaVinci Blvd.', 'Kirkland', 'WA', '98034', 'USA'); +INSERT INTO northwind.orders VALUES (10578, 'BSBEV', 4, '1997-06-24', '1997-07-22', '1997-07-25', 3, 29.6000004, 'B''s Beverages', 'Fauntleroy Circus', 'London', NULL, 'EC2 5NT', 'UK'); +INSERT INTO northwind.orders VALUES (10293, 'TORTU', 1, '1996-08-29', '1996-09-26', '1996-09-11', 3, 21.1800003, 'Tortuga Restaurante', 'Avda. Azteca 123', 'México D.F.', NULL, '05033', 'Mexico'); +INSERT INTO northwind.orders VALUES (10580, 'OTTIK', 4, '1997-06-26', '1997-07-24', '1997-07-01', 3, 75.8899994, 'Ottilies Käseladen', 'Mehrheimerstr. 369', 'Köln', NULL, '50739', 'Germany'); +INSERT INTO northwind.orders VALUES (10581, 'FAMIA', 3, '1997-06-26', '1997-07-24', '1997-07-02', 1, 3.00999999, 'Familia Arquibaldo', 'Rua Orós, 92', 'Sao Paulo', 'SP', '05442-030', 'Brazil'); +INSERT INTO northwind.orders VALUES (10582, 'BLAUS', 3, '1997-06-27', '1997-07-25', '1997-07-14', 2, 27.7099991, 'Blauer See Delikatessen', 'Forsterstr. 57', 'Mannheim', NULL, '68306', 'Germany'); +INSERT INTO northwind.orders VALUES (10583, 'WARTH', 2, '1997-06-30', '1997-07-28', '1997-07-04', 2, 7.28000021, 'Wartian Herkku', 'Torikatu 38', 'Oulu', NULL, '90110', 'Finland'); +INSERT INTO northwind.orders VALUES (10584, 'BLONP', 4, '1997-06-30', '1997-07-28', '1997-07-04', 1, 59.1399994, 'Blondel père et fils', '24, place Kléber', 'Strasbourg', NULL, '67000', 'France'); +INSERT INTO northwind.orders VALUES (10585, 'WELLI', 7, '1997-07-01', '1997-07-29', '1997-07-10', 1, 13.4099998, 'Wellington Importadora', 'Rua do Mercado, 12', 'Resende', 'SP', '08737-363', 'Brazil'); +INSERT INTO northwind.orders VALUES (10586, 'REGGC', 9, '1997-07-02', '1997-07-30', '1997-07-09', 1, 0.479999989, 'Reggiani Caseifici', 'Strada Provinciale 124', 'Reggio Emilia', NULL, '42100', 'Italy'); +INSERT INTO northwind.orders VALUES (10588, 'QUICK', 2, '1997-07-03', '1997-07-31', '1997-07-10', 3, 194.669998, 'QUICK-Stop', 'Taucherstraße 10', 'Cunewalde', NULL, '01307', 'Germany'); +INSERT INTO northwind.orders VALUES (10589, 'GREAL', 8, '1997-07-04', '1997-08-01', '1997-07-14', 2, 4.42000008, 'Great Lakes Food Market', '2732 Baker Blvd.', 'Eugene', 'OR', '97403', 'USA'); +INSERT INTO northwind.orders VALUES (10590, 'MEREP', 4, '1997-07-07', '1997-08-04', '1997-07-14', 3, 44.7700005, 'Mère Paillarde', '43 rue St. Laurent', 'Montréal', 'Québec', 'H1J 1C3', 'Canada'); +INSERT INTO northwind.orders VALUES (10592, 'LEHMS', 3, '1997-07-08', '1997-08-05', '1997-07-16', 1, 32.0999985, 'Lehmanns Marktstand', 'Magazinweg 7', 'Frankfurt a.M.', NULL, '60528', 'Germany'); +INSERT INTO northwind.orders VALUES (10593, 'LEHMS', 7, '1997-07-09', '1997-08-06', '1997-08-13', 2, 174.199997, 'Lehmanns Marktstand', 'Magazinweg 7', 'Frankfurt a.M.', NULL, '60528', 'Germany'); +INSERT INTO northwind.orders VALUES (10594, 'OLDWO', 3, '1997-07-09', '1997-08-06', '1997-07-16', 2, 5.23999977, 'Old World Delicatessen', '2743 Bering St.', 'Anchorage', 'AK', '99508', 'USA'); +INSERT INTO northwind.orders VALUES (10595, 'ERNSH', 2, '1997-07-10', '1997-08-07', '1997-07-14', 1, 96.7799988, 'Ernst Handel', 'Kirchgasse 6', 'Graz', NULL, '8010', 'Austria'); +INSERT INTO northwind.orders VALUES (10596, 'WHITC', 8, '1997-07-11', '1997-08-08', '1997-08-12', 1, 16.3400002, 'White Clover Markets', '1029 - 12th Ave. S.', 'Seattle', 'WA', '98124', 'USA'); +INSERT INTO northwind.orders VALUES (10597, 'PICCO', 7, '1997-07-11', '1997-08-08', '1997-07-18', 3, 35.1199989, 'Piccolo und mehr', 'Geislweg 14', 'Salzburg', NULL, '5020', 'Austria'); +INSERT INTO northwind.orders VALUES (10599, 'BSBEV', 6, '1997-07-15', '1997-08-26', '1997-07-21', 3, 29.9799995, 'B''s Beverages', 'Fauntleroy Circus', 'London', NULL, 'EC2 5NT', 'UK'); +INSERT INTO northwind.orders VALUES (10600, 'HUNGC', 4, '1997-07-16', '1997-08-13', '1997-07-21', 1, 45.1300011, 'Hungry Coyote Import Store', 'City Center Plaza 516 Main St.', 'Elgin', 'OR', '97827', 'USA'); +INSERT INTO northwind.orders VALUES (10601, 'HILAA', 7, '1997-07-16', '1997-08-27', '1997-07-22', 1, 58.2999992, 'HILARION-Abastos', 'Carrera 22 con Ave. Carlos Soublette #8-35', 'San Cristóbal', 'Táchira', '5022', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10602, 'VAFFE', 8, '1997-07-17', '1997-08-14', '1997-07-22', 2, 2.92000008, 'Vaffeljernet', 'Smagsloget 45', 'Århus', NULL, '8200', 'Denmark'); +INSERT INTO northwind.orders VALUES (10603, 'SAVEA', 8, '1997-07-18', '1997-08-15', '1997-08-08', 2, 48.7700005, 'Save-a-lot Markets', '187 Suffolk Ln.', 'Boise', 'ID', '83720', 'USA'); +INSERT INTO northwind.orders VALUES (10606, 'TRADH', 4, '1997-07-22', '1997-08-19', '1997-07-31', 3, 79.4000015, 'Tradiçao Hipermercados', 'Av. Inês de Castro, 414', 'Sao Paulo', 'SP', '05634-030', 'Brazil'); +INSERT INTO northwind.orders VALUES (10607, 'SAVEA', 5, '1997-07-22', '1997-08-19', '1997-07-25', 1, 200.240005, 'Save-a-lot Markets', '187 Suffolk Ln.', 'Boise', 'ID', '83720', 'USA'); +INSERT INTO northwind.orders VALUES (10608, 'TOMSP', 4, '1997-07-23', '1997-08-20', '1997-08-01', 2, 27.7900009, 'Toms Spezialitäten', 'Luisenstr. 48', 'Münster', NULL, '44087', 'Germany'); +INSERT INTO northwind.orders VALUES (10609, 'DUMON', 7, '1997-07-24', '1997-08-21', '1997-07-30', 2, 1.85000002, 'Du monde entier', '67, rue des Cinquante Otages', 'Nantes', NULL, '44000', 'France'); +INSERT INTO northwind.orders VALUES (10610, 'LAMAI', 8, '1997-07-25', '1997-08-22', '1997-08-06', 1, 26.7800007, 'La maison d''Asie', '1 rue Alsace-Lorraine', 'Toulouse', NULL, '31000', 'France'); +INSERT INTO northwind.orders VALUES (10611, 'WOLZA', 6, '1997-07-25', '1997-08-22', '1997-08-01', 2, 80.6500015, 'Wolski Zajazd', 'ul. Filtrowa 68', 'Warszawa', NULL, '01-012', 'Poland'); +INSERT INTO northwind.orders VALUES (10613, 'HILAA', 4, '1997-07-29', '1997-08-26', '1997-08-01', 2, 8.10999966, 'HILARION-Abastos', 'Carrera 22 con Ave. Carlos Soublette #8-35', 'San Cristóbal', 'Táchira', '5022', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10614, 'BLAUS', 8, '1997-07-29', '1997-08-26', '1997-08-01', 3, 1.92999995, 'Blauer See Delikatessen', 'Forsterstr. 57', 'Mannheim', NULL, '68306', 'Germany'); +INSERT INTO northwind.orders VALUES (10615, 'WILMK', 2, '1997-07-30', '1997-08-27', '1997-08-06', 3, 0.75, 'Wilman Kala', 'Keskuskatu 45', 'Helsinki', NULL, '21240', 'Finland'); +INSERT INTO northwind.orders VALUES (10617, 'GREAL', 4, '1997-07-31', '1997-08-28', '1997-08-04', 2, 18.5300007, 'Great Lakes Food Market', '2732 Baker Blvd.', 'Eugene', 'OR', '97403', 'USA'); +INSERT INTO northwind.orders VALUES (10619, 'MEREP', 3, '1997-08-04', '1997-09-01', '1997-08-07', 3, 91.0500031, 'Mère Paillarde', '43 rue St. Laurent', 'Montréal', 'Québec', 'H1J 1C3', 'Canada'); +INSERT INTO northwind.orders VALUES (10620, 'LAUGB', 2, '1997-08-05', '1997-09-02', '1997-08-14', 3, 0.939999998, 'Laughing Bacchus Wine Cellars', '2319 Elm St.', 'Vancouver', 'BC', 'V3F 2K1', 'Canada'); +INSERT INTO northwind.orders VALUES (10621, 'ISLAT', 4, '1997-08-05', '1997-09-02', '1997-08-11', 2, 23.7299995, 'Island Trading', 'Garden House Crowther Way', 'Cowes', 'Isle of Wight', 'PO31 7PJ', 'UK'); +INSERT INTO northwind.orders VALUES (10622, 'RICAR', 4, '1997-08-06', '1997-09-03', '1997-08-11', 3, 50.9700012, 'Ricardo Adocicados', 'Av. Copacabana, 267', 'Rio de Janeiro', 'RJ', '02389-890', 'Brazil'); +INSERT INTO northwind.orders VALUES (10623, 'FRANK', 8, '1997-08-07', '1997-09-04', '1997-08-12', 2, 97.1800003, 'Frankenversand', 'Berliner Platz 43', 'München', NULL, '80805', 'Germany'); +INSERT INTO northwind.orders VALUES (10624, 'THECR', 4, '1997-08-07', '1997-09-04', '1997-08-19', 2, 94.8000031, 'The Cracker Box', '55 Grizzly Peak Rd.', 'Butte', 'MT', '59801', 'USA'); +INSERT INTO northwind.orders VALUES (10625, 'ANATR', 3, '1997-08-08', '1997-09-05', '1997-08-14', 1, 43.9000015, 'Ana Trujillo Emparedados y helados', 'Avda. de la Constitución 2222', 'México D.F.', NULL, '05021', 'Mexico'); +INSERT INTO northwind.orders VALUES (10627, 'SAVEA', 8, '1997-08-11', '1997-09-22', '1997-08-21', 3, 107.459999, 'Save-a-lot Markets', '187 Suffolk Ln.', 'Boise', 'ID', '83720', 'USA'); +INSERT INTO northwind.orders VALUES (10628, 'BLONP', 4, '1997-08-12', '1997-09-09', '1997-08-20', 3, 30.3600006, 'Blondel père et fils', '24, place Kléber', 'Strasbourg', NULL, '67000', 'France'); +INSERT INTO northwind.orders VALUES (10629, 'GODOS', 4, '1997-08-12', '1997-09-09', '1997-08-20', 3, 85.4599991, 'Godos Cocina Típica', 'C/ Romero, 33', 'Sevilla', NULL, '41101', 'Spain'); +INSERT INTO northwind.orders VALUES (10631, 'LAMAI', 8, '1997-08-14', '1997-09-11', '1997-08-15', 1, 0.870000005, 'La maison d''Asie', '1 rue Alsace-Lorraine', 'Toulouse', NULL, '31000', 'France'); +INSERT INTO northwind.orders VALUES (10632, 'WANDK', 8, '1997-08-14', '1997-09-11', '1997-08-19', 1, 41.3800011, 'Die Wandernde Kuh', 'Adenauerallee 900', 'Stuttgart', NULL, '70563', 'Germany'); +INSERT INTO northwind.orders VALUES (10633, 'ERNSH', 7, '1997-08-15', '1997-09-12', '1997-08-18', 3, 477.899994, 'Ernst Handel', 'Kirchgasse 6', 'Graz', NULL, '8010', 'Austria'); +INSERT INTO northwind.orders VALUES (10634, 'FOLIG', 4, '1997-08-15', '1997-09-12', '1997-08-21', 3, 487.380005, 'Folies gourmandes', '184, chaussée de Tournai', 'Lille', NULL, '59000', 'France'); +INSERT INTO northwind.orders VALUES (10635, 'MAGAA', 8, '1997-08-18', '1997-09-15', '1997-08-21', 3, 47.4599991, 'Magazzini Alimentari Riuniti', 'Via Ludovico il Moro 22', 'Bergamo', NULL, '24100', 'Italy'); +INSERT INTO northwind.orders VALUES (10636, 'WARTH', 4, '1997-08-19', '1997-09-16', '1997-08-26', 1, 1.14999998, 'Wartian Herkku', 'Torikatu 38', 'Oulu', NULL, '90110', 'Finland'); +INSERT INTO northwind.orders VALUES (10637, 'QUEEN', 6, '1997-08-19', '1997-09-16', '1997-08-26', 1, 201.289993, 'Queen Cozinha', 'Alameda dos Canàrios, 891', 'Sao Paulo', 'SP', '05487-020', 'Brazil'); +INSERT INTO northwind.orders VALUES (10638, 'LINOD', 3, '1997-08-20', '1997-09-17', '1997-09-01', 1, 158.440002, 'LINO-Delicateses', 'Ave. 5 de Mayo Porlamar', 'I. de Margarita', 'Nueva Esparta', '4980', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10639, 'SANTG', 7, '1997-08-20', '1997-09-17', '1997-08-27', 3, 38.6399994, 'Santé Gourmet', 'Erling Skakkes gate 78', 'Stavern', NULL, '4110', 'Norway'); +INSERT INTO northwind.orders VALUES (10640, 'WANDK', 4, '1997-08-21', '1997-09-18', '1997-08-28', 1, 23.5499992, 'Die Wandernde Kuh', 'Adenauerallee 900', 'Stuttgart', NULL, '70563', 'Germany'); +INSERT INTO northwind.orders VALUES (10641, 'HILAA', 4, '1997-08-22', '1997-09-19', '1997-08-26', 2, 179.610001, 'HILARION-Abastos', 'Carrera 22 con Ave. Carlos Soublette #8-35', 'San Cristóbal', 'Táchira', '5022', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10642, 'SIMOB', 7, '1997-08-22', '1997-09-19', '1997-09-05', 3, 41.8899994, 'Simons bistro', 'Vinbæltet 34', 'Kobenhavn', NULL, '1734', 'Denmark'); +INSERT INTO northwind.orders VALUES (10643, 'ALFKI', 6, '1997-08-25', '1997-09-22', '1997-09-02', 1, 29.4599991, 'Alfreds Futterkiste', 'Obere Str. 57', 'Berlin', NULL, '12209', 'Germany'); +INSERT INTO northwind.orders VALUES (10644, 'WELLI', 3, '1997-08-25', '1997-09-22', '1997-09-01', 2, 0.140000001, 'Wellington Importadora', 'Rua do Mercado, 12', 'Resende', 'SP', '08737-363', 'Brazil'); +INSERT INTO northwind.orders VALUES (10645, 'HANAR', 4, '1997-08-26', '1997-09-23', '1997-09-02', 1, 12.4099998, 'Hanari Carnes', 'Rua do Paço, 67', 'Rio de Janeiro', 'RJ', '05454-876', 'Brazil'); +INSERT INTO northwind.orders VALUES (10646, 'HUNGO', 9, '1997-08-27', '1997-10-08', '1997-09-03', 3, 142.330002, 'Hungry Owl All-Night Grocers', '8 Johnstown Road', 'Cork', 'Co. Cork', NULL, 'Ireland'); +INSERT INTO northwind.orders VALUES (10647, 'QUEDE', 4, '1997-08-27', '1997-09-10', '1997-09-03', 2, 45.5400009, 'Que Delícia', 'Rua da Panificadora, 12', 'Rio de Janeiro', 'RJ', '02389-673', 'Brazil'); +INSERT INTO northwind.orders VALUES (10648, 'RICAR', 5, '1997-08-28', '1997-10-09', '1997-09-09', 2, 14.25, 'Ricardo Adocicados', 'Av. Copacabana, 267', 'Rio de Janeiro', 'RJ', '02389-890', 'Brazil'); +INSERT INTO northwind.orders VALUES (10649, 'MAISD', 5, '1997-08-28', '1997-09-25', '1997-08-29', 3, 6.19999981, 'Maison Dewey', 'Rue Joseph-Bens 532', 'Bruxelles', NULL, 'B-1180', 'Belgium'); +INSERT INTO northwind.orders VALUES (10650, 'FAMIA', 5, '1997-08-29', '1997-09-26', '1997-09-03', 3, 176.809998, 'Familia Arquibaldo', 'Rua Orós, 92', 'Sao Paulo', 'SP', '05442-030', 'Brazil'); +INSERT INTO northwind.orders VALUES (10651, 'WANDK', 8, '1997-09-01', '1997-09-29', '1997-09-11', 2, 20.6000004, 'Die Wandernde Kuh', 'Adenauerallee 900', 'Stuttgart', NULL, '70563', 'Germany'); +INSERT INTO northwind.orders VALUES (10652, 'GOURL', 4, '1997-09-01', '1997-09-29', '1997-09-08', 2, 7.13999987, 'Gourmet Lanchonetes', 'Av. Brasil, 442', 'Campinas', 'SP', '04876-786', 'Brazil'); +INSERT INTO northwind.orders VALUES (10654, 'BERGS', 5, '1997-09-02', '1997-09-30', '1997-09-11', 1, 55.2599983, 'Berglunds snabbköp', 'Berguvsvägen 8', 'Luleå', NULL, 'S-958 22', 'Sweden'); +INSERT INTO northwind.orders VALUES (10304, 'TORTU', 1, '1996-09-12', '1996-10-10', '1996-09-17', 2, 63.7900009, 'Tortuga Restaurante', 'Avda. Azteca 123', 'México D.F.', NULL, '05033', 'Mexico'); +INSERT INTO northwind.orders VALUES (10656, 'GREAL', 6, '1997-09-04', '1997-10-02', '1997-09-10', 1, 57.1500015, 'Great Lakes Food Market', '2732 Baker Blvd.', 'Eugene', 'OR', '97403', 'USA'); +INSERT INTO northwind.orders VALUES (10657, 'SAVEA', 2, '1997-09-04', '1997-10-02', '1997-09-15', 2, 352.690002, 'Save-a-lot Markets', '187 Suffolk Ln.', 'Boise', 'ID', '83720', 'USA'); +INSERT INTO northwind.orders VALUES (10658, 'QUICK', 4, '1997-09-05', '1997-10-03', '1997-09-08', 1, 364.149994, 'QUICK-Stop', 'Taucherstraße 10', 'Cunewalde', NULL, '01307', 'Germany'); +INSERT INTO northwind.orders VALUES (10659, 'QUEEN', 7, '1997-09-05', '1997-10-03', '1997-09-10', 2, 105.809998, 'Queen Cozinha', 'Alameda dos Canàrios, 891', 'Sao Paulo', 'SP', '05487-020', 'Brazil'); +INSERT INTO northwind.orders VALUES (10660, 'HUNGC', 8, '1997-09-08', '1997-10-06', '1997-10-15', 1, 111.290001, 'Hungry Coyote Import Store', 'City Center Plaza 516 Main St.', 'Elgin', 'OR', '97827', 'USA'); +INSERT INTO northwind.orders VALUES (10661, 'HUNGO', 7, '1997-09-09', '1997-10-07', '1997-09-15', 3, 17.5499992, 'Hungry Owl All-Night Grocers', '8 Johnstown Road', 'Cork', 'Co. Cork', NULL, 'Ireland'); +INSERT INTO northwind.orders VALUES (10662, 'LONEP', 3, '1997-09-09', '1997-10-07', '1997-09-18', 2, 1.27999997, 'Lonesome Pine Restaurant', '89 Chiaroscuro Rd.', 'Portland', 'OR', '97219', 'USA'); +INSERT INTO northwind.orders VALUES (10663, 'BONAP', 2, '1997-09-10', '1997-09-24', '1997-10-03', 2, 113.150002, 'Bon app''', '12, rue des Bouchers', 'Marseille', NULL, '13008', 'France'); +INSERT INTO northwind.orders VALUES (10306, 'ROMEY', 1, '1996-09-16', '1996-10-14', '1996-09-23', 3, 7.55999994, 'Romero y tomillo', 'Gran Vía, 1', 'Madrid', NULL, '28001', 'Spain'); +INSERT INTO northwind.orders VALUES (10666, 'RICSU', 7, '1997-09-12', '1997-10-10', '1997-09-22', 2, 232.419998, 'Richter Supermarkt', 'Starenweg 5', 'Genève', NULL, '1204', 'Switzerland'); +INSERT INTO northwind.orders VALUES (10667, 'ERNSH', 7, '1997-09-12', '1997-10-10', '1997-09-19', 1, 78.0899963, 'Ernst Handel', 'Kirchgasse 6', 'Graz', NULL, '8010', 'Austria'); +INSERT INTO northwind.orders VALUES (10669, 'SIMOB', 2, '1997-09-15', '1997-10-13', '1997-09-22', 1, 24.3899994, 'Simons bistro', 'Vinbæltet 34', 'Kobenhavn', NULL, '1734', 'Denmark'); +INSERT INTO northwind.orders VALUES (10670, 'FRANK', 4, '1997-09-16', '1997-10-14', '1997-09-18', 1, 203.479996, 'Frankenversand', 'Berliner Platz 43', 'München', NULL, '80805', 'Germany'); +INSERT INTO northwind.orders VALUES (10672, 'BERGS', 9, '1997-09-17', '1997-10-01', '1997-09-26', 2, 95.75, 'Berglunds snabbköp', 'Berguvsvägen 8', 'Luleå', NULL, 'S-958 22', 'Sweden'); +INSERT INTO northwind.orders VALUES (10673, 'WILMK', 2, '1997-09-18', '1997-10-16', '1997-09-19', 1, 22.7600002, 'Wilman Kala', 'Keskuskatu 45', 'Helsinki', NULL, '21240', 'Finland'); +INSERT INTO northwind.orders VALUES (10674, 'ISLAT', 4, '1997-09-18', '1997-10-16', '1997-09-30', 2, 0.899999976, 'Island Trading', 'Garden House Crowther Way', 'Cowes', 'Isle of Wight', 'PO31 7PJ', 'UK'); +INSERT INTO northwind.orders VALUES (10675, 'FRANK', 5, '1997-09-19', '1997-10-17', '1997-09-23', 2, 31.8500004, 'Frankenversand', 'Berliner Platz 43', 'München', NULL, '80805', 'Germany'); +INSERT INTO northwind.orders VALUES (10676, 'TORTU', 2, '1997-09-22', '1997-10-20', '1997-09-29', 2, 2.00999999, 'Tortuga Restaurante', 'Avda. Azteca 123', 'México D.F.', NULL, '05033', 'Mexico'); +INSERT INTO northwind.orders VALUES (10678, 'SAVEA', 7, '1997-09-23', '1997-10-21', '1997-10-16', 3, 388.980011, 'Save-a-lot Markets', '187 Suffolk Ln.', 'Boise', 'ID', '83720', 'USA'); +INSERT INTO northwind.orders VALUES (10679, 'BLONP', 8, '1997-09-23', '1997-10-21', '1997-09-30', 3, 27.9400005, 'Blondel père et fils', '24, place Kléber', 'Strasbourg', NULL, '67000', 'France'); +INSERT INTO northwind.orders VALUES (10681, 'GREAL', 3, '1997-09-25', '1997-10-23', '1997-09-30', 3, 76.1299973, 'Great Lakes Food Market', '2732 Baker Blvd.', 'Eugene', 'OR', '97403', 'USA'); +INSERT INTO northwind.orders VALUES (10682, 'ANTON', 3, '1997-09-25', '1997-10-23', '1997-10-01', 2, 36.1300011, 'Antonio Moreno Taquería', 'Mataderos 2312', 'México D.F.', NULL, '05023', 'Mexico'); +INSERT INTO northwind.orders VALUES (10683, 'DUMON', 2, '1997-09-26', '1997-10-24', '1997-10-01', 1, 4.4000001, 'Du monde entier', '67, rue des Cinquante Otages', 'Nantes', NULL, '44000', 'France'); +INSERT INTO northwind.orders VALUES (10684, 'OTTIK', 3, '1997-09-26', '1997-10-24', '1997-09-30', 1, 145.630005, 'Ottilies Käseladen', 'Mehrheimerstr. 369', 'Köln', NULL, '50739', 'Germany'); +INSERT INTO northwind.orders VALUES (10685, 'GOURL', 4, '1997-09-29', '1997-10-13', '1997-10-03', 2, 33.75, 'Gourmet Lanchonetes', 'Av. Brasil, 442', 'Campinas', 'SP', '04876-786', 'Brazil'); +INSERT INTO northwind.orders VALUES (10686, 'PICCO', 2, '1997-09-30', '1997-10-28', '1997-10-08', 1, 96.5, 'Piccolo und mehr', 'Geislweg 14', 'Salzburg', NULL, '5020', 'Austria'); +INSERT INTO northwind.orders VALUES (10687, 'HUNGO', 9, '1997-09-30', '1997-10-28', '1997-10-30', 2, 296.429993, 'Hungry Owl All-Night Grocers', '8 Johnstown Road', 'Cork', 'Co. Cork', NULL, 'Ireland'); +INSERT INTO northwind.orders VALUES (10688, 'VAFFE', 4, '1997-10-01', '1997-10-15', '1997-10-07', 2, 299.089996, 'Vaffeljernet', 'Smagsloget 45', 'Århus', NULL, '8200', 'Denmark'); +INSERT INTO northwind.orders VALUES (10311, 'DUMON', 1, '1996-09-20', '1996-10-04', '1996-09-26', 3, 24.6900005, 'Du monde entier', '67, rue des Cinquante Otages', 'Nantes', NULL, '44000', 'France'); +INSERT INTO northwind.orders VALUES (10691, 'QUICK', 2, '1997-10-03', '1997-11-14', '1997-10-22', 2, 810.049988, 'QUICK-Stop', 'Taucherstraße 10', 'Cunewalde', NULL, '01307', 'Germany'); +INSERT INTO northwind.orders VALUES (10692, 'ALFKI', 4, '1997-10-03', '1997-10-31', '1997-10-13', 2, 61.0200005, 'Alfred''s Futterkiste', 'Obere Str. 57', 'Berlin', NULL, '12209', 'Germany'); +INSERT INTO northwind.orders VALUES (10693, 'WHITC', 3, '1997-10-06', '1997-10-20', '1997-10-10', 3, 139.339996, 'White Clover Markets', '1029 - 12th Ave. S.', 'Seattle', 'WA', '98124', 'USA'); +INSERT INTO northwind.orders VALUES (10694, 'QUICK', 8, '1997-10-06', '1997-11-03', '1997-10-09', 3, 398.359985, 'QUICK-Stop', 'Taucherstraße 10', 'Cunewalde', NULL, '01307', 'Germany'); +INSERT INTO northwind.orders VALUES (10695, 'WILMK', 7, '1997-10-07', '1997-11-18', '1997-10-14', 1, 16.7199993, 'Wilman Kala', 'Keskuskatu 45', 'Helsinki', NULL, '21240', 'Finland'); +INSERT INTO northwind.orders VALUES (10696, 'WHITC', 8, '1997-10-08', '1997-11-19', '1997-10-14', 3, 102.550003, 'White Clover Markets', '1029 - 12th Ave. S.', 'Seattle', 'WA', '98124', 'USA'); +INSERT INTO northwind.orders VALUES (10697, 'LINOD', 3, '1997-10-08', '1997-11-05', '1997-10-14', 1, 45.5200005, 'LINO-Delicateses', 'Ave. 5 de Mayo Porlamar', 'I. de Margarita', 'Nueva Esparta', '4980', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10698, 'ERNSH', 4, '1997-10-09', '1997-11-06', '1997-10-17', 1, 272.470001, 'Ernst Handel', 'Kirchgasse 6', 'Graz', NULL, '8010', 'Austria'); +INSERT INTO northwind.orders VALUES (10699, 'MORGK', 3, '1997-10-09', '1997-11-06', '1997-10-13', 3, 0.579999983, 'Morgenstern Gesundkost', 'Heerstr. 22', 'Leipzig', NULL, '04179', 'Germany'); +INSERT INTO northwind.orders VALUES (10700, 'SAVEA', 3, '1997-10-10', '1997-11-07', '1997-10-16', 1, 65.0999985, 'Save-a-lot Markets', '187 Suffolk Ln.', 'Boise', 'ID', '83720', 'USA'); +INSERT INTO northwind.orders VALUES (10701, 'HUNGO', 6, '1997-10-13', '1997-10-27', '1997-10-15', 3, 220.309998, 'Hungry Owl All-Night Grocers', '8 Johnstown Road', 'Cork', 'Co. Cork', NULL, 'Ireland'); +INSERT INTO northwind.orders VALUES (10702, 'ALFKI', 4, '1997-10-13', '1997-11-24', '1997-10-21', 1, 23.9400005, 'Alfred''s Futterkiste', 'Obere Str. 57', 'Berlin', NULL, '12209', 'Germany'); +INSERT INTO northwind.orders VALUES (10703, 'FOLKO', 6, '1997-10-14', '1997-11-11', '1997-10-20', 2, 152.300003, 'Folk och fä HB', 'Åkergatan 24', 'Bräcke', NULL, 'S-844 67', 'Sweden'); +INSERT INTO northwind.orders VALUES (10704, 'QUEEN', 6, '1997-10-14', '1997-11-11', '1997-11-07', 1, 4.78000021, 'Queen Cozinha', 'Alameda dos Canàrios, 891', 'Sao Paulo', 'SP', '05487-020', 'Brazil'); +INSERT INTO northwind.orders VALUES (10705, 'HILAA', 9, '1997-10-15', '1997-11-12', '1997-11-18', 2, 3.51999998, 'HILARION-Abastos', 'Carrera 22 con Ave. Carlos Soublette #8-35', 'San Cristóbal', 'Táchira', '5022', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10706, 'OLDWO', 8, '1997-10-16', '1997-11-13', '1997-10-21', 3, 135.630005, 'Old World Delicatessen', '2743 Bering St.', 'Anchorage', 'AK', '99508', 'USA'); +INSERT INTO northwind.orders VALUES (10707, 'AROUT', 4, '1997-10-16', '1997-10-30', '1997-10-23', 3, 21.7399998, 'Around the Horn', 'Brook Farm Stratford St. Mary', 'Colchester', 'Essex', 'CO7 6JX', 'UK'); +INSERT INTO northwind.orders VALUES (10708, 'THEBI', 6, '1997-10-17', '1997-11-28', '1997-11-05', 2, 2.96000004, 'The Big Cheese', '89 Jefferson Way Suite 2', 'Portland', 'OR', '97201', 'USA'); +INSERT INTO northwind.orders VALUES (10314, 'RATTC', 1, '1996-09-25', '1996-10-23', '1996-10-04', 2, 74.1600037, 'Rattlesnake Canyon Grocery', '2817 Milton Dr.', 'Albuquerque', 'NM', '87110', 'USA'); +INSERT INTO northwind.orders VALUES (10711, 'SAVEA', 5, '1997-10-21', '1997-12-02', '1997-10-29', 2, 52.4099998, 'Save-a-lot Markets', '187 Suffolk Ln.', 'Boise', 'ID', '83720', 'USA'); +INSERT INTO northwind.orders VALUES (10712, 'HUNGO', 3, '1997-10-21', '1997-11-18', '1997-10-31', 1, 89.9300003, 'Hungry Owl All-Night Grocers', '8 Johnstown Road', 'Cork', 'Co. Cork', NULL, 'Ireland'); +INSERT INTO northwind.orders VALUES (10714, 'SAVEA', 5, '1997-10-22', '1997-11-19', '1997-10-27', 3, 24.4899998, 'Save-a-lot Markets', '187 Suffolk Ln.', 'Boise', 'ID', '83720', 'USA'); +INSERT INTO northwind.orders VALUES (10715, 'BONAP', 3, '1997-10-23', '1997-11-06', '1997-10-29', 1, 63.2000008, 'Bon app''', '12, rue des Bouchers', 'Marseille', NULL, '13008', 'France'); +INSERT INTO northwind.orders VALUES (10716, 'RANCH', 4, '1997-10-24', '1997-11-21', '1997-10-27', 2, 22.5699997, 'Rancho grande', 'Av. del Libertador 900', 'Buenos Aires', NULL, '1010', 'Argentina'); +INSERT INTO northwind.orders VALUES (10316, 'RATTC', 1, '1996-09-27', '1996-10-25', '1996-10-08', 3, 150.149994, 'Rattlesnake Canyon Grocery', '2817 Milton Dr.', 'Albuquerque', 'NM', '87110', 'USA'); +INSERT INTO northwind.orders VALUES (10719, 'LETSS', 8, '1997-10-27', '1997-11-24', '1997-11-05', 2, 51.4399986, 'Let''s Stop N Shop', '87 Polk St. Suite 5', 'San Francisco', 'CA', '94117', 'USA'); +INSERT INTO northwind.orders VALUES (10720, 'QUEDE', 8, '1997-10-28', '1997-11-11', '1997-11-05', 2, 9.52999973, 'Que Delícia', 'Rua da Panificadora, 12', 'Rio de Janeiro', 'RJ', '02389-673', 'Brazil'); +INSERT INTO northwind.orders VALUES (10721, 'QUICK', 5, '1997-10-29', '1997-11-26', '1997-10-31', 3, 48.9199982, 'QUICK-Stop', 'Taucherstraße 10', 'Cunewalde', NULL, '01307', 'Germany'); +INSERT INTO northwind.orders VALUES (10722, 'SAVEA', 8, '1997-10-29', '1997-12-10', '1997-11-04', 1, 74.5800018, 'Save-a-lot Markets', '187 Suffolk Ln.', 'Boise', 'ID', '83720', 'USA'); +INSERT INTO northwind.orders VALUES (10723, 'WHITC', 3, '1997-10-30', '1997-11-27', '1997-11-25', 1, 21.7199993, 'White Clover Markets', '1029 - 12th Ave. S.', 'Seattle', 'WA', '98124', 'USA'); +INSERT INTO northwind.orders VALUES (10724, 'MEREP', 8, '1997-10-30', '1997-12-11', '1997-11-05', 2, 57.75, 'Mère Paillarde', '43 rue St. Laurent', 'Montréal', 'Québec', 'H1J 1C3', 'Canada'); +INSERT INTO northwind.orders VALUES (10725, 'FAMIA', 4, '1997-10-31', '1997-11-28', '1997-11-05', 3, 10.8299999, 'Familia Arquibaldo', 'Rua Orós, 92', 'Sao Paulo', 'SP', '05442-030', 'Brazil'); +INSERT INTO northwind.orders VALUES (10726, 'EASTC', 4, '1997-11-03', '1997-11-17', '1997-12-05', 1, 16.5599995, 'Eastern Connection', '35 King George', 'London', NULL, 'WX3 6FW', 'UK'); +INSERT INTO northwind.orders VALUES (10727, 'REGGC', 2, '1997-11-03', '1997-12-01', '1997-12-05', 1, 89.9000015, 'Reggiani Caseifici', 'Strada Provinciale 124', 'Reggio Emilia', NULL, '42100', 'Italy'); +INSERT INTO northwind.orders VALUES (10728, 'QUEEN', 4, '1997-11-04', '1997-12-02', '1997-11-11', 2, 58.3300018, 'Queen Cozinha', 'Alameda dos Canàrios, 891', 'Sao Paulo', 'SP', '05487-020', 'Brazil'); +INSERT INTO northwind.orders VALUES (10729, 'LINOD', 8, '1997-11-04', '1997-12-16', '1997-11-14', 3, 141.059998, 'LINO-Delicateses', 'Ave. 5 de Mayo Porlamar', 'I. de Margarita', 'Nueva Esparta', '4980', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10730, 'BONAP', 5, '1997-11-05', '1997-12-03', '1997-11-14', 1, 20.1200008, 'Bon app''', '12, rue des Bouchers', 'Marseille', NULL, '13008', 'France'); +INSERT INTO northwind.orders VALUES (10731, 'CHOPS', 7, '1997-11-06', '1997-12-04', '1997-11-14', 1, 96.6500015, 'Chop-suey Chinese', 'Hauptstr. 31', 'Bern', NULL, '3012', 'Switzerland'); +INSERT INTO northwind.orders VALUES (10732, 'BONAP', 3, '1997-11-06', '1997-12-04', '1997-11-07', 1, 16.9699993, 'Bon app''', '12, rue des Bouchers', 'Marseille', NULL, '13008', 'France'); +INSERT INTO northwind.orders VALUES (10734, 'GOURL', 2, '1997-11-07', '1997-12-05', '1997-11-12', 3, 1.63, 'Gourmet Lanchonetes', 'Av. Brasil, 442', 'Campinas', 'SP', '04876-786', 'Brazil'); +INSERT INTO northwind.orders VALUES (10735, 'LETSS', 6, '1997-11-10', '1997-12-08', '1997-11-21', 2, 45.9700012, 'Let''s Stop N Shop', '87 Polk St. Suite 5', 'San Francisco', 'CA', '94117', 'USA'); +INSERT INTO northwind.orders VALUES (10736, 'HUNGO', 9, '1997-11-11', '1997-12-09', '1997-11-21', 2, 44.0999985, 'Hungry Owl All-Night Grocers', '8 Johnstown Road', 'Cork', 'Co. Cork', NULL, 'Ireland'); +INSERT INTO northwind.orders VALUES (10737, 'VINET', 2, '1997-11-11', '1997-12-09', '1997-11-18', 2, 7.78999996, 'Vins et alcools Chevalier', '59 rue de l''Abbaye', 'Reims', NULL, '51100', 'France'); +INSERT INTO northwind.orders VALUES (10738, 'SPECD', 2, '1997-11-12', '1997-12-10', '1997-11-18', 1, 2.91000009, 'Spécialités du monde', '25, rue Lauriston', 'Paris', NULL, '75016', 'France'); +INSERT INTO northwind.orders VALUES (10739, 'VINET', 3, '1997-11-12', '1997-12-10', '1997-11-17', 3, 11.0799999, 'Vins et alcools Chevalier', '59 rue de l''Abbaye', 'Reims', NULL, '51100', 'France'); +INSERT INTO northwind.orders VALUES (10740, 'WHITC', 4, '1997-11-13', '1997-12-11', '1997-11-25', 2, 81.8799973, 'White Clover Markets', '1029 - 12th Ave. S.', 'Seattle', 'WA', '98124', 'USA'); +INSERT INTO northwind.orders VALUES (10741, 'AROUT', 4, '1997-11-14', '1997-11-28', '1997-11-18', 3, 10.96, 'Around the Horn', 'Brook Farm Stratford St. Mary', 'Colchester', 'Essex', 'CO7 6JX', 'UK'); +INSERT INTO northwind.orders VALUES (10742, 'BOTTM', 3, '1997-11-14', '1997-12-12', '1997-11-18', 3, 243.729996, 'Bottom-Dollar Markets', '23 Tsawassen Blvd.', 'Tsawassen', 'BC', 'T2F 8M4', 'Canada'); +INSERT INTO northwind.orders VALUES (10744, 'VAFFE', 6, '1997-11-17', '1997-12-15', '1997-11-24', 1, 69.1900024, 'Vaffeljernet', 'Smagsloget 45', 'Århus', NULL, '8200', 'Denmark'); +INSERT INTO northwind.orders VALUES (10745, 'QUICK', 9, '1997-11-18', '1997-12-16', '1997-11-27', 1, 3.51999998, 'QUICK-Stop', 'Taucherstraße 10', 'Cunewalde', NULL, '01307', 'Germany'); +INSERT INTO northwind.orders VALUES (10747, 'PICCO', 6, '1997-11-19', '1997-12-17', '1997-11-26', 1, 117.330002, 'Piccolo und mehr', 'Geislweg 14', 'Salzburg', NULL, '5020', 'Austria'); +INSERT INTO northwind.orders VALUES (10748, 'SAVEA', 3, '1997-11-20', '1997-12-18', '1997-11-28', 1, 232.550003, 'Save-a-lot Markets', '187 Suffolk Ln.', 'Boise', 'ID', '83720', 'USA'); +INSERT INTO northwind.orders VALUES (10749, 'ISLAT', 4, '1997-11-20', '1997-12-18', '1997-12-19', 2, 61.5299988, 'Island Trading', 'Garden House Crowther Way', 'Cowes', 'Isle of Wight', 'PO31 7PJ', 'UK'); +INSERT INTO northwind.orders VALUES (10750, 'WARTH', 9, '1997-11-21', '1997-12-19', '1997-11-24', 1, 79.3000031, 'Wartian Herkku', 'Torikatu 38', 'Oulu', NULL, '90110', 'Finland'); +INSERT INTO northwind.orders VALUES (10751, 'RICSU', 3, '1997-11-24', '1997-12-22', '1997-12-03', 3, 130.789993, 'Richter Supermarkt', 'Starenweg 5', 'Genève', NULL, '1204', 'Switzerland'); +INSERT INTO northwind.orders VALUES (10752, 'NORTS', 2, '1997-11-24', '1997-12-22', '1997-11-28', 3, 1.38999999, 'North/South', 'South House 300 Queensbridge', 'London', NULL, 'SW7 1RZ', 'UK'); +INSERT INTO northwind.orders VALUES (10753, 'FRANS', 3, '1997-11-25', '1997-12-23', '1997-11-27', 1, 7.69999981, 'Franchi S.p.A.', 'Via Monte Bianco 34', 'Torino', NULL, '10100', 'Italy'); +INSERT INTO northwind.orders VALUES (10754, 'MAGAA', 6, '1997-11-25', '1997-12-23', '1997-11-27', 3, 2.38000011, 'Magazzini Alimentari Riuniti', 'Via Ludovico il Moro 22', 'Bergamo', NULL, '24100', 'Italy'); +INSERT INTO northwind.orders VALUES (10755, 'BONAP', 4, '1997-11-26', '1997-12-24', '1997-11-28', 2, 16.7099991, 'Bon app''', '12, rue des Bouchers', 'Marseille', NULL, '13008', 'France'); +INSERT INTO northwind.orders VALUES (10756, 'SPLIR', 8, '1997-11-27', '1997-12-25', '1997-12-02', 2, 73.2099991, 'Split Rail Beer & Ale', 'P.O. Box 555', 'Lander', 'WY', '82520', 'USA'); +INSERT INTO northwind.orders VALUES (10757, 'SAVEA', 6, '1997-11-27', '1997-12-25', '1997-12-15', 1, 8.18999958, 'Save-a-lot Markets', '187 Suffolk Ln.', 'Boise', 'ID', '83720', 'USA'); +INSERT INTO northwind.orders VALUES (10758, 'RICSU', 3, '1997-11-28', '1997-12-26', '1997-12-04', 3, 138.169998, 'Richter Supermarkt', 'Starenweg 5', 'Genève', NULL, '1204', 'Switzerland'); +INSERT INTO northwind.orders VALUES (10759, 'ANATR', 3, '1997-11-28', '1997-12-26', '1997-12-12', 3, 11.9899998, 'Ana Trujillo Emparedados y helados', 'Avda. de la Constitución 2222', 'México D.F.', NULL, '05021', 'Mexico'); +INSERT INTO northwind.orders VALUES (10760, 'MAISD', 4, '1997-12-01', '1997-12-29', '1997-12-10', 1, 155.639999, 'Maison Dewey', 'Rue Joseph-Bens 532', 'Bruxelles', NULL, 'B-1180', 'Belgium'); +INSERT INTO northwind.orders VALUES (10761, 'RATTC', 5, '1997-12-02', '1997-12-30', '1997-12-08', 2, 18.6599998, 'Rattlesnake Canyon Grocery', '2817 Milton Dr.', 'Albuquerque', 'NM', '87110', 'USA'); +INSERT INTO northwind.orders VALUES (10762, 'FOLKO', 3, '1997-12-02', '1997-12-30', '1997-12-09', 1, 328.73999, 'Folk och fä HB', 'Åkergatan 24', 'Bräcke', NULL, 'S-844 67', 'Sweden'); +INSERT INTO northwind.orders VALUES (10763, 'FOLIG', 3, '1997-12-03', '1997-12-31', '1997-12-08', 3, 37.3499985, 'Folies gourmandes', '184, chaussée de Tournai', 'Lille', NULL, '59000', 'France'); +INSERT INTO northwind.orders VALUES (10764, 'ERNSH', 6, '1997-12-03', '1997-12-31', '1997-12-08', 3, 145.449997, 'Ernst Handel', 'Kirchgasse 6', 'Graz', NULL, '8010', 'Austria'); +INSERT INTO northwind.orders VALUES (10765, 'QUICK', 3, '1997-12-04', '1998-01-01', '1997-12-09', 3, 42.7400017, 'QUICK-Stop', 'Taucherstraße 10', 'Cunewalde', NULL, '01307', 'Germany'); +INSERT INTO northwind.orders VALUES (10766, 'OTTIK', 4, '1997-12-05', '1998-01-02', '1997-12-09', 1, 157.550003, 'Ottilies Käseladen', 'Mehrheimerstr. 369', 'Köln', NULL, '50739', 'Germany'); +INSERT INTO northwind.orders VALUES (10767, 'SUPRD', 4, '1997-12-05', '1998-01-02', '1997-12-15', 3, 1.59000003, 'Suprêmes délices', 'Boulevard Tirou, 255', 'Charleroi', NULL, 'B-6000', 'Belgium'); +INSERT INTO northwind.orders VALUES (10768, 'AROUT', 3, '1997-12-08', '1998-01-05', '1997-12-15', 2, 146.320007, 'Around the Horn', 'Brook Farm Stratford St. Mary', 'Colchester', 'Essex', 'CO7 6JX', 'UK'); +INSERT INTO northwind.orders VALUES (10769, 'VAFFE', 3, '1997-12-08', '1998-01-05', '1997-12-12', 1, 65.0599976, 'Vaffeljernet', 'Smagsloget 45', 'Århus', NULL, '8200', 'Denmark'); +INSERT INTO northwind.orders VALUES (10770, 'HANAR', 8, '1997-12-09', '1998-01-06', '1997-12-17', 3, 5.32000017, 'Hanari Carnes', 'Rua do Paço, 67', 'Rio de Janeiro', 'RJ', '05454-876', 'Brazil'); +INSERT INTO northwind.orders VALUES (10771, 'ERNSH', 9, '1997-12-10', '1998-01-07', '1998-01-02', 2, 11.1899996, 'Ernst Handel', 'Kirchgasse 6', 'Graz', NULL, '8010', 'Austria'); +INSERT INTO northwind.orders VALUES (10772, 'LEHMS', 3, '1997-12-10', '1998-01-07', '1997-12-19', 2, 91.2799988, 'Lehmanns Marktstand', 'Magazinweg 7', 'Frankfurt a.M.', NULL, '60528', 'Germany'); +INSERT INTO northwind.orders VALUES (10774, 'FOLKO', 4, '1997-12-11', '1997-12-25', '1997-12-12', 1, 48.2000008, 'Folk och fä HB', 'Åkergatan 24', 'Bräcke', NULL, 'S-844 67', 'Sweden'); +INSERT INTO northwind.orders VALUES (10775, 'THECR', 7, '1997-12-12', '1998-01-09', '1997-12-26', 1, 20.25, 'The Cracker Box', '55 Grizzly Peak Rd.', 'Butte', 'MT', '59801', 'USA'); +INSERT INTO northwind.orders VALUES (10777, 'GOURL', 7, '1997-12-15', '1997-12-29', '1998-01-21', 2, 3.00999999, 'Gourmet Lanchonetes', 'Av. Brasil, 442', 'Campinas', 'SP', '04876-786', 'Brazil'); +INSERT INTO northwind.orders VALUES (10778, 'BERGS', 3, '1997-12-16', '1998-01-13', '1997-12-24', 1, 6.78999996, 'Berglunds snabbköp', 'Berguvsvägen 8', 'Luleå', NULL, 'S-958 22', 'Sweden'); +INSERT INTO northwind.orders VALUES (10779, 'MORGK', 3, '1997-12-16', '1998-01-13', '1998-01-14', 2, 58.1300011, 'Morgenstern Gesundkost', 'Heerstr. 22', 'Leipzig', NULL, '04179', 'Germany'); +INSERT INTO northwind.orders VALUES (10780, 'LILAS', 2, '1997-12-16', '1997-12-30', '1997-12-25', 1, 42.1300011, 'LILA-Supermercado', 'Carrera 52 con Ave. Bolívar #65-98 Llano Largo', 'Barquisimeto', 'Lara', '3508', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10781, 'WARTH', 2, '1997-12-17', '1998-01-14', '1997-12-19', 3, 73.1600037, 'Wartian Herkku', 'Torikatu 38', 'Oulu', NULL, '90110', 'Finland'); +INSERT INTO northwind.orders VALUES (10782, 'CACTU', 9, '1997-12-17', '1998-01-14', '1997-12-22', 3, 1.10000002, 'Cactus Comidas para llevar', 'Cerrito 333', 'Buenos Aires', NULL, '1010', 'Argentina'); +INSERT INTO northwind.orders VALUES (10783, 'HANAR', 4, '1997-12-18', '1998-01-15', '1997-12-19', 2, 124.980003, 'Hanari Carnes', 'Rua do Paço, 67', 'Rio de Janeiro', 'RJ', '05454-876', 'Brazil'); +INSERT INTO northwind.orders VALUES (10784, 'MAGAA', 4, '1997-12-18', '1998-01-15', '1997-12-22', 3, 70.0899963, 'Magazzini Alimentari Riuniti', 'Via Ludovico il Moro 22', 'Bergamo', NULL, '24100', 'Italy'); +INSERT INTO northwind.orders VALUES (10786, 'QUEEN', 8, '1997-12-19', '1998-01-16', '1997-12-23', 1, 110.870003, 'Queen Cozinha', 'Alameda dos Canàrios, 891', 'Sao Paulo', 'SP', '05487-020', 'Brazil'); +INSERT INTO northwind.orders VALUES (10787, 'LAMAI', 2, '1997-12-19', '1998-01-02', '1997-12-26', 1, 249.929993, 'La maison d''Asie', '1 rue Alsace-Lorraine', 'Toulouse', NULL, '31000', 'France'); +INSERT INTO northwind.orders VALUES (10325, 'KOENE', 1, '1996-10-09', '1996-10-23', '1996-10-14', 3, 64.8600006, 'Königlich Essen', 'Maubelstr. 90', 'Brandenburg', NULL, '14776', 'Germany'); +INSERT INTO northwind.orders VALUES (10790, 'GOURL', 6, '1997-12-22', '1998-01-19', '1997-12-26', 1, 28.2299995, 'Gourmet Lanchonetes', 'Av. Brasil, 442', 'Campinas', 'SP', '04876-786', 'Brazil'); +INSERT INTO northwind.orders VALUES (10791, 'FRANK', 6, '1997-12-23', '1998-01-20', '1998-01-01', 2, 16.8500004, 'Frankenversand', 'Berliner Platz 43', 'München', NULL, '80805', 'Germany'); +INSERT INTO northwind.orders VALUES (10793, 'AROUT', 3, '1997-12-24', '1998-01-21', '1998-01-08', 3, 4.51999998, 'Around the Horn', 'Brook Farm Stratford St. Mary', 'Colchester', 'Essex', 'CO7 6JX', 'UK'); +INSERT INTO northwind.orders VALUES (10794, 'QUEDE', 6, '1997-12-24', '1998-01-21', '1998-01-02', 1, 21.4899998, 'Que Delícia', 'Rua da Panificadora, 12', 'Rio de Janeiro', 'RJ', '02389-673', 'Brazil'); +INSERT INTO northwind.orders VALUES (10795, 'ERNSH', 8, '1997-12-24', '1998-01-21', '1998-01-20', 2, 126.660004, 'Ernst Handel', 'Kirchgasse 6', 'Graz', NULL, '8010', 'Austria'); +INSERT INTO northwind.orders VALUES (10796, 'HILAA', 3, '1997-12-25', '1998-01-22', '1998-01-14', 1, 26.5200005, 'HILARION-Abastos', 'Carrera 22 con Ave. Carlos Soublette #8-35', 'San Cristóbal', 'Táchira', '5022', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10797, 'DRACD', 7, '1997-12-25', '1998-01-22', '1998-01-05', 2, 33.3499985, 'Drachenblut Delikatessen', 'Walserweg 21', 'Aachen', NULL, '52066', 'Germany'); +INSERT INTO northwind.orders VALUES (10798, 'ISLAT', 2, '1997-12-26', '1998-01-23', '1998-01-05', 1, 2.32999992, 'Island Trading', 'Garden House Crowther Way', 'Cowes', 'Isle of Wight', 'PO31 7PJ', 'UK'); +INSERT INTO northwind.orders VALUES (10799, 'KOENE', 9, '1997-12-26', '1998-02-06', '1998-01-05', 3, 30.7600002, 'Königlich Essen', 'Maubelstr. 90', 'Brandenburg', NULL, '14776', 'Germany'); +INSERT INTO northwind.orders VALUES (10801, 'BOLID', 4, '1997-12-29', '1998-01-26', '1997-12-31', 2, 97.0899963, 'Bólido Comidas preparadas', 'C/ Araquil, 67', 'Madrid', NULL, '28023', 'Spain'); +INSERT INTO northwind.orders VALUES (10802, 'SIMOB', 4, '1997-12-29', '1998-01-26', '1998-01-02', 2, 257.26001, 'Simons bistro', 'Vinbæltet 34', 'Kobenhavn', NULL, '1734', 'Denmark'); +INSERT INTO northwind.orders VALUES (10803, 'WELLI', 4, '1997-12-30', '1998-01-27', '1998-01-06', 1, 55.2299995, 'Wellington Importadora', 'Rua do Mercado, 12', 'Resende', 'SP', '08737-363', 'Brazil'); +INSERT INTO northwind.orders VALUES (10804, 'SEVES', 6, '1997-12-30', '1998-01-27', '1998-01-07', 2, 27.3299999, 'Seven Seas Imports', '90 Wadhurst Rd.', 'London', NULL, 'OX15 4NB', 'UK'); +INSERT INTO northwind.orders VALUES (10805, 'THEBI', 2, '1997-12-30', '1998-01-27', '1998-01-09', 3, 237.339996, 'The Big Cheese', '89 Jefferson Way Suite 2', 'Portland', 'OR', '97201', 'USA'); +INSERT INTO northwind.orders VALUES (10806, 'VICTE', 3, '1997-12-31', '1998-01-28', '1998-01-05', 2, 22.1100006, 'Victuailles en stock', '2, rue du Commerce', 'Lyon', NULL, '69004', 'France'); +INSERT INTO northwind.orders VALUES (10807, 'FRANS', 4, '1997-12-31', '1998-01-28', '1998-01-30', 1, 1.36000001, 'Franchi S.p.A.', 'Via Monte Bianco 34', 'Torino', NULL, '10100', 'Italy'); +INSERT INTO northwind.orders VALUES (10808, 'OLDWO', 2, '1998-01-01', '1998-01-29', '1998-01-09', 3, 45.5299988, 'Old World Delicatessen', '2743 Bering St.', 'Anchorage', 'AK', '99508', 'USA'); +INSERT INTO northwind.orders VALUES (10809, 'WELLI', 7, '1998-01-01', '1998-01-29', '1998-01-07', 1, 4.86999989, 'Wellington Importadora', 'Rua do Mercado, 12', 'Resende', 'SP', '08737-363', 'Brazil'); +INSERT INTO northwind.orders VALUES (10810, 'LAUGB', 2, '1998-01-01', '1998-01-29', '1998-01-07', 3, 4.32999992, 'Laughing Bacchus Wine Cellars', '2319 Elm St.', 'Vancouver', 'BC', 'V3F 2K1', 'Canada'); +INSERT INTO northwind.orders VALUES (10811, 'LINOD', 8, '1998-01-02', '1998-01-30', '1998-01-08', 1, 31.2199993, 'LINO-Delicateses', 'Ave. 5 de Mayo Porlamar', 'I. de Margarita', 'Nueva Esparta', '4980', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10812, 'REGGC', 5, '1998-01-02', '1998-01-30', '1998-01-12', 1, 59.7799988, 'Reggiani Caseifici', 'Strada Provinciale 124', 'Reggio Emilia', NULL, '42100', 'Italy'); +INSERT INTO northwind.orders VALUES (10814, 'VICTE', 3, '1998-01-05', '1998-02-02', '1998-01-14', 3, 130.940002, 'Victuailles en stock', '2, rue du Commerce', 'Lyon', NULL, '69004', 'France'); +INSERT INTO northwind.orders VALUES (10815, 'SAVEA', 2, '1998-01-05', '1998-02-02', '1998-01-14', 3, 14.6199999, 'Save-a-lot Markets', '187 Suffolk Ln.', 'Boise', 'ID', '83720', 'USA'); +INSERT INTO northwind.orders VALUES (10816, 'GREAL', 4, '1998-01-06', '1998-02-03', '1998-02-04', 2, 719.780029, 'Great Lakes Food Market', '2732 Baker Blvd.', 'Eugene', 'OR', '97403', 'USA'); +INSERT INTO northwind.orders VALUES (10817, 'KOENE', 3, '1998-01-06', '1998-01-20', '1998-01-13', 2, 306.070007, 'Königlich Essen', 'Maubelstr. 90', 'Brandenburg', NULL, '14776', 'Germany'); +INSERT INTO northwind.orders VALUES (10818, 'MAGAA', 7, '1998-01-07', '1998-02-04', '1998-01-12', 3, 65.4800034, 'Magazzini Alimentari Riuniti', 'Via Ludovico il Moro 22', 'Bergamo', NULL, '24100', 'Italy'); +INSERT INTO northwind.orders VALUES (10819, 'CACTU', 2, '1998-01-07', '1998-02-04', '1998-01-16', 3, 19.7600002, 'Cactus Comidas para llevar', 'Cerrito 333', 'Buenos Aires', NULL, '1010', 'Argentina'); +INSERT INTO northwind.orders VALUES (10820, 'RATTC', 3, '1998-01-07', '1998-02-04', '1998-01-13', 2, 37.5200005, 'Rattlesnake Canyon Grocery', '2817 Milton Dr.', 'Albuquerque', 'NM', '87110', 'USA'); +INSERT INTO northwind.orders VALUES (10822, 'TRAIH', 6, '1998-01-08', '1998-02-05', '1998-01-16', 3, 7, 'Trail''s Head Gourmet Provisioners', '722 DaVinci Blvd.', 'Kirkland', 'WA', '98034', 'USA'); +INSERT INTO northwind.orders VALUES (10823, 'LILAS', 5, '1998-01-09', '1998-02-06', '1998-01-13', 2, 163.970001, 'LILA-Supermercado', 'Carrera 52 con Ave. Bolívar #65-98 Llano Largo', 'Barquisimeto', 'Lara', '3508', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10824, 'FOLKO', 8, '1998-01-09', '1998-02-06', '1998-01-30', 1, 1.23000002, 'Folk och fä HB', 'Åkergatan 24', 'Bräcke', NULL, 'S-844 67', 'Sweden'); +INSERT INTO northwind.orders VALUES (10826, 'BLONP', 6, '1998-01-12', '1998-02-09', '1998-02-06', 1, 7.09000015, 'Blondel père et fils', '24, place Kléber', 'Strasbourg', NULL, '67000', 'France'); +INSERT INTO northwind.orders VALUES (10828, 'RANCH', 9, '1998-01-13', '1998-01-27', '1998-02-04', 1, 90.8499985, 'Rancho grande', 'Av. del Libertador 900', 'Buenos Aires', NULL, '1010', 'Argentina'); +INSERT INTO northwind.orders VALUES (10829, 'ISLAT', 9, '1998-01-13', '1998-02-10', '1998-01-23', 1, 154.720001, 'Island Trading', 'Garden House Crowther Way', 'Cowes', 'Isle of Wight', 'PO31 7PJ', 'UK'); +INSERT INTO northwind.orders VALUES (10830, 'TRADH', 4, '1998-01-13', '1998-02-24', '1998-01-21', 2, 81.8300018, 'Tradiçao Hipermercados', 'Av. Inês de Castro, 414', 'Sao Paulo', 'SP', '05634-030', 'Brazil'); +INSERT INTO northwind.orders VALUES (10831, 'SANTG', 3, '1998-01-14', '1998-02-11', '1998-01-23', 2, 72.1900024, 'Santé Gourmet', 'Erling Skakkes gate 78', 'Stavern', NULL, '4110', 'Norway'); +INSERT INTO northwind.orders VALUES (10832, 'LAMAI', 2, '1998-01-14', '1998-02-11', '1998-01-19', 2, 43.2599983, 'La maison d''Asie', '1 rue Alsace-Lorraine', 'Toulouse', NULL, '31000', 'France'); +INSERT INTO northwind.orders VALUES (10833, 'OTTIK', 6, '1998-01-15', '1998-02-12', '1998-01-23', 2, 71.4899979, 'Ottilies Käseladen', 'Mehrheimerstr. 369', 'Köln', NULL, '50739', 'Germany'); +INSERT INTO northwind.orders VALUES (10836, 'ERNSH', 7, '1998-01-16', '1998-02-13', '1998-01-21', 1, 411.880005, 'Ernst Handel', 'Kirchgasse 6', 'Graz', NULL, '8010', 'Austria'); +INSERT INTO northwind.orders VALUES (10837, 'BERGS', 9, '1998-01-16', '1998-02-13', '1998-01-23', 3, 13.3199997, 'Berglunds snabbköp', 'Berguvsvägen 8', 'Luleå', NULL, 'S-958 22', 'Sweden'); +INSERT INTO northwind.orders VALUES (10838, 'LINOD', 3, '1998-01-19', '1998-02-16', '1998-01-23', 3, 59.2799988, 'LINO-Delicateses', 'Ave. 5 de Mayo Porlamar', 'I. de Margarita', 'Nueva Esparta', '4980', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10839, 'TRADH', 3, '1998-01-19', '1998-02-16', '1998-01-22', 3, 35.4300003, 'Tradiçao Hipermercados', 'Av. Inês de Castro, 414', 'Sao Paulo', 'SP', '05634-030', 'Brazil'); +INSERT INTO northwind.orders VALUES (10840, 'LINOD', 4, '1998-01-19', '1998-03-02', '1998-02-16', 2, 2.71000004, 'LINO-Delicateses', 'Ave. 5 de Mayo Porlamar', 'I. de Margarita', 'Nueva Esparta', '4980', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10841, 'SUPRD', 5, '1998-01-20', '1998-02-17', '1998-01-29', 2, 424.299988, 'Suprêmes délices', 'Boulevard Tirou, 255', 'Charleroi', NULL, 'B-6000', 'Belgium'); +INSERT INTO northwind.orders VALUES (10843, 'VICTE', 4, '1998-01-21', '1998-02-18', '1998-01-26', 2, 9.26000023, 'Victuailles en stock', '2, rue du Commerce', 'Lyon', NULL, '69004', 'France'); +INSERT INTO northwind.orders VALUES (10844, 'PICCO', 8, '1998-01-21', '1998-02-18', '1998-01-26', 2, 25.2199993, 'Piccolo und mehr', 'Geislweg 14', 'Salzburg', NULL, '5020', 'Austria'); +INSERT INTO northwind.orders VALUES (10845, 'QUICK', 8, '1998-01-21', '1998-02-04', '1998-01-30', 1, 212.979996, 'QUICK-Stop', 'Taucherstraße 10', 'Cunewalde', NULL, '01307', 'Germany'); +INSERT INTO northwind.orders VALUES (10846, 'SUPRD', 2, '1998-01-22', '1998-03-05', '1998-01-23', 3, 56.4599991, 'Suprêmes délices', 'Boulevard Tirou, 255', 'Charleroi', NULL, 'B-6000', 'Belgium'); +INSERT INTO northwind.orders VALUES (10847, 'SAVEA', 4, '1998-01-22', '1998-02-05', '1998-02-10', 3, 487.570007, 'Save-a-lot Markets', '187 Suffolk Ln.', 'Boise', 'ID', '83720', 'USA'); +INSERT INTO northwind.orders VALUES (10848, 'CONSH', 7, '1998-01-23', '1998-02-20', '1998-01-29', 2, 38.2400017, 'Consolidated Holdings', 'Berkeley Gardens 12 Brewery', 'London', NULL, 'WX1 6LT', 'UK'); +INSERT INTO northwind.orders VALUES (10849, 'KOENE', 9, '1998-01-23', '1998-02-20', '1998-01-30', 2, 0.560000002, 'Königlich Essen', 'Maubelstr. 90', 'Brandenburg', NULL, '14776', 'Germany'); +INSERT INTO northwind.orders VALUES (10851, 'RICAR', 5, '1998-01-26', '1998-02-23', '1998-02-02', 1, 160.550003, 'Ricardo Adocicados', 'Av. Copacabana, 267', 'Rio de Janeiro', 'RJ', '02389-890', 'Brazil'); +INSERT INTO northwind.orders VALUES (10852, 'RATTC', 8, '1998-01-26', '1998-02-09', '1998-01-30', 1, 174.050003, 'Rattlesnake Canyon Grocery', '2817 Milton Dr.', 'Albuquerque', 'NM', '87110', 'USA'); +INSERT INTO northwind.orders VALUES (10853, 'BLAUS', 9, '1998-01-27', '1998-02-24', '1998-02-03', 2, 53.8300018, 'Blauer See Delikatessen', 'Forsterstr. 57', 'Mannheim', NULL, '68306', 'Germany'); +INSERT INTO northwind.orders VALUES (10854, 'ERNSH', 3, '1998-01-27', '1998-02-24', '1998-02-05', 2, 100.220001, 'Ernst Handel', 'Kirchgasse 6', 'Graz', NULL, '8010', 'Austria'); +INSERT INTO northwind.orders VALUES (10855, 'OLDWO', 3, '1998-01-27', '1998-02-24', '1998-02-04', 1, 170.970001, 'Old World Delicatessen', '2743 Bering St.', 'Anchorage', 'AK', '99508', 'USA'); +INSERT INTO northwind.orders VALUES (10856, 'ANTON', 3, '1998-01-28', '1998-02-25', '1998-02-10', 2, 58.4300003, 'Antonio Moreno Taquería', 'Mataderos 2312', 'México D.F.', NULL, '05023', 'Mexico'); +INSERT INTO northwind.orders VALUES (10857, 'BERGS', 8, '1998-01-28', '1998-02-25', '1998-02-06', 2, 188.850006, 'Berglunds snabbköp', 'Berguvsvägen 8', 'Luleå', NULL, 'S-958 22', 'Sweden'); +INSERT INTO northwind.orders VALUES (10858, 'LACOR', 2, '1998-01-29', '1998-02-26', '1998-02-03', 1, 52.5099983, 'La corne d''abondance', '67, avenue de l''Europe', 'Versailles', NULL, '78000', 'France'); +INSERT INTO northwind.orders VALUES (10860, 'FRANR', 3, '1998-01-29', '1998-02-26', '1998-02-04', 3, 19.2600002, 'France restauration', '54, rue Royale', 'Nantes', NULL, '44000', 'France'); +INSERT INTO northwind.orders VALUES (10861, 'WHITC', 4, '1998-01-30', '1998-02-27', '1998-02-17', 2, 14.9300003, 'White Clover Markets', '1029 - 12th Ave. S.', 'Seattle', 'WA', '98124', 'USA'); +INSERT INTO northwind.orders VALUES (10862, 'LEHMS', 8, '1998-01-30', '1998-03-13', '1998-02-02', 2, 53.2299995, 'Lehmanns Marktstand', 'Magazinweg 7', 'Frankfurt a.M.', NULL, '60528', 'Germany'); +INSERT INTO northwind.orders VALUES (10863, 'HILAA', 4, '1998-02-02', '1998-03-02', '1998-02-17', 2, 30.2600002, 'HILARION-Abastos', 'Carrera 22 con Ave. Carlos Soublette #8-35', 'San Cristóbal', 'Táchira', '5022', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10864, 'AROUT', 4, '1998-02-02', '1998-03-02', '1998-02-09', 2, 3.03999996, 'Around the Horn', 'Brook Farm Stratford St. Mary', 'Colchester', 'Essex', 'CO7 6JX', 'UK'); +INSERT INTO northwind.orders VALUES (10865, 'QUICK', 2, '1998-02-02', '1998-02-16', '1998-02-12', 1, 348.140015, 'QUICK-Stop', 'Taucherstraße 10', 'Cunewalde', NULL, '01307', 'Germany'); +INSERT INTO northwind.orders VALUES (10866, 'BERGS', 5, '1998-02-03', '1998-03-03', '1998-02-12', 1, 109.110001, 'Berglunds snabbköp', 'Berguvsvägen 8', 'Luleå', NULL, 'S-958 22', 'Sweden'); +INSERT INTO northwind.orders VALUES (10867, 'LONEP', 6, '1998-02-03', '1998-03-17', '1998-02-11', 1, 1.92999995, 'Lonesome Pine Restaurant', '89 Chiaroscuro Rd.', 'Portland', 'OR', '97219', 'USA'); +INSERT INTO northwind.orders VALUES (10868, 'QUEEN', 7, '1998-02-04', '1998-03-04', '1998-02-23', 2, 191.270004, 'Queen Cozinha', 'Alameda dos Canàrios, 891', 'Sao Paulo', 'SP', '05487-020', 'Brazil'); +INSERT INTO northwind.orders VALUES (10869, 'SEVES', 5, '1998-02-04', '1998-03-04', '1998-02-09', 1, 143.279999, 'Seven Seas Imports', '90 Wadhurst Rd.', 'London', NULL, 'OX15 4NB', 'UK'); +INSERT INTO northwind.orders VALUES (10870, 'WOLZA', 5, '1998-02-04', '1998-03-04', '1998-02-13', 3, 12.04, 'Wolski Zajazd', 'ul. Filtrowa 68', 'Warszawa', NULL, '01-012', 'Poland'); +INSERT INTO northwind.orders VALUES (10871, 'BONAP', 9, '1998-02-05', '1998-03-05', '1998-02-10', 2, 112.269997, 'Bon app''', '12, rue des Bouchers', 'Marseille', NULL, '13008', 'France'); +INSERT INTO northwind.orders VALUES (10872, 'GODOS', 5, '1998-02-05', '1998-03-05', '1998-02-09', 2, 175.320007, 'Godos Cocina Típica', 'C/ Romero, 33', 'Sevilla', NULL, '41101', 'Spain'); +INSERT INTO northwind.orders VALUES (10873, 'WILMK', 4, '1998-02-06', '1998-03-06', '1998-02-09', 1, 0.819999993, 'Wilman Kala', 'Keskuskatu 45', 'Helsinki', NULL, '21240', 'Finland'); +INSERT INTO northwind.orders VALUES (10874, 'GODOS', 5, '1998-02-06', '1998-03-06', '1998-02-11', 2, 19.5799999, 'Godos Cocina Típica', 'C/ Romero, 33', 'Sevilla', NULL, '41101', 'Spain'); +INSERT INTO northwind.orders VALUES (10875, 'BERGS', 4, '1998-02-06', '1998-03-06', '1998-03-03', 2, 32.3699989, 'Berglunds snabbköp', 'Berguvsvägen 8', 'Luleå', NULL, 'S-958 22', 'Sweden'); +INSERT INTO northwind.orders VALUES (10876, 'BONAP', 7, '1998-02-09', '1998-03-09', '1998-02-12', 3, 60.4199982, 'Bon app''', '12, rue des Bouchers', 'Marseille', NULL, '13008', 'France'); +INSERT INTO northwind.orders VALUES (10878, 'QUICK', 4, '1998-02-10', '1998-03-10', '1998-02-12', 1, 46.6899986, 'QUICK-Stop', 'Taucherstraße 10', 'Cunewalde', NULL, '01307', 'Germany'); +INSERT INTO northwind.orders VALUES (10879, 'WILMK', 3, '1998-02-10', '1998-03-10', '1998-02-12', 3, 8.5, 'Wilman Kala', 'Keskuskatu 45', 'Helsinki', NULL, '21240', 'Finland'); +INSERT INTO northwind.orders VALUES (10880, 'FOLKO', 7, '1998-02-10', '1998-03-24', '1998-02-18', 1, 88.0100021, 'Folk och fä HB', 'Åkergatan 24', 'Bräcke', NULL, 'S-844 67', 'Sweden'); +INSERT INTO northwind.orders VALUES (10881, 'CACTU', 4, '1998-02-11', '1998-03-11', '1998-02-18', 1, 2.83999991, 'Cactus Comidas para llevar', 'Cerrito 333', 'Buenos Aires', NULL, '1010', 'Argentina'); +INSERT INTO northwind.orders VALUES (10882, 'SAVEA', 4, '1998-02-11', '1998-03-11', '1998-02-20', 3, 23.1000004, 'Save-a-lot Markets', '187 Suffolk Ln.', 'Boise', 'ID', '83720', 'USA'); +INSERT INTO northwind.orders VALUES (10883, 'LONEP', 8, '1998-02-12', '1998-03-12', '1998-02-20', 3, 0.529999971, 'Lonesome Pine Restaurant', '89 Chiaroscuro Rd.', 'Portland', 'OR', '97219', 'USA'); +INSERT INTO northwind.orders VALUES (10884, 'LETSS', 4, '1998-02-12', '1998-03-12', '1998-02-13', 2, 90.9700012, 'Let''s Stop N Shop', '87 Polk St. Suite 5', 'San Francisco', 'CA', '94117', 'USA'); +INSERT INTO northwind.orders VALUES (10885, 'SUPRD', 6, '1998-02-12', '1998-03-12', '1998-02-18', 3, 5.63999987, 'Suprêmes délices', 'Boulevard Tirou, 255', 'Charleroi', NULL, 'B-6000', 'Belgium'); +INSERT INTO northwind.orders VALUES (10887, 'GALED', 8, '1998-02-13', '1998-03-13', '1998-02-16', 3, 1.25, 'Galería del gastronómo', 'Rambla de Cataluña, 23', 'Barcelona', NULL, '8022', 'Spain'); +INSERT INTO northwind.orders VALUES (10889, 'RATTC', 9, '1998-02-16', '1998-03-16', '1998-02-23', 3, 280.609985, 'Rattlesnake Canyon Grocery', '2817 Milton Dr.', 'Albuquerque', 'NM', '87110', 'USA'); +INSERT INTO northwind.orders VALUES (10890, 'DUMON', 7, '1998-02-16', '1998-03-16', '1998-02-18', 1, 32.7599983, 'Du monde entier', '67, rue des Cinquante Otages', 'Nantes', NULL, '44000', 'France'); +INSERT INTO northwind.orders VALUES (10891, 'LEHMS', 7, '1998-02-17', '1998-03-17', '1998-02-19', 2, 20.3700008, 'Lehmanns Marktstand', 'Magazinweg 7', 'Frankfurt a.M.', NULL, '60528', 'Germany'); +INSERT INTO northwind.orders VALUES (10892, 'MAISD', 4, '1998-02-17', '1998-03-17', '1998-02-19', 2, 120.269997, 'Maison Dewey', 'Rue Joseph-Bens 532', 'Bruxelles', NULL, 'B-1180', 'Belgium'); +INSERT INTO northwind.orders VALUES (10893, 'KOENE', 9, '1998-02-18', '1998-03-18', '1998-02-20', 2, 77.7799988, 'Königlich Essen', 'Maubelstr. 90', 'Brandenburg', NULL, '14776', 'Germany'); +INSERT INTO northwind.orders VALUES (10895, 'ERNSH', 3, '1998-02-18', '1998-03-18', '1998-02-23', 1, 162.75, 'Ernst Handel', 'Kirchgasse 6', 'Graz', NULL, '8010', 'Austria'); +INSERT INTO northwind.orders VALUES (10896, 'MAISD', 7, '1998-02-19', '1998-03-19', '1998-02-27', 3, 32.4500008, 'Maison Dewey', 'Rue Joseph-Bens 532', 'Bruxelles', NULL, 'B-1180', 'Belgium'); +INSERT INTO northwind.orders VALUES (10897, 'HUNGO', 3, '1998-02-19', '1998-03-19', '1998-02-25', 2, 603.539978, 'Hungry Owl All-Night Grocers', '8 Johnstown Road', 'Cork', 'Co. Cork', NULL, 'Ireland'); +INSERT INTO northwind.orders VALUES (10898, 'OCEAN', 4, '1998-02-20', '1998-03-20', '1998-03-06', 2, 1.26999998, 'Océano Atlántico Ltda.', 'Ing. Gustavo Moncada 8585 Piso 20-A', 'Buenos Aires', NULL, '1010', 'Argentina'); +INSERT INTO northwind.orders VALUES (10899, 'LILAS', 5, '1998-02-20', '1998-03-20', '1998-02-26', 3, 1.21000004, 'LILA-Supermercado', 'Carrera 52 con Ave. Bolívar #65-98 Llano Largo', 'Barquisimeto', 'Lara', '3508', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10340, 'BONAP', 1, '1996-10-29', '1996-11-26', '1996-11-08', 3, 166.309998, 'Bon app''', '12, rue des Bouchers', 'Marseille', NULL, '13008', 'France'); +INSERT INTO northwind.orders VALUES (10901, 'HILAA', 4, '1998-02-23', '1998-03-23', '1998-02-26', 1, 62.0900002, 'HILARION-Abastos', 'Carrera 22 con Ave. Carlos Soublette #8-35', 'San Cristóbal', 'Táchira', '5022', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10903, 'HANAR', 3, '1998-02-24', '1998-03-24', '1998-03-04', 3, 36.7099991, 'Hanari Carnes', 'Rua do Paço, 67', 'Rio de Janeiro', 'RJ', '05454-876', 'Brazil'); +INSERT INTO northwind.orders VALUES (10904, 'WHITC', 3, '1998-02-24', '1998-03-24', '1998-02-27', 3, 162.949997, 'White Clover Markets', '1029 - 12th Ave. S.', 'Seattle', 'WA', '98124', 'USA'); +INSERT INTO northwind.orders VALUES (10905, 'WELLI', 9, '1998-02-24', '1998-03-24', '1998-03-06', 2, 13.7200003, 'Wellington Importadora', 'Rua do Mercado, 12', 'Resende', 'SP', '08737-363', 'Brazil'); +INSERT INTO northwind.orders VALUES (10906, 'WOLZA', 4, '1998-02-25', '1998-03-11', '1998-03-03', 3, 26.2900009, 'Wolski Zajazd', 'ul. Filtrowa 68', 'Warszawa', NULL, '01-012', 'Poland'); +INSERT INTO northwind.orders VALUES (10907, 'SPECD', 6, '1998-02-25', '1998-03-25', '1998-02-27', 3, 9.18999958, 'Spécialités du monde', '25, rue Lauriston', 'Paris', NULL, '75016', 'France'); +INSERT INTO northwind.orders VALUES (10908, 'REGGC', 4, '1998-02-26', '1998-03-26', '1998-03-06', 2, 32.9599991, 'Reggiani Caseifici', 'Strada Provinciale 124', 'Reggio Emilia', NULL, '42100', 'Italy'); +INSERT INTO northwind.orders VALUES (10911, 'GODOS', 3, '1998-02-26', '1998-03-26', '1998-03-05', 1, 38.1899986, 'Godos Cocina Típica', 'C/ Romero, 33', 'Sevilla', NULL, '41101', 'Spain'); +INSERT INTO northwind.orders VALUES (10912, 'HUNGO', 2, '1998-02-26', '1998-03-26', '1998-03-18', 2, 580.909973, 'Hungry Owl All-Night Grocers', '8 Johnstown Road', 'Cork', 'Co. Cork', NULL, 'Ireland'); +INSERT INTO northwind.orders VALUES (10913, 'QUEEN', 4, '1998-02-26', '1998-03-26', '1998-03-04', 1, 33.0499992, 'Queen Cozinha', 'Alameda dos Canàrios, 891', 'Sao Paulo', 'SP', '05487-020', 'Brazil'); +INSERT INTO northwind.orders VALUES (10914, 'QUEEN', 6, '1998-02-27', '1998-03-27', '1998-03-02', 1, 21.1900005, 'Queen Cozinha', 'Alameda dos Canàrios, 891', 'Sao Paulo', 'SP', '05487-020', 'Brazil'); +INSERT INTO northwind.orders VALUES (10915, 'TORTU', 2, '1998-02-27', '1998-03-27', '1998-03-02', 2, 3.50999999, 'Tortuga Restaurante', 'Avda. Azteca 123', 'México D.F.', NULL, '05033', 'Mexico'); +INSERT INTO northwind.orders VALUES (10917, 'ROMEY', 4, '1998-03-02', '1998-03-30', '1998-03-11', 2, 8.28999996, 'Romero y tomillo', 'Gran Vía, 1', 'Madrid', NULL, '28001', 'Spain'); +INSERT INTO northwind.orders VALUES (10918, 'BOTTM', 3, '1998-03-02', '1998-03-30', '1998-03-11', 3, 48.8300018, 'Bottom-Dollar Markets', '23 Tsawassen Blvd.', 'Tsawassen', 'BC', 'T2F 8M4', 'Canada'); +INSERT INTO northwind.orders VALUES (10919, 'LINOD', 2, '1998-03-02', '1998-03-30', '1998-03-04', 2, 19.7999992, 'LINO-Delicateses', 'Ave. 5 de Mayo Porlamar', 'I. de Margarita', 'Nueva Esparta', '4980', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10920, 'AROUT', 4, '1998-03-03', '1998-03-31', '1998-03-09', 2, 29.6100006, 'Around the Horn', 'Brook Farm Stratford St. Mary', 'Colchester', 'Essex', 'CO7 6JX', 'UK'); +INSERT INTO northwind.orders VALUES (10922, 'HANAR', 5, '1998-03-03', '1998-03-31', '1998-03-05', 3, 62.7400017, 'Hanari Carnes', 'Rua do Paço, 67', 'Rio de Janeiro', 'RJ', '05454-876', 'Brazil'); +INSERT INTO northwind.orders VALUES (10923, 'LAMAI', 7, '1998-03-03', '1998-04-14', '1998-03-13', 3, 68.2600021, 'La maison d''Asie', '1 rue Alsace-Lorraine', 'Toulouse', NULL, '31000', 'France'); +INSERT INTO northwind.orders VALUES (10924, 'BERGS', 3, '1998-03-04', '1998-04-01', '1998-04-08', 2, 151.520004, 'Berglunds snabbköp', 'Berguvsvägen 8', 'Luleå', NULL, 'S-958 22', 'Sweden'); +INSERT INTO northwind.orders VALUES (10925, 'HANAR', 3, '1998-03-04', '1998-04-01', '1998-03-13', 1, 2.26999998, 'Hanari Carnes', 'Rua do Paço, 67', 'Rio de Janeiro', 'RJ', '05454-876', 'Brazil'); +INSERT INTO northwind.orders VALUES (10926, 'ANATR', 4, '1998-03-04', '1998-04-01', '1998-03-11', 3, 39.9199982, 'Ana Trujillo Emparedados y helados', 'Avda. de la Constitución 2222', 'México D.F.', NULL, '05021', 'Mexico'); +INSERT INTO northwind.orders VALUES (10927, 'LACOR', 4, '1998-03-05', '1998-04-02', '1998-04-08', 1, 19.7900009, 'La corne d''abondance', '67, avenue de l''Europe', 'Versailles', NULL, '78000', 'France'); +INSERT INTO northwind.orders VALUES (10929, 'FRANK', 6, '1998-03-05', '1998-04-02', '1998-03-12', 1, 33.9300003, 'Frankenversand', 'Berliner Platz 43', 'München', NULL, '80805', 'Germany'); +INSERT INTO northwind.orders VALUES (10930, 'SUPRD', 4, '1998-03-06', '1998-04-17', '1998-03-18', 3, 15.5500002, 'Suprêmes délices', 'Boulevard Tirou, 255', 'Charleroi', NULL, 'B-6000', 'Belgium'); +INSERT INTO northwind.orders VALUES (10931, 'RICSU', 4, '1998-03-06', '1998-03-20', '1998-03-19', 2, 13.6000004, 'Richter Supermarkt', 'Starenweg 5', 'Genève', NULL, '1204', 'Switzerland'); +INSERT INTO northwind.orders VALUES (10932, 'BONAP', 8, '1998-03-06', '1998-04-03', '1998-03-24', 1, 134.639999, 'Bon app''', '12, rue des Bouchers', 'Marseille', NULL, '13008', 'France'); +INSERT INTO northwind.orders VALUES (10933, 'ISLAT', 6, '1998-03-06', '1998-04-03', '1998-03-16', 3, 54.1500015, 'Island Trading', 'Garden House Crowther Way', 'Cowes', 'Isle of Wight', 'PO31 7PJ', 'UK'); +INSERT INTO northwind.orders VALUES (10934, 'LEHMS', 3, '1998-03-09', '1998-04-06', '1998-03-12', 3, 32.0099983, 'Lehmanns Marktstand', 'Magazinweg 7', 'Frankfurt a.M.', NULL, '60528', 'Germany'); +INSERT INTO northwind.orders VALUES (10935, 'WELLI', 4, '1998-03-09', '1998-04-06', '1998-03-18', 3, 47.5900002, 'Wellington Importadora', 'Rua do Mercado, 12', 'Resende', 'SP', '08737-363', 'Brazil'); +INSERT INTO northwind.orders VALUES (10936, 'GREAL', 3, '1998-03-09', '1998-04-06', '1998-03-18', 2, 33.6800003, 'Great Lakes Food Market', '2732 Baker Blvd.', 'Eugene', 'OR', '97403', 'USA'); +INSERT INTO northwind.orders VALUES (10937, 'CACTU', 7, '1998-03-10', '1998-03-24', '1998-03-13', 3, 31.5100002, 'Cactus Comidas para llevar', 'Cerrito 333', 'Buenos Aires', NULL, '1010', 'Argentina'); +INSERT INTO northwind.orders VALUES (10938, 'QUICK', 3, '1998-03-10', '1998-04-07', '1998-03-16', 2, 31.8899994, 'QUICK-Stop', 'Taucherstraße 10', 'Cunewalde', NULL, '01307', 'Germany'); +INSERT INTO northwind.orders VALUES (10939, 'MAGAA', 2, '1998-03-10', '1998-04-07', '1998-03-13', 2, 76.3300018, 'Magazzini Alimentari Riuniti', 'Via Ludovico il Moro 22', 'Bergamo', NULL, '24100', 'Italy'); +INSERT INTO northwind.orders VALUES (10940, 'BONAP', 8, '1998-03-11', '1998-04-08', '1998-03-23', 3, 19.7700005, 'Bon app''', '12, rue des Bouchers', 'Marseille', NULL, '13008', 'France'); +INSERT INTO northwind.orders VALUES (10941, 'SAVEA', 7, '1998-03-11', '1998-04-08', '1998-03-20', 2, 400.809998, 'Save-a-lot Markets', '187 Suffolk Ln.', 'Boise', 'ID', '83720', 'USA'); +INSERT INTO northwind.orders VALUES (10942, 'REGGC', 9, '1998-03-11', '1998-04-08', '1998-03-18', 3, 17.9500008, 'Reggiani Caseifici', 'Strada Provinciale 124', 'Reggio Emilia', NULL, '42100', 'Italy'); +INSERT INTO northwind.orders VALUES (10943, 'BSBEV', 4, '1998-03-11', '1998-04-08', '1998-03-19', 2, 2.17000008, 'B''s Beverages', 'Fauntleroy Circus', 'London', NULL, 'EC2 5NT', 'UK'); +INSERT INTO northwind.orders VALUES (10944, 'BOTTM', 6, '1998-03-12', '1998-03-26', '1998-03-13', 3, 52.9199982, 'Bottom-Dollar Markets', '23 Tsawassen Blvd.', 'Tsawassen', 'BC', 'T2F 8M4', 'Canada'); +INSERT INTO northwind.orders VALUES (10945, 'MORGK', 4, '1998-03-12', '1998-04-09', '1998-03-18', 1, 10.2200003, 'Morgenstern Gesundkost', 'Heerstr. 22', 'Leipzig', NULL, '04179', 'Germany'); +INSERT INTO northwind.orders VALUES (10947, 'BSBEV', 3, '1998-03-13', '1998-04-10', '1998-03-16', 2, 3.25999999, 'B''s Beverages', 'Fauntleroy Circus', 'London', NULL, 'EC2 5NT', 'UK'); +INSERT INTO northwind.orders VALUES (10948, 'GODOS', 3, '1998-03-13', '1998-04-10', '1998-03-19', 3, 23.3899994, 'Godos Cocina Típica', 'C/ Romero, 33', 'Sevilla', NULL, '41101', 'Spain'); +INSERT INTO northwind.orders VALUES (10949, 'BOTTM', 2, '1998-03-13', '1998-04-10', '1998-03-17', 3, 74.4400024, 'Bottom-Dollar Markets', '23 Tsawassen Blvd.', 'Tsawassen', 'BC', 'T2F 8M4', 'Canada'); +INSERT INTO northwind.orders VALUES (10951, 'RICSU', 9, '1998-03-16', '1998-04-27', '1998-04-07', 2, 30.8500004, 'Richter Supermarkt', 'Starenweg 5', 'Genève', NULL, '1204', 'Switzerland'); +INSERT INTO northwind.orders VALUES (10953, 'AROUT', 9, '1998-03-16', '1998-03-30', '1998-03-25', 2, 23.7199993, 'Around the Horn', 'Brook Farm Stratford St. Mary', 'Colchester', 'Essex', 'CO7 6JX', 'UK'); +INSERT INTO northwind.orders VALUES (10954, 'LINOD', 5, '1998-03-17', '1998-04-28', '1998-03-20', 1, 27.9099998, 'LINO-Delicateses', 'Ave. 5 de Mayo Porlamar', 'I. de Margarita', 'Nueva Esparta', '4980', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10955, 'FOLKO', 8, '1998-03-17', '1998-04-14', '1998-03-20', 2, 3.25999999, 'Folk och fä HB', 'Åkergatan 24', 'Bräcke', NULL, 'S-844 67', 'Sweden'); +INSERT INTO northwind.orders VALUES (10956, 'BLAUS', 6, '1998-03-17', '1998-04-28', '1998-03-20', 2, 44.6500015, 'Blauer See Delikatessen', 'Forsterstr. 57', 'Mannheim', NULL, '68306', 'Germany'); +INSERT INTO northwind.orders VALUES (10957, 'HILAA', 8, '1998-03-18', '1998-04-15', '1998-03-27', 3, 105.360001, 'HILARION-Abastos', 'Carrera 22 con Ave. Carlos Soublette #8-35', 'San Cristóbal', 'Táchira', '5022', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10958, 'OCEAN', 7, '1998-03-18', '1998-04-15', '1998-03-27', 2, 49.5600014, 'Océano Atlántico Ltda.', 'Ing. Gustavo Moncada 8585 Piso 20-A', 'Buenos Aires', NULL, '1010', 'Argentina'); +INSERT INTO northwind.orders VALUES (10959, 'GOURL', 6, '1998-03-18', '1998-04-29', '1998-03-23', 2, 4.98000002, 'Gourmet Lanchonetes', 'Av. Brasil, 442', 'Campinas', 'SP', '04876-786', 'Brazil'); +INSERT INTO northwind.orders VALUES (10960, 'HILAA', 3, '1998-03-19', '1998-04-02', '1998-04-08', 1, 2.07999992, 'HILARION-Abastos', 'Carrera 22 con Ave. Carlos Soublette #8-35', 'San Cristóbal', 'Táchira', '5022', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10961, 'QUEEN', 8, '1998-03-19', '1998-04-16', '1998-03-30', 1, 104.470001, 'Queen Cozinha', 'Alameda dos Canàrios, 891', 'Sao Paulo', 'SP', '05487-020', 'Brazil'); +INSERT INTO northwind.orders VALUES (10962, 'QUICK', 8, '1998-03-19', '1998-04-16', '1998-03-23', 2, 275.790009, 'QUICK-Stop', 'Taucherstraße 10', 'Cunewalde', NULL, '01307', 'Germany'); +INSERT INTO northwind.orders VALUES (10963, 'FURIB', 9, '1998-03-19', '1998-04-16', '1998-03-26', 3, 2.70000005, 'Furia Bacalhau e Frutos do Mar', 'Jardim das rosas n. 32', 'Lisboa', NULL, '1675', 'Portugal'); +INSERT INTO northwind.orders VALUES (10964, 'SPECD', 3, '1998-03-20', '1998-04-17', '1998-03-24', 2, 87.3799973, 'Spécialités du monde', '25, rue Lauriston', 'Paris', NULL, '75016', 'France'); +INSERT INTO northwind.orders VALUES (10965, 'OLDWO', 6, '1998-03-20', '1998-04-17', '1998-03-30', 3, 144.380005, 'Old World Delicatessen', '2743 Bering St.', 'Anchorage', 'AK', '99508', 'USA'); +INSERT INTO northwind.orders VALUES (10966, 'CHOPS', 4, '1998-03-20', '1998-04-17', '1998-04-08', 1, 27.1900005, 'Chop-suey Chinese', 'Hauptstr. 31', 'Bern', NULL, '3012', 'Switzerland'); +INSERT INTO northwind.orders VALUES (10967, 'TOMSP', 2, '1998-03-23', '1998-04-20', '1998-04-02', 2, 62.2200012, 'Toms Spezialitäten', 'Luisenstr. 48', 'Münster', NULL, '44087', 'Germany'); +INSERT INTO northwind.orders VALUES (10351, 'ERNSH', 1, '1996-11-11', '1996-12-09', '1996-11-20', 1, 162.330002, 'Ernst Handel', 'Kirchgasse 6', 'Graz', NULL, '8010', 'Austria'); +INSERT INTO northwind.orders VALUES (10970, 'BOLID', 9, '1998-03-24', '1998-04-07', '1998-04-24', 1, 16.1599998, 'Bólido Comidas preparadas', 'C/ Araquil, 67', 'Madrid', NULL, '28023', 'Spain'); +INSERT INTO northwind.orders VALUES (10971, 'FRANR', 2, '1998-03-24', '1998-04-21', '1998-04-02', 2, 121.82, 'France restauration', '54, rue Royale', 'Nantes', NULL, '44000', 'France'); +INSERT INTO northwind.orders VALUES (10972, 'LACOR', 4, '1998-03-24', '1998-04-21', '1998-03-26', 2, 0.0199999996, 'La corne d''abondance', '67, avenue de l''Europe', 'Versailles', NULL, '78000', 'France'); +INSERT INTO northwind.orders VALUES (10973, 'LACOR', 6, '1998-03-24', '1998-04-21', '1998-03-27', 2, 15.1700001, 'La corne d''abondance', '67, avenue de l''Europe', 'Versailles', NULL, '78000', 'France'); +INSERT INTO northwind.orders VALUES (10974, 'SPLIR', 3, '1998-03-25', '1998-04-08', '1998-04-03', 3, 12.96, 'Split Rail Beer & Ale', 'P.O. Box 555', 'Lander', 'WY', '82520', 'USA'); +INSERT INTO northwind.orders VALUES (10977, 'FOLKO', 8, '1998-03-26', '1998-04-23', '1998-04-10', 3, 208.5, 'Folk och fä HB', 'Åkergatan 24', 'Bräcke', NULL, 'S-844 67', 'Sweden'); +INSERT INTO northwind.orders VALUES (10978, 'MAISD', 9, '1998-03-26', '1998-04-23', '1998-04-23', 2, 32.8199997, 'Maison Dewey', 'Rue Joseph-Bens 532', 'Bruxelles', NULL, 'B-1180', 'Belgium'); +INSERT INTO northwind.orders VALUES (10979, 'ERNSH', 8, '1998-03-26', '1998-04-23', '1998-03-31', 2, 353.070007, 'Ernst Handel', 'Kirchgasse 6', 'Graz', NULL, '8010', 'Austria'); +INSERT INTO northwind.orders VALUES (10980, 'FOLKO', 4, '1998-03-27', '1998-05-08', '1998-04-17', 1, 1.25999999, 'Folk och fä HB', 'Åkergatan 24', 'Bräcke', NULL, 'S-844 67', 'Sweden'); +INSERT INTO northwind.orders VALUES (10982, 'BOTTM', 2, '1998-03-27', '1998-04-24', '1998-04-08', 1, 14.0100002, 'Bottom-Dollar Markets', '23 Tsawassen Blvd.', 'Tsawassen', 'BC', 'T2F 8M4', 'Canada'); +INSERT INTO northwind.orders VALUES (10983, 'SAVEA', 2, '1998-03-27', '1998-04-24', '1998-04-06', 2, 657.539978, 'Save-a-lot Markets', '187 Suffolk Ln.', 'Boise', 'ID', '83720', 'USA'); +INSERT INTO northwind.orders VALUES (10985, 'HUNGO', 2, '1998-03-30', '1998-04-27', '1998-04-02', 1, 91.5100021, 'Hungry Owl All-Night Grocers', '8 Johnstown Road', 'Cork', 'Co. Cork', NULL, 'Ireland'); +INSERT INTO northwind.orders VALUES (10986, 'OCEAN', 8, '1998-03-30', '1998-04-27', '1998-04-21', 2, 217.860001, 'Océano Atlántico Ltda.', 'Ing. Gustavo Moncada 8585 Piso 20-A', 'Buenos Aires', NULL, '1010', 'Argentina'); +INSERT INTO northwind.orders VALUES (10987, 'EASTC', 8, '1998-03-31', '1998-04-28', '1998-04-06', 1, 185.479996, 'Eastern Connection', '35 King George', 'London', NULL, 'WX3 6FW', 'UK'); +INSERT INTO northwind.orders VALUES (10988, 'RATTC', 3, '1998-03-31', '1998-04-28', '1998-04-10', 2, 61.1399994, 'Rattlesnake Canyon Grocery', '2817 Milton Dr.', 'Albuquerque', 'NM', '87110', 'USA'); +INSERT INTO northwind.orders VALUES (10989, 'QUEDE', 2, '1998-03-31', '1998-04-28', '1998-04-02', 1, 34.7599983, 'Que Delícia', 'Rua da Panificadora, 12', 'Rio de Janeiro', 'RJ', '02389-673', 'Brazil'); +INSERT INTO northwind.orders VALUES (10990, 'ERNSH', 2, '1998-04-01', '1998-05-13', '1998-04-07', 3, 117.610001, 'Ernst Handel', 'Kirchgasse 6', 'Graz', NULL, '8010', 'Austria'); +INSERT INTO northwind.orders VALUES (10357, 'LILAS', 1, '1996-11-19', '1996-12-17', '1996-12-02', 3, 34.8800011, 'LILA-Supermercado', 'Carrera 52 con Ave. Bolívar #65-98 Llano Largo', 'Barquisimeto', 'Lara', '3508', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10993, 'FOLKO', 7, '1998-04-01', '1998-04-29', '1998-04-10', 3, 8.81000042, 'Folk och fä HB', 'Åkergatan 24', 'Bräcke', NULL, 'S-844 67', 'Sweden'); +INSERT INTO northwind.orders VALUES (10994, 'VAFFE', 2, '1998-04-02', '1998-04-16', '1998-04-09', 3, 65.5299988, 'Vaffeljernet', 'Smagsloget 45', 'Århus', NULL, '8200', 'Denmark'); +INSERT INTO northwind.orders VALUES (10996, 'QUICK', 4, '1998-04-02', '1998-04-30', '1998-04-10', 2, 1.12, 'QUICK-Stop', 'Taucherstraße 10', 'Cunewalde', NULL, '01307', 'Germany'); +INSERT INTO northwind.orders VALUES (10997, 'LILAS', 8, '1998-04-03', '1998-05-15', '1998-04-13', 2, 73.9100037, 'LILA-Supermercado', 'Carrera 52 con Ave. Bolívar #65-98 Llano Largo', 'Barquisimeto', 'Lara', '3508', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10998, 'WOLZA', 8, '1998-04-03', '1998-04-17', '1998-04-17', 2, 20.3099995, 'Wolski Zajazd', 'ul. Filtrowa 68', 'Warszawa', NULL, '01-012', 'Poland'); +INSERT INTO northwind.orders VALUES (10999, 'OTTIK', 6, '1998-04-03', '1998-05-01', '1998-04-10', 2, 96.3499985, 'Ottilies Käseladen', 'Mehrheimerstr. 369', 'Köln', NULL, '50739', 'Germany'); +INSERT INTO northwind.orders VALUES (11000, 'RATTC', 2, '1998-04-06', '1998-05-04', '1998-04-14', 3, 55.1199989, 'Rattlesnake Canyon Grocery', '2817 Milton Dr.', 'Albuquerque', 'NM', '87110', 'USA'); +INSERT INTO northwind.orders VALUES (11001, 'FOLKO', 2, '1998-04-06', '1998-05-04', '1998-04-14', 2, 197.300003, 'Folk och fä HB', 'Åkergatan 24', 'Bräcke', NULL, 'S-844 67', 'Sweden'); +INSERT INTO northwind.orders VALUES (11002, 'SAVEA', 4, '1998-04-06', '1998-05-04', '1998-04-16', 1, 141.160004, 'Save-a-lot Markets', '187 Suffolk Ln.', 'Boise', 'ID', '83720', 'USA'); +INSERT INTO northwind.orders VALUES (11003, 'THECR', 3, '1998-04-06', '1998-05-04', '1998-04-08', 3, 14.9099998, 'The Cracker Box', '55 Grizzly Peak Rd.', 'Butte', 'MT', '59801', 'USA'); +INSERT INTO northwind.orders VALUES (11004, 'MAISD', 3, '1998-04-07', '1998-05-05', '1998-04-20', 1, 44.8400002, 'Maison Dewey', 'Rue Joseph-Bens 532', 'Bruxelles', NULL, 'B-1180', 'Belgium'); +INSERT INTO northwind.orders VALUES (11005, 'WILMK', 2, '1998-04-07', '1998-05-05', '1998-04-10', 1, 0.75, 'Wilman Kala', 'Keskuskatu 45', 'Helsinki', NULL, '21240', 'Finland'); +INSERT INTO northwind.orders VALUES (11006, 'GREAL', 3, '1998-04-07', '1998-05-05', '1998-04-15', 2, 25.1900005, 'Great Lakes Food Market', '2732 Baker Blvd.', 'Eugene', 'OR', '97403', 'USA'); +INSERT INTO northwind.orders VALUES (11007, 'PRINI', 8, '1998-04-08', '1998-05-06', '1998-04-13', 2, 202.240005, 'Princesa Isabel Vinhos', 'Estrada da saúde n. 58', 'Lisboa', NULL, '1756', 'Portugal'); +INSERT INTO northwind.orders VALUES (11008, 'ERNSH', 7, '1998-04-08', '1998-05-06', NULL, 3, 79.4599991, 'Ernst Handel', 'Kirchgasse 6', 'Graz', NULL, '8010', 'Austria'); +INSERT INTO northwind.orders VALUES (11009, 'GODOS', 2, '1998-04-08', '1998-05-06', '1998-04-10', 1, 59.1100006, 'Godos Cocina Típica', 'C/ Romero, 33', 'Sevilla', NULL, '41101', 'Spain'); +INSERT INTO northwind.orders VALUES (11010, 'REGGC', 2, '1998-04-09', '1998-05-07', '1998-04-21', 2, 28.7099991, 'Reggiani Caseifici', 'Strada Provinciale 124', 'Reggio Emilia', NULL, '42100', 'Italy'); +INSERT INTO northwind.orders VALUES (11011, 'ALFKI', 3, '1998-04-09', '1998-05-07', '1998-04-13', 1, 1.21000004, 'Alfred''s Futterkiste', 'Obere Str. 57', 'Berlin', NULL, '12209', 'Germany'); +INSERT INTO northwind.orders VALUES (11013, 'ROMEY', 2, '1998-04-09', '1998-05-07', '1998-04-10', 1, 32.9900017, 'Romero y tomillo', 'Gran Vía, 1', 'Madrid', NULL, '28001', 'Spain'); +INSERT INTO northwind.orders VALUES (11014, 'LINOD', 2, '1998-04-10', '1998-05-08', '1998-04-15', 3, 23.6000004, 'LINO-Delicateses', 'Ave. 5 de Mayo Porlamar', 'I. de Margarita', 'Nueva Esparta', '4980', 'Venezuela'); +INSERT INTO northwind.orders VALUES (11015, 'SANTG', 2, '1998-04-10', '1998-04-24', '1998-04-20', 2, 4.61999989, 'Santé Gourmet', 'Erling Skakkes gate 78', 'Stavern', NULL, '4110', 'Norway'); +INSERT INTO northwind.orders VALUES (11016, 'AROUT', 9, '1998-04-10', '1998-05-08', '1998-04-13', 2, 33.7999992, 'Around the Horn', 'Brook Farm Stratford St. Mary', 'Colchester', 'Essex', 'CO7 6JX', 'UK'); +INSERT INTO northwind.orders VALUES (11017, 'ERNSH', 9, '1998-04-13', '1998-05-11', '1998-04-20', 2, 754.26001, 'Ernst Handel', 'Kirchgasse 6', 'Graz', NULL, '8010', 'Austria'); +INSERT INTO northwind.orders VALUES (11018, 'LONEP', 4, '1998-04-13', '1998-05-11', '1998-04-16', 2, 11.6499996, 'Lonesome Pine Restaurant', '89 Chiaroscuro Rd.', 'Portland', 'OR', '97219', 'USA'); +INSERT INTO northwind.orders VALUES (11019, 'RANCH', 6, '1998-04-13', '1998-05-11', NULL, 3, 3.17000008, 'Rancho grande', 'Av. del Libertador 900', 'Buenos Aires', NULL, '1010', 'Argentina'); +INSERT INTO northwind.orders VALUES (11020, 'OTTIK', 2, '1998-04-14', '1998-05-12', '1998-04-16', 2, 43.2999992, 'Ottilies Käseladen', 'Mehrheimerstr. 369', 'Köln', NULL, '50739', 'Germany'); +INSERT INTO northwind.orders VALUES (11021, 'QUICK', 3, '1998-04-14', '1998-05-12', '1998-04-21', 1, 297.179993, 'QUICK-Stop', 'Taucherstraße 10', 'Cunewalde', NULL, '01307', 'Germany'); +INSERT INTO northwind.orders VALUES (11022, 'HANAR', 9, '1998-04-14', '1998-05-12', '1998-05-04', 2, 6.26999998, 'Hanari Carnes', 'Rua do Paço, 67', 'Rio de Janeiro', 'RJ', '05454-876', 'Brazil'); +INSERT INTO northwind.orders VALUES (11024, 'EASTC', 4, '1998-04-15', '1998-05-13', '1998-04-20', 1, 74.3600006, 'Eastern Connection', '35 King George', 'London', NULL, 'WX3 6FW', 'UK'); +INSERT INTO northwind.orders VALUES (11025, 'WARTH', 6, '1998-04-15', '1998-05-13', '1998-04-24', 3, 29.1700001, 'Wartian Herkku', 'Torikatu 38', 'Oulu', NULL, '90110', 'Finland'); +INSERT INTO northwind.orders VALUES (11026, 'FRANS', 4, '1998-04-15', '1998-05-13', '1998-04-28', 1, 47.0900002, 'Franchi S.p.A.', 'Via Monte Bianco 34', 'Torino', NULL, '10100', 'Italy'); +INSERT INTO northwind.orders VALUES (10361, 'QUICK', 1, '1996-11-22', '1996-12-20', '1996-12-03', 2, 183.169998, 'QUICK-Stop', 'Taucherstraße 10', 'Cunewalde', NULL, '01307', 'Germany'); +INSERT INTO northwind.orders VALUES (11028, 'KOENE', 2, '1998-04-16', '1998-05-14', '1998-04-22', 1, 29.5900002, 'Königlich Essen', 'Maubelstr. 90', 'Brandenburg', NULL, '14776', 'Germany'); +INSERT INTO northwind.orders VALUES (11029, 'CHOPS', 4, '1998-04-16', '1998-05-14', '1998-04-27', 1, 47.8400002, 'Chop-suey Chinese', 'Hauptstr. 31', 'Bern', NULL, '3012', 'Switzerland'); +INSERT INTO northwind.orders VALUES (11030, 'SAVEA', 7, '1998-04-17', '1998-05-15', '1998-04-27', 2, 830.75, 'Save-a-lot Markets', '187 Suffolk Ln.', 'Boise', 'ID', '83720', 'USA'); +INSERT INTO northwind.orders VALUES (11031, 'SAVEA', 6, '1998-04-17', '1998-05-15', '1998-04-24', 2, 227.220001, 'Save-a-lot Markets', '187 Suffolk Ln.', 'Boise', 'ID', '83720', 'USA'); +INSERT INTO northwind.orders VALUES (11032, 'WHITC', 2, '1998-04-17', '1998-05-15', '1998-04-23', 3, 606.190002, 'White Clover Markets', '1029 - 12th Ave. S.', 'Seattle', 'WA', '98124', 'USA'); +INSERT INTO northwind.orders VALUES (11033, 'RICSU', 7, '1998-04-17', '1998-05-15', '1998-04-23', 3, 84.7399979, 'Richter Supermarkt', 'Starenweg 5', 'Genève', NULL, '1204', 'Switzerland'); +INSERT INTO northwind.orders VALUES (11034, 'OLDWO', 8, '1998-04-20', '1998-06-01', '1998-04-27', 1, 40.3199997, 'Old World Delicatessen', '2743 Bering St.', 'Anchorage', 'AK', '99508', 'USA'); +INSERT INTO northwind.orders VALUES (11035, 'SUPRD', 2, '1998-04-20', '1998-05-18', '1998-04-24', 2, 0.170000002, 'Suprêmes délices', 'Boulevard Tirou, 255', 'Charleroi', NULL, 'B-6000', 'Belgium'); +INSERT INTO northwind.orders VALUES (11036, 'DRACD', 8, '1998-04-20', '1998-05-18', '1998-04-22', 3, 149.470001, 'Drachenblut Delikatessen', 'Walserweg 21', 'Aachen', NULL, '52066', 'Germany'); +INSERT INTO northwind.orders VALUES (11037, 'GODOS', 7, '1998-04-21', '1998-05-19', '1998-04-27', 1, 3.20000005, 'Godos Cocina Típica', 'C/ Romero, 33', 'Sevilla', NULL, '41101', 'Spain'); +INSERT INTO northwind.orders VALUES (11040, 'GREAL', 4, '1998-04-22', '1998-05-20', NULL, 3, 18.8400002, 'Great Lakes Food Market', '2732 Baker Blvd.', 'Eugene', 'OR', '97403', 'USA'); +INSERT INTO northwind.orders VALUES (11041, 'CHOPS', 3, '1998-04-22', '1998-05-20', '1998-04-28', 2, 48.2200012, 'Chop-suey Chinese', 'Hauptstr. 31', 'Bern', NULL, '3012', 'Switzerland'); +INSERT INTO northwind.orders VALUES (11042, 'COMMI', 2, '1998-04-22', '1998-05-06', '1998-05-01', 1, 29.9899998, 'Comércio Mineiro', 'Av. dos Lusíadas, 23', 'Sao Paulo', 'SP', '05432-043', 'Brazil'); +INSERT INTO northwind.orders VALUES (11043, 'SPECD', 5, '1998-04-22', '1998-05-20', '1998-04-29', 2, 8.80000019, 'Spécialités du monde', '25, rue Lauriston', 'Paris', NULL, '75016', 'France'); +INSERT INTO northwind.orders VALUES (11044, 'WOLZA', 4, '1998-04-23', '1998-05-21', '1998-05-01', 1, 8.72000027, 'Wolski Zajazd', 'ul. Filtrowa 68', 'Warszawa', NULL, '01-012', 'Poland'); +INSERT INTO northwind.orders VALUES (11045, 'BOTTM', 6, '1998-04-23', '1998-05-21', NULL, 2, 70.5800018, 'Bottom-Dollar Markets', '23 Tsawassen Blvd.', 'Tsawassen', 'BC', 'T2F 8M4', 'Canada'); +INSERT INTO northwind.orders VALUES (11046, 'WANDK', 8, '1998-04-23', '1998-05-21', '1998-04-24', 2, 71.6399994, 'Die Wandernde Kuh', 'Adenauerallee 900', 'Stuttgart', NULL, '70563', 'Germany'); +INSERT INTO northwind.orders VALUES (11047, 'EASTC', 7, '1998-04-24', '1998-05-22', '1998-05-01', 3, 46.6199989, 'Eastern Connection', '35 King George', 'London', NULL, 'WX3 6FW', 'UK'); +INSERT INTO northwind.orders VALUES (11048, 'BOTTM', 7, '1998-04-24', '1998-05-22', '1998-04-30', 3, 24.1200008, 'Bottom-Dollar Markets', '23 Tsawassen Blvd.', 'Tsawassen', 'BC', 'T2F 8M4', 'Canada'); +INSERT INTO northwind.orders VALUES (11049, 'GOURL', 3, '1998-04-24', '1998-05-22', '1998-05-04', 1, 8.34000015, 'Gourmet Lanchonetes', 'Av. Brasil, 442', 'Campinas', 'SP', '04876-786', 'Brazil'); +INSERT INTO northwind.orders VALUES (11050, 'FOLKO', 8, '1998-04-27', '1998-05-25', '1998-05-05', 2, 59.4099998, 'Folk och fä HB', 'Åkergatan 24', 'Bräcke', NULL, 'S-844 67', 'Sweden'); +INSERT INTO northwind.orders VALUES (11051, 'LAMAI', 7, '1998-04-27', '1998-05-25', NULL, 3, 2.78999996, 'La maison d''Asie', '1 rue Alsace-Lorraine', 'Toulouse', NULL, '31000', 'France'); +INSERT INTO northwind.orders VALUES (11052, 'HANAR', 3, '1998-04-27', '1998-05-25', '1998-05-01', 1, 67.2600021, 'Hanari Carnes', 'Rua do Paço, 67', 'Rio de Janeiro', 'RJ', '05454-876', 'Brazil'); +INSERT INTO northwind.orders VALUES (11053, 'PICCO', 2, '1998-04-27', '1998-05-25', '1998-04-29', 2, 53.0499992, 'Piccolo und mehr', 'Geislweg 14', 'Salzburg', NULL, '5020', 'Austria'); +INSERT INTO northwind.orders VALUES (11054, 'CACTU', 8, '1998-04-28', '1998-05-26', NULL, 1, 0.330000013, 'Cactus Comidas para llevar', 'Cerrito 333', 'Buenos Aires', NULL, '1010', 'Argentina'); +INSERT INTO northwind.orders VALUES (11055, 'HILAA', 7, '1998-04-28', '1998-05-26', '1998-05-05', 2, 120.919998, 'HILARION-Abastos', 'Carrera 22 con Ave. Carlos Soublette #8-35', 'San Cristóbal', 'Táchira', '5022', 'Venezuela'); +INSERT INTO northwind.orders VALUES (11056, 'EASTC', 8, '1998-04-28', '1998-05-12', '1998-05-01', 2, 278.959991, 'Eastern Connection', '35 King George', 'London', NULL, 'WX3 6FW', 'UK'); +INSERT INTO northwind.orders VALUES (11057, 'NORTS', 3, '1998-04-29', '1998-05-27', '1998-05-01', 3, 4.13000011, 'North/South', 'South House 300 Queensbridge', 'London', NULL, 'SW7 1RZ', 'UK'); +INSERT INTO northwind.orders VALUES (11058, 'BLAUS', 9, '1998-04-29', '1998-05-27', NULL, 3, 31.1399994, 'Blauer See Delikatessen', 'Forsterstr. 57', 'Mannheim', NULL, '68306', 'Germany'); +INSERT INTO northwind.orders VALUES (11059, 'RICAR', 2, '1998-04-29', '1998-06-10', NULL, 2, 85.8000031, 'Ricardo Adocicados', 'Av. Copacabana, 267', 'Rio de Janeiro', 'RJ', '02389-890', 'Brazil'); +INSERT INTO northwind.orders VALUES (11060, 'FRANS', 2, '1998-04-30', '1998-05-28', '1998-05-04', 2, 10.9799995, 'Franchi S.p.A.', 'Via Monte Bianco 34', 'Torino', NULL, '10100', 'Italy'); +INSERT INTO northwind.orders VALUES (11061, 'GREAL', 4, '1998-04-30', '1998-06-11', NULL, 3, 14.0100002, 'Great Lakes Food Market', '2732 Baker Blvd.', 'Eugene', 'OR', '97403', 'USA'); +INSERT INTO northwind.orders VALUES (10364, 'EASTC', 1, '1996-11-26', '1997-01-07', '1996-12-04', 1, 71.9700012, 'Eastern Connection', '35 King George', 'London', NULL, 'WX3 6FW', 'UK'); +INSERT INTO northwind.orders VALUES (11062, 'REGGC', 4, '1998-04-30', '1998-05-28', NULL, 2, 29.9300003, 'Reggiani Caseifici', 'Strada Provinciale 124', 'Reggio Emilia', NULL, '42100', 'Italy'); +INSERT INTO northwind.orders VALUES (11063, 'HUNGO', 3, '1998-04-30', '1998-05-28', '1998-05-06', 2, 81.7300034, 'Hungry Owl All-Night Grocers', '8 Johnstown Road', 'Cork', 'Co. Cork', NULL, 'Ireland'); +INSERT INTO northwind.orders VALUES (11065, 'LILAS', 8, '1998-05-01', '1998-05-29', NULL, 1, 12.9099998, 'LILA-Supermercado', 'Carrera 52 con Ave. Bolívar #65-98 Llano Largo', 'Barquisimeto', 'Lara', '3508', 'Venezuela'); +INSERT INTO northwind.orders VALUES (11066, 'WHITC', 7, '1998-05-01', '1998-05-29', '1998-05-04', 2, 44.7200012, 'White Clover Markets', '1029 - 12th Ave. S.', 'Seattle', 'WA', '98124', 'USA'); +INSERT INTO northwind.orders VALUES (11068, 'QUEEN', 8, '1998-05-04', '1998-06-01', NULL, 2, 81.75, 'Queen Cozinha', 'Alameda dos Canàrios, 891', 'Sao Paulo', 'SP', '05487-020', 'Brazil'); +INSERT INTO northwind.orders VALUES (11070, 'LEHMS', 2, '1998-05-05', '1998-06-02', NULL, 1, 136, 'Lehmanns Marktstand', 'Magazinweg 7', 'Frankfurt a.M.', NULL, '60528', 'Germany'); +INSERT INTO northwind.orders VALUES (11072, 'ERNSH', 4, '1998-05-05', '1998-06-02', NULL, 2, 258.640015, 'Ernst Handel', 'Kirchgasse 6', 'Graz', NULL, '8010', 'Austria'); +INSERT INTO northwind.orders VALUES (11073, 'PERIC', 2, '1998-05-05', '1998-06-02', NULL, 2, 24.9500008, 'Pericles Comidas clásicas', 'Calle Dr. Jorge Cash 321', 'México D.F.', NULL, '05033', 'Mexico'); +INSERT INTO northwind.orders VALUES (11074, 'SIMOB', 7, '1998-05-06', '1998-06-03', NULL, 2, 18.4400005, 'Simons bistro', 'Vinbæltet 34', 'Kobenhavn', NULL, '1734', 'Denmark'); +INSERT INTO northwind.orders VALUES (11075, 'RICSU', 8, '1998-05-06', '1998-06-03', NULL, 2, 6.19000006, 'Richter Supermarkt', 'Starenweg 5', 'Genève', NULL, '1204', 'Switzerland'); +INSERT INTO northwind.orders VALUES (11076, 'BONAP', 4, '1998-05-06', '1998-06-03', NULL, 2, 38.2799988, 'Bon app''', '12, rue des Bouchers', 'Marseille', NULL, '13008', 'France'); +INSERT INTO northwind.orders VALUES (10371, 'LAMAI', 1, '1996-12-03', '1996-12-31', '1996-12-24', 1, 0.449999988, 'La maison d''Asie', '1 rue Alsace-Lorraine', 'Toulouse', NULL, '31000', 'France'); +INSERT INTO northwind.orders VALUES (10374, 'WOLZA', 1, '1996-12-05', '1997-01-02', '1996-12-09', 3, 3.94000006, 'Wolski Zajazd', 'ul. Filtrowa 68', 'Warszawa', NULL, '01-012', 'Poland'); +INSERT INTO northwind.orders VALUES (10376, 'MEREP', 1, '1996-12-09', '1997-01-06', '1996-12-13', 2, 20.3899994, 'Mère Paillarde', '43 rue St. Laurent', 'Montréal', 'Québec', 'H1J 1C3', 'Canada'); +INSERT INTO northwind.orders VALUES (10377, 'SEVES', 1, '1996-12-09', '1997-01-06', '1996-12-13', 3, 22.2099991, 'Seven Seas Imports', '90 Wadhurst Rd.', 'London', NULL, 'OX15 4NB', 'UK'); +INSERT INTO northwind.orders VALUES (10385, 'SPLIR', 1, '1996-12-17', '1997-01-14', '1996-12-23', 2, 30.9599991, 'Split Rail Beer & Ale', 'P.O. Box 555', 'Lander', 'WY', '82520', 'USA'); +INSERT INTO northwind.orders VALUES (10387, 'SANTG', 1, '1996-12-18', '1997-01-15', '1996-12-20', 2, 93.6299973, 'Santé Gourmet', 'Erling Skakkes gate 78', 'Stavern', NULL, '4110', 'Norway'); +INSERT INTO northwind.orders VALUES (10393, 'SAVEA', 1, '1996-12-25', '1997-01-22', '1997-01-03', 3, 126.559998, 'Save-a-lot Markets', '187 Suffolk Ln.', 'Boise', 'ID', '83720', 'USA'); +INSERT INTO northwind.orders VALUES (10394, 'HUNGC', 1, '1996-12-25', '1997-01-22', '1997-01-03', 3, 30.3400002, 'Hungry Coyote Import Store', 'City Center Plaza 516 Main St.', 'Elgin', 'OR', '97827', 'USA'); +INSERT INTO northwind.orders VALUES (10396, 'FRANK', 1, '1996-12-27', '1997-01-10', '1997-01-06', 3, 135.350006, 'Frankenversand', 'Berliner Platz 43', 'München', NULL, '80805', 'Germany'); +INSERT INTO northwind.orders VALUES (10400, 'EASTC', 1, '1997-01-01', '1997-01-29', '1997-01-16', 3, 83.9300003, 'Eastern Connection', '35 King George', 'London', NULL, 'WX3 6FW', 'UK'); +INSERT INTO northwind.orders VALUES (10401, 'RATTC', 1, '1997-01-01', '1997-01-29', '1997-01-10', 1, 12.5100002, 'Rattlesnake Canyon Grocery', '2817 Milton Dr.', 'Albuquerque', 'NM', '87110', 'USA'); +INSERT INTO northwind.orders VALUES (10405, 'LINOD', 1, '1997-01-06', '1997-02-03', '1997-01-22', 1, 34.8199997, 'LINO-Delicateses', 'Ave. 5 de Mayo Porlamar', 'I. de Margarita', 'Nueva Esparta', '4980', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10453, 'AROUT', 1, '1997-02-21', '1997-03-21', '1997-02-26', 2, 25.3600006, 'Around the Horn', 'Brook Farm Stratford St. Mary', 'Colchester', 'Essex', 'CO7 6JX', 'UK'); +INSERT INTO northwind.orders VALUES (10461, 'LILAS', 1, '1997-02-28', '1997-03-28', '1997-03-05', 3, 148.610001, 'LILA-Supermercado', 'Carrera 52 con Ave. Bolívar #65-98 Llano Largo', 'Barquisimeto', 'Lara', '3508', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10465, 'VAFFE', 1, '1997-03-05', '1997-04-02', '1997-03-14', 3, 145.039993, 'Vaffeljernet', 'Smagsloget 45', 'Århus', NULL, '8200', 'Denmark'); +INSERT INTO northwind.orders VALUES (10469, 'WHITC', 1, '1997-03-10', '1997-04-07', '1997-03-14', 1, 60.1800003, 'White Clover Markets', '1029 - 12th Ave. S.', 'Seattle', 'WA', '98124', 'USA'); +INSERT INTO northwind.orders VALUES (10473, 'ISLAT', 1, '1997-03-13', '1997-03-27', '1997-03-21', 3, 16.3700008, 'Island Trading', 'Garden House Crowther Way', 'Cowes', 'Isle of Wight', 'PO31 7PJ', 'UK'); +INSERT INTO northwind.orders VALUES (10482, 'LAZYK', 1, '1997-03-21', '1997-04-18', '1997-04-10', 3, 7.48000002, 'Lazy K Kountry Store', '12 Orchestra Terrace', 'Walla Walla', 'WA', '99362', 'USA'); +INSERT INTO northwind.orders VALUES (10486, 'HILAA', 1, '1997-03-26', '1997-04-23', '1997-04-02', 2, 30.5300007, 'HILARION-Abastos', 'Carrera 22 con Ave. Carlos Soublette #8-35', 'San Cristóbal', 'Táchira', '5022', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10508, 'OTTIK', 1, '1997-04-16', '1997-05-14', '1997-05-13', 2, 4.98999977, 'Ottilies Käseladen', 'Mehrheimerstr. 369', 'Köln', NULL, '50739', 'Germany'); +INSERT INTO northwind.orders VALUES (10524, 'BERGS', 1, '1997-05-01', '1997-05-29', '1997-05-07', 2, 244.789993, 'Berglunds snabbköp', 'Berguvsvägen 8', 'Luleå', NULL, 'S-958 22', 'Sweden'); +INSERT INTO northwind.orders VALUES (10525, 'BONAP', 1, '1997-05-02', '1997-05-30', '1997-05-23', 2, 11.0600004, 'Bon app''', '12, rue des Bouchers', 'Marseille', NULL, '13008', 'France'); +INSERT INTO northwind.orders VALUES (10537, 'RICSU', 1, '1997-05-14', '1997-05-28', '1997-05-19', 1, 78.8499985, 'Richter Supermarkt', 'Starenweg 5', 'Genève', NULL, '1204', 'Switzerland'); +INSERT INTO northwind.orders VALUES (10542, 'KOENE', 1, '1997-05-20', '1997-06-17', '1997-05-26', 3, 10.9499998, 'Königlich Essen', 'Maubelstr. 90', 'Brandenburg', NULL, '14776', 'Germany'); +INSERT INTO northwind.orders VALUES (10546, 'VICTE', 1, '1997-05-23', '1997-06-20', '1997-05-27', 3, 194.720001, 'Victuailles en stock', '2, rue du Commerce', 'Lyon', NULL, '69004', 'France'); +INSERT INTO northwind.orders VALUES (10558, 'AROUT', 1, '1997-06-04', '1997-07-02', '1997-06-10', 2, 72.9700012, 'Around the Horn', 'Brook Farm Stratford St. Mary', 'Colchester', 'Essex', 'CO7 6JX', 'UK'); +INSERT INTO northwind.orders VALUES (10562, 'REGGC', 1, '1997-06-09', '1997-07-07', '1997-06-12', 1, 22.9500008, 'Reggiani Caseifici', 'Strada Provinciale 124', 'Reggio Emilia', NULL, '42100', 'Italy'); +INSERT INTO northwind.orders VALUES (10567, 'HUNGO', 1, '1997-06-12', '1997-07-10', '1997-06-17', 1, 33.9700012, 'Hungry Owl All-Night Grocers', '8 Johnstown Road', 'Cork', 'Co. Cork', NULL, 'Ireland'); +INSERT INTO northwind.orders VALUES (10579, 'LETSS', 1, '1997-06-25', '1997-07-23', '1997-07-04', 2, 13.7299995, 'Let''s Stop N Shop', '87 Polk St. Suite 5', 'San Francisco', 'CA', '94117', 'USA'); +INSERT INTO northwind.orders VALUES (10587, 'QUEDE', 1, '1997-07-02', '1997-07-30', '1997-07-09', 1, 62.5200005, 'Que Delícia', 'Rua da Panificadora, 12', 'Rio de Janeiro', 'RJ', '02389-673', 'Brazil'); +INSERT INTO northwind.orders VALUES (10591, 'VAFFE', 1, '1997-07-07', '1997-07-21', '1997-07-16', 1, 55.9199982, 'Vaffeljernet', 'Smagsloget 45', 'Århus', NULL, '8200', 'Denmark'); +INSERT INTO northwind.orders VALUES (10598, 'RATTC', 1, '1997-07-14', '1997-08-11', '1997-07-18', 3, 44.4199982, 'Rattlesnake Canyon Grocery', '2817 Milton Dr.', 'Albuquerque', 'NM', '87110', 'USA'); +INSERT INTO northwind.orders VALUES (10604, 'FURIB', 1, '1997-07-18', '1997-08-15', '1997-07-29', 1, 7.46000004, 'Furia Bacalhau e Frutos do Mar', 'Jardim das rosas n. 32', 'Lisboa', NULL, '1675', 'Portugal'); +INSERT INTO northwind.orders VALUES (10605, 'MEREP', 1, '1997-07-21', '1997-08-18', '1997-07-29', 2, 379.130005, 'Mère Paillarde', '43 rue St. Laurent', 'Montréal', 'Québec', 'H1J 1C3', 'Canada'); +INSERT INTO northwind.orders VALUES (10612, 'SAVEA', 1, '1997-07-28', '1997-08-25', '1997-08-01', 2, 544.080017, 'Save-a-lot Markets', '187 Suffolk Ln.', 'Boise', 'ID', '83720', 'USA'); +INSERT INTO northwind.orders VALUES (10616, 'GREAL', 1, '1997-07-31', '1997-08-28', '1997-08-05', 2, 116.529999, 'Great Lakes Food Market', '2732 Baker Blvd.', 'Eugene', 'OR', '97403', 'USA'); +INSERT INTO northwind.orders VALUES (10618, 'MEREP', 1, '1997-08-01', '1997-09-12', '1997-08-08', 1, 154.679993, 'Mère Paillarde', '43 rue St. Laurent', 'Montréal', 'Québec', 'H1J 1C3', 'Canada'); +INSERT INTO northwind.orders VALUES (10626, 'BERGS', 1, '1997-08-11', '1997-09-08', '1997-08-20', 2, 138.690002, 'Berglunds snabbköp', 'Berguvsvägen 8', 'Luleå', NULL, 'S-958 22', 'Sweden'); +INSERT INTO northwind.orders VALUES (10630, 'KOENE', 1, '1997-08-13', '1997-09-10', '1997-08-19', 2, 32.3499985, 'Königlich Essen', 'Maubelstr. 90', 'Brandenburg', NULL, '14776', 'Germany'); +INSERT INTO northwind.orders VALUES (10653, 'FRANK', 1, '1997-09-02', '1997-09-30', '1997-09-19', 1, 93.25, 'Frankenversand', 'Berliner Platz 43', 'München', NULL, '80805', 'Germany'); +INSERT INTO northwind.orders VALUES (10655, 'REGGC', 1, '1997-09-03', '1997-10-01', '1997-09-11', 2, 4.40999985, 'Reggiani Caseifici', 'Strada Provinciale 124', 'Reggio Emilia', NULL, '42100', 'Italy'); +INSERT INTO northwind.orders VALUES (10664, 'FURIB', 1, '1997-09-10', '1997-10-08', '1997-09-19', 3, 1.26999998, 'Furia Bacalhau e Frutos do Mar', 'Jardim das rosas n. 32', 'Lisboa', NULL, '1675', 'Portugal'); +INSERT INTO northwind.orders VALUES (10665, 'LONEP', 1, '1997-09-11', '1997-10-09', '1997-09-17', 2, 26.3099995, 'Lonesome Pine Restaurant', '89 Chiaroscuro Rd.', 'Portland', 'OR', '97219', 'USA'); +INSERT INTO northwind.orders VALUES (10668, 'WANDK', 1, '1997-09-15', '1997-10-13', '1997-09-23', 2, 47.2200012, 'Die Wandernde Kuh', 'Adenauerallee 900', 'Stuttgart', NULL, '70563', 'Germany'); +INSERT INTO northwind.orders VALUES (10671, 'FRANR', 1, '1997-09-17', '1997-10-15', '1997-09-24', 1, 30.3400002, 'France restauration', '54, rue Royale', 'Nantes', NULL, '44000', 'France'); +INSERT INTO northwind.orders VALUES (10677, 'ANTON', 1, '1997-09-22', '1997-10-20', '1997-09-26', 3, 4.03000021, 'Antonio Moreno Taquería', 'Mataderos 2312', 'México D.F.', NULL, '05023', 'Mexico'); +INSERT INTO northwind.orders VALUES (10680, 'OLDWO', 1, '1997-09-24', '1997-10-22', '1997-09-26', 1, 26.6100006, 'Old World Delicatessen', '2743 Bering St.', 'Anchorage', 'AK', '99508', 'USA'); +INSERT INTO northwind.orders VALUES (10689, 'BERGS', 1, '1997-10-01', '1997-10-29', '1997-10-07', 2, 13.4200001, 'Berglunds snabbköp', 'Berguvsvägen 8', 'Luleå', NULL, 'S-958 22', 'Sweden'); +INSERT INTO northwind.orders VALUES (10690, 'HANAR', 1, '1997-10-02', '1997-10-30', '1997-10-03', 1, 15.8000002, 'Hanari Carnes', 'Rua do Paço, 67', 'Rio de Janeiro', 'RJ', '05454-876', 'Brazil'); +INSERT INTO northwind.orders VALUES (10709, 'GOURL', 1, '1997-10-17', '1997-11-14', '1997-11-20', 3, 210.800003, 'Gourmet Lanchonetes', 'Av. Brasil, 442', 'Campinas', 'SP', '04876-786', 'Brazil'); +INSERT INTO northwind.orders VALUES (10710, 'FRANS', 1, '1997-10-20', '1997-11-17', '1997-10-23', 1, 4.98000002, 'Franchi S.p.A.', 'Via Monte Bianco 34', 'Torino', NULL, '10100', 'Italy'); +INSERT INTO northwind.orders VALUES (10713, 'SAVEA', 1, '1997-10-22', '1997-11-19', '1997-10-24', 1, 167.050003, 'Save-a-lot Markets', '187 Suffolk Ln.', 'Boise', 'ID', '83720', 'USA'); +INSERT INTO northwind.orders VALUES (10717, 'FRANK', 1, '1997-10-24', '1997-11-21', '1997-10-29', 2, 59.25, 'Frankenversand', 'Berliner Platz 43', 'München', NULL, '80805', 'Germany'); +INSERT INTO northwind.orders VALUES (10718, 'KOENE', 1, '1997-10-27', '1997-11-24', '1997-10-29', 3, 170.880005, 'Königlich Essen', 'Maubelstr. 90', 'Brandenburg', NULL, '14776', 'Germany'); +INSERT INTO northwind.orders VALUES (10733, 'BERGS', 1, '1997-11-07', '1997-12-05', '1997-11-10', 3, 110.110001, 'Berglunds snabbköp', 'Berguvsvägen 8', 'Luleå', NULL, 'S-958 22', 'Sweden'); +INSERT INTO northwind.orders VALUES (10743, 'AROUT', 1, '1997-11-17', '1997-12-15', '1997-11-21', 2, 23.7199993, 'Around the Horn', 'Brook Farm Stratford St. Mary', 'Colchester', 'Essex', 'CO7 6JX', 'UK'); +INSERT INTO northwind.orders VALUES (10746, 'CHOPS', 1, '1997-11-19', '1997-12-17', '1997-11-21', 3, 31.4300003, 'Chop-suey Chinese', 'Hauptstr. 31', 'Bern', NULL, '3012', 'Switzerland'); +INSERT INTO northwind.orders VALUES (10773, 'ERNSH', 1, '1997-12-11', '1998-01-08', '1997-12-16', 3, 96.4300003, 'Ernst Handel', 'Kirchgasse 6', 'Graz', NULL, '8010', 'Austria'); +INSERT INTO northwind.orders VALUES (10776, 'ERNSH', 1, '1997-12-15', '1998-01-12', '1997-12-18', 3, 351.529999, 'Ernst Handel', 'Kirchgasse 6', 'Graz', NULL, '8010', 'Austria'); +INSERT INTO northwind.orders VALUES (10785, 'GROSR', 1, '1997-12-18', '1998-01-15', '1997-12-24', 3, 1.50999999, 'GROSELLA-Restaurante', '5ª Ave. Los Palos Grandes', 'Caracas', 'DF', '1081', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10788, 'QUICK', 1, '1997-12-22', '1998-01-19', '1998-01-19', 2, 42.7000008, 'QUICK-Stop', 'Taucherstraße 10', 'Cunewalde', NULL, '01307', 'Germany'); +INSERT INTO northwind.orders VALUES (10789, 'FOLIG', 1, '1997-12-22', '1998-01-19', '1997-12-31', 2, 100.599998, 'Folies gourmandes', '184, chaussée de Tournai', 'Lille', NULL, '59000', 'France'); +INSERT INTO northwind.orders VALUES (10792, 'WOLZA', 1, '1997-12-23', '1998-01-20', '1997-12-31', 3, 23.7900009, 'Wolski Zajazd', 'ul. Filtrowa 68', 'Warszawa', NULL, '01-012', 'Poland'); +INSERT INTO northwind.orders VALUES (10800, 'SEVES', 1, '1997-12-26', '1998-01-23', '1998-01-05', 3, 137.440002, 'Seven Seas Imports', '90 Wadhurst Rd.', 'London', NULL, 'OX15 4NB', 'UK'); +INSERT INTO northwind.orders VALUES (10813, 'RICAR', 1, '1998-01-05', '1998-02-02', '1998-01-09', 1, 47.3800011, 'Ricardo Adocicados', 'Av. Copacabana, 267', 'Rio de Janeiro', 'RJ', '02389-890', 'Brazil'); +INSERT INTO northwind.orders VALUES (10821, 'SPLIR', 1, '1998-01-08', '1998-02-05', '1998-01-15', 1, 36.6800003, 'Split Rail Beer & Ale', 'P.O. Box 555', 'Lander', 'WY', '82520', 'USA'); +INSERT INTO northwind.orders VALUES (10825, 'DRACD', 1, '1998-01-09', '1998-02-06', '1998-01-14', 1, 79.25, 'Drachenblut Delikatessen', 'Walserweg 21', 'Aachen', NULL, '52066', 'Germany'); +INSERT INTO northwind.orders VALUES (10827, 'BONAP', 1, '1998-01-12', '1998-01-26', '1998-02-06', 2, 63.5400009, 'Bon app''', '12, rue des Bouchers', 'Marseille', NULL, '13008', 'France'); +INSERT INTO northwind.orders VALUES (10834, 'TRADH', 1, '1998-01-15', '1998-02-12', '1998-01-19', 3, 29.7800007, 'Tradiçao Hipermercados', 'Av. Inês de Castro, 414', 'Sao Paulo', 'SP', '05634-030', 'Brazil'); +INSERT INTO northwind.orders VALUES (10835, 'ALFKI', 1, '1998-01-15', '1998-02-12', '1998-01-21', 3, 69.5299988, 'Alfred''s Futterkiste', 'Obere Str. 57', 'Berlin', NULL, '12209', 'Germany'); +INSERT INTO northwind.orders VALUES (10842, 'TORTU', 1, '1998-01-20', '1998-02-17', '1998-01-29', 3, 54.4199982, 'Tortuga Restaurante', 'Avda. Azteca 123', 'México D.F.', NULL, '05033', 'Mexico'); +INSERT INTO northwind.orders VALUES (10850, 'VICTE', 1, '1998-01-23', '1998-03-06', '1998-01-30', 1, 49.1899986, 'Victuailles en stock', '2, rue du Commerce', 'Lyon', NULL, '69004', 'France'); +INSERT INTO northwind.orders VALUES (10859, 'FRANK', 1, '1998-01-29', '1998-02-26', '1998-02-02', 2, 76.0999985, 'Frankenversand', 'Berliner Platz 43', 'München', NULL, '80805', 'Germany'); +INSERT INTO northwind.orders VALUES (10877, 'RICAR', 1, '1998-02-09', '1998-03-09', '1998-02-19', 1, 38.0600014, 'Ricardo Adocicados', 'Av. Copacabana, 267', 'Rio de Janeiro', 'RJ', '02389-890', 'Brazil'); +INSERT INTO northwind.orders VALUES (10886, 'HANAR', 1, '1998-02-13', '1998-03-13', '1998-03-02', 1, 4.98999977, 'Hanari Carnes', 'Rua do Paço, 67', 'Rio de Janeiro', 'RJ', '05454-876', 'Brazil'); +INSERT INTO northwind.orders VALUES (10888, 'GODOS', 1, '1998-02-16', '1998-03-16', '1998-02-23', 2, 51.8699989, 'Godos Cocina Típica', 'C/ Romero, 33', 'Sevilla', NULL, '41101', 'Spain'); +INSERT INTO northwind.orders VALUES (10894, 'SAVEA', 1, '1998-02-18', '1998-03-18', '1998-02-20', 1, 116.129997, 'Save-a-lot Markets', '187 Suffolk Ln.', 'Boise', 'ID', '83720', 'USA'); +INSERT INTO northwind.orders VALUES (10900, 'WELLI', 1, '1998-02-20', '1998-03-20', '1998-03-04', 2, 1.65999997, 'Wellington Importadora', 'Rua do Mercado, 12', 'Resende', 'SP', '08737-363', 'Brazil'); +INSERT INTO northwind.orders VALUES (10902, 'FOLKO', 1, '1998-02-23', '1998-03-23', '1998-03-03', 1, 44.1500015, 'Folk och fä HB', 'Åkergatan 24', 'Bräcke', NULL, 'S-844 67', 'Sweden'); +INSERT INTO northwind.orders VALUES (10909, 'SANTG', 1, '1998-02-26', '1998-03-26', '1998-03-10', 2, 53.0499992, 'Santé Gourmet', 'Erling Skakkes gate 78', 'Stavern', NULL, '4110', 'Norway'); +INSERT INTO northwind.orders VALUES (10910, 'WILMK', 1, '1998-02-26', '1998-03-26', '1998-03-04', 3, 38.1100006, 'Wilman Kala', 'Keskuskatu 45', 'Helsinki', NULL, '21240', 'Finland'); +INSERT INTO northwind.orders VALUES (10916, 'RANCH', 1, '1998-02-27', '1998-03-27', '1998-03-09', 2, 63.7700005, 'Rancho grande', 'Av. del Libertador 900', 'Buenos Aires', NULL, '1010', 'Argentina'); +INSERT INTO northwind.orders VALUES (10921, 'VAFFE', 1, '1998-03-03', '1998-04-14', '1998-03-09', 1, 176.479996, 'Vaffeljernet', 'Smagsloget 45', 'Århus', NULL, '8200', 'Denmark'); +INSERT INTO northwind.orders VALUES (10928, 'GALED', 1, '1998-03-05', '1998-04-02', '1998-03-18', 1, 1.36000001, 'Galería del gastronómo', 'Rambla de Cataluña, 23', 'Barcelona', NULL, '8022', 'Spain'); +INSERT INTO northwind.orders VALUES (10946, 'VAFFE', 1, '1998-03-12', '1998-04-09', '1998-03-19', 2, 27.2000008, 'Vaffeljernet', 'Smagsloget 45', 'Århus', NULL, '8200', 'Denmark'); +INSERT INTO northwind.orders VALUES (10950, 'MAGAA', 1, '1998-03-16', '1998-04-13', '1998-03-23', 2, 2.5, 'Magazzini Alimentari Riuniti', 'Via Ludovico il Moro 22', 'Bergamo', NULL, '24100', 'Italy'); +INSERT INTO northwind.orders VALUES (10952, 'ALFKI', 1, '1998-03-16', '1998-04-27', '1998-03-24', 1, 40.4199982, 'Alfred''s Futterkiste', 'Obere Str. 57', 'Berlin', NULL, '12209', 'Germany'); +INSERT INTO northwind.orders VALUES (10968, 'ERNSH', 1, '1998-03-23', '1998-04-20', '1998-04-01', 3, 74.5999985, 'Ernst Handel', 'Kirchgasse 6', 'Graz', NULL, '8010', 'Austria'); +INSERT INTO northwind.orders VALUES (10969, 'COMMI', 1, '1998-03-23', '1998-04-20', '1998-03-30', 2, 0.209999993, 'Comércio Mineiro', 'Av. dos Lusíadas, 23', 'Sao Paulo', 'SP', '05432-043', 'Brazil'); +INSERT INTO northwind.orders VALUES (10975, 'BOTTM', 1, '1998-03-25', '1998-04-22', '1998-03-27', 3, 32.2700005, 'Bottom-Dollar Markets', '23 Tsawassen Blvd.', 'Tsawassen', 'BC', 'T2F 8M4', 'Canada'); +INSERT INTO northwind.orders VALUES (10976, 'HILAA', 1, '1998-03-25', '1998-05-06', '1998-04-03', 1, 37.9700012, 'HILARION-Abastos', 'Carrera 22 con Ave. Carlos Soublette #8-35', 'San Cristóbal', 'Táchira', '5022', 'Venezuela'); +INSERT INTO northwind.orders VALUES (10981, 'HANAR', 1, '1998-03-27', '1998-04-24', '1998-04-02', 2, 193.369995, 'Hanari Carnes', 'Rua do Paço, 67', 'Rio de Janeiro', 'RJ', '05454-876', 'Brazil'); +INSERT INTO northwind.orders VALUES (10984, 'SAVEA', 1, '1998-03-30', '1998-04-27', '1998-04-03', 3, 211.220001, 'Save-a-lot Markets', '187 Suffolk Ln.', 'Boise', 'ID', '83720', 'USA'); +INSERT INTO northwind.orders VALUES (10991, 'QUICK', 1, '1998-04-01', '1998-04-29', '1998-04-07', 1, 38.5099983, 'QUICK-Stop', 'Taucherstraße 10', 'Cunewalde', NULL, '01307', 'Germany'); +INSERT INTO northwind.orders VALUES (10992, 'THEBI', 1, '1998-04-01', '1998-04-29', '1998-04-03', 3, 4.26999998, 'The Big Cheese', '89 Jefferson Way Suite 2', 'Portland', 'OR', '97201', 'USA'); +INSERT INTO northwind.orders VALUES (10995, 'PERIC', 1, '1998-04-02', '1998-04-30', '1998-04-06', 3, 46, 'Pericles Comidas clásicas', 'Calle Dr. Jorge Cash 321', 'México D.F.', NULL, '05033', 'Mexico'); +INSERT INTO northwind.orders VALUES (11012, 'FRANK', 1, '1998-04-09', '1998-04-23', '1998-04-17', 3, 242.949997, 'Frankenversand', 'Berliner Platz 43', 'München', NULL, '80805', 'Germany'); +INSERT INTO northwind.orders VALUES (11023, 'BSBEV', 1, '1998-04-14', '1998-04-28', '1998-04-24', 2, 123.830002, 'B''s Beverages', 'Fauntleroy Circus', 'London', NULL, 'EC2 5NT', 'UK'); +INSERT INTO northwind.orders VALUES (11027, 'BOTTM', 1, '1998-04-16', '1998-05-14', '1998-04-20', 1, 52.5200005, 'Bottom-Dollar Markets', '23 Tsawassen Blvd.', 'Tsawassen', 'BC', 'T2F 8M4', 'Canada'); +INSERT INTO northwind.orders VALUES (11038, 'SUPRD', 1, '1998-04-21', '1998-05-19', '1998-04-30', 2, 29.5900002, 'Suprêmes délices', 'Boulevard Tirou, 255', 'Charleroi', NULL, 'B-6000', 'Belgium'); +INSERT INTO northwind.orders VALUES (11039, 'LINOD', 1, '1998-04-21', '1998-05-19', NULL, 2, 65, 'LINO-Delicateses', 'Ave. 5 de Mayo Porlamar', 'I. de Margarita', 'Nueva Esparta', '4980', 'Venezuela'); +INSERT INTO northwind.orders VALUES (11064, 'SAVEA', 1, '1998-05-01', '1998-05-29', '1998-05-04', 1, 30.0900002, 'Save-a-lot Markets', '187 Suffolk Ln.', 'Boise', 'ID', '83720', 'USA'); +INSERT INTO northwind.orders VALUES (11067, 'DRACD', 1, '1998-05-04', '1998-05-18', '1998-05-06', 2, 7.98000002, 'Drachenblut Delikatessen', 'Walserweg 21', 'Aachen', NULL, '52066', 'Germany'); +INSERT INTO northwind.orders VALUES (11069, 'TORTU', 1, '1998-05-04', '1998-06-01', '1998-05-06', 2, 15.6700001, 'Tortuga Restaurante', 'Avda. Azteca 123', 'México D.F.', NULL, '05033', 'Mexico'); +INSERT INTO northwind.orders VALUES (11071, 'LILAS', 1, '1998-05-05', '1998-06-02', NULL, 1, 0.930000007, 'LILA-Supermercado', 'Carrera 52 con Ave. Bolívar #65-98 Llano Largo', 'Barquisimeto', 'Lara', '3508', 'Venezuela'); +INSERT INTO northwind.orders VALUES (11077, 'RATTC', 1, '1998-05-06', '1998-06-03', NULL, 2, 8.52999973, 'Rattlesnake Canyon Grocery', '2817 Milton Dr.', 'Albuquerque', 'NM', '87110', 'USA'); + + +-- +-- Data for Name: suppliers; Type: TABLE DATA; Schema: northwind; Owner: northwind +-- + +INSERT INTO northwind.suppliers VALUES (1, 'Exotic Liquids', 'Charlotte Cooper', 'Purchasing Manager', '49 Gilbert St.', 'London', NULL, 'EC1 4SD', 'UK', '(171) 555-2222', NULL, NULL); +INSERT INTO northwind.suppliers VALUES (2, 'New Orleans Cajun Delights', 'Shelley Burke', 'Order Administrator', 'P.O. Box 78934', 'New Orleans', 'LA', '70117', 'USA', '(100) 555-4822', NULL, '#CAJUN.HTM#'); +INSERT INTO northwind.suppliers VALUES (3, 'Grandma Kelly''s Homestead', 'Regina Murphy', 'Sales Representative', '707 Oxford Rd.', 'Ann Arbor', 'MI', '48104', 'USA', '(313) 555-5735', '(313) 555-3349', NULL); +INSERT INTO northwind.suppliers VALUES (4, 'Tokyo Traders', 'Yoshi Nagase', 'Marketing Manager', '9-8 Sekimai Musashino-shi', 'Tokyo', NULL, '100', 'Japan', '(03) 3555-5011', NULL, NULL); +INSERT INTO northwind.suppliers VALUES (5, 'Cooperativa de Quesos ''Las Cabras''', 'Antonio del Valle Saavedra', 'Export Administrator', 'Calle del Rosal 4', 'Oviedo', 'Asturias', '33007', 'Spain', '(98) 598 76 54', NULL, NULL); +INSERT INTO northwind.suppliers VALUES (6, 'Mayumi''s', 'Mayumi Ohno', 'Marketing Representative', '92 Setsuko Chuo-ku', 'Osaka', NULL, '545', 'Japan', '(06) 431-7877', NULL, 'Mayumi''s (on the World Wide Web)#http://www.microsoft.com/accessdev/sampleapps/mayumi.htm#'); +INSERT INTO northwind.suppliers VALUES (7, 'Pavlova, Ltd.', 'Ian Devling', 'Marketing Manager', '74 Rose St. Moonie Ponds', 'Melbourne', 'Victoria', '3058', 'Australia', '(03) 444-2343', '(03) 444-6588', NULL); +INSERT INTO northwind.suppliers VALUES (8, 'Specialty Biscuits, Ltd.', 'Peter Wilson', 'Sales Representative', '29 King''s Way', 'Manchester', NULL, 'M14 GSD', 'UK', '(161) 555-4448', NULL, NULL); +INSERT INTO northwind.suppliers VALUES (9, 'PB Knäckebröd AB', 'Lars Peterson', 'Sales Agent', 'Kaloadagatan 13', 'Göteborg', NULL, 'S-345 67', 'Sweden', '031-987 65 43', '031-987 65 91', NULL); +INSERT INTO northwind.suppliers VALUES (10, 'Refrescos Americanas LTDA', 'Carlos Diaz', 'Marketing Manager', 'Av. das Americanas 12.890', 'Sao Paulo', NULL, '5442', 'Brazil', '(11) 555 4640', NULL, NULL); +INSERT INTO northwind.suppliers VALUES (11, 'Heli Süßwaren GmbH & Co. KG', 'Petra Winkler', 'Sales Manager', 'Tiergartenstraße 5', 'Berlin', NULL, '10785', 'Germany', '(010) 9984510', NULL, NULL); +INSERT INTO northwind.suppliers VALUES (12, 'Plutzer Lebensmittelgroßmärkte AG', 'Martin Bein', 'International Marketing Mgr.', 'Bogenallee 51', 'Frankfurt', NULL, '60439', 'Germany', '(069) 992755', NULL, 'Plutzer (on the World Wide Web)#http://www.microsoft.com/accessdev/sampleapps/plutzer.htm#'); +INSERT INTO northwind.suppliers VALUES (13, 'Nord-Ost-Fisch Handelsgesellschaft mbH', 'Sven Petersen', 'Coordinator Foreign Markets', 'Frahmredder 112a', 'Cuxhaven', NULL, '27478', 'Germany', '(04721) 8713', '(04721) 8714', NULL); +INSERT INTO northwind.suppliers VALUES (14, 'Formaggi Fortini s.r.l.', 'Elio Rossi', 'Sales Representative', 'Viale Dante, 75', 'Ravenna', NULL, '48100', 'Italy', '(0544) 60323', '(0544) 60603', '#FORMAGGI.HTM#'); +INSERT INTO northwind.suppliers VALUES (15, 'Norske Meierier', 'Beate Vileid', 'Marketing Manager', 'Hatlevegen 5', 'Sandvika', NULL, '1320', 'Norway', '(0)2-953010', NULL, NULL); +INSERT INTO northwind.suppliers VALUES (16, 'Bigfoot Breweries', 'Cheryl Saylor', 'Regional Account Rep.', '3400 - 8th Avenue Suite 210', 'Bend', 'OR', '97101', 'USA', '(503) 555-9931', NULL, NULL); +INSERT INTO northwind.suppliers VALUES (17, 'Svensk Sjöföda AB', 'Michael Björn', 'Sales Representative', 'Brovallavägen 231', 'Stockholm', NULL, 'S-123 45', 'Sweden', '08-123 45 67', NULL, NULL); +INSERT INTO northwind.suppliers VALUES (18, 'Aux joyeux ecclésiastiques', 'Guylène Nodier', 'Sales Manager', '203, Rue des Francs-Bourgeois', 'Paris', NULL, '75004', 'France', '(1) 03.83.00.68', '(1) 03.83.00.62', NULL); +INSERT INTO northwind.suppliers VALUES (19, 'New England Seafood Cannery', 'Robb Merchant', 'Wholesale Account Agent', 'Order Processing Dept. 2100 Paul Revere Blvd.', 'Boston', 'MA', '02134', 'USA', '(617) 555-3267', '(617) 555-3389', NULL); +INSERT INTO northwind.suppliers VALUES (20, 'Leka Trading', 'Chandra Leka', 'Owner', '471 Serangoon Loop, Suite #402', 'Singapore', NULL, '0512', 'Singapore', '555-8787', NULL, NULL); +INSERT INTO northwind.suppliers VALUES (21, 'Lyngbysild', 'Niels Petersen', 'Sales Manager', 'Lyngbysild Fiskebakken 10', 'Lyngby', NULL, '2800', 'Denmark', '43844108', '43844115', NULL); +INSERT INTO northwind.suppliers VALUES (22, 'Zaanse Snoepfabriek', 'Dirk Luchte', 'Accounting Manager', 'Verkoop Rijnweg 22', 'Zaandam', NULL, '9999 ZZ', 'Netherlands', '(12345) 1212', '(12345) 1210', NULL); +INSERT INTO northwind.suppliers VALUES (23, 'Karkki Oy', 'Anne Heikkonen', 'Product Manager', 'Valtakatu 12', 'Lappeenranta', NULL, '53120', 'Finland', '(953) 10956', NULL, NULL); +INSERT INTO northwind.suppliers VALUES (24, 'G''day, Mate', 'Wendy Mackenzie', 'Sales Representative', '170 Prince Edward Parade Hunter''s Hill', 'Sydney', 'NSW', '2042', 'Australia', '(02) 555-5914', '(02) 555-4873', 'G''day Mate (on the World Wide Web)#http://www.microsoft.com/accessdev/sampleapps/gdaymate.htm#'); +INSERT INTO northwind.suppliers VALUES (25, 'Ma Maison', 'Jean-Guy Lauzon', 'Marketing Manager', '2960 Rue St. Laurent', 'Montréal', 'Québec', 'H1J 1C3', 'Canada', '(514) 555-9022', NULL, NULL); +INSERT INTO northwind.suppliers VALUES (26, 'Pasta Buttini s.r.l.', 'Giovanni Giudici', 'Order Administrator', 'Via dei Gelsomini, 153', 'Salerno', NULL, '84100', 'Italy', '(089) 6547665', '(089) 6547667', NULL); +INSERT INTO northwind.suppliers VALUES (27, 'Escargots Nouveaux', 'Marie Delamare', 'Sales Manager', '22, rue H. Voiron', 'Montceau', NULL, '71300', 'France', '85.57.00.07', NULL, NULL); +INSERT INTO northwind.suppliers VALUES (28, 'Gai pâturage', 'Eliane Noz', 'Sales Representative', 'Bat. B 3, rue des Alpes', 'Annecy', NULL, '74000', 'France', '38.76.98.06', '38.76.98.58', NULL); +INSERT INTO northwind.suppliers VALUES (29, 'Forêts d''érables', 'Chantal Goulet', 'Accounting Manager', '148 rue Chasseur', 'Ste-Hyacinthe', 'Québec', 'J2S 7S8', 'Canada', '(514) 555-2955', '(514) 555-2921', NULL); + + +-- +-- Data for Name: products; Type: TABLE DATA; Schema: northwind; Owner: northwind +-- + +INSERT INTO northwind.products VALUES (1, 'Chai', 8, 1, '10 boxes x 30 bags', 18, 39, 0, 10, 1); +INSERT INTO northwind.products VALUES (2, 'Chang', 1, 1, '24 - 12 oz bottles', 19, 17, 40, 25, 1); +INSERT INTO northwind.products VALUES (3, 'Aniseed Syrup', 1, 2, '12 - 550 ml bottles', 10, 13, 70, 25, 0); +INSERT INTO northwind.products VALUES (4, 'Chef Anton''s Cajun Seasoning', 2, 2, '48 - 6 oz jars', 22, 53, 0, 0, 0); +INSERT INTO northwind.products VALUES (5, 'Chef Anton''s Gumbo Mix', 2, 2, '36 boxes', 21.3500004, 0, 0, 0, 1); +INSERT INTO northwind.products VALUES (6, 'Grandma''s Boysenberry Spread', 3, 2, '12 - 8 oz jars', 25, 120, 0, 25, 0); +INSERT INTO northwind.products VALUES (7, 'Uncle Bob''s Organic Dried Pears', 3, 7, '12 - 1 lb pkgs.', 30, 15, 0, 10, 0); +INSERT INTO northwind.products VALUES (8, 'Northwoods Cranberry Sauce', 3, 2, '12 - 12 oz jars', 40, 6, 0, 0, 0); +INSERT INTO northwind.products VALUES (9, 'Mishi Kobe Niku', 4, 6, '18 - 500 g pkgs.', 97, 29, 0, 0, 1); +INSERT INTO northwind.products VALUES (10, 'Ikura', 4, 8, '12 - 200 ml jars', 31, 31, 0, 0, 0); +INSERT INTO northwind.products VALUES (11, 'Queso Cabrales', 5, 4, '1 kg pkg.', 21, 22, 30, 30, 0); +INSERT INTO northwind.products VALUES (12, 'Queso Manchego La Pastora', 5, 4, '10 - 500 g pkgs.', 38, 86, 0, 0, 0); +INSERT INTO northwind.products VALUES (13, 'Konbu', 6, 8, '2 kg box', 6, 24, 0, 5, 0); +INSERT INTO northwind.products VALUES (14, 'Tofu', 6, 7, '40 - 100 g pkgs.', 23.25, 35, 0, 0, 0); +INSERT INTO northwind.products VALUES (15, 'Genen Shouyu', 6, 2, '24 - 250 ml bottles', 13, 39, 0, 5, 0); +INSERT INTO northwind.products VALUES (16, 'Pavlova', 7, 3, '32 - 500 g boxes', 17.4500008, 29, 0, 10, 0); +INSERT INTO northwind.products VALUES (17, 'Alice Mutton', 7, 6, '20 - 1 kg tins', 39, 0, 0, 0, 1); +INSERT INTO northwind.products VALUES (18, 'Carnarvon Tigers', 7, 8, '16 kg pkg.', 62.5, 42, 0, 0, 0); +INSERT INTO northwind.products VALUES (19, 'Teatime Chocolate Biscuits', 8, 3, '10 boxes x 12 pieces', 9.19999981, 25, 0, 5, 0); +INSERT INTO northwind.products VALUES (20, 'Sir Rodney''s Marmalade', 8, 3, '30 gift boxes', 81, 40, 0, 0, 0); +INSERT INTO northwind.products VALUES (21, 'Sir Rodney''s Scones', 8, 3, '24 pkgs. x 4 pieces', 10, 3, 40, 5, 0); +INSERT INTO northwind.products VALUES (22, 'Gustaf''s Knäckebröd', 9, 5, '24 - 500 g pkgs.', 21, 104, 0, 25, 0); +INSERT INTO northwind.products VALUES (23, 'Tunnbröd', 9, 5, '12 - 250 g pkgs.', 9, 61, 0, 25, 0); +INSERT INTO northwind.products VALUES (24, 'Guaraná Fantástica', 10, 1, '12 - 355 ml cans', 4.5, 20, 0, 0, 1); +INSERT INTO northwind.products VALUES (25, 'NuNuCa Nuß-Nougat-Creme', 11, 3, '20 - 450 g glasses', 14, 76, 0, 30, 0); +INSERT INTO northwind.products VALUES (26, 'Gumbär Gummibärchen', 11, 3, '100 - 250 g bags', 31.2299995, 15, 0, 0, 0); +INSERT INTO northwind.products VALUES (27, 'Schoggi Schokolade', 11, 3, '100 - 100 g pieces', 43.9000015, 49, 0, 30, 0); +INSERT INTO northwind.products VALUES (28, 'Rössle Sauerkraut', 12, 7, '25 - 825 g cans', 45.5999985, 26, 0, 0, 1); +INSERT INTO northwind.products VALUES (29, 'Thüringer Rostbratwurst', 12, 6, '50 bags x 30 sausgs.', 123.790001, 0, 0, 0, 1); +INSERT INTO northwind.products VALUES (30, 'Nord-Ost Matjeshering', 13, 8, '10 - 200 g glasses', 25.8899994, 10, 0, 15, 0); +INSERT INTO northwind.products VALUES (31, 'Gorgonzola Telino', 14, 4, '12 - 100 g pkgs', 12.5, 0, 70, 20, 0); +INSERT INTO northwind.products VALUES (32, 'Mascarpone Fabioli', 14, 4, '24 - 200 g pkgs.', 32, 9, 40, 25, 0); +INSERT INTO northwind.products VALUES (33, 'Geitost', 15, 4, '500 g', 2.5, 112, 0, 20, 0); +INSERT INTO northwind.products VALUES (34, 'Sasquatch Ale', 16, 1, '24 - 12 oz bottles', 14, 111, 0, 15, 0); +INSERT INTO northwind.products VALUES (35, 'Steeleye Stout', 16, 1, '24 - 12 oz bottles', 18, 20, 0, 15, 0); +INSERT INTO northwind.products VALUES (36, 'Inlagd Sill', 17, 8, '24 - 250 g jars', 19, 112, 0, 20, 0); +INSERT INTO northwind.products VALUES (37, 'Gravad lax', 17, 8, '12 - 500 g pkgs.', 26, 11, 50, 25, 0); +INSERT INTO northwind.products VALUES (38, 'Côte de Blaye', 18, 1, '12 - 75 cl bottles', 263.5, 17, 0, 15, 0); +INSERT INTO northwind.products VALUES (39, 'Chartreuse verte', 18, 1, '750 cc per bottle', 18, 69, 0, 5, 0); +INSERT INTO northwind.products VALUES (40, 'Boston Crab Meat', 19, 8, '24 - 4 oz tins', 18.3999996, 123, 0, 30, 0); +INSERT INTO northwind.products VALUES (41, 'Jack''s New England Clam Chowder', 19, 8, '12 - 12 oz cans', 9.64999962, 85, 0, 10, 0); +INSERT INTO northwind.products VALUES (42, 'Singaporean Hokkien Fried Mee', 20, 5, '32 - 1 kg pkgs.', 14, 26, 0, 0, 1); +INSERT INTO northwind.products VALUES (43, 'Ipoh Coffee', 20, 1, '16 - 500 g tins', 46, 17, 10, 25, 0); +INSERT INTO northwind.products VALUES (44, 'Gula Malacca', 20, 2, '20 - 2 kg bags', 19.4500008, 27, 0, 15, 0); +INSERT INTO northwind.products VALUES (45, 'Rogede sild', 21, 8, '1k pkg.', 9.5, 5, 70, 15, 0); +INSERT INTO northwind.products VALUES (46, 'Spegesild', 21, 8, '4 - 450 g glasses', 12, 95, 0, 0, 0); +INSERT INTO northwind.products VALUES (47, 'Zaanse koeken', 22, 3, '10 - 4 oz boxes', 9.5, 36, 0, 0, 0); +INSERT INTO northwind.products VALUES (48, 'Chocolade', 22, 3, '10 pkgs.', 12.75, 15, 70, 25, 0); +INSERT INTO northwind.products VALUES (49, 'Maxilaku', 23, 3, '24 - 50 g pkgs.', 20, 10, 60, 15, 0); +INSERT INTO northwind.products VALUES (50, 'Valkoinen suklaa', 23, 3, '12 - 100 g bars', 16.25, 65, 0, 30, 0); +INSERT INTO northwind.products VALUES (51, 'Manjimup Dried Apples', 24, 7, '50 - 300 g pkgs.', 53, 20, 0, 10, 0); +INSERT INTO northwind.products VALUES (52, 'Filo Mix', 24, 5, '16 - 2 kg boxes', 7, 38, 0, 25, 0); +INSERT INTO northwind.products VALUES (53, 'Perth Pasties', 24, 6, '48 pieces', 32.7999992, 0, 0, 0, 1); +INSERT INTO northwind.products VALUES (54, 'Tourtière', 25, 6, '16 pies', 7.44999981, 21, 0, 10, 0); +INSERT INTO northwind.products VALUES (55, 'Pâté chinois', 25, 6, '24 boxes x 2 pies', 24, 115, 0, 20, 0); +INSERT INTO northwind.products VALUES (56, 'Gnocchi di nonna Alice', 26, 5, '24 - 250 g pkgs.', 38, 21, 10, 30, 0); +INSERT INTO northwind.products VALUES (57, 'Ravioli Angelo', 26, 5, '24 - 250 g pkgs.', 19.5, 36, 0, 20, 0); +INSERT INTO northwind.products VALUES (58, 'Escargots de Bourgogne', 27, 8, '24 pieces', 13.25, 62, 0, 20, 0); +INSERT INTO northwind.products VALUES (59, 'Raclette Courdavault', 28, 4, '5 kg pkg.', 55, 79, 0, 0, 0); +INSERT INTO northwind.products VALUES (60, 'Camembert Pierrot', 28, 4, '15 - 300 g rounds', 34, 19, 0, 0, 0); +INSERT INTO northwind.products VALUES (61, 'Sirop d''érable', 29, 2, '24 - 500 ml bottles', 28.5, 113, 0, 25, 0); +INSERT INTO northwind.products VALUES (62, 'Tarte au sucre', 29, 3, '48 pies', 49.2999992, 17, 0, 0, 0); +INSERT INTO northwind.products VALUES (63, 'Vegie-spread', 7, 2, '15 - 625 g jars', 43.9000015, 24, 0, 5, 0); +INSERT INTO northwind.products VALUES (64, 'Wimmers gute Semmelknödel', 12, 5, '20 bags x 4 pieces', 33.25, 22, 80, 30, 0); +INSERT INTO northwind.products VALUES (65, 'Louisiana Fiery Hot Pepper Sauce', 2, 2, '32 - 8 oz bottles', 21.0499992, 76, 0, 0, 0); +INSERT INTO northwind.products VALUES (66, 'Louisiana Hot Spiced Okra', 2, 2, '24 - 8 oz jars', 17, 4, 100, 20, 0); +INSERT INTO northwind.products VALUES (67, 'Laughing Lumberjack Lager', 16, 1, '24 - 12 oz bottles', 14, 52, 0, 10, 0); +INSERT INTO northwind.products VALUES (68, 'Scottish Longbreads', 8, 3, '10 boxes x 8 pieces', 12.5, 6, 10, 15, 0); +INSERT INTO northwind.products VALUES (69, 'Gudbrandsdalsost', 15, 4, '10 kg pkg.', 36, 26, 0, 15, 0); +INSERT INTO northwind.products VALUES (70, 'Outback Lager', 7, 1, '24 - 355 ml bottles', 15, 15, 10, 30, 0); +INSERT INTO northwind.products VALUES (71, 'Flotemysost', 15, 4, '10 - 500 g pkgs.', 21.5, 26, 0, 0, 0); +INSERT INTO northwind.products VALUES (72, 'Mozzarella di Giovanni', 14, 4, '24 - 200 g pkgs.', 34.7999992, 14, 0, 0, 0); +INSERT INTO northwind.products VALUES (73, 'Röd Kaviar', 17, 8, '24 - 150 g jars', 15, 101, 0, 5, 0); +INSERT INTO northwind.products VALUES (74, 'Longlife Tofu', 4, 7, '5 kg pkg.', 10, 4, 20, 5, 0); +INSERT INTO northwind.products VALUES (75, 'Rhönbräu Klosterbier', 12, 1, '24 - 0.5 l bottles', 7.75, 125, 0, 25, 0); +INSERT INTO northwind.products VALUES (76, 'Lakkalikööri', 23, 1, '500 ml', 18, 57, 0, 20, 0); +INSERT INTO northwind.products VALUES (77, 'Original Frankfurter grüne Soße', 12, 2, '12 boxes', 13, 32, 0, 15, 0); + + +-- +-- Data for Name: order_details; Type: TABLE DATA; Schema: northwind; Owner: northwind +-- + +INSERT INTO northwind.order_details VALUES (10248, 11, 14, 12, 0); +INSERT INTO northwind.order_details VALUES (10248, 42, 9.80000019, 10, 0); +INSERT INTO northwind.order_details VALUES (10248, 72, 34.7999992, 5, 0); +INSERT INTO northwind.order_details VALUES (10249, 14, 18.6000004, 9, 0); +INSERT INTO northwind.order_details VALUES (10249, 51, 42.4000015, 40, 0); +INSERT INTO northwind.order_details VALUES (10250, 41, 7.69999981, 10, 0); +INSERT INTO northwind.order_details VALUES (10250, 51, 42.4000015, 35, 0.150000006); +INSERT INTO northwind.order_details VALUES (10250, 65, 16.7999992, 15, 0.150000006); +INSERT INTO northwind.order_details VALUES (10251, 22, 16.7999992, 6, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10251, 57, 15.6000004, 15, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10251, 65, 16.7999992, 20, 0); +INSERT INTO northwind.order_details VALUES (10252, 20, 64.8000031, 40, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10252, 33, 2, 25, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10252, 60, 27.2000008, 40, 0); +INSERT INTO northwind.order_details VALUES (10253, 31, 10, 20, 0); +INSERT INTO northwind.order_details VALUES (10253, 39, 14.3999996, 42, 0); +INSERT INTO northwind.order_details VALUES (10253, 49, 16, 40, 0); +INSERT INTO northwind.order_details VALUES (10254, 24, 3.5999999, 15, 0.150000006); +INSERT INTO northwind.order_details VALUES (10254, 55, 19.2000008, 21, 0.150000006); +INSERT INTO northwind.order_details VALUES (10254, 74, 8, 21, 0); +INSERT INTO northwind.order_details VALUES (10255, 2, 15.1999998, 20, 0); +INSERT INTO northwind.order_details VALUES (10255, 16, 13.8999996, 35, 0); +INSERT INTO northwind.order_details VALUES (10255, 36, 15.1999998, 25, 0); +INSERT INTO northwind.order_details VALUES (10255, 59, 44, 30, 0); +INSERT INTO northwind.order_details VALUES (10256, 53, 26.2000008, 15, 0); +INSERT INTO northwind.order_details VALUES (10256, 77, 10.3999996, 12, 0); +INSERT INTO northwind.order_details VALUES (10257, 27, 35.0999985, 25, 0); +INSERT INTO northwind.order_details VALUES (10257, 39, 14.3999996, 6, 0); +INSERT INTO northwind.order_details VALUES (10257, 77, 10.3999996, 15, 0); +INSERT INTO northwind.order_details VALUES (10259, 21, 8, 10, 0); +INSERT INTO northwind.order_details VALUES (10259, 37, 20.7999992, 1, 0); +INSERT INTO northwind.order_details VALUES (10260, 41, 7.69999981, 16, 0.25); +INSERT INTO northwind.order_details VALUES (10260, 57, 15.6000004, 50, 0); +INSERT INTO northwind.order_details VALUES (10260, 62, 39.4000015, 15, 0.25); +INSERT INTO northwind.order_details VALUES (10260, 70, 12, 21, 0.25); +INSERT INTO northwind.order_details VALUES (10261, 21, 8, 20, 0); +INSERT INTO northwind.order_details VALUES (10261, 35, 14.3999996, 20, 0); +INSERT INTO northwind.order_details VALUES (10262, 5, 17, 12, 0.200000003); +INSERT INTO northwind.order_details VALUES (10262, 7, 24, 15, 0); +INSERT INTO northwind.order_details VALUES (10262, 56, 30.3999996, 2, 0); +INSERT INTO northwind.order_details VALUES (10263, 16, 13.8999996, 60, 0.25); +INSERT INTO northwind.order_details VALUES (10263, 24, 3.5999999, 28, 0); +INSERT INTO northwind.order_details VALUES (10263, 30, 20.7000008, 60, 0.25); +INSERT INTO northwind.order_details VALUES (10263, 74, 8, 36, 0.25); +INSERT INTO northwind.order_details VALUES (10264, 2, 15.1999998, 35, 0); +INSERT INTO northwind.order_details VALUES (10264, 41, 7.69999981, 25, 0.150000006); +INSERT INTO northwind.order_details VALUES (10265, 17, 31.2000008, 30, 0); +INSERT INTO northwind.order_details VALUES (10265, 70, 12, 20, 0); +INSERT INTO northwind.order_details VALUES (10266, 12, 30.3999996, 12, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10267, 40, 14.6999998, 50, 0); +INSERT INTO northwind.order_details VALUES (10267, 59, 44, 70, 0.150000006); +INSERT INTO northwind.order_details VALUES (10267, 76, 14.3999996, 15, 0.150000006); +INSERT INTO northwind.order_details VALUES (10268, 29, 99, 10, 0); +INSERT INTO northwind.order_details VALUES (10268, 72, 27.7999992, 4, 0); +INSERT INTO northwind.order_details VALUES (10269, 33, 2, 60, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10269, 72, 27.7999992, 20, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10271, 33, 2, 24, 0); +INSERT INTO northwind.order_details VALUES (10272, 20, 64.8000031, 6, 0); +INSERT INTO northwind.order_details VALUES (10272, 31, 10, 40, 0); +INSERT INTO northwind.order_details VALUES (10272, 72, 27.7999992, 24, 0); +INSERT INTO northwind.order_details VALUES (10273, 10, 24.7999992, 24, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10273, 31, 10, 15, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10273, 33, 2, 20, 0); +INSERT INTO northwind.order_details VALUES (10273, 40, 14.6999998, 60, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10273, 76, 14.3999996, 33, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10274, 71, 17.2000008, 20, 0); +INSERT INTO northwind.order_details VALUES (10274, 72, 27.7999992, 7, 0); +INSERT INTO northwind.order_details VALUES (10276, 10, 24.7999992, 15, 0); +INSERT INTO northwind.order_details VALUES (10276, 13, 4.80000019, 10, 0); +INSERT INTO northwind.order_details VALUES (10277, 28, 36.4000015, 20, 0); +INSERT INTO northwind.order_details VALUES (10277, 62, 39.4000015, 12, 0); +INSERT INTO northwind.order_details VALUES (10278, 44, 15.5, 16, 0); +INSERT INTO northwind.order_details VALUES (10278, 59, 44, 15, 0); +INSERT INTO northwind.order_details VALUES (10278, 63, 35.0999985, 8, 0); +INSERT INTO northwind.order_details VALUES (10278, 73, 12, 25, 0); +INSERT INTO northwind.order_details VALUES (10279, 17, 31.2000008, 15, 0.25); +INSERT INTO northwind.order_details VALUES (10280, 24, 3.5999999, 12, 0); +INSERT INTO northwind.order_details VALUES (10280, 55, 19.2000008, 20, 0); +INSERT INTO northwind.order_details VALUES (10280, 75, 6.19999981, 30, 0); +INSERT INTO northwind.order_details VALUES (10281, 19, 7.30000019, 1, 0); +INSERT INTO northwind.order_details VALUES (10281, 24, 3.5999999, 6, 0); +INSERT INTO northwind.order_details VALUES (10281, 35, 14.3999996, 4, 0); +INSERT INTO northwind.order_details VALUES (10282, 30, 20.7000008, 6, 0); +INSERT INTO northwind.order_details VALUES (10282, 57, 15.6000004, 2, 0); +INSERT INTO northwind.order_details VALUES (10283, 15, 12.3999996, 20, 0); +INSERT INTO northwind.order_details VALUES (10283, 19, 7.30000019, 18, 0); +INSERT INTO northwind.order_details VALUES (10283, 60, 27.2000008, 35, 0); +INSERT INTO northwind.order_details VALUES (10283, 72, 27.7999992, 3, 0); +INSERT INTO northwind.order_details VALUES (10284, 27, 35.0999985, 15, 0.25); +INSERT INTO northwind.order_details VALUES (10284, 44, 15.5, 21, 0); +INSERT INTO northwind.order_details VALUES (10284, 60, 27.2000008, 20, 0.25); +INSERT INTO northwind.order_details VALUES (10284, 67, 11.1999998, 5, 0.25); +INSERT INTO northwind.order_details VALUES (10286, 35, 14.3999996, 100, 0); +INSERT INTO northwind.order_details VALUES (10286, 62, 39.4000015, 40, 0); +INSERT INTO northwind.order_details VALUES (10287, 16, 13.8999996, 40, 0.150000006); +INSERT INTO northwind.order_details VALUES (10287, 34, 11.1999998, 20, 0); +INSERT INTO northwind.order_details VALUES (10287, 46, 9.60000038, 15, 0.150000006); +INSERT INTO northwind.order_details VALUES (10288, 54, 5.9000001, 10, 0.100000001); +INSERT INTO northwind.order_details VALUES (10288, 68, 10, 3, 0.100000001); +INSERT INTO northwind.order_details VALUES (10289, 3, 8, 30, 0); +INSERT INTO northwind.order_details VALUES (10289, 64, 26.6000004, 9, 0); +INSERT INTO northwind.order_details VALUES (10290, 5, 17, 20, 0); +INSERT INTO northwind.order_details VALUES (10290, 29, 99, 15, 0); +INSERT INTO northwind.order_details VALUES (10290, 49, 16, 15, 0); +INSERT INTO northwind.order_details VALUES (10290, 77, 10.3999996, 10, 0); +INSERT INTO northwind.order_details VALUES (10291, 13, 4.80000019, 20, 0.100000001); +INSERT INTO northwind.order_details VALUES (10291, 44, 15.5, 24, 0.100000001); +INSERT INTO northwind.order_details VALUES (10291, 51, 42.4000015, 2, 0.100000001); +INSERT INTO northwind.order_details VALUES (10385, 7, 24, 10, 0.200000003); +INSERT INTO northwind.order_details VALUES (10385, 60, 27.2000008, 20, 0.200000003); +INSERT INTO northwind.order_details VALUES (10385, 68, 10, 8, 0.200000003); +INSERT INTO northwind.order_details VALUES (10294, 1, 14.3999996, 18, 0); +INSERT INTO northwind.order_details VALUES (10294, 17, 31.2000008, 15, 0); +INSERT INTO northwind.order_details VALUES (10294, 43, 36.7999992, 15, 0); +INSERT INTO northwind.order_details VALUES (10294, 60, 27.2000008, 21, 0); +INSERT INTO northwind.order_details VALUES (10294, 75, 6.19999981, 6, 0); +INSERT INTO northwind.order_details VALUES (10295, 56, 30.3999996, 4, 0); +INSERT INTO northwind.order_details VALUES (10296, 11, 16.7999992, 12, 0); +INSERT INTO northwind.order_details VALUES (10296, 16, 13.8999996, 30, 0); +INSERT INTO northwind.order_details VALUES (10296, 69, 28.7999992, 15, 0); +INSERT INTO northwind.order_details VALUES (10297, 39, 14.3999996, 60, 0); +INSERT INTO northwind.order_details VALUES (10297, 72, 27.7999992, 20, 0); +INSERT INTO northwind.order_details VALUES (10298, 2, 15.1999998, 40, 0); +INSERT INTO northwind.order_details VALUES (10298, 36, 15.1999998, 40, 0.25); +INSERT INTO northwind.order_details VALUES (10298, 59, 44, 30, 0.25); +INSERT INTO northwind.order_details VALUES (10298, 62, 39.4000015, 15, 0); +INSERT INTO northwind.order_details VALUES (10299, 19, 7.30000019, 15, 0); +INSERT INTO northwind.order_details VALUES (10299, 70, 12, 20, 0); +INSERT INTO northwind.order_details VALUES (10300, 66, 13.6000004, 30, 0); +INSERT INTO northwind.order_details VALUES (10300, 68, 10, 20, 0); +INSERT INTO northwind.order_details VALUES (10301, 40, 14.6999998, 10, 0); +INSERT INTO northwind.order_details VALUES (10301, 56, 30.3999996, 20, 0); +INSERT INTO northwind.order_details VALUES (10302, 17, 31.2000008, 40, 0); +INSERT INTO northwind.order_details VALUES (10302, 28, 36.4000015, 28, 0); +INSERT INTO northwind.order_details VALUES (10302, 43, 36.7999992, 12, 0); +INSERT INTO northwind.order_details VALUES (10303, 40, 14.6999998, 40, 0.100000001); +INSERT INTO northwind.order_details VALUES (10303, 65, 16.7999992, 30, 0.100000001); +INSERT INTO northwind.order_details VALUES (10303, 68, 10, 15, 0.100000001); +INSERT INTO northwind.order_details VALUES (10305, 18, 50, 25, 0.100000001); +INSERT INTO northwind.order_details VALUES (10305, 29, 99, 25, 0.100000001); +INSERT INTO northwind.order_details VALUES (10305, 39, 14.3999996, 30, 0.100000001); +INSERT INTO northwind.order_details VALUES (10307, 62, 39.4000015, 10, 0); +INSERT INTO northwind.order_details VALUES (10307, 68, 10, 3, 0); +INSERT INTO northwind.order_details VALUES (10308, 69, 28.7999992, 1, 0); +INSERT INTO northwind.order_details VALUES (10308, 70, 12, 5, 0); +INSERT INTO northwind.order_details VALUES (10309, 4, 17.6000004, 20, 0); +INSERT INTO northwind.order_details VALUES (10309, 6, 20, 30, 0); +INSERT INTO northwind.order_details VALUES (10309, 42, 11.1999998, 2, 0); +INSERT INTO northwind.order_details VALUES (10309, 43, 36.7999992, 20, 0); +INSERT INTO northwind.order_details VALUES (10309, 71, 17.2000008, 3, 0); +INSERT INTO northwind.order_details VALUES (10310, 16, 13.8999996, 10, 0); +INSERT INTO northwind.order_details VALUES (10310, 62, 39.4000015, 5, 0); +INSERT INTO northwind.order_details VALUES (10312, 28, 36.4000015, 4, 0); +INSERT INTO northwind.order_details VALUES (10312, 43, 36.7999992, 24, 0); +INSERT INTO northwind.order_details VALUES (10312, 53, 26.2000008, 20, 0); +INSERT INTO northwind.order_details VALUES (10312, 75, 6.19999981, 10, 0); +INSERT INTO northwind.order_details VALUES (10313, 36, 15.1999998, 12, 0); +INSERT INTO northwind.order_details VALUES (10315, 34, 11.1999998, 14, 0); +INSERT INTO northwind.order_details VALUES (10315, 70, 12, 30, 0); +INSERT INTO northwind.order_details VALUES (10317, 1, 14.3999996, 20, 0); +INSERT INTO northwind.order_details VALUES (10318, 41, 7.69999981, 20, 0); +INSERT INTO northwind.order_details VALUES (10318, 76, 14.3999996, 6, 0); +INSERT INTO northwind.order_details VALUES (10319, 17, 31.2000008, 8, 0); +INSERT INTO northwind.order_details VALUES (10319, 28, 36.4000015, 14, 0); +INSERT INTO northwind.order_details VALUES (10319, 76, 14.3999996, 30, 0); +INSERT INTO northwind.order_details VALUES (10320, 71, 17.2000008, 30, 0); +INSERT INTO northwind.order_details VALUES (10321, 35, 14.3999996, 10, 0); +INSERT INTO northwind.order_details VALUES (10322, 52, 5.5999999, 20, 0); +INSERT INTO northwind.order_details VALUES (10323, 15, 12.3999996, 5, 0); +INSERT INTO northwind.order_details VALUES (10323, 25, 11.1999998, 4, 0); +INSERT INTO northwind.order_details VALUES (10323, 39, 14.3999996, 4, 0); +INSERT INTO northwind.order_details VALUES (10324, 16, 13.8999996, 21, 0.150000006); +INSERT INTO northwind.order_details VALUES (10324, 35, 14.3999996, 70, 0.150000006); +INSERT INTO northwind.order_details VALUES (10324, 46, 9.60000038, 30, 0); +INSERT INTO northwind.order_details VALUES (10324, 59, 44, 40, 0.150000006); +INSERT INTO northwind.order_details VALUES (10324, 63, 35.0999985, 80, 0.150000006); +INSERT INTO northwind.order_details VALUES (10326, 4, 17.6000004, 24, 0); +INSERT INTO northwind.order_details VALUES (10326, 57, 15.6000004, 16, 0); +INSERT INTO northwind.order_details VALUES (10326, 75, 6.19999981, 50, 0); +INSERT INTO northwind.order_details VALUES (10327, 2, 15.1999998, 25, 0.200000003); +INSERT INTO northwind.order_details VALUES (10327, 11, 16.7999992, 50, 0.200000003); +INSERT INTO northwind.order_details VALUES (10327, 30, 20.7000008, 35, 0.200000003); +INSERT INTO northwind.order_details VALUES (10327, 58, 10.6000004, 30, 0.200000003); +INSERT INTO northwind.order_details VALUES (10328, 59, 44, 9, 0); +INSERT INTO northwind.order_details VALUES (10328, 65, 16.7999992, 40, 0); +INSERT INTO northwind.order_details VALUES (10328, 68, 10, 10, 0); +INSERT INTO northwind.order_details VALUES (10329, 19, 7.30000019, 10, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10329, 30, 20.7000008, 8, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10329, 38, 210.800003, 20, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10329, 56, 30.3999996, 12, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10330, 26, 24.8999996, 50, 0.150000006); +INSERT INTO northwind.order_details VALUES (10330, 72, 27.7999992, 25, 0.150000006); +INSERT INTO northwind.order_details VALUES (10331, 54, 5.9000001, 15, 0); +INSERT INTO northwind.order_details VALUES (10332, 18, 50, 40, 0.200000003); +INSERT INTO northwind.order_details VALUES (10332, 42, 11.1999998, 10, 0.200000003); +INSERT INTO northwind.order_details VALUES (10332, 47, 7.5999999, 16, 0.200000003); +INSERT INTO northwind.order_details VALUES (10333, 14, 18.6000004, 10, 0); +INSERT INTO northwind.order_details VALUES (10333, 21, 8, 10, 0.100000001); +INSERT INTO northwind.order_details VALUES (10333, 71, 17.2000008, 40, 0.100000001); +INSERT INTO northwind.order_details VALUES (10334, 52, 5.5999999, 8, 0); +INSERT INTO northwind.order_details VALUES (10334, 68, 10, 10, 0); +INSERT INTO northwind.order_details VALUES (10335, 2, 15.1999998, 7, 0.200000003); +INSERT INTO northwind.order_details VALUES (10335, 31, 10, 25, 0.200000003); +INSERT INTO northwind.order_details VALUES (10335, 32, 25.6000004, 6, 0.200000003); +INSERT INTO northwind.order_details VALUES (10335, 51, 42.4000015, 48, 0.200000003); +INSERT INTO northwind.order_details VALUES (10336, 4, 17.6000004, 18, 0.100000001); +INSERT INTO northwind.order_details VALUES (10337, 23, 7.19999981, 40, 0); +INSERT INTO northwind.order_details VALUES (10337, 26, 24.8999996, 24, 0); +INSERT INTO northwind.order_details VALUES (10337, 36, 15.1999998, 20, 0); +INSERT INTO northwind.order_details VALUES (10337, 37, 20.7999992, 28, 0); +INSERT INTO northwind.order_details VALUES (10337, 72, 27.7999992, 25, 0); +INSERT INTO northwind.order_details VALUES (10338, 17, 31.2000008, 20, 0); +INSERT INTO northwind.order_details VALUES (10338, 30, 20.7000008, 15, 0); +INSERT INTO northwind.order_details VALUES (10339, 4, 17.6000004, 10, 0); +INSERT INTO northwind.order_details VALUES (10339, 17, 31.2000008, 70, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10339, 62, 39.4000015, 28, 0); +INSERT INTO northwind.order_details VALUES (10341, 33, 2, 8, 0); +INSERT INTO northwind.order_details VALUES (10341, 59, 44, 9, 0.150000006); +INSERT INTO northwind.order_details VALUES (10342, 2, 15.1999998, 24, 0.200000003); +INSERT INTO northwind.order_details VALUES (10342, 31, 10, 56, 0.200000003); +INSERT INTO northwind.order_details VALUES (10342, 36, 15.1999998, 40, 0.200000003); +INSERT INTO northwind.order_details VALUES (10342, 55, 19.2000008, 40, 0.200000003); +INSERT INTO northwind.order_details VALUES (10343, 64, 26.6000004, 50, 0); +INSERT INTO northwind.order_details VALUES (10343, 68, 10, 4, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10343, 76, 14.3999996, 15, 0); +INSERT INTO northwind.order_details VALUES (10344, 4, 17.6000004, 35, 0); +INSERT INTO northwind.order_details VALUES (10344, 8, 32, 70, 0.25); +INSERT INTO northwind.order_details VALUES (10345, 8, 32, 70, 0); +INSERT INTO northwind.order_details VALUES (10345, 19, 7.30000019, 80, 0); +INSERT INTO northwind.order_details VALUES (10345, 42, 11.1999998, 9, 0); +INSERT INTO northwind.order_details VALUES (10346, 17, 31.2000008, 36, 0.100000001); +INSERT INTO northwind.order_details VALUES (10346, 56, 30.3999996, 20, 0); +INSERT INTO northwind.order_details VALUES (10347, 25, 11.1999998, 10, 0); +INSERT INTO northwind.order_details VALUES (10347, 39, 14.3999996, 50, 0.150000006); +INSERT INTO northwind.order_details VALUES (10347, 40, 14.6999998, 4, 0); +INSERT INTO northwind.order_details VALUES (10347, 75, 6.19999981, 6, 0.150000006); +INSERT INTO northwind.order_details VALUES (10348, 1, 14.3999996, 15, 0.150000006); +INSERT INTO northwind.order_details VALUES (10348, 23, 7.19999981, 25, 0); +INSERT INTO northwind.order_details VALUES (10349, 54, 5.9000001, 24, 0); +INSERT INTO northwind.order_details VALUES (10350, 50, 13, 15, 0.100000001); +INSERT INTO northwind.order_details VALUES (10350, 69, 28.7999992, 18, 0.100000001); +INSERT INTO northwind.order_details VALUES (10352, 24, 3.5999999, 10, 0); +INSERT INTO northwind.order_details VALUES (10352, 54, 5.9000001, 20, 0.150000006); +INSERT INTO northwind.order_details VALUES (10353, 11, 16.7999992, 12, 0.200000003); +INSERT INTO northwind.order_details VALUES (10353, 38, 210.800003, 50, 0.200000003); +INSERT INTO northwind.order_details VALUES (10354, 1, 14.3999996, 12, 0); +INSERT INTO northwind.order_details VALUES (10354, 29, 99, 4, 0); +INSERT INTO northwind.order_details VALUES (10355, 24, 3.5999999, 25, 0); +INSERT INTO northwind.order_details VALUES (10355, 57, 15.6000004, 25, 0); +INSERT INTO northwind.order_details VALUES (10356, 31, 10, 30, 0); +INSERT INTO northwind.order_details VALUES (10356, 55, 19.2000008, 12, 0); +INSERT INTO northwind.order_details VALUES (10356, 69, 28.7999992, 20, 0); +INSERT INTO northwind.order_details VALUES (10358, 24, 3.5999999, 10, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10358, 34, 11.1999998, 10, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10358, 36, 15.1999998, 20, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10359, 16, 13.8999996, 56, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10359, 31, 10, 70, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10359, 60, 27.2000008, 80, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10360, 28, 36.4000015, 30, 0); +INSERT INTO northwind.order_details VALUES (10360, 29, 99, 35, 0); +INSERT INTO northwind.order_details VALUES (10360, 38, 210.800003, 10, 0); +INSERT INTO northwind.order_details VALUES (10360, 49, 16, 35, 0); +INSERT INTO northwind.order_details VALUES (10360, 54, 5.9000001, 28, 0); +INSERT INTO northwind.order_details VALUES (10258, 2, 15.1999998, 50, 0.200000003); +INSERT INTO northwind.order_details VALUES (10362, 25, 11.1999998, 50, 0); +INSERT INTO northwind.order_details VALUES (10362, 51, 42.4000015, 20, 0); +INSERT INTO northwind.order_details VALUES (10362, 54, 5.9000001, 24, 0); +INSERT INTO northwind.order_details VALUES (10363, 31, 10, 20, 0); +INSERT INTO northwind.order_details VALUES (10363, 75, 6.19999981, 12, 0); +INSERT INTO northwind.order_details VALUES (10363, 76, 14.3999996, 12, 0); +INSERT INTO northwind.order_details VALUES (10258, 5, 17, 65, 0.200000003); +INSERT INTO northwind.order_details VALUES (10258, 32, 25.6000004, 6, 0.200000003); +INSERT INTO northwind.order_details VALUES (10365, 11, 16.7999992, 24, 0); +INSERT INTO northwind.order_details VALUES (10366, 65, 16.7999992, 5, 0); +INSERT INTO northwind.order_details VALUES (10366, 77, 10.3999996, 5, 0); +INSERT INTO northwind.order_details VALUES (10367, 34, 11.1999998, 36, 0); +INSERT INTO northwind.order_details VALUES (10367, 54, 5.9000001, 18, 0); +INSERT INTO northwind.order_details VALUES (10367, 65, 16.7999992, 15, 0); +INSERT INTO northwind.order_details VALUES (10367, 77, 10.3999996, 7, 0); +INSERT INTO northwind.order_details VALUES (10368, 21, 8, 5, 0.100000001); +INSERT INTO northwind.order_details VALUES (10368, 28, 36.4000015, 13, 0.100000001); +INSERT INTO northwind.order_details VALUES (10368, 57, 15.6000004, 25, 0); +INSERT INTO northwind.order_details VALUES (10368, 64, 26.6000004, 35, 0.100000001); +INSERT INTO northwind.order_details VALUES (10369, 29, 99, 20, 0); +INSERT INTO northwind.order_details VALUES (10369, 56, 30.3999996, 18, 0.25); +INSERT INTO northwind.order_details VALUES (10370, 1, 14.3999996, 15, 0.150000006); +INSERT INTO northwind.order_details VALUES (10370, 64, 26.6000004, 30, 0); +INSERT INTO northwind.order_details VALUES (10370, 74, 8, 20, 0.150000006); +INSERT INTO northwind.order_details VALUES (10372, 20, 64.8000031, 12, 0.25); +INSERT INTO northwind.order_details VALUES (10372, 38, 210.800003, 40, 0.25); +INSERT INTO northwind.order_details VALUES (10372, 60, 27.2000008, 70, 0.25); +INSERT INTO northwind.order_details VALUES (10372, 72, 27.7999992, 42, 0.25); +INSERT INTO northwind.order_details VALUES (10373, 58, 10.6000004, 80, 0.200000003); +INSERT INTO northwind.order_details VALUES (10373, 71, 17.2000008, 50, 0.200000003); +INSERT INTO northwind.order_details VALUES (10375, 14, 18.6000004, 15, 0); +INSERT INTO northwind.order_details VALUES (10375, 54, 5.9000001, 10, 0); +INSERT INTO northwind.order_details VALUES (10378, 71, 17.2000008, 6, 0); +INSERT INTO northwind.order_details VALUES (10379, 41, 7.69999981, 8, 0.100000001); +INSERT INTO northwind.order_details VALUES (10379, 63, 35.0999985, 16, 0.100000001); +INSERT INTO northwind.order_details VALUES (10379, 65, 16.7999992, 20, 0.100000001); +INSERT INTO northwind.order_details VALUES (10380, 30, 20.7000008, 18, 0.100000001); +INSERT INTO northwind.order_details VALUES (10380, 53, 26.2000008, 20, 0.100000001); +INSERT INTO northwind.order_details VALUES (10380, 60, 27.2000008, 6, 0.100000001); +INSERT INTO northwind.order_details VALUES (10380, 70, 12, 30, 0); +INSERT INTO northwind.order_details VALUES (10381, 74, 8, 14, 0); +INSERT INTO northwind.order_details VALUES (10382, 5, 17, 32, 0); +INSERT INTO northwind.order_details VALUES (10382, 18, 50, 9, 0); +INSERT INTO northwind.order_details VALUES (10382, 29, 99, 14, 0); +INSERT INTO northwind.order_details VALUES (10382, 33, 2, 60, 0); +INSERT INTO northwind.order_details VALUES (10382, 74, 8, 50, 0); +INSERT INTO northwind.order_details VALUES (10383, 13, 4.80000019, 20, 0); +INSERT INTO northwind.order_details VALUES (10383, 50, 13, 15, 0); +INSERT INTO northwind.order_details VALUES (10383, 56, 30.3999996, 20, 0); +INSERT INTO northwind.order_details VALUES (10384, 20, 64.8000031, 28, 0); +INSERT INTO northwind.order_details VALUES (10384, 60, 27.2000008, 15, 0); +INSERT INTO northwind.order_details VALUES (10386, 24, 3.5999999, 15, 0); +INSERT INTO northwind.order_details VALUES (10386, 34, 11.1999998, 10, 0); +INSERT INTO northwind.order_details VALUES (10388, 45, 7.5999999, 15, 0.200000003); +INSERT INTO northwind.order_details VALUES (10388, 52, 5.5999999, 20, 0.200000003); +INSERT INTO northwind.order_details VALUES (10388, 53, 26.2000008, 40, 0); +INSERT INTO northwind.order_details VALUES (10389, 10, 24.7999992, 16, 0); +INSERT INTO northwind.order_details VALUES (10389, 55, 19.2000008, 15, 0); +INSERT INTO northwind.order_details VALUES (10389, 62, 39.4000015, 20, 0); +INSERT INTO northwind.order_details VALUES (10389, 70, 12, 30, 0); +INSERT INTO northwind.order_details VALUES (10390, 31, 10, 60, 0.100000001); +INSERT INTO northwind.order_details VALUES (10390, 35, 14.3999996, 40, 0.100000001); +INSERT INTO northwind.order_details VALUES (10390, 46, 9.60000038, 45, 0); +INSERT INTO northwind.order_details VALUES (10390, 72, 27.7999992, 24, 0.100000001); +INSERT INTO northwind.order_details VALUES (10391, 13, 4.80000019, 18, 0); +INSERT INTO northwind.order_details VALUES (10392, 69, 28.7999992, 50, 0); +INSERT INTO northwind.order_details VALUES (10395, 46, 9.60000038, 28, 0.100000001); +INSERT INTO northwind.order_details VALUES (10395, 53, 26.2000008, 70, 0.100000001); +INSERT INTO northwind.order_details VALUES (10395, 69, 28.7999992, 8, 0); +INSERT INTO northwind.order_details VALUES (10397, 21, 8, 10, 0.150000006); +INSERT INTO northwind.order_details VALUES (10397, 51, 42.4000015, 18, 0.150000006); +INSERT INTO northwind.order_details VALUES (10398, 35, 14.3999996, 30, 0); +INSERT INTO northwind.order_details VALUES (10398, 55, 19.2000008, 120, 0.100000001); +INSERT INTO northwind.order_details VALUES (10399, 68, 10, 60, 0); +INSERT INTO northwind.order_details VALUES (10399, 71, 17.2000008, 30, 0); +INSERT INTO northwind.order_details VALUES (10399, 76, 14.3999996, 35, 0); +INSERT INTO northwind.order_details VALUES (10399, 77, 10.3999996, 14, 0); +INSERT INTO northwind.order_details VALUES (10270, 36, 15.1999998, 30, 0); +INSERT INTO northwind.order_details VALUES (10270, 43, 36.7999992, 25, 0); +INSERT INTO northwind.order_details VALUES (10402, 23, 7.19999981, 60, 0); +INSERT INTO northwind.order_details VALUES (10402, 63, 35.0999985, 65, 0); +INSERT INTO northwind.order_details VALUES (10403, 16, 13.8999996, 21, 0.150000006); +INSERT INTO northwind.order_details VALUES (10403, 48, 10.1999998, 70, 0.150000006); +INSERT INTO northwind.order_details VALUES (10404, 26, 24.8999996, 30, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10404, 42, 11.1999998, 40, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10404, 49, 16, 30, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10406, 1, 14.3999996, 10, 0); +INSERT INTO northwind.order_details VALUES (10406, 21, 8, 30, 0.100000001); +INSERT INTO northwind.order_details VALUES (10406, 28, 36.4000015, 42, 0.100000001); +INSERT INTO northwind.order_details VALUES (10406, 36, 15.1999998, 5, 0.100000001); +INSERT INTO northwind.order_details VALUES (10406, 40, 14.6999998, 2, 0.100000001); +INSERT INTO northwind.order_details VALUES (10407, 11, 16.7999992, 30, 0); +INSERT INTO northwind.order_details VALUES (10407, 69, 28.7999992, 15, 0); +INSERT INTO northwind.order_details VALUES (10407, 71, 17.2000008, 15, 0); +INSERT INTO northwind.order_details VALUES (10408, 37, 20.7999992, 10, 0); +INSERT INTO northwind.order_details VALUES (10408, 54, 5.9000001, 6, 0); +INSERT INTO northwind.order_details VALUES (10408, 62, 39.4000015, 35, 0); +INSERT INTO northwind.order_details VALUES (10409, 14, 18.6000004, 12, 0); +INSERT INTO northwind.order_details VALUES (10409, 21, 8, 12, 0); +INSERT INTO northwind.order_details VALUES (10410, 33, 2, 49, 0); +INSERT INTO northwind.order_details VALUES (10410, 59, 44, 16, 0); +INSERT INTO northwind.order_details VALUES (10411, 41, 7.69999981, 25, 0.200000003); +INSERT INTO northwind.order_details VALUES (10411, 44, 15.5, 40, 0.200000003); +INSERT INTO northwind.order_details VALUES (10411, 59, 44, 9, 0.200000003); +INSERT INTO northwind.order_details VALUES (10412, 14, 18.6000004, 20, 0.100000001); +INSERT INTO northwind.order_details VALUES (10413, 1, 14.3999996, 24, 0); +INSERT INTO northwind.order_details VALUES (10413, 62, 39.4000015, 40, 0); +INSERT INTO northwind.order_details VALUES (10413, 76, 14.3999996, 14, 0); +INSERT INTO northwind.order_details VALUES (10414, 19, 7.30000019, 18, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10414, 33, 2, 50, 0); +INSERT INTO northwind.order_details VALUES (10415, 17, 31.2000008, 2, 0); +INSERT INTO northwind.order_details VALUES (10415, 33, 2, 20, 0); +INSERT INTO northwind.order_details VALUES (10416, 19, 7.30000019, 20, 0); +INSERT INTO northwind.order_details VALUES (10416, 53, 26.2000008, 10, 0); +INSERT INTO northwind.order_details VALUES (10416, 57, 15.6000004, 20, 0); +INSERT INTO northwind.order_details VALUES (10417, 38, 210.800003, 50, 0); +INSERT INTO northwind.order_details VALUES (10417, 46, 9.60000038, 2, 0.25); +INSERT INTO northwind.order_details VALUES (10417, 68, 10, 36, 0.25); +INSERT INTO northwind.order_details VALUES (10417, 77, 10.3999996, 35, 0); +INSERT INTO northwind.order_details VALUES (10418, 2, 15.1999998, 60, 0); +INSERT INTO northwind.order_details VALUES (10418, 47, 7.5999999, 55, 0); +INSERT INTO northwind.order_details VALUES (10418, 61, 22.7999992, 16, 0); +INSERT INTO northwind.order_details VALUES (10418, 74, 8, 15, 0); +INSERT INTO northwind.order_details VALUES (10419, 60, 27.2000008, 60, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10419, 69, 28.7999992, 20, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10420, 9, 77.5999985, 20, 0.100000001); +INSERT INTO northwind.order_details VALUES (10420, 13, 4.80000019, 2, 0.100000001); +INSERT INTO northwind.order_details VALUES (10420, 70, 12, 8, 0.100000001); +INSERT INTO northwind.order_details VALUES (10420, 73, 12, 20, 0.100000001); +INSERT INTO northwind.order_details VALUES (10421, 19, 7.30000019, 4, 0.150000006); +INSERT INTO northwind.order_details VALUES (10421, 26, 24.8999996, 30, 0); +INSERT INTO northwind.order_details VALUES (10421, 53, 26.2000008, 15, 0.150000006); +INSERT INTO northwind.order_details VALUES (10421, 77, 10.3999996, 10, 0.150000006); +INSERT INTO northwind.order_details VALUES (10422, 26, 24.8999996, 2, 0); +INSERT INTO northwind.order_details VALUES (10423, 31, 10, 14, 0); +INSERT INTO northwind.order_details VALUES (10423, 59, 44, 20, 0); +INSERT INTO northwind.order_details VALUES (10424, 35, 14.3999996, 60, 0.200000003); +INSERT INTO northwind.order_details VALUES (10424, 38, 210.800003, 49, 0.200000003); +INSERT INTO northwind.order_details VALUES (10424, 68, 10, 30, 0.200000003); +INSERT INTO northwind.order_details VALUES (10425, 55, 19.2000008, 10, 0.25); +INSERT INTO northwind.order_details VALUES (10425, 76, 14.3999996, 20, 0.25); +INSERT INTO northwind.order_details VALUES (10426, 56, 30.3999996, 5, 0); +INSERT INTO northwind.order_details VALUES (10426, 64, 26.6000004, 7, 0); +INSERT INTO northwind.order_details VALUES (10427, 14, 18.6000004, 35, 0); +INSERT INTO northwind.order_details VALUES (10428, 46, 9.60000038, 20, 0); +INSERT INTO northwind.order_details VALUES (10429, 50, 13, 40, 0); +INSERT INTO northwind.order_details VALUES (10429, 63, 35.0999985, 35, 0.25); +INSERT INTO northwind.order_details VALUES (10430, 17, 31.2000008, 45, 0.200000003); +INSERT INTO northwind.order_details VALUES (10430, 21, 8, 50, 0); +INSERT INTO northwind.order_details VALUES (10430, 56, 30.3999996, 30, 0); +INSERT INTO northwind.order_details VALUES (10430, 59, 44, 70, 0.200000003); +INSERT INTO northwind.order_details VALUES (10431, 17, 31.2000008, 50, 0.25); +INSERT INTO northwind.order_details VALUES (10431, 40, 14.6999998, 50, 0.25); +INSERT INTO northwind.order_details VALUES (10431, 47, 7.5999999, 30, 0.25); +INSERT INTO northwind.order_details VALUES (10432, 26, 24.8999996, 10, 0); +INSERT INTO northwind.order_details VALUES (10432, 54, 5.9000001, 40, 0); +INSERT INTO northwind.order_details VALUES (10433, 56, 30.3999996, 28, 0); +INSERT INTO northwind.order_details VALUES (10434, 11, 16.7999992, 6, 0); +INSERT INTO northwind.order_details VALUES (10434, 76, 14.3999996, 18, 0.150000006); +INSERT INTO northwind.order_details VALUES (10435, 2, 15.1999998, 10, 0); +INSERT INTO northwind.order_details VALUES (10435, 22, 16.7999992, 12, 0); +INSERT INTO northwind.order_details VALUES (10435, 72, 27.7999992, 10, 0); +INSERT INTO northwind.order_details VALUES (10436, 46, 9.60000038, 5, 0); +INSERT INTO northwind.order_details VALUES (10436, 56, 30.3999996, 40, 0.100000001); +INSERT INTO northwind.order_details VALUES (10436, 64, 26.6000004, 30, 0.100000001); +INSERT INTO northwind.order_details VALUES (10436, 75, 6.19999981, 24, 0.100000001); +INSERT INTO northwind.order_details VALUES (10437, 53, 26.2000008, 15, 0); +INSERT INTO northwind.order_details VALUES (10438, 19, 7.30000019, 15, 0.200000003); +INSERT INTO northwind.order_details VALUES (10438, 34, 11.1999998, 20, 0.200000003); +INSERT INTO northwind.order_details VALUES (10438, 57, 15.6000004, 15, 0.200000003); +INSERT INTO northwind.order_details VALUES (10439, 12, 30.3999996, 15, 0); +INSERT INTO northwind.order_details VALUES (10439, 16, 13.8999996, 16, 0); +INSERT INTO northwind.order_details VALUES (10439, 64, 26.6000004, 6, 0); +INSERT INTO northwind.order_details VALUES (10439, 74, 8, 30, 0); +INSERT INTO northwind.order_details VALUES (10440, 2, 15.1999998, 45, 0.150000006); +INSERT INTO northwind.order_details VALUES (10440, 16, 13.8999996, 49, 0.150000006); +INSERT INTO northwind.order_details VALUES (10440, 29, 99, 24, 0.150000006); +INSERT INTO northwind.order_details VALUES (10440, 61, 22.7999992, 90, 0.150000006); +INSERT INTO northwind.order_details VALUES (10441, 27, 35.0999985, 50, 0); +INSERT INTO northwind.order_details VALUES (10442, 11, 16.7999992, 30, 0); +INSERT INTO northwind.order_details VALUES (10442, 54, 5.9000001, 80, 0); +INSERT INTO northwind.order_details VALUES (10442, 66, 13.6000004, 60, 0); +INSERT INTO northwind.order_details VALUES (10443, 11, 16.7999992, 6, 0.200000003); +INSERT INTO northwind.order_details VALUES (10443, 28, 36.4000015, 12, 0); +INSERT INTO northwind.order_details VALUES (10444, 17, 31.2000008, 10, 0); +INSERT INTO northwind.order_details VALUES (10444, 26, 24.8999996, 15, 0); +INSERT INTO northwind.order_details VALUES (10444, 35, 14.3999996, 8, 0); +INSERT INTO northwind.order_details VALUES (10444, 41, 7.69999981, 30, 0); +INSERT INTO northwind.order_details VALUES (10445, 39, 14.3999996, 6, 0); +INSERT INTO northwind.order_details VALUES (10445, 54, 5.9000001, 15, 0); +INSERT INTO northwind.order_details VALUES (10446, 19, 7.30000019, 12, 0.100000001); +INSERT INTO northwind.order_details VALUES (10446, 24, 3.5999999, 20, 0.100000001); +INSERT INTO northwind.order_details VALUES (10446, 31, 10, 3, 0.100000001); +INSERT INTO northwind.order_details VALUES (10446, 52, 5.5999999, 15, 0.100000001); +INSERT INTO northwind.order_details VALUES (10447, 19, 7.30000019, 40, 0); +INSERT INTO northwind.order_details VALUES (10447, 65, 16.7999992, 35, 0); +INSERT INTO northwind.order_details VALUES (10447, 71, 17.2000008, 2, 0); +INSERT INTO northwind.order_details VALUES (10448, 26, 24.8999996, 6, 0); +INSERT INTO northwind.order_details VALUES (10448, 40, 14.6999998, 20, 0); +INSERT INTO northwind.order_details VALUES (10449, 10, 24.7999992, 14, 0); +INSERT INTO northwind.order_details VALUES (10449, 52, 5.5999999, 20, 0); +INSERT INTO northwind.order_details VALUES (10449, 62, 39.4000015, 35, 0); +INSERT INTO northwind.order_details VALUES (10450, 10, 24.7999992, 20, 0.200000003); +INSERT INTO northwind.order_details VALUES (10450, 54, 5.9000001, 6, 0.200000003); +INSERT INTO northwind.order_details VALUES (10451, 55, 19.2000008, 120, 0.100000001); +INSERT INTO northwind.order_details VALUES (10451, 64, 26.6000004, 35, 0.100000001); +INSERT INTO northwind.order_details VALUES (10451, 65, 16.7999992, 28, 0.100000001); +INSERT INTO northwind.order_details VALUES (10451, 77, 10.3999996, 55, 0.100000001); +INSERT INTO northwind.order_details VALUES (10452, 28, 36.4000015, 15, 0); +INSERT INTO northwind.order_details VALUES (10452, 44, 15.5, 100, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10454, 16, 13.8999996, 20, 0.200000003); +INSERT INTO northwind.order_details VALUES (10454, 33, 2, 20, 0.200000003); +INSERT INTO northwind.order_details VALUES (10454, 46, 9.60000038, 10, 0.200000003); +INSERT INTO northwind.order_details VALUES (10455, 39, 14.3999996, 20, 0); +INSERT INTO northwind.order_details VALUES (10455, 53, 26.2000008, 50, 0); +INSERT INTO northwind.order_details VALUES (10455, 61, 22.7999992, 25, 0); +INSERT INTO northwind.order_details VALUES (10455, 71, 17.2000008, 30, 0); +INSERT INTO northwind.order_details VALUES (10456, 21, 8, 40, 0.150000006); +INSERT INTO northwind.order_details VALUES (10456, 49, 16, 21, 0.150000006); +INSERT INTO northwind.order_details VALUES (10457, 59, 44, 36, 0); +INSERT INTO northwind.order_details VALUES (10458, 26, 24.8999996, 30, 0); +INSERT INTO northwind.order_details VALUES (10458, 28, 36.4000015, 30, 0); +INSERT INTO northwind.order_details VALUES (10458, 43, 36.7999992, 20, 0); +INSERT INTO northwind.order_details VALUES (10458, 56, 30.3999996, 15, 0); +INSERT INTO northwind.order_details VALUES (10458, 71, 17.2000008, 50, 0); +INSERT INTO northwind.order_details VALUES (10459, 7, 24, 16, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10459, 46, 9.60000038, 20, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10459, 72, 27.7999992, 40, 0); +INSERT INTO northwind.order_details VALUES (10460, 68, 10, 21, 0.25); +INSERT INTO northwind.order_details VALUES (10460, 75, 6.19999981, 4, 0.25); +INSERT INTO northwind.order_details VALUES (10462, 13, 4.80000019, 1, 0); +INSERT INTO northwind.order_details VALUES (10462, 23, 7.19999981, 21, 0); +INSERT INTO northwind.order_details VALUES (10463, 19, 7.30000019, 21, 0); +INSERT INTO northwind.order_details VALUES (10463, 42, 11.1999998, 50, 0); +INSERT INTO northwind.order_details VALUES (10464, 4, 17.6000004, 16, 0.200000003); +INSERT INTO northwind.order_details VALUES (10464, 43, 36.7999992, 3, 0); +INSERT INTO northwind.order_details VALUES (10464, 56, 30.3999996, 30, 0.200000003); +INSERT INTO northwind.order_details VALUES (10464, 60, 27.2000008, 20, 0); +INSERT INTO northwind.order_details VALUES (10275, 24, 3.5999999, 12, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10466, 11, 16.7999992, 10, 0); +INSERT INTO northwind.order_details VALUES (10466, 46, 9.60000038, 5, 0); +INSERT INTO northwind.order_details VALUES (10467, 24, 3.5999999, 28, 0); +INSERT INTO northwind.order_details VALUES (10467, 25, 11.1999998, 12, 0); +INSERT INTO northwind.order_details VALUES (10468, 30, 20.7000008, 8, 0); +INSERT INTO northwind.order_details VALUES (10468, 43, 36.7999992, 15, 0); +INSERT INTO northwind.order_details VALUES (10275, 59, 44, 6, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10470, 18, 50, 30, 0); +INSERT INTO northwind.order_details VALUES (10470, 23, 7.19999981, 15, 0); +INSERT INTO northwind.order_details VALUES (10470, 64, 26.6000004, 8, 0); +INSERT INTO northwind.order_details VALUES (10471, 7, 24, 30, 0); +INSERT INTO northwind.order_details VALUES (10471, 56, 30.3999996, 20, 0); +INSERT INTO northwind.order_details VALUES (10472, 24, 3.5999999, 80, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10472, 51, 42.4000015, 18, 0); +INSERT INTO northwind.order_details VALUES (10474, 14, 18.6000004, 12, 0); +INSERT INTO northwind.order_details VALUES (10474, 28, 36.4000015, 18, 0); +INSERT INTO northwind.order_details VALUES (10474, 40, 14.6999998, 21, 0); +INSERT INTO northwind.order_details VALUES (10474, 75, 6.19999981, 10, 0); +INSERT INTO northwind.order_details VALUES (10475, 31, 10, 35, 0.150000006); +INSERT INTO northwind.order_details VALUES (10475, 66, 13.6000004, 60, 0.150000006); +INSERT INTO northwind.order_details VALUES (10475, 76, 14.3999996, 42, 0.150000006); +INSERT INTO northwind.order_details VALUES (10476, 55, 19.2000008, 2, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10476, 70, 12, 12, 0); +INSERT INTO northwind.order_details VALUES (10477, 1, 14.3999996, 15, 0); +INSERT INTO northwind.order_details VALUES (10477, 21, 8, 21, 0.25); +INSERT INTO northwind.order_details VALUES (10477, 39, 14.3999996, 20, 0.25); +INSERT INTO northwind.order_details VALUES (10478, 10, 24.7999992, 20, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10479, 38, 210.800003, 30, 0); +INSERT INTO northwind.order_details VALUES (10479, 53, 26.2000008, 28, 0); +INSERT INTO northwind.order_details VALUES (10479, 59, 44, 60, 0); +INSERT INTO northwind.order_details VALUES (10479, 64, 26.6000004, 30, 0); +INSERT INTO northwind.order_details VALUES (10480, 47, 7.5999999, 30, 0); +INSERT INTO northwind.order_details VALUES (10480, 59, 44, 12, 0); +INSERT INTO northwind.order_details VALUES (10481, 49, 16, 24, 0); +INSERT INTO northwind.order_details VALUES (10481, 60, 27.2000008, 40, 0); +INSERT INTO northwind.order_details VALUES (10483, 34, 11.1999998, 35, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10483, 77, 10.3999996, 30, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10484, 21, 8, 14, 0); +INSERT INTO northwind.order_details VALUES (10484, 40, 14.6999998, 10, 0); +INSERT INTO northwind.order_details VALUES (10484, 51, 42.4000015, 3, 0); +INSERT INTO northwind.order_details VALUES (10485, 2, 15.1999998, 20, 0.100000001); +INSERT INTO northwind.order_details VALUES (10485, 3, 8, 20, 0.100000001); +INSERT INTO northwind.order_details VALUES (10485, 55, 19.2000008, 30, 0.100000001); +INSERT INTO northwind.order_details VALUES (10485, 70, 12, 60, 0.100000001); +INSERT INTO northwind.order_details VALUES (10487, 19, 7.30000019, 5, 0); +INSERT INTO northwind.order_details VALUES (10487, 26, 24.8999996, 30, 0); +INSERT INTO northwind.order_details VALUES (10487, 54, 5.9000001, 24, 0.25); +INSERT INTO northwind.order_details VALUES (10488, 59, 44, 30, 0); +INSERT INTO northwind.order_details VALUES (10488, 73, 12, 20, 0.200000003); +INSERT INTO northwind.order_details VALUES (10489, 11, 16.7999992, 15, 0.25); +INSERT INTO northwind.order_details VALUES (10489, 16, 13.8999996, 18, 0); +INSERT INTO northwind.order_details VALUES (10490, 59, 44, 60, 0); +INSERT INTO northwind.order_details VALUES (10490, 68, 10, 30, 0); +INSERT INTO northwind.order_details VALUES (10490, 75, 6.19999981, 36, 0); +INSERT INTO northwind.order_details VALUES (10491, 44, 15.5, 15, 0.150000006); +INSERT INTO northwind.order_details VALUES (10491, 77, 10.3999996, 7, 0.150000006); +INSERT INTO northwind.order_details VALUES (10492, 25, 11.1999998, 60, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10492, 42, 11.1999998, 20, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10493, 65, 16.7999992, 15, 0.100000001); +INSERT INTO northwind.order_details VALUES (10493, 66, 13.6000004, 10, 0.100000001); +INSERT INTO northwind.order_details VALUES (10493, 69, 28.7999992, 10, 0.100000001); +INSERT INTO northwind.order_details VALUES (10494, 56, 30.3999996, 30, 0); +INSERT INTO northwind.order_details VALUES (10495, 23, 7.19999981, 10, 0); +INSERT INTO northwind.order_details VALUES (10495, 41, 7.69999981, 20, 0); +INSERT INTO northwind.order_details VALUES (10495, 77, 10.3999996, 5, 0); +INSERT INTO northwind.order_details VALUES (10496, 31, 10, 20, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10497, 56, 30.3999996, 14, 0); +INSERT INTO northwind.order_details VALUES (10497, 72, 27.7999992, 25, 0); +INSERT INTO northwind.order_details VALUES (10497, 77, 10.3999996, 25, 0); +INSERT INTO northwind.order_details VALUES (10498, 24, 4.5, 14, 0); +INSERT INTO northwind.order_details VALUES (10498, 40, 18.3999996, 5, 0); +INSERT INTO northwind.order_details VALUES (10498, 42, 14, 30, 0); +INSERT INTO northwind.order_details VALUES (10499, 28, 45.5999985, 20, 0); +INSERT INTO northwind.order_details VALUES (10499, 49, 20, 25, 0); +INSERT INTO northwind.order_details VALUES (10500, 15, 15.5, 12, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10500, 28, 45.5999985, 8, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10501, 54, 7.44999981, 20, 0); +INSERT INTO northwind.order_details VALUES (10502, 45, 9.5, 21, 0); +INSERT INTO northwind.order_details VALUES (10502, 53, 32.7999992, 6, 0); +INSERT INTO northwind.order_details VALUES (10502, 67, 14, 30, 0); +INSERT INTO northwind.order_details VALUES (10503, 14, 23.25, 70, 0); +INSERT INTO northwind.order_details VALUES (10503, 65, 21.0499992, 20, 0); +INSERT INTO northwind.order_details VALUES (10504, 2, 19, 12, 0); +INSERT INTO northwind.order_details VALUES (10504, 21, 10, 12, 0); +INSERT INTO northwind.order_details VALUES (10504, 53, 32.7999992, 10, 0); +INSERT INTO northwind.order_details VALUES (10504, 61, 28.5, 25, 0); +INSERT INTO northwind.order_details VALUES (10505, 62, 49.2999992, 3, 0); +INSERT INTO northwind.order_details VALUES (10506, 25, 14, 18, 0.100000001); +INSERT INTO northwind.order_details VALUES (10506, 70, 15, 14, 0.100000001); +INSERT INTO northwind.order_details VALUES (10507, 43, 46, 15, 0.150000006); +INSERT INTO northwind.order_details VALUES (10507, 48, 12.75, 15, 0.150000006); +INSERT INTO northwind.order_details VALUES (10509, 28, 45.5999985, 3, 0); +INSERT INTO northwind.order_details VALUES (10510, 29, 123.790001, 36, 0); +INSERT INTO northwind.order_details VALUES (10510, 75, 7.75, 36, 0.100000001); +INSERT INTO northwind.order_details VALUES (10511, 4, 22, 50, 0.150000006); +INSERT INTO northwind.order_details VALUES (10511, 7, 30, 50, 0.150000006); +INSERT INTO northwind.order_details VALUES (10511, 8, 40, 10, 0.150000006); +INSERT INTO northwind.order_details VALUES (10512, 24, 4.5, 10, 0.150000006); +INSERT INTO northwind.order_details VALUES (10512, 46, 12, 9, 0.150000006); +INSERT INTO northwind.order_details VALUES (10512, 47, 9.5, 6, 0.150000006); +INSERT INTO northwind.order_details VALUES (10512, 60, 34, 12, 0.150000006); +INSERT INTO northwind.order_details VALUES (10513, 21, 10, 40, 0.200000003); +INSERT INTO northwind.order_details VALUES (10513, 32, 32, 50, 0.200000003); +INSERT INTO northwind.order_details VALUES (10513, 61, 28.5, 15, 0.200000003); +INSERT INTO northwind.order_details VALUES (10514, 20, 81, 39, 0); +INSERT INTO northwind.order_details VALUES (10514, 28, 45.5999985, 35, 0); +INSERT INTO northwind.order_details VALUES (10514, 56, 38, 70, 0); +INSERT INTO northwind.order_details VALUES (10514, 65, 21.0499992, 39, 0); +INSERT INTO northwind.order_details VALUES (10514, 75, 7.75, 50, 0); +INSERT INTO northwind.order_details VALUES (10515, 9, 97, 16, 0.150000006); +INSERT INTO northwind.order_details VALUES (10515, 16, 17.4500008, 50, 0); +INSERT INTO northwind.order_details VALUES (10515, 27, 43.9000015, 120, 0); +INSERT INTO northwind.order_details VALUES (10515, 33, 2.5, 16, 0.150000006); +INSERT INTO northwind.order_details VALUES (10515, 60, 34, 84, 0.150000006); +INSERT INTO northwind.order_details VALUES (10516, 18, 62.5, 25, 0.100000001); +INSERT INTO northwind.order_details VALUES (10516, 41, 9.64999962, 80, 0.100000001); +INSERT INTO northwind.order_details VALUES (10516, 42, 14, 20, 0); +INSERT INTO northwind.order_details VALUES (10517, 52, 7, 6, 0); +INSERT INTO northwind.order_details VALUES (10517, 59, 55, 4, 0); +INSERT INTO northwind.order_details VALUES (10517, 70, 15, 6, 0); +INSERT INTO northwind.order_details VALUES (10518, 24, 4.5, 5, 0); +INSERT INTO northwind.order_details VALUES (10518, 38, 263.5, 15, 0); +INSERT INTO northwind.order_details VALUES (10518, 44, 19.4500008, 9, 0); +INSERT INTO northwind.order_details VALUES (10519, 10, 31, 16, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10519, 56, 38, 40, 0); +INSERT INTO northwind.order_details VALUES (10519, 60, 34, 10, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10520, 24, 4.5, 8, 0); +INSERT INTO northwind.order_details VALUES (10520, 53, 32.7999992, 5, 0); +INSERT INTO northwind.order_details VALUES (10521, 35, 18, 3, 0); +INSERT INTO northwind.order_details VALUES (10521, 41, 9.64999962, 10, 0); +INSERT INTO northwind.order_details VALUES (10521, 68, 12.5, 6, 0); +INSERT INTO northwind.order_details VALUES (10522, 1, 18, 40, 0.200000003); +INSERT INTO northwind.order_details VALUES (10522, 8, 40, 24, 0); +INSERT INTO northwind.order_details VALUES (10522, 30, 25.8899994, 20, 0.200000003); +INSERT INTO northwind.order_details VALUES (10522, 40, 18.3999996, 25, 0.200000003); +INSERT INTO northwind.order_details VALUES (10523, 17, 39, 25, 0.100000001); +INSERT INTO northwind.order_details VALUES (10523, 20, 81, 15, 0.100000001); +INSERT INTO northwind.order_details VALUES (10523, 37, 26, 18, 0.100000001); +INSERT INTO northwind.order_details VALUES (10523, 41, 9.64999962, 6, 0.100000001); +INSERT INTO northwind.order_details VALUES (10526, 1, 18, 8, 0.150000006); +INSERT INTO northwind.order_details VALUES (10526, 13, 6, 10, 0); +INSERT INTO northwind.order_details VALUES (10526, 56, 38, 30, 0.150000006); +INSERT INTO northwind.order_details VALUES (10527, 4, 22, 50, 0.100000001); +INSERT INTO northwind.order_details VALUES (10527, 36, 19, 30, 0.100000001); +INSERT INTO northwind.order_details VALUES (10528, 11, 21, 3, 0); +INSERT INTO northwind.order_details VALUES (10528, 33, 2.5, 8, 0.200000003); +INSERT INTO northwind.order_details VALUES (10528, 72, 34.7999992, 9, 0); +INSERT INTO northwind.order_details VALUES (10529, 55, 24, 14, 0); +INSERT INTO northwind.order_details VALUES (10529, 68, 12.5, 20, 0); +INSERT INTO northwind.order_details VALUES (10529, 69, 36, 10, 0); +INSERT INTO northwind.order_details VALUES (10530, 17, 39, 40, 0); +INSERT INTO northwind.order_details VALUES (10530, 43, 46, 25, 0); +INSERT INTO northwind.order_details VALUES (10530, 61, 28.5, 20, 0); +INSERT INTO northwind.order_details VALUES (10530, 76, 18, 50, 0); +INSERT INTO northwind.order_details VALUES (10531, 59, 55, 2, 0); +INSERT INTO northwind.order_details VALUES (10532, 30, 25.8899994, 15, 0); +INSERT INTO northwind.order_details VALUES (10532, 66, 17, 24, 0); +INSERT INTO northwind.order_details VALUES (10533, 4, 22, 50, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10533, 72, 34.7999992, 24, 0); +INSERT INTO northwind.order_details VALUES (10533, 73, 15, 24, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10534, 30, 25.8899994, 10, 0); +INSERT INTO northwind.order_details VALUES (10534, 40, 18.3999996, 10, 0.200000003); +INSERT INTO northwind.order_details VALUES (10534, 54, 7.44999981, 10, 0.200000003); +INSERT INTO northwind.order_details VALUES (10535, 11, 21, 50, 0.100000001); +INSERT INTO northwind.order_details VALUES (10535, 40, 18.3999996, 10, 0.100000001); +INSERT INTO northwind.order_details VALUES (10535, 57, 19.5, 5, 0.100000001); +INSERT INTO northwind.order_details VALUES (10535, 59, 55, 15, 0.100000001); +INSERT INTO northwind.order_details VALUES (10536, 12, 38, 15, 0.25); +INSERT INTO northwind.order_details VALUES (10536, 31, 12.5, 20, 0); +INSERT INTO northwind.order_details VALUES (10536, 33, 2.5, 30, 0); +INSERT INTO northwind.order_details VALUES (10536, 60, 34, 35, 0.25); +INSERT INTO northwind.order_details VALUES (10538, 70, 15, 7, 0); +INSERT INTO northwind.order_details VALUES (10538, 72, 34.7999992, 1, 0); +INSERT INTO northwind.order_details VALUES (10539, 13, 6, 8, 0); +INSERT INTO northwind.order_details VALUES (10539, 21, 10, 15, 0); +INSERT INTO northwind.order_details VALUES (10539, 33, 2.5, 15, 0); +INSERT INTO northwind.order_details VALUES (10539, 49, 20, 6, 0); +INSERT INTO northwind.order_details VALUES (10540, 3, 10, 60, 0); +INSERT INTO northwind.order_details VALUES (10540, 26, 31.2299995, 40, 0); +INSERT INTO northwind.order_details VALUES (10540, 38, 263.5, 30, 0); +INSERT INTO northwind.order_details VALUES (10540, 68, 12.5, 35, 0); +INSERT INTO northwind.order_details VALUES (10541, 24, 4.5, 35, 0.100000001); +INSERT INTO northwind.order_details VALUES (10541, 38, 263.5, 4, 0.100000001); +INSERT INTO northwind.order_details VALUES (10541, 65, 21.0499992, 36, 0.100000001); +INSERT INTO northwind.order_details VALUES (10541, 71, 21.5, 9, 0.100000001); +INSERT INTO northwind.order_details VALUES (10543, 12, 38, 30, 0.150000006); +INSERT INTO northwind.order_details VALUES (10543, 23, 9, 70, 0.150000006); +INSERT INTO northwind.order_details VALUES (10544, 28, 45.5999985, 7, 0); +INSERT INTO northwind.order_details VALUES (10544, 67, 14, 7, 0); +INSERT INTO northwind.order_details VALUES (10545, 11, 21, 10, 0); +INSERT INTO northwind.order_details VALUES (10285, 1, 14.3999996, 45, 0.200000003); +INSERT INTO northwind.order_details VALUES (10547, 32, 32, 24, 0.150000006); +INSERT INTO northwind.order_details VALUES (10547, 36, 19, 60, 0); +INSERT INTO northwind.order_details VALUES (10548, 34, 14, 10, 0.25); +INSERT INTO northwind.order_details VALUES (10548, 41, 9.64999962, 14, 0); +INSERT INTO northwind.order_details VALUES (10549, 31, 12.5, 55, 0.150000006); +INSERT INTO northwind.order_details VALUES (10549, 45, 9.5, 100, 0.150000006); +INSERT INTO northwind.order_details VALUES (10549, 51, 53, 48, 0.150000006); +INSERT INTO northwind.order_details VALUES (10550, 17, 39, 8, 0.100000001); +INSERT INTO northwind.order_details VALUES (10550, 19, 9.19999981, 10, 0); +INSERT INTO northwind.order_details VALUES (10550, 21, 10, 6, 0.100000001); +INSERT INTO northwind.order_details VALUES (10550, 61, 28.5, 10, 0.100000001); +INSERT INTO northwind.order_details VALUES (10551, 16, 17.4500008, 40, 0.150000006); +INSERT INTO northwind.order_details VALUES (10551, 35, 18, 20, 0.150000006); +INSERT INTO northwind.order_details VALUES (10551, 44, 19.4500008, 40, 0); +INSERT INTO northwind.order_details VALUES (10552, 69, 36, 18, 0); +INSERT INTO northwind.order_details VALUES (10552, 75, 7.75, 30, 0); +INSERT INTO northwind.order_details VALUES (10553, 11, 21, 15, 0); +INSERT INTO northwind.order_details VALUES (10553, 16, 17.4500008, 14, 0); +INSERT INTO northwind.order_details VALUES (10553, 22, 21, 24, 0); +INSERT INTO northwind.order_details VALUES (10553, 31, 12.5, 30, 0); +INSERT INTO northwind.order_details VALUES (10553, 35, 18, 6, 0); +INSERT INTO northwind.order_details VALUES (10554, 16, 17.4500008, 30, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10554, 23, 9, 20, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10554, 62, 49.2999992, 20, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10554, 77, 13, 10, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10555, 14, 23.25, 30, 0.200000003); +INSERT INTO northwind.order_details VALUES (10555, 19, 9.19999981, 35, 0.200000003); +INSERT INTO northwind.order_details VALUES (10555, 24, 4.5, 18, 0.200000003); +INSERT INTO northwind.order_details VALUES (10555, 51, 53, 20, 0.200000003); +INSERT INTO northwind.order_details VALUES (10555, 56, 38, 40, 0.200000003); +INSERT INTO northwind.order_details VALUES (10556, 72, 34.7999992, 24, 0); +INSERT INTO northwind.order_details VALUES (10557, 64, 33.25, 30, 0); +INSERT INTO northwind.order_details VALUES (10557, 75, 7.75, 20, 0); +INSERT INTO northwind.order_details VALUES (10285, 40, 14.6999998, 40, 0.200000003); +INSERT INTO northwind.order_details VALUES (10285, 53, 26.2000008, 36, 0.200000003); +INSERT INTO northwind.order_details VALUES (10559, 41, 9.64999962, 12, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10559, 55, 24, 18, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10560, 30, 25.8899994, 20, 0); +INSERT INTO northwind.order_details VALUES (10560, 62, 49.2999992, 15, 0.25); +INSERT INTO northwind.order_details VALUES (10561, 44, 19.4500008, 10, 0); +INSERT INTO northwind.order_details VALUES (10561, 51, 53, 50, 0); +INSERT INTO northwind.order_details VALUES (10563, 36, 19, 25, 0); +INSERT INTO northwind.order_details VALUES (10563, 52, 7, 70, 0); +INSERT INTO northwind.order_details VALUES (10564, 17, 39, 16, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10564, 31, 12.5, 6, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10564, 55, 24, 25, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10565, 24, 4.5, 25, 0.100000001); +INSERT INTO northwind.order_details VALUES (10565, 64, 33.25, 18, 0.100000001); +INSERT INTO northwind.order_details VALUES (10566, 11, 21, 35, 0.150000006); +INSERT INTO northwind.order_details VALUES (10566, 18, 62.5, 18, 0.150000006); +INSERT INTO northwind.order_details VALUES (10566, 76, 18, 10, 0); +INSERT INTO northwind.order_details VALUES (10568, 10, 31, 5, 0); +INSERT INTO northwind.order_details VALUES (10569, 31, 12.5, 35, 0.200000003); +INSERT INTO northwind.order_details VALUES (10569, 76, 18, 30, 0); +INSERT INTO northwind.order_details VALUES (10570, 11, 21, 15, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10570, 56, 38, 60, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10571, 14, 23.25, 11, 0.150000006); +INSERT INTO northwind.order_details VALUES (10571, 42, 14, 28, 0.150000006); +INSERT INTO northwind.order_details VALUES (10572, 16, 17.4500008, 12, 0.100000001); +INSERT INTO northwind.order_details VALUES (10572, 32, 32, 10, 0.100000001); +INSERT INTO northwind.order_details VALUES (10572, 40, 18.3999996, 50, 0); +INSERT INTO northwind.order_details VALUES (10572, 75, 7.75, 15, 0.100000001); +INSERT INTO northwind.order_details VALUES (10573, 17, 39, 18, 0); +INSERT INTO northwind.order_details VALUES (10573, 34, 14, 40, 0); +INSERT INTO northwind.order_details VALUES (10573, 53, 32.7999992, 25, 0); +INSERT INTO northwind.order_details VALUES (10574, 33, 2.5, 14, 0); +INSERT INTO northwind.order_details VALUES (10574, 40, 18.3999996, 2, 0); +INSERT INTO northwind.order_details VALUES (10574, 62, 49.2999992, 10, 0); +INSERT INTO northwind.order_details VALUES (10574, 64, 33.25, 6, 0); +INSERT INTO northwind.order_details VALUES (10575, 59, 55, 12, 0); +INSERT INTO northwind.order_details VALUES (10575, 63, 43.9000015, 6, 0); +INSERT INTO northwind.order_details VALUES (10575, 72, 34.7999992, 30, 0); +INSERT INTO northwind.order_details VALUES (10575, 76, 18, 10, 0); +INSERT INTO northwind.order_details VALUES (10576, 1, 18, 10, 0); +INSERT INTO northwind.order_details VALUES (10576, 31, 12.5, 20, 0); +INSERT INTO northwind.order_details VALUES (10576, 44, 19.4500008, 21, 0); +INSERT INTO northwind.order_details VALUES (10577, 39, 18, 10, 0); +INSERT INTO northwind.order_details VALUES (10577, 75, 7.75, 20, 0); +INSERT INTO northwind.order_details VALUES (10577, 77, 13, 18, 0); +INSERT INTO northwind.order_details VALUES (10578, 35, 18, 20, 0); +INSERT INTO northwind.order_details VALUES (10578, 57, 19.5, 6, 0); +INSERT INTO northwind.order_details VALUES (10580, 14, 23.25, 15, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10580, 41, 9.64999962, 9, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10580, 65, 21.0499992, 30, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10581, 75, 7.75, 50, 0.200000003); +INSERT INTO northwind.order_details VALUES (10582, 57, 19.5, 4, 0); +INSERT INTO northwind.order_details VALUES (10582, 76, 18, 14, 0); +INSERT INTO northwind.order_details VALUES (10583, 29, 123.790001, 10, 0); +INSERT INTO northwind.order_details VALUES (10583, 60, 34, 24, 0.150000006); +INSERT INTO northwind.order_details VALUES (10583, 69, 36, 10, 0.150000006); +INSERT INTO northwind.order_details VALUES (10584, 31, 12.5, 50, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10585, 47, 9.5, 15, 0); +INSERT INTO northwind.order_details VALUES (10586, 52, 7, 4, 0.150000006); +INSERT INTO northwind.order_details VALUES (10588, 18, 62.5, 40, 0.200000003); +INSERT INTO northwind.order_details VALUES (10588, 42, 14, 100, 0.200000003); +INSERT INTO northwind.order_details VALUES (10589, 35, 18, 4, 0); +INSERT INTO northwind.order_details VALUES (10590, 1, 18, 20, 0); +INSERT INTO northwind.order_details VALUES (10590, 77, 13, 60, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10592, 15, 15.5, 25, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10592, 26, 31.2299995, 5, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10593, 20, 81, 21, 0.200000003); +INSERT INTO northwind.order_details VALUES (10593, 69, 36, 20, 0.200000003); +INSERT INTO northwind.order_details VALUES (10593, 76, 18, 4, 0.200000003); +INSERT INTO northwind.order_details VALUES (10594, 52, 7, 24, 0); +INSERT INTO northwind.order_details VALUES (10594, 58, 13.25, 30, 0); +INSERT INTO northwind.order_details VALUES (10595, 35, 18, 30, 0.25); +INSERT INTO northwind.order_details VALUES (10595, 61, 28.5, 120, 0.25); +INSERT INTO northwind.order_details VALUES (10595, 69, 36, 65, 0.25); +INSERT INTO northwind.order_details VALUES (10596, 56, 38, 5, 0.200000003); +INSERT INTO northwind.order_details VALUES (10596, 63, 43.9000015, 24, 0.200000003); +INSERT INTO northwind.order_details VALUES (10596, 75, 7.75, 30, 0.200000003); +INSERT INTO northwind.order_details VALUES (10597, 24, 4.5, 35, 0.200000003); +INSERT INTO northwind.order_details VALUES (10597, 57, 19.5, 20, 0); +INSERT INTO northwind.order_details VALUES (10597, 65, 21.0499992, 12, 0.200000003); +INSERT INTO northwind.order_details VALUES (10292, 20, 64.8000031, 20, 0); +INSERT INTO northwind.order_details VALUES (10293, 18, 50, 12, 0); +INSERT INTO northwind.order_details VALUES (10599, 62, 49.2999992, 10, 0); +INSERT INTO northwind.order_details VALUES (10600, 54, 7.44999981, 4, 0); +INSERT INTO northwind.order_details VALUES (10600, 73, 15, 30, 0); +INSERT INTO northwind.order_details VALUES (10601, 13, 6, 60, 0); +INSERT INTO northwind.order_details VALUES (10601, 59, 55, 35, 0); +INSERT INTO northwind.order_details VALUES (10602, 77, 13, 5, 0.25); +INSERT INTO northwind.order_details VALUES (10603, 22, 21, 48, 0); +INSERT INTO northwind.order_details VALUES (10603, 49, 20, 25, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10293, 24, 3.5999999, 10, 0); +INSERT INTO northwind.order_details VALUES (10293, 63, 35.0999985, 5, 0); +INSERT INTO northwind.order_details VALUES (10293, 75, 6.19999981, 6, 0); +INSERT INTO northwind.order_details VALUES (10606, 4, 22, 20, 0.200000003); +INSERT INTO northwind.order_details VALUES (10606, 55, 24, 20, 0.200000003); +INSERT INTO northwind.order_details VALUES (10606, 62, 49.2999992, 10, 0.200000003); +INSERT INTO northwind.order_details VALUES (10607, 7, 30, 45, 0); +INSERT INTO northwind.order_details VALUES (10607, 17, 39, 100, 0); +INSERT INTO northwind.order_details VALUES (10607, 33, 2.5, 14, 0); +INSERT INTO northwind.order_details VALUES (10607, 40, 18.3999996, 42, 0); +INSERT INTO northwind.order_details VALUES (10607, 72, 34.7999992, 12, 0); +INSERT INTO northwind.order_details VALUES (10608, 56, 38, 28, 0); +INSERT INTO northwind.order_details VALUES (10609, 1, 18, 3, 0); +INSERT INTO northwind.order_details VALUES (10609, 10, 31, 10, 0); +INSERT INTO northwind.order_details VALUES (10609, 21, 10, 6, 0); +INSERT INTO northwind.order_details VALUES (10610, 36, 19, 21, 0.25); +INSERT INTO northwind.order_details VALUES (10611, 1, 18, 6, 0); +INSERT INTO northwind.order_details VALUES (10611, 2, 19, 10, 0); +INSERT INTO northwind.order_details VALUES (10611, 60, 34, 15, 0); +INSERT INTO northwind.order_details VALUES (10613, 13, 6, 8, 0.100000001); +INSERT INTO northwind.order_details VALUES (10613, 75, 7.75, 40, 0); +INSERT INTO northwind.order_details VALUES (10614, 11, 21, 14, 0); +INSERT INTO northwind.order_details VALUES (10614, 21, 10, 8, 0); +INSERT INTO northwind.order_details VALUES (10614, 39, 18, 5, 0); +INSERT INTO northwind.order_details VALUES (10615, 55, 24, 5, 0); +INSERT INTO northwind.order_details VALUES (10617, 59, 55, 30, 0.150000006); +INSERT INTO northwind.order_details VALUES (10619, 21, 10, 42, 0); +INSERT INTO northwind.order_details VALUES (10619, 22, 21, 40, 0); +INSERT INTO northwind.order_details VALUES (10620, 24, 4.5, 5, 0); +INSERT INTO northwind.order_details VALUES (10620, 52, 7, 5, 0); +INSERT INTO northwind.order_details VALUES (10621, 19, 9.19999981, 5, 0); +INSERT INTO northwind.order_details VALUES (10621, 23, 9, 10, 0); +INSERT INTO northwind.order_details VALUES (10621, 70, 15, 20, 0); +INSERT INTO northwind.order_details VALUES (10621, 71, 21.5, 15, 0); +INSERT INTO northwind.order_details VALUES (10622, 2, 19, 20, 0); +INSERT INTO northwind.order_details VALUES (10622, 68, 12.5, 18, 0.200000003); +INSERT INTO northwind.order_details VALUES (10623, 14, 23.25, 21, 0); +INSERT INTO northwind.order_details VALUES (10623, 19, 9.19999981, 15, 0.100000001); +INSERT INTO northwind.order_details VALUES (10623, 21, 10, 25, 0.100000001); +INSERT INTO northwind.order_details VALUES (10623, 24, 4.5, 3, 0); +INSERT INTO northwind.order_details VALUES (10623, 35, 18, 30, 0.100000001); +INSERT INTO northwind.order_details VALUES (10624, 28, 45.5999985, 10, 0); +INSERT INTO northwind.order_details VALUES (10624, 29, 123.790001, 6, 0); +INSERT INTO northwind.order_details VALUES (10624, 44, 19.4500008, 10, 0); +INSERT INTO northwind.order_details VALUES (10625, 14, 23.25, 3, 0); +INSERT INTO northwind.order_details VALUES (10625, 42, 14, 5, 0); +INSERT INTO northwind.order_details VALUES (10625, 60, 34, 10, 0); +INSERT INTO northwind.order_details VALUES (10627, 62, 49.2999992, 15, 0); +INSERT INTO northwind.order_details VALUES (10627, 73, 15, 35, 0.150000006); +INSERT INTO northwind.order_details VALUES (10628, 1, 18, 25, 0); +INSERT INTO northwind.order_details VALUES (10629, 29, 123.790001, 20, 0); +INSERT INTO northwind.order_details VALUES (10629, 64, 33.25, 9, 0); +INSERT INTO northwind.order_details VALUES (10631, 75, 7.75, 8, 0.100000001); +INSERT INTO northwind.order_details VALUES (10632, 2, 19, 30, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10632, 33, 2.5, 20, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10633, 12, 38, 36, 0.150000006); +INSERT INTO northwind.order_details VALUES (10633, 13, 6, 13, 0.150000006); +INSERT INTO northwind.order_details VALUES (10633, 26, 31.2299995, 35, 0.150000006); +INSERT INTO northwind.order_details VALUES (10633, 62, 49.2999992, 80, 0.150000006); +INSERT INTO northwind.order_details VALUES (10634, 7, 30, 35, 0); +INSERT INTO northwind.order_details VALUES (10634, 18, 62.5, 50, 0); +INSERT INTO northwind.order_details VALUES (10634, 51, 53, 15, 0); +INSERT INTO northwind.order_details VALUES (10634, 75, 7.75, 2, 0); +INSERT INTO northwind.order_details VALUES (10635, 4, 22, 10, 0.100000001); +INSERT INTO northwind.order_details VALUES (10635, 5, 21.3500004, 15, 0.100000001); +INSERT INTO northwind.order_details VALUES (10635, 22, 21, 40, 0); +INSERT INTO northwind.order_details VALUES (10636, 4, 22, 25, 0); +INSERT INTO northwind.order_details VALUES (10636, 58, 13.25, 6, 0); +INSERT INTO northwind.order_details VALUES (10637, 11, 21, 10, 0); +INSERT INTO northwind.order_details VALUES (10637, 50, 16.25, 25, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10637, 56, 38, 60, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10638, 45, 9.5, 20, 0); +INSERT INTO northwind.order_details VALUES (10638, 65, 21.0499992, 21, 0); +INSERT INTO northwind.order_details VALUES (10638, 72, 34.7999992, 60, 0); +INSERT INTO northwind.order_details VALUES (10639, 18, 62.5, 8, 0); +INSERT INTO northwind.order_details VALUES (10640, 69, 36, 20, 0.25); +INSERT INTO northwind.order_details VALUES (10640, 70, 15, 15, 0.25); +INSERT INTO northwind.order_details VALUES (10641, 2, 19, 50, 0); +INSERT INTO northwind.order_details VALUES (10641, 40, 18.3999996, 60, 0); +INSERT INTO northwind.order_details VALUES (10642, 21, 10, 30, 0.200000003); +INSERT INTO northwind.order_details VALUES (10642, 61, 28.5, 20, 0.200000003); +INSERT INTO northwind.order_details VALUES (10643, 28, 45.5999985, 15, 0.25); +INSERT INTO northwind.order_details VALUES (10643, 39, 18, 21, 0.25); +INSERT INTO northwind.order_details VALUES (10643, 46, 12, 2, 0.25); +INSERT INTO northwind.order_details VALUES (10644, 18, 62.5, 4, 0.100000001); +INSERT INTO northwind.order_details VALUES (10644, 43, 46, 20, 0); +INSERT INTO northwind.order_details VALUES (10644, 46, 12, 21, 0.100000001); +INSERT INTO northwind.order_details VALUES (10645, 18, 62.5, 20, 0); +INSERT INTO northwind.order_details VALUES (10645, 36, 19, 15, 0); +INSERT INTO northwind.order_details VALUES (10646, 1, 18, 15, 0.25); +INSERT INTO northwind.order_details VALUES (10646, 10, 31, 18, 0.25); +INSERT INTO northwind.order_details VALUES (10646, 71, 21.5, 30, 0.25); +INSERT INTO northwind.order_details VALUES (10646, 77, 13, 35, 0.25); +INSERT INTO northwind.order_details VALUES (10647, 19, 9.19999981, 30, 0); +INSERT INTO northwind.order_details VALUES (10647, 39, 18, 20, 0); +INSERT INTO northwind.order_details VALUES (10648, 22, 21, 15, 0); +INSERT INTO northwind.order_details VALUES (10648, 24, 4.5, 15, 0.150000006); +INSERT INTO northwind.order_details VALUES (10649, 28, 45.5999985, 20, 0); +INSERT INTO northwind.order_details VALUES (10649, 72, 34.7999992, 15, 0); +INSERT INTO northwind.order_details VALUES (10650, 30, 25.8899994, 30, 0); +INSERT INTO northwind.order_details VALUES (10650, 53, 32.7999992, 25, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10650, 54, 7.44999981, 30, 0); +INSERT INTO northwind.order_details VALUES (10651, 19, 9.19999981, 12, 0.25); +INSERT INTO northwind.order_details VALUES (10651, 22, 21, 20, 0.25); +INSERT INTO northwind.order_details VALUES (10652, 30, 25.8899994, 2, 0.25); +INSERT INTO northwind.order_details VALUES (10652, 42, 14, 20, 0); +INSERT INTO northwind.order_details VALUES (10654, 4, 22, 12, 0.100000001); +INSERT INTO northwind.order_details VALUES (10654, 39, 18, 20, 0.100000001); +INSERT INTO northwind.order_details VALUES (10654, 54, 7.44999981, 6, 0.100000001); +INSERT INTO northwind.order_details VALUES (10656, 14, 23.25, 3, 0.100000001); +INSERT INTO northwind.order_details VALUES (10656, 44, 19.4500008, 28, 0.100000001); +INSERT INTO northwind.order_details VALUES (10656, 47, 9.5, 6, 0.100000001); +INSERT INTO northwind.order_details VALUES (10657, 15, 15.5, 50, 0); +INSERT INTO northwind.order_details VALUES (10657, 41, 9.64999962, 24, 0); +INSERT INTO northwind.order_details VALUES (10657, 46, 12, 45, 0); +INSERT INTO northwind.order_details VALUES (10657, 47, 9.5, 10, 0); +INSERT INTO northwind.order_details VALUES (10657, 56, 38, 45, 0); +INSERT INTO northwind.order_details VALUES (10657, 60, 34, 30, 0); +INSERT INTO northwind.order_details VALUES (10658, 21, 10, 60, 0); +INSERT INTO northwind.order_details VALUES (10658, 40, 18.3999996, 70, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10658, 60, 34, 55, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10658, 77, 13, 70, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10659, 31, 12.5, 20, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10659, 40, 18.3999996, 24, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10659, 70, 15, 40, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10660, 20, 81, 21, 0); +INSERT INTO northwind.order_details VALUES (10661, 39, 18, 3, 0.200000003); +INSERT INTO northwind.order_details VALUES (10661, 58, 13.25, 49, 0.200000003); +INSERT INTO northwind.order_details VALUES (10662, 68, 12.5, 10, 0); +INSERT INTO northwind.order_details VALUES (10663, 40, 18.3999996, 30, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10663, 42, 14, 30, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10663, 51, 53, 20, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10304, 49, 16, 30, 0); +INSERT INTO northwind.order_details VALUES (10304, 59, 44, 10, 0); +INSERT INTO northwind.order_details VALUES (10666, 29, 123.790001, 36, 0); +INSERT INTO northwind.order_details VALUES (10666, 65, 21.0499992, 10, 0); +INSERT INTO northwind.order_details VALUES (10667, 69, 36, 45, 0.200000003); +INSERT INTO northwind.order_details VALUES (10667, 71, 21.5, 14, 0.200000003); +INSERT INTO northwind.order_details VALUES (10304, 71, 17.2000008, 2, 0); +INSERT INTO northwind.order_details VALUES (10669, 36, 19, 30, 0); +INSERT INTO northwind.order_details VALUES (10670, 23, 9, 32, 0); +INSERT INTO northwind.order_details VALUES (10670, 46, 12, 60, 0); +INSERT INTO northwind.order_details VALUES (10670, 67, 14, 25, 0); +INSERT INTO northwind.order_details VALUES (10670, 73, 15, 50, 0); +INSERT INTO northwind.order_details VALUES (10670, 75, 7.75, 25, 0); +INSERT INTO northwind.order_details VALUES (10306, 30, 20.7000008, 10, 0); +INSERT INTO northwind.order_details VALUES (10306, 53, 26.2000008, 10, 0); +INSERT INTO northwind.order_details VALUES (10672, 38, 263.5, 15, 0.100000001); +INSERT INTO northwind.order_details VALUES (10672, 71, 21.5, 12, 0); +INSERT INTO northwind.order_details VALUES (10673, 16, 17.4500008, 3, 0); +INSERT INTO northwind.order_details VALUES (10673, 42, 14, 6, 0); +INSERT INTO northwind.order_details VALUES (10673, 43, 46, 6, 0); +INSERT INTO northwind.order_details VALUES (10674, 23, 9, 5, 0); +INSERT INTO northwind.order_details VALUES (10675, 14, 23.25, 30, 0); +INSERT INTO northwind.order_details VALUES (10675, 53, 32.7999992, 10, 0); +INSERT INTO northwind.order_details VALUES (10675, 58, 13.25, 30, 0); +INSERT INTO northwind.order_details VALUES (10676, 10, 31, 2, 0); +INSERT INTO northwind.order_details VALUES (10676, 19, 9.19999981, 7, 0); +INSERT INTO northwind.order_details VALUES (10676, 44, 19.4500008, 21, 0); +INSERT INTO northwind.order_details VALUES (10306, 54, 5.9000001, 5, 0); +INSERT INTO northwind.order_details VALUES (10678, 12, 38, 100, 0); +INSERT INTO northwind.order_details VALUES (10678, 33, 2.5, 30, 0); +INSERT INTO northwind.order_details VALUES (10678, 41, 9.64999962, 120, 0); +INSERT INTO northwind.order_details VALUES (10678, 54, 7.44999981, 30, 0); +INSERT INTO northwind.order_details VALUES (10679, 59, 55, 12, 0); +INSERT INTO northwind.order_details VALUES (10681, 19, 9.19999981, 30, 0.100000001); +INSERT INTO northwind.order_details VALUES (10681, 21, 10, 12, 0.100000001); +INSERT INTO northwind.order_details VALUES (10681, 64, 33.25, 28, 0); +INSERT INTO northwind.order_details VALUES (10682, 33, 2.5, 30, 0); +INSERT INTO northwind.order_details VALUES (10682, 66, 17, 4, 0); +INSERT INTO northwind.order_details VALUES (10682, 75, 7.75, 30, 0); +INSERT INTO northwind.order_details VALUES (10683, 52, 7, 9, 0); +INSERT INTO northwind.order_details VALUES (10684, 40, 18.3999996, 20, 0); +INSERT INTO northwind.order_details VALUES (10684, 47, 9.5, 40, 0); +INSERT INTO northwind.order_details VALUES (10684, 60, 34, 30, 0); +INSERT INTO northwind.order_details VALUES (10685, 10, 31, 20, 0); +INSERT INTO northwind.order_details VALUES (10685, 41, 9.64999962, 4, 0); +INSERT INTO northwind.order_details VALUES (10685, 47, 9.5, 15, 0); +INSERT INTO northwind.order_details VALUES (10686, 17, 39, 30, 0.200000003); +INSERT INTO northwind.order_details VALUES (10686, 26, 31.2299995, 15, 0); +INSERT INTO northwind.order_details VALUES (10687, 9, 97, 50, 0.25); +INSERT INTO northwind.order_details VALUES (10687, 29, 123.790001, 10, 0); +INSERT INTO northwind.order_details VALUES (10687, 36, 19, 6, 0.25); +INSERT INTO northwind.order_details VALUES (10688, 10, 31, 18, 0.100000001); +INSERT INTO northwind.order_details VALUES (10688, 28, 45.5999985, 60, 0.100000001); +INSERT INTO northwind.order_details VALUES (10688, 34, 14, 14, 0); +INSERT INTO northwind.order_details VALUES (10691, 1, 18, 30, 0); +INSERT INTO northwind.order_details VALUES (10691, 29, 123.790001, 40, 0); +INSERT INTO northwind.order_details VALUES (10691, 43, 46, 40, 0); +INSERT INTO northwind.order_details VALUES (10691, 44, 19.4500008, 24, 0); +INSERT INTO northwind.order_details VALUES (10691, 62, 49.2999992, 48, 0); +INSERT INTO northwind.order_details VALUES (10692, 63, 43.9000015, 20, 0); +INSERT INTO northwind.order_details VALUES (10693, 9, 97, 6, 0); +INSERT INTO northwind.order_details VALUES (10693, 54, 7.44999981, 60, 0.150000006); +INSERT INTO northwind.order_details VALUES (10693, 69, 36, 30, 0.150000006); +INSERT INTO northwind.order_details VALUES (10693, 73, 15, 15, 0.150000006); +INSERT INTO northwind.order_details VALUES (10694, 7, 30, 90, 0); +INSERT INTO northwind.order_details VALUES (10694, 59, 55, 25, 0); +INSERT INTO northwind.order_details VALUES (10694, 70, 15, 50, 0); +INSERT INTO northwind.order_details VALUES (10695, 8, 40, 10, 0); +INSERT INTO northwind.order_details VALUES (10695, 12, 38, 4, 0); +INSERT INTO northwind.order_details VALUES (10695, 24, 4.5, 20, 0); +INSERT INTO northwind.order_details VALUES (10696, 17, 39, 20, 0); +INSERT INTO northwind.order_details VALUES (10696, 46, 12, 18, 0); +INSERT INTO northwind.order_details VALUES (10697, 19, 9.19999981, 7, 0.25); +INSERT INTO northwind.order_details VALUES (10697, 35, 18, 9, 0.25); +INSERT INTO northwind.order_details VALUES (10697, 58, 13.25, 30, 0.25); +INSERT INTO northwind.order_details VALUES (10697, 70, 15, 30, 0.25); +INSERT INTO northwind.order_details VALUES (10698, 11, 21, 15, 0); +INSERT INTO northwind.order_details VALUES (10698, 17, 39, 8, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10698, 29, 123.790001, 12, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10698, 65, 21.0499992, 65, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10698, 70, 15, 8, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10699, 47, 9.5, 12, 0); +INSERT INTO northwind.order_details VALUES (10700, 1, 18, 5, 0.200000003); +INSERT INTO northwind.order_details VALUES (10700, 34, 14, 12, 0.200000003); +INSERT INTO northwind.order_details VALUES (10700, 68, 12.5, 40, 0.200000003); +INSERT INTO northwind.order_details VALUES (10700, 71, 21.5, 60, 0.200000003); +INSERT INTO northwind.order_details VALUES (10701, 59, 55, 42, 0.150000006); +INSERT INTO northwind.order_details VALUES (10701, 71, 21.5, 20, 0.150000006); +INSERT INTO northwind.order_details VALUES (10701, 76, 18, 35, 0.150000006); +INSERT INTO northwind.order_details VALUES (10702, 3, 10, 6, 0); +INSERT INTO northwind.order_details VALUES (10702, 76, 18, 15, 0); +INSERT INTO northwind.order_details VALUES (10703, 2, 19, 5, 0); +INSERT INTO northwind.order_details VALUES (10703, 59, 55, 35, 0); +INSERT INTO northwind.order_details VALUES (10703, 73, 15, 35, 0); +INSERT INTO northwind.order_details VALUES (10704, 4, 22, 6, 0); +INSERT INTO northwind.order_details VALUES (10704, 24, 4.5, 35, 0); +INSERT INTO northwind.order_details VALUES (10704, 48, 12.75, 24, 0); +INSERT INTO northwind.order_details VALUES (10705, 31, 12.5, 20, 0); +INSERT INTO northwind.order_details VALUES (10705, 32, 32, 4, 0); +INSERT INTO northwind.order_details VALUES (10706, 16, 17.4500008, 20, 0); +INSERT INTO northwind.order_details VALUES (10706, 43, 46, 24, 0); +INSERT INTO northwind.order_details VALUES (10706, 59, 55, 8, 0); +INSERT INTO northwind.order_details VALUES (10707, 55, 24, 21, 0); +INSERT INTO northwind.order_details VALUES (10707, 57, 19.5, 40, 0); +INSERT INTO northwind.order_details VALUES (10707, 70, 15, 28, 0.150000006); +INSERT INTO northwind.order_details VALUES (10708, 5, 21.3500004, 4, 0); +INSERT INTO northwind.order_details VALUES (10708, 36, 19, 5, 0); +INSERT INTO northwind.order_details VALUES (10311, 42, 11.1999998, 6, 0); +INSERT INTO northwind.order_details VALUES (10711, 19, 9.19999981, 12, 0); +INSERT INTO northwind.order_details VALUES (10711, 41, 9.64999962, 42, 0); +INSERT INTO northwind.order_details VALUES (10711, 53, 32.7999992, 120, 0); +INSERT INTO northwind.order_details VALUES (10712, 53, 32.7999992, 3, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10712, 56, 38, 30, 0); +INSERT INTO northwind.order_details VALUES (10311, 69, 28.7999992, 7, 0); +INSERT INTO northwind.order_details VALUES (10714, 2, 19, 30, 0.25); +INSERT INTO northwind.order_details VALUES (10714, 17, 39, 27, 0.25); +INSERT INTO northwind.order_details VALUES (10714, 47, 9.5, 50, 0.25); +INSERT INTO northwind.order_details VALUES (10714, 56, 38, 18, 0.25); +INSERT INTO northwind.order_details VALUES (10714, 58, 13.25, 12, 0.25); +INSERT INTO northwind.order_details VALUES (10715, 10, 31, 21, 0); +INSERT INTO northwind.order_details VALUES (10715, 71, 21.5, 30, 0); +INSERT INTO northwind.order_details VALUES (10716, 21, 10, 5, 0); +INSERT INTO northwind.order_details VALUES (10716, 51, 53, 7, 0); +INSERT INTO northwind.order_details VALUES (10716, 61, 28.5, 10, 0); +INSERT INTO northwind.order_details VALUES (10314, 32, 25.6000004, 40, 0.100000001); +INSERT INTO northwind.order_details VALUES (10314, 58, 10.6000004, 30, 0.100000001); +INSERT INTO northwind.order_details VALUES (10314, 62, 39.4000015, 25, 0.100000001); +INSERT INTO northwind.order_details VALUES (10719, 18, 62.5, 12, 0.25); +INSERT INTO northwind.order_details VALUES (10719, 30, 25.8899994, 3, 0.25); +INSERT INTO northwind.order_details VALUES (10719, 54, 7.44999981, 40, 0.25); +INSERT INTO northwind.order_details VALUES (10720, 35, 18, 21, 0); +INSERT INTO northwind.order_details VALUES (10720, 71, 21.5, 8, 0); +INSERT INTO northwind.order_details VALUES (10721, 44, 19.4500008, 50, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10722, 2, 19, 3, 0); +INSERT INTO northwind.order_details VALUES (10722, 31, 12.5, 50, 0); +INSERT INTO northwind.order_details VALUES (10722, 68, 12.5, 45, 0); +INSERT INTO northwind.order_details VALUES (10722, 75, 7.75, 42, 0); +INSERT INTO northwind.order_details VALUES (10723, 26, 31.2299995, 15, 0); +INSERT INTO northwind.order_details VALUES (10724, 10, 31, 16, 0); +INSERT INTO northwind.order_details VALUES (10724, 61, 28.5, 5, 0); +INSERT INTO northwind.order_details VALUES (10725, 41, 9.64999962, 12, 0); +INSERT INTO northwind.order_details VALUES (10725, 52, 7, 4, 0); +INSERT INTO northwind.order_details VALUES (10725, 55, 24, 6, 0); +INSERT INTO northwind.order_details VALUES (10726, 4, 22, 25, 0); +INSERT INTO northwind.order_details VALUES (10726, 11, 21, 5, 0); +INSERT INTO northwind.order_details VALUES (10727, 17, 39, 20, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10727, 56, 38, 10, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10727, 59, 55, 10, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10728, 30, 25.8899994, 15, 0); +INSERT INTO northwind.order_details VALUES (10728, 40, 18.3999996, 6, 0); +INSERT INTO northwind.order_details VALUES (10728, 55, 24, 12, 0); +INSERT INTO northwind.order_details VALUES (10728, 60, 34, 15, 0); +INSERT INTO northwind.order_details VALUES (10729, 1, 18, 50, 0); +INSERT INTO northwind.order_details VALUES (10729, 21, 10, 30, 0); +INSERT INTO northwind.order_details VALUES (10729, 50, 16.25, 40, 0); +INSERT INTO northwind.order_details VALUES (10730, 16, 17.4500008, 15, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10730, 31, 12.5, 3, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10730, 65, 21.0499992, 10, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10731, 21, 10, 40, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10731, 51, 53, 30, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10732, 76, 18, 20, 0); +INSERT INTO northwind.order_details VALUES (10316, 41, 7.69999981, 10, 0); +INSERT INTO northwind.order_details VALUES (10316, 62, 39.4000015, 70, 0); +INSERT INTO northwind.order_details VALUES (10734, 6, 25, 30, 0); +INSERT INTO northwind.order_details VALUES (10734, 30, 25.8899994, 15, 0); +INSERT INTO northwind.order_details VALUES (10734, 76, 18, 20, 0); +INSERT INTO northwind.order_details VALUES (10735, 61, 28.5, 20, 0.100000001); +INSERT INTO northwind.order_details VALUES (10735, 77, 13, 2, 0.100000001); +INSERT INTO northwind.order_details VALUES (10736, 65, 21.0499992, 40, 0); +INSERT INTO northwind.order_details VALUES (10736, 75, 7.75, 20, 0); +INSERT INTO northwind.order_details VALUES (10737, 13, 6, 4, 0); +INSERT INTO northwind.order_details VALUES (10737, 41, 9.64999962, 12, 0); +INSERT INTO northwind.order_details VALUES (10738, 16, 17.4500008, 3, 0); +INSERT INTO northwind.order_details VALUES (10739, 36, 19, 6, 0); +INSERT INTO northwind.order_details VALUES (10739, 52, 7, 18, 0); +INSERT INTO northwind.order_details VALUES (10740, 28, 45.5999985, 5, 0.200000003); +INSERT INTO northwind.order_details VALUES (10740, 35, 18, 35, 0.200000003); +INSERT INTO northwind.order_details VALUES (10740, 45, 9.5, 40, 0.200000003); +INSERT INTO northwind.order_details VALUES (10740, 56, 38, 14, 0.200000003); +INSERT INTO northwind.order_details VALUES (10741, 2, 19, 15, 0.200000003); +INSERT INTO northwind.order_details VALUES (10742, 3, 10, 20, 0); +INSERT INTO northwind.order_details VALUES (10742, 60, 34, 50, 0); +INSERT INTO northwind.order_details VALUES (10742, 72, 34.7999992, 35, 0); +INSERT INTO northwind.order_details VALUES (10744, 40, 18.3999996, 50, 0.200000003); +INSERT INTO northwind.order_details VALUES (10745, 18, 62.5, 24, 0); +INSERT INTO northwind.order_details VALUES (10745, 44, 19.4500008, 16, 0); +INSERT INTO northwind.order_details VALUES (10745, 59, 55, 45, 0); +INSERT INTO northwind.order_details VALUES (10745, 72, 34.7999992, 7, 0); +INSERT INTO northwind.order_details VALUES (10747, 31, 12.5, 8, 0); +INSERT INTO northwind.order_details VALUES (10747, 41, 9.64999962, 35, 0); +INSERT INTO northwind.order_details VALUES (10747, 63, 43.9000015, 9, 0); +INSERT INTO northwind.order_details VALUES (10747, 69, 36, 30, 0); +INSERT INTO northwind.order_details VALUES (10748, 23, 9, 44, 0); +INSERT INTO northwind.order_details VALUES (10748, 40, 18.3999996, 40, 0); +INSERT INTO northwind.order_details VALUES (10748, 56, 38, 28, 0); +INSERT INTO northwind.order_details VALUES (10749, 56, 38, 15, 0); +INSERT INTO northwind.order_details VALUES (10749, 59, 55, 6, 0); +INSERT INTO northwind.order_details VALUES (10749, 76, 18, 10, 0); +INSERT INTO northwind.order_details VALUES (10750, 14, 23.25, 5, 0.150000006); +INSERT INTO northwind.order_details VALUES (10750, 45, 9.5, 40, 0.150000006); +INSERT INTO northwind.order_details VALUES (10750, 59, 55, 25, 0.150000006); +INSERT INTO northwind.order_details VALUES (10751, 26, 31.2299995, 12, 0.100000001); +INSERT INTO northwind.order_details VALUES (10751, 30, 25.8899994, 30, 0); +INSERT INTO northwind.order_details VALUES (10751, 50, 16.25, 20, 0.100000001); +INSERT INTO northwind.order_details VALUES (10751, 73, 15, 15, 0); +INSERT INTO northwind.order_details VALUES (10752, 1, 18, 8, 0); +INSERT INTO northwind.order_details VALUES (10752, 69, 36, 3, 0); +INSERT INTO northwind.order_details VALUES (10753, 45, 9.5, 4, 0); +INSERT INTO northwind.order_details VALUES (10753, 74, 10, 5, 0); +INSERT INTO northwind.order_details VALUES (10754, 40, 18.3999996, 3, 0); +INSERT INTO northwind.order_details VALUES (10755, 47, 9.5, 30, 0.25); +INSERT INTO northwind.order_details VALUES (10755, 56, 38, 30, 0.25); +INSERT INTO northwind.order_details VALUES (10755, 57, 19.5, 14, 0.25); +INSERT INTO northwind.order_details VALUES (10755, 69, 36, 25, 0.25); +INSERT INTO northwind.order_details VALUES (10756, 18, 62.5, 21, 0.200000003); +INSERT INTO northwind.order_details VALUES (10756, 36, 19, 20, 0.200000003); +INSERT INTO northwind.order_details VALUES (10756, 68, 12.5, 6, 0.200000003); +INSERT INTO northwind.order_details VALUES (10756, 69, 36, 20, 0.200000003); +INSERT INTO northwind.order_details VALUES (10757, 34, 14, 30, 0); +INSERT INTO northwind.order_details VALUES (10757, 59, 55, 7, 0); +INSERT INTO northwind.order_details VALUES (10757, 62, 49.2999992, 30, 0); +INSERT INTO northwind.order_details VALUES (10757, 64, 33.25, 24, 0); +INSERT INTO northwind.order_details VALUES (10758, 26, 31.2299995, 20, 0); +INSERT INTO northwind.order_details VALUES (10758, 52, 7, 60, 0); +INSERT INTO northwind.order_details VALUES (10758, 70, 15, 40, 0); +INSERT INTO northwind.order_details VALUES (10759, 32, 32, 10, 0); +INSERT INTO northwind.order_details VALUES (10760, 25, 14, 12, 0.25); +INSERT INTO northwind.order_details VALUES (10760, 27, 43.9000015, 40, 0); +INSERT INTO northwind.order_details VALUES (10760, 43, 46, 30, 0.25); +INSERT INTO northwind.order_details VALUES (10761, 25, 14, 35, 0.25); +INSERT INTO northwind.order_details VALUES (10761, 75, 7.75, 18, 0); +INSERT INTO northwind.order_details VALUES (10762, 39, 18, 16, 0); +INSERT INTO northwind.order_details VALUES (10762, 47, 9.5, 30, 0); +INSERT INTO northwind.order_details VALUES (10762, 51, 53, 28, 0); +INSERT INTO northwind.order_details VALUES (10762, 56, 38, 60, 0); +INSERT INTO northwind.order_details VALUES (10763, 21, 10, 40, 0); +INSERT INTO northwind.order_details VALUES (10763, 22, 21, 6, 0); +INSERT INTO northwind.order_details VALUES (10763, 24, 4.5, 20, 0); +INSERT INTO northwind.order_details VALUES (10764, 3, 10, 20, 0.100000001); +INSERT INTO northwind.order_details VALUES (10764, 39, 18, 130, 0.100000001); +INSERT INTO northwind.order_details VALUES (10765, 65, 21.0499992, 80, 0.100000001); +INSERT INTO northwind.order_details VALUES (10766, 2, 19, 40, 0); +INSERT INTO northwind.order_details VALUES (10766, 7, 30, 35, 0); +INSERT INTO northwind.order_details VALUES (10766, 68, 12.5, 40, 0); +INSERT INTO northwind.order_details VALUES (10767, 42, 14, 2, 0); +INSERT INTO northwind.order_details VALUES (10768, 22, 21, 4, 0); +INSERT INTO northwind.order_details VALUES (10768, 31, 12.5, 50, 0); +INSERT INTO northwind.order_details VALUES (10768, 60, 34, 15, 0); +INSERT INTO northwind.order_details VALUES (10768, 71, 21.5, 12, 0); +INSERT INTO northwind.order_details VALUES (10769, 41, 9.64999962, 30, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10769, 52, 7, 15, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10769, 61, 28.5, 20, 0); +INSERT INTO northwind.order_details VALUES (10769, 62, 49.2999992, 15, 0); +INSERT INTO northwind.order_details VALUES (10770, 11, 21, 15, 0.25); +INSERT INTO northwind.order_details VALUES (10771, 71, 21.5, 16, 0); +INSERT INTO northwind.order_details VALUES (10772, 29, 123.790001, 18, 0); +INSERT INTO northwind.order_details VALUES (10772, 59, 55, 25, 0); +INSERT INTO northwind.order_details VALUES (10774, 31, 12.5, 2, 0.25); +INSERT INTO northwind.order_details VALUES (10774, 66, 17, 50, 0); +INSERT INTO northwind.order_details VALUES (10775, 10, 31, 6, 0); +INSERT INTO northwind.order_details VALUES (10775, 67, 14, 3, 0); +INSERT INTO northwind.order_details VALUES (10777, 42, 14, 20, 0.200000003); +INSERT INTO northwind.order_details VALUES (10778, 41, 9.64999962, 10, 0); +INSERT INTO northwind.order_details VALUES (10779, 16, 17.4500008, 20, 0); +INSERT INTO northwind.order_details VALUES (10779, 62, 49.2999992, 20, 0); +INSERT INTO northwind.order_details VALUES (10780, 70, 15, 35, 0); +INSERT INTO northwind.order_details VALUES (10780, 77, 13, 15, 0); +INSERT INTO northwind.order_details VALUES (10781, 54, 7.44999981, 3, 0.200000003); +INSERT INTO northwind.order_details VALUES (10781, 56, 38, 20, 0.200000003); +INSERT INTO northwind.order_details VALUES (10781, 74, 10, 35, 0); +INSERT INTO northwind.order_details VALUES (10782, 31, 12.5, 1, 0); +INSERT INTO northwind.order_details VALUES (10783, 31, 12.5, 10, 0); +INSERT INTO northwind.order_details VALUES (10783, 38, 263.5, 5, 0); +INSERT INTO northwind.order_details VALUES (10784, 36, 19, 30, 0); +INSERT INTO northwind.order_details VALUES (10784, 39, 18, 2, 0.150000006); +INSERT INTO northwind.order_details VALUES (10784, 72, 34.7999992, 30, 0.150000006); +INSERT INTO northwind.order_details VALUES (10786, 8, 40, 30, 0.200000003); +INSERT INTO northwind.order_details VALUES (10786, 30, 25.8899994, 15, 0.200000003); +INSERT INTO northwind.order_details VALUES (10786, 75, 7.75, 42, 0.200000003); +INSERT INTO northwind.order_details VALUES (10787, 2, 19, 15, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10787, 29, 123.790001, 20, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10325, 6, 20, 6, 0); +INSERT INTO northwind.order_details VALUES (10325, 13, 4.80000019, 12, 0); +INSERT INTO northwind.order_details VALUES (10325, 14, 18.6000004, 9, 0); +INSERT INTO northwind.order_details VALUES (10325, 31, 10, 4, 0); +INSERT INTO northwind.order_details VALUES (10790, 7, 30, 3, 0.150000006); +INSERT INTO northwind.order_details VALUES (10790, 56, 38, 20, 0.150000006); +INSERT INTO northwind.order_details VALUES (10791, 29, 123.790001, 14, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10791, 41, 9.64999962, 20, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10325, 72, 27.7999992, 40, 0); +INSERT INTO northwind.order_details VALUES (10793, 41, 9.64999962, 14, 0); +INSERT INTO northwind.order_details VALUES (10793, 52, 7, 8, 0); +INSERT INTO northwind.order_details VALUES (10794, 14, 23.25, 15, 0.200000003); +INSERT INTO northwind.order_details VALUES (10794, 54, 7.44999981, 6, 0.200000003); +INSERT INTO northwind.order_details VALUES (10795, 16, 17.4500008, 65, 0); +INSERT INTO northwind.order_details VALUES (10795, 17, 39, 35, 0.25); +INSERT INTO northwind.order_details VALUES (10796, 26, 31.2299995, 21, 0.200000003); +INSERT INTO northwind.order_details VALUES (10796, 44, 19.4500008, 10, 0); +INSERT INTO northwind.order_details VALUES (10796, 64, 33.25, 35, 0.200000003); +INSERT INTO northwind.order_details VALUES (10796, 69, 36, 24, 0.200000003); +INSERT INTO northwind.order_details VALUES (10797, 11, 21, 20, 0); +INSERT INTO northwind.order_details VALUES (10798, 62, 49.2999992, 2, 0); +INSERT INTO northwind.order_details VALUES (10798, 72, 34.7999992, 10, 0); +INSERT INTO northwind.order_details VALUES (10799, 13, 6, 20, 0.150000006); +INSERT INTO northwind.order_details VALUES (10799, 24, 4.5, 20, 0.150000006); +INSERT INTO northwind.order_details VALUES (10799, 59, 55, 25, 0); +INSERT INTO northwind.order_details VALUES (10801, 17, 39, 40, 0.25); +INSERT INTO northwind.order_details VALUES (10801, 29, 123.790001, 20, 0.25); +INSERT INTO northwind.order_details VALUES (10802, 30, 25.8899994, 25, 0.25); +INSERT INTO northwind.order_details VALUES (10802, 51, 53, 30, 0.25); +INSERT INTO northwind.order_details VALUES (10802, 55, 24, 60, 0.25); +INSERT INTO northwind.order_details VALUES (10802, 62, 49.2999992, 5, 0.25); +INSERT INTO northwind.order_details VALUES (10803, 19, 9.19999981, 24, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10803, 25, 14, 15, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10803, 59, 55, 15, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10804, 10, 31, 36, 0); +INSERT INTO northwind.order_details VALUES (10804, 28, 45.5999985, 24, 0); +INSERT INTO northwind.order_details VALUES (10804, 49, 20, 4, 0.150000006); +INSERT INTO northwind.order_details VALUES (10805, 34, 14, 10, 0); +INSERT INTO northwind.order_details VALUES (10805, 38, 263.5, 10, 0); +INSERT INTO northwind.order_details VALUES (10806, 2, 19, 20, 0.25); +INSERT INTO northwind.order_details VALUES (10806, 65, 21.0499992, 2, 0); +INSERT INTO northwind.order_details VALUES (10806, 74, 10, 15, 0.25); +INSERT INTO northwind.order_details VALUES (10807, 40, 18.3999996, 1, 0); +INSERT INTO northwind.order_details VALUES (10808, 56, 38, 20, 0.150000006); +INSERT INTO northwind.order_details VALUES (10808, 76, 18, 50, 0.150000006); +INSERT INTO northwind.order_details VALUES (10809, 52, 7, 20, 0); +INSERT INTO northwind.order_details VALUES (10810, 13, 6, 7, 0); +INSERT INTO northwind.order_details VALUES (10810, 25, 14, 5, 0); +INSERT INTO northwind.order_details VALUES (10810, 70, 15, 5, 0); +INSERT INTO northwind.order_details VALUES (10811, 19, 9.19999981, 15, 0); +INSERT INTO northwind.order_details VALUES (10811, 23, 9, 18, 0); +INSERT INTO northwind.order_details VALUES (10811, 40, 18.3999996, 30, 0); +INSERT INTO northwind.order_details VALUES (10812, 31, 12.5, 16, 0.100000001); +INSERT INTO northwind.order_details VALUES (10812, 72, 34.7999992, 40, 0.100000001); +INSERT INTO northwind.order_details VALUES (10812, 77, 13, 20, 0); +INSERT INTO northwind.order_details VALUES (10814, 41, 9.64999962, 20, 0); +INSERT INTO northwind.order_details VALUES (10814, 43, 46, 20, 0.150000006); +INSERT INTO northwind.order_details VALUES (10814, 48, 12.75, 8, 0.150000006); +INSERT INTO northwind.order_details VALUES (10814, 61, 28.5, 30, 0.150000006); +INSERT INTO northwind.order_details VALUES (10815, 33, 2.5, 16, 0); +INSERT INTO northwind.order_details VALUES (10816, 38, 263.5, 30, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10816, 62, 49.2999992, 20, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10817, 26, 31.2299995, 40, 0.150000006); +INSERT INTO northwind.order_details VALUES (10817, 38, 263.5, 30, 0); +INSERT INTO northwind.order_details VALUES (10817, 40, 18.3999996, 60, 0.150000006); +INSERT INTO northwind.order_details VALUES (10817, 62, 49.2999992, 25, 0.150000006); +INSERT INTO northwind.order_details VALUES (10818, 32, 32, 20, 0); +INSERT INTO northwind.order_details VALUES (10818, 41, 9.64999962, 20, 0); +INSERT INTO northwind.order_details VALUES (10819, 43, 46, 7, 0); +INSERT INTO northwind.order_details VALUES (10819, 75, 7.75, 20, 0); +INSERT INTO northwind.order_details VALUES (10820, 56, 38, 30, 0); +INSERT INTO northwind.order_details VALUES (10822, 62, 49.2999992, 3, 0); +INSERT INTO northwind.order_details VALUES (10822, 70, 15, 6, 0); +INSERT INTO northwind.order_details VALUES (10823, 11, 21, 20, 0.100000001); +INSERT INTO northwind.order_details VALUES (10823, 57, 19.5, 15, 0); +INSERT INTO northwind.order_details VALUES (10823, 59, 55, 40, 0.100000001); +INSERT INTO northwind.order_details VALUES (10823, 77, 13, 15, 0.100000001); +INSERT INTO northwind.order_details VALUES (10824, 41, 9.64999962, 12, 0); +INSERT INTO northwind.order_details VALUES (10824, 70, 15, 9, 0); +INSERT INTO northwind.order_details VALUES (10826, 31, 12.5, 35, 0); +INSERT INTO northwind.order_details VALUES (10826, 57, 19.5, 15, 0); +INSERT INTO northwind.order_details VALUES (10828, 20, 81, 5, 0); +INSERT INTO northwind.order_details VALUES (10828, 38, 263.5, 2, 0); +INSERT INTO northwind.order_details VALUES (10829, 2, 19, 10, 0); +INSERT INTO northwind.order_details VALUES (10829, 8, 40, 20, 0); +INSERT INTO northwind.order_details VALUES (10829, 13, 6, 10, 0); +INSERT INTO northwind.order_details VALUES (10829, 60, 34, 21, 0); +INSERT INTO northwind.order_details VALUES (10830, 6, 25, 6, 0); +INSERT INTO northwind.order_details VALUES (10830, 39, 18, 28, 0); +INSERT INTO northwind.order_details VALUES (10830, 60, 34, 30, 0); +INSERT INTO northwind.order_details VALUES (10830, 68, 12.5, 24, 0); +INSERT INTO northwind.order_details VALUES (10831, 19, 9.19999981, 2, 0); +INSERT INTO northwind.order_details VALUES (10831, 35, 18, 8, 0); +INSERT INTO northwind.order_details VALUES (10831, 38, 263.5, 8, 0); +INSERT INTO northwind.order_details VALUES (10831, 43, 46, 9, 0); +INSERT INTO northwind.order_details VALUES (10832, 13, 6, 3, 0.200000003); +INSERT INTO northwind.order_details VALUES (10832, 25, 14, 10, 0.200000003); +INSERT INTO northwind.order_details VALUES (10832, 44, 19.4500008, 16, 0.200000003); +INSERT INTO northwind.order_details VALUES (10832, 64, 33.25, 3, 0); +INSERT INTO northwind.order_details VALUES (10833, 7, 30, 20, 0.100000001); +INSERT INTO northwind.order_details VALUES (10833, 31, 12.5, 9, 0.100000001); +INSERT INTO northwind.order_details VALUES (10833, 53, 32.7999992, 9, 0.100000001); +INSERT INTO northwind.order_details VALUES (10836, 22, 21, 52, 0); +INSERT INTO northwind.order_details VALUES (10836, 35, 18, 6, 0); +INSERT INTO northwind.order_details VALUES (10836, 57, 19.5, 24, 0); +INSERT INTO northwind.order_details VALUES (10836, 60, 34, 60, 0); +INSERT INTO northwind.order_details VALUES (10836, 64, 33.25, 30, 0); +INSERT INTO northwind.order_details VALUES (10837, 13, 6, 6, 0); +INSERT INTO northwind.order_details VALUES (10837, 40, 18.3999996, 25, 0); +INSERT INTO northwind.order_details VALUES (10837, 47, 9.5, 40, 0.25); +INSERT INTO northwind.order_details VALUES (10837, 76, 18, 21, 0.25); +INSERT INTO northwind.order_details VALUES (10838, 1, 18, 4, 0.25); +INSERT INTO northwind.order_details VALUES (10838, 18, 62.5, 25, 0.25); +INSERT INTO northwind.order_details VALUES (10838, 36, 19, 50, 0.25); +INSERT INTO northwind.order_details VALUES (10839, 58, 13.25, 30, 0.100000001); +INSERT INTO northwind.order_details VALUES (10839, 72, 34.7999992, 15, 0.100000001); +INSERT INTO northwind.order_details VALUES (10840, 25, 14, 6, 0.200000003); +INSERT INTO northwind.order_details VALUES (10840, 39, 18, 10, 0.200000003); +INSERT INTO northwind.order_details VALUES (10841, 10, 31, 16, 0); +INSERT INTO northwind.order_details VALUES (10841, 56, 38, 30, 0); +INSERT INTO northwind.order_details VALUES (10841, 59, 55, 50, 0); +INSERT INTO northwind.order_details VALUES (10841, 77, 13, 15, 0); +INSERT INTO northwind.order_details VALUES (10843, 51, 53, 4, 0.25); +INSERT INTO northwind.order_details VALUES (10844, 22, 21, 35, 0); +INSERT INTO northwind.order_details VALUES (10845, 23, 9, 70, 0.100000001); +INSERT INTO northwind.order_details VALUES (10845, 35, 18, 25, 0.100000001); +INSERT INTO northwind.order_details VALUES (10845, 42, 14, 42, 0.100000001); +INSERT INTO northwind.order_details VALUES (10845, 58, 13.25, 60, 0.100000001); +INSERT INTO northwind.order_details VALUES (10845, 64, 33.25, 48, 0); +INSERT INTO northwind.order_details VALUES (10846, 4, 22, 21, 0); +INSERT INTO northwind.order_details VALUES (10846, 70, 15, 30, 0); +INSERT INTO northwind.order_details VALUES (10846, 74, 10, 20, 0); +INSERT INTO northwind.order_details VALUES (10847, 1, 18, 80, 0.200000003); +INSERT INTO northwind.order_details VALUES (10847, 19, 9.19999981, 12, 0.200000003); +INSERT INTO northwind.order_details VALUES (10847, 37, 26, 60, 0.200000003); +INSERT INTO northwind.order_details VALUES (10847, 45, 9.5, 36, 0.200000003); +INSERT INTO northwind.order_details VALUES (10847, 60, 34, 45, 0.200000003); +INSERT INTO northwind.order_details VALUES (10847, 71, 21.5, 55, 0.200000003); +INSERT INTO northwind.order_details VALUES (10848, 5, 21.3500004, 30, 0); +INSERT INTO northwind.order_details VALUES (10848, 9, 97, 3, 0); +INSERT INTO northwind.order_details VALUES (10849, 3, 10, 49, 0); +INSERT INTO northwind.order_details VALUES (10849, 26, 31.2299995, 18, 0.150000006); +INSERT INTO northwind.order_details VALUES (10851, 2, 19, 5, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10851, 25, 14, 10, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10851, 57, 19.5, 10, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10851, 59, 55, 42, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10852, 2, 19, 15, 0); +INSERT INTO northwind.order_details VALUES (10852, 17, 39, 6, 0); +INSERT INTO northwind.order_details VALUES (10852, 62, 49.2999992, 50, 0); +INSERT INTO northwind.order_details VALUES (10853, 18, 62.5, 10, 0); +INSERT INTO northwind.order_details VALUES (10854, 10, 31, 100, 0.150000006); +INSERT INTO northwind.order_details VALUES (10854, 13, 6, 65, 0.150000006); +INSERT INTO northwind.order_details VALUES (10855, 16, 17.4500008, 50, 0); +INSERT INTO northwind.order_details VALUES (10855, 31, 12.5, 14, 0); +INSERT INTO northwind.order_details VALUES (10855, 56, 38, 24, 0); +INSERT INTO northwind.order_details VALUES (10855, 65, 21.0499992, 15, 0.150000006); +INSERT INTO northwind.order_details VALUES (10856, 2, 19, 20, 0); +INSERT INTO northwind.order_details VALUES (10856, 42, 14, 20, 0); +INSERT INTO northwind.order_details VALUES (10857, 3, 10, 30, 0); +INSERT INTO northwind.order_details VALUES (10857, 26, 31.2299995, 35, 0.25); +INSERT INTO northwind.order_details VALUES (10857, 29, 123.790001, 10, 0.25); +INSERT INTO northwind.order_details VALUES (10858, 7, 30, 5, 0); +INSERT INTO northwind.order_details VALUES (10858, 27, 43.9000015, 10, 0); +INSERT INTO northwind.order_details VALUES (10858, 70, 15, 4, 0); +INSERT INTO northwind.order_details VALUES (10860, 51, 53, 3, 0); +INSERT INTO northwind.order_details VALUES (10860, 76, 18, 20, 0); +INSERT INTO northwind.order_details VALUES (10861, 17, 39, 42, 0); +INSERT INTO northwind.order_details VALUES (10861, 18, 62.5, 20, 0); +INSERT INTO northwind.order_details VALUES (10861, 21, 10, 40, 0); +INSERT INTO northwind.order_details VALUES (10861, 33, 2.5, 35, 0); +INSERT INTO northwind.order_details VALUES (10861, 62, 49.2999992, 3, 0); +INSERT INTO northwind.order_details VALUES (10862, 11, 21, 25, 0); +INSERT INTO northwind.order_details VALUES (10862, 52, 7, 8, 0); +INSERT INTO northwind.order_details VALUES (10863, 1, 18, 20, 0.150000006); +INSERT INTO northwind.order_details VALUES (10863, 58, 13.25, 12, 0.150000006); +INSERT INTO northwind.order_details VALUES (10864, 35, 18, 4, 0); +INSERT INTO northwind.order_details VALUES (10864, 67, 14, 15, 0); +INSERT INTO northwind.order_details VALUES (10865, 38, 263.5, 60, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10865, 39, 18, 80, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10866, 2, 19, 21, 0.25); +INSERT INTO northwind.order_details VALUES (10866, 24, 4.5, 6, 0.25); +INSERT INTO northwind.order_details VALUES (10866, 30, 25.8899994, 40, 0.25); +INSERT INTO northwind.order_details VALUES (10867, 53, 32.7999992, 3, 0); +INSERT INTO northwind.order_details VALUES (10868, 26, 31.2299995, 20, 0); +INSERT INTO northwind.order_details VALUES (10868, 35, 18, 30, 0); +INSERT INTO northwind.order_details VALUES (10868, 49, 20, 42, 0.100000001); +INSERT INTO northwind.order_details VALUES (10869, 1, 18, 40, 0); +INSERT INTO northwind.order_details VALUES (10869, 11, 21, 10, 0); +INSERT INTO northwind.order_details VALUES (10869, 23, 9, 50, 0); +INSERT INTO northwind.order_details VALUES (10869, 68, 12.5, 20, 0); +INSERT INTO northwind.order_details VALUES (10870, 35, 18, 3, 0); +INSERT INTO northwind.order_details VALUES (10870, 51, 53, 2, 0); +INSERT INTO northwind.order_details VALUES (10871, 6, 25, 50, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10871, 16, 17.4500008, 12, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10871, 17, 39, 16, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10872, 55, 24, 10, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10872, 62, 49.2999992, 20, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10872, 64, 33.25, 15, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10872, 65, 21.0499992, 21, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10873, 21, 10, 20, 0); +INSERT INTO northwind.order_details VALUES (10873, 28, 45.5999985, 3, 0); +INSERT INTO northwind.order_details VALUES (10874, 10, 31, 10, 0); +INSERT INTO northwind.order_details VALUES (10875, 19, 9.19999981, 25, 0); +INSERT INTO northwind.order_details VALUES (10875, 47, 9.5, 21, 0.100000001); +INSERT INTO northwind.order_details VALUES (10875, 49, 20, 15, 0); +INSERT INTO northwind.order_details VALUES (10876, 46, 12, 21, 0); +INSERT INTO northwind.order_details VALUES (10876, 64, 33.25, 20, 0); +INSERT INTO northwind.order_details VALUES (10878, 20, 81, 20, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10879, 40, 18.3999996, 12, 0); +INSERT INTO northwind.order_details VALUES (10879, 65, 21.0499992, 10, 0); +INSERT INTO northwind.order_details VALUES (10879, 76, 18, 10, 0); +INSERT INTO northwind.order_details VALUES (10880, 23, 9, 30, 0.200000003); +INSERT INTO northwind.order_details VALUES (10880, 61, 28.5, 30, 0.200000003); +INSERT INTO northwind.order_details VALUES (10880, 70, 15, 50, 0.200000003); +INSERT INTO northwind.order_details VALUES (10881, 73, 15, 10, 0); +INSERT INTO northwind.order_details VALUES (10882, 42, 14, 25, 0); +INSERT INTO northwind.order_details VALUES (10882, 49, 20, 20, 0.150000006); +INSERT INTO northwind.order_details VALUES (10882, 54, 7.44999981, 32, 0.150000006); +INSERT INTO northwind.order_details VALUES (10883, 24, 4.5, 8, 0); +INSERT INTO northwind.order_details VALUES (10884, 21, 10, 40, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10884, 56, 38, 21, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10884, 65, 21.0499992, 12, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10885, 2, 19, 20, 0); +INSERT INTO northwind.order_details VALUES (10885, 24, 4.5, 12, 0); +INSERT INTO northwind.order_details VALUES (10885, 70, 15, 30, 0); +INSERT INTO northwind.order_details VALUES (10885, 77, 13, 25, 0); +INSERT INTO northwind.order_details VALUES (10887, 25, 14, 5, 0); +INSERT INTO northwind.order_details VALUES (10889, 11, 21, 40, 0); +INSERT INTO northwind.order_details VALUES (10889, 38, 263.5, 40, 0); +INSERT INTO northwind.order_details VALUES (10890, 17, 39, 15, 0); +INSERT INTO northwind.order_details VALUES (10890, 34, 14, 10, 0); +INSERT INTO northwind.order_details VALUES (10890, 41, 9.64999962, 14, 0); +INSERT INTO northwind.order_details VALUES (10891, 30, 25.8899994, 15, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10892, 59, 55, 40, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10893, 8, 40, 30, 0); +INSERT INTO northwind.order_details VALUES (10893, 24, 4.5, 10, 0); +INSERT INTO northwind.order_details VALUES (10893, 29, 123.790001, 24, 0); +INSERT INTO northwind.order_details VALUES (10893, 30, 25.8899994, 35, 0); +INSERT INTO northwind.order_details VALUES (10893, 36, 19, 20, 0); +INSERT INTO northwind.order_details VALUES (10895, 24, 4.5, 110, 0); +INSERT INTO northwind.order_details VALUES (10895, 39, 18, 45, 0); +INSERT INTO northwind.order_details VALUES (10895, 40, 18.3999996, 91, 0); +INSERT INTO northwind.order_details VALUES (10895, 60, 34, 100, 0); +INSERT INTO northwind.order_details VALUES (10896, 45, 9.5, 15, 0); +INSERT INTO northwind.order_details VALUES (10896, 56, 38, 16, 0); +INSERT INTO northwind.order_details VALUES (10897, 29, 123.790001, 80, 0); +INSERT INTO northwind.order_details VALUES (10897, 30, 25.8899994, 36, 0); +INSERT INTO northwind.order_details VALUES (10898, 13, 6, 5, 0); +INSERT INTO northwind.order_details VALUES (10899, 39, 18, 8, 0.150000006); +INSERT INTO northwind.order_details VALUES (10901, 41, 9.64999962, 30, 0); +INSERT INTO northwind.order_details VALUES (10901, 71, 21.5, 30, 0); +INSERT INTO northwind.order_details VALUES (10903, 13, 6, 40, 0); +INSERT INTO northwind.order_details VALUES (10903, 65, 21.0499992, 21, 0); +INSERT INTO northwind.order_details VALUES (10903, 68, 12.5, 20, 0); +INSERT INTO northwind.order_details VALUES (10904, 58, 13.25, 15, 0); +INSERT INTO northwind.order_details VALUES (10904, 62, 49.2999992, 35, 0); +INSERT INTO northwind.order_details VALUES (10905, 1, 18, 20, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10906, 61, 28.5, 15, 0); +INSERT INTO northwind.order_details VALUES (10907, 75, 7.75, 14, 0); +INSERT INTO northwind.order_details VALUES (10908, 7, 30, 20, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10908, 52, 7, 14, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10340, 18, 50, 20, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10340, 41, 7.69999981, 12, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10340, 43, 36.7999992, 40, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10911, 1, 18, 10, 0); +INSERT INTO northwind.order_details VALUES (10911, 17, 39, 12, 0); +INSERT INTO northwind.order_details VALUES (10911, 67, 14, 15, 0); +INSERT INTO northwind.order_details VALUES (10912, 11, 21, 40, 0.25); +INSERT INTO northwind.order_details VALUES (10912, 29, 123.790001, 60, 0.25); +INSERT INTO northwind.order_details VALUES (10913, 4, 22, 30, 0.25); +INSERT INTO northwind.order_details VALUES (10913, 33, 2.5, 40, 0.25); +INSERT INTO northwind.order_details VALUES (10913, 58, 13.25, 15, 0); +INSERT INTO northwind.order_details VALUES (10914, 71, 21.5, 25, 0); +INSERT INTO northwind.order_details VALUES (10915, 17, 39, 10, 0); +INSERT INTO northwind.order_details VALUES (10915, 33, 2.5, 30, 0); +INSERT INTO northwind.order_details VALUES (10915, 54, 7.44999981, 10, 0); +INSERT INTO northwind.order_details VALUES (10917, 30, 25.8899994, 1, 0); +INSERT INTO northwind.order_details VALUES (10917, 60, 34, 10, 0); +INSERT INTO northwind.order_details VALUES (10918, 1, 18, 60, 0.25); +INSERT INTO northwind.order_details VALUES (10918, 60, 34, 25, 0.25); +INSERT INTO northwind.order_details VALUES (10919, 16, 17.4500008, 24, 0); +INSERT INTO northwind.order_details VALUES (10919, 25, 14, 24, 0); +INSERT INTO northwind.order_details VALUES (10919, 40, 18.3999996, 20, 0); +INSERT INTO northwind.order_details VALUES (10920, 50, 16.25, 24, 0); +INSERT INTO northwind.order_details VALUES (10922, 17, 39, 15, 0); +INSERT INTO northwind.order_details VALUES (10922, 24, 4.5, 35, 0); +INSERT INTO northwind.order_details VALUES (10923, 42, 14, 10, 0.200000003); +INSERT INTO northwind.order_details VALUES (10923, 43, 46, 10, 0.200000003); +INSERT INTO northwind.order_details VALUES (10923, 67, 14, 24, 0.200000003); +INSERT INTO northwind.order_details VALUES (10924, 10, 31, 20, 0.100000001); +INSERT INTO northwind.order_details VALUES (10924, 28, 45.5999985, 30, 0.100000001); +INSERT INTO northwind.order_details VALUES (10924, 75, 7.75, 6, 0); +INSERT INTO northwind.order_details VALUES (10925, 36, 19, 25, 0.150000006); +INSERT INTO northwind.order_details VALUES (10925, 52, 7, 12, 0.150000006); +INSERT INTO northwind.order_details VALUES (10926, 11, 21, 2, 0); +INSERT INTO northwind.order_details VALUES (10926, 13, 6, 10, 0); +INSERT INTO northwind.order_details VALUES (10926, 19, 9.19999981, 7, 0); +INSERT INTO northwind.order_details VALUES (10926, 72, 34.7999992, 10, 0); +INSERT INTO northwind.order_details VALUES (10927, 20, 81, 5, 0); +INSERT INTO northwind.order_details VALUES (10927, 52, 7, 5, 0); +INSERT INTO northwind.order_details VALUES (10927, 76, 18, 20, 0); +INSERT INTO northwind.order_details VALUES (10929, 21, 10, 60, 0); +INSERT INTO northwind.order_details VALUES (10929, 75, 7.75, 49, 0); +INSERT INTO northwind.order_details VALUES (10929, 77, 13, 15, 0); +INSERT INTO northwind.order_details VALUES (10930, 21, 10, 36, 0); +INSERT INTO northwind.order_details VALUES (10930, 27, 43.9000015, 25, 0); +INSERT INTO northwind.order_details VALUES (10930, 55, 24, 25, 0.200000003); +INSERT INTO northwind.order_details VALUES (10930, 58, 13.25, 30, 0.200000003); +INSERT INTO northwind.order_details VALUES (10931, 13, 6, 42, 0.150000006); +INSERT INTO northwind.order_details VALUES (10931, 57, 19.5, 30, 0); +INSERT INTO northwind.order_details VALUES (10932, 16, 17.4500008, 30, 0.100000001); +INSERT INTO northwind.order_details VALUES (10932, 62, 49.2999992, 14, 0.100000001); +INSERT INTO northwind.order_details VALUES (10932, 72, 34.7999992, 16, 0); +INSERT INTO northwind.order_details VALUES (10932, 75, 7.75, 20, 0.100000001); +INSERT INTO northwind.order_details VALUES (10933, 53, 32.7999992, 2, 0); +INSERT INTO northwind.order_details VALUES (10933, 61, 28.5, 30, 0); +INSERT INTO northwind.order_details VALUES (10934, 6, 25, 20, 0); +INSERT INTO northwind.order_details VALUES (10935, 1, 18, 21, 0); +INSERT INTO northwind.order_details VALUES (10935, 18, 62.5, 4, 0.25); +INSERT INTO northwind.order_details VALUES (10935, 23, 9, 8, 0.25); +INSERT INTO northwind.order_details VALUES (10936, 36, 19, 30, 0.200000003); +INSERT INTO northwind.order_details VALUES (10937, 28, 45.5999985, 8, 0); +INSERT INTO northwind.order_details VALUES (10937, 34, 14, 20, 0); +INSERT INTO northwind.order_details VALUES (10938, 13, 6, 20, 0.25); +INSERT INTO northwind.order_details VALUES (10938, 43, 46, 24, 0.25); +INSERT INTO northwind.order_details VALUES (10938, 60, 34, 49, 0.25); +INSERT INTO northwind.order_details VALUES (10938, 71, 21.5, 35, 0.25); +INSERT INTO northwind.order_details VALUES (10939, 2, 19, 10, 0.150000006); +INSERT INTO northwind.order_details VALUES (10939, 67, 14, 40, 0.150000006); +INSERT INTO northwind.order_details VALUES (10940, 7, 30, 8, 0); +INSERT INTO northwind.order_details VALUES (10940, 13, 6, 20, 0); +INSERT INTO northwind.order_details VALUES (10941, 31, 12.5, 44, 0.25); +INSERT INTO northwind.order_details VALUES (10941, 62, 49.2999992, 30, 0.25); +INSERT INTO northwind.order_details VALUES (10941, 68, 12.5, 80, 0.25); +INSERT INTO northwind.order_details VALUES (10941, 72, 34.7999992, 50, 0); +INSERT INTO northwind.order_details VALUES (10942, 49, 20, 28, 0); +INSERT INTO northwind.order_details VALUES (10943, 13, 6, 15, 0); +INSERT INTO northwind.order_details VALUES (10943, 22, 21, 21, 0); +INSERT INTO northwind.order_details VALUES (10943, 46, 12, 15, 0); +INSERT INTO northwind.order_details VALUES (10944, 11, 21, 5, 0.25); +INSERT INTO northwind.order_details VALUES (10944, 44, 19.4500008, 18, 0.25); +INSERT INTO northwind.order_details VALUES (10944, 56, 38, 18, 0); +INSERT INTO northwind.order_details VALUES (10945, 13, 6, 20, 0); +INSERT INTO northwind.order_details VALUES (10945, 31, 12.5, 10, 0); +INSERT INTO northwind.order_details VALUES (10947, 59, 55, 4, 0); +INSERT INTO northwind.order_details VALUES (10948, 50, 16.25, 9, 0); +INSERT INTO northwind.order_details VALUES (10948, 51, 53, 40, 0); +INSERT INTO northwind.order_details VALUES (10948, 55, 24, 4, 0); +INSERT INTO northwind.order_details VALUES (10949, 6, 25, 12, 0); +INSERT INTO northwind.order_details VALUES (10949, 10, 31, 30, 0); +INSERT INTO northwind.order_details VALUES (10949, 17, 39, 6, 0); +INSERT INTO northwind.order_details VALUES (10949, 62, 49.2999992, 60, 0); +INSERT INTO northwind.order_details VALUES (10951, 33, 2.5, 15, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10951, 41, 9.64999962, 6, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10951, 75, 7.75, 50, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10953, 20, 81, 50, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10953, 31, 12.5, 50, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10954, 16, 17.4500008, 28, 0.150000006); +INSERT INTO northwind.order_details VALUES (10954, 31, 12.5, 25, 0.150000006); +INSERT INTO northwind.order_details VALUES (10954, 45, 9.5, 30, 0); +INSERT INTO northwind.order_details VALUES (10954, 60, 34, 24, 0.150000006); +INSERT INTO northwind.order_details VALUES (10955, 75, 7.75, 12, 0.200000003); +INSERT INTO northwind.order_details VALUES (10956, 21, 10, 12, 0); +INSERT INTO northwind.order_details VALUES (10956, 47, 9.5, 14, 0); +INSERT INTO northwind.order_details VALUES (10956, 51, 53, 8, 0); +INSERT INTO northwind.order_details VALUES (10957, 30, 25.8899994, 30, 0); +INSERT INTO northwind.order_details VALUES (10957, 35, 18, 40, 0); +INSERT INTO northwind.order_details VALUES (10957, 64, 33.25, 8, 0); +INSERT INTO northwind.order_details VALUES (10958, 5, 21.3500004, 20, 0); +INSERT INTO northwind.order_details VALUES (10958, 7, 30, 6, 0); +INSERT INTO northwind.order_details VALUES (10958, 72, 34.7999992, 5, 0); +INSERT INTO northwind.order_details VALUES (10959, 75, 7.75, 20, 0.150000006); +INSERT INTO northwind.order_details VALUES (10960, 24, 4.5, 10, 0.25); +INSERT INTO northwind.order_details VALUES (10960, 41, 9.64999962, 24, 0); +INSERT INTO northwind.order_details VALUES (10961, 52, 7, 6, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10961, 76, 18, 60, 0); +INSERT INTO northwind.order_details VALUES (10962, 7, 30, 45, 0); +INSERT INTO northwind.order_details VALUES (10962, 13, 6, 77, 0); +INSERT INTO northwind.order_details VALUES (10962, 53, 32.7999992, 20, 0); +INSERT INTO northwind.order_details VALUES (10962, 69, 36, 9, 0); +INSERT INTO northwind.order_details VALUES (10962, 76, 18, 44, 0); +INSERT INTO northwind.order_details VALUES (10963, 60, 34, 2, 0.150000006); +INSERT INTO northwind.order_details VALUES (10964, 18, 62.5, 6, 0); +INSERT INTO northwind.order_details VALUES (10964, 38, 263.5, 5, 0); +INSERT INTO northwind.order_details VALUES (10964, 69, 36, 10, 0); +INSERT INTO northwind.order_details VALUES (10965, 51, 53, 16, 0); +INSERT INTO northwind.order_details VALUES (10966, 37, 26, 8, 0); +INSERT INTO northwind.order_details VALUES (10966, 56, 38, 12, 0.150000006); +INSERT INTO northwind.order_details VALUES (10966, 62, 49.2999992, 12, 0.150000006); +INSERT INTO northwind.order_details VALUES (10967, 19, 9.19999981, 12, 0); +INSERT INTO northwind.order_details VALUES (10967, 49, 20, 40, 0); +INSERT INTO northwind.order_details VALUES (10970, 52, 7, 40, 0.200000003); +INSERT INTO northwind.order_details VALUES (10971, 29, 123.790001, 14, 0); +INSERT INTO northwind.order_details VALUES (10972, 17, 39, 6, 0); +INSERT INTO northwind.order_details VALUES (10972, 33, 2.5, 7, 0); +INSERT INTO northwind.order_details VALUES (10973, 26, 31.2299995, 5, 0); +INSERT INTO northwind.order_details VALUES (10973, 41, 9.64999962, 6, 0); +INSERT INTO northwind.order_details VALUES (10973, 75, 7.75, 10, 0); +INSERT INTO northwind.order_details VALUES (10974, 63, 43.9000015, 10, 0); +INSERT INTO northwind.order_details VALUES (10977, 39, 18, 30, 0); +INSERT INTO northwind.order_details VALUES (10977, 47, 9.5, 30, 0); +INSERT INTO northwind.order_details VALUES (10977, 51, 53, 10, 0); +INSERT INTO northwind.order_details VALUES (10977, 63, 43.9000015, 20, 0); +INSERT INTO northwind.order_details VALUES (10978, 8, 40, 20, 0.150000006); +INSERT INTO northwind.order_details VALUES (10978, 21, 10, 40, 0.150000006); +INSERT INTO northwind.order_details VALUES (10978, 40, 18.3999996, 10, 0); +INSERT INTO northwind.order_details VALUES (10978, 44, 19.4500008, 6, 0.150000006); +INSERT INTO northwind.order_details VALUES (10979, 7, 30, 18, 0); +INSERT INTO northwind.order_details VALUES (10979, 12, 38, 20, 0); +INSERT INTO northwind.order_details VALUES (10979, 24, 4.5, 80, 0); +INSERT INTO northwind.order_details VALUES (10979, 27, 43.9000015, 30, 0); +INSERT INTO northwind.order_details VALUES (10979, 31, 12.5, 24, 0); +INSERT INTO northwind.order_details VALUES (10979, 63, 43.9000015, 35, 0); +INSERT INTO northwind.order_details VALUES (10980, 75, 7.75, 40, 0.200000003); +INSERT INTO northwind.order_details VALUES (10982, 7, 30, 20, 0); +INSERT INTO northwind.order_details VALUES (10982, 43, 46, 9, 0); +INSERT INTO northwind.order_details VALUES (10983, 13, 6, 84, 0.150000006); +INSERT INTO northwind.order_details VALUES (10983, 57, 19.5, 15, 0); +INSERT INTO northwind.order_details VALUES (10351, 38, 210.800003, 20, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10351, 41, 7.69999981, 13, 0); +INSERT INTO northwind.order_details VALUES (10985, 16, 17.4500008, 36, 0.100000001); +INSERT INTO northwind.order_details VALUES (10985, 18, 62.5, 8, 0.100000001); +INSERT INTO northwind.order_details VALUES (10985, 32, 32, 35, 0.100000001); +INSERT INTO northwind.order_details VALUES (10986, 11, 21, 30, 0); +INSERT INTO northwind.order_details VALUES (10986, 20, 81, 15, 0); +INSERT INTO northwind.order_details VALUES (10986, 76, 18, 10, 0); +INSERT INTO northwind.order_details VALUES (10986, 77, 13, 15, 0); +INSERT INTO northwind.order_details VALUES (10987, 7, 30, 60, 0); +INSERT INTO northwind.order_details VALUES (10987, 43, 46, 6, 0); +INSERT INTO northwind.order_details VALUES (10987, 72, 34.7999992, 20, 0); +INSERT INTO northwind.order_details VALUES (10988, 7, 30, 60, 0); +INSERT INTO northwind.order_details VALUES (10988, 62, 49.2999992, 40, 0.100000001); +INSERT INTO northwind.order_details VALUES (10989, 6, 25, 40, 0); +INSERT INTO northwind.order_details VALUES (10989, 11, 21, 15, 0); +INSERT INTO northwind.order_details VALUES (10989, 41, 9.64999962, 4, 0); +INSERT INTO northwind.order_details VALUES (10990, 21, 10, 65, 0); +INSERT INTO northwind.order_details VALUES (10990, 34, 14, 60, 0.150000006); +INSERT INTO northwind.order_details VALUES (10990, 55, 24, 65, 0.150000006); +INSERT INTO northwind.order_details VALUES (10990, 61, 28.5, 66, 0.150000006); +INSERT INTO northwind.order_details VALUES (10351, 44, 15.5, 77, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10351, 65, 16.7999992, 10, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10993, 29, 123.790001, 50, 0.25); +INSERT INTO northwind.order_details VALUES (10993, 41, 9.64999962, 35, 0.25); +INSERT INTO northwind.order_details VALUES (10994, 59, 55, 18, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10996, 42, 14, 40, 0); +INSERT INTO northwind.order_details VALUES (10997, 32, 32, 50, 0); +INSERT INTO northwind.order_details VALUES (10997, 46, 12, 20, 0.25); +INSERT INTO northwind.order_details VALUES (10997, 52, 7, 20, 0.25); +INSERT INTO northwind.order_details VALUES (10998, 24, 4.5, 12, 0); +INSERT INTO northwind.order_details VALUES (10998, 61, 28.5, 7, 0); +INSERT INTO northwind.order_details VALUES (10998, 74, 10, 20, 0); +INSERT INTO northwind.order_details VALUES (10998, 75, 7.75, 30, 0); +INSERT INTO northwind.order_details VALUES (10999, 41, 9.64999962, 20, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10999, 51, 53, 15, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10999, 77, 13, 21, 0.0500000007); +INSERT INTO northwind.order_details VALUES (11000, 4, 22, 25, 0.25); +INSERT INTO northwind.order_details VALUES (11000, 24, 4.5, 30, 0.25); +INSERT INTO northwind.order_details VALUES (11000, 77, 13, 30, 0); +INSERT INTO northwind.order_details VALUES (11001, 7, 30, 60, 0); +INSERT INTO northwind.order_details VALUES (11001, 22, 21, 25, 0); +INSERT INTO northwind.order_details VALUES (11001, 46, 12, 25, 0); +INSERT INTO northwind.order_details VALUES (11001, 55, 24, 6, 0); +INSERT INTO northwind.order_details VALUES (11002, 13, 6, 56, 0); +INSERT INTO northwind.order_details VALUES (11002, 35, 18, 15, 0.150000006); +INSERT INTO northwind.order_details VALUES (11002, 42, 14, 24, 0.150000006); +INSERT INTO northwind.order_details VALUES (11002, 55, 24, 40, 0); +INSERT INTO northwind.order_details VALUES (11003, 1, 18, 4, 0); +INSERT INTO northwind.order_details VALUES (11003, 40, 18.3999996, 10, 0); +INSERT INTO northwind.order_details VALUES (11003, 52, 7, 10, 0); +INSERT INTO northwind.order_details VALUES (11004, 26, 31.2299995, 6, 0); +INSERT INTO northwind.order_details VALUES (11004, 76, 18, 6, 0); +INSERT INTO northwind.order_details VALUES (11005, 1, 18, 2, 0); +INSERT INTO northwind.order_details VALUES (11005, 59, 55, 10, 0); +INSERT INTO northwind.order_details VALUES (11006, 1, 18, 8, 0); +INSERT INTO northwind.order_details VALUES (11006, 29, 123.790001, 2, 0.25); +INSERT INTO northwind.order_details VALUES (11007, 8, 40, 30, 0); +INSERT INTO northwind.order_details VALUES (11007, 29, 123.790001, 10, 0); +INSERT INTO northwind.order_details VALUES (11007, 42, 14, 14, 0); +INSERT INTO northwind.order_details VALUES (11008, 28, 45.5999985, 70, 0.0500000007); +INSERT INTO northwind.order_details VALUES (11008, 34, 14, 90, 0.0500000007); +INSERT INTO northwind.order_details VALUES (11008, 71, 21.5, 21, 0); +INSERT INTO northwind.order_details VALUES (11009, 24, 4.5, 12, 0); +INSERT INTO northwind.order_details VALUES (11009, 36, 19, 18, 0.25); +INSERT INTO northwind.order_details VALUES (11009, 60, 34, 9, 0); +INSERT INTO northwind.order_details VALUES (11010, 7, 30, 20, 0); +INSERT INTO northwind.order_details VALUES (11010, 24, 4.5, 10, 0); +INSERT INTO northwind.order_details VALUES (11011, 58, 13.25, 40, 0.0500000007); +INSERT INTO northwind.order_details VALUES (11011, 71, 21.5, 20, 0); +INSERT INTO northwind.order_details VALUES (11013, 23, 9, 10, 0); +INSERT INTO northwind.order_details VALUES (11013, 42, 14, 4, 0); +INSERT INTO northwind.order_details VALUES (11013, 45, 9.5, 20, 0); +INSERT INTO northwind.order_details VALUES (11013, 68, 12.5, 2, 0); +INSERT INTO northwind.order_details VALUES (11014, 41, 9.64999962, 28, 0.100000001); +INSERT INTO northwind.order_details VALUES (11015, 30, 25.8899994, 15, 0); +INSERT INTO northwind.order_details VALUES (11015, 77, 13, 18, 0); +INSERT INTO northwind.order_details VALUES (11016, 31, 12.5, 15, 0); +INSERT INTO northwind.order_details VALUES (11016, 36, 19, 16, 0); +INSERT INTO northwind.order_details VALUES (11017, 3, 10, 25, 0); +INSERT INTO northwind.order_details VALUES (11017, 59, 55, 110, 0); +INSERT INTO northwind.order_details VALUES (11017, 70, 15, 30, 0); +INSERT INTO northwind.order_details VALUES (11018, 12, 38, 20, 0); +INSERT INTO northwind.order_details VALUES (11018, 18, 62.5, 10, 0); +INSERT INTO northwind.order_details VALUES (11018, 56, 38, 5, 0); +INSERT INTO northwind.order_details VALUES (11019, 46, 12, 3, 0); +INSERT INTO northwind.order_details VALUES (11019, 49, 20, 2, 0); +INSERT INTO northwind.order_details VALUES (11020, 10, 31, 24, 0.150000006); +INSERT INTO northwind.order_details VALUES (11021, 2, 19, 11, 0.25); +INSERT INTO northwind.order_details VALUES (11021, 20, 81, 15, 0); +INSERT INTO northwind.order_details VALUES (11021, 26, 31.2299995, 63, 0); +INSERT INTO northwind.order_details VALUES (11021, 51, 53, 44, 0.25); +INSERT INTO northwind.order_details VALUES (11021, 72, 34.7999992, 35, 0); +INSERT INTO northwind.order_details VALUES (11022, 19, 9.19999981, 35, 0); +INSERT INTO northwind.order_details VALUES (11022, 69, 36, 30, 0); +INSERT INTO northwind.order_details VALUES (11024, 26, 31.2299995, 12, 0); +INSERT INTO northwind.order_details VALUES (11024, 33, 2.5, 30, 0); +INSERT INTO northwind.order_details VALUES (11024, 65, 21.0499992, 21, 0); +INSERT INTO northwind.order_details VALUES (11024, 71, 21.5, 50, 0); +INSERT INTO northwind.order_details VALUES (11025, 1, 18, 10, 0.100000001); +INSERT INTO northwind.order_details VALUES (11025, 13, 6, 20, 0.100000001); +INSERT INTO northwind.order_details VALUES (11026, 18, 62.5, 8, 0); +INSERT INTO northwind.order_details VALUES (11026, 51, 53, 10, 0); +INSERT INTO northwind.order_details VALUES (11028, 55, 24, 35, 0); +INSERT INTO northwind.order_details VALUES (11028, 59, 55, 24, 0); +INSERT INTO northwind.order_details VALUES (11029, 56, 38, 20, 0); +INSERT INTO northwind.order_details VALUES (11029, 63, 43.9000015, 12, 0); +INSERT INTO northwind.order_details VALUES (11030, 2, 19, 100, 0.25); +INSERT INTO northwind.order_details VALUES (11030, 5, 21.3500004, 70, 0); +INSERT INTO northwind.order_details VALUES (11030, 29, 123.790001, 60, 0.25); +INSERT INTO northwind.order_details VALUES (11030, 59, 55, 100, 0.25); +INSERT INTO northwind.order_details VALUES (11031, 1, 18, 45, 0); +INSERT INTO northwind.order_details VALUES (11031, 13, 6, 80, 0); +INSERT INTO northwind.order_details VALUES (11031, 24, 4.5, 21, 0); +INSERT INTO northwind.order_details VALUES (11031, 64, 33.25, 20, 0); +INSERT INTO northwind.order_details VALUES (11031, 71, 21.5, 16, 0); +INSERT INTO northwind.order_details VALUES (11032, 36, 19, 35, 0); +INSERT INTO northwind.order_details VALUES (11032, 38, 263.5, 25, 0); +INSERT INTO northwind.order_details VALUES (11032, 59, 55, 30, 0); +INSERT INTO northwind.order_details VALUES (11033, 53, 32.7999992, 70, 0.100000001); +INSERT INTO northwind.order_details VALUES (11033, 69, 36, 36, 0.100000001); +INSERT INTO northwind.order_details VALUES (11034, 21, 10, 15, 0.100000001); +INSERT INTO northwind.order_details VALUES (11034, 44, 19.4500008, 12, 0); +INSERT INTO northwind.order_details VALUES (11034, 61, 28.5, 6, 0); +INSERT INTO northwind.order_details VALUES (11035, 1, 18, 10, 0); +INSERT INTO northwind.order_details VALUES (11035, 35, 18, 60, 0); +INSERT INTO northwind.order_details VALUES (11035, 42, 14, 30, 0); +INSERT INTO northwind.order_details VALUES (11035, 54, 7.44999981, 10, 0); +INSERT INTO northwind.order_details VALUES (11036, 13, 6, 7, 0); +INSERT INTO northwind.order_details VALUES (11036, 59, 55, 30, 0); +INSERT INTO northwind.order_details VALUES (11037, 70, 15, 4, 0); +INSERT INTO northwind.order_details VALUES (10357, 10, 24.7999992, 30, 0.200000003); +INSERT INTO northwind.order_details VALUES (10357, 26, 24.8999996, 16, 0); +INSERT INTO northwind.order_details VALUES (10357, 60, 27.2000008, 8, 0.200000003); +INSERT INTO northwind.order_details VALUES (11040, 21, 10, 20, 0); +INSERT INTO northwind.order_details VALUES (11041, 2, 19, 30, 0.200000003); +INSERT INTO northwind.order_details VALUES (11041, 63, 43.9000015, 30, 0); +INSERT INTO northwind.order_details VALUES (11042, 44, 19.4500008, 15, 0); +INSERT INTO northwind.order_details VALUES (11042, 61, 28.5, 4, 0); +INSERT INTO northwind.order_details VALUES (11043, 11, 21, 10, 0); +INSERT INTO northwind.order_details VALUES (11044, 62, 49.2999992, 12, 0); +INSERT INTO northwind.order_details VALUES (11045, 33, 2.5, 15, 0); +INSERT INTO northwind.order_details VALUES (11045, 51, 53, 24, 0); +INSERT INTO northwind.order_details VALUES (11046, 12, 38, 20, 0.0500000007); +INSERT INTO northwind.order_details VALUES (11046, 32, 32, 15, 0.0500000007); +INSERT INTO northwind.order_details VALUES (11046, 35, 18, 18, 0.0500000007); +INSERT INTO northwind.order_details VALUES (11047, 1, 18, 25, 0.25); +INSERT INTO northwind.order_details VALUES (11047, 5, 21.3500004, 30, 0.25); +INSERT INTO northwind.order_details VALUES (11048, 68, 12.5, 42, 0); +INSERT INTO northwind.order_details VALUES (11049, 2, 19, 10, 0.200000003); +INSERT INTO northwind.order_details VALUES (11049, 12, 38, 4, 0.200000003); +INSERT INTO northwind.order_details VALUES (11050, 76, 18, 50, 0.100000001); +INSERT INTO northwind.order_details VALUES (11051, 24, 4.5, 10, 0.200000003); +INSERT INTO northwind.order_details VALUES (11052, 43, 46, 30, 0.200000003); +INSERT INTO northwind.order_details VALUES (11052, 61, 28.5, 10, 0.200000003); +INSERT INTO northwind.order_details VALUES (11053, 18, 62.5, 35, 0.200000003); +INSERT INTO northwind.order_details VALUES (11053, 32, 32, 20, 0); +INSERT INTO northwind.order_details VALUES (11053, 64, 33.25, 25, 0.200000003); +INSERT INTO northwind.order_details VALUES (11054, 33, 2.5, 10, 0); +INSERT INTO northwind.order_details VALUES (11054, 67, 14, 20, 0); +INSERT INTO northwind.order_details VALUES (11055, 24, 4.5, 15, 0); +INSERT INTO northwind.order_details VALUES (11055, 25, 14, 15, 0); +INSERT INTO northwind.order_details VALUES (11055, 51, 53, 20, 0); +INSERT INTO northwind.order_details VALUES (11055, 57, 19.5, 20, 0); +INSERT INTO northwind.order_details VALUES (11056, 7, 30, 40, 0); +INSERT INTO northwind.order_details VALUES (11056, 55, 24, 35, 0); +INSERT INTO northwind.order_details VALUES (11056, 60, 34, 50, 0); +INSERT INTO northwind.order_details VALUES (11057, 70, 15, 3, 0); +INSERT INTO northwind.order_details VALUES (11058, 21, 10, 3, 0); +INSERT INTO northwind.order_details VALUES (11058, 60, 34, 21, 0); +INSERT INTO northwind.order_details VALUES (11058, 61, 28.5, 4, 0); +INSERT INTO northwind.order_details VALUES (11059, 13, 6, 30, 0); +INSERT INTO northwind.order_details VALUES (11059, 17, 39, 12, 0); +INSERT INTO northwind.order_details VALUES (11059, 60, 34, 35, 0); +INSERT INTO northwind.order_details VALUES (11060, 60, 34, 4, 0); +INSERT INTO northwind.order_details VALUES (11060, 77, 13, 10, 0); +INSERT INTO northwind.order_details VALUES (11061, 60, 34, 15, 0); +INSERT INTO northwind.order_details VALUES (11062, 53, 32.7999992, 10, 0.200000003); +INSERT INTO northwind.order_details VALUES (11062, 70, 15, 12, 0.200000003); +INSERT INTO northwind.order_details VALUES (11063, 34, 14, 30, 0); +INSERT INTO northwind.order_details VALUES (11063, 40, 18.3999996, 40, 0.100000001); +INSERT INTO northwind.order_details VALUES (11063, 41, 9.64999962, 30, 0.100000001); +INSERT INTO northwind.order_details VALUES (11065, 30, 25.8899994, 4, 0.25); +INSERT INTO northwind.order_details VALUES (11065, 54, 7.44999981, 20, 0.25); +INSERT INTO northwind.order_details VALUES (11066, 16, 17.4500008, 3, 0); +INSERT INTO northwind.order_details VALUES (11066, 19, 9.19999981, 42, 0); +INSERT INTO northwind.order_details VALUES (11066, 34, 14, 35, 0); +INSERT INTO northwind.order_details VALUES (11068, 28, 45.5999985, 8, 0.150000006); +INSERT INTO northwind.order_details VALUES (11068, 43, 46, 36, 0.150000006); +INSERT INTO northwind.order_details VALUES (11068, 77, 13, 28, 0.150000006); +INSERT INTO northwind.order_details VALUES (11070, 1, 18, 40, 0.150000006); +INSERT INTO northwind.order_details VALUES (11070, 2, 19, 20, 0.150000006); +INSERT INTO northwind.order_details VALUES (11070, 16, 17.4500008, 30, 0.150000006); +INSERT INTO northwind.order_details VALUES (11070, 31, 12.5, 20, 0); +INSERT INTO northwind.order_details VALUES (10361, 39, 14.3999996, 54, 0.100000001); +INSERT INTO northwind.order_details VALUES (10361, 60, 27.2000008, 55, 0.100000001); +INSERT INTO northwind.order_details VALUES (11072, 2, 19, 8, 0); +INSERT INTO northwind.order_details VALUES (11072, 41, 9.64999962, 40, 0); +INSERT INTO northwind.order_details VALUES (11072, 50, 16.25, 22, 0); +INSERT INTO northwind.order_details VALUES (11072, 64, 33.25, 130, 0); +INSERT INTO northwind.order_details VALUES (11073, 11, 21, 10, 0); +INSERT INTO northwind.order_details VALUES (11073, 24, 4.5, 20, 0); +INSERT INTO northwind.order_details VALUES (11074, 16, 17.4500008, 14, 0.0500000007); +INSERT INTO northwind.order_details VALUES (11075, 2, 19, 10, 0.150000006); +INSERT INTO northwind.order_details VALUES (11075, 46, 12, 30, 0.150000006); +INSERT INTO northwind.order_details VALUES (11075, 76, 18, 2, 0.150000006); +INSERT INTO northwind.order_details VALUES (11076, 6, 25, 20, 0.25); +INSERT INTO northwind.order_details VALUES (11076, 14, 23.25, 20, 0.25); +INSERT INTO northwind.order_details VALUES (11076, 19, 9.19999981, 10, 0.25); +INSERT INTO northwind.order_details VALUES (10364, 69, 28.7999992, 30, 0); +INSERT INTO northwind.order_details VALUES (10364, 71, 17.2000008, 5, 0); +INSERT INTO northwind.order_details VALUES (10371, 36, 15.1999998, 6, 0.200000003); +INSERT INTO northwind.order_details VALUES (10374, 31, 10, 30, 0); +INSERT INTO northwind.order_details VALUES (10374, 58, 10.6000004, 15, 0); +INSERT INTO northwind.order_details VALUES (10376, 31, 10, 42, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10377, 28, 36.4000015, 20, 0.150000006); +INSERT INTO northwind.order_details VALUES (10377, 39, 14.3999996, 20, 0.150000006); +INSERT INTO northwind.order_details VALUES (10387, 24, 3.5999999, 15, 0); +INSERT INTO northwind.order_details VALUES (10387, 28, 36.4000015, 6, 0); +INSERT INTO northwind.order_details VALUES (10387, 59, 44, 12, 0); +INSERT INTO northwind.order_details VALUES (10387, 71, 17.2000008, 15, 0); +INSERT INTO northwind.order_details VALUES (10393, 2, 15.1999998, 25, 0.25); +INSERT INTO northwind.order_details VALUES (10393, 14, 18.6000004, 42, 0.25); +INSERT INTO northwind.order_details VALUES (10393, 25, 11.1999998, 7, 0.25); +INSERT INTO northwind.order_details VALUES (10393, 26, 24.8999996, 70, 0.25); +INSERT INTO northwind.order_details VALUES (10393, 31, 10, 32, 0); +INSERT INTO northwind.order_details VALUES (10394, 13, 4.80000019, 10, 0); +INSERT INTO northwind.order_details VALUES (10394, 62, 39.4000015, 10, 0); +INSERT INTO northwind.order_details VALUES (10396, 23, 7.19999981, 40, 0); +INSERT INTO northwind.order_details VALUES (10396, 71, 17.2000008, 60, 0); +INSERT INTO northwind.order_details VALUES (10396, 72, 27.7999992, 21, 0); +INSERT INTO northwind.order_details VALUES (10400, 29, 99, 21, 0); +INSERT INTO northwind.order_details VALUES (10400, 35, 14.3999996, 35, 0); +INSERT INTO northwind.order_details VALUES (10400, 49, 16, 30, 0); +INSERT INTO northwind.order_details VALUES (10401, 30, 20.7000008, 18, 0); +INSERT INTO northwind.order_details VALUES (10401, 56, 30.3999996, 70, 0); +INSERT INTO northwind.order_details VALUES (10401, 65, 16.7999992, 20, 0); +INSERT INTO northwind.order_details VALUES (10401, 71, 17.2000008, 60, 0); +INSERT INTO northwind.order_details VALUES (10405, 3, 8, 50, 0); +INSERT INTO northwind.order_details VALUES (10453, 48, 10.1999998, 15, 0.100000001); +INSERT INTO northwind.order_details VALUES (10453, 70, 12, 25, 0.100000001); +INSERT INTO northwind.order_details VALUES (10461, 21, 8, 40, 0.25); +INSERT INTO northwind.order_details VALUES (10461, 30, 20.7000008, 28, 0.25); +INSERT INTO northwind.order_details VALUES (10461, 55, 19.2000008, 60, 0.25); +INSERT INTO northwind.order_details VALUES (10465, 24, 3.5999999, 25, 0); +INSERT INTO northwind.order_details VALUES (10465, 29, 99, 18, 0.100000001); +INSERT INTO northwind.order_details VALUES (10465, 40, 14.6999998, 20, 0); +INSERT INTO northwind.order_details VALUES (10465, 45, 7.5999999, 30, 0.100000001); +INSERT INTO northwind.order_details VALUES (10465, 50, 13, 25, 0); +INSERT INTO northwind.order_details VALUES (10469, 2, 15.1999998, 40, 0.150000006); +INSERT INTO northwind.order_details VALUES (10469, 16, 13.8999996, 35, 0.150000006); +INSERT INTO northwind.order_details VALUES (10469, 44, 15.5, 2, 0.150000006); +INSERT INTO northwind.order_details VALUES (10473, 33, 2, 12, 0); +INSERT INTO northwind.order_details VALUES (10473, 71, 17.2000008, 12, 0); +INSERT INTO northwind.order_details VALUES (10482, 40, 14.6999998, 10, 0); +INSERT INTO northwind.order_details VALUES (10486, 11, 16.7999992, 5, 0); +INSERT INTO northwind.order_details VALUES (10486, 51, 42.4000015, 25, 0); +INSERT INTO northwind.order_details VALUES (10486, 74, 8, 16, 0); +INSERT INTO northwind.order_details VALUES (10508, 13, 6, 10, 0); +INSERT INTO northwind.order_details VALUES (10508, 39, 18, 10, 0); +INSERT INTO northwind.order_details VALUES (10524, 10, 31, 2, 0); +INSERT INTO northwind.order_details VALUES (10524, 30, 25.8899994, 10, 0); +INSERT INTO northwind.order_details VALUES (10524, 43, 46, 60, 0); +INSERT INTO northwind.order_details VALUES (10524, 54, 7.44999981, 15, 0); +INSERT INTO northwind.order_details VALUES (10525, 36, 19, 30, 0); +INSERT INTO northwind.order_details VALUES (10525, 40, 18.3999996, 15, 0.100000001); +INSERT INTO northwind.order_details VALUES (10537, 31, 12.5, 30, 0); +INSERT INTO northwind.order_details VALUES (10537, 51, 53, 6, 0); +INSERT INTO northwind.order_details VALUES (10537, 58, 13.25, 20, 0); +INSERT INTO northwind.order_details VALUES (10537, 72, 34.7999992, 21, 0); +INSERT INTO northwind.order_details VALUES (10537, 73, 15, 9, 0); +INSERT INTO northwind.order_details VALUES (10542, 11, 21, 15, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10542, 54, 7.44999981, 24, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10546, 7, 30, 10, 0); +INSERT INTO northwind.order_details VALUES (10546, 35, 18, 30, 0); +INSERT INTO northwind.order_details VALUES (10546, 62, 49.2999992, 40, 0); +INSERT INTO northwind.order_details VALUES (10558, 47, 9.5, 25, 0); +INSERT INTO northwind.order_details VALUES (10558, 51, 53, 20, 0); +INSERT INTO northwind.order_details VALUES (10558, 52, 7, 30, 0); +INSERT INTO northwind.order_details VALUES (10558, 53, 32.7999992, 18, 0); +INSERT INTO northwind.order_details VALUES (10558, 73, 15, 3, 0); +INSERT INTO northwind.order_details VALUES (10562, 33, 2.5, 20, 0.100000001); +INSERT INTO northwind.order_details VALUES (10562, 62, 49.2999992, 10, 0.100000001); +INSERT INTO northwind.order_details VALUES (10567, 31, 12.5, 60, 0.200000003); +INSERT INTO northwind.order_details VALUES (10567, 51, 53, 3, 0); +INSERT INTO northwind.order_details VALUES (10567, 59, 55, 40, 0.200000003); +INSERT INTO northwind.order_details VALUES (10579, 15, 15.5, 10, 0); +INSERT INTO northwind.order_details VALUES (10579, 75, 7.75, 21, 0); +INSERT INTO northwind.order_details VALUES (10587, 26, 31.2299995, 6, 0); +INSERT INTO northwind.order_details VALUES (10587, 35, 18, 20, 0); +INSERT INTO northwind.order_details VALUES (10587, 77, 13, 20, 0); +INSERT INTO northwind.order_details VALUES (10591, 3, 10, 14, 0); +INSERT INTO northwind.order_details VALUES (10591, 7, 30, 10, 0); +INSERT INTO northwind.order_details VALUES (10591, 54, 7.44999981, 50, 0); +INSERT INTO northwind.order_details VALUES (10598, 27, 43.9000015, 50, 0); +INSERT INTO northwind.order_details VALUES (10598, 71, 21.5, 9, 0); +INSERT INTO northwind.order_details VALUES (10604, 48, 12.75, 6, 0.100000001); +INSERT INTO northwind.order_details VALUES (10604, 76, 18, 10, 0.100000001); +INSERT INTO northwind.order_details VALUES (10605, 16, 17.4500008, 30, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10605, 59, 55, 20, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10605, 60, 34, 70, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10605, 71, 21.5, 15, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10612, 10, 31, 70, 0); +INSERT INTO northwind.order_details VALUES (10612, 36, 19, 55, 0); +INSERT INTO northwind.order_details VALUES (10612, 49, 20, 18, 0); +INSERT INTO northwind.order_details VALUES (10612, 60, 34, 40, 0); +INSERT INTO northwind.order_details VALUES (10612, 76, 18, 80, 0); +INSERT INTO northwind.order_details VALUES (10616, 38, 263.5, 15, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10616, 56, 38, 14, 0); +INSERT INTO northwind.order_details VALUES (10616, 70, 15, 15, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10616, 71, 21.5, 15, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10618, 6, 25, 70, 0); +INSERT INTO northwind.order_details VALUES (10618, 56, 38, 20, 0); +INSERT INTO northwind.order_details VALUES (10618, 68, 12.5, 15, 0); +INSERT INTO northwind.order_details VALUES (10626, 53, 32.7999992, 12, 0); +INSERT INTO northwind.order_details VALUES (10626, 60, 34, 20, 0); +INSERT INTO northwind.order_details VALUES (10626, 71, 21.5, 20, 0); +INSERT INTO northwind.order_details VALUES (10630, 55, 24, 12, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10630, 76, 18, 35, 0); +INSERT INTO northwind.order_details VALUES (10653, 16, 17.4500008, 30, 0.100000001); +INSERT INTO northwind.order_details VALUES (10653, 60, 34, 20, 0.100000001); +INSERT INTO northwind.order_details VALUES (10655, 41, 9.64999962, 20, 0.200000003); +INSERT INTO northwind.order_details VALUES (10664, 10, 31, 24, 0.150000006); +INSERT INTO northwind.order_details VALUES (10664, 56, 38, 12, 0.150000006); +INSERT INTO northwind.order_details VALUES (10664, 65, 21.0499992, 15, 0.150000006); +INSERT INTO northwind.order_details VALUES (10665, 51, 53, 20, 0); +INSERT INTO northwind.order_details VALUES (10665, 59, 55, 1, 0); +INSERT INTO northwind.order_details VALUES (10665, 76, 18, 10, 0); +INSERT INTO northwind.order_details VALUES (10668, 31, 12.5, 8, 0.100000001); +INSERT INTO northwind.order_details VALUES (10668, 55, 24, 4, 0.100000001); +INSERT INTO northwind.order_details VALUES (10668, 64, 33.25, 15, 0.100000001); +INSERT INTO northwind.order_details VALUES (10671, 16, 17.4500008, 10, 0); +INSERT INTO northwind.order_details VALUES (10671, 62, 49.2999992, 10, 0); +INSERT INTO northwind.order_details VALUES (10671, 65, 21.0499992, 12, 0); +INSERT INTO northwind.order_details VALUES (10677, 26, 31.2299995, 30, 0.150000006); +INSERT INTO northwind.order_details VALUES (10677, 33, 2.5, 8, 0.150000006); +INSERT INTO northwind.order_details VALUES (10680, 16, 17.4500008, 50, 0.25); +INSERT INTO northwind.order_details VALUES (10680, 31, 12.5, 20, 0.25); +INSERT INTO northwind.order_details VALUES (10680, 42, 14, 40, 0.25); +INSERT INTO northwind.order_details VALUES (10689, 1, 18, 35, 0.25); +INSERT INTO northwind.order_details VALUES (10690, 56, 38, 20, 0.25); +INSERT INTO northwind.order_details VALUES (10690, 77, 13, 30, 0.25); +INSERT INTO northwind.order_details VALUES (10709, 8, 40, 40, 0); +INSERT INTO northwind.order_details VALUES (10709, 51, 53, 28, 0); +INSERT INTO northwind.order_details VALUES (10709, 60, 34, 10, 0); +INSERT INTO northwind.order_details VALUES (10710, 19, 9.19999981, 5, 0); +INSERT INTO northwind.order_details VALUES (10710, 47, 9.5, 5, 0); +INSERT INTO northwind.order_details VALUES (10713, 10, 31, 18, 0); +INSERT INTO northwind.order_details VALUES (10713, 26, 31.2299995, 30, 0); +INSERT INTO northwind.order_details VALUES (10713, 45, 9.5, 110, 0); +INSERT INTO northwind.order_details VALUES (10713, 46, 12, 24, 0); +INSERT INTO northwind.order_details VALUES (10717, 21, 10, 32, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10717, 54, 7.44999981, 15, 0); +INSERT INTO northwind.order_details VALUES (10717, 69, 36, 25, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10718, 12, 38, 36, 0); +INSERT INTO northwind.order_details VALUES (10718, 16, 17.4500008, 20, 0); +INSERT INTO northwind.order_details VALUES (10718, 36, 19, 40, 0); +INSERT INTO northwind.order_details VALUES (10718, 62, 49.2999992, 20, 0); +INSERT INTO northwind.order_details VALUES (10733, 14, 23.25, 16, 0); +INSERT INTO northwind.order_details VALUES (10733, 28, 45.5999985, 20, 0); +INSERT INTO northwind.order_details VALUES (10733, 52, 7, 25, 0); +INSERT INTO northwind.order_details VALUES (10743, 46, 12, 28, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10746, 13, 6, 6, 0); +INSERT INTO northwind.order_details VALUES (10746, 42, 14, 28, 0); +INSERT INTO northwind.order_details VALUES (10746, 62, 49.2999992, 9, 0); +INSERT INTO northwind.order_details VALUES (10746, 69, 36, 40, 0); +INSERT INTO northwind.order_details VALUES (10773, 17, 39, 33, 0); +INSERT INTO northwind.order_details VALUES (10773, 31, 12.5, 70, 0.200000003); +INSERT INTO northwind.order_details VALUES (10773, 75, 7.75, 7, 0.200000003); +INSERT INTO northwind.order_details VALUES (10776, 31, 12.5, 16, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10776, 42, 14, 12, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10776, 45, 9.5, 27, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10776, 51, 53, 120, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10785, 10, 31, 10, 0); +INSERT INTO northwind.order_details VALUES (10785, 75, 7.75, 10, 0); +INSERT INTO northwind.order_details VALUES (10788, 19, 9.19999981, 50, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10788, 75, 7.75, 40, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10789, 18, 62.5, 30, 0); +INSERT INTO northwind.order_details VALUES (10789, 35, 18, 15, 0); +INSERT INTO northwind.order_details VALUES (10789, 63, 43.9000015, 30, 0); +INSERT INTO northwind.order_details VALUES (10789, 68, 12.5, 18, 0); +INSERT INTO northwind.order_details VALUES (10792, 2, 19, 10, 0); +INSERT INTO northwind.order_details VALUES (10792, 54, 7.44999981, 3, 0); +INSERT INTO northwind.order_details VALUES (10792, 68, 12.5, 15, 0); +INSERT INTO northwind.order_details VALUES (10800, 11, 21, 50, 0.100000001); +INSERT INTO northwind.order_details VALUES (10800, 51, 53, 10, 0.100000001); +INSERT INTO northwind.order_details VALUES (10800, 54, 7.44999981, 7, 0.100000001); +INSERT INTO northwind.order_details VALUES (10813, 2, 19, 12, 0.200000003); +INSERT INTO northwind.order_details VALUES (10813, 46, 12, 35, 0); +INSERT INTO northwind.order_details VALUES (10821, 35, 18, 20, 0); +INSERT INTO northwind.order_details VALUES (10821, 51, 53, 6, 0); +INSERT INTO northwind.order_details VALUES (10825, 26, 31.2299995, 12, 0); +INSERT INTO northwind.order_details VALUES (10825, 53, 32.7999992, 20, 0); +INSERT INTO northwind.order_details VALUES (10827, 10, 31, 15, 0); +INSERT INTO northwind.order_details VALUES (10827, 39, 18, 21, 0); +INSERT INTO northwind.order_details VALUES (10834, 29, 123.790001, 8, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10834, 30, 25.8899994, 20, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10835, 59, 55, 15, 0); +INSERT INTO northwind.order_details VALUES (10835, 77, 13, 2, 0.200000003); +INSERT INTO northwind.order_details VALUES (10842, 11, 21, 15, 0); +INSERT INTO northwind.order_details VALUES (10842, 43, 46, 5, 0); +INSERT INTO northwind.order_details VALUES (10842, 68, 12.5, 20, 0); +INSERT INTO northwind.order_details VALUES (10842, 70, 15, 12, 0); +INSERT INTO northwind.order_details VALUES (10850, 25, 14, 20, 0.150000006); +INSERT INTO northwind.order_details VALUES (10850, 33, 2.5, 4, 0.150000006); +INSERT INTO northwind.order_details VALUES (10850, 70, 15, 30, 0.150000006); +INSERT INTO northwind.order_details VALUES (10859, 24, 4.5, 40, 0.25); +INSERT INTO northwind.order_details VALUES (10859, 54, 7.44999981, 35, 0.25); +INSERT INTO northwind.order_details VALUES (10859, 64, 33.25, 30, 0.25); +INSERT INTO northwind.order_details VALUES (10877, 16, 17.4500008, 30, 0.25); +INSERT INTO northwind.order_details VALUES (10877, 18, 62.5, 25, 0); +INSERT INTO northwind.order_details VALUES (10886, 10, 31, 70, 0); +INSERT INTO northwind.order_details VALUES (10886, 31, 12.5, 35, 0); +INSERT INTO northwind.order_details VALUES (10886, 77, 13, 40, 0); +INSERT INTO northwind.order_details VALUES (10888, 2, 19, 20, 0); +INSERT INTO northwind.order_details VALUES (10888, 68, 12.5, 18, 0); +INSERT INTO northwind.order_details VALUES (10894, 13, 6, 28, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10894, 69, 36, 50, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10894, 75, 7.75, 120, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10900, 70, 15, 3, 0.25); +INSERT INTO northwind.order_details VALUES (10902, 55, 24, 30, 0.150000006); +INSERT INTO northwind.order_details VALUES (10902, 62, 49.2999992, 6, 0.150000006); +INSERT INTO northwind.order_details VALUES (10909, 7, 30, 12, 0); +INSERT INTO northwind.order_details VALUES (10909, 16, 17.4500008, 15, 0); +INSERT INTO northwind.order_details VALUES (10909, 41, 9.64999962, 5, 0); +INSERT INTO northwind.order_details VALUES (10910, 19, 9.19999981, 12, 0); +INSERT INTO northwind.order_details VALUES (10910, 49, 20, 10, 0); +INSERT INTO northwind.order_details VALUES (10910, 61, 28.5, 5, 0); +INSERT INTO northwind.order_details VALUES (10916, 16, 17.4500008, 6, 0); +INSERT INTO northwind.order_details VALUES (10916, 32, 32, 6, 0); +INSERT INTO northwind.order_details VALUES (10916, 57, 19.5, 20, 0); +INSERT INTO northwind.order_details VALUES (10921, 35, 18, 10, 0); +INSERT INTO northwind.order_details VALUES (10921, 63, 43.9000015, 40, 0); +INSERT INTO northwind.order_details VALUES (10928, 47, 9.5, 5, 0); +INSERT INTO northwind.order_details VALUES (10928, 76, 18, 5, 0); +INSERT INTO northwind.order_details VALUES (10946, 10, 31, 25, 0); +INSERT INTO northwind.order_details VALUES (10946, 24, 4.5, 25, 0); +INSERT INTO northwind.order_details VALUES (10946, 77, 13, 40, 0); +INSERT INTO northwind.order_details VALUES (10950, 4, 22, 5, 0); +INSERT INTO northwind.order_details VALUES (10952, 6, 25, 16, 0.0500000007); +INSERT INTO northwind.order_details VALUES (10952, 28, 45.5999985, 2, 0); +INSERT INTO northwind.order_details VALUES (10968, 12, 38, 30, 0); +INSERT INTO northwind.order_details VALUES (10968, 24, 4.5, 30, 0); +INSERT INTO northwind.order_details VALUES (10968, 64, 33.25, 4, 0); +INSERT INTO northwind.order_details VALUES (10969, 46, 12, 9, 0); +INSERT INTO northwind.order_details VALUES (10975, 8, 40, 16, 0); +INSERT INTO northwind.order_details VALUES (10975, 75, 7.75, 10, 0); +INSERT INTO northwind.order_details VALUES (10976, 28, 45.5999985, 20, 0); +INSERT INTO northwind.order_details VALUES (10981, 38, 263.5, 60, 0); +INSERT INTO northwind.order_details VALUES (10984, 16, 17.4500008, 55, 0); +INSERT INTO northwind.order_details VALUES (10984, 24, 4.5, 20, 0); +INSERT INTO northwind.order_details VALUES (10984, 36, 19, 40, 0); +INSERT INTO northwind.order_details VALUES (10991, 2, 19, 50, 0.200000003); +INSERT INTO northwind.order_details VALUES (10991, 70, 15, 20, 0.200000003); +INSERT INTO northwind.order_details VALUES (10991, 76, 18, 90, 0.200000003); +INSERT INTO northwind.order_details VALUES (10992, 72, 34.7999992, 2, 0); +INSERT INTO northwind.order_details VALUES (10995, 51, 53, 20, 0); +INSERT INTO northwind.order_details VALUES (10995, 60, 34, 4, 0); +INSERT INTO northwind.order_details VALUES (11012, 19, 9.19999981, 50, 0.0500000007); +INSERT INTO northwind.order_details VALUES (11012, 60, 34, 36, 0.0500000007); +INSERT INTO northwind.order_details VALUES (11012, 71, 21.5, 60, 0.0500000007); +INSERT INTO northwind.order_details VALUES (11023, 7, 30, 4, 0); +INSERT INTO northwind.order_details VALUES (11023, 43, 46, 30, 0); +INSERT INTO northwind.order_details VALUES (11027, 24, 4.5, 30, 0.25); +INSERT INTO northwind.order_details VALUES (11027, 62, 49.2999992, 21, 0.25); +INSERT INTO northwind.order_details VALUES (11038, 40, 18.3999996, 5, 0.200000003); +INSERT INTO northwind.order_details VALUES (11038, 52, 7, 2, 0); +INSERT INTO northwind.order_details VALUES (11038, 71, 21.5, 30, 0); +INSERT INTO northwind.order_details VALUES (11039, 28, 45.5999985, 20, 0); +INSERT INTO northwind.order_details VALUES (11039, 35, 18, 24, 0); +INSERT INTO northwind.order_details VALUES (11039, 49, 20, 60, 0); +INSERT INTO northwind.order_details VALUES (11039, 57, 19.5, 28, 0); +INSERT INTO northwind.order_details VALUES (11064, 17, 39, 77, 0.100000001); +INSERT INTO northwind.order_details VALUES (11064, 41, 9.64999962, 12, 0); +INSERT INTO northwind.order_details VALUES (11064, 53, 32.7999992, 25, 0.100000001); +INSERT INTO northwind.order_details VALUES (11064, 55, 24, 4, 0.100000001); +INSERT INTO northwind.order_details VALUES (11064, 68, 12.5, 55, 0); +INSERT INTO northwind.order_details VALUES (11067, 41, 9.64999962, 9, 0); +INSERT INTO northwind.order_details VALUES (11069, 39, 18, 20, 0); +INSERT INTO northwind.order_details VALUES (11071, 7, 30, 15, 0.0500000007); +INSERT INTO northwind.order_details VALUES (11071, 13, 6, 10, 0.0500000007); +INSERT INTO northwind.order_details VALUES (11077, 2, 19, 24, 0.200000003); +INSERT INTO northwind.order_details VALUES (11077, 3, 10, 4, 0); +INSERT INTO northwind.order_details VALUES (11077, 4, 22, 1, 0); +INSERT INTO northwind.order_details VALUES (11077, 6, 25, 1, 0.0199999996); +INSERT INTO northwind.order_details VALUES (11077, 7, 30, 1, 0.0500000007); +INSERT INTO northwind.order_details VALUES (11077, 8, 40, 2, 0.100000001); +INSERT INTO northwind.order_details VALUES (11077, 10, 31, 1, 0); +INSERT INTO northwind.order_details VALUES (11077, 12, 38, 2, 0.0500000007); +INSERT INTO northwind.order_details VALUES (11077, 13, 6, 4, 0); +INSERT INTO northwind.order_details VALUES (11077, 14, 23.25, 1, 0.0299999993); +INSERT INTO northwind.order_details VALUES (11077, 16, 17.4500008, 2, 0.0299999993); +INSERT INTO northwind.order_details VALUES (11077, 20, 81, 1, 0.0399999991); +INSERT INTO northwind.order_details VALUES (11077, 23, 9, 2, 0); +INSERT INTO northwind.order_details VALUES (11077, 32, 32, 1, 0); +INSERT INTO northwind.order_details VALUES (11077, 39, 18, 2, 0.0500000007); +INSERT INTO northwind.order_details VALUES (11077, 41, 9.64999962, 3, 0); +INSERT INTO northwind.order_details VALUES (11077, 46, 12, 3, 0.0199999996); +INSERT INTO northwind.order_details VALUES (11077, 52, 7, 2, 0); +INSERT INTO northwind.order_details VALUES (11077, 55, 24, 2, 0); +INSERT INTO northwind.order_details VALUES (11077, 60, 34, 2, 0.0599999987); +INSERT INTO northwind.order_details VALUES (11077, 64, 33.25, 2, 0.0299999993); +INSERT INTO northwind.order_details VALUES (11077, 66, 17, 1, 0); +INSERT INTO northwind.order_details VALUES (11077, 73, 15, 2, 0.00999999978); +INSERT INTO northwind.order_details VALUES (11077, 75, 7.75, 4, 0); +INSERT INTO northwind.order_details VALUES (11077, 77, 13, 2, 0); + + +-- +-- Data for Name: us_states; Type: TABLE DATA; Schema: northwind; Owner: northwind +-- + +INSERT INTO northwind.us_states VALUES (1, 'Alabama', 'AL', 'south'); +INSERT INTO northwind.us_states VALUES (2, 'Alaska', 'AK', 'north'); +INSERT INTO northwind.us_states VALUES (3, 'Arizona', 'AZ', 'west'); +INSERT INTO northwind.us_states VALUES (4, 'Arkansas', 'AR', 'south'); +INSERT INTO northwind.us_states VALUES (5, 'California', 'CA', 'west'); +INSERT INTO northwind.us_states VALUES (6, 'Colorado', 'CO', 'west'); +INSERT INTO northwind.us_states VALUES (7, 'Connecticut', 'CT', 'east'); +INSERT INTO northwind.us_states VALUES (8, 'Delaware', 'DE', 'east'); +INSERT INTO northwind.us_states VALUES (9, 'District of Columbia', 'DC', 'east'); +INSERT INTO northwind.us_states VALUES (10, 'Florida', 'FL', 'south'); +INSERT INTO northwind.us_states VALUES (11, 'Georgia', 'GA', 'south'); +INSERT INTO northwind.us_states VALUES (12, 'Hawaii', 'HI', 'west'); +INSERT INTO northwind.us_states VALUES (13, 'Idaho', 'ID', 'midwest'); +INSERT INTO northwind.us_states VALUES (14, 'Illinois', 'IL', 'midwest'); +INSERT INTO northwind.us_states VALUES (15, 'Indiana', 'IN', 'midwest'); +INSERT INTO northwind.us_states VALUES (16, 'Iowa', 'IO', 'midwest'); +INSERT INTO northwind.us_states VALUES (17, 'Kansas', 'KS', 'midwest'); +INSERT INTO northwind.us_states VALUES (18, 'Kentucky', 'KY', 'south'); +INSERT INTO northwind.us_states VALUES (19, 'Louisiana', 'LA', 'south'); +INSERT INTO northwind.us_states VALUES (20, 'Maine', 'ME', 'north'); +INSERT INTO northwind.us_states VALUES (21, 'Maryland', 'MD', 'east'); +INSERT INTO northwind.us_states VALUES (22, 'Massachusetts', 'MA', 'north'); +INSERT INTO northwind.us_states VALUES (23, 'Michigan', 'MI', 'north'); +INSERT INTO northwind.us_states VALUES (24, 'Minnesota', 'MN', 'north'); +INSERT INTO northwind.us_states VALUES (25, 'Mississippi', 'MS', 'south'); +INSERT INTO northwind.us_states VALUES (26, 'Missouri', 'MO', 'south'); +INSERT INTO northwind.us_states VALUES (27, 'Montana', 'MT', 'west'); +INSERT INTO northwind.us_states VALUES (28, 'Nebraska', 'NE', 'midwest'); +INSERT INTO northwind.us_states VALUES (29, 'Nevada', 'NV', 'west'); +INSERT INTO northwind.us_states VALUES (30, 'New Hampshire', 'NH', 'east'); +INSERT INTO northwind.us_states VALUES (31, 'New Jersey', 'NJ', 'east'); +INSERT INTO northwind.us_states VALUES (32, 'New Mexico', 'NM', 'west'); +INSERT INTO northwind.us_states VALUES (33, 'New York', 'NY', 'east'); +INSERT INTO northwind.us_states VALUES (34, 'North Carolina', 'NC', 'east'); +INSERT INTO northwind.us_states VALUES (35, 'North Dakota', 'ND', 'midwest'); +INSERT INTO northwind.us_states VALUES (36, 'Ohio', 'OH', 'midwest'); +INSERT INTO northwind.us_states VALUES (37, 'Oklahoma', 'OK', 'midwest'); +INSERT INTO northwind.us_states VALUES (38, 'Oregon', 'OR', 'west'); +INSERT INTO northwind.us_states VALUES (39, 'Pennsylvania', 'PA', 'east'); +INSERT INTO northwind.us_states VALUES (40, 'Rhode Island', 'RI', 'east'); +INSERT INTO northwind.us_states VALUES (41, 'South Carolina', 'SC', 'east'); +INSERT INTO northwind.us_states VALUES (42, 'South Dakota', 'SD', 'midwest'); +INSERT INTO northwind.us_states VALUES (43, 'Tennessee', 'TN', 'midwest'); +INSERT INTO northwind.us_states VALUES (44, 'Texas', 'TX', 'west'); +INSERT INTO northwind.us_states VALUES (45, 'Utah', 'UT', 'west'); +INSERT INTO northwind.us_states VALUES (46, 'Vermont', 'VT', 'east'); +INSERT INTO northwind.us_states VALUES (47, 'Virginia', 'VA', 'east'); +INSERT INTO northwind.us_states VALUES (48, 'Washington', 'WA', 'west'); +INSERT INTO northwind.us_states VALUES (49, 'West Virginia', 'WV', 'south'); +INSERT INTO northwind.us_states VALUES (50, 'Wisconsin', 'WI', 'midwest'); +INSERT INTO northwind.us_states VALUES (51, 'Wyoming', 'WY', 'west'); + + +-- +-- Name: auth_user_id_seq; Type: SEQUENCE SET; Schema: northwind; Owner: northwind +-- + +SELECT pg_catalog.setval('northwind.auth_user_id_seq', 1, false); + + +-- +-- Name: categories_category_id_seq; Type: SEQUENCE SET; Schema: northwind; Owner: northwind +-- + +SELECT pg_catalog.setval('northwind.categories_category_id_seq', 9, true); + + +-- +-- Name: employees_employee_id_seq; Type: SEQUENCE SET; Schema: northwind; Owner: northwind +-- + +SELECT pg_catalog.setval('northwind.employees_employee_id_seq', 10, true); + + +-- +-- Name: orders_order_id_seq; Type: SEQUENCE SET; Schema: northwind; Owner: northwind +-- + +SELECT pg_catalog.setval('northwind.orders_order_id_seq', 11078, true); + + +-- +-- Name: products_product_id_seq; Type: SEQUENCE SET; Schema: northwind; Owner: northwind +-- + +SELECT pg_catalog.setval('northwind.products_product_id_seq', 78, true); + + +-- +-- Name: region_region_id_seq; Type: SEQUENCE SET; Schema: northwind; Owner: northwind +-- + +SELECT pg_catalog.setval('northwind.region_region_id_seq', 5, true); + + +-- +-- Name: shippers_shipper_id_seq; Type: SEQUENCE SET; Schema: northwind; Owner: northwind +-- + +SELECT pg_catalog.setval('northwind.shippers_shipper_id_seq', 7, true); + + +-- +-- Name: suppliers_supplier_id_seq; Type: SEQUENCE SET; Schema: northwind; Owner: northwind +-- + +SELECT pg_catalog.setval('northwind.suppliers_supplier_id_seq', 30, true); + + +-- +-- Name: us_states_state_id_seq; Type: SEQUENCE SET; Schema: northwind; Owner: northwind +-- + +SELECT pg_catalog.setval('northwind.us_states_state_id_seq', 52, true); + + +-- +-- PostgreSQL database dump complete +-- diff --git a/data/northwind_start.sql b/data/northwind_start.sql new file mode 100644 index 0000000..de1ce43 --- /dev/null +++ b/data/northwind_start.sql @@ -0,0 +1,3 @@ +\c northwind; +CREATE SCHEMA IF NOT EXISTS northwind AUTHORIZATION northwind +; diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..03800b8 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,85 @@ +version: "3.7" +services: + api: + build: + context: . + dockerfile: Dockerfile + args: + POETRY_DEV: ${POETRY_DEV:-true} + WAIT_BIN: ${WAIT_BIN:-wait} + env_file: + - env-api-dev + environment: + DEBUGPY: ${DEBUGPY:-true} + DATABASE_URL: postgresql+asyncpg://${POSTGRES_USER:-northwind}:${POSTGRES_PASSWORD:-northwind}@${DB_HOST:-postgres}:5432/${POSTGRES_DB:-northwind} + WAIT_HOSTS: postgres:5432,postgres-test:5432,redis:6379 + WAIT_LOGGER_LEVEL: error + WAIT_TIMEOUT: 60 + WAIT_SLEEP_INTERVAL: 5 + PYDEVD_DISABLE_FILE_VALIDATION: 1 + REDIS_URL: ${REDIS_URL-redis://redis:6379/0} + REDIS_USER: ${REDIS_USER-default} + REDIS_PASSWORD: ${REDIS_PASSWORD-redis} + depends_on: + - postgres + # - postgres-test + - redis + + volumes: + - ./src/:/app:cached + ports: + - 8000:80 + - 5678:5678 # debupy for webapp + - 5679:5679 # debupy for console + command: + - /bin/sh + - -c + - | + /wait && bash -c \ + 'if [ "${DEBUGPY}" == "true" ]; then \ + python -m debugpy --listen 0.0.0.0:5678 \ + -m uvicorn app.asgi:app --host 0.0.0.0 --port 80 \ + --reload --reload-dir /app --log-config logging.dev.yaml; \ + else \ + python -m uvicorn app.asgi:app --host 0.0.0.0 --port 80 \ + --reload --reload-dir /app --log-config logging.dev.yaml; \ + fi' + restart: on-failure + + postgres: + image: postgres:16.1 + environment: + POSTGRES_DB: ${POSTGRES_DB-northwind} + POSTGRES_USER: ${POSTGRES_USER-northwind} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD-northwind} + ports: + - 5432:5432 + volumes: + - postgres_data:/var/lib/postgresql/data:delegated + - ./data/northwind_start.sql:/docker-entrypoint-initdb.d/00_northwind_start.sql + - ./data:/data + + postgres-test: + image: postgres:16.1 + environment: + POSTGRES_DB: ${POSTGRES_DB-northwind} + POSTGRES_USER: ${POSTGRES_USER-northwind} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD-northwind} + volumes: + - postgres_test_data:/var/lib/postgresql/data:delegated + - ./data/northwind_start.sql:/docker-entrypoint-initdb.d/00_northwind_start.sql + redis: + image: redis:latest + environment: + REDIS_PASSWORD: ${REDIS_PASSWORD-redis} + command: + - /bin/sh + - -c + - redis-server --appendonly yes --requirepass $$REDIS_PASSWORD + volumes: + - redis_data:/data:delegated + +volumes: + postgres_data: + postgres_test_data: + redis_data: diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh new file mode 100755 index 0000000..d68f34a --- /dev/null +++ b/docker/entrypoint.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +set -e + +case $1 in + + run-devel) + echo "→ Running as development mode" + DEBUGPY="${DEBUGPY:-false}" + exec bash -c 'if [ "${DEBUGPY}" == "True" ]; then python -m debugpy --listen 0.0.0.0:5678 -m uvicorn app.asgi:app --host 0.0.0.0 --port 80 --reload --reload-dir /app; else python -m uvicorn app.asgi:app --host 0.0.0.0 --port 80 --reload --reload-dir /app; fi' + ;; + + run-asgi) + echo "→ Running as prod mode" + exec gunicorn app.asgi:app --workers 5 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:80 + ;; + + *) + exec "$@" + ;; +esac diff --git a/env-api-dev-example b/env-api-dev-example new file mode 100644 index 0000000..b580ab6 --- /dev/null +++ b/env-api-dev-example @@ -0,0 +1,4 @@ +APP_ENV=dev +DEBUG=true +# SqlAchemy Verbose +SA_ECHO=true diff --git a/mypy.ini b/mypy.ini new file mode 100644 index 0000000..8c999f6 --- /dev/null +++ b/mypy.ini @@ -0,0 +1,27 @@ +[mypy] +python_version = 3.11 +exclude = ["src/infra/database/alembic/versions"] +mypy_path=./src:./tests +disallow_any_generics = False +disallow_untyped_calls = True +disallow_untyped_defs = True +disallow_untyped_decorators = False +ignore_errors = False +ignore_missing_imports = True +implicit_reexport = False +strict_optional = True +strict_equality = True +no_implicit_optional = True +warn_unused_ignores = True +warn_redundant_casts = True +warn_unused_configs = True +warn_unreachable = True +warn_no_return = True +warn_return_any = True +allow_untyped_calls = True + + +# Explicitly blacklist modules in use +# that don't have type stubs. +[mypy-pytest.*] +ignore_missing_imports = True diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..fe8bfbf --- /dev/null +++ b/poetry.lock @@ -0,0 +1,2354 @@ +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. + +[[package]] +name = "alembic" +version = "1.13.1" +description = "A database migration tool for SQLAlchemy." +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "alembic-1.13.1-py3-none-any.whl", hash = "sha256:2edcc97bed0bd3272611ce3a98d98279e9c209e7186e43e75bbb1b2bdfdbcc43"}, + {file = "alembic-1.13.1.tar.gz", hash = "sha256:4932c8558bf68f2ee92b9bbcb8218671c627064d5b08939437af6d77dc05e595"}, +] + +[package.dependencies] +Mako = "*" +SQLAlchemy = ">=1.3.0" +typing-extensions = ">=4" + +[package.extras] +tz = ["backports.zoneinfo"] + +[[package]] +name = "annotated-types" +version = "0.6.0" +description = "Reusable constraint types to use with typing.Annotated" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "annotated_types-0.6.0-py3-none-any.whl", hash = "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43"}, + {file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"}, +] + +[[package]] +name = "anyio" +version = "4.2.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "anyio-4.2.0-py3-none-any.whl", hash = "sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee"}, + {file = "anyio-4.2.0.tar.gz", hash = "sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f"}, +] + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.23)"] + +[[package]] +name = "asyncpg" +version = "0.29.0" +description = "An asyncio PostgreSQL driver" +category = "main" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "asyncpg-0.29.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72fd0ef9f00aeed37179c62282a3d14262dbbafb74ec0ba16e1b1864d8a12169"}, + {file = "asyncpg-0.29.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:52e8f8f9ff6e21f9b39ca9f8e3e33a5fcdceaf5667a8c5c32bee158e313be385"}, + {file = "asyncpg-0.29.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9e6823a7012be8b68301342ba33b4740e5a166f6bbda0aee32bc01638491a22"}, + {file = "asyncpg-0.29.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:746e80d83ad5d5464cfbf94315eb6744222ab00aa4e522b704322fb182b83610"}, + {file = "asyncpg-0.29.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ff8e8109cd6a46ff852a5e6bab8b0a047d7ea42fcb7ca5ae6eaae97d8eacf397"}, + {file = "asyncpg-0.29.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:97eb024685b1d7e72b1972863de527c11ff87960837919dac6e34754768098eb"}, + {file = "asyncpg-0.29.0-cp310-cp310-win32.whl", hash = "sha256:5bbb7f2cafd8d1fa3e65431833de2642f4b2124be61a449fa064e1a08d27e449"}, + {file = "asyncpg-0.29.0-cp310-cp310-win_amd64.whl", hash = "sha256:76c3ac6530904838a4b650b2880f8e7af938ee049e769ec2fba7cd66469d7772"}, + {file = "asyncpg-0.29.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4900ee08e85af01adb207519bb4e14b1cae8fd21e0ccf80fac6aa60b6da37b4"}, + {file = "asyncpg-0.29.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a65c1dcd820d5aea7c7d82a3fdcb70e096f8f70d1a8bf93eb458e49bfad036ac"}, + {file = "asyncpg-0.29.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b52e46f165585fd6af4863f268566668407c76b2c72d366bb8b522fa66f1870"}, + {file = "asyncpg-0.29.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc600ee8ef3dd38b8d67421359779f8ccec30b463e7aec7ed481c8346decf99f"}, + {file = "asyncpg-0.29.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:039a261af4f38f949095e1e780bae84a25ffe3e370175193174eb08d3cecab23"}, + {file = "asyncpg-0.29.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6feaf2d8f9138d190e5ec4390c1715c3e87b37715cd69b2c3dfca616134efd2b"}, + {file = "asyncpg-0.29.0-cp311-cp311-win32.whl", hash = "sha256:1e186427c88225ef730555f5fdda6c1812daa884064bfe6bc462fd3a71c4b675"}, + {file = "asyncpg-0.29.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfe73ffae35f518cfd6e4e5f5abb2618ceb5ef02a2365ce64f132601000587d3"}, + {file = "asyncpg-0.29.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6011b0dc29886ab424dc042bf9eeb507670a3b40aece3439944006aafe023178"}, + {file = "asyncpg-0.29.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b544ffc66b039d5ec5a7454667f855f7fec08e0dfaf5a5490dfafbb7abbd2cfb"}, + {file = "asyncpg-0.29.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d84156d5fb530b06c493f9e7635aa18f518fa1d1395ef240d211cb563c4e2364"}, + {file = "asyncpg-0.29.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54858bc25b49d1114178d65a88e48ad50cb2b6f3e475caa0f0c092d5f527c106"}, + {file = "asyncpg-0.29.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bde17a1861cf10d5afce80a36fca736a86769ab3579532c03e45f83ba8a09c59"}, + {file = "asyncpg-0.29.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:37a2ec1b9ff88d8773d3eb6d3784dc7e3fee7756a5317b67f923172a4748a175"}, + {file = "asyncpg-0.29.0-cp312-cp312-win32.whl", hash = "sha256:bb1292d9fad43112a85e98ecdc2e051602bce97c199920586be83254d9dafc02"}, + {file = "asyncpg-0.29.0-cp312-cp312-win_amd64.whl", hash = "sha256:2245be8ec5047a605e0b454c894e54bf2ec787ac04b1cb7e0d3c67aa1e32f0fe"}, + {file = "asyncpg-0.29.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0009a300cae37b8c525e5b449233d59cd9868fd35431abc470a3e364d2b85cb9"}, + {file = "asyncpg-0.29.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cad1324dbb33f3ca0cd2074d5114354ed3be2b94d48ddfd88af75ebda7c43cc"}, + {file = "asyncpg-0.29.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:012d01df61e009015944ac7543d6ee30c2dc1eb2f6b10b62a3f598beb6531548"}, + {file = "asyncpg-0.29.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:000c996c53c04770798053e1730d34e30cb645ad95a63265aec82da9093d88e7"}, + {file = "asyncpg-0.29.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e0bfe9c4d3429706cf70d3249089de14d6a01192d617e9093a8e941fea8ee775"}, + {file = "asyncpg-0.29.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:642a36eb41b6313ffa328e8a5c5c2b5bea6ee138546c9c3cf1bffaad8ee36dd9"}, + {file = "asyncpg-0.29.0-cp38-cp38-win32.whl", hash = "sha256:a921372bbd0aa3a5822dd0409da61b4cd50df89ae85150149f8c119f23e8c408"}, + {file = "asyncpg-0.29.0-cp38-cp38-win_amd64.whl", hash = "sha256:103aad2b92d1506700cbf51cd8bb5441e7e72e87a7b3a2ca4e32c840f051a6a3"}, + {file = "asyncpg-0.29.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5340dd515d7e52f4c11ada32171d87c05570479dc01dc66d03ee3e150fb695da"}, + {file = "asyncpg-0.29.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e17b52c6cf83e170d3d865571ba574577ab8e533e7361a2b8ce6157d02c665d3"}, + {file = "asyncpg-0.29.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f100d23f273555f4b19b74a96840aa27b85e99ba4b1f18d4ebff0734e78dc090"}, + {file = "asyncpg-0.29.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48e7c58b516057126b363cec8ca02b804644fd012ef8e6c7e23386b7d5e6ce83"}, + {file = "asyncpg-0.29.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f9ea3f24eb4c49a615573724d88a48bd1b7821c890c2effe04f05382ed9e8810"}, + {file = "asyncpg-0.29.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8d36c7f14a22ec9e928f15f92a48207546ffe68bc412f3be718eedccdf10dc5c"}, + {file = "asyncpg-0.29.0-cp39-cp39-win32.whl", hash = "sha256:797ab8123ebaed304a1fad4d7576d5376c3a006a4100380fb9d517f0b59c1ab2"}, + {file = "asyncpg-0.29.0-cp39-cp39-win_amd64.whl", hash = "sha256:cce08a178858b426ae1aa8409b5cc171def45d4293626e7aa6510696d46decd8"}, + {file = "asyncpg-0.29.0.tar.gz", hash = "sha256:d1c49e1f44fffafd9a55e1a9b101590859d881d639ea2922516f5d9c512d354e"}, +] + +[package.extras] +docs = ["Sphinx (>=5.3.0,<5.4.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] +test = ["flake8 (>=6.1,<7.0)", "uvloop (>=0.15.3)"] + +[[package]] +name = "bcrypt" +version = "4.1.2" +description = "Modern password hashing for your software and your servers" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "bcrypt-4.1.2-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:ac621c093edb28200728a9cca214d7e838529e557027ef0581685909acd28b5e"}, + {file = "bcrypt-4.1.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea505c97a5c465ab8c3ba75c0805a102ce526695cd6818c6de3b1a38f6f60da1"}, + {file = "bcrypt-4.1.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57fa9442758da926ed33a91644649d3e340a71e2d0a5a8de064fb621fd5a3326"}, + {file = "bcrypt-4.1.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:eb3bd3321517916696233b5e0c67fd7d6281f0ef48e66812db35fc963a422a1c"}, + {file = "bcrypt-4.1.2-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6cad43d8c63f34b26aef462b6f5e44fdcf9860b723d2453b5d391258c4c8e966"}, + {file = "bcrypt-4.1.2-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:44290ccc827d3a24604f2c8bcd00d0da349e336e6503656cb8192133e27335e2"}, + {file = "bcrypt-4.1.2-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:732b3920a08eacf12f93e6b04ea276c489f1c8fb49344f564cca2adb663b3e4c"}, + {file = "bcrypt-4.1.2-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1c28973decf4e0e69cee78c68e30a523be441972c826703bb93099868a8ff5b5"}, + {file = "bcrypt-4.1.2-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b8df79979c5bae07f1db22dcc49cc5bccf08a0380ca5c6f391cbb5790355c0b0"}, + {file = "bcrypt-4.1.2-cp37-abi3-win32.whl", hash = "sha256:fbe188b878313d01b7718390f31528be4010fed1faa798c5a1d0469c9c48c369"}, + {file = "bcrypt-4.1.2-cp37-abi3-win_amd64.whl", hash = "sha256:9800ae5bd5077b13725e2e3934aa3c9c37e49d3ea3d06318010aa40f54c63551"}, + {file = "bcrypt-4.1.2-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:71b8be82bc46cedd61a9f4ccb6c1a493211d031415a34adde3669ee1b0afbb63"}, + {file = "bcrypt-4.1.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e3c6642077b0c8092580c819c1684161262b2e30c4f45deb000c38947bf483"}, + {file = "bcrypt-4.1.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:387e7e1af9a4dd636b9505a465032f2f5cb8e61ba1120e79a0e1cd0b512f3dfc"}, + {file = "bcrypt-4.1.2-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f70d9c61f9c4ca7d57f3bfe88a5ccf62546ffbadf3681bb1e268d9d2e41c91a7"}, + {file = "bcrypt-4.1.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2a298db2a8ab20056120b45e86c00a0a5eb50ec4075b6142db35f593b97cb3fb"}, + {file = "bcrypt-4.1.2-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ba55e40de38a24e2d78d34c2d36d6e864f93e0d79d0b6ce915e4335aa81d01b1"}, + {file = "bcrypt-4.1.2-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3566a88234e8de2ccae31968127b0ecccbb4cddb629da744165db72b58d88ca4"}, + {file = "bcrypt-4.1.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:b90e216dc36864ae7132cb151ffe95155a37a14e0de3a8f64b49655dd959ff9c"}, + {file = "bcrypt-4.1.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:69057b9fc5093ea1ab00dd24ede891f3e5e65bee040395fb1e66ee196f9c9b4a"}, + {file = "bcrypt-4.1.2-cp39-abi3-win32.whl", hash = "sha256:02d9ef8915f72dd6daaef40e0baeef8a017ce624369f09754baf32bb32dba25f"}, + {file = "bcrypt-4.1.2-cp39-abi3-win_amd64.whl", hash = "sha256:be3ab1071662f6065899fe08428e45c16aa36e28bc42921c4901a191fda6ee42"}, + {file = "bcrypt-4.1.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d75fc8cd0ba23f97bae88a6ec04e9e5351ff3c6ad06f38fe32ba50cbd0d11946"}, + {file = "bcrypt-4.1.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:a97e07e83e3262599434816f631cc4c7ca2aa8e9c072c1b1a7fec2ae809a1d2d"}, + {file = "bcrypt-4.1.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e51c42750b7585cee7892c2614be0d14107fad9581d1738d954a262556dd1aab"}, + {file = "bcrypt-4.1.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ba4e4cc26610581a6329b3937e02d319f5ad4b85b074846bf4fef8a8cf51e7bb"}, + {file = "bcrypt-4.1.2.tar.gz", hash = "sha256:33313a1200a3ae90b75587ceac502b048b840fc69e7f7a0905b5f87fac7a1258"}, +] + +[package.extras] +tests = ["pytest (>=3.2.1,!=3.3.0)"] +typecheck = ["mypy"] + +[[package]] +name = "build" +version = "1.0.3" +description = "A simple, correct Python build frontend" +category = "dev" +optional = false +python-versions = ">= 3.7" +files = [ + {file = "build-1.0.3-py3-none-any.whl", hash = "sha256:589bf99a67df7c9cf07ec0ac0e5e2ea5d4b37ac63301c4986d1acb126aa83f8f"}, + {file = "build-1.0.3.tar.gz", hash = "sha256:538aab1b64f9828977f84bc63ae570b060a8ed1be419e7870b8b4fc5e6ea553b"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "os_name == \"nt\""} +packaging = ">=19.0" +pyproject_hooks = "*" + +[package.extras] +docs = ["furo (>=2023.08.17)", "sphinx (>=7.0,<8.0)", "sphinx-argparse-cli (>=1.5)", "sphinx-autodoc-typehints (>=1.10)", "sphinx-issues (>=3.0.0)"] +test = ["filelock (>=3)", "pytest (>=6.2.4)", "pytest-cov (>=2.12)", "pytest-mock (>=2)", "pytest-rerunfailures (>=9.1)", "pytest-xdist (>=1.34)", "setuptools (>=42.0.0)", "setuptools (>=56.0.0)", "setuptools (>=56.0.0)", "setuptools (>=67.8.0)", "wheel (>=0.36.0)"] +typing = ["importlib-metadata (>=5.1)", "mypy (>=1.5.0,<1.6.0)", "tomli", "typing-extensions (>=3.7.4.3)"] +virtualenv = ["virtualenv (>=20.0.35)"] + +[[package]] +name = "cachecontrol" +version = "0.13.1" +description = "httplib2 caching for requests" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cachecontrol-0.13.1-py3-none-any.whl", hash = "sha256:95dedbec849f46dda3137866dc28b9d133fc9af55f5b805ab1291833e4457aa4"}, + {file = "cachecontrol-0.13.1.tar.gz", hash = "sha256:f012366b79d2243a6118309ce73151bf52a38d4a5dac8ea57f09bd29087e506b"}, +] + +[package.dependencies] +filelock = {version = ">=3.8.0", optional = true, markers = "extra == \"filecache\""} +msgpack = ">=0.5.2" +requests = ">=2.16.0" + +[package.extras] +dev = ["CacheControl[filecache,redis]", "black", "build", "cherrypy", "mypy", "pytest", "pytest-cov", "sphinx", "tox", "types-redis", "types-requests"] +filecache = ["filelock (>=3.8.0)"] +redis = ["redis (>=2.10.5)"] + +[[package]] +name = "certifi" +version = "2023.11.17" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, + {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, +] + +[[package]] +name = "cffi" +version = "1.16.0" +description = "Foreign Function Interface for Python calling C code." +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.3.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "dev" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] + +[[package]] +name = "cleo" +version = "2.1.0" +description = "Cleo allows you to create beautiful and testable command-line interfaces." +category = "dev" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "cleo-2.1.0-py3-none-any.whl", hash = "sha256:4a31bd4dd45695a64ee3c4758f583f134267c2bc518d8ae9a29cf237d009b07e"}, + {file = "cleo-2.1.0.tar.gz", hash = "sha256:0b2c880b5d13660a7ea651001fb4acb527696c01f15c9ee650f377aa543fd523"}, +] + +[package.dependencies] +crashtest = ">=0.4.1,<0.5.0" +rapidfuzz = ">=3.0.0,<4.0.0" + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "main" +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.8.0" +description = "Add colours to the output of Python's logging module." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "colorlog-6.8.0-py3-none-any.whl", hash = "sha256:4ed23b05a1154294ac99f511fabe8c1d6d4364ec1f7fc989c7fb515ccc29d375"}, + {file = "colorlog-6.8.0.tar.gz", hash = "sha256:fbb6fdf9d5685f2517f388fb29bb27d54e8654dd31f58bc2a3b217e967a95ca6"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} + +[package.extras] +development = ["black", "flake8", "mypy", "pytest", "types-colorama"] + +[[package]] +name = "coverage" +version = "7.3.4" +description = "Code coverage measurement for Python" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "coverage-7.3.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aff2bd3d585969cc4486bfc69655e862028b689404563e6b549e6a8244f226df"}, + {file = "coverage-7.3.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4353923f38d752ecfbd3f1f20bf7a3546993ae5ecd7c07fd2f25d40b4e54571"}, + {file = "coverage-7.3.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea473c37872f0159294f7073f3fa72f68b03a129799f3533b2bb44d5e9fa4f82"}, + {file = "coverage-7.3.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5214362abf26e254d749fc0c18af4c57b532a4bfde1a057565616dd3b8d7cc94"}, + {file = "coverage-7.3.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f99b7d3f7a7adfa3d11e3a48d1a91bb65739555dd6a0d3fa68aa5852d962e5b1"}, + {file = "coverage-7.3.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:74397a1263275bea9d736572d4cf338efaade2de9ff759f9c26bcdceb383bb49"}, + {file = "coverage-7.3.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f154bd866318185ef5865ace5be3ac047b6d1cc0aeecf53bf83fe846f4384d5d"}, + {file = "coverage-7.3.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e0d84099ea7cba9ff467f9c6f747e3fc3906e2aadac1ce7b41add72e8d0a3712"}, + {file = "coverage-7.3.4-cp310-cp310-win32.whl", hash = "sha256:3f477fb8a56e0c603587b8278d9dbd32e54bcc2922d62405f65574bd76eba78a"}, + {file = "coverage-7.3.4-cp310-cp310-win_amd64.whl", hash = "sha256:c75738ce13d257efbb6633a049fb2ed8e87e2e6c2e906c52d1093a4d08d67c6b"}, + {file = "coverage-7.3.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:997aa14b3e014339d8101b9886063c5d06238848905d9ad6c6eabe533440a9a7"}, + {file = "coverage-7.3.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8a9c5bc5db3eb4cd55ecb8397d8e9b70247904f8eca718cc53c12dcc98e59fc8"}, + {file = "coverage-7.3.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27ee94f088397d1feea3cb524e4313ff0410ead7d968029ecc4bc5a7e1d34fbf"}, + {file = "coverage-7.3.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ce03e25e18dd9bf44723e83bc202114817f3367789052dc9e5b5c79f40cf59d"}, + {file = "coverage-7.3.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85072e99474d894e5df582faec04abe137b28972d5e466999bc64fc37f564a03"}, + {file = "coverage-7.3.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a877810ef918d0d345b783fc569608804f3ed2507bf32f14f652e4eaf5d8f8d0"}, + {file = "coverage-7.3.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9ac17b94ab4ca66cf803f2b22d47e392f0977f9da838bf71d1f0db6c32893cb9"}, + {file = "coverage-7.3.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:36d75ef2acab74dc948d0b537ef021306796da551e8ac8b467810911000af66a"}, + {file = "coverage-7.3.4-cp311-cp311-win32.whl", hash = "sha256:47ee56c2cd445ea35a8cc3ad5c8134cb9bece3a5cb50bb8265514208d0a65928"}, + {file = "coverage-7.3.4-cp311-cp311-win_amd64.whl", hash = "sha256:11ab62d0ce5d9324915726f611f511a761efcca970bd49d876cf831b4de65be5"}, + {file = "coverage-7.3.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:33e63c578f4acce1b6cd292a66bc30164495010f1091d4b7529d014845cd9bee"}, + {file = "coverage-7.3.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:782693b817218169bfeb9b9ba7f4a9f242764e180ac9589b45112571f32a0ba6"}, + {file = "coverage-7.3.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c4277ddaad9293454da19121c59f2d850f16bcb27f71f89a5c4836906eb35ef"}, + {file = "coverage-7.3.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3d892a19ae24b9801771a5a989fb3e850bd1ad2e2b6e83e949c65e8f37bc67a1"}, + {file = "coverage-7.3.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3024ec1b3a221bd10b5d87337d0373c2bcaf7afd86d42081afe39b3e1820323b"}, + {file = "coverage-7.3.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a1c3e9d2bbd6f3f79cfecd6f20854f4dc0c6e0ec317df2b265266d0dc06535f1"}, + {file = "coverage-7.3.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e91029d7f151d8bf5ab7d8bfe2c3dbefd239759d642b211a677bc0709c9fdb96"}, + {file = "coverage-7.3.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:6879fe41c60080aa4bb59703a526c54e0412b77e649a0d06a61782ecf0853ee1"}, + {file = "coverage-7.3.4-cp312-cp312-win32.whl", hash = "sha256:fd2f8a641f8f193968afdc8fd1697e602e199931012b574194052d132a79be13"}, + {file = "coverage-7.3.4-cp312-cp312-win_amd64.whl", hash = "sha256:d1d0ce6c6947a3a4aa5479bebceff2c807b9f3b529b637e2b33dea4468d75fc7"}, + {file = "coverage-7.3.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:36797b3625d1da885b369bdaaa3b0d9fb8865caed3c2b8230afaa6005434aa2f"}, + {file = "coverage-7.3.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bfed0ec4b419fbc807dec417c401499ea869436910e1ca524cfb4f81cf3f60e7"}, + {file = "coverage-7.3.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f97ff5a9fc2ca47f3383482858dd2cb8ddbf7514427eecf5aa5f7992d0571429"}, + {file = "coverage-7.3.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:607b6c6b35aa49defaebf4526729bd5238bc36fe3ef1a417d9839e1d96ee1e4c"}, + {file = "coverage-7.3.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8e258dcc335055ab59fe79f1dec217d9fb0cdace103d6b5c6df6b75915e7959"}, + {file = "coverage-7.3.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a02ac7c51819702b384fea5ee033a7c202f732a2a2f1fe6c41e3d4019828c8d3"}, + {file = "coverage-7.3.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b710869a15b8caf02e31d16487a931dbe78335462a122c8603bb9bd401ff6fb2"}, + {file = "coverage-7.3.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c6a23ae9348a7a92e7f750f9b7e828448e428e99c24616dec93a0720342f241d"}, + {file = "coverage-7.3.4-cp38-cp38-win32.whl", hash = "sha256:758ebaf74578b73f727acc4e8ab4b16ab6f22a5ffd7dd254e5946aba42a4ce76"}, + {file = "coverage-7.3.4-cp38-cp38-win_amd64.whl", hash = "sha256:309ed6a559bc942b7cc721f2976326efbfe81fc2b8f601c722bff927328507dc"}, + {file = "coverage-7.3.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:aefbb29dc56317a4fcb2f3857d5bce9b881038ed7e5aa5d3bcab25bd23f57328"}, + {file = "coverage-7.3.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:183c16173a70caf92e2dfcfe7c7a576de6fa9edc4119b8e13f91db7ca33a7923"}, + {file = "coverage-7.3.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a4184dcbe4f98d86470273e758f1d24191ca095412e4335ff27b417291f5964"}, + {file = "coverage-7.3.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93698ac0995516ccdca55342599a1463ed2e2d8942316da31686d4d614597ef9"}, + {file = "coverage-7.3.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb220b3596358a86361139edce40d97da7458412d412e1e10c8e1970ee8c09ab"}, + {file = "coverage-7.3.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d5b14abde6f8d969e6b9dd8c7a013d9a2b52af1235fe7bebef25ad5c8f47fa18"}, + {file = "coverage-7.3.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:610afaf929dc0e09a5eef6981edb6a57a46b7eceff151947b836d869d6d567c1"}, + {file = "coverage-7.3.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d6ed790728fb71e6b8247bd28e77e99d0c276dff952389b5388169b8ca7b1c28"}, + {file = "coverage-7.3.4-cp39-cp39-win32.whl", hash = "sha256:c15fdfb141fcf6a900e68bfa35689e1256a670db32b96e7a931cab4a0e1600e5"}, + {file = "coverage-7.3.4-cp39-cp39-win_amd64.whl", hash = "sha256:38d0b307c4d99a7aca4e00cad4311b7c51b7ac38fb7dea2abe0d182dd4008e05"}, + {file = "coverage-7.3.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:b1e0f25ae99cf247abfb3f0fac7ae25739e4cd96bf1afa3537827c576b4847e5"}, + {file = "coverage-7.3.4.tar.gz", hash = "sha256:020d56d2da5bc22a0e00a5b0d54597ee91ad72446fa4cf1b97c35022f6b6dbf0"}, +] + +[package.extras] +toml = ["tomli"] + +[[package]] +name = "crashtest" +version = "0.4.1" +description = "Manage Python errors with ease" +category = "dev" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "crashtest-0.4.1-py3-none-any.whl", hash = "sha256:8d23eac5fa660409f57472e3851dab7ac18aba459a8d19cbbba86d3d5aecd2a5"}, + {file = "crashtest-0.4.1.tar.gz", hash = "sha256:80d7b1f316ebfbd429f648076d6275c877ba30ba48979de4191714a75266f0ce"}, +] + +[[package]] +name = "cryptography" +version = "41.0.7" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cryptography-41.0.7-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:3c78451b78313fa81607fa1b3f1ae0a5ddd8014c38a02d9db0616133987b9cdf"}, + {file = "cryptography-41.0.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:928258ba5d6f8ae644e764d0f996d61a8777559f72dfeb2eea7e2fe0ad6e782d"}, + {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a1b41bc97f1ad230a41657d9155113c7521953869ae57ac39ac7f1bb471469a"}, + {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:841df4caa01008bad253bce2a6f7b47f86dc9f08df4b433c404def869f590a15"}, + {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5429ec739a29df2e29e15d082f1d9ad683701f0ec7709ca479b3ff2708dae65a"}, + {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:43f2552a2378b44869fe8827aa19e69512e3245a219104438692385b0ee119d1"}, + {file = "cryptography-41.0.7-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:af03b32695b24d85a75d40e1ba39ffe7db7ffcb099fe507b39fd41a565f1b157"}, + {file = "cryptography-41.0.7-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:49f0805fc0b2ac8d4882dd52f4a3b935b210935d500b6b805f321addc8177406"}, + {file = "cryptography-41.0.7-cp37-abi3-win32.whl", hash = "sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d"}, + {file = "cryptography-41.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:90452ba79b8788fa380dfb587cca692976ef4e757b194b093d845e8d99f612f2"}, + {file = "cryptography-41.0.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:079b85658ea2f59c4f43b70f8119a52414cdb7be34da5d019a77bf96d473b960"}, + {file = "cryptography-41.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:b640981bf64a3e978a56167594a0e97db71c89a479da8e175d8bb5be5178c003"}, + {file = "cryptography-41.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7"}, + {file = "cryptography-41.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d5ec85080cce7b0513cfd233914eb8b7bbd0633f1d1703aa28d1dd5a72f678ec"}, + {file = "cryptography-41.0.7-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7a698cb1dac82c35fcf8fe3417a3aaba97de16a01ac914b89a0889d364d2f6be"}, + {file = "cryptography-41.0.7-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:37a138589b12069efb424220bf78eac59ca68b95696fc622b6ccc1c0a197204a"}, + {file = "cryptography-41.0.7-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:68a2dec79deebc5d26d617bfdf6e8aab065a4f34934b22d3b5010df3ba36612c"}, + {file = "cryptography-41.0.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:09616eeaef406f99046553b8a40fbf8b1e70795a91885ba4c96a70793de5504a"}, + {file = "cryptography-41.0.7-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48a0476626da912a44cc078f9893f292f0b3e4c739caf289268168d8f4702a39"}, + {file = "cryptography-41.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c7f3201ec47d5207841402594f1d7950879ef890c0c495052fa62f58283fde1a"}, + {file = "cryptography-41.0.7-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c5ca78485a255e03c32b513f8c2bc39fedb7f5c5f8535545bdc223a03b24f248"}, + {file = "cryptography-41.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d6c391c021ab1f7a82da5d8d0b3cee2f4b2c455ec86c8aebbc84837a631ff309"}, + {file = "cryptography-41.0.7.tar.gz", hash = "sha256:13f93ce9bea8016c253b34afc6bd6a75993e5c40672ed5405a9c832f0d4a00bc"}, +] + +[package.dependencies] +cffi = ">=1.12" + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +nox = ["nox"] +pep8test = ["black", "check-sdist", "mypy", "ruff"] +sdist = ["build"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] + +[[package]] +name = "debugpy" +version = "1.8.0" +description = "An implementation of the Debug Adapter Protocol for Python" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "debugpy-1.8.0-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:7fb95ca78f7ac43393cd0e0f2b6deda438ec7c5e47fa5d38553340897d2fbdfb"}, + {file = "debugpy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef9ab7df0b9a42ed9c878afd3eaaff471fce3fa73df96022e1f5c9f8f8c87ada"}, + {file = "debugpy-1.8.0-cp310-cp310-win32.whl", hash = "sha256:a8b7a2fd27cd9f3553ac112f356ad4ca93338feadd8910277aff71ab24d8775f"}, + {file = "debugpy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:5d9de202f5d42e62f932507ee8b21e30d49aae7e46d5b1dd5c908db1d7068637"}, + {file = "debugpy-1.8.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:ef54404365fae8d45cf450d0544ee40cefbcb9cb85ea7afe89a963c27028261e"}, + {file = "debugpy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60009b132c91951354f54363f8ebdf7457aeb150e84abba5ae251b8e9f29a8a6"}, + {file = "debugpy-1.8.0-cp311-cp311-win32.whl", hash = "sha256:8cd0197141eb9e8a4566794550cfdcdb8b3db0818bdf8c49a8e8f8053e56e38b"}, + {file = "debugpy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:a64093656c4c64dc6a438e11d59369875d200bd5abb8f9b26c1f5f723622e153"}, + {file = "debugpy-1.8.0-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:b05a6b503ed520ad58c8dc682749113d2fd9f41ffd45daec16e558ca884008cd"}, + {file = "debugpy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c6fb41c98ec51dd010d7ed650accfd07a87fe5e93eca9d5f584d0578f28f35f"}, + {file = "debugpy-1.8.0-cp38-cp38-win32.whl", hash = "sha256:46ab6780159eeabb43c1495d9c84cf85d62975e48b6ec21ee10c95767c0590aa"}, + {file = "debugpy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:bdc5ef99d14b9c0fcb35351b4fbfc06ac0ee576aeab6b2511702e5a648a2e595"}, + {file = "debugpy-1.8.0-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:61eab4a4c8b6125d41a34bad4e5fe3d2cc145caecd63c3fe953be4cc53e65bf8"}, + {file = "debugpy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:125b9a637e013f9faac0a3d6a82bd17c8b5d2c875fb6b7e2772c5aba6d082332"}, + {file = "debugpy-1.8.0-cp39-cp39-win32.whl", hash = "sha256:57161629133113c97b387382045649a2b985a348f0c9366e22217c87b68b73c6"}, + {file = "debugpy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:e3412f9faa9ade82aa64a50b602544efcba848c91384e9f93497a458767e6926"}, + {file = "debugpy-1.8.0-py2.py3-none-any.whl", hash = "sha256:9c9b0ac1ce2a42888199df1a1906e45e6f3c9555497643a85e0bf2406e3ffbc4"}, + {file = "debugpy-1.8.0.zip", hash = "sha256:12af2c55b419521e33d5fb21bd022df0b5eb267c3e178f1d374a63a2a6bdccd0"}, +] + +[[package]] +name = "distlib" +version = "0.3.8" +description = "Distribution utilities" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, + {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, +] + +[[package]] +name = "dulwich" +version = "0.21.7" +description = "Python Git Library" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "dulwich-0.21.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d4c0110798099bb7d36a110090f2688050703065448895c4f53ade808d889dd3"}, + {file = "dulwich-0.21.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2bc12697f0918bee324c18836053644035362bb3983dc1b210318f2fed1d7132"}, + {file = "dulwich-0.21.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:471305af74790827fcbafe330fc2e8bdcee4fb56ca1177c8c481b1c8f806c4a4"}, + {file = "dulwich-0.21.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d54c9d0e845be26f65f954dff13a1cd3f2b9739820c19064257b8fd7435ab263"}, + {file = "dulwich-0.21.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12d61334a575474e707614f2e93d6ed4cdae9eb47214f9277076d9e5615171d3"}, + {file = "dulwich-0.21.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e274cebaf345f0b1e3b70197f2651de92b652386b68020cfd3bf61bc30f6eaaa"}, + {file = "dulwich-0.21.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:817822f970e196e757ae01281ecbf21369383285b9f4a83496312204cf889b8c"}, + {file = "dulwich-0.21.7-cp310-cp310-win32.whl", hash = "sha256:7836da3f4110ce684dcd53489015fb7fa94ed33c5276e3318b8b1cbcb5b71e08"}, + {file = "dulwich-0.21.7-cp310-cp310-win_amd64.whl", hash = "sha256:4a043b90958cec866b4edc6aef5fe3c2c96a664d0b357e1682a46f6c477273c4"}, + {file = "dulwich-0.21.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ce8db196e79c1f381469410d26fb1d8b89c6b87a4e7f00ff418c22a35121405c"}, + {file = "dulwich-0.21.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:62bfb26bdce869cd40be443dfd93143caea7089b165d2dcc33de40f6ac9d812a"}, + {file = "dulwich-0.21.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c01a735b9a171dcb634a97a3cec1b174cfbfa8e840156870384b633da0460f18"}, + {file = "dulwich-0.21.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa4d14767cf7a49c9231c2e52cb2a3e90d0c83f843eb6a2ca2b5d81d254cf6b9"}, + {file = "dulwich-0.21.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bca4b86e96d6ef18c5bc39828ea349efb5be2f9b1f6ac9863f90589bac1084d"}, + {file = "dulwich-0.21.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a7b5624b02ef808cdc62dabd47eb10cd4ac15e8ac6df9e2e88b6ac6b40133673"}, + {file = "dulwich-0.21.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c3a539b4696a42fbdb7412cb7b66a4d4d332761299d3613d90a642923c7560e1"}, + {file = "dulwich-0.21.7-cp311-cp311-win32.whl", hash = "sha256:675a612ce913081beb0f37b286891e795d905691dfccfb9bf73721dca6757cde"}, + {file = "dulwich-0.21.7-cp311-cp311-win_amd64.whl", hash = "sha256:460ba74bdb19f8d498786ae7776745875059b1178066208c0fd509792d7f7bfc"}, + {file = "dulwich-0.21.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4c51058ec4c0b45dc5189225b9e0c671b96ca9713c1daf71d622c13b0ab07681"}, + {file = "dulwich-0.21.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4bc4c5366eaf26dda3fdffe160a3b515666ed27c2419f1d483da285ac1411de0"}, + {file = "dulwich-0.21.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a0650ec77d89cb947e3e4bbd4841c96f74e52b4650830112c3057a8ca891dc2f"}, + {file = "dulwich-0.21.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f18f0a311fb7734b033a3101292b932158cade54b74d1c44db519e42825e5a2"}, + {file = "dulwich-0.21.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c589468e5c0cd84e97eb7ec209ab005a2cb69399e8c5861c3edfe38989ac3a8"}, + {file = "dulwich-0.21.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d62446797163317a397a10080c6397ffaaca51a7804c0120b334f8165736c56a"}, + {file = "dulwich-0.21.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e84cc606b1f581733df4350ca4070e6a8b30be3662bbb81a590b177d0c996c91"}, + {file = "dulwich-0.21.7-cp312-cp312-win32.whl", hash = "sha256:c3d1685f320907a52c40fd5890627945c51f3a5fa4bcfe10edb24fec79caadec"}, + {file = "dulwich-0.21.7-cp312-cp312-win_amd64.whl", hash = "sha256:6bd69921fdd813b7469a3c77bc75c1783cc1d8d72ab15a406598e5a3ba1a1503"}, + {file = "dulwich-0.21.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7d8ab29c660125db52106775caa1f8f7f77a69ed1fe8bc4b42bdf115731a25bf"}, + {file = "dulwich-0.21.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0d2e4485b98695bf95350ce9d38b1bb0aaac2c34ad00a0df789aa33c934469b"}, + {file = "dulwich-0.21.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e138d516baa6b5bafbe8f030eccc544d0d486d6819b82387fc0e285e62ef5261"}, + {file = "dulwich-0.21.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f34bf9b9fa9308376263fd9ac43143c7c09da9bc75037bb75c6c2423a151b92c"}, + {file = "dulwich-0.21.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2e2c66888207b71cd1daa2acb06d3984a6bc13787b837397a64117aa9fc5936a"}, + {file = "dulwich-0.21.7-cp37-cp37m-win32.whl", hash = "sha256:10893105c6566fc95bc2a67b61df7cc1e8f9126d02a1df6a8b2b82eb59db8ab9"}, + {file = "dulwich-0.21.7-cp37-cp37m-win_amd64.whl", hash = "sha256:460b3849d5c3d3818a80743b4f7a0094c893c559f678e56a02fff570b49a644a"}, + {file = "dulwich-0.21.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:74700e4c7d532877355743336c36f51b414d01e92ba7d304c4f8d9a5946dbc81"}, + {file = "dulwich-0.21.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c92e72c43c9e9e936b01a57167e0ea77d3fd2d82416edf9489faa87278a1cdf7"}, + {file = "dulwich-0.21.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d097e963eb6b9fa53266146471531ad9c6765bf390849230311514546ed64db2"}, + {file = "dulwich-0.21.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:808e8b9cc0aa9ac74870b49db4f9f39a52fb61694573f84b9c0613c928d4caf8"}, + {file = "dulwich-0.21.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1957b65f96e36c301e419d7adaadcff47647c30eb072468901bb683b1000bc5"}, + {file = "dulwich-0.21.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4b09bc3a64fb70132ec14326ecbe6e0555381108caff3496898962c4136a48c6"}, + {file = "dulwich-0.21.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5882e70b74ac3c736a42d3fdd4f5f2e6570637f59ad5d3e684760290b58f041"}, + {file = "dulwich-0.21.7-cp38-cp38-win32.whl", hash = "sha256:29bb5c1d70eba155ded41ed8a62be2f72edbb3c77b08f65b89c03976292f6d1b"}, + {file = "dulwich-0.21.7-cp38-cp38-win_amd64.whl", hash = "sha256:25c3ab8fb2e201ad2031ddd32e4c68b7c03cb34b24a5ff477b7a7dcef86372f5"}, + {file = "dulwich-0.21.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8929c37986c83deb4eb500c766ee28b6670285b512402647ee02a857320e377c"}, + {file = "dulwich-0.21.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cc1e11be527ac06316539b57a7688bcb1b6a3e53933bc2f844397bc50734e9ae"}, + {file = "dulwich-0.21.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0fc3078a1ba04c588fabb0969d3530efd5cd1ce2cf248eefb6baf7cbc15fc285"}, + {file = "dulwich-0.21.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40dcbd29ba30ba2c5bfbab07a61a5f20095541d5ac66d813056c122244df4ac0"}, + {file = "dulwich-0.21.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8869fc8ec3dda743e03d06d698ad489b3705775fe62825e00fa95aa158097fc0"}, + {file = "dulwich-0.21.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d96ca5e0dde49376fbcb44f10eddb6c30284a87bd03bb577c59bb0a1f63903fa"}, + {file = "dulwich-0.21.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e0064363bd5e814359657ae32517fa8001e8573d9d040bd997908d488ab886ed"}, + {file = "dulwich-0.21.7-cp39-cp39-win32.whl", hash = "sha256:869eb7be48243e695673b07905d18b73d1054a85e1f6e298fe63ba2843bb2ca1"}, + {file = "dulwich-0.21.7-cp39-cp39-win_amd64.whl", hash = "sha256:404b8edeb3c3a86c47c0a498699fc064c93fa1f8bab2ffe919e8ab03eafaaad3"}, + {file = "dulwich-0.21.7-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e598d743c6c0548ebcd2baf94aa9c8bfacb787ea671eeeb5828cfbd7d56b552f"}, + {file = "dulwich-0.21.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4a2d76c96426e791556836ef43542b639def81be4f1d6d4322cd886c115eae1"}, + {file = "dulwich-0.21.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6c88acb60a1f4d31bd6d13bfba465853b3df940ee4a0f2a3d6c7a0778c705b7"}, + {file = "dulwich-0.21.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ecd315847dea406a4decfa39d388a2521e4e31acde3bd9c2609c989e817c6d62"}, + {file = "dulwich-0.21.7-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d05d3c781bc74e2c2a2a8f4e4e2ed693540fbe88e6ac36df81deac574a6dad99"}, + {file = "dulwich-0.21.7-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6de6f8de4a453fdbae8062a6faa652255d22a3d8bce0cd6d2d6701305c75f2b3"}, + {file = "dulwich-0.21.7-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e25953c7acbbe4e19650d0225af1c0c0e6882f8bddd2056f75c1cc2b109b88ad"}, + {file = "dulwich-0.21.7-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:4637cbd8ed1012f67e1068aaed19fcc8b649bcf3e9e26649826a303298c89b9d"}, + {file = "dulwich-0.21.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:858842b30ad6486aacaa607d60bab9c9a29e7c59dc2d9cb77ae5a94053878c08"}, + {file = "dulwich-0.21.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:739b191f61e1c4ce18ac7d520e7a7cbda00e182c3489552408237200ce8411ad"}, + {file = "dulwich-0.21.7-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:274c18ec3599a92a9b67abaf110e4f181a4f779ee1aaab9e23a72e89d71b2bd9"}, + {file = "dulwich-0.21.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:2590e9b431efa94fc356ae33b38f5e64f1834ec3a94a6ac3a64283b206d07aa3"}, + {file = "dulwich-0.21.7-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ed60d1f610ef6437586f7768254c2a93820ccbd4cfdac7d182cf2d6e615969bb"}, + {file = "dulwich-0.21.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8278835e168dd097089f9e53088c7a69c6ca0841aef580d9603eafe9aea8c358"}, + {file = "dulwich-0.21.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffc27fb063f740712e02b4d2f826aee8bbed737ed799962fef625e2ce56e2d29"}, + {file = "dulwich-0.21.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:61e3451bd3d3844f2dca53f131982553be4d1b1e1ebd9db701843dd76c4dba31"}, + {file = "dulwich-0.21.7.tar.gz", hash = "sha256:a9e9c66833cea580c3ac12927e4b9711985d76afca98da971405d414de60e968"}, +] + +[package.dependencies] +urllib3 = ">=1.25" + +[package.extras] +fastimport = ["fastimport"] +https = ["urllib3 (>=1.24.1)"] +paramiko = ["paramiko"] +pgp = ["gpg"] + +[[package]] +name = "ecdsa" +version = "0.18.0" +description = "ECDSA cryptographic signature library (pure python)" +category = "main" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "ecdsa-0.18.0-py2.py3-none-any.whl", hash = "sha256:80600258e7ed2f16b9aa1d7c295bd70194109ad5a30fdee0eaeefef1d4c559dd"}, + {file = "ecdsa-0.18.0.tar.gz", hash = "sha256:190348041559e21b22a1d65cee485282ca11a6f81d503fddb84d5017e9ed1e49"}, +] + +[package.dependencies] +six = ">=1.9.0" + +[package.extras] +gmpy = ["gmpy"] +gmpy2 = ["gmpy2"] + +[[package]] +name = "faker" +version = "22.0.0" +description = "Faker is a Python package that generates fake data for you." +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "Faker-22.0.0-py3-none-any.whl", hash = "sha256:9c22c0a734ca01c6e4f2259eab5dab9081905a9d67b27272aea5c9feeb5a3789"}, + {file = "Faker-22.0.0.tar.gz", hash = "sha256:1d5dc0a75da7bc40741ee4c84d99dc087b97bd086d4222ad06ac4dd2219bcf3f"}, +] + +[package.dependencies] +python-dateutil = ">=2.4" + +[[package]] +name = "fastapi" +version = "0.108.0" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fastapi-0.108.0-py3-none-any.whl", hash = "sha256:8c7bc6d315da963ee4cdb605557827071a9a7f95aeb8fcdd3bde48cdc8764dd7"}, + {file = "fastapi-0.108.0.tar.gz", hash = "sha256:5056e504ac6395bf68493d71fcfc5352fdbd5fda6f88c21f6420d80d81163296"}, +] + +[package.dependencies] +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" +starlette = ">=0.29.0,<0.33.0" +typing-extensions = ">=4.8.0" + +[package.extras] +all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "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)"] + +[[package]] +name = "fastjsonschema" +version = "2.19.0" +description = "Fastest Python implementation of JSON schema" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "fastjsonschema-2.19.0-py3-none-any.whl", hash = "sha256:b9fd1a2dd6971dbc7fee280a95bd199ae0dd9ce22beb91cc75e9c1c528a5170e"}, + {file = "fastjsonschema-2.19.0.tar.gz", hash = "sha256:e25df6647e1bc4a26070b700897b07b542ec898dd4f1f6ea013e7f6a88417225"}, +] + +[package.extras] +devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] + +[[package]] +name = "filelock" +version = "3.13.1" +description = "A platform independent file lock." +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"}, + {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +typing = ["typing-extensions (>=4.8)"] + +[[package]] +name = "greenlet" +version = "3.0.3" +description = "Lightweight in-process concurrent programming" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "greenlet-3.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405"}, + {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f"}, + {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb"}, + {file = "greenlet-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9"}, + {file = "greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22"}, + {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3"}, + {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d"}, + {file = "greenlet-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728"}, + {file = "greenlet-3.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf"}, + {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305"}, + {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6"}, + {file = "greenlet-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2"}, + {file = "greenlet-3.0.3-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41"}, + {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7"}, + {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6"}, + {file = "greenlet-3.0.3-cp37-cp37m-win32.whl", hash = "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d"}, + {file = "greenlet-3.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67"}, + {file = "greenlet-3.0.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4"}, + {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5"}, + {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da"}, + {file = "greenlet-3.0.3-cp38-cp38-win32.whl", hash = "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3"}, + {file = "greenlet-3.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf"}, + {file = "greenlet-3.0.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b"}, + {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6"}, + {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113"}, + {file = "greenlet-3.0.3-cp39-cp39-win32.whl", hash = "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e"}, + {file = "greenlet-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067"}, + {file = "greenlet-3.0.3.tar.gz", hash = "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"}, +] + +[package.extras] +docs = ["Sphinx", "furo"] +test = ["objgraph", "psutil"] + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +category = "main" +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 = "httpcore" +version = "1.0.2" +description = "A minimal low-level HTTP client." +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpcore-1.0.2-py3-none-any.whl", hash = "sha256:096cc05bca73b8e459a1fc3dcf585148f63e534eae4339559c9b8a8d6399acc7"}, + {file = "httpcore-1.0.2.tar.gz", hash = "sha256:9fc092e4799b26174648e54b74ed5f683132a464e95643b226e00c2ed2fa6535"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] +trio = ["trio (>=0.22.0,<0.23.0)"] + +[[package]] +name = "httpx" +version = "0.26.0" +description = "The next generation HTTP client." +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-0.26.0-py3-none-any.whl", hash = "sha256:8915f5a3627c4d47b73e8202457cb28f1266982d1159bd5779d86a80c0eab1cd"}, + {file = "httpx-0.26.0.tar.gz", hash = "sha256:451b55c30d5185ea6b23c2c793abf9bb237d2a7dfb901ced6ff69ad37ec1dfaf"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = ">=1.0.0,<2.0.0" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] + +[[package]] +name = "idna" +version = "3.6" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, + {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "installer" +version = "0.7.0" +description = "A library for installing Python wheels." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "installer-0.7.0-py3-none-any.whl", hash = "sha256:05d1933f0a5ba7d8d6296bb6d5018e7c94fa473ceb10cf198a92ccea19c27b53"}, + {file = "installer-0.7.0.tar.gz", hash = "sha256:a26d3e3116289bb08216e0d0f7d925fcef0b0194eedfa0c944bcaaa106c4b631"}, +] + +[[package]] +name = "jaraco-classes" +version = "3.3.0" +description = "Utility functions for Python class constructs" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jaraco.classes-3.3.0-py3-none-any.whl", hash = "sha256:10afa92b6743f25c0cf5f37c6bb6e18e2c5bb84a16527ccfc0040ea377e7aaeb"}, + {file = "jaraco.classes-3.3.0.tar.gz", hash = "sha256:c063dd08e89217cee02c8d5e5ec560f2c8ce6cdc2fcdc2e68f7b2e5547ed3621"}, +] + +[package.dependencies] +more-itertools = "*" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] + +[[package]] +name = "jeepney" +version = "0.8.0" +description = "Low-level, pure Python DBus protocol wrapper." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, + {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, +] + +[package.extras] +test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] +trio = ["async_generator", "trio"] + +[[package]] +name = "keyring" +version = "24.3.0" +description = "Store and access your passwords safely." +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "keyring-24.3.0-py3-none-any.whl", hash = "sha256:4446d35d636e6a10b8bce7caa66913dd9eca5fd222ca03a3d42c38608ac30836"}, + {file = "keyring-24.3.0.tar.gz", hash = "sha256:e730ecffd309658a08ee82535a3b5ec4b4c8669a9be11efb66249d8e0aeb9a25"}, +] + +[package.dependencies] +"jaraco.classes" = "*" +jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} +pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""} +SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} + +[package.extras] +completion = ["shtab (>=1.1.0)"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] + +[[package]] +name = "mako" +version = "1.3.0" +description = "A super-fast templating language that borrows the best ideas from the existing templating languages." +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "Mako-1.3.0-py3-none-any.whl", hash = "sha256:57d4e997349f1a92035aa25c17ace371a4213f2ca42f99bee9a602500cfd54d9"}, + {file = "Mako-1.3.0.tar.gz", hash = "sha256:e3a9d388fd00e87043edbe8792f45880ac0114e9c4adc69f6e9bfb2c55e3b11b"}, +] + +[package.dependencies] +MarkupSafe = ">=0.9.2" + +[package.extras] +babel = ["Babel"] +lingua = ["lingua"] +testing = ["pytest"] + +[[package]] +name = "markupsafe" +version = "2.1.3" +description = "Safely add untrusted strings to HTML/XML markup." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, +] + +[[package]] +name = "more-itertools" +version = "10.1.0" +description = "More routines for operating on iterables, beyond itertools" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "more-itertools-10.1.0.tar.gz", hash = "sha256:626c369fa0eb37bac0291bce8259b332fd59ac792fa5497b59837309cd5b114a"}, + {file = "more_itertools-10.1.0-py3-none-any.whl", hash = "sha256:64e0735fcfdc6f3464ea133afe8ea4483b1c5fe3a3d69852e6503b43a0b222e6"}, +] + +[[package]] +name = "msgpack" +version = "1.0.7" +description = "MessagePack serializer" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "msgpack-1.0.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:04ad6069c86e531682f9e1e71b71c1c3937d6014a7c3e9edd2aa81ad58842862"}, + {file = "msgpack-1.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cca1b62fe70d761a282496b96a5e51c44c213e410a964bdffe0928e611368329"}, + {file = "msgpack-1.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e50ebce52f41370707f1e21a59514e3375e3edd6e1832f5e5235237db933c98b"}, + {file = "msgpack-1.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a7b4f35de6a304b5533c238bee86b670b75b03d31b7797929caa7a624b5dda6"}, + {file = "msgpack-1.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28efb066cde83c479dfe5a48141a53bc7e5f13f785b92ddde336c716663039ee"}, + {file = "msgpack-1.0.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4cb14ce54d9b857be9591ac364cb08dc2d6a5c4318c1182cb1d02274029d590d"}, + {file = "msgpack-1.0.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b573a43ef7c368ba4ea06050a957c2a7550f729c31f11dd616d2ac4aba99888d"}, + {file = "msgpack-1.0.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ccf9a39706b604d884d2cb1e27fe973bc55f2890c52f38df742bc1d79ab9f5e1"}, + {file = "msgpack-1.0.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cb70766519500281815dfd7a87d3a178acf7ce95390544b8c90587d76b227681"}, + {file = "msgpack-1.0.7-cp310-cp310-win32.whl", hash = "sha256:b610ff0f24e9f11c9ae653c67ff8cc03c075131401b3e5ef4b82570d1728f8a9"}, + {file = "msgpack-1.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:a40821a89dc373d6427e2b44b572efc36a2778d3f543299e2f24eb1a5de65415"}, + {file = "msgpack-1.0.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:576eb384292b139821c41995523654ad82d1916da6a60cff129c715a6223ea84"}, + {file = "msgpack-1.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:730076207cb816138cf1af7f7237b208340a2c5e749707457d70705715c93b93"}, + {file = "msgpack-1.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:85765fdf4b27eb5086f05ac0491090fc76f4f2b28e09d9350c31aac25a5aaff8"}, + {file = "msgpack-1.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3476fae43db72bd11f29a5147ae2f3cb22e2f1a91d575ef130d2bf49afd21c46"}, + {file = "msgpack-1.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d4c80667de2e36970ebf74f42d1088cc9ee7ef5f4e8c35eee1b40eafd33ca5b"}, + {file = "msgpack-1.0.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b0bf0effb196ed76b7ad883848143427a73c355ae8e569fa538365064188b8e"}, + {file = "msgpack-1.0.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f9a7c509542db4eceed3dcf21ee5267ab565a83555c9b88a8109dcecc4709002"}, + {file = "msgpack-1.0.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:84b0daf226913133f899ea9b30618722d45feffa67e4fe867b0b5ae83a34060c"}, + {file = "msgpack-1.0.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ec79ff6159dffcc30853b2ad612ed572af86c92b5168aa3fc01a67b0fa40665e"}, + {file = "msgpack-1.0.7-cp311-cp311-win32.whl", hash = "sha256:3e7bf4442b310ff154b7bb9d81eb2c016b7d597e364f97d72b1acc3817a0fdc1"}, + {file = "msgpack-1.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:3f0c8c6dfa6605ab8ff0611995ee30d4f9fcff89966cf562733b4008a3d60d82"}, + {file = "msgpack-1.0.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f0936e08e0003f66bfd97e74ee530427707297b0d0361247e9b4f59ab78ddc8b"}, + {file = "msgpack-1.0.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98bbd754a422a0b123c66a4c341de0474cad4a5c10c164ceed6ea090f3563db4"}, + {file = "msgpack-1.0.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b291f0ee7961a597cbbcc77709374087fa2a9afe7bdb6a40dbbd9b127e79afee"}, + {file = "msgpack-1.0.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebbbba226f0a108a7366bf4b59bf0f30a12fd5e75100c630267d94d7f0ad20e5"}, + {file = "msgpack-1.0.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e2d69948e4132813b8d1131f29f9101bc2c915f26089a6d632001a5c1349672"}, + {file = "msgpack-1.0.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bdf38ba2d393c7911ae989c3bbba510ebbcdf4ecbdbfec36272abe350c454075"}, + {file = "msgpack-1.0.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:993584fc821c58d5993521bfdcd31a4adf025c7d745bbd4d12ccfecf695af5ba"}, + {file = "msgpack-1.0.7-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:52700dc63a4676669b341ba33520f4d6e43d3ca58d422e22ba66d1736b0a6e4c"}, + {file = "msgpack-1.0.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e45ae4927759289c30ccba8d9fdce62bb414977ba158286b5ddaf8df2cddb5c5"}, + {file = "msgpack-1.0.7-cp312-cp312-win32.whl", hash = "sha256:27dcd6f46a21c18fa5e5deed92a43d4554e3df8d8ca5a47bf0615d6a5f39dbc9"}, + {file = "msgpack-1.0.7-cp312-cp312-win_amd64.whl", hash = "sha256:7687e22a31e976a0e7fc99c2f4d11ca45eff652a81eb8c8085e9609298916dcf"}, + {file = "msgpack-1.0.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5b6ccc0c85916998d788b295765ea0e9cb9aac7e4a8ed71d12e7d8ac31c23c95"}, + {file = "msgpack-1.0.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:235a31ec7db685f5c82233bddf9858748b89b8119bf4538d514536c485c15fe0"}, + {file = "msgpack-1.0.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cab3db8bab4b7e635c1c97270d7a4b2a90c070b33cbc00c99ef3f9be03d3e1f7"}, + {file = "msgpack-1.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bfdd914e55e0d2c9e1526de210f6fe8ffe9705f2b1dfcc4aecc92a4cb4b533d"}, + {file = "msgpack-1.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36e17c4592231a7dbd2ed09027823ab295d2791b3b1efb2aee874b10548b7524"}, + {file = "msgpack-1.0.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38949d30b11ae5f95c3c91917ee7a6b239f5ec276f271f28638dec9156f82cfc"}, + {file = "msgpack-1.0.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ff1d0899f104f3921d94579a5638847f783c9b04f2d5f229392ca77fba5b82fc"}, + {file = "msgpack-1.0.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:dc43f1ec66eb8440567186ae2f8c447d91e0372d793dfe8c222aec857b81a8cf"}, + {file = "msgpack-1.0.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dd632777ff3beaaf629f1ab4396caf7ba0bdd075d948a69460d13d44357aca4c"}, + {file = "msgpack-1.0.7-cp38-cp38-win32.whl", hash = "sha256:4e71bc4416de195d6e9b4ee93ad3f2f6b2ce11d042b4d7a7ee00bbe0358bd0c2"}, + {file = "msgpack-1.0.7-cp38-cp38-win_amd64.whl", hash = "sha256:8f5b234f567cf76ee489502ceb7165c2a5cecec081db2b37e35332b537f8157c"}, + {file = "msgpack-1.0.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfef2bb6ef068827bbd021017a107194956918ab43ce4d6dc945ffa13efbc25f"}, + {file = "msgpack-1.0.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:484ae3240666ad34cfa31eea7b8c6cd2f1fdaae21d73ce2974211df099a95d81"}, + {file = "msgpack-1.0.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3967e4ad1aa9da62fd53e346ed17d7b2e922cba5ab93bdd46febcac39be636fc"}, + {file = "msgpack-1.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dd178c4c80706546702c59529ffc005681bd6dc2ea234c450661b205445a34d"}, + {file = "msgpack-1.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6ffbc252eb0d229aeb2f9ad051200668fc3a9aaa8994e49f0cb2ffe2b7867e7"}, + {file = "msgpack-1.0.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:822ea70dc4018c7e6223f13affd1c5c30c0f5c12ac1f96cd8e9949acddb48a61"}, + {file = "msgpack-1.0.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:384d779f0d6f1b110eae74cb0659d9aa6ff35aaf547b3955abf2ab4c901c4819"}, + {file = "msgpack-1.0.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f64e376cd20d3f030190e8c32e1c64582eba56ac6dc7d5b0b49a9d44021b52fd"}, + {file = "msgpack-1.0.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5ed82f5a7af3697b1c4786053736f24a0efd0a1b8a130d4c7bfee4b9ded0f08f"}, + {file = "msgpack-1.0.7-cp39-cp39-win32.whl", hash = "sha256:f26a07a6e877c76a88e3cecac8531908d980d3d5067ff69213653649ec0f60ad"}, + {file = "msgpack-1.0.7-cp39-cp39-win_amd64.whl", hash = "sha256:1dc93e8e4653bdb5910aed79f11e165c85732067614f180f70534f056da97db3"}, + {file = "msgpack-1.0.7.tar.gz", hash = "sha256:572efc93db7a4d27e404501975ca6d2d9775705c2d922390d878fcf768d92c87"}, +] + +[[package]] +name = "orjson" +version = "3.9.10" +description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "orjson-3.9.10-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:c18a4da2f50050a03d1da5317388ef84a16013302a5281d6f64e4a3f406aabc4"}, + {file = "orjson-3.9.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5148bab4d71f58948c7c39d12b14a9005b6ab35a0bdf317a8ade9a9e4d9d0bd5"}, + {file = "orjson-3.9.10-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4cf7837c3b11a2dfb589f8530b3cff2bd0307ace4c301e8997e95c7468c1378e"}, + {file = "orjson-3.9.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c62b6fa2961a1dcc51ebe88771be5319a93fd89bd247c9ddf732bc250507bc2b"}, + {file = "orjson-3.9.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:deeb3922a7a804755bbe6b5be9b312e746137a03600f488290318936c1a2d4dc"}, + {file = "orjson-3.9.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1234dc92d011d3554d929b6cf058ac4a24d188d97be5e04355f1b9223e98bbe9"}, + {file = "orjson-3.9.10-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:06ad5543217e0e46fd7ab7ea45d506c76f878b87b1b4e369006bdb01acc05a83"}, + {file = "orjson-3.9.10-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4fd72fab7bddce46c6826994ce1e7de145ae1e9e106ebb8eb9ce1393ca01444d"}, + {file = "orjson-3.9.10-cp310-none-win32.whl", hash = "sha256:b5b7d4a44cc0e6ff98da5d56cde794385bdd212a86563ac321ca64d7f80c80d1"}, + {file = "orjson-3.9.10-cp310-none-win_amd64.whl", hash = "sha256:61804231099214e2f84998316f3238c4c2c4aaec302df12b21a64d72e2a135c7"}, + {file = "orjson-3.9.10-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:cff7570d492bcf4b64cc862a6e2fb77edd5e5748ad715f487628f102815165e9"}, + {file = "orjson-3.9.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed8bc367f725dfc5cabeed1ae079d00369900231fbb5a5280cf0736c30e2adf7"}, + {file = "orjson-3.9.10-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c812312847867b6335cfb264772f2a7e85b3b502d3a6b0586aa35e1858528ab1"}, + {file = "orjson-3.9.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9edd2856611e5050004f4722922b7b1cd6268da34102667bd49d2a2b18bafb81"}, + {file = "orjson-3.9.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:674eb520f02422546c40401f4efaf8207b5e29e420c17051cddf6c02783ff5ca"}, + {file = "orjson-3.9.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d0dc4310da8b5f6415949bd5ef937e60aeb0eb6b16f95041b5e43e6200821fb"}, + {file = "orjson-3.9.10-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e99c625b8c95d7741fe057585176b1b8783d46ed4b8932cf98ee145c4facf499"}, + {file = "orjson-3.9.10-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ec6f18f96b47299c11203edfbdc34e1b69085070d9a3d1f302810cc23ad36bf3"}, + {file = "orjson-3.9.10-cp311-none-win32.whl", hash = "sha256:ce0a29c28dfb8eccd0f16219360530bc3cfdf6bf70ca384dacd36e6c650ef8e8"}, + {file = "orjson-3.9.10-cp311-none-win_amd64.whl", hash = "sha256:cf80b550092cc480a0cbd0750e8189247ff45457e5a023305f7ef1bcec811616"}, + {file = "orjson-3.9.10-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:602a8001bdf60e1a7d544be29c82560a7b49319a0b31d62586548835bbe2c862"}, + {file = "orjson-3.9.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f295efcd47b6124b01255d1491f9e46f17ef40d3d7eabf7364099e463fb45f0f"}, + {file = "orjson-3.9.10-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:92af0d00091e744587221e79f68d617b432425a7e59328ca4c496f774a356071"}, + {file = "orjson-3.9.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5a02360e73e7208a872bf65a7554c9f15df5fe063dc047f79738998b0506a14"}, + {file = "orjson-3.9.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:858379cbb08d84fe7583231077d9a36a1a20eb72f8c9076a45df8b083724ad1d"}, + {file = "orjson-3.9.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666c6fdcaac1f13eb982b649e1c311c08d7097cbda24f32612dae43648d8db8d"}, + {file = "orjson-3.9.10-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3fb205ab52a2e30354640780ce4587157a9563a68c9beaf52153e1cea9aa0921"}, + {file = "orjson-3.9.10-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7ec960b1b942ee3c69323b8721df2a3ce28ff40e7ca47873ae35bfafeb4555ca"}, + {file = "orjson-3.9.10-cp312-none-win_amd64.whl", hash = "sha256:3e892621434392199efb54e69edfff9f699f6cc36dd9553c5bf796058b14b20d"}, + {file = "orjson-3.9.10-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:8b9ba0ccd5a7f4219e67fbbe25e6b4a46ceef783c42af7dbc1da548eb28b6531"}, + {file = "orjson-3.9.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e2ecd1d349e62e3960695214f40939bbfdcaeaaa62ccc638f8e651cf0970e5f"}, + {file = "orjson-3.9.10-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f433be3b3f4c66016d5a20e5b4444ef833a1f802ced13a2d852c637f69729c1"}, + {file = "orjson-3.9.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4689270c35d4bb3102e103ac43c3f0b76b169760aff8bcf2d401a3e0e58cdb7f"}, + {file = "orjson-3.9.10-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4bd176f528a8151a6efc5359b853ba3cc0e82d4cd1fab9c1300c5d957dc8f48c"}, + {file = "orjson-3.9.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a2ce5ea4f71681623f04e2b7dadede3c7435dfb5e5e2d1d0ec25b35530e277b"}, + {file = "orjson-3.9.10-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:49f8ad582da6e8d2cf663c4ba5bf9f83cc052570a3a767487fec6af839b0e777"}, + {file = "orjson-3.9.10-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2a11b4b1a8415f105d989876a19b173f6cdc89ca13855ccc67c18efbd7cbd1f8"}, + {file = "orjson-3.9.10-cp38-none-win32.whl", hash = "sha256:a353bf1f565ed27ba71a419b2cd3db9d6151da426b61b289b6ba1422a702e643"}, + {file = "orjson-3.9.10-cp38-none-win_amd64.whl", hash = "sha256:e28a50b5be854e18d54f75ef1bb13e1abf4bc650ab9d635e4258c58e71eb6ad5"}, + {file = "orjson-3.9.10-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ee5926746232f627a3be1cc175b2cfad24d0170d520361f4ce3fa2fd83f09e1d"}, + {file = "orjson-3.9.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a73160e823151f33cdc05fe2cea557c5ef12fdf276ce29bb4f1c571c8368a60"}, + {file = "orjson-3.9.10-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c338ed69ad0b8f8f8920c13f529889fe0771abbb46550013e3c3d01e5174deef"}, + {file = "orjson-3.9.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5869e8e130e99687d9e4be835116c4ebd83ca92e52e55810962446d841aba8de"}, + {file = "orjson-3.9.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2c1e559d96a7f94a4f581e2a32d6d610df5840881a8cba8f25e446f4d792df3"}, + {file = "orjson-3.9.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a3a3a72c9811b56adf8bcc829b010163bb2fc308877e50e9910c9357e78521"}, + {file = "orjson-3.9.10-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7f8fb7f5ecf4f6355683ac6881fd64b5bb2b8a60e3ccde6ff799e48791d8f864"}, + {file = "orjson-3.9.10-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c943b35ecdf7123b2d81d225397efddf0bce2e81db2f3ae633ead38e85cd5ade"}, + {file = "orjson-3.9.10-cp39-none-win32.whl", hash = "sha256:fb0b361d73f6b8eeceba47cd37070b5e6c9de5beaeaa63a1cb35c7e1a73ef088"}, + {file = "orjson-3.9.10-cp39-none-win_amd64.whl", hash = "sha256:b90f340cb6397ec7a854157fac03f0c82b744abdd1c0941a024c3c29d1340aff"}, + {file = "orjson-3.9.10.tar.gz", hash = "sha256:9ebbdbd6a046c304b1845e96fbcc5559cd296b4dfd3ad2509e33c4d9ce07d6a1"}, +] + +[[package]] +name = "packaging" +version = "21.3" +description = "Core utilities for Python packages" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, + {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, +] + +[package.dependencies] +pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" + +[[package]] +name = "pexpect" +version = "4.9.0" +description = "Pexpect allows easy control of interactive console applications." +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "pkginfo" +version = "1.9.6" +description = "Query metadata from sdists / bdists / installed packages." +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pkginfo-1.9.6-py3-none-any.whl", hash = "sha256:4b7a555a6d5a22169fcc9cf7bfd78d296b0361adad412a346c1226849af5e546"}, + {file = "pkginfo-1.9.6.tar.gz", hash = "sha256:8fd5896e8718a4372f0ea9cc9d96f6417c9b986e23a4d116dda26b62cc29d046"}, +] + +[package.extras] +testing = ["pytest", "pytest-cov"] + +[[package]] +name = "platformdirs" +version = "3.11.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.11.0-py3-none-any.whl", hash = "sha256:e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e"}, + {file = "platformdirs-3.11.0.tar.gz", hash = "sha256:cf8ee52a3afdb965072dcc652433e0c7e3e40cf5ea1477cd4b3b1d2eb75495b3"}, +] + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] + +[[package]] +name = "pluggy" +version = "1.3.0" +description = "plugin and hook calling mechanisms for python" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, + {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "poetry" +version = "1.7.1" +description = "Python dependency management and packaging made easy." +category = "dev" +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "poetry-1.7.1-py3-none-any.whl", hash = "sha256:03d3807a0fb3bc1028cc3707dfd646aae629d58e476f7e7f062437680741c561"}, + {file = "poetry-1.7.1.tar.gz", hash = "sha256:b348a70e7d67ad9c0bd3d0ea255bc6df84c24cf4b16f8d104adb30b425d6ff32"}, +] + +[package.dependencies] +build = ">=1.0.3,<2.0.0" +cachecontrol = {version = ">=0.13.0,<0.14.0", extras = ["filecache"]} +cleo = ">=2.1.0,<3.0.0" +crashtest = ">=0.4.1,<0.5.0" +dulwich = ">=0.21.2,<0.22.0" +fastjsonschema = ">=2.18.0,<3.0.0" +installer = ">=0.7.0,<0.8.0" +keyring = ">=24.0.0,<25.0.0" +packaging = ">=20.5" +pexpect = ">=4.7.0,<5.0.0" +pkginfo = ">=1.9.4,<2.0.0" +platformdirs = ">=3.0.0,<4.0.0" +poetry-core = "1.8.1" +poetry-plugin-export = ">=1.6.0,<2.0.0" +pyproject-hooks = ">=1.0.0,<2.0.0" +requests = ">=2.26,<3.0" +requests-toolbelt = ">=0.9.1,<2" +shellingham = ">=1.5,<2.0" +tomlkit = ">=0.11.4,<1.0.0" +trove-classifiers = ">=2022.5.19" +virtualenv = ">=20.23.0,<21.0.0" +xattr = {version = ">=0.10.0,<0.11.0", markers = "sys_platform == \"darwin\""} + +[[package]] +name = "poetry-core" +version = "1.8.1" +description = "Poetry PEP 517 Build Backend" +category = "dev" +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "poetry_core-1.8.1-py3-none-any.whl", hash = "sha256:194832b24f3283e01c5402eae71a6aae850ecdfe53f50a979c76bf7aa5010ffa"}, + {file = "poetry_core-1.8.1.tar.gz", hash = "sha256:67a76c671da2a70e55047cddda83566035b701f7e463b32a2abfeac6e2a16376"}, +] + +[[package]] +name = "poetry-plugin-export" +version = "1.6.0" +description = "Poetry plugin to export the dependencies to various formats" +category = "dev" +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "poetry_plugin_export-1.6.0-py3-none-any.whl", hash = "sha256:2dce6204c9318f1f6509a11a03921fb3f461b201840b59f1c237b6ab454dabcf"}, + {file = "poetry_plugin_export-1.6.0.tar.gz", hash = "sha256:091939434984267a91abf2f916a26b00cff4eee8da63ec2a24ba4b17cf969a59"}, +] + +[package.dependencies] +poetry = ">=1.6.0,<2.0.0" +poetry-core = ">=1.7.0,<2.0.0" + +[[package]] +name = "poetry-types" +version = "0.5.0" +description = "A poetry plugin that adds/removes type stubs as dependencies like the mypy --install-types command." +category = "dev" +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "poetry_types-0.5.0-py3-none-any.whl", hash = "sha256:349cceabae252e17ad9845def4422263c6aa0474545f537e772ea04b38d7b4fb"}, + {file = "poetry_types-0.5.0.tar.gz", hash = "sha256:ac9ecd49eb4dc889f883106038e42749f8c509cd66e33f393226f1cfdf604c23"}, +] + +[package.dependencies] +packaging = ">=21.3,<24.0" +poetry = ">=1.6,<2.0" +tomlkit = ">=0.11.4,<0.12.0" + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pyasn1" +version = "0.5.1" +description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "pyasn1-0.5.1-py2.py3-none-any.whl", hash = "sha256:4439847c58d40b1d0a573d07e3856e95333f1976294494c325775aeca506eb58"}, + {file = "pyasn1-0.5.1.tar.gz", hash = "sha256:6d391a96e59b23130a5cfa74d6fd7f388dbbe26cc8f1edf39fdddf08d9d6676c"}, +] + +[[package]] +name = "pycountry" +version = "22.3.5" +description = "ISO country, subdivision, language, currency and script definitions and their translations" +category = "main" +optional = false +python-versions = ">=3.6, <4" +files = [ + {file = "pycountry-22.3.5.tar.gz", hash = "sha256:b2163a246c585894d808f18783e19137cb70a0c18fb36748dc01fc6f109c1646"}, +] + +[package.dependencies] +setuptools = "*" + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + +[[package]] +name = "pydantic" +version = "2.5.3" +description = "Data validation using Python type hints" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydantic-2.5.3-py3-none-any.whl", hash = "sha256:d0caf5954bee831b6bfe7e338c32b9e30c85dfe080c843680783ac2b631673b4"}, + {file = "pydantic-2.5.3.tar.gz", hash = "sha256:b3ef57c62535b0941697cce638c08900d87fcb67e29cfa99e8a68f747f393f7a"}, +] + +[package.dependencies] +annotated-types = ">=0.4.0" +pydantic-core = "2.14.6" +typing-extensions = ">=4.6.1" + +[package.extras] +email = ["email-validator (>=2.0.0)"] + +[[package]] +name = "pydantic-core" +version = "2.14.6" +description = "" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydantic_core-2.14.6-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:72f9a942d739f09cd42fffe5dc759928217649f070056f03c70df14f5770acf9"}, + {file = "pydantic_core-2.14.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6a31d98c0d69776c2576dda4b77b8e0c69ad08e8b539c25c7d0ca0dc19a50d6c"}, + {file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5aa90562bc079c6c290f0512b21768967f9968e4cfea84ea4ff5af5d917016e4"}, + {file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:370ffecb5316ed23b667d99ce4debe53ea664b99cc37bfa2af47bc769056d534"}, + {file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f85f3843bdb1fe80e8c206fe6eed7a1caeae897e496542cee499c374a85c6e08"}, + {file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9862bf828112e19685b76ca499b379338fd4c5c269d897e218b2ae8fcb80139d"}, + {file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:036137b5ad0cb0004c75b579445a1efccd072387a36c7f217bb8efd1afbe5245"}, + {file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:92879bce89f91f4b2416eba4429c7b5ca22c45ef4a499c39f0c5c69257522c7c"}, + {file = "pydantic_core-2.14.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0c08de15d50fa190d577e8591f0329a643eeaed696d7771760295998aca6bc66"}, + {file = "pydantic_core-2.14.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:36099c69f6b14fc2c49d7996cbf4f87ec4f0e66d1c74aa05228583225a07b590"}, + {file = "pydantic_core-2.14.6-cp310-none-win32.whl", hash = "sha256:7be719e4d2ae6c314f72844ba9d69e38dff342bc360379f7c8537c48e23034b7"}, + {file = "pydantic_core-2.14.6-cp310-none-win_amd64.whl", hash = "sha256:36fa402dcdc8ea7f1b0ddcf0df4254cc6b2e08f8cd80e7010d4c4ae6e86b2a87"}, + {file = "pydantic_core-2.14.6-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:dea7fcd62915fb150cdc373212141a30037e11b761fbced340e9db3379b892d4"}, + {file = "pydantic_core-2.14.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ffff855100bc066ff2cd3aa4a60bc9534661816b110f0243e59503ec2df38421"}, + {file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b027c86c66b8627eb90e57aee1f526df77dc6d8b354ec498be9a757d513b92b"}, + {file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:00b1087dabcee0b0ffd104f9f53d7d3eaddfaa314cdd6726143af6bc713aa27e"}, + {file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:75ec284328b60a4e91010c1acade0c30584f28a1f345bc8f72fe8b9e46ec6a96"}, + {file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e1f4744eea1501404b20b0ac059ff7e3f96a97d3e3f48ce27a139e053bb370b"}, + {file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2602177668f89b38b9f84b7b3435d0a72511ddef45dc14446811759b82235a1"}, + {file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6c8edaea3089bf908dd27da8f5d9e395c5b4dc092dbcce9b65e7156099b4b937"}, + {file = "pydantic_core-2.14.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:478e9e7b360dfec451daafe286998d4a1eeaecf6d69c427b834ae771cad4b622"}, + {file = "pydantic_core-2.14.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b6ca36c12a5120bad343eef193cc0122928c5c7466121da7c20f41160ba00ba2"}, + {file = "pydantic_core-2.14.6-cp311-none-win32.whl", hash = "sha256:2b8719037e570639e6b665a4050add43134d80b687288ba3ade18b22bbb29dd2"}, + {file = "pydantic_core-2.14.6-cp311-none-win_amd64.whl", hash = "sha256:78ee52ecc088c61cce32b2d30a826f929e1708f7b9247dc3b921aec367dc1b23"}, + {file = "pydantic_core-2.14.6-cp311-none-win_arm64.whl", hash = "sha256:a19b794f8fe6569472ff77602437ec4430f9b2b9ec7a1105cfd2232f9ba355e6"}, + {file = "pydantic_core-2.14.6-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:667aa2eac9cd0700af1ddb38b7b1ef246d8cf94c85637cbb03d7757ca4c3fdec"}, + {file = "pydantic_core-2.14.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cdee837710ef6b56ebd20245b83799fce40b265b3b406e51e8ccc5b85b9099b7"}, + {file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c5bcf3414367e29f83fd66f7de64509a8fd2368b1edf4351e862910727d3e51"}, + {file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:26a92ae76f75d1915806b77cf459811e772d8f71fd1e4339c99750f0e7f6324f"}, + {file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a983cca5ed1dd9a35e9e42ebf9f278d344603bfcb174ff99a5815f953925140a"}, + {file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cb92f9061657287eded380d7dc455bbf115430b3aa4741bdc662d02977e7d0af"}, + {file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4ace1e220b078c8e48e82c081e35002038657e4b37d403ce940fa679e57113b"}, + {file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef633add81832f4b56d3b4c9408b43d530dfca29e68fb1b797dcb861a2c734cd"}, + {file = "pydantic_core-2.14.6-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7e90d6cc4aad2cc1f5e16ed56e46cebf4877c62403a311af20459c15da76fd91"}, + {file = "pydantic_core-2.14.6-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e8a5ac97ea521d7bde7621d86c30e86b798cdecd985723c4ed737a2aa9e77d0c"}, + {file = "pydantic_core-2.14.6-cp312-none-win32.whl", hash = "sha256:f27207e8ca3e5e021e2402ba942e5b4c629718e665c81b8b306f3c8b1ddbb786"}, + {file = "pydantic_core-2.14.6-cp312-none-win_amd64.whl", hash = "sha256:b3e5fe4538001bb82e2295b8d2a39356a84694c97cb73a566dc36328b9f83b40"}, + {file = "pydantic_core-2.14.6-cp312-none-win_arm64.whl", hash = "sha256:64634ccf9d671c6be242a664a33c4acf12882670b09b3f163cd00a24cffbd74e"}, + {file = "pydantic_core-2.14.6-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:24368e31be2c88bd69340fbfe741b405302993242ccb476c5c3ff48aeee1afe0"}, + {file = "pydantic_core-2.14.6-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:e33b0834f1cf779aa839975f9d8755a7c2420510c0fa1e9fa0497de77cd35d2c"}, + {file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6af4b3f52cc65f8a0bc8b1cd9676f8c21ef3e9132f21fed250f6958bd7223bed"}, + {file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d15687d7d7f40333bd8266f3814c591c2e2cd263fa2116e314f60d82086e353a"}, + {file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:095b707bb287bfd534044166ab767bec70a9bba3175dcdc3371782175c14e43c"}, + {file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94fc0e6621e07d1e91c44e016cc0b189b48db053061cc22d6298a611de8071bb"}, + {file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ce830e480f6774608dedfd4a90c42aac4a7af0a711f1b52f807130c2e434c06"}, + {file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a306cdd2ad3a7d795d8e617a58c3a2ed0f76c8496fb7621b6cd514eb1532cae8"}, + {file = "pydantic_core-2.14.6-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:2f5fa187bde8524b1e37ba894db13aadd64faa884657473b03a019f625cee9a8"}, + {file = "pydantic_core-2.14.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:438027a975cc213a47c5d70672e0d29776082155cfae540c4e225716586be75e"}, + {file = "pydantic_core-2.14.6-cp37-none-win32.whl", hash = "sha256:f96ae96a060a8072ceff4cfde89d261837b4294a4f28b84a28765470d502ccc6"}, + {file = "pydantic_core-2.14.6-cp37-none-win_amd64.whl", hash = "sha256:e646c0e282e960345314f42f2cea5e0b5f56938c093541ea6dbf11aec2862391"}, + {file = "pydantic_core-2.14.6-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:db453f2da3f59a348f514cfbfeb042393b68720787bbef2b4c6068ea362c8149"}, + {file = "pydantic_core-2.14.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3860c62057acd95cc84044e758e47b18dcd8871a328ebc8ccdefd18b0d26a21b"}, + {file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36026d8f99c58d7044413e1b819a67ca0e0b8ebe0f25e775e6c3d1fabb3c38fb"}, + {file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8ed1af8692bd8d2a29d702f1a2e6065416d76897d726e45a1775b1444f5928a7"}, + {file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:314ccc4264ce7d854941231cf71b592e30d8d368a71e50197c905874feacc8a8"}, + {file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:982487f8931067a32e72d40ab6b47b1628a9c5d344be7f1a4e668fb462d2da42"}, + {file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dbe357bc4ddda078f79d2a36fc1dd0494a7f2fad83a0a684465b6f24b46fe80"}, + {file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2f6ffc6701a0eb28648c845f4945a194dc7ab3c651f535b81793251e1185ac3d"}, + {file = "pydantic_core-2.14.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7f5025db12fc6de7bc1104d826d5aee1d172f9ba6ca936bf6474c2148ac336c1"}, + {file = "pydantic_core-2.14.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dab03ed811ed1c71d700ed08bde8431cf429bbe59e423394f0f4055f1ca0ea60"}, + {file = "pydantic_core-2.14.6-cp38-none-win32.whl", hash = "sha256:dfcbebdb3c4b6f739a91769aea5ed615023f3c88cb70df812849aef634c25fbe"}, + {file = "pydantic_core-2.14.6-cp38-none-win_amd64.whl", hash = "sha256:99b14dbea2fdb563d8b5a57c9badfcd72083f6006caf8e126b491519c7d64ca8"}, + {file = "pydantic_core-2.14.6-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:4ce8299b481bcb68e5c82002b96e411796b844d72b3e92a3fbedfe8e19813eab"}, + {file = "pydantic_core-2.14.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b9a9d92f10772d2a181b5ca339dee066ab7d1c9a34ae2421b2a52556e719756f"}, + {file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd9e98b408384989ea4ab60206b8e100d8687da18b5c813c11e92fd8212a98e0"}, + {file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4f86f1f318e56f5cbb282fe61eb84767aee743ebe32c7c0834690ebea50c0a6b"}, + {file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86ce5fcfc3accf3a07a729779d0b86c5d0309a4764c897d86c11089be61da160"}, + {file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dcf1978be02153c6a31692d4fbcc2a3f1db9da36039ead23173bc256ee3b91b"}, + {file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eedf97be7bc3dbc8addcef4142f4b4164066df0c6f36397ae4aaed3eb187d8ab"}, + {file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d5f916acf8afbcab6bacbb376ba7dc61f845367901ecd5e328fc4d4aef2fcab0"}, + {file = "pydantic_core-2.14.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8a14c192c1d724c3acbfb3f10a958c55a2638391319ce8078cb36c02283959b9"}, + {file = "pydantic_core-2.14.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0348b1dc6b76041516e8a854ff95b21c55f5a411c3297d2ca52f5528e49d8411"}, + {file = "pydantic_core-2.14.6-cp39-none-win32.whl", hash = "sha256:de2a0645a923ba57c5527497daf8ec5df69c6eadf869e9cd46e86349146e5975"}, + {file = "pydantic_core-2.14.6-cp39-none-win_amd64.whl", hash = "sha256:aca48506a9c20f68ee61c87f2008f81f8ee99f8d7f0104bff3c47e2d148f89d9"}, + {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:d5c28525c19f5bb1e09511669bb57353d22b94cf8b65f3a8d141c389a55dec95"}, + {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:78d0768ee59baa3de0f4adac9e3748b4b1fffc52143caebddfd5ea2961595277"}, + {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b93785eadaef932e4fe9c6e12ba67beb1b3f1e5495631419c784ab87e975670"}, + {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a874f21f87c485310944b2b2734cd6d318765bcbb7515eead33af9641816506e"}, + {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b89f4477d915ea43b4ceea6756f63f0288941b6443a2b28c69004fe07fde0d0d"}, + {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:172de779e2a153d36ee690dbc49c6db568d7b33b18dc56b69a7514aecbcf380d"}, + {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:dfcebb950aa7e667ec226a442722134539e77c575f6cfaa423f24371bb8d2e94"}, + {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:55a23dcd98c858c0db44fc5c04fc7ed81c4b4d33c653a7c45ddaebf6563a2f66"}, + {file = "pydantic_core-2.14.6-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:4241204e4b36ab5ae466ecec5c4c16527a054c69f99bba20f6f75232a6a534e2"}, + {file = "pydantic_core-2.14.6-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e574de99d735b3fc8364cba9912c2bec2da78775eba95cbb225ef7dda6acea24"}, + {file = "pydantic_core-2.14.6-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1302a54f87b5cd8528e4d6d1bf2133b6aa7c6122ff8e9dc5220fbc1e07bffebd"}, + {file = "pydantic_core-2.14.6-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f8e81e4b55930e5ffab4a68db1af431629cf2e4066dbdbfef65348b8ab804ea8"}, + {file = "pydantic_core-2.14.6-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c99462ffc538717b3e60151dfaf91125f637e801f5ab008f81c402f1dff0cd0f"}, + {file = "pydantic_core-2.14.6-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e4cf2d5829f6963a5483ec01578ee76d329eb5caf330ecd05b3edd697e7d768a"}, + {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:cf10b7d58ae4a1f07fccbf4a0a956d705356fea05fb4c70608bb6fa81d103cda"}, + {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:399ac0891c284fa8eb998bcfa323f2234858f5d2efca3950ae58c8f88830f145"}, + {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c6a5c79b28003543db3ba67d1df336f253a87d3112dac3a51b94f7d48e4c0e1"}, + {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:599c87d79cab2a6a2a9df4aefe0455e61e7d2aeede2f8577c1b7c0aec643ee8e"}, + {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43e166ad47ba900f2542a80d83f9fc65fe99eb63ceec4debec160ae729824052"}, + {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3a0b5db001b98e1c649dd55afa928e75aa4087e587b9524a4992316fa23c9fba"}, + {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:747265448cb57a9f37572a488a57d873fd96bf51e5bb7edb52cfb37124516da4"}, + {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7ebe3416785f65c28f4f9441e916bfc8a54179c8dea73c23023f7086fa601c5d"}, + {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:86c963186ca5e50d5c8287b1d1c9d3f8f024cbe343d048c5bd282aec2d8641f2"}, + {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:e0641b506486f0b4cd1500a2a65740243e8670a2549bb02bc4556a83af84ae03"}, + {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71d72ca5eaaa8d38c8df16b7deb1a2da4f650c41b58bb142f3fb75d5ad4a611f"}, + {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27e524624eace5c59af499cd97dc18bb201dc6a7a2da24bfc66ef151c69a5f2a"}, + {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a3dde6cac75e0b0902778978d3b1646ca9f438654395a362cb21d9ad34b24acf"}, + {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:00646784f6cd993b1e1c0e7b0fdcbccc375d539db95555477771c27555e3c556"}, + {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:23598acb8ccaa3d1d875ef3b35cb6376535095e9405d91a3d57a8c7db5d29341"}, + {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7f41533d7e3cf9520065f610b41ac1c76bc2161415955fbcead4981b22c7611e"}, + {file = "pydantic_core-2.14.6.tar.gz", hash = "sha256:1fd0c1d395372843fba13a51c28e3bb9d59bd7aebfeb17358ffaaa1e4dbbe948"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + +[[package]] +name = "pydantic-settings" +version = "2.1.0" +description = "Settings management using Pydantic" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_settings-2.1.0-py3-none-any.whl", hash = "sha256:7621c0cb5d90d1140d2f0ef557bdf03573aac7035948109adf2574770b77605a"}, + {file = "pydantic_settings-2.1.0.tar.gz", hash = "sha256:26b1492e0a24755626ac5e6d715e9077ab7ad4fb5f19a8b7ed7011d52f36141c"}, +] + +[package.dependencies] +pydantic = ">=2.3.0" +python-dotenv = ">=0.21.0" + +[[package]] +name = "pyparsing" +version = "3.1.1" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +category = "main" +optional = false +python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, + {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "pyproject-hooks" +version = "1.0.0" +description = "Wrappers to call pyproject.toml-based build backend hooks." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyproject_hooks-1.0.0-py3-none-any.whl", hash = "sha256:283c11acd6b928d2f6a7c73fa0d01cb2bdc5f07c57a2eeb6e83d5e56b97976f8"}, + {file = "pyproject_hooks-1.0.0.tar.gz", hash = "sha256:f271b298b97f5955d53fb12b72c1fb1948c22c1a6b70b315c54cedaca0264ef5"}, +] + +[[package]] +name = "pytest" +version = "7.4.4" +description = "pytest: simple powerful testing with Python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, + {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-asyncio" +version = "0.23.2" +description = "Pytest support for asyncio" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest-asyncio-0.23.2.tar.gz", hash = "sha256:c16052382554c7b22d48782ab3438d5b10f8cf7a4bdcae7f0f67f097d95beecc"}, + {file = "pytest_asyncio-0.23.2-py3-none-any.whl", hash = "sha256:ea9021364e32d58f0be43b91c6233fb8d2224ccef2398d6837559e587682808f"}, +] + +[package.dependencies] +pytest = ">=7.0.0" + +[package.extras] +docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] +testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"] + +[[package]] +name = "pytest-cov" +version = "4.1.0" +description = "Pytest plugin for measuring coverage." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, + {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, +] + +[package.dependencies] +coverage = {version = ">=5.2.1", extras = ["toml"]} +pytest = ">=4.6" + +[package.extras] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] + +[[package]] +name = "pytest-env" +version = "1.1.3" +description = "pytest plugin that allows you to add environment variables." +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest_env-1.1.3-py3-none-any.whl", hash = "sha256:aada77e6d09fcfb04540a6e462c58533c37df35fa853da78707b17ec04d17dfc"}, + {file = "pytest_env-1.1.3.tar.gz", hash = "sha256:fcd7dc23bb71efd3d35632bde1bbe5ee8c8dc4489d6617fb010674880d96216b"}, +] + +[package.dependencies] +pytest = ">=7.4.3" + +[package.extras] +test = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "pytest-mock (>=3.12)"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +category = "main" +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" +category = "main" +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 = "python-jose" +version = "3.3.0" +description = "JOSE implementation in Python" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "python-jose-3.3.0.tar.gz", hash = "sha256:55779b5e6ad599c6336191246e95eb2293a9ddebd555f796a65f838f07e5d78a"}, + {file = "python_jose-3.3.0-py2.py3-none-any.whl", hash = "sha256:9b1376b023f8b298536eedd47ae1089bcdb848f1535ab30555cd92002d78923a"}, +] + +[package.dependencies] +cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"cryptography\""} +ecdsa = "!=0.15" +pyasn1 = "*" +rsa = "*" + +[package.extras] +cryptography = ["cryptography (>=3.4.0)"] +pycrypto = ["pyasn1", "pycrypto (>=2.6.0,<2.7.0)"] +pycryptodome = ["pyasn1", "pycryptodome (>=3.3.1,<4.0.0)"] + +[[package]] +name = "pywin32-ctypes" +version = "0.2.2" +description = "A (partial) reimplementation of pywin32 using ctypes/cffi" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pywin32-ctypes-0.2.2.tar.gz", hash = "sha256:3426e063bdd5fd4df74a14fa3cf80a0b42845a87e1d1e81f6549f9daec593a60"}, + {file = "pywin32_ctypes-0.2.2-py3-none-any.whl", hash = "sha256:bf490a1a709baf35d688fe0ecf980ed4de11d2b3e37b51e5442587a75d9957e7"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.1" +description = "YAML parser and emitter for Python" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] + +[[package]] +name = "rapidfuzz" +version = "3.6.1" +description = "rapid fuzzy string matching" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "rapidfuzz-3.6.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ac434fc71edda30d45db4a92ba5e7a42c7405e1a54cb4ec01d03cc668c6dcd40"}, + {file = "rapidfuzz-3.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2a791168e119cfddf4b5a40470620c872812042f0621e6a293983a2d52372db0"}, + {file = "rapidfuzz-3.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5a2f3e9df346145c2be94e4d9eeffb82fab0cbfee85bd4a06810e834fe7c03fa"}, + {file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23de71e7f05518b0bbeef55d67b5dbce3bcd3e2c81e7e533051a2e9401354eb0"}, + {file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d056e342989248d2bdd67f1955bb7c3b0ecfa239d8f67a8dfe6477b30872c607"}, + {file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01835d02acd5d95c1071e1da1bb27fe213c84a013b899aba96380ca9962364bc"}, + {file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed0f712e0bb5fea327e92aec8a937afd07ba8de4c529735d82e4c4124c10d5a0"}, + {file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96cd19934f76a1264e8ecfed9d9f5291fde04ecb667faef5f33bdbfd95fe2d1f"}, + {file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e06c4242a1354cf9d48ee01f6f4e6e19c511d50bb1e8d7d20bcadbb83a2aea90"}, + {file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:d73dcfe789d37c6c8b108bf1e203e027714a239e50ad55572ced3c004424ed3b"}, + {file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:06e98ff000e2619e7cfe552d086815671ed09b6899408c2c1b5103658261f6f3"}, + {file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:08b6fb47dd889c69fbc0b915d782aaed43e025df6979b6b7f92084ba55edd526"}, + {file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a1788ebb5f5b655a15777e654ea433d198f593230277e74d51a2a1e29a986283"}, + {file = "rapidfuzz-3.6.1-cp310-cp310-win32.whl", hash = "sha256:c65f92881753aa1098c77818e2b04a95048f30edbe9c3094dc3707d67df4598b"}, + {file = "rapidfuzz-3.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:4243a9c35667a349788461aae6471efde8d8800175b7db5148a6ab929628047f"}, + {file = "rapidfuzz-3.6.1-cp310-cp310-win_arm64.whl", hash = "sha256:f59d19078cc332dbdf3b7b210852ba1f5db8c0a2cd8cc4c0ed84cc00c76e6802"}, + {file = "rapidfuzz-3.6.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fbc07e2e4ac696497c5f66ec35c21ddab3fc7a406640bffed64c26ab2f7ce6d6"}, + {file = "rapidfuzz-3.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:40cced1a8852652813f30fb5d4b8f9b237112a0bbaeebb0f4cc3611502556764"}, + {file = "rapidfuzz-3.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:82300e5f8945d601c2daaaac139d5524d7c1fdf719aa799a9439927739917460"}, + {file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edf97c321fd641fea2793abce0e48fa4f91f3c202092672f8b5b4e781960b891"}, + {file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7420e801b00dee4a344ae2ee10e837d603461eb180e41d063699fb7efe08faf0"}, + {file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:060bd7277dc794279fa95522af355034a29c90b42adcb7aa1da358fc839cdb11"}, + {file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7e3375e4f2bfec77f907680328e4cd16cc64e137c84b1886d547ab340ba6928"}, + {file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a490cd645ef9d8524090551016f05f052e416c8adb2d8b85d35c9baa9d0428ab"}, + {file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2e03038bfa66d2d7cffa05d81c2f18fd6acbb25e7e3c068d52bb7469e07ff382"}, + {file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:2b19795b26b979c845dba407fe79d66975d520947b74a8ab6cee1d22686f7967"}, + {file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:064c1d66c40b3a0f488db1f319a6e75616b2e5fe5430a59f93a9a5e40a656d15"}, + {file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3c772d04fb0ebeece3109d91f6122b1503023086a9591a0b63d6ee7326bd73d9"}, + {file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:841eafba6913c4dfd53045835545ba01a41e9644e60920c65b89c8f7e60c00a9"}, + {file = "rapidfuzz-3.6.1-cp311-cp311-win32.whl", hash = "sha256:266dd630f12696ea7119f31d8b8e4959ef45ee2cbedae54417d71ae6f47b9848"}, + {file = "rapidfuzz-3.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:d79aec8aeee02ab55d0ddb33cea3ecd7b69813a48e423c966a26d7aab025cdfe"}, + {file = "rapidfuzz-3.6.1-cp311-cp311-win_arm64.whl", hash = "sha256:484759b5dbc5559e76fefaa9170147d1254468f555fd9649aea3bad46162a88b"}, + {file = "rapidfuzz-3.6.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b2ef4c0fd3256e357b70591ffb9e8ed1d439fb1f481ba03016e751a55261d7c1"}, + {file = "rapidfuzz-3.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:588c4b20fa2fae79d60a4e438cf7133d6773915df3cc0a7f1351da19eb90f720"}, + {file = "rapidfuzz-3.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7142ee354e9c06e29a2636b9bbcb592bb00600a88f02aa5e70e4f230347b373e"}, + {file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1dfc557c0454ad22382373ec1b7df530b4bbd974335efe97a04caec936f2956a"}, + {file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:03f73b381bdeccb331a12c3c60f1e41943931461cdb52987f2ecf46bfc22f50d"}, + {file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b0ccc2ec1781c7e5370d96aef0573dd1f97335343e4982bdb3a44c133e27786"}, + {file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da3e8c9f7e64bb17faefda085ff6862ecb3ad8b79b0f618a6cf4452028aa2222"}, + {file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fde9b14302a31af7bdafbf5cfbb100201ba21519be2b9dedcf4f1048e4fbe65d"}, + {file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c1a23eee225dfb21c07f25c9fcf23eb055d0056b48e740fe241cbb4b22284379"}, + {file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e49b9575d16c56c696bc7b06a06bf0c3d4ef01e89137b3ddd4e2ce709af9fe06"}, + {file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:0a9fc714b8c290261669f22808913aad49553b686115ad0ee999d1cb3df0cd66"}, + {file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:a3ee4f8f076aa92184e80308fc1a079ac356b99c39408fa422bbd00145be9854"}, + {file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f056ba42fd2f32e06b2c2ba2443594873cfccc0c90c8b6327904fc2ddf6d5799"}, + {file = "rapidfuzz-3.6.1-cp312-cp312-win32.whl", hash = "sha256:5d82b9651e3d34b23e4e8e201ecd3477c2baa17b638979deeabbb585bcb8ba74"}, + {file = "rapidfuzz-3.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:dad55a514868dae4543ca48c4e1fc0fac704ead038dafedf8f1fc0cc263746c1"}, + {file = "rapidfuzz-3.6.1-cp312-cp312-win_arm64.whl", hash = "sha256:3c84294f4470fcabd7830795d754d808133329e0a81d62fcc2e65886164be83b"}, + {file = "rapidfuzz-3.6.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e19d519386e9db4a5335a4b29f25b8183a1c3f78cecb4c9c3112e7f86470e37f"}, + {file = "rapidfuzz-3.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:01eb03cd880a294d1bf1a583fdd00b87169b9cc9c9f52587411506658c864d73"}, + {file = "rapidfuzz-3.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:be368573255f8fbb0125a78330a1a40c65e9ba3c5ad129a426ff4289099bfb41"}, + {file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3e5af946f419c30f5cb98b69d40997fe8580efe78fc83c2f0f25b60d0e56efb"}, + {file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f382f7ffe384ce34345e1c0b2065451267d3453cadde78946fbd99a59f0cc23c"}, + {file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be156f51f3a4f369e758505ed4ae64ea88900dcb2f89d5aabb5752676d3f3d7e"}, + {file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1936d134b6c513fbe934aeb668b0fee1ffd4729a3c9d8d373f3e404fbb0ce8a0"}, + {file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12ff8eaf4a9399eb2bebd838f16e2d1ded0955230283b07376d68947bbc2d33d"}, + {file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ae598a172e3a95df3383634589660d6b170cc1336fe7578115c584a99e0ba64d"}, + {file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cd4ba4c18b149da11e7f1b3584813159f189dc20833709de5f3df8b1342a9759"}, + {file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:0402f1629e91a4b2e4aee68043a30191e5e1b7cd2aa8dacf50b1a1bcf6b7d3ab"}, + {file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:1e12319c6b304cd4c32d5db00b7a1e36bdc66179c44c5707f6faa5a889a317c0"}, + {file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0bbfae35ce4de4c574b386c43c78a0be176eeddfdae148cb2136f4605bebab89"}, + {file = "rapidfuzz-3.6.1-cp38-cp38-win32.whl", hash = "sha256:7fec74c234d3097612ea80f2a80c60720eec34947066d33d34dc07a3092e8105"}, + {file = "rapidfuzz-3.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:a553cc1a80d97459d587529cc43a4c7c5ecf835f572b671107692fe9eddf3e24"}, + {file = "rapidfuzz-3.6.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:757dfd7392ec6346bd004f8826afb3bf01d18a723c97cbe9958c733ab1a51791"}, + {file = "rapidfuzz-3.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2963f4a3f763870a16ee076796be31a4a0958fbae133dbc43fc55c3968564cf5"}, + {file = "rapidfuzz-3.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d2f0274595cc5b2b929c80d4e71b35041104b577e118cf789b3fe0a77b37a4c5"}, + {file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f211e366e026de110a4246801d43a907cd1a10948082f47e8a4e6da76fef52"}, + {file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a59472b43879012b90989603aa5a6937a869a72723b1bf2ff1a0d1edee2cc8e6"}, + {file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a03863714fa6936f90caa7b4b50ea59ea32bb498cc91f74dc25485b3f8fccfe9"}, + {file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dd95b6b7bfb1584f806db89e1e0c8dbb9d25a30a4683880c195cc7f197eaf0c"}, + {file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7183157edf0c982c0b8592686535c8b3e107f13904b36d85219c77be5cefd0d8"}, + {file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ad9d74ef7c619b5b0577e909582a1928d93e07d271af18ba43e428dc3512c2a1"}, + {file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b53137d81e770c82189e07a8f32722d9e4260f13a0aec9914029206ead38cac3"}, + {file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:49b9ed2472394d306d5dc967a7de48b0aab599016aa4477127b20c2ed982dbf9"}, + {file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:dec307b57ec2d5054d77d03ee4f654afcd2c18aee00c48014cb70bfed79597d6"}, + {file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4381023fa1ff32fd5076f5d8321249a9aa62128eb3f21d7ee6a55373e672b261"}, + {file = "rapidfuzz-3.6.1-cp39-cp39-win32.whl", hash = "sha256:8d7a072f10ee57c8413c8ab9593086d42aaff6ee65df4aa6663eecdb7c398dca"}, + {file = "rapidfuzz-3.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:ebcfb5bfd0a733514352cfc94224faad8791e576a80ffe2fd40b2177bf0e7198"}, + {file = "rapidfuzz-3.6.1-cp39-cp39-win_arm64.whl", hash = "sha256:1c47d592e447738744905c18dda47ed155620204714e6df20eb1941bb1ba315e"}, + {file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:eef8b346ab331bec12bbc83ac75641249e6167fab3d84d8f5ca37fd8e6c7a08c"}, + {file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53251e256017e2b87f7000aee0353ba42392c442ae0bafd0f6b948593d3f68c6"}, + {file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6dede83a6b903e3ebcd7e8137e7ff46907ce9316e9d7e7f917d7e7cdc570ee05"}, + {file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e4da90e4c2b444d0a171d7444ea10152e07e95972bb40b834a13bdd6de1110c"}, + {file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:ca3dfcf74f2b6962f411c33dd95b0adf3901266e770da6281bc96bb5a8b20de9"}, + {file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bcc957c0a8bde8007f1a8a413a632a1a409890f31f73fe764ef4eac55f59ca87"}, + {file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:692c9a50bea7a8537442834f9bc6b7d29d8729a5b6379df17c31b6ab4df948c2"}, + {file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c23ceaea27e790ddd35ef88b84cf9d721806ca366199a76fd47cfc0457a81b"}, + {file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b155e67fff215c09f130555002e42f7517d0ea72cbd58050abb83cb7c880cec"}, + {file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3028ee8ecc48250607fa8a0adce37b56275ec3b1acaccd84aee1f68487c8557b"}, + {file = "rapidfuzz-3.6.1.tar.gz", hash = "sha256:35660bee3ce1204872574fa041c7ad7ec5175b3053a4cb6e181463fc07013de7"}, +] + +[package.extras] +full = ["numpy"] + +[[package]] +name = "redis" +version = "5.0.1" +description = "Python client for Redis database and key-value store" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "redis-5.0.1-py3-none-any.whl", hash = "sha256:ed4802971884ae19d640775ba3b03aa2e7bd5e8fb8dfaed2decce4d0fc48391f"}, + {file = "redis-5.0.1.tar.gz", hash = "sha256:0dab495cd5753069d3bc650a0dde8a8f9edde16fc5691b689a566eda58100d0f"}, +] + +[package.extras] +hiredis = ["hiredis (>=1.0.0)"] +ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +category = "dev" +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 = "requests-toolbelt" +version = "1.0.0" +description = "A utility belt for advanced users of python-requests" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, + {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, +] + +[package.dependencies] +requests = ">=2.0.1,<3.0.0" + +[[package]] +name = "rsa" +version = "4.9" +description = "Pure-Python RSA implementation" +category = "main" +optional = false +python-versions = ">=3.6,<4" +files = [ + {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, + {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, +] + +[package.dependencies] +pyasn1 = ">=0.1.3" + +[[package]] +name = "secretstorage" +version = "3.3.3" +description = "Python bindings to FreeDesktop.org Secret Service API" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, + {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, +] + +[package.dependencies] +cryptography = ">=2.0" +jeepney = ">=0.6" + +[[package]] +name = "setuptools" +version = "69.0.3" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-69.0.3-py3-none-any.whl", hash = "sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05"}, + {file = "setuptools-69.0.3.tar.gz", hash = "sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "shellingham" +version = "1.5.4" +description = "Tool to Detect Surrounding Shell" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, + {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, +] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +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" +category = "main" +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 = "sqlalchemy" +version = "2.0.24" +description = "Database Abstraction Library" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "SQLAlchemy-2.0.24-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5f801d85ba4753d4ed97181d003e5d3fa330ac7c4587d131f61d7f968f416862"}, + {file = "SQLAlchemy-2.0.24-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b35c35e3923ade1e7ac44e150dec29f5863513246c8bf85e2d7d313e3832bcfb"}, + {file = "SQLAlchemy-2.0.24-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d9b3fd5eca3c0b137a5e0e468e24ca544ed8ca4783e0e55341b7ed2807518ee"}, + {file = "SQLAlchemy-2.0.24-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a6209e689d0ff206c40032b6418e3cfcfc5af044b3f66e381d7f1ae301544b4"}, + {file = "SQLAlchemy-2.0.24-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:37e89d965b52e8b20571b5d44f26e2124b26ab63758bf1b7598a0e38fb2c4005"}, + {file = "SQLAlchemy-2.0.24-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c6910eb4ea90c0889f363965cd3c8c45a620ad27b526a7899f0054f6c1b9219e"}, + {file = "SQLAlchemy-2.0.24-cp310-cp310-win32.whl", hash = "sha256:d8e7e8a150e7b548e7ecd6ebb9211c37265991bf2504297d9454e01b58530fc6"}, + {file = "SQLAlchemy-2.0.24-cp310-cp310-win_amd64.whl", hash = "sha256:396f05c552f7fa30a129497c41bef5b4d1423f9af8fe4df0c3dcd38f3e3b9a14"}, + {file = "SQLAlchemy-2.0.24-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:adbd67dac4ebf54587198b63cd30c29fd7eafa8c0cab58893d9419414f8efe4b"}, + {file = "SQLAlchemy-2.0.24-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a0f611b431b84f55779cbb7157257d87b4a2876b067c77c4f36b15e44ced65e2"}, + {file = "SQLAlchemy-2.0.24-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56a0e90a959e18ac5f18c80d0cad9e90cb09322764f536e8a637426afb1cae2f"}, + {file = "SQLAlchemy-2.0.24-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6db686a1d9f183c639f7e06a2656af25d4ed438eda581de135d15569f16ace33"}, + {file = "SQLAlchemy-2.0.24-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f0cc0b486a56dff72dddae6b6bfa7ff201b0eeac29d4bc6f0e9725dc3c360d71"}, + {file = "SQLAlchemy-2.0.24-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4a1d4856861ba9e73bac05030cec5852eabfa9ef4af8e56c19d92de80d46fc34"}, + {file = "SQLAlchemy-2.0.24-cp311-cp311-win32.whl", hash = "sha256:a3c2753bf4f48b7a6024e5e8a394af49b1b12c817d75d06942cae03d14ff87b3"}, + {file = "SQLAlchemy-2.0.24-cp311-cp311-win_amd64.whl", hash = "sha256:38732884eabc64982a09a846bacf085596ff2371e4e41d20c0734f7e50525d01"}, + {file = "SQLAlchemy-2.0.24-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9f992e0f916201731993eab8502912878f02287d9f765ef843677ff118d0e0b1"}, + {file = "SQLAlchemy-2.0.24-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2587e108463cc2e5b45a896b2e7cc8659a517038026922a758bde009271aed11"}, + {file = "SQLAlchemy-2.0.24-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bb7cedcddffca98c40bb0becd3423e293d1fef442b869da40843d751785beb3"}, + {file = "SQLAlchemy-2.0.24-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83fa6df0e035689df89ff77a46bf8738696785d3156c2c61494acdcddc75c69d"}, + {file = "SQLAlchemy-2.0.24-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:cc889fda484d54d0b31feec409406267616536d048a450fc46943e152700bb79"}, + {file = "SQLAlchemy-2.0.24-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:57ef6f2cb8b09a042d0dbeaa46a30f2df5dd1e1eb889ba258b0d5d7d6011b81c"}, + {file = "SQLAlchemy-2.0.24-cp312-cp312-win32.whl", hash = "sha256:ea490564435b5b204d8154f0e18387b499ea3cedc1e6af3b3a2ab18291d85aa7"}, + {file = "SQLAlchemy-2.0.24-cp312-cp312-win_amd64.whl", hash = "sha256:ccfd336f96d4c9bbab0309f2a565bf15c468c2d8b2d277a32f89c5940f71fcf9"}, + {file = "SQLAlchemy-2.0.24-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9aaaaa846b10dfbe1bda71079d0e31a7e2cebedda9409fa7dba3dfed1ae803e8"}, + {file = "SQLAlchemy-2.0.24-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95bae3d38f8808d79072da25d5e5a6095f36fe1f9d6c614dd72c59ca8397c7c0"}, + {file = "SQLAlchemy-2.0.24-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a04191a7c8d77e63f6fc1e8336d6c6e93176c0c010833e74410e647f0284f5a1"}, + {file = "SQLAlchemy-2.0.24-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:acc58b7c2e40235712d857fdfc8f2bda9608f4a850d8d9ac0dd1fc80939ca6ac"}, + {file = "SQLAlchemy-2.0.24-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:00d76fe5d7cdb5d84d625ce002ce29fefba0bfd98e212ae66793fed30af73931"}, + {file = "SQLAlchemy-2.0.24-cp37-cp37m-win32.whl", hash = "sha256:29e51f848f843bbd75d74ae64ab1ab06302cb1dccd4549d1f5afe6b4a946edb2"}, + {file = "SQLAlchemy-2.0.24-cp37-cp37m-win_amd64.whl", hash = "sha256:e9d036e343a604db3f5a6c33354018a84a1d3f6dcae3673358b404286204798c"}, + {file = "SQLAlchemy-2.0.24-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9bafaa05b19dc07fa191c1966c5e852af516840b0d7b46b7c3303faf1a349bc9"}, + {file = "SQLAlchemy-2.0.24-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e69290b921b7833c04206f233d6814c60bee1d135b09f5ae5d39229de9b46cd4"}, + {file = "SQLAlchemy-2.0.24-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8398593ccc4440ce6dffcc4f47d9b2d72b9fe7112ac12ea4a44e7d4de364db1"}, + {file = "SQLAlchemy-2.0.24-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f073321a79c81e1a009218a21089f61d87ee5fa3c9563f6be94f8b41ff181812"}, + {file = "SQLAlchemy-2.0.24-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9036ebfd934813990c5b9f71f297e77ed4963720db7d7ceec5a3fdb7cd2ef6ce"}, + {file = "SQLAlchemy-2.0.24-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fcf84fe93397a0f67733aa2a38ed4eab9fc6348189fc950e656e1ea198f45668"}, + {file = "SQLAlchemy-2.0.24-cp38-cp38-win32.whl", hash = "sha256:6f5e75de91c754365c098ac08c13fdb267577ce954fa239dd49228b573ca88d7"}, + {file = "SQLAlchemy-2.0.24-cp38-cp38-win_amd64.whl", hash = "sha256:9f29c7f0f4b42337ec5a779e166946a9f86d7d56d827e771b69ecbdf426124ac"}, + {file = "SQLAlchemy-2.0.24-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:07cc423892f2ceda9ae1daa28c0355757f362ecc7505b1ab1a3d5d8dc1c44ac6"}, + {file = "SQLAlchemy-2.0.24-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2a479aa1ab199178ff1956b09ca8a0693e70f9c762875d69292d37049ffd0d8f"}, + {file = "SQLAlchemy-2.0.24-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b8d0e8578e7f853f45f4512b5c920f6a546cd4bed44137460b2a56534644205"}, + {file = "SQLAlchemy-2.0.24-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17e7e27af178d31b436dda6a596703b02a89ba74a15e2980c35ecd9909eea3a"}, + {file = "SQLAlchemy-2.0.24-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1ca7903d5e7db791a355b579c690684fac6304478b68efdc7f2ebdcfe770d8d7"}, + {file = "SQLAlchemy-2.0.24-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db09e424d7bb89b6215a184ca93b4f29d7f00ea261b787918a1af74143b98c06"}, + {file = "SQLAlchemy-2.0.24-cp39-cp39-win32.whl", hash = "sha256:a5cd7d30e47f87b21362beeb3e86f1b5886e7d9b0294b230dde3d3f4a1591375"}, + {file = "SQLAlchemy-2.0.24-cp39-cp39-win_amd64.whl", hash = "sha256:7ae5d44517fe81079ce75cf10f96978284a6db2642c5932a69c82dbae09f009a"}, + {file = "SQLAlchemy-2.0.24-py3-none-any.whl", hash = "sha256:8f358f5cfce04417b6ff738748ca4806fe3d3ae8040fb4e6a0c9a6973ccf9b6e"}, + {file = "SQLAlchemy-2.0.24.tar.gz", hash = "sha256:6db97656fd3fe3f7e5b077f12fa6adb5feb6e0b567a3e99f47ecf5f7ea0a09e3"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} +typing-extensions = ">=4.2.0" + +[package.extras] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] +aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] +asyncio = ["greenlet (!=0.4.17)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] +mssql = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)"] +mysql = ["mysqlclient (>=1.4.0)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx_oracle (>=8)"] +oracle-oracledb = ["oracledb (>=1.0.1)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.29.1)"] +postgresql-psycopg = ["psycopg (>=3.0.7)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] +pymysql = ["pymysql"] +sqlcipher = ["sqlcipher3_binary"] + +[[package]] +name = "starlette" +version = "0.32.0.post1" +description = "The little ASGI library that shines." +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "starlette-0.32.0.post1-py3-none-any.whl", hash = "sha256:cd0cb10ddb49313f609cedfac62c8c12e56c7314b66d89bb077ba228bada1b09"}, + {file = "starlette-0.32.0.post1.tar.gz", hash = "sha256:e54e2b7e2fb06dff9eac40133583f10dfa05913f5a85bf26f427c7a40a9a3d02"}, +] + +[package.dependencies] +anyio = ">=3.4.0,<5" + +[package.extras] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] + +[[package]] +name = "tomlkit" +version = "0.11.8" +description = "Style preserving TOML library" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomlkit-0.11.8-py3-none-any.whl", hash = "sha256:8c726c4c202bdb148667835f68d68780b9a003a9ec34167b6c673b38eff2a171"}, + {file = "tomlkit-0.11.8.tar.gz", hash = "sha256:9330fc7faa1db67b541b28e62018c17d20be733177d290a13b24c62d1614e0c3"}, +] + +[[package]] +name = "trove-classifiers" +version = "2023.11.29" +description = "Canonical source for classifiers on PyPI (pypi.org)." +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "trove-classifiers-2023.11.29.tar.gz", hash = "sha256:ff8f7fd82c7932113b46e7ef6742c70091cc63640c8c65db00d91f2e940b9514"}, + {file = "trove_classifiers-2023.11.29-py3-none-any.whl", hash = "sha256:02307750cbbac2b3d13078662f8a5bf077732bf506e9c33c97204b7f68f3699e"}, +] + +[[package]] +name = "types-pyopenssl" +version = "23.3.0.0" +description = "Typing stubs for pyOpenSSL" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "types-pyOpenSSL-23.3.0.0.tar.gz", hash = "sha256:5ffb077fe70b699c88d5caab999ae80e192fe28bf6cda7989b7e79b1e4e2dcd3"}, + {file = "types_pyOpenSSL-23.3.0.0-py3-none-any.whl", hash = "sha256:00171433653265843b7469ddb9f3c86d698668064cc33ef10537822156130ebf"}, +] + +[package.dependencies] +cryptography = ">=35.0.0" + +[[package]] +name = "types-redis" +version = "4.6.0.11" +description = "Typing stubs for redis" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "types-redis-4.6.0.11.tar.gz", hash = "sha256:c8cfc84635183deca2db4a528966c5566445fd3713983f0034fb0f5a09e0890d"}, + {file = "types_redis-4.6.0.11-py3-none-any.whl", hash = "sha256:94fc61118601fb4f79206b33b9f4344acff7ca1d7bba67834987fb0efcf6a770"}, +] + +[package.dependencies] +cryptography = ">=35.0.0" +types-pyOpenSSL = "*" + +[[package]] +name = "typing-extensions" +version = "4.9.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, + {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, +] + +[[package]] +name = "urllib3" +version = "2.1.0" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, + {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "uvicorn" +version = "0.25.0" +description = "The lightning-fast ASGI server." +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "uvicorn-0.25.0-py3-none-any.whl", hash = "sha256:ce107f5d9bd02b4636001a77a4e74aab5e1e2b146868ebbad565237145af444c"}, + {file = "uvicorn-0.25.0.tar.gz", hash = "sha256:6dddbad1d7ee0f5140aba5ec138ddc9612c5109399903828b4874c9937f009c2"}, +] + +[package.dependencies] +click = ">=7.0" +h11 = ">=0.8" + +[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 = "virtualenv" +version = "20.25.0" +description = "Virtual Python Environment builder" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "virtualenv-20.25.0-py3-none-any.whl", hash = "sha256:4238949c5ffe6876362d9c0180fc6c3a824a7b12b80604eeb8085f2ed7460de3"}, + {file = "virtualenv-20.25.0.tar.gz", hash = "sha256:bf51c0d9c7dd63ea8e44086fa1e4fb1093a31e963b86959257378aef020e1f1b"}, +] + +[package.dependencies] +distlib = ">=0.3.7,<1" +filelock = ">=3.12.2,<4" +platformdirs = ">=3.9.1,<5" + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] + +[[package]] +name = "xattr" +version = "0.10.1" +description = "Python wrapper for extended filesystem attributes" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "xattr-0.10.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:16a660a883e703b311d1bbbcafc74fa877585ec081cd96e8dd9302c028408ab1"}, + {file = "xattr-0.10.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:1e2973e72faa87ca29d61c23b58c3c89fe102d1b68e091848b0e21a104123503"}, + {file = "xattr-0.10.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:13279fe8f7982e3cdb0e088d5cb340ce9cbe5ef92504b1fd80a0d3591d662f68"}, + {file = "xattr-0.10.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:1dc9b9f580ef4b8ac5e2c04c16b4d5086a611889ac14ecb2e7e87170623a0b75"}, + {file = "xattr-0.10.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:485539262c2b1f5acd6b6ea56e0da2bc281a51f74335c351ea609c23d82c9a79"}, + {file = "xattr-0.10.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:295b3ab335fcd06ca0a9114439b34120968732e3f5e9d16f456d5ec4fa47a0a2"}, + {file = "xattr-0.10.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:a126eb38e14a2f273d584a692fe36cff760395bf7fc061ef059224efdb4eb62c"}, + {file = "xattr-0.10.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:b0e919c24f5b74428afa91507b15e7d2ef63aba98e704ad13d33bed1288dca81"}, + {file = "xattr-0.10.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:e31d062cfe1aaeab6ba3db6bd255f012d105271018e647645941d6609376af18"}, + {file = "xattr-0.10.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:209fb84c09b41c2e4cf16dd2f481bb4a6e2e81f659a47a60091b9bcb2e388840"}, + {file = "xattr-0.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c4120090dac33eddffc27e487f9c8f16b29ff3f3f8bcb2251b2c6c3f974ca1e1"}, + {file = "xattr-0.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3e739d624491267ec5bb740f4eada93491de429d38d2fcdfb97b25efe1288eca"}, + {file = "xattr-0.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2677d40b95636f3482bdaf64ed9138fb4d8376fb7933f434614744780e46e42d"}, + {file = "xattr-0.10.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40039f1532c4456fd0f4c54e9d4e01eb8201248c321c6c6856262d87e9a99593"}, + {file = "xattr-0.10.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:148466e5bb168aba98f80850cf976e931469a3c6eb11e9880d9f6f8b1e66bd06"}, + {file = "xattr-0.10.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0aedf55b116beb6427e6f7958ccd80a8cbc80e82f87a4cd975ccb61a8d27b2ee"}, + {file = "xattr-0.10.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c3024a9ff157247c8190dd0eb54db4a64277f21361b2f756319d9d3cf20e475f"}, + {file = "xattr-0.10.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f1be6e733e9698f645dbb98565bb8df9b75e80e15a21eb52787d7d96800e823b"}, + {file = "xattr-0.10.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7880c8a54c18bc091a4ce0adc5c6d81da1c748aec2fe7ac586d204d6ec7eca5b"}, + {file = "xattr-0.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:89c93b42c3ba8aedbc29da759f152731196c2492a2154371c0aae3ef8ba8301b"}, + {file = "xattr-0.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6b905e808df61b677eb972f915f8a751960284358b520d0601c8cbc476ba2df6"}, + {file = "xattr-0.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1ef954d0655f93a34d07d0cc7e02765ec779ff0b59dc898ee08c6326ad614d5"}, + {file = "xattr-0.10.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:199b20301b6acc9022661412346714ce764d322068ef387c4de38062474db76c"}, + {file = "xattr-0.10.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec0956a8ab0f0d3f9011ba480f1e1271b703d11542375ef73eb8695a6bd4b78b"}, + {file = "xattr-0.10.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ffcb57ca1be338d69edad93cf59aac7c6bb4dbb92fd7bf8d456c69ea42f7e6d2"}, + {file = "xattr-0.10.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f0563196ee54756fe2047627d316977dc77d11acd7a07970336e1a711e934db"}, + {file = "xattr-0.10.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc354f086f926a1c7f04886f97880fed1a26d20e3bc338d0d965fd161dbdb8ab"}, + {file = "xattr-0.10.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c0cd2d02ef2fb45ecf2b0da066a58472d54682c6d4f0452dfe7ae2f3a76a42ea"}, + {file = "xattr-0.10.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49626096ddd72dcc1654aadd84b103577d8424f26524a48d199847b5d55612d0"}, + {file = "xattr-0.10.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ceaa26bef8fcb17eb59d92a7481c2d15d20211e217772fb43c08c859b01afc6a"}, + {file = "xattr-0.10.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8c014c371391f28f8cd27d73ea59f42b30772cd640b5a2538ad4f440fd9190b"}, + {file = "xattr-0.10.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:46c32cd605673606b9388a313b0050ee7877a0640d7561eea243ace4fa2cc5a6"}, + {file = "xattr-0.10.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:772b22c4ff791fe5816a7c2a1c9fcba83f9ab9bea138eb44d4d70f34676232b4"}, + {file = "xattr-0.10.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:183ad611a2d70b5a3f5f7aadef0fcef604ea33dcf508228765fd4ddac2c7321d"}, + {file = "xattr-0.10.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8068df3ebdfa9411e58d5ae4a05d807ec5994645bb01af66ec9f6da718b65c5b"}, + {file = "xattr-0.10.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bc40570155beb85e963ae45300a530223d9822edfdf09991b880e69625ba38a"}, + {file = "xattr-0.10.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:436e1aaf23c07e15bed63115f1712d2097e207214fc6bcde147c1efede37e2c5"}, + {file = "xattr-0.10.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7298455ccf3a922d403339781b10299b858bb5ec76435445f2da46fb768e31a5"}, + {file = "xattr-0.10.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:986c2305c6c1a08f78611eb38ef9f1f47682774ce954efb5a4f3715e8da00d5f"}, + {file = "xattr-0.10.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:5dc6099e76e33fa3082a905fe59df766b196534c705cf7a2e3ad9bed2b8a180e"}, + {file = "xattr-0.10.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:042ad818cda6013162c0bfd3816f6b74b7700e73c908cde6768da824686885f8"}, + {file = "xattr-0.10.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9d4c306828a45b41b76ca17adc26ac3dc00a80e01a5ba85d71df2a3e948828f2"}, + {file = "xattr-0.10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a606280b0c9071ef52572434ecd3648407b20df3d27af02c6592e84486b05894"}, + {file = "xattr-0.10.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5b49d591cf34cda2079fd7a5cb2a7a1519f54dc2e62abe3e0720036f6ed41a85"}, + {file = "xattr-0.10.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b8705ac6791426559c1a5c2b88bb2f0e83dc5616a09b4500899bfff6a929302"}, + {file = "xattr-0.10.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5ea974930e876bc5c146f54ac0f85bb39b7b5de2b6fc63f90364712ae368ebe"}, + {file = "xattr-0.10.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f55a2dd73a12a1ae5113c5d9cd4b4ab6bf7950f4d76d0a1a0c0c4264d50da61d"}, + {file = "xattr-0.10.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:475c38da0d3614cc5564467c4efece1e38bd0705a4dbecf8deeb0564a86fb010"}, + {file = "xattr-0.10.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:925284a4a28e369459b2b7481ea22840eed3e0573a4a4c06b6b0614ecd27d0a7"}, + {file = "xattr-0.10.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa32f1b45fed9122bed911de0fcc654da349e1f04fa4a9c8ef9b53e1cc98b91e"}, + {file = "xattr-0.10.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c5d3d0e728bace64b74c475eb4da6148cd172b2d23021a1dcd055d92f17619ac"}, + {file = "xattr-0.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8faaacf311e2b5cc67c030c999167a78a9906073e6abf08eaa8cf05b0416515c"}, + {file = "xattr-0.10.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cc6b8d5ca452674e1a96e246a3d2db5f477aecbc7c945c73f890f56323e75203"}, + {file = "xattr-0.10.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3725746a6502f40f72ef27e0c7bfc31052a239503ff3eefa807d6b02a249be22"}, + {file = "xattr-0.10.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:789bd406d1aad6735e97b20c6d6a1701e1c0661136be9be862e6a04564da771f"}, + {file = "xattr-0.10.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9a7a807ab538210ff8532220d8fc5e2d51c212681f63dbd4e7ede32543b070f"}, + {file = "xattr-0.10.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3e5825b5fc99ecdd493b0cc09ec35391e7a451394fdf623a88b24726011c950d"}, + {file = "xattr-0.10.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:80638d1ce7189dc52f26c234cee3522f060fadab6a8bc3562fe0ddcbe11ba5a4"}, + {file = "xattr-0.10.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3ff0dbe4a6ce2ce065c6de08f415bcb270ecfd7bf1655a633ddeac695ce8b250"}, + {file = "xattr-0.10.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5267e5f9435c840d2674194150b511bef929fa7d3bc942a4a75b9eddef18d8d8"}, + {file = "xattr-0.10.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b27dfc13b193cb290d5d9e62f806bb9a99b00cd73bb6370d556116ad7bb5dc12"}, + {file = "xattr-0.10.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:636ebdde0277bce4d12d2ef2550885804834418fee0eb456b69be928e604ecc4"}, + {file = "xattr-0.10.1-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d60c27922ec80310b45574351f71e0dd3a139c5295e8f8b19d19c0010196544f"}, + {file = "xattr-0.10.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b34df5aad035d0343bd740a95ca30db99b776e2630dca9cc1ba8e682c9cc25ea"}, + {file = "xattr-0.10.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f24a7c04ff666d0fe905dfee0a84bc899d624aeb6dccd1ea86b5c347f15c20c1"}, + {file = "xattr-0.10.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3878e1aff8eca64badad8f6d896cb98c52984b1e9cd9668a3ab70294d1ef92d"}, + {file = "xattr-0.10.1-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4abef557028c551d59cf2fb3bf63f2a0c89f00d77e54c1c15282ecdd56943496"}, + {file = "xattr-0.10.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0e14bd5965d3db173d6983abdc1241c22219385c22df8b0eb8f1846c15ce1fee"}, + {file = "xattr-0.10.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f9be588a4b6043b03777d50654c6079af3da60cc37527dbb80d36ec98842b1e"}, + {file = "xattr-0.10.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bc4ae264aa679aacf964abf3ea88e147eb4a22aea6af8c6d03ebdebd64cfd6"}, + {file = "xattr-0.10.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:827b5a97673b9997067fde383a7f7dc67342403093b94ea3c24ae0f4f1fec649"}, + {file = "xattr-0.10.1.tar.gz", hash = "sha256:c12e7d81ffaa0605b3ac8c22c2994a8e18a9cf1c59287a1b7722a2289c952ec5"}, +] + +[package.dependencies] +cffi = ">=1.0" + +[metadata] +lock-version = "2.0" +python-versions = "^3.12" +content-hash = "2c4099d99b375795e1d392d3bbafd41f118a738506667e78106f1646ed23d293" diff --git a/poetry.toml b/poetry.toml new file mode 100644 index 0000000..d2eefcc --- /dev/null +++ b/poetry.toml @@ -0,0 +1,5 @@ +[virtualenvs] +in-project = true + +[experimental] +new-installer = false diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..6d95362 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,168 @@ +[tool.ruff] +src = ["src"] +line-length = 120 +select = [ + "E", # pycodestyle errors + "W", # pycodestyle warnings + "F", # pyflakes + "I", # isort + "N", # pep8-naming (N) + "YTT", # flake8-2020 + "C", # flake8-comprehensions + "B", # flake8-bugbear + "T20", # flake8-print + "RET", # flake8-return + "SLF", # flake8-self + "ARG", # flake8-unused-arguments + "TCH", # flake8-type-checking + "RUF", # Ruff-specific rules +] +ignore = [ + "B008", # do not perform function calls in argument defaults + "C901", # too complex + "B904", # `except` clause, raise exceptions with `raise, + "B027", # is an empty method in an abstract base class + "B024", # abstract base class, but it has no abstract methods + "B026", # Star-arg unpacking after a keyword argument is strongly discouraged + "B905", # `zip()` without an explicit `strict=` parameter + "E701", # multiple statements on one line +] +# flake8 previously used the following codes: +# E701 E231 E225 E999 W503 E251 C901 I004 E800 B008 B024 B026 B028 +target-version = "py312" + +[tool.ruff.mccabe] +# Unlike Flake8, default to a complexity level of 10. +max-complexity = 10 + +# ISORT CONFIGURATION USED BY RUFF +[tool.ruff.isort] # https://beta.ruff.rs/docs/settings/#isort +force-sort-within-sections = true + +force-wrap-aliases = true +combine-as-imports = true + +# The sections and order of the imports +section-order = [ + "future", + "standard-library", + "third-party", + "first-party", + "local-folder", +] + +# Our libraries used on the project, must be added here, then they will be groupped together +known-first-party = [] + +# Our local folders used on the project, must be added here, then they will be groupped together +known-local-folder = [ + "app", + "auth", + "config", + "core", + "northwind", + "infra", + "shared", + "utils", +] + +# Third party libraries used on the project, must be added here, then they will be groupped together +known-third-party = [ + "beartype", + "bcrypt", + "colorlog", + "fastapi", + "pydantic", + "pytest", + "typer", + "yaml", +] + +lines-after-imports = 2 +# lines-between-types = 1 + +[tool.ruff.flake8-bugbear] +extend-immutable-calls = ["fastapi.Depends", "fastapi.Query"] + + +[tool.ruff.format] +quote-style = "single" +indent-style = "space" +docstring-code-format = true + +[tool.black] +line-length = 120 +skip-string-normalization = true +target-version = ['py312'] +include = '\.pyi?$' +exclude = ''' + +( + /( + \.eggs # exclude a few common directories in the + | \.git # root of the project + | \.hg + | \.mypy_cache + | \.tox + | \.venv + | _build + | buck-out + | build + | dist + | migrations + )/ + | foo.py # also separately exclude a file named foo.py in + # the root of the project +) +''' + +[tool.pylint] +max-line-length = 120 +disable = ["C0112", "C0114", "C0115", "C0116"] + + +[tool.poetry] +name = "abusquets-northwind" +version = "0.1.0" +description = "" +authors = ["Alexandre Busquets Triola "] +readme = "README.md" +packages = [] + +[tool.poetry.dependencies] +python = "^3.12" +fastapi = "^0.108.0" +uvicorn = "^0.25.0" +pydantic = "^2.5.3" +pyyaml = "^6.0" +colorlog = "^6.7.0" +sqlalchemy = "^2.0.24" +alembic = "^1.13.1" +bcrypt = "^4.0.1" +asyncpg = "0.29" +httpx = "0.26.0" +click = "^8.1.7" +pycountry = "^22.3.5" +python-jose = { extras = ["cryptography"], version = "^3.3.0" } +redis = "^5.0.1" +pydantic-settings = "^2.1.0" +orjson = "^3.9.5" +greenlet = "^3.0.3" +faker = "22.0.0" +anyio = "^4.2.0" +pytest = "^7.4.4" +rapidfuzz = "^3.6.1" + +[tool.poetry.group.dev.dependencies] +debugpy = "^1.8.0" +pytest = "^7.4.3" +pytest-env = "^1.1.3" +pytest-cov = "^4.1.0" +pytest-asyncio = "^0.23.2" +poetry-types = "^0.5.0" +types-redis = "^4.6.0.11" + + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/src/.coveragerc b/src/.coveragerc new file mode 100644 index 0000000..a7cba45 --- /dev/null +++ b/src/.coveragerc @@ -0,0 +1,3 @@ +[run] +omit = + tests/* diff --git a/src/alembic.ini b/src/alembic.ini new file mode 100644 index 0000000..eddc4b5 --- /dev/null +++ b/src/alembic.ini @@ -0,0 +1,105 @@ +# A generic, single database configuration. + +[alembic] +# path to migration scripts +script_location = infra/database/alembic + +version_locations = infra/database/alembic/versions + +# template used to generate migration file names; The default value is %%(rev)s_%%(slug)s +# Uncomment the line below if you want the files to be prepended with date and time +# file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d-%%(rev)s_%%(slug)s + +# sys.path path, will be prepended to sys.path if present. +# defaults to the current working directory. +prepend_sys_path = . + +# timezone to use when rendering the date within the migration file +# as well as the filename. +# If specified, requires the python-dateutil library that can be +# installed by adding `alembic[tz]` to the pip requirements +# string value is passed to dateutil.tz.gettz() +# leave blank for localtime +# timezone = + +# max length of characters to apply to the +# "slug" field +# truncate_slug_length = 40 + +# set to 'true' to run the environment during +# the 'revision' command, regardless of autogenerate +# revision_environment = false + +# set to 'true' to allow .pyc and .pyo files without +# a source .py file to be detected as revisions in the +# versions/ directory +# sourceless = false + +# version location specification; This defaults +# to migrations/versions. When using multiple version +# directories, initial revisions must be specified with --version-path. +# The path separator used here should be the separator specified by "version_path_separator" below. +# version_locations = %(here)s/bar:%(here)s/bat:migrations/versions + +# version path separator; As mentioned above, this is the character used to split +# version_locations. The default within new alembic.ini files is "os", which uses os.pathsep. +# If this key is omitted entirely, it falls back to the legacy behavior of splitting on spaces and/or commas. +# Valid values for version_path_separator are: +# +# version_path_separator = : +# version_path_separator = ; +# version_path_separator = space +# version_path_separator = os # Use os.pathsep. Default configuration used for new projects. + +# the output encoding used when revision files +# are written from script.py.mako +# output_encoding = utf-8 + +# sqlalchemy.url = driver://user:pass@localhost/dbname + + +[post_write_hooks] +# post_write_hooks defines scripts or Python functions that are run +# on newly generated revision scripts. See the documentation for further +# detail and examples + +# format using "black" - use the console_scripts runner, against the "black" entrypoint +# hooks = black +# black.type = console_scripts +# black.entrypoint = black +# black.options = -l 79 REVISION_SCRIPT_FILENAME + +# Logging configuration +[loggers] +keys = root,sqlalchemy,alembic + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = WARN +handlers = console +qualname = + +[logger_sqlalchemy] +level = WARN +handlers = +qualname = sqlalchemy.engine + +[logger_alembic] +level = INFO +handlers = +qualname = alembic + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %H:%M:%S diff --git a/src/app/__init__.py b/src/app/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/app/app_container.py b/src/app/app_container.py new file mode 100644 index 0000000..3a2ebae --- /dev/null +++ b/src/app/app_container.py @@ -0,0 +1,28 @@ +from auth.di.mixins import AuthContainerMixin +from config import settings +from infra.cache.ports import AbstractCacheRepository +from infra.cache.redis_cache import RedisCache +from infra.database.sqlalchemy.session import AbstractDatabase, Database +from northwind.di.mixins import NorthwindContainerMixin +from utils.di import DIContainer, di_singleton + + +class AppContainerMixin: + db: AbstractDatabase + cache_repository: AbstractCacheRepository + + def _get_db(self) -> AbstractDatabase: + return Database() + + @di_singleton + def _get_cache_repository(self) -> AbstractCacheRepository: + return RedisCache( + url=settings.REDIS_URL, + user=settings.REDIS_USER, + password=settings.REDIS_PASSWORD, + ) + + +# @singleton +class AppContainer(NorthwindContainerMixin, AuthContainerMixin, AppContainerMixin, DIContainer): + pass diff --git a/src/app/asgi.py b/src/app/asgi.py new file mode 100644 index 0000000..fcdaed7 --- /dev/null +++ b/src/app/asgi.py @@ -0,0 +1,65 @@ +from contextlib import asynccontextmanager +import logging +from typing import AsyncIterator + +from fastapi import FastAPI, Request +from fastapi.responses import ORJSONResponse + +from .app_container import AppContainer +from app.setup_logging import setup_logging +from auth.adapters.api.http.router import router as auth_router +from config import settings +from northwind.adapters.api.http.router import router as northwind_router +from shared.exceptions import APPExceptionError + + +setup_logging() + +logger = logging.getLogger(__name__) + + +@asynccontextmanager +async def lifespan(_: FastAPI) -> AsyncIterator: + await AppContainer().cache_repository.init() + # Start redis connection pool + yield + # Stop redis connection pool + await AppContainer().cache_repository.close() + + +app = FastAPI(debug=settings.DEBUG, openapi_url=None, lifespan=lifespan) + + +# @app.middleware('http') +# async def add_process_time_header(request: Request, call_next: Callable[[Request], Response]) -> Response: +# start_time = time.time() +# response = await call_next(request) +# process_time = time.time() - start_time +# response.headers['X-Process-Time'] = str(process_time) +# return response + + +@app.get('/') +async def root() -> dict: + return {'message': 'Hello World'} + + +api_app = FastAPI( + title=settings.PROJECT_NAME, + description=settings.PROJECT_DESCRIPTION, + version=settings.VERSION, + default_response_class=ORJSONResponse, +) + +api_app.include_router(auth_router) +api_app.include_router(northwind_router) + +app.mount('/api/v1', api_app) + + +@api_app.exception_handler(APPExceptionError) +async def custom_exception_handler(_: Request, exc: APPExceptionError) -> ORJSONResponse: + return ORJSONResponse( + status_code=exc.status_code, + content={'error': {'code': exc.code, 'message': exc.message}}, + ) diff --git a/src/app/exceptions.py b/src/app/exceptions.py new file mode 100644 index 0000000..2bea9af --- /dev/null +++ b/src/app/exceptions.py @@ -0,0 +1,7 @@ +from shared.exceptions import APPExceptionError + + +class EmptyPayloadExceptionError(APPExceptionError): + status_code = 422 + code = 'empty-payload' + message = "You haven't sent any data" diff --git a/src/app/schemas.py b/src/app/schemas.py new file mode 100644 index 0000000..aa80feb --- /dev/null +++ b/src/app/schemas.py @@ -0,0 +1,20 @@ +from typing import Optional + +from pydantic import BaseModel + + +class Profile(BaseModel): + first_name: str + last_name: Optional[str] = None + is_admin: bool + + +class Session(BaseModel): + uuid: str + expires: int + username: str + profile: Profile + + +class DetailResponse(BaseModel): + detail: str diff --git a/src/app/session_deps.py b/src/app/session_deps.py new file mode 100644 index 0000000..369a27f --- /dev/null +++ b/src/app/session_deps.py @@ -0,0 +1,77 @@ +from fastapi import Depends, HTTPException +from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer +from starlette.status import HTTP_401_UNAUTHORIZED, HTTP_403_FORBIDDEN + +from app.app_container import AppContainer +from app.schemas import Session +from auth.domain.services.token import TokenService +from infra.cache.ports import AbstractCacheRepository + + +http_bearer = HTTPBearer() + + +def get_token_service() -> TokenService: + return AppContainer().token_service + + +def get_cache_repository() -> AbstractCacheRepository: + return AppContainer().cache_repository + + +async def _check_token( + token_type: str, + credentials: HTTPAuthorizationCredentials, + cache_repository: AbstractCacheRepository, + token_service: TokenService, +) -> Session: + token = credentials.credentials + + if not token: + raise HTTPException( + status_code=HTTP_401_UNAUTHORIZED, + detail='Invalid authentication credentials.', + ) + + claims = token_service.decode_token(token) + + if claims is None: + raise HTTPException(status_code=HTTP_401_UNAUTHORIZED, detail='Invalid token or expired token.') + + if claims.get('type') != token_type: + raise HTTPException(status_code=HTTP_401_UNAUTHORIZED, detail='Invalid token.') + + uuid = str(claims.get('jit')) + if await cache_repository.get(uuid): + raise HTTPException(status_code=HTTP_401_UNAUTHORIZED, detail='Revoked token.') + + return Session(uuid=uuid, expires=claims.get('exp'), username=claims.get('sub'), profile=claims.get('profile')) + + +async def check_access_token( + credentials: HTTPAuthorizationCredentials = Depends(http_bearer), + cache_repository: AbstractCacheRepository = Depends(get_cache_repository), + token_service: TokenService = Depends(get_token_service), +) -> Session: + return await _check_token('a', credentials, cache_repository, token_service) + + +async def check_refresh_token( + credentials: HTTPAuthorizationCredentials = Depends(http_bearer), + cache_repository: AbstractCacheRepository = Depends(get_cache_repository), + token_service: TokenService = Depends(get_token_service), +) -> Session: + return await _check_token('r', credentials, cache_repository, token_service) + + +async def is_admin_session( + credentials: HTTPAuthorizationCredentials = Depends(http_bearer), + cache_repository: AbstractCacheRepository = Depends(get_cache_repository), + token_service: TokenService = Depends(get_token_service), +) -> Session: + session = await check_access_token(credentials, cache_repository, token_service) + + if not session.profile.is_admin: + raise HTTPException(status_code=HTTP_403_FORBIDDEN, detail='Not authorized.') + + return session diff --git a/src/app/setup_logging.py b/src/app/setup_logging.py new file mode 100644 index 0000000..da99ad2 --- /dev/null +++ b/src/app/setup_logging.py @@ -0,0 +1,19 @@ +import logging.config +import os + +import yaml + +from config import settings + + +APP_ENV = os.getenv('APP_ENV', 'dev') + + +def setup_logging() -> None: + env = settings.APP_ENV + if env == 'test': + env = 'dev' + path = f'logging.{env}.yaml' + with open(path, 'rt', encoding='utf-8') as file: + config = yaml.safe_load(file.read()) + logging.config.dictConfig(config) diff --git a/src/auth/__init__.py b/src/auth/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/auth/adapters/__init__.py b/src/auth/adapters/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/auth/adapters/api/__init__.py b/src/auth/adapters/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/auth/adapters/api/cli/__init__.py b/src/auth/adapters/api/cli/__init__.py new file mode 100644 index 0000000..87cb57f --- /dev/null +++ b/src/auth/adapters/api/cli/__init__.py @@ -0,0 +1,7 @@ +from typing import Callable, List + +from .secret import create_secret +from .user import create_admin + + +commands: List[Callable[..., None]] = [create_secret, create_admin] diff --git a/src/auth/adapters/api/cli/secret.py b/src/auth/adapters/api/cli/secret.py new file mode 100644 index 0000000..a042a90 --- /dev/null +++ b/src/auth/adapters/api/cli/secret.py @@ -0,0 +1,7 @@ +import secrets + +import click + + +def create_secret() -> None: + click.echo(secrets.token_urlsafe(32)) diff --git a/src/auth/adapters/api/cli/user.py b/src/auth/adapters/api/cli/user.py new file mode 100644 index 0000000..3e1bbc5 --- /dev/null +++ b/src/auth/adapters/api/cli/user.py @@ -0,0 +1,48 @@ +from typing import Optional + +import click +from pydantic import BaseModel, Field, ValidationError + +from app.app_container import AppContainer +from auth.adapters.api.cli.user_presenter import UserPresenter +from auth.domain.services.user import CreateUserInDTO, UserService +from auth.domain.use_cases.user import CreateUserUseCase +from shared.exceptions import AlreadyExistsError +from utils.async_utils import async_exec + + +class CreateUserStdinDTO(BaseModel): + email: str = Field(max_length=255) + first_name: str = Field(max_length=255) + last_name: Optional[str] = Field(max_length=255, default=None) + password: str = Field(max_length=255, min_length=4) + + +async def _create_admin(email: str, first_name: str, password: str) -> None: + # Validate input + try: + in_data = CreateUserStdinDTO(email=email, first_name=first_name, password=password) + except ValidationError as e: + for error in e.errors(): + message = f'Error: {error}' + raise click.BadParameter(message) + + repo = AppContainer().user_repository + user_service = UserService(repo) + in_dto = CreateUserInDTO(**in_data.model_dump(), is_admin=True) + presenter = UserPresenter() + use_case = CreateUserUseCase(presenter=presenter, service=user_service) + try: + await use_case.execute(in_dto) + user = presenter.result + click.echo(f'The User {user.first_name}, {user.email} has been created') + except AlreadyExistsError as e: + click.echo(f'Error: {e.message}') + raise click.Abort() + + +@click.argument('email') +@click.argument('first_name') +@click.option('--password', '-p', help='Enter a password', prompt=True) +def create_admin(email: str, first_name: str, password: str) -> None: + async_exec(_create_admin, email, first_name, password) diff --git a/src/auth/adapters/api/cli/user_presenter.py b/src/auth/adapters/api/cli/user_presenter.py new file mode 100644 index 0000000..5c550a2 --- /dev/null +++ b/src/auth/adapters/api/cli/user_presenter.py @@ -0,0 +1,23 @@ +from typing import Optional + +from pydantic import BaseModel + +from auth.domain.entities.user import User +from auth.domain.entities.value_objects import UserId +from shared.presenter import AbstractPresenter + + +class UserResponse(BaseModel): + uuid: UserId + email: str + first_name: str + last_name: Optional[str] + is_admin: bool = False + is_active: bool = True + + +class UserPresenter(AbstractPresenter[User, UserResponse]): + result: UserResponse + + async def present(self, data: User) -> None: + self.result = UserResponse.model_validate(data, from_attributes=True) diff --git a/src/auth/adapters/api/http/__init__.py b/src/auth/adapters/api/http/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/auth/adapters/api/http/router.py b/src/auth/adapters/api/http/router.py new file mode 100644 index 0000000..02b740e --- /dev/null +++ b/src/auth/adapters/api/http/router.py @@ -0,0 +1,7 @@ +from fastapi.routing import APIRouter + +from .token import router as token_router + + +router = APIRouter(prefix='/auth', tags=['auth']) +router.include_router(token_router) diff --git a/src/auth/adapters/api/http/schemas.py b/src/auth/adapters/api/http/schemas.py new file mode 100644 index 0000000..c9acecd --- /dev/null +++ b/src/auth/adapters/api/http/schemas.py @@ -0,0 +1,22 @@ +from pydantic import BaseModel, Extra, Field + + +class LoginResponse(BaseModel): + access_token: str + refresh_token: str + + +class RefreshTokenResponse(BaseModel): + access_token: str + + +class ProtectedResponse(BaseModel): + username: str + + +class UserAuthRequest(BaseModel): + email: str = Field(..., description='User email') + password: str = Field(..., max_length=255, description='User password') + + class Config: + extra = Extra.forbid diff --git a/src/auth/adapters/api/http/token.py b/src/auth/adapters/api/http/token.py new file mode 100644 index 0000000..3281809 --- /dev/null +++ b/src/auth/adapters/api/http/token.py @@ -0,0 +1,101 @@ +from typing import Any, Dict + +from fastapi import Depends, HTTPException, status +from fastapi.routing import APIRouter + +from app.app_container import AppContainer +from app.schemas import DetailResponse, Session +from app.session_deps import check_access_token, check_refresh_token +from auth.adapters.api.cli.user_presenter import UserPresenter +from auth.adapters.api.http.schemas import LoginResponse, ProtectedResponse, RefreshTokenResponse, UserAuthRequest +from auth.domain.services.token import TokenService +from auth.domain.services.user import UserService +from auth.domain.use_cases.user import GetUserAndVerifyPasswordUseCase, InvalidPasswordExceptionError +from shared.exceptions import NotFoundError + + +router = APIRouter() + + +@router.post( + '/login', + summary='Create access and refresh tokens for user', + responses={ + 200: {'description': 'Successful Response'}, + 401: {'description': 'Unauthorized'}, + 422: {'description': 'Unprocessable Entity'}, + }, +) +async def login( + payload: UserAuthRequest, + app_container: AppContainer = Depends(AppContainer), +) -> LoginResponse: + user_presenter = UserPresenter() + user_service = UserService(app_container.user_repository) + get_user_use_case = GetUserAndVerifyPasswordUseCase(user_presenter, user_service) + + try: + await get_user_use_case.execute(payload.email, payload.password) + user = user_presenter.result + except (NotFoundError, InvalidPasswordExceptionError) as exc: + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail='Incorrect email or password') from exc + + claims: Dict[str, Any] = { + 'profile': {'first_name': user.first_name, 'last_name': user.last_name, 'is_admin': user.is_admin} + } + + token_service = TokenService() + + access_token: str = token_service.create_access_token(user.email, claims) + refresh_token: str = token_service.create_refresh_token(user.email, claims) + + return LoginResponse(access_token=access_token, refresh_token=refresh_token) + + +@router.get( + '/protected', + summary='Get current session - example of protected endpoint', + responses={ + 200: {'description': 'Successful Response'}, + 403: {'description': 'Permission denied'}, + 422: {'description': 'Unprocessable Entity'}, + }, +) +async def protected(current_session: Session = Depends(check_access_token)) -> ProtectedResponse: + return ProtectedResponse(username=current_session.username) + + +@router.post('/refresh-token', summary='Refresh access token') +async def refresh( + session: Session = Depends(check_refresh_token), + app_container: AppContainer = Depends(AppContainer), +) -> RefreshTokenResponse: + token_service = TokenService(cache_repository=app_container.cache_repository) + + profile = session.profile + claims: Dict[str, Any] = { + 'profile': {'first_name': profile.first_name, 'last_name': profile.last_name, 'is_admin': profile.is_admin} + } + access_token: str = token_service.create_access_token(session.username, claims) + return RefreshTokenResponse(access_token=access_token) + + +@router.delete('/access-revoke') +async def access_revoke( + session: Session = Depends(check_access_token), + app_container: AppContainer = Depends(AppContainer), +) -> DetailResponse: + token_service = TokenService(cache_repository=app_container.cache_repository) + await token_service.revoke_access_token(session.uuid) + return DetailResponse(detail='Access Token has been revoked') + + +@router.delete('/refresh-revoke') +async def refresh_revoke( + session: Session = Depends(check_refresh_token), + app_container: AppContainer = Depends(AppContainer), +) -> DetailResponse: + token_service = TokenService(cache_repository=app_container.cache_repository) + await token_service.revoke_refresh_token(session.uuid) + + return DetailResponse(detail='Refresh Token has been revoked') diff --git a/src/auth/adapters/spi/__init__.py b/src/auth/adapters/spi/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/auth/adapters/spi/repositories/user.py b/src/auth/adapters/spi/repositories/user.py new file mode 100644 index 0000000..0efeb87 --- /dev/null +++ b/src/auth/adapters/spi/repositories/user.py @@ -0,0 +1,32 @@ +from sqlalchemy.exc import IntegrityError +from sqlalchemy.orm import registry + +from auth.domain.entities.user import User +from auth.domain.ports.repositories.user import AbstractUserRepository, CreateUserInDTO, UpdatePartialUserInDTO +from auth.infra.database.sqlalchemy.models.user import users +from shared.exceptions import AlreadyExistsError +from shared.repository.sqlalchemy import SqlAlchemyRepository + + +mapper_registry = registry() + + +mapper_registry.map_imperatively( + User, + users, +) + + +class UserRepository( + SqlAlchemyRepository[User, CreateUserInDTO, UpdatePartialUserInDTO], + AbstractUserRepository, +): + key = 'email' + + async def create(self, data: CreateUserInDTO) -> User: + try: + ret = await super().create(data) + except IntegrityError as e: + if 'duplicate key value violates unique constraint "uq_core_user_email"' in str(e): + raise AlreadyExistsError(User.__name__) + return ret diff --git a/src/auth/alembic.ini b/src/auth/alembic.ini new file mode 100644 index 0000000..5650adc --- /dev/null +++ b/src/auth/alembic.ini @@ -0,0 +1,107 @@ +# A generic, single database configuration. + +[alembic] +# path to migration scripts +script_location = auth/infra/database/alembic/ + +version_locations = auth/infra/database/alembic/versions + + + +# template used to generate migration file names; The default value is %%(rev)s_%%(slug)s +# Uncomment the line below if you want the files to be prepended with date and time +# file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d-%%(rev)s_%%(slug)s + +# sys.path path, will be prepended to sys.path if present. +# defaults to the current working directory. +prepend_sys_path = . + +# timezone to use when rendering the date within the migration file +# as well as the filename. +# If specified, requires the python-dateutil library that can be +# installed by adding `alembic[tz]` to the pip requirements +# string value is passed to dateutil.tz.gettz() +# leave blank for localtime +# timezone = + +# max length of characters to apply to the +# "slug" field +# truncate_slug_length = 40 + +# set to 'true' to run the environment during +# the 'revision' command, regardless of autogenerate +# revision_environment = false + +# set to 'true' to allow .pyc and .pyo files without +# a source .py file to be detected as revisions in the +# versions/ directory +# sourceless = false + +# version location specification; This defaults +# to migrations/versions. When using multiple version +# directories, initial revisions must be specified with --version-path. +# The path separator used here should be the separator specified by "version_path_separator" below. +# version_locations = %(here)s/bar:%(here)s/bat:migrations/versions + +# version path separator; As mentioned above, this is the character used to split +# version_locations. The default within new alembic.ini files is "os", which uses os.pathsep. +# If this key is omitted entirely, it falls back to the legacy behavior of splitting on spaces and/or commas. +# Valid values for version_path_separator are: +# +# version_path_separator = : +# version_path_separator = ; +# version_path_separator = space +# version_path_separator = os # Use os.pathsep. Default configuration used for new projects. + +# the output encoding used when revision files +# are written from script.py.mako +# output_encoding = utf-8 + +# sqlalchemy.url = driver://user:pass@localhost/dbname + + +[post_write_hooks] +# post_write_hooks defines scripts or Python functions that are run +# on newly generated revision scripts. See the documentation for further +# detail and examples + +# format using "black" - use the console_scripts runner, against the "black" entrypoint +# hooks = black +# black.type = console_scripts +# black.entrypoint = black +# black.options = -l 79 REVISION_SCRIPT_FILENAME + +# Logging configuration +[loggers] +keys = root,sqlalchemy,alembic + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = WARN +handlers = console +qualname = + +[logger_sqlalchemy] +level = WARN +handlers = +qualname = sqlalchemy.engine + +[logger_alembic] +level = INFO +handlers = +qualname = alembic + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %H:%M:%S diff --git a/src/auth/di/__init__.py b/src/auth/di/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/auth/di/mixins/__init__.py b/src/auth/di/mixins/__init__.py new file mode 100644 index 0000000..b993673 --- /dev/null +++ b/src/auth/di/mixins/__init__.py @@ -0,0 +1,6 @@ +from auth.di.mixins.token import TokenContainerMixin +from auth.di.mixins.user import UserContainerMixin + + +class AuthContainerMixin(UserContainerMixin, TokenContainerMixin): + pass diff --git a/src/auth/di/mixins/token.py b/src/auth/di/mixins/token.py new file mode 100644 index 0000000..83a0303 --- /dev/null +++ b/src/auth/di/mixins/token.py @@ -0,0 +1,8 @@ +from auth.domain.services.token import TokenService + + +class TokenContainerMixin: + token_service: TokenService + + def _get_token_service(self) -> TokenService: + return TokenService() diff --git a/src/auth/di/mixins/user.py b/src/auth/di/mixins/user.py new file mode 100644 index 0000000..07c3056 --- /dev/null +++ b/src/auth/di/mixins/user.py @@ -0,0 +1,11 @@ +from auth.adapters.spi.repositories.user import UserRepository +from auth.domain.ports.repositories.user import AbstractUserRepository +from infra.database.sqlalchemy.session import AbstractDatabase + + +class UserContainerMixin: + db: AbstractDatabase + user_repository: AbstractUserRepository + + def _get_user_repository(self) -> AbstractUserRepository: + return UserRepository(self.db.session) diff --git a/src/auth/domain/__init__.py b/src/auth/domain/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/auth/domain/dtos/__init__.py b/src/auth/domain/dtos/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/auth/domain/dtos/country/__init__.py b/src/auth/domain/dtos/country/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/auth/domain/dtos/country/create_country.py b/src/auth/domain/dtos/country/create_country.py new file mode 100644 index 0000000..a3a3730 --- /dev/null +++ b/src/auth/domain/dtos/country/create_country.py @@ -0,0 +1,6 @@ +from pydantic import BaseModel, Field + + +class CreateCountryInDTO(BaseModel): + code: str = Field(max_length=2) + name: str = Field(max_length=255) diff --git a/src/auth/domain/dtos/country/update_country.py b/src/auth/domain/dtos/country/update_country.py new file mode 100644 index 0000000..81daa15 --- /dev/null +++ b/src/auth/domain/dtos/country/update_country.py @@ -0,0 +1,7 @@ +from typing import Optional + +from pydantic import BaseModel, Field + + +class UpdatePartialCountryInDTO(BaseModel): + name: Optional[str] = Field(max_length=255) diff --git a/src/auth/domain/entities/__init__.py b/src/auth/domain/entities/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/auth/domain/entities/user.py b/src/auth/domain/entities/user.py new file mode 100644 index 0000000..b5b6492 --- /dev/null +++ b/src/auth/domain/entities/user.py @@ -0,0 +1,33 @@ +from dataclasses import dataclass, field +from typing import Optional +import uuid as uuid_lib + +import bcrypt + +from auth.domain.entities.value_objects import UserId + + +@dataclass(kw_only=True) +class BaseUser: + email: str + first_name: str + last_name: Optional[str] + password: str + is_admin: bool = False + is_active: bool = True + + @staticmethod + def encrypt_password(password: str) -> str: + salt = bcrypt.gensalt() + hashed_password = bcrypt.hashpw(password.encode(), salt) + return str(hashed_password.decode()) + + @staticmethod + def verify_password(password: str, hashed: str) -> bool: + ret: bool = bcrypt.hashpw(password.encode(), hashed.encode()) == hashed.encode() + return ret + + +@dataclass(kw_only=True) +class User(BaseUser): + uuid: UserId = field(default_factory=uuid_lib.uuid4) diff --git a/src/auth/domain/entities/value_objects.py b/src/auth/domain/entities/value_objects.py new file mode 100644 index 0000000..fa36a74 --- /dev/null +++ b/src/auth/domain/entities/value_objects.py @@ -0,0 +1,4 @@ +import uuid + + +UserId = uuid.UUID diff --git a/src/auth/domain/ports/__init__.py b/src/auth/domain/ports/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/auth/domain/ports/repositories/__init__.py b/src/auth/domain/ports/repositories/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/auth/domain/ports/repositories/user.py b/src/auth/domain/ports/repositories/user.py new file mode 100644 index 0000000..65cc1d1 --- /dev/null +++ b/src/auth/domain/ports/repositories/user.py @@ -0,0 +1,28 @@ +from typing import Optional + +from pydantic import BaseModel, Field + +from auth.domain.entities.user import User +from shared.repository.ports.generic import AbstractRepository + + +class CreateUserInDTO(BaseModel): + email: str = Field(max_length=255) + first_name: str = Field(max_length=255) + last_name: Optional[str] = Field(max_length=255, default=None) + password: str + is_admin: bool = Field(default=False) + is_active: bool = Field(default=True) + + # Hauriem d'haver encriptat la contrasenya abans de guardar-la a la base de dades + + +class UpdatePartialUserInDTO(BaseModel): + email: Optional[str] = Field(max_length=255) + first_name: Optional[str] = Field(max_length=255) + last_name: Optional[str] = Field(max_length=255) + password: Optional[str] = Field(max_length=255) + + +class AbstractUserRepository(AbstractRepository[User, CreateUserInDTO, UpdatePartialUserInDTO]): + pass diff --git a/src/auth/domain/services/__init__.py b/src/auth/domain/services/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/auth/domain/services/token.py b/src/auth/domain/services/token.py new file mode 100644 index 0000000..98c7bf6 --- /dev/null +++ b/src/auth/domain/services/token.py @@ -0,0 +1,58 @@ +from datetime import datetime, timedelta +import logging +from typing import Literal, Optional, Type +import uuid + +from jose import JWTError, jwt + +from config import settings +from infra.cache.ports import AbstractCacheRepository + + +logguer = logging.getLogger(settings.APP_LOGGER_NAME) + + +class TokenService: + def __init__(self, cache_repository: Optional[AbstractCacheRepository] = None) -> None: + self.cache_repository = cache_repository + + @classmethod + def _create_token( + cls: Type['TokenService'], type_token: Literal['a', 'r'], subject: str, claims: dict, expiration_minutes: int + ) -> str: + now = datetime.utcnow() + expires = datetime.utcnow() + timedelta(minutes=expiration_minutes) + payload = { + 'type': type_token, + 'nbf': now, + 'iat': now, + 'exp': expires, + 'sub': subject, + 'jit': uuid.uuid4().hex, + } | claims + + return jwt.encode(payload | claims, settings.JWT_SECRET_KEY, settings.JWT_ALGORITHM) + + def create_access_token(self, subject: str, claims: dict) -> str: + return self._create_token('a', subject, claims, settings.ACCESS_TOKEN_EXPIRE_MINUTES) + + def create_refresh_token(self, subject: str, claims: dict) -> str: + return self._create_token('r', subject, claims, settings.REFRESH_TOKEN_EXPIRE_MINUTES) + + def decode_token(self, token: str) -> Optional[dict]: + claims = None + try: + claims = jwt.decode(token, settings.JWT_SECRET_KEY, algorithms=[settings.JWT_ALGORITHM]) + except JWTError: + logguer.debug('Token verification failed!', extra={'token': token}) + return claims + + async def revoke_access_token(self, token: str) -> None: + if not self.cache_repository: + raise ValueError('Cache repository not set!') + await self.cache_repository.set(token, 'true', settings.ACCESS_TOKEN_EXPIRE_MINUTES * 60) + + async def revoke_refresh_token(self, token: str) -> None: + if not self.cache_repository: + raise ValueError('Cache repository not set!') + await self.cache_repository.set(token, 'true', settings.REFRESH_TOKEN_EXPIRE_MINUTES * 60) diff --git a/src/auth/domain/services/user.py b/src/auth/domain/services/user.py new file mode 100644 index 0000000..4a1ca18 --- /dev/null +++ b/src/auth/domain/services/user.py @@ -0,0 +1,28 @@ +from typing import Type + +from pydantic import validator + +from auth.domain.entities.user import User +from auth.domain.ports.repositories.user import ( + AbstractUserRepository, + CreateUserInDTO as CreateUserInRepoDTO, +) + + +class CreateUserInDTO(CreateUserInRepoDTO): + @validator('password', pre=True, always=True) + @classmethod + def check_password(cls: Type['CreateUserInDTO'], v: str) -> str: + return User.encrypt_password(v) + + +class UserService: + def __init__(self, user_repository: AbstractUserRepository): + self.user_repository = user_repository + + async def create_user(self, user_in: CreateUserInDTO) -> User: + user_in_repo = CreateUserInRepoDTO(**user_in.model_dump()) + return await self.user_repository.create(user_in_repo) + + async def get_user_by_username(self, uuid: str) -> User: + return await self.user_repository.get_by_id(uuid) diff --git a/src/auth/domain/use_cases/__init__.py b/src/auth/domain/use_cases/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/auth/domain/use_cases/user.py b/src/auth/domain/use_cases/user.py new file mode 100644 index 0000000..980e211 --- /dev/null +++ b/src/auth/domain/use_cases/user.py @@ -0,0 +1,33 @@ +from auth.domain.entities.user import User +from auth.domain.services.user import CreateUserInDTO, UserService +from shared.exceptions import APPExceptionError +from shared.presenter import AbstractPresenter + + +class InvalidPasswordExceptionError(APPExceptionError): + status_code = 401 + code = 'invalid-password' + message = 'Invalid password' + + +class CreateUserUseCase: + def __init__(self, presenter: AbstractPresenter, service: UserService): + self.presenter = presenter + self.service = service + + async def execute(self, in_dto: CreateUserInDTO) -> None: + user = await self.service.create_user(in_dto) + await self.presenter.present(user) + + +class GetUserAndVerifyPasswordUseCase: + def __init__(self, presenter: AbstractPresenter, service: UserService): + self.presenter = presenter + self.service = service + + async def execute(self, username: str, password: str) -> None: + user = await self.service.get_user_by_username(username) + if not User.verify_password(password, user.password): + raise InvalidPasswordExceptionError() + + await self.presenter.present(user) diff --git a/src/auth/infra/__init__.py b/src/auth/infra/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/auth/infra/database/__init__.py b/src/auth/infra/database/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/auth/infra/database/sqlalchemy/__init__.py b/src/auth/infra/database/sqlalchemy/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/auth/infra/database/sqlalchemy/models/__init__.py b/src/auth/infra/database/sqlalchemy/models/__init__.py new file mode 100644 index 0000000..7b12cc3 --- /dev/null +++ b/src/auth/infra/database/sqlalchemy/models/__init__.py @@ -0,0 +1 @@ +from . import user # noqa diff --git a/src/auth/infra/database/sqlalchemy/models/user.py b/src/auth/infra/database/sqlalchemy/models/user.py new file mode 100644 index 0000000..3874411 --- /dev/null +++ b/src/auth/infra/database/sqlalchemy/models/user.py @@ -0,0 +1,21 @@ +import uuid + +from sqlalchemy.dialects.postgresql import UUID +from sqlalchemy.schema import Column, Table +from sqlalchemy.types import Boolean, Integer, String, Text + +from infra.database.sqlalchemy.sqlalchemy import metadata + + +users = Table( + 'auth_user', + metadata, + Column('id', Integer, primary_key=True), + Column('uuid', UUID(as_uuid=True), unique=True, nullable=False, default=uuid.uuid4), + Column('first_name', String(255), nullable=False), + Column('last_name', String(255), nullable=True), + Column('email', String(255), unique=True, nullable=False), + Column('password', Text(), nullable=False), + Column('is_active', Boolean(), nullable=False, default=True), + Column('is_admin', Boolean(), nullable=False, default=False), +) diff --git a/src/config/__init__.py b/src/config/__init__.py new file mode 100644 index 0000000..990a530 --- /dev/null +++ b/src/config/__init__.py @@ -0,0 +1,26 @@ +from pydantic_settings import BaseSettings + + +class Settings(BaseSettings): + PROJECT_NAME: str = 'Northwind API' + PROJECT_DESCRIPTION: str = 'Northwind API - PROOF OF CONCEPT' + VERSION: str = '0.1.0' + APP_LOGGER_NAME: str = 'northwind' + + APP_ENV: str = 'dev' + DEBUG: bool = False + + DATABASE_URL: str = 'postgresql+asyncpg://postgres:change-me@postgres:5432/postgres' + + ACCESS_TOKEN_EXPIRE_MINUTES: int = 30 # 30 minutes + REFRESH_TOKEN_EXPIRE_MINUTES: int = 60 * 24 * 7 # 7 days + JWT_ALGORITHM: str = 'HS256' + JWT_SECRET_KEY: str = 'change-me' + JWT_REFRESH_SECRET_KEY: str = 'change-me' + + REDIS_URL: str = 'redis://redis:6379/0' + REDIS_USER: str = 'default' + REDIS_PASSWORD: str = 'change-me' + + +settings = Settings() diff --git a/src/infra/__init__.py b/src/infra/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/infra/cache/__init__.py b/src/infra/cache/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/infra/cache/memory_cache.py b/src/infra/cache/memory_cache.py new file mode 100644 index 0000000..181ef30 --- /dev/null +++ b/src/infra/cache/memory_cache.py @@ -0,0 +1,38 @@ +from threading import RLock +import time +from typing import Any, Dict, Optional + +from infra.cache.ports import AbstractCacheRepository, EncodableT + + +class MemoryCache(AbstractCacheRepository): + def __init__(self) -> None: + self._data: Dict[str, tuple[EncodableT, float]] = {} + self.lock = RLock() + + async def init(self) -> None: + pass + + async def close(self) -> None: + with self.lock: + self._data = {} + + async def get(self, key: str) -> Any: + with self.lock: + ret = self._data.get(key) + if ret is not None: + if ret[1] < time.time(): + return ret[0] + self._data.pop(key, None) + return None + + async def set(self, key: str, value: Optional[EncodableT], expire: int) -> None: + with self.lock: + if value is None: + self._data.pop(key, None) + else: + self._data[key] = (value, time.time() + expire) + + async def delete(self, key: str) -> None: + with self.lock: + self._data.pop(key, None) diff --git a/src/infra/cache/ports.py b/src/infra/cache/ports.py new file mode 100644 index 0000000..6216e69 --- /dev/null +++ b/src/infra/cache/ports.py @@ -0,0 +1,27 @@ +import abc +from typing import Any, Optional, Union + + +EncodableT = Union[str, int, float, bytes] + + +class AbstractCacheRepository(abc.ABC): + @abc.abstractmethod + async def get(self, key: str) -> Any: + ... + + @abc.abstractmethod + async def set(self, key: str, value: Optional[EncodableT], expire: int) -> None: + ... + + @abc.abstractmethod + async def delete(self, key: str) -> None: + ... + + @abc.abstractmethod + async def init(self) -> None: + ... + + @abc.abstractmethod + async def close(self) -> None: + ... diff --git a/src/infra/cache/redis_cache.py b/src/infra/cache/redis_cache.py new file mode 100644 index 0000000..4cad1cc --- /dev/null +++ b/src/infra/cache/redis_cache.py @@ -0,0 +1,50 @@ +from typing import Any, Optional + +from redis import ( + asyncio as aioredis, +) + +from infra.cache.ports import AbstractCacheRepository, EncodableT +from utils.singleton import singleton + + +@singleton +class RedisCache(AbstractCacheRepository): + def __init__(self, url: str, user: str, password: str) -> None: + self.redis: Optional[aioredis.Redis] = None + self.url = url + self.user = user + self.password = password + + async def init(self) -> None: + self.redis = await aioredis.from_url( + self.url, + username=self.user, + password=self.password, + max_connections=10, + decode_responses=True, + ) + + async def get_redis(self) -> aioredis.Redis: + if self.redis is None: + await self.init() + if self.redis is None: + raise Exception('Redis not initialized') + return self.redis + + async def close(self) -> None: + await (await self.get_redis()).connection_pool.disconnect() + + async def get(self, key: str) -> Any: + return await (await self.get_redis()).get(key) + + async def set(self, key: str, value: Optional[EncodableT], expire: int) -> None: + """expire: expiration in seconds""" + await self.get_redis() + if value is None: + await self.delete(key) + else: + await (await self.get_redis()).set(key, value, expire) + + async def delete(self, key: str) -> None: + await (await self.get_redis()).delete(key) diff --git a/src/infra/database/__init__.py b/src/infra/database/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/infra/database/alembic/env.py b/src/infra/database/alembic/env.py new file mode 100644 index 0000000..290db2b --- /dev/null +++ b/src/infra/database/alembic/env.py @@ -0,0 +1,103 @@ +import asyncio +from logging.config import fileConfig + +from alembic import context +from sqlalchemy import engine_from_config, pool +from sqlalchemy.engine import Connection +from sqlalchemy.ext.asyncio import AsyncEngine + +import auth.infra.database.sqlalchemy.models # noqa +from config import settings +from infra.database.sqlalchemy.sqlalchemy import metadata +import northwind.infra.database.sqlalchemy.models # noqa + + +# import northwind.infra.database.sqlalchemy.models + + +# this is the Alembic Config object, which provides +# access to the values within the .ini file in use. +config = context.config + +config.set_main_option('sqlalchemy.url', settings.DATABASE_URL) + +# Interpret the config file for Python logging. +# This line sets up loggers basically. +fileConfig(config.config_file_name) + + +# add your model's MetaData object here +# for 'autogenerate' support +# from myapp import mymodel +# target_metadata = mymodel.Base.metadata +# target_metadata = None + + +target_metadata = metadata + + +# other values from the config, defined by the needs of env.py, +# can be acquired: +# my_important_option = config.get_main_option("my_important_option") +# ... etc. + + +def run_migrations_offline() -> None: + """Run migrations in 'offline' mode. + + This configures the context with just a URL + and not an Engine, though an Engine is acceptable + here as well. By skipping the Engine creation + we don't even need a DBAPI to be available. + + Calls to context.execute() here emit the given string to the + script output. + + """ + url = config.get_main_option('sqlalchemy.url') + + context.configure( + url=url, + target_metadata=target_metadata, + literal_binds=True, + dialect_opts={'paramstyle': 'named'}, + transaction_per_migration=True, + ) + + with context.begin_transaction(): + context.run_migrations() + + +def do_run_migrations(connection: Connection) -> None: + context.configure(connection=connection, target_metadata=target_metadata) + + with context.begin_transaction(): + context.run_migrations() + + +async def run_migrations_online() -> None: + """Run migrations in 'online' mode. + + In this scenario we need to create an Engine + and associate a connection with the context. + + """ + connectable = AsyncEngine( + engine_from_config( + config.get_section(config.config_ini_section), + prefix='sqlalchemy.', + poolclass=pool.NullPool, + future=True, + ) + ) + + async with connectable.connect() as connection: + await connection.run_sync(do_run_migrations) + + await connectable.dispose() + + +if context.is_offline_mode(): + run_migrations_offline() +else: + asyncio.run(run_migrations_online()) diff --git a/src/infra/database/alembic/script.py.mako b/src/infra/database/alembic/script.py.mako new file mode 100644 index 0000000..55df286 --- /dev/null +++ b/src/infra/database/alembic/script.py.mako @@ -0,0 +1,24 @@ +"""${message} + +Revision ID: ${up_revision} +Revises: ${down_revision | comma,n} +Create Date: ${create_date} + +""" +from alembic import op +import sqlalchemy as sa +${imports if imports else ""} + +# revision identifiers, used by Alembic. +revision = ${repr(up_revision)} +down_revision = ${repr(down_revision)} +branch_labels = ${repr(branch_labels)} +depends_on = ${repr(depends_on)} + + +def upgrade() -> None: + ${upgrades if upgrades else "pass"} + + +def downgrade() -> None: + ${downgrades if downgrades else "pass"} diff --git a/src/infra/database/alembic/versions/82107b1b46b7_add_northwind_models.py b/src/infra/database/alembic/versions/82107b1b46b7_add_northwind_models.py new file mode 100644 index 0000000..2d9b327 --- /dev/null +++ b/src/infra/database/alembic/versions/82107b1b46b7_add_northwind_models.py @@ -0,0 +1,207 @@ +"""add northwind models + +Revision ID: 82107b1b46b7 +Revises: ec48bb74a747 +Create Date: 2024-01-01 07:56:14.455308 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '82107b1b46b7' +down_revision = 'ec48bb74a747' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table( + 'categories', + sa.Column('category_id', sa.Integer(), nullable=False), + sa.Column('category_name', sa.String(length=15), nullable=False), + sa.Column('description', sa.Text(), nullable=True), + sa.Column('picture', sa.LargeBinary(), nullable=True), + sa.PrimaryKeyConstraint('category_id', name='categories_pkey'), + ) + op.create_table( + 'customer_demographics', + sa.Column('customer_type_id', sa.String(length=5), nullable=False), + sa.Column('customer_desc', sa.Text(), nullable=True), + sa.PrimaryKeyConstraint('customer_type_id', name='pk_customer_demographics'), + ) + op.create_table( + 'customers', + sa.Column('customer_id', sa.String(length=5), nullable=False), + sa.Column('company_name', sa.String(length=40), nullable=False), + sa.Column('contact_name', sa.String(length=30), nullable=True), + sa.Column('contact_title', sa.String(length=30), nullable=True), + sa.Column('address', sa.String(length=60), nullable=True), + sa.Column('city', sa.String(length=15), nullable=True), + sa.Column('region', sa.String(length=15), nullable=True), + sa.Column('postal_code', sa.String(length=10), nullable=True), + sa.Column('country', sa.String(length=15), nullable=True), + sa.Column('phone', sa.String(length=24), nullable=True), + sa.Column('fax', sa.String(length=24), nullable=True), + sa.PrimaryKeyConstraint('customer_id', name='pk_customers'), + ) + op.create_table( + 'employees', + sa.Column('employee_id', sa.Integer(), nullable=False), + sa.Column('last_name', sa.String(length=20), nullable=False), + sa.Column('first_name', sa.String(length=10), nullable=False), + sa.Column('title', sa.String(length=30), nullable=True), + sa.Column('title_of_courtesy', sa.String(length=25), nullable=True), + sa.Column('birth_date', sa.Date(), nullable=True), + sa.Column('hire_date', sa.Date(), nullable=True), + sa.Column('address', sa.String(length=60), nullable=True), + sa.Column('city', sa.String(length=15), nullable=True), + sa.Column('region', sa.String(length=15), nullable=True), + sa.Column('postal_code', sa.String(length=10), nullable=True), + sa.Column('country', sa.String(length=15), nullable=True), + sa.Column('home_phone', sa.String(length=24), nullable=True), + sa.Column('extension', sa.String(length=4), nullable=True), + sa.Column('photo', sa.LargeBinary(), nullable=True), + sa.Column('notes', sa.Text(), nullable=True), + sa.Column('reports_to', sa.SmallInteger(), nullable=True), + sa.Column('photo_path', sa.String(length=255), nullable=True), + sa.ForeignKeyConstraint(['reports_to'], ['employees.employee_id'], name='fk_employees_employees'), + sa.PrimaryKeyConstraint('employee_id', name='employees_pkey'), + ) + op.create_table( + 'region', + sa.Column('region_id', sa.Integer(), nullable=False), + sa.Column('region_description', sa.String(length=60), nullable=False), + sa.PrimaryKeyConstraint('region_id', name='region_pkey'), + ) + op.create_table( + 'shippers', + sa.Column('shipper_id', sa.Integer(), nullable=False), + sa.Column('company_name', sa.String(length=40), nullable=False), + sa.Column('phone', sa.String(length=24), nullable=True), + sa.PrimaryKeyConstraint('shipper_id', name='shippers_pkey'), + ) + op.create_table( + 'suppliers', + sa.Column('supplier_id', sa.Integer(), nullable=False), + sa.Column('company_name', sa.String(length=40), nullable=False), + sa.Column('contact_name', sa.String(length=30), nullable=True), + sa.Column('contact_title', sa.String(length=30), nullable=True), + sa.Column('address', sa.String(length=60), nullable=True), + sa.Column('city', sa.String(length=15), nullable=True), + sa.Column('region', sa.String(length=15), nullable=True), + sa.Column('postal_code', sa.String(length=10), nullable=True), + sa.Column('country', sa.String(length=15), nullable=True), + sa.Column('phone', sa.String(length=24), nullable=True), + sa.Column('fax', sa.String(length=24), nullable=True), + sa.Column('homepage', sa.Text(), nullable=True), + sa.PrimaryKeyConstraint('supplier_id', name='suppliers_pkey'), + ) + op.create_table( + 'us_states', + sa.Column('state_id', sa.Integer(), nullable=False), + sa.Column('state_name', sa.String(length=100), nullable=True), + sa.Column('state_abbr', sa.String(length=2), nullable=True), + sa.Column('state_region', sa.String(length=50), nullable=True), + sa.PrimaryKeyConstraint('state_id', name='us_states_pkey'), + ) + op.create_table( + 'customer_customer_demo', + sa.Column('customer_id', sa.String(length=5), nullable=False), + sa.Column('customer_type_id', sa.String(length=5), nullable=False), + sa.ForeignKeyConstraint(['customer_id'], ['customers.customer_id'], name='fk_customer_customer_demo_customers'), + sa.ForeignKeyConstraint( + ['customer_type_id'], + ['customer_demographics.customer_type_id'], + name='fk_customer_customer_demo_customer_demographics', + ), + sa.PrimaryKeyConstraint('customer_id', 'customer_type_id', name='pk_customer_customer_demo'), + ) + op.create_table( + 'orders', + sa.Column('order_id', sa.Integer(), nullable=False), + sa.Column('customer_id', sa.String(length=5), nullable=True), + sa.Column('employee_id', sa.SmallInteger(), nullable=True), + sa.Column('order_date', sa.Date(), nullable=True), + sa.Column('required_date', sa.Date(), nullable=True), + sa.Column('shipped_date', sa.Date(), nullable=True), + sa.Column('ship_via', sa.SmallInteger(), nullable=True), + sa.Column('freight', sa.Float(), nullable=True), + sa.Column('ship_name', sa.String(length=40), nullable=True), + sa.Column('ship_address', sa.String(length=60), nullable=True), + sa.Column('ship_city', sa.String(length=15), nullable=True), + sa.Column('ship_region', sa.String(length=15), nullable=True), + sa.Column('ship_postal_code', sa.String(length=10), nullable=True), + sa.Column('ship_country', sa.String(length=15), nullable=True), + sa.ForeignKeyConstraint(['customer_id'], ['customers.customer_id'], name='fk_orders_customers'), + sa.ForeignKeyConstraint(['employee_id'], ['employees.employee_id'], name='fk_orders_employees'), + sa.ForeignKeyConstraint(['ship_via'], ['shippers.shipper_id'], name='fk_orders_shippers'), + sa.PrimaryKeyConstraint('order_id', name='orders_pkey'), + ) + op.create_table( + 'products', + sa.Column('product_id', sa.Integer(), nullable=False), + sa.Column('product_name', sa.String(length=40), nullable=False), + sa.Column('supplier_id', sa.SmallInteger(), nullable=True), + sa.Column('category_id', sa.SmallInteger(), nullable=True), + sa.Column('quantity_per_unit', sa.String(length=20), nullable=True), + sa.Column('unit_price', sa.Float(), nullable=True), + sa.Column('units_in_stock', sa.SmallInteger(), nullable=True), + sa.Column('units_on_order', sa.SmallInteger(), nullable=True), + sa.Column('reorder_level', sa.SmallInteger(), nullable=True), + sa.Column('discontinued', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['category_id'], ['categories.category_id'], name='fk_products_categories'), + sa.ForeignKeyConstraint(['supplier_id'], ['suppliers.supplier_id'], name='fk_products_suppliers'), + sa.PrimaryKeyConstraint('product_id', name='products_pkey'), + ) + op.create_table( + 'territories', + sa.Column('territory_id', sa.String(length=20), nullable=False), + sa.Column('territory_description', sa.String(length=60), nullable=False), + sa.Column('region_id', sa.SmallInteger(), nullable=False), + sa.ForeignKeyConstraint(['region_id'], ['region.region_id'], name='fk_territories_region'), + sa.PrimaryKeyConstraint('territory_id', name='pk_territories'), + ) + op.create_table( + 'employee_territories', + sa.Column('employee_id', sa.SmallInteger(), nullable=False), + sa.Column('territory_id', sa.String(length=20), nullable=False), + sa.ForeignKeyConstraint(['employee_id'], ['employees.employee_id'], name='fk_employee_territories_employees'), + sa.ForeignKeyConstraint( + ['territory_id'], ['territories.territory_id'], name='fk_employee_territories_territories' + ), + sa.PrimaryKeyConstraint('employee_id', 'territory_id', name='pk_employee_territories'), + ) + op.create_table( + 'order_details', + sa.Column('order_id', sa.SmallInteger(), nullable=False), + sa.Column('product_id', sa.SmallInteger(), nullable=False), + sa.Column('unit_price', sa.Float(), nullable=False), + sa.Column('quantity', sa.SmallInteger(), nullable=False), + sa.Column('discount', sa.Float(), nullable=False), + sa.ForeignKeyConstraint(['order_id'], ['orders.order_id'], name='fk_order_details_orders'), + sa.ForeignKeyConstraint(['product_id'], ['products.product_id'], name='fk_order_details_products'), + sa.PrimaryKeyConstraint('order_id', 'product_id', name='pk_order_details'), + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('order_details') + op.drop_table('employee_territories') + op.drop_table('territories') + op.drop_table('products') + op.drop_table('orders') + op.drop_table('customer_customer_demo') + op.drop_table('us_states') + op.drop_table('suppliers') + op.drop_table('shippers') + op.drop_table('region') + op.drop_table('employees') + op.drop_table('customers') + op.drop_table('customer_demographics') + op.drop_table('categories') + # ### end Alembic commands ### diff --git a/src/infra/database/alembic/versions/ec48bb74a747_init.py b/src/infra/database/alembic/versions/ec48bb74a747_init.py new file mode 100644 index 0000000..0fc9e75 --- /dev/null +++ b/src/infra/database/alembic/versions/ec48bb74a747_init.py @@ -0,0 +1,41 @@ +"""init + +Revision ID: ec48bb74a747 +Revises: +Create Date: 2023-12-27 08:06:48.964137 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'ec48bb74a747' +down_revision = None +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table( + 'auth_user', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('uuid', sa.UUID(), nullable=False), # type: ignore + sa.Column('first_name', sa.String(length=255), nullable=False), + sa.Column('last_name', sa.String(length=255), nullable=True), + sa.Column('email', sa.String(length=255), nullable=False), + sa.Column('password', sa.Text(), nullable=False), + sa.Column('is_active', sa.Boolean(), nullable=False), + sa.Column('is_admin', sa.Boolean(), nullable=False), + sa.PrimaryKeyConstraint('id', name=op.f('pk_auth_user')), + sa.UniqueConstraint('email', name=op.f('uq_auth_user_email')), + sa.UniqueConstraint('uuid', name=op.f('uq_auth_user_uuid')), + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('auth_user') + # ### end Alembic commands ### diff --git a/src/infra/database/sqlalchemy/__init__.py b/src/infra/database/sqlalchemy/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/infra/database/sqlalchemy/models/__init__.py b/src/infra/database/sqlalchemy/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/infra/database/sqlalchemy/session.py b/src/infra/database/sqlalchemy/session.py new file mode 100644 index 0000000..2c01c98 --- /dev/null +++ b/src/infra/database/sqlalchemy/session.py @@ -0,0 +1,79 @@ +import abc +from contextlib import asynccontextmanager +import contextvars +import logging +import os +from typing import TYPE_CHECKING, Any, AsyncContextManager, AsyncIterator, Dict, Final, Optional, cast + +from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine +from sqlalchemy.orm import sessionmaker + +from config import settings + + +# from utils.singleton import singleton + + +if TYPE_CHECKING: + from sqlalchemy.ext.asyncio.engine import AsyncEngine + + +logger = logging.getLogger(__name__) + + +db_session_context: contextvars.ContextVar = contextvars.ContextVar('db_ctx', default={'session': None, 'level': 0}) + + +SA_ECHO: Final[bool] = os.getenv('SA_ECHO', 'False').lower() == 'true' + + +class AbstractDatabase(abc.ABC): + @abc.abstractmethod + def session(self) -> AsyncContextManager[AsyncSession]: + ... + + +# @singleton +class Database(AbstractDatabase): + def __init__(self) -> None: + self.engine: AsyncEngine = create_async_engine(settings.DATABASE_URL, echo=SA_ECHO, future=True) + self._session_factory: sessionmaker = sessionmaker( + self.engine, class_=AsyncSession, autocommit=False, autoflush=False, expire_on_commit=False + ) + + @asynccontextmanager + async def session(self) -> AsyncIterator[AsyncSession]: + db_session: Optional[Dict[str, Any]] = None + db_session = db_session_context.get() or {'session': None, 'level': 0} + if db_session['level'] == 0: + session: AsyncSession = cast(AsyncSession, self._session_factory()) + db_session['session'] = session + await session.begin() + logger.debug('session begin', extra={'level': db_session['level']}) + + else: + session = db_session['session'] + db_session['level'] = (db_session['level'] or 0) + 1 + db_session_context.set(db_session) + + try: + yield session + except Exception: + logger.exception('Session rollback because of exception') + await session.rollback() + logger.debug('session rollback') + raise + else: + # db_session = db_session_context.get() or {'session': None, 'level': 0} + if db_session['level'] == 0: + await session.commit() + logger.debug('session commit', extra={'level': db_session['level']}) + finally: + # db_session = db_session_context.get() or {'session': None, 'level': 0} + if db_session['level'] == 0: + await session.close() + logger.debug('session close', extra={'level': db_session['level']}) + db_session_context.set(None) + else: + db_session['level'] = (db_session['level'] or 0) - 1 + db_session_context.set(db_session) diff --git a/src/infra/database/sqlalchemy/sqlalchemy.py b/src/infra/database/sqlalchemy/sqlalchemy.py new file mode 100644 index 0000000..452c7d8 --- /dev/null +++ b/src/infra/database/sqlalchemy/sqlalchemy.py @@ -0,0 +1,12 @@ +from sqlalchemy.schema import MetaData + + +metadata = MetaData( + naming_convention={ + 'ix': 'ix_%(column_0_label)s', + 'uq': 'uq_%(table_name)s_%(column_0_name)s', + 'ck': 'ck_%(table_name)s_%(constraint_name)s', + 'fk': 'fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s', + 'pk': 'pk_%(table_name)s', + } +) diff --git a/src/logging.dev.yaml b/src/logging.dev.yaml new file mode 100644 index 0000000..e67ffbc --- /dev/null +++ b/src/logging.dev.yaml @@ -0,0 +1,52 @@ +version: 1 +disable_existing_loggers: False + +formatters: + standard_extra: + format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s" + error: + format: "%(levelname)s %(name)s.%(funcName)s(): %(message)s" + colored_extra: + class: utils.logger.formatter.color_extra.ColorFormatterExtra + format: "%(asctime)s.%(msecs)03d | %(log_color)s%(levelname)s:%(name)s:%(message)s %(reset)s %(module)s.%(funcName)s" + datefmt: "%Y-%m-%d %H:%M:%S" + +handlers: + console: + class: logging.StreamHandler + level: DEBUG + stream: ext://sys.stdout + formatter: colored_extra + +root: + level: DEBUG + handlers: [console] + propagate: yes + +loggers: + requests: + level: INFO + sqlalchemy: + level: WARNING + uvicorn: + level: INFO + uvicorn.error: + level: INFO + uvicorn.access: + level: INFO + gunicorn: + level: INFO + botocore: + level: WARNING + aiormq: + level: ERROR + urllib3: + level: ERROR + aio_pika: + level: INFO + infra.database.sqlalchemy.session: + level: INFO + sqlalchemy.engine: + level: ERROR + faker.factory: + level: ERROR diff --git a/src/manage.py b/src/manage.py new file mode 100644 index 0000000..a137cf4 --- /dev/null +++ b/src/manage.py @@ -0,0 +1,31 @@ +import click + +import auth.adapters.api.cli + +# import core.adapters.api.cli +from utils.async_utils import async_exec + + +@click.group() +def cli_app() -> None: + pass + + +# for command in core.adapters.api.cli.commands: +# cli_app.command()(command) + +for command in auth.adapters.api.cli.commands: + cli_app.command()(command) + + +async def _test() -> None: + click.echo('Manage is working fine') + + +@cli_app.command() +def test() -> None: + async_exec(_test) + + +if __name__ == '__main__': + cli_app() diff --git a/src/misc/__init__.py b/src/misc/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/northwind/__init__.py b/src/northwind/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/northwind/adapters/__init__.py b/src/northwind/adapters/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/northwind/adapters/api/__init__.py b/src/northwind/adapters/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/northwind/adapters/api/http/__init__.py b/src/northwind/adapters/api/http/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/northwind/adapters/api/http/category.py b/src/northwind/adapters/api/http/category.py new file mode 100644 index 0000000..0b78a5e --- /dev/null +++ b/src/northwind/adapters/api/http/category.py @@ -0,0 +1,141 @@ +from fastapi import Depends +from fastapi.responses import JSONResponse +from fastapi.routing import APIRouter + +from app.app_container import AppContainer +from app.exceptions import EmptyPayloadExceptionError +from app.schemas import Session +from app.session_deps import check_access_token, is_admin_session +from northwind.adapters.api.http.presenters.category import CategoryPagedListPresenter, CategoryPresenter +from northwind.adapters.api.http.schemas.category import ( + CategoryListPagedResponse, + CategoryResponse, + CreateCategoryRequestDTO, + CreateCategoryResponseDTO, + UpdateCategoryRequestDTO, + UpdatePartialCategoryRequestDTO, +) +from northwind.domain.entities.category import Category +from northwind.domain.services.category import Categorieservice +from northwind.domain.use_cases.category import ( + CreateCategoryUseCase, + GetCategoriesUseCase, + GetCategoryUseCase, + UpdateCategoryUseCase, +) +from northwind.schemas.category import CreateCategoryInDTO, UpdatePartialCategoryInDTO +from shared.api.schemas.page import PageParams + + +router = APIRouter(prefix='/category') + + +@router.get( + '/{id}', + responses={ + 200: {'description': 'Successful Response'}, + 404: {'description': 'Category not found'}, + 422: {'description': 'Unprocessable Entity'}, + }, +) +async def get_category( + id: int, + container: AppContainer = Depends(AppContainer), + _: Session = Depends(check_access_token), +) -> CategoryResponse: + service = Categorieservice(container.category_repository) + presenter = CategoryPresenter() + usecase = GetCategoryUseCase(presenter, service) + await usecase.execute(id) + return presenter.result + + +@router.get( + '', + responses={ + 200: {'description': 'Successful Response'}, + 422: {'description': 'Unprocessable Entity'}, + }, +) +async def list_categories( + page_params: PageParams = Depends(), + container: AppContainer = Depends(AppContainer), + _: Session = Depends(check_access_token), +) -> CategoryListPagedResponse: + service = Categorieservice(container.category_repository) + presenter = CategoryPagedListPresenter(page_params) + usecase = GetCategoriesUseCase(presenter, service) + await usecase.execute(page_params) + return presenter.result + + +@router.post( + '', + response_class=JSONResponse, + response_model=CreateCategoryResponseDTO, + status_code=201, + responses={ + 201: {'description': 'Item created'}, + 422: {'description': 'Unprocessable Entity'}, + }, +) +async def create_category( + request_data: CreateCategoryRequestDTO, + container: AppContainer = Depends(AppContainer), + _: Session = Depends(is_admin_session), +) -> Category: + in_dto = CreateCategoryInDTO.model_validate(request_data.model_dump()) + service = Categorieservice(container.category_repository) + presenter = CategoryPresenter() + usecase = CreateCategoryUseCase(presenter, service) + await usecase.execute(in_dto) + return presenter.result + + +@router.put( + '/{id}', + responses={ + 200: {'description': 'Item updated'}, + 404: {'description': 'Item not found'}, + 422: {'description': 'Unprocessable Entity'}, + }, +) +async def update_category( + id: int, + request_data: UpdateCategoryRequestDTO, + container: AppContainer = Depends(AppContainer), + _: Session = Depends(is_admin_session), +) -> CategoryResponse: + in_data = request_data.model_dump() + in_dto = UpdatePartialCategoryInDTO.model_validate(in_data) + service = Categorieservice(container.category_repository) + presenter = CategoryPresenter() + usecase = UpdateCategoryUseCase(presenter, service) + await usecase.execute(id, in_dto) + return presenter.result + + +@router.patch( + '/{id}', + responses={ + 200: {'description': 'Item updated'}, + 404: {'description': 'Item not found'}, + 422: {'description': 'Unprocessable Entity'}, + }, +) +async def update_category_partially( + id: int, + request_data: UpdatePartialCategoryRequestDTO, + container: AppContainer = Depends(AppContainer), + _: Session = Depends(is_admin_session), +) -> CategoryResponse: + in_data = request_data.model_dump(exclude_unset=True) + if not in_data.keys(): + raise EmptyPayloadExceptionError() + in_dto = UpdatePartialCategoryInDTO.model_validate(in_data) + + service = Categorieservice(container.category_repository) + presenter = CategoryPresenter() + usecase = UpdateCategoryUseCase(presenter, service) + await usecase.execute(id, in_dto) + return presenter.result diff --git a/src/northwind/adapters/api/http/presenters/category.py b/src/northwind/adapters/api/http/presenters/category.py new file mode 100644 index 0000000..6f717d3 --- /dev/null +++ b/src/northwind/adapters/api/http/presenters/category.py @@ -0,0 +1,29 @@ +from typing import List + +from northwind.adapters.api.http.schemas.category import CategoryListPagedResponse, CategoryResponse +from northwind.domain.entities.category import Category +from shared.api.schemas.page import PageParams +from shared.presenter import AbstractPresenter + + +class CategoryPresenter(AbstractPresenter[Category, CategoryResponse]): + result: CategoryResponse + + async def present(self, data: Category) -> None: + self.result = CategoryResponse.model_validate(data, from_attributes=True) + + +class CategoryPagedListPresenter(AbstractPresenter[List[Category], List[CategoryResponse]]): + result: CategoryListPagedResponse + + def __init__(self, page_params: PageParams) -> None: + self.page_params = page_params + + async def present(self, data: List[Category]) -> None: + list_items = [CategoryResponse.model_validate(item, from_attributes=True) for item in data] + self.result = CategoryListPagedResponse( + results=list_items, + total=len(list_items), + page=self.page_params.page, + size=self.page_params.size, + ) diff --git a/src/northwind/adapters/api/http/presenters/product.py b/src/northwind/adapters/api/http/presenters/product.py new file mode 100644 index 0000000..c62bbd5 --- /dev/null +++ b/src/northwind/adapters/api/http/presenters/product.py @@ -0,0 +1,29 @@ +from typing import List + +from northwind.adapters.api.http.schemas.product import ProductListPagedResponse, ProductResponse +from northwind.domain.entities.product import Product +from shared.api.schemas.page import PageParams +from shared.presenter import AbstractPresenter + + +class ProductPresenter(AbstractPresenter[Product, ProductResponse]): + result: ProductResponse + + async def present(self, data: Product) -> None: + self.result = ProductResponse.model_validate(data, from_attributes=True) + + +class ProductPagedListPresenter(AbstractPresenter[List[Product], List[ProductResponse]]): + result: ProductListPagedResponse + + def __init__(self, page_params: PageParams) -> None: + self.page_params = page_params + + async def present(self, data: List[Product]) -> None: + list_items = [ProductResponse.model_validate(item, from_attributes=True) for item in data] + self.result = ProductListPagedResponse( + results=list_items, + total=len(list_items), + page=self.page_params.page, + size=self.page_params.size, + ) diff --git a/src/northwind/adapters/api/http/presenters/supplier.py b/src/northwind/adapters/api/http/presenters/supplier.py new file mode 100644 index 0000000..0032e58 --- /dev/null +++ b/src/northwind/adapters/api/http/presenters/supplier.py @@ -0,0 +1,29 @@ +from typing import List + +from northwind.adapters.api.http.schemas.supplier import SupplierListPagedResponse, SupplierResponse +from northwind.domain.entities.supplier import Supplier +from shared.api.schemas.page import PageParams +from shared.presenter import AbstractPresenter + + +class SupplierPresenter(AbstractPresenter[Supplier, SupplierResponse]): + result: SupplierResponse + + async def present(self, data: Supplier) -> None: + self.result = SupplierResponse.model_validate(data, from_attributes=True) + + +class SupplierPagedListPresenter(AbstractPresenter[List[Supplier], List[SupplierResponse]]): + result: SupplierListPagedResponse + + def __init__(self, page_params: PageParams) -> None: + self.page_params = page_params + + async def present(self, data: List[Supplier]) -> None: + list_items = [SupplierResponse.model_validate(item, from_attributes=True) for item in data] + self.result = SupplierListPagedResponse( + results=list_items, + total=len(list_items), + page=self.page_params.page, + size=self.page_params.size, + ) diff --git a/src/northwind/adapters/api/http/product.py b/src/northwind/adapters/api/http/product.py new file mode 100644 index 0000000..6a52280 --- /dev/null +++ b/src/northwind/adapters/api/http/product.py @@ -0,0 +1,142 @@ +from fastapi import Depends +from fastapi.responses import JSONResponse +from fastapi.routing import APIRouter + +from app.app_container import AppContainer +from app.exceptions import EmptyPayloadExceptionError +from app.schemas import Session +from app.session_deps import is_admin_session +from northwind.adapters.api.http.presenters.product import ( + ProductPagedListPresenter, + ProductPresenter, +) +from northwind.adapters.api.http.schemas.product import ( + CreateProductRequestDTO, + CreateProductResponseDTO, + ProductListPagedResponse, + ProductResponse, + UpdatePartialProductRequestDTO, + UpdateProductRequestDTO, +) +from northwind.domain.entities.product import Product +from northwind.domain.services.product import ProductService +from northwind.domain.use_cases.product import ( + CreateProductUseCase, + GetProductsUseCase, + GetProductUseCase, + UpdateProductUseCase, +) +from northwind.schemas.product import CreateProductInDTO, UpdatePartialProductInDTO +from shared.api.schemas.page import PageParams + + +router = APIRouter(prefix='/product') + + +@router.get( + '/{uuid}', + responses={ + 200: {'description': 'Successful Response'}, + 404: {'description': 'Product not found'}, + 422: {'description': 'Unprocessable Entity'}, + }, +) +async def get_product( + id: int, + container: AppContainer = Depends(AppContainer), +) -> ProductResponse: + service = ProductService(container.product_repository) + presenter = ProductPresenter() + usecase = GetProductUseCase(presenter, service) + await usecase.execute(id) + return presenter.result + + +@router.get( + '', + responses={ + 200: {'description': 'Successful Response'}, + 422: {'description': 'Unprocessable Entity'}, + }, +) +async def list_products( + page_params: PageParams = Depends(), + container: AppContainer = Depends(AppContainer), +) -> ProductListPagedResponse: + service = ProductService(container.product_repository) + presenter = ProductPagedListPresenter(page_params) + usecase = GetProductsUseCase(presenter, service) + await usecase.execute(page_params) + return presenter.result + + +@router.post( + '', + response_class=JSONResponse, + response_model=CreateProductResponseDTO, + status_code=201, + responses={ + 201: {'description': 'Item created'}, + 422: {'description': 'Unprocessable Entity'}, + }, +) +async def create_product( + request_data: CreateProductRequestDTO, + container: AppContainer = Depends(AppContainer), + _: Session = Depends(is_admin_session), +) -> Product: + in_dto = CreateProductInDTO.model_validate(request_data.model_dump()) + service = ProductService(container.product_repository) + presenter = ProductPresenter() + usecase = CreateProductUseCase(presenter, service) + await usecase.execute(in_dto) + return presenter.result + + +@router.put( + '/{id}', + responses={ + 200: {'description': 'Item updated'}, + 404: {'description': 'Item not found'}, + 422: {'description': 'Unprocessable Entity'}, + }, +) +async def update_product( + id: int, + request_data: UpdateProductRequestDTO, + container: AppContainer = Depends(AppContainer), + _: Session = Depends(is_admin_session), +) -> ProductResponse: + in_data = request_data.model_dump() + in_dto = UpdatePartialProductInDTO.model_validate(in_data) + service = ProductService(container.product_repository) + presenter = ProductPresenter() + usecase = UpdateProductUseCase(presenter, service) + await usecase.execute(id, in_dto) + return presenter.result + + +@router.patch( + '/{id}', + responses={ + 200: {'description': 'Item updated'}, + 404: {'description': 'Item not found'}, + 422: {'description': 'Unprocessable Entity'}, + }, +) +async def update_product_partially( + id: int, + request_data: UpdatePartialProductRequestDTO, + container: AppContainer = Depends(AppContainer), + _: Session = Depends(is_admin_session), +) -> ProductResponse: + in_data = request_data.model_dump(exclude_unset=True) + if not in_data.keys(): + raise EmptyPayloadExceptionError() + in_dto = UpdatePartialProductInDTO.model_validate(in_data) + + service = ProductService(container.product_repository) + presenter = ProductPresenter() + usecase = UpdateProductUseCase(presenter, service) + await usecase.execute(id, in_dto) + return presenter.result diff --git a/src/northwind/adapters/api/http/router.py b/src/northwind/adapters/api/http/router.py new file mode 100644 index 0000000..5084820 --- /dev/null +++ b/src/northwind/adapters/api/http/router.py @@ -0,0 +1,11 @@ +from fastapi.routing import APIRouter + +from .category import router as category_router +from .product import router as product_router +from .supplier import router as supplier_router + + +router = APIRouter(prefix='/northwind', tags=['northwind']) +router.include_router(category_router) +router.include_router(supplier_router) +router.include_router(product_router) diff --git a/src/northwind/adapters/api/http/schemas/__init__.py b/src/northwind/adapters/api/http/schemas/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/northwind/adapters/api/http/schemas/category.py b/src/northwind/adapters/api/http/schemas/category.py new file mode 100644 index 0000000..df384da --- /dev/null +++ b/src/northwind/adapters/api/http/schemas/category.py @@ -0,0 +1,32 @@ +from typing import Optional + +from pydantic import BaseModel, ConfigDict + +from northwind.schemas.category import CreateCategoryInDTO, UpdateCategoryInDTO, UpdatePartialCategoryInDTO +from shared.api.schemas.page import PagedResponseSchema + + +class CategoryResponse(BaseModel): + id: int + name: str + description: Optional[str] = None + + +class CategoryListPagedResponse(PagedResponseSchema[CategoryResponse]): + pass + + +class CreateCategoryRequestDTO(CreateCategoryInDTO): + model_config = ConfigDict(extra='ignore') + + +class CreateCategoryResponseDTO(CategoryResponse): + pass + + +class UpdateCategoryRequestDTO(UpdateCategoryInDTO): + model_config = ConfigDict(extra='ignore') + + +class UpdatePartialCategoryRequestDTO(UpdatePartialCategoryInDTO): + model_config = ConfigDict(extra='ignore') diff --git a/src/northwind/adapters/api/http/schemas/product.py b/src/northwind/adapters/api/http/schemas/product.py new file mode 100644 index 0000000..8bad61d --- /dev/null +++ b/src/northwind/adapters/api/http/schemas/product.py @@ -0,0 +1,49 @@ +from typing import Optional + +from pydantic import BaseModel, ConfigDict + +from northwind.schemas.product import CreateProductInDTO, UpdatePartialProductInDTO, UpdateProductInDTO +from shared.api.schemas.page import PagedResponseSchema + + +class Supplier(BaseModel): + id: int + company_name: str + + +class Category(BaseModel): + id: int + name: str + + +class ProductResponse(BaseModel): + id: int + name: str + supplier: Supplier + category: Category + quantity_per_unit: str + unit_price: float + units_in_stock: int + units_on_order: int + reorder_level: int + discontinued: Optional[int] = None + + +class ProductListPagedResponse(PagedResponseSchema[ProductResponse]): + pass + + +class CreateProductRequestDTO(CreateProductInDTO): + model_config = ConfigDict(extra='ignore') + + +class CreateProductResponseDTO(ProductResponse): + pass + + +class UpdateProductRequestDTO(UpdateProductInDTO): + model_config = ConfigDict(extra='ignore') + + +class UpdatePartialProductRequestDTO(UpdatePartialProductInDTO): + model_config = ConfigDict(extra='ignore') diff --git a/src/northwind/adapters/api/http/schemas/supplier.py b/src/northwind/adapters/api/http/schemas/supplier.py new file mode 100644 index 0000000..665fc22 --- /dev/null +++ b/src/northwind/adapters/api/http/schemas/supplier.py @@ -0,0 +1,41 @@ +from typing import Optional + +from pydantic import BaseModel, ConfigDict + +from northwind.schemas.supplier import CreateSupplierInDTO, UpdatePartialSupplierInDTO, UpdateSupplierInDTO +from shared.api.schemas.page import PagedResponseSchema + + +class SupplierResponse(BaseModel): + id: int + company_name: str + contact_name: Optional[str] = None + contact_title: Optional[str] = None + address: Optional[str] = None + city: Optional[str] = None + region: Optional[str] = None + postal_code: Optional[str] = None + country: Optional[str] = None + phone: Optional[str] = None + fax: Optional[str] = None + homepage: Optional[str] = None + + +class SupplierListPagedResponse(PagedResponseSchema[SupplierResponse]): + pass + + +class CreateSupplierRequestDTO(CreateSupplierInDTO): + model_config = ConfigDict(extra='ignore') + + +class CreateSupplierResponseDTO(SupplierResponse): + pass + + +class UpdateSupplierRequestDTO(UpdateSupplierInDTO): + model_config = ConfigDict(extra='ignore') + + +class UpdatePartialSupplierRequestDTO(UpdatePartialSupplierInDTO): + model_config = ConfigDict(extra='ignore') diff --git a/src/northwind/adapters/api/http/supplier.py b/src/northwind/adapters/api/http/supplier.py new file mode 100644 index 0000000..f0612a6 --- /dev/null +++ b/src/northwind/adapters/api/http/supplier.py @@ -0,0 +1,141 @@ +from fastapi import Depends +from fastapi.responses import JSONResponse +from fastapi.routing import APIRouter + +from app.app_container import AppContainer +from app.exceptions import EmptyPayloadExceptionError +from app.schemas import Session +from app.session_deps import check_access_token, is_admin_session +from northwind.adapters.api.http.presenters.supplier import SupplierPagedListPresenter, SupplierPresenter +from northwind.adapters.api.http.schemas.supplier import ( + CreateSupplierRequestDTO, + CreateSupplierResponseDTO, + SupplierListPagedResponse, + SupplierResponse, + UpdatePartialSupplierRequestDTO, + UpdateSupplierRequestDTO, +) +from northwind.domain.entities.supplier import Supplier +from northwind.domain.services.supplier import SupplierService +from northwind.domain.use_cases.supplier import ( + CreateSupplierUseCase, + GetSuppliersUseCase, + GetSupplierUseCase, + UpdateSupplierUseCase, +) +from northwind.schemas.supplier import CreateSupplierInDTO, UpdatePartialSupplierInDTO +from shared.api.schemas.page import PageParams + + +router = APIRouter(prefix='/supplier') + + +@router.get( + '/{id}', + responses={ + 200: {'description': 'Successful Response'}, + 404: {'description': 'Supplier not found'}, + 422: {'description': 'Unprocessable Entity'}, + }, +) +async def get_supplier( + id: int, + container: AppContainer = Depends(AppContainer), + _: Session = Depends(check_access_token), +) -> SupplierResponse: + service = SupplierService(container.supplier_repository) + presenter = SupplierPresenter() + usecase = GetSupplierUseCase(presenter, service) + await usecase.execute(id) + return presenter.result + + +@router.get( + '', + responses={ + 200: {'description': 'Successful Response'}, + 422: {'description': 'Unprocessable Entity'}, + }, +) +async def list_categories( + page_params: PageParams = Depends(), + container: AppContainer = Depends(AppContainer), + _: Session = Depends(check_access_token), +) -> SupplierListPagedResponse: + service = SupplierService(container.supplier_repository) + presenter = SupplierPagedListPresenter(page_params) + usecase = GetSuppliersUseCase(presenter, service) + await usecase.execute(page_params) + return presenter.result + + +@router.post( + '', + response_class=JSONResponse, + response_model=CreateSupplierResponseDTO, + status_code=201, + responses={ + 201: {'description': 'Item created'}, + 422: {'description': 'Unprocessable Entity'}, + }, +) +async def create_supplier( + request_data: CreateSupplierRequestDTO, + container: AppContainer = Depends(AppContainer), + _: Session = Depends(is_admin_session), +) -> Supplier: + in_dto = CreateSupplierInDTO.model_validate(request_data.model_dump()) + service = SupplierService(container.supplier_repository) + presenter = SupplierPresenter() + usecase = CreateSupplierUseCase(presenter, service) + await usecase.execute(in_dto) + return presenter.result + + +@router.put( + '/{id}', + responses={ + 200: {'description': 'Item updated'}, + 404: {'description': 'Item not found'}, + 422: {'description': 'Unprocessable Entity'}, + }, +) +async def update_supplier( + id: int, + request_data: UpdateSupplierRequestDTO, + container: AppContainer = Depends(AppContainer), + _: Session = Depends(is_admin_session), +) -> SupplierResponse: + in_data = request_data.model_dump() + in_dto = UpdatePartialSupplierInDTO.model_validate(in_data) + service = SupplierService(container.supplier_repository) + presenter = SupplierPresenter() + usecase = UpdateSupplierUseCase(presenter, service) + await usecase.execute(id, in_dto) + return presenter.result + + +@router.patch( + '/{id}', + responses={ + 200: {'description': 'Item updated'}, + 404: {'description': 'Item not found'}, + 422: {'description': 'Unprocessable Entity'}, + }, +) +async def update_supplier_partially( + id: int, + request_data: UpdatePartialSupplierRequestDTO, + container: AppContainer = Depends(AppContainer), + _: Session = Depends(is_admin_session), +) -> SupplierResponse: + in_data = request_data.model_dump(exclude_unset=True) + if not in_data.keys(): + raise EmptyPayloadExceptionError() + in_dto = UpdatePartialSupplierInDTO.model_validate(in_data) + + service = SupplierService(container.supplier_repository) + presenter = SupplierPresenter() + usecase = UpdateSupplierUseCase(presenter, service) + await usecase.execute(id, in_dto) + return presenter.result diff --git a/src/northwind/adapters/spi/__init__.py b/src/northwind/adapters/spi/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/northwind/adapters/spi/repositories/__init__.py b/src/northwind/adapters/spi/repositories/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/northwind/adapters/spi/repositories/category.py b/src/northwind/adapters/spi/repositories/category.py new file mode 100644 index 0000000..8e3c554 --- /dev/null +++ b/src/northwind/adapters/spi/repositories/category.py @@ -0,0 +1,26 @@ +from sqlalchemy.orm import registry + +from northwind.domain.entities.category import Category +from northwind.domain.ports.repositories.category import AbstractCategoryRepository +from northwind.infra.database.sqlalchemy.models import categories +from northwind.schemas.category import CreateCategoryInDTO, UpdatePartialCategoryInDTO +from shared.repository.sqlalchemy import SqlAlchemyRepository + + +mapper_registry = registry() +mapper_registry.map_imperatively( + Category, + categories, + properties={ + 'id': categories.c.category_id, + 'name': categories.c.category_name, + 'description': categories.c.description, + }, +) + + +class CategoryRepository( + SqlAlchemyRepository[Category, CreateCategoryInDTO, UpdatePartialCategoryInDTO], + AbstractCategoryRepository, +): + pass diff --git a/src/northwind/adapters/spi/repositories/product.py b/src/northwind/adapters/spi/repositories/product.py new file mode 100644 index 0000000..17aec11 --- /dev/null +++ b/src/northwind/adapters/spi/repositories/product.py @@ -0,0 +1,78 @@ +from typing import AsyncContextManager, Callable, Union + +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.orm import registry, relationship + +from northwind.domain.entities.category import Category +from northwind.domain.entities.product import Product +from northwind.domain.entities.supplier import Supplier +from northwind.domain.ports.repositories.category import AbstractCategoryRepository +from northwind.domain.ports.repositories.product import AbstractProductRepository +from northwind.domain.ports.repositories.supplier import AbstractSupplierRepository +from northwind.infra.database.sqlalchemy.models import products +from northwind.schemas.product import CreateProductInDTO, UpdatePartialProductInDTO +from shared.repository.sqlalchemy import SqlAlchemyRepository + + +mapper_registry = registry() +mapper_registry.map_imperatively( + Product, + products, + properties={ + 'id': products.c.product_id, + 'name': products.c.product_name, + 'category': relationship(Category, lazy='joined'), + 'supplier': relationship(Supplier, lazy='joined'), + }, +) + +AsyncSessionCtxT = Callable[[], AsyncContextManager[AsyncSession]] + + +class ProductRepository( + SqlAlchemyRepository[Product, CreateProductInDTO, UpdatePartialProductInDTO], + AbstractProductRepository, +): + def __init__( + self, + session: AsyncSessionCtxT, + category_repository: AbstractCategoryRepository, + supplier_repository: AbstractSupplierRepository, + ) -> None: + super().__init__(session) + self.category_repository = category_repository + self.supplier_repository = supplier_repository + + async def create(self, data: CreateProductInDTO) -> Product: + async with self.session_factory() as session: + in_data = data.model_dump(exclude={'category_id', 'supplier_id'}) + category = await self.category_repository.get_by_id(data.category_id) + supplier = await self.supplier_repository.get_by_id(data.supplier_id) + instance = self.entity(**in_data, category=category, supplier=supplier) + session.add(instance) + return await self.get_by_id(instance.id or -1) + + async def update(self, uuid: Union[str, int], data: UpdatePartialProductInDTO) -> Product: + object_id = int(uuid) if isinstance(uuid, str) else uuid + to_update = data.model_dump(exclude_unset=True) + if not to_update: + raise ValueError('No data to update') + + async with self.session_factory() as session: + instance = await self.get_by_id(object_id) + + for key, value in to_update.items(): + if key == 'category_id' and value != instance.category.id: + category = await self.category_repository.get_by_id(value) + instance.category = category + continue + if key == 'supplier_id' and value != instance.supplier.id: + supplier = await self.supplier_repository.get_by_id(value) + instance.supplier = supplier + continue + + setattr(instance, key, value) + + session.add(instance) + + return await self.get_by_id(object_id) diff --git a/src/northwind/adapters/spi/repositories/supplier.py b/src/northwind/adapters/spi/repositories/supplier.py new file mode 100644 index 0000000..94b77b0 --- /dev/null +++ b/src/northwind/adapters/spi/repositories/supplier.py @@ -0,0 +1,22 @@ +from sqlalchemy.orm import registry + +from northwind.domain.entities.supplier import Supplier +from northwind.domain.ports.repositories.supplier import AbstractSupplierRepository +from northwind.infra.database.sqlalchemy.models import suppliers +from northwind.schemas.supplier import CreateSupplierInDTO, UpdatePartialSupplierInDTO +from shared.repository.sqlalchemy import SqlAlchemyRepository + + +mapper_registry = registry() +mapper_registry.map_imperatively( + Supplier, + suppliers, + properties={'id': suppliers.c.supplier_id}, +) + + +class SupplierRepository( + SqlAlchemyRepository[Supplier, CreateSupplierInDTO, UpdatePartialSupplierInDTO], + AbstractSupplierRepository, +): + pass diff --git a/src/northwind/di/__init__.py b/src/northwind/di/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/northwind/di/mixins/__init__.py b/src/northwind/di/mixins/__init__.py new file mode 100644 index 0000000..f4e88b4 --- /dev/null +++ b/src/northwind/di/mixins/__init__.py @@ -0,0 +1,7 @@ +from northwind.di.mixins.category import CategoryContainerMixin +from northwind.di.mixins.product import ProductContainerMixin +from northwind.di.mixins.supplier import SupplierContainerMixin + + +class NorthwindContainerMixin(CategoryContainerMixin, ProductContainerMixin, SupplierContainerMixin): + pass diff --git a/src/northwind/di/mixins/category.py b/src/northwind/di/mixins/category.py new file mode 100644 index 0000000..3eb13e7 --- /dev/null +++ b/src/northwind/di/mixins/category.py @@ -0,0 +1,11 @@ +from infra.database.sqlalchemy.session import AbstractDatabase +from northwind.adapters.spi.repositories.category import CategoryRepository +from northwind.domain.ports.repositories.category import AbstractCategoryRepository + + +class CategoryContainerMixin: + db: AbstractDatabase + category_repository: AbstractCategoryRepository + + def _get_category_repository(self) -> AbstractCategoryRepository: + return CategoryRepository(self.db.session) diff --git a/src/northwind/di/mixins/product.py b/src/northwind/di/mixins/product.py new file mode 100644 index 0000000..724e36d --- /dev/null +++ b/src/northwind/di/mixins/product.py @@ -0,0 +1,15 @@ +from infra.database.sqlalchemy.session import AbstractDatabase +from northwind.adapters.spi.repositories.product import ProductRepository +from northwind.domain.ports.repositories.category import AbstractCategoryRepository +from northwind.domain.ports.repositories.product import AbstractProductRepository +from northwind.domain.ports.repositories.supplier import AbstractSupplierRepository + + +class ProductContainerMixin: + db: AbstractDatabase + product_repository: AbstractProductRepository + category_repository: AbstractCategoryRepository + supplier_repository: AbstractSupplierRepository + + def _get_product_repository(self) -> AbstractProductRepository: + return ProductRepository(self.db.session, self.category_repository, self.supplier_repository) diff --git a/src/northwind/di/mixins/supplier.py b/src/northwind/di/mixins/supplier.py new file mode 100644 index 0000000..faadb77 --- /dev/null +++ b/src/northwind/di/mixins/supplier.py @@ -0,0 +1,11 @@ +from infra.database.sqlalchemy.session import AbstractDatabase +from northwind.adapters.spi.repositories.supplier import SupplierRepository +from northwind.domain.ports.repositories.supplier import AbstractSupplierRepository + + +class SupplierContainerMixin: + db: AbstractDatabase + supplier_repository: AbstractSupplierRepository + + def _get_supplier_repository(self) -> AbstractSupplierRepository: + return SupplierRepository(self.db.session) diff --git a/src/northwind/domain/__init__.py b/src/northwind/domain/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/northwind/domain/entities/__init__.py b/src/northwind/domain/entities/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/northwind/domain/entities/category.py b/src/northwind/domain/entities/category.py new file mode 100644 index 0000000..7cccb17 --- /dev/null +++ b/src/northwind/domain/entities/category.py @@ -0,0 +1,11 @@ +from dataclasses import dataclass +from typing import Optional + +from northwind.domain.entities.value_objects import CategoryId + + +@dataclass(kw_only=True) +class Category: + id: Optional[CategoryId] = None + name: str + description: Optional[str] = None diff --git a/src/northwind/domain/entities/product.py b/src/northwind/domain/entities/product.py new file mode 100644 index 0000000..28c12e8 --- /dev/null +++ b/src/northwind/domain/entities/product.py @@ -0,0 +1,20 @@ +from dataclasses import dataclass +from typing import Optional + +from northwind.domain.entities.category import Category +from northwind.domain.entities.supplier import Supplier +from northwind.domain.entities.value_objects import ProductId + + +@dataclass(kw_only=True) +class Product: + id: Optional[ProductId] = None + name: str + supplier: Supplier + category: Category + quantity_per_unit: str + unit_price: float + units_in_stock: int + units_on_order: int + reorder_level: int + discontinued: Optional[int] = None diff --git a/src/northwind/domain/entities/supplier.py b/src/northwind/domain/entities/supplier.py new file mode 100644 index 0000000..426ab69 --- /dev/null +++ b/src/northwind/domain/entities/supplier.py @@ -0,0 +1,20 @@ +from dataclasses import dataclass +from typing import Optional + +from northwind.domain.entities.value_objects import SupplierId + + +@dataclass(kw_only=True) +class Supplier: + id: Optional[SupplierId] = None + company_name: str + contact_name: Optional[str] = None + contact_title: Optional[str] = None + address: Optional[str] = None + city: Optional[str] = None + region: Optional[str] = None + postal_code: Optional[str] = None + country: Optional[str] = None + phone: Optional[str] = None + fax: Optional[str] = None + homepage: Optional[str] = None diff --git a/src/northwind/domain/entities/value_objects.py b/src/northwind/domain/entities/value_objects.py new file mode 100644 index 0000000..5787a4f --- /dev/null +++ b/src/northwind/domain/entities/value_objects.py @@ -0,0 +1,3 @@ +CategoryId = int +ProductId = int +SupplierId = int diff --git a/src/northwind/domain/ports/__init__.py b/src/northwind/domain/ports/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/northwind/domain/ports/repositories/__init__.py b/src/northwind/domain/ports/repositories/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/northwind/domain/ports/repositories/category.py b/src/northwind/domain/ports/repositories/category.py new file mode 100644 index 0000000..94d72b8 --- /dev/null +++ b/src/northwind/domain/ports/repositories/category.py @@ -0,0 +1,7 @@ +from northwind.domain.entities.category import Category +from northwind.schemas.category import CreateCategoryInDTO, UpdatePartialCategoryInDTO +from shared.repository.ports.generic import AbstractRepository + + +class AbstractCategoryRepository(AbstractRepository[Category, CreateCategoryInDTO, UpdatePartialCategoryInDTO]): + key = 'id' diff --git a/src/northwind/domain/ports/repositories/product.py b/src/northwind/domain/ports/repositories/product.py new file mode 100644 index 0000000..44f938f --- /dev/null +++ b/src/northwind/domain/ports/repositories/product.py @@ -0,0 +1,7 @@ +from northwind.domain.entities.product import Product +from northwind.schemas.product import CreateProductInDTO, UpdatePartialProductInDTO +from shared.repository.ports.generic import AbstractRepository + + +class AbstractProductRepository(AbstractRepository[Product, CreateProductInDTO, UpdatePartialProductInDTO]): + key = 'id' diff --git a/src/northwind/domain/ports/repositories/supplier.py b/src/northwind/domain/ports/repositories/supplier.py new file mode 100644 index 0000000..92b2674 --- /dev/null +++ b/src/northwind/domain/ports/repositories/supplier.py @@ -0,0 +1,7 @@ +from northwind.domain.entities.supplier import Supplier +from northwind.schemas.supplier import CreateSupplierInDTO, UpdatePartialSupplierInDTO +from shared.repository.ports.generic import AbstractRepository + + +class AbstractSupplierRepository(AbstractRepository[Supplier, CreateSupplierInDTO, UpdatePartialSupplierInDTO]): + key = 'id' diff --git a/src/northwind/domain/services/__init__.py b/src/northwind/domain/services/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/northwind/domain/services/category.py b/src/northwind/domain/services/category.py new file mode 100644 index 0000000..15332ad --- /dev/null +++ b/src/northwind/domain/services/category.py @@ -0,0 +1,27 @@ +from typing import List, Optional + +from northwind.domain.entities.category import Category +from northwind.domain.ports.repositories.category import AbstractCategoryRepository +from northwind.schemas.category import CreateCategoryInDTO, UpdateCategoryInDTO +from shared.api.schemas.page import PageParams + + +class Categorieservice: + def __init__(self, category_repository: AbstractCategoryRepository): + self.category_repository = category_repository + + async def get_category_by_id(self, id: int) -> Category: + return await self.category_repository.get_by_id(id) + + async def get_categories(self, *, page_params: Optional[PageParams] = None) -> List[Category]: + if not page_params: + ret = await self.category_repository.get_all() + else: + ret = await self.category_repository.get_xpage(page_params.page, page_params.size) + return ret + + async def create_category(self, in_dto: CreateCategoryInDTO) -> Category: + return await self.category_repository.create(in_dto) + + async def update_category(self, id: int, in_dto: UpdateCategoryInDTO) -> Category: + return await self.category_repository.update(id, in_dto) diff --git a/src/northwind/domain/services/product.py b/src/northwind/domain/services/product.py new file mode 100644 index 0000000..0372190 --- /dev/null +++ b/src/northwind/domain/services/product.py @@ -0,0 +1,27 @@ +from typing import List, Optional + +from northwind.domain.entities.product import Product +from northwind.domain.ports.repositories.product import AbstractProductRepository +from northwind.schemas.product import CreateProductInDTO, UpdateProductInDTO +from shared.api.schemas.page import PageParams + + +class ProductService: + def __init__(self, product_repository: AbstractProductRepository): + self.product_repository = product_repository + + async def get_product_by_id(self, id: int) -> Product: + return await self.product_repository.get_by_id(id) + + async def get_products(self, *, page_params: Optional[PageParams] = None) -> List[Product]: + if not page_params: + ret = await self.product_repository.get_all() + else: + ret = await self.product_repository.get_xpage(page_params.page, page_params.size) + return ret + + async def create_product(self, in_dto: CreateProductInDTO) -> Product: + return await self.product_repository.create(in_dto) + + async def update_product(self, id: int, in_dto: UpdateProductInDTO) -> Product: + return await self.product_repository.update(id, in_dto) diff --git a/src/northwind/domain/services/supplier.py b/src/northwind/domain/services/supplier.py new file mode 100644 index 0000000..1e7e6db --- /dev/null +++ b/src/northwind/domain/services/supplier.py @@ -0,0 +1,27 @@ +from typing import List, Optional + +from northwind.domain.entities.supplier import Supplier +from northwind.domain.ports.repositories.supplier import AbstractSupplierRepository +from northwind.schemas.supplier import CreateSupplierInDTO, UpdateSupplierInDTO +from shared.api.schemas.page import PageParams + + +class SupplierService: + def __init__(self, supplier_repository: AbstractSupplierRepository): + self.supplier_repository = supplier_repository + + async def get_supplier_by_id(self, id: int) -> Supplier: + return await self.supplier_repository.get_by_id(id) + + async def get_suppliers(self, *, page_params: Optional[PageParams] = None) -> List[Supplier]: + if not page_params: + ret = await self.supplier_repository.get_all() + else: + ret = await self.supplier_repository.get_xpage(page_params.page, page_params.size) + return ret + + async def create_supplier(self, in_dto: CreateSupplierInDTO) -> Supplier: + return await self.supplier_repository.create(in_dto) + + async def update_supplier(self, id: int, in_dto: UpdateSupplierInDTO) -> Supplier: + return await self.supplier_repository.update(id, in_dto) diff --git a/src/northwind/domain/use_cases/__init__.py b/src/northwind/domain/use_cases/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/northwind/domain/use_cases/category.py b/src/northwind/domain/use_cases/category.py new file mode 100644 index 0000000..20209d0 --- /dev/null +++ b/src/northwind/domain/use_cases/category.py @@ -0,0 +1,40 @@ +from northwind.domain.services.category import Categorieservice +from northwind.schemas.category import CreateCategoryInDTO +from shared.api.schemas.page import PageParams +from shared.presenter import AbstractPresenter + + +class GetCategoriesUseCase: + def __init__(self, presenter: AbstractPresenter, service: Categorieservice): + self.presenter = presenter + self.service = service + + async def execute(self, page_params: PageParams) -> None: + await self.presenter.present(await self.service.get_categories(page_params=page_params)) + + +class GetCategoryUseCase: + def __init__(self, presenter: AbstractPresenter, service: Categorieservice): + self.presenter = presenter + self.service = service + + async def execute(self, id: int) -> None: + await self.presenter.present(await self.service.get_category_by_id(id)) + + +class CreateCategoryUseCase: + def __init__(self, presenter: AbstractPresenter, service: Categorieservice): + self.presenter = presenter + self.service = service + + async def execute(self, in_dto: CreateCategoryInDTO) -> None: + await self.presenter.present(await self.service.create_category(in_dto)) + + +class UpdateCategoryUseCase: + def __init__(self, presenter: AbstractPresenter, service: Categorieservice): + self.presenter = presenter + self.service = service + + async def execute(self, id: int, in_data: CreateCategoryInDTO) -> None: + await self.presenter.present(await self.service.update_category(id, in_data)) diff --git a/src/northwind/domain/use_cases/product.py b/src/northwind/domain/use_cases/product.py new file mode 100644 index 0000000..960675b --- /dev/null +++ b/src/northwind/domain/use_cases/product.py @@ -0,0 +1,40 @@ +from northwind.domain.services.product import ProductService +from northwind.schemas.product import CreateProductInDTO +from shared.api.schemas.page import PageParams +from shared.presenter import AbstractPresenter + + +class GetProductsUseCase: + def __init__(self, presenter: AbstractPresenter, service: ProductService): + self.presenter = presenter + self.service = service + + async def execute(self, page_params: PageParams) -> None: + await self.presenter.present(await self.service.get_products(page_params=page_params)) + + +class GetProductUseCase: + def __init__(self, presenter: AbstractPresenter, service: ProductService): + self.presenter = presenter + self.service = service + + async def execute(self, id: int) -> None: + await self.presenter.present(await self.service.get_product_by_id(id)) + + +class CreateProductUseCase: + def __init__(self, presenter: AbstractPresenter, service: ProductService): + self.presenter = presenter + self.service = service + + async def execute(self, in_dto: CreateProductInDTO) -> None: + await self.presenter.present(await self.service.create_product(in_dto)) + + +class UpdateProductUseCase: + def __init__(self, presenter: AbstractPresenter, service: ProductService): + self.presenter = presenter + self.service = service + + async def execute(self, id: int, in_data: CreateProductInDTO) -> None: + await self.presenter.present(await self.service.update_product(id, in_data)) diff --git a/src/northwind/domain/use_cases/supplier.py b/src/northwind/domain/use_cases/supplier.py new file mode 100644 index 0000000..3ed4d86 --- /dev/null +++ b/src/northwind/domain/use_cases/supplier.py @@ -0,0 +1,40 @@ +from northwind.domain.services.supplier import SupplierService +from northwind.schemas.supplier import CreateSupplierInDTO +from shared.api.schemas.page import PageParams +from shared.presenter import AbstractPresenter + + +class GetSuppliersUseCase: + def __init__(self, presenter: AbstractPresenter, service: SupplierService): + self.presenter = presenter + self.service = service + + async def execute(self, page_params: PageParams) -> None: + await self.presenter.present(await self.service.get_suppliers(page_params=page_params)) + + +class GetSupplierUseCase: + def __init__(self, presenter: AbstractPresenter, service: SupplierService): + self.presenter = presenter + self.service = service + + async def execute(self, id: int) -> None: + await self.presenter.present(await self.service.get_supplier_by_id(id)) + + +class CreateSupplierUseCase: + def __init__(self, presenter: AbstractPresenter, service: SupplierService): + self.presenter = presenter + self.service = service + + async def execute(self, in_dto: CreateSupplierInDTO) -> None: + await self.presenter.present(await self.service.create_supplier(in_dto)) + + +class UpdateSupplierUseCase: + def __init__(self, presenter: AbstractPresenter, service: SupplierService): + self.presenter = presenter + self.service = service + + async def execute(self, id: int, in_data: CreateSupplierInDTO) -> None: + await self.presenter.present(await self.service.update_supplier(id, in_data)) diff --git a/src/northwind/infra/__init__.py b/src/northwind/infra/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/northwind/infra/database/__init__.py b/src/northwind/infra/database/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/northwind/infra/database/sqlalchemy/__init__.py b/src/northwind/infra/database/sqlalchemy/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/northwind/infra/database/sqlalchemy/models.py b/src/northwind/infra/database/sqlalchemy/models.py new file mode 100644 index 0000000..872ab7e --- /dev/null +++ b/src/northwind/infra/database/sqlalchemy/models.py @@ -0,0 +1,209 @@ +from sqlalchemy import ( + Column, + Date, + Float, + ForeignKeyConstraint, + Integer, + LargeBinary, + PrimaryKeyConstraint, + SmallInteger, + String, + Table, + Text, +) + +from infra.database.sqlalchemy.sqlalchemy import metadata + + +categories = Table( + 'categories', + metadata, + Column('category_id', Integer, primary_key=True), + Column('category_name', String(15), nullable=False), + Column('description', Text), + Column('picture', LargeBinary), + PrimaryKeyConstraint('category_id', name='categories_pkey'), +) + +customer_demographics = Table( + 'customer_demographics', + metadata, + Column('customer_type_id', String(5), primary_key=True), + Column('customer_desc', Text), + PrimaryKeyConstraint('customer_type_id', name='pk_customer_demographics'), +) + +customers = Table( + 'customers', + metadata, + Column('customer_id', String(5), primary_key=True), + Column('company_name', String(40), nullable=False), + Column('contact_name', String(30)), + Column('contact_title', String(30)), + Column('address', String(60)), + Column('city', String(15)), + Column('region', String(15)), + Column('postal_code', String(10)), + Column('country', String(15)), + Column('phone', String(24)), + Column('fax', String(24)), + PrimaryKeyConstraint('customer_id', name='pk_customers'), +) + +employees = Table( + 'employees', + metadata, + Column('employee_id', Integer, primary_key=True), + Column('last_name', String(20), nullable=False), + Column('first_name', String(10), nullable=False), + Column('title', String(30)), + Column('title_of_courtesy', String(25)), + Column('birth_date', Date), + Column('hire_date', Date), + Column('address', String(60)), + Column('city', String(15)), + Column('region', String(15)), + Column('postal_code', String(10)), + Column('country', String(15)), + Column('home_phone', String(24)), + Column('extension', String(4)), + Column('photo', LargeBinary), + Column('notes', Text), + Column('reports_to', SmallInteger), + Column('photo_path', String(255)), + ForeignKeyConstraint(['reports_to'], ['employees.employee_id'], name='fk_employees_employees'), + PrimaryKeyConstraint('employee_id', name='employees_pkey'), +) + +region = Table( + 'region', + metadata, + Column('region_id', Integer, primary_key=True), + Column('region_description', String(60), nullable=False), + PrimaryKeyConstraint('region_id', name='region_pkey'), +) + +shippers = Table( + 'shippers', + metadata, + Column('shipper_id', Integer, primary_key=True), + Column('company_name', String(40), nullable=False), + Column('phone', String(24)), + PrimaryKeyConstraint('shipper_id', name='shippers_pkey'), +) + +suppliers = Table( + 'suppliers', + metadata, + Column('supplier_id', Integer, primary_key=True), + Column('company_name', String(40), nullable=False), + Column('contact_name', String(30)), + Column('contact_title', String(30)), + Column('address', String(60)), + Column('city', String(15)), + Column('region', String(15)), + Column('postal_code', String(10)), + Column('country', String(15)), + Column('phone', String(24)), + Column('fax', String(24)), + Column('homepage', Text), + PrimaryKeyConstraint('supplier_id', name='suppliers_pkey'), +) + +us_states = Table( + 'us_states', + metadata, + Column('state_id', Integer, primary_key=True), + Column('state_name', String(100)), + Column('state_abbr', String(2)), + Column('state_region', String(50)), + PrimaryKeyConstraint('state_id', name='us_states_pkey'), +) + +customer_customer_demo = Table( + 'customer_customer_demo', + metadata, + Column('customer_id', String(5), primary_key=True, nullable=False), + Column('customer_type_id', String(5), primary_key=True, nullable=False), + ForeignKeyConstraint(['customer_id'], ['customers.customer_id'], name='fk_customer_customer_demo_customers'), + ForeignKeyConstraint( + ['customer_type_id'], + ['customer_demographics.customer_type_id'], + name='fk_customer_customer_demo_customer_demographics', + ), + PrimaryKeyConstraint('customer_id', 'customer_type_id', name='pk_customer_customer_demo'), +) + +orders = Table( + 'orders', + metadata, + Column('order_id', Integer, primary_key=True), + Column('customer_id', String(5)), + Column('employee_id', SmallInteger), + Column('order_date', Date), + Column('required_date', Date), + Column('shipped_date', Date), + Column('ship_via', SmallInteger), + Column('freight', Float), + Column('ship_name', String(40)), + Column('ship_address', String(60)), + Column('ship_city', String(15)), + Column('ship_region', String(15)), + Column('ship_postal_code', String(10)), + Column('ship_country', String(15)), + ForeignKeyConstraint(['customer_id'], ['customers.customer_id'], name='fk_orders_customers'), + ForeignKeyConstraint(['employee_id'], ['employees.employee_id'], name='fk_orders_employees'), + ForeignKeyConstraint(['ship_via'], ['shippers.shipper_id'], name='fk_orders_shippers'), + PrimaryKeyConstraint('order_id', name='orders_pkey'), +) + +products = Table( + 'products', + metadata, + Column('product_id', Integer, primary_key=True), + Column('product_name', String(40), nullable=False), + Column('supplier_id', SmallInteger), + Column('category_id', SmallInteger), + Column('quantity_per_unit', String(20)), + Column('unit_price', Float), + Column('units_in_stock', SmallInteger), + Column('units_on_order', SmallInteger), + Column('reorder_level', SmallInteger), + Column('discontinued', Integer, nullable=False), + ForeignKeyConstraint(['category_id'], ['categories.category_id'], name='fk_products_categories'), + ForeignKeyConstraint(['supplier_id'], ['suppliers.supplier_id'], name='fk_products_suppliers'), + PrimaryKeyConstraint('product_id', name='products_pkey'), +) + +territories = Table( + 'territories', + metadata, + Column('territory_id', String(20), primary_key=True), + Column('territory_description', String(60), nullable=False), + Column('region_id', SmallInteger, nullable=False), + ForeignKeyConstraint(['region_id'], ['region.region_id'], name='fk_territories_region'), + PrimaryKeyConstraint('territory_id', name='pk_territories'), +) + +employee_territories = Table( + 'employee_territories', + metadata, + Column('employee_id', SmallInteger, primary_key=True, nullable=False), + Column('territory_id', String(20), primary_key=True, nullable=False), + ForeignKeyConstraint(['employee_id'], ['employees.employee_id'], name='fk_employee_territories_employees'), + ForeignKeyConstraint(['territory_id'], ['territories.territory_id'], name='fk_employee_territories_territories'), + PrimaryKeyConstraint('employee_id', 'territory_id', name='pk_employee_territories'), +) + +order_details = Table( + 'order_details', + metadata, + Column('order_id', SmallInteger, primary_key=True, nullable=False), + Column('product_id', SmallInteger, primary_key=True, nullable=False), + Column('unit_price', Float, nullable=False), + Column('quantity', SmallInteger, nullable=False), + Column('discount', Float, nullable=False), + ForeignKeyConstraint(['order_id'], ['orders.order_id'], name='fk_order_details_orders'), + ForeignKeyConstraint(['product_id'], ['products.product_id'], name='fk_order_details_products'), + PrimaryKeyConstraint('order_id', 'product_id', name='pk_order_details'), +) diff --git a/src/northwind/schemas/category.py b/src/northwind/schemas/category.py new file mode 100644 index 0000000..e9ca6b7 --- /dev/null +++ b/src/northwind/schemas/category.py @@ -0,0 +1,17 @@ +from typing import Optional + +from pydantic import BaseModel, Field + + +class CreateCategoryInDTO(BaseModel): + name: str = Field(min_length=1, max_length=15) + description: Optional[str] = Field(default=None, max_length=1024) + + +class UpdateCategoryInDTO(CreateCategoryInDTO): + pass + + +class UpdatePartialCategoryInDTO(BaseModel): + name: Optional[str] = Field(default=None, min_length=1, max_length=15) + description: Optional[str] = Field(default=None, max_length=1024) diff --git a/src/northwind/schemas/product.py b/src/northwind/schemas/product.py new file mode 100644 index 0000000..a695117 --- /dev/null +++ b/src/northwind/schemas/product.py @@ -0,0 +1,31 @@ +from typing import Optional + +from pydantic import BaseModel, Field + + +class CreateProductInDTO(BaseModel): + name: str = Field(min_length=1, max_length=40) + supplier_id: int + category_id: int + quantity_per_unit: str = Field(max_length=20) + unit_price: float + units_in_stock: int + units_on_order: int + reorder_level: int + discontinued: Optional[int] = None + + +class UpdateProductInDTO(CreateProductInDTO): + pass + + +class UpdatePartialProductInDTO(BaseModel): + name: Optional[str] = Field(default=None, min_length=1, max_length=40) + supplier_id: Optional[int] = None + category_id: Optional[int] = None + quantity_per_unit: str = Field(default=None, max_length=20) + unit_price: Optional[float] = None + units_in_stock: Optional[int] = None + units_on_order: Optional[int] = None + reorder_level: Optional[int] = None + discontinued: Optional[int] = None diff --git a/src/northwind/schemas/supplier.py b/src/northwind/schemas/supplier.py new file mode 100644 index 0000000..5e49292 --- /dev/null +++ b/src/northwind/schemas/supplier.py @@ -0,0 +1,37 @@ +from typing import Optional + +from pydantic import BaseModel, Field + + +class CreateSupplierInDTO(BaseModel): + name: str = Field(min_length=1, max_length=15) + company_name: Optional[str] = Field(default=None, max_length=40) + contact_name: Optional[str] = Field(default=None, max_length=30) + contact_title: Optional[str] = Field(default=None, max_length=30) + address: Optional[str] = Field(default=None, max_length=60) + city: Optional[str] = Field(default=None, max_length=15) + region: Optional[str] = Field(default=None, max_length=15) + postal_code: Optional[str] = Field(default=None, max_length=10) + country: Optional[str] = Field(default=None, max_length=15) + phone: Optional[str] = Field(default=None, max_length=24) + fax: Optional[str] = Field(default=None, max_length=24) + homepage: Optional[str] = Field(default=None, max_length=1024) + + +class UpdateSupplierInDTO(CreateSupplierInDTO): + pass + + +class UpdatePartialSupplierInDTO(BaseModel): + name: Optional[str] = Field(default=None, min_length=1, max_length=15) + company_name: Optional[str] = Field(default=None, max_length=40) + contact_name: Optional[str] = Field(default=None, max_length=30) + contact_title: Optional[str] = Field(default=None, max_length=30) + address: Optional[str] = Field(default=None, max_length=60) + city: Optional[str] = Field(default=None, max_length=15) + region: Optional[str] = Field(default=None, max_length=15) + postal_code: Optional[str] = Field(default=None, max_length=10) + country: Optional[str] = Field(default=None, max_length=15) + phone: Optional[str] = Field(default=None, max_length=24) + fax: Optional[str] = Field(default=None, max_length=24) + homepage: Optional[str] = Field(default=None, max_length=1024) diff --git a/src/pytest.github.ini b/src/pytest.github.ini new file mode 100644 index 0000000..d861fce --- /dev/null +++ b/src/pytest.github.ini @@ -0,0 +1,25 @@ +[pytest] +norecursedirs = versions +testpaths = tests +python_files = tests.py test_*.py + +env = + APP_ENV=test + DATABASE_URL=postgresql+asyncpg://northwind:northwind@127.0.0.1:5432/northwind + + +addopts = + -p no:warnings + --cov=. + --no-cov-on-fail + --cov-report term-missing + --cov-report term:skip-covered + --cov-report xml + --cov-branch + + +; http://doc.pytest.org/en/latest/example/markers.html +markers = + unit_test: Pure unit tests. + integration_test: Tests that access a database, API, etc. + functional_test: End to end tests that needs a browser. diff --git a/src/pytest.ini b/src/pytest.ini new file mode 100644 index 0000000..fefb4bc --- /dev/null +++ b/src/pytest.ini @@ -0,0 +1,26 @@ +[pytest] +norecursedirs = versions +testpaths = tests +python_files = tests.py test_*.py +asyncio_mode = auto + +env = + APP_ENV=test + DATABASE_URL=postgresql+asyncpg://northwind:northwind@postgres-test:5432/northwind + SA_ECHO=false + +addopts = + -p no:warnings + --cov=. + --no-cov-on-fail + --cov-report term-missing + --cov-report term:skip-covered + --cov-report xml + --cov-branch + + +; http://doc.pytest.org/en/latest/example/markers.html +markers = + unit_test: Pure unit tests. + integration_test: Tests that access a database, API, etc. + functional_test: End to end tests that needs a browser. diff --git a/src/shared/api/__init__.py b/src/shared/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/shared/api/schemas/__init__.py b/src/shared/api/schemas/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/shared/api/schemas/page.py b/src/shared/api/schemas/page.py new file mode 100644 index 0000000..4e31991 --- /dev/null +++ b/src/shared/api/schemas/page.py @@ -0,0 +1,28 @@ +from enum import IntEnum +from typing import Generic, List, TypeVar + +from pydantic import BaseModel, ConfigDict, Field + + +class PageSize(IntEnum): + x100 = 100 + x250 = 250 + x500 = 500 + x1000 = 1000 + + +class PageParams(BaseModel): + page: int = Field(1, ge=1, description='Page number') + size: PageSize = PageSize.x500 + + model_config = ConfigDict(use_enum_values=True) + + +T = TypeVar('T') + + +class PagedResponseSchema(BaseModel, Generic[T]): + total: int + page: int + size: int + results: List[T] diff --git a/src/shared/exceptions.py b/src/shared/exceptions.py new file mode 100644 index 0000000..c7dbfea --- /dev/null +++ b/src/shared/exceptions.py @@ -0,0 +1,29 @@ +from typing import Any + + +class APPExceptionError(Exception): + status_code = 500 + code = 'app-exception' + message = 'An error occurred' + + +class NotFoundError(APPExceptionError): + status_code = 404 + code: str + message: str + + def __init__(self, entity: str, *args: Any, **kwargs: Any): + self.code = f'{entity.lower()}-not-found' + self.message = f'{entity} not found' + super().__init__(*args, **kwargs) + + +class AlreadyExistsError(APPExceptionError): + status_code = 422 + code: str + message: str + + def __init__(self, entity: str, *args: Any, **kwargs: Any): + self.code = f'{entity.lower()}-already-exists' + self.message = f'{entity} already exists' + super().__init__(*args, **kwargs) diff --git a/src/shared/presenter.py b/src/shared/presenter.py new file mode 100644 index 0000000..d8e3f6e --- /dev/null +++ b/src/shared/presenter.py @@ -0,0 +1,14 @@ +import abc +from typing import Generic, TypeVar + + +InT = TypeVar('InT') +OutT = TypeVar('OutT') + + +class AbstractPresenter(Generic[InT, OutT], abc.ABC): + result: OutT + + @abc.abstractmethod + async def present(self, data: InT) -> None: + ... diff --git a/src/shared/repository/__init__.py b/src/shared/repository/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/shared/repository/ports/__init__.py b/src/shared/repository/ports/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/shared/repository/ports/generic.py b/src/shared/repository/ports/generic.py new file mode 100644 index 0000000..85a80d4 --- /dev/null +++ b/src/shared/repository/ports/generic.py @@ -0,0 +1,43 @@ +import abc +import datetime +from decimal import Decimal +from typing import Dict, Generic, List, Optional, TypeVar, Union + +from pydantic import BaseModel + + +EntityT = TypeVar('EntityT') +CreateT = TypeVar('CreateT', bound=BaseModel) +UpdateT = TypeVar('UpdateT', bound=BaseModel) + +FilterBy = Dict[str, Optional[Union[int, Decimal, str, datetime.date, datetime.datetime, bool]]] + + +class AbstractRepository(Generic[EntityT, CreateT, UpdateT], abc.ABC): + @abc.abstractmethod + async def get_by_id(self, uuid: Union[str, int]) -> EntityT: + ... + + @abc.abstractmethod + async def get_all(self) -> List[EntityT]: + ... + + @abc.abstractmethod + async def get_xpage(self, page: int, size: int) -> List[EntityT]: + ... + + @abc.abstractmethod + async def filter_by(self, by: FilterBy) -> List[EntityT]: + ... + + @abc.abstractmethod + async def create(self, data: CreateT) -> EntityT: + ... + + @abc.abstractmethod + async def update(self, uuid: Union[str, int], data: UpdateT) -> EntityT: + ... + + @abc.abstractmethod + async def delete(self, uuid: Union[str, int]) -> None: + ... diff --git a/src/shared/repository/sqlalchemy.py b/src/shared/repository/sqlalchemy.py new file mode 100644 index 0000000..e18f5dc --- /dev/null +++ b/src/shared/repository/sqlalchemy.py @@ -0,0 +1,93 @@ +from typing import Any, AsyncContextManager, Callable, List, Optional, Self, Tuple, Type, TypeVar, Union, cast + +from pydantic import BaseModel +from sqlalchemy.exc import NoResultFound +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.sql import Select, select + +from shared.exceptions import NotFoundError +from shared.repository.ports.generic import AbstractRepository, FilterBy + + +EntityT = TypeVar('EntityT') +CreateT = TypeVar('CreateT', bound=BaseModel) +UpdateT = TypeVar('UpdateT', bound=BaseModel) + + +class SqlAlchemyRepository(AbstractRepository[EntityT, CreateT, UpdateT]): + entity: Type[EntityT] + default_key_param = 'uuid' + + def __new__(cls, *args: Any, **kwargs: Any) -> Self: # noqa: ARG003 + base: Optional[Tuple[Any, ...]] = getattr(cls, '__orig_bases__', None) + if base: + generics: Tuple[Type[EntityT], Type[CreateT], Type[UpdateT]] = base[0].__args__ + cls.entity = generics[0] + return super().__new__(cls) + + def __init__( + self, + session: Callable[[], AsyncContextManager[AsyncSession]], + ) -> None: + self.session_factory = session + + def get_key_param( + self, + ) -> str: + return getattr(self, 'key', self.default_key_param) + + async def get_by_id(self, uuid: Union[str, int]) -> EntityT: + by = {self.get_key_param(): uuid} + try: + async with self.session_factory() as session: + query = select(self.entity).filter_by(**by) + results = await session.execute(query) + (result,) = results.one() + except NoResultFound: + raise NotFoundError(self.entity.__name__) + else: + return cast(EntityT, result) + + # From: https://github.com/lewoudar/fastapi-paginator/blob/main/fastapi_paginator/helpers.py + async def _paginate(self, query: Select, page: int, size: int) -> List[EntityT]: + # inspiration for this query comes from fastapi-pagination package + async with self.session_factory() as session: + return list(await session.scalars(query.limit(size).offset(page - 1))) + + async def get_all(self) -> List[EntityT]: + query = select(self.entity) + async with self.session_factory() as session: + return list((await session.scalars(query)).all()) + + async def get_xpage(self, page: int, size: int) -> List[EntityT]: + query = select(self.entity) + return await self._paginate(query, page, size) + + async def filter_by(self, by: FilterBy) -> List[EntityT]: + query = select(self.entity).filter_by(**by) + async with self.session_factory() as session: + return list((await session.scalars(query)).all()) + + async def create(self, data: CreateT) -> EntityT: + async with self.session_factory() as session: + instance = self.entity(**data.model_dump()) + session.add(instance) + return instance + + async def update(self, uuid: Union[str, int], data: UpdateT) -> EntityT: + to_update = data.model_dump(exclude_unset=True) + if not to_update: + raise ValueError('No data to update') + async with self.session_factory() as session: + instance = await self.get_by_id(uuid) + + for key, value in to_update.items(): + setattr(instance, key, value) + + session.add(instance) + return instance + + async def delete(self, uuid: Union[str, int]) -> None: + async with self.session_factory() as session: + instance = await self.get_by_id(uuid) + await session.delete(instance) diff --git a/src/tests/__init__.py b/src/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/tests/app/__init__.py b/src/tests/app/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/tests/app/test_cli.py b/src/tests/app/test_cli.py new file mode 100644 index 0000000..48ca158 --- /dev/null +++ b/src/tests/app/test_cli.py @@ -0,0 +1,9 @@ +from click.testing import CliRunner + +from manage import cli_app + + +def test_main() -> None: + runner = CliRunner() + result = runner.invoke(cli_app, ['test']) + assert 'Manage is working fine' in result.stdout diff --git a/src/tests/app/test_hello_world.py b/src/tests/app/test_hello_world.py new file mode 100644 index 0000000..9207211 --- /dev/null +++ b/src/tests/app/test_hello_world.py @@ -0,0 +1,11 @@ +from httpx import AsyncClient +import pytest + + +@pytest.mark.asyncio +async def test_hello_world(async_root_client: AsyncClient) -> None: + response = await async_root_client.get('/') + assert response.status_code == 200 + + data = response.json() + assert data['message'] == 'Hello World' diff --git a/src/tests/app/test_settings.py b/src/tests/app/test_settings.py new file mode 100644 index 0000000..f6a3273 --- /dev/null +++ b/src/tests/app/test_settings.py @@ -0,0 +1,5 @@ +from config import settings + + +def test_seetings() -> None: + assert settings.APP_ENV == 'test' diff --git a/src/tests/auth/__init__.py b/src/tests/auth/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/tests/auth/adapters/__init__.py b/src/tests/auth/adapters/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/tests/auth/adapters/api/__init__.py b/src/tests/auth/adapters/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/tests/auth/adapters/api/cli/__init_.py b/src/tests/auth/adapters/api/cli/__init_.py new file mode 100644 index 0000000..e69de29 diff --git a/src/tests/auth/adapters/api/cli/test_user.py b/src/tests/auth/adapters/api/cli/test_user.py new file mode 100644 index 0000000..a76ee7b --- /dev/null +++ b/src/tests/auth/adapters/api/cli/test_user.py @@ -0,0 +1,13 @@ +from click.testing import CliRunner + +from manage import cli_app + + +runner = CliRunner() + + +def test_create_admin() -> None: + result = runner.invoke(cli_app, ['create-admin', 'camila@gmail.com', 'Camila'], input='Berlin123\n') + assert result.exit_code == 0 + expected = 'Password: Berlin123\nThe User Camila, camila@gmail.com has been created\n' + assert result.output == expected diff --git a/src/tests/auth/adapters/api/http/__init__.py b/src/tests/auth/adapters/api/http/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/tests/auth/adapters/api/http/_test_login.py b/src/tests/auth/adapters/api/http/_test_login.py new file mode 100644 index 0000000..62efba9 --- /dev/null +++ b/src/tests/auth/adapters/api/http/_test_login.py @@ -0,0 +1,31 @@ +from httpx import AsyncClient +import pytest + +from auth.domain.entities.user import User +from auth.domain.services.token import TokenService + + +@pytest.mark.asyncio +async def test_login(async_client: AsyncClient, token_service: TokenService, admin_user: User) -> None: + data = {'email': admin_user.email, 'password': '123456'} + response = await async_client.post('/auth/login', json=data) + assert response.status_code == 200 + result = response.json() + assert 'access_token' in result + + access_token = result['access_token'] + + claims = token_service.decode_token(access_token) + assert claims + assert claims['sub'] == admin_user.email + assert claims['profile']['first_name'] == admin_user.first_name + assert claims['profile']['is_admin'] == admin_user.is_admin + + +@pytest.mark.asyncio +async def test_bad_login(async_client: AsyncClient, admin_user: User) -> None: + data = {'email': admin_user.email, 'password': 'fakepassword'} + response = await async_client.post('/auth/login', json=data) + assert response.status_code == 401 + result = response.json() + assert result['detail'] == 'Incorrect email or password' diff --git a/src/tests/auth/adapters/api/http/_test_protected.py b/src/tests/auth/adapters/api/http/_test_protected.py new file mode 100644 index 0000000..3932e58 --- /dev/null +++ b/src/tests/auth/adapters/api/http/_test_protected.py @@ -0,0 +1,18 @@ +from httpx import AsyncClient +import pytest + +from auth.domain.services.token import TokenService + + +@pytest.mark.asyncio +async def test_protected(async_client: AsyncClient, token_service: TokenService) -> None: + access_token = token_service.create_access_token( + 'admin@admin.poc', {'profile': {'first_name': 'Admin', 'is_admin': True}} + ) + async_client.headers.update({'Authorization': f'Bearer {access_token}'}) + response = await async_client.get('/auth/protected') + assert response.status_code == 200 + result = response.json() + assert 'username' in result + + assert result['username'] == 'admin@admin.poc' diff --git a/src/tests/auth/adapters/api/http/_test_token.py b/src/tests/auth/adapters/api/http/_test_token.py new file mode 100644 index 0000000..7115be8 --- /dev/null +++ b/src/tests/auth/adapters/api/http/_test_token.py @@ -0,0 +1,54 @@ +from httpx import AsyncClient +import pytest + +from auth.domain.services.token import TokenService + + +@pytest.mark.asyncio +async def test_use_refresh_token_error(async_client: AsyncClient, token_service: TokenService) -> None: + refresh_token = token_service.create_refresh_token( + 'admin@admin.poc', {'profile': {'first_name': 'Admin', 'is_admin': True}} + ) + async_client.headers.update({'Authorization': f'Bearer {refresh_token}'}) + response = await async_client.get('/auth/protected') + assert response.status_code == 401 + result = response.json() + assert result['detail'] == 'Invalid token.' + + +@pytest.mark.asyncio +async def test_expired_token(async_client: AsyncClient) -> None: + access_token = TokenService._create_token( # noqa: SLF001 + 'a', 'admin@admin.poc', {'profile': {'first_name': 'Admin', 'is_admin': True}}, -1 + ) + async_client.headers.update({'Authorization': f'Bearer {access_token}'}) + response = await async_client.get('/auth/protected') + assert response.status_code == 401 + result = response.json() + assert result['detail'] == 'Invalid token or expired token.' + + +@pytest.mark.asyncio +async def test_refresh_token(async_client: AsyncClient, token_service: TokenService) -> None: + refresh_token = token_service.create_refresh_token( + 'admin@admin.poc', {'profile': {'first_name': 'Admin', 'is_admin': True}} + ) + async_client.headers.update({'Authorization': f'Bearer {refresh_token}'}) + response = await async_client.post('/auth/refresh-token') + assert response.status_code == 200 + access_token = response.json()['access_token'] + claims = token_service.decode_token(access_token) + assert claims is not None + assert claims['sub'] == 'admin@admin.poc' + assert claims['profile']['first_name'] == 'Admin' + assert claims['profile']['is_admin'] is True + + +@pytest.mark.asyncio +async def test_refresh_token_with_access_error(async_client: AsyncClient, token_service: TokenService) -> None: + refresh_token = token_service.create_access_token( + 'admin@admin.poc', {'profile': {'first_name': 'Admin', 'is_admin': True}} + ) + async_client.headers.update({'Authorization': f'Bearer {refresh_token}'}) + response = await async_client.post('/auth/refresh-token') + assert response.status_code == 401 diff --git a/src/tests/auth/conftest.py b/src/tests/auth/conftest.py new file mode 100644 index 0000000..e69de29 diff --git a/src/tests/conftest.py b/src/tests/conftest.py new file mode 100644 index 0000000..2fe511f --- /dev/null +++ b/src/tests/conftest.py @@ -0,0 +1,167 @@ +import asyncio +from asyncio import current_task +from typing import AsyncGenerator, Generator, Iterator + +from httpx import AsyncClient +import pytest +import pytest_asyncio +from sqlalchemy.ext.asyncio import AsyncEngine, AsyncSession, async_scoped_session, create_async_engine +from sqlalchemy.orm import sessionmaker + +from app.app_container import AppContainer, AppContainerMixin +from app.asgi import app +from auth.domain.entities.user import User +from auth.domain.ports.repositories.user import AbstractUserRepository, CreateUserInDTO +from auth.domain.services.token import TokenService +from config import settings +from infra.cache.memory_cache import MemoryCache +from infra.cache.ports import AbstractCacheRepository +from infra.database.sqlalchemy.sqlalchemy import metadata +import northwind.infra.database.sqlalchemy.models # noqa +from utils.di import di_singleton + + +def pytest_addoption(parser: pytest.Parser) -> None: + # NOTE: when adding or removing an option, + # remove to remove/add from app/conftest.py:addoption_params + parser.addoption('--no-db', default=False, action='store_true', help='Disable testing database') + + +def addoption_params(config: pytest.Config) -> dict[str, bool]: + return { + 'no-db': config.getoption('--no-db'), + } + + +def pytest_configure(config: pytest.Config) -> None: + params = addoption_params(config) + if not params.get('no-db'): + next(_event_loop()).run_until_complete(create_all(_engine())) + + +def pytest_unconfigure(config: pytest.Config) -> None: + params = addoption_params(config) + if not params.get('no-db'): + next(_event_loop()).run_until_complete(drop_all(_engine())) + + +def _event_loop() -> Iterator[asyncio.AbstractEventLoop]: + try: + loop = asyncio.get_running_loop() + except RuntimeError: + loop = asyncio.new_event_loop() + yield loop + loop.close() + + +def _engine() -> AsyncEngine: + return create_async_engine(settings.DATABASE_URL, future=True, echo=False) + + +@pytest.fixture(scope='function', autouse=True) +def engine() -> Generator: + yield _engine() + + +@pytest.fixture +def async_session_maker(engine: AsyncEngine) -> Generator: + yield async_scoped_session( + sessionmaker(engine, expire_on_commit=False, class_=AsyncSession), scopefunc=current_task + ) + + +async def create_all(engine: AsyncEngine) -> None: + async with engine.begin() as conn: + await conn.run_sync(metadata.drop_all) + await conn.run_sync(metadata.create_all) + await engine.dispose() + + +async def drop_all(engine: AsyncEngine) -> None: + async with engine.begin() as conn: + await conn.run_sync(metadata.drop_all) + await engine.dispose() + + +@pytest_asyncio.fixture +async def async_root_client() -> AsyncClient: + async with AsyncClient(app=app, base_url='http://test') as ac: + yield ac + + +@pytest_asyncio.fixture +async def async_client() -> AsyncClient: + async with AsyncClient(app=app, base_url='http://test/api/v1') as ac: + yield ac + + +@pytest_asyncio.fixture +async def app_container() -> AsyncGenerator: + yield AppContainer() + + +@pytest_asyncio.fixture +async def user_repository(app_container: AppContainer) -> AsyncGenerator[AbstractUserRepository, None]: + yield app_container.user_repository + + +@pytest_asyncio.fixture +async def token_service(app_container: AppContainer) -> AsyncGenerator[TokenService, None]: + yield app_container.token_service + + +@pytest_asyncio.fixture +async def admin_user(user_repository: AbstractUserRepository) -> AsyncGenerator[User, None]: + # We have to encrypt the password here because the password is not encrypted in the repository + password = User.encrypt_password('123456') + in_dto = CreateUserInDTO(email='admin@northwind.poc', first_name='Admin', password=password, is_admin=True) + yield await user_repository.create(in_dto) + await user_repository.delete(in_dto.email) + + +@pytest_asyncio.fixture +async def normal_user(user_repository: AbstractUserRepository) -> AsyncGenerator[User, None]: + # We have to encrypt the password here because the password is not encrypted in the repository + password = User.encrypt_password('123456') + in_dto = CreateUserInDTO(email='user@northwind.poc', first_name='Example', password=password, is_admin=False) + yield await user_repository.create(in_dto) + await user_repository.delete(in_dto.email) + + +@pytest.fixture +def admin_access_token(admin_user: User, token_service: TokenService) -> str: + return token_service.create_access_token( + admin_user.email, {'profile': {'first_name': admin_user.first_name, 'is_admin': admin_user.is_admin}} + ) + + +@pytest.fixture +def normal_user_access_token(normal_user: User, token_service: TokenService) -> str: + return token_service.create_access_token( + normal_user.email, {'profile': {'first_name': normal_user.first_name, 'is_admin': normal_user.is_admin}} + ) + + +@pytest_asyncio.fixture +async def async_admin_client(admin_access_token: str) -> AsyncClient: + async with AsyncClient(app=app, base_url='http://test/api/v1') as ac: + ac.headers.update({'Authorization': f'Bearer {admin_access_token}'}) + yield ac + + +@pytest_asyncio.fixture +async def async_normal_client(normal_user_access_token: str) -> AsyncClient: + async with AsyncClient(app=app, base_url='http://test/api/v1') as ac: + ac.headers.update({'Authorization': f'Bearer {normal_user_access_token}'}) + yield ac + + +@pytest.fixture(autouse=True) +def memory_cache_database(monkeypatch: pytest.MonkeyPatch) -> Generator[None, None, None]: + @di_singleton + def fake_cache_gateway() -> AbstractCacheRepository: + return MemoryCache() + + monkeypatch.setattr(AppContainerMixin, '_get_cache_repository', lambda _: fake_cache_gateway()) + + yield diff --git a/src/tests/infra/test_auth_user.py b/src/tests/infra/test_auth_user.py new file mode 100644 index 0000000..73aff1d --- /dev/null +++ b/src/tests/infra/test_auth_user.py @@ -0,0 +1,9 @@ +import pytest +from sqlalchemy.ext.asyncio import async_scoped_session +from sqlalchemy.sql import text + + +@pytest.mark.asyncio +async def test_auth_user_table_exists(async_session_maker: async_scoped_session) -> None: + async with async_session_maker() as session: + await session.execute(text('SELECT * FROM auth_user')) diff --git a/src/tests/northwind/__init__.py b/src/tests/northwind/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/tests/northwind/adapters/__init__.py b/src/tests/northwind/adapters/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/tests/northwind/adapters/api/__init__.py b/src/tests/northwind/adapters/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/tests/northwind/adapters/api/http/__init__.py b/src/tests/northwind/adapters/api/http/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/tests/northwind/adapters/api/http/test_category.py b/src/tests/northwind/adapters/api/http/test_category.py new file mode 100644 index 0000000..8bbc686 --- /dev/null +++ b/src/tests/northwind/adapters/api/http/test_category.py @@ -0,0 +1,67 @@ +from typing import Dict, Union + +from httpx import AsyncClient +import pytest + + +@pytest.mark.asyncio +async def test_category_create(async_admin_client: AsyncClient) -> None: + data = {'name': 'Fish', 'description': 'Fish Description'} + response = await async_admin_client.post('/northwind/category', json=data) + assert response.status_code == 201 + result = response.json() + assert 'name' in result and result['name'] == data['name'] + assert 'description' in result and result['description'] == data['description'] + + +@pytest.mark.asyncio +async def test_category_list(async_normal_client: AsyncClient, category_cereals: Dict[str, Union[str, int]]) -> None: + response = await async_normal_client.get('/northwind/category') + assert response.status_code == 200 + paginated_result = response.json() + assert 'results' in paginated_result + names = [item.get('name') for item in paginated_result['results']] + assert category_cereals['name'] in names + + +@pytest.mark.asyncio +async def test_category_detail(async_normal_client: AsyncClient, category_cereals: Dict[str, Union[str, int]]) -> None: + response = await async_normal_client.get(f'/northwind/category/{category_cereals.get("id")}') + assert response.status_code == 200 + result = response.json() + assert 'name' in result and result['name'] == category_cereals['name'] + assert 'description' in result and result['description'] == category_cereals['description'] + + +# @pytest.mark.asyncio +# async def test_category_update(async_admin_client: AsyncClient, category_western: str) -> None: +# data = {'name': 'Western - wip'} +# response = await async_admin_client.put(f'/northwind/category/{category_western}', json=data) +# assert response.status_code == 200 +# result = response.json() +# assert 'name' in result +# assert result['name'] == 'Western - wip' + + +# @pytest.mark.asyncio +# async def test_category_update_permission(async_normal_client: AsyncClient, category_western: str) -> None: +# data = {'name': 'Western - wip'} +# response = await async_normal_client.put(f'/northwind/category/{category_western}', json=data) +# assert response.status_code == 403 + + +# @pytest.mark.asyncio +# async def test_category_update_partial(async_admin_client: AsyncClient, category_western: str) -> None: +# data = {'name': 'Western - example'} +# response = await async_admin_client.patch(f'/northwind/category/{category_western}', json=data) +# assert response.status_code == 200 +# result = response.json() +# assert 'name' in result +# assert result['name'] == 'Western - example' + + +# @pytest.mark.asyncio +# async def test_category_update_partial_permission(async_normal_client: AsyncClient, category_western: str) -> None: +# data = {'name': 'Western - example'} +# response = await async_normal_client.patch(f'/northwind/category/{category_western}', json=data) +# assert response.status_code == 403 diff --git a/src/tests/northwind/conftest.py b/src/tests/northwind/conftest.py new file mode 100644 index 0000000..8c6b61f --- /dev/null +++ b/src/tests/northwind/conftest.py @@ -0,0 +1,34 @@ +from typing import AsyncContextManager, AsyncGenerator, Callable, Dict, Union + +from faker import Faker +import pytest_asyncio +from sqlalchemy.ext.asyncio import AsyncSession + +from northwind.infra.database.sqlalchemy.models import categories + + +fake = Faker() + +AsyncSessionCtxT = Callable[[], AsyncContextManager[AsyncSession]] + + +@pytest_asyncio.fixture +async def category_cereals(async_session_maker: AsyncSessionCtxT) -> AsyncGenerator[Dict[str, Union[str, int]], None]: + async with async_session_maker() as session: + description = fake.paragraph(nb_sentences=2) + statement = ( + categories.insert() + .values(category_name='Cereals', description=description) + .returning(categories.c.category_id) + ) + result = await session.execute(statement) + await session.commit() + + object_id = result.scalar_one() + + yield {'id': object_id, 'name': 'Cereals', 'description': description} + + stmt = categories.delete().where(categories.c.category_id == object_id) + await session.execute(stmt) + + await session.commit() diff --git a/src/tests/utils/__init__.py b/src/tests/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/tests/utils/test_di.py b/src/tests/utils/test_di.py new file mode 100644 index 0000000..af2bea6 --- /dev/null +++ b/src/tests/utils/test_di.py @@ -0,0 +1,45 @@ +import abc + +from utils.di import DIContainer + + +class AbstractRepositoryClass(abc.ABC): + pass + + +class RepositoryClass(AbstractRepositoryClass): + pass + + +class AbstractServiceClass(abc.ABC): + pass + + +class ServiceClass(AbstractServiceClass): + def __init__(self, repo: AbstractRepositoryClass): + self.repo = repo + + +class DocumentContainer(DIContainer): + repo: AbstractRepositoryClass + service: ServiceClass + + def _get_repo(self) -> AbstractRepositoryClass: + return RepositoryClass() + + _get_repo.__dict__['singleton'] = True + + def _get_service(self) -> ServiceClass: + return ServiceClass(self.repo) + + +def test_singleton() -> None: + c = DocumentContainer() + + assert c.repo == c.repo + + +def test_no_singleton() -> None: + c = DocumentContainer() + + assert c.service != c.service diff --git a/src/utils/__init__.py b/src/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/utils/async_utils.py b/src/utils/async_utils.py new file mode 100644 index 0000000..983a7d3 --- /dev/null +++ b/src/utils/async_utils.py @@ -0,0 +1,16 @@ +import asyncio +from typing import Any, Awaitable, Callable + + +def async_exec(func: Callable[..., Awaitable[Any]], *args: Any, **kwargs: Any) -> None: + try: + loop = asyncio.get_event_loop() + loop.run_until_complete(func(*args, **kwargs)) + except RuntimeError as e: + if str(e).startswith('There is no current event loop in thread'): + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + loop.run_until_complete(func(*args, **kwargs)) + loop.close() + else: + raise diff --git a/src/utils/di.py b/src/utils/di.py new file mode 100644 index 0000000..27220ad --- /dev/null +++ b/src/utils/di.py @@ -0,0 +1,37 @@ +from functools import wraps +from typing import Any, Callable, Dict, TypeVar + + +P = TypeVar('P') +R = TypeVar('R') + + +def di_singleton(fnc: Callable[..., R]) -> Callable[..., R]: + setattr(fnc, 'singleton', True) # noqa + + @wraps(fnc) + def wrapper(*args: P, **kwargs: Any) -> R: + return fnc(*args, **kwargs) + + return wrapper + + +class DIContainer: + _register: Dict[str, Callable[..., Any]] + + def __init__(self) -> None: + self._register = {} + + def __getattribute__(self, name: str) -> Any: + ret = None + if name == '_register' or name.startswith('__'): + return super().__getattribute__(name) + + if name not in self._register: + fnc = super().__getattribute__(f'_get_{name}') + ret = fnc() + if getattr(fnc, 'singleton', False): + self._register[name] = ret + return ret + + return self._register[name] diff --git a/src/utils/logger/__init__.py b/src/utils/logger/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/utils/logger/formatter/__init__.py b/src/utils/logger/formatter/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/utils/logger/formatter/color_extra.py b/src/utils/logger/formatter/color_extra.py new file mode 100644 index 0000000..62ccfe2 --- /dev/null +++ b/src/utils/logger/formatter/color_extra.py @@ -0,0 +1,7 @@ +import colorlog + +from .standard_extra import FormatterExtra + + +class ColorFormatterExtra(colorlog.ColoredFormatter, FormatterExtra): + pass diff --git a/src/utils/logger/formatter/standard_extra.py b/src/utils/logger/formatter/standard_extra.py new file mode 100644 index 0000000..002cf41 --- /dev/null +++ b/src/utils/logger/formatter/standard_extra.py @@ -0,0 +1,40 @@ +import logging +from typing import ClassVar, List + + +class FormatterExtra(logging.Formatter): + # From: https://docs.python.org/3/library/logging.html#logrecord-attributes + reserved: ClassVar[List[str]] = [ + 'args', + 'asctime', + 'created', + 'exc_info', + 'filename', + 'funcName', + 'levelname', + 'levelno', + 'lineno', + 'message', + 'module', + 'msecs', + 'msg', + 'name', + 'pathname', + 'process', + 'processName', + 'relativeCreated', + 'stack_info', + 'thread', + 'threadName', + # Custom + 'exc_text', + 'color_message', + ] + + def format(self, record: logging.LogRecord) -> str: + extra = record.__dict__.copy() + for key in self.reserved: + extra.pop(key, None) + if extra: + record.msg += f' {extra}' + return super().format(record) diff --git a/src/utils/singleton.py b/src/utils/singleton.py new file mode 100644 index 0000000..34a1e82 --- /dev/null +++ b/src/utils/singleton.py @@ -0,0 +1,40 @@ +# With changes from: https://github.com/Kemaweyan/singleton_decorator/blob/master/singleton_decorator/decorator.py # noqa +import threading +from typing import Any, Type, TypeVar, cast + + +InstanceT = TypeVar('InstanceT') +WrappedT = TypeVar('WrappedT') + + +DecoratedT = TypeVar('DecoratedT', bound=Type[Any]) +ResultT = Any + + +class _SingletonWrapper: + """ + A singleton wrapper class. Its instances would be created + for each decorated class. + """ + + def __init__(self, cls: DecoratedT) -> None: + self.__wrapped__: DecoratedT = cls + self._instance: ResultT = None + self._lock = threading.Lock() + + def __call__(self, *args: Any, **kwargs: Any) -> ResultT: + """Returns a single instance of decorated class""" + if self._instance is None: + with self._lock: + if self._instance is None: + self._instance = self.__wrapped__(*args, **kwargs) + return self._instance + + +def singleton(cls: DecoratedT) -> DecoratedT: + """ + A singleton decorator. Returns a wrapper objects. A call on that object + returns a single instance object of decorated class. Use the __wrapped__ + attribute to access decorated class directly in unit tests + """ + return cast(DecoratedT, _SingletonWrapper(cls))