ddi-fw 0.0.180__tar.gz → 0.0.182__tar.gz

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.
Files changed (109) hide show
  1. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/PKG-INFO +1 -1
  2. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/pyproject.toml +1 -1
  3. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/ml/tensorflow_wrapper.py +54 -10
  4. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/utils/__init__.py +1 -1
  5. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/utils/categorical_data_encoding_checker.py +12 -0
  6. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw.egg-info/PKG-INFO +1 -1
  7. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/README.md +0 -0
  8. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/setup.cfg +0 -0
  9. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/__init__.py +0 -0
  10. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/core.py +0 -0
  11. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/dataset_splitter.py +0 -0
  12. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/db_utils.py +0 -0
  13. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl/base.py +0 -0
  14. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl/data/event.db +0 -0
  15. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl/debug.log +0 -0
  16. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl/indexes/test_indexes.txt +0 -0
  17. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl/indexes/train_fold_0.txt +0 -0
  18. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl/indexes/train_fold_1.txt +0 -0
  19. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl/indexes/train_fold_2.txt +0 -0
  20. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl/indexes/train_fold_3.txt +0 -0
  21. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl/indexes/train_fold_4.txt +0 -0
  22. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl/indexes/train_indexes.txt +0 -0
  23. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl/indexes/validation_fold_0.txt +0 -0
  24. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl/indexes/validation_fold_1.txt +0 -0
  25. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl/indexes/validation_fold_2.txt +0 -0
  26. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl/indexes/validation_fold_3.txt +0 -0
  27. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl/indexes/validation_fold_4.txt +0 -0
  28. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl/indexes_old/test_indexes.txt +0 -0
  29. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl/indexes_old/train_fold_0.txt +0 -0
  30. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl/indexes_old/train_fold_1.txt +0 -0
  31. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl/indexes_old/train_fold_2.txt +0 -0
  32. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl/indexes_old/train_fold_3.txt +0 -0
  33. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl/indexes_old/train_fold_4.txt +0 -0
  34. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl/indexes_old/train_indexes.txt +0 -0
  35. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl/indexes_old/validation_fold_0.txt +0 -0
  36. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl/indexes_old/validation_fold_1.txt +0 -0
  37. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl/indexes_old/validation_fold_2.txt +0 -0
  38. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl/indexes_old/validation_fold_3.txt +0 -0
  39. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl/indexes_old/validation_fold_4.txt +0 -0
  40. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl/readme.md +0 -0
  41. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl_text/base.py +0 -0
  42. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl_text/data/event.db +0 -0
  43. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl_text/indexes/test_indexes.txt +0 -0
  44. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl_text/indexes/train_fold_0.txt +0 -0
  45. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl_text/indexes/train_fold_1.txt +0 -0
  46. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl_text/indexes/train_fold_2.txt +0 -0
  47. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl_text/indexes/train_fold_3.txt +0 -0
  48. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl_text/indexes/train_fold_4.txt +0 -0
  49. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl_text/indexes/train_indexes.txt +0 -0
  50. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl_text/indexes/validation_fold_0.txt +0 -0
  51. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl_text/indexes/validation_fold_1.txt +0 -0
  52. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl_text/indexes/validation_fold_2.txt +0 -0
  53. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl_text/indexes/validation_fold_3.txt +0 -0
  54. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/ddi_mdl_text/indexes/validation_fold_4.txt +0 -0
  55. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/mdf_sa_ddi/__init__.py +0 -0
  56. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/mdf_sa_ddi/base.py +0 -0
  57. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/mdf_sa_ddi/df_extraction_cleanxiaoyu50.csv +0 -0
  58. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/mdf_sa_ddi/drug_information_del_noDDIxiaoyu50.csv +0 -0
  59. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/mdf_sa_ddi/indexes/test_indexes.txt +0 -0
  60. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/mdf_sa_ddi/indexes/train_fold_0.txt +0 -0
  61. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/mdf_sa_ddi/indexes/train_fold_1.txt +0 -0
  62. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/mdf_sa_ddi/indexes/train_fold_2.txt +0 -0
  63. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/mdf_sa_ddi/indexes/train_fold_3.txt +0 -0
  64. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/mdf_sa_ddi/indexes/train_fold_4.txt +0 -0
  65. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/mdf_sa_ddi/indexes/train_indexes.txt +0 -0
  66. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/mdf_sa_ddi/indexes/validation_fold_0.txt +0 -0
  67. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/mdf_sa_ddi/indexes/validation_fold_1.txt +0 -0
  68. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/mdf_sa_ddi/indexes/validation_fold_2.txt +0 -0
  69. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/mdf_sa_ddi/indexes/validation_fold_3.txt +0 -0
  70. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/mdf_sa_ddi/indexes/validation_fold_4.txt +0 -0
  71. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/mdf_sa_ddi/mdf-sa-ddi.zip +0 -0
  72. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/datasets/setup_._py +0 -0
  73. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/drugbank/__init__.py +0 -0
  74. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/drugbank/drugbank.xsd +0 -0
  75. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/drugbank/drugbank_parser.py +0 -0
  76. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/drugbank/drugbank_processor.py +0 -0
  77. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/drugbank/drugbank_processor_org.py +0 -0
  78. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/drugbank/event_extractor.py +0 -0
  79. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/langchain/__init__.py +0 -0
  80. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/langchain/embeddings.py +0 -0
  81. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/langchain/sentence_splitter.py +0 -0
  82. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/langchain/storage.py +0 -0
  83. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/ml/__init__.py +0 -0
  84. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/ml/evaluation_helper.py +0 -0
  85. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/ml/ml_helper.py +0 -0
  86. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/ml/model_wrapper.py +0 -0
  87. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/ml/pytorch_wrapper.py +0 -0
  88. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/ner/__init__.py +0 -0
  89. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/ner/mmlrestclient.py +0 -0
  90. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/ner/ner.py +0 -0
  91. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/pipeline/__init__.py +0 -0
  92. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/pipeline/multi_modal_combination_strategy.py +0 -0
  93. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/pipeline/multi_pipeline.py +0 -0
  94. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/pipeline/ner_pipeline.py +0 -0
  95. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/pipeline/pipeline.py +0 -0
  96. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/utils/enums.py +0 -0
  97. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/utils/json_helper.py +0 -0
  98. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/utils/kaggle.py +0 -0
  99. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/utils/package_helper.py +0 -0
  100. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/utils/py7zr_helper.py +0 -0
  101. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/utils/utils.py +0 -0
  102. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/utils/zip_helper.py +0 -0
  103. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/vectorization/__init__.py +0 -0
  104. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/vectorization/feature_vector_generation.py +0 -0
  105. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw/vectorization/idf_helper.py +0 -0
  106. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw.egg-info/SOURCES.txt +0 -0
  107. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw.egg-info/dependency_links.txt +0 -0
  108. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw.egg-info/requires.txt +0 -0
  109. {ddi_fw-0.0.180 → ddi_fw-0.0.182}/src/ddi_fw.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ddi_fw
