public class BulletDynamics extends BulletDynamics
| Modifier and Type | Field and Description |
|---|---|
static int |
_BT_USE_CENTER_LIMIT_
fills the dataBuffer and returns the struct name (and 0 on failure)
|
static int |
BT_6DOF_FLAGS_AXIS_SHIFT |
static int |
BT_6DOF_FLAGS_AXIS_SHIFT2 |
static int |
BT_6DOF_FLAGS_CFM_MOTO2
enum bt6DofFlags2
|
static int |
BT_6DOF_FLAGS_CFM_NORM
enum bt6DofFlags
|
static int |
BT_6DOF_FLAGS_CFM_STOP
enum bt6DofFlags
|
static int |
BT_6DOF_FLAGS_CFM_STOP2
enum bt6DofFlags2
|
static int |
BT_6DOF_FLAGS_ERP_MOTO2
enum bt6DofFlags2
|
static int |
BT_6DOF_FLAGS_ERP_STOP
enum bt6DofFlags
|
static int |
BT_6DOF_FLAGS_ERP_STOP2
enum bt6DofFlags2
|
static int |
BT_6DOF_FLAGS_USE_INFINITE_ERROR
enum bt6DofFlags2
|
static int |
BT_BLOCK_SOLVER
enum btConstraintSolverType
|
static int |
BT_CONETWIST_FLAGS_ANG_CFM
enum btConeTwistFlags
|
static int |
BT_CONETWIST_FLAGS_LIN_CFM
enum btConeTwistFlags
|
static int |
BT_CONETWIST_FLAGS_LIN_ERP
enum btConeTwistFlags
|
static int |
BT_CONSTRAINT_CFM
enum btConstraintParams
|
static int |
BT_CONSTRAINT_ERP
enum btConstraintParams
|
static int |
BT_CONSTRAINT_STOP_CFM
enum btConstraintParams
|
static int |
BT_CONSTRAINT_STOP_ERP
enum btConstraintParams
|
static int |
BT_CONTINUOUS_DYNAMICS_WORLD
enum btDynamicsWorldType
|
static int |
BT_DEFORMABLE_MULTIBODY_DYNAMICS_WORLD
enum btDynamicsWorldType
|
static int |
BT_DISABLE_WORLD_GRAVITY
enum btRigidBodyFlags
|
static int |
BT_DISCRETE_DYNAMICS_WORLD
enum btDynamicsWorldType
|
static int |
BT_ENABLE_GYROPSCOPIC_FORCE
enum btRigidBodyFlags
|
static int |
BT_ENABLE_GYROSCOPIC_FORCE_EXPLICIT
enum btRigidBodyFlags
|
static int |
BT_ENABLE_GYROSCOPIC_FORCE_IMPLICIT_BODY
enum btRigidBodyFlags
|
static int |
BT_ENABLE_GYROSCOPIC_FORCE_IMPLICIT_WORLD
enum btRigidBodyFlags
|
static int |
BT_GPU_DYNAMICS_WORLD
enum btDynamicsWorldType
|
static int |
BT_HINGE_FLAGS_CFM_NORM
enum btHingeFlags
|
static int |
BT_HINGE_FLAGS_CFM_STOP
enum btHingeFlags
|
static int |
BT_HINGE_FLAGS_ERP_NORM
enum btHingeFlags
|
static int |
BT_HINGE_FLAGS_ERP_STOP
enum btHingeFlags
|
static int |
BT_MLCP_SOLVER
enum btConstraintSolverType
|
static int |
BT_MULTIBODY_SOLVER
enum btConstraintSolverType
|
static int |
BT_MULTIBODYLINKFLAGS_DISABLE_ALL_PARENT_COLLISION
enum btMultiBodyLinkFlags
|
static int |
BT_MULTIBODYLINKFLAGS_DISABLE_PARENT_COLLISION
enum btMultiBodyLinkFlags
|
static int |
BT_NNCG_SOLVER
enum btConstraintSolverType
|
static int |
BT_P2P_FLAGS_CFM
enum btPoint2PointFlags
|
static int |
BT_P2P_FLAGS_ERP
enum btPoint2PointFlags
|
static int |
BT_SEQUENTIAL_IMPULSE_SOLVER
enum btConstraintSolverType
|
static int |
BT_SIMPLE_DYNAMICS_WORLD
enum btDynamicsWorldType
|
static int |
BT_SLIDER_FLAGS_CFM_DIRANG
enum btSliderFlags
|
static int |
BT_SLIDER_FLAGS_CFM_DIRLIN
enum btSliderFlags
|
static int |
BT_SLIDER_FLAGS_CFM_LIMANG
enum btSliderFlags
|
static int |
BT_SLIDER_FLAGS_CFM_LIMLIN
enum btSliderFlags
|
static int |
BT_SLIDER_FLAGS_CFM_ORTANG
enum btSliderFlags
|
static int |
BT_SLIDER_FLAGS_CFM_ORTLIN
enum btSliderFlags
|
static int |
BT_SLIDER_FLAGS_ERP_DIRANG
enum btSliderFlags
|
static int |
BT_SLIDER_FLAGS_ERP_DIRLIN
enum btSliderFlags
|
static int |
BT_SLIDER_FLAGS_ERP_LIMANG
enum btSliderFlags
|
static int |
BT_SLIDER_FLAGS_ERP_LIMLIN
enum btSliderFlags
|
static int |
BT_SLIDER_FLAGS_ERP_ORTANG
enum btSliderFlags
|
static int |
BT_SLIDER_FLAGS_ERP_ORTLIN
enum btSliderFlags
|
static int |
BT_SOFT_MULTIBODY_DYNAMICS_WORLD
enum btDynamicsWorldType
|
static int |
BT_SOFT_RIGID_DYNAMICS_WORLD
enum btDynamicsWorldType
|
static int |
BT_USE_PLACEMENT_NEW
If the platform doesn't support placement new, you can disable BT_USE_PLACEMENT_NEW
then the btAlignedObjectArray doesn't support objects with virtual methods, and non-trivial constructors/destructors
You can enable BT_USE_MEMCPY, then swapping elements in the array will use memcpy instead of operator=
see discussion here: https://bulletphysics.orgphpBB2/viewtopic.php?t=1231 and
http://www.continuousphysics.com/Bullet/phpBB2/viewtopic.php?t=1240
|
static String |
btConeTwistConstraintDataName |
static String |
btGearConstraintDataName |
static String |
btGeneric6DofConstraintDataName
2009 March: btGeneric6DofConstraint refactored by Roman Ponomarev
/** Added support for generic constraint solver through getInfo1/getInfo2 methods
|
static String |
btGeneric6DofSpring2ConstraintDataName
2009 March: btGeneric6DofConstraint refactored by Roman Ponomarev
/** Added support for generic constraint solver through getInfo1/getInfo2 methods
|
static String |
btGeneric6DofSpringConstraintDataName |
static String |
btHingeConstraintDataName |
static String |
btMultiBodyDataName
serialization data, don't change them if you are not familiar with the details of the serialization mechanisms
|
static String |
btMultiBodyLinkColliderDataName |
static String |
btMultiBodyLinkDataName |
static String |
btPoint2PointConstraintDataName
fills the dataBuffer and returns the struct name (and 0 on failure)
|
static String |
btRigidBodyDataName |
static String |
btSliderConstraintDataName
fills the dataBuffer and returns the struct name (and 0 on failure)
|
static String |
btTypedConstraintDataName |
static int |
CONETWIST_CONSTRAINT_TYPE
enum btTypedConstraintType
|
static int |
CONTACT_CONSTRAINT_TYPE
enum btTypedConstraintType
|
static int |
D6_CONSTRAINT_TYPE
enum btTypedConstraintType
|
static int |
D6_SPRING_2_CONSTRAINT_TYPE
enum btTypedConstraintType
|
static int |
D6_SPRING_CONSTRAINT_TYPE
enum btTypedConstraintType
|
static int |
FIXED_CONSTRAINT_TYPE
enum btTypedConstraintType
|
static int |
GEAR_CONSTRAINT_TYPE
enum btTypedConstraintType
|
static int |
HINGE_CONSTRAINT_TYPE
enum btTypedConstraintType
|
static int |
MAX_CONSTRAINT_TYPE
enum btTypedConstraintType
|
static int |
MAX_MULTIBODY_CONSTRAINT_TYPE
enum btTypedMultiBodyConstraintType
|
static int |
MULTIBODY_CONSTRAINT_1DOF_JOINT_MOTOR
enum btTypedMultiBodyConstraintType
|
static int |
MULTIBODY_CONSTRAINT_FIXED
enum btTypedMultiBodyConstraintType
|
static int |
MULTIBODY_CONSTRAINT_GEAR
enum btTypedMultiBodyConstraintType
|
static int |
MULTIBODY_CONSTRAINT_LIMIT
enum btTypedMultiBodyConstraintType
|
static int |
MULTIBODY_CONSTRAINT_POINT_TO_POINT
enum btTypedMultiBodyConstraintType
|
static int |
MULTIBODY_CONSTRAINT_SLIDER
enum btTypedMultiBodyConstraintType
|
static int |
MULTIBODY_CONSTRAINT_SPHERICAL_LIMIT
enum btTypedMultiBodyConstraintType
|
static int |
MULTIBODY_CONSTRAINT_SPHERICAL_MOTOR
enum btTypedMultiBodyConstraintType
|
static int |
POINT2POINT_CONSTRAINT_TYPE
enum btTypedConstraintType
|
static int |
RO_XYZ
enum RotateOrder
|
static int |
RO_XZY
enum RotateOrder
|
static int |
RO_YXZ
enum RotateOrder
|
static int |
RO_YZX
enum RotateOrder
|
static int |
RO_ZXY
enum RotateOrder
|
static int |
RO_ZYX
enum RotateOrder
|
static double |
SLIDER_CONSTRAINT_DEF_CFM |
static double |
SLIDER_CONSTRAINT_DEF_DAMPING |
static double |
SLIDER_CONSTRAINT_DEF_RESTITUTION |
static double |
SLIDER_CONSTRAINT_DEF_SOFTNESS |
static int |
SLIDER_CONSTRAINT_TYPE
enum btTypedConstraintType
|
static int |
SOLVER_ALLOW_ZERO_LENGTH_FRICTION_DIRECTIONS
enum btSolverMode
|
static int |
SOLVER_CACHE_FRIENDLY
enum btSolverMode
|
static int |
SOLVER_DISABLE_IMPLICIT_CONE_FRICTION
enum btSolverMode
|
static int |
SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION
enum btSolverMode
|
static int |
SOLVER_ENABLE_FRICTION_DIRECTION_CACHING
enum btSolverMode
|
static int |
SOLVER_FRICTION_SEPARATE
enum btSolverMode
|
static int |
SOLVER_INTERLEAVE_CONTACT_AND_FRICTION_CONSTRAINTS
enum btSolverMode
|
static int |
SOLVER_RANDMIZE_ORDER
enum btSolverMode
|
static int |
SOLVER_SIMD
enum btSolverMode
|
static int |
SOLVER_USE_2_FRICTION_DIRECTIONS
enum btSolverMode
|
static int |
SOLVER_USE_ARTICULATED_WARMSTARTING
enum btSolverMode
|
static int |
SOLVER_USE_WARMSTARTING
enum btSolverMode
|
| Constructor and Description |
|---|
BulletDynamics() |
| Modifier and Type | Method and Description |
|---|---|
static double |
btAdjustAngleToLimits(double angleInRadians,
double angleLowerLimitInRadians,
double angleUpperLimitInRadians) |
static int |
btGetConstraintIslandId2(btTypedConstraint lhs)
This file was written by Erwin Coumans
|
static int |
btGetMultiBodyConstraintIslandId(btMultiBodyConstraint lhs) |
static boolean |
btSolveDantzigLCP(int n,
double[] A,
double[] x,
double[] b,
double[] w,
int nub,
double[] lo,
double[] hi,
int[] findex,
btDantzigScratchMemory scratch) |
static boolean |
btSolveDantzigLCP(int n,
DoubleBuffer A,
DoubleBuffer x,
DoubleBuffer b,
DoubleBuffer w,
int nub,
DoubleBuffer lo,
DoubleBuffer hi,
IntBuffer findex,
btDantzigScratchMemory scratch) |
static boolean |
btSolveDantzigLCP(int n,
DoublePointer A,
DoublePointer x,
DoublePointer b,
DoublePointer w,
int nub,
DoublePointer lo,
DoublePointer hi,
IntPointer findex,
btDantzigScratchMemory scratch)
*
Open Dynamics Engine, Copyright (C) 2001,2002 Russell L.
|
static double |
gDeactivationTime()
Until we get other contributions, only use SIMD on Windows, when using Visual Studio 2008 or later, and not double precision
|
static void |
gDeactivationTime(double setter) |
static boolean |
gDisableDeactivation() |
static void |
gDisableDeactivation(boolean setter) |
static void |
resolveSingleBilateral(btRigidBody body1,
btVector3 pos1,
btRigidBody body2,
btVector3 pos2,
double distance,
btVector3 normal,
double[] impulse,
double timeStep) |
static void |
resolveSingleBilateral(btRigidBody body1,
btVector3 pos1,
btRigidBody body2,
btVector3 pos2,
double distance,
btVector3 normal,
DoubleBuffer impulse,
double timeStep) |
static void |
resolveSingleBilateral(btRigidBody body1,
btVector3 pos1,
btRigidBody body2,
btVector3 pos2,
double distance,
btVector3 normal,
DoublePointer impulse,
double timeStep)
resolveSingleBilateral is an obsolete methods used for vehicle friction between two dynamic objects
|
static double |
resolveSingleCollision(btRigidBody body1,
btCollisionObject colObj2,
btVector3 contactPositionWorld,
btVector3 contactNormalOnB,
btContactSolverInfo solverInfo,
double distance)
very basic collision resolution without friction
|
static double |
SLIDER_CONSTRAINT_DEF_CFM() |
static double |
SLIDER_CONSTRAINT_DEF_DAMPING() |
static double |
SLIDER_CONSTRAINT_DEF_RESTITUTION() |
static double |
SLIDER_CONSTRAINT_DEF_SOFTNESS() |
mappublic static final int BT_USE_PLACEMENT_NEW
public static final String btConeTwistConstraintDataName
public static final int BT_CONETWIST_FLAGS_LIN_CFM
public static final int BT_CONETWIST_FLAGS_LIN_ERP
public static final int BT_CONETWIST_FLAGS_ANG_CFM
public static final int BT_SEQUENTIAL_IMPULSE_SOLVER
public static final int BT_MLCP_SOLVER
public static final int BT_NNCG_SOLVER
public static final int BT_MULTIBODY_SOLVER
public static final int BT_BLOCK_SOLVER
public static final int SOLVER_RANDMIZE_ORDER
public static final int SOLVER_FRICTION_SEPARATE
public static final int SOLVER_USE_WARMSTARTING
public static final int SOLVER_USE_2_FRICTION_DIRECTIONS
public static final int SOLVER_ENABLE_FRICTION_DIRECTION_CACHING
public static final int SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION
public static final int SOLVER_CACHE_FRIENDLY
public static final int SOLVER_SIMD
public static final int SOLVER_INTERLEAVE_CONTACT_AND_FRICTION_CONSTRAINTS
public static final int SOLVER_ALLOW_ZERO_LENGTH_FRICTION_DIRECTIONS
public static final int SOLVER_DISABLE_IMPLICIT_CONE_FRICTION
public static final int SOLVER_USE_ARTICULATED_WARMSTARTING
public static final String btGearConstraintDataName
public static final String btGeneric6DofConstraintDataName
public static final int BT_6DOF_FLAGS_CFM_NORM
public static final int BT_6DOF_FLAGS_CFM_STOP
public static final int BT_6DOF_FLAGS_ERP_STOP
public static final int BT_6DOF_FLAGS_AXIS_SHIFT
public static final String btGeneric6DofSpring2ConstraintDataName
public static final int RO_XYZ
public static final int RO_XZY
public static final int RO_YXZ
public static final int RO_YZX
public static final int RO_ZXY
public static final int RO_ZYX
public static final int BT_6DOF_FLAGS_CFM_STOP2
public static final int BT_6DOF_FLAGS_ERP_STOP2
public static final int BT_6DOF_FLAGS_CFM_MOTO2
public static final int BT_6DOF_FLAGS_ERP_MOTO2
public static final int BT_6DOF_FLAGS_USE_INFINITE_ERROR
public static final int BT_6DOF_FLAGS_AXIS_SHIFT2
public static final String btGeneric6DofSpringConstraintDataName
public static final int _BT_USE_CENTER_LIMIT_
public static final String btHingeConstraintDataName
public static final int BT_HINGE_FLAGS_CFM_STOP
public static final int BT_HINGE_FLAGS_ERP_STOP
public static final int BT_HINGE_FLAGS_CFM_NORM
public static final int BT_HINGE_FLAGS_ERP_NORM
public static final String btPoint2PointConstraintDataName
public static final int BT_P2P_FLAGS_ERP
public static final int BT_P2P_FLAGS_CFM
public static final String btSliderConstraintDataName
public static final double SLIDER_CONSTRAINT_DEF_SOFTNESS
public static final double SLIDER_CONSTRAINT_DEF_DAMPING
public static final double SLIDER_CONSTRAINT_DEF_RESTITUTION
public static final double SLIDER_CONSTRAINT_DEF_CFM
public static final int BT_SLIDER_FLAGS_CFM_DIRLIN
public static final int BT_SLIDER_FLAGS_ERP_DIRLIN
public static final int BT_SLIDER_FLAGS_CFM_DIRANG
public static final int BT_SLIDER_FLAGS_ERP_DIRANG
public static final int BT_SLIDER_FLAGS_CFM_ORTLIN
public static final int BT_SLIDER_FLAGS_ERP_ORTLIN
public static final int BT_SLIDER_FLAGS_CFM_ORTANG
public static final int BT_SLIDER_FLAGS_ERP_ORTANG
public static final int BT_SLIDER_FLAGS_CFM_LIMLIN
public static final int BT_SLIDER_FLAGS_ERP_LIMLIN
public static final int BT_SLIDER_FLAGS_CFM_LIMANG
public static final int BT_SLIDER_FLAGS_ERP_LIMANG
public static final String btRigidBodyDataName
public static final int BT_DISABLE_WORLD_GRAVITY
public static final int BT_ENABLE_GYROSCOPIC_FORCE_EXPLICIT
public static final int BT_ENABLE_GYROSCOPIC_FORCE_IMPLICIT_WORLD
public static final int BT_ENABLE_GYROSCOPIC_FORCE_IMPLICIT_BODY
public static final int BT_ENABLE_GYROPSCOPIC_FORCE
public static final String btTypedConstraintDataName
public static final int POINT2POINT_CONSTRAINT_TYPE
public static final int HINGE_CONSTRAINT_TYPE
public static final int CONETWIST_CONSTRAINT_TYPE
public static final int D6_CONSTRAINT_TYPE
public static final int SLIDER_CONSTRAINT_TYPE
public static final int CONTACT_CONSTRAINT_TYPE
public static final int D6_SPRING_CONSTRAINT_TYPE
public static final int GEAR_CONSTRAINT_TYPE
public static final int FIXED_CONSTRAINT_TYPE
public static final int D6_SPRING_2_CONSTRAINT_TYPE
public static final int MAX_CONSTRAINT_TYPE
public static final int BT_CONSTRAINT_ERP
public static final int BT_CONSTRAINT_STOP_ERP
public static final int BT_CONSTRAINT_CFM
public static final int BT_CONSTRAINT_STOP_CFM
public static final int BT_SIMPLE_DYNAMICS_WORLD
public static final int BT_DISCRETE_DYNAMICS_WORLD
public static final int BT_CONTINUOUS_DYNAMICS_WORLD
public static final int BT_SOFT_RIGID_DYNAMICS_WORLD
public static final int BT_GPU_DYNAMICS_WORLD
public static final int BT_SOFT_MULTIBODY_DYNAMICS_WORLD
public static final int BT_DEFORMABLE_MULTIBODY_DYNAMICS_WORLD
public static final String btMultiBodyDataName
public static final String btMultiBodyLinkDataName
public static final int MULTIBODY_CONSTRAINT_LIMIT
public static final int MULTIBODY_CONSTRAINT_1DOF_JOINT_MOTOR
public static final int MULTIBODY_CONSTRAINT_GEAR
public static final int MULTIBODY_CONSTRAINT_POINT_TO_POINT
public static final int MULTIBODY_CONSTRAINT_SLIDER
public static final int MULTIBODY_CONSTRAINT_SPHERICAL_MOTOR
public static final int MULTIBODY_CONSTRAINT_FIXED
public static final int MULTIBODY_CONSTRAINT_SPHERICAL_LIMIT
public static final int MAX_MULTIBODY_CONSTRAINT_TYPE
public static final int BT_MULTIBODYLINKFLAGS_DISABLE_PARENT_COLLISION
public static final int BT_MULTIBODYLINKFLAGS_DISABLE_ALL_PARENT_COLLISION
public static final String btMultiBodyLinkColliderDataName
@Cast(value="btScalar") public static double resolveSingleCollision(btRigidBody body1, btCollisionObject colObj2, @Const @ByRef btVector3 contactPositionWorld, @Const @ByRef btVector3 contactNormalOnB, @Const @ByRef btContactSolverInfo solverInfo, @Cast(value="btScalar") double distance)
public static void resolveSingleBilateral(@ByRef btRigidBody body1, @Const @ByRef btVector3 pos1, @ByRef btRigidBody body2, @Const @ByRef btVector3 pos2, @Cast(value="btScalar") double distance, @Const @ByRef btVector3 normal, @Cast(value="btScalar*") @ByRef DoublePointer impulse, @Cast(value="btScalar") double timeStep)
public static void resolveSingleBilateral(@ByRef btRigidBody body1, @Const @ByRef btVector3 pos1, @ByRef btRigidBody body2, @Const @ByRef btVector3 pos2, @Cast(value="btScalar") double distance, @Const @ByRef btVector3 normal, @Cast(value="btScalar*") @ByRef DoubleBuffer impulse, @Cast(value="btScalar") double timeStep)
public static void resolveSingleBilateral(@ByRef btRigidBody body1, @Const @ByRef btVector3 pos1, @ByRef btRigidBody body2, @Const @ByRef btVector3 pos2, @Cast(value="btScalar") double distance, @Const @ByRef btVector3 normal, @Cast(value="btScalar*") @ByRef double[] impulse, @Cast(value="btScalar") double timeStep)
@MemberGetter public static double SLIDER_CONSTRAINT_DEF_SOFTNESS()
@MemberGetter public static double SLIDER_CONSTRAINT_DEF_DAMPING()
@MemberGetter public static double SLIDER_CONSTRAINT_DEF_RESTITUTION()
@MemberGetter public static double SLIDER_CONSTRAINT_DEF_CFM()
@Cast(value="btScalar") public static double gDeactivationTime()
public static void gDeactivationTime(double setter)
public static void gDisableDeactivation(boolean setter)
@Cast(value="btScalar") public static double btAdjustAngleToLimits(@Cast(value="btScalar") double angleInRadians, @Cast(value="btScalar") double angleLowerLimitInRadians, @Cast(value="btScalar") double angleUpperLimitInRadians)
public static int btGetConstraintIslandId2(@Const btTypedConstraint lhs)
public static int btGetMultiBodyConstraintIslandId(@Const btMultiBodyConstraint lhs)
@Cast(value="bool") public static boolean btSolveDantzigLCP(int n, @Cast(value="btScalar*") DoublePointer A, @Cast(value="btScalar*") DoublePointer x, @Cast(value="btScalar*") DoublePointer b, @Cast(value="btScalar*") DoublePointer w, int nub, @Cast(value="btScalar*") DoublePointer lo, @Cast(value="btScalar*") DoublePointer hi, IntPointer findex, @ByRef btDantzigScratchMemory scratch)
@Cast(value="bool") public static boolean btSolveDantzigLCP(int n, @Cast(value="btScalar*") DoubleBuffer A, @Cast(value="btScalar*") DoubleBuffer x, @Cast(value="btScalar*") DoubleBuffer b, @Cast(value="btScalar*") DoubleBuffer w, int nub, @Cast(value="btScalar*") DoubleBuffer lo, @Cast(value="btScalar*") DoubleBuffer hi, IntBuffer findex, @ByRef btDantzigScratchMemory scratch)
@Cast(value="bool") public static boolean btSolveDantzigLCP(int n, @Cast(value="btScalar*") double[] A, @Cast(value="btScalar*") double[] x, @Cast(value="btScalar*") double[] b, @Cast(value="btScalar*") double[] w, int nub, @Cast(value="btScalar*") double[] lo, @Cast(value="btScalar*") double[] hi, int[] findex, @ByRef btDantzigScratchMemory scratch)
Copyright © 2024. All rights reserved.