Skip to content

Commit 4bba31b

Browse files
committed
Licenses
sick launch
1 parent 94ba9dd commit 4bba31b

17 files changed

+433
-9
lines changed

LICENSE

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
BSD 3-Clause License
2+
3+
Copyright (c) 2023, clearpathrobotics
4+
5+
Redistribution and use in source and binary forms, with or without
6+
modification, are permitted provided that the following conditions are met:
7+
8+
1. Redistributions of source code must retain the above copyright notice, this
9+
list of conditions and the following disclaimer.
10+
11+
2. Redistributions in binary form must reproduce the above copyright notice,
12+
this list of conditions and the following disclaimer in the documentation
13+
and/or other materials provided with the distribution.
14+
15+
3. Neither the name of the copyright holder nor the names of its
16+
contributors may be used to endorse or promote products derived from
17+
this software without specific prior written permission.
18+
19+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

clearpath_launch_generator/clearpath_launch_generator/launch_writer.py

+27
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,30 @@
1+
# Software License Agreement (BSD)
2+
#
3+
# @author Roni Kreinin <[email protected]>
4+
# @copyright (c) 2023, Clearpath Robotics, Inc., All rights reserved.
5+
#
6+
# Redistribution and use in source and binary forms, with or without
7+
# modification, are permitted provided that the following conditions are met:
8+
# * Redistributions of source code must retain the above copyright notice,
9+
# this list of conditions and the following disclaimer.
10+
# * Redistributions in binary form must reproduce the above copyright notice,
11+
# this list of conditions and the following disclaimer in the documentation
12+
# and/or other materials provided with the distribution.
13+
# * Neither the name of Clearpath Robotics nor the names of its contributors
14+
# may be used to endorse or promote products derived from this software
15+
# without specific prior written permission.
16+
#
17+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
21+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27+
# POSSIBILITY OF SUCH DAMAGE.
128
from typing import List
229

330
import os

clearpath_launch_generator/package.xml

+8-3
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,14 @@
33
<package format="3">
44
<name>clearpath_launch_generator</name>
55
<version>0.0.0</version>
6-
<description>TODO: Package description</description>
7-
<maintainer email="[email protected]">rkreinin</maintainer>
8-
<license>TODO: License declaration</license>
6+
<description>Clearpath launch generation scripts</description>
7+
8+
<author email="[email protected]">rkreinin</author>
9+
<maintainer email="[email protected]">Luis Camero</maintainer>
10+
<maintainer email="[email protected]">Roni Kreinin</maintainer>
11+
<maintainer email="[email protected]">Tony Baltovski</maintainer>
12+
13+
<license>BSD</license>
914

1015
<buildtool_depend>ament_cmake</buildtool_depend>
1116

clearpath_platform/a200_hardware.xml

+31
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,34 @@
1+
<?xml version="1.0"?>
2+
<!--
3+
Software License Agreement (BSD)
4+
5+
\file a200_hardware.xml
6+
\authors Tony Baltovski <[email protected]>
7+
Roni Kreinin <[email protected]>
8+
\copyright Copyright (c) 2023, Clearpath Robotics, Inc., All rights reserved.
9+
10+
Redistribution and use in source and binary forms, with or without
11+
modification, are permitted provided that the following conditions are met:
12+
* Redistributions of source code must retain the above copyright notice,
13+
this list of conditions and the following disclaimer.
14+
* Redistributions in binary form must reproduce the above copyright notice,
15+
this list of conditions and the following disclaimer in the documentation
16+
and/or other materials provided with the distribution.
17+
* Neither the name of Clearpath Robotics nor the names of its contributors
18+
may be used to endorse or promote products derived from this software
19+
without specific prior written permission.
20+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23+
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
24+
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25+
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26+
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27+
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28+
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29+
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30+
POSSIBILITY OF SUCH DAMAGE.
31+
-->
132
<library path="a200_hardware">
233
<class name="clearpath_platform/A200Hardware"
334
type="clearpath_platform::A200Hardware"

