SVI 4 месяцев назад
Родитель
Сommit
7c5b60430c

+ 1 - 0
.gitignore

@@ -29,3 +29,4 @@ bin
 docs/draft.md
 docs/!draft.md
 **/__pycache__
+.continue

+ 0 - 1
.python-version

@@ -1 +0,0 @@
-3.14

+ 5 - 10
Taskfile.yml

@@ -11,21 +11,16 @@ tasks:
       - echo "{{.GREETING}}"
     silent: true
   dev:
-    desc: "Запуск для отладки"
+    desc: "Запуск для отладки интерпретатора"
     cmds:
       - clear
-      - poetry run ./main.py
-  venv:
-    desc: "Включает виртуальное окружение"
-    cmds:
-      - clear
-      - poetry shell
-      - black .
+      - go fmt ./...
+      - go run -race ./cmd/proi/main.go
   ollama:
     desc: "Запуск LLM под мою конфигурацию железа"
     cmds:
-      - "ollama run qwen3-vl:8b"
+      - "ollama run qwen3:8b"
     vars:
-     OMP_NUM_THREADS: 8
+     OMP_NUM_THREADS: 16
      OMP_PROC_BIND: true
      OMP_PLACES: cores


+ 0 - 12
lev0/pak_svi/__init__.py

@@ -1,12 +0,0 @@
-"""
-Вспомогательные типы для работы приложухи.
-Повышают надёжность кода.
-Переменные окружения для контейнеризации
-"""
-
-from .mod_env import env_bool, env_float, env_int, env_str
-from .mod_log import Logger
-from .mod_opt import Option
-from .mod_result import Result
-
-__all__ = ["env_str", "env_int", "env_bool", "env_float", "Option", "Result", "Logger"]

+ 0 - 3
lev0/pak_svi/mod_const.py

@@ -1,3 +0,0 @@
-"""
-Константа с отсутствием присвоения
-"""

+ 0 - 66
lev0/pak_svi/mod_env.py

@@ -1,66 +0,0 @@
-"""
-Переменные окружения для контейнеризации.
-"""
-
-import os
-
-from .mod_result import Result
-
-
-def env_str(name_env: str) -> Result[str]:
-    """Возвращает строку из переменной окружения"""
-    param = os.getenv(name_env)
-    if param is None or param == "":
-        return Result(err=f"env_str(): env {name_env} not set")
-    return Result(result=param)
-
-
-def env_int(name_env: str) -> Result[int]:
-    """Возвращает целое из переменной окружения"""
-    param: str | None = os.getenv(name_env)
-    if param is None or param == "":
-        return Result(err=f"env_int(): env {name_env} not set")
-    iparam = 0
-    err = ""
-    try:
-        iparam = int(param)  # type: ignore
-    except TypeError as e:
-        err = f"env_int(): in convert str to int, err=\n\t{e}"
-    except ValueError as e:
-        err = f"env_int(): in convert str to int, err=\n\t{e}"
-    if err != "":
-        return Result(err=err)
-
-    return Result(result=iparam)
-
-
-def env_float(name_env: str) -> Result[float]:
-    """Возвращает вещественное из переменной окружения"""
-    param: str | None = os.getenv(name_env)
-    if param is None or param == "":
-        return Result(err=f"env_float(): env {name_env} not set")
-    iparam = 0
-    err = ""
-    try:
-        iparam = float(param)  # type: ignore
-    except TypeError as e:
-        err = f"env_float(): in convert str to float, err=\n\t{e}"
-    except ValueError as e:
-        err = f"env_float(): in convert str to float, err=\n\t{e}"
-    if err != "":
-        return Result(err=err)
-
-    return Result(result=iparam)
-
-
-def env_bool(name_env: str) -> Result[bool]:
-    """Возвращает строку из переменной окружения"""
-    param: str | None = os.getenv(name_env)
-    if param is None:
-        return Result(err=f"env_bool(): env {name_env} is None")
-    param = param.upper()
-    if param == "TRUE":
-        return Result(result=True)
-    if param == "FALSE":
-        return Result(result=False)
-    return Result(err=f"env_bool(): env {name_env} bad, val={param}")

+ 0 - 109
lev0/pak_svi/mod_log.py

@@ -1,109 +0,0 @@
-"""
-Логгер для всех сервисов
-"""
-
-import time
-import inspect
-from types import FrameType
-
-
-class Logger:
-    """
-    Логгер для всех сервисов на python
-    """
-
-    def __init__(self, prefix: str) -> None:
-        self.__pref = prefix
-        """Префикс для каждого частного логгера"""
-
-    def __call__(self, msg: str) -> None:
-        """Печатает сообщение отладки"""
-        _pref = ""
-        try:
-            frame = inspect.currentframe()
-            if isinstance(frame, FrameType):
-                # Получаем фрейм вызывающей функции
-                caller_frame: FrameType | None = frame.f_back
-                if isinstance(caller_frame, FrameType):
-                    # Имя функции
-                    _pref = caller_frame.f_code.co_name
-                del frame
-                del caller_frame
-                _pref = self.__pre(_pref)
-        except TypeError:
-            _pref = self.__pref + ": "
-        print(f"DEBU {self.__now()} {_pref}{msg}")
-
-    def debug(self, msg: str) -> None:
-        """Печатает сообщение отладки"""
-        _pref = ""
-        try:
-            frame = inspect.currentframe()
-            if isinstance(frame, FrameType):
-                # Получаем фрейм вызывающей функции
-                caller_frame: FrameType | None = frame.f_back
-                if isinstance(caller_frame, FrameType):
-                    # Имя функции
-                    _pref = caller_frame.f_code.co_name
-                del frame
-                del caller_frame
-                _pref = self.__pre(_pref)
-        except TypeError:
-            _pref = self.__pref + ": "
-        print(f"DEBU {self.__now()} {_pref}{msg}")
-
-    def error(self, msg: str) -> None:
-        """Печатает сообщение ошибки"""
-        _pref = ""
-        try:
-            frame = inspect.currentframe()
-            if isinstance(frame, FrameType):
-                # Получаем фрейм вызывающей функции
-                caller_frame: FrameType | None = frame.f_back
-                if isinstance(caller_frame, FrameType):
-                    # Имя функции
-                    _pref = caller_frame.f_code.co_name
-                del frame
-                del caller_frame
-                _pref = self.__pre(_pref)
-        except TypeError:
-            _pref = self.__pref + ": "
-        print(f"ERRO {self.__now()} {_pref}{msg}")
-
-    def warn(self, msg: str) -> None:
-        """Печатает сообщение предупреждения"""
-        _pref = ""
-        try:
-            frame = inspect.currentframe()
-            if isinstance(frame, FrameType):
-                # Получаем фрейм вызывающей функции
-                caller_frame: FrameType | None = frame.f_back
-                if isinstance(caller_frame, FrameType):
-                    # Имя функции
-                    _pref = caller_frame.f_code.co_name
-                del frame
-                del caller_frame
-                _pref = self.__pre(_pref)
-        except TypeError:
-            _pref = self.__pref + ": "
-        print(f"WARN {self.__now()} {_pref}{msg}")
-
-    def __now(self) -> str:
-        """Возвращает текущее время с миллисекундами
-        в формате %Y-%m-%d %H:%M:%S.%f"""
-        timestamp = time.time()
-        ms = int(timestamp * 1000) % 1000
-        _time = f"%Y-%m-%d %H:%M:%S.{ms:03d}"
-        return time.strftime(_time, time.localtime())
-
-    def __pre(self, fn_name: str) -> str:
-        """Получить имя вызвавшей функции"""
-        # Имя функции
-        # Также можно получить:
-        # - имя файла: caller_frame.f_code.co_filename
-        # - номер строки: caller_frame.f_lineno
-        # - локальные переменные: caller_frame.f_locals
-
-        # Очищаем ссылки на фреймы (важно для сборки мусора)
-        pref: str = self.__pref + "." + fn_name + "(): "
-        return pref

+ 0 - 45
lev0/pak_svi/mod_opt.py

@@ -1,45 +0,0 @@
-"""
-Модуль предосталвыяет тип Option (как в rust)
-"""
-
-from collections.abc import Callable
-from typing import Generic, TypeVar
-
-# Параметры типов
-T = TypeVar("T")
-
-
-class Option(Generic[T]):
-    """
-    Тип контролирующий возвращаемое значение (возможно None).
-    """
-
-    def __init__(self, val: T | None = None) -> None:
-        self._value: T | None = val
-        """Хранимое значение."""
-
-    def some(self) -> T:
-        """Возвращает полезное значение, если оно есть"""
-        if self._value is None:
-            raise ValueError("Option[T].some(): val is None")
-        return self._value
-
-    def is_some(self) -> bool:
-        """Проверка значения на значение"""
-        return self._value is not None
-
-    def is_none(self) -> bool:
-        """Проверка значения на пустышку"""
-        return self._value is None
-
-    def unwrap_or(self, val_def: T) -> T:
-        """Возвращает хранимое значение или альтернативу"""
-        if self._value is not None:
-            return self._value
-        return val_def
-
-    def unwrap_or_fn(self, fn: Callable[..., T]) -> T:
-        """Возвращает значение или результат функции"""
-        if self._value is not None:
-            return self._value
-        return fn()

