Compare commits

..

1 Commits

Author SHA1 Message Date
3b0a993c12 commit project 2024-10-21 23:12:37 +03:00
72 changed files with 538 additions and 5384 deletions

10
.env
View File

@ -1,10 +0,0 @@
DATABASE=SuperService
POSTGRES_USER=UserSuperService
POSTGRES_PASSWORD=NotWarningWord1
CLICKHOUSE_USER=UserMyHouse
CLICKHOUSE_PASSWORD=NotWarningWord2
DB_USER=postgres
DB_PASSWORD=password
DB_HOST=localhost
DB_PORT=5432
DB_NAME=test

165
.gitignore vendored
View File

@ -1,3 +1,164 @@
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
.pybuilder/
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
# For a library or package, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# .python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock
# poetry
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
# This is especially recommended for binary packages to ensure reproducibility, and is more
# commonly ignored for libraries.
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
#poetry.lock
# pdm
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
#pdm.lock
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
# in version control.
# https://pdm.fming.dev/latest/usage/project/#working-with-version-control
.pdm.toml
.pdm-python
.pdm-build/
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
.idea
__pycache__
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# pytype static type analyzer
.pytype/
# Cython debug symbols
cython_debug/
# PyCharm
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
.idea/
credentials.json

View File

@ -1,12 +0,0 @@
FROM python:3.12
WORKDIR /app
COPY requirements.txt requirements.txt
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
COPY . .
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]

View File

@ -1,91 +1,6 @@
# Описание проекта
# Запуск
Доработка автоматизированной системы планирования и выполнения численного моделирования процессов сжигания топлив в горелочных устройствах энергоустановок предназначена для оптимизации процессов проведения численных экспериментов с цифровой моделью горелочного устройства с целью поиска наиболее экономичных и низко-эмиссионных режимов работы
# Участники
1. Кашин Максим
2. Клюшенкова Ксения
3. Базунов Андрей
4. Жимолостнова Анна
5. Цуканова Ирина
# Запуск проекта
## 1. Создание окружения
```
py -m venv .venv
```
## 2. Переход в окружение
```
.\.venv\Scripts\activate
```
## 3. Скачивание библиотек
```
pip install -r .\requirements.txt
```
## 4. Создаем .env
Необходимо создать файл и поместить в него необходимые параметры.
```
DATABASE=SuperService
POSTGRES_USER=UserSuperService
POSTGRES_PASSWORD=NotWarningWord1
CLICKHOUSE_USER=UserMyHouse
CLICKHOUSE_PASSWORD=NotWarningWord2
```
## 5. Запускаем все контейнеры
```
docker-compose up --build
```
При необходимости можем закрыть контейнера
```
docker-compose down
```
## 6. Запускаем проект
```
python runner.py
```
## 7. Подключение к ClickHouse
Команда входа в ClickHouse
```
docker exec -it clickhouse-db clickhouse-client -u UserMyHouse --password NotWarningWord2 --host localhost
```
Использовать базу данных
```
USE SuperService;
```
## 8. Подключение к PostgreSQL
Команда входа в ClickHouse
```
docker exec -it postgres-db psql -U UserSuperService -d SuperService
```
## 9. Миграция alembic
```
alembic revision --autogenerate
```
```
alembic upgrade head
```
# Инициализация БД
## 1. Запустить docker-compose
```
docker-compose up --build
```
## 2. Зайти в ClickHouse
```
docker exec -it clickhouse-db clickhouse-client -u UserMyHouse --password NotWarningWord2 --host localhost
```
## 3. Создать базу данных
```
CREATE DATABASE SuperService;
```
## 4. Инициализировать БД
Зайти на fastapi и выполнить запрос:
```
http://localhost:8000/init_db_data
```
PostgreSQL и ClickHouse будут заполнены данными.
1. Создание venv
2. Активация виртуальной среды
3. Установка зависимостей из requirements.txt
4. Запуск с помощью uvicorn app.main:app --host 127.0.0.1 --port 8000

View File

@ -1,117 +0,0 @@
# A generic, single database configuration.
[alembic]
# path to migration scripts
# Use forward slashes (/) also on windows to provide an os agnostic path
script_location = db/migrations
# template used to generate migration file names; The default value is %%(rev)s_%%(slug)s
# Uncomment the line below if you want the files to be prepended with date and time
# see https://alembic.sqlalchemy.org/en/latest/tutorial.html#editing-the-ini-file
# for all available tokens
# file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d-%%(rev)s_%%(slug)s
# sys.path path, will be prepended to sys.path if present.
# defaults to the current working directory.
prepend_sys_path = . db
# timezone to use when rendering the date within the migration file
# as well as the filename.
# If specified, requires the python>=3.9 or backports.zoneinfo library.
# Any required deps can installed by adding `alembic[tz]` to the pip requirements
# string value is passed to ZoneInfo()
# leave blank for localtime
# timezone =
# max length of characters to apply to the "slug" field
# truncate_slug_length = 40
# set to 'true' to run the environment during
# the 'revision' command, regardless of autogenerate
# revision_environment = false
# set to 'true' to allow .pyc and .pyo files without
# a source .py file to be detected as revisions in the
# versions/ directory
# sourceless = false
# version location specification; This defaults
# to db/migrations/versions. When using multiple version
# directories, initial revisions must be specified with --version-path.
# The path separator used here should be the separator specified by "version_path_separator" below.
# version_locations = %(here)s/bar:%(here)s/bat:db/migrations/versions
# version path separator; As mentioned above, this is the character used to split
# version_locations. The default within new alembic.ini files is "os", which uses os.pathsep.
# If this key is omitted entirely, it falls back to the legacy behavior of splitting on spaces and/or commas.
# Valid values for version_path_separator are:
#
# version_path_separator = :
# version_path_separator = ;
# version_path_separator = space
# version_path_separator = newline
version_path_separator = os # Use os.pathsep. Default configuration used for new projects.
# set to 'true' to search source files recursively
# in each "version_locations" directory
# new in Alembic version 1.10
# recursive_version_locations = false
# the output encoding used when revision files
# are written from script.py.mako
# output_encoding = utf-8
sqlalchemy.url = driver://user:pass@localhost/dbname
[post_write_hooks]
# post_write_hooks defines scripts or Python functions that are run
# on newly generated revision scripts. See the documentation for further
# detail and examples
# format using "black" - use the console_scripts runner, against the "black" entrypoint
# hooks = black
# black.type = console_scripts
# black.entrypoint = black
# black.options = -l 79 REVISION_SCRIPT_FILENAME
# lint with attempts to fix using "ruff" - use the exec runner, execute a binary
# hooks = ruff
# ruff.type = exec
# ruff.executable = %(here)s/.venv/bin/ruff
# ruff.options = --fix REVISION_SCRIPT_FILENAME
# Logging configuration
[loggers]
keys = root,sqlalchemy,alembic
[handlers]
keys = console
[formatters]
keys = generic
[logger_root]
level = WARN
handlers = console
qualname =
[logger_sqlalchemy]
level = WARN
handlers =
qualname = sqlalchemy.engine
[logger_alembic]
level = INFO
handlers =
qualname = alembic
[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = generic
[formatter_generic]
format = %(levelname)-5.5s [%(name)s] %(message)s
datefmt = %H:%M:%S

67
app/api/endpoints.py Normal file
View File

@ -0,0 +1,67 @@
from fastapi import APIRouter, HTTPException, BackgroundTasks
from fastapi.responses import FileResponse
from pydantic import BaseModel
from app.services.geom_service import create_geometry
from app.services.hash_generator import generate_hash
from app.services.minio_service import check_file_exists_minio, upload_to_minio, get_file_from_minio
from app.db.utils import save_params_to_db
from app.core.constants import MINIO_BUCKET_NAME, DEFAULT_VALUES
from app.core.config import settings
from .utils import remove_file
import os
router = APIRouter()
class GeomParams(BaseModel):
N1: float = DEFAULT_VALUES["N1"]
L1: float = DEFAULT_VALUES["L1"]
a1: float = DEFAULT_VALUES["a1"]
N2: float = DEFAULT_VALUES["N2"]
L2: float = DEFAULT_VALUES["L2"]
N3: float = DEFAULT_VALUES["N3"]
L3: float = DEFAULT_VALUES["L3"]
async def generate_geom(params: GeomParams):
params_dict = params.model_dump()
file_id = generate_hash(params_dict)
file_name = file_id + ".stp"
if check_file_exists_minio(MINIO_BUCKET_NAME, file_name):
print(f"Файл {file_name} уже существует в MinIO. Возвращаем его.")
temp_path = os.path.join(settings.current_directory, "tmp/")
if not os.path.exists(temp_path):
os.makedirs(temp_path)
temp_file_path = os.path.join(temp_path, file_name)
get_file_from_minio(MINIO_BUCKET_NAME, file_name, temp_file_path)
return temp_file_path
file_path = create_geometry(params_dict, file_name)
upload_to_minio(MINIO_BUCKET_NAME, file_path, file_name)
save_params_to_db(params_dict, file_name)
return file_path
@router.post("/generate_geom")
async def generate_geom_endpoint(params: GeomParams, background_tasks: BackgroundTasks):
file_path = await generate_geom(params)
background_tasks.add_task(remove_file, file_path)
return FileResponse(file_path, media_type='application/octet-stream', filename=os.path.basename(file_path))
@router.get("/check_geom/{file_name}")
async def check_geom(file_name: str):
if check_file_exists_minio(MINIO_BUCKET_NAME, file_name):
return {"status": "exists"}
return {"status": "not found"}
@router.post("/get_file_name")
async def check_geom(params: GeomParams):
params_dict = params.model_dump()
file_id = generate_hash(params_dict)
file_name = file_id + ".stp"
return {"file_name": file_name}

6
app/api/utils.py Normal file
View File

@ -0,0 +1,6 @@
import os
def remove_file(file_path: str):
if os.path.exists(file_path):
os.remove(file_path)

0
app/core/__init__.py Normal file
View File

17
app/core/config.py Normal file
View File

@ -0,0 +1,17 @@
import os
from pydantic_settings import BaseSettings, SettingsConfigDict
class Settings(BaseSettings):
POSTGRES_USER: str
POSTGRES_PASSWORD: str
DATABASE_URL: str
MINIO_ROOT_USER: str
MINIO_ROOT_PASSWORD: str
current_directory: str = os.getcwd()
print(current_directory)
model_config = SettingsConfigDict(env_file=".env")
settings = Settings()

11
app/core/constants.py Normal file
View File

@ -0,0 +1,11 @@
DEFAULT_VALUES = {
"N1": 24.0,
"L1": 70.0,
"a1": 60.0,
"N2": 18.0,
"L2": 105.0,
"N3": 9.0,
"L3": 29.6
}
MINIO_BUCKET_NAME = "geom-bucket"

0
app/db/__init__.py Normal file
View File

29
app/db/connection.py Normal file
View File

@ -0,0 +1,29 @@
from psycopg_pool import ConnectionPool
from contextlib import contextmanager
from app.core.config import settings
connection_pool = ConnectionPool(settings.DATABASE_URL)
@contextmanager
def get_db_connection():
conn = connection_pool.getconn()
try:
yield conn
finally:
connection_pool.putconn(conn)
@contextmanager
def get_db_cursor(commit=False):
with get_db_connection() as conn:
cursor = conn.cursor()
try:
yield cursor
if commit:
conn.commit()
except Exception as e:
conn.rollback()
raise e
finally:
cursor.close()

39
app/db/utils.py Normal file
View File

@ -0,0 +1,39 @@
from .connection import get_db_cursor
def initialize_database():
with get_db_cursor(commit=True) as cursor:
cursor.execute("""
CREATE TABLE IF NOT EXISTS geom_params (
id SERIAL PRIMARY KEY,
count_blades_in_outer_contour int,
width_blades_in_outer_contour numeric(5,2),
angle_blades_in_outer_contour numeric(5,2),
count_blades_in_middle_contour int,
width_blades_in_middle_contour numeric(5,2),
count_blades_in_fuel_contour int,
width_blades_in_fuel_contour numeric(5,2),
file_name varchar(105)
);
""")
def save_params_to_db(params, file_name):
with get_db_cursor(commit=True) as cur:
cur.execute("SELECT 1 FROM geom_params WHERE file_name = %s", (file_name,))
if not cur.fetchone():
cur.execute("""
INSERT INTO geom_params (count_blades_in_outer_contour, width_blades_in_outer_contour,
angle_blades_in_outer_contour, count_blades_in_middle_contour,
width_blades_in_middle_contour, count_blades_in_fuel_contour, width_blades_in_fuel_contour, file_name)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s)
""", (
params.get('N1'),
params.get('L1'),
params.get('a1'),
params.get('N2'),
params.get('L2'),
params.get('N3'),
params.get('L3'),
file_name
))

23
app/main.py Normal file
View File

@ -0,0 +1,23 @@
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from .db.utils import initialize_database
from .api.endpoints import router as geom_router
app = FastAPI()
origins = [
"http://localhost:8000",
"http://localhost:3000",
]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
initialize_database()
app.include_router(geom_router, prefix="/api/v1")

0
app/services/__init__.py Normal file
View File

View File

@ -0,0 +1,92 @@
from typing import Optional, Dict, Any
import os
from win32com.client import gencache
from win32com.client import Dispatch
import pythoncom
from app.core.config import settings
def create_geometry(params: Dict[str, Any], file_name: str):
pythoncom.CoInitializeEx(0)
geom_path = os.path.join(settings.current_directory, "model_3d/Поток.m3d")
# Проверяем на корректность ключи в запросе
valid_keys = {'N1', 'L1', 'a1', 'N2', 'L2', 'N3', 'L3'}
list_collms = []
values = []
for key in params:
if key not in valid_keys and key not in {"plan_title"}:
raise ValueError(f"Invalid parameter: {key}")
if key in valid_keys:
list_collms.append(key)
values.append(params[key])
# Генерация уникального имени файла на основе параметров
# file_name = generate_file_name(params)
def get_kompas_api7():
module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
api = module.IKompasAPIObject(
Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(module.IKompasAPIObject.CLSID,
pythoncom.IID_IDispatch))
const = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants
return module, api, const
module7, api7, const7 = get_kompas_api7() # Подключаемся к API7
app7 = api7.Application # Получаем основной интерфейс
app7.Visible = True # Показываем окно пользователю (если скрыто)
app7.HideMessage = const7.ksHideMessageNo # Отвечаем НЕТ на любые вопросы программы
print(app7.ApplicationName(FullName=True)) # Печатаем название программы
doc7 = app7.Documents.Open(PathName=geom_path,
Visible=True,
ReadOnly=True)
kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants
kompas6_constants_3d = gencache.EnsureModule("{2CAF168C-7961-4B90-9DA2-701419BEEFE3}", 0, 1, 0).constants
# Подключим описание интерфейсов API5
kompas6_api5_module = gencache.EnsureModule("{0422828C-F174-495E-AC5D-D31014DBBE87}", 0, 1, 0)
kompas_object = kompas6_api5_module.KompasObject(
Dispatch("Kompas.Application.5")._oleobj_.QueryInterface(kompas6_api5_module.KompasObject.CLSID,
pythoncom.IID_IDispatch))
# Подключим описание интерфейсов API7
kompas_api7_module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
application = kompas_api7_module.IApplication(
Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kompas_api7_module.IApplication.CLSID,
pythoncom.IID_IDispatch))
Documents = application.Documents
# Получим активный документ
kompas_document = application.ActiveDocument
kompas_document_3d = kompas_api7_module.IKompasDocument3D(kompas_document)
iDocument3D = kompas_object.ActiveDocument3D()
kPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)
varcoll = kPart.VariableCollection()
varcoll.refresh()
for i in range(len(values)):
Variable = varcoll.GetByName(list_collms[i], True, True)
Variable.value = values[i]
kPart.RebuildModel()
# Перерисовываем документ
iDocument3D.RebuildDocument()
generated_files_path = os.path.join(settings.current_directory, "generated_files/")
if not os.path.exists(generated_files_path):
os.makedirs(generated_files_path)
save_path = os.path.join(generated_files_path, file_name)
kompas_document.SaveAs(save_path)
kompas_document.Close(True)
return save_path

View File

@ -0,0 +1,8 @@
import hashlib
import json
def generate_hash(params):
params_string = json.dumps(params, sort_keys=True)
unique_hash = hashlib.md5(params_string.encode()).hexdigest()
return unique_hash

View File

@ -0,0 +1,50 @@
from minio import Minio
from minio.error import S3Error
import json
with open('credentials.json', 'r', encoding='utf-8') as file:
data = json.load(file)
minio_client = Minio(
"127.0.0.1:9000",
access_key=data['accessKey'],
secret_key=data['secretKey'],
secure=False
)
def upload_to_minio(bucket_name, file_path, object_name):
try:
if not minio_client.bucket_exists(bucket_name):
minio_client.make_bucket(bucket_name)
minio_client.fput_object(bucket_name, object_name, file_path)
print(f"'{file_path}' is successfully uploaded as '{object_name}' to bucket '{bucket_name}'.")
except S3Error as e:
print("S3 Error:", e)
except Exception as e:
print("Error:", e)
def check_file_exists_minio(bucket_name, object_name):
try:
minio_client.stat_object(bucket_name, object_name)
return True
except S3Error as e:
print("S3 Error:", e)
return False
except Exception as e:
print("Error:", e)
return False
def get_file_from_minio(bucket_name, object_name, file_path):
try:
minio_client.fget_object(bucket_name, object_name, file_path)
print(f"'{object_name}' is successfully downloaded to '{file_path}'.")
return file_path
except S3Error as e:
print("S3 Error:", e)
raise
except Exception as e:
print("Error:", e)
raise

View File

@ -1,109 +0,0 @@
import time
import pandas as pd
import clickhouse_connect
class ClickHouseClient:
def __init__(self, host='localhost', port=9000, database="default", username="", password=""):
self.host = host
self.port = port
self.database = database
self.username = username
self.password = password
self.client = self.connect_clickhouse()
self.initialize_table()
def connect_clickhouse(self):
"""
Создает подключение к базе данных ClickHouse.
"""
return clickhouse_connect.get_client(host=self.host, port=self.port, database=self.database, username=self.username, password=self.password)
def initialize_table(self):
"""
Инициализирует таблицу в ClickHouse, если она не существует.
"""
create_table_query = """
CREATE TABLE IF NOT EXISTS experiment_data (
volume Float64,
nitrogen_oxide_emission Float64,
temperature Float64,
co_fraction Float64,
co2_fraction Float64,
x Float64,
y Float64,
z Float64,
file_id String
) ENGINE = MergeTree()
ORDER BY file_id
"""
self.client.command(create_table_query)
def get_data(self):
"""
Извлекает максимальные и взвешенные средние значения из ClickHouse, включая разницу max(x) - min(x) при температуре > 1150.
:return: DataFrame с данными из ClickHouse.
"""
query = """
SELECT
file_id,
MAX(temperature) AS max_temperature,
MAX(nitrogen_oxide_emission) AS max_nox,
MAX(co_fraction) AS max_co,
MAX(co2_fraction) AS max_co2,
SUM(volume * temperature) / SUM(volume) AS weighted_avg_temperature,
SUM(volume * nitrogen_oxide_emission) / SUM(volume) AS weighted_avg_nox,
SUM(volume * co_fraction) / SUM(volume) AS weighted_avg_co,
SUM(volume * co2_fraction) / SUM(volume) AS weighted_avg_co2,
MAX(if(temperature > 1150, x, NULL)) - MIN(if(temperature > 1150, x, NULL)) AS x_range_high_temp,
MAX(if(temperature > 1150, y, NULL)) - MIN(if(temperature > 1150, y, NULL)) AS y_range_high_temp,
MAX(if(temperature > 1150, z, NULL)) - MIN(if(temperature > 1150, z, NULL)) AS z_range_high_temp,
SUM(if(temperature > 1150, volume, NULL)) AS flame_volume
FROM
experiment_data
GROUP BY
file_id
"""
results = self.client.query(query)
columns = ["file_id", "max_temperature", "max_nox", "max_co", "max_co2",
"weighted_avg_temperature", "weighted_avg_nox", "weighted_avg_co", "weighted_avg_co2",
"x_range_high_temp", "y_range_high_temp", "z_range_high_temp", "flame_volume"]
return pd.DataFrame(results.result_rows, columns=columns)
def save_csv_to_clickhouse(self, csv_path, file_id):
"""
Загружает данные из CSV файла в ClickHouse.
:param csv_path: Путь к CSV файлу.
:param file_id: Идентификатор файла.
"""
# Чтение данных из CSV
df = pd.read_csv(csv_path, delimiter=';', decimal='.')
# Переименовать колонки
rename_dict = {
"Volume (m^3)": "volume",
"Mass Fraction of Nitrogen Oxide Emission": "nitrogen_oxide_emission",
"Temperature (K)": "temperature",
"Mass Fraction of CO": "co_fraction",
"Mass Fraction of CO2": "co2_fraction",
"X (m)": "x",
"Y (m)": "y",
"Z (m)": "z"
}
df.rename(columns=rename_dict, inplace=True)
df['x'] = abs(df['x'])
df['x'] = df['x'] - df['x'].min()
df['y'] = df['y'] - df['y'].min()
df['z'] = df['z'] - df['z'].min()
# Добавление столбца идентификатора файла
df["file_id"] = file_id
# Удаление существующих записей для данного файла
delete_query = "ALTER TABLE experiment_data DELETE WHERE file_id = %(file_id)s"
self.client.command(delete_query, parameters={'file_id': file_id})
# Вставка данных в ClickHouse
self.client.insert_df('experiment_data', df)

View File

@ -1,26 +0,0 @@
paths:
starccm: 'C:/Program Files/Siemens/19.04.007-R8/STAR-CCM+19.04.007-R8/star/bin/starccm+'
chemkin: '/media/user/Projects/burner_data/chemkin'
main: '/media/user/Data/experiment_data'
parameters:
number_processes: 16
mesh_base_size: 0.7
stopping_criterion: 7000
diameters:
d1: 1442
d2: 1016
d3: 640
d4: 325
d5: 325
d6: 245
default_values:
N1: 24
L1: 70.0
a1: 60.0
N2: 18
L2: 105.0
N3: 9
L3: 29.6
api_url: "http://10.6.23.120:8000/api/v1/generate_geom"

View File

@ -1,57 +0,0 @@
import matplotlib.pyplot as mp
import pandas as pd
import seaborn as sb
from settings import settings
from clickhouse_tools import ClickHouseClient
from postgres_tools import PostgresClient
class DataPreparer:
def __init__(self, clickhouse_host='localhost', postgres_host='localhost', postgres_db='your_db',
postgres_user='your_user', postgres_password='your_password'):
self.clickhouse_client = ClickHouseClient("localhost", 8123, database=settings.DATABASE, username=settings.CLICKHOUSE_USER, password=settings.CLICKHOUSE_PASSWORD)
self.postgres_client = PostgresClient(
dbname=settings.DATABASE,
user=settings.POSTGRES_USER,
password=settings.POSTGRES_PASSWORD,
host="localhost",
port="5432"
)
def prepare_ml_dataset(self):
"""
Подготавливает набор данных для машинного обучения, объединяя данные из ClickHouse и PostgreSQL.
:return: DataFrame с подготовленными данными.
"""
# clickhouse_data = self.clickhouse_client.get_data()
postgres_data = self.postgres_client.get_experiments()
result_data = self.postgres_client.get_data()
# Объединение данных по file_id
ml_dataset = pd.merge(postgres_data, result_data, on='file_id')
self.postgres_client.close()
return ml_dataset
data_preparer = DataPreparer()
# Подготовка набора данных для машинного обучения
ml_dataset = data_preparer.prepare_ml_dataset()
ml_dataset = ml_dataset.drop('file_id', axis=1)
ml_dataset.to_csv('burner_data_pg_2.csv', index=False)
# Находим колонки с одним уникальным значением
cols_to_drop = ml_dataset.columns[ml_dataset.nunique() == 1]
# Удаляем эти колонки
ml_dataset = ml_dataset.drop(columns=cols_to_drop)
fig, ax = mp.subplots(figsize=(40, 40))
dataplot = sb.heatmap(ml_dataset.corr(), cmap="YlGnBu", annot=True)
# displaying heatmap
mp.show()

View File

@ -1,7 +0,0 @@
from clickhouse_sqlalchemy import make_session, get_declarative_base, engines
from sqlalchemy import create_engine
from settings import settings
engine_clickhouse = create_engine(settings.clickhouse_url)
BaseClickhouse = get_declarative_base()
session_clickhouse = make_session(engine_clickhouse)

View File

@ -1,69 +0,0 @@
from typing import Type, TypeVar, Sequence, Optional, Dict, Any
from sqlalchemy import update as update_, delete as delete_
from sqlalchemy.future import select
from db.models import ExperimentCategory, ExperimentData, ExperimentParameters, LoadParameters, RecyclingParameters
from db.postgres_db_connection import async_session_postgres
T = TypeVar("T", ExperimentCategory, ExperimentData, ExperimentParameters, LoadParameters, RecyclingParameters)
async def get_all(model_class: Type[T]) -> Sequence[T]:
async with async_session_postgres() as session:
result = await session.execute(select(model_class))
return result.scalars().all()
async def get_by_id(model_class: Type[T], id: int) -> Optional[T]:
async with async_session_postgres() as session:
result = await session.execute(select(model_class).where(model_class.id == id))
return result.scalar_one_or_none()
async def create(model_class: Type[T], **kwargs) -> T:
async with async_session_postgres() as session:
new_instance = model_class(**kwargs)
session.add(new_instance)
await session.commit()
await session.refresh(new_instance)
return new_instance
async def update(model_class: Type[T], id: int, updated_data: Dict[str, Any]) -> Optional[T]:
async with async_session_postgres() as session:
stmt = (
update_(model_class)
.where(model_class.id == id)
.values(**updated_data)
.execution_options(synchronize_session="fetch")
)
await session.execute(stmt)
await session.commit()
return await get_by_id(model_class, id)
# Надо переписать/раасмотреть update
async def update_exp(model_class: Type[T], id: int, updated_data: Dict[str, Any]) -> Optional[T]:
async with async_session_postgres() as session:
async with session.begin(): # Явная транзакция
stmt = (
update_(model_class)
.where(model_class.id == id)
.values(**updated_data)
.returning(model_class) # Возвращаем обновленный объект
)
result = await session.execute(stmt)
updated_instance = result.scalars().first()
if not updated_instance:
return None
return updated_instance # Возвращаем сразу обновленный объект
async def delete(model_class: Type[T], id: int) -> bool:
async with async_session_postgres() as session:
stmt = delete_(model_class).where(model_class.id == id)
result = await session.execute(stmt)
await session.commit()
return result.rowcount > 0

View File

@ -1,60 +0,0 @@
import asyncio
import pandas as pd
from sqlalchemy import insert, text
from sqlalchemy.exc import OperationalError, IntegrityError
from db.clickhouse_db_connection import BaseClickhouse, engine_clickhouse, session_clickhouse
from db.postgres_db_connection import async_session_postgres, engine_postgres
from db.models.base import Base
from db.models.ch_experimentdb_experiment_data_model import ChExperimentDBExperimentData
from db.models.experiment_data_model import ExperimentData
from db.models.experiment_parameters_model import ExperimentParameters
from db.models.load_parameters_model import LoadParameters
from db.models.recycling_parameters_model import RecyclingParameters
async def create_all_tables():
async with engine_postgres.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
BaseClickhouse.metadata.create_all(engine_clickhouse)
async def load_data_to_postgres(file: str, model_class, chunk_size=100):
df = pd.read_csv(file).dropna()
async with async_session_postgres() as session:
for start in range(0, len(df), chunk_size):
end = start + chunk_size
chunk = df.iloc[start:end].to_dict(orient='records')
stmt = insert(model_class).values(chunk)
try:
await session.execute(stmt)
await session.commit()
except IntegrityError as e:
await session.rollback()
def load_data_to_clickhouse(file: str, model_class, chunk_size=100):
df = pd.read_csv(file).dropna()
with session_clickhouse as session:
for start in range(0, len(df), chunk_size):
end = start + chunk_size
chunk = df.iloc[start:end].to_dict(orient='records')
stmt = insert(model_class).values(chunk)
session.execute(stmt)
session.commit()
async def csv_to_db():
await create_all_tables()
await load_data_to_postgres('./db/files/load_parameters.csv', LoadParameters)
await load_data_to_postgres('./db/files/recycling_parameters.csv', RecyclingParameters)
await load_data_to_postgres('./db/files/experiment_parameters.csv', ExperimentParameters)
await load_data_to_postgres('./db/files/experiment_data.csv', ExperimentData)
load_data_to_clickhouse('./db/files/ch_experimentdb_experiment_data.csv', ChExperimentDBExperimentData)
print('csv_to_db выполнено')

View File

@ -1,11 +0,0 @@
id,volume,nitrogen_oxide_emission,temperature,co_fraction,co2_fraction,x,y,z,file_id
1,1.25018009e-07,2.923801e-10,1546.8502257117334,0.0876590170721079,0.0825937575747152,0.0002862908352005,4.250519128266181,4.23689607830385,10bf3b81cf73056684c0041f6adc5a35881bbeca2ba0e8bbc7d827c3ba058a3d
2,1.26276707e-07,2.774402e-10,1546.5278876054947,0.0876535741398523,0.0826072611209551,0.0002970890883859,4.2633663477653,4.2118739518585935,10bf3b81cf73056684c0041f6adc5a35881bbeca2ba0e8bbc7d827c3ba058a3d
3,5.215560244e-07,2.800989e-10,1547.007375203737,0.087598352075182,0.0826205755990879,0.0023288861534884,4.258002712932174,4.224854019469968,10bf3b81cf73056684c0041f6adc5a35881bbeca2ba0e8bbc7d827c3ba058a3d
4,1.259521373e-07,2.756836e-10,1544.7738826604286,0.0879623682225424,0.0825022367344128,0.0003061405654724,4.294951651093852,4.228359039356472,10bf3b81cf73056684c0041f6adc5a35881bbeca2ba0e8bbc7d827c3ba058a3d
5,6.71204778e-08,2.747822e-10,1543.303419205242,0.0881230454580786,0.0824746033833566,0.0004276277312526,4.301939013567143,4.203422399444153,10bf3b81cf73056684c0041f6adc5a35881bbeca2ba0e8bbc7d827c3ba058a3d
6,3.982683542e-07,2.728959e-10,1544.1211163717342,0.0880178768655007,0.0824974031307205,0.0025840772927808,4.2895374677272695,4.241641279196477,10bf3b81cf73056684c0041f6adc5a35881bbeca2ba0e8bbc7d827c3ba058a3d
7,1.314501491e-07,2.729991e-10,1543.9585181296568,0.0881077612277477,0.0824593957518346,0.0003192230503286,4.282153424064967,4.253165462380294,10bf3b81cf73056684c0041f6adc5a35881bbeca2ba0e8bbc7d827c3ba058a3d
8,1.2711512153e-06,2.799785e-10,1545.337937815918,0.0878016656787745,0.0825684205234254,0.0031927006255012,4.279075221963268,4.242926141081111,10bf3b81cf73056684c0041f6adc5a35881bbeca2ba0e8bbc7d827c3ba058a3d
9,5.002643798e-07,2.907778e-10,1546.1911065379516,0.0876446332442777,0.0826230869307894,0.0012912004540912,4.259093754350848,4.2392143443160855,10bf3b81cf73056684c0041f6adc5a35881bbeca2ba0e8bbc7d827c3ba058a3d
10,4.372515903e-07,2.852153e-10,1545.394093220484,0.0877377183636819,0.0826003036520615,0.0010234056556132,4.268539978944442,4.241752821543271,10bf3b81cf73056684c0041f6adc5a35881bbeca2ba0e8bbc7d827c3ba058a3d
1 id volume nitrogen_oxide_emission temperature co_fraction co2_fraction x y z file_id
2 1 1.25018009e-07 2.923801e-10 1546.8502257117334 0.0876590170721079 0.0825937575747152 0.0002862908352005 4.250519128266181 4.23689607830385 10bf3b81cf73056684c0041f6adc5a35881bbeca2ba0e8bbc7d827c3ba058a3d
3 2 1.26276707e-07 2.774402e-10 1546.5278876054947 0.0876535741398523 0.0826072611209551 0.0002970890883859 4.2633663477653 4.2118739518585935 10bf3b81cf73056684c0041f6adc5a35881bbeca2ba0e8bbc7d827c3ba058a3d
4 3 5.215560244e-07 2.800989e-10 1547.007375203737 0.087598352075182 0.0826205755990879 0.0023288861534884 4.258002712932174 4.224854019469968 10bf3b81cf73056684c0041f6adc5a35881bbeca2ba0e8bbc7d827c3ba058a3d
5 4 1.259521373e-07 2.756836e-10 1544.7738826604286 0.0879623682225424 0.0825022367344128 0.0003061405654724 4.294951651093852 4.228359039356472 10bf3b81cf73056684c0041f6adc5a35881bbeca2ba0e8bbc7d827c3ba058a3d
6 5 6.71204778e-08 2.747822e-10 1543.303419205242 0.0881230454580786 0.0824746033833566 0.0004276277312526 4.301939013567143 4.203422399444153 10bf3b81cf73056684c0041f6adc5a35881bbeca2ba0e8bbc7d827c3ba058a3d
7 6 3.982683542e-07 2.728959e-10 1544.1211163717342 0.0880178768655007 0.0824974031307205 0.0025840772927808 4.2895374677272695 4.241641279196477 10bf3b81cf73056684c0041f6adc5a35881bbeca2ba0e8bbc7d827c3ba058a3d
8 7 1.314501491e-07 2.729991e-10 1543.9585181296568 0.0881077612277477 0.0824593957518346 0.0003192230503286 4.282153424064967 4.253165462380294 10bf3b81cf73056684c0041f6adc5a35881bbeca2ba0e8bbc7d827c3ba058a3d
9 8 1.2711512153e-06 2.799785e-10 1545.337937815918 0.0878016656787745 0.0825684205234254 0.0031927006255012 4.279075221963268 4.242926141081111 10bf3b81cf73056684c0041f6adc5a35881bbeca2ba0e8bbc7d827c3ba058a3d
10 9 5.002643798e-07 2.907778e-10 1546.1911065379516 0.0876446332442777 0.0826230869307894 0.0012912004540912 4.259093754350848 4.2392143443160855 10bf3b81cf73056684c0041f6adc5a35881bbeca2ba0e8bbc7d827c3ba058a3d
11 10 4.372515903e-07 2.852153e-10 1545.394093220484 0.0877377183636819 0.0826003036520615 0.0010234056556132 4.268539978944442 4.241752821543271 10bf3b81cf73056684c0041f6adc5a35881bbeca2ba0e8bbc7d827c3ba058a3d

View File

@ -1,868 +0,0 @@
id,outer_blades_count,outer_blades_length,outer_blades_angle,middle_blades_count,load_id,recycling_id,experiment_hash
1,24,70,30,18,1,1,f3440e566eedd3cb6bceaa2b8e16396456c2801120fabd283561b6ee2100b0b5
2,24,70,30,18,1,2,a47bd45c541df0f1ed9f853bf21ad4157a69aea5f3bd91925536af75a51aa3dc
3,24,70,30,18,1,3,ed1525ca364458eb337f71632366a4ba17528e3a966019f38e9c52be73f893aa
4,24,70,30,18,1,4,9d30eb894c46d1c09fb739530efd743debff8cc40ad9e31cfe7645bb163ef1e0
5,24,70,30,18,1,5,d3a0ddf904a96bdf79d5ba6c62bf7c0035e36c11dfce48bf9e6768f738e96893
6,24,70,30,18,1,6,2c11dd64bbc6b7b1d6dd4aabb7bc278ae39c10843fb9e45360ad4d56382600db
7,24,70,30,18,1,7,1b8eebbbf139120224cd35221a0c55fa85568e3e29ecc3967963ab8d243151ec
8,24,70,30,18,1,8,7b3c151a9712638709836f54ad10e671c98cd77d69a0ef7d3225427cc12568ea
9,24,70,30,18,2,9,d088c77f22a9d7598a5af46ef623e2611d1bab914c2ab4877f79175fb654d6aa
10,24,70,30,18,2,10,de5054f2198651c958a57a816eb85d5aa58cd061268a5195cae60e4a1c681e85
11,24,70,30,18,2,11,448581cea9fbb47236889fc7a5a18e175e4256e2cc8ebd7bb202c2463411280f
12,24,70,30,18,2,12,6cca36dc2f51aa1735a622404fd594a31609f337a26c0924c241793f84fe0ab3
13,24,70,30,18,2,13,3b446baa52e9268697b8acb2c005d7c0400d9d6a90e39f62944ba694910c45f5
14,24,70,30,18,2,14,cc93de3f50f3892f461424b7b11ea02527af20b70e707a5aae0aaab8f947f392
15,24,70,30,18,2,15,f46e555206f2ab5c308c467c8b2c0eb724f027f9b9b3d57da278a50483ffe2bb
16,24,70,30,18,2,16,7d327b5a4ca0d16d054c7775a2f6cd66e9f1714fd3a3be40437c02d077de5c67
17,24,70,30,18,3,17,51ab3b741aee17c59ef82c338d7fdde79697e6226cc3a7e4b3b40ec5dfcba647
18,24,70,30,18,3,18,fbcec5f6a53659317dbd8ec4047bb9215ed39b84001f7cda673becb37e74ba51
19,24,70,30,18,3,19,7bf6e8cd421222c7bc17c5e6ab43dcee4316e9b885903db1ca41741123009ff1
20,24,70,30,18,3,20,aad101f9418d0bb182d64da455caeec0bf410e65a3efdb44a025adc53f8ce216
21,24,70,30,18,3,21,c609ff027d988b6ea282e544d3191f4f9f47f912cc891b3d2ab32e6191d3e739
22,24,70,30,18,3,22,a460f48676a062c64103ff8cadd1faacf993f1253cdefe6c4b99a8505d09814a
23,24,70,30,18,3,23,c41ab44cb00cbe24ee9d9c29dfc847b7bf5954a136f07d95d5ef1c821b6e751c
24,24,70,30,18,3,24,3a56cfd1d1a3cd97d51bc489e63a1682e1495311900f3f9d337fe22c1a9884b5
25,24,70,30,18,4,25,c01ec654b3825e770fdfcded717e9d0862cd6d1d1303ffbf5a11974e5f583849
26,24,70,30,18,4,26,d6af15b0829a64320158a05684faeec8dbdb7599177ba0b95d2428f517025b19
27,24,70,30,18,4,27,58ff2e215f22abe9ca172b21db0f3ee3c89c8a77a5afa3c33cde6b1490d788ef
28,24,70,30,18,4,28,78b2430505297f9d16d1ee31b1781b3425f5ca8af81f758318f9bcc513b16056
29,24,70,30,18,4,29,3c9d9f05dc256a57766f7448bfbd1dc4090742092942a09c30a0cc4775901df8
30,24,70,30,18,4,30,78f91bf6c8e291f85582e96a5e0afcdd8b70c71d887cf7f45534268bfcbe065b
31,24,70,30,18,4,31,f2c809d7de702b3f76f22e87ce25687c75ba3239fff494b5f80d44397e0365fd
32,24,70,30,18,4,32,87b7070cb8e3c39cb1a00c132abef4ce1e5bdf082bb21715d3e5ea063d65cb6c
33,24,70,30,18,5,33,7e044e9dbaf5d043699ee22876ea8ae05659ec03b024a10849af140243726fbd
34,24,70,30,18,5,34,ebe73f29770dec56bb3ce6b2832e723d8a1f0ddf1f63698ccd057535bc2e7c8b
35,24,70,30,18,5,35,e673d4cc2675fda210549e533de77618a4a003c067bf0f2740d2fb35c320d1c1
36,24,70,30,18,5,36,f6373fe5dd40b33cf6f902705479e4e611e9e3f002e3d53b74d4467db6461603
37,24,70,30,18,5,37,f0dfcd828ab3edf2822d869f39fb24111eee5e8d54f5e67d6cf29d12d091a493
38,24,70,30,18,5,38,c7513526483d1f52282a177f5db8bce4223dbea44302e5b50cb00fd95436dc5e
39,24,70,30,18,5,39,937554b847c97b1545bd6169f594cb6a57cc3fbfe462fa976cf5b5c30cade75d
40,24,70,30,18,5,40,bbf8878c97bb3d1d55b85450c500416f5ff4254d098b6329966ccd1af6fec198
41,24,70,45,18,1,1,d93465f1368a0bc246d9ac814417d55eba2674dd96b6deee8b14f3496b44a5d4
42,24,70,45,18,1,2,63f441456c37857e11d9194e55ba304433365a38f9e2395e0f7826a8cb52979d
43,24,70,45,18,1,3,0b6f75922844a41b9e517dc675dc41bc592afccc7a9fb108b078011197058a0e
44,24,70,45,18,1,4,d231c7b7601c2fcde797acf2eed7ed6553a059e5bbf59cbe01d68f568f57ace8
45,24,70,45,18,1,5,019ec639ed4ac56a5d1017ba10914acc122da59ebaaf8f929dda7b351ff5224c
46,24,70,45,18,1,6,2d439156da14719d43e33ba034782fee7fb83033f1a4897f0b20788c5ebca65e
47,24,70,45,18,1,7,8f31f444564af0a7c70bcf2299fe80e9b9fa1a8f84edc4afbff81c0e4969fd6b
48,24,70,45,18,1,8,af2f9f938b771242ab4b0221a0d937e03ece383a2192d3036e05988fb2442245
49,24,70,45,18,2,9,26c261c66a5e93b4b88e93290324f5706ad2de59dd59e123c9db34d76494966f
50,24,70,45,18,2,10,f73948ca1404ac1ef598d32967ff590beac673c1f128633281e5f91d20439598
51,24,70,45,18,2,11,ea7ec1c838494ef086813bed27ae2c0c23f8875334392058cf1069615a333e42
52,24,70,45,18,2,12,4fa7e25f2c9c12088e4bb783ec7330a24744c9b83357256b2e21ce6bb6e139ca
53,24,70,45,18,2,13,a94578891fd1dd142acce45268da610890c2b148da88caae75c6033b655f93dd
54,24,70,45,18,2,14,cca92f84a1ccca51108ac4ceaa5acb74d993b17200a3ae4db3081d0025304969
55,24,70,45,18,2,15,8ce57236cacbca39e548e83ea1bcc342b62df29f3bde0caf2c0c2db1cd3b432d
56,24,70,45,18,2,16,8b647157123d4f7bcbcc625b054e3e4d83a0804e57731005a8dd903ef72ea936
57,24,70,45,18,3,17,7d660b53b68eeb2d66b78089f71c4ed2c872369a1593a7d284d4d0df3eace407
58,24,70,45,18,3,18,3b29424168040cbd1a2947c94a8e61be3776ed45bbc1112909a55cf5ebe1bbbe
59,24,70,45,18,3,19,788aaab9df7f831a3e6056bd7758a218ebdb923c0ebf5be142a47c59a494270a
60,24,70,45,18,3,20,a4bb724f51b10dcc325ec19cbe0b8c5b41c8b9b0eae296dc61c353314db1b36e
61,24,70,45,18,3,21,6cafc249aa6b9e95afb63f60afd62255f2c95a8445b0b9e57a39cb92ae348f31
62,24,70,45,18,3,22,24ae10d92145ca93e6acbe22bb510f22af67453bb371bf13f904cb9a2d06d4d2
63,24,70,45,18,3,23,0405c139bc6e1bc882c3767d7603d02803acda222870e38ddc94dcefeb76179e
64,24,70,45,18,3,24,fd604232c9eb21c707c1c0afe99e72f5f131537850c51bf2a6709705e82b284f
65,24,70,45,18,4,25,34c86de16b8c7a3002bba420710d099ddd31591f78f8783caae64129d5f1fa6d
66,24,70,45,18,4,26,3be010d0e6a1daabc7a5e21ca17fc68508665bb4b99ec16a4912f88f0c1bfee2
67,24,70,45,18,4,27,19058a20083e7652aceebe4079d7918e0afabcb2b634ea0956c5cd8006a12082
68,24,70,45,18,4,28,ffba62754ec42c376894013792d126e31c307cf52f5aec10a148c74becbfc692
69,24,70,45,18,4,29,0cc7665eb716cf2851156fa45bf1c241cfccd43b25d757d798140a75f40b2354
70,24,70,45,18,4,30,eb20ea5909a55f61b92ff4337727242240765993931d9175043cbac3dac6caa5
71,24,70,45,18,4,31,a4a3baccc35da76517d3a16d379ab8416dabcaed429a72ef26e9ebc757377867
72,24,70,45,18,4,32,550c05d891ee0a19a37a0a614cc9dbece86e922973965583d22ceacb846e1581
73,24,70,45,18,5,33,995a45405eedeb6e463642d6f723b6fdb35df6035e7198d787e5a14fca8b4a85
74,24,70,45,18,5,34,66c882d8ee6b3f9b1563ba3c18dce8e7592b3e548d9b0aa2b54f9cec6d487889
75,24,70,45,18,5,35,a1856cfffa7b32a6c553a548f6cb52187fa9789f414a3a29712735965fcab90d
76,24,70,45,18,5,36,c504f3e398c0850397f0fea4bdf2df3eec3c5cf8a9200d164f34b2c92d59be9a
77,24,70,45,18,5,37,2f9ccc8409dbdcd01f9c1853b713c48e3f31b5ea0ede68cc956abd2529ed9bf5
78,24,70,45,18,5,38,9dfdcb6d0d69d6f54da0170c0b5bbb6c382ccfaa94c803ec093a01db452c2f24
79,24,70,45,18,5,39,09682926ea871314009a2e8340c4e0597573ec925c8d5666f7deb0c97c649fbf
80,24,70,45,18,5,40,97018fa18631ed88974f799858c3e9731aefd3d308f693e0d9e095d9ed6b5cff
81,24,70,60,18,1,1,b54c62da0bfea8f337d0c380d534bf98b25c1be9f014db4b8c2e4b455e85279b
82,24,70,60,18,1,2,cffbb4238b69f5b51d93fda58847314f90277073caba72eac0969368d2bf72af
83,24,70,60,18,1,3,2ba7288af1d84d07e239dd78baa790b6ada943681bbdfdc27e7f489da8046e8b
84,24,70,60,18,1,4,afa966ce1f0dcfaa6282a049c0c30febc999f856885199056dc570b97b6adff9
85,24,70,60,18,1,5,8f8df0abd28895a93112a57c4d4b32be7eb9c9d7f9ac40f016603173185a78e1
86,24,70,60,18,1,6,1e5b48a6d463e88f4bf49c29dca892d77b2a16a9cffb3cb4fab341f5645cdb77
87,24,70,60,18,1,7,879e6b65a692343e84e8e02e92a49d63053180a22f4b42676e2f29bbf581bd6a
88,24,70,60,18,1,8,0f76f567f474e5b41351eb42f0c6dae27240f7c69a65e0a02fd631ae7a30b088
89,24,70,60,18,2,9,5c68cce55587a05f51a597e0e2c57971e111e412e66b29d933cddddc892ba911
90,24,70,60,18,2,10,307e271391f0090938521a4ed707064dad973cb360497602b23dc69bd13daae6
91,24,70,60,18,2,11,bddfe29d9e272a9990190682aee23bb57da690ce391cf9dab1ba4f1e80e3e932
92,24,70,60,18,2,12,efcd861cc0eea9334341de08ef26a690c961fd7f37d37b96e9d3a8496a7b96de
93,24,70,60,18,2,13,32a460c67c2a9442b1b103523ca6a116d7ae2de8c2245f4cf51b2d666ceb2dad
94,24,70,60,18,2,14,8eac61db97a0cf8c060e9d4c235ca2fafe8fa85129837c74417429d781f4d8b6
95,24,70,60,18,2,15,73d6e002b5cbdb9888f5dfe4530371d1efba05da843b47343ec6a24d358f970e
96,24,70,60,18,2,16,0064dd418bb85442ca1641bd7d4659bd2a1c472123a30072b6a2e4280083ea85
97,24,70,60,18,3,17,75fb2ad1605612509d86e932eaa930221d6b26dff9646e6680524d88e65b3dd3
98,24,70,60,18,3,18,b701734dd3e549ceb97d8a82682b2728814b92e08fbeb949bbf67e7a79f1365c
99,24,70,60,18,3,19,d327280a452af12ee949f54a09cc47f3fc855bbd4b559a021c5632ce1bf7f9e6
100,24,70,60,18,3,20,d8470f3ee4730ea1b618cb1e9f61d53378b1b139725df661e8cca6a75ecea753
101,24,70,60,18,3,21,b289c625935178c4389206037e68c6f52c4bc5be990a25a26c223df840560356
102,24,70,60,18,3,22,a3d18f7ca7cee4a8aec93c65c9a14a3b3fb64f28981c6501f8f2fac4db09b561
103,24,70,60,18,3,23,5218ef80c1efd4f752a6cfa499d71d63245f4a1a013abd40e1cf56e100c1c58f
104,24,70,60,18,3,24,1b16c43ada345c628d9bf487f5114c2730fde939e25152b011aee810ba70c163
105,24,70,60,18,4,25,0471851d3b19ea655e1498f5b7099e10fe069d9f69235270252adc2044f9a86c
106,24,70,60,18,4,26,ee0b78999cc119ae2c697dcc7c5cf3cc34cc8fab0be267eccd484f3a811555e9
107,24,70,60,18,4,27,35228f2dee7eda00408c5878511762d740f4c9e0ee27d59cb8624ec116925068
108,24,70,60,18,4,28,86f3de97013f53d9c9486c25cd04b97d52892f52c72c69007b46b06e8665c2b6
109,24,70,60,18,4,29,0ee70f3eedb98ac680768601cf84d76f7b9fa195ebc6f6850c1cd5a752acaf4b
110,24,70,60,18,4,30,5112d4b18b376287c286863d52f824062d90590fa4c3928041b30258f80fc8e1
111,24,70,60,18,4,31,ed71b644bcc7479cff5bb1b74dec0f1868258707be53a2b6a186b3d366b83796
112,24,70,60,18,4,32,a2c54f86299c603fb20444001e5eb7029d0367232e47b05a5c7833fe38df1d07
113,24,70,60,18,5,33,56d4f83a0f1dc14643d621adb03676f5193f64ef8d03e598a8c5bfd8af034d50
114,24,70,60,18,5,34,603d47e77e49f235dc7ddc3971d07ca923a8b173708b1d56e2cd2f715fffc899
115,24,70,60,18,5,35,03222d207ac70db5ca2632d1c1b64eab35ddc337c4007d67da96d7d9256e9c60
116,24,70,60,18,5,36,7977f6c305b18e6f336dfec451dd8fee5ed95619ebd7ed25e720c170cff7055a
117,24,70,60,18,5,37,c6289646d1d7e7c3a5f3473dd8f54e3ab810b7274c11842a4f8cef37f6c850d9
118,24,70,60,18,5,38,5d2155f7aa0189d24fe10cacb93491e1629df381f3c296afb5c36ac50528c801
119,24,70,60,18,5,39,5ca59876b7808331ced53127a0dae0a464a1da3610825f4d14c468a080bcf8cc
120,24,70,60,18,5,40,80d0b251451977827cb7841ab36fd5b4ff2ac65f1004acbf5409e59fd4de252e
121,24,70,75,18,1,1,6d545739aef47e07fb946a0a802758733dbf559f62ab82eb0e218e50e0a067d4
122,24,70,75,18,1,2,de34f86cbf88081563e5976013233f0fc1c2c1684139020e7564c6297fbb3a6c
123,24,70,75,18,1,3,0b2faa7f9a7b122ffcf2091e1714eba7330dc6899b7c529344b26190ccdd11ad
124,24,70,75,18,1,4,cd4c16b5e4ee651821cd586db529765f530845753dd7ba89faf704742c2f1874
125,24,70,75,18,1,5,3e81dd88a44e2b866f15a19a6cc78c1fe07d5e45caa1a3779b5659ecd241255a
126,24,70,75,18,1,6,72ecd10b16fdb357f89a14a48a38b81fbdc7cc2850f608e547b1654324df0ddc
127,24,70,75,18,1,7,8e53935b91ef51de3f49c27776d6f33887f7b2575589bdde5db8a74065c9caab
128,24,70,75,18,1,8,a211936012fbacfd7ba8f4a84503907b02a67fb8ae76f92eb24318c3577c5605
129,24,70,75,18,2,9,9223dcc932346a888aa0c05f9397bb200408f09b590c02b0c5a9b4f511984d4b
130,24,70,75,18,2,10,cecd917ae056d26891c3a2695081a248f894654dc9f0766f98b9cd84436d5da1
131,24,70,75,18,2,11,944f0d285e7e5750d7241cbeb17ce5dd878a41988b4236d796351955b9aa1876
132,24,70,75,18,2,12,8d1ecbd4bb674d0faae4701466a2d014221f0fa0cd4a627753079e1f4e335f6f
133,24,70,75,18,2,13,d6e377d21da590a13cf5a1238c985f8fad843287c7282ed794a8f0ce2541fef8
134,24,70,75,18,2,14,12e9d62fa97c1dbcb30336eae7f1ea63e5f08f7bc3f3b91be2e91d3225fa228d
135,24,70,75,18,2,15,6622aa62f0b7a5233c1e0f320beb7228fda235165e3323e4e9e7a430b18206b3
136,24,70,75,18,2,16,b36883e4c6584e4d6e7150a18b88c55bcd8ab222b1e14f1f80fe8b17ffa0cba5
137,24,70,75,18,3,17,961041a1051b839d43a8556c4ac22161915aa5821b281019b87b388781c50b67
138,24,70,75,18,3,18,0b05dd5abf695a71315a50e899e9ef1b9c97648c1fc413e2bd8693aa089aa529
139,24,70,75,18,3,19,5c08f91ddaf8ff5dc85cbf31348dda374a9ae39b96194393b698d28d2fe4dc37
140,24,70,75,18,3,20,728d8c5e43dacc29ae22ec69dbe39aebc9607e2183901e15916c82da83e95673
141,24,70,75,18,3,21,6b576a9bede17797827aea40e6701b326e7d4b80e676f0074459fec9abe30fab
142,24,70,75,18,3,22,349db416e20e983797120307ea0eb5f2156fa36d61f90a78d394e6fb27808723
143,24,70,75,18,3,23,3e9abeafc654cd1876217ca4a09cb16eca7503715176fcc0008da9237f516166
144,24,70,75,18,3,24,c08d3f975cb070a3ef23485080e5754907ba68e7b1644f01037509a1a2e0d3b2
145,24,70,75,18,4,25,effdb858818cc1ed341daf264e6d41de6115a2193530925de65d88b33fd85941
146,24,70,75,18,4,26,0371e01578a91f25a5b01e2877190dad3e8f4a383aa4f6bc135653d376bbff2c
147,24,70,75,18,4,27,f4ba9e573f4319bea2e10cad7bc3fc626be92bfefaf6f568fcf8a10b3a33577d
148,24,70,75,18,4,28,58a8bb05d15ea462db5e1692bfdabdc5a486fcdab7eff06de7b11f248d49a420
149,24,70,75,18,4,29,d39b87cdbfed71cccf28c41d40e37edb8443d3d70369bee77154e6d45ce6b97c
150,24,70,75,18,4,30,845b54d75b3c437b22a4ec62c2164443578133f0acaa8f4a59023ea9139da2ed
151,24,70,75,18,4,31,4179abc305886bd617a7ba2a359e787000a7b53c105029e278c10153549115e5
152,24,70,75,18,4,32,354cfd7bbed7b77df68bc3d9a54ac72663c34a7b973076c48b57221ab3ba5b33
153,24,70,75,18,5,33,2240464b252144612bbf00e35e12c3383c9658c91fbb2f09018be78af5e2eeb4
154,24,70,75,18,5,34,59354495b5677e001d684ab710a0262a46b1413da35f74bddefa2aadc50861f5
155,24,70,75,18,5,35,21d6203994eb8e2ae006f00ca1c6ac857b987ffed864ac9cf1130ba45239a003
156,24,70,75,18,5,36,262610392dcbbc2d72e943587cb76fed40f9682b9af659ad5926225e35c34be0
157,24,70,75,18,5,37,5538683e858e528148d42c228b2e267ffee642217552a916a5dad31a3d6f5940
158,24,70,75,18,5,38,0c4cd9417f5fba3a5298a75947d93ceafab5b7b6546a66dc64e3c86f259e6b4e
159,24,70,75,18,5,39,bc0a419f5c62ceed6790a7c6e99e98ff8f08e4b0f4975db2ea6cf866ab1d0428
160,24,70,75,18,5,40,6e7e9cf40831c0ae58b77b44bb845d99d1df943521f3749fdc7c6171539ea35d
161,12,70.0,30.0,18,1,1,a805ffc4f4154a511b74ec04fc907bfaf736de6029d7010b2be4ed939a44fe3c
162,12,70.0,30.0,18,1,2,22cc341cf605a0dd789f945fbd682620662d6c8c632591b272657359894a15d7
163,12,70.0,30.0,18,1,3,7c2bb9c2fe7fe70cf823a94258026b841afea380069e8cc38393c83d787da3d2
164,12,70.0,30.0,18,1,4,4fa46d97288696bdbe91ed97e045f48f4539cf52b5c551f57ffdcead04e33901
165,12,70.0,30.0,18,1,5,a26b896dffd47b941fa03e6468abeb8bf85f4a8e8d85875e51d7b6a3e304792f
166,12,70.0,30.0,18,1,6,df8bbc27e4cb1db2b1a5c96736be6c53ff9f9fa14054c8bf4fd6f57be1d04390
167,12,70.0,30.0,18,1,7,e537cfebc392c09e383fcc257e7a60456eb023d38892d6c0f160cde31533e22f
168,12,70.0,30.0,18,1,8,a16b2002e94d0607bd6f9d600bfc4a90d85cd9b178c1e0dbc00dca63b8826d20
169,12,70.0,30.0,18,2,9,2ea17cb81f75a0e9c2236a3439e7c4b0248fda0829882f6da5ff053ed89edffd
170,12,70.0,30.0,18,2,10,f4e946279c5231c5089dec3d098909ad4c635bc62855081d20244a6bbf3b8a46
171,12,70.0,30.0,18,2,11,170aaff0b2388cbfa08ee7aa63ab324ff0509d5492494336f204e2751b144815
172,12,70.0,30.0,18,2,12,0a66a2c9d34b9cb980960f79d74f8d92724d6e10855e2f191b825d14c1817e23
173,12,70.0,30.0,18,2,13,1a1d4a8e6eddc8f3fa5b354b1f447e713b84412128e447683a0326c759b0e8e5
174,12,70.0,30.0,18,2,14,d69dc9b7b49629fac3580fee0bc33ad852fb3fdd095900ef5351802c8d58d322
175,12,70.0,30.0,18,2,15,9518d78c40c96ee9dc5400c4e241ef388dd78cfd4f93ec7aa09d0a5588c6fb09
176,12,70.0,30.0,18,2,16,bce8a23a3dd6be2f6f34aecc336aa800e32b890d0427f1f455bb8bf9187e93f0
177,12,70.0,30.0,18,3,17,e0f01b26e62a71e1c56923d1e331b27a00ee2ca32e1aefa666ff35b736388a5d
178,12,70.0,30.0,18,3,18,69c0a48311eb8c80f9c965717bb09724ed0fb04698129086a7adba0c2e3bd895
179,12,70.0,30.0,18,3,19,e6a3891962155a885805cd5f2779744bc9545a69e0e9d699f1b58ae59798df3e
180,12,70.0,30.0,18,3,20,bb9207fdfac25bc7031db57684e2a198597f70303e7a4712638a26ce73e86e9e
181,12,70.0,30.0,18,3,21,b8621d39a0cd80c14bc097a293a9e487c5fc3c88aa8fe99db7e66b6071d59f3a
182,12,70.0,30.0,18,3,22,6193214390a15c34edfc3e046cd782afee6daa9480e860c9492f6991bb640e69
183,12,70.0,30.0,18,3,23,ba2a2b43ad5504cb5e9079308adc33281098b62791ea57b59815e0c7a4c931d5
184,12,70.0,30.0,18,3,24,9b9f252dcdb42dc5c4d3e23603ef1efbfa439494bcc57b6fb66425429a6d36be
185,12,70.0,30.0,18,4,25,7906d2773d505d606591215637a07bff01f37e6961a9b7d5a1ba6e84a789c232
186,12,70.0,30.0,18,4,26,8d27ac090f25ee40485595666f20ae101ab30e0fbd71b45579ac42d81e6f0ee5
187,12,70.0,30.0,18,4,27,d434a240eed8678106bfe0ed4e971da456e846817b308338a8ac408a4d2f8ca3
188,12,70.0,30.0,18,4,28,574bbad43308099af48e9821ab4402e668d9041619773a0009d4b5a3cdc6129d
189,12,70.0,30.0,18,4,29,6dc0d553d56dadc559ed1ca9248ed385db2022efc37caa9fa36d36643511544d
190,12,70.0,30.0,18,4,30,d92a897ef5e0cadcd9753ac58cc9a1a458b604e0f1de95c5e8697ac93d7857ea
191,12,70.0,30.0,18,4,31,226ed8f17ea2dc0dc0c6474a4e6319ad8e33bfa6bb347614af9e63d30e1e8802
192,12,70.0,30.0,18,4,32,408ca691f7eab6b8448ac2bbcee48485de17818bba666167c3305b99c0edce57
193,12,70.0,30.0,18,5,33,42a849f86214357f061e5afd83bf87ee67809b6f1524a6673e5ba437cee0d845
194,12,70.0,30.0,18,5,34,ef1428e13941fb0922d15ec537ec505567f888bfa2ef337902b0f4448620fba2
195,12,70.0,30.0,18,5,35,a96adf8bd64bb2525e63ff0bfefc42100ee534d464cbab343dc1d8576e0e3427
196,12,70.0,30.0,18,5,36,941be2d3869ab6634dc2f26b05f48154273ff8b8b3c3ffef4740f75a927420b2
197,12,70.0,30.0,18,5,37,b861e5f595ff12264113d28957d8d3bf7396e06d43bded8f2ef2f3c4bfa9b2e2
198,12,70.0,30.0,18,5,38,56a5be6bdab22e6a9b6f92ce933003270dbc01ebd90cff2ccfeab44ec8423805
199,12,70.0,30.0,18,5,39,46dcec6ba38b602f6d8bd444569d7406f3ea98fc7ed8f68b718c645e04a7baa9
200,12,70.0,30.0,18,5,40,c82dadec21be7c6dd5022ff15ec0582bc2bebac23ca2c3cfce62acf56b05c88e
201,12,70.0,45.0,18,1,1,1837dfc8aae2c276587eb9b3a63bfde8e2ca032ebf9e71482f7b8156504b0ecf
202,12,70.0,45.0,18,1,2,e93f4e2fd56aad3c0b52094c4c9532a1b322561046211c08df5bf6d3042e4d2f
203,12,70.0,45.0,18,1,3,08995ffcff62cf206405509663d29bed8d84ec894fe96afeab611a570b837be5
204,12,70.0,45.0,18,1,4,f0c98031c4a6f60bcd173a1aeef527f6391439d69d4de0b5161f273bb50ac4ab
205,12,70.0,45.0,18,1,5,f674d850a68af8206a73efefdfc93274d7954b851544579b9012c68fc52a046d
206,12,70.0,45.0,18,1,6,ec0dcf2854e03aac414efc238031239a442d48734d1d20ce44875206eea2b69b
207,12,70.0,45.0,18,1,7,8e009035f11186d55eaa070fc981a5de5941fedd6e1b130072abd77359900e27
208,12,70.0,45.0,18,1,8,5f36314a2098a299f25b76003115a491618deb71e8138ba7e17da3bc8d40c1e9
209,12,70.0,45.0,18,2,9,3b9c7b69a08ba82908b1da8c17db6f97d9ad12710ae69741478575b56675504a
210,12,70.0,45.0,18,2,10,694fb40f6f9c5495107651d211f27b031cbf862151f21099ab93340dab09445f
211,12,70.0,45.0,18,2,11,cee5a476d2eafa002ada7723c4d453df3fcde04f81475f1895270709c246f3ba
212,12,70.0,45.0,18,2,12,41491b3b218c4693f9814b48a0575820f45177fed2221d76c60ac6592064fe74
213,12,70.0,45.0,18,2,13,510972d297dbb6b3ad3e84aebfb1c808dfa3ccff49dc71b78becb7aa0dde3ad0
214,12,70.0,45.0,18,2,14,ad159601c749d21c6ff1fc17df21caf362f033c19af41457c680d4ce9632ad8f
215,12,70.0,45.0,18,2,15,a3d18a64e178e7d17bdf5a807b5e227e501ba3bb3c885d20b1486f4a67652f98
216,12,70.0,45.0,18,2,16,ef157fb73d366c685ffb89cfde916562d256e8af5c38bd46ecb80ec0df6f626e
217,12,70.0,45.0,18,3,17,f30bde998b6fe89ad6b36a8523bec5bf0621f62530bd722b3b92d1582674e4ff
218,12,70.0,45.0,18,3,18,9c90eb4243ac988b05412c1f9c06c468730f6ed2b7d58986bd39c3fbb4ce06c7
219,12,70.0,45.0,18,3,19,a1b49b1c11f631c26c1f28db134aefd298737f687d760702b58e2c1858985987
220,12,70.0,45.0,18,3,20,c93cf6670bcdd339f10ce30e8bd25fce1c55e7633ed298c544f99f9f2188ddd6
221,12,70.0,45.0,18,3,21,3ac3b22d3e0e315bd497cb9c8408b113a9c92ad4f6e88af266d0780a2005da09
222,12,70.0,45.0,18,3,22,d0bacf8ab25c9f7f2304fef2b6bcbb9626b3234b4b6ff85e851740b61ca9407d
223,12,70.0,45.0,18,3,23,96ceea8c82a427d7fd76a2213a2a3c4518ac20daded2dffb5d24db4b96bce9c2
224,12,70.0,45.0,18,3,24,f065de171b3deaecadcfefa1011d43598f5996d3408b58a829ca841330ac4be1
225,12,70.0,45.0,18,4,25,51061824203c9b142c34b3e6e895fa206f32367fbf1fdccb2ff2952b406dbf36
226,12,70.0,45.0,18,4,26,d95c76030ebfac69ce59dfb34c9def3ab382133b35e5cb39aecbfa806a6f40e1
227,12,70.0,45.0,18,4,27,53903baa84a07b31770d92a0125484ea44a13c140fcc6e09aa7587119dfb5aa1
228,12,70.0,45.0,18,4,28,ecacb755b499e4a086ed9ba052e764a49a077fb5c5c3a4f6698ada41a236eeab
229,12,70.0,45.0,18,4,29,94f7d1350a4631f32f53628fb5c113d79193ddf12b80bd6e6e61f11b87ebe449
230,12,70.0,45.0,18,4,30,ed7cd408d2dc69c899b8cb9b81e1c4b6bef7b98f771a0d64d1c1ed9b43133626
231,12,70.0,45.0,18,4,31,1ef37448f4226a4ae8092f7c84fcc0b0d2b39c5e1bb9254f66f076c2dabd9778
232,12,70.0,45.0,18,4,32,8478da76ec7efca694f0407432c63dc8ad6c46ec966fee4593ca8db4b172da6f
233,12,70.0,45.0,18,5,33,a7856a243cbb84ce1118071f06aaf029918f70869daad997f6bd7397ec34d87f
234,12,70.0,45.0,18,5,34,bc124227773c00cc0c651b50e4d535a23f17f8a1eadc3c083ea29e498fa9673d
235,12,70.0,45.0,18,5,35,5889874c7e199691d330abfb9e0a8d631d85ceea29384a6e986659d8afff047d
236,12,70.0,45.0,18,5,36,9e5d612d18567912d44e60376f34aeb8f16d0c2cd23104e62774fe67ec0150ac
237,12,70.0,45.0,18,5,37,27648ca44c27b51193b5da3c841e340d81974137f9aded6e2f811cf9aea69364
238,12,70.0,45.0,18,5,38,27aa345e23e217fce6a4848b301b32e77510198f0f866847c786a03fe38f7495
239,12,70.0,45.0,18,5,39,f5515a7fd740da2fb775f35d95d54f84e86a3d525ff36946084b5fbbb46e6234
240,12,70.0,45.0,18,5,40,c9d42afe9764acccad767e5b009c98bc10ed065169d6e430c4c447eeb022c342
241,12,70.0,60.0,18,1,1,206a99f9fd1788194658ed24f7dee06d806559b822b71b257145066cf83dc245
242,12,70.0,60.0,18,1,2,2438b60f1056fb2464536e573a3e1077d7a089d18bb8cffae2c1a29db5044478
243,12,70.0,60.0,18,1,3,3cc8b8144c0d77285ae632cf83ad64471e640b33c7d496fae0f12133957365cb
244,12,70.0,60.0,18,1,4,72490d7f2468400f2874d14e5eb222eb48c47befc1c3ccf32e50ecdfdb7ef106
245,12,70.0,60.0,18,1,5,f761c844c10ae9edaf831be36b76d7670a090b94dbf55bb38cbab9220e8fc18f
246,12,70.0,60.0,18,1,6,cf566c26ef5e74701744506edc73f526a591c7ccb62168f0be505f03e7fed16f
247,12,70.0,60.0,18,1,7,a16590aa2abc3c105d1bca1aa06966c2698d65cdf2de58a734632f3b87bd3bf1
248,12,70.0,60.0,18,1,8,8a027e8b81105da779ae6757e37880c1a3cfe847d769907300cd9185fbb840bb
249,12,70.0,60.0,18,2,9,2d17ae5de5a59c7e6534b6168b01f6556b1d64f49556d45c27597d7e7bb0213a
250,12,70.0,60.0,18,2,10,6210b645a5ec3eee781e967bf3521ceebd022e4bf0667ec857a4feac624e80d9
251,12,70.0,60.0,18,2,11,2f1812c93725fb85e0064c6f9dc3992ee7edec3294bdd685c94a83c162eb88b8
252,12,70.0,60.0,18,2,12,556e1df5a2fa9e226dc5237f6b325c5075d2102f005a113b1e0157d7b89fef11
253,12,70.0,60.0,18,2,13,f371ecaa01e98c59256177f1f1bf1f76499fdf4576357ca48c9ce975b30f7bd1
254,12,70.0,60.0,18,2,14,6a199314163f874ab068a1a98ac59a9219092755b8d097e9d1c037515edd17cc
255,12,70.0,60.0,18,2,15,1fff79d10ac54086931bf9bd21b6997acf84d0f79c49692608b1cb6347a041c8
256,12,70.0,60.0,18,2,16,778fa9cc9f4ddb6be7529af61adeddda5a38a6c1bcdb3872f046286a42a0993a
257,12,70.0,60.0,18,3,17,a772c5a0f2ff0bd971c4592ee7b38465e404d2452cee9e40816c7e00f100007c
258,12,70.0,60.0,18,3,18,2d532d20c28410826e9938ff6e239afe962a33972857798926c0f5dc4bf6e92c
259,12,70.0,60.0,18,3,19,3a3ffb1daee123c3a86f505a3c3e29f71101339248da18cb15655f8574e78fb6
260,12,70.0,60.0,18,3,20,650e86d42c6f6602a4942acb263ed8eabfa32d18de176a97c1497f6f2f02ca75
261,12,70.0,60.0,18,3,21,f31709d3701fac65007b0c5ff8b923700451a10181e1665d6558d80e7a2a4513
262,12,70.0,60.0,18,3,22,980d502739464eabc67a84d5d23960f011ce618ac150df4aa5410df9776e139a
263,12,70.0,60.0,18,3,23,f6824e7ea271038e5a8942fc951d580df4a7d5c362798049ce12070a06374d32
264,12,70.0,60.0,18,3,24,fc9eb6d2c7eeda19f81a7a2f66b34ccafd272bd3f1286d252b5f563218c9d849
265,12,70.0,60.0,18,4,25,ddeb69f7c41b467a9a2b25f611dd8738fc580fc26578dc43a24aed924897189f
266,12,70.0,60.0,18,4,26,9f244e417ecfeeb164dc09fb2f90bec1fcd10098571cd08d9aaba5e7fd0d3cb4
267,12,70.0,60.0,18,4,27,416c16b3e01bd8f44b79038207623e276cc955fbd66814b84b8e92b0053ae4d7
268,12,70.0,60.0,18,4,28,7be457eadfec996d7d8fa7f8a9822c1a923fb73d25d2913cfcc0558802c00212
269,12,70.0,60.0,18,4,29,44a579c5c05c254fbebf02a37cf43a478bdeee3f2edaa8f5c1d32ffb0fa61dc9
270,12,70.0,60.0,18,4,30,3803ce4381cb448a9e901c820e3ba6ebcbc74f43aaf030f55b397274ca80aeb1
271,12,70.0,60.0,18,4,31,d973c7634683db76058983c86def98012911538a326339a45c72e6dc8494e146
272,12,70.0,60.0,18,4,32,aa42c859b298879d06bb1187dc4bcfc6bffc0b52526e00ba12bdb121737db048
273,12,70.0,60.0,18,5,33,814051511d2d2baabfbdaeb8525bf1bee32691dc5438c3100d65792d2ee6a40a
274,12,70.0,60.0,18,5,34,e18bc0c79e64b75c00866f4268a7d347cc18330f7052af18d67c7936008ddef8
275,12,70.0,60.0,18,5,35,f011b2f926e329b97b3ea76bb6462c94972bc7ccc681b5ddd2151ab705bbea15
276,12,70.0,60.0,18,5,36,cdbf6661e9bc6a97a9565bb332b6593dd6b5956a57e52de83efeaeb5fd4a3ea8
277,12,70.0,60.0,18,5,37,99284a9cc1e8cdeea1e570498f889ee7fe444357659c89328c8661080b70b806
278,12,70.0,60.0,18,5,38,8a62026cdef5374986202fecf7c9aa73660201b8912c14af3a2d0e1764632d1c
279,12,70.0,60.0,18,5,39,03d783f3d038fa24d7baf963896fed8d6bb6d8d155660ca38df728b7ed751f56
280,12,70.0,60.0,18,5,40,3b9d18d7df7e270ed6a151204a9b36b49be1bb76296d69fe1cbaf387d2bdef15
281,12,70.0,75.0,18,1,1,d96ace57e8fc1ec50b3f7e4d55b52af6f4ec6344aa4edf9d2197cf1b6a20392e
282,12,70.0,75.0,18,1,2,44483e46197dec08c54fdf88404e3f629857cdaf4fcdedc754093f1961742a62
283,12,70.0,75.0,18,1,3,6f8464656cc09d48ee87aaae56c2451c7c83c133c1b94f6374a4d8dc73f42a5e
284,12,70.0,75.0,18,1,4,69734c466a4e31823f83c3f56ddb0957f590499bc8effa2f66e207b0e3a4782b
285,12,70.0,75.0,18,1,5,3b3ba82b7a420600cc4955f32dfa9a262fa3ec47d780a69f470cd87e8b5afd10
286,12,70.0,75.0,18,1,6,0f17faa451d2868a6fd26a7033a1ca06eb95bcb5445ae8345d95a7ee7a945971
287,12,70.0,75.0,18,1,7,c5cffb68fde5122a7242397e78d3d3dc49a3ddcc44f350e2def70da6dd938dc0
288,12,70.0,75.0,18,1,8,a632203e2c5923bac4a8a621c43ee21a84bbf45a5cc5e6118e954aa8ac4213f1
289,12,70.0,75.0,18,2,9,de73dff1029c3e95ad3091c66d64b7fcabfe8e7abfc17e3ec23c42b88abc9af6
290,12,70.0,75.0,18,2,10,a1a007d66bd5f894db690cf5079acdbf951f74b6ea6d70053c32a1ddb9d973c7
291,12,70.0,75.0,18,2,11,7296d007af2ad58ac8f2079079d0d16a10454724e260d46d8a480b2f543258de
292,12,70.0,75.0,18,2,12,3a88c16487236c05545ff5e937aa333a4306845c1f06beb3d371be75a5dad5fb
293,12,70.0,75.0,18,2,13,f3d30a98061013824e8b031c8e301af661d627c8391a91000abd3d0fb8521d14
294,12,70.0,75.0,18,2,14,9fd40f070b05ea86d6895e02afe7a685b0f605670b38e794e3f4a93fd010c3cd
295,12,70.0,75.0,18,2,15,c7cc40cef959b53409bbab3d2530d3b83df71c466f15dd2707d33806d5af5406
296,12,70.0,75.0,18,2,16,15d07a57c5375bf29e804de523e12dbbc6991b6f3272644dd324a8d3e54cbe92
297,12,70.0,75.0,18,3,17,4f329c8d6ff3f9b0cd9174994330d78e1c0e2de30116f9e3e79627e85ee9b910
298,12,70.0,75.0,18,3,18,456ff16a2b408f2da1d9d63bedbbae42e5f4d86dc18da8be35addfe4de85414a
299,12,70.0,75.0,18,3,19,b57238a7493e3c20ab7acd48f5c552d115b6ccb9cd6f51feeeb88c76eed31d72
300,12,70.0,75.0,18,3,20,002e5a76eda74db073cef5dc2129be386daf14cc50d0d004e1ba0576cc9a13c0
301,12,70.0,75.0,18,3,21,79f25ea0e41ec0b3dc5c648c57021f2e16d7783cf585caf991b3263c9d4d61d7
302,12,70.0,75.0,18,3,22,d197a24245ba4f50275527ee021bf7e1112c0b3473156b55d8b794a7ed3a465b
303,12,70.0,75.0,18,3,23,9f8b14cae827d1b72d8df200385b3dfc3129cf53643e935a423d8ca29f7f2c90
304,12,70.0,75.0,18,3,24,ec666b1dc2df71f75ce096a13acaac7e6e262456f9eb6b0b73b6223130a969a9
305,12,70.0,75.0,18,4,25,97057dc7fa0b9ae72395a244554c4324a61e29e8fbed6d0d6a1d13f752072789
306,12,70.0,75.0,18,4,26,d1e2b6c9af40f5583882d204555354e0a35fd49207c2ebe5f643ef8b624bd926
307,12,70.0,75.0,18,4,27,fa8d73d1c4a1f78a433eaa3441fe783034442308e00bdfa199c3163af7dc5881
308,12,70.0,75.0,18,4,28,2f889a196aebd2ef156c246455846fd062e17e4235feafb42dfb36d5f36ac388
309,12,70.0,75.0,18,4,29,b09e450592c95b0af3fb25eb2c29bd585f9e7b0e06aebcf0aab7dfb74ad1b09e
310,12,70.0,75.0,18,4,30,b601de50837103f10f0cf4b49de4a91ec606974921b57c7f66071656320bebbf
311,12,70.0,75.0,18,4,31,086c23da4fcf4aa071b837f46d00c4240f9013d5b92cde2bc5d02059c7784cc1
312,12,70.0,75.0,18,4,32,903e76aded0de8aadc1c784b5d2344a61b93540d6d5463b99cc170b59a9e75d6
313,12,70.0,75.0,18,5,33,b0e3372568f0c4966ff8b1da2f4ff697f92d0872f733719e3c71ae635e406797
314,12,70.0,75.0,18,5,34,8dd3dc0f5e51af3acd4235855a069e6199f53a98d520d00e59123d0b8127900e
315,12,70.0,75.0,18,5,35,26e492d7b1a5917b8e88c6a9f8ca3ffea09acb4854b277c3386a5d6328fbd831
316,12,70.0,75.0,18,5,36,bd120beec68d9d87786a9467f1ea46a2f0a57af04c66f5a69c491708c38bcffd
317,12,70.0,75.0,18,5,37,19bcd5783ba5f2d7b59f375e53ebc49e756d447ad35a61d5ebf9a9b5948e0d9d
318,12,70.0,75.0,18,5,38,921cbe87c3a7941c57ee367b793da31e16484ac72607442364665ac31b4a4248
319,12,70.0,75.0,18,5,39,9f8f2dac4da6fcc12bda49c285f8205a58c4393feed9d4c999ce09bcc730e3a8
320,12,70.0,75.0,18,5,40,f71e4b9c77817652a790985464872bddd04a7553ee954786d1b057030cbc385d
321,36,70.0,30.0,18,1,1,248584471442f5c0260032c808922f244b269abc0e02501b3f109a70f4d71fa9
322,36,70.0,30.0,18,1,2,2d8c96928ef190fd083fee81ed3758d975b00b330ae4c5108d8b4f391d3c3b8d
323,36,70.0,30.0,18,1,3,a6c6066fcaae08ac47a3d1ac7bb436671156321a9a127ff414978fb797233be5
324,36,70.0,30.0,18,1,4,cb3cb83e79ce9b6dc9b2e9e93eddb9d2ff1d36f6812a0a7d01f6be4f0baf0c86
325,36,70.0,30.0,18,1,5,2e6928c4a2d069ed73339e40cccb688ce4292e88ed48b830e3c210eee5574390
326,36,70.0,30.0,18,1,6,219530ac79af7fa045e614e0fac0618693ab0f5d11769f5f93ec9315d9d6b3db
327,36,70.0,30.0,18,1,7,f886c05b38016301d994b682af071c150d39e6258ac42e5ea2543823670f425e
328,36,70.0,30.0,18,1,8,a11a45dafad59dea6bb7d57f45e5306516b5fb9d169fd014ef5819ebdd4aec4a
329,36,70.0,30.0,18,2,9,48d0b8143ed448224aa718f281e4ff6c9773aa23a06dfc4b1e3ca49045723016
330,36,70.0,30.0,18,2,10,dac8a9c41112a3f4f537f82cafe2f96f7846733c2e0a49e944ba72a3039b4657
331,36,70.0,30.0,18,2,11,9856d1f2ae8fceffdd1d7bd07c87f70e4f370725d6802483db0ef749ebba5a9d
332,36,70.0,30.0,18,2,12,70557f94326127d954b73aac72338dc6b487f01a9ee33ec4381a6ef410b75136
333,36,70.0,30.0,18,2,13,01006bec47abf6324d221d2cc284a5683f43455150360a459310d7a7cac364c0
334,36,70.0,30.0,18,2,14,65b4d4c0c2c2ba3bc708d256dedad3b1a2cb2571a188ece729504314bc1464fa
335,36,70.0,30.0,18,2,15,77945980aa7091d788719b4873d181436af756893057623b0cb397cebbfea77c
336,36,70.0,30.0,18,2,16,c61d6e3bdc94f5000751d3d3ef3dc3fdc7ce68c9c0c60cf1da46ef8d8a77789d
337,36,70.0,30.0,18,3,17,5d8aa8406da19dfaa9a3e9b4cfade3ae8f343205d74843b2abe0e3d5e7e8394d
338,36,70.0,30.0,18,3,18,464880830ab6723af9e259a546d0e12fd1a3d95f61d562c27b3b6183442dd813
339,36,70.0,30.0,18,3,19,f94fe635ded6d7f405898c879e4d87e389875364f35de652fe6f13b7d4538329
340,36,70.0,30.0,18,3,20,7478524471bfd82d3a9481f9754bbab8887b593833cb41d9ce76ec90b230f9ae
341,36,70.0,30.0,18,3,21,46daa340ee50f07b3089b67e02f993f51230a6e577deb5e2a672d86196011989
342,36,70.0,30.0,18,3,22,9a41622460a50c1db0d75ff1d38a5021e789a309ad3b836dae5c43703054cba6
343,36,70.0,30.0,18,3,23,16fac125bbcb137555dc4aae4c3cfc76e3591616fe27b2cadc2651cabf54ac90
344,36,70.0,30.0,18,3,24,d87e1271ad3580e6474b8b009f6fac97833c6a5704d41a59f95d5e937d259452
345,36,70.0,30.0,18,4,25,cee588aad44138d2aacbc19ff0469f27ae0e16d308f6e4b49ae7172f0a76e700
346,36,70.0,30.0,18,4,26,9cf93fd08f792cca9af940b98b3fd437d437a4e3865c90b0855c4a647e1fa3ac
347,36,70.0,30.0,18,4,27,5a3661d2ebe3ee08f0c8ab354b63ed9071e70a34312a9dbf67dd7921fc4d4c53
348,36,70.0,30.0,18,4,28,2073f6a3ab35830f83613a6fd4bcc738740f315b433def8bfc4203d2b4b0bb13
349,36,70.0,30.0,18,4,29,ac72264b8bff91641d1241807faa81d7d51434c182d2d1fd4b1dac15ae1fe231
350,36,70.0,30.0,18,4,30,d3e37dc59ea4d3ad7a03457c7fe72f96ff0e10a409882ab18cafd521c4ecf6df
351,36,70.0,30.0,18,4,31,8eab25313bb9be698cb5da744768281c0bdcc3133e0d38d8068d8511c1a73123
352,36,70.0,30.0,18,4,32,4b3c36b5b28a75d2aee021aaf26d475e12b2403832b1a458f0e81d6ee74d29e0
353,36,70.0,30.0,18,5,33,681e9f1528311db82d924303c714f4d0744a5e5c470bff04b3fd88cccbfed891
354,36,70.0,30.0,18,5,34,89ba9dd12d9a679a74c8446d735616b2791ac120d6ec574f27b3c3388feef478
355,36,70.0,30.0,18,5,35,10d3f9f5deb0a85a416fa2fa56d9dbd1feb8f7affc5e34ba253fbceff405a2bc
356,36,70.0,30.0,18,5,36,0c6d87c9b57e5be53d2481f6f4436a09d594621007e46ef0c12eaf538e0dbcd3
357,36,70.0,30.0,18,5,37,9f1ed2c8cabfb3cece3aaf4589f71d3938fd857180ee7982a21e5876450b9a12
358,36,70.0,30.0,18,5,38,b04f238b85fb6bb6f66fc4b5add511ddfd84765a0574290c400c222b96ba88db
359,36,70.0,30.0,18,5,39,51a03a7db2b399b0b595a50eec494bcfa1db4e4d91245a8cd2a7ecd2bd464d7b
360,36,70.0,30.0,18,5,40,9a8bc8e039bd34e9ec796747a232912e6bf9aa8c7a8c782011d62597184b4332
361,36,70.0,45.0,18,1,1,90be74acea19dd3e6da1be479b4bb341e5a79c6d76b32b41b05df7b256e1088d
362,36,70.0,45.0,18,1,2,a2872d440e4e3d350d7531aa21a48f366221d87b931c610e807f46ee822b8a74
363,36,70.0,45.0,18,1,3,2b5d7e61bbeffca82a9304cc0c71ee187c5a2fcd5a95c8e3e4b5befd89bb8192
364,36,70.0,45.0,18,1,4,70876ad4daaa2df8a343141d2a50bd6d998a53ad85a1985e43f527cf8c1786ad
365,36,70.0,45.0,18,1,5,c37159b1f45b8fee6d5c8eef179fbd75ee01e0f8b2053703d139789f7e7d26c3
366,36,70.0,45.0,18,1,6,26a643e685f8edbd5d3b70d31adefe6e9b85e6662678e014bfee5d57fc6f533a
367,36,70.0,45.0,18,1,7,28c7f431540c4644e6a61a3e00d5b59ffa561078d31b123184e23fce9e4df621
368,36,70.0,45.0,18,1,8,7b228297c78f1227faff27af9b3994183831acc049ffafe2c0af373afc266db3
369,36,70.0,45.0,18,2,9,a3e0d6d3fcfa09f83220ed40e232eaf9e5f555cef054aae9150c4811e9f7d7b1
370,36,70.0,45.0,18,2,10,e6f154a6cbc2e2a24f5413774ed83b84517ad670bb36a7e2cfa2cf7f21246bf6
371,36,70.0,45.0,18,2,11,d22d152f99955f5f397d3ba330335cd49811cbb791e12c97e3d87985c3b0f21d
372,36,70.0,45.0,18,2,12,6c397c4334211f525b36b1b251d68253211c7e42761a7a82c68e1e5ac6e80b3f
373,36,70.0,45.0,18,2,13,95d0bdadcec3cb1ed1eb1708de4a8a13b4846208ddbe134b546fe0a2deaba019
374,36,70.0,45.0,18,2,14,b007545ba048d7370cd77d6784fe79333ed9a5e4ec93095cfc4611ffec85e14d
375,36,70.0,45.0,18,2,15,3b6fd55cc073b8c395fa0a986765dca866a0b9f37d2e6a9493fff0a599819a6d
376,36,70.0,45.0,18,2,16,f252b46d5ea9e839d9608388c076bf19afc05a1bb8c47ac445d8e56f2033f5b3
377,36,70.0,45.0,18,3,17,c08991ba4aeee372a39286b17816f2897ea83261714b119ef170c044d62f282e
378,36,70.0,45.0,18,3,18,51292d57fad3542eede9903465997091d73fe2f8d1594983045898cb944bf856
379,36,70.0,45.0,18,3,19,5ef99ce242c18aecafaf0521136b587a2e07e53bb3ecda63cdda5b5cb0a7dfc2
380,36,70.0,45.0,18,3,20,39a1710feadb8e9dcbf8baa40097ecb057ca7531d6c36fed7cf16dbb6313abc8
381,36,70.0,45.0,18,3,21,b1aaad87660e354e1b3b3e9d09e304a9bc432718eb6d0a50baa14b2b4bb86d7c
382,36,70.0,45.0,18,3,22,240100aa3231f8a541262fa0cfd293155a5ad3b5f4b2021043358a9bfd62ec82
383,36,70.0,45.0,18,3,23,45bf0336b31bb1cbd9a3f1fb1db5b1c70ca53435ff5918b3c294b260592dcfa9
384,36,70.0,45.0,18,3,24,1d15ba55c5b86a7ab4da7e54df7d45e6140e65fa480636f479345a395f106706
385,36,70.0,45.0,18,4,25,3d131abe0a04ec00c910910457db26912eb6da65ab2ded4a8dcd85f50c39d74d
386,36,70.0,45.0,18,4,26,2ea5604f9a1de87281e601aa4cad3eb204d14541b0378c434c17bc3c8cfc5224
387,36,70.0,45.0,18,4,27,08dbd66a78cffe4476a127812e0dcdcd23f2d2367f825e6cdaf0467c1e24be91
388,36,70.0,45.0,18,4,28,1db71534b5ab5b9be43a28a1473f6bac397e9a1c4e91da08757bca0dfea307d5
389,36,70.0,45.0,18,4,29,92cd303c25e937f12b0b72b49c438592b5df3fa5e68753255bc3efb7814e02a9
390,36,70.0,45.0,18,4,30,e7069dff3d15b7dc500518c63253829bea689e7007aa42c8d193fcef9cea0a27
391,36,70.0,45.0,18,4,31,ba16f6cb59658b195c62f168c185e51f61cf77f459964b7d2bff160098d8fc1a
392,36,70.0,45.0,18,4,32,685f9f7771fe3c57b4dba73b431f67b2360f14aad3903fe5ea5c6c7c90aaf219
393,36,70.0,45.0,18,5,33,078e7329cc9d8ab5e8a04c33cfd25e31e11c6398ad972ba9c2f1e937f30faa01
394,36,70.0,45.0,18,5,34,609770166e0f8fa215d7c48dda770ad80a7dfad3c7c21e4f248f2c3e2ca43921
395,36,70.0,45.0,18,5,35,e0cdd5fbcd71f3d2721e98bce0e409a2e7a21f7bb7a812bcced038e8fcd76875
396,36,70.0,45.0,18,5,36,6fab79daf7b577a3b66e5bf71af9e69097030a941493090d051ae8ed95b92fe3
397,36,70.0,45.0,18,5,37,570a1818d1042ce8d22a1d8eca32238c44a2add9cb9f7160a5d8786b5e3389a7
398,36,70.0,45.0,18,5,38,486af276f074edd1e510cff98c149cc3bed75f6201ed15af106b1d70538c8ead
399,36,70.0,45.0,18,5,39,4b0cb53f9e8c92f096039879ba33330291f7177aefa6361771765e2672542cdd
400,36,70.0,45.0,18,5,40,5ccc68842219cf8674d34567bec70fdd069657e1c14c6d0fe63f43b2256b1685
401,36,70.0,60.0,18,1,1,59556f1d703fddcb5f8a1c71d25ee4d4595b179eb665ee8c1b02657261784502
402,36,70.0,60.0,18,1,2,426ece1170fa546a95f61ac09efd4b0dc13e33b7313e9010da37359083e20a51
403,36,70.0,60.0,18,1,3,a51d6c41add78d6bc8a88bcb0e81c5e8d6562f18867c06369a06a42bf381bf22
404,36,70.0,60.0,18,1,4,2428f29a94da709bc5283d51e58b2545206ff7b5ba53068e3214eaba60e4cd20
405,36,70.0,60.0,18,1,5,927d2e685a7019ea6cf4c276409630f41e26b7ec372a8804932cdaa31197d36c
406,36,70.0,60.0,18,1,6,6e65f7d7bf87e80885b13836b31761073b624187a72d9dd847530aaa5e0507c4
407,36,70.0,60.0,18,1,7,d6d18363ca745b297a55389b5f6a307c1565f05e75ae1cfc7872da9c4e6f3ad2
408,36,70.0,60.0,18,1,8,e00346a2e9d2282b25d48bfd490f30a1a32bcef781166766dbabd3229d878f7f
409,36,70.0,60.0,18,2,9,eb0232090637255e7c10f916ebd004568517100415736bf0635dee3e1ec77275
410,36,70.0,60.0,18,2,10,c62959eda7ae13c322d5f0aa01165e28bbde857314cbb36385eddd28654f29a4
411,36,70.0,60.0,18,2,11,8c26eead5cebc6005db15087b1641e11faae3ff6bf8f44509721f44ef180e409
412,36,70.0,60.0,18,2,12,bd0d6051d364faad95a40b8f9e0a1f80f0487c81a86f20e77f9e83d60e706fed
413,36,70.0,60.0,18,2,13,f6120712487bf8f52fd318b0e2cad4f0a6d6ebdbea894f020a8ca372f4655048
414,36,70.0,60.0,18,2,14,e0357cccfdbb2a2269aafa7432f94aa47ca1e08d54d264cfb3d6ced160b37e0f
415,36,70.0,60.0,18,2,15,476a58d88d2564f1feb9adfd80bf0ec14bbfd1c30d6fe766144b2c73d3bc4b43
416,36,70.0,60.0,18,2,16,389dbdbdbf866051f10fcc194f32e30854dc594931d7e776db9654dafd2b292c
417,36,70.0,60.0,18,3,17,37426fa1abc1aa3abf8998063a6f3bddd90317c135f79104dcdebad6f4fafe3b
418,36,70.0,60.0,18,3,18,277fe6d1af382056dce00c8f739bd7a1c333875bf50818ca9816f1dbcaa89c95
419,36,70.0,60.0,18,3,19,a8c4ea3e18e6db9732d289efb0c89482e932782da197f3f98380248efdde5051
420,36,70.0,60.0,18,3,20,b1c709f70c837662400dd227560818ec0857a412c535f54cb0be453a2ac98e48
421,36,70.0,60.0,18,3,21,bf7f62fff9901aa29d1566d259387c43db47fa0c0e996c8cd84f7dbf599ef675
422,36,70.0,60.0,18,3,22,a650f017d73d0d941f32eb9f5fc5920f6e4ced2545dfa9b475e38d4a28a26064
423,36,70.0,60.0,18,3,23,c78e38013feae848812fe5d535222a40c362254ddc7466664600e929308d3615
424,36,70.0,60.0,18,3,24,7435517f36cfb6b418649d724700595cfc6575bc9f30cb00468f08ebdfa5f584
425,36,70.0,60.0,18,4,25,e45ce43099b5a3684be30da793c0546e4e9b835507f48a1a8ffe7cd9ba9d2a82
426,36,70.0,60.0,18,4,26,afff03742f32f3311f643c90d5d7e275b75520159795ee72c13ad7e2c2feeb1e
427,36,70.0,60.0,18,4,27,79a34268153dff806709e4f551a8ffd066c31434f777e0fb1b8b98a709b05209
428,36,70.0,60.0,18,4,28,fa4e38b63991cb480996afa4da6b505958ce450d130936978e19f9f64d1823c6
429,36,70.0,60.0,18,4,29,0d45ff5f8457f995f3382c2f63a973c106172c6aa8606d931616c5e0930a656c
430,36,70.0,60.0,18,4,30,ddd5e0548dfb65b87a851065ba0709e5f957eb9aa9ddd666cde7bb870a859381
431,36,70.0,60.0,18,4,31,f20f69f00a4f5da57899a635fa37bce745e563021781b977a1e9d85a00ce2f68
432,36,70.0,60.0,18,4,32,5e1b05884fdb80b01dcc3dffad8724e8d39508c034b802e0324f31d60947dcab
433,36,70.0,60.0,18,5,33,6b346c80baae6ca31d8fc7f55e8de79caba9798aa18776f9b17d5f7b157847cc
434,36,70.0,60.0,18,5,34,85b8adad69f613a3c1b3c7ef082779aedae77aff6fcdac451202c1c0d647a969
435,36,70.0,60.0,18,5,35,9c2051002fb3df434a1c2eadf330d72b99422fe54335e5acea077fbe87f5e359
436,36,70.0,60.0,18,5,36,155fc6483e6aefc55fdac5aea3b35f8039ed651b87baa16d6eaba849ca4bcb88
437,36,70.0,60.0,18,5,37,758a1066b24c29431b2506c4d864390dc2a784ca6fd528f91fe76671497b17c8
438,36,70.0,60.0,18,5,38,2c577d9a10ab8e2e0cc8c5603f00cd4a01072a7140891d6cd3377e3aa1160b8f
439,36,70.0,60.0,18,5,39,ad2f4c8035f9c13344865dce3464e4cea1f707e685ea369e3fbb52615ea1e891
440,36,70.0,60.0,18,5,40,943eaf488358adee1fbbce74d37a32108fbf91152d18289adbb31a544b2b72f8
441,36,70.0,75.0,18,1,1,cbdb94a442ebbe1811336a23251c858df1b9c10c3e9cc1bcc185ef1d69a96f26
442,36,70.0,75.0,18,1,2,2adede935dee4e6d0923c81cddcf4f66f149ab5309423a5f105beab11a4403ed
443,36,70.0,75.0,18,1,3,5a86b62d31c3a622a1d80f0159e910691223b2bd847421c3375ffb6583e3db87
444,36,70.0,75.0,18,1,4,871cbc1da5c4aed1f7f4895c36f01e9748d1985aba09907f30b76f87b30b8ffa
445,36,70.0,75.0,18,1,5,bd599b099bd4fcb6f9f606c1163069493c0c1ed8ab6a9b9a010093a57a05d9ef
446,36,70.0,75.0,18,1,6,ffc46f27f15b187762ba79cfe2a56423a18d7d23c07d9aabed8ce5bd234e4b50
447,36,70.0,75.0,18,1,7,8179fe9929c6b490867e63224a8e3035e99cb19626e50663b831f189480f658a
448,36,70.0,75.0,18,1,8,5c8ae45528b474d156aa1eb25d76ef08129650371487cc8761ac6da8cf72ad7d
449,36,70.0,75.0,18,2,9,7e302b09ffc14a100aa64b1e8622f47c34a6a1c8824ee890e0140606b6aa0685
450,36,70.0,75.0,18,2,10,0a50e1d616bf34e19361be6019e6a8e61d2121c1143033b7e9e3aca88233fa38
451,36,70.0,75.0,18,2,11,fa4076eadcc3940656ade8ed3ebbc576fff8bd3258a9ed09598e29d6620d7523
452,36,70.0,75.0,18,2,12,02565efdaa65c729c43a39170621e40c13fade1eddaf1e8c2f179f3c0b953f00
453,36,70.0,75.0,18,2,13,0dfa686c8a4d1893e73b1295b0a97e41d991b4c6cb24078b798c1125ac29393f
454,36,70.0,75.0,18,2,14,4b0f2feaba7bce3714d18b21ac0a7acfec0fc40442305024b58727bc023f5478
455,36,70.0,75.0,18,2,15,1891ebdb12795a6c16c9a9a01ce70c30a9aa8189008a76ece314b72ab9ec0bef
456,36,70.0,75.0,18,2,16,503de3fbd61a7f105c004bafc3c8031ec25085700350aea0d4ebb7a7f59a2efb
457,36,70.0,75.0,18,3,17,fb9947deb1cbe460ff516d4a70c5206b6cb3d8f85b10afd546e15a349fa3687b
458,36,70.0,75.0,18,3,18,a154c6de2f30e55e90f6cbdceca8d98b8c4a6b5cafe7b44670bca7940a0f9ad4
459,36,70.0,75.0,18,3,19,488896d297d3c30c8000d4892034e2f329b1ea6ec9b6b87b3c334f3671e56f0d
460,36,70.0,75.0,18,3,20,181b0b336afee7dde0fe7da0c65251d9dc3ff578732996afc7a60c327b26b588
461,36,70.0,75.0,18,3,21,8fbaa88be619d9b7cc978c66e9cbe11294ffd4bd6cdf4caec457e3f421996ef1
462,36,70.0,75.0,18,3,22,cf25734625017c7611e0c85e1edd1d848082bcbbd43417d1526ddc5673452ea2
463,36,70.0,75.0,18,3,23,19df81a8447381e1f1c6d309b6493cc89014be57f1555c1057a4733e4e66d62f
464,36,70.0,75.0,18,3,24,4f95b97067999cf7b849901ab18533458c77a848537185940a3260440c59d116
465,36,70.0,75.0,18,4,25,da2d293f8a3b0ce203db9778e6e5745890c449efb42e92439487f39f6bb27641
466,36,70.0,75.0,18,4,26,411ad85bf3adeb87a541a71d701e8822305e3e519674adcdf208c1de5c237e30
467,36,70.0,75.0,18,4,27,af93b94e08c9bd11255c15d8346605eca4aff3a32f3024e67663afb9eeabe173
468,36,70.0,75.0,18,4,28,62d0542e49815c47c5a53c2c4d7cad459078ab54573ecfc869f79f350f7f97b8
469,36,70.0,75.0,18,4,29,cf6952469055380c4a12acc28fa8974abdf0aa8f7ed938e3d1ddeb93b951d693
470,36,70.0,75.0,18,4,30,ba2d4c7f9dce175301b0013f46071d99f6c32d11cc16d9825ed7b071e4f19574
471,36,70.0,75.0,18,4,31,0ac77a3c9e9b5cd41327473309353dbdfa796fe5ca1ca33f3d4d7e6ed045fc09
472,36,70.0,75.0,18,4,32,f567f0537c8f246096b9506f456ffd2f84990b55defb8aff2f5c6fc4ab453e2f
473,36,70.0,75.0,18,5,33,a9ebf4a296f3dda9f9834a49d875e39b0a8b287a576b3264339bb6e33d5aaf1e
474,36,70.0,75.0,18,5,34,38d3cee2239fd7989df57c0de715a66dd8b52c20d7c8da2ae51d736c24930312
475,36,70.0,75.0,18,5,35,d2f631dd8e4b475c964467689df19b2bf2bc7e52fffb4a7199ab22f7c38fdd43
476,36,70.0,75.0,18,5,36,869e3d78321ec4f5f4267419e1cbf7887bcd4278c7549a4ffd7d33aea75d8a4a
477,36,70.0,75.0,18,5,37,0ca6421defbadfe953df8f9c795136509355b690168765a8598bbdb493a4ad3a
478,36,70.0,75.0,18,5,38,8a41fe6bf62e6c3accd6fe16e1e72d83a29b80625ddeaec6332fd3467de072a1
479,36,70.0,75.0,18,5,39,b50a53b7b5cd03395c5a61abbbc85d707a4e4a01071f2cdf7481abc07f6cdfc8
480,36,70.0,75.0,18,5,40,766e86b06f6d288dd6c002993eab57c8a2fed9f857c5be949d074b43994e3cea
481,48,70.0,30.0,18,1,1,27d8329f039cdabcfc5f6281b636c8cd018bfb60595eb345e16f09d2dbb119d6
482,48,70.0,30.0,18,1,2,12ab023a461edcd6d12c7bfddc011e043dc7ad9650972276c1c95d7d78581ae1
483,48,70.0,30.0,18,1,3,45bdbbc203337583539d3cf6f46bf3b625b7edd9c5e5f926ce90c7531393f87f
484,48,70.0,30.0,18,1,4,f47542a1e0039626dea277f3e62bd6924c04c08568402c43bd66eceda5293436
485,48,70.0,30.0,18,1,5,74b17ffd53440f03c21fdd9fae488761e27a8bf86439b8243de5a0ee4bc4bd21
486,48,70.0,30.0,18,1,6,daea4d146f02319e4fcebc6acb7e0f6003fcf4877586336dbca14eab74b7c95d
487,48,70.0,30.0,18,1,7,99be31852af92e57094ac48a25b352e5a072e20d6cb94cfbe6786465701bb618
488,48,70.0,30.0,18,1,8,0dfe1b919acc1d7b2a664f167b4b3adad03cb71c9a13c74279015efc3fd3a8e3
489,48,70.0,30.0,18,2,9,7b6d7af9764f95b0816d3fdff37f004a64a4508e0e23a509937135448a6cfa21
490,48,70.0,30.0,18,2,10,c7f829298a810640fee4a11e99554154cc322b3df6bf25a84c36e9ab1af72451
491,48,70.0,30.0,18,2,11,b68e70b12a4ceef60f4549824b9722220b84d2ca1ce6f3f7af3298eba40c3a9a
492,48,70.0,30.0,18,2,12,3107131465c9226abba826486d8150373031ef892c9a1a9031af27ecc35d1022
493,48,70.0,30.0,18,2,13,e67a6c82d42e93704333d04ba142bc41feb2b14362a764b2a7029ce52e1d2019
494,48,70.0,30.0,18,2,14,c9e165dcbef105d63c6e2cd4b3984865d996f7288c3d7b3269472e3a74c41674
495,48,70.0,30.0,18,2,15,7384b3b5fd16a62d9e9123e5659bc4a652f0ab1d8dfc9a3514bf3dd28a46e512
496,48,70.0,30.0,18,2,16,bfe0d63737cdf81c79b719a46825b1543609ff14e40b7b45785bbb5fe001da4d
497,48,70.0,30.0,18,3,17,0fc5e16fa554e7068aa421b1a201ea014119a2053116c35129fb7a8e22b9acc5
498,48,70.0,30.0,18,3,18,4ed0eb899a8e900bd1d06ce0b598ad4a27ef0ed50eeb525b69481cfa14a0cfc3
499,48,70.0,30.0,18,3,19,909cf9421daaedd5a68ecb06fd420de9463bb41f46e248836d67745ab14e532f
500,48,70.0,30.0,18,3,20,779d615d724509ffc54febcc893a9f5842598d9fa212ee639971ec7987340790
501,48,70.0,30.0,18,3,21,19eb8bd64642bd98a720cb2498eaf120ad1d73cb6b5f35f9039bd67087d039ce
502,48,70.0,30.0,18,3,22,11d5ccdf85e742c4893e03b329280fc21a33ae15d0a0f904190a93ee7071cd55
503,48,70.0,30.0,18,3,23,e16f401cda2153b4d43a848460fb26f09ed71406d53843fda0b518d2b5a66ff6
504,48,70.0,30.0,18,3,24,bd360e916fd72d5ad8d9aa6c31086fbc388c4173fdb3c7eb5c36c2cc388d5687
505,48,70.0,30.0,18,4,25,a510b750651f0771d56ce3afa4e48054faea3af118fad992d4a146c1ac677d8f
506,48,70.0,30.0,18,4,26,87b2b574ac4d7a3ee4688041f62be03bd606efceb79a7f904378408671facd21
507,48,70.0,30.0,18,4,27,0d7562d412a86d827c6e93e78f2dd558c1dadff171b3288a345934dd88954c29
508,48,70.0,30.0,18,4,28,94d508d6ac96f4327bbbd6b8612de8af93c5e7ff893b2c89823ddc2ec1694121
509,48,70.0,30.0,18,4,29,943d617fad9592957ed4bdaa41ac61fd4bbc18dd4a0be5618c2bae3d802ec945
510,48,70.0,30.0,18,4,30,2d3ddcbbc5be4797b7cf838f0e45094e1d9466841d7bfb6762ad86744486b346
511,48,70.0,30.0,18,4,31,2ecd23ed12b7322e7a1cebff4ec4665eb27c520d7047e94ca2057cc7d7b49ee4
512,48,70.0,30.0,18,4,32,d627c1780c913818ee306db6802c54a6363134112a1c51b8433d51519bd2e14c
513,48,70.0,30.0,18,5,33,f9e74db5ec5de0fe84af23d33d8478241ec845af6c21d4d51eb391767ad2f390
514,48,70.0,30.0,18,5,34,9d4edf435b5f0a94dc4b9bc33d4cb2630040f5a599aed997491ce9889724027a
515,48,70.0,30.0,18,5,35,b7dce0ed8b03dbf46a0b856f64921a4fad27cf2b4be2d2db883fe231ff32af7e
516,48,70.0,30.0,18,5,36,9e465575568d143a304ca79f4b40f31be4884ec945ae144edd5a408fd9c5399d
517,48,70.0,30.0,18,5,37,dbea1196e25801630c1af9cfd6118bc81f351ffa4f99deb477ff61e3d9349326
518,48,70.0,30.0,18,5,38,798b60fe4dad377188d675619f370d720131e92cedde64f213fef618972fdf1d
519,48,70.0,30.0,18,5,39,d02068a37fcc9b79704fc641a8a40d8d2f7d4090db599ea170f48d5d74e833aa
520,48,70.0,30.0,18,5,40,ca3d1770d3b48dd74de5566fb64945d30dafdbe6d9eb5841beef7d56f87450ca
521,48,70.0,45.0,18,1,1,fdb3487b7434eb0138b6324879dc4737103b045b991b6ab9c743e2a238a47fa7
522,48,70.0,45.0,18,1,2,76f306624883378b076a723f05d75b312b1587bb9763b2d38e9437bc233e09db
523,48,70.0,45.0,18,1,3,82b95b712c14837072ebeec08bd718f9e16a07fdb0e6a5f9a52e43981ac9b3ff
524,48,70.0,45.0,18,1,4,8fef05e43882aecb8a2b33fe65086a5c5e5b196b5e029629dca955578c5b94cd
525,48,70.0,45.0,18,1,5,101b2ada5f7e635e8d12e0182a3914d2377c8c0399868ff20590118d7c7701d7
526,48,70.0,45.0,18,1,6,c7643722b54d6727cbbd7f6d6cd65f813359157afad9aff9e20620c8afa3883b
527,48,70.0,45.0,18,1,7,75b5197a696aa42ff7c15879c466fb818a1503743e966d10af24f8a033db19c9
528,48,70.0,45.0,18,1,8,89da1a2850431d5d04b642ebc42944385983e82c3def60c3c91aac514bc08b20
529,48,70.0,45.0,18,2,9,da127497bd8271e93a6987943654b319c4639bf45d473b148c0ea7474f8aa0dc
530,48,70.0,45.0,18,2,10,51fae85dfb7ac6a64570a1064466c47d984b999fb6ed89a9bda7c8b7533f456c
531,48,70.0,45.0,18,2,11,693b1858f99b72e9ed19967b95cc5b521cbb1bf56dd7c0eb275ec02bbc5bbe3e
532,48,70.0,45.0,18,2,12,b78b22f5c02d2bac593712ca5199a105b8b8dbf186eecbd0e9bfc282c05d5c59
533,48,70.0,45.0,18,2,13,8e53614a26a438f4d02a5f86843a121869be5ea1b8a150e1a02419be3aa1b073
534,48,70.0,45.0,18,2,14,fd3d73cdfa59b373811410a2101cd5fdd52284a6f71ab4631b7b9241b3180e37
535,48,70.0,45.0,18,2,15,1834fcebd0047bdf2054b8390e6554fcd5496ce0592b054b48f2e5ccbc388296
536,48,70.0,45.0,18,2,16,36997f218b0701a44064e675d227b4dae9ad64e006fae9a28a95f561f9aed635
537,48,70.0,45.0,18,3,17,c02b7aea11257a2e1134206a60407f06366d3ce83ad11c28e46ea1fa5b7244e0
538,48,70.0,45.0,18,3,18,d5e9b36bf678817fd8bcb44229b1367bb9cd600d1501c60e755500737e6ddfbe
539,48,70.0,45.0,18,3,19,f950f88a85be4dd9ca45b3523dce9b22f1d167aec81b186af27f1ca1b3b51b0c
540,48,70.0,45.0,18,3,20,84cfdcd42339f0329146e81306660ed9f7708f3d994a4639a7ec7765252877ed
541,48,70.0,45.0,18,3,21,151740928ac89137ac7614ac46609bee50b1d5ad19e7c0fa193c63cd73e708a9
542,48,70.0,45.0,18,3,22,3a6f57df920074fa590f6c88dd308feed2cafa88b1368f9b6306572fed8bfbac
543,48,70.0,45.0,18,3,23,e8318128b9a8739be41c844c0fe35e1e4e5273618987b01f4da01cf8b507aac2
544,48,70.0,45.0,18,3,24,6cda1df59a63787f68bb7e2f2d99571c3d07353c273c3055ab8513b040313a7d
545,48,70.0,45.0,18,4,25,a9b979ff0a4993fc4ca13632b6e90e1bc6369517c8bc0db990a7225dae28b290
546,48,70.0,45.0,18,4,26,156bc234c893a6ffbc4ba909989ce6e2aaf0f5ce5e22e68b2b64b3902b0f67bd
547,48,70.0,45.0,18,4,27,dc906a624a722b32ec3895507640995a7a3f3120eab88f531dc45a75ce520bde
548,48,70.0,45.0,18,4,28,c30d6e29017babfab8c43b0a569b8a0c7116421cd11b3fdccca405dc65c840a8
549,48,70.0,45.0,18,4,29,886ba3f2b36db2a4197f053853ee017dc157dc2376af9bd6f731e670cf0e1a0d
550,48,70.0,45.0,18,4,30,b694aa09b11c80f5e66de1254868e47a68df33764958b1b35f63f2fb572f1cf5
551,48,70.0,45.0,18,4,31,d8e7e77885c7d420bdc1e4c3719aa16403aceeb9a4eb0d24a6110b538594b9ef
552,48,70.0,45.0,18,4,32,02480b50db7b4a2328578ac9b286765a0d92958b035302b37257c210b7c6b387
553,48,70.0,45.0,18,5,33,ad6fa7e966a5ef112c44798139024b7e597b98cb3587dea0732cafdcebfd9ca6
554,48,70.0,45.0,18,5,34,60c587b10c78db341ed95c7582dd12214203e8e335eb4f14f05da85f04b7cbda
555,48,70.0,45.0,18,5,35,0d766c5e81b82c6eca4e9ff2387646768684c2d7feb598de8dff4f500e054e7b
556,48,70.0,45.0,18,5,36,96794dfe4c82360cf2599cbfd2ae7641e9d2f46303ed9202c5dbd547d0b182e7
557,48,70.0,45.0,18,5,37,4344536b72242f835c2e61550f8de75f9b59df659ea581f176cb905c1b940db3
558,48,70.0,45.0,18,5,38,c2d3eec68b48572700a6ef2a24a2d181950b3ecdaeabf2b6795558fb8b8de06e
559,48,70.0,45.0,18,5,39,875de8f891f5505c2ccecf75315ff191d06fedbecec2ea8a51b5cdf9f753354c
560,48,70.0,45.0,18,5,40,885c2b49f512cef34f86fcc1de068493f0bf49c1a87de690416fb4eecb99b707
561,48,70.0,60.0,18,1,1,5aecf69197e1e33b9442a101c691a6db0510903afabc367364f3be1c036521b0
562,48,70.0,60.0,18,1,2,d0a17decf07cfdfeefc6b7ee1af2aa3896df83d451386f87133beb0967138919
563,48,70.0,60.0,18,1,3,07938fc3d8068ff88936bc2a85df783441a162d2af5786275efc4e6e2fa1c6b2
564,48,70.0,60.0,18,1,4,e4e2d6356c381ca31f61b30a3c686dc4b82b265f46b23dddbdb59abf5ca24ba2
565,48,70.0,60.0,18,1,5,519e9912cf011b521c519bf10590bca9886c0f395c8d863005d97cd271016f36
566,48,70.0,60.0,18,1,6,992d7dc67cef51403d39f331214711076c3f4e9cfe5ee91dc6bab53def0ce854
567,48,70.0,60.0,18,1,7,7e8e7ec4113c45d3450f7558135fe7b8fc8cfb2f6fba824b981657c01c43479a
568,48,70.0,60.0,18,1,8,41837dc7fdafb0a8cc14c3cd01049b7d6971c6b51fd3572aaf6dbdf52720dabf
569,48,70.0,60.0,18,2,9,0e101872b33c4351e2ae5ac0c7137180ce8123a78471888fb980f9497e14da30
570,48,70.0,60.0,18,2,10,9b88755ff7599e6be2c3170e760518ae74b803bbdf73dca3410501c9099e4c49
571,48,70.0,60.0,18,2,11,d7d801d3a57c030bf1d6b57b9f2401886d7721ef3abc865cca4e4f30ab69e45d
572,48,70.0,60.0,18,2,12,5467574ee705a9dfbf995d508cc450381732d20ac42350840f9c6961e9d60552
573,48,70.0,60.0,18,2,13,1ac9202e4ddefdb3634a3ef4ea7e064f940d6411da12a1de8f630a10ccb97957
574,48,70.0,60.0,18,2,14,fa997711a93dbb4308f43f765679214d65876e8cf8e44c08ed583f122d6e1f4a
575,48,70.0,60.0,18,2,15,f42be1a73bef593b4ebba74325532698d5b2484aaefdd5dc510c0c50086c648c
576,48,70.0,60.0,18,2,16,3dc7863ff18efa716c10a8261a40ab06f0436366fb4a07b3da849bffbba647df
577,48,70.0,60.0,18,3,17,57e1d742d9e9b6fbb9cfa2e42a6113ff5ab76339471c12be64c6ff6132f60799
578,48,70.0,60.0,18,3,18,33ef429d7e992b09b4dc00bc40219ed624b8b2cb49e67d9fa732df38126e6264
579,48,70.0,60.0,18,3,19,0a1a587c21884a760b402d3faa45ec5cdc4f7bd70041c6075a22603ecb099ccf
580,48,70.0,60.0,18,3,20,d1c0db8ee4bd603a19106748b605708c12243b6ac7d5a647c17b9cb4df48f5c4
581,48,70.0,60.0,18,3,21,95928a9dab213c3004aa22a4a1bd23f1e9bcb0e11971270ea08d44c52ee2dcdd
582,48,70.0,60.0,18,3,22,57e7c55e7b97774af9571ddf649b1d5be8ab191275968647ae1773ec2703d487
583,48,70.0,60.0,18,3,23,29bd8c05df1409ff8255cd4fc7f7f4ba7fdc338f29b28d44de4babe33c66361c
584,48,70.0,60.0,18,3,24,88399c97b571df7c1cf44f883c18eca23a0945c99326735cb9b6fb413298dc3f
585,48,70.0,60.0,18,4,25,a8752e09cf07ce1c77df7c101085757d68c9cb3c43b65c1f017eafaab3a58f71
586,48,70.0,60.0,18,4,26,95672a1595dcfada6f135029adf5ae871e5908f5276a67b0a55e64737d26d040
587,48,70.0,60.0,18,4,27,464f4ecf26e152033c10e1e4455fd10286836367b72b2385f162e1ecabc20e11
588,48,70.0,60.0,18,4,28,c9b3b8a52e9947530e7473a047c2389f53d585011294e5e07481f2dee141ee60
589,48,70.0,60.0,18,4,29,b9ae2d9fdb21ff72dbd9772fdfa10c2529fb369a7bda0312093adfd4ccebce1b
590,48,70.0,60.0,18,4,30,9fcadd070f6bdc20a0e1ea1b6408ce65715b9c027159bf3648bef3deec38e4b1
591,48,70.0,60.0,18,4,31,53e3f68d0d089fccdee1e73019a3977ba0400a4c44e0d84c1bad698642b6674e
592,48,70.0,60.0,18,4,32,a8b47fc377430f47a40ac05b5f2524b9f2fba4e0c119072e70655d1cd896cd10
593,48,70.0,60.0,18,5,33,b407064677a4b3d39c4d7fc0e1388489bf77f8433b1845675db82545cf040c4f
594,48,70.0,60.0,18,5,34,7bf87a66767aaf2b5d957ad307bea83ae6ea0a824ea540775c9bb552186b8b4f
595,48,70.0,60.0,18,5,35,60b61a56cb7c3cb244a910ad178db885e7663ac82e69cf45842241c8890ce8e0
596,48,70.0,60.0,18,5,36,962223b37334c2959651b7e2ee249f0a78c7dbea11d5bbc9ced17d50865b0a9b
597,48,70.0,60.0,18,5,37,48534935f46f7752354935145509bf6486cd4e50f78d7f31252975bfd7f2c95a
598,48,70.0,60.0,18,5,38,a051c6f325eb8c706ee7d1e1a01e3795d821a46c444ca610d6c34132f0160ec2
599,48,70.0,60.0,18,5,39,1fb0a450f4ee518650b38e798d9e10019f763b38d491ba4253c0e2730ce5b9d8
600,48,70.0,60.0,18,5,40,79f91eb20d3d8532c49db3dca9fab08725b3d7bcf0d109d977f68fe7b87265e0
601,48,70.0,75.0,18,1,1,d7eeaa8f1649a723b7abb9fd1d18f29189d5408fe4fd2624d2938ace3f06b091
602,48,70.0,75.0,18,1,2,b554e60c148e9ef3fa3798d10c21f1b932d23d10963835d58994b04d4b1e5510
603,48,70.0,75.0,18,1,3,e5b0631c281563810f0ee8fc11d7eac0025423dd6425074e06125ba8b2491619
604,48,70.0,75.0,18,1,4,0e43e004635b17bd7634143cfbcb366294058162a0c97183289bc044a4fac3e0
605,48,70.0,75.0,18,1,5,dfe1508f5cad58f4305f1db86ddc91a7e4b1e4a0db0d33ba0cef30ee549eeda0
606,48,70.0,75.0,18,1,6,31fab94cce16f9c7daaf0f7c500e40e777f795c52b8327151e469f9548573d31
607,48,70.0,75.0,18,1,7,c397d6918775152702df1a022e38f2b9e41e69c6531a59e67b12ac4b70da52d8
608,48,70.0,75.0,18,1,8,d906351b3418f817ab7cd335496706bac6fa3643d63ead89fcc88ffbc7f61233
609,48,70.0,75.0,18,2,9,f79805a8003ccdb86bcb728289584d5a9fd680bee488c8f8c3b2c7875c4f099e
610,48,70.0,75.0,18,2,10,62c4230b3d59da9d6609dd9edcdb42aa8e6b30e08af55173c8411473eb6b9661
611,48,70.0,75.0,18,2,11,8f961d4d2a0878f2fe0412cc9fb9a7fe46830f72e1f43fca506a5586cec1ddfd
612,48,70.0,75.0,18,2,12,b6a7b69c7c5d8faeebcf257687941c3f4d89c70bb97cd391c815edd777750075
613,48,70.0,75.0,18,2,13,ae6343e557054da428cc5dc7ecfeebfab665338f4f26290e2635780b6b402ab1
614,48,70.0,75.0,18,2,14,901ea9a740e0c1964a9ccb93bac62611d9054347262db9f35e0e8f60073b9c04
615,48,70.0,75.0,18,2,15,6390643039d6c72aa31031284c6392718c4d0a3505dd2feb7d50b3514e969324
616,48,70.0,75.0,18,2,16,992e704651033042c621dc2c4d0c0c7bbab29da19b09ca2b100d03ff43328082
617,48,70.0,75.0,18,3,17,051806f2094a9b2c27672333b6aa61c743c4b61ed1039f255bed0e3e487ed08c
618,48,70.0,75.0,18,3,18,fec4601a13da68c62ce84b0811ad7799724a19b291205959085b2a707b9f9967
619,48,70.0,75.0,18,3,19,1f079f880219e1db1c6587608a33cadfa9a86ee2ae6786b58e5af7619e84a63a
620,48,70.0,75.0,18,3,20,01efb153a45e14b2e3111c37e471571dd902a40184dfbeb489d0eb2daf9bd2df
621,48,70.0,75.0,18,3,21,276dbe527dac944b3116c107a549ec4be024205a7c8f33d091e8c0b0e908ac55
622,48,70.0,75.0,18,3,22,9999109cc255669360317338fc26ca7303b73860e264e05c6883629c8b3a9e63
623,48,70.0,75.0,18,3,23,f4f1933d96945e45e75730bf98b6a0f567704d633a19ec45396e18eed0d97118
624,48,70.0,75.0,18,3,24,d91d02458e76ec6afead2f8286e4980a7fb86747852881640d55b9ef5fe86bc4
625,48,70.0,75.0,18,4,25,74c82c57965a3aa51e586392ce74e7c0016f1179f3a14b92e9e1fbc451c1d9e0
626,48,70.0,75.0,18,4,26,f3cda2efaa4a863707e59317b111c3f23b05f00e481a3667ee37c2c9390671b2
627,48,70.0,75.0,18,4,27,fa214e02aa28243e9571e32c5eba2f54c4c52dfc2daaaefc1055095112adb219
628,48,70.0,75.0,18,4,28,2a77501d215e0c583b27bb18573dc6eaf6feee24dd40b6c1a04ecde278a9670f
629,48,70.0,75.0,18,4,29,a9c26bbef3a6d90c6ae166245944c1daca5b74f917376e433df19a774e03d85c
630,48,70.0,75.0,18,4,30,f48ad946b1da1991a06268b5ec46fbcccbf4d197698a316a95244860bece6e05
631,48,70.0,75.0,18,4,31,4d0f0af5ce8387d09f8c01cd9d23d053634e8f1d68b0da268e4ac7f557573b66
632,48,70.0,75.0,18,4,32,eb4da6b66edaf96e0734469ed61e1d9221566df5af745bdab7ae29af241edaff
633,48,70.0,75.0,18,5,33,b7e324fc8da45d0a625bfb6b37febe864ee5204e5c2405206e6dcfc6b9116762
634,48,70.0,75.0,18,5,34,bdc6096adafd26b3fb9d2cddfd783e34ca7adc96a627e3537812d87b52a8cd13
635,48,70.0,75.0,18,5,35,f1c21e07811a248315935c3b6835f6fa1674cece8624a97d971cb675c3c70be3
636,48,70.0,75.0,18,5,36,5c220eda4949fdaa62982d7790d842edb6f3119e9a06dd48d041b73d0f9da7cc
637,48,70.0,75.0,18,5,37,462f3c16ef26aa37eafbc3985f21805cd2fa096f876c6b41e715a9600772dec6
638,48,70.0,75.0,18,5,38,ebfc0258dd701d5ecb9c71c83a015afabc0a0ae07d28da240ef07ad927970fc6
639,48,70.0,75.0,18,5,39,ba6049a5568df0c1eb14cd5cad390264ae33cfffec17b2f6173aa4df2daf5d82
640,48,70.0,75.0,18,5,40,4a7effed25c48e70c06b8d806a90df75a66ebc49854a63c27ffe0bffc7d10d72
641,24,44.0,45.0,18,3,17,6a79be930e3f5d8a6d93d2be2e9d820e25431867246d354a918ba30a1a61e5a1
642,24,44.0,45.0,18,3,18,041665ddd95caa35c195e4b0d3d7ac506935db021bce15754e0d816d839d89b0
643,24,44.0,45.0,18,3,20,a9975d76693becd8b7d7c6774bb7b9c7bf4e15b55c093e1ef046241125b7bb6e
644,24,44.0,45.0,18,3,22,cc7cd460fa197fd4e5496a5074260e4bfd5032b0437f1e63c0bfa6d3eae3158d
645,24,44.0,45.0,18,4,25,31371d08262cbee9b686152ae792f088e09305f352d569f57ec296798074db7e
646,24,44.0,45.0,18,4,26,3b26c9c25d1dea95919368dd8d4e2dc5e6f12b7ca845d06e5b5225f22c56f6b5
647,24,44.0,45.0,18,4,28,30a9f0289ec91e18462faeae6635537258cf35456f75308f57c79412035bb097
648,24,44.0,45.0,18,4,30,a16408879c0a19e785eb648fe2602cb7854d355529a6c0c4e748ebca01161dbb
649,24,44.0,45.0,18,5,33,593f1f6d2fec52ef1a9f879bb4626ddd21acda471d7923c614a62d311eb62fed
650,24,44.0,45.0,18,5,34,090b05ab2226276df7a9c1a57574478a530c68a2c7807cf2263eb6fa2ceb170a
651,24,44.0,45.0,18,5,36,6aafd2a05e60b44bb2c2553981ac0e1b33d593a62b7cce88ed54bb8103777e8b
652,24,44.0,45.0,18,5,38,04d6bf8cb739045eaa4863390fe755201a3b05b220ffc1638e334fac67124207
653,24,44.0,60.0,18,3,17,c7810de3f394e2d0424c36a540bf2e08ea296a7d0de1d54c40d37b805225e058
654,24,44.0,60.0,18,3,18,51baa4bea9570c73447ea7bf2ad1a72cc910106d237686722e79d7e1b7a39286
655,24,44.0,60.0,18,3,20,aadfbceb3cace83e419ead14769d9f25a70700009ad084a389857452758cdad8
656,24,44.0,60.0,18,3,22,0eeb06501b69eb3164f8fef54c9869fa25938091e56b705ec4cf914815bf9304
657,24,44.0,60.0,18,4,25,7f2156fe26dbfe7b195aed243499e6a51f5d9149c0e8a7e68ee99eb29b005bea
658,24,44.0,60.0,18,4,26,828aaa4f0dbd6089d93c2c29c1c1f7583f67c751ae2161498051f277a8dea462
659,24,44.0,60.0,18,4,28,5e638db76211730565d91e25da586b7de873e6627736f73a0ba6a10326c327ea
660,24,44.0,60.0,18,4,30,a6adb87265314d8c7ecf8438b2a33986c9e255d34f4a319dd71f9c6b1779334a
661,24,44.0,60.0,18,5,33,fc602fe01a557f10ae902744eaca1dade6d772743e5f9e988027d6a772935f56
662,24,44.0,60.0,18,5,34,0af47869fdccca86210d78db2d0064e29434d567882fe6085bb905af613f9b8b
663,24,44.0,60.0,18,5,36,09becb0ecc3d26bb4c3b1c323f7b1d0e82b243da756a1a7dfeec120fc7051ebd
664,24,44.0,60.0,18,5,38,86b09bcab0ab86a860f5712f78b32e070d0f376cc28fc9dbe66e6f16dff832b5
665,36,44.0,45.0,18,3,17,010166753add733e0f42a24784b9180b3c44c5a83693dde78a69d4bcf42beb88
666,36,44.0,45.0,18,3,18,fa71ed9d7cf1b4c4f8e224230c383c51badd0fc7b79108090f988446b5ea0b04
667,36,44.0,45.0,18,3,20,66762b2bc2008e9781fc1905fd32879ae2951833fc730868ba0473bf61ce6b6e
668,36,44.0,45.0,18,3,22,cb4a4b67699eb3c77ffd08dc5ffc5bda7e3c9f83e8aa46fc3c029091c174f938
669,36,44.0,45.0,18,4,25,7df1bc88de8d03675c68bb5dd987773a17ca0bd12cb1cda260c07894d137a8b0
670,36,44.0,45.0,18,4,26,932f2b6ec9ef50475bdf0932529c5ea24e42e6af0495535d924209d57918cd76
671,36,44.0,45.0,18,4,28,b4c1730344cbeb8940990f0a70eb7756d2317331c7fad727a131e8603bc87b0f
672,36,44.0,45.0,18,4,30,e0555718e5a0073f331f00bae223af967f7b959a1f7e7d2430a9887c937ded62
673,36,44.0,45.0,18,5,33,afa2830736bb01fec5946980a5775fc4f816d5deba3bda27d2895f727304ab10
674,36,44.0,45.0,18,5,34,ef1e22c7aa7e13786db8b62dff0e3644cf256d42b961e68b8186998f59e4a9db
675,36,44.0,45.0,18,5,36,02fc885f4068090a6a60a30041194304a1cd146c92450f7539c23fbc60eb047d
676,36,44.0,45.0,18,5,38,0f1ffd4d5824dabd4ce2749fe59b80f5bad0c277f42cb62e1573fcec606600ae
677,36,44.0,60.0,18,3,17,c8b24333190860f04436ebba9d4318693e5e32f550a87d55e8e2f6ee3d7d3b29
678,36,44.0,60.0,18,3,18,b87b0b9049921f06a99f4c511fc47e666a7d3fa29a34717fb446af0d2a8a29c6
679,36,44.0,60.0,18,3,20,dde07435d98036b2dc2eae7dadd07c68626e024144fdfd521723620c128f4715
680,36,44.0,60.0,18,3,22,0f1bcdfde7d7cd7a5a216a316e26382f77bd5c71078053b86c79eea4fd15e549
681,36,44.0,60.0,18,4,25,db4863de7147f9d3da0a12abee21e1c35c680e73ef71475558644f8816a2526c
682,36,44.0,60.0,18,4,26,0f10a86f6a56994edd021ba0da3fcdf744897561620f01ab3958969711ca3cf4
683,36,44.0,60.0,18,4,28,6fa723df1865d6129bf3cdbf2c4c6b8104987e28b8c2e9eda09dfb0d9f8416e7
684,36,44.0,60.0,18,4,30,3e03042ad17164c54e249d54cd684da6a37c32a0f58a312740d027e624683648
685,36,44.0,60.0,18,5,33,3c0f6be7bc618e40282a742e167078dcf1ba1168779124383c0f03a1d6fc7ae1
686,36,44.0,60.0,18,5,34,91a0572ff7b4bfb3c5e240ef446df0c46028ea6aed00ed08806135f1b5b55e03
687,36,44.0,60.0,18,5,36,0c6456c42defdcfef38ea81ae0aaaf32b46e82ba2b73ee34c4441d2937b5c71a
688,36,44.0,60.0,18,5,38,00f12f2f7038c6474ebc21ecf0176da8346c09542b386994f5537bfb5a5241fd
689,24,70.0,45.0,18,3,17,1cfd563b5e2e33af0c55818030f9ef8023ae864074826504ccc8d4efb44edc6c
690,24,70.0,45.0,18,3,18,912cf12be7c1b13ae1e3b3d9fabb6e847e7caa8f47c6c158d6372e0047cc76ae
691,24,70.0,45.0,18,3,20,58d4db45757ea9f2ab4b378967ea503097d00caab46865b28895bf054f206019
692,24,70.0,45.0,18,3,22,e85811a08abd2173773f27eb75b2b281cd7436fe4ed6af6117a2bee52c433f02
693,24,70.0,45.0,18,4,25,f6bcc6d49e26f96ae115da5eb5f8be819d7c1873e571b02d10293a5fa96b9eda
694,24,70.0,45.0,18,4,26,6696ce43d9813043b6ed25a3c6f8ada639a573650203bddf2d6a7bd5866e816b
695,24,70.0,45.0,18,4,28,9ec5c6b2f4b2c51f73bf9d1da4c58b98a22b925f8264472012e98283ac580c32
696,24,70.0,45.0,18,4,30,b3879bef42e67927c90a6530a14227f2248499338d2fe4b5737647c6ed4127d2
697,24,70.0,45.0,18,5,33,0820931b889af1fed61edda568e0c39dd7c2d69b47fa6c4b458e003a366574ad
698,24,70.0,45.0,18,5,34,0607faab6f826f1d4a7b87c0a434d46522f7ee34f2c8c48370260fcefa086156
699,24,70.0,45.0,18,5,36,94ee0eb797e700549a8cdacb2fed466faa9585b3d949e1536b69a31a2380bf3f
700,24,86.0,45.0,18,3,17,3466c4797ba730ea6432879dfcf62eb17ae89c816fc4bb1041cd19fc5497bf60
701,24,86.0,45.0,18,3,18,4bb2c0bd0e237dbb94dd310ab9602f6e6f52d12535913f982fc859df6396fb27
702,24,86.0,45.0,18,3,20,1e6951011b49b7ee53c2774b68d832ff5f92ba289d026ef1ed3b4a149ef33e8e
703,24,86.0,45.0,18,3,22,5302a1ca6138f0fba4f1de2b61bae7c89276aaaef547c8e1aca3034cd54ea499
704,24,86.0,45.0,18,4,25,da60c80f3fd92eadb037e67f7de7b3e6fd1517002dd54389bd8ce9ab7e11ee50
705,24,86.0,45.0,18,4,26,ffefd32bae330ad1ce73c97c3a209bb343eca9fb7dbd408dc3037f805d2a60cf
706,24,86.0,45.0,18,4,28,a36f99c4aefc95569b74a90dd9c202cc46e2a386bcb6f9c4c09db2b899704ae4
707,24,86.0,45.0,18,4,30,cd2468d7debc9df8a633d5220adb31ef792ebabba5947653bb4c6486a8a42afa
708,24,86.0,45.0,18,5,33,28c0be32cf3b0780bcbbd82c23a7823b67da0d41fda3717674023cedd7106bb1
709,24,86.0,45.0,18,5,34,ccb0f504f6c8e6167c3b66f3df87186ff47e318137dccada85dd6d5653b2b811
710,24,86.0,45.0,18,5,36,357963d25fff943e44e5658c29c0c5a7afea4a389d5fefd350454f0b88d5ce83
711,24,86.0,45.0,18,5,38,b4ff04d4e525b0a7d5f7345709d894775e4e7ec81cac9d0b08212f9a7797fe84
712,24,86.0,60.0,18,3,17,6717b920253a2445e671c4927c578e83d378331df4a2f3598fdf454512ef5d5c
713,24,86.0,60.0,18,3,18,d7aa97096828d4a73797abc12026caa6f21eb14b3ffc6abcf5459e08b226466a
714,24,86.0,60.0,18,3,20,171b6dca3c9f2709997ffd9aa34050f5c554df8699bb74fe9df382e6a29b55f1
715,24,86.0,60.0,18,3,22,9a70f609d60ca0a2f37f800646feec571a6205b7feaa046b7af244f297368838
716,24,86.0,60.0,18,4,25,7d52c3c05d1237e5873fecd8019e4f0b811042f3eca250d101c0ade0010fdf77
717,24,86.0,60.0,18,4,26,6e1e0c31740c45c7816caed391d0e241706a913137c0a42be69d2daa10ed67fe
718,24,86.0,60.0,18,4,28,396e758392317c8d0b072717d60bd690bc6e2e90fc49c8ae6e8ebcc3ea4f88dd
719,24,86.0,60.0,18,4,30,52c54b0ab187cfd9a0ea312ebe9b5cb4413bd5770c1bb247fb1eb0b02078f0da
720,24,86.0,60.0,18,5,33,eda7332972bafd9d96ec8993fd927b54ef72462d8dbb3ba65ee59e3d74f98ca2
721,24,86.0,60.0,18,5,34,f3314612d9708b66b8db85cfac8f81e250367887a1257ddaf4247d3c0e9ceec0
722,24,86.0,60.0,18,5,36,dc19092aac8aebb1b2eac755b7b4a147d554532cdf2250d88df5319f85d67163
723,24,86.0,60.0,18,5,38,0290dcb05317bfc601904e42fc7fbfc720c0d4c9902b95cf82cbb1f741bbf988
724,36,86.0,45.0,18,3,17,60e363cc403e111353768527f78fa6348c0e6f58e345dc7002f63e14f573c6ce
725,36,86.0,45.0,18,3,18,8af8405f611e0ecf699f1f78cea84c83d981c49d3ce64e9f70647498ffaedff8
726,36,86.0,45.0,18,3,20,9de3bc418f1f668a102efc5147b365389cea4899d1b8f520be529ab1c5ac3e78
727,36,86.0,45.0,18,3,22,73d323bd76aea059ec1f45fbdade579055cc85bd2193aabe2e11ab1a7f810462
728,36,86.0,45.0,18,4,25,82b2666b6ec79d0a0014ceeff04ca2f5000116e6a9e8198834027bfcab78e391
729,36,86.0,45.0,18,4,26,776a73e0f636401018cb4f3a7f0f8dc59c85d29598e20e38bfb12f43fc18f7ad
730,36,86.0,45.0,18,4,28,746c299c320b72d61a65db2c381878d5e4ec59f096271a2e3c701775974d1e45
731,36,86.0,45.0,18,4,30,1c6ffd145b9dc856ead0b8c0c333d47371d6b7c972d877a0ad9325e55d2a2b04
732,36,86.0,45.0,18,5,33,82963adcd890f55ebcf626e1703e948a8ce96f1fbe88e2b97e9e88c8d83de148
733,36,86.0,45.0,18,5,34,ae51e3eccb71bf8f01f7dbba96a02139c9e89f44768b527a31c3368a0e54e7c9
734,36,86.0,45.0,18,5,36,3b01974644dff90aea01db239a16f1954ffbe2c6514de0c0b925a79b0468cbf3
735,36,86.0,45.0,18,5,38,032f7d973235d2d1072ba5c16f5c3b4bad5be676e921d347b4f60e3169a533d4
736,36,86.0,60.0,18,3,17,a054f679964558057bc520be2b68071dc5a3fc7910a3848af3d6d413fdc3c67f
737,36,86.0,60.0,18,3,18,e2a9ff02075f87cd5eb055c38e9cab81dad9cee73ba0632f7c149beefe38a4e6
738,36,86.0,60.0,18,3,20,6bf9467b5da76c7ea09b7884a89a8add220df9f83ca326df36c7e39f4fd09a98
739,36,86.0,60.0,18,3,22,69dbfdbfc722f552b62601661885b5f2d3ce6e92c0a14c92808c8db1be6b6a41
740,36,86.0,60.0,18,4,25,6dd48be935e3a8c2883464b58d3138954c94014f9239c1984df54bcb429090fb
741,36,86.0,60.0,18,4,26,af990978b32d74de9da4108b8122bda97949928812633bec8e7b6bf28a0de8fc
742,36,86.0,60.0,18,4,28,50ad2d2c657d0e884726559ee99e92ac32c34325b6bb70ac51ca6dc0dfc83a26
743,36,86.0,60.0,18,4,30,f896f07c65f43d3404aab817c3b10c519ca0da21642145a63f33647cbb38a3c1
744,36,86.0,60.0,18,5,33,a04a4087252593dde2c491388b5daa5935d4486cc739b43aaa3cb273d133864e
745,36,86.0,60.0,18,5,34,d964ca6044b87624f8566d14e3a3617afa1263a2a5cc56d5f9443989ca3ecec0
746,36,86.0,60.0,18,5,36,7fe359b48229dcea630fc52694b065dd55bb55a3321376b277ebc8751202c578
747,36,86.0,60.0,18,5,38,80d2b7c90243b8af9a9b39bd6bcbd3fb17459f2dc7e3c3aaaea75c08c1da8c89
748,24,107.5,45.0,18,3,17,615ba58b1496d245c78404532cb3526010e9b8844288aa244b0d6d5582928d9e
749,24,107.5,45.0,18,3,18,bd8fb61c5bc30cc0ed46d975739a889b7d9d68b20bdd00691491530470f41bc4
750,24,107.5,45.0,18,3,20,47b53acf38d14b9eb64523f87c51d2a0a23e88e9717ff0280a731c403cabdda8
751,24,107.5,45.0,18,3,22,514f3993bff6744de8cb0ff1e131fea0239a328b6838c58bd6d11f20f4e8bcbc
752,24,107.5,45.0,18,4,25,5795564070f43991d54aa5174f829d019bdda254a2e8717e27b49e311e06de17
753,24,107.5,45.0,18,4,26,147c3718a15d1a6f912315465941a615f0ca2e7d5bbad0b15a26df3439ce8de1
754,24,107.5,45.0,18,4,28,89bf8b352085188f8d2bc7458c7feaa87677a47bdf64cf5776ebdbeb5c47efe0
755,24,107.5,45.0,18,4,30,7b7dec4d95a93d61fc6c79d7549498b5e8e0c9e256f36d9c76ef58271b99b46a
756,24,107.5,45.0,18,5,33,c09e665a2d75f7de564a50309411c392a120a8bab12ad2e5873ea231908cee6a
757,24,107.5,45.0,18,5,34,d867241104df2ec98776511800504a30a907c1b5f7306500e28db2e029c74c2b
758,24,107.5,45.0,18,5,36,137430e0f7a9bb3c8e8f02f00481e2b544133ce876a3fca25bbf8c7b9de261b8
759,24,107.5,45.0,18,5,38,f351a1c0b2f13970191137ba1ce9e643d23985a7f41e85df4f936e62fab27021
760,24,107.5,60.0,18,3,17,201623ebca0cd628d43f27d5fcc28a9c340e4b5072714306e075842163449d99
761,24,107.5,60.0,18,3,18,1f666acab2243bd4d01fe5bfe41506dd15c48047538d7c421b06e41c5404e9a8
762,24,107.5,60.0,18,3,20,e7cf225605058f1dc79feb607c04605d3f56cfe0a7ba6c7de4d1694fdad7c7ab
763,24,107.5,60.0,18,3,22,053473a9036e0e2718e7cfc983858dadc0c35949965ec97ab87fa7bd202c3f47
764,24,107.5,60.0,18,4,25,2eb8a66b1c247b129057b92c1cf7308bbafe74d07ee3fc20317a83a4b1dbd256
765,24,107.5,60.0,18,4,26,44f5f63b6762ffaafe531ae7a86b0d1f45c3d375c88eb213c0578fdfbdd216af
766,24,107.5,60.0,18,4,28,e4a714ca561aa71a1096489418aa69b88ad77256e2e3dd94eb53aab5939b077b
767,24,107.5,60.0,18,4,30,0bf86495d4a5a14886652e1e94f655022e4e722ee181afbb08a7c7b0e3bd5ca3
768,24,107.5,60.0,18,5,33,54465a5a48e18d4f3ddc488c6582050da8d4874244dd5c9226498568b69bc047
769,24,107.5,60.0,18,5,34,73eca2736f76cb5a49f3e52d89a5beb3492cacf2852b71cbda4e780334490114
770,24,107.5,60.0,18,5,36,f2623e2076e686d228b50087f6d8a9265a210baef5ff4b35d431446fc5414704
771,24,107.5,60.0,18,5,38,586d0a221eeed624df740cf44dc2e48b743205599672b18bc1cea7540556640f
772,36,107.5,45.0,18,3,17,8bffbc662238ffa5989a6fd9be2010140936bf31ed0f2a9ceb6b28277a4b30e1
773,36,107.5,45.0,18,3,18,1420888be53046afd9d9baa1949313bd9749be47a62468b5c3b6e7efdcb5374a
774,36,107.5,45.0,18,3,20,ee2ff3a578f8b20987879790a4228324a440225788a4f6f0f63c888340c09cc2
775,36,107.5,45.0,18,3,22,ff09abd844c0877ba6e73c92699c95c95b0dc93cdd35d74f9b7a8bfa07b3d0b7
776,36,107.5,45.0,18,4,25,1845ab46fcf203123e94615396e9b6f63fd12b4d8c16dba5f9b6986ac330e7df
777,36,107.5,45.0,18,4,26,2b0928170c591a6244001a77500713ff30efc02743c481400ce3c3a16d336454
778,36,107.5,45.0,18,4,28,28b0d5e2bb17fa56d38b69f5aa0c3a9fd916233a3e35fe50a12e1e90b16e6833
779,36,107.5,45.0,18,4,30,7a1af44d922730a1a2cf791836d3e4ff4077e6971030c49b3774ae336180fe7e
780,36,107.5,45.0,18,5,33,c3b63fcd67c1237cd345886eacb6c99d902ed73121f6b1a259ec7c129bc7c2e6
781,36,107.5,45.0,18,5,34,cbab5001fe067f4b29f825358c07f7d0e9029e959186ba0a95fa64c3ef159326
782,36,107.5,45.0,18,5,36,36f9127d9e9bb6cb2ede849dbe2f3ea53f247a59a589e2737f41480ee32eb121
783,36,107.5,45.0,18,5,38,2ad205e18f506a4abbed09e6952199948d719d68fb1a2769af9e3ae5515e6084
784,36,107.5,60.0,18,3,17,362cd034d736f5a3c247d36878ee45469eda2b54d38546799ed9bcaf41e1db7b
785,36,107.5,60.0,18,3,18,bbfdd5d8659caf42dd9a370b2d5f0fa01d131241c186cc25a40db3debd1c9791
786,36,107.5,60.0,18,3,20,b46a91da828087a26beeea983806acc749d7bb2b349c4fe44c0b35d5efeeaa1c
787,36,107.5,60.0,18,3,22,40e758568ff0535d62f2b0b12ac374e8efdc6ebb88cd0221deb06e36992bbc5b
788,36,107.5,60.0,18,4,25,6e1901760c146c3af5cca1a188d36cdb32a557a0b3ac67bd168af62d3f160b3f
789,36,107.5,60.0,18,4,26,e56e1d2b1a89bd4646509085ab7f0de77692ecbdef2679fff3454f1cb45c9383
790,36,107.5,60.0,18,4,28,504c51e86ea4f4b9273dae0a1a81a727569416306c2a841261877682a1806400
791,36,107.5,60.0,18,4,30,64c0d2bf29d5dfb707ac62f0ac11e54ddc953b25be9346fe91ff8ee6616e6c95
792,36,107.5,60.0,18,5,33,2be9f82190bb351a0730b17152ab6bb061f6c6357b0d264139ccbfcb3180fbdf
793,36,107.5,60.0,18,5,34,c2353b62182c71be56920ed0848c5dde059faed7ae928febd3d0a1df61dae48c
794,36,107.5,60.0,18,5,36,c9c8c639d9d8ddbb9a881e39f9731f82552ca4c4bbc2d98983c12d666cf650ae
795,36,107.5,60.0,18,5,38,2bd4a30b4465fc9f7cb44f873d5888f843b392d9fdb900388eced6f3bbf9c40e
796,24,70.0,45.0,9,3,17,f7c65072c564fc12756ac7deec6864efa741bbad337f54bd53c8f7b372bfb46c
797,24,70.0,45.0,9,3,18,88c3e0908c4d575444a30cc21b6402341c3fe14d273488b4f7e42f6eed8eff5c
798,24,70.0,45.0,9,3,20,1f36f4982291c13802c7088f77aa735433a6a31e2b8b6be994a127d9b468c2bd
799,24,70.0,45.0,9,3,22,c8319bfd61c251119d3495a6b6a189177017b62ea38318cdf4f2820bff4650d6
800,24,70.0,45.0,9,4,25,874ecff13642d4792240121f6a5e5a26bda3b609fb223458b0334523cebb406f
801,24,70.0,45.0,9,4,26,53e1db6163d560bb12d235cb33b10474442351e3134985f978605f2bc0113dd9
802,24,70.0,45.0,9,4,28,66e6ba78f344d5b05b1b6eee99c650d16cd10b5c293c7468ad58f6ae03c90867
803,24,70.0,45.0,9,4,30,60d099b9873ddaefcce129309543672805883e61928f23696240f7df2876a45e
804,24,70.0,45.0,9,5,33,59617a6567edac8f16d50429fff8a7bbbad9e090fa7ec04046c1bd3a66cc958d
805,24,70.0,45.0,9,5,34,7be9d8bebc3deec2bf05adc16ec1f30306477dc76aac257b96c5179525f25c0b
806,24,70.0,45.0,9,5,36,f77219d6798955894ab2eaed7f0305800e5c9f2dc63ba99214548c27ddbeccd0
807,24,70.0,45.0,9,5,38,d3e2b40bf61b625f5bcaf7e8227fe0180f9124a667b6d6a5a993dba1144ec3d0
808,24,70.0,60.0,9,3,17,ef396f0cc3810b5563aa5de7983b4742b293c2c96d317e341b56a28c0a333538
809,24,70.0,60.0,9,3,18,69a18b201fc83a197ff0d82ffc97f5a82d6aa0207143e3f45394d6c16cfffa90
810,24,70.0,60.0,9,3,20,877232a58830d7c1e895612fa96ae338d5bd21676d16658c6ddd45153fba91e2
811,24,70.0,60.0,9,3,22,a240efaba675cc1af88925f5d9f8bc906eafe63d34cd52804b7141b70fcaf1ec
812,24,70.0,60.0,9,4,25,2d8878f78a1bef593759f5b14c2e6ffc39148c53bea4115ba50d41dfb0af16c8
813,24,70.0,60.0,9,4,26,887e8f1362b6199cca665964b00d056441938494bee6ef261e40823394d7f17f
814,24,70.0,60.0,9,4,28,14a616fadaa773917ab53008d1f96b7ff3db570d01f30c546790a190cd3ccd65
815,24,70.0,60.0,9,4,30,cc8c6de89062c3390dc52fb4636a44cb1f6bc285c3f65cebb3f7462884af4608
816,24,70.0,60.0,9,5,33,0a69aab800e2be7fbed9373e657ab0976b79349fde6be843e9ad1e6ba346ee08
817,24,70.0,60.0,9,5,34,e7cbbc9f0b76107b6e1d70bdb03f695b0153df672ee7230cb37c14f33e47a99d
818,24,70.0,60.0,9,5,36,367ba4546c76d532cf014c5522fbe991d993da4cf00dabc43866fa30a9a724eb
819,24,70.0,60.0,9,5,38,a75cc00e1446e5a3e91562a0daa11e0ce3de71986742b55c6e6adccec2695d49
820,24,70.0,45.0,27,3,17,1bda78c38a9b1412b357923751d7af84ab6ecdad3d9471f131d918db2bfb0a25
821,24,70.0,45.0,27,3,18,2aedfe89f2915c6faabded4239c5274c742512fe554c76dcd21c3057fb3d9409
822,24,70.0,45.0,27,3,20,23f2808530b950186123fb354ecbaa9065fe4bb80639ce8af7643d1fc5fd0778
823,24,70.0,45.0,27,3,22,27ffb87ab25351b7bbcd5f17d50c24e88ff55f7bdf0b80a6c8488d4fa8604f50
824,24,70.0,45.0,27,4,25,4613f06c939f1c611958a7153afc0bb57dc86a775a7908b386d0ed963d766e10
825,24,70.0,45.0,27,4,26,cba374793aa40c7821ccf3e4f57c95da998f7dcd3856aabebe0312c3ea833da2
826,24,70.0,45.0,27,4,28,6663b83f2bfec70981dfae791212edf22dd758171e1406b6a7ece1152272218c
827,24,70.0,45.0,27,4,30,f7643ae1b6d74e64e55c6dc87b7bde5580f7ca9269242e9e37f12854e2df516b
828,24,70.0,45.0,27,5,33,c0cef2a3a5be3e3566650d75bb494dd1ac6c344640c16801e5f87956e68ff493
829,24,70.0,45.0,27,5,34,a41498b106cdc87cada4da79851382ccaca8d72de47a1e3872a72eb22571c791
830,24,70.0,45.0,27,5,36,6208d19ab8e8894678c06c6dbb176fe86734dc09846049b950fbd83ede999d2b
831,24,70.0,45.0,27,5,38,14e2433cdbb3d09db341749109691f4f887b4e587a73a77ba8666724124281d4
832,24,70.0,60.0,27,3,17,a47302f39abab1d61631f77a2a66ac5f5f19e0cce1e545c5b11e09ba0243b1f7
833,24,70.0,60.0,27,3,18,910e24bdd59209a7940dac87eca8a8833e40a707ee138e580979c4bfd8f5d2ad
834,24,70.0,60.0,27,3,20,1d27d3ebc3ed8aab99e891f193a479ae8ea59e65302c1553b8cbf51cc030dd36
835,24,70.0,60.0,27,3,22,307007fd709f4ccb26bb8a256d31e7dca30ef3f3292bc2dbba4771f085ca1dc9
836,24,70.0,60.0,27,4,25,8115089eef04b47cb6275050d907618d538c345f7756f8020d8fb289e6f23bae
837,24,70.0,60.0,27,4,26,af68f473a3c45905db8197e0aadf5c159317ec79b4d8e0ae1fa5d353469b9c40
838,24,70.0,60.0,27,4,28,21b76603d35fb4acc8780880304393952b106c64157da0c92df6ac0aa51af9d3
839,24,70.0,60.0,27,4,30,096680f71554f3cc58a3d1b628e9c8a97d2955fbc9a9b84372d7f7174e9e48d6
840,24,70.0,60.0,27,5,33,520845528e0465821a43ca6fc021ca03f78f25e7dd7a9e773313a8db8ca1bee7
841,24,70.0,60.0,27,5,34,bf0b065c3844d07027586b12677d5a8a14b6966953725ba78332d998d4e9ef25
842,24,70.0,60.0,27,5,36,fdd34e8aa7234c1d2d464018bb6ac32d2cd866881b2233271ce4371c8b3a4743
843,24,70.0,60.0,27,5,38,b9f4c40bb1e5ad8add62918b8db821e3b5b0b41569d89f9d53026f44659cf4b0
844,24,70.0,45.0,36,3,17,57e89909f924237ed35aafa2d600f65a5f1839c9b11285dfc2022a9e546fa643
845,24,70.0,45.0,36,3,18,70b5b7d36c76399fe2c0b1d2381bc173d2052b29896aef86013eb75b7ad878db
846,24,70.0,45.0,36,3,20,6620a225f2d346a4ee5dc3a17a4b4eb07bfefa6ccba668b680aad054559e33ce
847,24,70.0,45.0,36,3,22,f44480200440e9f85f6c9e918b24e17633bc863943af87b33e536fdc1cda2acb
848,24,70.0,45.0,36,4,25,a64ad90bf862aa0fa705c6f052beff71e9912adc6b0ac4b414a367687ed8964c
849,24,70.0,45.0,36,4,26,125b0a5ba773eed31ac3030936e59d82667497a17e904968df715542c2f8f6b6
850,24,70.0,45.0,36,4,28,fd2d2a2acf023872ecd8905be920ff50e81d842c7c1a9ad7609ed25ab80d7b8e
851,24,70.0,45.0,36,4,30,a328c4f01bd8355b93bc9add8261c74c62374ad4509e89b220d0a7cefe0264f2
852,24,70.0,45.0,36,5,33,f237fbb4af2fee18e1a50241c11ad184bd3815ca98e546de9b4219f01ad6d597
853,24,70.0,45.0,36,5,34,407115d033aa176b3251a1c6d6e535ba83ca191c9a3ae6aca45c733672eb4168
854,24,70.0,45.0,36,5,36,ac799afd672da0d65efcb9ad24e482851031ca25862b748fd3842f49159d846c
855,24,70.0,45.0,36,5,38,5e4bff496f363e2abb8447dcd3eeb181df92d10315ef19a485d334b8382bb7ae
856,24,70.0,60.0,36,3,17,72acfe55190ed57cebf4f1156986564e0416b0b2af0e44a320c9194c7f2ea8cf
857,24,70.0,60.0,36,3,18,2805e6f098d15b27284eb510e1c1362e525cf0b0babce5d1fc08edab3b95e4c5
858,24,70.0,60.0,36,3,20,8a50464709efe7d242c053efa8e950450108cb815e1a26dc121d0cd593da68d4
859,24,70.0,60.0,36,3,22,c3f631cf2a02a7c64044ba26389db67a638453be3d2b0b5a9dff87d6f0a45da1
860,24,70.0,60.0,36,4,25,1ea10a95e4b72824a094fff9a416831d105715d1190b55afe1b9d156f4e4b2fc
861,24,70.0,60.0,36,4,26,88946925060027a3a3472036c3e82033b9dc468ad99e44d895552cf0a6a641ef
862,24,70.0,60.0,36,4,28,e7ce645c4ccb5b38624068326842d053686718abb3f5761ea82aedc6e609861c
863,24,70.0,60.0,36,4,30,3d549d0fd3d08be83150bdf31346d01add6c7fb80f84e2477f95988cd439e9e8
864,24,70.0,60.0,36,5,33,e395a9dbc44ff4a21cf99ab1e1ab42d864ac35c98956c231aebf0c571df29b53
865,24,70.0,60.0,36,5,34,3b9f3cd1723bca4b49699491b87a4a88d2401530f4f0983376f7fba088d95b5e
866,24,70.0,60.0,36,5,36,f02e26d93e8f9469c685957428babff6ea1f3db5321c0e37f0723af16a3c5e97
867,24,70.0,60.0,36,5,38,ad7f8512bad46de4c706baa550d33fb859c68996936052d7fff4d8fed8f75f68
1 id outer_blades_count outer_blades_length outer_blades_angle middle_blades_count load_id recycling_id experiment_hash
2 1 24 70 30 18 1 1 f3440e566eedd3cb6bceaa2b8e16396456c2801120fabd283561b6ee2100b0b5
3 2 24 70 30 18 1 2 a47bd45c541df0f1ed9f853bf21ad4157a69aea5f3bd91925536af75a51aa3dc
4 3 24 70 30 18 1 3 ed1525ca364458eb337f71632366a4ba17528e3a966019f38e9c52be73f893aa
5 4 24 70 30 18 1 4 9d30eb894c46d1c09fb739530efd743debff8cc40ad9e31cfe7645bb163ef1e0
6 5 24 70 30 18 1 5 d3a0ddf904a96bdf79d5ba6c62bf7c0035e36c11dfce48bf9e6768f738e96893
7 6 24 70 30 18 1 6 2c11dd64bbc6b7b1d6dd4aabb7bc278ae39c10843fb9e45360ad4d56382600db
8 7 24 70 30 18 1 7 1b8eebbbf139120224cd35221a0c55fa85568e3e29ecc3967963ab8d243151ec
9 8 24 70 30 18 1 8 7b3c151a9712638709836f54ad10e671c98cd77d69a0ef7d3225427cc12568ea
10 9 24 70 30 18 2 9 d088c77f22a9d7598a5af46ef623e2611d1bab914c2ab4877f79175fb654d6aa
11 10 24 70 30 18 2 10 de5054f2198651c958a57a816eb85d5aa58cd061268a5195cae60e4a1c681e85
12 11 24 70 30 18 2 11 448581cea9fbb47236889fc7a5a18e175e4256e2cc8ebd7bb202c2463411280f
13 12 24 70 30 18 2 12 6cca36dc2f51aa1735a622404fd594a31609f337a26c0924c241793f84fe0ab3
14 13 24 70 30 18 2 13 3b446baa52e9268697b8acb2c005d7c0400d9d6a90e39f62944ba694910c45f5
15 14 24 70 30 18 2 14 cc93de3f50f3892f461424b7b11ea02527af20b70e707a5aae0aaab8f947f392
16 15 24 70 30 18 2 15 f46e555206f2ab5c308c467c8b2c0eb724f027f9b9b3d57da278a50483ffe2bb
17 16 24 70 30 18 2 16 7d327b5a4ca0d16d054c7775a2f6cd66e9f1714fd3a3be40437c02d077de5c67
18 17 24 70 30 18 3 17 51ab3b741aee17c59ef82c338d7fdde79697e6226cc3a7e4b3b40ec5dfcba647
19 18 24 70 30 18 3 18 fbcec5f6a53659317dbd8ec4047bb9215ed39b84001f7cda673becb37e74ba51
20 19 24 70 30 18 3 19 7bf6e8cd421222c7bc17c5e6ab43dcee4316e9b885903db1ca41741123009ff1
21 20 24 70 30 18 3 20 aad101f9418d0bb182d64da455caeec0bf410e65a3efdb44a025adc53f8ce216
22 21 24 70 30 18 3 21 c609ff027d988b6ea282e544d3191f4f9f47f912cc891b3d2ab32e6191d3e739
23 22 24 70 30 18 3 22 a460f48676a062c64103ff8cadd1faacf993f1253cdefe6c4b99a8505d09814a
24 23 24 70 30 18 3 23 c41ab44cb00cbe24ee9d9c29dfc847b7bf5954a136f07d95d5ef1c821b6e751c
25 24 24 70 30 18 3 24 3a56cfd1d1a3cd97d51bc489e63a1682e1495311900f3f9d337fe22c1a9884b5
26 25 24 70 30 18 4 25 c01ec654b3825e770fdfcded717e9d0862cd6d1d1303ffbf5a11974e5f583849
27 26 24 70 30 18 4 26 d6af15b0829a64320158a05684faeec8dbdb7599177ba0b95d2428f517025b19
28 27 24 70 30 18 4 27 58ff2e215f22abe9ca172b21db0f3ee3c89c8a77a5afa3c33cde6b1490d788ef
29 28 24 70 30 18 4 28 78b2430505297f9d16d1ee31b1781b3425f5ca8af81f758318f9bcc513b16056
30 29 24 70 30 18 4 29 3c9d9f05dc256a57766f7448bfbd1dc4090742092942a09c30a0cc4775901df8
31 30 24 70 30 18 4 30 78f91bf6c8e291f85582e96a5e0afcdd8b70c71d887cf7f45534268bfcbe065b
32 31 24 70 30 18 4 31 f2c809d7de702b3f76f22e87ce25687c75ba3239fff494b5f80d44397e0365fd
33 32 24 70 30 18 4 32 87b7070cb8e3c39cb1a00c132abef4ce1e5bdf082bb21715d3e5ea063d65cb6c
34 33 24 70 30 18 5 33 7e044e9dbaf5d043699ee22876ea8ae05659ec03b024a10849af140243726fbd
35 34 24 70 30 18 5 34 ebe73f29770dec56bb3ce6b2832e723d8a1f0ddf1f63698ccd057535bc2e7c8b
36 35 24 70 30 18 5 35 e673d4cc2675fda210549e533de77618a4a003c067bf0f2740d2fb35c320d1c1
37 36 24 70 30 18 5 36 f6373fe5dd40b33cf6f902705479e4e611e9e3f002e3d53b74d4467db6461603
38 37 24 70 30 18 5 37 f0dfcd828ab3edf2822d869f39fb24111eee5e8d54f5e67d6cf29d12d091a493
39 38 24 70 30 18 5 38 c7513526483d1f52282a177f5db8bce4223dbea44302e5b50cb00fd95436dc5e
40 39 24 70 30 18 5 39 937554b847c97b1545bd6169f594cb6a57cc3fbfe462fa976cf5b5c30cade75d
41 40 24 70 30 18 5 40 bbf8878c97bb3d1d55b85450c500416f5ff4254d098b6329966ccd1af6fec198
42 41 24 70 45 18 1 1 d93465f1368a0bc246d9ac814417d55eba2674dd96b6deee8b14f3496b44a5d4
43 42 24 70 45 18 1 2 63f441456c37857e11d9194e55ba304433365a38f9e2395e0f7826a8cb52979d
44 43 24 70 45 18 1 3 0b6f75922844a41b9e517dc675dc41bc592afccc7a9fb108b078011197058a0e
45 44 24 70 45 18 1 4 d231c7b7601c2fcde797acf2eed7ed6553a059e5bbf59cbe01d68f568f57ace8
46 45 24 70 45 18 1 5 019ec639ed4ac56a5d1017ba10914acc122da59ebaaf8f929dda7b351ff5224c
47 46 24 70 45 18 1 6 2d439156da14719d43e33ba034782fee7fb83033f1a4897f0b20788c5ebca65e
48 47 24 70 45 18 1 7 8f31f444564af0a7c70bcf2299fe80e9b9fa1a8f84edc4afbff81c0e4969fd6b
49 48 24 70 45 18 1 8 af2f9f938b771242ab4b0221a0d937e03ece383a2192d3036e05988fb2442245
50 49 24 70 45 18 2 9 26c261c66a5e93b4b88e93290324f5706ad2de59dd59e123c9db34d76494966f
51 50 24 70 45 18 2 10 f73948ca1404ac1ef598d32967ff590beac673c1f128633281e5f91d20439598
52 51 24 70 45 18 2 11 ea7ec1c838494ef086813bed27ae2c0c23f8875334392058cf1069615a333e42
53 52 24 70 45 18 2 12 4fa7e25f2c9c12088e4bb783ec7330a24744c9b83357256b2e21ce6bb6e139ca
54 53 24 70 45 18 2 13 a94578891fd1dd142acce45268da610890c2b148da88caae75c6033b655f93dd
55 54 24 70 45 18 2 14 cca92f84a1ccca51108ac4ceaa5acb74d993b17200a3ae4db3081d0025304969
56 55 24 70 45 18 2 15 8ce57236cacbca39e548e83ea1bcc342b62df29f3bde0caf2c0c2db1cd3b432d
57 56 24 70 45 18 2 16 8b647157123d4f7bcbcc625b054e3e4d83a0804e57731005a8dd903ef72ea936
58 57 24 70 45 18 3 17 7d660b53b68eeb2d66b78089f71c4ed2c872369a1593a7d284d4d0df3eace407
59 58 24 70 45 18 3 18 3b29424168040cbd1a2947c94a8e61be3776ed45bbc1112909a55cf5ebe1bbbe
60 59 24 70 45 18 3 19 788aaab9df7f831a3e6056bd7758a218ebdb923c0ebf5be142a47c59a494270a
61 60 24 70 45 18 3 20 a4bb724f51b10dcc325ec19cbe0b8c5b41c8b9b0eae296dc61c353314db1b36e
62 61 24 70 45 18 3 21 6cafc249aa6b9e95afb63f60afd62255f2c95a8445b0b9e57a39cb92ae348f31
63 62 24 70 45 18 3 22 24ae10d92145ca93e6acbe22bb510f22af67453bb371bf13f904cb9a2d06d4d2
64 63 24 70 45 18 3 23 0405c139bc6e1bc882c3767d7603d02803acda222870e38ddc94dcefeb76179e
65 64 24 70 45 18 3 24 fd604232c9eb21c707c1c0afe99e72f5f131537850c51bf2a6709705e82b284f
66 65 24 70 45 18 4 25 34c86de16b8c7a3002bba420710d099ddd31591f78f8783caae64129d5f1fa6d
67 66 24 70 45 18 4 26 3be010d0e6a1daabc7a5e21ca17fc68508665bb4b99ec16a4912f88f0c1bfee2
68 67 24 70 45 18 4 27 19058a20083e7652aceebe4079d7918e0afabcb2b634ea0956c5cd8006a12082
69 68 24 70 45 18 4 28 ffba62754ec42c376894013792d126e31c307cf52f5aec10a148c74becbfc692
70 69 24 70 45 18 4 29 0cc7665eb716cf2851156fa45bf1c241cfccd43b25d757d798140a75f40b2354
71 70 24 70 45 18 4 30 eb20ea5909a55f61b92ff4337727242240765993931d9175043cbac3dac6caa5
72 71 24 70 45 18 4 31 a4a3baccc35da76517d3a16d379ab8416dabcaed429a72ef26e9ebc757377867
73 72 24 70 45 18 4 32 550c05d891ee0a19a37a0a614cc9dbece86e922973965583d22ceacb846e1581
74 73 24 70 45 18 5 33 995a45405eedeb6e463642d6f723b6fdb35df6035e7198d787e5a14fca8b4a85
75 74 24 70 45 18 5 34 66c882d8ee6b3f9b1563ba3c18dce8e7592b3e548d9b0aa2b54f9cec6d487889
76 75 24 70 45 18 5 35 a1856cfffa7b32a6c553a548f6cb52187fa9789f414a3a29712735965fcab90d
77 76 24 70 45 18 5 36 c504f3e398c0850397f0fea4bdf2df3eec3c5cf8a9200d164f34b2c92d59be9a
78 77 24 70 45 18 5 37 2f9ccc8409dbdcd01f9c1853b713c48e3f31b5ea0ede68cc956abd2529ed9bf5
79 78 24 70 45 18 5 38 9dfdcb6d0d69d6f54da0170c0b5bbb6c382ccfaa94c803ec093a01db452c2f24
80 79 24 70 45 18 5 39 09682926ea871314009a2e8340c4e0597573ec925c8d5666f7deb0c97c649fbf
81 80 24 70 45 18 5 40 97018fa18631ed88974f799858c3e9731aefd3d308f693e0d9e095d9ed6b5cff
82 81 24 70 60 18 1 1 b54c62da0bfea8f337d0c380d534bf98b25c1be9f014db4b8c2e4b455e85279b
83 82 24 70 60 18 1 2 cffbb4238b69f5b51d93fda58847314f90277073caba72eac0969368d2bf72af
84 83 24 70 60 18 1 3 2ba7288af1d84d07e239dd78baa790b6ada943681bbdfdc27e7f489da8046e8b
85 84 24 70 60 18 1 4 afa966ce1f0dcfaa6282a049c0c30febc999f856885199056dc570b97b6adff9
86 85 24 70 60 18 1 5 8f8df0abd28895a93112a57c4d4b32be7eb9c9d7f9ac40f016603173185a78e1
87 86 24 70 60 18 1 6 1e5b48a6d463e88f4bf49c29dca892d77b2a16a9cffb3cb4fab341f5645cdb77
88 87 24 70 60 18 1 7 879e6b65a692343e84e8e02e92a49d63053180a22f4b42676e2f29bbf581bd6a
89 88 24 70 60 18 1 8 0f76f567f474e5b41351eb42f0c6dae27240f7c69a65e0a02fd631ae7a30b088
90 89 24 70 60 18 2 9 5c68cce55587a05f51a597e0e2c57971e111e412e66b29d933cddddc892ba911
91 90 24 70 60 18 2 10 307e271391f0090938521a4ed707064dad973cb360497602b23dc69bd13daae6
92 91 24 70 60 18 2 11 bddfe29d9e272a9990190682aee23bb57da690ce391cf9dab1ba4f1e80e3e932
93 92 24 70 60 18 2 12 efcd861cc0eea9334341de08ef26a690c961fd7f37d37b96e9d3a8496a7b96de
94 93 24 70 60 18 2 13 32a460c67c2a9442b1b103523ca6a116d7ae2de8c2245f4cf51b2d666ceb2dad
95 94 24 70 60 18 2 14 8eac61db97a0cf8c060e9d4c235ca2fafe8fa85129837c74417429d781f4d8b6
96 95 24 70 60 18 2 15 73d6e002b5cbdb9888f5dfe4530371d1efba05da843b47343ec6a24d358f970e
97 96 24 70 60 18 2 16 0064dd418bb85442ca1641bd7d4659bd2a1c472123a30072b6a2e4280083ea85
98 97 24 70 60 18 3 17 75fb2ad1605612509d86e932eaa930221d6b26dff9646e6680524d88e65b3dd3
99 98 24 70 60 18 3 18 b701734dd3e549ceb97d8a82682b2728814b92e08fbeb949bbf67e7a79f1365c
100 99 24 70 60 18 3 19 d327280a452af12ee949f54a09cc47f3fc855bbd4b559a021c5632ce1bf7f9e6
101 100 24 70 60 18 3 20 d8470f3ee4730ea1b618cb1e9f61d53378b1b139725df661e8cca6a75ecea753
102 101 24 70 60 18 3 21 b289c625935178c4389206037e68c6f52c4bc5be990a25a26c223df840560356
103 102 24 70 60 18 3 22 a3d18f7ca7cee4a8aec93c65c9a14a3b3fb64f28981c6501f8f2fac4db09b561
104 103 24 70 60 18 3 23 5218ef80c1efd4f752a6cfa499d71d63245f4a1a013abd40e1cf56e100c1c58f
105 104 24 70 60 18 3 24 1b16c43ada345c628d9bf487f5114c2730fde939e25152b011aee810ba70c163
106 105 24 70 60 18 4 25 0471851d3b19ea655e1498f5b7099e10fe069d9f69235270252adc2044f9a86c
107 106 24 70 60 18 4 26 ee0b78999cc119ae2c697dcc7c5cf3cc34cc8fab0be267eccd484f3a811555e9
108 107 24 70 60 18 4 27 35228f2dee7eda00408c5878511762d740f4c9e0ee27d59cb8624ec116925068
109 108 24 70 60 18 4 28 86f3de97013f53d9c9486c25cd04b97d52892f52c72c69007b46b06e8665c2b6
110 109 24 70 60 18 4 29 0ee70f3eedb98ac680768601cf84d76f7b9fa195ebc6f6850c1cd5a752acaf4b
111 110 24 70 60 18 4 30 5112d4b18b376287c286863d52f824062d90590fa4c3928041b30258f80fc8e1
112 111 24 70 60 18 4 31 ed71b644bcc7479cff5bb1b74dec0f1868258707be53a2b6a186b3d366b83796
113 112 24 70 60 18 4 32 a2c54f86299c603fb20444001e5eb7029d0367232e47b05a5c7833fe38df1d07
114 113 24 70 60 18 5 33 56d4f83a0f1dc14643d621adb03676f5193f64ef8d03e598a8c5bfd8af034d50
115 114 24 70 60 18 5 34 603d47e77e49f235dc7ddc3971d07ca923a8b173708b1d56e2cd2f715fffc899
116 115 24 70 60 18 5 35 03222d207ac70db5ca2632d1c1b64eab35ddc337c4007d67da96d7d9256e9c60
117 116 24 70 60 18 5 36 7977f6c305b18e6f336dfec451dd8fee5ed95619ebd7ed25e720c170cff7055a
118 117 24 70 60 18 5 37 c6289646d1d7e7c3a5f3473dd8f54e3ab810b7274c11842a4f8cef37f6c850d9
119 118 24 70 60 18 5 38 5d2155f7aa0189d24fe10cacb93491e1629df381f3c296afb5c36ac50528c801
120 119 24 70 60 18 5 39 5ca59876b7808331ced53127a0dae0a464a1da3610825f4d14c468a080bcf8cc
121 120 24 70 60 18 5 40 80d0b251451977827cb7841ab36fd5b4ff2ac65f1004acbf5409e59fd4de252e
122 121 24 70 75 18 1 1 6d545739aef47e07fb946a0a802758733dbf559f62ab82eb0e218e50e0a067d4
123 122 24 70 75 18 1 2 de34f86cbf88081563e5976013233f0fc1c2c1684139020e7564c6297fbb3a6c
124 123 24 70 75 18 1 3 0b2faa7f9a7b122ffcf2091e1714eba7330dc6899b7c529344b26190ccdd11ad
125 124 24 70 75 18 1 4 cd4c16b5e4ee651821cd586db529765f530845753dd7ba89faf704742c2f1874
126 125 24 70 75 18 1 5 3e81dd88a44e2b866f15a19a6cc78c1fe07d5e45caa1a3779b5659ecd241255a
127 126 24 70 75 18 1 6 72ecd10b16fdb357f89a14a48a38b81fbdc7cc2850f608e547b1654324df0ddc
128 127 24 70 75 18 1 7 8e53935b91ef51de3f49c27776d6f33887f7b2575589bdde5db8a74065c9caab
129 128 24 70 75 18 1 8 a211936012fbacfd7ba8f4a84503907b02a67fb8ae76f92eb24318c3577c5605
130 129 24 70 75 18 2 9 9223dcc932346a888aa0c05f9397bb200408f09b590c02b0c5a9b4f511984d4b
131 130 24 70 75 18 2 10 cecd917ae056d26891c3a2695081a248f894654dc9f0766f98b9cd84436d5da1
132 131 24 70 75 18 2 11 944f0d285e7e5750d7241cbeb17ce5dd878a41988b4236d796351955b9aa1876
133 132 24 70 75 18 2 12 8d1ecbd4bb674d0faae4701466a2d014221f0fa0cd4a627753079e1f4e335f6f
134 133 24 70 75 18 2 13 d6e377d21da590a13cf5a1238c985f8fad843287c7282ed794a8f0ce2541fef8
135 134 24 70 75 18 2 14 12e9d62fa97c1dbcb30336eae7f1ea63e5f08f7bc3f3b91be2e91d3225fa228d
136 135 24 70 75 18 2 15 6622aa62f0b7a5233c1e0f320beb7228fda235165e3323e4e9e7a430b18206b3
137 136 24 70 75 18 2 16 b36883e4c6584e4d6e7150a18b88c55bcd8ab222b1e14f1f80fe8b17ffa0cba5
138 137 24 70 75 18 3 17 961041a1051b839d43a8556c4ac22161915aa5821b281019b87b388781c50b67
139 138 24 70 75 18 3 18 0b05dd5abf695a71315a50e899e9ef1b9c97648c1fc413e2bd8693aa089aa529
140 139 24 70 75 18 3 19 5c08f91ddaf8ff5dc85cbf31348dda374a9ae39b96194393b698d28d2fe4dc37
141 140 24 70 75 18 3 20 728d8c5e43dacc29ae22ec69dbe39aebc9607e2183901e15916c82da83e95673
142 141 24 70 75 18 3 21 6b576a9bede17797827aea40e6701b326e7d4b80e676f0074459fec9abe30fab
143 142 24 70 75 18 3 22 349db416e20e983797120307ea0eb5f2156fa36d61f90a78d394e6fb27808723
144 143 24 70 75 18 3 23 3e9abeafc654cd1876217ca4a09cb16eca7503715176fcc0008da9237f516166
145 144 24 70 75 18 3 24 c08d3f975cb070a3ef23485080e5754907ba68e7b1644f01037509a1a2e0d3b2
146 145 24 70 75 18 4 25 effdb858818cc1ed341daf264e6d41de6115a2193530925de65d88b33fd85941
147 146 24 70 75 18 4 26 0371e01578a91f25a5b01e2877190dad3e8f4a383aa4f6bc135653d376bbff2c
148 147 24 70 75 18 4 27 f4ba9e573f4319bea2e10cad7bc3fc626be92bfefaf6f568fcf8a10b3a33577d
149 148 24 70 75 18 4 28 58a8bb05d15ea462db5e1692bfdabdc5a486fcdab7eff06de7b11f248d49a420
150 149 24 70 75 18 4 29 d39b87cdbfed71cccf28c41d40e37edb8443d3d70369bee77154e6d45ce6b97c
151 150 24 70 75 18 4 30 845b54d75b3c437b22a4ec62c2164443578133f0acaa8f4a59023ea9139da2ed
152 151 24 70 75 18 4 31 4179abc305886bd617a7ba2a359e787000a7b53c105029e278c10153549115e5
153 152 24 70 75 18 4 32 354cfd7bbed7b77df68bc3d9a54ac72663c34a7b973076c48b57221ab3ba5b33
154 153 24 70 75 18 5 33 2240464b252144612bbf00e35e12c3383c9658c91fbb2f09018be78af5e2eeb4
155 154 24 70 75 18 5 34 59354495b5677e001d684ab710a0262a46b1413da35f74bddefa2aadc50861f5
156 155 24 70 75 18 5 35 21d6203994eb8e2ae006f00ca1c6ac857b987ffed864ac9cf1130ba45239a003
157 156 24 70 75 18 5 36 262610392dcbbc2d72e943587cb76fed40f9682b9af659ad5926225e35c34be0
158 157 24 70 75 18 5 37 5538683e858e528148d42c228b2e267ffee642217552a916a5dad31a3d6f5940
159 158 24 70 75 18 5 38 0c4cd9417f5fba3a5298a75947d93ceafab5b7b6546a66dc64e3c86f259e6b4e
160 159 24 70 75 18 5 39 bc0a419f5c62ceed6790a7c6e99e98ff8f08e4b0f4975db2ea6cf866ab1d0428
161 160 24 70 75 18 5 40 6e7e9cf40831c0ae58b77b44bb845d99d1df943521f3749fdc7c6171539ea35d
162 161 12 70.0 30.0 18 1 1 a805ffc4f4154a511b74ec04fc907bfaf736de6029d7010b2be4ed939a44fe3c
163 162 12 70.0 30.0 18 1 2 22cc341cf605a0dd789f945fbd682620662d6c8c632591b272657359894a15d7
164 163 12 70.0 30.0 18 1 3 7c2bb9c2fe7fe70cf823a94258026b841afea380069e8cc38393c83d787da3d2
165 164 12 70.0 30.0 18 1 4 4fa46d97288696bdbe91ed97e045f48f4539cf52b5c551f57ffdcead04e33901
166 165 12 70.0 30.0 18 1 5 a26b896dffd47b941fa03e6468abeb8bf85f4a8e8d85875e51d7b6a3e304792f
167 166 12 70.0 30.0 18 1 6 df8bbc27e4cb1db2b1a5c96736be6c53ff9f9fa14054c8bf4fd6f57be1d04390
168 167 12 70.0 30.0 18 1 7 e537cfebc392c09e383fcc257e7a60456eb023d38892d6c0f160cde31533e22f
169 168 12 70.0 30.0 18 1 8 a16b2002e94d0607bd6f9d600bfc4a90d85cd9b178c1e0dbc00dca63b8826d20
170 169 12 70.0 30.0 18 2 9 2ea17cb81f75a0e9c2236a3439e7c4b0248fda0829882f6da5ff053ed89edffd
171 170 12 70.0 30.0 18 2 10 f4e946279c5231c5089dec3d098909ad4c635bc62855081d20244a6bbf3b8a46
172 171 12 70.0 30.0 18 2 11 170aaff0b2388cbfa08ee7aa63ab324ff0509d5492494336f204e2751b144815
173 172 12 70.0 30.0 18 2 12 0a66a2c9d34b9cb980960f79d74f8d92724d6e10855e2f191b825d14c1817e23
174 173 12 70.0 30.0 18 2 13 1a1d4a8e6eddc8f3fa5b354b1f447e713b84412128e447683a0326c759b0e8e5
175 174 12 70.0 30.0 18 2 14 d69dc9b7b49629fac3580fee0bc33ad852fb3fdd095900ef5351802c8d58d322
176 175 12 70.0 30.0 18 2 15 9518d78c40c96ee9dc5400c4e241ef388dd78cfd4f93ec7aa09d0a5588c6fb09
177 176 12 70.0 30.0 18 2 16 bce8a23a3dd6be2f6f34aecc336aa800e32b890d0427f1f455bb8bf9187e93f0
178 177 12 70.0 30.0 18 3 17 e0f01b26e62a71e1c56923d1e331b27a00ee2ca32e1aefa666ff35b736388a5d
179 178 12 70.0 30.0 18 3 18 69c0a48311eb8c80f9c965717bb09724ed0fb04698129086a7adba0c2e3bd895
180 179 12 70.0 30.0 18 3 19 e6a3891962155a885805cd5f2779744bc9545a69e0e9d699f1b58ae59798df3e
181 180 12 70.0 30.0 18 3 20 bb9207fdfac25bc7031db57684e2a198597f70303e7a4712638a26ce73e86e9e
182 181 12 70.0 30.0 18 3 21 b8621d39a0cd80c14bc097a293a9e487c5fc3c88aa8fe99db7e66b6071d59f3a
183 182 12 70.0 30.0 18 3 22 6193214390a15c34edfc3e046cd782afee6daa9480e860c9492f6991bb640e69
184 183 12 70.0 30.0 18 3 23 ba2a2b43ad5504cb5e9079308adc33281098b62791ea57b59815e0c7a4c931d5
185 184 12 70.0 30.0 18 3 24 9b9f252dcdb42dc5c4d3e23603ef1efbfa439494bcc57b6fb66425429a6d36be
186 185 12 70.0 30.0 18 4 25 7906d2773d505d606591215637a07bff01f37e6961a9b7d5a1ba6e84a789c232
187 186 12 70.0 30.0 18 4 26 8d27ac090f25ee40485595666f20ae101ab30e0fbd71b45579ac42d81e6f0ee5
188 187 12 70.0 30.0 18 4 27 d434a240eed8678106bfe0ed4e971da456e846817b308338a8ac408a4d2f8ca3
189 188 12 70.0 30.0 18 4 28 574bbad43308099af48e9821ab4402e668d9041619773a0009d4b5a3cdc6129d
190 189 12 70.0 30.0 18 4 29 6dc0d553d56dadc559ed1ca9248ed385db2022efc37caa9fa36d36643511544d
191 190 12 70.0 30.0 18 4 30 d92a897ef5e0cadcd9753ac58cc9a1a458b604e0f1de95c5e8697ac93d7857ea
192 191 12 70.0 30.0 18 4 31 226ed8f17ea2dc0dc0c6474a4e6319ad8e33bfa6bb347614af9e63d30e1e8802
193 192 12 70.0 30.0 18 4 32 408ca691f7eab6b8448ac2bbcee48485de17818bba666167c3305b99c0edce57
194 193 12 70.0 30.0 18 5 33 42a849f86214357f061e5afd83bf87ee67809b6f1524a6673e5ba437cee0d845
195 194 12 70.0 30.0 18 5 34 ef1428e13941fb0922d15ec537ec505567f888bfa2ef337902b0f4448620fba2
196 195 12 70.0 30.0 18 5 35 a96adf8bd64bb2525e63ff0bfefc42100ee534d464cbab343dc1d8576e0e3427
197 196 12 70.0 30.0 18 5 36 941be2d3869ab6634dc2f26b05f48154273ff8b8b3c3ffef4740f75a927420b2
198 197 12 70.0 30.0 18 5 37 b861e5f595ff12264113d28957d8d3bf7396e06d43bded8f2ef2f3c4bfa9b2e2
199 198 12 70.0 30.0 18 5 38 56a5be6bdab22e6a9b6f92ce933003270dbc01ebd90cff2ccfeab44ec8423805
200 199 12 70.0 30.0 18 5 39 46dcec6ba38b602f6d8bd444569d7406f3ea98fc7ed8f68b718c645e04a7baa9
201 200 12 70.0 30.0 18 5 40 c82dadec21be7c6dd5022ff15ec0582bc2bebac23ca2c3cfce62acf56b05c88e
202 201 12 70.0 45.0 18 1 1 1837dfc8aae2c276587eb9b3a63bfde8e2ca032ebf9e71482f7b8156504b0ecf
203 202 12 70.0 45.0 18 1 2 e93f4e2fd56aad3c0b52094c4c9532a1b322561046211c08df5bf6d3042e4d2f
204 203 12 70.0 45.0 18 1 3 08995ffcff62cf206405509663d29bed8d84ec894fe96afeab611a570b837be5
205 204 12 70.0 45.0 18 1 4 f0c98031c4a6f60bcd173a1aeef527f6391439d69d4de0b5161f273bb50ac4ab
206 205 12 70.0 45.0 18 1 5 f674d850a68af8206a73efefdfc93274d7954b851544579b9012c68fc52a046d
207 206 12 70.0 45.0 18 1 6 ec0dcf2854e03aac414efc238031239a442d48734d1d20ce44875206eea2b69b
208 207 12 70.0 45.0 18 1 7 8e009035f11186d55eaa070fc981a5de5941fedd6e1b130072abd77359900e27
209 208 12 70.0 45.0 18 1 8 5f36314a2098a299f25b76003115a491618deb71e8138ba7e17da3bc8d40c1e9
210 209 12 70.0 45.0 18 2 9 3b9c7b69a08ba82908b1da8c17db6f97d9ad12710ae69741478575b56675504a
211 210 12 70.0 45.0 18 2 10 694fb40f6f9c5495107651d211f27b031cbf862151f21099ab93340dab09445f
212 211 12 70.0 45.0 18 2 11 cee5a476d2eafa002ada7723c4d453df3fcde04f81475f1895270709c246f3ba
213 212 12 70.0 45.0 18 2 12 41491b3b218c4693f9814b48a0575820f45177fed2221d76c60ac6592064fe74
214 213 12 70.0 45.0 18 2 13 510972d297dbb6b3ad3e84aebfb1c808dfa3ccff49dc71b78becb7aa0dde3ad0
215 214 12 70.0 45.0 18 2 14 ad159601c749d21c6ff1fc17df21caf362f033c19af41457c680d4ce9632ad8f
216 215 12 70.0 45.0 18 2 15 a3d18a64e178e7d17bdf5a807b5e227e501ba3bb3c885d20b1486f4a67652f98
217 216 12 70.0 45.0 18 2 16 ef157fb73d366c685ffb89cfde916562d256e8af5c38bd46ecb80ec0df6f626e
218 217 12 70.0 45.0 18 3 17 f30bde998b6fe89ad6b36a8523bec5bf0621f62530bd722b3b92d1582674e4ff
219 218 12 70.0 45.0 18 3 18 9c90eb4243ac988b05412c1f9c06c468730f6ed2b7d58986bd39c3fbb4ce06c7
220 219 12 70.0 45.0 18 3 19 a1b49b1c11f631c26c1f28db134aefd298737f687d760702b58e2c1858985987
221 220 12 70.0 45.0 18 3 20 c93cf6670bcdd339f10ce30e8bd25fce1c55e7633ed298c544f99f9f2188ddd6
222 221 12 70.0 45.0 18 3 21 3ac3b22d3e0e315bd497cb9c8408b113a9c92ad4f6e88af266d0780a2005da09
223 222 12 70.0 45.0 18 3 22 d0bacf8ab25c9f7f2304fef2b6bcbb9626b3234b4b6ff85e851740b61ca9407d
224 223 12 70.0 45.0 18 3 23 96ceea8c82a427d7fd76a2213a2a3c4518ac20daded2dffb5d24db4b96bce9c2
225 224 12 70.0 45.0 18 3 24 f065de171b3deaecadcfefa1011d43598f5996d3408b58a829ca841330ac4be1
226 225 12 70.0 45.0 18 4 25 51061824203c9b142c34b3e6e895fa206f32367fbf1fdccb2ff2952b406dbf36
227 226 12 70.0 45.0 18 4 26 d95c76030ebfac69ce59dfb34c9def3ab382133b35e5cb39aecbfa806a6f40e1
228 227 12 70.0 45.0 18 4 27 53903baa84a07b31770d92a0125484ea44a13c140fcc6e09aa7587119dfb5aa1
229 228 12 70.0 45.0 18 4 28 ecacb755b499e4a086ed9ba052e764a49a077fb5c5c3a4f6698ada41a236eeab
230 229 12 70.0 45.0 18 4 29 94f7d1350a4631f32f53628fb5c113d79193ddf12b80bd6e6e61f11b87ebe449
231 230 12 70.0 45.0 18 4 30 ed7cd408d2dc69c899b8cb9b81e1c4b6bef7b98f771a0d64d1c1ed9b43133626
232 231 12 70.0 45.0 18 4 31 1ef37448f4226a4ae8092f7c84fcc0b0d2b39c5e1bb9254f66f076c2dabd9778
233 232 12 70.0 45.0 18 4 32 8478da76ec7efca694f0407432c63dc8ad6c46ec966fee4593ca8db4b172da6f
234 233 12 70.0 45.0 18 5 33 a7856a243cbb84ce1118071f06aaf029918f70869daad997f6bd7397ec34d87f
235 234 12 70.0 45.0 18 5 34 bc124227773c00cc0c651b50e4d535a23f17f8a1eadc3c083ea29e498fa9673d
236 235 12 70.0 45.0 18 5 35 5889874c7e199691d330abfb9e0a8d631d85ceea29384a6e986659d8afff047d
237 236 12 70.0 45.0 18 5 36 9e5d612d18567912d44e60376f34aeb8f16d0c2cd23104e62774fe67ec0150ac
238 237 12 70.0 45.0 18 5 37 27648ca44c27b51193b5da3c841e340d81974137f9aded6e2f811cf9aea69364
239 238 12 70.0 45.0 18 5 38 27aa345e23e217fce6a4848b301b32e77510198f0f866847c786a03fe38f7495
240 239 12 70.0 45.0 18 5 39 f5515a7fd740da2fb775f35d95d54f84e86a3d525ff36946084b5fbbb46e6234
241 240 12 70.0 45.0 18 5 40 c9d42afe9764acccad767e5b009c98bc10ed065169d6e430c4c447eeb022c342
242 241 12 70.0 60.0 18 1 1 206a99f9fd1788194658ed24f7dee06d806559b822b71b257145066cf83dc245
243 242 12 70.0 60.0 18 1 2 2438b60f1056fb2464536e573a3e1077d7a089d18bb8cffae2c1a29db5044478
244 243 12 70.0 60.0 18 1 3 3cc8b8144c0d77285ae632cf83ad64471e640b33c7d496fae0f12133957365cb
245 244 12 70.0 60.0 18 1 4 72490d7f2468400f2874d14e5eb222eb48c47befc1c3ccf32e50ecdfdb7ef106
246 245 12 70.0 60.0 18 1 5 f761c844c10ae9edaf831be36b76d7670a090b94dbf55bb38cbab9220e8fc18f
247 246 12 70.0 60.0 18 1 6 cf566c26ef5e74701744506edc73f526a591c7ccb62168f0be505f03e7fed16f
248 247 12 70.0 60.0 18 1 7 a16590aa2abc3c105d1bca1aa06966c2698d65cdf2de58a734632f3b87bd3bf1
249 248 12 70.0 60.0 18 1 8 8a027e8b81105da779ae6757e37880c1a3cfe847d769907300cd9185fbb840bb
250 249 12 70.0 60.0 18 2 9 2d17ae5de5a59c7e6534b6168b01f6556b1d64f49556d45c27597d7e7bb0213a
251 250 12 70.0 60.0 18 2 10 6210b645a5ec3eee781e967bf3521ceebd022e4bf0667ec857a4feac624e80d9
252 251 12 70.0 60.0 18 2 11 2f1812c93725fb85e0064c6f9dc3992ee7edec3294bdd685c94a83c162eb88b8
253 252 12 70.0 60.0 18 2 12 556e1df5a2fa9e226dc5237f6b325c5075d2102f005a113b1e0157d7b89fef11
254 253 12 70.0 60.0 18 2 13 f371ecaa01e98c59256177f1f1bf1f76499fdf4576357ca48c9ce975b30f7bd1
255 254 12 70.0 60.0 18 2 14 6a199314163f874ab068a1a98ac59a9219092755b8d097e9d1c037515edd17cc
256 255 12 70.0 60.0 18 2 15 1fff79d10ac54086931bf9bd21b6997acf84d0f79c49692608b1cb6347a041c8
257 256 12 70.0 60.0 18 2 16 778fa9cc9f4ddb6be7529af61adeddda5a38a6c1bcdb3872f046286a42a0993a
258 257 12 70.0 60.0 18 3 17 a772c5a0f2ff0bd971c4592ee7b38465e404d2452cee9e40816c7e00f100007c
259 258 12 70.0 60.0 18 3 18 2d532d20c28410826e9938ff6e239afe962a33972857798926c0f5dc4bf6e92c
260 259 12 70.0 60.0 18 3 19 3a3ffb1daee123c3a86f505a3c3e29f71101339248da18cb15655f8574e78fb6
261 260 12 70.0 60.0 18 3 20 650e86d42c6f6602a4942acb263ed8eabfa32d18de176a97c1497f6f2f02ca75
262 261 12 70.0 60.0 18 3 21 f31709d3701fac65007b0c5ff8b923700451a10181e1665d6558d80e7a2a4513
263 262 12 70.0 60.0 18 3 22 980d502739464eabc67a84d5d23960f011ce618ac150df4aa5410df9776e139a
264 263 12 70.0 60.0 18 3 23 f6824e7ea271038e5a8942fc951d580df4a7d5c362798049ce12070a06374d32
265 264 12 70.0 60.0 18 3 24 fc9eb6d2c7eeda19f81a7a2f66b34ccafd272bd3f1286d252b5f563218c9d849
266 265 12 70.0 60.0 18 4 25 ddeb69f7c41b467a9a2b25f611dd8738fc580fc26578dc43a24aed924897189f
267 266 12 70.0 60.0 18 4 26 9f244e417ecfeeb164dc09fb2f90bec1fcd10098571cd08d9aaba5e7fd0d3cb4
268 267 12 70.0 60.0 18 4 27 416c16b3e01bd8f44b79038207623e276cc955fbd66814b84b8e92b0053ae4d7
269 268 12 70.0 60.0 18 4 28 7be457eadfec996d7d8fa7f8a9822c1a923fb73d25d2913cfcc0558802c00212
270 269 12 70.0 60.0 18 4 29 44a579c5c05c254fbebf02a37cf43a478bdeee3f2edaa8f5c1d32ffb0fa61dc9
271 270 12 70.0 60.0 18 4 30 3803ce4381cb448a9e901c820e3ba6ebcbc74f43aaf030f55b397274ca80aeb1
272 271 12 70.0 60.0 18 4 31 d973c7634683db76058983c86def98012911538a326339a45c72e6dc8494e146
273 272 12 70.0 60.0 18 4 32 aa42c859b298879d06bb1187dc4bcfc6bffc0b52526e00ba12bdb121737db048
274 273 12 70.0 60.0 18 5 33 814051511d2d2baabfbdaeb8525bf1bee32691dc5438c3100d65792d2ee6a40a
275 274 12 70.0 60.0 18 5 34 e18bc0c79e64b75c00866f4268a7d347cc18330f7052af18d67c7936008ddef8
276 275 12 70.0 60.0 18 5 35 f011b2f926e329b97b3ea76bb6462c94972bc7ccc681b5ddd2151ab705bbea15
277 276 12 70.0 60.0 18 5 36 cdbf6661e9bc6a97a9565bb332b6593dd6b5956a57e52de83efeaeb5fd4a3ea8
278 277 12 70.0 60.0 18 5 37 99284a9cc1e8cdeea1e570498f889ee7fe444357659c89328c8661080b70b806
279 278 12 70.0 60.0 18 5 38 8a62026cdef5374986202fecf7c9aa73660201b8912c14af3a2d0e1764632d1c
280 279 12 70.0 60.0 18 5 39 03d783f3d038fa24d7baf963896fed8d6bb6d8d155660ca38df728b7ed751f56
281 280 12 70.0 60.0 18 5 40 3b9d18d7df7e270ed6a151204a9b36b49be1bb76296d69fe1cbaf387d2bdef15
282 281 12 70.0 75.0 18 1 1 d96ace57e8fc1ec50b3f7e4d55b52af6f4ec6344aa4edf9d2197cf1b6a20392e
283 282 12 70.0 75.0 18 1 2 44483e46197dec08c54fdf88404e3f629857cdaf4fcdedc754093f1961742a62
284 283 12 70.0 75.0 18 1 3 6f8464656cc09d48ee87aaae56c2451c7c83c133c1b94f6374a4d8dc73f42a5e
285 284 12 70.0 75.0 18 1 4 69734c466a4e31823f83c3f56ddb0957f590499bc8effa2f66e207b0e3a4782b
286 285 12 70.0 75.0 18 1 5 3b3ba82b7a420600cc4955f32dfa9a262fa3ec47d780a69f470cd87e8b5afd10
287 286 12 70.0 75.0 18 1 6 0f17faa451d2868a6fd26a7033a1ca06eb95bcb5445ae8345d95a7ee7a945971
288 287 12 70.0 75.0 18 1 7 c5cffb68fde5122a7242397e78d3d3dc49a3ddcc44f350e2def70da6dd938dc0
289 288 12 70.0 75.0 18 1 8 a632203e2c5923bac4a8a621c43ee21a84bbf45a5cc5e6118e954aa8ac4213f1
290 289 12 70.0 75.0 18 2 9 de73dff1029c3e95ad3091c66d64b7fcabfe8e7abfc17e3ec23c42b88abc9af6
291 290 12 70.0 75.0 18 2 10 a1a007d66bd5f894db690cf5079acdbf951f74b6ea6d70053c32a1ddb9d973c7
292 291 12 70.0 75.0 18 2 11 7296d007af2ad58ac8f2079079d0d16a10454724e260d46d8a480b2f543258de
293 292 12 70.0 75.0 18 2 12 3a88c16487236c05545ff5e937aa333a4306845c1f06beb3d371be75a5dad5fb
294 293 12 70.0 75.0 18 2 13 f3d30a98061013824e8b031c8e301af661d627c8391a91000abd3d0fb8521d14
295 294 12 70.0 75.0 18 2 14 9fd40f070b05ea86d6895e02afe7a685b0f605670b38e794e3f4a93fd010c3cd
296 295 12 70.0 75.0 18 2 15 c7cc40cef959b53409bbab3d2530d3b83df71c466f15dd2707d33806d5af5406
297 296 12 70.0 75.0 18 2 16 15d07a57c5375bf29e804de523e12dbbc6991b6f3272644dd324a8d3e54cbe92
298 297 12 70.0 75.0 18 3 17 4f329c8d6ff3f9b0cd9174994330d78e1c0e2de30116f9e3e79627e85ee9b910
299 298 12 70.0 75.0 18 3 18 456ff16a2b408f2da1d9d63bedbbae42e5f4d86dc18da8be35addfe4de85414a
300 299 12 70.0 75.0 18 3 19 b57238a7493e3c20ab7acd48f5c552d115b6ccb9cd6f51feeeb88c76eed31d72
301 300 12 70.0 75.0 18 3 20 002e5a76eda74db073cef5dc2129be386daf14cc50d0d004e1ba0576cc9a13c0
302 301 12 70.0 75.0 18 3 21 79f25ea0e41ec0b3dc5c648c57021f2e16d7783cf585caf991b3263c9d4d61d7
303 302 12 70.0 75.0 18 3 22 d197a24245ba4f50275527ee021bf7e1112c0b3473156b55d8b794a7ed3a465b
304 303 12 70.0 75.0 18 3 23 9f8b14cae827d1b72d8df200385b3dfc3129cf53643e935a423d8ca29f7f2c90
305 304 12 70.0 75.0 18 3 24 ec666b1dc2df71f75ce096a13acaac7e6e262456f9eb6b0b73b6223130a969a9
306 305 12 70.0 75.0 18 4 25 97057dc7fa0b9ae72395a244554c4324a61e29e8fbed6d0d6a1d13f752072789
307 306 12 70.0 75.0 18 4 26 d1e2b6c9af40f5583882d204555354e0a35fd49207c2ebe5f643ef8b624bd926
308 307 12 70.0 75.0 18 4 27 fa8d73d1c4a1f78a433eaa3441fe783034442308e00bdfa199c3163af7dc5881
309 308 12 70.0 75.0 18 4 28 2f889a196aebd2ef156c246455846fd062e17e4235feafb42dfb36d5f36ac388
310 309 12 70.0 75.0 18 4 29 b09e450592c95b0af3fb25eb2c29bd585f9e7b0e06aebcf0aab7dfb74ad1b09e
311 310 12 70.0 75.0 18 4 30 b601de50837103f10f0cf4b49de4a91ec606974921b57c7f66071656320bebbf
312 311 12 70.0 75.0 18 4 31 086c23da4fcf4aa071b837f46d00c4240f9013d5b92cde2bc5d02059c7784cc1
313 312 12 70.0 75.0 18 4 32 903e76aded0de8aadc1c784b5d2344a61b93540d6d5463b99cc170b59a9e75d6
314 313 12 70.0 75.0 18 5 33 b0e3372568f0c4966ff8b1da2f4ff697f92d0872f733719e3c71ae635e406797
315 314 12 70.0 75.0 18 5 34 8dd3dc0f5e51af3acd4235855a069e6199f53a98d520d00e59123d0b8127900e
316 315 12 70.0 75.0 18 5 35 26e492d7b1a5917b8e88c6a9f8ca3ffea09acb4854b277c3386a5d6328fbd831
317 316 12 70.0 75.0 18 5 36 bd120beec68d9d87786a9467f1ea46a2f0a57af04c66f5a69c491708c38bcffd
318 317 12 70.0 75.0 18 5 37 19bcd5783ba5f2d7b59f375e53ebc49e756d447ad35a61d5ebf9a9b5948e0d9d
319 318 12 70.0 75.0 18 5 38 921cbe87c3a7941c57ee367b793da31e16484ac72607442364665ac31b4a4248
320 319 12 70.0 75.0 18 5 39 9f8f2dac4da6fcc12bda49c285f8205a58c4393feed9d4c999ce09bcc730e3a8
321 320 12 70.0 75.0 18 5 40 f71e4b9c77817652a790985464872bddd04a7553ee954786d1b057030cbc385d
322 321 36 70.0 30.0 18 1 1 248584471442f5c0260032c808922f244b269abc0e02501b3f109a70f4d71fa9
323 322 36 70.0 30.0 18 1 2 2d8c96928ef190fd083fee81ed3758d975b00b330ae4c5108d8b4f391d3c3b8d
324 323 36 70.0 30.0 18 1 3 a6c6066fcaae08ac47a3d1ac7bb436671156321a9a127ff414978fb797233be5
325 324 36 70.0 30.0 18 1 4 cb3cb83e79ce9b6dc9b2e9e93eddb9d2ff1d36f6812a0a7d01f6be4f0baf0c86
326 325 36 70.0 30.0 18 1 5 2e6928c4a2d069ed73339e40cccb688ce4292e88ed48b830e3c210eee5574390
327 326 36 70.0 30.0 18 1 6 219530ac79af7fa045e614e0fac0618693ab0f5d11769f5f93ec9315d9d6b3db
328 327 36 70.0 30.0 18 1 7 f886c05b38016301d994b682af071c150d39e6258ac42e5ea2543823670f425e
329 328 36 70.0 30.0 18 1 8 a11a45dafad59dea6bb7d57f45e5306516b5fb9d169fd014ef5819ebdd4aec4a
330 329 36 70.0 30.0 18 2 9 48d0b8143ed448224aa718f281e4ff6c9773aa23a06dfc4b1e3ca49045723016
331 330 36 70.0 30.0 18 2 10 dac8a9c41112a3f4f537f82cafe2f96f7846733c2e0a49e944ba72a3039b4657
332 331 36 70.0 30.0 18 2 11 9856d1f2ae8fceffdd1d7bd07c87f70e4f370725d6802483db0ef749ebba5a9d
333 332 36 70.0 30.0 18 2 12 70557f94326127d954b73aac72338dc6b487f01a9ee33ec4381a6ef410b75136
334 333 36 70.0 30.0 18 2 13 01006bec47abf6324d221d2cc284a5683f43455150360a459310d7a7cac364c0
335 334 36 70.0 30.0 18 2 14 65b4d4c0c2c2ba3bc708d256dedad3b1a2cb2571a188ece729504314bc1464fa
336 335 36 70.0 30.0 18 2 15 77945980aa7091d788719b4873d181436af756893057623b0cb397cebbfea77c
337 336 36 70.0 30.0 18 2 16 c61d6e3bdc94f5000751d3d3ef3dc3fdc7ce68c9c0c60cf1da46ef8d8a77789d
338 337 36 70.0 30.0 18 3 17 5d8aa8406da19dfaa9a3e9b4cfade3ae8f343205d74843b2abe0e3d5e7e8394d
339 338 36 70.0 30.0 18 3 18 464880830ab6723af9e259a546d0e12fd1a3d95f61d562c27b3b6183442dd813
340 339 36 70.0 30.0 18 3 19 f94fe635ded6d7f405898c879e4d87e389875364f35de652fe6f13b7d4538329
341 340 36 70.0 30.0 18 3 20 7478524471bfd82d3a9481f9754bbab8887b593833cb41d9ce76ec90b230f9ae
342 341 36 70.0 30.0 18 3 21 46daa340ee50f07b3089b67e02f993f51230a6e577deb5e2a672d86196011989
343 342 36 70.0 30.0 18 3 22 9a41622460a50c1db0d75ff1d38a5021e789a309ad3b836dae5c43703054cba6
344 343 36 70.0 30.0 18 3 23 16fac125bbcb137555dc4aae4c3cfc76e3591616fe27b2cadc2651cabf54ac90
345 344 36 70.0 30.0 18 3 24 d87e1271ad3580e6474b8b009f6fac97833c6a5704d41a59f95d5e937d259452
346 345 36 70.0 30.0 18 4 25 cee588aad44138d2aacbc19ff0469f27ae0e16d308f6e4b49ae7172f0a76e700
347 346 36 70.0 30.0 18 4 26 9cf93fd08f792cca9af940b98b3fd437d437a4e3865c90b0855c4a647e1fa3ac
348 347 36 70.0 30.0 18 4 27 5a3661d2ebe3ee08f0c8ab354b63ed9071e70a34312a9dbf67dd7921fc4d4c53
349 348 36 70.0 30.0 18 4 28 2073f6a3ab35830f83613a6fd4bcc738740f315b433def8bfc4203d2b4b0bb13
350 349 36 70.0 30.0 18 4 29 ac72264b8bff91641d1241807faa81d7d51434c182d2d1fd4b1dac15ae1fe231
351 350 36 70.0 30.0 18 4 30 d3e37dc59ea4d3ad7a03457c7fe72f96ff0e10a409882ab18cafd521c4ecf6df
352 351 36 70.0 30.0 18 4 31 8eab25313bb9be698cb5da744768281c0bdcc3133e0d38d8068d8511c1a73123
353 352 36 70.0 30.0 18 4 32 4b3c36b5b28a75d2aee021aaf26d475e12b2403832b1a458f0e81d6ee74d29e0
354 353 36 70.0 30.0 18 5 33 681e9f1528311db82d924303c714f4d0744a5e5c470bff04b3fd88cccbfed891
355 354 36 70.0 30.0 18 5 34 89ba9dd12d9a679a74c8446d735616b2791ac120d6ec574f27b3c3388feef478
356 355 36 70.0 30.0 18 5 35 10d3f9f5deb0a85a416fa2fa56d9dbd1feb8f7affc5e34ba253fbceff405a2bc
357 356 36 70.0 30.0 18 5 36 0c6d87c9b57e5be53d2481f6f4436a09d594621007e46ef0c12eaf538e0dbcd3
358 357 36 70.0 30.0 18 5 37 9f1ed2c8cabfb3cece3aaf4589f71d3938fd857180ee7982a21e5876450b9a12
359 358 36 70.0 30.0 18 5 38 b04f238b85fb6bb6f66fc4b5add511ddfd84765a0574290c400c222b96ba88db
360 359 36 70.0 30.0 18 5 39 51a03a7db2b399b0b595a50eec494bcfa1db4e4d91245a8cd2a7ecd2bd464d7b
361 360 36 70.0 30.0 18 5 40 9a8bc8e039bd34e9ec796747a232912e6bf9aa8c7a8c782011d62597184b4332
362 361 36 70.0 45.0 18 1 1 90be74acea19dd3e6da1be479b4bb341e5a79c6d76b32b41b05df7b256e1088d
363 362 36 70.0 45.0 18 1 2 a2872d440e4e3d350d7531aa21a48f366221d87b931c610e807f46ee822b8a74
364 363 36 70.0 45.0 18 1 3 2b5d7e61bbeffca82a9304cc0c71ee187c5a2fcd5a95c8e3e4b5befd89bb8192
365 364 36 70.0 45.0 18 1 4 70876ad4daaa2df8a343141d2a50bd6d998a53ad85a1985e43f527cf8c1786ad
366 365 36 70.0 45.0 18 1 5 c37159b1f45b8fee6d5c8eef179fbd75ee01e0f8b2053703d139789f7e7d26c3
367 366 36 70.0 45.0 18 1 6 26a643e685f8edbd5d3b70d31adefe6e9b85e6662678e014bfee5d57fc6f533a
368 367 36 70.0 45.0 18 1 7 28c7f431540c4644e6a61a3e00d5b59ffa561078d31b123184e23fce9e4df621
369 368 36 70.0 45.0 18 1 8 7b228297c78f1227faff27af9b3994183831acc049ffafe2c0af373afc266db3
370 369 36 70.0 45.0 18 2 9 a3e0d6d3fcfa09f83220ed40e232eaf9e5f555cef054aae9150c4811e9f7d7b1
371 370 36 70.0 45.0 18 2 10 e6f154a6cbc2e2a24f5413774ed83b84517ad670bb36a7e2cfa2cf7f21246bf6
372 371 36 70.0 45.0 18 2 11 d22d152f99955f5f397d3ba330335cd49811cbb791e12c97e3d87985c3b0f21d
373 372 36 70.0 45.0 18 2 12 6c397c4334211f525b36b1b251d68253211c7e42761a7a82c68e1e5ac6e80b3f
374 373 36 70.0 45.0 18 2 13 95d0bdadcec3cb1ed1eb1708de4a8a13b4846208ddbe134b546fe0a2deaba019
375 374 36 70.0 45.0 18 2 14 b007545ba048d7370cd77d6784fe79333ed9a5e4ec93095cfc4611ffec85e14d
376 375 36 70.0 45.0 18 2 15 3b6fd55cc073b8c395fa0a986765dca866a0b9f37d2e6a9493fff0a599819a6d
377 376 36 70.0 45.0 18 2 16 f252b46d5ea9e839d9608388c076bf19afc05a1bb8c47ac445d8e56f2033f5b3
378 377 36 70.0 45.0 18 3 17 c08991ba4aeee372a39286b17816f2897ea83261714b119ef170c044d62f282e
379 378 36 70.0 45.0 18 3 18 51292d57fad3542eede9903465997091d73fe2f8d1594983045898cb944bf856
380 379 36 70.0 45.0 18 3 19 5ef99ce242c18aecafaf0521136b587a2e07e53bb3ecda63cdda5b5cb0a7dfc2
381 380 36 70.0 45.0 18 3 20 39a1710feadb8e9dcbf8baa40097ecb057ca7531d6c36fed7cf16dbb6313abc8
382 381 36 70.0 45.0 18 3 21 b1aaad87660e354e1b3b3e9d09e304a9bc432718eb6d0a50baa14b2b4bb86d7c
383 382 36 70.0 45.0 18 3 22 240100aa3231f8a541262fa0cfd293155a5ad3b5f4b2021043358a9bfd62ec82
384 383 36 70.0 45.0 18 3 23 45bf0336b31bb1cbd9a3f1fb1db5b1c70ca53435ff5918b3c294b260592dcfa9
385 384 36 70.0 45.0 18 3 24 1d15ba55c5b86a7ab4da7e54df7d45e6140e65fa480636f479345a395f106706
386 385 36 70.0 45.0 18 4 25 3d131abe0a04ec00c910910457db26912eb6da65ab2ded4a8dcd85f50c39d74d
387 386 36 70.0 45.0 18 4 26 2ea5604f9a1de87281e601aa4cad3eb204d14541b0378c434c17bc3c8cfc5224
388 387 36 70.0 45.0 18 4 27 08dbd66a78cffe4476a127812e0dcdcd23f2d2367f825e6cdaf0467c1e24be91
389 388 36 70.0 45.0 18 4 28 1db71534b5ab5b9be43a28a1473f6bac397e9a1c4e91da08757bca0dfea307d5
390 389 36 70.0 45.0 18 4 29 92cd303c25e937f12b0b72b49c438592b5df3fa5e68753255bc3efb7814e02a9
391 390 36 70.0 45.0 18 4 30 e7069dff3d15b7dc500518c63253829bea689e7007aa42c8d193fcef9cea0a27
392 391 36 70.0 45.0 18 4 31 ba16f6cb59658b195c62f168c185e51f61cf77f459964b7d2bff160098d8fc1a
393 392 36 70.0 45.0 18 4 32 685f9f7771fe3c57b4dba73b431f67b2360f14aad3903fe5ea5c6c7c90aaf219
394 393 36 70.0 45.0 18 5 33 078e7329cc9d8ab5e8a04c33cfd25e31e11c6398ad972ba9c2f1e937f30faa01
395 394 36 70.0 45.0 18 5 34 609770166e0f8fa215d7c48dda770ad80a7dfad3c7c21e4f248f2c3e2ca43921
396 395 36 70.0 45.0 18 5 35 e0cdd5fbcd71f3d2721e98bce0e409a2e7a21f7bb7a812bcced038e8fcd76875
397 396 36 70.0 45.0 18 5 36 6fab79daf7b577a3b66e5bf71af9e69097030a941493090d051ae8ed95b92fe3
398 397 36 70.0 45.0 18 5 37 570a1818d1042ce8d22a1d8eca32238c44a2add9cb9f7160a5d8786b5e3389a7
399 398 36 70.0 45.0 18 5 38 486af276f074edd1e510cff98c149cc3bed75f6201ed15af106b1d70538c8ead
400 399 36 70.0 45.0 18 5 39 4b0cb53f9e8c92f096039879ba33330291f7177aefa6361771765e2672542cdd
401 400 36 70.0 45.0 18 5 40 5ccc68842219cf8674d34567bec70fdd069657e1c14c6d0fe63f43b2256b1685
402 401 36 70.0 60.0 18 1 1 59556f1d703fddcb5f8a1c71d25ee4d4595b179eb665ee8c1b02657261784502
403 402 36 70.0 60.0 18 1 2 426ece1170fa546a95f61ac09efd4b0dc13e33b7313e9010da37359083e20a51
404 403 36 70.0 60.0 18 1 3 a51d6c41add78d6bc8a88bcb0e81c5e8d6562f18867c06369a06a42bf381bf22
405 404 36 70.0 60.0 18 1 4 2428f29a94da709bc5283d51e58b2545206ff7b5ba53068e3214eaba60e4cd20
406 405 36 70.0 60.0 18 1 5 927d2e685a7019ea6cf4c276409630f41e26b7ec372a8804932cdaa31197d36c
407 406 36 70.0 60.0 18 1 6 6e65f7d7bf87e80885b13836b31761073b624187a72d9dd847530aaa5e0507c4
408 407 36 70.0 60.0 18 1 7 d6d18363ca745b297a55389b5f6a307c1565f05e75ae1cfc7872da9c4e6f3ad2
409 408 36 70.0 60.0 18 1 8 e00346a2e9d2282b25d48bfd490f30a1a32bcef781166766dbabd3229d878f7f
410 409 36 70.0 60.0 18 2 9 eb0232090637255e7c10f916ebd004568517100415736bf0635dee3e1ec77275
411 410 36 70.0 60.0 18 2 10 c62959eda7ae13c322d5f0aa01165e28bbde857314cbb36385eddd28654f29a4
412 411 36 70.0 60.0 18 2 11 8c26eead5cebc6005db15087b1641e11faae3ff6bf8f44509721f44ef180e409
413 412 36 70.0 60.0 18 2 12 bd0d6051d364faad95a40b8f9e0a1f80f0487c81a86f20e77f9e83d60e706fed
414 413 36 70.0 60.0 18 2 13 f6120712487bf8f52fd318b0e2cad4f0a6d6ebdbea894f020a8ca372f4655048
415 414 36 70.0 60.0 18 2 14 e0357cccfdbb2a2269aafa7432f94aa47ca1e08d54d264cfb3d6ced160b37e0f
416 415 36 70.0 60.0 18 2 15 476a58d88d2564f1feb9adfd80bf0ec14bbfd1c30d6fe766144b2c73d3bc4b43
417 416 36 70.0 60.0 18 2 16 389dbdbdbf866051f10fcc194f32e30854dc594931d7e776db9654dafd2b292c
418 417 36 70.0 60.0 18 3 17 37426fa1abc1aa3abf8998063a6f3bddd90317c135f79104dcdebad6f4fafe3b
419 418 36 70.0 60.0 18 3 18 277fe6d1af382056dce00c8f739bd7a1c333875bf50818ca9816f1dbcaa89c95
420 419 36 70.0 60.0 18 3 19 a8c4ea3e18e6db9732d289efb0c89482e932782da197f3f98380248efdde5051
421 420 36 70.0 60.0 18 3 20 b1c709f70c837662400dd227560818ec0857a412c535f54cb0be453a2ac98e48
422 421 36 70.0 60.0 18 3 21 bf7f62fff9901aa29d1566d259387c43db47fa0c0e996c8cd84f7dbf599ef675
423 422 36 70.0 60.0 18 3 22 a650f017d73d0d941f32eb9f5fc5920f6e4ced2545dfa9b475e38d4a28a26064
424 423 36 70.0 60.0 18 3 23 c78e38013feae848812fe5d535222a40c362254ddc7466664600e929308d3615
425 424 36 70.0 60.0 18 3 24 7435517f36cfb6b418649d724700595cfc6575bc9f30cb00468f08ebdfa5f584
426 425 36 70.0 60.0 18 4 25 e45ce43099b5a3684be30da793c0546e4e9b835507f48a1a8ffe7cd9ba9d2a82
427 426 36 70.0 60.0 18 4 26 afff03742f32f3311f643c90d5d7e275b75520159795ee72c13ad7e2c2feeb1e
428 427 36 70.0 60.0 18 4 27 79a34268153dff806709e4f551a8ffd066c31434f777e0fb1b8b98a709b05209
429 428 36 70.0 60.0 18 4 28 fa4e38b63991cb480996afa4da6b505958ce450d130936978e19f9f64d1823c6
430 429 36 70.0 60.0 18 4 29 0d45ff5f8457f995f3382c2f63a973c106172c6aa8606d931616c5e0930a656c
431 430 36 70.0 60.0 18 4 30 ddd5e0548dfb65b87a851065ba0709e5f957eb9aa9ddd666cde7bb870a859381
432 431 36 70.0 60.0 18 4 31 f20f69f00a4f5da57899a635fa37bce745e563021781b977a1e9d85a00ce2f68
433 432 36 70.0 60.0 18 4 32 5e1b05884fdb80b01dcc3dffad8724e8d39508c034b802e0324f31d60947dcab
434 433 36 70.0 60.0 18 5 33 6b346c80baae6ca31d8fc7f55e8de79caba9798aa18776f9b17d5f7b157847cc
435 434 36 70.0 60.0 18 5 34 85b8adad69f613a3c1b3c7ef082779aedae77aff6fcdac451202c1c0d647a969
436 435 36 70.0 60.0 18 5 35 9c2051002fb3df434a1c2eadf330d72b99422fe54335e5acea077fbe87f5e359
437 436 36 70.0 60.0 18 5 36 155fc6483e6aefc55fdac5aea3b35f8039ed651b87baa16d6eaba849ca4bcb88
438 437 36 70.0 60.0 18 5 37 758a1066b24c29431b2506c4d864390dc2a784ca6fd528f91fe76671497b17c8
439 438 36 70.0 60.0 18 5 38 2c577d9a10ab8e2e0cc8c5603f00cd4a01072a7140891d6cd3377e3aa1160b8f
440 439 36 70.0 60.0 18 5 39 ad2f4c8035f9c13344865dce3464e4cea1f707e685ea369e3fbb52615ea1e891
441 440 36 70.0 60.0 18 5 40 943eaf488358adee1fbbce74d37a32108fbf91152d18289adbb31a544b2b72f8
442 441 36 70.0 75.0 18 1 1 cbdb94a442ebbe1811336a23251c858df1b9c10c3e9cc1bcc185ef1d69a96f26
443 442 36 70.0 75.0 18 1 2 2adede935dee4e6d0923c81cddcf4f66f149ab5309423a5f105beab11a4403ed
444 443 36 70.0 75.0 18 1 3 5a86b62d31c3a622a1d80f0159e910691223b2bd847421c3375ffb6583e3db87
445 444 36 70.0 75.0 18 1 4 871cbc1da5c4aed1f7f4895c36f01e9748d1985aba09907f30b76f87b30b8ffa
446 445 36 70.0 75.0 18 1 5 bd599b099bd4fcb6f9f606c1163069493c0c1ed8ab6a9b9a010093a57a05d9ef
447 446 36 70.0 75.0 18 1 6 ffc46f27f15b187762ba79cfe2a56423a18d7d23c07d9aabed8ce5bd234e4b50
448 447 36 70.0 75.0 18 1 7 8179fe9929c6b490867e63224a8e3035e99cb19626e50663b831f189480f658a
449 448 36 70.0 75.0 18 1 8 5c8ae45528b474d156aa1eb25d76ef08129650371487cc8761ac6da8cf72ad7d
450 449 36 70.0 75.0 18 2 9 7e302b09ffc14a100aa64b1e8622f47c34a6a1c8824ee890e0140606b6aa0685
451 450 36 70.0 75.0 18 2 10 0a50e1d616bf34e19361be6019e6a8e61d2121c1143033b7e9e3aca88233fa38
452 451 36 70.0 75.0 18 2 11 fa4076eadcc3940656ade8ed3ebbc576fff8bd3258a9ed09598e29d6620d7523
453 452 36 70.0 75.0 18 2 12 02565efdaa65c729c43a39170621e40c13fade1eddaf1e8c2f179f3c0b953f00
454 453 36 70.0 75.0 18 2 13 0dfa686c8a4d1893e73b1295b0a97e41d991b4c6cb24078b798c1125ac29393f
455 454 36 70.0 75.0 18 2 14 4b0f2feaba7bce3714d18b21ac0a7acfec0fc40442305024b58727bc023f5478
456 455 36 70.0 75.0 18 2 15 1891ebdb12795a6c16c9a9a01ce70c30a9aa8189008a76ece314b72ab9ec0bef
457 456 36 70.0 75.0 18 2 16 503de3fbd61a7f105c004bafc3c8031ec25085700350aea0d4ebb7a7f59a2efb
458 457 36 70.0 75.0 18 3 17 fb9947deb1cbe460ff516d4a70c5206b6cb3d8f85b10afd546e15a349fa3687b
459 458 36 70.0 75.0 18 3 18 a154c6de2f30e55e90f6cbdceca8d98b8c4a6b5cafe7b44670bca7940a0f9ad4
460 459 36 70.0 75.0 18 3 19 488896d297d3c30c8000d4892034e2f329b1ea6ec9b6b87b3c334f3671e56f0d
461 460 36 70.0 75.0 18 3 20 181b0b336afee7dde0fe7da0c65251d9dc3ff578732996afc7a60c327b26b588
462 461 36 70.0 75.0 18 3 21 8fbaa88be619d9b7cc978c66e9cbe11294ffd4bd6cdf4caec457e3f421996ef1
463 462 36 70.0 75.0 18 3 22 cf25734625017c7611e0c85e1edd1d848082bcbbd43417d1526ddc5673452ea2
464 463 36 70.0 75.0 18 3 23 19df81a8447381e1f1c6d309b6493cc89014be57f1555c1057a4733e4e66d62f
465 464 36 70.0 75.0 18 3 24 4f95b97067999cf7b849901ab18533458c77a848537185940a3260440c59d116
466 465 36 70.0 75.0 18 4 25 da2d293f8a3b0ce203db9778e6e5745890c449efb42e92439487f39f6bb27641
467 466 36 70.0 75.0 18 4 26 411ad85bf3adeb87a541a71d701e8822305e3e519674adcdf208c1de5c237e30
468 467 36 70.0 75.0 18 4 27 af93b94e08c9bd11255c15d8346605eca4aff3a32f3024e67663afb9eeabe173
469 468 36 70.0 75.0 18 4 28 62d0542e49815c47c5a53c2c4d7cad459078ab54573ecfc869f79f350f7f97b8
470 469 36 70.0 75.0 18 4 29 cf6952469055380c4a12acc28fa8974abdf0aa8f7ed938e3d1ddeb93b951d693
471 470 36 70.0 75.0 18 4 30 ba2d4c7f9dce175301b0013f46071d99f6c32d11cc16d9825ed7b071e4f19574
472 471 36 70.0 75.0 18 4 31 0ac77a3c9e9b5cd41327473309353dbdfa796fe5ca1ca33f3d4d7e6ed045fc09
473 472 36 70.0 75.0 18 4 32 f567f0537c8f246096b9506f456ffd2f84990b55defb8aff2f5c6fc4ab453e2f
474 473 36 70.0 75.0 18 5 33 a9ebf4a296f3dda9f9834a49d875e39b0a8b287a576b3264339bb6e33d5aaf1e
475 474 36 70.0 75.0 18 5 34 38d3cee2239fd7989df57c0de715a66dd8b52c20d7c8da2ae51d736c24930312
476 475 36 70.0 75.0 18 5 35 d2f631dd8e4b475c964467689df19b2bf2bc7e52fffb4a7199ab22f7c38fdd43
477 476 36 70.0 75.0 18 5 36 869e3d78321ec4f5f4267419e1cbf7887bcd4278c7549a4ffd7d33aea75d8a4a
478 477 36 70.0 75.0 18 5 37 0ca6421defbadfe953df8f9c795136509355b690168765a8598bbdb493a4ad3a
479 478 36 70.0 75.0 18 5 38 8a41fe6bf62e6c3accd6fe16e1e72d83a29b80625ddeaec6332fd3467de072a1
480 479 36 70.0 75.0 18 5 39 b50a53b7b5cd03395c5a61abbbc85d707a4e4a01071f2cdf7481abc07f6cdfc8
481 480 36 70.0 75.0 18 5 40 766e86b06f6d288dd6c002993eab57c8a2fed9f857c5be949d074b43994e3cea
482 481 48 70.0 30.0 18 1 1 27d8329f039cdabcfc5f6281b636c8cd018bfb60595eb345e16f09d2dbb119d6
483 482 48 70.0 30.0 18 1 2 12ab023a461edcd6d12c7bfddc011e043dc7ad9650972276c1c95d7d78581ae1
484 483 48 70.0 30.0 18 1 3 45bdbbc203337583539d3cf6f46bf3b625b7edd9c5e5f926ce90c7531393f87f
485 484 48 70.0 30.0 18 1 4 f47542a1e0039626dea277f3e62bd6924c04c08568402c43bd66eceda5293436
486 485 48 70.0 30.0 18 1 5 74b17ffd53440f03c21fdd9fae488761e27a8bf86439b8243de5a0ee4bc4bd21
487 486 48 70.0 30.0 18 1 6 daea4d146f02319e4fcebc6acb7e0f6003fcf4877586336dbca14eab74b7c95d
488 487 48 70.0 30.0 18 1 7 99be31852af92e57094ac48a25b352e5a072e20d6cb94cfbe6786465701bb618
489 488 48 70.0 30.0 18 1 8 0dfe1b919acc1d7b2a664f167b4b3adad03cb71c9a13c74279015efc3fd3a8e3
490 489 48 70.0 30.0 18 2 9 7b6d7af9764f95b0816d3fdff37f004a64a4508e0e23a509937135448a6cfa21
491 490 48 70.0 30.0 18 2 10 c7f829298a810640fee4a11e99554154cc322b3df6bf25a84c36e9ab1af72451
492 491 48 70.0 30.0 18 2 11 b68e70b12a4ceef60f4549824b9722220b84d2ca1ce6f3f7af3298eba40c3a9a
493 492 48 70.0 30.0 18 2 12 3107131465c9226abba826486d8150373031ef892c9a1a9031af27ecc35d1022
494 493 48 70.0 30.0 18 2 13 e67a6c82d42e93704333d04ba142bc41feb2b14362a764b2a7029ce52e1d2019
495 494 48 70.0 30.0 18 2 14 c9e165dcbef105d63c6e2cd4b3984865d996f7288c3d7b3269472e3a74c41674
496 495 48 70.0 30.0 18 2 15 7384b3b5fd16a62d9e9123e5659bc4a652f0ab1d8dfc9a3514bf3dd28a46e512
497 496 48 70.0 30.0 18 2 16 bfe0d63737cdf81c79b719a46825b1543609ff14e40b7b45785bbb5fe001da4d
498 497 48 70.0 30.0 18 3 17 0fc5e16fa554e7068aa421b1a201ea014119a2053116c35129fb7a8e22b9acc5
499 498 48 70.0 30.0 18 3 18 4ed0eb899a8e900bd1d06ce0b598ad4a27ef0ed50eeb525b69481cfa14a0cfc3
500 499 48 70.0 30.0 18 3 19 909cf9421daaedd5a68ecb06fd420de9463bb41f46e248836d67745ab14e532f
501 500 48 70.0 30.0 18 3 20 779d615d724509ffc54febcc893a9f5842598d9fa212ee639971ec7987340790
502 501 48 70.0 30.0 18 3 21 19eb8bd64642bd98a720cb2498eaf120ad1d73cb6b5f35f9039bd67087d039ce
503 502 48 70.0 30.0 18 3 22 11d5ccdf85e742c4893e03b329280fc21a33ae15d0a0f904190a93ee7071cd55
504 503 48 70.0 30.0 18 3 23 e16f401cda2153b4d43a848460fb26f09ed71406d53843fda0b518d2b5a66ff6
505 504 48 70.0 30.0 18 3 24 bd360e916fd72d5ad8d9aa6c31086fbc388c4173fdb3c7eb5c36c2cc388d5687
506 505 48 70.0 30.0 18 4 25 a510b750651f0771d56ce3afa4e48054faea3af118fad992d4a146c1ac677d8f
507 506 48 70.0 30.0 18 4 26 87b2b574ac4d7a3ee4688041f62be03bd606efceb79a7f904378408671facd21
508 507 48 70.0 30.0 18 4 27 0d7562d412a86d827c6e93e78f2dd558c1dadff171b3288a345934dd88954c29
509 508 48 70.0 30.0 18 4 28 94d508d6ac96f4327bbbd6b8612de8af93c5e7ff893b2c89823ddc2ec1694121
510 509 48 70.0 30.0 18 4 29 943d617fad9592957ed4bdaa41ac61fd4bbc18dd4a0be5618c2bae3d802ec945
511 510 48 70.0 30.0 18 4 30 2d3ddcbbc5be4797b7cf838f0e45094e1d9466841d7bfb6762ad86744486b346
512 511 48 70.0 30.0 18 4 31 2ecd23ed12b7322e7a1cebff4ec4665eb27c520d7047e94ca2057cc7d7b49ee4
513 512 48 70.0 30.0 18 4 32 d627c1780c913818ee306db6802c54a6363134112a1c51b8433d51519bd2e14c
514 513 48 70.0 30.0 18 5 33 f9e74db5ec5de0fe84af23d33d8478241ec845af6c21d4d51eb391767ad2f390
515 514 48 70.0 30.0 18 5 34 9d4edf435b5f0a94dc4b9bc33d4cb2630040f5a599aed997491ce9889724027a
516 515 48 70.0 30.0 18 5 35 b7dce0ed8b03dbf46a0b856f64921a4fad27cf2b4be2d2db883fe231ff32af7e
517 516 48 70.0 30.0 18 5 36 9e465575568d143a304ca79f4b40f31be4884ec945ae144edd5a408fd9c5399d
518 517 48 70.0 30.0 18 5 37 dbea1196e25801630c1af9cfd6118bc81f351ffa4f99deb477ff61e3d9349326
519 518 48 70.0 30.0 18 5 38 798b60fe4dad377188d675619f370d720131e92cedde64f213fef618972fdf1d
520 519 48 70.0 30.0 18 5 39 d02068a37fcc9b79704fc641a8a40d8d2f7d4090db599ea170f48d5d74e833aa
521 520 48 70.0 30.0 18 5 40 ca3d1770d3b48dd74de5566fb64945d30dafdbe6d9eb5841beef7d56f87450ca
522 521 48 70.0 45.0 18 1 1 fdb3487b7434eb0138b6324879dc4737103b045b991b6ab9c743e2a238a47fa7
523 522 48 70.0 45.0 18 1 2 76f306624883378b076a723f05d75b312b1587bb9763b2d38e9437bc233e09db
524 523 48 70.0 45.0 18 1 3 82b95b712c14837072ebeec08bd718f9e16a07fdb0e6a5f9a52e43981ac9b3ff
525 524 48 70.0 45.0 18 1 4 8fef05e43882aecb8a2b33fe65086a5c5e5b196b5e029629dca955578c5b94cd
526 525 48 70.0 45.0 18 1 5 101b2ada5f7e635e8d12e0182a3914d2377c8c0399868ff20590118d7c7701d7
527 526 48 70.0 45.0 18 1 6 c7643722b54d6727cbbd7f6d6cd65f813359157afad9aff9e20620c8afa3883b
528 527 48 70.0 45.0 18 1 7 75b5197a696aa42ff7c15879c466fb818a1503743e966d10af24f8a033db19c9
529 528 48 70.0 45.0 18 1 8 89da1a2850431d5d04b642ebc42944385983e82c3def60c3c91aac514bc08b20
530 529 48 70.0 45.0 18 2 9 da127497bd8271e93a6987943654b319c4639bf45d473b148c0ea7474f8aa0dc
531 530 48 70.0 45.0 18 2 10 51fae85dfb7ac6a64570a1064466c47d984b999fb6ed89a9bda7c8b7533f456c
532 531 48 70.0 45.0 18 2 11 693b1858f99b72e9ed19967b95cc5b521cbb1bf56dd7c0eb275ec02bbc5bbe3e
533 532 48 70.0 45.0 18 2 12 b78b22f5c02d2bac593712ca5199a105b8b8dbf186eecbd0e9bfc282c05d5c59
534 533 48 70.0 45.0 18 2 13 8e53614a26a438f4d02a5f86843a121869be5ea1b8a150e1a02419be3aa1b073
535 534 48 70.0 45.0 18 2 14 fd3d73cdfa59b373811410a2101cd5fdd52284a6f71ab4631b7b9241b3180e37
536 535 48 70.0 45.0 18 2 15 1834fcebd0047bdf2054b8390e6554fcd5496ce0592b054b48f2e5ccbc388296
537 536 48 70.0 45.0 18 2 16 36997f218b0701a44064e675d227b4dae9ad64e006fae9a28a95f561f9aed635
538 537 48 70.0 45.0 18 3 17 c02b7aea11257a2e1134206a60407f06366d3ce83ad11c28e46ea1fa5b7244e0
539 538 48 70.0 45.0 18 3 18 d5e9b36bf678817fd8bcb44229b1367bb9cd600d1501c60e755500737e6ddfbe
540 539 48 70.0 45.0 18 3 19 f950f88a85be4dd9ca45b3523dce9b22f1d167aec81b186af27f1ca1b3b51b0c
541 540 48 70.0 45.0 18 3 20 84cfdcd42339f0329146e81306660ed9f7708f3d994a4639a7ec7765252877ed
542 541 48 70.0 45.0 18 3 21 151740928ac89137ac7614ac46609bee50b1d5ad19e7c0fa193c63cd73e708a9
543 542 48 70.0 45.0 18 3 22 3a6f57df920074fa590f6c88dd308feed2cafa88b1368f9b6306572fed8bfbac
544 543 48 70.0 45.0 18 3 23 e8318128b9a8739be41c844c0fe35e1e4e5273618987b01f4da01cf8b507aac2
545 544 48 70.0 45.0 18 3 24 6cda1df59a63787f68bb7e2f2d99571c3d07353c273c3055ab8513b040313a7d
546 545 48 70.0 45.0 18 4 25 a9b979ff0a4993fc4ca13632b6e90e1bc6369517c8bc0db990a7225dae28b290
547 546 48 70.0 45.0 18 4 26 156bc234c893a6ffbc4ba909989ce6e2aaf0f5ce5e22e68b2b64b3902b0f67bd
548 547 48 70.0 45.0 18 4 27 dc906a624a722b32ec3895507640995a7a3f3120eab88f531dc45a75ce520bde
549 548 48 70.0 45.0 18 4 28 c30d6e29017babfab8c43b0a569b8a0c7116421cd11b3fdccca405dc65c840a8
550 549 48 70.0 45.0 18 4 29 886ba3f2b36db2a4197f053853ee017dc157dc2376af9bd6f731e670cf0e1a0d
551 550 48 70.0 45.0 18 4 30 b694aa09b11c80f5e66de1254868e47a68df33764958b1b35f63f2fb572f1cf5
552 551 48 70.0 45.0 18 4 31 d8e7e77885c7d420bdc1e4c3719aa16403aceeb9a4eb0d24a6110b538594b9ef
553 552 48 70.0 45.0 18 4 32 02480b50db7b4a2328578ac9b286765a0d92958b035302b37257c210b7c6b387
554 553 48 70.0 45.0 18 5 33 ad6fa7e966a5ef112c44798139024b7e597b98cb3587dea0732cafdcebfd9ca6
555 554 48 70.0 45.0 18 5 34 60c587b10c78db341ed95c7582dd12214203e8e335eb4f14f05da85f04b7cbda
556 555 48 70.0 45.0 18 5 35 0d766c5e81b82c6eca4e9ff2387646768684c2d7feb598de8dff4f500e054e7b
557 556 48 70.0 45.0 18 5 36 96794dfe4c82360cf2599cbfd2ae7641e9d2f46303ed9202c5dbd547d0b182e7
558 557 48 70.0 45.0 18 5 37 4344536b72242f835c2e61550f8de75f9b59df659ea581f176cb905c1b940db3
559 558 48 70.0 45.0 18 5 38 c2d3eec68b48572700a6ef2a24a2d181950b3ecdaeabf2b6795558fb8b8de06e
560 559 48 70.0 45.0 18 5 39 875de8f891f5505c2ccecf75315ff191d06fedbecec2ea8a51b5cdf9f753354c
561 560 48 70.0 45.0 18 5 40 885c2b49f512cef34f86fcc1de068493f0bf49c1a87de690416fb4eecb99b707
562 561 48 70.0 60.0 18 1 1 5aecf69197e1e33b9442a101c691a6db0510903afabc367364f3be1c036521b0
563 562 48 70.0 60.0 18 1 2 d0a17decf07cfdfeefc6b7ee1af2aa3896df83d451386f87133beb0967138919
564 563 48 70.0 60.0 18 1 3 07938fc3d8068ff88936bc2a85df783441a162d2af5786275efc4e6e2fa1c6b2
565 564 48 70.0 60.0 18 1 4 e4e2d6356c381ca31f61b30a3c686dc4b82b265f46b23dddbdb59abf5ca24ba2
566 565 48 70.0 60.0 18 1 5 519e9912cf011b521c519bf10590bca9886c0f395c8d863005d97cd271016f36
567 566 48 70.0 60.0 18 1 6 992d7dc67cef51403d39f331214711076c3f4e9cfe5ee91dc6bab53def0ce854
568 567 48 70.0 60.0 18 1 7 7e8e7ec4113c45d3450f7558135fe7b8fc8cfb2f6fba824b981657c01c43479a
569 568 48 70.0 60.0 18 1 8 41837dc7fdafb0a8cc14c3cd01049b7d6971c6b51fd3572aaf6dbdf52720dabf
570 569 48 70.0 60.0 18 2 9 0e101872b33c4351e2ae5ac0c7137180ce8123a78471888fb980f9497e14da30
571 570 48 70.0 60.0 18 2 10 9b88755ff7599e6be2c3170e760518ae74b803bbdf73dca3410501c9099e4c49
572 571 48 70.0 60.0 18 2 11 d7d801d3a57c030bf1d6b57b9f2401886d7721ef3abc865cca4e4f30ab69e45d
573 572 48 70.0 60.0 18 2 12 5467574ee705a9dfbf995d508cc450381732d20ac42350840f9c6961e9d60552
574 573 48 70.0 60.0 18 2 13 1ac9202e4ddefdb3634a3ef4ea7e064f940d6411da12a1de8f630a10ccb97957
575 574 48 70.0 60.0 18 2 14 fa997711a93dbb4308f43f765679214d65876e8cf8e44c08ed583f122d6e1f4a
576 575 48 70.0 60.0 18 2 15 f42be1a73bef593b4ebba74325532698d5b2484aaefdd5dc510c0c50086c648c
577 576 48 70.0 60.0 18 2 16 3dc7863ff18efa716c10a8261a40ab06f0436366fb4a07b3da849bffbba647df
578 577 48 70.0 60.0 18 3 17 57e1d742d9e9b6fbb9cfa2e42a6113ff5ab76339471c12be64c6ff6132f60799
579 578 48 70.0 60.0 18 3 18 33ef429d7e992b09b4dc00bc40219ed624b8b2cb49e67d9fa732df38126e6264
580 579 48 70.0 60.0 18 3 19 0a1a587c21884a760b402d3faa45ec5cdc4f7bd70041c6075a22603ecb099ccf
581 580 48 70.0 60.0 18 3 20 d1c0db8ee4bd603a19106748b605708c12243b6ac7d5a647c17b9cb4df48f5c4
582 581 48 70.0 60.0 18 3 21 95928a9dab213c3004aa22a4a1bd23f1e9bcb0e11971270ea08d44c52ee2dcdd
583 582 48 70.0 60.0 18 3 22 57e7c55e7b97774af9571ddf649b1d5be8ab191275968647ae1773ec2703d487
584 583 48 70.0 60.0 18 3 23 29bd8c05df1409ff8255cd4fc7f7f4ba7fdc338f29b28d44de4babe33c66361c
585 584 48 70.0 60.0 18 3 24 88399c97b571df7c1cf44f883c18eca23a0945c99326735cb9b6fb413298dc3f
586 585 48 70.0 60.0 18 4 25 a8752e09cf07ce1c77df7c101085757d68c9cb3c43b65c1f017eafaab3a58f71
587 586 48 70.0 60.0 18 4 26 95672a1595dcfada6f135029adf5ae871e5908f5276a67b0a55e64737d26d040
588 587 48 70.0 60.0 18 4 27 464f4ecf26e152033c10e1e4455fd10286836367b72b2385f162e1ecabc20e11
589 588 48 70.0 60.0 18 4 28 c9b3b8a52e9947530e7473a047c2389f53d585011294e5e07481f2dee141ee60
590 589 48 70.0 60.0 18 4 29 b9ae2d9fdb21ff72dbd9772fdfa10c2529fb369a7bda0312093adfd4ccebce1b
591 590 48 70.0 60.0 18 4 30 9fcadd070f6bdc20a0e1ea1b6408ce65715b9c027159bf3648bef3deec38e4b1
592 591 48 70.0 60.0 18 4 31 53e3f68d0d089fccdee1e73019a3977ba0400a4c44e0d84c1bad698642b6674e
593 592 48 70.0 60.0 18 4 32 a8b47fc377430f47a40ac05b5f2524b9f2fba4e0c119072e70655d1cd896cd10
594 593 48 70.0 60.0 18 5 33 b407064677a4b3d39c4d7fc0e1388489bf77f8433b1845675db82545cf040c4f
595 594 48 70.0 60.0 18 5 34 7bf87a66767aaf2b5d957ad307bea83ae6ea0a824ea540775c9bb552186b8b4f
596 595 48 70.0 60.0 18 5 35 60b61a56cb7c3cb244a910ad178db885e7663ac82e69cf45842241c8890ce8e0
597 596 48 70.0 60.0 18 5 36 962223b37334c2959651b7e2ee249f0a78c7dbea11d5bbc9ced17d50865b0a9b
598 597 48 70.0 60.0 18 5 37 48534935f46f7752354935145509bf6486cd4e50f78d7f31252975bfd7f2c95a
599 598 48 70.0 60.0 18 5 38 a051c6f325eb8c706ee7d1e1a01e3795d821a46c444ca610d6c34132f0160ec2
600 599 48 70.0 60.0 18 5 39 1fb0a450f4ee518650b38e798d9e10019f763b38d491ba4253c0e2730ce5b9d8
601 600 48 70.0 60.0 18 5 40 79f91eb20d3d8532c49db3dca9fab08725b3d7bcf0d109d977f68fe7b87265e0
602 601 48 70.0 75.0 18 1 1 d7eeaa8f1649a723b7abb9fd1d18f29189d5408fe4fd2624d2938ace3f06b091
603 602 48 70.0 75.0 18 1 2 b554e60c148e9ef3fa3798d10c21f1b932d23d10963835d58994b04d4b1e5510
604 603 48 70.0 75.0 18 1 3 e5b0631c281563810f0ee8fc11d7eac0025423dd6425074e06125ba8b2491619
605 604 48 70.0 75.0 18 1 4 0e43e004635b17bd7634143cfbcb366294058162a0c97183289bc044a4fac3e0
606 605 48 70.0 75.0 18 1 5 dfe1508f5cad58f4305f1db86ddc91a7e4b1e4a0db0d33ba0cef30ee549eeda0
607 606 48 70.0 75.0 18 1 6 31fab94cce16f9c7daaf0f7c500e40e777f795c52b8327151e469f9548573d31
608 607 48 70.0 75.0 18 1 7 c397d6918775152702df1a022e38f2b9e41e69c6531a59e67b12ac4b70da52d8
609 608 48 70.0 75.0 18 1 8 d906351b3418f817ab7cd335496706bac6fa3643d63ead89fcc88ffbc7f61233
610 609 48 70.0 75.0 18 2 9 f79805a8003ccdb86bcb728289584d5a9fd680bee488c8f8c3b2c7875c4f099e
611 610 48 70.0 75.0 18 2 10 62c4230b3d59da9d6609dd9edcdb42aa8e6b30e08af55173c8411473eb6b9661
612 611 48 70.0 75.0 18 2 11 8f961d4d2a0878f2fe0412cc9fb9a7fe46830f72e1f43fca506a5586cec1ddfd
613 612 48 70.0 75.0 18 2 12 b6a7b69c7c5d8faeebcf257687941c3f4d89c70bb97cd391c815edd777750075
614 613 48 70.0 75.0 18 2 13 ae6343e557054da428cc5dc7ecfeebfab665338f4f26290e2635780b6b402ab1
615 614 48 70.0 75.0 18 2 14 901ea9a740e0c1964a9ccb93bac62611d9054347262db9f35e0e8f60073b9c04
616 615 48 70.0 75.0 18 2 15 6390643039d6c72aa31031284c6392718c4d0a3505dd2feb7d50b3514e969324
617 616 48 70.0 75.0 18 2 16 992e704651033042c621dc2c4d0c0c7bbab29da19b09ca2b100d03ff43328082
618 617 48 70.0 75.0 18 3 17 051806f2094a9b2c27672333b6aa61c743c4b61ed1039f255bed0e3e487ed08c
619 618 48 70.0 75.0 18 3 18 fec4601a13da68c62ce84b0811ad7799724a19b291205959085b2a707b9f9967
620 619 48 70.0 75.0 18 3 19 1f079f880219e1db1c6587608a33cadfa9a86ee2ae6786b58e5af7619e84a63a
621 620 48 70.0 75.0 18 3 20 01efb153a45e14b2e3111c37e471571dd902a40184dfbeb489d0eb2daf9bd2df
622 621 48 70.0 75.0 18 3 21 276dbe527dac944b3116c107a549ec4be024205a7c8f33d091e8c0b0e908ac55
623 622 48 70.0 75.0 18 3 22 9999109cc255669360317338fc26ca7303b73860e264e05c6883629c8b3a9e63
624 623 48 70.0 75.0 18 3 23 f4f1933d96945e45e75730bf98b6a0f567704d633a19ec45396e18eed0d97118
625 624 48 70.0 75.0 18 3 24 d91d02458e76ec6afead2f8286e4980a7fb86747852881640d55b9ef5fe86bc4
626 625 48 70.0 75.0 18 4 25 74c82c57965a3aa51e586392ce74e7c0016f1179f3a14b92e9e1fbc451c1d9e0
627 626 48 70.0 75.0 18 4 26 f3cda2efaa4a863707e59317b111c3f23b05f00e481a3667ee37c2c9390671b2
628 627 48 70.0 75.0 18 4 27 fa214e02aa28243e9571e32c5eba2f54c4c52dfc2daaaefc1055095112adb219
629 628 48 70.0 75.0 18 4 28 2a77501d215e0c583b27bb18573dc6eaf6feee24dd40b6c1a04ecde278a9670f
630 629 48 70.0 75.0 18 4 29 a9c26bbef3a6d90c6ae166245944c1daca5b74f917376e433df19a774e03d85c
631 630 48 70.0 75.0 18 4 30 f48ad946b1da1991a06268b5ec46fbcccbf4d197698a316a95244860bece6e05
632 631 48 70.0 75.0 18 4 31 4d0f0af5ce8387d09f8c01cd9d23d053634e8f1d68b0da268e4ac7f557573b66
633 632 48 70.0 75.0 18 4 32 eb4da6b66edaf96e0734469ed61e1d9221566df5af745bdab7ae29af241edaff
634 633 48 70.0 75.0 18 5 33 b7e324fc8da45d0a625bfb6b37febe864ee5204e5c2405206e6dcfc6b9116762
635 634 48 70.0 75.0 18 5 34 bdc6096adafd26b3fb9d2cddfd783e34ca7adc96a627e3537812d87b52a8cd13
636 635 48 70.0 75.0 18 5 35 f1c21e07811a248315935c3b6835f6fa1674cece8624a97d971cb675c3c70be3
637 636 48 70.0 75.0 18 5 36 5c220eda4949fdaa62982d7790d842edb6f3119e9a06dd48d041b73d0f9da7cc
638 637 48 70.0 75.0 18 5 37 462f3c16ef26aa37eafbc3985f21805cd2fa096f876c6b41e715a9600772dec6
639 638 48 70.0 75.0 18 5 38 ebfc0258dd701d5ecb9c71c83a015afabc0a0ae07d28da240ef07ad927970fc6
640 639 48 70.0 75.0 18 5 39 ba6049a5568df0c1eb14cd5cad390264ae33cfffec17b2f6173aa4df2daf5d82
641 640 48 70.0 75.0 18 5 40 4a7effed25c48e70c06b8d806a90df75a66ebc49854a63c27ffe0bffc7d10d72
642 641 24 44.0 45.0 18 3 17 6a79be930e3f5d8a6d93d2be2e9d820e25431867246d354a918ba30a1a61e5a1
643 642 24 44.0 45.0 18 3 18 041665ddd95caa35c195e4b0d3d7ac506935db021bce15754e0d816d839d89b0
644 643 24 44.0 45.0 18 3 20 a9975d76693becd8b7d7c6774bb7b9c7bf4e15b55c093e1ef046241125b7bb6e
645 644 24 44.0 45.0 18 3 22 cc7cd460fa197fd4e5496a5074260e4bfd5032b0437f1e63c0bfa6d3eae3158d
646 645 24 44.0 45.0 18 4 25 31371d08262cbee9b686152ae792f088e09305f352d569f57ec296798074db7e
647 646 24 44.0 45.0 18 4 26 3b26c9c25d1dea95919368dd8d4e2dc5e6f12b7ca845d06e5b5225f22c56f6b5
648 647 24 44.0 45.0 18 4 28 30a9f0289ec91e18462faeae6635537258cf35456f75308f57c79412035bb097
649 648 24 44.0 45.0 18 4 30 a16408879c0a19e785eb648fe2602cb7854d355529a6c0c4e748ebca01161dbb
650 649 24 44.0 45.0 18 5 33 593f1f6d2fec52ef1a9f879bb4626ddd21acda471d7923c614a62d311eb62fed
651 650 24 44.0 45.0 18 5 34 090b05ab2226276df7a9c1a57574478a530c68a2c7807cf2263eb6fa2ceb170a
652 651 24 44.0 45.0 18 5 36 6aafd2a05e60b44bb2c2553981ac0e1b33d593a62b7cce88ed54bb8103777e8b
653 652 24 44.0 45.0 18 5 38 04d6bf8cb739045eaa4863390fe755201a3b05b220ffc1638e334fac67124207
654 653 24 44.0 60.0 18 3 17 c7810de3f394e2d0424c36a540bf2e08ea296a7d0de1d54c40d37b805225e058
655 654 24 44.0 60.0 18 3 18 51baa4bea9570c73447ea7bf2ad1a72cc910106d237686722e79d7e1b7a39286
656 655 24 44.0 60.0 18 3 20 aadfbceb3cace83e419ead14769d9f25a70700009ad084a389857452758cdad8
657 656 24 44.0 60.0 18 3 22 0eeb06501b69eb3164f8fef54c9869fa25938091e56b705ec4cf914815bf9304
658 657 24 44.0 60.0 18 4 25 7f2156fe26dbfe7b195aed243499e6a51f5d9149c0e8a7e68ee99eb29b005bea
659 658 24 44.0 60.0 18 4 26 828aaa4f0dbd6089d93c2c29c1c1f7583f67c751ae2161498051f277a8dea462
660 659 24 44.0 60.0 18 4 28 5e638db76211730565d91e25da586b7de873e6627736f73a0ba6a10326c327ea
661 660 24 44.0 60.0 18 4 30 a6adb87265314d8c7ecf8438b2a33986c9e255d34f4a319dd71f9c6b1779334a
662 661 24 44.0 60.0 18 5 33 fc602fe01a557f10ae902744eaca1dade6d772743e5f9e988027d6a772935f56
663 662 24 44.0 60.0 18 5 34 0af47869fdccca86210d78db2d0064e29434d567882fe6085bb905af613f9b8b
664 663 24 44.0 60.0 18 5 36 09becb0ecc3d26bb4c3b1c323f7b1d0e82b243da756a1a7dfeec120fc7051ebd
665 664 24 44.0 60.0 18 5 38 86b09bcab0ab86a860f5712f78b32e070d0f376cc28fc9dbe66e6f16dff832b5
666 665 36 44.0 45.0 18 3 17 010166753add733e0f42a24784b9180b3c44c5a83693dde78a69d4bcf42beb88
667 666 36 44.0 45.0 18 3 18 fa71ed9d7cf1b4c4f8e224230c383c51badd0fc7b79108090f988446b5ea0b04
668 667 36 44.0 45.0 18 3 20 66762b2bc2008e9781fc1905fd32879ae2951833fc730868ba0473bf61ce6b6e
669 668 36 44.0 45.0 18 3 22 cb4a4b67699eb3c77ffd08dc5ffc5bda7e3c9f83e8aa46fc3c029091c174f938
670 669 36 44.0 45.0 18 4 25 7df1bc88de8d03675c68bb5dd987773a17ca0bd12cb1cda260c07894d137a8b0
671 670 36 44.0 45.0 18 4 26 932f2b6ec9ef50475bdf0932529c5ea24e42e6af0495535d924209d57918cd76
672 671 36 44.0 45.0 18 4 28 b4c1730344cbeb8940990f0a70eb7756d2317331c7fad727a131e8603bc87b0f
673 672 36 44.0 45.0 18 4 30 e0555718e5a0073f331f00bae223af967f7b959a1f7e7d2430a9887c937ded62
674 673 36 44.0 45.0 18 5 33 afa2830736bb01fec5946980a5775fc4f816d5deba3bda27d2895f727304ab10
675 674 36 44.0 45.0 18 5 34 ef1e22c7aa7e13786db8b62dff0e3644cf256d42b961e68b8186998f59e4a9db
676 675 36 44.0 45.0 18 5 36 02fc885f4068090a6a60a30041194304a1cd146c92450f7539c23fbc60eb047d
677 676 36 44.0 45.0 18 5 38 0f1ffd4d5824dabd4ce2749fe59b80f5bad0c277f42cb62e1573fcec606600ae
678 677 36 44.0 60.0 18 3 17 c8b24333190860f04436ebba9d4318693e5e32f550a87d55e8e2f6ee3d7d3b29
679 678 36 44.0 60.0 18 3 18 b87b0b9049921f06a99f4c511fc47e666a7d3fa29a34717fb446af0d2a8a29c6
680 679 36 44.0 60.0 18 3 20 dde07435d98036b2dc2eae7dadd07c68626e024144fdfd521723620c128f4715
681 680 36 44.0 60.0 18 3 22 0f1bcdfde7d7cd7a5a216a316e26382f77bd5c71078053b86c79eea4fd15e549
682 681 36 44.0 60.0 18 4 25 db4863de7147f9d3da0a12abee21e1c35c680e73ef71475558644f8816a2526c
683 682 36 44.0 60.0 18 4 26 0f10a86f6a56994edd021ba0da3fcdf744897561620f01ab3958969711ca3cf4
684 683 36 44.0 60.0 18 4 28 6fa723df1865d6129bf3cdbf2c4c6b8104987e28b8c2e9eda09dfb0d9f8416e7
685 684 36 44.0 60.0 18 4 30 3e03042ad17164c54e249d54cd684da6a37c32a0f58a312740d027e624683648
686 685 36 44.0 60.0 18 5 33 3c0f6be7bc618e40282a742e167078dcf1ba1168779124383c0f03a1d6fc7ae1
687 686 36 44.0 60.0 18 5 34 91a0572ff7b4bfb3c5e240ef446df0c46028ea6aed00ed08806135f1b5b55e03
688 687 36 44.0 60.0 18 5 36 0c6456c42defdcfef38ea81ae0aaaf32b46e82ba2b73ee34c4441d2937b5c71a
689 688 36 44.0 60.0 18 5 38 00f12f2f7038c6474ebc21ecf0176da8346c09542b386994f5537bfb5a5241fd
690 689 24 70.0 45.0 18 3 17 1cfd563b5e2e33af0c55818030f9ef8023ae864074826504ccc8d4efb44edc6c
691 690 24 70.0 45.0 18 3 18 912cf12be7c1b13ae1e3b3d9fabb6e847e7caa8f47c6c158d6372e0047cc76ae
692 691 24 70.0 45.0 18 3 20 58d4db45757ea9f2ab4b378967ea503097d00caab46865b28895bf054f206019
693 692 24 70.0 45.0 18 3 22 e85811a08abd2173773f27eb75b2b281cd7436fe4ed6af6117a2bee52c433f02
694 693 24 70.0 45.0 18 4 25 f6bcc6d49e26f96ae115da5eb5f8be819d7c1873e571b02d10293a5fa96b9eda
695 694 24 70.0 45.0 18 4 26 6696ce43d9813043b6ed25a3c6f8ada639a573650203bddf2d6a7bd5866e816b
696 695 24 70.0 45.0 18 4 28 9ec5c6b2f4b2c51f73bf9d1da4c58b98a22b925f8264472012e98283ac580c32
697 696 24 70.0 45.0 18 4 30 b3879bef42e67927c90a6530a14227f2248499338d2fe4b5737647c6ed4127d2
698 697 24 70.0 45.0 18 5 33 0820931b889af1fed61edda568e0c39dd7c2d69b47fa6c4b458e003a366574ad
699 698 24 70.0 45.0 18 5 34 0607faab6f826f1d4a7b87c0a434d46522f7ee34f2c8c48370260fcefa086156
700 699 24 70.0 45.0 18 5 36 94ee0eb797e700549a8cdacb2fed466faa9585b3d949e1536b69a31a2380bf3f
701 700 24 86.0 45.0 18 3 17 3466c4797ba730ea6432879dfcf62eb17ae89c816fc4bb1041cd19fc5497bf60
702 701 24 86.0 45.0 18 3 18 4bb2c0bd0e237dbb94dd310ab9602f6e6f52d12535913f982fc859df6396fb27
703 702 24 86.0 45.0 18 3 20 1e6951011b49b7ee53c2774b68d832ff5f92ba289d026ef1ed3b4a149ef33e8e
704 703 24 86.0 45.0 18 3 22 5302a1ca6138f0fba4f1de2b61bae7c89276aaaef547c8e1aca3034cd54ea499
705 704 24 86.0 45.0 18 4 25 da60c80f3fd92eadb037e67f7de7b3e6fd1517002dd54389bd8ce9ab7e11ee50
706 705 24 86.0 45.0 18 4 26 ffefd32bae330ad1ce73c97c3a209bb343eca9fb7dbd408dc3037f805d2a60cf
707 706 24 86.0 45.0 18 4 28 a36f99c4aefc95569b74a90dd9c202cc46e2a386bcb6f9c4c09db2b899704ae4
708 707 24 86.0 45.0 18 4 30 cd2468d7debc9df8a633d5220adb31ef792ebabba5947653bb4c6486a8a42afa
709 708 24 86.0 45.0 18 5 33 28c0be32cf3b0780bcbbd82c23a7823b67da0d41fda3717674023cedd7106bb1
710 709 24 86.0 45.0 18 5 34 ccb0f504f6c8e6167c3b66f3df87186ff47e318137dccada85dd6d5653b2b811
711 710 24 86.0 45.0 18 5 36 357963d25fff943e44e5658c29c0c5a7afea4a389d5fefd350454f0b88d5ce83
712 711 24 86.0 45.0 18 5 38 b4ff04d4e525b0a7d5f7345709d894775e4e7ec81cac9d0b08212f9a7797fe84
713 712 24 86.0 60.0 18 3 17 6717b920253a2445e671c4927c578e83d378331df4a2f3598fdf454512ef5d5c
714 713 24 86.0 60.0 18 3 18 d7aa97096828d4a73797abc12026caa6f21eb14b3ffc6abcf5459e08b226466a
715 714 24 86.0 60.0 18 3 20 171b6dca3c9f2709997ffd9aa34050f5c554df8699bb74fe9df382e6a29b55f1
716 715 24 86.0 60.0 18 3 22 9a70f609d60ca0a2f37f800646feec571a6205b7feaa046b7af244f297368838
717 716 24 86.0 60.0 18 4 25 7d52c3c05d1237e5873fecd8019e4f0b811042f3eca250d101c0ade0010fdf77
718 717 24 86.0 60.0 18 4 26 6e1e0c31740c45c7816caed391d0e241706a913137c0a42be69d2daa10ed67fe
719 718 24 86.0 60.0 18 4 28 396e758392317c8d0b072717d60bd690bc6e2e90fc49c8ae6e8ebcc3ea4f88dd
720 719 24 86.0 60.0 18 4 30 52c54b0ab187cfd9a0ea312ebe9b5cb4413bd5770c1bb247fb1eb0b02078f0da
721 720 24 86.0 60.0 18 5 33 eda7332972bafd9d96ec8993fd927b54ef72462d8dbb3ba65ee59e3d74f98ca2
722 721 24 86.0 60.0 18 5 34 f3314612d9708b66b8db85cfac8f81e250367887a1257ddaf4247d3c0e9ceec0
723 722 24 86.0 60.0 18 5 36 dc19092aac8aebb1b2eac755b7b4a147d554532cdf2250d88df5319f85d67163
724 723 24 86.0 60.0 18 5 38 0290dcb05317bfc601904e42fc7fbfc720c0d4c9902b95cf82cbb1f741bbf988
725 724 36 86.0 45.0 18 3 17 60e363cc403e111353768527f78fa6348c0e6f58e345dc7002f63e14f573c6ce
726 725 36 86.0 45.0 18 3 18 8af8405f611e0ecf699f1f78cea84c83d981c49d3ce64e9f70647498ffaedff8
727 726 36 86.0 45.0 18 3 20 9de3bc418f1f668a102efc5147b365389cea4899d1b8f520be529ab1c5ac3e78
728 727 36 86.0 45.0 18 3 22 73d323bd76aea059ec1f45fbdade579055cc85bd2193aabe2e11ab1a7f810462
729 728 36 86.0 45.0 18 4 25 82b2666b6ec79d0a0014ceeff04ca2f5000116e6a9e8198834027bfcab78e391
730 729 36 86.0 45.0 18 4 26 776a73e0f636401018cb4f3a7f0f8dc59c85d29598e20e38bfb12f43fc18f7ad
731 730 36 86.0 45.0 18 4 28 746c299c320b72d61a65db2c381878d5e4ec59f096271a2e3c701775974d1e45
732 731 36 86.0 45.0 18 4 30 1c6ffd145b9dc856ead0b8c0c333d47371d6b7c972d877a0ad9325e55d2a2b04
733 732 36 86.0 45.0 18 5 33 82963adcd890f55ebcf626e1703e948a8ce96f1fbe88e2b97e9e88c8d83de148
734 733 36 86.0 45.0 18 5 34 ae51e3eccb71bf8f01f7dbba96a02139c9e89f44768b527a31c3368a0e54e7c9
735 734 36 86.0 45.0 18 5 36 3b01974644dff90aea01db239a16f1954ffbe2c6514de0c0b925a79b0468cbf3
736 735 36 86.0 45.0 18 5 38 032f7d973235d2d1072ba5c16f5c3b4bad5be676e921d347b4f60e3169a533d4
737 736 36 86.0 60.0 18 3 17 a054f679964558057bc520be2b68071dc5a3fc7910a3848af3d6d413fdc3c67f
738 737 36 86.0 60.0 18 3 18 e2a9ff02075f87cd5eb055c38e9cab81dad9cee73ba0632f7c149beefe38a4e6
739 738 36 86.0 60.0 18 3 20 6bf9467b5da76c7ea09b7884a89a8add220df9f83ca326df36c7e39f4fd09a98
740 739 36 86.0 60.0 18 3 22 69dbfdbfc722f552b62601661885b5f2d3ce6e92c0a14c92808c8db1be6b6a41
741 740 36 86.0 60.0 18 4 25 6dd48be935e3a8c2883464b58d3138954c94014f9239c1984df54bcb429090fb
742 741 36 86.0 60.0 18 4 26 af990978b32d74de9da4108b8122bda97949928812633bec8e7b6bf28a0de8fc
743 742 36 86.0 60.0 18 4 28 50ad2d2c657d0e884726559ee99e92ac32c34325b6bb70ac51ca6dc0dfc83a26
744 743 36 86.0 60.0 18 4 30 f896f07c65f43d3404aab817c3b10c519ca0da21642145a63f33647cbb38a3c1
745 744 36 86.0 60.0 18 5 33 a04a4087252593dde2c491388b5daa5935d4486cc739b43aaa3cb273d133864e
746 745 36 86.0 60.0 18 5 34 d964ca6044b87624f8566d14e3a3617afa1263a2a5cc56d5f9443989ca3ecec0
747 746 36 86.0 60.0 18 5 36 7fe359b48229dcea630fc52694b065dd55bb55a3321376b277ebc8751202c578
748 747 36 86.0 60.0 18 5 38 80d2b7c90243b8af9a9b39bd6bcbd3fb17459f2dc7e3c3aaaea75c08c1da8c89
749 748 24 107.5 45.0 18 3 17 615ba58b1496d245c78404532cb3526010e9b8844288aa244b0d6d5582928d9e
750 749 24 107.5 45.0 18 3 18 bd8fb61c5bc30cc0ed46d975739a889b7d9d68b20bdd00691491530470f41bc4
751 750 24 107.5 45.0 18 3 20 47b53acf38d14b9eb64523f87c51d2a0a23e88e9717ff0280a731c403cabdda8
752 751 24 107.5 45.0 18 3 22 514f3993bff6744de8cb0ff1e131fea0239a328b6838c58bd6d11f20f4e8bcbc
753 752 24 107.5 45.0 18 4 25 5795564070f43991d54aa5174f829d019bdda254a2e8717e27b49e311e06de17
754 753 24 107.5 45.0 18 4 26 147c3718a15d1a6f912315465941a615f0ca2e7d5bbad0b15a26df3439ce8de1
755 754 24 107.5 45.0 18 4 28 89bf8b352085188f8d2bc7458c7feaa87677a47bdf64cf5776ebdbeb5c47efe0
756 755 24 107.5 45.0 18 4 30 7b7dec4d95a93d61fc6c79d7549498b5e8e0c9e256f36d9c76ef58271b99b46a
757 756 24 107.5 45.0 18 5 33 c09e665a2d75f7de564a50309411c392a120a8bab12ad2e5873ea231908cee6a
758 757 24 107.5 45.0 18 5 34 d867241104df2ec98776511800504a30a907c1b5f7306500e28db2e029c74c2b
759 758 24 107.5 45.0 18 5 36 137430e0f7a9bb3c8e8f02f00481e2b544133ce876a3fca25bbf8c7b9de261b8
760 759 24 107.5 45.0 18 5 38 f351a1c0b2f13970191137ba1ce9e643d23985a7f41e85df4f936e62fab27021
761 760 24 107.5 60.0 18 3 17 201623ebca0cd628d43f27d5fcc28a9c340e4b5072714306e075842163449d99
762 761 24 107.5 60.0 18 3 18 1f666acab2243bd4d01fe5bfe41506dd15c48047538d7c421b06e41c5404e9a8
763 762 24 107.5 60.0 18 3 20 e7cf225605058f1dc79feb607c04605d3f56cfe0a7ba6c7de4d1694fdad7c7ab
764 763 24 107.5 60.0 18 3 22 053473a9036e0e2718e7cfc983858dadc0c35949965ec97ab87fa7bd202c3f47
765 764 24 107.5 60.0 18 4 25 2eb8a66b1c247b129057b92c1cf7308bbafe74d07ee3fc20317a83a4b1dbd256
766 765 24 107.5 60.0 18 4 26 44f5f63b6762ffaafe531ae7a86b0d1f45c3d375c88eb213c0578fdfbdd216af
767 766 24 107.5 60.0 18 4 28 e4a714ca561aa71a1096489418aa69b88ad77256e2e3dd94eb53aab5939b077b
768 767 24 107.5 60.0 18 4 30 0bf86495d4a5a14886652e1e94f655022e4e722ee181afbb08a7c7b0e3bd5ca3
769 768 24 107.5 60.0 18 5 33 54465a5a48e18d4f3ddc488c6582050da8d4874244dd5c9226498568b69bc047
770 769 24 107.5 60.0 18 5 34 73eca2736f76cb5a49f3e52d89a5beb3492cacf2852b71cbda4e780334490114
771 770 24 107.5 60.0 18 5 36 f2623e2076e686d228b50087f6d8a9265a210baef5ff4b35d431446fc5414704
772 771 24 107.5 60.0 18 5 38 586d0a221eeed624df740cf44dc2e48b743205599672b18bc1cea7540556640f
773 772 36 107.5 45.0 18 3 17 8bffbc662238ffa5989a6fd9be2010140936bf31ed0f2a9ceb6b28277a4b30e1
774 773 36 107.5 45.0 18 3 18 1420888be53046afd9d9baa1949313bd9749be47a62468b5c3b6e7efdcb5374a
775 774 36 107.5 45.0 18 3 20 ee2ff3a578f8b20987879790a4228324a440225788a4f6f0f63c888340c09cc2
776 775 36 107.5 45.0 18 3 22 ff09abd844c0877ba6e73c92699c95c95b0dc93cdd35d74f9b7a8bfa07b3d0b7
777 776 36 107.5 45.0 18 4 25 1845ab46fcf203123e94615396e9b6f63fd12b4d8c16dba5f9b6986ac330e7df
778 777 36 107.5 45.0 18 4 26 2b0928170c591a6244001a77500713ff30efc02743c481400ce3c3a16d336454
779 778 36 107.5 45.0 18 4 28 28b0d5e2bb17fa56d38b69f5aa0c3a9fd916233a3e35fe50a12e1e90b16e6833
780 779 36 107.5 45.0 18 4 30 7a1af44d922730a1a2cf791836d3e4ff4077e6971030c49b3774ae336180fe7e
781 780 36 107.5 45.0 18 5 33 c3b63fcd67c1237cd345886eacb6c99d902ed73121f6b1a259ec7c129bc7c2e6
782 781 36 107.5 45.0 18 5 34 cbab5001fe067f4b29f825358c07f7d0e9029e959186ba0a95fa64c3ef159326
783 782 36 107.5 45.0 18 5 36 36f9127d9e9bb6cb2ede849dbe2f3ea53f247a59a589e2737f41480ee32eb121
784 783 36 107.5 45.0 18 5 38 2ad205e18f506a4abbed09e6952199948d719d68fb1a2769af9e3ae5515e6084
785 784 36 107.5 60.0 18 3 17 362cd034d736f5a3c247d36878ee45469eda2b54d38546799ed9bcaf41e1db7b
786 785 36 107.5 60.0 18 3 18 bbfdd5d8659caf42dd9a370b2d5f0fa01d131241c186cc25a40db3debd1c9791
787 786 36 107.5 60.0 18 3 20 b46a91da828087a26beeea983806acc749d7bb2b349c4fe44c0b35d5efeeaa1c
788 787 36 107.5 60.0 18 3 22 40e758568ff0535d62f2b0b12ac374e8efdc6ebb88cd0221deb06e36992bbc5b
789 788 36 107.5 60.0 18 4 25 6e1901760c146c3af5cca1a188d36cdb32a557a0b3ac67bd168af62d3f160b3f
790 789 36 107.5 60.0 18 4 26 e56e1d2b1a89bd4646509085ab7f0de77692ecbdef2679fff3454f1cb45c9383
791 790 36 107.5 60.0 18 4 28 504c51e86ea4f4b9273dae0a1a81a727569416306c2a841261877682a1806400
792 791 36 107.5 60.0 18 4 30 64c0d2bf29d5dfb707ac62f0ac11e54ddc953b25be9346fe91ff8ee6616e6c95
793 792 36 107.5 60.0 18 5 33 2be9f82190bb351a0730b17152ab6bb061f6c6357b0d264139ccbfcb3180fbdf
794 793 36 107.5 60.0 18 5 34 c2353b62182c71be56920ed0848c5dde059faed7ae928febd3d0a1df61dae48c
795 794 36 107.5 60.0 18 5 36 c9c8c639d9d8ddbb9a881e39f9731f82552ca4c4bbc2d98983c12d666cf650ae
796 795 36 107.5 60.0 18 5 38 2bd4a30b4465fc9f7cb44f873d5888f843b392d9fdb900388eced6f3bbf9c40e
797 796 24 70.0 45.0 9 3 17 f7c65072c564fc12756ac7deec6864efa741bbad337f54bd53c8f7b372bfb46c
798 797 24 70.0 45.0 9 3 18 88c3e0908c4d575444a30cc21b6402341c3fe14d273488b4f7e42f6eed8eff5c
799 798 24 70.0 45.0 9 3 20 1f36f4982291c13802c7088f77aa735433a6a31e2b8b6be994a127d9b468c2bd
800 799 24 70.0 45.0 9 3 22 c8319bfd61c251119d3495a6b6a189177017b62ea38318cdf4f2820bff4650d6
801 800 24 70.0 45.0 9 4 25 874ecff13642d4792240121f6a5e5a26bda3b609fb223458b0334523cebb406f
802 801 24 70.0 45.0 9 4 26 53e1db6163d560bb12d235cb33b10474442351e3134985f978605f2bc0113dd9
803 802 24 70.0 45.0 9 4 28 66e6ba78f344d5b05b1b6eee99c650d16cd10b5c293c7468ad58f6ae03c90867
804 803 24 70.0 45.0 9 4 30 60d099b9873ddaefcce129309543672805883e61928f23696240f7df2876a45e
805 804 24 70.0 45.0 9 5 33 59617a6567edac8f16d50429fff8a7bbbad9e090fa7ec04046c1bd3a66cc958d
806 805 24 70.0 45.0 9 5 34 7be9d8bebc3deec2bf05adc16ec1f30306477dc76aac257b96c5179525f25c0b
807 806 24 70.0 45.0 9 5 36 f77219d6798955894ab2eaed7f0305800e5c9f2dc63ba99214548c27ddbeccd0
808 807 24 70.0 45.0 9 5 38 d3e2b40bf61b625f5bcaf7e8227fe0180f9124a667b6d6a5a993dba1144ec3d0
809 808 24 70.0 60.0 9 3 17 ef396f0cc3810b5563aa5de7983b4742b293c2c96d317e341b56a28c0a333538
810 809 24 70.0 60.0 9 3 18 69a18b201fc83a197ff0d82ffc97f5a82d6aa0207143e3f45394d6c16cfffa90
811 810 24 70.0 60.0 9 3 20 877232a58830d7c1e895612fa96ae338d5bd21676d16658c6ddd45153fba91e2
812 811 24 70.0 60.0 9 3 22 a240efaba675cc1af88925f5d9f8bc906eafe63d34cd52804b7141b70fcaf1ec
813 812 24 70.0 60.0 9 4 25 2d8878f78a1bef593759f5b14c2e6ffc39148c53bea4115ba50d41dfb0af16c8
814 813 24 70.0 60.0 9 4 26 887e8f1362b6199cca665964b00d056441938494bee6ef261e40823394d7f17f
815 814 24 70.0 60.0 9 4 28 14a616fadaa773917ab53008d1f96b7ff3db570d01f30c546790a190cd3ccd65
816 815 24 70.0 60.0 9 4 30 cc8c6de89062c3390dc52fb4636a44cb1f6bc285c3f65cebb3f7462884af4608
817 816 24 70.0 60.0 9 5 33 0a69aab800e2be7fbed9373e657ab0976b79349fde6be843e9ad1e6ba346ee08
818 817 24 70.0 60.0 9 5 34 e7cbbc9f0b76107b6e1d70bdb03f695b0153df672ee7230cb37c14f33e47a99d
819 818 24 70.0 60.0 9 5 36 367ba4546c76d532cf014c5522fbe991d993da4cf00dabc43866fa30a9a724eb
820 819 24 70.0 60.0 9 5 38 a75cc00e1446e5a3e91562a0daa11e0ce3de71986742b55c6e6adccec2695d49
821 820 24 70.0 45.0 27 3 17 1bda78c38a9b1412b357923751d7af84ab6ecdad3d9471f131d918db2bfb0a25
822 821 24 70.0 45.0 27 3 18 2aedfe89f2915c6faabded4239c5274c742512fe554c76dcd21c3057fb3d9409
823 822 24 70.0 45.0 27 3 20 23f2808530b950186123fb354ecbaa9065fe4bb80639ce8af7643d1fc5fd0778
824 823 24 70.0 45.0 27 3 22 27ffb87ab25351b7bbcd5f17d50c24e88ff55f7bdf0b80a6c8488d4fa8604f50
825 824 24 70.0 45.0 27 4 25 4613f06c939f1c611958a7153afc0bb57dc86a775a7908b386d0ed963d766e10
826 825 24 70.0 45.0 27 4 26 cba374793aa40c7821ccf3e4f57c95da998f7dcd3856aabebe0312c3ea833da2
827 826 24 70.0 45.0 27 4 28 6663b83f2bfec70981dfae791212edf22dd758171e1406b6a7ece1152272218c
828 827 24 70.0 45.0 27 4 30 f7643ae1b6d74e64e55c6dc87b7bde5580f7ca9269242e9e37f12854e2df516b
829 828 24 70.0 45.0 27 5 33 c0cef2a3a5be3e3566650d75bb494dd1ac6c344640c16801e5f87956e68ff493
830 829 24 70.0 45.0 27 5 34 a41498b106cdc87cada4da79851382ccaca8d72de47a1e3872a72eb22571c791
831 830 24 70.0 45.0 27 5 36 6208d19ab8e8894678c06c6dbb176fe86734dc09846049b950fbd83ede999d2b
832 831 24 70.0 45.0 27 5 38 14e2433cdbb3d09db341749109691f4f887b4e587a73a77ba8666724124281d4
833 832 24 70.0 60.0 27 3 17 a47302f39abab1d61631f77a2a66ac5f5f19e0cce1e545c5b11e09ba0243b1f7
834 833 24 70.0 60.0 27 3 18 910e24bdd59209a7940dac87eca8a8833e40a707ee138e580979c4bfd8f5d2ad
835 834 24 70.0 60.0 27 3 20 1d27d3ebc3ed8aab99e891f193a479ae8ea59e65302c1553b8cbf51cc030dd36
836 835 24 70.0 60.0 27 3 22 307007fd709f4ccb26bb8a256d31e7dca30ef3f3292bc2dbba4771f085ca1dc9
837 836 24 70.0 60.0 27 4 25 8115089eef04b47cb6275050d907618d538c345f7756f8020d8fb289e6f23bae
838 837 24 70.0 60.0 27 4 26 af68f473a3c45905db8197e0aadf5c159317ec79b4d8e0ae1fa5d353469b9c40
839 838 24 70.0 60.0 27 4 28 21b76603d35fb4acc8780880304393952b106c64157da0c92df6ac0aa51af9d3
840 839 24 70.0 60.0 27 4 30 096680f71554f3cc58a3d1b628e9c8a97d2955fbc9a9b84372d7f7174e9e48d6
841 840 24 70.0 60.0 27 5 33 520845528e0465821a43ca6fc021ca03f78f25e7dd7a9e773313a8db8ca1bee7
842 841 24 70.0 60.0 27 5 34 bf0b065c3844d07027586b12677d5a8a14b6966953725ba78332d998d4e9ef25
843 842 24 70.0 60.0 27 5 36 fdd34e8aa7234c1d2d464018bb6ac32d2cd866881b2233271ce4371c8b3a4743
844 843 24 70.0 60.0 27 5 38 b9f4c40bb1e5ad8add62918b8db821e3b5b0b41569d89f9d53026f44659cf4b0
845 844 24 70.0 45.0 36 3 17 57e89909f924237ed35aafa2d600f65a5f1839c9b11285dfc2022a9e546fa643
846 845 24 70.0 45.0 36 3 18 70b5b7d36c76399fe2c0b1d2381bc173d2052b29896aef86013eb75b7ad878db
847 846 24 70.0 45.0 36 3 20 6620a225f2d346a4ee5dc3a17a4b4eb07bfefa6ccba668b680aad054559e33ce
848 847 24 70.0 45.0 36 3 22 f44480200440e9f85f6c9e918b24e17633bc863943af87b33e536fdc1cda2acb
849 848 24 70.0 45.0 36 4 25 a64ad90bf862aa0fa705c6f052beff71e9912adc6b0ac4b414a367687ed8964c
850 849 24 70.0 45.0 36 4 26 125b0a5ba773eed31ac3030936e59d82667497a17e904968df715542c2f8f6b6
851 850 24 70.0 45.0 36 4 28 fd2d2a2acf023872ecd8905be920ff50e81d842c7c1a9ad7609ed25ab80d7b8e
852 851 24 70.0 45.0 36 4 30 a328c4f01bd8355b93bc9add8261c74c62374ad4509e89b220d0a7cefe0264f2
853 852 24 70.0 45.0 36 5 33 f237fbb4af2fee18e1a50241c11ad184bd3815ca98e546de9b4219f01ad6d597
854 853 24 70.0 45.0 36 5 34 407115d033aa176b3251a1c6d6e535ba83ca191c9a3ae6aca45c733672eb4168
855 854 24 70.0 45.0 36 5 36 ac799afd672da0d65efcb9ad24e482851031ca25862b748fd3842f49159d846c
856 855 24 70.0 45.0 36 5 38 5e4bff496f363e2abb8447dcd3eeb181df92d10315ef19a485d334b8382bb7ae
857 856 24 70.0 60.0 36 3 17 72acfe55190ed57cebf4f1156986564e0416b0b2af0e44a320c9194c7f2ea8cf
858 857 24 70.0 60.0 36 3 18 2805e6f098d15b27284eb510e1c1362e525cf0b0babce5d1fc08edab3b95e4c5
859 858 24 70.0 60.0 36 3 20 8a50464709efe7d242c053efa8e950450108cb815e1a26dc121d0cd593da68d4
860 859 24 70.0 60.0 36 3 22 c3f631cf2a02a7c64044ba26389db67a638453be3d2b0b5a9dff87d6f0a45da1
861 860 24 70.0 60.0 36 4 25 1ea10a95e4b72824a094fff9a416831d105715d1190b55afe1b9d156f4e4b2fc
862 861 24 70.0 60.0 36 4 26 88946925060027a3a3472036c3e82033b9dc468ad99e44d895552cf0a6a641ef
863 862 24 70.0 60.0 36 4 28 e7ce645c4ccb5b38624068326842d053686718abb3f5761ea82aedc6e609861c
864 863 24 70.0 60.0 36 4 30 3d549d0fd3d08be83150bdf31346d01add6c7fb80f84e2477f95988cd439e9e8
865 864 24 70.0 60.0 36 5 33 e395a9dbc44ff4a21cf99ab1e1ab42d864ac35c98956c231aebf0c571df29b53
866 865 24 70.0 60.0 36 5 34 3b9f3cd1723bca4b49699491b87a4a88d2401530f4f0983376f7fba088d95b5e
867 866 24 70.0 60.0 36 5 36 f02e26d93e8f9469c685957428babff6ea1f3db5321c0e37f0723af16a3c5e97
868 867 24 70.0 60.0 36 5 38 ad7f8512bad46de4c706baa550d33fb859c68996936052d7fff4d8fed8f75f68

View File

@ -1,6 +0,0 @@
id,load,primary_air_consumption,secondary_air_consumption,gas_inlet_consumption
1,190,20.3354886853634,51.7975452731847,0.345208189376503
2,260,20.9617016507624,53.3926037902321,0.453841651629505
3,315,23.6372054386887,60.2075139567843,0.559493985383952
4,400,30.4431292303094,77.5432245058036,0.731285900359563
5,465,35.3184718352393,89.9614546849929,0.848336676986426
1 id load primary_air_consumption secondary_air_consumption gas_inlet_consumption
2 1 190 20.3354886853634 51.7975452731847 0.345208189376503
3 2 260 20.9617016507624 53.3926037902321 0.453841651629505
4 3 315 23.6372054386887 60.2075139567843 0.559493985383952
5 4 400 30.4431292303094 77.5432245058036 0.731285900359563
6 5 465 35.3184718352393 89.9614546849929 0.848336676986426

View File

@ -1,41 +0,0 @@
id,load_id,recycling_level,co2,n2,h2o,o2
1,1,0,0,0.7685,0,0.2315
2,1,5,0.00364653315945826,0.754018809386459,0.00768250189905284,0.234652155555029
3,1,8,0.00583445305513322,0.745330095018335,0.0122920030384845,0.236543448888047
4,1,10,0.00729306631891652,0.739537618772919,0.0153650037981057,0.237804311110059
5,1,15,0.0109395994783748,0.725056428159379,0.0230475056971585,0.240956466665088
6,1,20,0.014586132637833,0.710575237545838,0.0307300075962114,0.244108622220117
7,1,25,0.0182326657972913,0.696094046932298,0.0384125094952642,0.247260777775147
8,1,30,0.0218791989567496,0.681612856318757,0.046095011394317,0.250412933330176
9,2,0,0,0.7685,0,0.2315
10,2,5,0.00465084114980632,0.760613280911782,0.00979837407289293,0.224937503865519
11,2,8,0.00744134583969012,0.755881249458851,0.0156773985166287,0.22100000618483
12,2,10,0.00930168229961265,0.752726561823564,0.0195967481457859,0.218375007731037
13,2,15,0.013952523449419,0.744839842735346,0.0293951222186788,0.211812511596556
14,2,20,0.0186033645992253,0.736953123647129,0.0391934962915717,0.205250015462074
15,2,25,0.0232542057490316,0.729066404558911,0.0489918703644647,0.198687519327593
16,2,30,0.0279050468988379,0.721179685470693,0.0587902444373576,0.192125023193112
17,3,0,0,0.7685,0,0.2315
18,3,5,0.0050845553927608,0.763461128636561,0.0107121215556223,0.220742194415056
19,3,8,0.00813528862841727,0.760437805818498,0.0171393944889956,0.214287511064089
20,3,10,0.0101691107855216,0.758422257273122,0.0214242431112445,0.209984388830112
21,3,15,0.0152536661782824,0.753383385909684,0.0321363646668668,0.199226583245167
22,3,20,0.0203382215710432,0.748344514546245,0.042848486222489,0.188468777660223
23,3,25,0.025422776963804,0.743305643182806,0.0535606077781113,0.177710972075279
24,3,30,0.0305073323565648,0.738266771819367,0.0642727293337336,0.166953166490335
25,4,0,0,0.7685,0,0.2315
26,4,5,0.00516002254880722,0.763956659904288,0.0108711154669045,0.22001220208
27,4,8,0.00825603607809156,0.761230655846861,0.0173937847470473,0.213119523328001
28,4,10,0.0103200450976144,0.759413319808576,0.0217422309338091,0.208524404160001
29,4,15,0.0154800676464217,0.754869979712864,0.0326133464007136,0.197036606240001
30,4,20,0.0206400901952289,0.750326639617152,0.0434844618676182,0.185548808320001
31,4,25,0.0258001127440361,0.74578329952144,0.0543555773345227,0.174061010400002
32,4,30,0.0309601352928433,0.741239959425727,0.0652266928014272,0.162573212480002
33,5,0,0,0.7685,0,0.2315
34,5,5,0.00515964747536643,0.763954197102887,0.0108703252636361,0.22001583015811
35,5,8,0.00825543596058629,0.76122671536462,0.0173925204218177,0.213125328252976
36,5,10,0.0103192949507329,0.759408394205775,0.0217406505272721,0.20853166031622
37,5,15,0.0154789424260993,0.754862591308662,0.0326109757909082,0.19704749047433
38,5,20,0.0206385899014657,0.750316788411549,0.0434813010545443,0.185563320632441
39,5,25,0.0257982373768322,0.745770985514437,0.0543516263181804,0.174079150790551
40,5,30,0.0309578848521986,0.741225182617324,0.0652219515818164,0.162594980948661
1 id load_id recycling_level co2 n2 h2o o2
2 1 1 0 0 0.7685 0 0.2315
3 2 1 5 0.00364653315945826 0.754018809386459 0.00768250189905284 0.234652155555029
4 3 1 8 0.00583445305513322 0.745330095018335 0.0122920030384845 0.236543448888047
5 4 1 10 0.00729306631891652 0.739537618772919 0.0153650037981057 0.237804311110059
6 5 1 15 0.0109395994783748 0.725056428159379 0.0230475056971585 0.240956466665088
7 6 1 20 0.014586132637833 0.710575237545838 0.0307300075962114 0.244108622220117
8 7 1 25 0.0182326657972913 0.696094046932298 0.0384125094952642 0.247260777775147
9 8 1 30 0.0218791989567496 0.681612856318757 0.046095011394317 0.250412933330176
10 9 2 0 0 0.7685 0 0.2315
11 10 2 5 0.00465084114980632 0.760613280911782 0.00979837407289293 0.224937503865519
12 11 2 8 0.00744134583969012 0.755881249458851 0.0156773985166287 0.22100000618483
13 12 2 10 0.00930168229961265 0.752726561823564 0.0195967481457859 0.218375007731037
14 13 2 15 0.013952523449419 0.744839842735346 0.0293951222186788 0.211812511596556
15 14 2 20 0.0186033645992253 0.736953123647129 0.0391934962915717 0.205250015462074
16 15 2 25 0.0232542057490316 0.729066404558911 0.0489918703644647 0.198687519327593
17 16 2 30 0.0279050468988379 0.721179685470693 0.0587902444373576 0.192125023193112
18 17 3 0 0 0.7685 0 0.2315
19 18 3 5 0.0050845553927608 0.763461128636561 0.0107121215556223 0.220742194415056
20 19 3 8 0.00813528862841727 0.760437805818498 0.0171393944889956 0.214287511064089
21 20 3 10 0.0101691107855216 0.758422257273122 0.0214242431112445 0.209984388830112
22 21 3 15 0.0152536661782824 0.753383385909684 0.0321363646668668 0.199226583245167
23 22 3 20 0.0203382215710432 0.748344514546245 0.042848486222489 0.188468777660223
24 23 3 25 0.025422776963804 0.743305643182806 0.0535606077781113 0.177710972075279
25 24 3 30 0.0305073323565648 0.738266771819367 0.0642727293337336 0.166953166490335
26 25 4 0 0 0.7685 0 0.2315
27 26 4 5 0.00516002254880722 0.763956659904288 0.0108711154669045 0.22001220208
28 27 4 8 0.00825603607809156 0.761230655846861 0.0173937847470473 0.213119523328001
29 28 4 10 0.0103200450976144 0.759413319808576 0.0217422309338091 0.208524404160001
30 29 4 15 0.0154800676464217 0.754869979712864 0.0326133464007136 0.197036606240001
31 30 4 20 0.0206400901952289 0.750326639617152 0.0434844618676182 0.185548808320001
32 31 4 25 0.0258001127440361 0.74578329952144 0.0543555773345227 0.174061010400002
33 32 4 30 0.0309601352928433 0.741239959425727 0.0652266928014272 0.162573212480002
34 33 5 0 0 0.7685 0 0.2315
35 34 5 5 0.00515964747536643 0.763954197102887 0.0108703252636361 0.22001583015811
36 35 5 8 0.00825543596058629 0.76122671536462 0.0173925204218177 0.213125328252976
37 36 5 10 0.0103192949507329 0.759408394205775 0.0217406505272721 0.20853166031622
38 37 5 15 0.0154789424260993 0.754862591308662 0.0326109757909082 0.19704749047433
39 38 5 20 0.0206385899014657 0.750316788411549 0.0434813010545443 0.185563320632441
40 39 5 25 0.0257982373768322 0.745770985514437 0.0543516263181804 0.174079150790551
41 40 5 30 0.0309578848521986 0.741225182617324 0.0652219515818164 0.162594980948661

View File

@ -1,74 +0,0 @@
from logging.config import fileConfig
from sqlalchemy import engine_from_config
from sqlalchemy import pool
from alembic import context
from db.config import settings
from db.models.experiment_data_model import ExperimentData
from db.models.experiment_parameters_model import ExperimentParameters
from db.models.load_parameters_model import LoadParameters
from db.models.recycling_parameters_model import RecyclingParameters
from db.models.base import Base
config = context.config
if config.config_file_name is not None:
fileConfig(config.config_file_name)
config.set_main_option('sqlalchemy.url', settings.db_url_asyncpg + '?async_fallback=True')
target_metadata = Base.metadata
def run_migrations_offline() -> None:
"""Run migrations in 'offline' mode.
This configures the context with just a URL
and not an Engine, though an Engine is acceptable
here as well. By skipping the Engine creation
we don't even need a DBAPI to be available.
Calls to context.execute() here emit the given string to the
script output.
"""
url = config.get_main_option("sqlalchemy.url")
context.configure(
url=url,
target_metadata=target_metadata,
literal_binds=True,
dialect_opts={"paramstyle": "named"},
)
with context.begin_transaction():
context.run_migrations()
def run_migrations_online() -> None:
"""Run migrations in 'online' mode.
In this scenario we need to create an Engine
and associate a connection with the context.
"""
connectable = engine_from_config(
config.get_section(config.config_ini_section, {}),
prefix="sqlalchemy.",
poolclass=pool.NullPool,
)
with connectable.connect() as connection:
context.configure(
connection=connection, target_metadata=target_metadata
)
with context.begin_transaction():
context.run_migrations()
if context.is_offline_mode():
run_migrations_offline()
else:
run_migrations_online()

View File

@ -1,26 +0,0 @@
"""${message}
Revision ID: ${up_revision}
Revises: ${down_revision | comma,n}
Create Date: ${create_date}
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
${imports if imports else ""}
# revision identifiers, used by Alembic.
revision: str = ${repr(up_revision)}
down_revision: Union[str, None] = ${repr(down_revision)}
branch_labels: Union[str, Sequence[str], None] = ${repr(branch_labels)}
depends_on: Union[str, Sequence[str], None] = ${repr(depends_on)}
def upgrade() -> None:
${upgrades if upgrades else "pass"}
def downgrade() -> None:
${downgrades if downgrades else "pass"}

View File

@ -1,7 +0,0 @@
from .base import *
from .experiment_parameters_model import *
from .experiment_data_model import *
from .ch_experimentdb_experiment_data_model import *
from .load_parameters_model import *
from .recycling_parameters_model import *
from .experiment_category import *

View File

@ -1,8 +0,0 @@
from typing import Annotated
from sqlalchemy.orm import DeclarativeBase, mapped_column
int_pk_incr = Annotated[int, mapped_column(primary_key=True, autoincrement=True)]
class Base(DeclarativeBase):
pass

View File

@ -1,26 +0,0 @@
from clickhouse_sqlalchemy import engines
from clickhouse_sqlalchemy.types import Float64, String
from sqlalchemy import Integer
from sqlalchemy.orm import Mapped, mapped_column
from db.clickhouse_db_connection import BaseClickhouse
class ChExperimentDBExperimentData(BaseClickhouse):
__tablename__ = 'experiment_data'
__table_args__ = (
engines.MergeTree(order_by='id'),
)
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
volume: Mapped[float] = mapped_column(Float64)
nitrogen_oxide_emission: Mapped[float] = mapped_column(Float64)
temperature: Mapped[float] = mapped_column(Float64)
co_fraction: Mapped[float] = mapped_column(Float64)
co2_fraction: Mapped[float] = mapped_column(Float64)
x: Mapped[float] = mapped_column(Float64)
y: Mapped[float] = mapped_column(Float64)
z: Mapped[float] = mapped_column(Float64)
file_id: Mapped[str] = mapped_column(String)
def __repr__(self):
return f"<ChExperimentDBExperimentData id={self.id}, volume={self.volume}>"

View File

@ -1,17 +0,0 @@
from typing import Optional
from sqlalchemy import Identity, ForeignKey
from sqlalchemy.orm import Mapped, mapped_column
from db.models.base import Base
class ExperimentCategory(Base):
__tablename__ = 'experiment_category'
id: Mapped[int] = mapped_column(Identity(start=1, cycle=True),
primary_key=True)
name: Mapped[str]
def __repr__(self):
return f"<ExperimentCategory>"

View File

@ -1,22 +0,0 @@
from typing import Optional
from sqlalchemy import Identity, ForeignKey
from sqlalchemy.orm import Mapped, mapped_column
from db.models.base import Base
class ExperimentData(Base):
__tablename__ = 'experiment_data'
id: Mapped[int] = mapped_column(Identity(start=21, cycle=True),
primary_key=True)
direction: Mapped[float]
temperature: Mapped[float]
nox: Mapped[float]
co2: Mapped[float]
co: Mapped[float]
file_id: Mapped[Optional[str]] = mapped_column(ForeignKey('experiment_parameters.experiment_hash', ondelete='SET NULL'))
def __repr__(self):
return f"<ExperimentData>"

View File

@ -1,25 +0,0 @@
from typing import Optional
from sqlalchemy import ForeignKey, Identity
from sqlalchemy.orm import Mapped, mapped_column
from db.models.base import Base
class ExperimentParameters(Base):
__tablename__ = 'experiment_parameters'
id: Mapped[int] = mapped_column(Identity(start=1100, cycle=True),
primary_key=True)
outer_blades_count: Mapped[int]
outer_blades_length: Mapped[float]
outer_blades_angle: Mapped[float]
middle_blades_count: Mapped[int]
load_id: Mapped[Optional[int]] = mapped_column(ForeignKey('load_parameters.id', ondelete='SET NULL'))
recycling_id: Mapped[Optional[int]] = mapped_column(ForeignKey('recycling_parameters.id', ondelete='SET NULL'))
experiment_hash: Mapped[str] = mapped_column(unique=True)
experiment_category_id: Mapped[Optional[int]] = mapped_column(ForeignKey('experiment_category.id', ondelete='SET NULL'), nullable=True)
oxidizer_temp: Mapped[float] = mapped_column(nullable=True)
def __repr__(self):
return f"<ExperimentParameters>"

View File

@ -1,18 +0,0 @@
from sqlalchemy import Identity
from sqlalchemy.orm import Mapped, mapped_column
from db.models.base import Base
class LoadParameters(Base):
__tablename__ = 'load_parameters'
id: Mapped[int] = mapped_column(Identity(start=1000, cycle=True),
primary_key=True)
load: Mapped[int]
primary_air_consumption: Mapped[float]
secondary_air_consumption: Mapped[float]
gas_inlet_consumption: Mapped[float]
def __repr__(self):
return f"<LoadParameters>"

View File

@ -1,23 +0,0 @@
from typing import Optional
from sqlalchemy import ForeignKey, Identity
from sqlalchemy.orm import Mapped, mapped_column
from db.models.base import Base
class RecyclingParameters(Base):
__tablename__ = 'recycling_parameters'
id: Mapped[int] = mapped_column(Identity(start=1000, cycle=True),
primary_key=True)
load_id: Mapped[Optional[int]] = mapped_column(ForeignKey('load_parameters.id', ondelete='SET NULL'))
recycling_level: Mapped[int]
co2: Mapped[float]
n2: Mapped[float]
h2o: Mapped[float]
o2: Mapped[float]
def __repr__(self):
return f"<RecyclingParameters>"

View File

@ -1,11 +0,0 @@
from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker
from settings import settings
engine_postgres = create_async_engine(url=settings.db_url_asyncpg_docker, echo=True)
async_session_postgres = async_sessionmaker(engine_postgres, expire_on_commit=False)
# Функция для получения новой сессии
async def get_async_session():
async with async_session_postgres() as session:
yield session

View File

@ -1,6 +0,0 @@
from .experiment_data_repos import *
from .experiment_parameters_repos import *
from .load_parameters_repos import *
from .recycling_parameters_repos import *
from .ch_experimentdb_experiment_data_repos import *
from .experiment_category_repos import *

View File

@ -1,43 +0,0 @@
from typing import List
from db.models.ch_experimentdb_experiment_data_model import ChExperimentDBExperimentData
from sqlalchemy import select,func
class ChExperimentDBExperimentDataRepository:
def __init__(self, session):
self.session = session
def get_all(self):
return self.session.query(ChExperimentDBExperimentData).all()
def get_by_id(self, id: int) -> ChExperimentDBExperimentData:
return self.session.query(ChExperimentDBExperimentData).filter(ChExperimentDBExperimentData.id == id).one_or_none()
def get_by_file_id(self, file_id: str) -> List[ChExperimentDBExperimentData]:
return self.session.query(ChExperimentDBExperimentData).filter(ChExperimentDBExperimentData.file_id == file_id).all()
def create(self, ch_experiment_data: ChExperimentDBExperimentData) -> ChExperimentDBExperimentData:
max_id_query = select(func.max(ChExperimentDBExperimentData.id))
max_id_result = self.session.execute(max_id_query).scalar()
max_id = max_id_result or 0
ch_experiment_data.id = max_id + 1
self.session.add(ch_experiment_data)
self.session.commit()
return ch_experiment_data
def update(self, id: int, updated_data: dict) -> ChExperimentDBExperimentData:
self.session.query(ChExperimentDBExperimentData).filter(ChExperimentDBExperimentData.id == id).update(updated_data)
self.session.commit()
return self.get_by_id(id)
def delete(self, id: int) -> bool:
item = self.get_by_id(id)
if item:
self.session.delete(item)
self.session.commit()
return True
return False

View File

@ -1,41 +0,0 @@
from typing import Sequence
from sqlalchemy import update, delete
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select
from typing_extensions import deprecated
from db.models import ExperimentCategory
@deprecated(
"теперь есть параметризованный круд, а уже свои специфичные методы у каждой сущности в своем репозитории"
)
class ExperimentCategoryRepository:
def __init__(self, session: AsyncSession):
self.session = session
async def get_all(self) -> Sequence[ExperimentCategory]:
result = await self.session.execute(select(ExperimentCategory))
return result.scalars().all()
async def get_by_id(self, id: int) -> ExperimentCategory:
result = await self.session.execute(select(ExperimentCategory).where(ExperimentCategory.id == id))
return result.scalar_one_or_none()
async def create(self, new_data: ExperimentCategory):
self.session.add(new_data)
await self.session.commit()
async def update(self, id: int, updated_data: dict):
stmt = (
update(ExperimentCategory).
where(ExperimentCategory.id == id).
values(**updated_data)
)
await self.session.execute(stmt)
await self.session.commit()
async def delete(self, id: int):
stmt = delete(ExperimentCategory).where(ExperimentCategory.id == id)
await self.session.execute(stmt)
await self.session.commit()

View File

@ -1,24 +0,0 @@
from typing import Sequence
from sqlalchemy.future import select
from db.models.experiment_data_model import ExperimentData
from db.postgres_db_connection import async_session_postgres
async def get_exp_data_by_file_id(file_id: str) -> Sequence[ExperimentData]:
async with async_session_postgres() as session:
result = await session.execute(
select(ExperimentData).where(ExperimentData.file_id == file_id)
)
return result.scalars().all()
async def get_all_exp_data(page: int, page_size: int) -> Sequence[ExperimentData]:
async with async_session_postgres() as session:
offset = (page - 1) * page_size
result = await session.execute(
select(ExperimentData).offset(offset).limit(page_size)
)
return result.scalars().all()

View File

@ -1,129 +0,0 @@
import hashlib
from typing import Sequence
import pandas as pd
import yaml
from fastapi import HTTPException
from sqlalchemy.future import select
from db.crud import create, update, get_by_id, update_exp
from db.models import LoadParameters, RecyclingParameters
from db.models.experiment_parameters_model import ExperimentParameters
from db.postgres_db_connection import async_session_postgres
from macros_generator import load_calculation, recycling_calculation
async def get_exp_parameters_by_category(category_id: int) -> Sequence[ExperimentParameters]:
async with async_session_postgres() as session:
result = await session.execute(
select(ExperimentParameters).where(ExperimentParameters.experiment_category_id == category_id)
)
return result.scalars().all()
async def get_exp_parameters_by_exp_hash(exp_hash: str) -> Sequence[ExperimentParameters]:
async with async_session_postgres() as session:
result = await session.execute(
select(ExperimentParameters).where(ExperimentParameters.experiment_hash == exp_hash)
)
return result.scalars().all()
def generate_experiment_hash(data: dict) -> str:
"""Генерация уникального хеша на основе данных эксперимента"""
hash_input = f"{data['outer_blades_count']}_{data['outer_blades_length']}_{data['outer_blades_angle']}_{data['middle_blades_count']}_{data['load']}_{data['recycling_level']}"
return hashlib.sha256(hash_input.encode()).hexdigest()
async def save_experiment_to_db(df: pd.DataFrame):
for _, row in df.iterrows():
try:
# Преобразуем load и recycling_level в соответствующие id
load = int(row['load'])
recycling = int(row['recycling_level'])
# Генерация хеша для experiment_hash
experiment_hash = generate_experiment_hash(row)
exp = await create(
ExperimentParameters,
outer_blades_count=int(row['outer_blades_count']),
outer_blades_length=float(row['outer_blades_length']),
outer_blades_angle=float(row['outer_blades_angle']),
middle_blades_count=int(row['middle_blades_count']),
load_id=None,
recycling_id=None,
experiment_hash=experiment_hash,
oxidizer_temp=float(row['oxidizer_temp']),
experiment_category_id=experiment_category_id
)
await process_and_save_experiment_data(exp.id, load, recycling)
except Exception as e:
print(f"Ошибка при сохранении данных: {e}")
raise HTTPException(status_code=500, detail=f"Ошибка при сохранении данных: {e}")
async def process_and_save_experiment_data(id: int, load: float, recycling_level: float) -> dict:
try:
experiment = await get_by_id(ExperimentParameters, id)
if experiment is None:
raise HTTPException(status_code=404, detail=f"ExperimentParameters с id {id} не найден.")
yaml_file_path = "config.yaml"
with open(yaml_file_path, "r", encoding="utf-8") as file:
data = yaml.safe_load(file)
diameters = data["parameters"]["diameters"]
dict_load = load_calculation(load, diameters, None)
primary_air_consumption = dict_load["primary_air_consumption"]
secondary_air_consumption = dict_load["secondary_air_consumption"]
gas_inlet_consumption = dict_load["gas_inlet_consumption"]
alpha = dict_load["alpha"]
gas_consumption = dict_load["gas_consumption"]
air_consumption = dict_load["air_consumption"]
dict_recycling = recycling_calculation(alpha, gas_consumption, air_consumption, recycling_level)
co2 = dict_recycling["CO2"]
n2 = dict_recycling["N2"]
h2o = dict_recycling["H2O"]
o2 = dict_recycling["O2"]
load_params = await create(
LoadParameters,
load=int(load),
primary_air_consumption=primary_air_consumption,
secondary_air_consumption=secondary_air_consumption,
gas_inlet_consumption=gas_inlet_consumption
)
recycling_params = await create(
RecyclingParameters,
load_id=load_params.id,
recycling_level=int(recycling_level),
co2=co2,
n2=n2,
h2o=h2o,
o2=o2
)
await update_exp(
ExperimentParameters,
id=experiment.id,
updated_data={
"load_id": load_params.id,
"recycling_id": recycling_params.id
}
)
return {
"message": "Данные успешно обработаны и сохранены.",
"load_parameters": load_params,
"recycling_parameters": recycling_params
}
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")

View File

@ -1,76 +0,0 @@
from typing import Optional, Sequence
from sqlalchemy import delete as delete_
from sqlalchemy import update as update_
from sqlalchemy.future import select
from db.models.load_parameters_model import LoadParameters
from db.postgres_db_connection import async_session_postgres
# async def get_all() -> Sequence[LoadParameters]:
# async with async_session_postgres() as session:
# result = await session.execute(select(LoadParameters))
# return result.scalars().all()
#
#
# async def get_by_id(id: int) -> LoadParameters:
# async with async_session_postgres() as session:
# result = await session.execute(select(LoadParameters).where(LoadParameters.id == id))
# return result.scalar_one_or_none()
#
#
# async def create(new_data: LoadParameters):
# async with async_session_postgres() as session:
# session.add(new_data)
# await session.commit()
#
#
# async def update(id: int, updated_data: dict):
# async with async_session_postgres() as session:
# stmt = (
# update_(LoadParameters).
# where(LoadParameters.id == id).
# values(**updated_data)
# )
# await session.execute(stmt)
# await session.commit()
#
#
# async def delete(id: int) -> bool:
# async with async_session_postgres() as session:
# stmt = delete_(LoadParameters).where(LoadParameters.id == id)
# result = await session.execute(stmt)
# await session.commit()
# return result.rowcount > 0
# class LoadParametersRepository:
# def __init__(self, session: AsyncSession):
# self.session = session
#
# async def get_all(self) -> Sequence[LoadParameters]:
# result = await self.session.execute(select(LoadParameters))
# return result.scalars().all()
#
# async def get_by_id(self, id: int) -> LoadParameters:
# result = await self.session.execute(select(LoadParameters).where(LoadParameters.id == id))
# return result.scalar_one_or_none()
#
# async def create(self, new_data: LoadParameters):
# self.session.add(new_data)
# await self.session.commit()
#
# async def update(self, id: int, updated_data: dict):
# stmt = (
# update_(LoadParameters).
# where(LoadParameters.id == id).
# values(**updated_data)
# )
# await self.session.execute(stmt)
# await self.session.commit()
#
# async def delete(self, id: int):
# stmt = delete_(LoadParameters).where(LoadParameters.id == id)
# await self.session.execute(stmt)
# await self.session.commit()

View File

@ -1,41 +0,0 @@
from typing import Sequence
from typing_extensions import deprecated
from sqlalchemy import select
from sqlalchemy import update, delete
from sqlalchemy.ext.asyncio import AsyncSession
from db.models.recycling_parameters_model import RecyclingParameters
@deprecated(
"теперь есть параметризованный круд, а уже свои специфичные методы у каждой сущности в своем репозитории"
)
class RecyclingParametersRepository:
def __init__(self, session: AsyncSession):
self.session = session
async def get_all(self) -> Sequence[RecyclingParameters]:
result = await self.session.execute(select(RecyclingParameters))
return result.scalars().all()
async def get_by_id(self, id: int) -> RecyclingParameters:
result = await self.session.execute(select(RecyclingParameters).where(RecyclingParameters.id == id))
return result.scalar_one_or_none()
async def create(self, new_data: RecyclingParameters):
self.session.add(new_data)
await self.session.commit()
async def update(self, id: int, updated_data: dict):
stmt = (
update(RecyclingParameters).
where(RecyclingParameters.id == id).
values(**updated_data)
)
await self.session.execute(stmt)
await self.session.commit()
async def delete(self, id: int):
stmt = delete(RecyclingParameters).where(RecyclingParameters.id == id)
await self.session.execute(stmt)
await self.session.commit()

View File

@ -1,39 +1,39 @@
services:
minio:
image: quay.io/minio/minio
container_name: minio
ports:
- "9000:9000"
- "9001:9001"
environment:
MINIO_ROOT_USER: ${MINIO_ROOT_USER}
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}
volumes:
- minio_data:/data
command: server /data --console-address ":9001"
db:
image: postgres
container_name: postgres-db
container_name: geometry_db
ports:
- "5436:5432"
environment:
POSTGRES_DB: ${DATABASE}
POSTGRES_DB: geometrydb
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
ports:
- ${DB_PORT}
volumes:
- postgres_data:/var/lib/postgresql/data
clickhouse:
image: clickhouse/clickhouse-server:latest
container_name: clickhouse-db
environment:
CLICKHOUSE_USER: ${CLICKHOUSE_USER}
CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD}
ports:
- "8123:8123"
- "9000:9000"
volumes:
- clickhouse_data:/var/lib/clickhouse
fastapi:
build: .
container_name: fastapi-app
ports:
- "8000:8000"
depends_on:
- db
- clickhouse
volumes:
- .:/app
volumes:
postgres_data:
clickhouse_data:
driver: local
driver_opts:
type: none
device: D:\docker_volumes\postgres_data
o: bind
minio_data:
driver: local
driver_opts:
type: none
device: D:\docker_volumes\minio_data
o: bind

View File

@ -1,213 +0,0 @@
import requests
import os
import subprocess
import time
import psutil
import argparse
import macros_generator as mg
STARCCM_PATH = '/home/user/Siemens/19.02.009-R8/STAR-CCM+19.02.009-R8/star/bin/starccm+'
NUMBER_PROCESSES = 16
def download_file_from_fastapi(api_url, params, full_file_name):
response = requests.post(api_url, json=params)
if response.status_code == 200:
with open(full_file_name, "wb") as f:
f.write(response.content)
print("File downloaded successfully.")
else:
print(f"Failed to download file. Status code: {response.status_code}")
def terminate_process_by_name(process_name):
# Проходим по всем процессам в системе
for proc in psutil.process_iter(['pid', 'name']):
try:
# Если имя процесса совпадает с искомым
if proc.info['name'] == process_name:
# Завершаем процесс
proc.terminate()
print(f"Процесс '{process_name}' с PID {proc.pid} был завершен.")
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess) as e:
print(f"Не удалось завершить процесс '{process_name}': {e}")
def create_directory(path):
if not os.path.exists(path):
os.makedirs(path)
def delete_directory(path):
if os.path.exists(path):
os.remove(path)
def run_macros(macros_name, model_name=None, new_model=False, is_gpgpu=False):
np_value = '1 -gpgpu auto' if is_gpgpu else str(NUMBER_PROCESSES)
if new_model:
macros_command = f'{STARCCM_PATH} -np {np_value} -new -batch \'{macros_name}\''
else:
if model_name is None:
raise ValueError("model_name must be provided if new_model is False")
macros_command = f'{STARCCM_PATH} -np {np_value} \'{model_name}\' -batch \'{macros_name}\''
subprocess.run(
["bash", "-c", macros_command])
def run_experiment(angle):
chemkin_path = "/media/user/Новый том/burner_automation/burner_data/chemkin"
mesh_base_size = 0.7
cpu_stopping_criterion = 200
stopping_criterion = 7000
main_path = '/media/user/Новый том/burner_automation/experiment_data'
create_directory(main_path)
diameters = {'d1': 1442, 'd2': 1016, 'd3': 640, 'd4': 325, 'd5': 325, 'd6': 245}
default_values = {
"N1": 24,
"L1": 70.0,
"a1": 60.0,
"N2": 18,
"L2": 105.0,
"N3": 9,
"L3": 30.0
}
# number_outer_blades = [12, 24, 36, 48]
#number_outer_blades = 24.0
# length_outer_blades = [44, 70, 86, 107.5]
#length_outer_blades = 70.0
# angle_outer_blades = [30.0, 45.0, 60.0, 75.0]
# number_middle_blades = [9, 18, 27, 36]
#number_middle_blades = 18.0
# load = [190, 260, 315, 400, 465]
# load_eco = [260, 315, 400, 465]
load = 450
# recycling_eco = [0, 7, 14, 21, 28]
# recycling = [0, 5, 10, 15, 20, 25, 30]
# recycling = [0, 6, 12, 18, 24, 30]
recycling = 0
start_time = time.time()
directories_list = []
api_url = "http://10.6.23.120:8000/api/v1/generate_geom"
params = {
"a1": angle
}
geometry_path = str(24) + '_' + str(70) + '_' + str(angle) + '_' + str(18)
geometry_path_full = os.path.join(main_path, geometry_path, 'geometry')
create_directory(geometry_path_full)
geometry_file_name = os.path.join(geometry_path_full, 'geometry.stp')
download_file_from_fastapi(api_url, params, geometry_file_name)
macros_path = os.path.join(main_path, geometry_path, 'general_macros')
directories_list.append(macros_path)
MODEL_PATH = os.path.join(main_path, geometry_path, 'model')
directories_list.append(MODEL_PATH)
model_parameters = {
'geometry_path': geometry_file_name,
'chemkin_path': chemkin_path,
'init_model_folder': MODEL_PATH,
'bladeCount': 18,
'mesh_base_size': mesh_base_size
}
fuel_parameters = mg.load_calculation(load, diameters)
recycling_parameters = mg.recycling_calculation(fuel_parameters['alpha'], fuel_parameters['gas_consumption'],
fuel_parameters['air_consumption'], recycling)
experiments_path = os.path.join(main_path, geometry_path, 'experiments')
directories_list.append(experiments_path)
load_path = os.path.join(experiments_path, str(load))
directories_list.append(load_path)
load_macros_experiment_path = os.path.join(load_path, 'macros')
directories_list.append(load_macros_experiment_path)
load_model_experiment_path = os.path.join(load_path, 'model')
directories_list.append(load_model_experiment_path)
recycling_experiment_path = os.path.join(load_path, str(recycling))
directories_list.append(recycling_experiment_path)
recycling_macros_experiment_path = os.path.join(recycling_experiment_path, 'macros')
directories_list.append(recycling_macros_experiment_path)
solver_parameters = {
'experiment_path': recycling_experiment_path,
'stopping_criterion': stopping_criterion
}
prc_macros_file = os.path.join(macros_path, 'preprocess_macro.java')
fuel_macros_file = os.path.join(load_macros_experiment_path, 'fuel_macro.java')
rec_macros_file = os.path.join(recycling_macros_experiment_path, 'recycle_macro.java')
run_macros_file = os.path.join(recycling_macros_experiment_path, 'run_macros.java')
for directory in directories_list:
create_directory(directory)
model_file = os.path.join(MODEL_PATH, 'init_model.sim')
mg.preprocessor_settings(prc_macros_file, model_parameters, model_file)
load_model_file = os.path.join(load_model_experiment_path, "load_"+str(load)+".sim")
mg.fuel_settings(fuel_macros_file, fuel_parameters, load_model_file)
exp_file = os.path.join(recycling_experiment_path, "recycling_"+str(recycling)+".sim")
mg.fgm_table_settings(rec_macros_file, recycling_parameters, exp_file)
mg.setting_and_running_solver(run_macros_file, solver_parameters, exp_file)
run_macros(prc_macros_file, new_model=True)
run_macros(fuel_macros_file, model_file)
run_macros(rec_macros_file, load_model_file)
run_macros(run_macros_file, exp_file, is_gpgpu=True)
_EXP_FILE = exp_file + "~"
delete_directory(_EXP_FILE)
# solver_parameters['stopping_criterion'] = STOPPING_CRITERION
# mg.setting_and_running_solver(run_macros_file, solver_parameters, EXP_FILE)
# run_macros(run_macros_file, EXP_FILE, is_gpgpu=True)
# _EXP_FILE = EXP_FILE + "~"
# delete_directory(_EXP_FILE)
# Конец замера времени
end_time = time.time()
# Вычисление времени выполнения
execution_time = end_time - start_time
print(f"Execution time: {execution_time}")
# time.sleep(10)
#
# processes_name = ["starccm+", "star-ccm+"]
#
# for process in processes_name:
# terminate_process_by_name(process)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Запуск экспериментов с энергетической установкой ГМУ-45")
parser.add_argument("angle", type=str, help="Угол наклона лопаток во внешнем контуре")
args = parser.parse_args()
run_experiment(args.angle)

View File

@ -1,74 +0,0 @@
from pathlib import Path
import yaml
from settings import settings
from clickhouse_tools import ClickHouseClient
import utils
from postgres_tools import PostgresClient
# Загрузка конфигурации из файла config.yaml
with open('config.yaml', 'r') as config_file:
config = yaml.safe_load(config_file)
MAIN_PATH = config['paths']['main']
main_path = Path(MAIN_PATH)
def add_data_to_db(experiment_parameters, load_parameters, recycling_parameters):
geometry_path = (f"{experiment_parameters['outer_blades_count']}_{experiment_parameters['outer_blades_length']}_"
f"{experiment_parameters['outer_blades_angle']}_{experiment_parameters['middle_blades_count']}")
experiments_path = main_path / geometry_path / 'experiments'
load_path = experiments_path / str(experiment_parameters['load'])
load_parameters_path = load_path / 'parameters'
recycling_path = load_path / str(experiment_parameters['recycling'])
load_parameters_file = load_parameters_path / f"load_{experiment_parameters['load']}_parameters.yaml"
plot_csv = recycling_path / 'plot.csv'
table_csv = recycling_path / 'data_table.csv'
file_id = utils.calculate_hash(experiment_parameters)
clickhouse_client = ClickHouseClient("localhost", 8123, settings.DATABASE, settings.CLICKHOUSE_USER, settings.CLICKHOUSE_PASSWORD)
# Инициализация базы данных
db = PostgresClient(
dbname=settings.DATABASE,
user=settings.POSTGRES_USER,
password=settings.POSTGRES_PASSWORD,
host="localhost",
port="5432"
)
try:
if load_parameters_file.exists():
with open(load_parameters_file, 'r') as fuel_dict_file:
fuel_parameters = yaml.safe_load(fuel_dict_file)
load_parameters['primary_air_consumption'] = fuel_parameters['primary_air_consumption']
load_parameters['secondary_air_consumption'] = fuel_parameters['secondary_air_consumption']
load_parameters['gas_inlet_consumption'] = fuel_parameters['gas_inlet_consumption']
# Вставка данных в load_parameters и получение id
load_id = db.insert_load_parameters(load_parameters)
# Вставка данных в recycling_parameters и получение id
recycling_id = db.insert_recycling_parameters(recycling_parameters, load_id)
# Вставка данных в experiment_parameters
db.insert_experiment_parameters(experiment_parameters, load_id, recycling_id, file_id)
# Сохранение изменений
db.connection.commit()
db.save_csv_to_postgres(plot_csv, file_id)
clickhouse_client.save_csv_to_clickhouse(table_csv, file_id)
print('Загружено: ', experiment_parameters)
finally:
db.close()

File diff suppressed because it is too large Load Diff

167
main.py
View File

@ -1,167 +0,0 @@
from random import uniform, random
from traceback import format_exc
import pandas as pd
from fastapi import FastAPI, HTTPException, BackgroundTasks
from fastapi.middleware.cors import CORSMiddleware
from pyDOE3 import pbdesign, lhs
from db.csv_to_db import csv_to_db
from db.models import ChExperimentDBExperimentData
from db.repositories import save_experiment_to_db
from network.routes import (ch_experimentdb_experiment_data_router, experiment_data_router,
experiment_parameters_router, experiment_category_router)
from network.routes import load_parameters_router, recycling_parameters_router
from network.routes.ch_experimentdb_experiment_data_router import create_ch_experimentdb_experiment_data
from network.routes.experiment_data_router import create_experiment_data
from network.routes.experiment_parameters_router import get_all_experiment_parameters
from network.schemas import *
from new_experiment_planner import run_experiment
from new_experiment_planner_pyDOE3 import scale_design, scale_design_lhs, round_by_index
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=['*'],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
app.include_router(ch_experimentdb_experiment_data_router.router,
prefix="/ch_experimentdb_experiment_data",
tags=["ch_experimentdb_experiment_data"])
app.include_router(experiment_category_router.router,
prefix="/experiment_category",
tags=["experiment_category"])
app.include_router(experiment_data_router.router,
prefix="/experiment_data",
tags=["experiment_data"])
app.include_router(experiment_parameters_router.router,
prefix="/experiment_parameters",
tags=["experiment_parameters"])
app.include_router(load_parameters_router.router,
prefix="/load_parameters",
tags=["load_parameters"])
app.include_router(recycling_parameters_router.router,
prefix="/recycling_parameters",
tags=["recycling_parameters"])
# Эндпоинт для запуска эксперимента
@app.post("/run_experiment/")
def run_experiment_api(params: ExperimentParameters):
try:
# Вызываем функцию run_experiment с параметрами
run_experiment(
params.outer_blades_count,
params.outer_blades_length,
params.outer_blades_angle,
params.middle_blades_count,
params.load,
params.recycling
)
return {"status": "success", "message": "Experiment started successfully."}
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")
# эндпоинт инициализации бд из csv файлов
@app.get('/init_db_data')
async def init_db_data(background_tasks: BackgroundTasks):
try:
background_tasks.add_task(csv_to_db)
return {"status": "success", "message": "Инициализация БД запущена в фоне"}
except Exception as e:
print(str(e.with_traceback()))
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")
@app.get('/init_data_plot')
async def init_data_plot():
try:
parameters = await get_all_experiment_parameters()
async def generate_data_for_file_id(file_id):
for _ in range(100):
await create_ch_experimentdb_experiment_data(
ChExperimentDBExperimentData(
volume=uniform(1e-8, 6.3e-6),
nitrogen_oxide_emission=uniform(2.7e-10, 8.92e-10),
temperature=uniform(1543.0, 2432.0),
co_fraction=uniform(0.0875, 0.4567),
co2_fraction=uniform(0.0824, 0.5678),
x=uniform(0.0002, 0.9849),
y=uniform(4.25, 10.31),
z=uniform(4.20, 10.26),
file_id=file_id
)
)
for param in parameters:
print(param)
file_id = param.experiment_hash
if file_id:
await generate_data_for_file_id(file_id)
return {"status": "success", "message": "Добавление данных в БД успешно завершено"}
except Exception as e:
print(format_exc())
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")
# Пример запроса
# {
# "param_ranges": {
# "outer_blades_count": [12, 48],
# "outer_blades_length": [44, 107.5],
# "outer_blades_angle": [30, 75],
# "middle_blades_count": [9, 36],
# "load": [315, 465],
# "recycling_level": [0, 20],
# "oxidizer_temp": [471, 493]
# },
# "count_exp": 1440,
# "round_rules": [0, 1, 1, 0, 0, 0, 0]
# }
@app.post("/pyDOE3_screening_design")
async def generate_screening_design(request: ExperimentParametersPyDOE3) -> List[Dict[str, float]]:
param_ranges = request.param_ranges
category = request.category
# Создаем screening design и масштабируем его
num_factors = len(param_ranges)
screening_design = pbdesign(num_factors)
scaled_screening_design = scale_design(screening_design, param_ranges)
# Преобразуем в DataFrame
df_screening = pd.DataFrame(scaled_screening_design, columns=param_ranges.keys())
# Сохраняем результаты в базу данных
await save_experiment_to_db(df_screening, category)
return df_screening.to_dict(orient="records")
@app.post("/pyDOE3_lhs_design")
async def generate_lhs_design(request: ExperimentParametersPyDOE3) -> List[Dict[str, float]]:
param_ranges = request.param_ranges
count_exp = request.count_exp
round_rules = request.round_rules
category = request.category
# Создаем lhs design и масштабируем его
num_factors = len(param_ranges)
lhs_samples = lhs(num_factors, samples=count_exp)
scaled_lhs_samples = scale_design_lhs(lhs_samples, param_ranges)
# Округляем значения
round_scaled_lhs_samples = round_by_index(scaled_lhs_samples, round_rules)
# Преобразуем в DataFrame
df_lhs = pd.DataFrame(round_scaled_lhs_samples, columns=param_ranges.keys())
# Сохраняем результаты в базу данных
await save_experiment_to_db(df_lhs, category)
return df_lhs.to_dict(orient="records")

BIN
model_3d/Объем 1.m3d Normal file

Binary file not shown.

BIN
model_3d/Поток.m3d Normal file

Binary file not shown.

BIN
model_3d/Поток.m3d.bak Normal file

Binary file not shown.

View File

@ -1,80 +0,0 @@
from fastapi import APIRouter, HTTPException
from db.clickhouse_db_connection import session_clickhouse
from db.models import ChExperimentDBExperimentData
from db.repositories.ch_experimentdb_experiment_data_repos import ChExperimentDBExperimentDataRepository
from network.schemas import ChExperimentDBExperimentDataBody
from typing import List
router = APIRouter()
repository = ChExperimentDBExperimentDataRepository(session_clickhouse)
@router.post('/create')
async def create_ch_experimentdb_experiment_data(data: ChExperimentDBExperimentDataBody):
try:
new_record = repository.create(ChExperimentDBExperimentData(
volume=data.volume,
nitrogen_oxide_emission=data.nitrogen_oxide_emission,
temperature=data.temperature,
co_fraction=data.co_fraction,
co2_fraction=data.co2_fraction,
x=data.x,
y=data.y,
z=data.z,
file_id=data.file_id
))
return {"message": "Новая запись успешно добавлена"}
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")
@router.get('/all', response_model=List[ChExperimentDBExperimentDataBody])
async def get_all_ch_experimentdb_experiment_data():
try:
result = repository.get_all()
if result:
return result
else:
return {"message": "Нет записей"}
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")
@router.get('/{id}')
async def get_ch_experimentdb_experiment_data_by_id(id: int):
try:
record = repository.get_by_id(id)
if record:
return record
else:
raise HTTPException(status_code=404, detail="Запись не найдена")
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")
@router.get('/file_id/{file_id}')
async def get_ch_experimentdb_experiment_data_by_file_id(file_id: str):
try:
record = repository.get_by_file_id(file_id)
if record:
return record
else:
raise HTTPException(status_code=404, detail="Запись не найдена")
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")
@router.delete('/{id}/delete')
async def delete_ch_experimentdb_experiment_data(id: int):
try:
is_deleted = repository.delete(id)
if is_deleted:
return {"message": "Запись успешно удалена"}
else:
raise HTTPException(status_code=404, detail="Запись не найдена")
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")

View File

@ -1,59 +0,0 @@
from fastapi import APIRouter, HTTPException
from db.crud import *
from db.models import ExperimentCategory
from network.schemas import ExperimentCategoryBody
router = APIRouter()
@router.post('/create')
async def create_experiment_category(body: ExperimentCategoryBody):
try:
await create(ExperimentCategory,
name=body.name
)
return {"message": "Новая запись <ExperimentCategory> успешно добавлена"}
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")
@router.get('/all')
async def get_all_experiment_category():
try:
result = await get_all(ExperimentCategory)
if result is not None:
return result
else:
return {"message": "Нет записей в <ExperimentCategory>"}
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")
@router.get('/{id}')
async def get_by_id_experiment_category(id: int):
try:
result = await get_by_id(ExperimentCategory, id)
if result is not None:
return result
else:
return {"message": "Запись <ExperimentCategory> не найдена"}
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")
@router.delete('/{id}/delete')
async def delete_experiment_category(id: int):
try:
is_deleted = await delete(ExperimentCategory, id)
if is_deleted:
return {"message": "Запись <ExperimentCategory> успешно удалена"}
else:
return {"message": "Запись <ExperimentCategory> не найдена"}
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")

View File

@ -1,79 +0,0 @@
import math
from fastapi import APIRouter, HTTPException, Query
from db.crud import *
from db.models import ExperimentData
from db.repositories import get_exp_data_by_file_id, get_all_exp_data
from network.schemas import ExperimentDataBody
router = APIRouter()
@router.post('/create')
async def create_experiment_data(body: ExperimentDataBody):
try:
await create(ExperimentData,
direction=body.direction,
temperature=body.temperature,
nox=body.nox,
co2=body.co2,
co=body.co,
file_id=body.file_id
)
return {"message": "Новая запись <ExperimentData> успешно добавлена"}
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")
@router.get('/all')
async def get_all_experiment_data(page: int = Query(ge=1, default=1),
size: int = Query(ge = 1, le=100, default=15)):
try:
result = await get_all_exp_data(page, size)
return {
"items": result,
"page": page,
"size": size,
}
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")
@router.get('/{id}')
async def get_by_id_experiment_data(id: int):
try:
result = await get_by_id(ExperimentData, id)
if result is not None:
return result
else:
return {"message": "Запись <ExperimentData> не найдена"}
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")
@router.get('/file_id/{file_id}')
async def get_experiment_data_by_file_id(file_id: str):
try:
result = await get_exp_data_by_file_id(file_id)
if result is not None:
return result
else:
return {"message": f'<ExperimentData> с file_id = {id} - не найдены'}
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")
@router.delete('/{id}/delete')
async def delete_experiment_data(id: int):
try:
is_deleted = await delete(ExperimentData, id)
if is_deleted:
return {"message": "Запись <ExperimentData> успешно удалена"}
else:
return {"message": "Запись <ExperimentData> не найдена"}
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")

View File

@ -1,212 +0,0 @@
import yaml
from fastapi import APIRouter, HTTPException
from pydantic import BaseModel
from typing import List, Tuple
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
import io
import base64
from db.crud import *
from db.models import LoadParameters
from db.repositories import get_exp_parameters_by_category, get_exp_parameters_by_exp_hash
from macros_generator import load_calculation, recycling_calculation
from network.routes.ch_experimentdb_experiment_data_router import get_ch_experimentdb_experiment_data_by_file_id
from network.schemas import ExperimentParametersBody, ExperimentParametersPlot
router = APIRouter()
@router.post('/create')
async def create_experiment_parameters(body: ExperimentParametersBody):
try:
await create(ExperimentParameters,
outer_blades_count=body.outer_blades_count,
outer_blades_length=body.outer_blades_length,
outer_blades_angle=body.outer_blades_angle,
middle_blades_count=body.middle_blades_count,
load_id=body.load_id,
recycling_id=body.recycling_id,
experiment_hash=body.experiment_hash,
experiment_category_id=body.experiment_category_id
)
return {"message": "Новая запись <ExperimentParameters> успешно добавлена"}
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")
@router.post('/plot')
async def create_plot(body: ExperimentParametersPlot):
try:
exp_data = await get_ch_experimentdb_experiment_data_by_file_id(body.file_id)
if not exp_data:
raise HTTPException(status_code=404, detail="Данные не найдены для указанного file_id")
filtered_data = [
record for record in exp_data
if body.range[0] <= getattr(record, body.additional_dimension, None) <= body.range[1]
]
if not filtered_data:
return {"message": "Нет данных для отображения в заданном диапазоне"}
x = [record.x for record in filtered_data]
y = [record.y for record in filtered_data]
z = [record.z for record in filtered_data]
color_values = [getattr(record, body.additional_dimension, None) for record in filtered_data]
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
scatter = ax.scatter(x, y, z, c=color_values, cmap=cm.viridis, marker='o')
cbar = fig.colorbar(scatter, ax=ax)
cbar.set_label(body.additional_dimension)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.title(f"3D график с измерением: {body.additional_dimension}")
buf = io.BytesIO()
plt.savefig(buf, format='png')
buf.seek(0)
image_base64 = base64.b64encode(buf.getvalue()).decode('utf-8')
buf.close()
plt.close(fig)
return {"message": "График построен успешно", "plot": image_base64}
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")
@router.get('/all')
async def get_all_experiment_parameters():
try:
result = await get_all(ExperimentParameters)
if result is not None:
return result
else:
return {"message": "Нет записей в <ExperimentParameters>"}
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")
@router.get('/{id}')
async def get_by_id_experiment_parameters(id: int):
try:
result = await get_by_id(ExperimentParameters, id)
if result is not None:
return result
else:
return {"message": "Запись <ExperimentParameters> не найдена"}
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")
@router.get('/by_category/{id}')
async def get_experiment_parameters_by_exp_category(id: int):
try:
result = await get_exp_parameters_by_category(id)
if result is not None:
return result
else:
return {"message": f'<ExperimentParameters> с идентификатором категории - {id} - не найдены'}
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")
@router.get('/by_exp_hash/{hash}')
async def get_experiment_parameters_by_exp_category(hash: str):
try:
result = await get_exp_parameters_by_exp_hash(hash)
if result is not None:
return result
else:
return {"message": f'<ExperimentParameters> с experiment_hash = {id} - не найдены'}
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")
@router.delete('/{id}/delete')
async def delete_experiment_parameters(id: int):
try:
is_deleted = await delete(ExperimentParameters, id)
if is_deleted:
return {"message": "Запись <ExperimentParameters> успешно удалена"}
else:
return {"message": "Запись <ExperimentParameters> не найдена"}
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")
# @router.post('/process_and_save/{id}') было нужно для проверки
async def process_and_save_experiment_data(id: int, load: float, recycling_level: float) -> dict:
try:
experiment = await get_by_id(ExperimentParameters, id)
if experiment is None:
raise HTTPException(status_code=404, detail=f"ExperimentParameters с id {id} не найден.")
yaml_file_path = "config.yaml"
with open(yaml_file_path, "r", encoding="utf-8") as file:
data = yaml.safe_load(file)
diameters = data["parameters"]["diameters"]
dict_load = load_calculation(load, diameters, None)
primary_air_consumption = dict_load["primary_air_consumption"]
secondary_air_consumption = dict_load["secondary_air_consumption"]
gas_inlet_consumption = dict_load["gas_inlet_consumption"]
alpha = dict_load["alpha"]
gas_consumption = dict_load["gas_consumption"]
air_consumption = dict_load["air_consumption"]
dict_recycling = recycling_calculation(alpha, gas_consumption, air_consumption, recycling_level)
co2 = dict_recycling["CO2"]
n2 = dict_recycling["N2"]
h2o = dict_recycling["H2O"]
o2 = dict_recycling["O2"]
load_params = await create(
LoadParameters,
load=int(load),
primary_air_consumption=primary_air_consumption,
secondary_air_consumption=secondary_air_consumption,
gas_inlet_consumption=gas_inlet_consumption
)
recycling_params = await create(
RecyclingParameters,
load_id=load_params.id,
recycling_level=int(recycling_level),
co2=co2,
n2=n2,
h2o=h2o,
o2=o2
)
await update_exp(
ExperimentParameters,
id=experiment.id,
updated_data={
"load_id": load_params.id,
"recycling_id": recycling_params.id
}
)
return {
"message": "Данные успешно обработаны и сохранены.",
"load_parameters": load_params,
"recycling_parameters": recycling_params
}
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")

View File

@ -1,60 +0,0 @@
from fastapi import APIRouter, HTTPException
from db.crud import *
from db.models import LoadParameters
from network.schemas import LoadParametersBody
router = APIRouter()
@router.post('/create')
async def create_load_parameters(body: LoadParametersBody):
try:
await create(LoadParameters,
load=body.load,
primary_air_consumption=body.primary_air_consumption,
secondary_air_consumption=body.secondary_air_consumption,
gas_inlet_consumption=body.gas_inlet_consumption
)
return {"message": "Новая запись <LoadParameters> успешно добавлена"}
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")
@router.get('/all')
async def get_all_load_parameters():
try:
result = await get_all(LoadParameters)
if result is not None:
return result
else:
return {"message": "Нет записей в <LoadParameters>"}
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")
@router.get('/{id}')
async def get_by_id_load_parameters(id: int):
try:
result = await get_by_id(LoadParameters, id)
if result is not None:
return result
else:
return {"message": "Запись <LoadParameters> не найдена"}
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")
@router.delete('/{id}/delete')
async def delete_load_parameters(id: int):
try:
is_deleted = await delete(LoadParameters, id)
if is_deleted:
return {"message": "Запись <LoadParameters> успешно удалена"}
else:
return {"message": "Запись <LoadParameters> не найдена"}
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")

View File

@ -1,61 +0,0 @@
from fastapi import APIRouter, HTTPException
from db.crud import *
from db.models import RecyclingParameters
from network.schemas import RecyclingParametersBody
router = APIRouter()
@router.post('/create')
async def create_recycling_parameters(body: RecyclingParametersBody):
try:
await create(RecyclingParameters,
load_id=body.load_id,
recycling_level=body.recycling_level,
co2=body.co2,
n2=body.n2,
h2o=body.h2o,
o2=body.o2
)
return {"message": "Новая запись <RecyclingParameters> успешно добавлена"}
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")
@router.get('/all')
async def get_all_recycling_parameters():
try:
result = await get_all(RecyclingParameters)
if result is not None:
return result
else:
return {"message": "Нет записей в <RecyclingParameters>"}
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")
@router.get('/{id}')
async def get_by_id_recycling_parameters(id: int):
try:
result = await get_by_id(RecyclingParameters, id)
if result is not None:
return result
else:
return {"message": "Запись <RecyclingParameters> не найдена"}
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")
@router.delete('/{id}/delete')
async def delete_recycling_parameters(id: int):
try:
is_deleted = await delete(RecyclingParameters, id)
if is_deleted:
return {"message": "Запись <RecyclingParameters> успешно удалена"}
else:
return {"message": "Запись <RecyclingParameters> не найдена"}
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")

View File

@ -1,83 +0,0 @@
from enum import Enum
from typing import Optional, Dict, Tuple, List
from psycopg.types import enum
from pydantic import BaseModel, ConfigDict
class ExperimentParametersPyDOE3(BaseModel):
param_ranges: Dict[str, Tuple[float, float]]
category: int
count_exp: int
round_rules: List[int]
class ExperimentParameters(BaseModel):
outer_blades_count: str
outer_blades_length: str
outer_blades_angle: str
middle_blades_count: str
load: str
recycling: str
class ExperimentParametersPlot(BaseModel):
file_id: str
additional_dimension: str
range: Tuple[float, float]
class ChExperimentDBExperimentDataBody(BaseModel):
model_config = ConfigDict(from_attributes=True)
volume: float
nitrogen_oxide_emission: float
temperature: float
co_fraction: float
co2_fraction: float
x: float
y: float
z: float
file_id: str
class ExperimentCategoryBody(BaseModel):
model_config = ConfigDict(from_attributes=True)
name: str
class ExperimentDataBody(BaseModel):
model_config = ConfigDict(from_attributes=True)
direction: float
temperature: float
nox: float
co2: float
co: float
file_id: Optional[str]
class ExperimentParametersBody(BaseModel):
model_config = ConfigDict(from_attributes=True)
outer_blades_count: int
outer_blades_length: float
outer_blades_angle: float
middle_blades_count: int
load_id: Optional[int]
recycling_id: Optional[int]
experiment_hash: str
experiment_category_id: int
class LoadParametersBody(BaseModel):
model_config = ConfigDict(from_attributes=True)
load: int
primary_air_consumption: float
secondary_air_consumption: float
gas_inlet_consumption: float
class RecyclingParametersBody(BaseModel):
model_config = ConfigDict(from_attributes=True)
load_id: Optional[int]
recycling_level: int
co2: float
n2: float
h2o: float
o2: float

View File

@ -1,231 +0,0 @@
import requests
import subprocess
import argparse
import yaml
import psutil
import time
import macros_generator as mg
from settings import settings
from clickhouse_tools import ClickHouseClient
import utils
from postgres_tools import PostgresClient
from pathlib import Path
from contextlib import contextmanager
# Загрузка конфигурации из файла config.yaml
with open('config.yaml', 'r') as config_file:
config = yaml.safe_load(config_file)
STARCCM_PATH = config['paths']['starccm']
CHEMKIN_PATH = config['paths']['chemkin']
MAIN_PATH = config['paths']['main']
NUMBER_PROCESSES = config['parameters']['number_processes']
MESH_BASE_SIZE = config['parameters']['mesh_base_size']
STOPPING_CRITERION = config['parameters']['stopping_criterion']
DIAMETERS = config['parameters']['diameters']
DEFAULT_VALUES = config['parameters']['default_values']
API_URL = config['api_url']
def download_file_from_fastapi(api_url, params, full_file_name):
try:
response = requests.post(api_url, json=params)
response.raise_for_status()
with open(full_file_name, "wb") as f:
f.write(response.content)
print("File downloaded successfully.")
except requests.RequestException as e:
print(f"Failed to download file: {e}")
def terminate_process_by_name(process_name):
for proc in psutil.process_iter(['pid', 'name']):
try:
if proc.info['name'] == process_name:
proc.terminate()
print(f"Process '{process_name}' with PID {proc.pid} was terminated.")
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess) as e:
print(f"Failed to terminate process '{process_name}': {e}")
def create_directory(path):
Path(path).mkdir(parents=True, exist_ok=True)
@contextmanager
def remove_file_on_exit(file_path):
try:
yield
finally:
if file_path.exists():
file_path.unlink()
def run_macros(macros_name, model_name=None, new_model=False, is_gpgpu=False):
np_value = '1 -gpgpu auto' if is_gpgpu else str(NUMBER_PROCESSES)
if new_model:
macros_command = f'{STARCCM_PATH} -np {np_value} -new -batch \'{macros_name}\''
else:
if model_name is None:
raise ValueError("model_name must be provided if new_model is False")
macros_command = f'{STARCCM_PATH} -np {np_value} \'{model_name}\' -batch \'{macros_name}\''
subprocess.run(["bash", "-c", macros_command], check=True)
def run_experiment(outer_blades_count, outer_blades_length, outer_blades_angle, middle_blades_count, load, recycling):
main_path = Path(MAIN_PATH)
create_directory(main_path)
geometry_path = f"{outer_blades_count}_{outer_blades_length}_{outer_blades_angle}_{middle_blades_count}"
geometry_path_full = main_path / geometry_path / 'geometry'
create_directory(geometry_path_full)
geometry_file_name = geometry_path_full / 'geometry.stp'
general_macros_path = main_path / geometry_path / 'general_macros'
create_directory(general_macros_path)
model_path = main_path / geometry_path / 'model'
create_directory(model_path)
model_file = model_path / 'init_model.sim'
experiments_path = main_path / geometry_path / 'experiments'
load_path = experiments_path / str(load)
load_parameters_path = load_path / 'parameters'
load_macros_path = load_path / 'macros'
load_model_path = load_path / 'model'
recycling_path = load_path / str(recycling)
recycling_macros_path = recycling_path / 'macros'
for directory in [experiments_path, load_path, load_parameters_path, load_macros_path, load_model_path,
recycling_path, recycling_macros_path]:
create_directory(directory)
load_parameters_file = load_parameters_path / f"load_{load}_parameters.yaml"
load_model_file = load_model_path / f"load_{load}.sim"
exp_file = recycling_path / f"recycling_{recycling}.sim"
# Проверка наличия файла init_model.sim
if not model_file.exists():
download_file_from_fastapi(API_URL, {"N1": outer_blades_count,
"L1": outer_blades_length,
"a1": outer_blades_angle,
"N2": middle_blades_count},
geometry_file_name)
prc_macros_file = general_macros_path / 'preprocess_macro.java'
model_parameters = {
'geometry_path': geometry_file_name,
'chemkin_path': CHEMKIN_PATH,
'init_model_folder': model_path,
'bladeCount': middle_blades_count,
'mesh_base_size': MESH_BASE_SIZE
}
mg.preprocessor_settings(prc_macros_file, model_parameters, model_file)
run_macros(prc_macros_file, new_model=True)
if not load_parameters_file.exists():
fuel_parameters = mg.load_calculation(float(load), DIAMETERS)
with open(load_parameters_file, 'w') as fuel_dict_file:
yaml.dump(fuel_parameters, fuel_dict_file, default_flow_style=False, allow_unicode=True)
else:
with open(load_parameters_file, 'r') as fuel_dict_file:
fuel_parameters = yaml.safe_load(fuel_dict_file)
# Проверка наличия файла load_{load}.sim
if not load_model_file.exists():
fuel_macros_file = load_macros_path / 'fuel_macro.java'
mg.fuel_settings(fuel_macros_file, fuel_parameters, load_model_file)
run_macros(fuel_macros_file, model_file)
# Проверка наличия файла recycling_{recycling}.sim
if not exp_file.exists():
rec_macros_file = recycling_macros_path / 'recycle_macro.java'
run_macros_file = recycling_macros_path / 'run_macros.java'
recycling_parameters = mg.recycling_calculation(
fuel_parameters['alpha'], fuel_parameters['gas_consumption'], fuel_parameters['air_consumption'],
float(recycling))
solver_parameters = {
'experiment_path': recycling_path,
'stopping_criterion': STOPPING_CRITERION
}
mg.fgm_table_settings(rec_macros_file, recycling_parameters, exp_file)
mg.setting_and_running_solver(run_macros_file, solver_parameters, exp_file)
run_macros(rec_macros_file, load_model_file)
run_macros(run_macros_file, exp_file, is_gpgpu=True)
experiment_parameters = {
'outer_blades_count': int(float(outer_blades_count)),
'outer_blades_length': outer_blades_length,
'outer_blades_angle': outer_blades_angle,
'middle_blades_count': int(float(middle_blades_count)),
'load': float(load),
'recycling': float(recycling),
}
fields_to_select = ['primary_air_consumption', 'secondary_air_consumption', 'gas_inlet_consumption']
load_parameters = {key: fuel_parameters[key] for key in fields_to_select}
load_parameters['load'] = float(load)
recycling_parameters['load'] = float(load)
recycling_parameters['recycling_level'] = float(recycling)
plot_csv = recycling_path / 'plot.csv'
table_csv = recycling_path / 'data_table.csv'
clickhouse_client = ClickHouseClient("localhost", 8123, settings.DATABASE, settings.CLICKHOUSE_USER,
settings.CLICKHOUSE_PASSWORD)
db = PostgresClient(
dbname=settings.DATABASE,
user=settings.POSTGRES_USER,
password=settings.POSTGRES_PASSWORD,
host="localhost",
port="5432"
)
file_id = utils.calculate_hash(experiment_parameters)
try:
clickhouse_client.save_csv_to_clickhouse(table_csv, file_id)
print("Clickhouse saved successfully")
load_id = db.insert_load_parameters(load_parameters)
recycling_id = db.insert_recycling_parameters(recycling_parameters, load_id)
db.insert_experiment_parameters(experiment_parameters, load_id, recycling_id, file_id)
db.connection.commit()
db.save_csv_to_postgres(plot_csv, file_id)
print("Postgres saved successfully")
finally:
db.close()
with remove_file_on_exit(exp_file.with_suffix(".sim~")):
pass
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser(description="Запуск экспериментов с энергетической установкой ГМУ-45")
parser.add_argument("outer_blades_count", type=str, help="Количество лопаток во внешнем контуре")
parser.add_argument("outer_blades_length", type=str, help="Ширина лопаток во внешнем контуре")
parser.add_argument("outer_blades_angle", type=str, help="Угол наклона лопаток во внешнем контуре")
parser.add_argument("middle_blades_count", type=str, help="Количество лопаток в среднем контуре")
parser.add_argument("load", type=str, help="Паровая нагрузка")
parser.add_argument("recycling", type=str, help="Уровень рециркуляции уходящих газов")
args = parser.parse_args()
run_experiment(
args.outer_blades_count,
args.outer_blades_length,
args.outer_blades_angle,
args.middle_blades_count,
args.load,
args.recycling
)

View File

@ -1,36 +0,0 @@
import numpy as np
# Функция для масштабирования значений дизайна
def scale_design(design, param_ranges):
scaled_design = []
for row in design:
scaled_row = []
for i, val in enumerate(row):
min_val, max_val = param_ranges[list(param_ranges.keys())[i]]
scaled_val = (val + 1) / 2 * (max_val - min_val) + min_val
scaled_row.append(scaled_val)
scaled_design.append(scaled_row)
return np.array(scaled_design)
def scale_design_lhs(design, param_ranges):
scaled_design = []
for row in design:
scaled_row = []
for i, val in enumerate(row):
min_val, max_val = param_ranges[list(param_ranges.keys())[i]]
scaled_val = val * (max_val - min_val) + min_val
scaled_row.append(scaled_val)
scaled_design.append(scaled_row)
return np.array(scaled_design)
# Функция для округления значений
def round_by_index(array, rules):
rounded_array = np.zeros(array.shape)
for i in range(array.shape[0]):
for j in range(array.shape[1]):
rounded_array[i, j] = round(array[i, j], rules[j])
return rounded_array

View File

@ -1,375 +0,0 @@
import psycopg
import pandas as pd
class PostgresClient:
def __init__(self, dbname, user, password, host, port):
self.connection = psycopg.connect(
dbname=dbname,
user=user,
password=password,
host=host,
port=port
)
self.init_db()
def init_db(self):
with self.connection.cursor() as cur:
cur.execute("""
CREATE TABLE IF NOT EXISTS load_parameters (
id SERIAL PRIMARY KEY,
load NUMERIC NOT NULL UNIQUE,
primary_air_consumption NUMERIC NOT NULL,
secondary_air_consumption NUMERIC NOT NULL,
gas_inlet_consumption NUMERIC NOT NULL
);
CREATE TABLE IF NOT EXISTS recycling_parameters (
id SERIAL PRIMARY KEY,
load_id INTEGER NOT NULL,
recycling_level NUMERIC NOT NULL,
CO2 NUMERIC NOT NULL,
N2 NUMERIC NOT NULL,
H2O NUMERIC NOT NULL,
O2 NUMERIC NOT NULL,
UNIQUE(load_id, recycling_level),
FOREIGN KEY (load_id) REFERENCES load_parameters(id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS experiment_parameters (
id SERIAL PRIMARY KEY,
outer_blades_count INTEGER NOT NULL,
outer_blades_length NUMERIC NOT NULL,
outer_blades_angle NUMERIC NOT NULL,
middle_blades_count INTEGER NOT NULL,
load_id INTEGER NOT NULL,
recycling_id INTEGER NOT NULL,
experiment_hash CHAR(64) NOT NULL UNIQUE,
FOREIGN KEY (load_id) REFERENCES load_parameters(id) ON DELETE CASCADE,
FOREIGN KEY (recycling_id) REFERENCES recycling_parameters(id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS experiment_data (
id BIGSERIAL PRIMARY KEY,
Direction DOUBLE PRECISION,
Temperature DOUBLE PRECISION,
NOx DOUBLE PRECISION,
CO2 DOUBLE PRECISION,
CO DOUBLE PRECISION,
file_id CHAR(64) NOT NULL
);
""")
self.connection.commit()
def insert_load_parameters(self, load_parameters):
with self.connection.cursor() as cur:
cur.execute("SELECT id FROM load_parameters WHERE load = %s", (load_parameters['load'],))
load_id = cur.fetchone()
if load_id is None:
cur.execute("""
INSERT INTO load_parameters (load, primary_air_consumption, secondary_air_consumption, gas_inlet_consumption)
VALUES (%s, %s, %s, %s)
RETURNING id;
""", (load_parameters['load'], load_parameters['primary_air_consumption'],
load_parameters['secondary_air_consumption'], load_parameters['gas_inlet_consumption']))
load_id = cur.fetchone()[0]
else:
load_id = load_id[0]
self.connection.commit()
return load_id
def insert_recycling_parameters(self, recycling_parameters, load_id):
with self.connection.cursor() as cur:
cur.execute("SELECT id FROM recycling_parameters WHERE load_id = %s AND recycling_level = %s",
(load_id, recycling_parameters['recycling_level']))
recycling_id = cur.fetchone()
if recycling_id is None:
cur.execute("""
INSERT INTO recycling_parameters (load_id, recycling_level, CO2, N2, H2O, O2)
VALUES (%s, %s, %s, %s, %s, %s)
RETURNING id;
""", (load_id, recycling_parameters['recycling_level'], recycling_parameters['CO2'],
recycling_parameters['N2'], recycling_parameters['H2O'], recycling_parameters['O2']))
recycling_id = cur.fetchone()[0]
else:
recycling_id = recycling_id[0]
self.connection.commit()
return recycling_id
def insert_experiment_parameters(self, experiment_parameters, load_id, recycling_id, file_id):
with self.connection.cursor() as cur:
cur.execute("SELECT id FROM experiment_parameters WHERE experiment_hash = %s", (file_id,))
experiment_id = cur.fetchone()
if experiment_id is None:
cur.execute("""
INSERT INTO experiment_parameters (outer_blades_count, outer_blades_length, outer_blades_angle, middle_blades_count, load_id, recycling_id, experiment_hash)
VALUES (%s, %s, %s, %s, %s, %s, %s);
""", (experiment_parameters['outer_blades_count'], experiment_parameters['outer_blades_length'],
experiment_parameters['outer_blades_angle'], experiment_parameters['middle_blades_count'], load_id,
recycling_id, file_id))
self.connection.commit()
def get_load_parameters(self, load):
with self.connection.cursor() as cur:
cur.execute("SELECT * FROM load_parameters WHERE load = %s", (load,))
row = cur.fetchone()
if row:
return {
'load': row[1],
'primary_air_consumption': row[2],
'secondary_air_consumption': row[3],
'gas_inlet_consumption': row[4]
}
return None
def get_recycling_parameters(self, load, recycling_level):
with self.connection.cursor() as cur:
cur.execute("""
SELECT rp.* FROM recycling_parameters rp
JOIN load_parameters lp ON rp.load_id = lp.id
WHERE lp.load = %s AND rp.recycling_level = %s
""", (load, recycling_level))
row = cur.fetchone()
if row:
return {
'load': load,
'recycling_level': row[2],
'CO2': row[3],
'N2': row[4],
'H2O': row[5],
'O2': row[6]
}
return None
def get_experiment_parameters(self, experiment_hash):
with self.connection.cursor() as cur:
cur.execute("SELECT * FROM experiment_parameters WHERE experiment_hash = %s", (experiment_hash,))
row = cur.fetchone()
if row:
load_params = self.get_load_parameters(row[5])
recycling_params = self.get_recycling_parameters(load_params['load'], row[6])
return {
'outer_blades_count': row[1],
'outer_blades_length': row[2],
'outer_blades_angle': row[3],
'middle_blades_count': row[4],
'load': load_params['load'],
'recycling': recycling_params['recycling_level'],
'experiment_hash': row[7]
}
return None
def get_experiments(self):
# query = """
# SELECT
# ep.experiment_hash AS file_id,
# ep.outer_blades_count,
# ep.outer_blades_length,
# ep.outer_blades_angle,
# ep.middle_blades_count,
# lp.primary_air_consumption,
# lp.secondary_air_consumption,
# lp.gas_inlet_consumption,
# rp.n2,
# rp.o2,
# rp.h2o,
# rp.co2
# FROM
# experiment_parameters ep
# JOIN
# load_parameters lp ON ep.load_id = lp.id
# JOIN
# recycling_parameters rp ON ep.recycling_id = rp.id
# """
query = """
SELECT
ep.experiment_hash AS file_id,
ep.outer_blades_count,
ep.outer_blades_length,
ep.outer_blades_angle,
ep.middle_blades_count,
lp.load,
rp.recycling_level
FROM
experiment_parameters ep
JOIN
load_parameters lp ON ep.load_id = lp.id
JOIN
recycling_parameters rp ON ep.recycling_id = rp.id
"""
with self.connection.cursor() as cursor:
cursor.execute(query)
data = cursor.fetchall()
columns = [desc[0] for desc in cursor.description]
df = pd.DataFrame(data, columns=columns)
return df
def save_csv_to_postgres(self, csv_path, file_id):
try:
# Прочитать файл и добавить хэш как новую колонку
df = pd.read_csv(csv_path)
first_col = df.columns[0]
df = df[[first_col] + [col for col in df.columns if "Line Section: Direction [-1,0,0] (m)" not in col]]
# Переименовать колонки
rename_dict = {
"Line Section: Direction [-1,0,0] (m)": "Direction",
"Line Section: Temperature (K)": "Temperature",
"Line Section: Mass Fraction of Nitrogen Oxide Emission": "NOx",
"Line Section: Mass Fraction of CO2": "CO2",
"Line Section: Mass Fraction of CO": "CO"
}
df.rename(columns=rename_dict, inplace=True)
df['file_id'] = file_id
with self.connection.cursor() as cur:
cur.execute("SELECT file_id FROM experiment_data WHERE file_id = %s", (file_id,))
row = cur.fetchone()
if row:
cur.execute("DELETE FROM experiment_data WHERE file_id = %s", (file_id,))
self.connection.commit()
# Вставка новых данных из DataFrame в таблицу
insert_query = '''
INSERT INTO experiment_data (Direction, Temperature, NOx, CO2, CO, file_id)
VALUES (%s, %s, %s, %s, %s, %s)
'''
data_to_insert = df.to_records(index=False).tolist()
cur.executemany(insert_query, data_to_insert)
self.connection.commit()
# Закрытие соединения
cur.close()
return "Success"
except Exception as e:
return f"Failed: {str(e)}"
def get_data(self):
query = """
WITH max_temp AS (
SELECT
file_id,
temperature AS max_temperature,
direction AS direction_for_max_temp,
ROW_NUMBER() OVER (PARTITION BY file_id ORDER BY temperature DESC) AS temp_rank
FROM
experiment_data
),
max_co2 AS (
SELECT
file_id,
co2 AS max_co2,
direction AS direction_for_max_co2,
ROW_NUMBER() OVER (PARTITION BY file_id ORDER BY co2 DESC) AS co2_rank
FROM
experiment_data
),
max_co AS (
SELECT
file_id,
co AS max_co,
direction AS direction_for_max_co,
ROW_NUMBER() OVER (PARTITION BY file_id ORDER BY co DESC) AS co_rank
FROM
experiment_data
),
max_nox AS (
SELECT
file_id,
nox AS max_nox,
direction AS direction_for_max_nox,
ROW_NUMBER() OVER (PARTITION BY file_id ORDER BY nox DESC) AS nox_rank
FROM
experiment_data
)
SELECT
t.file_id,
t.direction_for_max_temp,
t.max_temperature,
cx.direction_for_max_co2,
cx.max_co2,
c.direction_for_max_co,
c.max_co,
n.direction_for_max_nox,
n.max_nox
FROM
(SELECT * FROM max_temp WHERE temp_rank = 1) t
LEFT JOIN
(SELECT * FROM max_nox WHERE nox_rank = 1) n ON t.file_id = n.file_id
LEFT JOIN
(SELECT * FROM max_co2 WHERE co2_rank = 1) cx ON t.file_id = cx.file_id
LEFT JOIN
(SELECT * FROM max_co WHERE co_rank = 1) c ON t.file_id = c.file_id;
"""
with self.connection.cursor() as cursor:
cursor.execute(query)
data = cursor.fetchall()
columns = [desc[0] for desc in cursor.description]
df = pd.DataFrame(data, columns=columns)
return df
def close(self):
self.connection.close()
# Основной скрипт
# def main():
# # Данные
# experiment_parameters = {
# 'outer_blades_count': 24,
# 'outer_blades_length': 74.0,
# 'outer_blades_angle': 65.0,
# 'middle_blades_count': 18,
# 'load': 315.0,
# 'recycling': 8.0,
# }
#
# load_parameters = {
# 'load': 315.0,
# 'primary_air_consumption': 15.2239,
# 'secondary_air_consumption': 63.9876,
# 'gas_inlet_consumption': 0.8648
# }
#
# recycling_parameters = {
# 'load': 315.0,
# 'recycling_level': 8.0,
# 'CO2': 0.04,
# 'N2': 0.70,
# 'H2O': 0.06,
# 'O2': 0.20
# }
#
# # Инициализация базы данных
# db = PostgresClient(
# dbname="your_db_name",
# user="your_db_user",
# password="your_db_password",
# host="your_db_host",
# port="your_db_port"
# )
#
# try:
#
# # Извлечение и печать данных
# retrieved_experiment = db.get_experiment_parameters(experiment_parameters['experiment_hash'])
# print("Retrieved experiment parameters:", retrieved_experiment)
#
# retrieved_load = db.get_load_parameters(load_parameters['load'])
# print("Retrieved load parameters:", retrieved_load)
#
# retrieved_recycling = db.get_recycling_parameters(recycling_parameters['load'],
# recycling_parameters['recycling_level'])
# print("Retrieved recycling parameters:", retrieved_recycling)
# finally:
# db.close()
#
#
# if __name__ == "__main__":
# main()

Binary file not shown.

View File

@ -1,56 +0,0 @@
import subprocess
import time
def run_script():
# outer_blades_count = [12.0, 24.0, 36.0, 48.0]
# outer_blades_count = [24.0, 36.0]
outer_blades_count = [24.0]
# outer_blades_length = [44.0, 86.0, 107.5]
outer_blades_length = [70.0]
# outer_blades_angle = [30.0, 45.0, 60.0, 75.0]
outer_blades_angle = [45.0, 60.0]
middle_blades_count = [9.0, 27.0, 36.0]
# middle_blades_count = 18.0
# load = [190, 260, 315, 400, 465]
load = [315, 400, 465]
# load_eco = [260, 315, 400, 465]
# load = [190, 260, 465]
# recycling_eco = [0, 7, 14, 21, 28]
# recycling_full = [0, 5, 8, 10, 15, 20, 25, 30]
recycling_full = [0, 5, 10, 20]
# recycling = [0, 6, 12, 18, 24, 30]
# recycling = [0, 5, 8]
for middle_count in middle_blades_count:
for length in outer_blades_length:
for outer_blade in outer_blades_count:
for angle in outer_blades_angle:
for current_load in load:
for current_recycling in recycling_full:
# Начало замера времени
start_time = time.time()
result = subprocess.run(['python', 'new_experiment_planner.py', str(outer_blade),
str(length), str(angle), str(middle_count),
str(current_load), str(current_recycling)], capture_output=True, text=True)
# Конец замера времени
end_time = time.time()
# Вычисление времени выполнения
execution_time = end_time - start_time
print("Output of the script:")
print(result.stdout)
print("Errors (if any):")
print(result.stderr)
print("Execution time:", execution_time)
if __name__ == "__main__":
run_script()

View File

@ -1,58 +0,0 @@
from insert_to_db import add_data_to_db
import macros_generator as mg
import yaml
# Загрузка конфигурации из файла config.yaml
with open('config.yaml', 'r') as config_file:
config = yaml.safe_load(config_file)
DIAMETERS = config['parameters']['diameters']
# outer_blades_count = [12, 24, 36, 48]
outer_blades_count = 24.0
# outer_blades_length = [44, 70, 86, 107.5]
outer_blades_length = 70.0
outer_blades_angle = [30.0, 45.0, 60.0, 75.0]
# middle_blades_count = [9, 18, 27, 36]
middle_blades_count = 18.0
# load = [190, 260, 315, 400, 465]
# load_eco = [260, 315, 400, 465]
load = [190, 260, 315, 400, 465]
# recycling_eco = [0, 7, 14, 21, 28]
recycling_full = [0, 5, 8, 10, 15, 20, 25, 30]
# recycling = [0, 6, 12, 18, 24, 30]
# recycling = [0, 5, 8]
for angle in outer_blades_angle:
for current_load in load:
for current_recycling in recycling_full:
experiment_parameters = {
'outer_blades_count': outer_blades_count,
'outer_blades_length': outer_blades_length,
'outer_blades_angle': angle,
'middle_blades_count': middle_blades_count,
'load': current_load,
'recycling': current_recycling,
}
_cur_diameters = DIAMETERS.copy()
fuel_parameters = mg.load_calculation(float(current_load), _cur_diameters)
load_parameters = {
'load': current_load,
'primary_air_consumption': fuel_parameters['primary_air_consumption'],
'secondary_air_consumption': fuel_parameters['secondary_air_consumption'],
'gas_inlet_consumption': fuel_parameters['gas_inlet_consumption']
}
recycling_parameters = mg.recycling_calculation(
fuel_parameters['alpha'], fuel_parameters['gas_consumption'], fuel_parameters['air_consumption'],
float(current_recycling))
recycling_parameters['load'] = float(current_load)
recycling_parameters['recycling_level'] = float(current_recycling)
add_data_to_db(experiment_parameters, load_parameters, recycling_parameters)

View File

@ -1,31 +0,0 @@
from pydantic_settings import BaseSettings, SettingsConfigDict
class Settings(BaseSettings):
DB_USER: str
DB_PASSWORD: str
DB_HOST: str
DB_PORT: int
DB_NAME: str
DATABASE: str
POSTGRES_USER: str
POSTGRES_PASSWORD: str
CLICKHOUSE_USER: str
CLICKHOUSE_PASSWORD: str
@property
def db_url_asyncpg(self):
# 'postgresql+asyncpg://username:password@localhost:5432/database_name'
return f'postgresql+asyncpg://{self.DB_USER}:{self.DB_PASSWORD}@{self.DB_HOST}:{self.DB_PORT}/{self.DB_NAME}'
@property
def db_url_asyncpg_docker(self):
# 'postgresql+asyncpg://username:password@localhost:5432/database_name'
return f'postgresql+asyncpg://{self.POSTGRES_USER}:{self.POSTGRES_PASSWORD}@db:{self.DB_PORT}/{self.DATABASE}'
@property
def clickhouse_url(self):
return f'clickhouse://{self.CLICKHOUSE_USER}:{self.CLICKHOUSE_PASSWORD}@clickhouse:8123/{self.DATABASE}'
model_config = SettingsConfigDict(env_file=".env")
settings = Settings()

View File

@ -1,33 +0,0 @@
from clickhouse_tools import ClickHouseClient
from settings import settings
from pathlib import Path
import yaml
import utils
experiment_parameters = {
'outer_blades_count': 24.0,
'outer_blades_length': 70.0,
'outer_blades_angle': 60.0,
'middle_blades_count': 18.0,
'load': 400,
'recycling': 15,
}
with open('config.yaml', 'r') as config_file:
config = yaml.safe_load(config_file)
MAIN_PATH = config['paths']['main']
main_path = Path(MAIN_PATH)
geometry_path = (f"{experiment_parameters['outer_blades_count']}_{experiment_parameters['outer_blades_length']}_"
f"{experiment_parameters['outer_blades_angle']}_{experiment_parameters['middle_blades_count']}")
experiments_path = main_path / geometry_path / 'experiments'
load_path = experiments_path / str(experiment_parameters['load'])
recycling_path = load_path / str(experiment_parameters['recycling'])
table_csv = recycling_path / 'data_table.csv'
file_id = utils.calculate_hash(experiment_parameters)
clickhouse_client = ClickHouseClient("localhost", 8123, 'SuperService', 'UserMyHouse',
'NotWarningWord2')
clickhouse_client.save_csv_to_clickhouse(table_csv, file_id)

View File

@ -1,7 +0,0 @@
import hashlib
import json
def calculate_hash(experiment_params):
params_str = json.dumps(experiment_params, sort_keys=True)
return hashlib.sha256(params_str.encode()).hexdigest()