openstef 3.4.18__py3-none-any.whl → 3.4.20__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
openstef/app_settings.py CHANGED
@@ -9,9 +9,11 @@ from pydantic_settings import BaseSettings, SettingsConfigDict
9
9
  class AppSettings(BaseSettings):
10
10
  """Global app settings."""
11
11
 
12
- # Logging settings.
13
- log_level: str = Field("INFO", description="Log level used for logging statements.")
14
-
15
12
  model_config = SettingsConfigDict(
16
13
  env_prefix="openstef_", env_file=".env", extra="ignore"
17
14
  )
15
+
16
+ post_teams_messages: bool = True
17
+
18
+ # Logging settings.
19
+ log_level: str = Field("INFO", description="Log level used for logging statements.")
openstef/exceptions.py CHANGED
@@ -5,7 +5,7 @@
5
5
  """Openstef custom exceptions."""
6
6
 
7
7
 
8
- # Define custom exception
8
+ # Define custom exceptions
9
9
  class NoPredictedLoadError(Exception):
10
10
  """No predicted load for given datatime range."""
11
11
 
@@ -41,6 +41,9 @@ def post_teams(
41
41
  Note:
42
42
  This function is namespace-specific.
43
43
  """
44
+ if not Settings.post_teams_messages:
45
+ return
46
+
44
47
  structlog.configure(
45
48
  wrapper_class=structlog.make_filtering_bound_logger(
46
49
  logging.getLevelName(Settings.log_level)
@@ -72,6 +72,8 @@ def check_kpi_task(
72
72
  context: TaskContext,
73
73
  start_time: datetime,
74
74
  end_time: datetime,
75
+ threshold_optimizing=THRESHOLD_OPTIMIZING,
76
+ threshold_retraining=THRESHOLD_RETRAINING,
75
77
  ) -> None:
76
78
  # Apply default parameters if none are provided
77
79
  if start_time is None:
@@ -102,20 +104,20 @@ def check_kpi_task(
102
104
 
103
105
  # Add pid to the list of pids that should be retrained or optimized if
104
106
  # performance is insufficient
105
- if kpis["47.0h"]["rMAE"] > THRESHOLD_RETRAINING:
107
+ if kpis["47.0h"]["rMAE"] > threshold_retraining:
106
108
  context.logger.warning(
107
109
  "Need to retrain model, retraining threshold rMAE 47h exceeded",
108
110
  t_ahead="47.0h",
109
111
  rMAE=kpis["47.0h"]["rMAE"],
110
- retraining_threshold=THRESHOLD_RETRAINING,
112
+ retraining_threshold=threshold_retraining,
111
113
  )
112
114
 
113
- if kpis["47.0h"]["rMAE"] > THRESHOLD_OPTIMIZING:
115
+ if kpis["47.0h"]["rMAE"] > threshold_optimizing:
114
116
  context.logger.warning(
115
117
  "Need to optimize hyperparameters, optimizing threshold rMAE 47h exceeded",
116
118
  t_ahead="47.0h",
117
119
  rMAE=kpis["47.0h"]["rMAE"],
118
- optimizing_threshold=THRESHOLD_OPTIMIZING,
120
+ optimizing_threshold=threshold_optimizing,
119
121
  )
120
122
 
121
123
 
@@ -32,7 +32,10 @@ T_AHEAD_DAYS: int = 14
32
32
 
33
33
 
34
34
  def create_basecase_forecast_task(
35
- pj: PredictionJobDataClass, context: TaskContext
35
+ pj: PredictionJobDataClass,
36
+ context: TaskContext,
37
+ t_behind_days=T_BEHIND_DAYS,
38
+ t_ahead_days=T_AHEAD_DAYS,
36
39
  ) -> None:
37
40
  """Top level task that creates a basecase forecast.
38
41
 
@@ -41,6 +44,8 @@ def create_basecase_forecast_task(
41
44
  Args:
42
45
  pj: Prediction job
43
46
  context: Contect object that holds a config manager and a database connection
47
+ t_behind_days: number of days included as history. This is used to generated lagged features for the to-be-forecasted period
48
+ t_ahead_days: number of days a basecase forecast is created for
44
49
 
45
50
  """
46
51
  # Check pipeline types
@@ -63,8 +68,8 @@ def create_basecase_forecast_task(
63
68
  return
64
69
 
65
70
  # Define datetime range for input data
66
- datetime_start = datetime.utcnow() - timedelta(days=T_BEHIND_DAYS)
67
- datetime_end = datetime.utcnow() + timedelta(days=T_AHEAD_DAYS)
71
+ datetime_start = datetime.utcnow() - timedelta(days=t_behind_days)
72
+ datetime_end = datetime.utcnow() + timedelta(days=t_ahead_days)
68
73
 
69
74
  # Retrieve input data
70
75
  input_data = context.database.get_model_input(
@@ -43,7 +43,10 @@ T_AHEAD_DAYS = 3
43
43
 
44
44
 
45
45
  def create_components_forecast_task(
46
- pj: PredictionJobDataClass, context: TaskContext
46
+ pj: PredictionJobDataClass,
47
+ context: TaskContext,
48
+ t_behind_days: int = T_BEHIND_DAYS,
49
+ t_ahead_days: int = T_AHEAD_DAYS,
47
50
  ) -> None:
48
51
  """Top level task that creates a components forecast.
49
52
 
@@ -52,6 +55,8 @@ def create_components_forecast_task(
52
55
  Args:
53
56
  pj: Prediction job
54
57
  context: Contect object that holds a config manager and a database connection
58
+ t_behind_days: number of days in the past that the component forecast is created for
59
+ t_ahead_days: number of days in the future that the component forecast is created for
55
60
 
56
61
  Raises:
57
62
  ComponentForecastTooShortHorizonError: If the forecast horizon is too short
@@ -71,8 +76,8 @@ def create_components_forecast_task(
71
76
  return
72
77
 
73
78
  # Define datetime range for input data
74
- datetime_start = datetime.utcnow() - timedelta(days=T_BEHIND_DAYS)
75
- datetime_end = datetime.utcnow() + timedelta(days=T_AHEAD_DAYS)
79
+ datetime_start = datetime.utcnow() - timedelta(days=t_behind_days)
80
+ datetime_end = datetime.utcnow() + timedelta(days=t_ahead_days)
76
81
 
77
82
  logger.info(
78
83
  "Get predicted load", datetime_start=datetime_start, datetime_end=datetime_end
@@ -34,7 +34,9 @@ from openstef.validation.validation import detect_ongoing_zero_flatliner
34
34
  T_BEHIND_DAYS: int = 14
35
35
 
36
36
 
37
- def create_forecast_task(pj: PredictionJobDataClass, context: TaskContext) -> None:
37
+ def create_forecast_task(
38
+ pj: PredictionJobDataClass, context: TaskContext, t_behind_days: int = T_BEHIND_DAYS
39
+ ) -> None:
38
40
  """Top level task that creates a forecast.
39
41
 
40
42
  On this task level all database and context manager dependencies are resolved.
@@ -45,6 +47,7 @@ def create_forecast_task(pj: PredictionJobDataClass, context: TaskContext) -> No
45
47
  Args:
46
48
  pj: Prediction job
47
49
  context: Contect object that holds a config manager and a database connection
50
+ t_behind_days: number of days included as history. This is used to generated lagged features for the to-be-forecasted period
48
51
 
49
52
  """
50
53
  # Check pipeline types
@@ -70,7 +73,7 @@ def create_forecast_task(pj: PredictionJobDataClass, context: TaskContext) -> No
70
73
  mlflow_tracking_uri = context.config.paths_mlflow_tracking_uri
71
74
 
72
75
  # Define datetime range for input data
73
- datetime_start = datetime.utcnow() - timedelta(days=T_BEHIND_DAYS)
76
+ datetime_start = datetime.utcnow() - timedelta(days=t_behind_days)
74
77
  datetime_end = datetime.utcnow() + timedelta(seconds=pj.horizon_minutes * 60)
75
78
 
76
79
  # Retrieve input data
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: openstef
3
- Version: 3.4.18
3
+ Version: 3.4.20
4
4
  Summary: Open short term energy forecaster
5
5
  Home-page: https://github.com/OpenSTEF/openstef
6
6
  Author: Alliander N.V
@@ -41,9 +41,11 @@ SPDX-FileCopyrightText: 2017-2023 Contributors to the OpenSTEF project <korte.te
41
41
  SPDX-License-Identifier: MPL-2.0
42
42
  -->
43
43
 
44
- <!-- Github Actions badges -->
45
- [![Python Build](https://github.com/openstef/openstef/actions/workflows/python-build.yaml/badge.svg)](https://github.com/openstef/openstef/actions/workflows/python-build.yaml)
46
- [![REUSE Compliance Check](https://github.com/openstef/openstef/actions/workflows/reuse-compliance.yaml/badge.svg)](https://github.com/openstef/openstef/actions/workflows/reuse-compliance.yaml)
44
+ # OpenSTEF
45
+ <!-- Badges -->
46
+ [![Downloads](https://static.pepy.tech/badge/openstef)](https://pepy.tech/project/openstef)
47
+ [![Downloads](https://static.pepy.tech/badge/openstef/month)](https://pepy.tech/project/openstef)
48
+ [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/5585/badge)](https://bestpractices.coreinfrastructure.org/projects/5585)
47
49
  <!-- SonarCloud badges -->
48
50
  [![Bugs](https://sonarcloud.io/api/project_badges/measure?project=OpenSTEF_openstef&metric=bugs)](https://sonarcloud.io/dashboard?id=OpenSTEF_openstef)
49
51
  [![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=OpenSTEF_openstef&metric=code_smells)](https://sonarcloud.io/dashboard?id=OpenSTEF_openstef)
@@ -54,11 +56,6 @@ SPDX-License-Identifier: MPL-2.0
54
56
  [![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=OpenSTEF_openstef&metric=security_rating)](https://sonarcloud.io/dashboard?id=OpenSTEF_openstef)
55
57
  [![Technical Debt](https://sonarcloud.io/api/project_badges/measure?project=OpenSTEF_openstef&metric=sqale_index)](https://sonarcloud.io/dashboard?id=OpenSTEF_openstef)
56
58
  [![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=OpenSTEF_openstef&metric=vulnerabilities)](https://sonarcloud.io/dashboard?id=OpenSTEF_openstef)
57
- [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/5585/badge)](https://bestpractices.coreinfrastructure.org/projects/5585)
58
- [![Downloads](https://static.pepy.tech/badge/openstef)](https://pepy.tech/project/openstef)
59
- [![Downloads](https://static.pepy.tech/badge/openstef/month)](https://pepy.tech/project/openstef)
60
-
61
- # OpenSTEF
62
59
 
63
60
  OpenSTEF is a Python package designed for generating short-term forecasts in the energy sector. The repository includes all the essential components required for machine learning pipelines that facilitate the forecasting process. To utilize the package, users are required to furnish their own data storage and retrieval interface.
64
61
 
@@ -66,26 +63,22 @@ OpenSTEF is a Python package designed for generating short-term forecasts in the
66
63
  - [OpenSTEF](#openstef)
67
64
  - [Table of contents](#table-of-contents)
68
65
  - [External information sources](#external-information-sources)
69
- - [Installation](#installation)
70
- - [Install the openstef package](#install-the-openstef-package)
71
- - [Remark regarding installation within a **conda environment on Windows**:](#remark-regarding-installation-within-a-conda-environment-on-windows)
66
+ - [Installation](#install)
72
67
  - [Usage](#usage)
73
- - [Reference Implementation](#reference-implementation)
74
- - [Openstef-dbc - Database connector for openstef](#openstef-dbc---database-connector-for-openstef)
75
- - [Example notebooks](#example-notebooks)
76
- - [License](#license)
77
- - [Licenses third-party libraries](#licenses-third-party-libraries)
78
- - [Contributing](#contributing)
79
- - [Contact](#contact)
68
+ - [Example notebooks](#example-notebooks)
69
+ - [Reference Implementation](#reference-implementation)
70
+ - [Database connector for OpenSTEF](#database-connector-for-openstef)
71
+ - [License](license)
72
+ - [Contributing](#contributing)
73
+ - [Contact](#contact)
80
74
 
81
75
  # External information sources
82
76
  - [Documentation website](https://openstef.github.io/openstef/index.html);
83
77
  - [Python package](https://pypi.org/project/openstef/);
84
- - [Project website](https://www.lfenergy.org/projects/openstef/);
78
+ - [Linux Foundation project page](https://www.lfenergy.org/projects/openstef/);
85
79
  - [Documentation on dashboard](https://raw.githack.com/OpenSTEF/.github/main/profile/html/openstef_dashboard_doc.html);
86
- - [Linux Foundation project page](https://openstef.github.io/openstef/index.html)
87
80
  - [Video about OpenSTEF](https://www.lfenergy.org/forecasting-to-create-a-more-resilient-optimized-grid/);
88
- - [Teams channel](https://teams.microsoft.com/l/team/19%3ac08a513650524fc988afb296cd0358cc%40thread.tacv2/conversations?groupId=bfcb763a-3a97-4938-81d7-b14512aa537d&tenantId=697f104b-d7cb-48c8-ac9f-bd87105bafdc)
81
+ - [Teams channel](https://teams.microsoft.com/l/team/19%3ac08a513650524fc988afb296cd0358cc%40thread.tacv2/conversations?groupId=bfcb763a-3a97-4938-81d7-b14512aa537d&tenantId=697f104b-d7cb-48c8-ac9f-bd87105bafdc)
89
82
 
90
83
  # Installation
91
84
 
@@ -105,33 +98,33 @@ For more information on this issue see the [readme of pywin32](https://github.co
105
98
 
106
99
  # Usage
107
100
 
108
- To run a task use:
109
-
110
- ```shell
111
- python -m openstef task <task_name>
112
- ```
101
+ ## Example notebooks
102
+ To help you get started, a set of fundamental example notebooks has been created. You can access these offline examples [here](https://github.com/OpenSTEF/openstef-offline-example).
113
103
 
114
104
  ## Reference Implementation
115
105
  A complete implementation including databases, user interface, example data, etc. is available at: https://github.com/OpenSTEF/openstef-reference
116
106
 
117
107
  ![screenshot](https://user-images.githubusercontent.com/60883372/146760483-29af3ac7-62af-4f13-98c7-982a79c517d1.jpg)
118
108
  Screenshot of the operational dashboard showing the key functionality of OpenSTEF.
119
- Dashboard documentation can be found [here](https://github.com/OpenSTEF/.github/blob/main/profile/README.md).
109
+ Dashboard documentation can be found [here](https://raw.githack.com/OpenSTEF/.github/main/profile/html/openstef_dashboard_doc.html).
120
110
 
121
- ## Openstef-dbc - Database connector for openstef
122
- This repository provides an interface to OpenSTEF (reference) databases. The repository can be found [here](https://github.com/OpenSTEF/openstef-dbc).
111
+ To run a task use:
123
112
 
124
- ## Example notebooks
125
- To help you get started, a set of fundamental example notebooks has been created. You can access these offline examples [here](https://github.com/OpenSTEF/openstef-offline-example).
113
+ ```shell
114
+ python -m openstef task <task_name>
115
+ ```
116
+
117
+ ## Database connector for openstef
118
+ This repository provides an interface to OpenSTEF (reference) databases. The repository can be found [here](https://github.com/OpenSTEF/openstef-dbc).
126
119
 
127
- ## License
120
+ # License
128
121
  This project is licensed under the Mozilla Public License, version 2.0 - see LICENSE for details.
129
122
 
130
123
  ## Licenses third-party libraries
131
124
  This project includes third-party libraries, which are licensed under their own respective Open-Source licenses. SPDX-License-Identifier headers are used to show which license is applicable. The concerning license files can be found in the LICENSES directory.
132
125
 
133
- ## Contributing
126
+ # Contributing
134
127
  Please read [CODE_OF_CONDUCT.md](https://github.com/OpenSTEF/.github/blob/main/CODE_OF_CONDUCT.md), [CONTRIBUTING.md](https://github.com/OpenSTEF/.github/blob/main/CONTRIBUTING.md) and [PROJECT_GOVERNANCE.md](https://github.com/OpenSTEF/.github/blob/main/PROJECT_GOVERNANCE.md) for details on the process for submitting pull requests to us.
135
128
 
136
- ## Contact
129
+ # Contact
137
130
  Please read [SUPPORT.md](https://github.com/OpenSTEF/.github/blob/main/SUPPORT.md) for how to connect and get into contact with the OpenSTEF project
@@ -1,8 +1,8 @@
1
1
  openstef/__init__.py,sha256=93UM6m0LLQhO69-mSqLuUy73jgs4W7Iuxfo3Lm8c98g,419
2
2
  openstef/__main__.py,sha256=bIyGTSA4V5VoOLTwdaiJJAnozmpSzvQooVYlsf8H4eU,163
3
- openstef/app_settings.py,sha256=d1jqBz53JZbNeNp9IoFCQuzB2zZ_GZjEvvtSV7Hu1Yk,544
3
+ openstef/app_settings.py,sha256=EJTDtimctFQQ-3f7ZcOQaRYohpZk3JD6aZBWPFYM2_A,582
4
4
  openstef/enums.py,sha256=f3Gw-HlNXeqMZahIAEYSZkPKtKWeNt3tfOJBL45Z2fM,629
5
- openstef/exceptions.py,sha256=fVqjyrVMBiSGxcoZ3JfTcgZjIur1cPennZpfwqgc9qY,1992
5
+ openstef/exceptions.py,sha256=U4u2LTcdT6cmzpipT2Jh7kq9nCjT_-6gntn8yjuhGU0,1993
6
6
  openstef/settings.py,sha256=nSgkBqFxuqB3w7Rwo60i8j37c5ngDbt6vpjHS6QtJXQ,354
7
7
  openstef/data/dutch_holidays_2020-2022.csv,sha256=pS-CjE0igYXd-2dG-MlqyvR2fgYgXkbNmgCKyTjmwxs,23704
8
8
  openstef/data/dutch_holidays_2020-2022.csv.license,sha256=AxxHusqwIXU5RHl5ZMU65LyXmgtbj6QlcnFaOEN4kEE,145
@@ -69,7 +69,7 @@ openstef/model_selection/__init__.py,sha256=bIyGTSA4V5VoOLTwdaiJJAnozmpSzvQooVYl
69
69
  openstef/model_selection/model_selection.py,sha256=R34tJBecZo6IiUwCCRLeBI2ZCX6GP8W7FDBlGFWtmG8,11167
70
70
  openstef/monitoring/__init__.py,sha256=bIyGTSA4V5VoOLTwdaiJJAnozmpSzvQooVYlsf8H4eU,163
71
71
  openstef/monitoring/performance_meter.py,sha256=6aCGjJFXFq-7qwaJyBkF3MLqjgVK6FMFVcO-bcLLUb4,2803
72
- openstef/monitoring/teams.py,sha256=V62KEGUT_jxa9iIfm6-2NiVoSeYia_CP4E23lsoHP9g,6611
72
+ openstef/monitoring/teams.py,sha256=A-tlZeuAgolxFHjgT3gGjraxzW2dmuB-UAOz4xgYNIQ,6668
73
73
  openstef/pipeline/__init__.py,sha256=bIyGTSA4V5VoOLTwdaiJJAnozmpSzvQooVYlsf8H4eU,163
74
74
  openstef/pipeline/create_basecase_forecast.py,sha256=YkpiqohETTAETb4GiVlK_btw5dpixJy2LmFZdm10iaI,4623
75
75
  openstef/pipeline/create_component_forecast.py,sha256=A0dmILy_BuAAf2U_9i2FOj6KItIdZdGzi6hNDk-da4Q,6416
@@ -83,10 +83,10 @@ openstef/postprocessing/postprocessing.py,sha256=vJZ57TZ3MbG4c78P2cq8Sxs6VHl6kjF
83
83
  openstef/preprocessing/__init__.py,sha256=bIyGTSA4V5VoOLTwdaiJJAnozmpSzvQooVYlsf8H4eU,163
84
84
  openstef/preprocessing/preprocessing.py,sha256=bM_cSSSb2vGTD79RGzUrI6KoELbzlCyJwc7jqQGNEsE,1454
85
85
  openstef/tasks/__init__.py,sha256=bIyGTSA4V5VoOLTwdaiJJAnozmpSzvQooVYlsf8H4eU,163
86
- openstef/tasks/calculate_kpi.py,sha256=oDru-mjtYnKz6ludzwkMBYvxTwbB9Ab5MIYnKDi47cQ,11788
87
- openstef/tasks/create_basecase_forecast.py,sha256=Hk9fDljXvo5TfeS3nWHrerWi7y-lQzoJEaqWbqaxHOs,3852
88
- openstef/tasks/create_components_forecast.py,sha256=cvgtYqJ7kCTdEfpLEyrAyIsHfWxR17M2rPYdkZKsEU8,5869
89
- openstef/tasks/create_forecast.py,sha256=FPILsCqt2lT2QIjseXyKjViZG6SVRoGCxoj9tPiozIg,5575
86
+ openstef/tasks/calculate_kpi.py,sha256=78DuK30ohWIHuc6oneRXalcNMXQ5mzy2qDr9xsPdSQs,11882
87
+ openstef/tasks/create_basecase_forecast.py,sha256=lxor1E3WQ_XAZDYWdNJKE1PY57scz39bKu2Id9U2GwE,4126
88
+ openstef/tasks/create_components_forecast.py,sha256=j4m9AGjnMDx23FmsaZGPYn9rBMHsRd_h-m1RAfhF8to,6139
89
+ openstef/tasks/create_forecast.py,sha256=NWd2fdbZ9CKDi190v7PF14IUdz6pyME2A-ssRNDdaYs,5750
90
90
  openstef/tasks/create_solar_forecast.py,sha256=bTr7NThTF6Yj405qAqRaJmlBUrL7HATqVVzsi9hMdMw,15049
91
91
  openstef/tasks/create_wind_forecast.py,sha256=RhshkmNSyFWx4Y6yQn02GzHjWTREbN5A5GAeWv0JpcE,2907
92
92
  openstef/tasks/optimize_hyperparameters.py,sha256=s-z8YQJF6Lf3DdYgKHEpAdlbFJ3a-0Gj0Ahsqj1DErc,4758
@@ -98,8 +98,8 @@ openstef/tasks/utils/predictionjobloop.py,sha256=Ysy3zF5lzPMz_asYDKeF5m0qgVT3tCt
98
98
  openstef/tasks/utils/taskcontext.py,sha256=L9K14ycwgVxbIVUjH2DIn_QWbnu-OfxcGtQ1K9T6sus,5630
99
99
  openstef/validation/__init__.py,sha256=bIyGTSA4V5VoOLTwdaiJJAnozmpSzvQooVYlsf8H4eU,163
100
100
  openstef/validation/validation.py,sha256=628xaDbAm8B4AYtFOAn8_SXLjejNfULGCfX3hVf_mU0,11119
101
- openstef-3.4.18.dist-info/LICENSE,sha256=7Pm2fWFFHHUG5lDHed1vl5CjzxObIXQglnYsEdtjo_k,14907
102
- openstef-3.4.18.dist-info/METADATA,sha256=bNqXKO-cH_fBcVXGvDILZ5hBNgpfDa9KDlumyEV4Qew,8166
103
- openstef-3.4.18.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
104
- openstef-3.4.18.dist-info/top_level.txt,sha256=kD0H4PqrQoncZ957FvqwfBxa89kTrun4Z_RAPs_HhLs,9
105
- openstef-3.4.18.dist-info/RECORD,,
101
+ openstef-3.4.20.dist-info/LICENSE,sha256=7Pm2fWFFHHUG5lDHed1vl5CjzxObIXQglnYsEdtjo_k,14907
102
+ openstef-3.4.20.dist-info/METADATA,sha256=iDsbzq_7dlisLeKayBIeemF1EYfPDVYXkquQ3k25Qe4,7392
103
+ openstef-3.4.20.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
104
+ openstef-3.4.20.dist-info/top_level.txt,sha256=kD0H4PqrQoncZ957FvqwfBxa89kTrun4Z_RAPs_HhLs,9
105
+ openstef-3.4.20.dist-info/RECORD,,