fmu-manipulation-toolbox 1.9rc0__py3-none-any.whl → 1.9rc1__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.
@@ -16,7 +16,9 @@ class FMU:
16
16
  modelDescription.xml file."""
17
17
 
18
18
  FMI2_TYPES = ('Real', 'Integer', 'String', 'Boolean', 'Enumeration')
19
- FMI3_TYPES = ('Float64')
19
+ FMI3_TYPES = ('Float64', 'Float32',
20
+ 'Int8', 'UInt8', 'Int16', 'UInt16', 'Int32', 'UInt32', 'Int64', 'UInt64',
21
+ 'String', 'Boolean', 'Enumeration')
20
22
 
21
23
  def __init__(self, fmu_filename):
22
24
  self.fmu_filename = fmu_filename
@@ -51,6 +53,56 @@ class FMU:
51
53
  manipulation.manipulate(self.descriptor_filename, apply_on)
52
54
 
53
55
 
56
+ class FMUPort:
57
+ def __init__(self):
58
+ self.fmi_type = None
59
+ self.attrs_list: List[Dict] = []
60
+
61
+ def dict_level(self, nb):
62
+ return " ".join([f'{key}="{value}"' for key, value in self.attrs_list[nb].items()])
63
+
64
+ def write_xml(self, fmi_version: int, file):
65
+ if fmi_version == 2:
66
+ print(f" <ScalarVariable {self.dict_level(0)}>", file=file)
67
+ print(f" <{self.fmi_type} {self.dict_level(1)}/>", file=file)
68
+ print(f" </ScalarVariable>", file=file)
69
+ elif fmi_version == 3:
70
+ print(f" <{self.fmi_type} {self.dict_level(0)}/>", file=file)
71
+ else:
72
+ raise FMUError(f"FMUPort writing: unsupported FMI version {fmi_version}")
73
+
74
+ def __contains__(self, item):
75
+ for attrs in self.attrs_list:
76
+ if item in attrs:
77
+ return True
78
+ return False
79
+
80
+ def __getitem__(self, item):
81
+ for attrs in self.attrs_list:
82
+ if item in attrs:
83
+ return attrs[item]
84
+ raise KeyError
85
+
86
+ def __setitem__(self, key, value):
87
+ for attrs in self.attrs_list:
88
+ if key in attrs:
89
+ attrs[key] = value
90
+ return
91
+ raise KeyError
92
+
93
+ def get(self, item, default_value):
94
+ try:
95
+ return self[item]
96
+ except KeyError:
97
+ return default_value
98
+
99
+ def push_attrs(self, attrs):
100
+ self.attrs_list.append(attrs)
101
+
102
+ def is_ready(self):
103
+ return self.fmi_type is not None
104
+
105
+
54
106
  class FMUError(Exception):
55
107
  def __init__(self, reason):
56
108
  self.reason = reason
@@ -73,8 +125,10 @@ class Manipulation:
73
125
  self.operation.set_fmu(fmu)
74
126
  self.fmu = fmu
75
127
 
76
- self.current_port: int = 0
77
- self.port_translation: List[int] = []
128
+ self.current_port: Optional[FMUPort] = None
129
+
130
+ self.current_port_number: int = 0
131
+ self.port_translation: List[Optional[int]] = []
78
132
  self.port_names_list: List[str] = []
79
133
  self.apply_on = None
80
134
 
@@ -85,48 +139,58 @@ class Manipulation:
85
139
  else:
86
140
  return value
87
141
 
88
- def start_variable(self, attrs):
89
- causality = OperationAbstract.scalar_get_causality(attrs)
90
- port_name = attrs['name']
142
+ def handle_port(self):
143
+ causality = self.current_port.get('causality', 'local')
144
+ port_name = self.current_port['name']
91
145
  if not self.apply_on or causality in self.apply_on:
92
- if self.operation.scalar_attrs(attrs):
146
+ if self.operation.port_attrs(self.current_port):
93
147
  self.remove_port(port_name)
94
148
  else:
95
149
  self.keep_port(port_name)
96
150
  else: # Keep ScalarVariable as it is.
97
151
  self.keep_port(port_name)
98
152
 
99
-
100
153
  def start_element(self, name, attrs):
101
154
  if self.skip_until:
102
155
  return
103
156
  try:
104
- if name == 'ScalarVariable':
105
- self.start_variable(attrs)
106
- elif name in self.fmu.FMI3_TYPES:
107
- attrs['type_name'] = name
108
- self.start_variable(attrs)
157
+ if name == 'ScalarVariable': # FMI 2.0 only
158
+ self.current_port = FMUPort()
159
+ self.current_port.push_attrs(attrs)
160
+ elif self.fmu.fmi_version == 2 and name in self.fmu.FMI2_TYPES:
161
+ self.current_port.fmi_type = name
162
+ self.current_port.push_attrs(attrs)
163
+ elif self.fmu.fmi_version == 3 and name in self.fmu.FMI3_TYPES:
164
+ self.current_port = FMUPort()
165
+ self.current_port.fmi_type = name
166
+ self.current_port.push_attrs(attrs)
109
167
  elif name == 'CoSimulation':
110
168
  self.operation.cosimulation_attrs(attrs)
111
169
  elif name == 'DefaultExperiment':
112
170
  self.operation.experiment_attrs(attrs)
113
171
  elif name == 'fmiModelDescription':
172
+ self.fmu.fmi_version = int(float(attrs["fmiVersion"]))
114
173
  self.operation.fmi_attrs(attrs)
115
174
  elif name == 'Unknown':
116
175
  self.unknown_attrs(attrs)
117
- elif name in self.fmu.FMI2_TYPES:
118
- self.operation.scalar_type(name, attrs)
176
+
177
+ if self.current_port and self.current_port.is_ready():
178
+ self.handle_port()
119
179
 
120
180
  except ManipulationSkipTag:
121
181
  self.skip_until = name
122
182
  return
123
183
 
124
- if attrs:
125
- attrs.pop('fmi_type', None) # FMI 3.0: this attr was added during manipulation
126
- attrs_list = [f'{key}="{self.escape(value)}"' for (key, value) in attrs.items()]
127
- print(f"<{name}", " ".join(attrs_list), ">", end='', file=self.out)
128
- else:
129
- print(f"<{name}>", end='', file=self.out)
184
+ if self.current_port:
185
+ if self.current_port.is_ready():
186
+ self.current_port.write_xml(self.fmu.fmi_version, self.out)
187
+ self.current_port = None
188
+ else: # re-copy tags
189
+ if attrs:
190
+ attrs_list = [f'{key}="{self.escape(value)}"' for (key, value) in attrs.items()]
191
+ print(f"<{name}", " ".join(attrs_list), ">", end='', file=self.out)
192
+ else:
193
+ print(f"<{name}>", end='', file=self.out)
130
194
 
131
195
  def end_element(self, name):
132
196
  if self.skip_until:
@@ -134,7 +198,8 @@ class Manipulation:
134
198
  self.skip_until = None
135
199
  return
136
200
  else:
137
- print(f"</{name}>", end='', file=self.out)
201
+ if name not in FMU.FMI3_TYPES and name not in FMU.FMI2_TYPES and not name == "ScalarVariable":
202
+ print(f"</{name}>", end='', file=self.out)
138
203
 
139
204
  def char_data(self, data):
140
205
  if not self.skip_until:
@@ -147,8 +212,8 @@ class Manipulation:
147
212
 
148
213
  def keep_port(self, name):
149
214
  self.port_names_list.append(name)
150
- self.current_port += 1
151
- self.port_translation.append(self.current_port)
215
+ self.current_port_number += 1
216
+ self.port_translation.append(self.current_port_number)
152
217
 
153
218
  def unknown_attrs(self, attrs):
154
219
  index = int(attrs['index']) - 1
@@ -181,31 +246,19 @@ class OperationAbstract:
181
246
  def fmi_attrs(self, attrs):
182
247
  pass
183
248
 
184
- def scalar_attrs(self, attrs) -> int:
185
- """ return 0 to keep port, otherwise remove it"""
186
- return 0
187
-
188
249
  def cosimulation_attrs(self, attrs):
189
250
  pass
190
251
 
191
252
  def experiment_attrs(self, attrs):
192
253
  pass
193
254
 
194
- def scalar_type(self, type_name, attrs):
195
- pass
255
+ def port_attrs(self, fmu_port) -> int:
256
+ """ return 0 to keep port, otherwise remove it"""
257
+ return 0
196
258
 
197
259
  def closure(self):
198
260
  pass
199
261
 
200
- @staticmethod
201
- def scalar_get_causality(attrs) -> str:
202
- try:
203
- causality = attrs['causality']
204
- except KeyError:
205
- causality = 'local' # Default value according to FMI Specifications.
206
-
207
- return causality
208
-
209
262
 
210
263
  class OperationSaveNamesToCSV(OperationAbstract):
211
264
  def __repr__(self):
@@ -217,48 +270,29 @@ class OperationSaveNamesToCSV(OperationAbstract):
217
270
  self.writer = csv.writer(self.csvfile, delimiter=';', quotechar="'", quoting=csv.QUOTE_MINIMAL)
218
271
  self.writer.writerow(['name', 'newName', 'valueReference', 'causality', 'variability', 'scalarType',
219
272
  'startValue'])
220
- self.name = None
221
- self.vr = None
222
- self.variability = None
223
- self.causality = None
224
-
225
- def reset(self):
226
- self.name = None
227
- self.vr = None
228
- self.variability = None
229
- self.causality = None
230
273
 
231
274
  def closure(self):
232
275
  self.csvfile.close()
233
276
 
234
- def scalar_attrs(self, attrs):
235
- self.name = attrs['name']
236
- self.vr = attrs['valueReference']
237
- self.causality = self.scalar_get_causality(attrs)
238
-
239
- try:
240
- self.variability = attrs['variability']
241
- except KeyError:
242
- self.variability = 'continuous' # Default value according to FMI Specifications.
277
+ def port_attrs(self, fmu_port: FMUPort) -> int:
278
+ self.writer.writerow([fmu_port["name"],
279
+ fmu_port["name"],
280
+ fmu_port["valueReference"],
281
+ fmu_port.get("causality", "local"),
282
+ fmu_port.get("variability", "continuous"),
283
+ fmu_port.fmi_type,
284
+ fmu_port.get("start", "")])
243
285
 
244
286
  return 0
245
287
 
246
- def scalar_type(self, type_name, attrs):
247
- if "start" in attrs:
248
- start = attrs["start"]
249
- else:
250
- start = ""
251
- self.writer.writerow([self.name, self.name, self.vr, self.causality, self.variability, type_name, start])
252
- self.reset()
253
-
254
288
 
255
289
  class OperationStripTopLevel(OperationAbstract):
256
290
  def __repr__(self):
257
291
  return "Remove Top Level Bus"
258
292
 
259
- def scalar_attrs(self, attrs):
260
- new_name = attrs['name'].split('.', 1)[-1]
261
- attrs['name'] = new_name
293
+ def port_attrs(self, fmu_port):
294
+ new_name = fmu_port['name'].split('.', 1)[-1]
295
+ fmu_port['name'] = new_name
262
296
  return 0
263
297
 
264
298
 
@@ -266,9 +300,9 @@ class OperationMergeTopLevel(OperationAbstract):
266
300
  def __repr__(self):
267
301
  return "Merge Top Level Bus with signal names"
268
302
 
269
- def scalar_attrs(self, attrs):
270
- old = attrs['name']
271
- attrs['name'] = old.replace('.', '_', 1)
303
+ def port_attrs(self, fmu_port):
304
+ old = fmu_port['name']
305
+ fmu_port['name'] = old.replace('.', '_', 1)
272
306
  return 0
273
307
 
274
308
 
@@ -279,27 +313,26 @@ class OperationRenameFromCSV(OperationAbstract):
279
313
  def __init__(self, csv_filename):
280
314
  self.csv_filename = csv_filename
281
315
  self.translations = {}
282
- self.current_port = 0
283
- self.port_translation = []
316
+
284
317
  try:
285
318
  with open(csv_filename, newline='') as csvfile:
286
319
  reader = csv.reader(csvfile, delimiter=';', quotechar="'")
287
320
  for row in reader:
288
321
  self.translations[row[0]] = row[1]
289
322
  except FileNotFoundError:
290
- raise OperationException(f"file '{csv_filename}' is not found")
323
+ raise OperationError(f"file '{csv_filename}' is not found")
291
324
  except KeyError:
292
- raise OperationException(f"file '{csv_filename}' should contain two columns")
325
+ raise OperationError(f"file '{csv_filename}' should contain two columns")
293
326
 
294
- def scalar_attrs(self, attrs):
295
- name = attrs['name']
327
+ def port_attrs(self, fmu_port):
328
+ name = fmu_port['name']
296
329
  try:
297
- new_name = self.translations[attrs['name']]
330
+ new_name = self.translations[fmu_port['name']]
298
331
  except KeyError:
299
332
  new_name = name # if port is not in CSV file, keep old name
300
333
 
301
334
  if new_name:
302
- attrs['name'] = new_name
335
+ fmu_port['name'] = new_name
303
336
  return 0
304
337
  else:
305
338
  # we want to delete this name!
@@ -313,6 +346,10 @@ class OperationAddRemotingWinAbstract(OperationAbstract):
313
346
  def __repr__(self):
314
347
  return f"Add '{self.bitness_to}' remoting on '{self.bitness_from}' FMU"
315
348
 
349
+ def fmi_attrs(self, attrs):
350
+ if not attrs["fmi_version"] == "2.0":
351
+ raise OperationError(f"Adding remoting is only available for FMI-2.0")
352
+
316
353
  def cosimulation_attrs(self, attrs):
317
354
  fmu_bin = {
318
355
  "win32": os.path.join(self.fmu.tmp_directory, "binaries", f"win32"),
@@ -320,7 +357,7 @@ class OperationAddRemotingWinAbstract(OperationAbstract):
320
357
  }
321
358
 
322
359
  if not os.path.isdir(fmu_bin[self.bitness_from]):
323
- raise OperationException(f"{self.bitness_from} interface does not exist")
360
+ raise OperationError(f"{self.bitness_from} interface does not exist")
324
361
 
325
362
  if os.path.isdir(fmu_bin[self.bitness_to]):
326
363
  print(f"INFO: {self.bitness_to} already exists. Add front-end.")
@@ -368,11 +405,11 @@ class OperationRemoveRegexp(OperationAbstract):
368
405
  def __init__(self, regex_string):
369
406
  self.regex_string = regex_string
370
407
  self.regex = re.compile(regex_string)
371
- self.current_port = 0
408
+ self.current_port_number = 0
372
409
  self.port_translation = []
373
410
 
374
- def scalar_attrs(self, attrs):
375
- name = attrs['name']
411
+ def port_attrs(self, fmu_port):
412
+ name = fmu_port['name']
376
413
  if self.regex.match(name):
377
414
  return 1 # Remove port
378
415
  else:
@@ -387,8 +424,8 @@ class OperationKeepOnlyRegexp(OperationAbstract):
387
424
  self.regex_string = regex_string
388
425
  self.regex = re.compile(regex_string)
389
426
 
390
- def scalar_attrs(self, attrs):
391
- name = attrs['name']
427
+ def port_attrs(self, fmu_port):
428
+ name = fmu_port['name']
392
429
  if self.regex.match(name):
393
430
  return 0
394
431
  else:
@@ -429,8 +466,8 @@ class OperationSummary(OperationAbstract):
429
466
  print(f"| - {k} = {v}")
430
467
  print(f"|")
431
468
 
432
- def scalar_attrs(self, attrs) -> int:
433
- causality = self.scalar_get_causality(attrs)
469
+ def port_attrs(self, fmu_port) -> int:
470
+ causality = fmu_port.get("causality", "local")
434
471
 
435
472
  try:
436
473
  self.nb_port_per_causality[causality] += 1
@@ -487,17 +524,17 @@ class OperationTrimUntil(OperationAbstract):
487
524
  def __repr__(self):
488
525
  return f"Trim names until (and including) '{self.separator}'"
489
526
 
490
- def scalar_attrs(self, attrs) -> int:
491
- name = attrs['name']
527
+ def port_attrs(self, fmu_port) -> int:
528
+ name = fmu_port['name']
492
529
  try:
493
- attrs['name'] = name[name.index(self.separator)+len(self.separator):-1]
530
+ fmu_port['name'] = name[name.index(self.separator)+len(self.separator):-1]
494
531
  except KeyError:
495
532
  pass # no separator
496
533
 
497
534
  return 0
498
535
 
499
536
 
500
- class OperationException(Exception):
537
+ class OperationError(Exception):
501
538
  def __init__(self, reason):
502
539
  self.reason = reason
503
540
 
@@ -198,7 +198,15 @@ class FMUSplitterDescription:
198
198
  self.config["candidate_fmu"] = []
199
199
 
200
200
  for i in range(nb_fmu):
201
+ # format is
202
+ # filename.fmu
203
+ # or
204
+ # filename.fmu fmi_version
201
205
  fmu_filename = self.get_line(file)
206
+ if ' ' in fmu_filename:
207
+ fmu_filename = fmu_filename.split(' ')[0]
208
+ # fmi version is not needed for further operations
209
+
202
210
  base_directory = "/".join(txt_filename.split("/")[0:-1])
203
211
 
204
212
  directory = f"{base_directory}/{fmu_filename}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fmu_manipulation_toolbox
3
- Version: 1.9rc0
3
+ Version: 1.9rc1
4
4
  Summary: FMU Manipulation Toolbox is a python application for modifying Functional Mock-up Units (FMUs) without recompilation or bundling them into FMU Containers
5
5
  Home-page: https://github.com/grouperenault/fmu_manipulation_toolbox/
6
6
  Author: Nicolas.LAURENT@Renault.com
@@ -1,14 +1,14 @@
1
1
  fmu_manipulation_toolbox/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
2
2
  fmu_manipulation_toolbox/__main__.py,sha256=mAzrtkil506DS0F3g3CEbHdtZsZotzntcNhIn_lNJkw,344
3
- fmu_manipulation_toolbox/__version__.py,sha256=pIetL3-rgAy__3Y9bhoI5aPvTCG8a1qRIBr7IZdM-aA,12
4
- fmu_manipulation_toolbox/assembly.py,sha256=1jlNc_Rfls2Nah22sd9IL11rC0J5MWs0slT4Bc3sjOw,26364
3
+ fmu_manipulation_toolbox/__version__.py,sha256=hYFpHuopEP58yzpI84myHNi5TvdMTGgMf2b3lGAPyRY,12
4
+ fmu_manipulation_toolbox/assembly.py,sha256=cz8Z6zO3tWfNEj62ZEvU5pMv4byXs-F6Ri21YxLAYFs,26528
5
5
  fmu_manipulation_toolbox/checker.py,sha256=836wCri6aEl0M6_xHPZ94JRngFjsy8Ee-_t8bzclxBs,2332
6
- fmu_manipulation_toolbox/container.py,sha256=DjzRgSGNth50V-8eQ107mbYZQq1Q5-ZPsO6E-oZG4KE,32831
6
+ fmu_manipulation_toolbox/container.py,sha256=M8jL2WhjKqZ8pHSSSplys9eqTjGvubcAz0ggsH8nYpI,40556
7
7
  fmu_manipulation_toolbox/gui.py,sha256=tVTPLbGZlD5P0WYqaD5B4crG2nHjBGe73yAJrzRXpYE,29218
8
8
  fmu_manipulation_toolbox/gui_style.py,sha256=uzEruJumnC5Vf2cfHXVa_c-SHAQoTvDWemro3-b9Mpc,6492
9
9
  fmu_manipulation_toolbox/help.py,sha256=aklKiLrsE0adSzQ5uoEB1sBDmI6s4l231gavu4XxxzA,5856
10
- fmu_manipulation_toolbox/operations.py,sha256=p0e6OgNRT0JrQaDjhdHk1rxVoRXbdhPHueVvn021UdM,16346
11
- fmu_manipulation_toolbox/split.py,sha256=lHIct-ANlFB0p7MgViUaSF8jlOlD1-M7TP-I-x9kkpI,13061
10
+ fmu_manipulation_toolbox/operations.py,sha256=-oOHWLm15XbiVgIM8rbOinO2haqyH-5VF6WpFGGVxNg,18174
11
+ fmu_manipulation_toolbox/split.py,sha256=NVkfdTRR0jj_VOdgtxHQoKptkAg5TFVUA7nUx3_o9Pg,13336
12
12
  fmu_manipulation_toolbox/version.py,sha256=OhBLkZ1-nhC77kyvffPNAf6m8OZe1bYTnNf_PWs1NvM,392
13
13
  fmu_manipulation_toolbox/resources/checkbox-checked-disabled.png,sha256=FWIuyrXlaNLLePHfXj7j9ca5rT8Hgr14KCe1EqTCZyk,2288
14
14
  fmu_manipulation_toolbox/resources/checkbox-checked-hover.png,sha256=KNlV-d_aJNTTvUVXKGT9DBY30sIs2LwocLJrFKNKv8k,2419
@@ -27,6 +27,7 @@ fmu_manipulation_toolbox/resources/icon_fmu.png,sha256=EuygB2xcoM2WAfKKdyKG_UvTL
27
27
  fmu_manipulation_toolbox/resources/license.txt,sha256=5ODuU8g8pIkK-NMWXu_rjZ6k7gM7b-N2rmg87-2Kmqw,1583
28
28
  fmu_manipulation_toolbox/resources/mask.png,sha256=px1U4hQGL0AmZ4BQPknOVREpMpTSejbah3ntkpqAzFA,3008
29
29
  fmu_manipulation_toolbox/resources/model.png,sha256=EAf_HnZJe8zYGZygerG1MMt2U-tMMZlifzXPj4_iORA,208788
30
+ fmu_manipulation_toolbox/resources/darwin64/container.dylib,sha256=9L9N8rXVI6sYEDZAQdDymX6Z0GmFwj3_GhrtiBh1pTM,144760
30
31
  fmu_manipulation_toolbox/resources/fmi-2.0/fmi2Annotation.xsd,sha256=OGfyJtaJntKypX5KDpuZ-nV1oYLZ6HV16pkpKOmYox4,2731
31
32
  fmu_manipulation_toolbox/resources/fmi-2.0/fmi2AttributeGroups.xsd,sha256=HwyV7LBse-PQSv4z1xjmtzPU3Hjnv4mluq9YdSBNHMQ,3704
32
33
  fmu_manipulation_toolbox/resources/fmi-2.0/fmi2ModelDescription.xsd,sha256=JM4j_9q-pc40XYHb28jfT3iV3aYM5JLqD5aRjO72K1E,18939
@@ -49,16 +50,16 @@ fmu_manipulation_toolbox/resources/fmi-3.0/fmi3VariableDependency.xsd,sha256=YQS
49
50
  fmu_manipulation_toolbox/resources/linux32/client_sm.so,sha256=xVdY2zy13pa2DcvFiweSNpp7E6DiONqeoBdlcJHrW_k,35940
50
51
  fmu_manipulation_toolbox/resources/linux32/server_sm,sha256=1TLGqNPyM5UVOrCfzNqWyF6ClLksY3EiY3CSsrnp6c0,22836
51
52
  fmu_manipulation_toolbox/resources/linux64/client_sm.so,sha256=EhY1XHo1YcQn6yqZ7wk5okqtZyp0MrcCsGcudqE-aIM,37000
52
- fmu_manipulation_toolbox/resources/linux64/container.so,sha256=0hpVEgJkGxbgMeoVAgeqL73aewZ8j-tfzXlf0A0UBpM,85064
53
+ fmu_manipulation_toolbox/resources/linux64/container.so,sha256=b1BizAi-7Ag0vHBk_HjiXhBWpMnkV4Cju2FGMYqCQ7w,131144
53
54
  fmu_manipulation_toolbox/resources/linux64/server_sm,sha256=ulfoPvmaYe9nInYcVEyj7mD9zDzGk56OUoWx1mPKLiE,22768
54
- fmu_manipulation_toolbox/resources/win32/client_sm.dll,sha256=ZF0W5N4ZZgMWVnyYrLrEgxamj3WNw667QK5pqK4HvnA,17920
55
- fmu_manipulation_toolbox/resources/win32/server_sm.exe,sha256=KnUM49rDTpTHjVr-J2kfBsYnQnPsX7ho6H7vTlF8i-E,15872
56
- fmu_manipulation_toolbox/resources/win64/client_sm.dll,sha256=58N8xOmJ9XU_oe2rC9JP95lzR-IhDzbwD9FDPaQ7VtM,22016
57
- fmu_manipulation_toolbox/resources/win64/container.dll,sha256=bvxsESgpzAn7IyLnf5Oc41pBPCM7tQz0LJrlXaSpTJQ,57856
58
- fmu_manipulation_toolbox/resources/win64/server_sm.exe,sha256=ftJC5fBoCnlzrcbLJBIfniOAieWGFHZ5klv5UFL9LEE,19968
59
- fmu_manipulation_toolbox-1.9rc0.dist-info/licenses/LICENSE.txt,sha256=c_862mzyk6ownO3Gt6cVs0-53IXLi_-ZEQFNDVabESw,1285
60
- fmu_manipulation_toolbox-1.9rc0.dist-info/METADATA,sha256=kWBmPNMw9UYn11B144bSf7H0inSSo6uD-Cpe0h2OyQ4,1156
61
- fmu_manipulation_toolbox-1.9rc0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
62
- fmu_manipulation_toolbox-1.9rc0.dist-info/entry_points.txt,sha256=HjOZkflbI1IuSY8BpOZre20m24M4GDQGCJfPIa7NrlY,264
63
- fmu_manipulation_toolbox-1.9rc0.dist-info/top_level.txt,sha256=9D_h-5BMjSqf9z-XFkbJL_bMppR2XNYW3WNuPkXou0k,25
64
- fmu_manipulation_toolbox-1.9rc0.dist-info/RECORD,,
55
+ fmu_manipulation_toolbox/resources/win32/client_sm.dll,sha256=HkGkuf0HTsBQSCWeiTDYb2kANc2CjsjhVo9Qk8KLLl0,17920
56
+ fmu_manipulation_toolbox/resources/win32/server_sm.exe,sha256=2vrLiRdBoBUSckrSJhvt9F_hJowYv7_qVo0weKVeXBc,15872
57
+ fmu_manipulation_toolbox/resources/win64/client_sm.dll,sha256=df4rfG-SyW0EClifv8PDYqzhKMOvzwZnanaS_8lDxC8,22016
58
+ fmu_manipulation_toolbox/resources/win64/container.dll,sha256=TOJIEULG8TF2vdHbfi2Adwt1NnuLsEbMvchZhzO0P6s,93696
59
+ fmu_manipulation_toolbox/resources/win64/server_sm.exe,sha256=PFueL3UzAVwSz8QBmysbY4Mr9G2lVcjdrFYEyWuTDRU,19968
60
+ fmu_manipulation_toolbox-1.9rc1.dist-info/licenses/LICENSE.txt,sha256=c_862mzyk6ownO3Gt6cVs0-53IXLi_-ZEQFNDVabESw,1285
61
+ fmu_manipulation_toolbox-1.9rc1.dist-info/METADATA,sha256=595mII6g6nVb5iilo-HAvp95-TSS_8yl-95y_vicFrs,1156
62
+ fmu_manipulation_toolbox-1.9rc1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
63
+ fmu_manipulation_toolbox-1.9rc1.dist-info/entry_points.txt,sha256=HjOZkflbI1IuSY8BpOZre20m24M4GDQGCJfPIa7NrlY,264
64
+ fmu_manipulation_toolbox-1.9rc1.dist-info/top_level.txt,sha256=9D_h-5BMjSqf9z-XFkbJL_bMppR2XNYW3WNuPkXou0k,25
65
+ fmu_manipulation_toolbox-1.9rc1.dist-info/RECORD,,