sxs 2025.0.9__tar.gz → 2025.0.10__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 (133) hide show
  1. {sxs-2025.0.9 → sxs-2025.0.10}/CITATION.cff +2 -2
  2. {sxs-2025.0.9 → sxs-2025.0.10}/PKG-INFO +1 -1
  3. sxs-2025.0.10/sxs/__version__.py +1 -0
  4. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/simulations/simulation.py +50 -20
  5. {sxs-2025.0.9 → sxs-2025.0.10}/tests/test_simulation.py +18 -0
  6. sxs-2025.0.9/sxs/__version__.py +0 -1
  7. {sxs-2025.0.9 → sxs-2025.0.10}/.codecov.yml +0 -0
  8. {sxs-2025.0.9 → sxs-2025.0.10}/.github/dependabot.yml +0 -0
  9. {sxs-2025.0.9 → sxs-2025.0.10}/.github/scripts/parse_bump_rule.py +0 -0
  10. {sxs-2025.0.9 → sxs-2025.0.10}/.github/workflows/build.yml +0 -0
  11. {sxs-2025.0.9 → sxs-2025.0.10}/.github/workflows/pr_rtd_link.yml +0 -0
  12. {sxs-2025.0.9 → sxs-2025.0.10}/.gitignore +0 -0
  13. {sxs-2025.0.9 → sxs-2025.0.10}/.readthedocs.yaml +0 -0
  14. {sxs-2025.0.9 → sxs-2025.0.10}/LICENSE +0 -0
  15. {sxs-2025.0.9 → sxs-2025.0.10}/README.md +0 -0
  16. {sxs-2025.0.9 → sxs-2025.0.10}/docs/api/catalog.md +0 -0
  17. {sxs-2025.0.9 → sxs-2025.0.10}/docs/api/horizons.md +0 -0
  18. {sxs-2025.0.9 → sxs-2025.0.10}/docs/api/load.md +0 -0
  19. {sxs-2025.0.9 → sxs-2025.0.10}/docs/api/metadata.md +0 -0
  20. {sxs-2025.0.9 → sxs-2025.0.10}/docs/api/simulation.md +0 -0
  21. {sxs-2025.0.9 → sxs-2025.0.10}/docs/api/simulations.md +0 -0
  22. {sxs-2025.0.9 → sxs-2025.0.10}/docs/api/time_series.md +0 -0
  23. {sxs-2025.0.9 → sxs-2025.0.10}/docs/api/waveforms.md +0 -0
  24. {sxs-2025.0.9 → sxs-2025.0.10}/docs/html/main.html +0 -0
  25. {sxs-2025.0.9 → sxs-2025.0.10}/docs/images/favicon.ico +0 -0
  26. {sxs-2025.0.9 → sxs-2025.0.10}/docs/index.md +0 -0
  27. {sxs-2025.0.9 → sxs-2025.0.10}/docs/javascript/mathjax.js +0 -0
  28. {sxs-2025.0.9 → sxs-2025.0.10}/docs/julia.md +0 -0
  29. {sxs-2025.0.9 → sxs-2025.0.10}/docs/mathematica.md +0 -0
  30. {sxs-2025.0.9 → sxs-2025.0.10}/docs/stylesheets/extra.css +0 -0
  31. {sxs-2025.0.9 → sxs-2025.0.10}/docs/tutorials/00-Introduction.ipynb +0 -0
  32. {sxs-2025.0.9 → sxs-2025.0.10}/docs/tutorials/01-Simulations_and_Metadata.ipynb +0 -0
  33. {sxs-2025.0.9 → sxs-2025.0.10}/docs/tutorials/02-Simulation.ipynb +0 -0
  34. {sxs-2025.0.9 → sxs-2025.0.10}/docs/tutorials/03-Horizons.ipynb +0 -0
  35. {sxs-2025.0.9 → sxs-2025.0.10}/docs/tutorials/04-Waveforms.ipynb +0 -0
  36. {sxs-2025.0.9 → sxs-2025.0.10}/docs/tutorials/05-PreprocessingForFFTs.ipynb +0 -0
  37. {sxs-2025.0.9 → sxs-2025.0.10}/mkdocs.yml +0 -0
  38. {sxs-2025.0.9 → sxs-2025.0.10}/pyproject.toml +0 -0
  39. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/__init__.py +0 -0
  40. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/catalog/__init__.py +0 -0
  41. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/catalog/catalog.py +0 -0
  42. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/catalog/create.py +0 -0
  43. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/catalog/description.py +0 -0
  44. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/handlers.py +0 -0
  45. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/horizons/__init__.py +0 -0
  46. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/horizons/spec_horizons_h5.py +0 -0
  47. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/horizons/xor_multishuffle_bzip2.py +0 -0
  48. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/julia/GWFrames.py +0 -0
  49. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/julia/__init__.py +0 -0
  50. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/juliapkg.json +0 -0
  51. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/metadata/__init__.py +0 -0
  52. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/metadata/metadata.py +0 -0
  53. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/metadata/metric.py +0 -0
  54. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/simulations/__init__.py +0 -0
  55. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/simulations/analyze.py +0 -0
  56. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/simulations/local.py +0 -0
  57. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/simulations/simulations.py +0 -0
  58. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/time_series.py +0 -0
  59. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/utilities/__init__.py +0 -0
  60. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/utilities/bitwise.py +0 -0
  61. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/utilities/decimation/__init__.py +0 -0
  62. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/utilities/decimation/greedy_spline.py +0 -0
  63. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/utilities/decimation/linear_bisection.py +0 -0
  64. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/utilities/decimation/peak_greed.py +0 -0
  65. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/utilities/decimation/suppression.py +0 -0
  66. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/utilities/dicts.py +0 -0
  67. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/utilities/downloads.py +0 -0
  68. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/utilities/files.py +0 -0
  69. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/utilities/formats.py +0 -0
  70. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/utilities/inspire.py +0 -0
  71. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/utilities/lvcnr/__init__.py +0 -0
  72. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/utilities/lvcnr/comparisons.py +0 -0
  73. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/utilities/lvcnr/conversion.py +0 -0
  74. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/utilities/lvcnr/dataset.py +0 -0
  75. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/utilities/lvcnr/horizons.py +0 -0
  76. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/utilities/lvcnr/metadata.py +0 -0
  77. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/utilities/lvcnr/waveform_amp_phase.py +0 -0
  78. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/utilities/lvcnr/waveforms.py +0 -0
  79. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/utilities/monotonicity.py +0 -0
  80. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/utilities/pretty_print.py +0 -0
  81. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/utilities/references/__init__.py +0 -0
  82. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/utilities/references/ads.py +0 -0
  83. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/utilities/references/arxiv.py +0 -0
  84. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/utilities/references/fairchild_report.py +0 -0
  85. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/utilities/references/inspire.py +0 -0
  86. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/utilities/references/journal_abbreviations.py +0 -0
  87. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/utilities/references/references.py +0 -0
  88. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/utilities/select.py +0 -0
  89. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/utilities/smooth_functions.py +0 -0
  90. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/utilities/string_converters.py +0 -0
  91. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/utilities/sxs_directories.py +0 -0
  92. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/utilities/sxs_identifiers.py +0 -0
  93. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/utilities/url.py +0 -0
  94. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/waveforms/__init__.py +0 -0
  95. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/waveforms/alignment.py +0 -0
  96. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/waveforms/format_handlers/__init__.py +0 -0
  97. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/waveforms/format_handlers/grathena.py +0 -0
  98. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/waveforms/format_handlers/lvc.py +0 -0
  99. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/waveforms/format_handlers/nrar.py +0 -0
  100. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/waveforms/format_handlers/rotating_paired_diff_multishuffle_bzip2.py +0 -0
  101. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/waveforms/format_handlers/rotating_paired_xor_multishuffle_bzip2.py +0 -0
  102. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/waveforms/format_handlers/spectre_cce_v1.py +0 -0
  103. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/waveforms/memory.py +0 -0
  104. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/waveforms/mode_utilities.py +0 -0
  105. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/waveforms/norms.py +0 -0
  106. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/waveforms/transformations.py +0 -0
  107. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/waveforms/waveform_grid.py +0 -0
  108. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/waveforms/waveform_mixin.py +0 -0
  109. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/waveforms/waveform_modes.py +0 -0
  110. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/waveforms/waveform_mts.py +0 -0
  111. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/waveforms/waveform_signal.py +0 -0
  112. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/zenodo/__init__.py +0 -0
  113. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/zenodo/api/__init__.py +0 -0
  114. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/zenodo/api/deposit.py +0 -0
  115. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/zenodo/api/login.py +0 -0
  116. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/zenodo/api/records.py +0 -0
  117. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/zenodo/catalog.py +0 -0
  118. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/zenodo/creators.py +0 -0
  119. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/zenodo/simannex.py +0 -0
  120. {sxs-2025.0.9 → sxs-2025.0.10}/sxs/zenodo/surrogatemodeling.py +0 -0
  121. {sxs-2025.0.9 → sxs-2025.0.10}/tests/__init__.py +0 -0
  122. {sxs-2025.0.9 → sxs-2025.0.10}/tests/conftest.py +0 -0
  123. {sxs-2025.0.9 → sxs-2025.0.10}/tests/test_alignment.py +0 -0
  124. {sxs-2025.0.9 → sxs-2025.0.10}/tests/test_catalog.py +0 -0
  125. {sxs-2025.0.9 → sxs-2025.0.10}/tests/test_horizons.py +0 -0
  126. {sxs-2025.0.9 → sxs-2025.0.10}/tests/test_julia.py +0 -0
  127. {sxs-2025.0.9 → sxs-2025.0.10}/tests/test_loader.py +0 -0
  128. {sxs-2025.0.9 → sxs-2025.0.10}/tests/test_metadata.py +0 -0
  129. {sxs-2025.0.9 → sxs-2025.0.10}/tests/test_time_series.py +0 -0
  130. {sxs-2025.0.9 → sxs-2025.0.10}/tests/test_transformations.py +0 -0
  131. {sxs-2025.0.9 → sxs-2025.0.10}/tests/test_utilities.py +0 -0
  132. {sxs-2025.0.9 → sxs-2025.0.10}/tests/test_waveform_rotations.py +0 -0
  133. {sxs-2025.0.9 → sxs-2025.0.10}/tests/test_waveforms.py +0 -0
