Add ROS2 Jazzy Skills, Repositories, and Nix Flake Setup

- Add Nix flake configuration (`flake.nix`, overlays, `package.nix`) for seamless package builds, dependency management, and development shell setup.
This commit is contained in:
Ilya Uraev 2025-01-23 00:11:33 +03:00 committed by Bill Finger
parent c7315a02a4
commit 7175f38b06
20 changed files with 521 additions and 3 deletions

@ -1 +1 @@
Subproject commit d3d19355683338c8c013fde5a7a5c6ebcd73d0f7
Subproject commit e192f74b8c77682dd36aca44c7be076b95d16c16

94
flake.nix Normal file
View file

@ -0,0 +1,94 @@
{
inputs = {
nix-ros-overlay.url = "github:lopsided98/nix-ros-overlay/develop";
nixpkgs.follows = "nix-ros-overlay/nixpkgs"; # IMPORTANT!!!
};
outputs = {
self,
nix-ros-overlay,
nixpkgs,
}:
nix-ros-overlay.inputs.flake-utils.lib.eachDefaultSystem (system: let
applyDistroOverlay = rosOverlay: rosPackages:
rosPackages
// builtins.mapAttrs (
rosDistro: rosPkgs:
if rosPkgs ? overrideScope
then rosPkgs.overrideScope rosOverlay
else rosPkgs
)
rosPackages;
rosDistroOverlays = self: super: {
rosPackages = applyDistroOverlay (import ./overlay.nix) super.rosPackages;
};
pkgs = import nixpkgs {
inherit system;
overlays = [
nix-ros-overlay.overlays.default
rosDistroOverlays
];
config.permittedInsecurePackages = [
"freeimage-unstable-2021-11-01"
];
};
zsh-autocompletions = pkgs.runCommand "ros-autocompletions" {} ''
for dir in {bash-completion/completions,zsh/site-functions}; do
mkdir -p $out/share/$dir
for program in {ros2,colcon,rosidl}; do
${pkgs.python3.pkgs.argcomplete}/bin/register-python-argcomplete $program > $out/share/$dir/_$program
done
done
'';
use_zsh = true;
rosDistro = "jazzy";
in {
legacyPackages = pkgs.rosPackages;
packages = builtins.intersectAttrs (import ./overlay.nix null null) pkgs.rosPackages.${rosDistro};
checks = builtins.intersectAttrs (import ./overlay.nix null null) pkgs.rosPackages.${rosDistro};
devShells.default = pkgs.mkShell {
name = "Robossembler ROS2";
packages =
[
pkgs.colcon
# ... other non-ROS packages
(with pkgs.rosPackages.${rosDistro};
buildEnv {
paths = [
ros-core
rbs-bringup
# Include simulation runtime
rbs-runtime
# robot package
rbs-arm
];
})
]
++ (
if use_zsh
then [zsh-autocompletions pkgs.zsh]
else []
);
shellHook = ''
${
if use_zsh
then ''
echo "Swithching to ZSH shell..."
export SHELL=$(which zsh)
exec zsh
''
else ''''
}
nix store gc
'';
};
});
nixConfig = {
extra-substituters = ["https://ros.cachix.org" "https://robossembler.cachix.org" "https://cuda-maintainers.cachix.org"];
extra-trusted-public-keys = [
"ros.cachix.org-1:dSyZxI8geDCJrwgvCOHDoAfOm5sV1wCPjBkKL+38Rvo="
"robossembler.cachix.org-1:56jBJHroRQSGpZFkW8XMquuzQTjAF/XTo6MogmBM7SQ="
"cuda-maintainers.cachix.org-1:0dq3bujKpuEPMCX6U4WylrUDZ9JyUG0VpVZa7CNfq5E="
];
};
}

37
overlay.nix Normal file
View file

@ -0,0 +1,37 @@
self: super: {
behaviortree-ros2 = super.callPackage ../BehaviorTree.ROS2/behaviortree_ros2/package.nix {};
btcpp-ros2-interfaces = super.callPackage ../BehaviorTree.ROS2/btcpp_ros2_interfaces/package.nix {};
btcpp-ros2-samples = super.callPackage ../BehaviorTree.ROS2/btcpp_ros2_samples/package.nix {};
cartesian-compliance-controller = super.callPackage ../cartesian_controllers/cartesian_compliance_controller/package.nix {};
cartesian-controller-base = super.callPackage ../cartesian_controllers/cartesian_controller_base/package.nix {};
cartesian-controller-handles = super.callPackage ../cartesian_controllers/cartesian_controller_handles/package.nix {};
cartesian-controller-utilities = super.callPackage ../cartesian_controllers/cartesian_controller_utilities/package.nix {};
cartesian-force-controller = super.callPackage ../cartesian_controllers/cartesian_force_controller/package.nix {};
cartesian-motion-controller = super.callPackage ../cartesian_controllers/cartesian_motion_controller/package.nix {};
cartesian-twist-controller = super.callPackage ../cartesian_controllers/cartesian_twist_controller/package.nix {};
dynmsg = super.callPackage ../dynamic_message_introspection/dynmsg/package.nix {};
dynmsg-demo = super.callPackage ../dynamic_message_introspection/dynmsg_demo/package.nix {};
dynmsg-msgs = super.callPackage ../dynamic_message_introspection/dynmsg_msgs/package.nix {};
env-manager = super.callPackage ./env_manager/env_manager/package.nix {};
env-manager-interfaces = super.callPackage ./env_manager/env_manager_interfaces/package.nix {};
gym-gz-ros-python = super.callPackage ../gym-gz/package.nix {};
rbs-arm = super.callPackage ../rbs_arm/package.nix {};
rbs-bringup = super.callPackage ./rbs_bringup/package.nix {};
rbs-bt-executor = super.callPackage ./rbs_bt_executor/package.nix {};
rbs-gripper = super.callPackage ../rbs_gripper/package.nix {};
rbs-gym = super.callPackage ./env_manager/rbs_gym/package.nix {};
rbs-perception = super.callPackage ./rbs_perception/package.nix {};
rbs-runtime = super.callPackage ./env_manager/rbs_runtime/package.nix {};
rbs-skill-interfaces = super.callPackage ./rbs_skill_interfaces/package.nix {};
rbs-skill-servers = super.callPackage ./rbs_skill_servers/package.nix {};
rbs-task-planner = super.callPackage ./rbs_task_planner/package.nix {};
rbs-utils = super.callPackage ./rbs_utils/rbs_utils/package.nix {};
rbs-utils-interfaces = super.callPackage ./rbs_utils/rbs_utils_interfaces/package.nix {};
rbss-movetopose = super.callPackage ./rbss_movetopose/package.nix {};
rbss-objectdetection = super.callPackage ./rbss_objectdetection/package.nix {};
rbss-poseestimation = super.callPackage ./rbss_poseestimation/package.nix {};
robonomics = super.callPackage ./robonomics/package.nix {};
robot-builder = super.callPackage ../robot_builder/package.nix {};
scenario = super.callPackage ../scenario/package.nix {};
test-dynmsg = super.callPackage ../dynamic_message_introspection/test_dynmsg/package.nix {};
}

42
rbs_bringup/package.nix Normal file
View file

@ -0,0 +1,42 @@
# Automatically generated by: ros2nix --distro jazzy --flake --license Apache-2.0
# Copyright 2025 None
# Distributed under the terms of the Apache-2.0 license
{
lib,
buildRosPackage,
ament-cmake,
ament-lint-auto,
ament-lint-common,
env-manager,
env-manager-interfaces,
rbs-bt-executor,
rbs-gripper,
rbs-gym,
rbs-perception,
rbs-runtime,
rbs-simulation,
rbs-skill-interfaces,
rbs-skill-servers,
rbs-utils,
rbs-utils-interfaces,
rbss-movetopose,
rbss-objectdetection,
rbss-poseestimation,
robot-builder,
}:
buildRosPackage rec {
pname = "ros-jazzy-rbs-bringup";
version = "0.0.0";
src = ./.;
buildType = "ament_cmake";
buildInputs = [ament-cmake env-manager env-manager-interfaces rbs-bt-executor rbs-gripper rbs-gym rbs-perception rbs-runtime rbs-simulation rbs-skill-interfaces rbs-skill-servers rbs-utils rbs-utils-interfaces rbss-movetopose rbss-objectdetection rbss-poseestimation robot-builder];
checkInputs = [ament-lint-auto ament-lint-common];
nativeBuildInputs = [ament-cmake];
meta = {
description = "TODO: Package description";
license = with lib.licenses; [asl20];
};
}

View file

@ -11,6 +11,13 @@
<depend>nav2_common</depend>
<build_depend>rbs_bt_executor</build_depend>
<build_depend>rbs_perception</build_depend>
<build_depend>rbs_skill_interfaces</build_depend>
<build_depend>rbs_skill_servers</build_depend>
<build_depend>rbs_utils</build_depend>
<build_depend>rbs_utils_interfaces</build_depend>
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>

View file

@ -0,0 +1,23 @@
# Automatically generated by: ros2nix --distro jazzy --flake --license Apache-2.0
# Copyright 2025 None
# Distributed under the terms of the Apache-2.0 license
{ lib, buildRosPackage, ament-cmake, ament-cmake-python, ament-lint-auto, ament-lint-common, behaviortree-cpp, behaviortree-ros2, control-msgs, env-manager-interfaces, geometry-msgs, lifecycle-msgs, moveit-core, moveit-ros-planning, moveit-ros-planning-interface, rbs-skill-interfaces, rbs-utils, rclpy }:
buildRosPackage rec {
pname = "ros-jazzy-rbs-bt-executor";
version = "0.0.0";
src = ./.;
buildType = "ament_cmake";
buildInputs = [ ament-cmake ament-cmake-python ];
checkInputs = [ ament-lint-auto ament-lint-common ];
propagatedBuildInputs = [ behaviortree-cpp behaviortree-ros2 control-msgs env-manager-interfaces geometry-msgs lifecycle-msgs moveit-core moveit-ros-planning moveit-ros-planning-interface rbs-skill-interfaces rbs-utils rclpy ];
nativeBuildInputs = [ ament-cmake ament-cmake-python ];
meta = {
description = "TODO: Package description";
license = with lib.licenses; [ "TODO-License-declaration" ];
};
}

View file

@ -10,6 +10,11 @@
<buildtool_depend>ament_cmake</buildtool_depend>
<buildtool_depend>ament_cmake_python</buildtool_depend>
<depend>moveit_core</depend>
<depend>moveit_ros_planning</depend>
<depend>moveit_ros_planning_interface</depend>
<depend>control_msgs</depend>
<depend>rclpy</depend>
<depend>rbs_utils</depend>
<depend>rbs_skill_interfaces</depend>

View file

@ -0,0 +1,23 @@
# Automatically generated by: ros2nix --distro jazzy --flake --license Apache-2.0
# Copyright 2025 None
# Distributed under the terms of the Apache-2.0 license
{ lib, buildRosPackage, ament-cmake, ament-cmake-python, ament-lint-auto, ament-lint-common, cv-bridge, image-transport, perception-pcl, rbs-skill-interfaces, rclcpp, rclpy, sensor-msgs, std-msgs, tf2-eigen, tf2-ros, visualization-msgs }:
buildRosPackage rec {
pname = "ros-jazzy-rbs-perception";
version = "0.0.0";
src = ./.;
buildType = "ament_cmake";
buildInputs = [ ament-cmake ament-cmake-python ];
checkInputs = [ ament-lint-auto ament-lint-common ];
propagatedBuildInputs = [ cv-bridge image-transport perception-pcl rbs-skill-interfaces rclcpp rclpy sensor-msgs std-msgs tf2-eigen tf2-ros visualization-msgs ];
nativeBuildInputs = [ ament-cmake ament-cmake-python ];
meta = {
description = "An node for robot perception";
license = with lib.licenses; [ asl20 ];
};
}

View file

@ -0,0 +1,23 @@
# Automatically generated by: ros2nix --distro jazzy --flake --license Apache-2.0
# Copyright 2025 None
# Distributed under the terms of the Apache-2.0 license
{ lib, buildRosPackage, ament-cmake, ament-cmake-gtest, ament-lint-auto, ament-lint-common, geometry-msgs, moveit-msgs, rosidl-default-generators, rosidl-default-runtime, shape-msgs, std-msgs, test-msgs }:
buildRosPackage rec {
pname = "ros-jazzy-rbs-skill-interfaces";
version = "0.0.0";
src = ./.;
buildType = "ament_cmake";
buildInputs = [ ament-cmake rosidl-default-generators ];
checkInputs = [ ament-cmake-gtest ament-lint-auto ament-lint-common test-msgs ];
propagatedBuildInputs = [ geometry-msgs moveit-msgs rosidl-default-runtime shape-msgs std-msgs ];
nativeBuildInputs = [ ament-cmake rosidl-default-generators ];
meta = {
description = "TODO: Package description";
license = with lib.licenses; [ asl20 ];
};
}

View file

@ -0,0 +1,49 @@
# Automatically generated by: ros2nix --distro jazzy --flake --license Apache-2.0
# Copyright 2025 None
# Distributed under the terms of the Apache-2.0 license
{
lib,
buildRosPackage,
action-msgs,
ament-cmake,
ament-lint-auto,
ament-lint-common,
cartesian-compliance-controller,
cartesian-controller-base,
cartesian-controller-handles,
cartesian-controller-utilities,
cartesian-force-controller,
cartesian-motion-controller,
cartesian-twist-controller,
geometric-shapes,
geometry-msgs,
gz-ros2-control,
moveit-core,
moveit-msgs,
moveit-ros-planning,
moveit-ros-planning-interface,
rbs-skill-interfaces,
rbs-utils,
rclcpp,
rclcpp-action,
rclcpp-components,
tf2-eigen,
tf2-ros,
}:
buildRosPackage rec {
pname = "ros-jazzy-rbs-skill-servers";
version = "0.0.0";
src = ./.;
buildType = "ament_cmake";
buildInputs = [ament-cmake];
checkInputs = [ament-lint-auto ament-lint-common];
propagatedBuildInputs = [action-msgs cartesian-compliance-controller cartesian-controller-base cartesian-controller-handles cartesian-controller-utilities cartesian-force-controller cartesian-motion-controller cartesian-twist-controller geometric-shapes geometry-msgs gz-ros2-control moveit-core moveit-msgs moveit-ros-planning moveit-ros-planning-interface rbs-skill-interfaces rbs-utils rclcpp rclcpp-action rclcpp-components tf2-eigen tf2-ros];
nativeBuildInputs = [ament-cmake];
meta = {
description = "TODO: Package description";
license = with lib.licenses; [asl20];
};
}

View file

@ -8,11 +8,20 @@
<license>Apache-2.0</license>
<buildtool_depend>ament_cmake</buildtool_depend>
<exec_depend>ign_ros2_control</exec_depend>
<build_depend>cartesian_compliance_controller</build_depend>
<build_depend>cartesian_controller_base</build_depend>
<build_depend>cartesian_controller_handles</build_depend>
<build_depend>cartesian_controller_utilities</build_depend>
<build_depend>cartesian_force_controller</build_depend>
<build_depend>cartesian_motion_controller</build_depend>
<build_depend>cartesian_twist_controller</build_depend>
<depend>rclcpp</depend>
<depend>moveit_core</depend>
<depend>moveit_ros_planning</depend>
<depend>moveit_ros_planning_interface</depend>
<!-- <depend>moveit_servo</depend> -->
<depend>moveit_msgs</depend>
<depend>tf2_ros</depend>

View file

@ -0,0 +1,23 @@
# Automatically generated by: ros2nix --distro jazzy --flake --license Apache-2.0
# Copyright 2025 None
# Distributed under the terms of the Apache-2.0 license
{ lib, buildRosPackage, ament-cmake, ament-cmake-gtest, ament-index-cpp, ament-lint-auto, ament-lint-common, plansys2-bringup, plansys2-bt-actions, plansys2-domain-expert, plansys2-executor, plansys2-msgs, plansys2-pddl-parser, plansys2-planner, plansys2-problem-expert, plansys2-terminal, popf, test-msgs }:
buildRosPackage rec {
pname = "ros-jazzy-rbs-task-planner";
version = "0.0.1";
src = ./.;
buildType = "ament_cmake";
buildInputs = [ ament-cmake ];
checkInputs = [ ament-cmake-gtest ament-lint-auto ament-lint-common test-msgs ];
propagatedBuildInputs = [ ament-index-cpp plansys2-bringup plansys2-bt-actions plansys2-domain-expert plansys2-executor plansys2-msgs plansys2-pddl-parser plansys2-planner plansys2-problem-expert plansys2-terminal popf ];
nativeBuildInputs = [ ament-cmake ];
meta = {
description = "ROS2 task planner for manipulator";
license = with lib.licenses; [ asl20 ];
};
}

View file

@ -0,0 +1,23 @@
# Automatically generated by: ros2nix --distro jazzy --flake --license Apache-2.0
# Copyright 2025 None
# Distributed under the terms of the Apache-2.0 license
{ lib, buildRosPackage, ament-cmake, ament-lint-auto, ament-lint-common, dynmsg, dynmsg-msgs, geometry-msgs, nlohmann_json, rbs-utils-interfaces, rclcpp, rclcpp-lifecycle, rclpy, rosbag2-cpp, rosidl-default-generators, rviz-visual-tools, sensor-msgs, std-msgs, tf2-eigen, tf2-ros }:
buildRosPackage rec {
pname = "ros-jazzy-rbs-utils";
version = "0.0.0";
src = ./.;
buildType = "ament_cmake";
buildInputs = [ ament-cmake ];
checkInputs = [ ament-lint-auto ament-lint-common ];
propagatedBuildInputs = [ dynmsg dynmsg-msgs geometry-msgs nlohmann_json rbs-utils-interfaces rclcpp rclcpp-lifecycle rclpy rosbag2-cpp rosidl-default-generators rviz-visual-tools sensor-msgs std-msgs tf2-eigen tf2-ros ];
nativeBuildInputs = [ ament-cmake ];
meta = {
description = "TODO: Package description";
license = with lib.licenses; [ asl20 ];
};
}

View file

@ -9,6 +9,9 @@
<buildtool_depend>ament_cmake</buildtool_depend>
<build_depend>dynmsg</build_depend>
<build_depend>dynmsg_msgs</build_depend>
<depend>rclpy</depend>
<depend>rclcpp</depend>
<depend>rclcpp_lifecycle</depend>
@ -19,7 +22,6 @@
<depend>rosidl_default_generators</depend>
<depend>std_msgs</depend>
<depend>rbs_utils_interfaces</depend>
<depend>dynmsg</depend>
<depend>sensor_msgs</depend>
<depend>nlohmann-json-dev</depend>
<depend>rosbag2_cpp</depend>

View file

@ -0,0 +1,22 @@
# Automatically generated by: ros2nix --distro jazzy --flake --license Apache-2.0
# Copyright 2025 None
# Distributed under the terms of the Apache-2.0 license
{ lib, buildRosPackage, ament-cmake, geometry-msgs, rosidl-default-generators, rosidl-default-runtime }:
buildRosPackage rec {
pname = "ros-jazzy-rbs-utils-interfaces";
version = "0.0.0";
src = ./.;
buildType = "ament_cmake";
buildInputs = [ ament-cmake rosidl-default-generators ];
propagatedBuildInputs = [ geometry-msgs rosidl-default-runtime ];
nativeBuildInputs = [ ament-cmake rosidl-default-generators ];
meta = {
description = "Interfaces for read robossembler_db config";
license = with lib.licenses; [ asl20 ];
};
}

View file

@ -0,0 +1,23 @@
# Automatically generated by: ros2nix --distro jazzy --flake --license Apache-2.0
# Copyright 2025 None
# Distributed under the terms of the Apache-2.0 license
{ lib, buildRosPackage, ament-cmake, ament-cmake-python, ament-lint-auto, ament-lint-common, geometry-msgs, rbs-skill-interfaces, rclcpp, rclpy, std-msgs }:
buildRosPackage rec {
pname = "ros-jazzy-rbss-movetopose";
version = "0.0.1";
src = ./.;
buildType = "ament_cmake";
buildInputs = [ ament-cmake ament-cmake-python ];
checkInputs = [ ament-lint-auto ament-lint-common ];
propagatedBuildInputs = [ geometry-msgs rbs-skill-interfaces rclcpp rclpy std-msgs ];
nativeBuildInputs = [ ament-cmake ament-cmake-python ];
meta = {
description = "The Move to pose skill";
license = with lib.licenses; [ asl20 ];
};
}

View file

@ -0,0 +1,23 @@
# Automatically generated by: ros2nix --distro jazzy --flake --license Apache-2.0
# Copyright 2025 None
# Distributed under the terms of the Apache-2.0 license
{ lib, buildRosPackage, ament-cmake, ament-cmake-python, ament-lint-auto, ament-lint-common, cv-bridge, image-transport, lifecycle-msgs, rbs-skill-interfaces, rclpy, sensor-msgs, std-msgs }:
buildRosPackage rec {
pname = "ros-jazzy-rbss-objectdetection";
version = "0.0.1";
src = ./.;
buildType = "ament_cmake";
buildInputs = [ ament-cmake ament-cmake-python ];
checkInputs = [ ament-lint-auto ament-lint-common ];
propagatedBuildInputs = [ cv-bridge image-transport lifecycle-msgs rbs-skill-interfaces rclpy sensor-msgs std-msgs ];
nativeBuildInputs = [ ament-cmake ament-cmake-python ];
meta = {
description = "The Object Detection skill";
license = with lib.licenses; [ asl20 ];
};
}

View file

@ -0,0 +1,23 @@
# Automatically generated by: ros2nix --distro jazzy --flake --license Apache-2.0
# Copyright 2025 None
# Distributed under the terms of the Apache-2.0 license
{ lib, buildRosPackage, ament-cmake, ament-cmake-python, ament-lint-auto, ament-lint-common, cv-bridge, geometry-msgs, image-transport, rclpy, sensor-msgs, std-msgs }:
buildRosPackage rec {
pname = "ros-jazzy-rbss-poseestimation";
version = "0.0.1";
src = ./.;
buildType = "ament_cmake";
buildInputs = [ ament-cmake ament-cmake-python ];
checkInputs = [ ament-lint-auto ament-lint-common ];
propagatedBuildInputs = [ cv-bridge geometry-msgs image-transport rclpy sensor-msgs std-msgs ];
nativeBuildInputs = [ ament-cmake ament-cmake-python ];
meta = {
description = "The Pose Estimation skill";
license = with lib.licenses; [ asl20 ];
};
}

46
repos/nix.repos Normal file
View file

@ -0,0 +1,46 @@
repositories:
rbs_arm:
type: git
url: https://github.com/solid-sinusoid/rbs-arm.git
version: main
robot_builder:
type: git
url: https://github.com/solid-sinusoid/robot-builder.git
version: main
rbs_gripper:
type: git
url: https://github.com/solid-sinusoid/rbs-gripper.git
version: main
behavior_tree:
type: git
url: https://github.com/BehaviorTree/BehaviorTree.ROS2.git
version: humble
dynamic_message_introspection:
type: git
url: https://github.com/osrf/dynamic_message_introspection.git
version: main
robot_builder:
type: git
url: https://github.com/solid-sinusoid/robot-builder.git
version: main
cartesian_controllers:
type: git
url: https://github.com/solid-sinusoid/cartesian_controllers.git
version: gazebo-simulation
ros2_control:
type: git
url: https://github.com/solid-sinusoid/ros2_control.git
version: gz-ros2-cartesian-controllers
gz_ros2_control:
type: git
url: https://github.com/solid-sinusoid/gz_ros2_control.git
version: fts-sensor
# temporal debug repositories with nix
scenario:
type: git
url: https://seed.solid-sinusoid.com/z3RBwHLb4j66Q12dwkK1RGQj3ufhi.git
version: patches/740e5c2c969c54c0779f9511b1b1d6257fff547f
gym-gz:
type: git
url: https://seed.solid-sinusoid.com/z33HXHSaU12N1tEgJCWJpB58w4KR.git
version: patches/82421599d3f30768e20f24d24eff270643956584

21
robonomics/package.nix Normal file
View file

@ -0,0 +1,21 @@
# Automatically generated by: ros2nix --distro jazzy --flake --license Apache-2.0
# Copyright 2025 None
# Distributed under the terms of the Apache-2.0 license
{ lib, buildRosPackage, ament-copyright, ament-flake8, ament-pep257, pythonPackages, rclpy }:
buildRosPackage rec {
pname = "ros-jazzy-robonomics";
version = "0.1.0";
src = ./.;
buildType = "ament_python";
checkInputs = [ ament-copyright ament-flake8 ament-pep257 pythonPackages.pytest ];
propagatedBuildInputs = [ rclpy ];
meta = {
description = "Package for Robossember-Robonomics interoperability";
license = with lib.licenses; [ "Apache-license-2.0" ];
};
}