Repository: tkscode/pyNormalizeNumExp (language: python)

Issue:
型アノテーションの修正＆Pythonの対応バージョンを3.8～3.12に変更



Discussion / hints:

Fix patch:
diff --git a/.github/workflows/upload_python_package.yml b/.github/workflows/upload_python_package.yml
index c71b1ce..f95b1b6 100644
--- a/.github/workflows/upload_python_package.yml
+++ b/.github/workflows/upload_python_package.yml
@@ -18,7 +18,7 @@ jobs:
       - name: Set up Python
         uses: actions/setup-python@v2
         with:
-          python-version: '3.9'
+          python-version: '3.11'
       # Poetryのインストール
       - name: Install Poetry
         run: |
diff --git a/.vscode/settings.json b/.vscode/settings.json
index e94960f..1574fe1 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -35,20 +35,9 @@
     "**/.cov/**": true
   },
   "python.analysis.autoImportCompletions": false,
-  "python.formatting.provider": "autopep8",
-  "python.linting.enabled": true,
-  "python.linting.pylintEnabled": false,
-  "python.linting.flake8Enabled": true,
-  "python.linting.lintOnSave": true,
   "python.testing.unittestEnabled": false,
   "python.testing.pytestEnabled": true,
   "python.testing.pytestArgs": [],
   "python.testing.autoTestDiscoverOnSaveEnabled": false,
   "python.defaultInterpreterPath": ".venv/bin/python",
-  "python.linting.ignorePatterns": [
-    "**/site-packages/**/*.py",
-    ".vscode/*.py",
-    "**/__init__.py",
-    "tests/**/*.py"
-  ]
 }
\ No newline at end of file
diff --git a/README.md b/README.md
index 5d01b8e..c7b83d9 100644
--- a/README.md
+++ b/README.md
@@ -12,7 +12,7 @@
 
 ## Prerequisites
 
-Python >=3.7, <=3.10
+Python >=3.9, <=3.12
 
 
 ## Installation
diff --git a/poetry.lock b/poetry.lock
index da521d4..be2deee 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,109 +1,176 @@
-[[package]]
-name = "atomicwrites"
-version = "1.4.0"
-description = "Atomic file writes."
-category = "dev"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
-
-[[package]]
-name = "attrs"
-version = "21.2.0"
-description = "Classes Without Boilerplate"
-category = "dev"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
-
-[package.extras]
-dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"]
-docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"]
-tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"]
-tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"]
+# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand.
 
 [[package]]
 name = "autopep8"
-version = "1.6.0"
+version = "2.0.4"
 description = "A tool that automatically formats Python code to conform to the PEP 8 style guide"
-category = "dev"
 optional = false
-python-versions = "*"
+python-versions = ">=3.6"
+files = [
+    {file = "autopep8-2.0.4-py2.py3-none-any.whl", hash = "sha256:067959ca4a07b24dbd5345efa8325f5f58da4298dab0dde0443d5ed765de80cb"},
+    {file = "autopep8-2.0.4.tar.gz", hash = "sha256:2913064abd97b3419d1cc83ea71f042cb821f87e45b9c88cad5ad3c4ea87fe0c"},
+]
 
 [package.dependencies]
-pycodestyle = ">=2.8.0"
-toml = "*"
+pycodestyle = ">=2.10.0"
+tomli = {version = "*", markers = "python_version < \"3.11\""}
 
 [[package]]
 name = "bandit"
-version = "1.7.0"
+version = "1.7.6"
 description = "Security oriented static analyser for python code."
-category = "dev"
 optional = false
-python-versions = ">=3.5"
+python-versions = ">=3.8"
+files = [
+    {file = "bandit-1.7.6-py3-none-any.whl", hash = "sha256:36da17c67fc87579a5d20c323c8d0b1643a890a2b93f00b3d1229966624694ff"},
+    {file = "bandit-1.7.6.tar.gz", hash = "sha256:72ce7bc9741374d96fb2f1c9a8960829885f1243ffde743de70a19cee353e8f3"},
+]
 
 [package.dependencies]
 colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""}
-GitPython = ">=1.0.1"
+GitPython = ">=3.1.30"
 PyYAML = ">=5.3.1"
-six = ">=1.10.0"
+rich = "*"
 stevedore = ">=1.20.0"
 
+[package.extras]
+test = ["beautifulsoup4 (>=4.8.0)", "coverage (>=4.5.4)", "fixtures (>=3.0.0)", "flake8 (>=4.0.0)", "pylint (==1.9.4)", "stestr (>=2.5.0)", "testscenarios (>=0.5.0)", "testtools (>=2.3.0)", "tomli (>=1.1.0)"]
+toml = ["tomli (>=1.1.0)"]
+yaml = ["PyYAML"]
+
 [[package]]
 name = "colorama"
-version = "0.4.4"
+version = "0.4.6"
 description = "Cross-platform colored terminal text."
-category = "dev"
 optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+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 = "coverage"
-version = "6.1.1"
+version = "7.4.0"
 description = "Code coverage measurement for Python"
-category = "dev"
 optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.8"