@@ -10,5 +10,5 @@ authors:
10
10
  title: "The sxs package"
11
11
  license: MIT
12
12
  doi: 10.5281/zenodo.4034006
13
- version: 2025.0.9
14
- date-released: 2025-04-16
13
+ version: 2025.0.10
14
+ date-released: 2025-04-28
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sxs
3
- Version: 2025.0.9
3
+ Version: 2025.0.10
4
4
  Summary: Interface to data produced by the Simulating eXtreme Spacetimes collaboration
5
5
  Project-URL: Homepage, https://github.com/sxs-collaboration/sxs
6
6
  Project-URL: Documentation, https://sxs.readthedocs.io/
@@ -0,0 +1 @@
1
+ __version__ = "2025.0.10"
@@ -7,7 +7,7 @@ from ..utilities import (
7
7
  )
8
8
 
9
9
 
10
- def search_prefixes(file, lev, files, ending=""):
10
+ def search_prefixes(file, sxs_id_stem, lev, files, ending=""):
11
11
  """Find the actual filename present in the list of files
12
12
 
13
13
  Different versions of Zenodo and CaltechDATA place different
@@ -20,16 +20,18 @@ def search_prefixes(file, lev, files, ending=""):
20
20
  there is just one Lev in a simulation, and we try to save the
21
21
  files in a consistent way — including the Lev with the appropriate
22
22
  separator, different versions of Zenodo and CaltechDATA will
23
- either allow or silently remove that prefix. The simplest
23
+ either allow or silently remove that prefix. On top of all that,
24
+ early uploads also got the SXS ID as a prefix. The simplest
24
25
  approach is to just search over all possibilities, for which
25
26
  filename is actually present in the data. That's what this
26
27
  function does.
27
28
 
28
29
  """
