opentrons 8.7.0a6__py3-none-any.whl → 8.7.0a8__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.
Potentially problematic release.
This version of opentrons might be problematic. Click here for more details.
- opentrons/_version.py +2 -2
- opentrons/drivers/asyncio/communication/serial_connection.py +8 -5
- opentrons/drivers/flex_stacker/driver.py +6 -1
- opentrons/hardware_control/backends/flex_protocol.py +1 -0
- opentrons/hardware_control/backends/ot3controller.py +3 -0
- opentrons/hardware_control/backends/ot3simulator.py +1 -0
- opentrons/hardware_control/ot3api.py +2 -0
- opentrons/hardware_control/protocols/gripper_controller.py +1 -0
- opentrons/protocol_engine/execution/labware_movement.py +9 -1
- {opentrons-8.7.0a6.dist-info → opentrons-8.7.0a8.dist-info}/METADATA +4 -4
- {opentrons-8.7.0a6.dist-info → opentrons-8.7.0a8.dist-info}/RECORD +14 -14
- {opentrons-8.7.0a6.dist-info → opentrons-8.7.0a8.dist-info}/WHEEL +0 -0
- {opentrons-8.7.0a6.dist-info → opentrons-8.7.0a8.dist-info}/entry_points.txt +0 -0
- {opentrons-8.7.0a6.dist-info → opentrons-8.7.0a8.dist-info}/licenses/LICENSE +0 -0
opentrons/_version.py
CHANGED
|
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
|
28
28
|
commit_id: COMMIT_ID
|
|
29
29
|
__commit_id__: COMMIT_ID
|
|
30
30
|
|
|
31
|
-
__version__ = version = '8.7.
|
|
32
|
-
__version_tuple__ = version_tuple = (8, 7, 0, '
|
|
31
|
+
__version__ = version = '8.7.0a8'
|
|
32
|
+
__version_tuple__ = version_tuple = (8, 7, 0, 'a8')
|
|
33
33
|
|
|
34
34
|
__commit_id__ = commit_id = None
|
|
@@ -462,7 +462,10 @@ class AsyncResponseSerialConnection(SerialConnection):
|
|
|
462
462
|
self._async_error_ack = async_error_ack.lower()
|
|
463
463
|
|
|
464
464
|
async def send_command(
|
|
465
|
-
self,
|
|
465
|
+
self,
|
|
466
|
+
command: CommandBuilder,
|
|
467
|
+
retries: int | None = None,
|
|
468
|
+
timeout: float | None = None,
|
|
466
469
|
) -> str:
|
|
467
470
|
"""
|
|
468
471
|
Send a command and return the response.
|
|
@@ -478,12 +481,12 @@ class AsyncResponseSerialConnection(SerialConnection):
|
|
|
478
481
|
"""
|
|
479
482
|
return await self.send_data(
|
|
480
483
|
data=command.build(),
|
|
481
|
-
retries=retries
|
|
484
|
+
retries=retries if retries is not None else self._number_of_retries,
|
|
482
485
|
timeout=timeout,
|
|
483
486
|
)
|
|
484
487
|
|
|
485
488
|
async def send_data(
|
|
486
|
-
self, data: str, retries: int =
|
|
489
|
+
self, data: str, retries: int | None = None, timeout: float | None = None
|
|
487
490
|
) -> str:
|
|
488
491
|
"""
|
|
489
492
|
Send data and return the response.
|
|
@@ -501,7 +504,8 @@ class AsyncResponseSerialConnection(SerialConnection):
|
|
|
501
504
|
"timeout", timeout
|
|
502
505
|
):
|
|
503
506
|
return await self._send_data(
|
|
504
|
-
data=data,
|
|
507
|
+
data=data,
|
|
508
|
+
retries=retries if retries is not None else self._number_of_retries,
|
|
505
509
|
)
|
|
506
510
|
|
|
507
511
|
async def _send_data(self, data: str, retries: int = 0) -> str:
|
|
@@ -517,7 +521,6 @@ class AsyncResponseSerialConnection(SerialConnection):
|
|
|
517
521
|
Raises: SerialException
|
|
518
522
|
"""
|
|
519
523
|
data_encode = data.encode()
|
|
520
|
-
retries = retries or self._number_of_retries
|
|
521
524
|
|
|
522
525
|
for retry in range(retries + 1):
|
|
523
526
|
log.debug(f"{self._name}: Write -> {data_encode!r}")
|
|
@@ -461,7 +461,12 @@ class FlexStackerDriver(AbstractFlexStackerDriver):
|
|
|
461
461
|
command = GCODE.GET_TOF_MEASUREMENT.build_command().add_element(sensor.name)
|
|
462
462
|
if resend:
|
|
463
463
|
command.add_element("R")
|
|
464
|
-
|
|
464
|
+
|
|
465
|
+
# Note: We DONT want to auto resend the request if it fails, because the
|
|
466
|
+
# firmware will send the next frame id instead of the current one missed.
|
|
467
|
+
# So lets set `retries=0` so we only send the frame once and we can
|
|
468
|
+
# use the retry mechanism of the `get_tof_histogram` method instead.
|
|
469
|
+
resp = await self._connection.send_command(command, retries=0)
|
|
465
470
|
return self.parse_get_tof_measurement(resp)
|
|
466
471
|
|
|
467
472
|
async def get_tof_histogram(self, sensor: TOFSensor) -> TOFMeasurementResult:
|
|
@@ -1763,6 +1763,7 @@ class OT3Controller(FlexBackend):
|
|
|
1763
1763
|
max_allowed_grip_error: float,
|
|
1764
1764
|
hard_limit_lower: float,
|
|
1765
1765
|
hard_limit_upper: float,
|
|
1766
|
+
disable_geometry_grip_check: bool = False,
|
|
1766
1767
|
) -> None:
|
|
1767
1768
|
"""
|
|
1768
1769
|
Check if the gripper is at the expected location.
|
|
@@ -1805,6 +1806,7 @@ class OT3Controller(FlexBackend):
|
|
|
1805
1806
|
if (
|
|
1806
1807
|
current_gripper_position - expected_gripper_position_min
|
|
1807
1808
|
< -max_allowed_grip_error
|
|
1809
|
+
and not disable_geometry_grip_check
|
|
1808
1810
|
):
|
|
1809
1811
|
raise FailedGripperPickupError(
|
|
1810
1812
|
message="Failed to grip: jaws closed too far",
|
|
@@ -1818,6 +1820,7 @@ class OT3Controller(FlexBackend):
|
|
|
1818
1820
|
if (
|
|
1819
1821
|
current_gripper_position - expected_gripper_position_max
|
|
1820
1822
|
> max_allowed_grip_error
|
|
1823
|
+
and not disable_geometry_grip_check
|
|
1821
1824
|
):
|
|
1822
1825
|
raise FailedGripperPickupError(
|
|
1823
1826
|
message="Failed to grip: jaws could not close far enough",
|
|
@@ -848,6 +848,7 @@ class OT3Simulator(FlexBackend):
|
|
|
848
848
|
max_allowed_grip_error: float,
|
|
849
849
|
hard_limit_lower: float,
|
|
850
850
|
hard_limit_upper: float,
|
|
851
|
+
disable_geometry_grip_check: bool = False,
|
|
851
852
|
) -> None:
|
|
852
853
|
# This is a (pretty bad) simulation of the gripper actually gripping something,
|
|
853
854
|
# but it should work.
|
|
@@ -1462,6 +1462,7 @@ class OT3API(
|
|
|
1462
1462
|
expected_grip_width: float,
|
|
1463
1463
|
grip_width_uncertainty_wider: float,
|
|
1464
1464
|
grip_width_uncertainty_narrower: float,
|
|
1465
|
+
disable_geometry_grip_check: bool = False,
|
|
1465
1466
|
) -> None:
|
|
1466
1467
|
"""Ensure that a gripper pickup succeeded.
|
|
1467
1468
|
|
|
@@ -1482,6 +1483,7 @@ class OT3API(
|
|
|
1482
1483
|
gripper.max_allowed_grip_error,
|
|
1483
1484
|
gripper.min_jaw_width,
|
|
1484
1485
|
gripper.max_jaw_width,
|
|
1486
|
+
disable_geometry_grip_check,
|
|
1485
1487
|
)
|
|
1486
1488
|
|
|
1487
1489
|
def gripper_jaw_can_home(self) -> bool:
|
|
@@ -4,7 +4,7 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
from typing import Optional, TYPE_CHECKING, overload
|
|
6
6
|
|
|
7
|
-
from opentrons_shared_data.labware.labware_definition import LabwareDefinition
|
|
7
|
+
from opentrons_shared_data.labware.labware_definition import LabwareDefinition, Quirks
|
|
8
8
|
|
|
9
9
|
from opentrons.types import Point
|
|
10
10
|
|
|
@@ -238,6 +238,13 @@ class LabwareMovementHandler:
|
|
|
238
238
|
labware_definition=labware_definition
|
|
239
239
|
)
|
|
240
240
|
|
|
241
|
+
disable_geometry_grip_check = False
|
|
242
|
+
if labware_definition.parameters.quirks is not None:
|
|
243
|
+
disable_geometry_grip_check = (
|
|
244
|
+
Quirks.disableGeometryBasedGripCheck # type: ignore[comparison-overlap]
|
|
245
|
+
in labware_definition.parameters.quirks
|
|
246
|
+
)
|
|
247
|
+
|
|
241
248
|
# todo(mm, 2024-09-26): This currently raises a lower-level 2015 FailedGripperPickupError.
|
|
242
249
|
# Convert this to a higher-level 3001 LabwareDroppedError or 3002 LabwareNotPickedUpError,
|
|
243
250
|
# depending on what waypoint we're at, to propagate a more specific error code to users.
|
|
@@ -245,6 +252,7 @@ class LabwareMovementHandler:
|
|
|
245
252
|
expected_grip_width=grip_specs.targetY,
|
|
246
253
|
grip_width_uncertainty_wider=grip_specs.uncertaintyWider,
|
|
247
254
|
grip_width_uncertainty_narrower=grip_specs.uncertaintyNarrower,
|
|
255
|
+
disable_geometry_grip_check=disable_geometry_grip_check,
|
|
248
256
|
)
|
|
249
257
|
await ot3api.move_to(
|
|
250
258
|
mount=gripper_mount, abs_position=waypoint_data.position
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: opentrons
|
|
3
|
-
Version: 8.7.
|
|
3
|
+
Version: 8.7.0a8
|
|
4
4
|
Summary: The Opentrons API is a simple framework designed to make writing automated biology lab protocols easy.
|
|
5
5
|
Project-URL: opentrons.com, https://www.opentrons.com
|
|
6
6
|
Project-URL: Source Code On Github, https://github.com/Opentrons/opentrons/tree/edge/api
|
|
@@ -24,7 +24,7 @@ Requires-Dist: click<9,>=8.0.0
|
|
|
24
24
|
Requires-Dist: importlib-metadata>=1.0; python_version < '3.8'
|
|
25
25
|
Requires-Dist: jsonschema<4.18.0,>=3.0.1
|
|
26
26
|
Requires-Dist: numpy<2,>=1.20.0
|
|
27
|
-
Requires-Dist: opentrons-shared-data==8.7.
|
|
27
|
+
Requires-Dist: opentrons-shared-data==8.7.0a8
|
|
28
28
|
Requires-Dist: packaging>=21.0
|
|
29
29
|
Requires-Dist: pydantic-settings<3,>=2
|
|
30
30
|
Requires-Dist: pydantic<3,>=2.0.0
|
|
@@ -32,6 +32,6 @@ Requires-Dist: pyserial>=3.5
|
|
|
32
32
|
Requires-Dist: pyusb==1.2.1
|
|
33
33
|
Requires-Dist: typing-extensions<5,>=4.0.0
|
|
34
34
|
Provides-Extra: flex-hardware
|
|
35
|
-
Requires-Dist: opentrons-hardware[flex]==8.7.
|
|
35
|
+
Requires-Dist: opentrons-hardware[flex]==8.7.0a8; extra == 'flex-hardware'
|
|
36
36
|
Provides-Extra: ot2-hardware
|
|
37
|
-
Requires-Dist: opentrons-hardware==8.7.
|
|
37
|
+
Requires-Dist: opentrons-hardware==8.7.0a8; extra == 'ot2-hardware'
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
opentrons/__init__.py,sha256=TQ_Ca_zzAM3iLzAysWKkFkQHG8-imihxDPQbLCYrf-E,4533
|
|
2
|
-
opentrons/_version.py,sha256=
|
|
2
|
+
opentrons/_version.py,sha256=6QOBIA4KOTSc8ttyS_QKmJl9f44y2feEQu9QWvzXG7Q,712
|
|
3
3
|
opentrons/execute.py,sha256=Y88qICDiHWQjU0L4Ou7DI5OXXu7zZcdkUvNUYmZqIfc,29282
|
|
4
4
|
opentrons/legacy_broker.py,sha256=XnuEBBlrHCThc31RFW2UR0tGqctqWZ-CZ9vSC4L9whU,1553
|
|
5
5
|
opentrons/ordered_set.py,sha256=g-SB3qA14yxHu9zjGyc2wC7d2TUCBE6fKZlHAtbPzI8,4082
|
|
@@ -53,10 +53,10 @@ opentrons/drivers/asyncio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJW
|
|
|
53
53
|
opentrons/drivers/asyncio/communication/__init__.py,sha256=b-rd_I0ecbexGm6b9T91JLfFUrCyui9V1N1j-fzy0SQ,523
|
|
54
54
|
opentrons/drivers/asyncio/communication/async_serial.py,sha256=Tzv_uXvMYhJF2LXsJWDRA3hdg5_qCo3863zvn7Y66WY,5439
|
|
55
55
|
opentrons/drivers/asyncio/communication/errors.py,sha256=-4pNGVKE83VUPNt1UTBLDzKtty3LxAhUNp-9yLENqyw,2678
|
|
56
|
-
opentrons/drivers/asyncio/communication/serial_connection.py,sha256=
|
|
56
|
+
opentrons/drivers/asyncio/communication/serial_connection.py,sha256=qvHkzpRvCGg4Bp-RR7KuwSXiNqff0R-OApFGIBAatcQ,18929
|
|
57
57
|
opentrons/drivers/flex_stacker/__init__.py,sha256=LiM0onRlgC-JfFBd0QseQU0-3WuuIxa7GNFj7Douiq8,351
|
|
58
58
|
opentrons/drivers/flex_stacker/abstract.py,sha256=50xrkTC5qI_BsvlBGpdBLwF3GVi7HhKVSgloKwcrzNA,6744
|
|
59
|
-
opentrons/drivers/flex_stacker/driver.py,sha256=
|
|
59
|
+
opentrons/drivers/flex_stacker/driver.py,sha256=m43LDktLtRXSco_SgM-6yfx0GwoxkrV8Gz5aDtLgfN4,31670
|
|
60
60
|
opentrons/drivers/flex_stacker/errors.py,sha256=8vocQHCTw8cSnlWGFml4gBtrwMOtVdml-c7MB4KnLns,2175
|
|
61
61
|
opentrons/drivers/flex_stacker/simulator.py,sha256=suOrNpD2jsiQX10yAesln_Fl3PI3IhXcpbZXXD5c2gw,10925
|
|
62
62
|
opentrons/drivers/flex_stacker/types.py,sha256=IHubhe1Xi0mUbiY6tzlyUv9KHNOGhjS4l6x7q0woAw4,7986
|
|
@@ -105,7 +105,7 @@ opentrons/hardware_control/module_control.py,sha256=0mmVH9fiZWNyc33ilCpJHajX1Dfh
|
|
|
105
105
|
opentrons/hardware_control/motion_utilities.py,sha256=7VG60YQ9MSMAZ0hO-q-kRAdkcebzrx7uIPtc6FMCViE,10311
|
|
106
106
|
opentrons/hardware_control/nozzle_manager.py,sha256=dqD8XlYsOu0PFFyxvmsMypBB52Gi6x-VIwhykV7JhuU,16868
|
|
107
107
|
opentrons/hardware_control/ot3_calibration.py,sha256=vHB17U-FBzytvM8QeEu5kRYPo8lFwAo31ZEpiU4yf_0,45000
|
|
108
|
-
opentrons/hardware_control/ot3api.py,sha256=
|
|
108
|
+
opentrons/hardware_control/ot3api.py,sha256=jRCsbVjeeueYXknF8JwqkiavGzjHlVzciI6efb-u66o,127961
|
|
109
109
|
opentrons/hardware_control/pause_manager.py,sha256=wmNmraimE2yZQVqCxX_rtQHUWRzpzyQEaym9fLMgyww,888
|
|
110
110
|
opentrons/hardware_control/poller.py,sha256=rx6Q-UxbUIj3ek69IlYenFh7BFuasszRO-GzzhRPuHQ,3885
|
|
111
111
|
opentrons/hardware_control/robot_calibration.py,sha256=ilszGjZPspKiEk8MQPaHm2B-ljeisAYflKl8UyQ_D0U,7155
|
|
@@ -118,9 +118,9 @@ opentrons/hardware_control/backends/__init__.py,sha256=u5Dg3AFZuvDV7hFqJ8I4F9D1d
|
|
|
118
118
|
opentrons/hardware_control/backends/controller.py,sha256=MOVMq9s1rY_jHhajHB1hQ1MgXXyY54-gMrrvAuMsOFg,14622
|
|
119
119
|
opentrons/hardware_control/backends/errors.py,sha256=ZiVP16exHMTWWOajxffnXEqI6NNfeTw-4RkhXE0EBJA,249
|
|
120
120
|
opentrons/hardware_control/backends/estop_state.py,sha256=_GYjI6OaD3CZNduWV2_RVeOtQ4K_Fg-SP8yU01ENhCY,6554
|
|
121
|
-
opentrons/hardware_control/backends/flex_protocol.py,sha256=
|
|
122
|
-
opentrons/hardware_control/backends/ot3controller.py,sha256=
|
|
123
|
-
opentrons/hardware_control/backends/ot3simulator.py,sha256=
|
|
121
|
+
opentrons/hardware_control/backends/flex_protocol.py,sha256=PJnTJ9jyZtR8RUGEynJfZ9ihphCXgbtEVWiZMcfnrjA,13236
|
|
122
|
+
opentrons/hardware_control/backends/ot3controller.py,sha256=CrYYwtuSswryONx9pOTNeI6U8ThSehiN4fiB5k2JcUI,71521
|
|
123
|
+
opentrons/hardware_control/backends/ot3simulator.py,sha256=zyJJpSZIlyNAcGPUUTiIjit1aHCAX54aSPumbZ3djTI,30438
|
|
124
124
|
opentrons/hardware_control/backends/ot3utils.py,sha256=HYlIZRGmLqudS1mIt0Io2LxQ1BrLrxVFQCjqudbTUWU,22374
|
|
125
125
|
opentrons/hardware_control/backends/simulator.py,sha256=q_9PQlBdOyCa9sj2gLqYWZ-fG9v4mddDAiScL-yHCXY,17549
|
|
126
126
|
opentrons/hardware_control/backends/status_bar_state.py,sha256=E8z9dCJDI3Nb4qfUA5y2_PrE2jSYzZJQVkk75UqY5ZE,9287
|
|
@@ -188,7 +188,7 @@ opentrons/hardware_control/protocols/event_sourcer.py,sha256=8-BiKGo-KVEcFOOZmj1
|
|
|
188
188
|
opentrons/hardware_control/protocols/execution_controllable.py,sha256=c1MmdETvXtwGEn6Fj_-N_mH2X4FkXnNPkrMKjClSBqY,1099
|
|
189
189
|
opentrons/hardware_control/protocols/flex_calibratable.py,sha256=rHTumhgYB43WPsZEsHjKkZNBFtvOU3CAkCd2xONLAI8,3314
|
|
190
190
|
opentrons/hardware_control/protocols/flex_instrument_configurer.py,sha256=qSnDZZxVCnCQE5CXck9c9k0AfE80W74kiKwteORGHb8,1461
|
|
191
|
-
opentrons/hardware_control/protocols/gripper_controller.py,sha256=
|
|
191
|
+
opentrons/hardware_control/protocols/gripper_controller.py,sha256=EEfL-KUzegZBm_vETeCAv_RFXisnV6xPc4N9Wil9348,1685
|
|
192
192
|
opentrons/hardware_control/protocols/hardware_manager.py,sha256=S9BSJ0XsnU5A9nFLMDZfmiizx3T41WhU_91VYj4bUVE,1629
|
|
193
193
|
opentrons/hardware_control/protocols/identifiable.py,sha256=YmhScb4Tr4mxVObL1i7pI-EouTMAmV-2oqKbovhdnrE,575
|
|
194
194
|
opentrons/hardware_control/protocols/instrument_configurer.py,sha256=5zUCAchtoJ6QPFqcGRb7FOsnt2nxjxlRJdt18IidKqQ,7729
|
|
@@ -427,7 +427,7 @@ opentrons/protocol_engine/execution/error_recovery_hardware_state_synchronizer.p
|
|
|
427
427
|
opentrons/protocol_engine/execution/gantry_mover.py,sha256=LFTPmzuGRuP6IspgXxIEyJIXV0tHkc4UWDDjWFCClYo,26477
|
|
428
428
|
opentrons/protocol_engine/execution/hardware_stopper.py,sha256=ZlhVYEdFfuKqp5slZBkustXcRPy5fJsw2rmfYzHuJkQ,6127
|
|
429
429
|
opentrons/protocol_engine/execution/heater_shaker_movement_flagger.py,sha256=BSFLzSSeELAYZCrCUfJZx5DdlrwU06Ur92TYd0T-hzM,9084
|
|
430
|
-
opentrons/protocol_engine/execution/labware_movement.py,sha256=
|
|
430
|
+
opentrons/protocol_engine/execution/labware_movement.py,sha256=ls9k5EDokiiqgoNcSrVrWDdsuNzEmKuLhJ0SYC0nWlc,13154
|
|
431
431
|
opentrons/protocol_engine/execution/movement.py,sha256=ZU4K4OHnzZYCZbk3RwfSOC6C3T2jtBlvYMppJhJSF08,12749
|
|
432
432
|
opentrons/protocol_engine/execution/pipetting.py,sha256=cnJYbLiJ2QD1xziD8dkRm0mZG3xOk00klW8Ff8rgSG4,22199
|
|
433
433
|
opentrons/protocol_engine/execution/queue_worker.py,sha256=LM753TrQzJoKUSIrtcaHDOWLe58zcpx-fUOLVpyDlHM,3302
|
|
@@ -595,8 +595,8 @@ opentrons/util/linal.py,sha256=IlKAP9HkNBBgULeSf4YVwSKHdx9jnCjSr7nvDvlRALg,5753
|
|
|
595
595
|
opentrons/util/logging_config.py,sha256=7et4YYuQdWdq_e50U-8vFS_QyNBRgdnqPGAQJm8qrIo,9954
|
|
596
596
|
opentrons/util/logging_queue_handler.py,sha256=ZsSJwy-oV8DXwpYiZisQ1PbYwmK2cOslD46AcyJ1E4I,2484
|
|
597
597
|
opentrons/util/performance_helpers.py,sha256=ew7H8XD20iS6-2TJAzbQeyzStZkkE6PzHt_Adx3wbZQ,5172
|
|
598
|
-
opentrons-8.7.
|
|
599
|
-
opentrons-8.7.
|
|
600
|
-
opentrons-8.7.
|
|
601
|
-
opentrons-8.7.
|
|
602
|
-
opentrons-8.7.
|
|
598
|
+
opentrons-8.7.0a8.dist-info/METADATA,sha256=h4Ga21sNoSoWHfEygxLFQHwKT1yEzhidYsgNaEx8OaI,1607
|
|
599
|
+
opentrons-8.7.0a8.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
600
|
+
opentrons-8.7.0a8.dist-info/entry_points.txt,sha256=fTa6eGCYkvOtv0ov-KVE8LLGetgb35LQLF9x85OWPVw,106
|
|
601
|
+
opentrons-8.7.0a8.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
|
|
602
|
+
opentrons-8.7.0a8.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|