+ 0 - 114
lev0/pak_svi/mod_result.py

@@ -1,114 +0,0 @@
-"""
-Модуль предоставляет тип результата.
-"""
-
-from typing import TypeVar
-
-T = TypeVar("T")
-
-
-class Result[T]:
-    """
-    Класс результата. Предоставляет полезный результат, либо ошибку.
-    Если экземпляр содержит ошибку и не было её получения (либо проверки)
-    приложение аварийно завершится.
-    """
-
-    __slots__: list[str] = ["__val", "__err", "__is_check"]
-
-    def __init__(self, result: T | None = None, err: str | None = None) -> None:
-        # Инициализируем __is_check до любых возможных exit()
-        self.__is_check = False
-        """Признак предварительной проверки ошибки"""
-        # Результат и ошибка не могут быть вместе None
-        if result is None and err is None:
-            print("=" * 80)
-            print("ERROR: Result.__init__(): called with both result=None and err=None")
-            print("This indicates a programming error in the code.")
-            print("=" * 80)
-            exit(1)
-        # Результат есть. err не может быть значением
-        if result is not None and err is not None:
-            msg = "Result.__init__(): some and err not None."
-            self.__out(msg)
-            exit(2)
-        self.__val: T | None = result
-        """Содержит результат"""
-        self.__err: str | None = err
-        """Содержит ошибку"""
-
-    @property
-    def is_err(self) -> bool:
-        """
-        Возвращает признак содержания ошибки.
-        """
-        _is_err = self.__err is not None
-        self.__is_check = True
-        return _is_err
-
-    def hassert(self, msg: str) -> None:
-        """
-        Принудительная проверка на отсутствие ошибки/ Если ошибка -- падение.
-        """
-        _is_err = self.__err is not None
-        self.__is_check = True
-        if _is_err:
-            print("=" * 80)
-            print("ERROR: Missing required environment variable!")
-            print("=" * 80)
-            print(f"Context: {msg}")
-            if self.__err:
-                print(f"Error details: {self.__err}")
-            print("=" * 80)
-            self.__out(msg)
-            exit(4)
-
-    @property
-    def val(self) -> T:
-        """Возвращает хранимый результат"""
-        if not self.__is_check:
-            msg = "Result.val(): result not checked."
-            self.__out(msg)
-            exit(3)
-        if self.__val is None:
-            msg = "Result.val(): err not None."
-            self.__out(msg)
-            exit(4)
-        return self.__val
-
-    @property
-    def err(self) -> str:
-        """Возвращает ошибку из результата"""
-        if self.__err is None:
-            msg = "Result.err(): error is None."
-            self.__out(msg)
-            exit(5)
-        return self.__err
-
-    def __del__(self) -> None:
-        """Контроль на проверенную ошибку"""
-        # Проверяем наличие атрибута на случай неполной инициализации
-        if not hasattr(self, "_Result__is_check"):
-            return
-        if self.__is_check:
-            return
-        msg = "Result.__del__(): error not checked"
-        self.__out(msg)
-        exit(6)
-
-    def __out(self, msg: str) -> None:
-        """Выводит детальную информацию об ошибке"""
-        print(f"Result error details:")
-        print(f"  Message: {msg}")
-        if self.__err:
-            # Извлекаем имя переменной из сообщения об ошибке, если возможно
-            err_msg = self.__err
-            if "env " in err_msg and " not set" in err_msg:
-                # Формат: "env_str(): env VAR_NAME not set"
-                try:
-                    var_name = err_msg.split("env ")[1].split(" not set")[0]
-                    print(f"  Missing environment variable: {var_name}")
-                except IndexError:
-                    pass
-            print(f"  Error: {err_msg}")
-        print(f"  Result value: {self.__val}")

+ 0 - 9
lev1/pak_ctx_base/__init__.py

@@ -1,9 +0,0 @@
-""""
-Базовый контекст языка.
-
-На нём строятся все контексты.
-"""
-
-from .mod_ctx_base import CtxBase
-
-__all__: list[str] = ["CtxBase"]

+ 0 - 30
lev1/pak_ctx_base/mod_ctx_base.py

@@ -1,30 +0,0 @@
-""""
-Базовый контекст языка.
-
-На нём строятся все контексты.
-"""
-
-
-class CtxBase:
-    """
-    Контекст языка
-    """
-
-    def __init__(self, name: str, parent: "CtxBase"):
-        assert name != "", "CtxBase.__init__(): name context is empty"
-        self.__name = name
-        self.__parent = parent
-
-    @property
-    def name(self) -> str:
-        """
-        Имя текущего контекста
-        """
-        return self.__name
-
-    @property
-    def parent(self) -> "CtxBase":
-        """
-        Родительский контекст
-        """
-        return self.__parent

+ 0 - 8
lev1/pak_ctx_int/__init__.py

@@ -1,8 +0,0 @@
-"""
-Контекст целого числа.
-Напрямую можно использовать только в контексте "асм".
-"""
-
-from .mod_ctx_int import CtxInt
-
-__all__ = ["CtxInt"]

+ 0 - 17
lev1/pak_ctx_int/mod_ctx_int.py

@@ -1,17 +0,0 @@
-"""
-Контекст целых чисел.
-Можно использовать только в родительском контексте "асм".
-"""
-
-from collections.abc import Callable
-
-
-class CtxInt:
-    def __init__(self):
-        self.__dict_cmd: dict[str, Callable[]] = {}
-
-    def new_int(self, lst: list[str]) -> None:
-        """
-        Создаёт новую целочисленную переменную в родительском контексте
-        """
-        

+ 0 - 7
lev1/pak_ctx_line/__init__.py

@@ -1,7 +0,0 @@
-""""
-Пакет контекста строки
-"""
-
-from .mod_ctx_line import CtxLine
-
-__all__ = ["CtxLine"]

+ 0 - 103
lev1/pak_ctx_line/mod_ctx_line.py

@@ -1,103 +0,0 @@
-"""
-Модуль контекста prolet.
-Это главная конструкция языка
-"""
-
-from lev0 import Logger
-
-
-class CtxLine:
-    """
-    Контекст каждого выражения.
-    Основа всего языка.
-    """
-
-    def __init__(self, src: str | None = None) -> None:
-        """
-        Конструктор контекста
-        @src - исходный код
-        """
-        self.__log = Logger("CtxLine")
-        self.__log("")
-        self.__line: str = ""
-        self.__lst_param: list[str] = []
-        if src is None:
-            self.__log.error("Ошибка конструктора: строка кода отсутствует")
-            exit(4)
-        self.__param: str = ""
-        self.__lst_ctx: list[CtxLine] = []
-        self.__tail: str = src
-        self.__strip_src()
-        src = self.__tail
-        # Отбор своего выражения
-        lit = src[0]
-        if lit != "(":
-            self.__log.error(f"Это не начало контекста. Строка кода='{src}'")
-            exit(5)
-        src = src[1:]
-        lit = src[0]
-        while lit != ")":
-            if lit != "(":  # Простой перебор контекста со всеми переменными
-                lit = src[0]
-                if lit == ")":
-                    continue
-                self.__line += lit
-                src = src[1:]
-                continue
-            # Начался новый контекст
-            ctx = CtxLine(src)
-            self.__lst_ctx.append(ctx)
-            src = ctx.tail
-            lit = src[0]
-        src = src[1:]
-        # Остаток строки перебора
-        self.__tail = src
-        self.__strip_src()
-
-        # self.__parse_to_call()
-
-    def __parse_to_call(self) -> None:
-        """
-        Парсит строку контекста для выяснения команды
-        """
-        self.__lst_param = self.__line.split(" ")
-        cmd: str = self.__lst_param[0]
-        fnCmd = dict_cmd[cmd]
-        if fnCmd is None:
-            self.__log.error(f"Неизвестная команда='{cmd}'")
-
-    def __strip_src(self) -> None:
-        """
-        Обрезает все литеры до открывающей скобки
-        """
-        src = self.__tail
-        while len(src) > 0 and src[0] != "(":
-            src = src[1:]
-        self.__tail = src
-
-    def run(self) -> None:
-        """
-        Исполняет свой контекст
-        """
-        self.__log(f"{self.__line}")
-
-    @property
-    def line(self) -> str:
-        """
-        Возвращает строку
-        """
-        return self.__line
-
-    @property
-    def param(self) -> str:
-        """
-        Возвращает параметр
-        """
-        return self.__param
-
-    @property
-    def tail(self) -> str:
-        """
-        Возвращает хвост исходного кода
-        """
-        return self.__tail