+files = [
+    {file = "coverage-7.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36b0ea8ab20d6a7564e89cb6135920bc9188fb5f1f7152e94e8300b7b189441a"},
+    {file = "coverage-7.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0676cd0ba581e514b7f726495ea75aba3eb20899d824636c6f59b0ed2f88c471"},
+    {file = "coverage-7.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0ca5c71a5a1765a0f8f88022c52b6b8be740e512980362f7fdbb03725a0d6b9"},
+    {file = "coverage-7.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7c97726520f784239f6c62506bc70e48d01ae71e9da128259d61ca5e9788516"},
+    {file = "coverage-7.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:815ac2d0f3398a14286dc2cea223a6f338109f9ecf39a71160cd1628786bc6f5"},
+    {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:80b5ee39b7f0131ebec7968baa9b2309eddb35b8403d1869e08f024efd883566"},
+    {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5b2ccb7548a0b65974860a78c9ffe1173cfb5877460e5a229238d985565574ae"},
+    {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:995ea5c48c4ebfd898eacb098164b3cc826ba273b3049e4a889658548e321b43"},
+    {file = "coverage-7.4.0-cp310-cp310-win32.whl", hash = "sha256:79287fd95585ed36e83182794a57a46aeae0b64ca53929d1176db56aacc83451"},
+    {file = "coverage-7.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:5b14b4f8760006bfdb6e08667af7bc2d8d9bfdb648351915315ea17645347137"},
+    {file = "coverage-7.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:04387a4a6ecb330c1878907ce0dc04078ea72a869263e53c72a1ba5bbdf380ca"},
+    {file = "coverage-7.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea81d8f9691bb53f4fb4db603203029643caffc82bf998ab5b59ca05560f4c06"},
+    {file = "coverage-7.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74775198b702868ec2d058cb92720a3c5a9177296f75bd97317c787daf711505"},
+    {file = "coverage-7.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76f03940f9973bfaee8cfba70ac991825611b9aac047e5c80d499a44079ec0bc"},
+    {file = "coverage-7.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:485e9f897cf4856a65a57c7f6ea3dc0d4e6c076c87311d4bc003f82cfe199d25"},
+    {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6ae8c9d301207e6856865867d762a4b6fd379c714fcc0607a84b92ee63feff70"},
+    {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bf477c355274a72435ceb140dc42de0dc1e1e0bf6e97195be30487d8eaaf1a09"},
+    {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:83c2dda2666fe32332f8e87481eed056c8b4d163fe18ecc690b02802d36a4d26"},
+    {file = "coverage-7.4.0-cp311-cp311-win32.whl", hash = "sha256:697d1317e5290a313ef0d369650cfee1a114abb6021fa239ca12b4849ebbd614"},
+    {file = "coverage-7.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:26776ff6c711d9d835557ee453082025d871e30b3fd6c27fcef14733f67f0590"},
+    {file = "coverage-7.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:13eaf476ec3e883fe3e5fe3707caeb88268a06284484a3daf8250259ef1ba143"},
+    {file = "coverage-7.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846f52f46e212affb5bcf131c952fb4075b55aae6b61adc9856222df89cbe3e2"},
+    {file = "coverage-7.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26f66da8695719ccf90e794ed567a1549bb2644a706b41e9f6eae6816b398c4a"},
+    {file = "coverage-7.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:164fdcc3246c69a6526a59b744b62e303039a81e42cfbbdc171c91a8cc2f9446"},
+    {file = "coverage-7.4.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:316543f71025a6565677d84bc4df2114e9b6a615aa39fb165d697dba06a54af9"},
+    {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bb1de682da0b824411e00a0d4da5a784ec6496b6850fdf8c865c1d68c0e318dd"},
+    {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:0e8d06778e8fbffccfe96331a3946237f87b1e1d359d7fbe8b06b96c95a5407a"},
+    {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a56de34db7b7ff77056a37aedded01b2b98b508227d2d0979d373a9b5d353daa"},
+    {file = "coverage-7.4.0-cp312-cp312-win32.whl", hash = "sha256:51456e6fa099a8d9d91497202d9563a320513fcf59f33991b0661a4a6f2ad450"},
+    {file = "coverage-7.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:cd3c1e4cb2ff0083758f09be0f77402e1bdf704adb7f89108007300a6da587d0"},
+    {file = "coverage-7.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e9d1bf53c4c8de58d22e0e956a79a5b37f754ed1ffdbf1a260d9dcfa2d8a325e"},
+    {file = "coverage-7.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:109f5985182b6b81fe33323ab4707011875198c41964f014579cf82cebf2bb85"},
+    {file = "coverage-7.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cc9d4bc55de8003663ec94c2f215d12d42ceea128da8f0f4036235a119c88ac"},
+    {file = "coverage-7.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc6d65b21c219ec2072c1293c505cf36e4e913a3f936d80028993dd73c7906b1"},
+    {file = "coverage-7.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a10a4920def78bbfff4eff8a05c51be03e42f1c3735be42d851f199144897ba"},
+    {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b8e99f06160602bc64da35158bb76c73522a4010f0649be44a4e167ff8555952"},
+    {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7d360587e64d006402b7116623cebf9d48893329ef035278969fa3bbf75b697e"},
+    {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:29f3abe810930311c0b5d1a7140f6395369c3db1be68345638c33eec07535105"},
+    {file = "coverage-7.4.0-cp38-cp38-win32.whl", hash = "sha256:5040148f4ec43644702e7b16ca864c5314ccb8ee0751ef617d49aa0e2d6bf4f2"},
+    {file = "coverage-7.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:9864463c1c2f9cb3b5db2cf1ff475eed2f0b4285c2aaf4d357b69959941aa555"},
+    {file = "coverage-7.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:936d38794044b26c99d3dd004d8af0035ac535b92090f7f2bb5aa9c8e2f5cd42"},
+    {file = "coverage-7.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:799c8f873794a08cdf216aa5d0531c6a3747793b70c53f70e98259720a6fe2d7"},
+    {file = "coverage-7.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7defbb9737274023e2d7af02cac77043c86ce88a907c58f42b580a97d5bcca9"},
+    {file = "coverage-7.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a1526d265743fb49363974b7aa8d5899ff64ee07df47dd8d3e37dcc0818f09ed"},
+    {file = "coverage-7.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf635a52fc1ea401baf88843ae8708591aa4adff875e5c23220de43b1ccf575c"},
+    {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:756ded44f47f330666843b5781be126ab57bb57c22adbb07d83f6b519783b870"},
+    {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0eb3c2f32dabe3a4aaf6441dde94f35687224dfd7eb2a7f47f3fd9428e421058"},
+    {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bfd5db349d15c08311702611f3dccbef4b4e2ec148fcc636cf8739519b4a5c0f"},
+    {file = "coverage-7.4.0-cp39-cp39-win32.whl", hash = "sha256:53d7d9158ee03956e0eadac38dfa1ec8068431ef8058fe6447043db1fb40d932"},
+    {file = "coverage-7.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:cfd2a8b6b0d8e66e944d47cdec2f47c48fef2ba2f2dff5a9a75757f64172857e"},
+    {file = "coverage-7.4.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:c530833afc4707fe48524a44844493f36d8727f04dcce91fb978c414a8556cc6"},
+    {file = "coverage-7.4.0.tar.gz", hash = "sha256:707c0f58cb1712b8809ece32b68996ee1e609f71bd14615bd8f87a1293cb610e"},
+]
 
 [package.dependencies]
-tomli = {version = "*", optional = true, markers = "extra == \"toml\""}
+tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""}
 
 [package.extras]
 toml = ["tomli"]
 
+[[package]]
+name = "exceptiongroup"
+version = "1.2.0"
+description = "Backport of PEP 654 (exception groups)"
+optional = false
+python-versions = ">=3.7"
+files = [
+    {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"},
+    {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"},
+]
+
+[package.extras]
+test = ["pytest (>=6)"]
+
 [[package]]
 name = "flake8"
-version = "4.0.1"
+version = "7.0.0"
 description = "the modular source code checker: pep8 pyflakes and co"
-category = "dev"
 optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.8.1"
+files = [
+    {file = "flake8-7.0.0-py2.py3-none-any.whl", hash = "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3"},
+    {file = "flake8-7.0.0.tar.gz", hash = "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132"},
+]
 
 [package.dependencies]
-importlib-metadata = {version = "<4.3", markers = "python_version < \"3.8\""}
-mccabe = ">=0.6.0,<0.7.0"
-pycodestyle = ">=2.8.0,<2.9.0"
-pyflakes = ">=2.4.0,<2.5.0"
+mccabe = ">=0.7.0,<0.8.0"
+pycodestyle = ">=2.11.0,<2.12.0"
+pyflakes = ">=3.2.0,<3.3.0"
 
 [[package]]
 name = "flake8-bandit"
-version = "2.1.2"
+version = "4.1.1"
 description = "Automated security testing with bandit and flake8."
-category = "dev"
 optional = false
-python-versions = "*"
+python-versions = ">=3.6"
+files = [
+    {file = "flake8_bandit-4.1.1-py3-none-any.whl", hash = "sha256:4c8a53eb48f23d4ef1e59293657181a3c989d0077c9952717e98a0eace43e06d"},
+    {file = "flake8_bandit-4.1.1.tar.gz", hash = "sha256:068e09287189cbfd7f986e92605adea2067630b75380c6b5733dab7d87f9a84e"},
+]
 
 [package.dependencies]
-bandit = "*"
-flake8 = "*"
-flake8-polyfill = "*"
-pycodestyle = "*"
+bandit = ">=1.7.3"
+flake8 = ">=5.0.0"
 
 [[package]]
 name = "flake8-docstrings"
-version = "1.6.0"
+version = "1.7.0"
 description = "Extension for flake8 which uses pydocstyle to check docstrings"
-category = "dev"
 optional = false
-python-versions = "*"
+python-versions = ">=3.7"
+files = [
+    {file = "flake8_docstrings-1.7.0-py2.py3-none-any.whl", hash = "sha256:51f2344026da083fc084166a9353f5082b01f72901df422f74b4d953ae88ac75"},
+    {file = "flake8_docstrings-1.7.0.tar.gz", hash = "sha256:4c8cc748dc16e6869728699e5d0d685da9a10b0ea718e090b1ba088e67a941af"},
+]
 
 [package.dependencies]
 flake8 = ">=3"
@@ -111,647 +178,439 @@ pydocstyle = ">=2.1"
 
 [[package]]
 name = "flake8-isort"
-version = "4.1.1"
-description = "flake8 plugin that integrates isort ."
-category = "dev"
+version = "6.1.1"
+description = "flake8 plugin that integrates isort"
 optional = false
-python-versions = "*"
+python-versions = ">=3.8"
+files = [
+    {file = "flake8_isort-6.1.1-py3-none-any.whl", hash = "sha256:0fec4dc3a15aefbdbe4012e51d5531a2eb5fa8b981cdfbc882296a59b54ede12"},
+    {file = "flake8_isort-6.1.1.tar.gz", hash = "sha256:c1f82f3cf06a80c13e1d09bfae460e9666255d5c780b859f19f8318d420370b3"},
+]
 
 [package.dependencies]
-flake8 = ">=3.2.1,<5"
-isort = ">=4.3.5,<6"
-testfixtures = ">=6.8.0,<7"
+flake8 = "*"
+isort = ">=5.0.0,<6"
 
 [package.extras]
-test = ["pytest-cov"]
-
-[[package]]
-name = "flake8-polyfill"
-version = "1.0.2"
-description = "Polyfill package for Flake8 plugins"
-category = "dev"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-flake8 = "*"
+test = ["pytest"]
 
 [[package]]
 name = "gitdb"
-version = "4.0.9"
+version = "4.0.11"
 description = "Git Object Database"
-category = "dev"
 optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.7"
+files = [
+    {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"},
+    {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"},
+]
 
 [package.dependencies]
 smmap = ">=3.0.1,<6"
 
 [[package]]
 name = "gitpython"
-version = "3.1.24"
-description = "GitPython is a python library used to interact with Git repositories"
-category = "dev"
+version = "3.1.41"
+description = "GitPython is a Python library used to interact with Git repositories"
 optional = false
 python-versions = ">=3.7"
+files = [
+    {file = "GitPython-3.1.41-py3-none-any.whl", hash = "sha256:c36b6634d069b3f719610175020a9aed919421c87552185b085e04fbbdb10b7c"},
+    {file = "GitPython-3.1.41.tar.gz", hash = "sha256:ed66e624884f76df22c8e16066d567aaa5a37d5b5fa19db2c6df6f7156db9048"},
+]
 
 [package.dependencies]
 gitdb = ">=4.0.1,<5"
-typing-extensions = {version = ">=3.7.4.3", markers = "python_version < \"3.10\""}
-
-[[package]]
-name = "importlib-metadata"
-version = "4.2.0"
-description = "Read metadata from Python packages"
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""}
-zipp = ">=0.5"
 
 [package.extras]
-docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
-testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"]
+test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "sumtypes"]
 
 [[package]]
 name = "iniconfig"
-version = "1.1.1"
-description = "iniconfig: brain-dead simple config-ini parsing"
-category = "dev"
+version = "2.0.0"
+description = "brain-dead simple config-ini parsing"
 optional = false
-python-versions = "*"
+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 = "isort"
-version = "5.10.0"
+version = "5.13.2"
 description = "A Python utility / library to sort Python imports."
-category = "dev"
 optional = false
-python-versions = ">=3.6.1,<4.0"
+python-versions = ">=3.8.0"
+files = [
+    {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"},
+    {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"},
+]
 
 [package.extras]
-pipfile_deprecated_finder = ["pipreqs", "requirementslib"]
-requirements_deprecated_finder = ["pipreqs", "pip-api"]
-colors = ["colorama (>=0.4.3,<0.5.0)"]
-plugins = ["setuptools"]
+colors = ["colorama (>=0.4.6)"]
+
+[[package]]
+name = "markdown-it-py"
+version = "3.0.0"
+description = "Python port of markdown-it. Markdown parsing, done right!"
+optional = false
+python-versions = ">=3.8"
+files = [
+    {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"},
+    {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"},
+]
+
+[package.dependencies]
+mdurl = ">=0.1,<1.0"
+
+[package.extras]
+benchmarking = ["psutil", "pytest", "pytest-benchmark"]
+code-style = ["pre-commit (>=3.0,<4.0)"]
+compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"]
+linkify = ["linkify-it-py (>=1,<3)"]
+plugins = ["mdit-py-plugins"]
+profiling = ["gprof2dot"]
+rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"]
+testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"]
 
 [[package]]
 name = "mccabe"
-version = "0.6.1"
+version = "0.7.0"
 description = "McCabe checker, plugin for flake8"
-category = "dev"
 optional = false
-python-versions = "*"
+python-versions = ">=3.6"
+files = [
+    {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"},
+    {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"},
+]
+
+[[package]]
+name = "mdurl"
+version = "0.1.2"
+description = "Markdown URL utilities"
+optional = false
+python-versions = ">=3.7"
+files = [
+    {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"},
+    {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"},
+]
 
 [[package]]
 name = "mypy"
-version = "0.910"
+version = "1.8.0"
 description = "Optional static typing for Python"
-category = "dev"
 optional = false
-python-versions = ">=3.5"
+python-versions = ">=3.8"
+files = [
+    {file = "mypy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485a8942f671120f76afffff70f259e1cd0f0cfe08f81c05d8816d958d4577d3"},
+    {file = "mypy-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:df9824ac11deaf007443e7ed2a4a26bebff98d2bc43c6da21b2b64185da011c4"},
+    {file = "mypy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2afecd6354bbfb6e0160f4e4ad9ba6e4e003b767dd80d85516e71f2e955ab50d"},
+    {file = "mypy-1.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8963b83d53ee733a6e4196954502b33567ad07dfd74851f32be18eb932fb1cb9"},
+    {file = "mypy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:e46f44b54ebddbeedbd3d5b289a893219065ef805d95094d16a0af6630f5d410"},
+    {file = "mypy-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:855fe27b80375e5c5878492f0729540db47b186509c98dae341254c8f45f42ae"},
+    {file = "mypy-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c886c6cce2d070bd7df4ec4a05a13ee20c0aa60cb587e8d1265b6c03cf91da3"},
+    {file = "mypy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d19c413b3c07cbecf1f991e2221746b0d2a9410b59cb3f4fb9557f0365a1a817"},
+    {file = "mypy-1.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9261ed810972061388918c83c3f5cd46079d875026ba97380f3e3978a72f503d"},
+    {file = "mypy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:51720c776d148bad2372ca21ca29256ed483aa9a4cdefefcef49006dff2a6835"},
+    {file = "mypy-1.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:52825b01f5c4c1c4eb0db253ec09c7aa17e1a7304d247c48b6f3599ef40db8bd"},
+    {file = "mypy-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f5ac9a4eeb1ec0f1ccdc6f326bcdb464de5f80eb07fb38b5ddd7b0de6bc61e55"},
+    {file = "mypy-1.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afe3fe972c645b4632c563d3f3eff1cdca2fa058f730df2b93a35e3b0c538218"},
+    {file = "mypy-1.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:42c6680d256ab35637ef88891c6bd02514ccb7e1122133ac96055ff458f93fc3"},
+    {file = "mypy-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:720a5ca70e136b675af3af63db533c1c8c9181314d207568bbe79051f122669e"},
+    {file = "mypy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:028cf9f2cae89e202d7b6593cd98db6759379f17a319b5faf4f9978d7084cdc6"},
+    {file = "mypy-1.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4e6d97288757e1ddba10dd9549ac27982e3e74a49d8d0179fc14d4365c7add66"},
+    {file = "mypy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f1478736fcebb90f97e40aff11a5f253af890c845ee0c850fe80aa060a267c6"},
+    {file = "mypy-1.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42419861b43e6962a649068a61f4a4839205a3ef525b858377a960b9e2de6e0d"},
+    {file = "mypy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:2b5b6c721bd4aabaadead3a5e6fa85c11c6c795e0c81a7215776ef8afc66de02"},
+    {file = "mypy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c1538c38584029352878a0466f03a8ee7547d7bd9f641f57a0f3017a7c905b8"},
+    {file = "mypy-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ef4be7baf08a203170f29e89d79064463b7fc7a0908b9d0d5114e8009c3a259"},
+    {file = "mypy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178def594014aa6c35a8ff411cf37d682f428b3b5617ca79029d8ae72f5402b"},
+    {file = "mypy-1.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ab3c84fa13c04aeeeabb2a7f67a25ef5d77ac9d6486ff33ded762ef353aa5592"},
+    {file = "mypy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:99b00bc72855812a60d253420d8a2eae839b0afa4938f09f4d2aa9bb4654263a"},
+    {file = "mypy-1.8.0-py3-none-any.whl", hash = "sha256:538fd81bb5e430cc1381a443971c0475582ff9f434c16cd46d2c66763ce85d9d"},
+    {file = "mypy-1.8.0.tar.gz", hash = "sha256:6ff8b244d7085a0b425b56d327b480c3b29cafbd2eff27316a004f9a7391ae07"},
+]
 
 [package.dependencies]
-mypy-extensions = ">=0.4.3,<0.5.0"
-toml = "*"
-typed-ast = {version = ">=1.4.0,<1.5.0", markers = "python_version < \"3.8\""}
-typing-extensions = ">=3.7.4"
+mypy-extensions = ">=1.0.0"
+tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
+typing-extensions = ">=4.1.0"
 
 [package.extras]
 dmypy = ["psutil (>=4.0)"]
-python2 = ["typed-ast (>=1.4.0,<1.5.0)"]
+install-types = ["pip"]
+mypyc = ["setuptools (>=50)"]
+reports = ["lxml"]
 
 [[package]]
 name = "mypy-extensions"
-version = "0.4.3"
-description = "Experimental type system extensions for programs checked with the mypy typechecker."
-category = "dev"
+version = "1.0.0"
+description = "Type system extensions for programs checked with the mypy type checker."
 optional = false
-python-versions = "*"
+python-versions = ">=3.5"
+files = [
+    {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"},
+    {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"},
+]
 
 [[package]]
 name = "packaging"
-version = "21.2"
+version = "23.2"
 description = "Core utilities for Python packages"
-category = "dev"
 optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-pyparsing = ">=2.0.2,<3"
+python-versions = ">=3.7"
+files = [
+    {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"},
+    {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"},
+]
 
 [[package]]
 name = "pbr"
-version = "5.7.0"
+version = "6.0.0"
 description = "Python Build Reasonableness"
-category = "dev"
 optional = false
 python-versions = ">=2.6"
+files = [
+    {file = "pbr-6.0.0-py2.py3-none-any.whl", hash = "sha256:4a7317d5e3b17a3dccb6a8cfe67dab65b20551404c52c8ed41279fa4f0cb4cda"},
+    {file = "pbr-6.0.0.tar.gz", hash = "sha256:d1377122a5a00e2f940ee482999518efe16d745d423a670c27773dfbc3c9a7d9"},
+]
 
 [[package]]
 name = "pluggy"
-version = "1.0.0"
+version = "1.3.0"
 description = "plugin and hook calling mechanisms for python"
-category = "dev"
 optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
+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 = "py"
-version = "1.11.0"
-description = "library with cross-python path, ini-parsing, io, code, log facilities"
-category = "dev"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
-
 [[package]]
 name = "pycodestyle"
-version = "2.8.0"
+version = "2.11.1"
 description = "Python style guide checker"
-category = "dev"
 optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+python-versions = ">=3.8"
+files = [
+    {file = "pycodestyle-2.11.1-py2.py3-none-any.whl", hash = "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"},
+    {file = "pycodestyle-2.11.1.tar.gz", hash = "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f"},
+]
 
 [[package]]
 name = "pydocstyle"
-version = "6.1.1"
+version = "6.3.0"
 description = "Python docstring style checker"
-category = "dev"
 optional = false
 python-versions = ">=3.6"
+files = [
+    {file = "pydocstyle-6.3.0-py3-none-any.whl", hash = "sha256:118762d452a49d6b05e194ef344a55822987a462831ade91ec5c06fd2169d019"},
+    {file = "pydocstyle-6.3.0.tar.gz", hash = "sha256:7ce43f0c0ac87b07494eb9c0b462c0b73e6ff276807f204d6b53edc72b7e44e1"},
+]
 
 [package.dependencies]
-snowballstemmer = "*"
+snowballstemmer = ">=2.2.0"
 
 [package.extras]
-toml = ["toml"]
+toml = ["tomli (>=1.2.3)"]
 
 [[package]]
 name = "pyflakes"
-version = "2.4.0"
+version = "3.2.0"
 description = "passive checker of Python programs"
-category = "dev"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
-
-[[package]]
-name = "pyparsing"
-version = "2.4.7"
-description = "Python parsing module"
-category = "dev"
 optional = false
-python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
+python-versions = ">=3.8"
+files = [
+    {file = "pyflakes-3.2.0-py2.py3-none-any.whl", hash = "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a"},
+    {file = "pyflakes-3.2.0.tar.gz", hash = "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f"},
+]
 
 [[package]]
-name = "pyproject-flake8"
-version = "0.0.1a2"
-description = "pyproject-flake8 (`pflake8`), a monkey patching wrapper to connect flake8 with pyproject.toml configuration"
-category = "dev"
+name = "pygments"
+version = "2.17.2"
+description = "Pygments is a syntax highlighting package written in Python."
 optional = false
-python-versions = "*"
+python-versions = ">=3.7"
+files = [
+    {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"},
+    {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"},
+]
 
-[package.dependencies]
-flake8 = "*"
-toml = "*"
+[package.extras]
+plugins = ["importlib-metadata"]
+windows-terminal = ["colorama (>=0.4.6)"]
 
 [[package]]
 name = "pytest"
-version = "6.2.5"
+version = "7.4.4"
 description = "pytest: simple powerful testing with Python"
-category = "dev"
 optional = false
-python-versions = ">=3.6"
+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]
-atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""}
-attrs = ">=19.2.0"
 colorama = {version = "*", markers = "sys_platform == \"win32\""}
-importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
+exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""}
 iniconfig = "*"
 packaging = "*"
 pluggy = ">=0.12,<2.0"
-py = ">=1.8.2"
-toml = "*"
+tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""}
 
 [package.extras]
-testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"]
+testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
 
 [[package]]
 name = "pytest-cov"
-version = "3.0.0"
+version = "4.1.0"
 description = "Pytest plugin for measuring coverage."
-category = "dev"
 optional = false
-python-versions = ">=3.6"
+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", "six", "pytest-xdist", "virtualenv"]
+testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"]
 
 [[package]]
 name = "pyyaml"
-version = "6.0"
+version = "6.0.1"
 description = "YAML parser and emitter for Python"
-category = "dev"
 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 = "rich"
+version = "13.7.0"
+description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal"
+optional = false
+python-versions = ">=3.7.0"
+files = [
+    {file = "rich-13.7.0-py3-none-any.whl", hash = "sha256:6da14c108c4866ee9520bbffa71f6fe3962e193b7da68720583850cd4548e235"},
+    {file = "rich-13.7.0.tar.gz", hash = "sha256:5cb5123b5cf9ee70584244246816e9114227e0b98ad9176eede6ad54bf5403fa"},
+]
 
-[[package]]
-name = "six"
-version = "1.16.0"
-description = "Python 2 and 3 compatibility utilities"
-category = "dev"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
+[package.dependencies]
+markdown-it-py = ">=2.2.0"
+pygments = ">=2.13.0,<3.0.0"
+
+[package.extras]
+jupyter = ["ipywidgets (>=7.5.1,<9)"]
 
 [[package]]
 name = "smmap"
-version = "5.0.0"
+version = "5.0.1"
 description = "A pure Python implementation of a sliding window memory map manager"
-category = "dev"
 optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.7"
+files = [
+    {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"},
+    {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"},
+]
 
 [[package]]
 name = "snowballstemmer"
-version = "2.1.0"
+version = "2.2.0"
 description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms."
-category = "dev"
 optional = false
 python-versions = "*"
+files = [
+    {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"},
+    {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"},
+]
 
 [[package]]
 name = "stevedore"
-version = "3.5.0"
+version = "5.1.0"
 description = "Manage dynamic plugins for Python applications"
-category = "dev"
 optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.8"
+files = [
+    {file = "stevedore-5.1.0-py3-none-any.whl", hash = "sha256:8cc040628f3cea5d7128f2e76cf486b2251a4e543c7b938f58d9a377f6694a2d"},
+    {file = "stevedore-5.1.0.tar.gz", hash = "sha256:a54534acf9b89bc7ed264807013b505bf07f74dbe4bcfa37d32bd063870b087c"},
+]
 
 [package.dependencies]
-importlib-metadata = {version = ">=1.7.0", markers = "python_version < \"3.8\""}
 pbr = ">=2.0.0,<2.1.0 || >2.1.0"
 
-[[package]]
-name = "testfixtures"
-version = "6.18.3"
-description = "A collection of helpers and mock objects for unit tests and doc tests."
-category = "dev"
-optional = false
-python-versions = "*"
-
-[package.extras]
-build = ["setuptools-git", "wheel", "twine"]
-docs = ["sphinx", "zope.component", "sybil", "twisted", "mock", "django (<2)", "django"]
-test = ["pytest (>=3.6)", "pytest-cov", "pytest-django", "zope.component", "sybil", "twisted", "mock", "django (<2)", "django"]
-
-[[package]]
-name = "toml"
-version = "0.10.2"
-description = "Python Library for Tom's Obvious, Minimal Language"
-category = "dev"
-optional = false
-python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
-
 [[package]]
 name = "tomli"
-version = "1.2.2"
+version = "2.0.1"
 description = "A lil' TOML parser"
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-
-[[package]]
-name = "typed-ast"
-version = "1.4.3"
-description = "a fork of Python 2 and 3 ast modules with type comment support"
-category = "dev"
 optional = false
-python-versions = "*"
+python-versions = ">=3.7"
+files = [
+    {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"},
+    {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"},
+]
 
 [[package]]
 name = "typing-extensions"
-version = "3.10.0.2"
-description = "Backported and Experimental Type Hints for Python 3.5+"
-category = "main"
+version = "4.9.0"
+description = "Backported and Experimental Type Hints for Python 3.8+"
 optional = false
-python-versions = "*"
-
-[[package]]
-name = "zipp"
-version = "3.6.0"
-description = "Backport of pathlib-compatible object wrapper for zip files"
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-
-[package.extras]
-docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
-testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"]
+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"},
+]
 
 [metadata]
-lock-version = "1.1"
-python-versions = ">=3.7,<4.0"
-content-hash = "8f0e34735081189155193083ebe96bc03c58b2b9c5c33e06369609641eca2551"
-
-[metadata.files]
-atomicwrites = [
-    {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"},
-    {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"},
-]
-attrs = [
-    {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"},
-    {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"},
-]
-autopep8 = [
-    {file = "autopep8-1.6.0-py2.py3-none-any.whl", hash = "sha256:ed77137193bbac52d029a52c59bec1b0629b5a186c495f1eb21b126ac466083f"},
-    {file = "autopep8-1.6.0.tar.gz", hash = "sha256:44f0932855039d2c15c4510d6df665e4730f2b8582704fa48f9c55bd3e17d979"},
-]
-bandit = [
-    {file = "bandit-1.7.0-py3-none-any.whl", hash = "sha256:216be4d044209fa06cf2a3e51b319769a51be8318140659719aa7a115c35ed07"},
-    {file = "bandit-1.7.0.tar.gz", hash = "sha256:8a4c7415254d75df8ff3c3b15cfe9042ecee628a1e40b44c15a98890fbfc2608"},
-]
-colorama = [
-    {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"},
-    {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"},
-]
-coverage = [
-    {file = "coverage-6.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:42a1fb5dee3355df90b635906bb99126faa7936d87dfc97eacc5293397618cb7"},
-    {file = "coverage-6.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a00284dbfb53b42e35c7dd99fc0e26ef89b4a34efff68078ed29d03ccb28402a"},
-    {file = "coverage-6.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:51a441011a30d693e71dea198b2a6f53ba029afc39f8e2aeb5b77245c1b282ef"},
-    {file = "coverage-6.1.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e76f017b6d4140a038c5ff12be1581183d7874e41f1c0af58ecf07748d36a336"},
-    {file = "coverage-6.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7833c872718dc913f18e51ee97ea0dece61d9930893a58b20b3daf09bb1af6b6"},
-    {file = "coverage-6.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8186b5a4730c896cbe1e4b645bdc524e62d874351ae50e1db7c3e9f5dc81dc26"},
-    {file = "coverage-6.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bbca34dca5a2d60f81326d908d77313816fad23d11b6069031a3d6b8c97a54f9"},
-    {file = "coverage-6.1.1-cp310-cp310-win32.whl", hash = "sha256:72bf437d54186d104388cbae73c9f2b0f8a3e11b6e8d7deb593bd14625c96026"},
-    {file = "coverage-6.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:994ce5a7b3d20981b81d83618aa4882f955bfa573efdbef033d5632b58597ba9"},
-    {file = "coverage-6.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ab6a0fe4c96f8058d41948ddf134420d3ef8c42d5508b5a341a440cce7a37a1d"},
-    {file = "coverage-6.1.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10ab138b153e4cc408b43792cb7f518f9ee02f4ff55cd1ab67ad6fd7e9905c7e"},
-    {file = "coverage-6.1.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7e083d32965d2eb6638a77e65b622be32a094fdc0250f28ce6039b0732fbcaa8"},
-    {file = "coverage-6.1.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:359a32515e94e398a5c0fa057e5887a42e647a9502d8e41165cf5cb8d3d1ca67"},
-    {file = "coverage-6.1.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:bf656cd74ff7b4ed7006cdb2a6728150aaad69c7242b42a2a532f77b63ea233f"},
-    {file = "coverage-6.1.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:dc5023be1c2a8b0a0ab5e31389e62c28b2453eb31dd069f4b8d1a0f9814d951a"},
-    {file = "coverage-6.1.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:557594a50bfe3fb0b1b57460f6789affe8850ad19c1acf2d14a3e12b2757d489"},
-    {file = "coverage-6.1.1-cp36-cp36m-win32.whl", hash = "sha256:9eb0a1923354e0fdd1c8a6f53f5db2e6180d670e2b587914bf2e79fa8acfd003"},
-    {file = "coverage-6.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:04a92a6cf9afd99f9979c61348ec79725a9f9342fb45e63c889e33c04610d97b"},
-    {file = "coverage-6.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:479228e1b798d3c246ac89b09897ee706c51b3e5f8f8d778067f38db73ccc717"},
-    {file = "coverage-6.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78287731e3601ea5ce9d6468c82d88a12ef8fe625d6b7bdec9b45d96c1ad6533"},
-    {file = "coverage-6.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c95257aa2ccf75d3d91d772060538d5fea7f625e48157f8ca44594f94d41cb33"},
-    {file = "coverage-6.1.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9ad5895938a894c368d49d8470fe9f519909e5ebc6b8f8ea5190bd0df6aa4271"},
-    {file = "coverage-6.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:326d944aad0189603733d646e8d4a7d952f7145684da973c463ec2eefe1387c2"},
-    {file = "coverage-6.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e7d5606b9240ed4def9cbdf35be4308047d11e858b9c88a6c26974758d6225ce"},
-    {file = "coverage-6.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:572f917267f363101eec375c109c9c1118037c7cc98041440b5eabda3185ac7b"},
-    {file = "coverage-6.1.1-cp37-cp37m-win32.whl", hash = "sha256:35cd2230e1ed76df7d0081a997f0fe705be1f7d8696264eb508076e0d0b5a685"},
-    {file = "coverage-6.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:65ad3ff837c89a229d626b8004f0ee32110f9bfdb6a88b76a80df36ccc60d926"},
-    {file = "coverage-6.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:977ce557d79577a3dd510844904d5d968bfef9489f512be65e2882e1c6eed7d8"},
-    {file = "coverage-6.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62512c0ec5d307f56d86504c58eace11c1bc2afcdf44e3ff20de8ca427ca1d0e"},
-    {file = "coverage-6.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2e5b9c17a56b8bf0c0a9477fcd30d357deb486e4e1b389ed154f608f18556c8a"},
-    {file = "coverage-6.1.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:666c6b32b69e56221ad1551d377f718ed00e6167c7a1b9257f780b105a101271"},
-    {file = "coverage-6.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:fb2fa2f6506c03c48ca42e3fe5a692d7470d290c047ee6de7c0f3e5fa7639ac9"},
-    {file = "coverage-6.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f0f80e323a17af63eac6a9db0c9188c10f1fd815c3ab299727150cc0eb92c7a4"},
-    {file = "coverage-6.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:738e823a746841248b56f0f3bd6abf3b73af191d1fd65e4c723b9c456216f0ad"},
-    {file = "coverage-6.1.1-cp38-cp38-win32.whl", hash = "sha256:8605add58e6a960729aa40c0fd9a20a55909dd9b586d3e8104cc7f45869e4c6b"},
-    {file = "coverage-6.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:6e994003e719458420e14ffb43c08f4c14990e20d9e077cb5cad7a3e419bbb54"},
-    {file = "coverage-6.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e3c4f5211394cd0bf6874ac5d29684a495f9c374919833dcfff0bd6d37f96201"},
-    {file = "coverage-6.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e14bceb1f3ae8a14374be2b2d7bc12a59226872285f91d66d301e5f41705d4d6"},
-    {file = "coverage-6.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0147f7833c41927d84f5af9219d9b32f875c0689e5e74ac8ca3cb61e73a698f9"},
-    {file = "coverage-6.1.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b1d0a1bce919de0dd8da5cff4e616b2d9e6ebf3bd1410ff645318c3dd615010a"},
-    {file = "coverage-6.1.1-cp39-cp39-win32.whl", hash = "sha256:a11a2c019324fc111485e79d55907e7289e53d0031275a6c8daed30690bc50c0"},
-    {file = "coverage-6.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:4d8b453764b9b26b0dd2afb83086a7c3f9379134e340288d2a52f8a91592394b"},
-    {file = "coverage-6.1.1-pp36-none-any.whl", hash = "sha256:3b270c6b48d3ff5a35deb3648028ba2643ad8434b07836782b1139cf9c66313f"},
-    {file = "coverage-6.1.1-pp37-none-any.whl", hash = "sha256:ffa8fee2b1b9e60b531c4c27cf528d6b5d5da46b1730db1f4d6eee56ff282e07"},
-    {file = "coverage-6.1.1-pp38-none-any.whl", hash = "sha256:4cd919057636f63ab299ccb86ea0e78b87812400c76abab245ca385f17d19fb5"},
-    {file = "coverage-6.1.1.tar.gz", hash = "sha256:b8e4f15b672c9156c1154249a9c5746e86ac9ae9edc3799ee3afebc323d9d9e0"},
-]
-flake8 = [
-    {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"},
-    {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"},
-]
-flake8-bandit = [
-    {file = "flake8_bandit-2.1.2.tar.gz", hash = "sha256:687fc8da2e4a239b206af2e54a90093572a60d0954f3054e23690739b0b0de3b"},
-]
-flake8-docstrings = [
-    {file = "flake8-docstrings-1.6.0.tar.gz", hash = "sha256:9fe7c6a306064af8e62a055c2f61e9eb1da55f84bb39caef2b84ce53708ac34b"},
-    {file = "flake8_docstrings-1.6.0-py2.py3-none-any.whl", hash = "sha256:99cac583d6c7e32dd28bbfbef120a7c0d1b6dde4adb5a9fd441c4227a6534bde"},
-]
-flake8-isort = [
-    {file = "flake8-isort-4.1.1.tar.gz", hash = "sha256:d814304ab70e6e58859bc5c3e221e2e6e71c958e7005239202fee19c24f82717"},
-    {file = "flake8_isort-4.1.1-py3-none-any.whl", hash = "sha256:c4e8b6dcb7be9b71a02e6e5d4196cefcef0f3447be51e82730fb336fff164949"},
-]
-flake8-polyfill = [
-    {file = "flake8-polyfill-1.0.2.tar.gz", hash = "sha256:e44b087597f6da52ec6393a709e7108b2905317d0c0b744cdca6208e670d8eda"},
-    {file = "flake8_polyfill-1.0.2-py2.py3-none-any.whl", hash = "sha256:12be6a34ee3ab795b19ca73505e7b55826d5f6ad7230d31b18e106400169b9e9"},
-]
-gitdb = [
-    {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"},
-    {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"},
-]
-gitpython = [
-    {file = "GitPython-3.1.24-py3-none-any.whl", hash = "sha256:dc0a7f2f697657acc8d7f89033e8b1ea94dd90356b2983bca89dc8d2ab3cc647"},
-    {file = "GitPython-3.1.24.tar.gz", hash = "sha256:df83fdf5e684fef7c6ee2c02fc68a5ceb7e7e759d08b694088d0cacb4eba59e5"},
-]
-importlib-metadata = [
-    {file = "importlib_metadata-4.2.0-py3-none-any.whl", hash = "sha256:057e92c15bc8d9e8109738a48db0ccb31b4d9d5cfbee5a8670879a30be66304b"},
-    {file = "importlib_metadata-4.2.0.tar.gz", hash = "sha256:b7e52a1f8dec14a75ea73e0891f3060099ca1d8e6a462a4dff11c3e119ea1b31"},
-]
-iniconfig = [
-    {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"},
-    {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"},
-]
-isort = [
-    {file = "isort-5.10.0-py3-none-any.whl", hash = "sha256:1a18ccace2ed8910bd9458b74a3ecbafd7b2f581301b0ab65cfdd4338272d76f"},
-    {file = "isort-5.10.0.tar.gz", hash = "sha256:e52ff6d38012b131628cf0f26c51e7bd3a7c81592eefe3ac71411e692f1b9345"},
-]
-mccabe = [
-    {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"},
-    {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"},
-]
-mypy = [
-    {file = "mypy-0.910-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:a155d80ea6cee511a3694b108c4494a39f42de11ee4e61e72bc424c490e46457"},
-    {file = "mypy-0.910-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:b94e4b785e304a04ea0828759172a15add27088520dc7e49ceade7834275bedb"},
-    {file = "mypy-0.910-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:088cd9c7904b4ad80bec811053272986611b84221835e079be5bcad029e79dd9"},
-    {file = "mypy-0.910-cp35-cp35m-win_amd64.whl", hash = "sha256:adaeee09bfde366d2c13fe6093a7df5df83c9a2ba98638c7d76b010694db760e"},
-    {file = "mypy-0.910-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ecd2c3fe726758037234c93df7e98deb257fd15c24c9180dacf1ef829da5f921"},
-    {file = "mypy-0.910-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d9dd839eb0dc1bbe866a288ba3c1afc33a202015d2ad83b31e875b5905a079b6"},
-    {file = "mypy-0.910-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:3e382b29f8e0ccf19a2df2b29a167591245df90c0b5a2542249873b5c1d78212"},
-    {file = "mypy-0.910-cp36-cp36m-win_amd64.whl", hash = "sha256:53fd2eb27a8ee2892614370896956af2ff61254c275aaee4c230ae771cadd885"},
-    {file = "mypy-0.910-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b6fb13123aeef4a3abbcfd7e71773ff3ff1526a7d3dc538f3929a49b42be03f0"},
-    {file = "mypy-0.910-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e4dab234478e3bd3ce83bac4193b2ecd9cf94e720ddd95ce69840273bf44f6de"},
-    {file = "mypy-0.910-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:7df1ead20c81371ccd6091fa3e2878559b5c4d4caadaf1a484cf88d93ca06703"},
-    {file = "mypy-0.910-cp37-cp37m-win_amd64.whl", hash = "sha256:0aadfb2d3935988ec3815952e44058a3100499f5be5b28c34ac9d79f002a4a9a"},
-    {file = "mypy-0.910-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ec4e0cd079db280b6bdabdc807047ff3e199f334050db5cbb91ba3e959a67504"},
-    {file = "mypy-0.910-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:119bed3832d961f3a880787bf621634ba042cb8dc850a7429f643508eeac97b9"},
-    {file = "mypy-0.910-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:866c41f28cee548475f146aa4d39a51cf3b6a84246969f3759cb3e9c742fc072"},
-    {file = "mypy-0.910-cp38-cp38-win_amd64.whl", hash = "sha256:ceb6e0a6e27fb364fb3853389607cf7eb3a126ad335790fa1e14ed02fba50811"},
-    {file = "mypy-0.910-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a85e280d4d217150ce8cb1a6dddffd14e753a4e0c3cf90baabb32cefa41b59e"},
-    {file = "mypy-0.910-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:42c266ced41b65ed40a282c575705325fa7991af370036d3f134518336636f5b"},
-    {file = "mypy-0.910-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:3c4b8ca36877fc75339253721f69603a9c7fdb5d4d5a95a1a1b899d8b86a4de2"},
-    {file = "mypy-0.910-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:c0df2d30ed496a08de5daed2a9ea807d07c21ae0ab23acf541ab88c24b26ab97"},
-    {file = "mypy-0.910-cp39-cp39-win_amd64.whl", hash = "sha256:c6c2602dffb74867498f86e6129fd52a2770c48b7cd3ece77ada4fa38f94eba8"},
-    {file = "mypy-0.910-py3-none-any.whl", hash = "sha256:ef565033fa5a958e62796867b1df10c40263ea9ded87164d67572834e57a174d"},
-    {file = "mypy-0.910.tar.gz", hash = "sha256:704098302473cb31a218f1775a873b376b30b4c18229421e9e9dc8916fd16150"},
-]
-mypy-extensions = [
-    {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"},
-    {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"},
-]
-packaging = [
-    {file = "packaging-21.2-py3-none-any.whl", hash = "sha256:14317396d1e8cdb122989b916fa2c7e9ca8e2be9e8060a6eff75b6b7b4d8a7e0"},
-    {file = "packaging-21.2.tar.gz", hash = "sha256:096d689d78ca690e4cd8a89568ba06d07ca097e3306a4381635073ca91479966"},
-]
-pbr = [
-    {file = "pbr-5.7.0-py2.py3-none-any.whl", hash = "sha256:60002958e459b195e8dbe61bf22bcf344eedf1b4e03a321a5414feb15566100c"},
-    {file = "pbr-5.7.0.tar.gz", hash = "sha256:4651ca1445e80f2781827305de3d76b3ce53195f2227762684eb08f17bc473b7"},
-]
-pluggy = [
-    {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"},
-    {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"},
-]
-py = [
-    {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"},
-    {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"},
-]
-pycodestyle = [
-    {file = "pycodestyle-2.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"},
-    {file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"},
-]
-pydocstyle = [
-    {file = "pydocstyle-6.1.1-py3-none-any.whl", hash = "sha256:6987826d6775056839940041beef5c08cc7e3d71d63149b48e36727f70144dc4"},
-    {file = "pydocstyle-6.1.1.tar.gz", hash = "sha256:1d41b7c459ba0ee6c345f2eb9ae827cab14a7533a88c5c6f7e94923f72df92dc"},
-]
-pyflakes = [
-    {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"},
-    {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"},
-]
-pyparsing = [
-    {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"},
-    {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"},
-]
-pyproject-flake8 = [
-    {file = "pyproject-flake8-0.0.1a2.tar.gz", hash = "sha256:bdeca37f78ecd34bd64a49d3657d53d099f5445831071a31c46e1fe20cd61461"},
-    {file = "pyproject_flake8-0.0.1a2-py2.py3-none-any.whl", hash = "sha256:e61ed1dc088e9f9f8a7170967ac4ec135acfef3a59ab9738c7b58cc11f294a7e"},
-]
-pytest = [
-    {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"},
-    {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"},
-]
-pytest-cov = [
-    {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"},
-    {file = "pytest_cov-3.0.0-py3-none-any.whl", hash = "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"},
-]
-pyyaml = [
-    {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"},
-    {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"},
-    {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"},
-    {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"},
-    {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"},
-    {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"},
-    {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"},
-    {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"},
-    {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"},
-    {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"},
-    {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"},
-    {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"},
-    {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"},
-    {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"},
-    {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"},
-    {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"},
-    {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"},
-    {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"},
-    {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"},
-    {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"},
-    {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"},
-    {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"},
-    {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"},
-    {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"},
-    {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"},
-    {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"},
-    {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"},
-    {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"},
-    {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"},
-    {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"},
-    {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"},
-    {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"},
-    {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"},
-]
-six = [
-    {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
-    {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
-]
-smmap = [
-    {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"},
-    {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"},
-]
-snowballstemmer = [
-    {file = "snowballstemmer-2.1.0-py2.py3-none-any.whl", hash = "sha256:b51b447bea85f9968c13b650126a888aabd4cb4463fca868ec596826325dedc2"},
-    {file = "snowballstemmer-2.1.0.tar.gz", hash = "sha256:e997baa4f2e9139951b6f4c631bad912dfd3c792467e2f03d7239464af90e914"},
-]
-stevedore = [
-    {file = "stevedore-3.5.0-py3-none-any.whl", hash = "sha256:a547de73308fd7e90075bb4d301405bebf705292fa90a90fc3bcf9133f58616c"},
-    {file = "stevedore-3.5.0.tar.gz", hash = "sha256:f40253887d8712eaa2bb0ea3830374416736dc8ec0e22f5a65092c1174c44335"},
-]
-testfixtures = [
-    {file = "testfixtures-6.18.3-py2.py3-none-any.whl", hash = "sha256:6ddb7f56a123e1a9339f130a200359092bd0a6455e31838d6c477e8729bb7763"},
-    {file = "testfixtures-6.18.3.tar.gz", hash = "sha256:2600100ae96ffd082334b378e355550fef8b4a529a6fa4c34f47130905c7426d"},
-]
-toml = [
-    {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"},
-    {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
-]
-tomli = [
-    {file = "tomli-1.2.2-py3-none-any.whl", hash = "sha256:f04066f68f5554911363063a30b108d2b5a5b1a010aa8b6132af78489fe3aade"},
-    {file = "tomli-1.2.2.tar.gz", hash = "sha256:c6ce0015eb38820eaf32b5db832dbc26deb3dd427bd5f6556cf0acac2c214fee"},
-]
-typed-ast = [
-    {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6"},
-    {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c907f561b1e83e93fad565bac5ba9c22d96a54e7ea0267c708bffe863cbe4075"},
-    {file = "typed_ast-1.4.3-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:1b3ead4a96c9101bef08f9f7d1217c096f31667617b58de957f690c92378b528"},
-    {file = "typed_ast-1.4.3-cp35-cp35m-win32.whl", hash = "sha256:dde816ca9dac1d9c01dd504ea5967821606f02e510438120091b84e852367428"},
-    {file = "typed_ast-1.4.3-cp35-cp35m-win_amd64.whl", hash = "sha256:777a26c84bea6cd934422ac2e3b78863a37017618b6e5c08f92ef69853e765d3"},
-    {file = "typed_ast-1.4.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f8afcf15cc511ada719a88e013cec87c11aff7b91f019295eb4530f96fe5ef2f"},
-    {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:52b1eb8c83f178ab787f3a4283f68258525f8d70f778a2f6dd54d3b5e5fb4341"},
-    {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:01ae5f73431d21eead5015997ab41afa53aa1fbe252f9da060be5dad2c730ace"},
-    {file = "typed_ast-1.4.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c190f0899e9f9f8b6b7863debfb739abcb21a5c054f911ca3596d12b8a4c4c7f"},
-    {file = "typed_ast-1.4.3-cp36-cp36m-win32.whl", hash = "sha256:398e44cd480f4d2b7ee8d98385ca104e35c81525dd98c519acff1b79bdaac363"},
-    {file = "typed_ast-1.4.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bff6ad71c81b3bba8fa35f0f1921fb24ff4476235a6e94a26ada2e54370e6da7"},
-    {file = "typed_ast-1.4.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0fb71b8c643187d7492c1f8352f2c15b4c4af3f6338f21681d3681b3dc31a266"},
-    {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:760ad187b1041a154f0e4d0f6aae3e40fdb51d6de16e5c99aedadd9246450e9e"},
-    {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5feca99c17af94057417d744607b82dd0a664fd5e4ca98061480fd8b14b18d04"},
-    {file = "typed_ast-1.4.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:95431a26309a21874005845c21118c83991c63ea800dd44843e42a916aec5899"},
-    {file = "typed_ast-1.4.3-cp37-cp37m-win32.whl", hash = "sha256:aee0c1256be6c07bd3e1263ff920c325b59849dc95392a05f258bb9b259cf39c"},
-    {file = "typed_ast-1.4.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9ad2c92ec681e02baf81fdfa056fe0d818645efa9af1f1cd5fd6f1bd2bdfd805"},
-    {file = "typed_ast-1.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b36b4f3920103a25e1d5d024d155c504080959582b928e91cb608a65c3a49e1a"},
-    {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:067a74454df670dcaa4e59349a2e5c81e567d8d65458d480a5b3dfecec08c5ff"},
-    {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7538e495704e2ccda9b234b82423a4038f324f3a10c43bc088a1636180f11a41"},
-    {file = "typed_ast-1.4.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:af3d4a73793725138d6b334d9d247ce7e5f084d96284ed23f22ee626a7b88e39"},
-    {file = "typed_ast-1.4.3-cp38-cp38-win32.whl", hash = "sha256:f2362f3cb0f3172c42938946dbc5b7843c2a28aec307c49100c8b38764eb6927"},
-    {file = "typed_ast-1.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:dd4a21253f42b8d2b48410cb31fe501d32f8b9fbeb1f55063ad102fe9c425e40"},
-    {file = "typed_ast-1.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f328adcfebed9f11301eaedfa48e15bdece9b519fb27e6a8c01aa52a17ec31b3"},
-    {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:2c726c276d09fc5c414693a2de063f521052d9ea7c240ce553316f70656c84d4"},
-    {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:cae53c389825d3b46fb37538441f75d6aecc4174f615d048321b716df2757fb0"},
-    {file = "typed_ast-1.4.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9574c6f03f685070d859e75c7f9eeca02d6933273b5e69572e5ff9d5e3931c3"},
-    {file = "typed_ast-1.4.3-cp39-cp39-win32.whl", hash = "sha256:209596a4ec71d990d71d5e0d312ac935d86930e6eecff6ccc7007fe54d703808"},
-    {file = "typed_ast-1.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:9c6d1a54552b5330bc657b7ef0eae25d00ba7ffe85d9ea8ae6540d2197a3788c"},
-    {file = "typed_ast-1.4.3.tar.gz", hash = "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65"},
-]
-typing-extensions = [
-    {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"},
-    {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"},
-    {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"},
-]
-zipp = [
-    {file = "zipp-3.6.0-py3-none-any.whl", hash = "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc"},
-    {file = "zipp-3.6.0.tar.gz", hash = "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832"},
-]
+lock-version = "2.0"
+python-versions = ">=3.9,<4.0"
+content-hash = "5d4d58bc48c72d92a7c96f6a1c4ce3514a6f1794dec1df2e096d7b5ba23b2fd0"
diff --git a/poetry.toml b/poetry.toml
new file mode 100644
index 0000000..ab1033b
--- /dev/null
+++ b/poetry.toml
@@ -0,0 +1,2 @@
+[virtualenvs]
+in-project = true
diff --git a/pynormalizenumexp/expression/abstime.py b/pynormalizenumexp/expression/abstime.py
index 31ff587..2362821 100644
--- a/pynormalizenumexp/expression/abstime.py
+++ b/pynormalizenumexp/expression/abstime.py
@@ -1,6 +1,6 @@
 """絶対時間の表現定義モジュール."""
 import typing
-from typing import List, Union
+from typing import Union
 
 from .base import INF, BasePattern, NNumber, NormalizedExpression, NTime
 
@@ -12,8 +12,8 @@ def __init__(self) -> None:
         """コンストラクタ."""
         super().__init__()
 
-        self.corresponding_time_position: List[str] = []
-        self.process_type: List[str] = []
+        self.corresponding_time_position: list[str] = []
+        self.process_type: list[str] = []
 
     def __eq__(self, o: object) -> bool:  # noqa: D105
         return isinstance(o, AbstimePattern) and super().__eq__(o) \
diff --git a/pynormalizenumexp/expression/base.py b/pynormalizenumexp/expression/base.py
index c00f806..a54cf5b 100644
--- a/pynormalizenumexp/expression/base.py
+++ b/pynormalizenumexp/expression/base.py
@@ -1,7 +1,7 @@
 """各種表現パターンクラスの定義モジュール."""
 import typing
 from enum import Enum
-from typing import Any, Dict, List, Optional, Union
+from typing import Any, Optional, Union
 
 # 定数定義
 INF = float("inf")
@@ -50,7 +50,7 @@ def __eq__(self, o: object) -> bool:  # noqa: D105
             and o.hour == self.hour and o.minute == self.minute and o.second == self.second
 
     @typing.no_type_check
-    def __str__(self, only_params: bool = False) -> Union[str, Dict[str, int]]:  # noqa: D105
+    def __str__(self, only_params: bool = False) -> Union[str, dict[str, int]]:  # noqa: D105
         params = {
             "year": self.year,
             "month": self.month,
@@ -126,7 +126,7 @@ def __eq__(self, o: object) -> bool:  # noqa: D105
             and self.value_upper_bound == o.value_upper_bound
 
     @typing.no_type_check
-    def __str__(self, only_params: bool = False) -> Union[str, Dict[str, Any]]:  # noqa: D105
+    def __str__(self, only_params: bool = False) -> Union[str, dict[str, Any]]:  # noqa: D105
         params = {
             "original_expr": self.original_expr,
             "position_start": self.position_start,
@@ -222,7 +222,7 @@ def __init__(self, original_expr: str = "", position_start: int = -1, position_e
 
         self.value_lower_bound = INF
         self.value_upper_bound = -INF
-        self.notation_type: List[NotationType] = []
+        self.notation_type: list[NotationType] = []
 
     def __eq__(self, o: object) -> bool:  # noqa: D105
         return isinstance(o, NNumber) and super().__eq__(o) \
@@ -267,7 +267,7 @@ def __init__(self, original_expr: str, position_start: int, position_end: int) -
         self.is_over: bool = False
         self.is_less: bool = False
         self.ordinary: bool = False
-        self.options: List[str] = []
+        self.options: list[str] = []
 
     def __eq__(self, o: object) -> bool:  # noqa: D105
         return isinstance(o, NormalizedExpression) and super().__eq__(o) \
diff --git a/pynormalizenumexp/expression/duration.py b/pynormalizenumexp/expression/duration.py
index e08efff..57aa8ca 100644
--- a/pynormalizenumexp/expression/duration.py
+++ b/pynormalizenumexp/expression/duration.py
@@ -1,6 +1,6 @@
 """絶対時間の表現定義モジュール."""
 import typing
-from typing import List, Union
+from typing import Union
 
 from .base import INF, BasePattern, NNumber, NormalizedExpression, NTime
 
@@ -12,8 +12,8 @@ def __init__(self) -> None:
         """コンストラクタ."""
         super().__init__()
 
-        self.corresponding_time_position: List[str] = []
-        self.process_type: List[str] = []
+        self.corresponding_time_position: list[str] = []
+        self.process_type: list[str] = []
 
     def __eq__(self, o: object) -> bool:  # noqa: D105
         return isinstance(o, DurationPattern) and super().__eq__(o) \
diff --git a/pynormalizenumexp/expression/reltime.py b/pynormalizenumexp/expression/reltime.py
index 349b7df..a5e8de7 100644
--- a/pynormalizenumexp/expression/reltime.py
+++ b/pynormalizenumexp/expression/reltime.py
@@ -1,6 +1,6 @@
 """相対時間の表現定義モジュール."""
 import typing
-from typing import List, Union
+from typing import Union
 
 from .base import INF, BasePattern, NNumber, NormalizedExpression, NTime
 
@@ -12,8 +12,8 @@ def __init__(self) -> None:
         """コンストラクタ."""
         super().__init__()
 
-        self.corresponding_time_position: List[str] = []
-        self.process_type: List[str] = []
+        self.corresponding_time_position: list[str] = []
+        self.process_type: list[str] = []
 
     def __eq__(self, o: object) -> bool:  # noqa: D105
         return isinstance(o, ReltimePattern) and super().__eq__(o) \
diff --git a/pynormalizenumexp/normalize_numexp.py b/pynormalizenumexp/normalize_numexp.py
index c78c1a9..c1ec9d8 100644
--- a/pynormalizenumexp/normalize_numexp.py
+++ b/pynormalizenumexp/normalize_numexp.py
@@ -1,6 +1,6 @@
 """各種数値表現の抽出・正規化を行う処理の定義モジュール."""
 from dataclasses import asdict, dataclass, field
-from typing import List, Optional, Union, cast
+from typing import Optional, Union, cast
 
 from .expression.abstime import AbstimeExpression
 from .expression.base import NormalizedExpression, NTime
@@ -71,7 +71,7 @@ class Expression:
     value_upper_bound_abs: Optional[Time] = None
     value_lower_bound_rel: Optional[Time] = None
     value_upper_bound_rel: Optional[Time] = None
-    options: List[str] = field(default_factory=list)
+    options: list[str] = field(default_factory=list)
 
 
 class NormalizeNumexp(object):
@@ -93,7 +93,7 @@ def __init__(self, language: str) -> None:
         self.duration_expr_normalizer = DurationExpressionNormalizer(dict_loader)
         self.inappropriate_expr_remover = InappropriateExpressionRemover(dict_loader)
 
-    def normalize(self, text: str, as_dict: bool = False) -> Union[List[Expression], List[ReturnExpressionDict]]:
+    def normalize(self, text: str, as_dict: bool = False) -> Union[list[Expression], list[ReturnExpressionDict]]:
         """各種数値表現の抽出・正規化を行う.
 
         Parameters
@@ -105,14 +105,14 @@ def normalize(self, text: str, as_dict: bool = False) -> Union[List[Expression],
 
         Returns
         -------
-        List[Expression]
+        Union[list[Expression], list[ReturnExpressionDict]]
             抽出・正規化した数値表現
         """
         # 各normalizerで数値表現の抽出・正規化を行う
-        numerical_exprs = cast(List[NumericalExpression], self.numerical_expr_normalizer.process(text))
-        abstime_exprs = cast(List[AbstimeExpression], self.abstime_expr_normalizer.process(text))
-        reltime_exprs = cast(List[ReltimeExpression], self.reltime_expr_normalizer.process(text))
-        duration_exprs = cast(List[DurationExpression], self.duration_expr_normalizer.process(text))
+        numerical_exprs = cast(list[NumericalExpression], self.numerical_expr_normalizer.process(text))
+        abstime_exprs = cast(list[AbstimeExpression], self.abstime_expr_normalizer.process(text))
+        reltime_exprs = cast(list[ReltimeExpression], self.reltime_expr_normalizer.process(text))
+        duration_exprs = cast(list[DurationExpression], self.duration_expr_normalizer.process(text))
 
         # 不適切な数値表現を削除する
         numerical_exprs, abstime_exprs, reltime_exprs, duration_exprs \
@@ -128,25 +128,25 @@ def normalize(self, text: str, as_dict: bool = False) -> Union[List[Expression],
 
         return exprs
 
-    def merge_expressions(self, numerical_exprs: List[NumericalExpression], abstime_exprs: List[AbstimeExpression],
-                          reltime_exprs: List[ReltimeExpression], duration_exprs: List[DurationExpression]) \
-            -> List[Expression]:
+    def merge_expressions(self, numerical_exprs: list[NumericalExpression], abstime_exprs: list[AbstimeExpression],
+                          reltime_exprs: list[ReltimeExpression], duration_exprs: list[DurationExpression]) \
+            -> list[Expression]:
         """抽出した各種数値表現を統一的な数値表現オブジェクトに変換する.
 
         Parameters
         ----------
-        numerical_exprs : List[NumericalExpression]
+        numerical_exprs : list[NumericalExpression]
             数量表現
-        abstime_exprs : List[AbstimeExpression]
+        abstime_exprs : list[AbstimeExpression]
             絶対時間表現
-        reltime_exprs : List[ReltimeExpression]
+        reltime_exprs : list[ReltimeExpression]
             相対時間表現
-        duration_exprs : List[DurationExpression]
+        duration_exprs : list[DurationExpression]
             期間表現
 
         Returns
         -------
-        List[Expression]
+        list[Expression]
             変換後の数値表現
         """
         def conv_time_obj(bound: Optional[NTime]) -> Optional[Time]:
@@ -156,7 +156,7 @@ def conv_time_obj(bound: Optional[NTime]) -> Optional[Time]:
             return Time(year=bound.year, month=bound.month, day=bound.day,
                         hour=bound.hour, minute=bound.minute, second=bound.second)
 
-        total_exprs: List[Expression] = []
+        total_exprs: list[Expression] = []
 
         for numerical_expr in numerical_exprs:
             expr = Expression()
@@ -215,7 +215,7 @@ def conv_time_obj(bound: Optional[NTime]) -> Optional[Time]:
 
         return list(sorted(total_exprs, key=lambda x: x.position_start))
 
-    def show_options(self, expr: NormalizedExpression) -> List[str]:
+    def show_options(self, expr: NormalizedExpression) -> list[str]:
         """optionsを整理.
 
         Parameters
@@ -225,10 +225,10 @@ def show_options(self, expr: NormalizedExpression) -> List[str]:
 
         Returns
         -------
-        List[str]
+        list[str]
             整理したoptions
         """
-        options: List[str] = []
+        options: list[str] = []
         if expr.ordinary:
             options.append("ordinary")
 
diff --git a/pynormalizenumexp/normalizer/abstime_expr_normalizer.py b/pynormalizenumexp/normalizer/abstime_expr_normalizer.py
index 4db4c18..21a45d2 100644
--- a/pynormalizenumexp/normalizer/abstime_expr_normalizer.py
+++ b/pynormalizenumexp/normalizer/abstime_expr_normalizer.py
@@ -1,6 +1,5 @@
 """絶対時間の抽出・正規化処理を定義するモジュール."""
 from copy import deepcopy
-from typing import List, Tuple
 
 from pynormalizenumexp.expression.abstime import AbstimeExpression, AbstimePattern
 from pynormalizenumexp.expression.base import INF, NNumber, NTime, NumberModifier
@@ -13,8 +12,8 @@
 class AbstimeExpressionNormalizer(BaseNormalizer):
     """絶対時間の抽出・正規化を行うクラス."""
 
-    limited_expressions: List[AbstimePattern]
-    prefix_counters: List[AbstimePattern]
+    limited_expressions: list[AbstimePattern]
+    prefix_counters: list[AbstimePattern]
 
     def __init__(self, dict_loader: DictLoader) -> None:
         """コンストラクタ.
@@ -60,7 +59,7 @@ def load_dictionaries(self, limited_expr_dict_file: str, prefix_counter_dict_fil
             expr.set_total_number_of_place_holder()
             expr.set_len_of_after_final_place_holder()
 
-    def normalize_number(self, text: str) -> List[NNumber]:
+    def normalize_number(self, text: str) -> list[NNumber]:
         """テキストから数値表現を抽出する.
 
         Parameters
@@ -70,22 +69,22 @@ def normalize_number(self, text: str) -> List[NNumber]:
 
         Returns
         -------
-        List[NNumber]
+        list[NNumber]
             抽出した数値表現
         """
         return self.number_normalizer.process(text, do_fix_symbol=False)
 
-    def numbers2expressions(self, numbers: List[NNumber]) -> List[AbstimeExpression]:  # type: ignore[override]
+    def numbers2expressions(self, numbers: list[NNumber]) -> list[AbstimeExpression]:  # type: ignore[override]
         """抽出した数値表現を絶対時間表現のオブジェクトに変換する.
 
         Parameters
         ----------
-        numbers : List[NNumber]
+        numbers : list[NNumber]
             抽出した数値表現
 
         Returns
         -------
-        List[AbstimeExpression]
+        list[AbstimeExpression]
             絶対時間表現のオブジェクト
         """
         return [AbstimeExpression(number) for number in numbers]
@@ -137,14 +136,14 @@ def revise_abstime_expr_by_process_type(self, abstime_expr: AbstimeExpression,
 
         return new_abstime_expr
 
-    def revise_expr_by_matching_limited_expression(self, exprs: List[AbstimeExpression],  # type: ignore[override]
+    def revise_expr_by_matching_limited_expression(self, exprs: list[AbstimeExpression],  # type: ignore[override]
                                                    expr_id: int,
-                                                   matching_expr: AbstimePattern) -> List[AbstimeExpression]:
+                                                   matching_expr: AbstimePattern) -> list[AbstimeExpression]:
         """マッチした絶対時間表現の補正を行う.
 
         Parameters
         ----------
-        exprs : List[AbstimeExpression]
+        exprs : list[AbstimeExpression]
             抽出された絶対時間表現
         expr_id : int
             どの絶対時間表現に着目するかのID（インデックス）
@@ -153,7 +152,7 @@ def revise_expr_by_matching_limited_expression(self, exprs: List[AbstimeExpressi
 
         Returns
         -------
-        List[AbstimeExpression]
+        list[AbstimeExpression]
             補正済みの絶対時間表現
         """
         new_exprs = deepcopy(exprs)
@@ -281,17 +280,17 @@ def revise_expr_by_number_modifier(self, expr: AbstimeExpression,  # type: ignor
         return new_expr
 
     def delete_not_expression(self,  # type: ignore[override]
-                              exprs: List[AbstimeExpression]) -> List[AbstimeExpression]:
+                              exprs: list[AbstimeExpression]) -> list[AbstimeExpression]:
         """時間オブジェクトがNullの絶対時間表現を削除する.
 
         Parameters
         ----------
-        exprs : List[AbstimeExpression]
+        exprs : list[AbstimeExpression]
             抽出された絶対時間表現
 
         Returns
         -------
-        List[AbstimeExpression]
+        list[AbstimeExpression]
             削除後の絶対時間表現
         """
         for i in range(len(exprs)):
@@ -302,19 +301,19 @@ def delete_not_expression(self,  # type: ignore[override]
         return [expr for expr in exprs if expr]
 
     def fix_by_range_expression(self,  # type: ignore[override]
-                                text: str, exprs: List[AbstimeExpression]) -> List[AbstimeExpression]:
+                                text: str, exprs: list[AbstimeExpression]) -> list[AbstimeExpression]:
         """絶対時間の範囲表現の修正を行う.
 
         Parameters
         ----------
         text : str
             元のテキスト
-        exprs : List[AbstimeExpression]
+        exprs : list[AbstimeExpression]
             抽出された絶対時間表現
 
         Returns
         -------
-        List[AbstimeExpression]
+        list[AbstimeExpression]
             修正後の絶対時間表現
         """
         for i in range(len(exprs) - 1):
@@ -341,7 +340,7 @@ def fix_by_range_expression(self,  # type: ignore[override]
 
         return [expr for expr in exprs if expr]
 
-    def do_time_about(self, abstime_expr: AbstimeExpression) -> Tuple[NTime, NTime]:
+    def do_time_about(self, abstime_expr: AbstimeExpression) -> tuple[NTime, NTime]:
         """about表現の場合の日付計算を行う.
 
         Parameters
@@ -351,7 +350,7 @@ def do_time_about(self, abstime_expr: AbstimeExpression) -> Tuple[NTime, NTime]:
 
         Returns
         -------
-        Tuple[NTime, NTime]
+        tuple[NTime, NTime]
             計算後の日付情報
         """
         val_lb = abstime_expr.value_lower_bound
@@ -378,7 +377,7 @@ def do_time_about(self, abstime_expr: AbstimeExpression) -> Tuple[NTime, NTime]:
 
         return val_lb, val_ub
 
-    def do_time_zenhan(self, abstime_expr: AbstimeExpression) -> Tuple[NTime, NTime]:
+    def do_time_zenhan(self, abstime_expr: AbstimeExpression) -> tuple[NTime, NTime]:
         """前半表現の場合の日付計算を行う.
 
         Parameters
@@ -388,7 +387,7 @@ def do_time_zenhan(self, abstime_expr: AbstimeExpression) -> Tuple[NTime, NTime]
 
         Returns
         -------
-        Tuple[NTime, NTime]
+        tuple[NTime, NTime]
             計算後の日付情報
         """
         val_lb = abstime_expr.value_lower_bound
@@ -415,7 +414,7 @@ def do_time_zenhan(self, abstime_expr: AbstimeExpression) -> Tuple[NTime, NTime]
 
         return val_lb, val_ub
 
-    def do_time_kouhan(self, abstime_expr: AbstimeExpression) -> Tuple[NTime, NTime]:
+    def do_time_kouhan(self, abstime_expr: AbstimeExpression) -> tuple[NTime, NTime]:
         """後半表現の場合の日付計算を行う.
 
         Parameters
@@ -425,7 +424,7 @@ def do_time_kouhan(self, abstime_expr: AbstimeExpression) -> Tuple[NTime, NTime]
 
         Returns
         -------
-        Tuple[NTime, NTime]
+        tuple[NTime, NTime]
             計算後の日付情報
         """
         val_lb = abstime_expr.value_lower_bound
@@ -452,7 +451,7 @@ def do_time_kouhan(self, abstime_expr: AbstimeExpression) -> Tuple[NTime, NTime]
 
         return val_lb, val_ub
 
-    def do_time_nakaba(self, abstime_expr: AbstimeExpression) -> Tuple[NTime, NTime]:
+    def do_time_nakaba(self, abstime_expr: AbstimeExpression) -> tuple[NTime, NTime]:
         """半ば表現の場合の日付計算を行う.
 
         Parameters
@@ -462,7 +461,7 @@ def do_time_nakaba(self, abstime_expr: AbstimeExpression) -> Tuple[NTime, NTime]
 
         Returns
         -------
-        Tuple[NTime, NTime]
+        tuple[NTime, NTime]
             計算後の日付情報
         """
         val_lb = abstime_expr.value_lower_bound
@@ -491,7 +490,7 @@ def do_time_nakaba(self, abstime_expr: AbstimeExpression) -> Tuple[NTime, NTime]
 
         return val_lb, val_ub
 
-    def do_time_joujun(self, abstime_expr: AbstimeExpression) -> Tuple[NTime, NTime]:
+    def do_time_joujun(self, abstime_expr: AbstimeExpression) -> tuple[NTime, NTime]:
         """上旬表現の場合の日付計算を行う.
 
         Parameters
@@ -501,7 +500,7 @@ def do_time_joujun(self, abstime_expr: AbstimeExpression) -> Tuple[NTime, NTime]
 
         Returns
         -------
-        Tuple[NTime, NTime]
+        tuple[NTime, NTime]
             計算後の日付情報
         """
         val_lb = abstime_expr.value_lower_bound
@@ -513,7 +512,7 @@ def do_time_joujun(self, abstime_expr: AbstimeExpression) -> Tuple[NTime, NTime]
 
         return val_lb, val_ub
 
-    def do_time_tyujun(self, abstime_expr: AbstimeExpression) -> Tuple[NTime, NTime]:
+    def do_time_tyujun(self, abstime_expr: AbstimeExpression) -> tuple[NTime, NTime]:
         """中旬表現の場合の日付計算を行う.
 
         Parameters
@@ -523,7 +522,7 @@ def do_time_tyujun(self, abstime_expr: AbstimeExpression) -> Tuple[NTime, NTime]
 
         Returns
         -------
-        Tuple[NTime, NTime]
+        tuple[NTime, NTime]
             計算後の日付情報
         """
         val_lb = abstime_expr.value_lower_bound
@@ -535,7 +534,7 @@ def do_time_tyujun(self, abstime_expr: AbstimeExpression) -> Tuple[NTime, NTime]
 
         return val_lb, val_ub
 
-    def do_time_gejun(self, abstime_expr: AbstimeExpression) -> Tuple[NTime, NTime]:
+    def do_time_gejun(self, abstime_expr: AbstimeExpression) -> tuple[NTime, NTime]:
         """下旬表現の場合の日付計算を行う.
 
         Parameters
@@ -545,7 +544,7 @@ def do_time_gejun(self, abstime_expr: AbstimeExpression) -> Tuple[NTime, NTime]:
 
         Returns
         -------
-        Tuple[NTime, NTime]
+        tuple[NTime, NTime]
             計算後の日付情報
         """
         val_lb = abstime_expr.value_lower_bound
@@ -558,7 +557,7 @@ def do_time_gejun(self, abstime_expr: AbstimeExpression) -> Tuple[NTime, NTime]:
         return val_lb, val_ub
 
     def abstime_info2null_abstime(self, abstime1: AbstimeExpression, abstime2: AbstimeExpression) \
-            -> Tuple[AbstimeExpression, AbstimeExpression]:
+            -> tuple[AbstimeExpression, AbstimeExpression]:
         """連続する時間表現から時間表現として認識されていない部分を時間表現として修正する.
 
         Parameters
@@ -570,7 +569,7 @@ def abstime_info2null_abstime(self, abstime1: AbstimeExpression, abstime2: Absti
 
         Returns
         -------
-        Tuple[AbstimeExpression, AbstimeExpression]
+        tuple[AbstimeExpression, AbstimeExpression]
             修正後のi番目とi+1番目の絶対時間表現
         """
         if abstime1.value_lower_bound == NTime(INF):
@@ -631,7 +630,7 @@ def set_time(self, abstime_expr: AbstimeExpression, time_position: str,
         return new_abstime_expr
 
     def supplement_abstime_info(self, abstime1: AbstimeExpression,  # noqa: C901
-                                abstime2: AbstimeExpression) -> Tuple[AbstimeExpression, AbstimeExpression]:
+                                abstime2: AbstimeExpression) -> tuple[AbstimeExpression, AbstimeExpression]:
         """連続する時間表現で欠落している情報を補完する.
 
         Parameters
@@ -643,7 +642,7 @@ def supplement_abstime_info(self, abstime1: AbstimeExpression,  # noqa: C901
 
         Returns
         -------
-        Tuple[AbstimeExpression, AbstimeExpression]
+        tuple[AbstimeExpression, AbstimeExpression]
             補完後のi番目とi+1番目の絶対時間表現
         """
         new_abstime1 = deepcopy(abstime1)
diff --git a/pynormalizenumexp/normalizer/base.py b/pynormalizenumexp/normalizer/base.py
index 77fd5ff..ad9712a 100644
--- a/pynormalizenumexp/normalizer/base.py
+++ b/pynormalizenumexp/normalizer/base.py
@@ -1,6 +1,6 @@
 """各種ノーマライザの基底クラス定義モジュール."""
 from copy import deepcopy
-from typing import Dict, List, Optional, Sequence, Tuple, Union
+from typing import Optional, Sequence, Union
 
 from pynormalizenumexp.expression.base import BasePattern, NNumber, NormalizedExpression, NumberModifier
 from pynormalizenumexp.utility.dict_loader import DictLoader
@@ -23,20 +23,20 @@ def __init__(self, dict_loader: DictLoader) -> None:
 
         self.limited_expressions: Sequence[BasePattern] = []
         self.prefix_counters: Sequence[BasePattern] = []
-        self.prefix_number_modifier: List[NumberModifier] = []
-        self.suffix_number_modifier: List[NumberModifier] = []
+        self.prefix_number_modifier: list[NumberModifier] = []
+        self.suffix_number_modifier: list[NumberModifier] = []
 
-        self.limited_expression_patterns: Dict[str, int] = dict()
-        self.prefix_counter_patterns: Dict[str, int] = dict()
-        self.prefix_number_modifier_patterns: Dict[str, int] = dict()
-        self.suffix_number_modifier_patterns: Dict[str, int] = dict()
+        self.limited_expression_patterns: dict[str, int] = dict()
+        self.prefix_counter_patterns: dict[str, int] = dict()
+        self.prefix_number_modifier_patterns: dict[str, int] = dict()
+        self.suffix_number_modifier_patterns: dict[str, int] = dict()
 
     def load_dictionaries(self, limited_expr_dict_path: str, prefix_counter_dict_path: str,
                           prefix_number_modifier_dict_path: str, suffix_number_modifier_dict_path: str) -> None:
         """辞書ファイルの読み込み."""
         raise NotImplementedError()
 
-    def build_patterns(self, expressions: Sequence[Union[BasePattern, NormalizedExpression]]) -> Dict[str, int]:
+    def build_patterns(self, expressions: Sequence[Union[BasePattern, NormalizedExpression]]) -> dict[str, int]:
         """パターンオブジェクトからパターン文字列をパターンIDのマップを作成する.
 
         Parameters
@@ -46,12 +46,12 @@ def build_patterns(self, expressions: Sequence[Union[BasePattern, NormalizedExpr
 
         Returns
         -------
-        Dict[str, int]
+        dict[str, int]
             パターン文字列ごとのパターンIDのマップ
         """
         return {expr.pattern: i for i, expr in enumerate(expressions)}
 
-    def process(self, text: str) -> List[NormalizedExpression]:
+    def process(self, text: str) -> list[NormalizedExpression]:
         """数値表現の抽出を正規化を行う.
 
         Parameters
@@ -115,11 +115,11 @@ def process(self, text: str) -> List[NormalizedExpression]:
 
         return expressions
 
-    def normalize_number(self, text: str) -> List[NNumber]:
+    def normalize_number(self, text: str) -> list[NNumber]:
         """テキストから数値表現を抽出する."""
         raise NotImplementedError()
 
-    def numbers2expressions(self, numbers: List[NNumber]) -> List[NormalizedExpression]:
+    def numbers2expressions(self, numbers: list[NNumber]) -> list[NormalizedExpression]:
         """数値表現を適切な表現（絶対時間など）に変換する."""
         raise NotImplementedError()
 
@@ -171,7 +171,7 @@ def search_matching_prefix_counter(self, replaced_text: str, expr: NormalizedExp
 
     def revise_expr_by_matching_limited_expression(self, exprs: Sequence[NormalizedExpression], expr_id: int,
                                                    matching_expr: BasePattern) \
-            -> List[NormalizedExpression]:
+            -> list[NormalizedExpression]:
         """マッチした数値表現の補正を行う."""
         raise NotImplementedError()
 
@@ -233,21 +233,21 @@ def revise_expr_by_matching_suffix_number_modifier(self, expr: NormalizedExpress
 
     def normalize_limited_expression(self, replaced_text: str,
                                      exprs: Sequence[NormalizedExpression], expr_id: int) \
-            -> Tuple[int, Optional[List[NormalizedExpression]]]:
+            -> tuple[int, Optional[list[NormalizedExpression]]]:
         """抽出された数値表現の正規化.
 
         Parameters
         ----------
         replaced_text : str
             数値文字列がマスクされた元のテキスト
-        exprs : List[NormalizedExpression]
+        exprs : Sequence[NormalizedExpression]
             抽出された数値表現
         expr_id : int
             どの数値表現に着目するかのID（インデックス）
 
         Returns
         -------
-        Tuple[int, Optional[List[NormalizedExpression]]]
+        tuple[int, Optional[list[NormalizedExpression]]]
             マッチしたパターン辞書のIDと正規化された数値表現（マッチするものがなければNoneを返す）
         """
         # どの表現パターンにマッチするか検索する
@@ -337,25 +337,25 @@ def normalize_suffix_number_modifier(self, replaced_text: str, expr: NormalizedE
             expr, self.suffix_number_modifier[matching_pattern_id])
 
     def fix_by_range_expression(self, text: str, exprs: Sequence[NormalizedExpression]) \
-            -> List[NormalizedExpression]:
+            -> list[NormalizedExpression]:
         """範囲表現の修正を行う."""
         raise NotImplementedError()
 
-    def delete_not_expression(self, exprs: Sequence[NormalizedExpression]) -> List[NormalizedExpression]:
+    def delete_not_expression(self, exprs: Sequence[NormalizedExpression]) -> list[NormalizedExpression]:
         """特定条件下の数値表現を削除する."""
         raise NotImplementedError()
 
-    def fix_kara_expression(self, exprs: List[NormalizedExpression]) -> List[NormalizedExpression]:
+    def fix_kara_expression(self, exprs: list[NormalizedExpression]) -> list[NormalizedExpression]:
         """「から」表現のみがついてしまうのを修正する.
 
         Parameters
         ----------
-        exprs : List[NormalizedExpression]
+        exprs : list[NormalizedExpression]
             抽出された数値表現
 
         Returns
         -------
-        List[NormalizedExpression]
+        list[NormalizedExpression]
             修正後の数値表現
         """
         new_exprs = deepcopy(exprs)
@@ -364,23 +364,23 @@ def fix_kara_expression(self, exprs: List[NormalizedExpression]) -> List[Normali
                 expr.original_expr = expr.original_expr[2:]
                 expr.position_start += 2
                 # optionsに入っているkara_prefixを削除
-                del(expr.options[0])
+                del expr.options[0]
             elif expr.original_expr.endswith("から"):
                 expr.original_expr = expr.original_expr[:-2]
                 expr.position_end -= 2
                 # optionsに入っているkara_suffixを削除
-                del(expr.options[-1])
+                del expr.options[-1]
 
             new_exprs[i] = expr
 
         return new_exprs
 
-    def have_kara_prefix(self, options: List[str]) -> bool:
+    def have_kara_prefix(self, options: list[str]) -> bool:
         """抽出した数値表現のオプションに kara_prefix が含まれているかをチェックする.
 
         Parameters
         ----------
-        options : List[str]
+        options : list[str]
             チェック対象のオプション
 
         Returns
@@ -390,12 +390,12 @@ def have_kara_prefix(self, options: List[str]) -> bool:
         """
         return "kara_prefix" in options
 
-    def have_kara_suffix(self, options: List[str]) -> bool:
+    def have_kara_suffix(self, options: list[str]) -> bool:
         """抽出した数値表現のオプションに kara_suffix が含まれているかをチェックする.
 
         Parameters
         ----------
-        options : List[str]
+        options : list[str]
             チェック対象のオプション
 
         Returns
@@ -405,19 +405,19 @@ def have_kara_suffix(self, options: List[str]) -> bool:
         """
         return "kara_suffix" in options
 
-    def merge_options(self, options1: List[str], options2: List[str]) -> List[str]:
+    def merge_options(self, options1: list[str], options2: list[str]) -> list[str]:
         """範囲表現のオプションをマージする.
 
         Parameters
         ----------
-        options1 : List[str]
+        options1 : list[str]
             片方の範囲表現のオプション
-        options2 : List[str]
+        options2 : list[str]
             もう片方の範囲表現のオプション
 
         Returns
         -------
-        List[str]
+        list[str]
             マージしたオプション
         """
         # TODO kara_suffixを全部削除して良いかどうかは要検討
diff --git a/pynormalizenumexp/normalizer/converter/number_converter.py b/pynormalizenumexp/normalizer/converter/number_converter.py
index b582d8b..8516232 100644
--- a/pynormalizenumexp/normalizer/converter/number_converter.py
+++ b/pynormalizenumexp/normalizer/converter/number_converter.py
@@ -1,5 +1,4 @@
 """数値文字列を数値に変換する処理の基底クラス定義モジュール."""
-from typing import List, Tuple
 from unicodedata import normalize
 
 from pynormalizenumexp.utility.digit_utility import DigitUtility
@@ -70,7 +69,7 @@ def delete_connma(self, number_string: str) -> str:
         """
         return "".join(["" if self.digit_utility.is_comma(char) else char for char in number_string])
 
-    def split_by_kansuji_kurai(self, number_string: str) -> List[Tuple[str, str]]:
+    def split_by_kansuji_kurai(self, number_string: str) -> list[tuple[str, str]]:
         """文字列を位表記で分割する.
 
         Parameters
@@ -80,7 +79,7 @@ def split_by_kansuji_kurai(self, number_string: str) -> List[Tuple[str, str]]:
 
         Returns
         -------
-        List[Tuple[str, str]]
+        list[tuple[str, str]]
             分割後の文字列
         """
         splitted_number_string = []
diff --git a/pynormalizenumexp/normalizer/duration_expr_normalizer.py b/pynormalizenumexp/normalizer/duration_expr_normalizer.py
index e3eb383..e283d4c 100644
--- a/pynormalizenumexp/normalizer/duration_expr_normalizer.py
+++ b/pynormalizenumexp/normalizer/duration_expr_normalizer.py
@@ -1,6 +1,5 @@
 """期間の抽出・正規化処理を定義するモジュール."""
 from copy import deepcopy
-from typing import List, Tuple
 
 from pynormalizenumexp.expression.base import INF, NNumber, NTime, NumberModifier
 from pynormalizenumexp.expression.duration import DurationExpression, DurationPattern
@@ -13,8 +12,8 @@
 class DurationExpressionNormalizer(BaseNormalizer):
     """期間の抽出・正規化を行うクラス."""
 
-    limited_expressions: List[DurationPattern]
-    prefix_counters: List[DurationPattern]
+    limited_expressions: list[DurationPattern]
+    prefix_counters: list[DurationPattern]
 
     def __init__(self, dict_loader: DictLoader) -> None:
         """コンストラクタ.
@@ -60,7 +59,7 @@ def load_dictionaries(self, limited_expr_dict_file: str, prefix_counter_dict_fil
             expr.set_total_number_of_place_holder()
             expr.set_len_of_after_final_place_holder()
 
-    def normalize_number(self, text: str) -> List[NNumber]:
+    def normalize_number(self, text: str) -> list[NNumber]:
         """テキストから数値表現を抽出する.
 
         Parameters
@@ -70,22 +69,22 @@ def normalize_number(self, text: str) -> List[NNumber]:
 
         Returns
         -------
-        List[NNumber]
+        list[NNumber]
             抽出した数値表現
         """
         return self.number_normalizer.process(text)
 
-    def numbers2expressions(self, numbers: List[NNumber]) -> List[DurationExpression]:  # type: ignore[override]
+    def numbers2expressions(self, numbers: list[NNumber]) -> list[DurationExpression]:  # type: ignore[override]
         """抽出した数値表現を期間表現のオブジェクトに変換する.
 
         Parameters
         ----------
-        numbers : List[NNumber]
+        numbers : list[NNumber]
             抽出した数値表現
 
         Returns
         -------
-        List[DurationExpression]
+        list[DurationExpression]
             期間表現のオブジェクト
         """
         return [DurationExpression(number) for number in numbers]
@@ -119,14 +118,14 @@ def revise_duration_expr_by_process_type(self, duration_expr: DurationExpression
 
         return new_duration_expr
 
-    def revise_expr_by_matching_limited_expression(self, exprs: List[DurationExpression],  # type: ignore[override]
+    def revise_expr_by_matching_limited_expression(self, exprs: list[DurationExpression],  # type: ignore[override]
                                                    expr_id: int, matching_expr: DurationPattern) \
-            -> List[DurationExpression]:
+            -> list[DurationExpression]:
         """マッチした期間表現の補正を行う.
 
         Parameters
         ----------
-        exprs : List[DurationExpression]
+        exprs : list[DurationExpression]
             抽出された期間表現
         expr_id : int
             どの期間表現に着目するかのID（インデックス）
@@ -135,7 +134,7 @@ def revise_expr_by_matching_limited_expression(self, exprs: List[DurationExpress
 
         Returns
         -------
-        List[DurationExpression]
+        list[DurationExpression]
             補正済みの期間表現
         """
         new_exprs = deepcopy(exprs)
@@ -237,17 +236,17 @@ def revise_expr_by_number_modifier(self, expr: DurationExpression,  # type: igno
         return new_expr
 
     def delete_not_expression(self,  # type: ignore[override]
-                              exprs: List[DurationExpression]) -> List[DurationExpression]:
+                              exprs: list[DurationExpression]) -> list[DurationExpression]:
         """時間オブジェクトがNullの期間表現を削除する.
 
         Parameters
         ----------
-        exprs : List[DurationExpression]
+        exprs : list[DurationExpression]
             抽出された期間表現
 
         Returns
         -------
-        List[DurationExpression]
+        list[DurationExpression]
             削除後の期間表現
         """
         for i in range(len(exprs)):
@@ -258,19 +257,19 @@ def delete_not_expression(self,  # type: ignore[override]
         return [expr for expr in exprs if expr]
 
     def fix_by_range_expression(self,  # type: ignore[override]
-                                text: str, exprs: List[DurationExpression]) -> List[DurationExpression]:
+                                text: str, exprs: list[DurationExpression]) -> list[DurationExpression]:
         """期間の範囲表現の修正を行う.
 
         Parameters
         ----------
         text : str
             元のテキスト
-        exprs : List[DurationExpression]
+        exprs : list[DurationExpression]
             抽出された期間表現
 
         Returns
         -------
-        List[DurationExpression]
+        list[DurationExpression]
             修正後の期間表現
         """
         for i in range(len(exprs) - 1):
@@ -292,7 +291,7 @@ def fix_by_range_expression(self,  # type: ignore[override]
         return [expr for expr in exprs if expr]
 
     def do_option_han(self, duration_expr: DurationExpression,  # noqa: C901
-                      corresponding_time_position: str) -> Tuple[NTime, NTime]:
+                      corresponding_time_position: str) -> tuple[NTime, NTime]:
         """「半」表現の場合の日付計算を行う.
 
         Parameters
@@ -304,7 +303,7 @@ def do_option_han(self, duration_expr: DurationExpression,  # noqa: C901
 
         Returns
         -------
-        Tuple[NTime, NTime]
+        tuple[NTime, NTime]
             計算後の日付情報
         """
         val_lb = duration_expr.value_lower_bound
@@ -333,7 +332,7 @@ def do_option_han(self, duration_expr: DurationExpression,  # noqa: C901
 
         return val_lb, val_ub
 
-    def do_time_about(self, duration_expr: DurationExpression) -> Tuple[NTime, NTime]:
+    def do_time_about(self, duration_expr: DurationExpression) -> tuple[NTime, NTime]:
         """about表現の場合の日付計算を行う.
 
         Parameters
@@ -343,7 +342,7 @@ def do_time_about(self, duration_expr: DurationExpression) -> Tuple[NTime, NTime
 
         Returns
         -------
-        Tuple[NTime, NTime]
+        tuple[NTime, NTime]
             計算後の日付情報
         """
         val_lb = duration_expr.value_lower_bound
@@ -370,7 +369,7 @@ def do_time_about(self, duration_expr: DurationExpression) -> Tuple[NTime, NTime
 
         return val_lb, val_ub
 
-    def do_time_kyou(self, duration_expr: DurationExpression) -> Tuple[NTime, NTime]:
+    def do_time_kyou(self, duration_expr: DurationExpression) -> tuple[NTime, NTime]:
         """「強」表現の場合の日付計算を行う.
 
         Parameters
@@ -380,7 +379,7 @@ def do_time_kyou(self, duration_expr: DurationExpression) -> Tuple[NTime, NTime]
 
         Returns
         -------
-        Tuple[NTime, NTime]
+        tuple[NTime, NTime]
             計算後の日付情報
         """
         val_lb = duration_expr.value_lower_bound
@@ -403,7 +402,7 @@ def do_time_kyou(self, duration_expr: DurationExpression) -> Tuple[NTime, NTime]
 
         return val_lb, val_ub
 
-    def do_time_jaku(self, duration_expr: DurationExpression) -> Tuple[NTime, NTime]:
+    def do_time_jaku(self, duration_expr: DurationExpression) -> tuple[NTime, NTime]:
         """「弱」表現の場合の日付計算を行う.
 
         Parameters
@@ -413,7 +412,7 @@ def do_time_jaku(self, duration_expr: DurationExpression) -> Tuple[NTime, NTime]
 
         Returns
         -------
-        Tuple[NTime, NTime]
+        tuple[NTime, NTime]
             計算後の日付情報
         """
         val_lb = duration_expr.value_lower_bound
diff --git a/pynormalizenumexp/normalizer/inappropriate_expr_remover.py b/pynormalizenumexp/normalizer/inappropriate_expr_remover.py
index 2127457..3cbbadf 100644
--- a/pynormalizenumexp/normalizer/inappropriate_expr_remover.py
+++ b/pynormalizenumexp/normalizer/inappropriate_expr_remover.py
@@ -2,7 +2,7 @@
 import re
 import typing
 from copy import deepcopy
-from typing import Dict, List, Optional, Tuple, Union
+from typing import Optional, Union
 from unicodedata import normalize
 
 from pynormalizenumexp.expression.abstime import AbstimeExpression
@@ -34,34 +34,34 @@ def __init__(self, dict_loader: DictLoader) -> None:
     def init_inappropriate_strings(self) -> None:
         """不適切な文字列情報の読み込み."""
         inappropriate_strings = self.dict_loader.load_inappropriate_strings_dict("inappropriate_strings.json")
-        self.inappropriate_strings: Dict[str, bool] = dict()
+        self.inappropriate_strings: dict[str, bool] = dict()
         for string in inappropriate_strings:
             self.inappropriate_strings[string] = True
 
     @typing.no_type_check
     def remove_inappropriate_extraction(self, text: str,
-                                        numerical_exprs: List[NumericalExpression],
-                                        abstime_exprs: List[AbstimeExpression],
-                                        reltime_exprs: List[ReltimeExpression],
-                                        duration_exprs: List[DurationExpression]) \
-            -> Tuple[List[NumericalExpression], List[AbstimeExpression], List[ReltimeExpression],
-                     List[DurationExpression]]:
+                                        numerical_exprs: list[NumericalExpression],
+                                        abstime_exprs: list[AbstimeExpression],
+                                        reltime_exprs: list[ReltimeExpression],
+                                        duration_exprs: list[DurationExpression]) \
+            -> tuple[list[NumericalExpression], list[AbstimeExpression], list[ReltimeExpression],
+                     list[DurationExpression]]:
         """不適切な数値表現を削除する.
 
         Parameters
         ----------
-        numerical_exprs : List[NumericalExpression]
+        numerical_exprs : list[NumericalExpression]
             時間系以外の数値表現
-        abstime_exprs : List[AbstimeExpression]
+        abstime_exprs : list[AbstimeExpression]
             絶対時間表現
-        reltime_exprs : List[ReltimeExpression]
+        reltime_exprs : list[ReltimeExpression]
             相対時間表現
-        duration_exprs : List[DurationExpression]
+        duration_exprs : list[DurationExpression]
             期間表現
 
         Returns
         -------
-        Tuple[List[NumericalExpression], List[AbstimeExpression], List[ReltimeExpression], List[DurationExpression]]
+        tuple[list[NumericalExpression], list[AbstimeExpression], list[ReltimeExpression], list[DurationExpression]]
             不適切なものを取り除いた各数値表現
         """
         abstime_exprs = self.delete_inappropriate_abstime_exprs(abstime_exprs)
@@ -82,17 +82,17 @@ def remove_inappropriate_extraction(self, text: str,
 
         return numerical_exprs, abstime_exprs, reltime_exprs, duration_exprs
 
-    def delete_inappropriate_abstime_exprs(self, abstime_exprs: List[AbstimeExpression]) -> List[AbstimeExpression]:
+    def delete_inappropriate_abstime_exprs(self, abstime_exprs: list[AbstimeExpression]) -> list[AbstimeExpression]:
         """不適切な絶対時間表現を削除する.
 
         Parameters
         ----------
-        abstime_exprs : List[AbstimeExpression]
+        abstime_exprs : list[AbstimeExpression]
             抽出した絶対時間表現
 
         Returns
         -------
-        List[AbstimeExpression]
+        list[AbstimeExpression]
             削除後の絶対時間表現
         """
         new_abstime_exprs = deepcopy(abstime_exprs)
@@ -101,20 +101,20 @@ def delete_inappropriate_abstime_exprs(self, abstime_exprs: List[AbstimeExpressi
 
         return [expr for expr in new_abstime_exprs if expr]
 
-    def delete_duplicate_extraction(self, target_exprs: List[NormalizedExpression],
-                                    other_exprs: List[NormalizedExpression]) -> List[NormalizedExpression]:
+    def delete_duplicate_extraction(self, target_exprs: list[NormalizedExpression],
+                                    other_exprs: list[NormalizedExpression]) -> list[NormalizedExpression]:
         """重複する数値表現を削除する.
 
         Parameters
         ----------
-        target_exprs : List[NormalizedExpression]
+        target_exprs : list[NormalizedExpression]
             削除対象を含む数値表現
-        other_exprs : List[NormalizedExpression]
+        other_exprs : list[NormalizedExpression]
             比較する数値表現
 
         Returns
         -------
-        List[NormalizedExpression]
+        list[NormalizedExpression]
             削除後の数値表現
         """
         for i, target_expr in enumerate(target_exprs):
@@ -125,19 +125,19 @@ def delete_duplicate_extraction(self, target_exprs: List[NormalizedExpression],
         return [expr for expr in target_exprs if expr]
 
     def delete_inappropriate_extraction_using_dict(self, text: str,  # noqa: C901
-                                                   exprs: List[NormalizedExpression]) -> List[NormalizedExpression]:
+                                                   exprs: list[NormalizedExpression]) -> list[NormalizedExpression]:
         """辞書情報などを使った数値表現の削除.
 
         Parameters
         ----------
         text : str
             元テキスト
-        exprs : List[NormalizedExpression]
+        exprs : list[NormalizedExpression]
             削除対象を含む数値表現
 
         Returns
         -------
-        List[NormalizedExpression]
+        list[NormalizedExpression]
             削除後の数値表現
         """
         new_exprs = deepcopy(exprs)
@@ -247,14 +247,14 @@ def is_out_of_range(x: Union[int, float], a: Union[int, float], b: Union[int, fl
             or is_out_of_range(t.hour, 0, 30) or is_out_of_range(t.minute, 0, 59) or is_out_of_range(t.second, 0, 59)
 
     def is_converted_by_other_type_expressions(self, any_type_expression1: NormalizedExpression,
-                                               any_type_expressions2: List[NormalizedExpression]) -> bool:
+                                               any_type_expressions2: list[NormalizedExpression]) -> bool:
         """2つの数値表現が重複するかどうか判定する.
 
         Parameters
         ----------
         any_type_expression1 : NormalizedExpression
             判定対象の数値表現
-        any_type_expressions2 : List[NormalizedExpression]
+        any_type_expressions2 : list[NormalizedExpression]
             もう片方の数値表現
 
         Returns
diff --git a/pynormalizenumexp/normalizer/number_extractor.py b/pynormalizenumexp/normalizer/number_extractor.py
index 5e86832..1bedf95 100644
--- a/pynormalizenumexp/normalizer/number_extractor.py
+++ b/pynormalizenumexp/normalizer/number_extractor.py
@@ -1,6 +1,5 @@
 """数値表現の抽出処理の定義モジュール."""
 import re
-from typing import List
 
 from pynormalizenumexp.expression.base import NNumber, NotationType
 from pynormalizenumexp.utility.digit_utility import DigitUtility
@@ -27,12 +26,12 @@ def __init__(self, digit_utility: DigitUtility) -> None:
         """
         self.digit_utility = digit_utility
 
-    def is_invalid_notation_type(self, notation_type: List[NotationType]) -> bool:
+    def is_invalid_notation_type(self, notation_type: list[NotationType]) -> bool:
         """不適切な数字の表記を数字種から判定する.
 
         Parameters
         ----------
-        notation_type : List[NotationType]
+        notation_type : list[NotationType]
             判定対象の数字種
 
         Returns
@@ -51,7 +50,7 @@ def is_invalid_notation_type(self, notation_type: List[NotationType]) -> bool:
 
         return False
 
-    def split_number_by_kansuji_kurai(self, number: NNumber) -> List[NNumber]:
+    def split_number_by_kansuji_kurai(self, number: NNumber) -> list[NNumber]:
         """漢数字の位表記で不適切な箇所ごとに分割する.
 
         Parameters
@@ -61,7 +60,7 @@ def split_number_by_kansuji_kurai(self, number: NNumber) -> List[NNumber]:
 
         Returns
         -------
-        List[NNumber]
+        list[NNumber]
             分割後の数値表現
 
         Notes
@@ -73,7 +72,7 @@ def split_number_by_kansuji_kurai(self, number: NNumber) -> List[NNumber]:
             # 漢数字でない表記の場合は分割できないのでそのままにする
             return [number]
 
-        numbers: List[NNumber] = []
+        numbers: list[NNumber] = []
         prev_num_str = ""
         position_start = 0
         for i in range(len(number.notation_type)):
@@ -123,7 +122,7 @@ def split_number_by_kansuji_kurai(self, number: NNumber) -> List[NNumber]:
 
         return numbers
 
-    def split_number_by_notation_type(self, number: NNumber) -> List[NNumber]:
+    def split_number_by_notation_type(self, number: NNumber) -> list[NNumber]:
         """数字種が不適切な並びから数値表現を分割する.
 
         Parameters
@@ -133,14 +132,14 @@ def split_number_by_notation_type(self, number: NNumber) -> List[NNumber]:
 
         Returns
         -------
-        List[NNumber]
+        list[NNumber]
             分割後の数値表現
 
         Notes
         -----
             例：「2000三十」を「2000」と「三十」に分割する
         """
-        numbers: List[NNumber] = []
+        numbers: list[NNumber] = []
         position_start = 0
         for i in range(1, len(number.notation_type)-1):
             # 数字の表記が入り乱れているか
@@ -169,7 +168,7 @@ def split_number_by_notation_type(self, number: NNumber) -> List[NNumber]:
 
         return numbers
 
-    def extract_number(self, text: str) -> List[NNumber]:
+    def extract_number(self, text: str) -> list[NNumber]:
         """テキストからの数値表現の抽出.
 
         Parameters
@@ -179,14 +178,14 @@ def extract_number(self, text: str) -> List[NNumber]:
 
         Returns
         -------
-        List[NNumber]
+        list[NNumber]
             抽出された数値表現情報
         """
         # テキストの各文字がどの数字種にあたるか調べる
         text_notation_type = [self.digit_utility.chars2full_notation_type(char) for char in text]
 
         # 数字である部分の文字列を抜き出す
-        numbers: List[NNumber] = []
+        numbers: list[NNumber] = []
         num_str = ""
         i = 0
         while i < len(text):
@@ -208,12 +207,12 @@ def extract_number(self, text: str) -> List[NNumber]:
             numbers.append(number)
 
         # 不適切な数字種の並びから数値表現を分割する
-        numbers_notation_type_splitted: List[NNumber] = []
+        numbers_notation_type_splitted: list[NNumber] = []
         for number in numbers:
             numbers_notation_type_splitted += self.split_number_by_notation_type(number)
 
         # 不適切な漢数字の位表記から数値表現を分割する
-        numbers_kansuji_kurai_splitted: List[NNumber] = []
+        numbers_kansuji_kurai_splitted: list[NNumber] = []
         for number in numbers_notation_type_splitted:
             numbers_kansuji_kurai_splitted += self.split_number_by_kansuji_kurai(number)
 
diff --git a/pynormalizenumexp/normalizer/number_normalizer.py b/pynormalizenumexp/normalizer/number_normalizer.py
index d6b15c1..c078c54 100644
--- a/pynormalizenumexp/normalizer/number_normalizer.py
+++ b/pynormalizenumexp/normalizer/number_normalizer.py
@@ -1,6 +1,6 @@
 """数値表現のノーマライザ定義モジュール."""
 from copy import deepcopy
-from typing import Any, List, Optional
+from typing import Any, Optional
 
 from pynormalizenumexp.expression.base import NNumber
 from pynormalizenumexp.utility.dict_loader import DictLoader
@@ -33,7 +33,7 @@ def __init__(self, dict_loader: DictLoader) -> None:
         else:
             raise ValueError(f'Not supported language "{dict_loader.language}"')
 
-    def process(self, input: str, do_fix_symbol: bool = True) -> List[NNumber]:
+    def process(self, input: str, do_fix_symbol: bool = True) -> list[NNumber]:
         """テキストから数値表現を抽出し、正規化する.
 
         Parameters
@@ -46,7 +46,7 @@ def process(self, input: str, do_fix_symbol: bool = True) -> List[NNumber]:
 
         Returns
         -------
-        List[NNumber]
+        list[NNumber]
             抽出・正規化した数値表現
         """
         # 入力文に含まれる数値表現を抽出
@@ -128,19 +128,19 @@ def is_valid_comma_notation(self, number_string1: str, number_string2: str) -> b
             and self.prefix_3digits_is_arabic(number_string2) \
             and (len(number_string2) == 3 or not self.digit_utility.is_arabic(number_string2[3]))
 
-    def join_numbers_by_comma(self, text: str, numbers: List[NNumber]) -> List[NNumber]:
+    def join_numbers_by_comma(self, text: str, numbers: list[NNumber]) -> list[NNumber]:
         """コンマで連結できる数値表現があれば連結する.
 
         Parameters
         ----------
         text : str
             元のテキスト
-        numbers : List[NNumber]
+        numbers : list[NNumber]
             数値表現
 
         Returns
         -------
-        List[NNumber]
+        list[NNumber]
             コンマで連結したものを含む数値表現
         """
         new_numbers = deepcopy(numbers)
@@ -162,21 +162,21 @@ def join_numbers_by_comma(self, text: str, numbers: List[NNumber]) -> List[NNumb
             new_numbers[i-1].original_expr += char_intermediate + new_numbers[i].original_expr
             # i番目は不要なので削除する
             # -> iはnew_numbersの後ろから見ているので削除しても整合性は保たれる
-            del(new_numbers[i])
+            del new_numbers[i]
 
         return new_numbers
 
-    def convert_number(self, numbers: List[NNumber]) -> List[NNumber]:
+    def convert_number(self, numbers: list[NNumber]) -> list[NNumber]:
         """数値表現を数値に変換する.
 
         Parameters
         ----------
-        numbers : List[NNumber]
+        numbers : list[NNumber]
             変換対象の数値表現
 
         Returns
         -------
-        List[NNumber]
+        list[NNumber]
             変換後の数値表現
         """
         new_numbers = deepcopy(numbers)
@@ -306,19 +306,19 @@ def fix_suffix_su(self, text: str, number: NNumber) -> NNumber:
 
         return new_number
 
-    def fix_numbers_by_su(self, text: str, numbers: List[NNumber]) -> List[NNumber]:
+    def fix_numbers_by_su(self, text: str, numbers: list[NNumber]) -> list[NNumber]:
         """抽出した各数値表現中に含まれる「数」表現を数値に変換する.
 
         Parameters
         ----------
         text : str
             元のテキスト
-        numbers : List[NNumber]
+        numbers : list[NNumber]
             変換対象の抽出された数値表現
 
         Returns
         -------
-        List[NNumber]
+        list[NNumber]
             変換後の数値表現
         """
         new_numbers = deepcopy(numbers)
@@ -329,7 +329,7 @@ def fix_numbers_by_su(self, text: str, numbers: List[NNumber]) -> List[NNumber]:
                 new_number = self.fix_intermediate_su(text, new_numbers[i], new_numbers[i+1])
                 if new_number != new_numbers[i]:
                     new_numbers[i] = new_number
-                    del(new_numbers[i+1])
+                    del new_numbers[i+1]
 
             new_numbers[i] = self.fix_suffix_su(text, new_numbers[i])
 
@@ -356,17 +356,17 @@ def is_only_kansuji_kurai_man(self, original_expr: str) -> bool:
 
         return True
 
-    def remove_only_kansuji_kurai_man(self, numbers: List[NNumber]) -> List[NNumber]:
+    def remove_only_kansuji_kurai_man(self, numbers: list[NNumber]) -> list[NNumber]:
         """数値文字列に「万」以上の桁区切り文字しかないものを削除する.
 
         Parameters
         ----------
-        numbers : List[NNumber]
+        numbers : list[NNumber]
             抽出された数値表現
 
         Returns
         -------
-        List[NNumber]
+        list[NNumber]
             削除処理後の数値表現
         """
         new_numbers = deepcopy(numbers)
@@ -377,20 +377,20 @@ def remove_only_kansuji_kurai_man(self, numbers: List[NNumber]) -> List[NNumber]
         # 逆順にしていたのでもと順番に戻す
         return [number for number in new_numbers if number]
 
-    def remove_unnecessary_data(self, numbers: List[NNumber]) -> List[NNumber]:
+    def remove_unnecessary_data(self, numbers: list[NNumber]) -> list[NNumber]:
         """重複するような不要なデータを削除する.
 
         Parameters
         ----------
-        numbers : List[NNumber]
+        numbers : list[NNumber]
             抽出された数値表現
 
         Returns
         -------
-        List[NNumber]
+        list[NNumber]
             削除処理後の数値表現
         """
-        new_numbers: List[NNumber] = []
+        new_numbers: list[NNumber] = []
         position_start = -1
         position_end = -1
         for number in numbers:
diff --git a/pynormalizenumexp/normalizer/numerical_expr_normalizer.py b/pynormalizenumexp/normalizer/numerical_expr_normalizer.py
index 391ad7e..4b79e9e 100644
--- a/pynormalizenumexp/normalizer/numerical_expr_normalizer.py
+++ b/pynormalizenumexp/normalizer/numerical_expr_normalizer.py
@@ -1,6 +1,5 @@
 """時間系以外の数値表現の抽出・正規化処理を定義するモジュール."""
 from copy import deepcopy
-from typing import List
 
 from pynormalizenumexp.expression.base import INF, NumberModifier
 from pynormalizenumexp.expression.numerical import NumericalExpression, NumericalPattern
@@ -57,7 +56,7 @@ def load_dictionaries(self, limited_expr_dict_file: str, prefix_counter_dict_fil
             expr.set_total_number_of_place_holder()
             expr.set_len_of_after_final_place_holder()
 
-    def normalize_number(self, text: str) -> List[NNumber]:
+    def normalize_number(self, text: str) -> list[NNumber]:
         """テキストから数値表現を抽出する.
 
         Parameters
@@ -67,34 +66,34 @@ def normalize_number(self, text: str) -> List[NNumber]:
 
         Returns
         -------
-        List[NNumber]
+        list[NNumber]
             抽出した数値表現
         """
         return self.number_normalizer.process(text)
 
-    def numbers2expressions(self, numbers: List[NNumber]) -> List[NumericalExpression]:  # type: ignore[override]
+    def numbers2expressions(self, numbers: list[NNumber]) -> list[NumericalExpression]:  # type: ignore[override]
         """抽出した数値表現を変換する.
 
         Parameters
         ----------
-        numbers : List[NNumber]
+        numbers : list[NNumber]
             抽出した数値表現
 
         Returns
         -------
-        List[NumericalExpression]
+        list[NumericalExpression]
             変換後のオブジェクト
         """
         return [NumericalExpression(number) for number in numbers]
 
-    def revise_expr_by_matching_limited_expression(self, exprs: List[NumericalExpression],  # type: ignore[override]
+    def revise_expr_by_matching_limited_expression(self, exprs: list[NumericalExpression],  # type: ignore[override]
                                                    expr_id: int,
-                                                   matching_expr: NumericalPattern) -> List[NumericalExpression]:
+                                                   matching_expr: NumericalPattern) -> list[NumericalExpression]:
         """マッチした数値表現の補正を行う.
 
         Parameters
         ----------
-        exprs : List[NumericalExpression]
+        exprs : list[NumericalExpression]
             抽出された数値表現
         expr_id : int
             どの数値表現に着目するかのID（インデックス）
@@ -103,7 +102,7 @@ def revise_expr_by_matching_limited_expression(self, exprs: List[NumericalExpres
 
         Returns
         -------
-        List[NumericalExpression]
+        list[NumericalExpression]
             補正済みの数値表現
         """
         # 特殊なタイプをここで例外処理
@@ -121,13 +120,13 @@ def revise_expr_by_matching_limited_expression(self, exprs: List[NumericalExpres
 
         return new_exprs
 
-    def do_option_wari(self, num_exprs: List[NumericalExpression], expr_id: int, matching_expr: NumericalPattern) \
-            -> List[NumericalExpression]:
+    def do_option_wari(self, num_exprs: list[NumericalExpression], expr_id: int, matching_expr: NumericalPattern) \
+            -> list[NumericalExpression]:
         """日本語の割合表記の補正を行う.
 
         Parameters
         ----------
-        num_exprs : List[NumericalExpression]
+        num_exprs : list[NumericalExpression]
             抽出された数値表現
         expr_id : int
             どの数値表現に着目するかのID（インデックス）
@@ -136,7 +135,7 @@ def do_option_wari(self, num_exprs: List[NumericalExpression], expr_id: int, mat
 
         Returns
         -------
-        List[NumericalExpression]
+        list[NumericalExpression]
             補正済みの数値表現
         """
         new_num_exprs = deepcopy(num_exprs)
@@ -160,7 +159,7 @@ def do_option_wari(self, num_exprs: List[NumericalExpression], expr_id: int, mat
 
         # マージした表現を削除する
         for _ in range(2, len(matching_expr.pattern), 2):
-            del(new_num_exprs[expr_id+1])
+            del new_num_exprs[expr_id+1]
 
         return new_num_exprs
 
@@ -256,17 +255,17 @@ def revise_expr_by_number_modifier(self, expr: NumericalExpression,  # type: ign
         return new_expr
 
     def delete_not_expression(self,  # type: ignore[override]
-                              exprs: List[NumericalExpression]) -> List[NumericalExpression]:
+                              exprs: list[NumericalExpression]) -> list[NumericalExpression]:
         """数値表現が空のものを削除する.
 
         Parameters
         ----------
-        exprs : List[NumericalExpression]
+        exprs : list[NumericalExpression]
             抽出された数値表現表現
 
         Returns
         -------
-        List[NumericalExpression]
+        list[NumericalExpression]
             削除後の数値表現表現
         """
         for i in range(len(exprs)):
@@ -276,7 +275,7 @@ def delete_not_expression(self,  # type: ignore[override]
         return [expr for expr in exprs if expr]
 
     def fix_by_range_expression(self,  # type: ignore[override]
-                                text: str, exprs: List[NumericalExpression]) -> List[NumericalExpression]:
+                                text: str, exprs: list[NumericalExpression]) -> list[NumericalExpression]:
         """数値の範囲表現の修正を行う.
 
         Parameters
diff --git a/pynormalizenumexp/normalizer/reltime_expr_normalizer.py b/pynormalizenumexp/normalizer/reltime_expr_normalizer.py
index a81f501..a1c3b84 100644
--- a/pynormalizenumexp/normalizer/reltime_expr_normalizer.py
+++ b/pynormalizenumexp/normalizer/reltime_expr_normalizer.py
@@ -1,6 +1,5 @@
 """相対時間の抽出・正規化処理を定義するモジュール."""
 from copy import deepcopy
-from typing import List, Tuple
 
 from pynormalizenumexp.expression.base import INF, NNumber, NTime, NumberModifier
 from pynormalizenumexp.expression.reltime import ReltimeExpression, ReltimePattern
@@ -13,8 +12,8 @@
 class ReltimeExpressionNormalizer(BaseNormalizer):
     """相対時間の抽出・正規化を行うクラス."""
 
-    limited_expressions: List[ReltimePattern]
-    prefix_counters: List[ReltimePattern]
+    limited_expressions: list[ReltimePattern]
+    prefix_counters: list[ReltimePattern]
 
     def __init__(self, dict_loader: DictLoader) -> None:
         """コンストラクタ.
@@ -60,7 +59,7 @@ def load_dictionaries(self, limited_expr_dict_file: str, prefix_counter_dict_fil
             expr.set_total_number_of_place_holder()
             expr.set_len_of_after_final_place_holder()
 
-    def normalize_number(self, text: str) -> List[NNumber]:
+    def normalize_number(self, text: str) -> list[NNumber]:
         """テキストから数値表現を抽出する.
 
         Parameters
@@ -70,22 +69,22 @@ def normalize_number(self, text: str) -> List[NNumber]:
 
         Returns
         -------
-        List[NNumber]
+        list[NNumber]
             抽出した数値表現
         """
         return self.number_normalizer.process(text)
 
-    def numbers2expressions(self, numbers: List[NNumber]) -> List[ReltimeExpression]:  # type: ignore[override]
+    def numbers2expressions(self, numbers: list[NNumber]) -> list[ReltimeExpression]:  # type: ignore[override]
         """抽出した数値表現を相対時間表現のオブジェクトに変換する.
 
         Parameters
         ----------
-        numbers : List[NNumber]
+        numbers : list[NNumber]
             抽出した数値表現
 
         Returns
         -------
-        List[ReltimeExpression]
+        list[ReltimeExpression]
             相対時間表現のオブジェクト
         """
         return [ReltimeExpression(number) for number in numbers]
@@ -133,14 +132,14 @@ def revise_reltime_expr_by_process_type(self, reltime_expr: ReltimeExpression,
 
         return new_reltime_expr
 
-    def revise_expr_by_matching_limited_expression(self, exprs: List[ReltimeExpression],  # type: ignore[override]
+    def revise_expr_by_matching_limited_expression(self, exprs: list[ReltimeExpression],  # type: ignore[override]
                                                    expr_id: int,
-                                                   matching_expr: ReltimePattern) -> List[ReltimeExpression]:
+                                                   matching_expr: ReltimePattern) -> list[ReltimeExpression]:
         """マッチした相対時間表現の補正を行う.
 
         Parameters
         ----------
-        exprs : List[ReltimeExpression]
+        exprs : list[ReltimeExpression]
             抽出された相対時間表現
         expr_id : int
             どの相対時間表現に着目するかのID（インデックス）
@@ -149,7 +148,7 @@ def revise_expr_by_matching_limited_expression(self, exprs: List[ReltimeExpressi
 
         Returns
         -------
-        List[ReltimeExpression]
+        list[ReltimeExpression]
             補正済みの相対時間表現
         """
         new_exprs = deepcopy(exprs)
@@ -264,17 +263,17 @@ def revise_expr_by_number_modifier(self, expr: ReltimeExpression,  # type: ignor
         return new_expr
 
     def delete_not_expression(self,  # type: ignore[override]
-                              exprs: List[ReltimeExpression]) -> List[ReltimeExpression]:
+                              exprs: list[ReltimeExpression]) -> list[ReltimeExpression]:
         """時間オブジェクトがNullの相対時間表現を削除する.
 
         Parameters
         ----------
-        exprs : List[ReltimeExpression]
+        exprs : list[ReltimeExpression]
             抽出された相対時間表現
 
         Returns
         -------
-        List[ReltimeExpression]
+        list[ReltimeExpression]
             削除後の相対時間表現
         """
         for i in range(len(exprs)):
@@ -285,22 +284,22 @@ def delete_not_expression(self,  # type: ignore[override]
         return [expr for expr in exprs if expr]
 
     def fix_by_range_expression(self,  # type: ignore[override] # noqa: C901
-                                text: str, exprs: List[ReltimeExpression]) -> List[ReltimeExpression]:
+                                text: str, exprs: list[ReltimeExpression]) -> list[ReltimeExpression]:
         """相対時間の範囲表現の修正を行う.
 
         Parameters
         ----------
         text : str
             元のテキスト
-        exprs : List[ReltimeExpression]
+        exprs : list[ReltimeExpression]
             抽出された相対時間表現
 
         Returns
         -------
-        List[ReltimeExpression]
+        list[ReltimeExpression]
             修正後の相対時間表現
         """
-        def is_registered(number: NNumber, reltime_exprs: List[ReltimeExpression]) -> bool:
+        def is_registered(number: NNumber, reltime_exprs: list[ReltimeExpression]) -> bool:
             for expr in reltime_exprs:
                 if expr.position_start <= number.position_start and number.position_end <= expr.position_end:
                     return True
@@ -327,7 +326,7 @@ def is_registered(number: NNumber, reltime_exprs: List[ReltimeExpression]) -> bo
         exprs = [expr for expr in exprs if expr]
 
         # 今日、明日、来年だけの表現を抽出する
-        add_reltime_exprs: List[ReltimeExpression] = []
+        add_reltime_exprs: list[ReltimeExpression] = []
         for prefix_counter in self.prefix_counters:
             try:
                 idx = text.index(prefix_counter.pattern)
@@ -354,7 +353,7 @@ def is_registered(number: NNumber, reltime_exprs: List[ReltimeExpression]) -> bo
         return exprs
 
     def do_option_han(self, reltime_expr: ReltimeExpression,  # noqa: C901
-                      corresponding_time_position: str) -> Tuple[NTime, NTime]:
+                      corresponding_time_position: str) -> tuple[NTime, NTime]:
         """「半」表現の場合の日付計算を行う.
 
         Parameters
@@ -417,7 +416,7 @@ def do_option_han(self, reltime_expr: ReltimeExpression,  # noqa: C901
 
         return val_lb_rel, val_ub_rel
 
-    def do_time_about(self, reltime_expr: ReltimeExpression) -> Tuple[NTime, NTime]:
+    def do_time_about(self, reltime_expr: ReltimeExpression) -> tuple[NTime, NTime]:
         """about表現の場合の日付計算を行う.
 
         Parameters
@@ -427,7 +426,7 @@ def do_time_about(self, reltime_expr: ReltimeExpression) -> Tuple[NTime, NTime]:
 
         Returns
         -------
-        Tuple[NTime, NTime]
+        tuple[NTime, NTime]
             計算後の日付情報
         """
         # 「およそ1000年前」「2か月前頃」など
@@ -455,7 +454,7 @@ def do_time_about(self, reltime_expr: ReltimeExpression) -> Tuple[NTime, NTime]:
 
         return val_lb_rel, val_ub_rel
 
-    def do_time_zenhan(self, reltime_expr: ReltimeExpression) -> Tuple[NTime, NTime]:
+    def do_time_zenhan(self, reltime_expr: ReltimeExpression) -> tuple[NTime, NTime]:
         """前半表現の場合の日付計算を行う.
 
         Parameters
@@ -465,7 +464,7 @@ def do_time_zenhan(self, reltime_expr: ReltimeExpression) -> Tuple[NTime, NTime]
 
         Returns
         -------
-        Tuple[NTime, NTime]
+        tuple[NTime, NTime]
             計算後の日付情報
         """
         val_lb_abs = reltime_expr.value_lower_bound_abs
@@ -492,7 +491,7 @@ def do_time_zenhan(self, reltime_expr: ReltimeExpression) -> Tuple[NTime, NTime]
 
         return val_lb_abs, val_ub_abs
 
-    def do_time_kouhan(self, reltime_expr: ReltimeExpression) -> Tuple[NTime, NTime]:
+    def do_time_kouhan(self, reltime_expr: ReltimeExpression) -> tuple[NTime, NTime]:
         """後半表現の場合の日付計算を行う.
 
         Parameters
@@ -502,7 +501,7 @@ def do_time_kouhan(self, reltime_expr: ReltimeExpression) -> Tuple[NTime, NTime]
 
         Returns
         -------
-        Tuple[NTime, NTime]
+        tuple[NTime, NTime]
             計算後の日付情報
         """
         val_lb_abs = reltime_expr.value_lower_bound_abs
@@ -529,7 +528,7 @@ def do_time_kouhan(self, reltime_expr: ReltimeExpression) -> Tuple[NTime, NTime]
 
         return val_lb_abs, val_ub_abs
 
-    def do_time_nakaba(self, reltime_expr: ReltimeExpression) -> Tuple[NTime, NTime]:
+    def do_time_nakaba(self, reltime_expr: ReltimeExpression) -> tuple[NTime, NTime]:
         """半ば表現の場合の日付計算を行う.
 
         Parameters
@@ -539,7 +538,7 @@ def do_time_nakaba(self, reltime_expr: ReltimeExpression) -> Tuple[NTime, NTime]
 
         Returns
         -------
-        Tuple[NTime, NTime]
+        tuple[NTime, NTime]
             計算後の日付情報
         """
         val_lb_abs = reltime_expr.value_lower_bound_abs
@@ -568,7 +567,7 @@ def do_time_nakaba(self, reltime_expr: ReltimeExpression) -> Tuple[NTime, NTime]
 
         return val_lb_abs, val_ub_abs
 
-    def do_time_joujun(self, reltime_expr: ReltimeExpression) -> Tuple[NTime, NTime]:
+    def do_time_joujun(self, reltime_expr: ReltimeExpression) -> tuple[NTime, NTime]:
         """上旬表現の場合の日付計算を行う.
 
         Parameters
@@ -578,7 +577,7 @@ def do_time_joujun(self, reltime_expr: ReltimeExpression) -> Tuple[NTime, NTime]
 
         Returns
         -------
-        Tuple[NTime, NTime]
+        tuple[NTime, NTime]
             計算後の日付情報
         """
         val_lb_abs = reltime_expr.value_lower_bound_abs
@@ -590,7 +589,7 @@ def do_time_joujun(self, reltime_expr: ReltimeExpression) -> Tuple[NTime, NTime]
 
         return val_lb_abs, val_ub_abs
 
-    def do_time_tyujun(self, reltime_expr: ReltimeExpression) -> Tuple[NTime, NTime]:
+    def do_time_tyujun(self, reltime_expr: ReltimeExpression) -> tuple[NTime, NTime]:
         """中旬表現の場合の日付計算を行う.
 
         Parameters
@@ -600,7 +599,7 @@ def do_time_tyujun(self, reltime_expr: ReltimeExpression) -> Tuple[NTime, NTime]
 
         Returns
         -------
-        Tuple[NTime, NTime]
+        tuple[NTime, NTime]
             計算後の日付情報
         """
         val_lb_abs = reltime_expr.value_lower_bound_abs
@@ -612,7 +611,7 @@ def do_time_tyujun(self, reltime_expr: ReltimeExpression) -> Tuple[NTime, NTime]
 
         return val_lb_abs, val_ub_abs
 
-    def do_time_gejun(self, reltime_expr: ReltimeExpression) -> Tuple[NTime, NTime]:
+    def do_time_gejun(self, reltime_expr: ReltimeExpression) -> tuple[NTime, NTime]:
         """下旬表現の場合の日付計算を行う.
 
         Parameters
@@ -622,7 +621,7 @@ def do_time_gejun(self, reltime_expr: ReltimeExpression) -> Tuple[NTime, NTime]:
 
         Returns
         -------
-        Tuple[NTime, NTime]
+        tuple[NTime, NTime]
             計算後の日付情報
         """
         val_lb_abs = reltime_expr.value_lower_bound_abs
diff --git a/pynormalizenumexp/normalizer/symbol_fixer.py b/pynormalizenumexp/normalizer/symbol_fixer.py
index c249dbc..fec07e4 100644
--- a/pynormalizenumexp/normalizer/symbol_fixer.py
+++ b/pynormalizenumexp/normalizer/symbol_fixer.py
@@ -1,6 +1,6 @@
 """数値表現に関わる表記（プラスマイナスや小数点、カンマ、範囲文字など）を考慮した数値表現の変換処理定義モジュール."""
 from copy import deepcopy
-from typing import List, Optional
+from typing import Optional
 
 from pynormalizenumexp.expression.base import INF, NNumber
 from pynormalizenumexp.utility.digit_utility import DigitUtility
@@ -19,19 +19,19 @@ def __init__(self, digit_utility: DigitUtility) -> None:
         """
         self.digit_utility = digit_utility
 
-    def fix_numbers_by_symbol(self, text: str, numbers: List[NNumber]) -> List[NNumber]:
+    def fix_numbers_by_symbol(self, text: str, numbers: list[NNumber]) -> list[NNumber]:
         """数値表現のPrefixや数値表現間の表現を考慮した表現の修正を行う.
 
         Parameters
         ----------
         text : str
             元のテキスト
-        numbers : List[NNumber]
+        numbers : list[NNumber]
             抽出された数値表現
 
         Returns
         -------
-        List[NNumber]
+        list[NNumber]
             修正後の数値表現
         """
         new_numbers = deepcopy(numbers)
@@ -49,7 +49,7 @@ def fix_numbers_by_symbol(self, text: str, numbers: List[NNumber]) -> List[NNumb
                 # 修正がされていれば1つ後の数値表現は不要なので削除する
                 if fixed_number.original_expr != new_numbers[i].original_expr:
                     new_numbers[i] = fixed_number
-                    del(new_numbers[i+1])
+                    del new_numbers[i+1]
 
             i += 1
 
diff --git a/pynormalizenumexp/utility/custom_type.py b/pynormalizenumexp/utility/custom_type.py
index 7cacea2..e9db23a 100644
--- a/pynormalizenumexp/utility/custom_type.py
+++ b/pynormalizenumexp/utility/custom_type.py
@@ -1,11 +1,5 @@
 """TypedDictを使った独自の型定義モジュール."""
-from typing import Dict, List, Optional, Union
-
-try:
-    from typing import TypedDict
-except ImportError:
-    from typing_extensions import TypedDict
-
+from typing import Optional, TypedDict, Union
 
 # 漢数字辞書
 ChineseCharacterDict = TypedDict("ChineseCharacterDict", {
@@ -27,8 +21,8 @@
 # 絶対時間の表現パターン辞書
 AbstimePatternDict = TypedDict("AbstimePatternDict", {
     "pattern": str,
-    "corresponding_time_position": List[str],
-    "process_type": List[str],
+    "corresponding_time_position": list[str],
+    "process_type": list[str],
     "ordinary": bool,
     "option": str
 })
@@ -36,8 +30,8 @@
 # 相対時間の表現パターン辞書
 ReltimePatternDict = TypedDict("ReltimePatternDict", {
     "pattern": str,
-    "corresponding_time_position": List[str],
-    "process_type": List[str],
+    "corresponding_time_position": list[str],
+    "process_type": list[str],
     "ordinary": bool,
     "option": str
 })
@@ -45,8 +39,8 @@
 # 期間の表現パターン辞書
 DurationPatternDict = TypedDict("DurationPatternDict", {
     "pattern": str,
-    "corresponding_time_position": List[str],
-    "process_type": List[str],
+    "corresponding_time_position": list[str],
+    "process_type": list[str],
     "ordinary": bool,
     "option": str
 })
@@ -69,10 +63,10 @@
     "position_start": int,
     "position_end": int,
     "counter": str,
-    "value_lower_bound": Union[int, float, Dict[str, Union[int, float]]],
-    "value_upper_bound": Union[int, float, Dict[str, Union[int, float]]],
-    "value_lower_bound_abs": Optional[Dict[str, Union[int, float]]],
-    "value_upper_bound_abs": Optional[Dict[str, Union[int, float]]],
-    "value_lower_bound_rel": Optional[Dict[str, Union[int, float]]],
-    "value_upper_bound_rel": Optional[Dict[str, Union[int, float]]]
+    "value_lower_bound": Union[int, float, dict[str, Union[int, float]]],
+    "value_upper_bound": Union[int, float, dict[str, Union[int, float]]],
+    "value_lower_bound_abs": Optional[dict[str, Union[int, float]]],
+    "value_upper_bound_abs": Optional[dict[str, Union[int, float]]],
+    "value_lower_bound_rel": Optional[dict[str, Union[int, float]]],
+    "value_upper_bound_rel": Optional[dict[str, Union[int, float]]]
 })
diff --git a/pynormalizenumexp/utility/dict_loader.py b/pynormalizenumexp/utility/dict_loader.py
index c4208bd..fb15e77 100644
--- a/pynormalizenumexp/utility/dict_loader.py
+++ b/pynormalizenumexp/utility/dict_loader.py
@@ -1,8 +1,8 @@
 """辞書ファイルの読み込み定義モジュール."""
 import json
+import os
 from dataclasses import dataclass
-from importlib.resources import open_text
-from typing import List
+from importlib.resources import files
 
 import pynormalizenumexp
 from pynormalizenumexp.expression.abstime import AbstimePattern
@@ -11,8 +11,8 @@
 from pynormalizenumexp.expression.numerical import NumericalPattern
 from pynormalizenumexp.expression.reltime import ReltimePattern
 
-from .custom_type import (AbstimePatternDict, ChineseCharacterDict, DurationPatternDict, InappropriateStringDict,
-                          NumberModifierDict, NumericalPatternDict, ReltimePatternDict)
+from .custom_type import (AbstimePatternDict, ChineseCharacterDict, DurationPatternDict, InappropriateStringDict, NumberModifierDict,
+                          NumericalPatternDict, ReltimePatternDict)
 
 BASE_DICT_PKG = "resources.dict"
 
@@ -39,8 +39,9 @@ def __init__(self, language: str) -> None:
         """
         # TODO ja, en, zh以外はエラーになるようにする
         self.language = language
+        self.resouce_dirpath = files(f'{pynormalizenumexp.__package__}.{BASE_DICT_PKG}.{self.language}')
 
-    def load_chinese_character_dict(self, dict_file: str) -> List[ChineseCharacter]:
+    def load_chinese_character_dict(self, dict_file: str) -> list[ChineseCharacter]:
         """漢数字辞書の読み込み.
 
         Parameters
@@ -50,17 +51,17 @@ def load_chinese_character_dict(self, dict_file: str) -> List[ChineseCharacter]:
 
         Returns
         -------
-        List[ChineseCharacter]
+        list[ChineseCharacter]
             漢数字情報のリスト
         """
-        with open_text(f'{pynormalizenumexp.__package__}.{BASE_DICT_PKG}.{self.language}', dict_file) as fp:
-            characters: List[ChineseCharacterDict] = json.load(fp)["characters"]
+        with open(os.path.join(self.resouce_dirpath, dict_file)) as fp:
+            characters: list[ChineseCharacterDict] = json.load(fp)["characters"]
             load_target = [ChineseCharacter(character=char["character"], value=char["value"],
                                             notation_type=char["notation_type"]) for char in characters]
 
         return load_target
 
-    def load_counter_expr_dict(self, dict_file: str) -> List[NumericalPattern]:
+    def load_counter_expr_dict(self, dict_file: str) -> list[NumericalPattern]:
         """時間系以外のパターン辞書の読み込み.
 
         Parameters
@@ -70,7 +71,7 @@ def load_counter_expr_dict(self, dict_file: str) -> List[NumericalPattern]:
 
         Returns
         -------
-        List[NumericalPattern]
+        list[NumericalPattern]
             時間系以外のパターン情報のリスト
         """
         def make_expression(pattern: NumericalPatternDict) -> NumericalPattern:
@@ -84,13 +85,13 @@ def make_expression(pattern: NumericalPatternDict) -> NumericalPattern:
 
             return expr
 
-        with open_text(f'{pynormalizenumexp.__package__}.{BASE_DICT_PKG}.{self.language}', dict_file) as fp:
-            patterns: List[NumericalPatternDict] = json.load(fp)["patterns"]
+        with open(os.path.join(self.resouce_dirpath, dict_file)) as fp:
+            patterns: list[NumericalPatternDict] = json.load(fp)["patterns"]
             load_target = [make_expression(pattern) for pattern in patterns]
 
         return load_target
 
-    def load_limited_abstime_expr_dict(self, dict_file: str) -> List[AbstimePattern]:
+    def load_limited_abstime_expr_dict(self, dict_file: str) -> list[AbstimePattern]:
         """絶対時間のパターン辞書の読み込み.
 
         Parameters
@@ -100,7 +101,7 @@ def load_limited_abstime_expr_dict(self, dict_file: str) -> List[AbstimePattern]
 
         Returns
         -------
-        List[AbstimePattern]
+        list[AbstimePattern]
             絶対時間のパターン情報のリスト
         """
         def make_expression(pattern: AbstimePatternDict) -> AbstimePattern:
@@ -113,13 +114,13 @@ def make_expression(pattern: AbstimePatternDict) -> AbstimePattern:
 
             return expr
 
-        with open_text(f'{pynormalizenumexp.__package__}.{BASE_DICT_PKG}.{self.language}', dict_file) as fp:
-            patterns: List[AbstimePatternDict] = json.load(fp)["patterns"]
+        with open(os.path.join(self.resouce_dirpath, dict_file)) as fp:
+            patterns: list[AbstimePatternDict] = json.load(fp)["patterns"]
             load_target = [make_expression(pattern) for pattern in patterns]
 
         return load_target
 
-    def load_limited_reltime_expr_dict(self, dict_file: str) -> List[ReltimePattern]:
+    def load_limited_reltime_expr_dict(self, dict_file: str) -> list[ReltimePattern]:
         """相対時間のパターン辞書の読み込み.
 
         Parameters
@@ -129,7 +130,7 @@ def load_limited_reltime_expr_dict(self, dict_file: str) -> List[ReltimePattern]
 
         Returns
         -------
-        List[ReltimePattern]
+        list[ReltimePattern]
             相対時間のパターン情報のリスト
         """
         def make_expression(pattern: ReltimePatternDict) -> ReltimePattern:
@@ -142,13 +143,13 @@ def make_expression(pattern: ReltimePatternDict) -> ReltimePattern:
 
             return expr
 
-        with open_text(f'{pynormalizenumexp.__package__}.{BASE_DICT_PKG}.{self.language}', dict_file) as fp:
-            patterns: List[AbstimePatternDict] = json.load(fp)["patterns"]
+        with open(os.path.join(self.resouce_dirpath, dict_file)) as fp:
+            patterns: list[AbstimePatternDict] = json.load(fp)["patterns"]
             load_target = [make_expression(pattern) for pattern in patterns]
 
         return load_target
 
-    def load_limited_duration_expr_dict(self, dict_file: str) -> List[DurationPattern]:
+    def load_limited_duration_expr_dict(self, dict_file: str) -> list[DurationPattern]:
         """期間のパターン辞書の読み込み.
 
         Parameters
@@ -158,7 +159,7 @@ def load_limited_duration_expr_dict(self, dict_file: str) -> List[DurationPatter
 
         Returns
         -------
-        List[DurationPattern]
+        list[DurationPattern]
             期間のパターン情報のリスト
         """
         def make_expression(pattern: DurationPatternDict) -> DurationPattern:
@@ -171,13 +172,13 @@ def make_expression(pattern: DurationPatternDict) -> DurationPattern:
 
             return expr
 
-        with open_text(f'{pynormalizenumexp.__package__}.{BASE_DICT_PKG}.{self.language}', dict_file) as fp:
-            patterns: List[AbstimePatternDict] = json.load(fp)["patterns"]
+        with open(os.path.join(self.resouce_dirpath, dict_file)) as fp:
+            patterns: list[AbstimePatternDict] = json.load(fp)["patterns"]
             load_target = [make_expression(pattern) for pattern in patterns]
 
         return load_target
 
-    def load_number_modifier_dict(self, dict_file: str) -> List[NumberModifier]:
+    def load_number_modifier_dict(self, dict_file: str) -> list[NumberModifier]:
         """各種表現のprefix/suffixパターン辞書の読み込み.
 
         Parameters
@@ -187,16 +188,16 @@ def load_number_modifier_dict(self, dict_file: str) -> List[NumberModifier]:
 
         Returns
         -------
-        List[NumberModifier]
+        list[NumberModifier]
             各種表現のprefix/suffixパターン情報のリスト
         """
-        with open_text(f'{pynormalizenumexp.__package__}.{BASE_DICT_PKG}.{self.language}', dict_file) as fp:
-            patterns: List[NumberModifierDict] = json.load(fp)["patterns"]
+        with open(os.path.join(self.resouce_dirpath, dict_file)) as fp:
+            patterns: list[NumberModifierDict] = json.load(fp)["patterns"]
             load_target = [NumberModifier(pattern["pattern"], pattern["process_type"]) for pattern in patterns]
 
         return load_target
 
-    def load_inappropriate_strings_dict(self, dict_file: str) -> List[str]:
+    def load_inappropriate_strings_dict(self, dict_file: str) -> list[str]:
         """不適切な数値表現パターン辞書の読み込み.
 
         Parameters
@@ -206,11 +207,11 @@ def load_inappropriate_strings_dict(self, dict_file: str) -> List[str]:
 
         Returns
         -------
-        List[str]
+        list[str]
             不適切な数値表現の文字列
         """
-        with open_text(f'{pynormalizenumexp.__package__}.{BASE_DICT_PKG}.{self.language}', dict_file) as fp:
-            strings: List[InappropriateStringDict] = json.load(fp)["strings"]
+        with open(os.path.join(self.resouce_dirpath, dict_file)) as fp:
+            strings: list[InappropriateStringDict] = json.load(fp)["strings"]
             load_target = [string["str"] for string in strings]
 
         return load_target
diff --git a/pynormalizenumexp/utility/digit_utility.py b/pynormalizenumexp/utility/digit_utility.py
index 9a20d90..5732054 100644
--- a/pynormalizenumexp/utility/digit_utility.py
+++ b/pynormalizenumexp/utility/digit_utility.py
@@ -1,6 +1,6 @@
 """文字列に関する共通処理モジュール."""
 import re
-from typing import Dict, Optional
+from typing import Optional
 
 from pynormalizenumexp.expression.base import NotationType
 
@@ -20,9 +20,9 @@ def __init__(self, dict_loader: DictLoader) -> None:
         """
         self.dict_loader = dict_loader
 
-        self.str_to_notation_type: Dict[str, NotationType] = {}
-        self.kansuji_09_to_value: Dict[str, int] = {}
-        self.kansuji_kurai_to_power_val: Dict[str, int] = {}
+        self.str_to_notation_type: dict[str, NotationType] = {}
+        self.kansuji_09_to_value: dict[str, int] = {}
+        self.kansuji_kurai_to_power_val: dict[str, int] = {}
 
     def init_kansuji(self) -> None:
         """漢数字に関する初期化処理."""
diff --git a/pynormalizenumexp/utility/normalizer_utility.py b/pynormalizenumexp/utility/normalizer_utility.py
index 1a6658c..67eaacc 100644
--- a/pynormalizenumexp/utility/normalizer_utility.py
+++ b/pynormalizenumexp/utility/normalizer_utility.py
@@ -1,6 +1,6 @@
 """正規化・補正処理における共通処理を定義モジュール."""
 import re
-from typing import Dict, List, Optional, Tuple
+from typing import Optional, Tuple
 
 from pynormalizenumexp.expression.base import INF, PLACE_HOLDER, NNumber, NTime
 
@@ -8,14 +8,14 @@
 class NormalizerUtility(object):
     """正規化・補正処理における共通処理のクラス."""
 
-    def replace_numbers_in_text(self, text: str, numbers: List[NNumber]) -> str:
+    def replace_numbers_in_text(self, text: str, numbers: list[NNumber]) -> str:
         """テキスト中の数値表現をPlaceholderに置換する.
 
         Parameters
         ----------
         text : str
             置換対象のテキスト
-        numbers : List[NNumber]
+        numbers : list[NNumber]
             数値表現
 
         Returns
@@ -50,14 +50,14 @@ def shorten_place_holder_in_text(self, text: str) -> str:
         """
         return re.sub(f"[{PLACE_HOLDER}]{{2,}}", PLACE_HOLDER, text, flags=re.DOTALL)
 
-    def search_pattern(self, text: str, patterns: Dict[str, int], search_type: str) -> int:
+    def search_pattern(self, text: str, patterns: dict[str, int], search_type: str) -> int:
         """patternsの中から、テキストのprefix/suffixになっているものを探索する.
 
         Parameters
         ----------
         text : str
             探索対象のテキスト
-        patterns : Dict[str, int]
+        patterns : dict[str, int]
             パターン情報（Key：パターン文字列、Value：パターンID）
         search_type : str
             先頭から見るprefixか末尾から見るsuffixか
@@ -89,7 +89,7 @@ def search_pattern(self, text: str, patterns: Dict[str, int], search_type: str)
 
         return -1
 
-    def search_prefix_number_modifier(self, text: str, expr_position_start: int, patterns: Dict[str, int]) -> int:
+    def search_prefix_number_modifier(self, text: str, expr_position_start: int, patterns: dict[str, int]) -> int:
         """数値表現の前に来る修飾表現を検索する.
 
         Parameters
@@ -98,7 +98,7 @@ def search_prefix_number_modifier(self, text: str, expr_position_start: int, pat
             検索対象のテキスト
         expr_position_start : int
             数値表現の開始位置
-        patterns : Dict[str, int]
+        patterns : dict[str, int]
             修飾表現パターン
 
         Returns
@@ -116,7 +116,7 @@ def search_prefix_number_modifier(self, text: str, expr_position_start: int, pat
         # -> 「$」が修飾表現に該当する
         return self.search_pattern(before_text, patterns, "suffix")
 
-    def search_suffix_number_modifier(self, text: str, expr_position_end: int, patterns: Dict[str, int]) -> int:
+    def search_suffix_number_modifier(self, text: str, expr_position_end: int, patterns: dict[str, int]) -> int:
         """数値表現の後に来る修飾表現を検索する.
 
         Parameters
@@ -125,7 +125,7 @@ def search_suffix_number_modifier(self, text: str, expr_position_end: int, patte
             検索対象のテキスト
         expr_position_end : int
             数値表現の終了位置
-        patterns : Dict[str, int]
+        patterns : dict[str, int]
             修飾表現パターン
 
         Returns
diff --git a/pyproject.toml b/pyproject.toml
index 118dbe3..046875d 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
 [tool.poetry]
 name = "pynormalizenumexp"
-version = "0.1.1"
+version = "0.2.0"
 description = "NormalizeNumExp for Python"
 authors = ["tkscode"]
 license = "BSD 3-Clause"
@@ -17,21 +17,21 @@ include = [
 ]
 
 [tool.poetry.dependencies]
-python = ">=3.7,<4.0"
-typing-extensions = {version = "^3"}
+python = ">=3.9,<4.0"
 
-[tool.poetry.dev-dependencies]
-autopep8 = {version = "1.6.0"}
-bandit = {version = "1.7.0"}
-flake8 = {version = "4.0.1"}
-flake8-bandit = {version = "2.1.2"}
-flake8-docstrings = {version = "1.6.0"}
-flake8-isort = {version = "4.1.1"}
-isort = {version = "5.10.0"}
-mypy = {version = "0.910"}
-pytest = {version = "6.2.5"}
-pytest-cov = {version = "3.0.0"}
-pyproject-flake8 = {version = "0.0.1a2"}
+[tool.poetry.group.dev.dependencies]
+autopep8 = {version = "2.0.4"}
+bandit = {version = "1.7.6"}
+flake8 = {version = "7.0.0"}
+flake8-bandit = {version = "4.1.1"}
+flake8-docstrings = {version = "1.7.0"}
+flake8-isort = {version = "6.1.1"}
+isort = {version = "5.13.2"}
+mypy = {version = "1.8.0"}
+
+[tool.poetry.group.test.dependencies]
+pytest = {version = "7.4.4"}
+pytest-cov = {version = "4.1.0"}
 
 [build-system]
 requires = ["poetry-core>=1.0.0"]
diff --git a/setup.cfg b/setup.cfg
index 0d7c28b..c717bf4 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,12 +1,12 @@
 [flake8]
 docstring-convention = numpy
-exclude = .git, .tox, dist, docs, *egg, tests, __init__.py
+exclude = .git, __pycache__, .tox, dist, docs, *egg, tests, __init__.py
 max_complexity = 10
-max_line_length = 120
+max_line_length = 140
 
 [isort]
-line_length = 120
-skip = .git, .tox, .venv, .eggs, build, dist, docs
+line_length = 140
+skip = .git, __pycache__, .tox, .venv, .eggs, build, dist, docs
 
 [mypy]
 show_column_numbers = True


Test patch:
diff --git a/.github/workflows/pytest.yml b/.github/workflows/pytest.yml
index 9076580..255e979 100644
--- a/.github/workflows/pytest.yml
+++ b/.github/workflows/pytest.yml
@@ -15,7 +15,7 @@ jobs:
     # 複数のPythonのバージョンでテストするために `strategy.matrix` を設定する
     strategy:
       matrix:
-        python-version: ["3.7", "3.8", "3.9", "3.10"]
+        python-version: ["3.9", "3.10", "3.11", "3.12"]
     steps:
       # リポジトリをチェックアウトする
       # See: https://github.com/actions/checkout
@@ -31,17 +31,16 @@ jobs:
       # Poetryのインストール
       - name: Install Poetry
         run: |
-          python -m pip install --upgrade pip
           pip install poetry
       # Poetryを使って必要なPythonパッケージをインストールする
       - name: Install Dependencies
-        run: poetry install --no-interaction
+        run: poetry install --with test --no-interaction
       # pytestを実行する
       - name: Run Tests
         run: poetry run pytest
       - name: Upload coverage to Codecov
         # 上記のステップが全て完了した場合にCodecovへアップロード
-        if: ${{ matrix.python-version==3.10 }}
+        if: ${{ matrix.python-version==3.12 }}
         uses: codecov/codecov-action@v2
         with:
           file: ./coverage.xml
diff --git a/tests/normalizer/converter/test_japanese_number_converter.py b/tests/normalizer/converter/test_japanese_number_converter.py
index b22c6c8..7d30b7a 100644
--- a/tests/normalizer/converter/test_japanese_number_converter.py
+++ b/tests/normalizer/converter/test_japanese_number_converter.py
@@ -1,3 +1,4 @@
+# flake8: noqa
 import pytest
 
 from pynormalizenumexp.normalizer.converter.japanese_number_converter import JapaneseNumberConverter
diff --git a/tests/normalizer/converter/test_number_converter.py b/tests/normalizer/converter/test_number_converter.py
index 35388f6..8d81646 100644
--- a/tests/normalizer/converter/test_number_converter.py
+++ b/tests/normalizer/converter/test_number_converter.py
@@ -1,3 +1,4 @@
+# flake8: noqa
 import pytest
 
 from pynormalizenumexp.normalizer.converter.number_converter import NumberConverter
diff --git a/tests/normalizer/test_abstime_expr_normalizer.py b/tests/normalizer/test_abstime_expr_normalizer.py
index 602f63a..22bcd84 100644
--- a/tests/normalizer/test_abstime_expr_normalizer.py
+++ b/tests/normalizer/test_abstime_expr_normalizer.py
@@ -1,3 +1,4 @@
+# flake8: noqa
 import pytest
 
 from pynormalizenumexp.expression.abstime import AbstimeExpression
diff --git a/tests/normalizer/test_duration_expr_noramalizer.py b/tests/normalizer/test_duration_expr_noramalizer.py
index a4dc479..b96c368 100644
--- a/tests/normalizer/test_duration_expr_noramalizer.py
+++ b/tests/normalizer/test_duration_expr_noramalizer.py
@@ -1,3 +1,4 @@
+# flake8: noqa
 import pytest
 
 from pynormalizenumexp.expression.base import INF, NNumber, NTime
diff --git a/tests/normalizer/test_inappropriate_expr_remover.py b/tests/normalizer/test_inappropriate_expr_remover.py
index d8f10c2..097e3c1 100644
--- a/tests/normalizer/test_inappropriate_expr_remover.py
+++ b/tests/normalizer/test_inappropriate_expr_remover.py
@@ -1,3 +1,4 @@
+# flake8: noqa
 import pytest
 
 from pynormalizenumexp.expression.abstime import AbstimeExpression
diff --git a/tests/normalizer/test_number_extractor.py b/tests/normalizer/test_number_extractor.py
index e501c20..83b9251 100644
--- a/tests/normalizer/test_number_extractor.py
+++ b/tests/normalizer/test_number_extractor.py
@@ -1,9 +1,10 @@
+# flake8: noqa
 import pytest
 
 from pynormalizenumexp.expression.base import NNumber, NotationType
+from pynormalizenumexp.normalizer.number_extractor import NumberExtractor
 from pynormalizenumexp.utility.dict_loader import DictLoader
 from pynormalizenumexp.utility.digit_utility import DigitUtility
-from pynormalizenumexp.normalizer.number_extractor import NumberExtractor
 
 
 @pytest.fixture(scope="class")
diff --git a/tests/normalizer/test_number_normalizer.py b/tests/normalizer/test_number_normalizer.py
index 7d175bf..711b71f 100644
--- a/tests/normalizer/test_number_normalizer.py
+++ b/tests/normalizer/test_number_normalizer.py
@@ -1,8 +1,9 @@
+# flake8: noqa
 import pytest
 
 from pynormalizenumexp.expression.base import NNumber, NotationType
-from pynormalizenumexp.utility.dict_loader import DictLoader
 from pynormalizenumexp.normalizer.number_normalizer import NumberNormalizer
+from pynormalizenumexp.utility.dict_loader import DictLoader
 
 
 @pytest.fixture(scope="class")
diff --git a/tests/normalizer/test_numerical_expr_normalizer.py b/tests/normalizer/test_numerical_expr_normalizer.py
index 0a17557..ce982d3 100644
--- a/tests/normalizer/test_numerical_expr_normalizer.py
+++ b/tests/normalizer/test_numerical_expr_normalizer.py
@@ -1,3 +1,4 @@
+# flake8: noqa
 import pytest
 
 from pynormalizenumexp.expression.base import INF
diff --git a/tests/normalizer/test_reltime_expr_normalizer.py b/tests/normalizer/test_reltime_expr_normalizer.py
index b2e9487..f1b299f 100644
--- a/tests/normalizer/test_reltime_expr_normalizer.py
+++ b/tests/normalizer/test_reltime_expr_normalizer.py
@@ -1,3 +1,4 @@
+# flake8: noqa
 import pytest
 
 from pynormalizenumexp.expression.base import INF, NNumber, NTime
diff --git a/tests/normalizer/test_symbol_fixer.py b/tests/normalizer/test_symbol_fixer.py
index cd90463..5a34c90 100644
--- a/tests/normalizer/test_symbol_fixer.py
+++ b/tests/normalizer/test_symbol_fixer.py
@@ -1,10 +1,11 @@
+# flake8: noqa
 import math
 import pytest
 
 from pynormalizenumexp.expression.base import NNumber
+from pynormalizenumexp.normalizer.symbol_fixer import SymbolFixer
 from pynormalizenumexp.utility.dict_loader import DictLoader
 from pynormalizenumexp.utility.digit_utility import DigitUtility
-from pynormalizenumexp.normalizer.symbol_fixer import SymbolFixer
 
 
 @pytest.fixture(scope="class")
diff --git a/tests/test_normalize_numexp.py b/tests/test_normalize_numexp.py
index 6f2e1f8..9e02705 100644
--- a/tests/test_normalize_numexp.py
+++ b/tests/test_normalize_numexp.py
@@ -1,3 +1,4 @@
+# flake8: noqa
 import pytest
 
 from pynormalizenumexp.expression.base import INF
diff --git a/tests/utility/test_dict_loader.py b/tests/utility/test_dict_loader.py
index 41c3415..66222c2 100644
--- a/tests/utility/test_dict_loader.py
+++ b/tests/utility/test_dict_loader.py
@@ -1,3 +1,4 @@
+# flake8: noqa
 import pytest
 
 from pynormalizenumexp.expression.abstime import AbstimePattern
diff --git a/tests/utility/test_digit_utility.py b/tests/utility/test_digit_utility.py
index 1cd67b9..7229bcc 100644
--- a/tests/utility/test_digit_utility.py
+++ b/tests/utility/test_digit_utility.py
@@ -1,3 +1,4 @@
+# flake8: noqa
 import pytest
 
 from pynormalizenumexp.expression.base import NotationType
diff --git a/tests/utility/test_normalizer_utility.py b/tests/utility/test_normalizer_utility.py
index c1cb596..a9ae96e 100644
--- a/tests/utility/test_normalizer_utility.py
+++ b/tests/utility/test_normalizer_utility.py
@@ -1,3 +1,4 @@
+# flake8: noqa
 import pytest
 
 from pynormalizenumexp.expression.base import NNumber, NTime