britekit 0.1.0__tar.gz → 0.1.2__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.
Potentially problematic release.
This version of britekit might be problematic. Click here for more details.
- {britekit-0.1.0 → britekit-0.1.2}/PKG-INFO +1 -1
- {britekit-0.1.0 → britekit-0.1.2}/britekit/__about__.py +1 -1
- {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_ensemble.py +44 -28
- {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_init.py +5 -2
- {britekit-0.1.0 → britekit-0.1.2}/.gitignore +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/LICENSE.txt +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/README.md +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/__init__.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/__init__.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_analyze.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_audioset.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_calibrate.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_ckpt_ops.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_db_add.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_db_delete.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_embed.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_extract.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_find_dup.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_inat.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_pickle.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_plot.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_reextract.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_reports.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_search.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_train.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_tune.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_wav2mp3.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_xeno.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_youtube.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/core/__init__.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/audioset/class_inclusion.csv +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/audioset/class_list.csv +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/audioset/curated/aircraft.csv +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/audioset/curated/car.csv +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/audioset/curated/chainsaw.csv +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/audioset/curated/cow.csv +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/audioset/curated/cricket.csv +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/audioset/curated/dog.csv +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/audioset/curated/rain.csv +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/audioset/curated/rooster.csv +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/audioset/curated/sheep.csv +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/audioset/curated/siren.csv +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/audioset/curated/speech.csv +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/audioset/curated/truck.csv +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/audioset/curated/wind.csv +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/audioset/unbalanced_train_segments.csv +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/classes.csv +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/ignore.txt +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/install/yaml/base_config.yaml +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/install/yaml/samples/cfg_infer.yaml +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/install/yaml/samples/train_dla.yaml +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/install/yaml/samples/train_effnet.yaml +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/install/yaml/samples/train_gernet.yaml +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/install/yaml/samples/train_hgnet.yaml +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/install/yaml/samples/train_timm.yaml +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/install/yaml/samples/train_vovnet.yaml +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/install/yaml/samples/tune_dropout.yaml +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/install/yaml/samples/tune_learning_rate.yaml +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/install/yaml/samples/tune_optimizer.yaml +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/britekit/install/yaml/samples/tune_smooth.yaml +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/install/data/audioset/class_inclusion.csv +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/install/data/audioset/class_list.csv +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/install/data/audioset/curated/aircraft.csv +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/install/data/audioset/curated/car.csv +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/install/data/audioset/curated/chainsaw.csv +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/install/data/audioset/curated/cow.csv +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/install/data/audioset/curated/cricket.csv +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/install/data/audioset/curated/dog.csv +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/install/data/audioset/curated/rain.csv +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/install/data/audioset/curated/rooster.csv +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/install/data/audioset/curated/sheep.csv +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/install/data/audioset/curated/siren.csv +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/install/data/audioset/curated/speech.csv +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/install/data/audioset/curated/truck.csv +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/install/data/audioset/curated/wind.csv +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/install/data/audioset/unbalanced_train_segments.csv +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/install/data/classes.csv +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/install/data/ignore.txt +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/install/yaml/base_config.yaml +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/install/yaml/samples/cfg_infer.yaml +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/install/yaml/samples/train_dla.yaml +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/install/yaml/samples/train_effnet.yaml +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/install/yaml/samples/train_gernet.yaml +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/install/yaml/samples/train_hgnet.yaml +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/install/yaml/samples/train_timm.yaml +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/install/yaml/samples/train_vovnet.yaml +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/install/yaml/samples/tune_dropout.yaml +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/install/yaml/samples/tune_learning_rate.yaml +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/install/yaml/samples/tune_optimizer.yaml +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/install/yaml/samples/tune_smooth.yaml +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/pyproject.toml +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/src/britekit/cli.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/src/britekit/core/analyzer.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/src/britekit/core/audio.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/src/britekit/core/augmentation.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/src/britekit/core/base_config.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/src/britekit/core/config_loader.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/src/britekit/core/data_module.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/src/britekit/core/dataset.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/src/britekit/core/exceptions.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/src/britekit/core/pickler.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/src/britekit/core/plot.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/src/britekit/core/predictor.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/src/britekit/core/reextractor.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/src/britekit/core/trainer.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/src/britekit/core/tuner.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/src/britekit/core/util.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/src/britekit/models/base_model.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/src/britekit/models/dla.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/src/britekit/models/effnet.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/src/britekit/models/gernet.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/src/britekit/models/head_factory.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/src/britekit/models/hgnet.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/src/britekit/models/model_loader.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/src/britekit/models/timm_model.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/src/britekit/models/vovnet.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/src/britekit/occurrence_db/occurrence_data_provider.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/src/britekit/occurrence_db/occurrence_db.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/src/britekit/testing/base_tester.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/src/britekit/testing/per_minute_tester.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/src/britekit/testing/per_recording_tester.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/src/britekit/testing/per_segment_tester.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/src/britekit/training_db/extractor.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/src/britekit/training_db/training_data_provider.py +0 -0
- {britekit-0.1.0 → britekit-0.1.2}/src/britekit/training_db/training_db.py +0 -0
|
@@ -11,34 +11,24 @@ import click
|
|
|
11
11
|
from britekit.core.config_loader import get_config
|
|
12
12
|
from britekit.core import util
|
|
13
13
|
|
|
14
|
-
def _eval_ensemble(ensemble,
|
|
15
|
-
import
|
|
16
|
-
|
|
17
|
-
from britekit.core.analyzer import Analyzer
|
|
14
|
+
def _eval_ensemble(ensemble, dataframe_dict, annotations_path, recordings_path, inference_output_dir):
|
|
15
|
+
import pandas as pd
|
|
18
16
|
from britekit.testing.per_segment_tester import PerSegmentTester
|
|
19
17
|
|
|
20
|
-
#
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
os.remove(file_path)
|
|
24
|
-
|
|
25
|
-
# copy checkpoints to the temp dir
|
|
26
|
-
for file_path in ensemble:
|
|
27
|
-
file_name = Path(file_path).name
|
|
28
|
-
dest_path = os.path.join(temp_dir, file_name)
|
|
29
|
-
shutil.copyfile(file_path, dest_path)
|
|
18
|
+
# create a dataframe with the average scores for the ensemble
|
|
19
|
+
avg_df: pd.DataFrame = dataframe_dict[ensemble[0]].copy()
|
|
20
|
+
avg_df["score"] = sum(dataframe_dict[ckpt_path]["score"] for ckpt_path in ensemble) / len(ensemble)
|
|
30
21
|
|
|
31
|
-
#
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
inference_output_dir = str(Path(recording_dir) / label_dir)
|
|
35
|
-
Analyzer().run(recording_dir, inference_output_dir)
|
|
22
|
+
# save the dataframe to the usual inference output location
|
|
23
|
+
scores_csv_path = str(Path(inference_output_dir) / 'scores.csv')
|
|
24
|
+
avg_df.to_csv(scores_csv_path, index=False)
|
|
36
25
|
|
|
37
|
-
min_score = 0.8 # irrelevant really
|
|
38
26
|
with tempfile.TemporaryDirectory() as output_dir:
|
|
27
|
+
util.set_logging(level=logging.ERROR) # suppress logging during test reporting
|
|
28
|
+
min_score = 0.8 # arbitrary threshold
|
|
39
29
|
tester = PerSegmentTester(
|
|
40
30
|
annotations_path,
|
|
41
|
-
|
|
31
|
+
recordings_path,
|
|
42
32
|
inference_output_dir,
|
|
43
33
|
output_dir,
|
|
44
34
|
min_score,
|
|
@@ -47,6 +37,7 @@ def _eval_ensemble(ensemble, temp_dir, annotations_path, recording_dir):
|
|
|
47
37
|
|
|
48
38
|
pr_stats = tester.get_pr_auc_stats()
|
|
49
39
|
roc_stats = tester.get_roc_auc_stats()
|
|
40
|
+
util.set_logging() # restore logging
|
|
50
41
|
|
|
51
42
|
scores = {
|
|
52
43
|
"macro_pr": pr_stats["macro_pr_auc"],
|
|
@@ -55,11 +46,9 @@ def _eval_ensemble(ensemble, temp_dir, annotations_path, recording_dir):
|
|
|
55
46
|
"micro_roc": roc_stats["micro_roc_auc_trained"]
|
|
56
47
|
}
|
|
57
48
|
|
|
58
|
-
shutil.rmtree(inference_output_dir)
|
|
59
|
-
util.set_logging() # restore logging
|
|
60
|
-
|
|
61
49
|
return scores
|
|
62
50
|
|
|
51
|
+
|
|
63
52
|
def ensemble(
|
|
64
53
|
cfg_path: Optional[str]=None,
|
|
65
54
|
ckpt_path: str="",
|
|
@@ -87,7 +76,13 @@ def ensemble(
|
|
|
87
76
|
import glob
|
|
88
77
|
import itertools
|
|
89
78
|
import math
|
|
79
|
+
import os
|
|
90
80
|
import random
|
|
81
|
+
import shutil
|
|
82
|
+
|
|
83
|
+
import pandas as pd
|
|
84
|
+
|
|
85
|
+
from britekit.core.analyzer import Analyzer
|
|
91
86
|
|
|
92
87
|
if metric not in ["macro_pr", "micro_pr", "macro_roc", "micro_roc"]:
|
|
93
88
|
logging.error(f"Error: invalid metric ({metric})")
|
|
@@ -106,10 +101,29 @@ def ensemble(
|
|
|
106
101
|
if not recordings_path:
|
|
107
102
|
recordings_path = str(Path(annotations_path).parent)
|
|
108
103
|
|
|
109
|
-
with tempfile.TemporaryDirectory() as
|
|
110
|
-
cfg.misc.ckpt_folder =
|
|
104
|
+
with tempfile.TemporaryDirectory() as ensemble_dir:
|
|
105
|
+
cfg.misc.ckpt_folder = ensemble_dir
|
|
111
106
|
cfg.infer.min_score = 0
|
|
112
107
|
|
|
108
|
+
# get a dataframe of predictions per checkpoint
|
|
109
|
+
label_dir = "ensemble_evaluation_labels"
|
|
110
|
+
inference_output_dir = str(Path(recordings_path) / label_dir)
|
|
111
|
+
scores_csv_path = str(Path(inference_output_dir) / 'scores.csv')
|
|
112
|
+
dataframe_dict = {}
|
|
113
|
+
for ckpt_path in ckpt_paths:
|
|
114
|
+
ckpt_name = Path(ckpt_path).name
|
|
115
|
+
logging.info(f"Running inference with {ckpt_name}")
|
|
116
|
+
dest_path = str(Path(ensemble_dir) / ckpt_name)
|
|
117
|
+
shutil.copyfile(ckpt_path, dest_path)
|
|
118
|
+
|
|
119
|
+
util.set_logging(level=logging.ERROR) # suppress logging during inference
|
|
120
|
+
Analyzer().run(recordings_path, inference_output_dir, rtype='csv')
|
|
121
|
+
util.set_logging()
|
|
122
|
+
|
|
123
|
+
df = pd.read_csv(scores_csv_path)
|
|
124
|
+
dataframe_dict[ckpt_path] = df
|
|
125
|
+
os.remove(dest_path)
|
|
126
|
+
|
|
113
127
|
best_score = 0
|
|
114
128
|
best_ensemble = None
|
|
115
129
|
count = 1
|
|
@@ -118,7 +132,7 @@ def ensemble(
|
|
|
118
132
|
# Exhaustive search
|
|
119
133
|
logging.info("Doing exhaustive search")
|
|
120
134
|
for ensemble in itertools.combinations(ckpt_paths, ensemble_size):
|
|
121
|
-
scores = _eval_ensemble(ensemble,
|
|
135
|
+
scores = _eval_ensemble(ensemble, dataframe_dict, annotations_path, recordings_path, inference_output_dir)
|
|
122
136
|
logging.info(f"For ensemble {count} of {total_combinations}, score = {scores[metric]:.4f}")
|
|
123
137
|
if scores[metric] > best_score:
|
|
124
138
|
best_score = scores[metric]
|
|
@@ -133,7 +147,7 @@ def ensemble(
|
|
|
133
147
|
ensemble = tuple(sorted(random.sample(ckpt_paths, ensemble_size)))
|
|
134
148
|
if ensemble not in seen:
|
|
135
149
|
seen.add(ensemble)
|
|
136
|
-
scores = _eval_ensemble(ensemble,
|
|
150
|
+
scores = _eval_ensemble(ensemble, dataframe_dict, annotations_path, recordings_path, inference_output_dir)
|
|
137
151
|
logging.info(f"For ensemble {count} of {num_tries}, score = {scores[metric]:.4f}")
|
|
138
152
|
if scores[metric] > best_score:
|
|
139
153
|
best_score = scores[metric]
|
|
@@ -141,6 +155,8 @@ def ensemble(
|
|
|
141
155
|
|
|
142
156
|
count += 1
|
|
143
157
|
|
|
158
|
+
shutil.rmtree(inference_output_dir)
|
|
159
|
+
|
|
144
160
|
logging.info(f"Best score = {best_score:.4f}")
|
|
145
161
|
|
|
146
162
|
assert best_ensemble is not None
|
|
@@ -3,7 +3,7 @@ import logging
|
|
|
3
3
|
from pathlib import Path
|
|
4
4
|
from importlib.resources import files as pkg_files
|
|
5
5
|
from importlib.abc import Traversable
|
|
6
|
-
from typing import Iterator, Tuple, List, cast
|
|
6
|
+
from typing import Iterator, Optional, Tuple, List, cast
|
|
7
7
|
|
|
8
8
|
import click
|
|
9
9
|
|
|
@@ -23,7 +23,7 @@ def _iter_traversable_files(
|
|
|
23
23
|
yield (prefix + (child.name,)), child
|
|
24
24
|
|
|
25
25
|
|
|
26
|
-
def init(dest: Path) -> None:
|
|
26
|
+
def init(dest: Optional[Path]=None) -> None:
|
|
27
27
|
"""
|
|
28
28
|
Setup default BriteKit directory structure and copy packaged sample files.
|
|
29
29
|
|
|
@@ -55,6 +55,9 @@ def init(dest: Path) -> None:
|
|
|
55
55
|
files.append((rel_posix, trav_file))
|
|
56
56
|
|
|
57
57
|
# Copy
|
|
58
|
+
if dest is None:
|
|
59
|
+
dest = Path('.')
|
|
60
|
+
|
|
58
61
|
dest.mkdir(parents=True, exist_ok=True)
|
|
59
62
|
copied = 0
|
|
60
63
|
skipped = 0
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/audioset/unbalanced_train_segments.csv
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|