httomo-backends 0.6__py3-none-any.whl → 0.6.1__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.
@@ -7,7 +7,7 @@ misc:
7
7
  save_result_default: False
8
8
  padding: True
9
9
  memory_gpu:
10
- multiplier: 2.1
10
+ multiplier: 2.5
11
11
  method: direct
12
12
  remove_outlier:
13
13
  pattern: all
@@ -16,7 +16,7 @@ misc:
16
16
  save_result_default: False
17
17
  padding: True
18
18
  memory_gpu:
19
- multiplier: 2.1
19
+ multiplier: 2.5
20
20
  method: direct
21
21
  denoise:
22
22
  total_variation_ROF:
@@ -87,15 +87,6 @@ prep:
87
87
  memory_gpu:
88
88
  multiplier: None
89
89
  method: module
90
- paganin_filter_savu:
91
- pattern: projection
92
- output_dims_change: False
93
- implementation: gpu_cupy
94
- save_result_default: False
95
- padding: False
96
- memory_gpu:
97
- multiplier: None
98
- method: module
99
90
  alignment:
100
91
  distortion_correction_proj_discorpy:
101
92
  pattern: projection
@@ -207,7 +198,7 @@ recon:
207
198
  save_result_default: False
208
199
  padding: False
209
200
  memory_gpu:
210
- multiplier: 0
201
+ multiplier: 2
211
202
  method: direct
212
203
  find_center_pc:
213
204
  pattern: projection
@@ -27,70 +27,10 @@ import numpy as np
27
27
  from httomo_backends.cufft import CufftType, cufft_estimate_2d
28
28
 
29
29
  __all__ = [
30
- "_calc_memory_bytes_paganin_filter_savu",
31
30
  "_calc_memory_bytes_paganin_filter_tomopy",
32
31
  ]
33
32
 
34
33
 