+ 0 - 7
lev3/__init__.py

@@ -1,7 +0,0 @@
-"""
-Верхний уровень приложения
-"""
-
-from .pak_app import ProletApp
-
-__all__: list[str] = ["ProletApp"]

+ 0 - 7
lev3/pak_app/__init__.py

@@ -1,7 +0,0 @@
-"""
-Пакет приложения
-"""
-
-from .mod_app import ProletApp
-
-__all__: list[str] = ["ProletApp"]

+ 0 - 31
lev3/pak_app/mod_app.py

@@ -1,31 +0,0 @@
-"""
-Главный модуль приложения
-"""
-
-from lev0 import Logger
-from lev3.pak_gui import Gui
-from lev3.pak_lang import Lang
-
-
-class ProletApp:
-    """
-    Главный класс приложения
-    """
-
-    def __init__(self) -> None:
-        self.__log = Logger("ProletApp")
-        self.__log.debug("")
-        self.__lang = Lang()
-        self.__gui = Gui()
-        self.__gui.txt_code.insert("1.0", self.__lang.start_file)
-        self.__gui.set_fn_step(self.__lang.step)
-
-    def run(self) -> None:
-        """
-        Запуск приложения
-        """
-        self.__log.debug(msg="start")
-        self.__lang.lbl_step=self.__gui.win_main.frm_vm.lblStep
-
-        self.__gui.run()
-        self.__log("end")

+ 0 - 7
lev3/pak_gui/__init__.py

@@ -1,7 +0,0 @@
-"""
-Графика приложения
-"""
-
-from .mod_gui import Gui
-
-__all__ = ["Gui"]

+ 0 - 40
lev3/pak_gui/mod_gui.py

@@ -1,40 +0,0 @@
-"""
-Главный интерфейс
-"""
-
-from collections.abc import Callable
-from lev0 import Logger
-from .pak_win_main import WinMain
-
-
-class Gui:
-    """
-    Главный класс графики
-    """
-
-    def __init__(self) -> None:
-        self.__log = Logger("Gui")
-        self.__log("")
-        self.__win_main = WinMain()
-        self.txt_code = self.__win_main.frm_code.txt_code
-
-    @property
-    def win_main(self) -> WinMain:
-        """
-        Возвращает главное окно приложения
-        """
-        return self.__win_main
-
-    def set_fn_step(self, fn_step: Callable[[], None]) -> None:
-        """
-        Установка функции для выполнения шага
-        """
-        self.__win_main.set_fn(fn_step)
-
-    def run(self) -> None:
-        """
-        Запуск графики в работу
-        """
-        self.__log("start")
-        self.__win_main.run()
-        self.__log("end")

+ 0 - 7
lev3/pak_gui/pak_win_main/__init__.py

@@ -1,7 +0,0 @@
-"""
-Пакет главного окна приложения
-"""
-
-from .mod_win_main import WinMain
-
-__all__ = ["WinMain"]

+ 0 - 41
lev3/pak_gui/pak_win_main/mod_win_main.py

@@ -1,41 +0,0 @@
-"""
-Главное окно приложения
-"""
-
-from collections.abc import Callable
-
-from tkinter import Tk
-from lev0 import Logger
-from .pak_frm_vm import FrmVm
-from .pak_frm_code import FrmCode
-from .pak_frm_status import FrmStatus
-
-
-class WinMain(Tk):
-    """
-    Главное окно приложения
-    """
-
-    def __init__(self) -> None:
-        self.__log = Logger("WinMain")
-        self.__log.debug("start")
-        Tk.__init__(self)
-        self.title("Prolet")
-        self.geometry("1000x600")
-        self.__frm_status = FrmStatus(self)
-        self.frm_vm = FrmVm(self)
-        self.frm_code = FrmCode(self)
-
-    def set_fn(self, fn_step: Callable[[], None]) -> None:
-        """
-        Устанавливает функцию для передачи значения
-        """
-        assert fn_step is not None, "fn_step is None"
-        self.__frm_status.set_fn_step(fn_step)
-
-    def run(self) -> None:
-        """
-        Запуск главного окна
-        """
-        self.__log.debug(msg="start")
-        self.mainloop()

+ 0 - 7
lev3/pak_gui/pak_win_main/pak_frm_code/__init__.py

@@ -1,7 +0,0 @@
-"""
-Фрейм с состоянием ВМ
-"""
-
-from .mod_frm_code import FrmCode
-
-__all__ = ["FrmCode"]

+ 0 - 17
lev3/pak_gui/pak_win_main/pak_frm_code/mod_frm_code.py

@@ -1,17 +0,0 @@
-"""
-Форма статуса главного окна
-"""
-
-from tkinter import Text, Tk, Frame
-
-
-class FrmCode(Frame):
-    """
-    Форма кода главного окна
-    """
-
-    def __init__(self, root: Tk):
-        Frame.__init__(self, root, border=3, relief="sunken")
-        self.pack(fill="both", expand=True)
-        self.txt_code = Text(self, border=2, relief="raised")
-        self.txt_code.pack(fill="both", expand=True)

+ 0 - 7
lev3/pak_gui/pak_win_main/pak_frm_status/__init__.py

@@ -1,7 +0,0 @@
-"""
-Фрейм главного окна
-"""
-
-from .mod_frm_status import FrmStatus
-
-__all__ = ["FrmStatus"]

+ 0 - 66
lev3/pak_gui/pak_win_main/pak_frm_status/mod_frm_status.py

@@ -1,66 +0,0 @@
-"""
-Фрейм статуса главного окна
-"""
-
-from collections.abc import Callable
-from datetime import date
-import time
-from tkinter import Frame, Label, Tk, Button
-
-from lev0 import Logger
-
-
-class FrmStatus(Frame):
-    """
-    Фрейм статуса главного окна
-    """
-
-    def __init__(self, winMain: Tk) -> None:
-        self.__log = Logger("FrmStatus")
-        Frame.__init__(self, master=winMain, border=3, relief="raised")
-        self.pack(fill="x", side="bottom")
-        self.__lbl_date = Label(self, text="Date: 2024-01-01",
-                                border=2, relief="groove")
-        self.__lbl_date.pack(side="left")
-        self.__lbl_time = Label(self, text="Time: 00:00:00",
-                                border=2, relief="groove")
-        self.__lbl_time.pack(side="left")
-        self.after(500, self.__next_tick)
-        self.__btn_exit = Button(self, text="Exit",
-                                 command=self.__exit, border=2,
-                                 relief="groove", bg="red")
-        self.__btn_exit.pack(side="right")
-        self.__fn_step: Callable[[], None] | None = None
-        self.__btn_step = Button(self, text="Step",
-                                 command=self.__step, border=2,
-                                 relief="groove", bg="yellow")
-        self.__btn_step.pack(side="left")
-
-    def set_fn_step(self, fn_step: Callable[[], None]) -> None:
-        """
-        Устанавливает функцию для передачи значения
-        """
-        self.__fn_step = fn_step
-
-    def __step(self) -> None:
-        """
-        Выполнение шага
-        """
-        self.__log("step!")
-        if self.__fn_step is not None:
-            self.__fn_step()
-
-    def __exit(self) -> None:
-        """
-        Выход из программы
-        """
-        self.__log("exit")
-        exit(0)
-
-    def __next_tick(self) -> None:
-        """
-        Следующий тик для меток времени
-        """
-        self.__lbl_date["text"] = f"Date: {date.today()}"
-        self.__lbl_time["text"] = f"Time: {time.strftime('%H:%M:%S')}"
-        self.after(500, self.__next_tick)

+ 0 - 7
lev3/pak_gui/pak_win_main/pak_frm_vm/__init__.py

@@ -1,7 +0,0 @@
-"""
-Фрейм с кодом главного окна
-"""
-
-from .mod_frm_vm import FrmVm
-
-__all__ = ["FrmVm"]

+ 0 - 22
lev3/pak_gui/pak_win_main/pak_frm_vm/mod_frm_vm.py

@@ -1,22 +0,0 @@
-"""
-Форма статуса ВМ
-"""
-
-from tkinter import Label, Tk, Frame
-
-class FrmVm(Frame):
-    """
-    Форма ВМ главного окна
-    """
-
-    def __init__(self, root: Tk):
-        Frame.__init__(self, root, border=3, relief="sunken")
-        self.pack(fill="y", side="left")
-        self.lblStep = Label(self, text="step: 0", border=2, relief="raised")
-        self.lblStep.pack(fill="x")
-
-    def get_step(self, ) -> Label:
-        """
-        Возвращает ссылку на шаг программы
-        """
-        return self.lblStep

