From 25844b5f69e3354270eccde6658d36d1baf02654 Mon Sep 17 00:00:00 2001 From: Oliver Kinch Date: Fri, 5 Jul 2024 09:20:52 +0200 Subject: [PATCH] doms_databasen -> domsdatabasen --- .github/workflows/docs.yaml | 2 +- .gitignore | 4 +- .pre-commit-config.yaml | 2 +- CONTRIBUTING.md | 8 +- Makefile | 14 ++-- README.md | 22 +++--- notebooks/dataset_card.ipynb | 79 +++++-------------- pyproject.toml | 6 +- src/doms_databasen/__init__.py | 0 src/domsdatabasen/__init__.py | 1 + .../_constants.py | 0 .../_exceptions.py | 2 +- .../_text_extraction.py | 0 .../_utils.py | 2 +- .../_xpaths.py | 0 .../dataset_builder.py | 2 +- .../processor.py | 2 +- .../scraper.py | 0 src/scripts/finalize.py | 2 +- src/scripts/process.py | 2 +- src/scripts/scrape.py | 2 +- tests/processor/test_processor.py | 2 +- tests/processor/test_text_extraction.py | 2 +- tests/scraper/conftest.py | 2 +- 24 files changed, 60 insertions(+), 98 deletions(-) delete mode 100644 src/doms_databasen/__init__.py create mode 100644 src/domsdatabasen/__init__.py rename src/{doms_databasen => domsdatabasen}/_constants.py (100%) rename src/{doms_databasen => domsdatabasen}/_exceptions.py (50%) rename src/{doms_databasen => domsdatabasen}/_text_extraction.py (100%) rename src/{doms_databasen => domsdatabasen}/_utils.py (96%) rename src/{doms_databasen => domsdatabasen}/_xpaths.py (100%) rename src/{doms_databasen => domsdatabasen}/dataset_builder.py (98%) rename src/{doms_databasen => domsdatabasen}/processor.py (99%) rename src/{doms_databasen => domsdatabasen}/scraper.py (100%) diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml index 5e95bf34..f1b1d285 100644 --- a/.github/workflows/docs.yaml +++ b/.github/workflows/docs.yaml @@ -29,7 +29,7 @@ jobs: pip install -r requirements.txt - name: Build documentation - run: pip install pdoc==7.3.0 && pdoc --docformat google src/doms_databasen -o docs + run: pip install pdoc==7.3.0 && pdoc --docformat google src/domsdatabasen -o docs - name: Compress documentation run: tar --directory docs/ -hcf artifact.tar . diff --git a/.gitignore b/.gitignore index 0cb0bc11..b08d2709 100644 --- a/.gitignore +++ b/.gitignore @@ -94,8 +94,8 @@ outputs/ multirun/ # Documentation -docs/doms_databasen/ -docs/doms_databasen.html +docs/domsdatabasen/ +docs/domsdatabasen.html docs/index.html docs/search.js diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8c266598..81cc9495 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -7,7 +7,7 @@ repos: rev: v0.0.290 hooks: - id: ruff - exclude: src/doms_databasen/constants.py + exclude: src/domsdatabasen/constants.py args: [--fix, --exit-non-zero-on-fix] types_or: [python, pyi, jupyter] - repo: https://github.com/kynan/nbstripout diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a52a79fa..35dab6ce 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,4 +1,4 @@ -# Welcome to doms_databasen contributing guide +# Welcome to domsdatabasen contributing guide Thank you for investing your time in contributing to our project! :sparkles:. @@ -29,11 +29,11 @@ resources to help you get started with open source contributions: If you spot a problem with the package, [search if an issue already exists](https://docs.github.com/en/github/searching-for-information-on-github/searching-on-github/searching-issues-and-pull-requests#search-by-the-title-body-or-comments). If a related issue doesn't exist, you can open a new issue using a relevant [issue -form](https://github.com/alexandrainst/doms_databasen/issues). +form](https://github.com/alexandrainst/domsdatabasen/issues). #### Solve an issue -Scan through our [existing issues](https://github.com/alexandrainst/doms_databasen/issues) +Scan through our [existing issues](https://github.com/alexandrainst/domsdatabasen/issues) to find one that interests you. You can narrow down the search using `labels` as filters. See [Labels](/contributing/how-to-use-labels.md) for more information. If you find an issue to work on, you are welcome to open a PR with a fix. @@ -87,4 +87,4 @@ questions or request for additional information. ### Your PR is merged! -Congratulations :tada::tada: The doms_databasen team thanks you :sparkles:. +Congratulations :tada::tada: The domsdatabasen team thanks you :sparkles:. diff --git a/Makefile b/Makefile index ec6e0658..a4d1fcdc 100644 --- a/Makefile +++ b/Makefile @@ -35,7 +35,7 @@ help: @grep -E '^[0-9a-zA-Z_-]+:.*?## .*$$' makefile | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' install: ## Install dependencies - @echo "Installing the 'doms_databasen' project..." + @echo "Installing the 'domsdatabasen' project..." @$(MAKE) --quiet install-brew @$(MAKE) --quiet install-gpg @$(MAKE) --quiet generate-gpg-key @@ -45,7 +45,7 @@ install: ## Install dependencies @$(MAKE) --quiet setup-environment-variables @$(MAKE) --quiet setup-git @$(MAKE) --quiet add-repo-to-git - @echo "Installed the 'doms_databasen' project. You can now activate your virtual environment with 'source .venv/bin/activate'." + @echo "Installed the 'domsdatabasen' project. You can now activate your virtual environment with 'source .venv/bin/activate'." @echo "Note that this is a Poetry project. Use 'poetry add ' to install new dependencies and 'poetry remove ' to remove them." install-brew: @@ -130,11 +130,11 @@ add-repo-to-git: git commit --quiet -m "Initial commit"; \ fi @if [ "$(shell git remote)" = "" ]; then \ - git remote add origin git@github.com:alexandrainst/doms_databasen.git; \ + git remote add origin git@github.com:alexandrainst/domsdatabasen.git; \ fi docs: ## Generate documentation - @poetry run pdoc --docformat google src/doms_databasen -o docs + @poetry run pdoc --docformat google src/domsdatabasen -o docs @echo "Saved documentation." view-docs: ## View documentation @@ -146,15 +146,15 @@ view-docs: ## View documentation (*CYGWIN*) openCmd='cygstart'; ;; \ (*) echo 'Error: Unsupported platform: $${uname}'; exit 2; ;; \ esac; \ - "$${openCmd}" docs/doms_databasen.html + "$${openCmd}" docs/domsdatabasen.html test: @poetry run pytest tests/scraper ; \ poetry run pytest tests/processor ; \ docker: ## Build Docker image and run container - @docker build -t doms_databasen . - @docker run -it --rm doms_databasen + @docker build -t domsdatabasen . + @docker run -it --rm domsdatabasen tree: ## Print directory tree @tree -a --gitignore -I .git . diff --git a/README.md b/README.md index e365613f..da4bc7ba 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ - + # Domsdatabasen Scraping og processering af [domsdatabasen](https://domsdatabasen.dk/#). @@ -17,11 +17,11 @@ Se `src/scripts/process.py`. Se `src/scripts/finalize.py`. ______________________________________________________________________ -[![Documentation](https://img.shields.io/badge/docs-passing-green)](https://alexandrainst.github.io/doms_databasen/doms_databasen.html) -[![License](https://img.shields.io/github/license/oliverkinch/doms_databasen)](https://github.com/alexandrainst/doms_databasen/blob/master/LICENSE) -[![LastCommit](https://img.shields.io/github/last-commit/oliverkinch/doms_databasen)](https://github.com/alexandrainst/doms_databasen/commits/master) -[![Code Coverage](https://img.shields.io/badge/Coverage-100%25-brightgreen.svg)](https://github.com/alexandrainst/doms_databasen/tree/master/tests) -[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.0-4baaaa.svg)](https://github.com/alexandrainst/doms_databasen/blob/master/CODE_OF_CONDUCT.md) +[![Documentation](https://img.shields.io/badge/docs-passing-green)](https://alexandrainst.github.io/domsdatabasen/domsdatabasen.html) +[![License](https://img.shields.io/github/license/oliverkinch/domsdatabasen)](https://github.com/alexandrainst/domsdatabasen/blob/master/LICENSE) +[![LastCommit](https://img.shields.io/github/last-commit/oliverkinch/domsdatabasen)](https://github.com/alexandrainst/domsdatabasen/commits/master) +[![Code Coverage](https://img.shields.io/badge/Coverage-100%25-brightgreen.svg)](https://github.com/alexandrainst/domsdatabasen/tree/master/tests) +[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.0-4baaaa.svg)](https://github.com/alexandrainst/domsdatabasen/blob/master/CODE_OF_CONDUCT.md) Developers: @@ -38,11 +38,11 @@ Developers: ## A Word on Modules and Scripts -In the `src` directory there are two subdirectories, `doms_databasen` +In the `src` directory there are two subdirectories, `domsdatabasen` and `scripts`. This is a brief explanation of the differences between the two. ### Modules -All Python files in the `doms_databasen` directory are _modules_ +All Python files in the `domsdatabasen` directory are _modules_ internal to the project package. Examples here could be a general data loading script, a definition of a model, or a training function. Think of modules as all the building blocks of a project. @@ -65,7 +65,7 @@ When importing module functions/classes when you're in a script, you do it like would normally import from any other package: ``` -from doms_databasen import some_function +from domsdatabasen import some_function ``` Note that this is also how we import functions/classes in tests, since each test Python @@ -90,7 +90,7 @@ for the repository (can be enabled on Github in the repository settings). Code Spaces is a new feature on Github, that allows you to develop on a project completely in the cloud, without having to do any local setup at all. This repo comes included with a configuration file for running code spaces on Github. When hosted on -`alexandrainst/doms_databasen` then simply press the `<> Code` button +`alexandrainst/domsdatabasen` then simply press the `<> Code` button and add a code space to get started, which will open a VSCode window directly in your browser. @@ -130,7 +130,7 @@ browser. │   ├── scripts │   │   ├── fix_dot_env_file.py │   │   └── your_script.py -│   └── doms_databasen +│   └── domsdatabasen │   ├── __init__.py │   └── your_module.py └── tests diff --git a/notebooks/dataset_card.ipynb b/notebooks/dataset_card.ipynb index fa27f9d8..c8364f4c 100644 --- a/notebooks/dataset_card.ipynb +++ b/notebooks/dataset_card.ipynb @@ -9,17 +9,19 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "import jsonlines\n", + "\"\"\"Dataset card.\"\"\"\n", + "\n", + "import math\n", + "import os\n", "import random\n", + "\n", + "import jsonlines\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", - "import os\n", - "import math\n", - "import sys\n", "\n", "random.seed(42)\n", "\n", @@ -28,7 +30,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -52,16 +54,16 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "DATA_PATH = \"/mnt/data_6tb/oliver/doms_databasen/data/final/dataset.jsonl\"" + "DATA_PATH = \"dataset.jsonl\"" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -84,20 +86,9 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "3917" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "len(data)" ] @@ -111,17 +102,9 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Total size: 199.07 MB\n" - ] - } - ], + "outputs": [], "source": [ "size = os.path.getsize(DATA_PATH) / 1e6\n", "\n", @@ -137,7 +120,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -147,20 +130,9 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1AAAAHWCAYAAAB5bWjdAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABUzklEQVR4nO3dd3hUZfr/8c+kEFJooYj0gBCQBAhlkRBhQRCUJqKIBVAirlhQASUUFVi6iChBBQQEpHxREJUiIPalyI+yRgRkaQHBAGElCQlJSOb3B5sxk0LOTGaYmeT9ui69cp455T73HCZz5zzPeUxms9ksAAAAAECRvFwdAAAAAAB4CgooAAAAADCIAgoAAAAADKKAAgAAAACDKKAAAAAAwCAKKAAAAAAwiAIKAAAAAAyigAIAAAAAgyigAAAAAMAgCigAQKkXGhqqSZMm3bTj7d69W6Ghodq9e7fTjzV37lyFhoZatd3M8123bp1CQ0N15syZm3I8AHA2H1cHAADuaN26dRozZoxluUyZMqpRo4bat2+vZ555RlWqVJF0/YvwoEGDLOv5+vqqfPnyatCggdq3b6/+/fsrODj4hvvObejQoRo1alS+9rzHuZEjR44YWq8o+/bt07/+9S8NHjxY5cuXL3L9mJgYbdmyRfv373fI8R3N1vMx6syZM7rrrrssyz4+PgoKClJISIj+9re/acCAAapRo4ZDjvX+++/rtttuU5cuXRyyP0dy59gAwJEooADgBoYPH65atWopIyNDe/fu1apVq/Tdd99pw4YN8vf3t6w3cOBAhYeHKzs7W5cuXdL+/fs1d+5cLVmyRHPmzFG7du0K3XdujRo1KjCOBg0aaObMmVZts2fPVkBAgJ5++mkHnGl++/fvV2xsrPr27evQgsNVnH0+PXv2VIcOHWQ2m3X58mXFxcVp6dKlWrZsmaZMmaIePXpY1m3Tpo1+/vln+fr62nSM+fPnq1u3bjYVKcOGDdNTTz1l03HsUVhsffr0UY8ePVSmTBmnxwAANwMFFADcQIcOHRQeHi5JevDBB1WxYkUtWbJE27dvV8+ePS3rtW7dWt27d7fa9vDhwxoyZIiGDx+ujRs3qlq1aoXuuyhVqlRRnz59rNoWLlyoSpUq5WuHa9x+++353ovff/9dQ4YM0ejRo9WgQQM1btxYkuTl5SU/Pz+nxpOamqqAgAD5+PjIx8d1v+69vb3l7e3tsuMDgKMxBgoAbHDHHXdIkqHxHI0bN9bYsWOVlJSkFStWODs0SVJSUpKmTJmijh07KiwsTF27dtWCBQuUnZ0tSTKbzRo4cKDuuOMOJSYmWrbLyMhQr1691KVLF6Wmpmru3LmWO1533XWXQkNDHTaO5d///reio6PVqlUrNW/eXI899pj27t1rtU7OuJ1Tp04pJiZGrVu3VqtWrTRmzBilpaVZrXv16lVNnjxZbdu2VUREhJ5++mklJCQoNDRUc+fOtezPyPl89dVX6tmzp8LCwtSjRw99//33xTrXmjVravr06crMzNTChQst7QWNgTp58qSef/55tW/fXuHh4erQoYNeeuklJScnS7o+bik1NVWffvqpJf6YmBirfP3nP//RyJEj1aZNGz3yyCNWrxXk888/V7du3RQeHq77779fe/bssXo9JiZGnTt3zrdd3n3eKLbCxkCtWLFCPXr0UFhYmKKiojRx4kQlJSVZrTNw4ED17NlT//nPfzRw4EA1b95cd955p1UuAeBm4w4UANggPj5eklSxYkVD63fr1k3jxo3Tjz/+qJdeesnqtZSUFF26dMmqLe94KVukpaXpscceU0JCggYMGKBbb71V+/fv1+zZs3XhwgWNGzdOJpNJU6dOVe/evfX6668rNjZW0vUvxEePHtXy5csVEBCgrl276uTJk9qwYYPGjBmjSpUqFTs+Sdq5c6eGDh2qsLAwPffcczKZTFq3bp0GDx6slStXqlmzZlbrv/jii6pVq5ZGjBihX3/9VR9//LGCg4P18ssvW9aJiYnR5s2b1adPHzVv3lx79uzJ12XNyPns3btXW7du1SOPPKLAwEAtX75cw4cP1zfffGNZ3x4RERGqU6eOduzYUeg6GRkZio6OVkZGhh577DFVqVJFCQkJ+vbbb5WUlKRy5cpp5syZGj9+vJo1a6b+/ftLkurUqWO1nxdeeEF169bVSy+9JLPZfMO49uzZo02bNmngwIEqU6aMVq1apSeffFIff/xxoV1JC2Mkttzmzp2r2NhYRUZG6uGHH9aJEye0atUqxcXFadWqVVZdGy9fvqwnn3xSXbt21T333KMtW7Zo1qxZatSokTp27GhTnADgCBRQAHADOUVORkaG9u3bp3nz5qls2bLq1KmToe19fX1Vr149nT59Ot9rjz/+eL624jwAYsmSJTp9+rQ+/fRT1atXT5I0YMAAVatWTYsWLdKQIUN06623qnbt2oqJidFrr72mzz//XHXr1tWiRYs0aNAgtWnTRtL1u2e33367NmzYoC5duuQbq2UPs9msCRMmqG3btvrggw9kMpksMfbo0UNz5szR4sWLrbZp0qSJpk6daln+888/9cknn1gKqIMHD2rz5s0aPHiwxo4dK0l69NFHNWbMGB0+fNiynZHzOXbsmDZt2mT54t+2bVv16dNHGzdu1GOPPVasc2/YsKG2b9+ulJQUBQUFFXjsM2fO6O2337bqCvrcc89Zfu7Tp48mTJig2rVrF9pts3HjxnrzzTcNxfTbb79p7dq1CgsLkyT16NFD3bt31zvvvGMprI0yEluOS5cuaf78+YqKitLChQvl5XW9M0z9+vU1adIkff755+rXr59l/fPnz2vGjBm67777JEkPPPCAOnfurLVr11JAAXAJCigAuIG8RU7NmjU1a9Ys3XLLLYb3ERAQoCtXruRrf+211xQSElLcEC2+/PJLtWrVSuXLl7e6sxUZGakFCxZoz5496t27tyTpoYce0tatWzV58mRVqlRJtWvX1ogRIxwWS0EOHTqkkydPatiwYfrvf/9r9Vq7du302WefKTs72/KFWrpeXOXWunVrbdu2zVKI/PDDD5Jk6a6W47HHHtO6detsii8yMtLqrknjxo0VFBRUYPFrq4CAAEnSlStXCiygctp+/PFHdezY0eoBJbbIm68biYiIsBRPklSjRg3ddddd+uabb5SVleW0cUs7duxQZmamBg0aZPVeP/jgg5o9e7a+++47qwIqICDAqigrU6aMwsPDHfK+AIA9KKAA4AZyihxvb29VqVJFISEhVl/6jEhNTVVgYGC+9mbNmhl+iIQRp06d0pEjRwp84p+kfN0Fp06dqi5duujy5ctavXq1ypYt67BYCnLy5ElJ0ujRowtdJzk5WRUqVLAs5338d87T8y5fvqygoCCdPXtWXl5e+e4o1a1b1+b4br311nxtFSpUyDcuxx6pqamSVOB1IEm1a9fWE088oSVLluiLL75Q69at1blzZ/Xu3VvlypUzfBxb7hQWlKN69eopLS1Nly5dUtWqVQ3vyxZnz56VdP2OU25lypRR7dq19fvvv1u1V69e3XK3MkeFChUc9rh+ALAVBRQA3EBxi5zMzEydPHlSDRs2dGBUBcvOzlb79u315JNPFvh6Tre+HLt371ZGRoak6925IiIinBpfzpicV155RU2aNClwnZw7NTkKK1aLGt9jj8LuuDjiWEePHlXlypULvPuUIyYmRn379tX27dv1r3/9S5MnT9b8+fO1Zs0aVa9e3dBxHP1kv7yFS46srCyHHudGeIIfAHdDAQUATrRlyxZdvXpVUVFRTj9WnTp1lJqaqsjIyCLXPX/+vCZPnqyoqCj5+vpqxowZioqKUs2aNS3rFPbl2V61a9eWdL27mpEYjahRo4ays7N15swZqwLx1KlT+dZ19PkYtX//fsXHx1u6T95IzhPsnnnmGe3bt08PP/ywVq1ale8BJI5QUI5Onjwpf39/y8M1ypcvX+AduJy7SPbIuat4/PhxyzUhXX+QxpkzZxx2bQCAs/AYcwBwksOHD2vq1KmqUKGCHn30Uacf75577tH+/fst44JyS0pK0rVr1yzLr776qrKzszVlyhRNmjRJPj4+GjdunNXdlpxxODmP0S6usLAw1alTR4sXLy5wTFjeLoZG5BSmK1eutGr/6KOP8q3r6PMx4vfff1dMTIx8fX0VHR1d6HopKSlW7490fVJlLy8vy11C6fodOkd0KZSuF3YHDx60LJ87d07bt29X+/btLXd96tSpo+TkZKsHcpw/f17btm3Ltz+jsUVGRsrX11fLly+3ut4++eQTJScn82AIAG6PO1AA4AD/7//9P6Wnpys7O1t//vmn9u3bp6+//lpBQUGKjY112niS3KKjo/X111/r6aefVt++fdW0aVOlpaXpt99+05YtW7R9+3YFBwdr7dq1+vbbbzV9+nRL17Dx48fr5Zdf1sqVKy3FXtOmTSVJb731lu699175+vqqU6dO+brZ5ZaZmal33303X3tOETl58mQNHTpUPXv21P33369bbrlFCQkJ2r17t4KCgvT+++/bdM5hYWHq1q2bli5dqj///NPyGPOc8Va57zrZcz62+PXXX/XZZ5/JbDYrKSlJcXFx2rp1q0wmk2bOnGmZRLcgu3bt0qRJk9S9e3fVq1dPWVlZ+uyzz+Tt7a1u3bpZncPOnTu1ZMkSVatWTbVq1VLz5s3tirdRo0aKjo62eoy5JD3//POWde69917NmjVLzz33nAYOHKirV69q1apVCgkJsSq+bIktODhY//jHPxQbG6snn3xSnTt31okTJ7Ry5UqFh4cbulMHAK5EAQUADrB8+XJJ1x9bXq5cOTVo0EDPP/+8+vfvX+y5k4zy9/fX8uXLNX/+fH355Zdav369goKCVK9ePT3//PMqV66c/vjjD02bNk2dOnVS3759Ldv27t1bW7du1axZs9ShQwfVrl1bzZo10wsvvKDVq1frhx9+UHZ2trZv315kAfX222/na69Tp44effRRtW3bVv/3f/+nd999Vx999JFSU1NVtWpVNWvWTA899JBd5z1jxgxVqVJFGzdu1LZt2xQZGam33npL3bt3V5kyZSzr2XM+ttiwYYM2bNggHx8fBQUFqW7duho8eLAGDBiQ72EYeYWGhioqKkrffPONEhIS5O/vr9DQUC1cuFAtWrSwrJfz+Pk5c+bo6tWr6tu3r90FVJs2bdSiRQvNmzdPZ8+e1W233aZp06ZZFXqVKlVSbGyspk+frjfeeMMyJ9epU6fyFVC2xPb8888rODhYH330kaZNm6YKFSqof//+GjFihNUcUADgjkxmZ4zEBQDAhQ4dOqT77rtPb7zxBnc0AAAOxRgoAIBHu3r1ar62pUuXysvLyzIxMAAAjkIXPgCAR/vggw/0yy+/6I477pC3t7e+//57ff/993rooYcKnNsJAIDioAsfAMCj/etf/1JsbKyOHTum1NRU3XrrrerTp4+efvpp+fjwd0IAgGNRQAEAAACAQYyBAgAAAACDKKAAAAAAwKAS3zk8Oztb165dk5eXl9WEigAAAABKF7PZrOzsbPn4+MjLy757SSW+gLp27Zri4uJcHQYAAAAANxEeHm412botSnwBlVNZhoeHy9vb28XRuKesrCzFxcWRIycgt85Dbp2L/DoPuXUecus85NZ5yK1z5c1vzrK9d5+kUlBA5XTb8/b25qIsAjlyHnLrPOTWuciv85Bb5yG3zkNunYfcOlfe/BZnaA8PkQAAAAAAgyigAAAAAMAgCigAAAAAMIgCCgAAAAAMooACAAAAAIMooAAAAADAIAooAAAAADCIAgoAAAAADKKAAgAAAACDKKAAAAAAwCAKKAAAAAAwiAIKAAAAAAyigAIAAAAAgyigAAAAAMAgCigAAAAAMMjH1QEAQEm36Mfjik9MlSTVqRyg6Kj6Lo4IAADYiwIKAJwsPjFVRxKSXR0GAABwALrwAQAAAIBBFFAAAAAAYBAFFAAAAAAYRAEFAAAAAAZRQAEAAACAQRRQAAAAAGAQBRQAAAAAGEQBBQAAAAAGUUABAAAAgEEUUAAAAABgEAUUAAAAABhEAQUAAAAABlFAAQAAAIBBFFAAAAAAYBAFFAAAAAAYRAEFAAAAAAZRQAEAAACAQRRQAAAAAGAQBRQAAAAAGEQBBQAAAAAGUUABAAAAgEEUUAAAAABgEAUUAAAAABhEAQUAAAAABlFAAQAAAIBBFFAAAAAAYBAFFAAAAAAYRAEFAAAAAAZRQAEAAACAQRRQAAAAAGAQBRQAAAAAGOTSAiorK0tz5sxR586d1axZM3Xp0kXz5s2T2Wy2rGM2m/X2228rKipKzZo10+OPP66TJ0+6LmgAAAAApZZLC6iFCxdq1apVeu2117Rp0yaNGjVKH3zwgZYvX261zvLlyzVhwgStWbNG/v7+io6OVnp6ugsjBwAAAFAaubSA2r9/v+666y79/e9/V61atdS9e3dFRUXp559/lnT97tOyZcs0bNgwdenSRY0bN9bMmTN1/vx5ffXVV64MHQAAAEAp5OPKg0dERGjNmjU6ceKEQkJCdPjwYe3du1cxMTGSpDNnzujChQuKjIy0bFOuXDk1b95c+/fvV48ePQwfKysry+HxlxQ5uSFHjkdunceTcmuWlNMz2SzPiNmT8utpyK3zkFvnIbfOQ26dK29+HZFnlxZQTz31lFJSUnTPPffI29tbWVlZeumll9S7d29J0oULFyRJlStXttqucuXKunjxok3HiouLc0zQJRg5ch5y6zzuntvAwEClpaUpJSVFkpSW5qOjR4/qypUrLo7MGHfPrycjt85Dbp2H3DoPuXUuR+bXpQXU5s2b9cUXX+jNN9/UbbfdpkOHDmnatGmqVq2a+vbt69BjhYeHy9vb26H7LCmysrIUFxdHjpyA3DqPJ+XW/8ghBQVdu/6zv78aNmzo4oiK5kn59TTk1nnIrfOQW+cht86VN785y8Xh0gJq5syZeuqppyxd8UJDQ3X27FnNnz9fffv2VdWqVSVJiYmJqlatmmW7xMRENW7c2KZjeXt7c1EWgRw5D7l1Hk/IrUmSyfTXz+4eb26ekF9PRW6dh9w6D7l1HnLrXI7Mr0sfInH16lWZcr5V/I+3t7flMea1atVS1apVtXPnTsvrKSkp+ve//62IiIibGisAAAAAuPQOVKdOnfT++++rRo0ali58S5YsUb9+/SRJJpNJgwYN0nvvvae6deuqVq1aevvtt1WtWjV16dLFlaEDAAAAKIVcWkCNHz9eb7/9tiZOnGjppvfQQw/p2WeftawzdOhQpaWl6bXXXlNSUpJatWqlDz74QH5+fi6MHAAAAEBp5NICKigoSOPGjdO4ceMKXcdkMumFF17QCy+8cBMjAwAAAID8XDoGCgAAAAA8iUvvQAEAimfRj8cVn5hqWa5TOUDRUfVdGBEAACUbBRQAeLD4xFQdSUh2dRgAAJQadOEDAAAAAIMooAAAAADAILrwAaVc7jE0jJ8BAAC4MQoooJRjDA0AAIBxdOEDAAAAAIMooAAAAADAIAooAAAAADCIMVAA7OLMh08wOSwAAHBXFFAA7OLMh0/wYAsAAOCu6MIHAAAAAAZRQAEAAACAQXThA4BSgAmTAQBwDAooACgFGFcGAIBj0IUPAAAAAAyigAIAAAAAgyigAAAAAMAgCigAAAAAMIgCCgAAAAAMooACAAAAAIN4jDkAp8k995DkmvmHnBmDO5wfAAC4uSigADiNO8w95MwY3OH8AADAzUUXPgAAAAAwiAIKwE3j42VydQglHjkGAMC56MIH4KapUdHfatwQY4YcL2+OJalNSCUXRgQAQMlCAQXgpmLckPPlzXGd4AAXRgMAQMlCFz4AAAAAMIgCCgAAAAAMooACAAAAAIMooAAAAADAIAooAAAAADCIAgoAAAAADOIx5gBKDOY/AgAAzkYBBaDEYP4jAADgbHThAwAAAACDKKAAAAAAwCAKKAAAAAAwiAIKAAAAAAyigAIAAAAAgyigAAAAAMAgCigApYqPl6lUHx8AABQP80ABKFVqVPS3mnC3TuUARUfVd9nxXREDAACwHwUUgFIn74S7pe34AADAfnThAwAAAACDKKAAAAAAwCC68AGAB8k9fqpNSCUXR3MdY7oAAKUJBRQAeJDc46fqBAe4OJrrGNMFAChN6MIHAAAAAAZRQAEoNuY2AgAApQVd+AAUW0FzG7nL+BxHcsfxRwAA4OaigALgEHnHwbjL+BxHcsfxRwAA4OaiCx8AAAAAGEQBBcBlGDsFAAA8DV34ALhMaRk7BQAASg4KKAAuVRrGTgEAgJKDLnwAAAAAYBAFFAAAAAAYRBc+ACgAY7MAAEBBKKAAoACMzQIAAAWhCx8AAAAAGEQBBcDtMV8UAABwF3ThA+D28s4XVadygB5vV9fFUQEAgNKIAgqAR8g7JgkAAMAV6MIHAAAAAAZRQAEAHIoxawCAkowufADgpjx1Lqq8Y9ak6+PWoqPqW61nZB0AANwNBRQAuClPnovKyJg1xrUBADwRXfgAAAAAwCAKKAAAAAAwiAIKAAAAAAxyeQGVkJCgUaNGqW3btmrWrJl69eqluLg4y+tms1lvv/22oqKi1KxZMz3++OM6efKk6wIGAAAAUGq5tIC6fPmyHn74Yfn6+mrhwoXauHGjRo8erQoVKljWWbhwoZYvX64JEyZozZo18vf3V3R0tNLT010YOQAAAIDSyKVP4Vu4cKGqV6+uadOmWdpq165t+dlsNmvZsmUaNmyYunTpIkmaOXOmIiMj9dVXX6lHjx43PWYAAAAApZdLC6ivv/5aUVFRGj58uPbs2aNbbrlFjzzyiPr37y9JOnPmjC5cuKDIyEjLNuXKlVPz5s21f/9+mwqorKwsh8dfUuTkhhw5nifk1izJbL7+s7eXyXCsubcz51k22lac7bKzsyVZ59aefRV2zvbGXtS+7N3OlhiMbFfU+2zLtWskhoLybDQPJY0nfC54KnLrPOTWecitc+XNryPy7NIC6vTp01q1apWeeOIJPf3004qLi9PkyZPl6+urvn376sKFC5KkypUrW21XuXJlXbx40aZj5R5XhYKRI+dx19wGBgYqLS1NKSkpkqTK/hW14LujOn7+r7l5QqoEqXMtk65cuVLodunpFZWeftWybLTN3u3S0nx07NgxSX/lNm9MRvdV0Dm3a1DVrtjT0nx09OhRm3NlZDtH5y/v8QpT1LVrNO9581xQjm2JqyRw18+FkoDcOg+5dR5y61yOzK9LCyiz2aywsDCNGDFCknT77bfr6NGjWr16tfr27evQY4WHh8vb29uh+ywpsrKyFBcXR46cwBNy63/kkIKCrkmS/Pz8FH8pVfGXr/31un+WGjZsUuR2fn5ZCgoKsrxupM3e7fz9/dWgQQP9/PPPVrnNHZMtMeQ959Cr2fLzK2tz7P7+/mrYsKHNuTKynaPzV9DxcrPl2jWa99x5LijHRuIqCTzhc8FTkVvnIbfOQ26dK29+c5aLw6UFVNWqVdWgQQOrtvr162vLli2W1yUpMTFR1apVs6yTmJioxo0b23Qsb29vLsoikCPncefcmiSZTLl+zrWc01ZQ7Ea2K6qtONt5eV1/Bk7u3N7sGByZq6K2c3TsRq9HI9eus/NXUrnz54KnI7fOQ26dh9w6lyPz69Kn8LVs2VInTpywajt58qRq1qwpSapVq5aqVq2qnTt3Wl5PSUnRv//9b0VERNzUWAG4Dx+v69+6AwMDXRyJtZy4AABAyeXSO1CDBw/Www8/rPfff1/33HOPfv75Z61Zs0aTJk2SJJlMJg0aNEjvvfee6tatq1q1auntt99WtWrVLE/lA1D61Kjorw93nNLh35Plf+SQTJLahFRydViqUdFfi348rvjEVEubO8QFAAAcx6UFVLNmzRQbG6vZs2dr3rx5qlWrlsaOHavevXtb1hk6dKjS0tL02muvKSkpSa1atdIHH3wgPz8/F0YOwNVOXUrVr7//qaCgazKZpDrBAa4OSZIUn5iqIwl/PZDCXeICAACO4dICSpI6deqkTp06Ffq6yWTSCy+8oBdeeOEmRgUAAAAA+bl0DBQAAAAAeBIKKAAAAAAwiAIKAAAAAAyigAIAAAAAgyigAAAAAMAgCigAAAAAMIgCCgAAAAAMooACAAAAAIMooADAxXy8TG55vMDAQCdHAgCA5/FxdQAAUNrVqOivRT8eV3xiqqWtTUilm368hKR0S5tZUvVAbzVs6LQwAADwSBRQAOAG4hNTdSQh2bJcJzjgph8v/tJfbWazlFaBXxEAAORFFz4AAAAAMIgCCgBQoJs9NgsAAE9A/wwAQIFqBQfqwx2nFH/p+rioOpUDFB1V38VR2S/vuC9PPx8AgGtQQAEACnXqUqp+yzVWypPlHfcFAIA97OrCd/r0aUfHAQAAAABuz64CqmvXrho4cKA+++wzpaenOzomAAAAAHBLdhVQn376qUJDQzV9+nS1b99er732mn7++WdHxwYAAAAAbsWuAqpJkyYaP368fvjhB02dOlXnz5/XI488op49e2rJkiW6dOmSo+MEAAAAAJcr1mPMfXx8dPfdd+udd97RqFGjdOrUKc2YMUMdO3bUK6+8ovPnzzsqTgAAAABwuWI9hS8uLk5r167Vpk2b5O/vryFDhuiBBx5QQkKCYmNj9cwzz+iTTz5xVKwAAAAA4FJ2FVBLlizRunXrdOLECXXo0MFy18nL6/oNrdq1a2v69Onq3LmzQ4MFAAAAAFeyq4BatWqV+vXrp759+6patWoFrhMcHKwpU6YUKzgAAAAAcCd2FVBbt24tcp0yZcqob9++9uweAAAAANySXQ+RWLt2rTZv3pyvffPmzfr000+LHRQA9+HjZXJ1CAAAAG7DrjtQCxYs0MSJE/O1V65cWa+++ip3noASpEZFfy368bjiE1MtbW1CKrkwIgAAANexq4A6e/asatWqla+9Ro0aOnfuXLGDAuBe4hNTdSQh2bJcJzjAhdEAAAC4jl1d+CpXrqwjR47kaz98+LAqVqxY3JgAAAAAwC3ZdQeqR48emjJligIDA9WmTRtJ0k8//aSpU6eqR48eDg0QAAAAANyFXQXUCy+8oN9//12PP/64fHyu7yI7O1t9+vTRSy+95NAAAQAAAMBd2FVAlSlTRnPmzNGJEyd0+PBhlS1bVo0aNVLNmjUdHR8AAAAAuA27CqgcISEhCgkJcVQsAAAAAODW7CqgsrKytG7dOu3atUuJiYnKzs62en3ZsmUOCQ4AAAAA3IldBdSUKVP06aefqmPHjmrYsKFMJibaBAAAAFDy2VVAbdy4UXPmzFHHjh0dHQ8AO+Sd6LZO5QBFR9V3YUSA83C9AwBcya4CytfXV3Xq1HF0LADslHeiW6Ak43oHALiSXRPpDhkyRMuWLZPZbHZ0PAAAAADgtuy6A7V3717t3r1b33//vRo2bGiZCypHbGysQ4IDAAAAAHdiVwFVvnx5de3a1dGxAHCyvGNH2oRUcmE0gGdgzBUAIDe7Cqhp06Y5Og4AN0HesSN1ggNcGA3gGRhzBQDIza4xUJJ07do17dixQ6tXr1ZKSookKSEhQVeuXHFYcAAAAADgTuy6A/X777/rySef1Llz55SRkaH27dsrKChICxcuVEZGhiZNmuToOAEAAADA5ey6AzVlyhSFhYXpp59+kp+fn6W9a9eu2rVrl8OCAwAAAAB3YvdT+FatWqUyZcpYtdesWVMJCQkOCQwAAAAA3I1dd6Cys7OVnZ2dr/2PP/5QYGBgsYMCAAAAAHdkVwHVvn17LV261KrtypUrmjt3rjp27OiQwADYz8fL5OoQUAI5+7riugUAeAK7uvDFxMQoOjpa9957rzIyMjRq1CidPHlSlSpV0uzZsx0dI2yQe74S5iopvWpU9GfOJzics6+rgvbP5xgAwN3YVUBVr15dn332mTZu3KgjR44oNTVVDzzwgHr16qWyZcs6OkbYgPlKkIM5n+AMzr6u+AwDALg7uwooSfLx8VGfPn0cGQsAAAAAuDW7Cqj169ff8PX77rvPnt0CAAAAgFuzq4CaMmWK1fK1a9eUlpYmX19f+fv7U0ABAAAAKJHsKqD27NmTr+3kyZOaMGGCoqOjix0UAAAAALgjux5jXpB69epp5MiR+e5OAQAAAEBJ4bACSrr+YInz5887cpcAAAAA4Dbs6sK3fft2q2Wz2awLFy5oxYoVatmypUMCAwDA0zE3HwCUPHYVUM8++6zVsslkUnBwsO644w6NHj3aIYEBAODpmNcKAEoeuwqow4cPOzoOAAAAAHB7Dh0DBQCAI/l4mTxy3wCAksuuO1DTpk0zvO6YMWPsOQQAAKpR0d9qHFGbkEpO23fO/hOS0p1yPABAyWBXAfXrr7/q0KFDunbtmkJCQiRdnwfKy8tLt99+u2U9k4m/7gEAiif3OKI6wQFO23fO/uMvOe94AADPZ1cB1blzZwUGBmrGjBmqUKGCJOny5csaM2aMWrdurSFDhjg0SAAAAABwB3aNgVq8eLFGjhxpKZ4kqUKFCnrxxRe1ePFihwUHAAAAAO7ErgIqJSVFly5dytd+6dIlXblypdhBAQAAAIA7squA6tq1q8aMGaOtW7fqjz/+0B9//KEtW7Zo3Lhxuvvuux0dIwAAAAC4BbvGQE2cOFEzZszQyJEjde3aNUmSt7e3HnjgAb3yyisODRAAAAAA3IVdBZS/v78mTJigV155RfHx8ZKkOnXqKCCApxUBAAAAKLmKNZHuhQsXdOHCBdWrV08BAQEym82OigsAAAAA3I5dd6D++9//6sUXX9Tu3btlMpm0detW1a5dW2PHjlWFChUUExPj6DgBAAAAwOXsugM1bdo0+fj46Ntvv1XZsmUt7ffee69++OEHhwUHAAAAAO7ErjtQ//rXv7Ro0SJVr17dqr1evXo6e/asQwIDAAAAAHdj1x2o1NRUqztPOf7880+VKVOm2EEBAOCufLxMrg4BAOBCdt2Bat26tdavX68XX3zR0padna0PPvhAbdu2tSuQBQsW6M0339SgQYM0btw4SVJ6erqmT5+uTZs2KSMjQ1FRUXr99ddVpUoVu44BlBSLfjyu+MRUSVKbkEoujgZwT876d1Kjor/VviWpTuUARUfVd9gx8rrZxwMAFM6uAurll1/W448/rl9++UWZmZl644039J///EeXL1/WqlWrbN7fzz//rNWrVys0NNSqferUqfruu+80Z84clStXTv/85z/13HPPafXq1faEDZQY8YmpOpKQLEmqE8z0AUBBnPnvJPe+b4abfTwAQOHs6sLXqFEjbdmyRa1atdJdd92ltLQ0de3aVZ9++qnq1Klj076uXLmil19+WZMnT1aFChUs7cnJyVq7dq1iYmLUrl07hYWFaerUqdq/f78OHDhgT9gAAAAAUCw234HKzMzUk08+qYkTJ2rYsGHFDmDSpEnq2LGjIiMj9d5771nac+5uRUZGWtoaNGigGjVq6MCBA2rRooVNx8nKyip2rJ7ALClnOi6zjJ13zjqlJUc3k7Nym/d9zr1cnDZP2i7n/zKbZZbJo2L3iPfrrx88IvaC/o3d7PfLSAxZWVl2fS4YPV5px+8z5yG3zkNunStvfh2RZ5sLKF9fXx05cqTYB5akjRs36tdff9Unn3yS77WLFy/K19dX5cuXt2qvXLmyLly4YPOx4uLi7I7TUwQGBiotLU0pKSmSpLQ0Hx09elRXrlwxtH1pyJGrODK3ed/n9PSKSk+/alkuTptnbZcuSUr53/XtWbF7xvslVVJ6errbx17QZ52j/p0Y3c5IDHnXMfq5kHc/hR0Pf+H3mfOQW+cht87lyPzaNQaqd+/e+uSTTzRq1Ci7D3zu3DlNmTJFixcvlp+fn937MSo8PFze3t5OP46r+R85pKCga9d/9vdXw4YNi9wmKytLcXFxpSZHN5Ozcpv7ffbz85OfX5aCgoIsr9vb5lnbXT//oMBAyWTysNg94P363+0OPz8/t4+9sM86R/w7MbqdkRhy1rHncyH3fm50vNKO32fOQ26dh9w6V9785iwXh10FVFZWllatWqUdO3YoLCxM/v7+Vq+PGTOmyH0cPHhQiYmJuv/++632u2fPHq1YsUKLFi1SZmamkpKSrO5CJSYmqmrVqjbH7O3tXSouSpMkk+mvn20559KSI1dwdG7zvs+5l4vT5knb5fxfJpNMJs+K3RPeL3NOfmXyiNgL+vd1s98vIzHkXseWzwWjx8N1/D5zHnLrPOTWuRyZX5sKqNOnT6tmzZr67bffdPvtt0uSTpw4YbWOKfcn/A3ccccd+uKLL6zaxowZo/r162vo0KG69dZb5evrq507d6pbt26SpOPHj+vs2bM2j38CAMDVcs8fFRgY6MJIAADFYVMBdffdd+vHH3/U8uXLJUkvvviixo8fb9e8TEFBQWrUqJFVW0BAgCpWrGhp79evn6ZPn64KFSooKChIkydPVkREBAUUAMDj5MwfdSoxVWlpafI/ckh/C6mkhKR05ngCAA9iUwFlzv0IIEnff/+90tLSHBpQbmPHjpWXl5eGDx9uNZEuAACeKD4xVUf+SFZKSoqCgq6pbnCA4i8xxxMAeBK7xkDlyFtQFVfOna0cfn5+ev311ymaAAAAALgFmybSNZlMhsc4AQAA2+UeKwUAcD82d+GLiYlRmTJlJEkZGRmaMGFCvqfwxcbGOi5CAABKkZyxUjnjotqEVHJxRACA3GwqoPr27Wu13Lt3b4cGAwAA/jdW6n/jouoEB7g4GgBAbjYVUNOmTXNWHAAAAADg9mwaAwUAAAAApRkFFAAAAAAYRAEFAAAAAAZRQAEAAACAQRRQAACPxrxJAICbyaan8AEA4G7yzpskld65k3LnoU7lAEVH1XdxRABQ8lBAAQA8Xu55k6TSO3dS3jwAAByPLnwAAAAAYBAFFAAAAAAYRAEFAAAAAAZRQAEAAACAQRRQAAAAAGAQBRQAAAAAGEQBBQAAAAAGUUABAAAAgEEUUAAAAABgEAUUAAAAABhEAQUAAAAABlFAAQAAAIBBFFAAAAAAYBAFFAAAAAAYRAEFAAAAAAZRQAEAAACAQRRQAAAAAGAQBRQAAAAAGEQBBQAAAAAG+bg6AAB/WfTjccUnplqW24RUUkJSer42AAAAuAYFFOBG4hNTdSQh2bJcJzhA8ZfytwEAAMA16MIHAAAAAAZRQAEAAACAQRRQAAAAAGAQBRQAAAAAGEQBBQAAAAAGUUABAFBMPl4mV4cAALhJeIw54EK5531ififAc9Wo6F/gPG4AgJKHAgpwodzzPjG/E+DZCprHDQBQ8tCFDwAAAAAMooACAAAAAIMooAAAAADAIAooAAAAADCIAgoAAAAADKKAAgAAAACDKKAAAAAAwCAKKAAAAAAwiAIKAAAAAAyigAIAAAAAgyigAAAAAMAgCigAAAAAMIgCCgAAAAAMooACAAAAAIMooAAA8DA+XiZXhwAApZaPqwMAAAC2qVHRX4t+PK74xFRLW5uQSi6MCABKDwooAAA8UHxiqo4kJFuW6wQHuDAaACg96MIHAAAAAAZRQAEAAACAQRRQAAAAAGAQBRQAAAAAGEQBBQAAAAAGUUABAAAAgEE8xhwAgFIk7/xRdSoHKDqqvgsjAgDPQgEFAEApknf+KACAbejCBwAAAAAGUUABAAAAgEF04QMAAPnkHitV2DipvOOp2oRUUkJSepHbAYAno4ACAAD5GBkrlXedOsEBir/EGCsAJRtd+AAAAADAIAooAAAAADDIpV345s+fr61bt+r48eMqW7asIiIiNGrUKNWv/1d/6fT0dE2fPl2bNm1SRkaGoqKi9Prrr6tKlSoujBylmb1zqBQ0VgAAYBxzWAFwBy4toH766Sc9+uijCg8PV1ZWlmbPnq3o6Ght3LhRAQEBkqSpU6fqu+++05w5c1SuXDn985//1HPPPafVq1e7MnSUYvbOoVLQWAEAgHHMYQXAHbi0gFq0aJHV8vTp09WuXTsdPHhQbdq0UXJystauXatZs2apXbt2kq4XVPfee68OHDigFi1auCBqAAAAAKWVWz2FLzn5+l+VKlSoIEn65ZdflJmZqcjISMs6DRo0UI0aNWwuoLKyshwaq7sySzKb//rZyHnnrFNaclRcuXOcs1xY7nLas7OzC9wu7/tV1DqO3M4dYijOdjn/l9kss0weFbtHvF9//eB5sbvBdjfa118NZqfHXtBnU0HbFbWet5fJ8L6MbGevomLn95nzkFvnIbfOlTe/jsiz2xRQ2dnZmjp1qlq2bKlGjRpJki5evChfX1+VL1/eat3KlSvrwoULNu0/Li7OYbG6q8DAQKWlpSklJUWSlJbmo6NHj+rKlSuGti8NOSquvDmWjOX52LFj+bZLT6+o9PSrlra8y0bb7N3OHWIo3nbpkqSU/+Xds2L3jPdLqqT09HSPjN3V291wX/+7ZlOuXFF6errTYijos8noZ1je9Sr7V9SC747q+Pm/us+1a1C1yBgK2i6kSpA61zIZ/t1ka+wSv8+cidw6D7l1Lkfm120KqIkTJ+ro0aNauXKlU/YfHh4ub29vp+zbnfgfOaSgoGvXf/b3V8OGDYvcJisrS3FxcaUmR8WVO8fSjfOck9sGDRrI/8gRq+38/Pzk55eloKCgApeNttm7nTvEULztrucyKDBQMpk8LHYPeL/+92d+Pz8/z4vdDba74b4CA5Vy5YqCAgOdGkNhn01GP8Nyr+fn56f4S6mKv/zXdqFXs+XnV7bI2PNu5++fpYYNm+Q7nhFFxc7vM+cht85Dbp0rb35zlovDLQqoSZMm6dtvv9VHH32k6tWrW9qrVKmizMxMJSUlWd2FSkxMVNWqVW06hre3d6m4KE2STKa/frblnEtLjoord45zlovKm5eXV4Hb5X2/ilrHkdu5QwzF2S7n/zKZZDJ5Vuye8H6Zc/Irk8fF7g7b3WhffzWYnB57QZ9NBW1X1HqOzp+9v2uM7ovfZ85Dbp2H3DqXI/Pr0nmgzGazJk2apG3btmnp0qWqXbu21ethYWHy9fXVzp07LW3Hjx/X2bNneYAEAAA34ONlKnolAIDNXHoHauLEidqwYYPeffddBQYGWsY1lStXTmXLllW5cuXUr18/TZ8+XRUqVFBQUJAmT56siIgICigAAG6gRkV/j5p/LneszO8EwJ25tIBatWqVJGngwIFW7dOmTdP9998vSRo7dqy8vLw0fPhwq4l0AQDAjXnS/HPM8QTAU7i0gDpy5EiR6/j5+en111+naAIAAADgci4dAwUAAAAAnoQCCnCywMBAV4cAAAAAB3GLx5gDJU3OYGizpLS0NHVM/8PVIQEAAMABKKAAJ8gZDG02SykpKQqtWdnVIQEAAMAB6MIHAAAAAAZRQAHFxGSVADyZO36GuWNMAJCDLnxAMeWdrNKdJ6oEgLzcccJdd4wJAHJQQAEOkHsCSHeeqBIACuKOE+66Y0wAINGFDwAAAAAMo4ACAAAAAIMooAAAAADAIAooAAAAADCIAgoAAAAADKKAAgAANw1zPAHwdDzGHAAA3DTM8QTA01FAAQCAm4o5ngB4MrrwAQAAAIBBFFAAAMAjFTSeKjAw0AWRAChN6MIHAAA8Ut7xVGZJ1QO91bCha+MCULJRQAEAAI+VezyV2SylVeCrDQDnogsfAAAAABhEAQUAAAAABnGfGwAAoBhyj8OqUzlA0VH1XRwRAGeigAIAACiGvPNaASjZ6MIHAAAAAAZRQAEAAACAQRRQAAAAAGAQBRQAAAAAGEQBBQAAAAAGUUABAAAAgEE8xhz4n9zzeEhSm5BKSkhKz9cGAMDNkvd3E/NMAa5HAQX8T955POoEByj+Uv42AABuFuaYAtwPXfgAAAAAwCAKKAAAAAAwiAIKAACUGD5eJleHAKCEYwwUSq3cA3N5OAQAlAy1ggP14Y5Tir/01+d73gcCFedBDAU9cAhA6UIBhVIr98BcHg4BACXHqUup+i3X53veBwIVR0EPHAJQutCFDwAAAAAMooACAAClCuOkABQHXfhQ4jDpIADgRmpU9HeL3xW5Y+B3FeA5KKBQ4jDpIACgKO7wu8IdYgBgO7rwAQAAAIBBFFAAAAAAYBAFFAAAAAAYRAEFAAAAAAZRQAEAAACAQRRQAACg1GNuKABG8RhzAABQ6uWdG6pNSCUlJKVbzRXVJqSS3fvPO+9UcfZV1P6ZUwpwLgooAAAAWc/LVCc4QPGXrOdpqhMc4JB9F3dfRvYPwHnowgcAAAAABlFAAQAAOAhjqYCSjy58AAAADpJ3LJXk+PFOAFyLAgoAAMCBnD3eCYBr0YUPAAAAAAyigAIAAPAQRsZYMQ4LcC668AEAAHgII2OsClqHuaFuDvJeOlBAAQAAeBAjY6yYF8o1yHvpQBc+AAAAADCIAgoAAKCEY1wU4Dh04YPHy93fmLk2AADIj3FRgONQQMHj5e5vzFwbAAAUjPE5gGPQhQ8AAAAADKKAQolHv28AAAA4Cl344LYKmuciISn9hnNfFMTInBkAAMB+jhxfxVgtuDsKKLitgua5iL9U9NwXRvcFAAAcw5HjqxirBXdHFz4AAAAAMIgCqgSzZeyPycQ4IQAAShNnjhFm/DFKMrrwlWCFjf3JO46oTnCA2ld1TJc2+i0DAOAZ8n5PKPA7QiG/x4uag9GWeafccT5Hvs8UT0nPHwVUCWdkHJFZUvuqjrkU6LcMAIDnyDuXYt7vCEa3K2qd4u7rZuP7TPGU9PzRhQ8AAAAADKKAAgAAAACDKKAgHy+T/P39XR0GAABwM7kfBhEYGOiwfXkae2P35HNG4TxiDNSKFSu0aNEiXbhwQY0bN9arr76qZs2auTosu7jjoLoaFf216Viazh04JJONMTly4Kc7DiIFAKA0y3kYxKnEVKWlpcn/yCH9zc7f0Y6e2D73vow8oCLneLkflGH0O48tD8VwxHbF4Y7fNUsaty+gNm3apGnTpmnixIlq3ry5li5dqujoaH355ZeqXLmyq8OzmbsOqjt5MUUn/5spW59m7siBn+44iBQAgNIuPjFVR/5IVkpKioKCrqluMX5HO3JieyPfqYw8TMuRx3PkdvZy1++aJYnbd+FbsmSJ+vfvr379+um2227TxIkTVbZsWa1du9bVoQEAAAAoZdz6DlRGRoYOHjyof/zjH5Y2Ly8vRUZGav/+/Yb2YTabLfvy9vZ2Spy2qBfsL2+T2bJcu5K/MjIynLL/6uV85SXr4xXUdms5X2VlBirQL1MymWyKqajjOXJfRtpu9nZF7stsVlq6j24t5ytvT4vdA7bLrF1R/n5+ksnkcbG7/ftlNqtGBT8F+Jnl42mxu8F2N9yXspWW7iN/Pz/Pi93Nt3PkdXuztyvs92Xe7w0ui/0G162zrzUjubE3f8XJe0Hb2rNddna2AgIClJmZqaysrHyx2MrZ3zU9JYYcOTnNqQVylnNqBHuYzMXZ2skSEhLUoUMHrV69WhEREZb2mTNnas+ePfr444+L3EdGRobi4uKcGSYAAAAADxIeHq4yZcrYta1b34FyBB8fH4WHh8vLy0smWwf4AAAAACgxzGazsrOz5eNjfxnk1gVUpUqV5O3trcTERKv2xMREValSxdA+vLy87K4uAQAAACA3t36IRJkyZdS0aVPt3LnT0padna2dO3dadekDAAAAgJvBre9ASdITTzyh0aNHKywsTM2aNdPSpUuVlpam+++/39WhAQAAAChl3L6Auvfee3Xp0iW98847unDhgpo0aaIPPvjAcBc+AAAAAHAUt34KHwAAAAC4E7ceAwUAAAAA7oQCCgAAAAAMooACAAAAAIMooAAAAADAIAqoEm7+/Pnq16+fIiIi1K5dOz3zzDM6fvz4DbdZt26dQkNDrf4LDw+/SRF7jpUrV6pXr15q2bKlWrZsqYceekjffffdDbfZvHmzunfvrvDwcPXq1avI9UsrW3PLNWu/BQsWKDQ0VFOmTLnhely79jGSX65fY+bOnZsvT927d7/hNly3xtiaW65Z2yQkJGjUqFFq27atmjVrpl69eikuLu6G2+zevVt9+/ZVWFiYunbtqnXr1t2kaD2PrfndvXt3vus3NDRUFy5cMHxMt3+MOYrnp59+0qOPPqrw8HBlZWVp9uzZio6O1saNGxUQEFDodkFBQfryyy8tyyaT6WaE61GqV6+uUaNGqW7dujKbzVq/fr2effZZffrpp2rYsGG+9fft26eRI0dqxIgR6tSpk7744gs9++yzWrdunRo1auSCM3BftuZW4pq1x88//6zVq1crNDT0hutx7drHaH4lrl+jGjZsqCVLlliWvb29C12X69Y2tuRW4po16vLly3r44YfVtm1bLVy4UJUqVdKpU6dUoUKFQrc5ffq0/vGPf2jAgAGaNWuWdu7cqfHjx6tq1aq68847b2L07s+e/Ob48ssvFRQUZFmuXLmy4eNSQJVwixYtslqePn262rVrp4MHD6pNmzaFbmcymVS1alVnh+fROnfubLX80ksvadWqVTpw4ECBX/KXLVumO++8U08++aQk6cUXX9SOHTv00UcfadKkSTclZk9ha24lrllbXblyRS+//LImT56s995774brcu3azpb8Sly/Rnl7exvOE9etbWzJrcQ1a9TChQtVvXp1TZs2zdJWu3btG26zevVq1apVSzExMZKkBg0aaO/evfrwww8poPKwJ785KleurPLly9t1XLrwlTLJycmSVGRlnpqaqk6dOqljx44aNmyYjh49ejPC81hZWVnauHGjUlNTFRERUeA6Bw4cULt27azaoqKidODAgZsQoecykluJa9ZWkyZNUseOHRUZGVnkuly7trMlvxLXr1GnTp1SVFSU7rrrLo0cOVJnz54tdF2uW9vYkluJa9aor7/+WmFhYRo+fLjatWun++67T2vWrLnhNly7xtmT3xz33XefoqKi9MQTT2jv3r02HZc7UKVIdna2pk6dqpYtW96w+0JISIimTp2q0NBQJScna/HixRowYIA2btyo6tWr38SI3d+RI0c0YMAApaenKyAgQPPmzdNtt91W4LoXL15UlSpVrNoqV66sixcv3oxQPY4tueWatc3GjRv166+/6pNPPjG0PteubWzNL9evMc2aNdO0adMUEhKiCxcuaN68eXr00Uf1xRdfWHXDycF1a5ytueWaNe706dNatWqVnnjiCT399NOKi4vT5MmT5evrq759+xa4TUHXbpUqVZSSkqKrV6+qbNmyNyN0j2BPfqtWraqJEycqLCxMGRkZ+vjjjzVo0CCtWbNGTZs2NXRcCqhSZOLEiTp69KhWrlx5w/UiIiKs/tIfERGhe++9V6tXr9aLL77o5Cg9S0hIiNavX6/k5GRt2bJFo0eP1kcffVToF30YZ0tuuWaNO3funKZMmaLFixfLz8/P1eGUOPbkl+vXmI4dO1p+bty4sZo3b65OnTpp8+bNevDBB10YmeezNbdcs8aZzWaFhYVpxIgRkqTbb79dR48e1erVqwv9gg/j7Mlv/fr1Vb9+fctyy5Ytdfr0aX344Yd64403DB2XAqqUmDRpkr799lt99NFHNv91yNfXV02aNFF8fLyTovNcZcqUUd26dSVJYWFhiouL07JlywrsX1+lSpV8f/lMTEzM91cmXGdLbvPimi3cwYMHlZiYqPvvv9/SlpWVpT179mjFihWKi4vLN3ica9c4e/KbF9evMeXLl1e9evUKzRPXrf2Kym1eXLOFq1q1qho0aGDVVr9+fW3ZsqXQbQq6di9evKigoCDuPuVhT34LEh4ern379hlenzFQJZzZbNakSZO0bds2LV261PDAutyysrL022+/MVjUgOzsbGVkZBT4WosWLbRr1y6rth07dqhFixY3ITLPd6Pc5sU1W7g77rhDX3zxhdavX2/5LywsTL169dL69esL/HLPtWucPfnNi+vXmCtXruj06dOF5onr1n5F5TYvrtnCtWzZUidOnLBqO3nypGrWrFnoNly7xtmT34IcPnzYpuuXO1Al3MSJE7Vhwwa9++67CgwMtDzjvly5cpa/Yrzyyiu65ZZbNHLkSElSbGysWrRoobp16yopKUmLFi3S2bNn6SKRx5tvvqkOHTro1ltv1ZUrV7Rhwwb99NNPlicf5s3roEGDNHDgQC1evFgdO3bUpk2b9Msvv/A0qALYmluuWeOCgoLyjYEMCAhQxYoVLe1cu/azJ79cv8bMmDFDnTp1Uo0aNXT+/HnNnTtXXl5e6tmzpySu2+KwNbdcs8YNHjxYDz/8sN5//33dc889+vnnn7VmzRqr6/DNN99UQkKCZs6cKUkaMGCAVqxYoZkzZ6pfv37atWuXNm/erPnz57vqNNyWPfn98MMPVatWLTVs2FDp6en6+OOPtWvXLi1evNjwcSmgSrhVq1ZJkgYOHGjVPm3aNEsXk3PnzsnL66+bkUlJSXr11Vd14cIFVahQQU2bNtXq1asZ15NHYmKiRo8erfPnz6tcuXIKDQ3VokWL1L59e0n589qyZUvNmjVLc+bM0ezZs1WvXj3NmzeP+UgKYGtuuWYdi2vXubh+7fPHH39oxIgR+vPPPxUcHKxWrVppzZo1Cg4OlsR1Wxy25pZr1rhmzZopNjZWs2fP1rx581SrVi2NHTtWvXv3tqxz4cIFnTt3zrJcu3ZtzZ8/X9OmTdOyZctUvXp1TZ48mUeYF8Ce/GZmZmrGjBlKSEiQv7+/GjVqpCVLluiOO+4wfFyT2Ww2O/RMAAAAAKCEYgwUAAAAABhEAQUAAAAABlFAAQAAAIBBFFAAAAAAYBAFFAAAAAAYRAEFAAAAAAZRQAEAAACAQRRQAAAAAGAQBRQAFOHMmTMKDQ3VoUOHXB2KxbFjx9S/f3+Fh4erT58+Nm/vjufkLubOnWtXTt1NRkaGunbtqn379kniPc/N1vf40qVLateunf744w8nRgXAU1BAAXB7MTExCg0N1YIFC6zav/rqK4WGhrooKteaO3eu/P399eWXX+rDDz90dTgON3DgQE2ZMsUlxx4yZEixc+qsIsyW/a5evVq1atVSy5YtHR5Hblu3btWQIUPUtm3bQgu09PR0TZw4UW3btlVERISef/55Xbx40alxOVJwcLDuu+8+vfPOO64OBYAboIAC4BH8/Py0cOFCXb582dWhOExGRobd28bHx6tVq1aqWbOmKlWq5MCoiqc45+QM9sQTGBjoVjm1h9ls1ooVK/TAAw84/Vipqalq2bKlRo0aVeg6U6dO1TfffKM5c+Zo+fLlOn/+vJ577jmnx+ZI999/v7744gv9+eefrg4FgItRQAHwCJGRkapSpYrmz59f6DoF/XX+ww8/VOfOnS3LMTExeuaZZ/T+++8rMjJSrVu3VmxsrK5du6YZM2bob3/7mzp06KC1a9fm2//x48c1YMAAhYeHq2fPnvrpp5+sXv/tt9/05JNPKiIiQpGRkXr55Zd16dIly+sDBw7UpEmTNGXKFLVt21bR0dEFnkd2drZiY2PVoUMHhYWFqU+fPvr+++8tr4eGhurgwYOaN2+eQkNDNXfu3EL3s3DhQnXt2lVhYWH6+9//rvfee89qndOnT2vgwIFq3ry5evfurf3791te++9//6sRI0bozjvvVPPmzdWrVy9t2LDBavvCzmnJkiXq1auXWrRooY4dO2rChAm6cuWK1bZ79+61HLtNmzaKjo7W5cuXFRMTo59++knLli1TaGioQkNDdebMGbtzbDabNXfuXP39739XWFiYoqKiNHny5AJzJuW/jnKumUWLFikqKkpt27bVxIkTlZmZWeD269atU2xsrA4fPmyJf926dZKkpKQkjRs3TnfccYdatmypQYMG6fDhw5KudxNr37693n//fcu+9u3bp7CwMO3cufOG+83rl19+UXx8vDp27FjoeUrSTz/9pAceeMCSl1mzZunatWuW11NSUjRy5Ei1aNFCUVFR+vDDD/PdHbzvvvv03HPPqV27dgUeIzk5WWvXrlVMTIzatWunsLAwTZ06Vfv379eBAwcKjW3FihW6++67FR4ersjISA0fPtzyWlHX9htvvKFu3bqpefPmuuuuuzRnzpxC368cH3/8se655x6Fh4ere/fuWrFihdXrDRs2VLVq1bRt27Yb7gdAyefj6gAAwAgvLy+NGDFCI0eO1KBBg1S9enW797Vr1y5Vr15dH330kfbt26dx48Zp//79atOmjdasWaNNmzbp9ddfV/v27a2OM3PmTI0dO1a33XablixZoqefflrbt29XpUqVlJSUpMGDB+vBBx/UmDFjlJ6erlmzZunFF1/UsmXLLPv49NNP9fDDD2vVqlWFxrds2TItWbJEkyZNUpMmTbR27Vo988wz2rBhg+rVq6cff/xRTzzxhO68804NGTJEAQEBBe7nzTff1Mcff6wxY8aoVatWOn/+vE6cOGG1zltvvaXRo0erbt26euuttzRy5Eht3bpVPj4+ysjIUNOmTTV06FAFBQXp22+/1SuvvKI6deqoWbNmNzwnk8mkcePGqVatWjp9+rQmTpyoN954QxMmTJAkHTp0SI8//rj69euncePGydvbW7t371ZWVpbGjRunkydPqmHDhpYvzcHBwXbneMuWLfrwww81e/ZsNWzYUBcvXrQULUbt3r1bVatW1dKlSxUfH6+XXnpJTZo0Uf/+/fOte++99+ro0aP64YcftGTJEklSuXLlJEkvvPCC5W5quXLl9H//938aPHiwtmzZouDgYE2dOlXPPvus2rdvr5CQEL3yyit69NFH1a5dO129erXQ/ea1d+9e1atXT0FBQYWeU0JCgp566in17dtXM2bM0IkTJzR+/Hj5+fnp+eeflyRNnz5d+/fv13vvvafKlSvrnXfe0cGDB9W4cWPDufvll1+UmZmpyMhIS1uDBg1Uo0YNHThwQC1atMi3TVxcnKZMmaKZM2cqIiJCly9f1v/7f//P8npR13ZgYKCmTZumatWq6bffftOrr76qwMBADR06tMAYP//8c7399tt67bXX1KRJEx06dEivvvqqAgIC1LdvX8t6zZo10969e/Xggw8aPn8AJZAZANzc6NGjzcOGDTObzWZz//79zWPGjDGbzWbztm3bzI0aNbKs984775h79+5tte2SJUvMnTp1stpXp06dzFlZWZa2bt26mR955BHL8rVr18wtWrQwb9iwwWw2m82nT582N2rU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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "plt.figure(figsize=(10, 5))\n", "sns.histplot(text_lengths_log10, bins=150)\n", @@ -172,20 +144,9 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(192, 2101736)" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "min(text_lengths), max(text_lengths)" ] diff --git a/pyproject.toml b/pyproject.toml index 6aafb77a..cf0a4ba2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [tool.poetry] -name = "doms_databasen" +name = "domsdatabasen" description = "Scraper and PDF text processor for domsdatabasen.dk" version = "0.2.0" authors = [ @@ -66,7 +66,7 @@ extend-select = [ "D", ] exclude = [ - "src/doms_databasen/_xpaths.py", + "src/domsdatabasen/_xpaths.py", ] [tool.ruff.pydocstyle] @@ -100,5 +100,5 @@ filterwarnings = [ log_cli_level = "info" testpaths = [ "tests", - "src/doms_databasen", + "src/domsdatabasen", ] diff --git a/src/doms_databasen/__init__.py b/src/doms_databasen/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/src/domsdatabasen/__init__.py b/src/domsdatabasen/__init__.py new file mode 100644 index 00000000..6a7970e6 --- /dev/null +++ b/src/domsdatabasen/__init__.py @@ -0,0 +1 @@ +"""__init__.py file for the domsdatabasen package.""" diff --git a/src/doms_databasen/_constants.py b/src/domsdatabasen/_constants.py similarity index 100% rename from src/doms_databasen/_constants.py rename to src/domsdatabasen/_constants.py diff --git a/src/doms_databasen/_exceptions.py b/src/domsdatabasen/_exceptions.py similarity index 50% rename from src/doms_databasen/_exceptions.py rename to src/domsdatabasen/_exceptions.py index 218b6341..dcff29bf 100644 --- a/src/doms_databasen/_exceptions.py +++ b/src/domsdatabasen/_exceptions.py @@ -1,4 +1,4 @@ -"""Exceptions for the doms_databasen package.""" +"""Exceptions for the domsdatabasen package.""" class PDFDownloadException(Exception): diff --git a/src/doms_databasen/_text_extraction.py b/src/domsdatabasen/_text_extraction.py similarity index 100% rename from src/doms_databasen/_text_extraction.py rename to src/domsdatabasen/_text_extraction.py diff --git a/src/doms_databasen/_utils.py b/src/domsdatabasen/_utils.py similarity index 96% rename from src/doms_databasen/_utils.py rename to src/domsdatabasen/_utils.py index 6e4de641..0315036d 100644 --- a/src/doms_databasen/_utils.py +++ b/src/domsdatabasen/_utils.py @@ -1,4 +1,4 @@ -"""Utility function for the doms_databasen package.""" +"""Utility function for the domsdatabasen package.""" import json from typing import List diff --git a/src/doms_databasen/_xpaths.py b/src/domsdatabasen/_xpaths.py similarity index 100% rename from src/doms_databasen/_xpaths.py rename to src/domsdatabasen/_xpaths.py diff --git a/src/doms_databasen/dataset_builder.py b/src/domsdatabasen/dataset_builder.py similarity index 98% rename from src/doms_databasen/dataset_builder.py rename to src/domsdatabasen/dataset_builder.py index 5f2e85db..f1d810cc 100644 --- a/src/doms_databasen/dataset_builder.py +++ b/src/domsdatabasen/dataset_builder.py @@ -8,7 +8,7 @@ from omegaconf import DictConfig -from doms_databasen._utils import append_jsonl, init_jsonl, read_json +from domsdatabasen._utils import append_jsonl, init_jsonl, read_json logger = getLogger(__name__) diff --git a/src/doms_databasen/processor.py b/src/domsdatabasen/processor.py similarity index 99% rename from src/doms_databasen/processor.py rename to src/domsdatabasen/processor.py index f90699fe..059fdea9 100644 --- a/src/doms_databasen/processor.py +++ b/src/domsdatabasen/processor.py @@ -173,7 +173,7 @@ def _raw_data_exists(self, case_dir) -> bool: and contains two files: the PDF document and the tabular data. Same code as the method `_already_scraped` from class `Scraper` - (src/doms_databasen/scraper.py). + (src/domsdatabasen/scraper.py). Args: case_dir (Path): diff --git a/src/doms_databasen/scraper.py b/src/domsdatabasen/scraper.py similarity index 100% rename from src/doms_databasen/scraper.py rename to src/domsdatabasen/scraper.py diff --git a/src/scripts/finalize.py b/src/scripts/finalize.py index c934c42f..7a55397c 100644 --- a/src/scripts/finalize.py +++ b/src/scripts/finalize.py @@ -11,7 +11,7 @@ import hydra -from doms_databasen.dataset_builder import DatasetBuilder +from domsdatabasen.dataset_builder import DatasetBuilder from omegaconf import DictConfig diff --git a/src/scripts/process.py b/src/scripts/process.py index 13a36fcd..f9818e68 100644 --- a/src/scripts/process.py +++ b/src/scripts/process.py @@ -17,7 +17,7 @@ import logging import hydra -from doms_databasen.processor import Processor +from domsdatabasen.processor import Processor from omegaconf import DictConfig logger = logging.getLogger(__name__) diff --git a/src/scripts/scrape.py b/src/scripts/scrape.py index 18b185ea..2134dd3a 100644 --- a/src/scripts/scrape.py +++ b/src/scripts/scrape.py @@ -17,7 +17,7 @@ import logging import hydra -from doms_databasen.scraper import Scraper +from domsdatabasen.scraper import Scraper from omegaconf import DictConfig logger = logging.getLogger(__name__) diff --git a/tests/processor/test_processor.py b/tests/processor/test_processor.py index 39d5883e..0ec23539 100644 --- a/tests/processor/test_processor.py +++ b/tests/processor/test_processor.py @@ -2,7 +2,7 @@ import pytest -from doms_databasen.processor import Processor +from domsdatabasen.processor import Processor @pytest.fixture(scope="module") diff --git a/tests/processor/test_text_extraction.py b/tests/processor/test_text_extraction.py index 9040b587..5ac62b64 100644 --- a/tests/processor/test_text_extraction.py +++ b/tests/processor/test_text_extraction.py @@ -3,7 +3,7 @@ import cv2 import numpy as np import pytest -from doms_databasen._text_extraction import PDFTextReader +from domsdatabasen._text_extraction import PDFTextReader from PIL import Image diff --git a/tests/scraper/conftest.py b/tests/scraper/conftest.py index 53947fe4..ad85f650 100644 --- a/tests/scraper/conftest.py +++ b/tests/scraper/conftest.py @@ -3,7 +3,7 @@ import shutil import pytest -from doms_databasen.scraper import Scraper +from domsdatabasen.scraper import Scraper from hydra import compose, initialize # Initialise Hydra