35
- def _calc_memory_bytes_paganin_filter_savu(
36
- non_slice_dims_shape: Tuple[int, int],
37
- dtype: np.dtype,
38
- **kwargs,
39
- ) -> Tuple[int, int]:
40
- pad_x = kwargs["pad_x"]
41
- pad_y = kwargs["pad_y"]
42
-
43
- # Input (unpadded)
44
- unpadded_in_slice_size = np.prod(non_slice_dims_shape) * dtype.itemsize
45
-
46
- # Padded input
47
- padded_non_slice_dims_shape = (
48
- non_slice_dims_shape[0] + 2 * pad_y,
49
- non_slice_dims_shape[1] + 2 * pad_x,
50
- )
51
- padded_in_slice_size = (
52
- padded_non_slice_dims_shape[0] * padded_non_slice_dims_shape[1] * dtype.itemsize
53
- )
54
-
55
- # Padded input cast to `complex64`
56
- complex_slice = padded_in_slice_size / dtype.itemsize * np.complex64().nbytes
57
-
58
- # Plan size for 2D FFT
59
- fftplan_slice_size = cufft_estimate_2d(
60
- nx=padded_non_slice_dims_shape[1],
61
- ny=padded_non_slice_dims_shape[0],
62
- fft_type=CufftType.CUFFT_C2C,
63
- )
64
-
65
- # Shape of 2D filter is the same as the padded `complex64` slice shape, so the size will be
66
- # the same
67
- filter_size = complex_slice
68
-
69
- # Size of cropped/unpadded + cast to float32 result of 2D IFFT
70
- cropped_float32_res_slice = np.prod(non_slice_dims_shape) * np.float32().nbytes
71
-
72
- # If the FFT plan size is negligible for some reason, this changes where the peak GPU
73
- # memory usage occurs. Hence, the if/else branching below for calculating the total bytes.
74
- NEGLIGIBLE_FFT_PLAN_SIZE = 16
75
- if fftplan_slice_size < NEGLIGIBLE_FFT_PLAN_SIZE:
76
- tot_memory_bytes = int(
77
- unpadded_in_slice_size + padded_in_slice_size + complex_slice
78
- )
79
- else:
80
- tot_memory_bytes = int(
81
- unpadded_in_slice_size
82
- + padded_in_slice_size
83
- + complex_slice
84
- # The padded float32 array is deallocated when a copy is made when casting to complex64
85
- # and the variable `padded_tomo` is reassigned to the complex64 version
86
- - padded_in_slice_size
87
- + fftplan_slice_size
88
- + cropped_float32_res_slice
89
- )
90
-
91
- return (tot_memory_bytes, filter_size)
92
-
93
-
94
34
  def _calc_memory_bytes_paganin_filter_tomopy(
95
35
  non_slice_dims_shape: Tuple[int, int],
96
36
  dtype: np.dtype,
@@ -354,6 +354,7 @@ def _calc_memory_bytes_LPRec3d_tomobar(
354
354
 
355
355
  return (tot_memory_bytes * 1.05, fixed_amount + 250 * 1024 * 1024)
356
356
 
357
+
357
358
  def _calc_memory_bytes_SIRT3d_tomobar(
358
359
  non_slice_dims_shape: Tuple[int, int],
359
360
  dtype: np.dtype,
@@ -1,11 +1,11 @@
1
1
  - method: standard_tomo
2
2
  module_path: httomo.data.hdf.loaders
3
+ - method: find_center_360
4
+ module_path: httomolibgpu.recon.rotation
3
5
  - method: normalize
4
6
  module_path: httomolibgpu.prep.normalize
5
7
  - method: distortion_correction_proj_discorpy
6
8
  module_path: httomolibgpu.prep.alignment
7
- - method: find_center_360
8
- module_path: httomolibgpu.recon.rotation
9
9
  - method: sino_360_to_180
10
10
  module_path: httomolibgpu.misc.morph
11
11
  - method: remove_stripe_based_sorting
@@ -1,9 +1,9 @@
1
1
  - method: standard_tomo
2
2
  module_path: httomo.data.hdf.loaders
3
- - method: normalize
4
- module_path: httomolibgpu.prep.normalize
5
3
  - method: find_center_360
6
4
  module_path: httomolibgpu.recon.rotation
5
+ - method: normalize
6
+ module_path: httomolibgpu.prep.normalize
7
7
  - method: sino_360_to_180
8
8
  module_path: httomolibgpu.misc.morph
9
9
  - method: remove_stripe_based_sorting
@@ -0,0 +1,12 @@
1
+ - method: standard_tomo
2
+ module_path: httomo.data.hdf.loaders
3
+ - method: find_center_vo
4
+ module_path: httomolibgpu.recon.rotation
5
+ - method: normalize
6
+ module_path: httomolibgpu.prep.normalize
7
+ - method: paganin_filter_tomopy
8
+ module_path: httomolibgpu.prep.phase
9
+ sweep_parameter: alpha
10
+ sweep_values: [0.01, 0.001, 0.0001]
11
+ - method: FBP3d_tomobar
12
+ module_path: httomolibgpu.recon.algorithm
@@ -31,6 +31,8 @@ import ruamel.yaml
31
31
  import httomo_backends
32
32
  import yaml
33
33
 
34
+ from httomo import __version__ as httomo_version
35
+
34
36
  CS = ruamel.yaml.comments.CommentedSeq # defaults to block style
35
37
 
36
38
 
@@ -55,6 +57,20 @@ def __sweeprange_representer(
55
57
  )
56
58
 
57
59
 
60
+ class SweepManual:
61
+ """SweepManual class."""
62
+
63
+ def __init__(self, lst):
64
+ self._lst = lst
65
+
66
+
67
+ def __sweepmanual_representer(
68
+ dumper: yaml.SafeDumper, swp: SweepManual
69
+ ) -> yaml.nodes.SequenceNode:
70
+ """Represent a sweepmanual as a YAML sequence node."""
71
+ return dumper.represent_sequence("!Sweep", swp._lst)
72
+
73
+
58
74
  def __represent_none(self, data):
59
75
  return self.represent_scalar("tag:yaml.org,2002:null", "null")
60
76
 
@@ -86,17 +102,22 @@ def yaml_pipelines_generator(
86
102
  # a loop over methods in the high-level pipeline file (directive)
87
103
  methods_no = len(pipeline_file_content)
88
104
  pipeline_full = CS()
89
- sweep_enabled = False
105
+ sweep_enabled_range = False
106
+ sweep_enabled_value = False
90
107
  for i in range(methods_no):
91
108
  method_content = pipeline_file_content[i]
92
109
  method_name = method_content["method"]
93
110
  module_name = method_content["module_path"]
94
111
  if "sweep_parameter" in method_content:
95
112
  sweep_parameter = method_content["sweep_parameter"]
96
- sweep_start = method_content["sweep_start"]
97
- sweep_stop = method_content["sweep_stop"]
98
- sweep_step = method_content["sweep_step"]
99
- sweep_enabled = True
113
+ if "sweep_start" in method_content:
114
+ sweep_start = method_content["sweep_start"]
115
+ sweep_stop = method_content["sweep_stop"]
116
+ sweep_step = method_content["sweep_step"]
117
+ sweep_enabled_range = True
118
+ else:
119
+ sweep_values = method_content["sweep_values"]
120
+ sweep_enabled_value = True
100
121
 
101
122
  # get the corresponding yaml template from httomo-backends
102
123
  backend_name = module_name[0 : module_name.find(".")]
@@ -116,6 +137,13 @@ def yaml_pipelines_generator(
116
137
  except OSError as e:
117
138
  print("loading yaml template failed", e)
118
139
 
140
+ version_split = httomo_version.split(".")
141
+ major = version_split[0]
142
+ minor = version_split[1]
143
+ pipeline_full.yaml_set_start_comment(
144
+ f"This pipeline is supported by HTTomo ver. {major}.{minor}"
145
+ )
146
+
119
147
  if "loaders" in module_name:
120
148
  # should be the first method in the list
121
149
  pipeline_full.yaml_set_comment_before_after_key(
@@ -149,7 +177,7 @@ def yaml_pipelines_generator(
149
177
  )
150
178
  pipeline_full[i]["side_outputs"].yaml_add_eol_comment(
151
179
  key="cor",
152
- comment="A side output of the method, here a CoR scalar value",
180
+ comment="An estimated CoR value provided as a side output",
153
181
  )
154
182
  pipeline_full[i]["side_outputs"].yaml_add_eol_comment(
155
183
  key="overlap",
@@ -158,17 +186,22 @@ def yaml_pipelines_generator(
158
186
  elif "corr" in module_name and "remove_outlier" in method_name:
159
187
  pipeline_full.yaml_set_comment_before_after_key(
160
188
  i,
161
- "--- Removing dead pixels in the data, aka zingers. Use if sharp streaks are present in reconstruction. Please use before normalisation. ---",
189
+ "--- Removing unresponsive pixels in the data, aka zingers. Use if sharp streaks are present in the reconstruction. To be applied before normalisation. ---",
162
190
  indent=0,
163
191
  )
164
192
  pipeline_full += yaml_template_method
165
193
  if pipeline_full[i]["parameters"]["dif"] == "REQUIRED":
166
194
  # fix for the absent parameter in TomoPy's algorithm
167
195
  pipeline_full[i]["parameters"]["dif"] = 0.1
196
+ pipeline_full[i]["parameters"].yaml_add_eol_comment(
197
+ key="kernel_size",
198
+ comment="The size of the 3D neighbourhood surrounding the voxel. Odd integer.",
199
+ )
168
200
  pipeline_full[i]["parameters"].yaml_add_eol_comment(
169
201
  key="dif",
170
- comment="A difference between the outlier value and the median value of neighboring pixels.",
202
+ comment="A difference between the outlier value and the median value of neighbouring pixels.",
171
203
  )
204
+
172
205
  elif "distortion" in method_name:
173
206
  pipeline_full.yaml_set_comment_before_after_key(
174
207
  i,
@@ -225,7 +258,11 @@ def yaml_pipelines_generator(
225
258
  pipeline_full += yaml_template_method
226
259
  pipeline_full[i]["parameters"].yaml_add_eol_comment(
227
260
  key="center",
228
- comment="Reference to center of rotation side output OR an integer.",
261
+ comment="Reference to center of rotation side output above OR a float number.",
262
+ )
263
+ pipeline_full[i]["parameters"].yaml_add_eol_comment(
264
+ key="detector_pad",
265
+ comment="Horizontal detector padding to minimise circle/arc-type artifacts in the reconstruction",
229
266
  )
230
267
  pipeline_full[i]["parameters"].yaml_add_eol_comment(
231
268
  key="recon_mask_radius",
@@ -282,13 +319,20 @@ def yaml_pipelines_generator(
282
319
  )
283
320
  pipeline_full += yaml_template_method
284
321
 
285
- if sweep_enabled:
322
+ if sweep_enabled_range:
286
323
  pipeline_full[i]["parameters"][sweep_parameter] = SweepRange(
287
324
  start=sweep_start, stop=sweep_stop, step=sweep_step
288
325
  )
326
+ yaml.representer.add_representer(SweepRange, __sweeprange_representer)
327
+ sweep_enabled_range = False
328
+ if sweep_enabled_value:
329
+ pipeline_full[i]["parameters"][sweep_parameter] = SweepManual(
330
+ list(sweep_values)
331
+ )
332
+ yaml.representer.add_representer(SweepManual, __sweepmanual_representer)
333
+ sweep_enabled_value = False
289
334
 
290
335
  yaml.representer.add_representer(type(None), __represent_none)
291
- yaml.representer.add_representer(SweepRange, __sweeprange_representer)
292
336
  yaml.dump(pipeline_full, f)
293
337
 
294
338
  return 0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: httomo-backends
3
- Version: 0.6
3
+ Version: 0.6.1
4
4
  Summary: Supplementary files for HTTomo backends.
5
5
  Author: Garry ODonnell, Jacob Williamson
6
6
  Author-email: Daniil Kazantsev <daniil.kazantsev@diamond.ac.uk>, Yousef Moazzam <yousef.moazzam@diamond.ac.uk>, Jessica Verschoyle <jessica.verschoyle@diamond.ac.uk>, Naman Gera <naman.gera@diamond.ac.uk>, scientificsoftware@diamond.ac.uk
@@ -7,7 +7,7 @@ httomo_backends/methods_database/packages/httomo.yaml,sha256=tI3D-7IJcdu4EbKwjsj
7
7
  httomo_backends/methods_database/packages/backends/httomolib/httomolib.yaml,sha256=8l2Z6GGlXIIe2vcX85GK4wis5zxhgmg7EmlwLMV_rtI,938
8
8
  httomo_backends/methods_database/packages/backends/httomolib/httomolib_modules.yaml,sha256=tbvivxcAc90Wu36v1yFnGN-WqBIA1NHGWrg_D28UXi8,117
9
9
  httomo_backends/methods_database/packages/backends/httomolibgpu/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- httomo_backends/methods_database/packages/backends/httomolibgpu/httomolibgpu.yaml,sha256=mrN9qyOK2GG1mZi7jr7GOJm-Q96b7eaeLYB8ah_har4,5352
10
+ httomo_backends/methods_database/packages/backends/httomolibgpu/httomolibgpu.yaml,sha256=HXfQPfhYjlNbnfRaBdTf7zs71Chvfl8B93P0ZfJQN7U,5118
11
11
  httomo_backends/methods_database/packages/backends/httomolibgpu/httomolibgpu_modules.yaml,sha256=HZWQ74Ygi25hjNg7wR9muPDdmN8STtOMY-LXWaTfspc,282
12
12
  httomo_backends/methods_database/packages/backends/httomolibgpu/supporting_funcs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
13
  httomo_backends/methods_database/packages/backends/httomolibgpu/supporting_funcs/misc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -17,10 +17,10 @@ httomo_backends/methods_database/packages/backends/httomolibgpu/supporting_funcs
17
17
  httomo_backends/methods_database/packages/backends/httomolibgpu/supporting_funcs/misc/rescale.py,sha256=iFE8X-GR9zjuFLbBE_glQL8wMoXOjkzcaleflm8VVzA,574
18
18
  httomo_backends/methods_database/packages/backends/httomolibgpu/supporting_funcs/prep/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
19
  httomo_backends/methods_database/packages/backends/httomolibgpu/supporting_funcs/prep/normalize.py,sha256=Ekxyp3j5bpg2-4iZmXI49VEBFFYUV6rfYBEqGdaqV6M,645
20
- httomo_backends/methods_database/packages/backends/httomolibgpu/supporting_funcs/prep/phase.py,sha256=k3PGyn8jn2DH2NN2tu3U1xE0JFsJk0E_b-Jf_lL6h6E,6195
20
+ httomo_backends/methods_database/packages/backends/httomolibgpu/supporting_funcs/prep/phase.py,sha256=kYznizW0jMVJdGyuE10McVLsWWggUsP5bvJiHEVvSSM,4075
21
21
  httomo_backends/methods_database/packages/backends/httomolibgpu/supporting_funcs/prep/stripe.py,sha256=KnS8IpcXaLeiIWr4qAKwOrcK1vS9zrU6u5gOITZ159k,4623
22
22
  httomo_backends/methods_database/packages/backends/httomolibgpu/supporting_funcs/recon/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
- httomo_backends/methods_database/packages/backends/httomolibgpu/supporting_funcs/recon/algorithm.py,sha256=rMegPP3muruRe6ih3hNlcgSjxJ0FaNuccQHt4gtyBIo,14971
23
+ httomo_backends/methods_database/packages/backends/httomolibgpu/supporting_funcs/recon/algorithm.py,sha256=PiCLqsGudum2fvVNWrU_lZq4lLJmcKpCS7wEorb6HsA,14972
24
24
  httomo_backends/methods_database/packages/backends/httomolibgpu/supporting_funcs/recon/peak_memory_line_profile_hook.py,sha256=hb-CyqD5TKxDg6Rg5fvFeXIO2nvjbp_XMTeRdJZ8ONo,6347
25
25
  httomo_backends/methods_database/packages/backends/tomopy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
26
  httomo_backends/methods_database/packages/backends/tomopy/tomopy.yaml,sha256=URe18BAV1EbGLil53t88T42BuKSiUHz6r3uzs_wo8Ug,11215
@@ -38,13 +38,14 @@ httomo_backends/pipelines_full/FBP3d_tomobar_directive.yaml,sha256=QyqyAmWZjmcgV
38
38
  httomo_backends/pipelines_full/FBP3d_tomobar_noimagesaving_directive.yaml,sha256=uute7GdEEshbnmljjeyDi3Z5aqZftBTvo7Ti4wKgzhk,403
39
39
  httomo_backends/pipelines_full/LPRec3d_tomobar_directive.yaml,sha256=c6c-cXCstUgLVqprfMFVdxzcTCeE8H-Dnhq7kmSIhYc,577
40
40
  httomo_backends/pipelines_full/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
- httomo_backends/pipelines_full/deg360_distortion_FBP3d_tomobar_directive.yaml,sha256=7tHclsalkymiUGXRrbXSeDjJgVmw_H-bWFj6LC34he0,676
42
- httomo_backends/pipelines_full/deg360_paganin_FBP3d_tomobar_directive.yaml,sha256=43ugLxzkqnRsL4UJSZWErjfgwvpEfLP2QSwtQQLh6RQ,660
41
+ httomo_backends/pipelines_full/deg360_distortion_FBP3d_tomobar_directive.yaml,sha256=3Ht3yAzi97VW29OfvDE9j_p3NYbZfHDlfZMuRivsdKo,676
42
+ httomo_backends/pipelines_full/deg360_paganin_FBP3d_tomobar_directive.yaml,sha256=Qikcxqq_b3_9TpaOg5eSlYqfs1Vj9l30vx56cl5YoVI,660
43
43
  httomo_backends/pipelines_full/sweep_center_FBP3d_tomobar_directive.yaml,sha256=ERai5NvyAQz9-1EAdMUw3XkjlMvZhh6LCtXQpRh7mv4,277
44
+ httomo_backends/pipelines_full/sweep_paganin_FBP3d_tomobar_directive.yaml,sha256=qoiY62uP5kHSL4qqSThJAaMwHq4PTN-dJSNRsBFxyQw,397
44
45
  httomo_backends/pipelines_full/tomopy_gridrec_directive.yaml,sha256=NlrX-mqyzjJvwGotTLwosBnC4d9pPRNB1JWFA7YXHuM,533
45
46
  httomo_backends/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
47
  httomo_backends/scripts/json_pipelines_generator.py,sha256=iWTsYr1i0Ei77Imaml5HXWvZUUeX-tkU1WRIdxskV3M,8322
47
- httomo_backends/scripts/yaml_pipelines_generator.py,sha256=OjrE6zMhdnta87Odwp3vOiW6OcoUSkkYjxyHvz3h_V4,14170
48
+ httomo_backends/scripts/yaml_pipelines_generator.py,sha256=TLiwfSeQY1y0TVnvwjZDJeBqZg91NbfpXLMdhbqpTTo,15940
48
49
  httomo_backends/scripts/yaml_templates_generator.py,sha256=NjE5q8YXxkXjA-9WTg4YB8ccawNA0veeJE1C8yyWqlI,8532
49
50
  httomo_backends/scripts/yaml_unsupported_tomopy_remove.py,sha256=R3ZAfFgpVsBWS7zBjLlU83-66nawo7EBegFsIAHBWmQ,3715
50
51
  httomo_backends/yaml_templates/httomo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -141,8 +142,8 @@ httomo_backends/yaml_templates/tomopy/tomopy.sim.project/add_zingers.yaml,sha256
141
142
  httomo_backends/yaml_templates/tomopy/tomopy.sim.project/project.yaml,sha256=XBVhW5ZxT9C89tHcwDG7OOgcWNdNtQq97mqlBEoiMnU,202
142
143
  httomo_backends/yaml_templates/tomopy/tomopy.sim.project/project2.yaml,sha256=5raeQ-w9nS9mbAzn2ZqhPjdcyfLOkkJflKNStdEnYRA,238
143
144
  httomo_backends/yaml_templates/tomopy/tomopy.sim.project/project3.yaml,sha256=oyofKSMi-_dSpfjrKVMNDqoBhBCCSYbEVRz2Lsc8uTI,257
144
- httomo_backends-0.6.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
145
- httomo_backends-0.6.dist-info/METADATA,sha256=l2D7BiEs5l475GAEgXAsUYY6N3VVGUswQjqJ-BGQXAE,2310
146
- httomo_backends-0.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
147
- httomo_backends-0.6.dist-info/top_level.txt,sha256=v4x8d4CeEyMwo8QoqIvL_p-WoXAVD1bVnASPIrLjSTg,16
148
- httomo_backends-0.6.dist-info/RECORD,,
145
+ httomo_backends-0.6.1.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
146
+ httomo_backends-0.6.1.dist-info/METADATA,sha256=JdaS98Vkzffu2CJ590WfH5H1j5nkRK74JJmh65OuA1s,2312
147
+ httomo_backends-0.6.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
148
+ httomo_backends-0.6.1.dist-info/top_level.txt,sha256=v4x8d4CeEyMwo8QoqIvL_p-WoXAVD1bVnASPIrLjSTg,16
149
+ httomo_backends-0.6.1.dist-info/RECORD,,