clearpath_platform/j100_hardware.xml

+31-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,33 @@
1+
<?xml version="1.0"?>
2+
<!--
3+
Software License Agreement (BSD)
4+
5+
\file j100_hardware.xml
6+
\authors Roni Kreinin <[email protected]>
7+
\copyright Copyright (c) 2023, Clearpath Robotics, Inc., All rights reserved.
8+
9+
Redistribution and use in source and binary forms, with or without
10+
modification, are permitted provided that the following conditions are met:
11+
* Redistributions of source code must retain the above copyright notice,
12+
this list of conditions and the following disclaimer.
13+
* Redistributions in binary form must reproduce the above copyright notice,
14+
this list of conditions and the following disclaimer in the documentation
15+
and/or other materials provided with the distribution.
16+
* Neither the name of Clearpath Robotics nor the names of its contributors
17+
may be used to endorse or promote products derived from this software
18+
without specific prior written permission.
19+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22+
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23+
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24+
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25+
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26+
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27+
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28+
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29+
POSSIBILITY OF SUCH DAMAGE.
30+
-->
131
<library path="j100_hardware">
232
<class name="clearpath_platform/J100Hardware"
333
type="clearpath_platform::J100Hardware"
@@ -6,4 +36,4 @@
636
The ros2_control J100Hardware using a system hardware interface-type.
737
</description>
838
</class>
9-
</library>
39+
</library>

clearpath_platform/launch/platform.launch.py

+29
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,31 @@
1+
# Software License Agreement (BSD)
2+
#
3+
# @author Tony Baltovski <[email protected]>
4+
# @author Roni Kreinin <[email protected]>
5+
# @copyright (c) 2023, Clearpath Robotics, Inc., All rights reserved.
6+
#
7+
# Redistribution and use in source and binary forms, with or without
8+
# modification, are permitted provided that the following conditions are met:
9+
# * Redistributions of source code must retain the above copyright notice,
10+
# this list of conditions and the following disclaimer.
11+
# * Redistributions in binary form must reproduce the above copyright notice,
12+
# this list of conditions and the following disclaimer in the documentation
13+
# and/or other materials provided with the distribution.
14+
# * Neither the name of Clearpath Robotics nor the names of its contributors
15+
# may be used to endorse or promote products derived from this software
16+
# without specific prior written permission.
17+
#
18+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28+
# POSSIBILITY OF SUCH DAMAGE.
129
from launch import LaunchDescription
230
from launch.actions import DeclareLaunchArgument, ExecuteProcess, GroupAction, IncludeLaunchDescription, LogInfo
331
from launch.conditions import LaunchConfigurationEquals
@@ -6,6 +34,7 @@
634
from launch_ros.actions import Node
735
from launch_ros.substitutions import FindPackageShare
836

37+
938
def generate_launch_description():
1039

1140
# Packages

clearpath_platform/package.xml

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
<author email="[email protected]">Roni Kreinin</author>
1111
<author email="[email protected]">Tony Baltovski</author>
1212

13+
<maintainer email="[email protected]">Luis Camero</maintainer>
1314
<maintainer email="[email protected]">Roni Kreinin</maintainer>
1415
<maintainer email="[email protected]">Tony Baltovski</maintainer>
1516

clearpath_platform/scripts/install

100755100644
+29-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,31 @@
11
#!/usr/bin/env python3
2+
# Software License Agreement (BSD)
3+
#
4+
# @author Roni Kreinin <[email protected]>
5+
# @copyright (c) 2023, Clearpath Robotics, Inc., All rights reserved.
6+
#
7+
# Redistribution and use in source and binary forms, with or without
8+
# modification, are permitted provided that the following conditions are met:
9+
# * Redistributions of source code must retain the above copyright notice,
10+
# this list of conditions and the following disclaimer.
11+
# * Redistributions in binary form must reproduce the above copyright notice,
12+
# this list of conditions and the following disclaimer in the documentation
13+
# and/or other materials provided with the distribution.
14+
# * Neither the name of Clearpath Robotics nor the names of its contributors
15+
# may be used to endorse or promote products derived from this software
16+
# without specific prior written permission.
17+
#
18+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28+
# POSSIBILITY OF SUCH DAMAGE.
229