3
- Version: 0.0.180
3
+ Version: 0.0.182
4
4
  Summary: Do not use :)
5
5
  Author-email: Kıvanç Bayraktar <bayraktarkivanc@gmail.com>
6
6
  Maintainer-email: Kıvanç Bayraktar <bayraktarkivanc@gmail.com>
@@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
6
6
 
7
7
  [project]
8
8
  name = "ddi_fw"
9
- version = "0.0.180"
9
+ version = "0.0.182"
10
10
  description = "Do not use :)"
11
11
  readme = "README.md"
12
12
  authors = [
@@ -19,6 +19,48 @@ from ddi_fw.ml.evaluation_helper import Metrics, evaluate
19
19
  import ddi_fw.utils as utils
20
20
  import os
21
21
 
22
+ def convert_to_categorical(arr, num_classes):
23
+ """
24
+ This function takes an array of labels and converts them to one-hot encoding
25
+ if they are not binary-encoded. If the array is already in a
26
+ compatible format, it returns the original array.
27
+
28
+ Parameters:
29
+ - arr: numpy array with label data (could be binary-encoded or label-encoded)
30
+ - num_classes: number of classes to be used in one-hot encoding
31
+
32
+ Returns:
33
+ - The one-hot encoded array if the original array was binary or label encoded
34
+ - The original array if it doesn't require any conversion
35
+ """
36
+
37
+ try:
38
+ # First, check if the array is binary-encoded
39
+ if not utils.is_binary_encoded(arr):
40
+ # If the arr labels are binary-encoded, convert them to one-hot encoding
41
+ return tf.keras.utils.to_categorical(np.argmax(arr, axis=1), num_classes=num_classes)
42
+ else:
43
+ print("No conversion needed, returning original array.")
44
+ return arr
45
+ except Exception as e:
46
+ # If binary encoding check raises an error, print it and continue to label encoding check
47
+ print(f"Error while checking binary encoding: {e}")
48
+
49
+ try:
50
+ # Check if the array is label-encoded
51
+ if utils.is_label_encoded(arr):
52
+ # If the arr labels are label-encoded, convert them to one-hot encoding
53
+ return tf.keras.utils.to_categorical(arr, num_classes=num_classes)
54
+ except Exception as e:
55
+ # If label encoding check raises an error, print it
56
+ print(f"Error while checking label encoding: {e}")
57
+ # If the arr labels don't match any of the known encodings, raise an error
58
+ raise ValueError("Unknown label encoding format.")
59
+
60
+ # If no conversion was needed, return the original array
61
+
62
+ return arr
63
+
22
64
 
23
65
  class TFModelWrapper(ModelWrapper):
24
66
 
@@ -28,9 +70,10 @@ class TFModelWrapper(ModelWrapper):
28
70
  self.epochs = kwargs.get('epochs', 100)
29
71
  self.use_mlflow = use_mlflow
30
72
 
73
+ # TODO think different settings for num_classes
31
74
  def fit_model(self, X_train, y_train, X_valid, y_valid):
32
75
  self.kwargs['input_shape'] = self.train_data.shape
33
- self.num_classes = len(np.unique(y_train))
76
+ self.num_classes = len(np.unique(y_train, axis=0))
34
77
  model = self.model_func(**self.kwargs)
35
78
  checkpoint = ModelCheckpoint(
36
79
  filepath=f'{self.descriptor}_validation.weights.h5',
@@ -137,10 +180,10 @@ class TFModelWrapper(ModelWrapper):
137
180
  self.best_model: Model = best_model
138
181
  pred = self.predict()
139
182
  actual = self.test_label
140
- if not utils.is_binary_encoded(pred):
141
- pred = tf.keras.utils.to_categorical(np.argmax(pred,axis=1), num_classes=self.num_classes)
142
- if not utils.is_binary_encoded(actual):
143
- actual = tf.keras.utils.to_categorical(actual, num_classes=self.num_classes)
183
+ # if not utils.is_binary_encoded(pred):
184
+ # pred = tf.keras.utils.to_categorical(np.argmax(pred,axis=1), num_classes=self.num_classes)
185
+ pred= convert_to_categorical(pred, self.num_classes)
186
+ actual= convert_to_categorical(actual, self.num_classes)
144
187
 
145
188
  logs, metrics = evaluate(
146
189
  actual=actual, pred=pred, info=self.descriptor, print_detail=print_detail)
@@ -159,11 +202,12 @@ class TFModelWrapper(ModelWrapper):
159
202
  self.best_model = best_model
160
203
  pred = self.predict()
161
204
  actual = self.test_label
162
- if not utils.is_binary_encoded(pred):
163
- pred = tf.keras.utils.to_categorical(np.argmax(pred,axis=1), num_classes=self.num_classes)
164
- if not utils.is_binary_encoded(actual):
165
- actual = tf.keras.utils.to_categorical(actual, num_classes=self.num_classes)
166
-
205
+ # if not utils.is_binary_encoded(pred):
206
+ # pred = tf.keras.utils.to_categorical(np.argmax(pred,axis=1), num_classes=self.num_classes)
207
+ # if not utils.is_binary_encoded(actual):
208
+ # actual = tf.keras.utils.to_categorical(actual, num_classes=self.num_classes)
209
+ pred= convert_to_categorical(pred, self.num_classes)
210
+ actual= convert_to_categorical(actual, self.num_classes)
167
211
  logs, metrics = evaluate(
168
212
  actual=actual, pred=pred, info=self.descriptor)
169
213
  metrics.format_float()
@@ -4,4 +4,4 @@ from .py7zr_helper import Py7ZipHelper
4
4
  from .enums import UMLSCodeTypes, DrugBankTextDataTypes
5
5
  from .package_helper import get_import
6
6
  from .kaggle import create_kaggle_dataset
7
- from .categorical_data_encoding_checker import is_one_hot_encoded, is_binary_encoded, is_binary_vector
7
+ from .categorical_data_encoding_checker import is_one_hot_encoded, is_binary_encoded, is_binary_vector,is_label_encoded
@@ -30,3 +30,15 @@ def is_binary_vector(arr):
30
30
  if arr.ndim != 1:
31
31
  raise ValueError("Input must be a 1D array.")
32
32
  return arr.ndim == 1 and np.all(np.isin(arr, [0, 1]))
33
+
34
+
35
+ def is_label_encoded(arr):
36
+ # Check if the array is label encoded
37
+ # Ensure the input is a numpy ndarray and is 1D
38
+ if not isinstance(arr, np.ndarray):
39
+ raise ValueError("Input must be a NumPy ndarray.")
40
+ if arr.ndim != 1:
41
+ raise ValueError("Input must be a 1D array.")
42
+
43
+ # Check if all values are non-negative integers (possible class labels)
44
+ return np.issubdtype(arr.dtype, np.integer) and np.all(arr >= 0)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ddi_fw
3
- Version: 0.0.180
3
+ Version: 0.0.182
4
4
  Summary: Do not use :)
5
5
  Author-email: Kıvanç Bayraktar <bayraktarkivanc@gmail.com>
6
6
  Maintainer-email: Kıvanç Bayraktar <bayraktarkivanc@gmail.com>
File without changes
File without changes
File without changes