29
- for prefix in [f"{lev}:", f"{lev}/", ""]:
30
- fn = f"{prefix}{file}"
31
- if f"{fn}{ending}" in files:
32
- return fn
30
+ for directory in ["", f"{sxs_id_stem}/", f"{sxs_id_stem}:"]:
31
+ for prefix in [f"{lev}:", f"{lev}/", ""]:
32
+ fn = f"{directory}{prefix}{file}"
33
+ if f"{fn}{ending}" in files:
34
+ return fn
33
35
  raise ValueError(f"{file}{ending} not found in any form in files")
34
36
 
35
37
 
@@ -502,11 +504,12 @@ class SimulationBase:
502
504
 
503
505
  @property
504
506
  def metadata_path(self):
505
- for separator in [":", "/"]:
506
- for ending in [".json", ".txt"]:
507
- for prefix in ["", f"{self.lev}{separator}" if self.lev else ""]:
508
- if (fn := f"{prefix}metadata{ending}") in self.files:
509
- return fn
507
+ for beginning in ["", f"{self.sxs_id_stem}/", f"{self.sxs_id_stem}:"]:
508
+ for separator in [":", "/"]:
509
+ for ending in [".json", ".txt"]:
510
+ for prefix in ["", f"{self.lev}{separator}" if self.lev else ""]:
511
+ if (fn := f"{beginning}{prefix}metadata{ending}") in self.files:
512
+ return fn
510
513
  raise ValueError(
511
514
  f"Metadata file not found in simulation files for {self.location}"
512
515
  )