330
import robot_upstart
431

@@ -79,10 +106,10 @@ class RobotProvider(robot_upstart.providers.Generic):
79106
'services/clearpath-robot.service')
80107
robot_service_execpre_contents_path = os.path.join(
81108
get_package_share_directory('clearpath_platform'),
82-
'scripts/generate.sh')
109+
'scripts/generate')
83110
robot_service_exec_contents_path = os.path.join(
84111
get_package_share_directory('clearpath_platform'),
85-
'scripts/check.sh')
112+
'scripts/check')
86113

87114
with open(robot_service_path) as f:
88115
robot_service_contents = f.read()
+69
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
sick_scan:
2+
ros__parameters:
3+
intensity: false
4+
intensity_resolution_16bit: false
5+
min_ang: -2.35619
6+
max_ang: 2.35619
7+
frame_id: cloud
8+
use_binary_protocol: true
9+
scanner_type: sick_lms_1xx
10+
11+
# Optional range filter configuration: If the range of a scan point is less than range_min or greater than range_max, the point can be filtered.
12+
# Depending on parameter range_filter_handling, the following filter can be applied for points with a range not within [range_min, range_max],
13+
# see enumeration RangeFilterResultHandling in range_filter.h:
14+
# 0: RANGE_FILTER_DEACTIVATED, do not apply range filter (default)
15+
# 1: RANGE_FILTER_DROP, drop point, if range is not within [range_min, range_max]
16+
# 2: RANGE_FILTER_TO_ZERO, set range to 0, if range is not within [range_min, range_max]
17+
# 3: RANGE_FILTER_TO_RANGE_MAX, set range to range_max, if range is not within [range_min, range_max]
18+
# 4: RANGE_FILTER_TO_FLT_MAX, set range to FLT_MAX, if range is not within [range_min, range_max]
19+
# 5: RANGE_FILTER_TO_NAN set range to NAN, if range is not within [range_min, range_max]
20+
# Note: Range filter applies only to Pointcloud messages, not to LaserScan messages.
21+
# Using range_filter_handling 4 or 5 requires handling of FLT_MAX and NAN values in an application.
22+
range_min: 0.05
23+
range_max: 25.0
24+
range_filter_handling: 0
25+
26+
hostname: 192.168.0.1
27+
cloud_topic: cloud
28+
port: 2112
29+
timelimit: 5
30+
sw_pll_only_publish: true
31+
use_generation_timestamp: true # Use the lidar generation timestamp (true, default) or send timestamp (false) for the software pll converted message timestamp
32+
start_services: true # start ros service for cola commands
33+
activate_lferec: true # activate field monitoring by lferec messages
34+
activate_lidoutputstate: true # activate field monitoring by lidoutputstate messages
35+
activate_lidinputstate: true # activate field monitoring by lidinputstate messages
36+
min_intensity: 0.0 # Set range of LaserScan messages to infinity, if intensity < min_intensity (default: 0)
37+
38+
ang_res: 0.5 # Supported values are "0.25" and "0.50"
39+
scan_freq: 50 # Supported values are "25" and "50"
40+
# Note: angular resolution and scanning frequency of a LMS111 can be configured by parameter "ang_res" (values "0.25" or "0.5") and "scan_freq" (values "25" or "50")
41+
# After setting "ang_res" and "scan_freq", it takes ca. 30 seconds until the pointcloud is published.
42+
# Recommendation: It is recommended to specify the desired angular resolution and scan rate in this launch file.
43+
# In this case, it is necessary to wait approx. 30 sec. until the Lidar changes to status "OK".
44+
# Alternatively, these settings can be configured in SOPAS-ET, transferred to the EEProm of the lidar and
45+
# then permanently stored. In this case, the explicit specification of scan rate and angular resolution
46+
# can be omitted and the waiting time can be avoided.
47+
48+
# Apply an additional transform to the cartesian pointcloud, default: "0,0,0,0,0,0" (i.e. no transform)
49+
# Note: add_transform_xyz_rpy is specified by 6D pose x, y, z, roll, pitch, yaw in [m] resp. [rad]
50+
# It transforms a 3D point in cloud coordinates to 3D point in user defined world coordinates:
51+
# add_transform_xyz_rpy := T[world,cloud] with parent "world" and child "cloud", i.e. P_world = T[world,cloud] * P_cloud
52+
# The additional transform applies to cartesian lidar pointclouds and visualization marker (fields)
53+
# It is NOT applied to polar pointclouds, radarscans, ldmrs objects or other messages
54+
add_transform_xyz_rpy: "0,0,0,0,0,0"
55+
add_transform_check_dynamic_updates: false
56+
57+
message_monitoring_enabled: true # Enable message monitoring with reconnect+reinit in case of timeouts, default: true
58+
read_timeout_millisec_default: 5000 # 5 sec read timeout in operational mode (measurement mode), default: 5000 milliseconds
59+
read_timeout_millisec_startup: 120000 # 120 sec read timeout during startup (sensor may be starting up, which can take up to 120 sec.), default: 120000 milliseconds
60+
read_timeout_millisec_kill_node: 150000 # 150 sec pointcloud timeout, ros node will be killed if no point cloud published within the last 150 sec., default: 150000 milliseconds
61+
client_authorization_pw: F4724744 # Default password for client authorization
62+
63+
# Configuration of ROS quality of service:
64+
# On ROS-1, parameter "ros_qos" sets the queue_size of ros publisher
65+
# On ROS-2, parameter "ros_qos" sets the QoS of ros publisher to one of the following predefined values:
66+
# 0: rclcpp::SystemDefaultsQoS(), 1: rclcpp::ParameterEventsQoS(), 2: rclcpp::ServicesQoS(), 3: rclcpp::ParametersQoS(), 4: rclcpp::SensorDataQoS()
67+
# See e.g. https://docs.ros2.org/dashing/api/rclcpp/classrclcpp_1_1QoS.html#ad7e932d8e2f636c80eff674546ec3963 for further details about ROS2 QoS
68+
# Default value is -1, i.e. queue_size=10 on ROS-1 resp. qos=rclcpp::SystemDefaultsQoS() on ROS-2 is used.
69+
ros_qos: -1

clearpath_sensors/launch/hokuyo_ust10.launch.py

+27
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,30 @@
1+
# Software License Agreement (BSD)
2+
#
3+
# @author Roni Kreinin <[email protected]>
4+
# @copyright (c) 2023, Clearpath Robotics, Inc., All rights reserved.
5+
#
6+
# Redistribution and use in source and binary forms, with or without
7+
# modification, are permitted provided that the following conditions are met:
8+
# * Redistributions of source code must retain the above copyright notice,
9+
# this list of conditions and the following disclaimer.
10+
# * Redistributions in binary form must reproduce the above copyright notice,
11+
# this list of conditions and the following disclaimer in the documentation
12+
# and/or other materials provided with the distribution.
13+
# * Neither the name of Clearpath Robotics nor the names of its contributors
14+
# may be used to endorse or promote products derived from this software
15+
# without specific prior written permission.
16+
#
17+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
21+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27+
# POSSIBILITY OF SUCH DAMAGE.
128
from launch import LaunchDescription
229
from launch.actions import DeclareLaunchArgument
330
from launch.substitutions import LaunchConfiguration, PathJoinSubstitution

0 commit comments

Comments
 (0)