+ 0 - 7
lev3/pak_lang/__init__.py

@@ -1,7 +0,0 @@
-"""
-Пакет содержит код языка и вспомогательные инструменты
-"""
-
-from .mod_lang import Lang
-
-__all__ = ["Lang"]

+ 0 - 76
lev3/pak_lang/mod_lang.py

@@ -1,76 +0,0 @@
-"""
-Инструменты языка и вспомогательные инструменты.
-"""
-
-from lev0 import Logger
-from lev1 import CtxLine
-
-
-class Lang:
-    """
-    Главный класс языка
-    """
-
-    def __init__(self) -> None:
-        self.__log = Logger("Lang")
-        self.__log("start")
-        self.__src: str = ""
-        self.__lst_ctx: list[CtxLine] = []
-        self.__start_file()
-        self.__parse_to_ctx()
-        self.__step = 0
-
-    def step(self) -> None:
-        """
-        Шаг выполнения
-        """
-        self.__log("step!")
-        if self.__step == len(self.__lst_ctx):
-            self.__log("Конец программы")
-            self.__reset()
-        ctx: CtxLine = self.__lst_ctx[self.__step]
-        ctx.run()
-        self.__step += 1
-
-    def __reset(self) -> None:
-        """
-        Сброс состояния ВМ
-        """
-        self.__step = 0
-
-    def __start_file(self) -> str:
-        """
-        Читает стартовый файл
-        """
-        self.__log("")
-        try:
-            f = open("./plt/main.plt", "r", encoding="utf-8")
-            self.__src = f.read()
-            f.close()
-        except Exception as e:
-            self.__log.error(msg=f"Ошибка при чтении файла, ош=\n\t{e}")
-        return self.__src
-
-    @property
-    def start_file(self) -> str:
-        """
-        Содержимое стартового файла
-        """
-        return self.__src
-
-    def __parse_to_ctx(self) -> None:
-        """
-        Парсинг контекстов программы
-        """
-        self.__log("")
-        src = self.__src
-        while src != "":
-            lit = src[0]
-            if lit == "(":
-                ctx = CtxLine(src)
-                self.__lst_ctx.append(ctx)
-                src = ctx.tail
-        # Отладочный вывод
-        for num in range(len(self.__lst_ctx)):
-            ctx = self.__lst_ctx[num]
-            self.__log(f"{num}: {ctx.line}")

+ 0 - 23
main.py

@@ -1,23 +0,0 @@
-#!/usr/bin/env python3
-"""
-Пускач для всего приложения
-"""
-
-
-from lev0 import Logger
-from lev3 import ProletApp
-
-
-def main() -> None:
-    """
-    Пускач для всего приложения
-    """
-    log = Logger("Main")
-    log.debug("begin")
-    app: ProletApp = ProletApp()
-    app.run()
-    log.debug("end")
-
-
-if __name__ == "__main__":
-    main()

+ 0 - 676
poetry.lock