@@ -800,7 +803,10 @@ class Simulation_v1(SimulationBase):
800
803
 
801
804
  @property
802
805
  def horizons_path(self):
803
- return search_prefixes("Horizons.h5", self.lev, self.files)
806
+ return search_prefixes(
807
+ "Horizons.h5",
808
+ self.sxs_id_stem, self.lev, self.files
809
+ )
804
810
 
805
811
  @property
806
812
  def strain_path(self):
@@ -810,7 +816,10 @@ class Simulation_v1(SimulationBase):
810
816
  else "OutermostExtraction.dir"
811
817
  )
812
818
  return (
813
- search_prefixes("rhOverM_Asymptotic_GeometricUnits_CoM.h5", self.lev, self.files),
819
+ search_prefixes(
820
+ "rhOverM_Asymptotic_GeometricUnits_CoM.h5",
821
+ self.sxs_id_stem, self.lev, self.files
822
+ ),
814
823
  extrapolation
815
824
  )
816
825
 
@@ -822,7 +831,10 @@ class Simulation_v1(SimulationBase):
822
831
  else "OutermostExtraction.dir"
823
832
  )
824
833
  return (
825
- search_prefixes("rMPsi4_Asymptotic_GeometricUnits_CoM.h5", self.lev, self.files),
834
+ search_prefixes(
835
+ "rMPsi4_Asymptotic_GeometricUnits_CoM.h5",
836
+ self.sxs_id_stem, self.lev, self.files
837
+ ),
826
838
  extrapolation
827
839
  )
828
840
 
@@ -869,12 +881,18 @@ class Simulation_v2(SimulationBase):
869
881
 
870
882
  @property
871
883
  def horizons_path(self):
872
- return search_prefixes("Horizons.h5", self.lev, self.files)
884
+ return search_prefixes(
885
+ "Horizons.h5",
886
+ self.sxs_id_stem, self.lev, self.files
887
+ )
873
888
 
874
889
  @property
875
890
  def strain_path(self):
876
891
  return (
877
- search_prefixes(f"Strain_{self.extrapolation}", self.lev, self.files, ".h5"),
892
+ search_prefixes(
893
+ f"Strain_{self.extrapolation}",
894
+ self.sxs_id_stem, self.lev, self.files, ".h5"
895
+ ),
878
896
  "/"
879
897
  )
880
898
 
@@ -887,7 +905,10 @@ class Simulation_v2(SimulationBase):
887
905
  )
888
906
  prefix = f"{self.lev}:" if len(self.lev_numbers)>1 else ""
889
907
  return (
890
- search_prefixes(f"ExtraWaveforms", self.lev, self.files, ".h5"),
908
+ search_prefixes(
909
+ f"ExtraWaveforms",
910
+ self.sxs_id_stem, self.lev, self.files, ".h5"
911
+ ),
891
912
  f"/rMPsi4_Asymptotic_GeometricUnits_CoM_Mem/{extrapolation}"
892
913
  )
893
914
 
@@ -925,17 +946,26 @@ class Simulation_v3(Simulation_v2):
925
946
  @property
926
947
  def strain_path(self):
927
948
  return (
928
- search_prefixes(f"Strain_{self.extrapolation}", self.lev, self.files, ".h5"),
949
+ search_prefixes(
950
+ f"Strain_{self.extrapolation}",
951
+ self.sxs_id_stem, self.lev, self.files, ".h5"
952
+ ),
929
953
  "/"
930
954
  ) if self.extrapolation == self.default_extrapolation else (
931
- search_prefixes("ExtraWaveforms", self.lev, self.files, ".h5"),
955
+ search_prefixes(
956
+ "ExtraWaveforms",
957
+ self.sxs_id_stem, self.lev, self.files, ".h5"
958
+ ),
932
959
  f"/Strain_{self.extrapolation}.dir"
933
960
  )
934
961
 
935
962
  @property
936
963
  def psi4_path(self):
937
964
  return (
938
- search_prefixes("ExtraWaveforms", self.lev, self.files, ".h5"),
965
+ search_prefixes(
966
+ "ExtraWaveforms",
967
+ self.sxs_id_stem, self.lev, self.files, ".h5"
968
+ ),
939
969
  f"/Psi4_{self.extrapolation}.dir"
940
970
  )
941
971
 
@@ -119,6 +119,24 @@ def test_sxs_load_v3_levs():
119
119
  assert sm1.metadata != s0.metadata
120
120
 
121
121
 
122
+ @pytest.mark.many_downloads # runs only with pytest flag ` --run_many_downloads`
123
+ def test_sxs_load_all_doi_versions():
124
+ print()
125
+ for sxs_id in list(range(303, 324+1)) + list(range(4425, 4434+1)):
126
+ sxs_id = f"SXS:BBH:{sxs_id:04}"
127
+ print(f" Loading {sxs_id}")
128
+ sim = sxs.load(sxs_id, ignore_deprecation=True)
129
+ for doi_version in sim.metadata["DOI_versions"]:
130
+ if not doi_version: # Skip the default version, which was loaded above
131
+ continue
132
+ # This line will actually load the metadata, which is already a strong test
133
+ sim = sxs.load(f"{sxs_id}{doi_version}", ignore_deprecation=True)
134
+ assert sim.metadata_path
135
+ assert sim.horizons_path
136
+ assert sim.strain_path
137
+ assert sim.psi4_path
138
+
139
+
122
140
  @pytest.mark.many_downloads # runs only with pytest flag ` --run_many_downloads`
123
141
  def test_sxs_load_v3_catalog():
124
142
  # This test goes right up to the point of loading every simulation
@@ -1 +0,0 @@
1
- __version__ = "2025.0.9"
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