@@ -1,676 +0,0 @@
-# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand.
-
-[[package]]
-name = "astroid"
-version = "4.0.2"
-description = "An abstract syntax tree for Python with inference support."
-optional = false
-python-versions = ">=3.10.0"
-groups = ["dev"]
-files = [
-    {file = "astroid-4.0.2-py3-none-any.whl", hash = "sha256:d7546c00a12efc32650b19a2bb66a153883185d3179ab0d4868086f807338b9b"},
-    {file = "astroid-4.0.2.tar.gz", hash = "sha256:ac8fb7ca1c08eb9afec91ccc23edbd8ac73bb22cbdd7da1d488d9fb8d6579070"},
-]
-
-[[package]]
-name = "bandit"
-version = "1.9.2"
-description = "Security oriented static analyser for python code."
-optional = false
-python-versions = ">=3.10"
-groups = ["dev"]
-files = [
-    {file = "bandit-1.9.2-py3-none-any.whl", hash = "sha256:bda8d68610fc33a6e10b7a8f1d61d92c8f6c004051d5e946406be1fb1b16a868"},
-    {file = "bandit-1.9.2.tar.gz", hash = "sha256:32410415cd93bf9c8b91972159d5cf1e7f063a9146d70345641cd3877de348ce"},
-]
-
-[package.dependencies]
-colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""}
-PyYAML = ">=5.3.1"
-rich = "*"
-stevedore = ">=1.20.0"
-
-[package.extras]
-baseline = ["GitPython (>=3.1.30)"]
-sarif = ["jschema-to-python (>=1.2.3)", "sarif-om (>=1.0.4)"]
-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)"]
-toml = ["tomli (>=1.1.0) ; python_version < \"3.11\""]
-yaml = ["PyYAML"]
-
-[[package]]
-name = "black"
-version = "25.11.0"
-description = "The uncompromising code formatter."
-optional = false
-python-versions = ">=3.9"
-groups = ["dev"]
-files = [
-    {file = "black-25.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ec311e22458eec32a807f029b2646f661e6859c3f61bc6d9ffb67958779f392e"},
-    {file = "black-25.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1032639c90208c15711334d681de2e24821af0575573db2810b0763bcd62e0f0"},
-    {file = "black-25.11.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0c0f7c461df55cf32929b002335883946a4893d759f2df343389c4396f3b6b37"},
-    {file = "black-25.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:f9786c24d8e9bd5f20dc7a7f0cdd742644656987f6ea6947629306f937726c03"},
-    {file = "black-25.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:895571922a35434a9d8ca67ef926da6bc9ad464522a5fe0db99b394ef1c0675a"},
-    {file = "black-25.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cb4f4b65d717062191bdec8e4a442539a8ea065e6af1c4f4d36f0cdb5f71e170"},
-    {file = "black-25.11.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d81a44cbc7e4f73a9d6ae449ec2317ad81512d1e7dce7d57f6333fd6259737bc"},
-    {file = "black-25.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:7eebd4744dfe92ef1ee349dc532defbf012a88b087bb7ddd688ff59a447b080e"},
-    {file = "black-25.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:80e7486ad3535636657aa180ad32a7d67d7c273a80e12f1b4bfa0823d54e8fac"},
-    {file = "black-25.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6cced12b747c4c76bc09b4db057c319d8545307266f41aaee665540bc0e04e96"},
-    {file = "black-25.11.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cb2d54a39e0ef021d6c5eef442e10fd71fcb491be6413d083a320ee768329dd"},
-    {file = "black-25.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae263af2f496940438e5be1a0c1020e13b09154f3af4df0835ea7f9fe7bfa409"},
-    {file = "black-25.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0a1d40348b6621cc20d3d7530a5b8d67e9714906dfd7346338249ad9c6cedf2b"},
-    {file = "black-25.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:51c65d7d60bb25429ea2bf0731c32b2a2442eb4bd3b2afcb47830f0b13e58bfd"},
-    {file = "black-25.11.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:936c4dd07669269f40b497440159a221ee435e3fddcf668e0c05244a9be71993"},
-    {file = "black-25.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:f42c0ea7f59994490f4dccd64e6b2dd49ac57c7c84f38b8faab50f8759db245c"},
-    {file = "black-25.11.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:35690a383f22dd3e468c85dc4b915217f87667ad9cce781d7b42678ce63c4170"},
-    {file = "black-25.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:dae49ef7369c6caa1a1833fd5efb7c3024bb7e4499bf64833f65ad27791b1545"},
-    {file = "black-25.11.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bd4a22a0b37401c8e492e994bce79e614f91b14d9ea911f44f36e262195fdda"},
-    {file = "black-25.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:aa211411e94fdf86519996b7f5f05e71ba34835d8f0c0f03c00a26271da02664"},
-    {file = "black-25.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a3bb5ce32daa9ff0605d73b6f19da0b0e6c1f8f2d75594db539fdfed722f2b06"},
-    {file = "black-25.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9815ccee1e55717fe9a4b924cae1646ef7f54e0f990da39a34fc7b264fcf80a2"},
-    {file = "black-25.11.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:92285c37b93a1698dcbc34581867b480f1ba3a7b92acf1fe0467b04d7a4da0dc"},
-    {file = "black-25.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:43945853a31099c7c0ff8dface53b4de56c41294fa6783c0441a8b1d9bf668bc"},
-    {file = "black-25.11.0-py3-none-any.whl", hash = "sha256:e3f562da087791e96cefcd9dda058380a442ab322a02e222add53736451f604b"},
-    {file = "black-25.11.0.tar.gz", hash = "sha256:9a323ac32f5dc75ce7470501b887250be5005a01602e931a15e45593f70f6e08"},
-]
-
-[package.dependencies]
-click = ">=8.0.0"
-mypy-extensions = ">=0.4.3"
-packaging = ">=22.0"
-pathspec = ">=0.9.0"
-platformdirs = ">=2"
-pytokens = ">=0.3.0"
-
-[package.extras]
-colorama = ["colorama (>=0.4.3)"]
-d = ["aiohttp (>=3.10)"]
-jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
-uvloop = ["uvloop (>=0.15.2)"]
-
-[[package]]
-name = "click"
-version = "8.3.1"
-description = "Composable command line interface toolkit"
-optional = false
-python-versions = ">=3.10"
-groups = ["dev"]
-files = [
-    {file = "click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6"},
-    {file = "click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a"},
-]
-
-[package.dependencies]
-colorama = {version = "*", markers = "platform_system == \"Windows\""}
-
-[[package]]
-name = "colorama"
-version = "0.4.6"
-description = "Cross-platform colored terminal text."
-optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
-groups = ["dev"]
-markers = "sys_platform == \"win32\" or platform_system == \"Windows\""
-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 = "dill"
-version = "0.4.0"
-description = "serialize all of Python"
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-files = [
-    {file = "dill-0.4.0-py3-none-any.whl", hash = "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049"},
-    {file = "dill-0.4.0.tar.gz", hash = "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0"},
-]
-
-[package.extras]
-graph = ["objgraph (>=1.7.2)"]
-profile = ["gprof2dot (>=2022.7.29)"]
-
-[[package]]
-name = "isort"
-version = "7.0.0"
-description = "A Python utility / library to sort Python imports."
-optional = false
-python-versions = ">=3.10.0"
-groups = ["dev"]
-files = [
-    {file = "isort-7.0.0-py3-none-any.whl", hash = "sha256:1bcabac8bc3c36c7fb7b98a76c8abb18e0f841a3ba81decac7691008592499c1"},
-    {file = "isort-7.0.0.tar.gz", hash = "sha256:5513527951aadb3ac4292a41a16cbc50dd1642432f5e8c20057d414bdafb4187"},
-]
-
-[package.extras]
-colors = ["colorama"]
-plugins = ["setuptools"]
-
-[[package]]
-name = "librt"
-version = "0.7.0"
-description = "Mypyc runtime library"
-optional = false
-python-versions = ">=3.9"
-groups = ["dev"]
-files = [
-    {file = "librt-0.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f5771fd63fe30dfbc94ac08eb6f590fb74964d90aba14c06ac94ed40cbff9f99"},
-    {file = "librt-0.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:388f794cd52ed4692ec0e3b00a07a502ef879bac90fa21f6e0035422c7b117c8"},
-    {file = "librt-0.7.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f312a192534cf162306a9f00f6d5d6f432f9f8d07f9f726111de477cec8d3ddf"},
-    {file = "librt-0.7.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:37c9133c69adcf6229e3aecea56d1c77a79dd00f5d65e7f28c500590b4edcf4b"},
-    {file = "librt-0.7.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:211a312a9ab2226ecdb509087bc6a0d0f9d8550565a0d1b848576b9119c69cda"},
-    {file = "librt-0.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1e3f975f62352ee20a0b1071532bf91e77097a541ab6f68e8cdfc56e708bed11"},
-    {file = "librt-0.7.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:99d86939d3f5be4734ff3d87923002b816e047fbe35eca731ada5ec1871afc01"},
-    {file = "librt-0.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d7884f93a210e465c793023185672816d0e94a748fd8728fb7f5cb4a7e457da7"},
-    {file = "librt-0.7.0-cp310-cp310-win32.whl", hash = "sha256:2c23b7ab197ee9ed29cd0b61ac1e24e4483f24612f4626833877e19b28f95935"},
-    {file = "librt-0.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:f8054546544f70cd27cb5e0a73c8de271c9dcc664741399acd584134310e312a"},
-    {file = "librt-0.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d89460a3a0dc0a6621c17be4eb84747b80a2e68e8da1b8cc6c2d8fc0a642b50e"},
-    {file = "librt-0.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96715093db6f983ca9c7d8a4e36b450d7c989c3b07839bb7bc3b8be12cf601af"},
-    {file = "librt-0.7.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:eab63367bdb304e87d108cfd078b0d9bfa62f4fe3e5daf9afc5e159676cac15b"},
-    {file = "librt-0.7.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1aa6eb96952cadb861b8fc5a41832349935a5a4bd1478b8425c023ece98af72c"},
-    {file = "librt-0.7.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e20cb95262897eea692eced3398f7be6647d38244c1fa8480c0e48337aac0080"},
-    {file = "librt-0.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0ce1f5863839c85c8e7e1467dd939d4af5e59bab8852852a9d8b7a9dbcdcaf2a"},
-    {file = "librt-0.7.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:97d3b787e78e8cc1b14513747cc677d3390493871394e3da9ac50dec99e2dc43"},
-    {file = "librt-0.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:75c787db17786f5a732a1eaf09b04d2c43f8931efe0876e594b8be77e603a2e1"},
-    {file = "librt-0.7.0-cp311-cp311-win32.whl", hash = "sha256:88011c66ef4053807e45158cce6c79f8f1a12d533b9a918a062273c57f8846b6"},
-    {file = "librt-0.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:e92323133242ff29eec97538f5d1421e8b96abb3212a07b9c6cea514dd58ddba"},
-    {file = "librt-0.7.0-cp311-cp311-win_arm64.whl", hash = "sha256:938050cb83c54cbd636e3b68df8dee488740f7de557b6d3dc77998b825d544b1"},
-    {file = "librt-0.7.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:15875129cce2377bd703557314b81c4e7bfc63fdcd8247b0c5bf7dc34a8d61b5"},
-    {file = "librt-0.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:90119009b757b3a611aba38e9ee163b49864825572325e2eec0080c42fc8bb69"},
-    {file = "librt-0.7.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f86024966f5bd4f962cbd54a4ad5d0e435fd3686f7edcd78c5aa84bb9427fa16"},
-    {file = "librt-0.7.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c16a988ef540b6dba0be057c343ff7489c95080348b70b6a1fa527128cf386b"},
-    {file = "librt-0.7.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e7a4dcb2419b766a034a62d28708a11e92d790aa6faa74913e587ccc4c2fc55"},
-    {file = "librt-0.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bbe9364d5b25f1fce27acaf695205a89ba2f3d79c668b03bde7315ba4b088b60"},
-    {file = "librt-0.7.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a531d4ae278713495768030ff02fc687cc174be1bf55f5084303d470e170ba7e"},
-    {file = "librt-0.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4e5b64996f1f116b6ba9597a8ff9f098c240926abbd024d1bc8e2605b46f7590"},
-    {file = "librt-0.7.0-cp312-cp312-win32.whl", hash = "sha256:fffb19b11f49c516b9cc4935e5ae01b07dfaf77b61f951c55ac9f51d3e9304aa"},
-    {file = "librt-0.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:a914759833137621c8fab73ecc0701921689f7bd29bbc34fd9cadbc6057a5261"},
-    {file = "librt-0.7.0-cp312-cp312-win_arm64.whl", hash = "sha256:3cd85f9b52300cc0a748a72d8eba2f7998f03e1dfb44b8db6e2ca344f175e1a9"},
-    {file = "librt-0.7.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:12753c83c2e29c7bb28627bbada0cfcf19e8225c6da98eb7c590b27743115298"},
-    {file = "librt-0.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:654a2a2e6325fc4906200156c98e5ef898011d4ee998f8b4277d96356920703a"},
-    {file = "librt-0.7.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6ef7654f79590bef5cc2256ffc2e9d8fccf55752f70a45e26aaac74237ab8552"},
-    {file = "librt-0.7.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a0d0c70418e0c37c040a3acace252a21e25751f3fa96084facf24783d24fd5d"},
-    {file = "librt-0.7.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d601771f291cd28aaefe115b0c3105d36fdd7d0d0abcc23bb17714c17b370bb"},
-    {file = "librt-0.7.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:49bf5cb376e120db09c2ab56fde3ce4d3933f496d74c749948964e11d1c7ada6"},
-    {file = "librt-0.7.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:350385b5f8d3f71686b4aa2181d654f01de50a0e4b11eb20fa36f5b00dc5c440"},
-    {file = "librt-0.7.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:43028b50350caf3f27168d7a5f824d23e3300f20eb2bcb99fe03f14568dad0fc"},
-    {file = "librt-0.7.0-cp313-cp313-win32.whl", hash = "sha256:263cc4beae054d088292471434af6fc710eed357161f0d45c1783830cb5332b2"},
-    {file = "librt-0.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:e95d45bfa4f207a9117ae7fb60c5cb0308eb77a924151a0b9a7d2fb70d8aec14"},
-    {file = "librt-0.7.0-cp313-cp313-win_arm64.whl", hash = "sha256:2471e23a12599761e2f052a84dd359ba1d2b34d018d2d8039aa0f8865ee7a563"},
-    {file = "librt-0.7.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ca62bc77d6e2f1ece0e141c28e2778ff79f1ca50f7824a2d6237abe9397997f5"},
-    {file = "librt-0.7.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ba50f3f01eac1066409988a7b5dcf741a474917bdef0a645ed21525f2dae0fca"},
-    {file = "librt-0.7.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:912f87f7059bd07644c675a499fff1bc3d39aea324dc4a818bf1fb163ac11fe6"},
-    {file = "librt-0.7.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c18415a23b465fc379a4a3e6e71c28f3263a111d6a0811c53b1d50ca9e1d7642"},
-    {file = "librt-0.7.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:89563b5aaada1750e106d0b04953b147c07ac07507e79252413a7e2d59153990"},
-    {file = "librt-0.7.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:51d899c7460cb30e68f7e83f4d68915127a8c7eaada7657702287e4c542f88d4"},
-    {file = "librt-0.7.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:da5edaf3c650fa9955d7343d1e057fdfc1adb3484621847331d8f01c84de70cc"},
-    {file = "librt-0.7.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c3c10fad1468457b2d13d824b7cde8946a4caa76f18fe127c7e549d1730ab271"},
-    {file = "librt-0.7.0-cp314-cp314-win32.whl", hash = "sha256:46293b0541a04909581084781aaa0c0c56d2b430a551717de2535e564f569127"},
-    {file = "librt-0.7.0-cp314-cp314-win_amd64.whl", hash = "sha256:369cf96ba818af4d14a95ce4d00f163cfa64d800ebb5a0f54556b9cb4346d97b"},
-    {file = "librt-0.7.0-cp314-cp314-win_arm64.whl", hash = "sha256:ee41eff32c0d1c08f50c32cdd2c2314366cea3912074b68db95df8cc4015eab3"},
-    {file = "librt-0.7.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:fcfe89d3bb67df63e2cb1e00a379bbc73720b43a4b8dd94ac4ca87ef32ec0f4d"},
-    {file = "librt-0.7.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:4ce4baf7f74a5eb676a9688cf31ec8f25835cf84a3f129b781bde55daf267cf1"},
-    {file = "librt-0.7.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bcd71a7ab212ca325013f968d06b72bb5ff83fb190dd582aa010e9c939a67050"},
-    {file = "librt-0.7.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b1ed0aa6c0d97697559200f64bbf1c5f04767631d8494b2ace593f0a9353d63b"},
-    {file = "librt-0.7.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d2af9c598b2cb88e3d0afcd5caca0fdbb322a93c9043d7c7fad758b0375a5263"},
-    {file = "librt-0.7.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ed2f2d991efb60218502b1a32f666cebb33deb904a176e8c36fcc8f7061f49b9"},
-    {file = "librt-0.7.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0fee181b2f73c14d1f80380b91945305919e409748bc386008fe56e23e9b0652"},
-    {file = "librt-0.7.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:867c904b6748dfa212f9de8f27537f1e51f9cc7a51474a3bdafe136d00608e45"},
-    {file = "librt-0.7.0-cp314-cp314t-win32.whl", hash = "sha256:af5ab2c4cf132cedba4359551c4f05ef2da00229aaae13e3f8a337171bb700d9"},
-    {file = "librt-0.7.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f7ab208a759db0b607c785b8970d51ad101ebec7de4b13fbedafc4207508df85"},
-    {file = "librt-0.7.0-cp314-cp314t-win_arm64.whl", hash = "sha256:506fd319530866802f9e63f28e3822e24a38dcf1814b5b6f54690bfdb55ee947"},
-    {file = "librt-0.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:92d7d9a4ab2ac35cf3202d555125dcfa29ec55ecee10cd5b8c9de412b0ad4ce1"},
-    {file = "librt-0.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:645721c2462136ed2783d6ba1edeafbc8f229f7229967fdaacf5f826fba99cf9"},
-    {file = "librt-0.7.0-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f32955c82ac5372f8d841fbe4d828f3538ef26f86ab7a275041100122513e5bf"},
-    {file = "librt-0.7.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b70ae76272f107b6492e0a135a5af150efec29abd20f7a299aa4193e74bb9a9"},
-    {file = "librt-0.7.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1d156fce27e92ebd5094ff8e9fb622d945026fd552e8eda4f0acbb58164e67b6"},
-    {file = "librt-0.7.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:810d09701fc9615943a7d510b50d450fdf1e54a8917e268cf6fa907bc61cd8df"},
-    {file = "librt-0.7.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ce9fabcda1b5015dd2ff368a9d2f36586eb9fee375e3ee407f18045f4c032516"},
-    {file = "librt-0.7.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e565e20cb349f93a4eac2509118ed75a9520dc7d757e84035a50a3307d97e3cc"},
-    {file = "librt-0.7.0-cp39-cp39-win32.whl", hash = "sha256:02b98cb2558b32d10489abcdf5119f08b27d6cf4e587159d3fcb0a1609d98d4c"},
-    {file = "librt-0.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:2bdf11b510877003330fff88b71985c1d73f8710527256bada5c78d4c8c341ef"},
-    {file = "librt-0.7.0.tar.gz", hash = "sha256:ec5235ce0f0ab7f3006c5ea9b673d2168030911b7d3a73f751a809e12c5ae54f"},
-]
-
-[[package]]
-name = "markdown-it-py"
-version = "4.0.0"
-description = "Python port of markdown-it. Markdown parsing, done right!"
-optional = false
-python-versions = ">=3.10"
-groups = ["dev"]
-files = [
-    {file = "markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147"},
-    {file = "markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3"},
-]
-
-[package.dependencies]
-mdurl = ">=0.1,<1.0"
-
-[package.extras]
-benchmarking = ["psutil", "pytest", "pytest-benchmark"]
-compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "markdown-it-pyrs", "mistletoe (>=1.0,<2.0)", "mistune (>=3.0,<4.0)", "panflute (>=2.3,<3.0)"]
-linkify = ["linkify-it-py (>=1,<3)"]
-plugins = ["mdit-py-plugins (>=0.5.0)"]
-profiling = ["gprof2dot"]
-rtd = ["ipykernel", "jupyter_sphinx", "mdit-py-plugins (>=0.5.0)", "myst-parser", "pyyaml", "sphinx", "sphinx-book-theme (>=1.0,<2.0)", "sphinx-copybutton", "sphinx-design"]
-testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions", "requests"]
-
-[[package]]
-name = "mccabe"
-version = "0.7.0"
-description = "McCabe checker, plugin for flake8"
-optional = false
-python-versions = ">=3.6"
-groups = ["dev"]
-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"
-groups = ["dev"]
-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 = "1.19.0"
-description = "Optional static typing for Python"
-optional = false
-python-versions = ">=3.9"
-groups = ["dev"]
-files = [
-    {file = "mypy-1.19.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6148ede033982a8c5ca1143de34c71836a09f105068aaa8b7d5edab2b053e6c8"},
-    {file = "mypy-1.19.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a9ac09e52bb0f7fb912f5d2a783345c72441a08ef56ce3e17c1752af36340a39"},
-    {file = "mypy-1.19.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11f7254c15ab3f8ed68f8e8f5cbe88757848df793e31c36aaa4d4f9783fd08ab"},
-    {file = "mypy-1.19.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318ba74f75899b0e78b847d8c50821e4c9637c79d9a59680fc1259f29338cb3e"},
-    {file = "mypy-1.19.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cf7d84f497f78b682edd407f14a7b6e1a2212b433eedb054e2081380b7395aa3"},
-    {file = "mypy-1.19.0-cp310-cp310-win_amd64.whl", hash = "sha256:c3385246593ac2b97f155a0e9639be906e73534630f663747c71908dfbf26134"},
-    {file = "mypy-1.19.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a31e4c28e8ddb042c84c5e977e28a21195d086aaffaf08b016b78e19c9ef8106"},
-    {file = "mypy-1.19.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:34ec1ac66d31644f194b7c163d7f8b8434f1b49719d403a5d26c87fff7e913f7"},
-    {file = "mypy-1.19.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cb64b0ba5980466a0f3f9990d1c582bcab8db12e29815ecb57f1408d99b4bff7"},
-    {file = "mypy-1.19.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:120cffe120cca5c23c03c77f84abc0c14c5d2e03736f6c312480020082f1994b"},
-    {file = "mypy-1.19.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7a500ab5c444268a70565e374fc803972bfd1f09545b13418a5174e29883dab7"},
-    {file = "mypy-1.19.0-cp311-cp311-win_amd64.whl", hash = "sha256:c14a98bc63fd867530e8ec82f217dae29d0550c86e70debc9667fff1ec83284e"},
-    {file = "mypy-1.19.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0fb3115cb8fa7c5f887c8a8d81ccdcb94cff334684980d847e5a62e926910e1d"},
-    {file = "mypy-1.19.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3e19e3b897562276bb331074d64c076dbdd3e79213f36eed4e592272dabd760"},
-    {file = "mypy-1.19.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b9d491295825182fba01b6ffe2c6fe4e5a49dbf4e2bb4d1217b6ced3b4797bc6"},
-    {file = "mypy-1.19.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6016c52ab209919b46169651b362068f632efcd5eb8ef9d1735f6f86da7853b2"},
-    {file = "mypy-1.19.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f188dcf16483b3e59f9278c4ed939ec0254aa8a60e8fc100648d9ab5ee95a431"},
-    {file = "mypy-1.19.0-cp312-cp312-win_amd64.whl", hash = "sha256:0e3c3d1e1d62e678c339e7ade72746a9e0325de42cd2cccc51616c7b2ed1a018"},
-    {file = "mypy-1.19.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7686ed65dbabd24d20066f3115018d2dce030d8fa9db01aa9f0a59b6813e9f9e"},
-    {file = "mypy-1.19.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fd4a985b2e32f23bead72e2fb4bbe5d6aceee176be471243bd831d5b2644672d"},
-    {file = "mypy-1.19.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fc51a5b864f73a3a182584b1ac75c404396a17eced54341629d8bdcb644a5bba"},
-    {file = "mypy-1.19.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:37af5166f9475872034b56c5efdcf65ee25394e9e1d172907b84577120714364"},
-    {file = "mypy-1.19.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:510c014b722308c9bd377993bcbf9a07d7e0692e5fa8fc70e639c1eb19fc6bee"},
-    {file = "mypy-1.19.0-cp313-cp313-win_amd64.whl", hash = "sha256:cabbee74f29aa9cd3b444ec2f1e4fa5a9d0d746ce7567a6a609e224429781f53"},
-    {file = "mypy-1.19.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:f2e36bed3c6d9b5f35d28b63ca4b727cb0228e480826ffc8953d1892ddc8999d"},
-    {file = "mypy-1.19.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a18d8abdda14035c5718acb748faec09571432811af129bf0d9e7b2d6699bf18"},
-    {file = "mypy-1.19.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f75e60aca3723a23511948539b0d7ed514dda194bc3755eae0bfc7a6b4887aa7"},
-    {file = "mypy-1.19.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f44f2ae3c58421ee05fe609160343c25f70e3967f6e32792b5a78006a9d850f"},
-    {file = "mypy-1.19.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:63ea6a00e4bd6822adbfc75b02ab3653a17c02c4347f5bb0cf1d5b9df3a05835"},
-    {file = "mypy-1.19.0-cp314-cp314-win_amd64.whl", hash = "sha256:3ad925b14a0bb99821ff6f734553294aa6a3440a8cb082fe1f5b84dfb662afb1"},
-    {file = "mypy-1.19.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0dde5cb375cb94deff0d4b548b993bec52859d1651e073d63a1386d392a95495"},
-    {file = "mypy-1.19.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1cf9c59398db1c68a134b0b5354a09a1e124523f00bacd68e553b8bd16ff3299"},
-    {file = "mypy-1.19.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3210d87b30e6af9c8faed61be2642fcbe60ef77cec64fa1ef810a630a4cf671c"},
-    {file = "mypy-1.19.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e2c1101ab41d01303103ab6ef82cbbfedb81c1a060c868fa7cc013d573d37ab5"},
-    {file = "mypy-1.19.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ea4fd21bb48f0da49e6d3b37ef6bd7e8228b9fe41bbf4d80d9364d11adbd43c"},
-    {file = "mypy-1.19.0-cp39-cp39-win_amd64.whl", hash = "sha256:16f76ff3f3fd8137aadf593cb4607d82634fca675e8211ad75c43d86033ee6c6"},
-    {file = "mypy-1.19.0-py3-none-any.whl", hash = "sha256:0c01c99d626380752e527d5ce8e69ffbba2046eb8a060db0329690849cf9b6f9"},
-    {file = "mypy-1.19.0.tar.gz", hash = "sha256:f6b874ca77f733222641e5c46e4711648c4037ea13646fd0cdc814c2eaec2528"},
-]
-
-[package.dependencies]
-librt = ">=0.6.2"
-mypy_extensions = ">=1.0.0"
-pathspec = ">=0.9.0"
-typing_extensions = ">=4.6.0"
-
-[package.extras]
-dmypy = ["psutil (>=4.0)"]
-faster-cache = ["orjson"]
-install-types = ["pip"]
-mypyc = ["setuptools (>=50)"]
-reports = ["lxml"]
-
-[[package]]
-name = "mypy-extensions"
-version = "1.1.0"
-description = "Type system extensions for programs checked with the mypy type checker."
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-files = [
-    {file = "mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505"},
-    {file = "mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"},
-]
-
-[[package]]
-name = "packaging"
-version = "25.0"
-description = "Core utilities for Python packages"
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-files = [
-    {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"},
-    {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"},
-]
-
-[[package]]
-name = "pathspec"
-version = "0.12.1"
-description = "Utility library for gitignore style pattern matching of file paths."
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-files = [
-    {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"},
-    {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"},
-]
-
-[[package]]
-name = "platformdirs"
-version = "4.5.1"
-description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`."
-optional = false
-python-versions = ">=3.10"
-groups = ["dev"]
-files = [
-    {file = "platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31"},
-    {file = "platformdirs-4.5.1.tar.gz", hash = "sha256:61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda"},
-]
-
-[package.extras]
-docs = ["furo (>=2025.9.25)", "proselint (>=0.14)", "sphinx (>=8.2.3)", "sphinx-autodoc-typehints (>=3.2)"]
-test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.4.2)", "pytest-cov (>=7)", "pytest-mock (>=3.15.1)"]
-type = ["mypy (>=1.18.2)"]
-
-[[package]]
-name = "pycodestyle"
-version = "2.14.0"
-description = "Python style guide checker"
-optional = false
-python-versions = ">=3.9"
-groups = ["dev"]
-files = [
-    {file = "pycodestyle-2.14.0-py2.py3-none-any.whl", hash = "sha256:dd6bf7cb4ee77f8e016f9c8e74a35ddd9f67e1d5fd4184d86c3b98e07099f42d"},
-    {file = "pycodestyle-2.14.0.tar.gz", hash = "sha256:c4b5b517d278089ff9d0abdec919cd97262a3367449ea1c8b49b91529167b783"},
-]
-
-[[package]]
-name = "pydocstyle"
-version = "6.3.0"
-description = "Python docstring style checker"
-optional = false
-python-versions = ">=3.6"
-groups = ["dev"]
-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 = ">=2.2.0"
-
-[package.extras]
-toml = ["tomli (>=1.2.3) ; python_version < \"3.11\""]
-
-[[package]]
-name = "pyflakes"
-version = "3.4.0"
-description = "passive checker of Python programs"
-optional = false
-python-versions = ">=3.9"
-groups = ["dev"]
-files = [
-    {file = "pyflakes-3.4.0-py2.py3-none-any.whl", hash = "sha256:f742a7dbd0d9cb9ea41e9a24a918996e8170c799fa528688d40dd582c8265f4f"},
-    {file = "pyflakes-3.4.0.tar.gz", hash = "sha256:b24f96fafb7d2ab0ec5075b7350b3d2d2218eab42003821c06344973d3ea2f58"},
-]
-
-[[package]]
-name = "pygments"
-version = "2.19.2"
-description = "Pygments is a syntax highlighting package written in Python."
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-files = [
-    {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"},
-    {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"},
-]
-
-[package.extras]
-windows-terminal = ["colorama (>=0.4.6)"]
-
-[[package]]
-name = "pylama"
-version = "8.4.1"
-description = "Code audit tool for python"
-optional = false
-python-versions = ">=3.7"
-groups = ["dev"]
-files = [
-    {file = "pylama-8.4.1-py3-none-any.whl", hash = "sha256:5bbdbf5b620aba7206d688ed9fc917ecd3d73e15ec1a89647037a09fa3a86e60"},
-    {file = "pylama-8.4.1.tar.gz", hash = "sha256:2d4f7aecfb5b7466216d48610c7d6bad1c3990c29cdd392ad08259b161e486f6"},
-]
-
-[package.dependencies]
-mccabe = ">=0.7.0"
-pycodestyle = ">=2.9.1"
-pydocstyle = ">=6.1.1"
-pyflakes = ">=2.5.0"
-
-[package.extras]
-all = ["eradicate", "mypy", "pylint", "radon", "vulture"]
-eradicate = ["eradicate"]
-mypy = ["mypy"]
-pylint = ["pylint"]
-radon = ["radon"]
-tests = ["eradicate (>=2.0.0)", "mypy", "pylama-quotes", "pylint (>=2.11.1)", "pytest (>=7.1.2)", "pytest-mypy", "radon (>=5.1.0)", "toml", "types-setuptools", "types-toml", "vulture"]
-toml = ["toml (>=0.10.2)"]
-vulture = ["vulture"]
-
-[[package]]
-name = "pylint"
-version = "4.0.4"
-description = "python code static checker"
-optional = false
-python-versions = ">=3.10.0"
-groups = ["dev"]
-files = [
-    {file = "pylint-4.0.4-py3-none-any.whl", hash = "sha256:63e06a37d5922555ee2c20963eb42559918c20bd2b21244e4ef426e7c43b92e0"},
-    {file = "pylint-4.0.4.tar.gz", hash = "sha256:d9b71674e19b1c36d79265b5887bf8e55278cbe236c9e95d22dc82cf044fdbd2"},
-]
-
-[package.dependencies]
-astroid = ">=4.0.2,<=4.1.dev0"
-colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""}
-dill = {version = ">=0.3.7", markers = "python_version >= \"3.12\""}
-isort = ">=5,<5.13 || >5.13,<8"
-mccabe = ">=0.6,<0.8"
-platformdirs = ">=2.2"
-tomlkit = ">=0.10.1"
-
-[package.extras]
-spelling = ["pyenchant (>=3.2,<4.0)"]
-testutils = ["gitpython (>3)"]
-
-[[package]]
-name = "pytokens"
-version = "0.3.0"
-description = "A Fast, spec compliant Python 3.14+ tokenizer that runs on older Pythons."
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-files = [
-    {file = "pytokens-0.3.0-py3-none-any.whl", hash = "sha256:95b2b5eaf832e469d141a378872480ede3f251a5a5041b8ec6e581d3ac71bbf3"},
-    {file = "pytokens-0.3.0.tar.gz", hash = "sha256:2f932b14ed08de5fcf0b391ace2642f858f1394c0857202959000b68ed7a458a"},
-]
-
-[package.extras]
-dev = ["black", "build", "mypy", "pytest", "pytest-cov", "setuptools", "tox", "twine", "wheel"]
-
-[[package]]
-name = "pyyaml"
-version = "6.0.3"
-description = "YAML parser and emitter for Python"
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-files = [
-    {file = "PyYAML-6.0.3-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f"},
-    {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4"},
-    {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:efd7b85f94a6f21e4932043973a7ba2613b059c4a000551892ac9f1d11f5baf3"},
-    {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22ba7cfcad58ef3ecddc7ed1db3409af68d023b7f940da23c6c2a1890976eda6"},
-    {file = "PyYAML-6.0.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:6344df0d5755a2c9a276d4473ae6b90647e216ab4757f8426893b5dd2ac3f369"},
-    {file = "PyYAML-6.0.3-cp38-cp38-win32.whl", hash = "sha256:3ff07ec89bae51176c0549bc4c63aa6202991da2d9a6129d7aef7f1407d3f295"},
-    {file = "PyYAML-6.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:5cf4e27da7e3fbed4d6c3d8e797387aaad68102272f8f9752883bc32d61cb87b"},
-    {file = "pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b"},
-    {file = "pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956"},
-    {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8"},
-    {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198"},
-    {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b"},
-    {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0"},
-    {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69"},
-    {file = "pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e"},
-    {file = "pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c"},
-    {file = "pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e"},
-    {file = "pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824"},
-    {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c"},
-    {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00"},
-    {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d"},
-    {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a"},
-    {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4"},
-    {file = "pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b"},
-    {file = "pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf"},
-    {file = "pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196"},
-    {file = "pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0"},
-    {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28"},
-    {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c"},
-    {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc"},
-    {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e"},
-    {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea"},
-    {file = "pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5"},
-    {file = "pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b"},
-    {file = "pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd"},
-    {file = "pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8"},
-    {file = "pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1"},
-    {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c"},
-    {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5"},
-    {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6"},
-    {file = "pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6"},
-    {file = "pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be"},
-    {file = "pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26"},
-    {file = "pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c"},
-    {file = "pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb"},
-    {file = "pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac"},
-    {file = "pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310"},
-    {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7"},
-    {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788"},
-    {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5"},
-    {file = "pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764"},
-    {file = "pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35"},
-    {file = "pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac"},
-    {file = "pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3"},
-    {file = "pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3"},
-    {file = "pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba"},
-    {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c"},
-    {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702"},
-    {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c"},
-    {file = "pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065"},
-    {file = "pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65"},
-    {file = "pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9"},
-    {file = "pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b"},
-    {file = "pyyaml-6.0.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da"},
-    {file = "pyyaml-6.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917"},
-    {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9"},
-    {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5"},
-    {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a"},
-    {file = "pyyaml-6.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926"},
-    {file = "pyyaml-6.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7"},
-    {file = "pyyaml-6.0.3-cp39-cp39-win32.whl", hash = "sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0"},
-    {file = "pyyaml-6.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007"},
-    {file = "pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f"},
-]
-
-[[package]]
-name = "rich"
-version = "14.2.0"
-description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal"
-optional = false
-python-versions = ">=3.8.0"
-groups = ["dev"]
-files = [
-    {file = "rich-14.2.0-py3-none-any.whl", hash = "sha256:76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd"},
-    {file = "rich-14.2.0.tar.gz", hash = "sha256:73ff50c7c0c1c77c8243079283f4edb376f0f6442433aecb8ce7e6d0b92d1fe4"},
-]
-
-[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 = "snowballstemmer"
-version = "3.0.1"
-description = "This package provides 32 stemmers for 30 languages generated from Snowball algorithms."
-optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*"
-groups = ["dev"]
-files = [
-    {file = "snowballstemmer-3.0.1-py3-none-any.whl", hash = "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064"},
-    {file = "snowballstemmer-3.0.1.tar.gz", hash = "sha256:6d5eeeec8e9f84d4d56b847692bacf79bc2c8e90c7f80ca4444ff8b6f2e52895"},
-]
-
-[[package]]
-name = "stevedore"
-version = "5.6.0"
-description = "Manage dynamic plugins for Python applications"
-optional = false
-python-versions = ">=3.10"
-groups = ["dev"]
-files = [
-    {file = "stevedore-5.6.0-py3-none-any.whl", hash = "sha256:4a36dccefd7aeea0c70135526cecb7766c4c84c473b1af68db23d541b6dc1820"},
-    {file = "stevedore-5.6.0.tar.gz", hash = "sha256:f22d15c6ead40c5bbfa9ca54aa7e7b4a07d59b36ae03ed12ced1a54cf0b51945"},
-]
-
-[[package]]
-name = "tomlkit"
-version = "0.13.3"
-description = "Style preserving TOML library"
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-files = [
-    {file = "tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0"},
-    {file = "tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1"},
-]
-
-[[package]]
-name = "typing-extensions"
-version = "4.15.0"
-description = "Backported and Experimental Type Hints for Python 3.9+"
-optional = false
-python-versions = ">=3.9"
-groups = ["dev"]
-files = [
-    {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"},
-    {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"},
-]
-
-[metadata]
-lock-version = "2.1"
-python-versions = ">=3.14"
-content-hash = "a17e7643ed4aefa81470391aa6cad48a796709c4f4bc8d4f3c99db84a3c428dd"

+ 0 - 25
pyproject.toml

@@ -1,25 +0,0 @@
-[project]
-name = "prolet"
-version = "0.1.0"
-description = ""
-authors = [
-    {name = "SVI",email = "prospero.78.su@gmail.com"}
-]
-readme = "README.md"
-requires-python = ">=3.14"
-dependencies = [
-]
-
-
-[build-system]
-requires = ["poetry-core>=2.0.0,<3.0.0"]
-build-backend = "poetry.core.masonry.api"
-
-[dependency-groups]
-dev = [
-    "mypy (>=1.19.0,<2.0.0)",
-    "pylint (>=4.0.4,<5.0.0)",
-    "black (>=25.11.0,<26.0.0)",
-    "bandit (>=1.9.2,<2.0.0)",
-    "pylama (>=8.4.1,<9.0.0)"
-]