summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pki/CMakeLists.txt7
-rw-r--r--pki/base/common/src/CMakeLists.txt66
-rw-r--r--pki/base/java-tools/src/CMakeLists.txt33
-rw-r--r--pki/base/silent/src/CMakeLists.txt8
-rw-r--r--pki/base/util/src/CMakeLists.txt33
-rw-r--r--pki/cmake/Modules/UseJava.cmake51
-rw-r--r--pki/cmake/Modules/UseJavaClassFilelist.cmake24
-rw-r--r--pki/specs/osutil.spec4
-rw-r--r--pki/specs/pki-core.spec4
9 files changed, 163 insertions, 67 deletions
diff --git a/pki/CMakeLists.txt b/pki/CMakeLists.txt
index eca6e681d..1ec67b764 100644
--- a/pki/CMakeLists.txt
+++ b/pki/CMakeLists.txt
@@ -47,10 +47,9 @@ set(APPLICATION_VERSION_PATCH "0")
set(APPLICATION_VERSION "${APPLICATION_VERSION_MAJOR}.${APPLICATION_VERSION_MINOR}.${APPLICATION_VERSION_PATCH}")
-# where to look first for cmake modules, before ${CMAKE_ROOT}/Modules/ is checked
-set(CMAKE_MODULE_PATH
- ${CMAKE_SOURCE_DIR}/cmake/Modules
-)
+# where to look first for cmake modules
+# (before ${CMAKE_ROOT}/Modules/ is checked)
+set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/Modules)
# add definitions
include(DefineCMakeDefaults)
diff --git a/pki/base/common/src/CMakeLists.txt b/pki/base/common/src/CMakeLists.txt
index cce4d3a80..8001b5a4b 100644
--- a/pki/base/common/src/CMakeLists.txt
+++ b/pki/base/common/src/CMakeLists.txt
@@ -1,16 +1,16 @@
project(cmsutil_java Java)
-find_file(LDAPJDK_JAR
+find_file(JSS_JAR
NAMES
- ldapjdk.jar
+ jss4.jar
PATHS
/usr/lib/java
/usr/share/java
)
-find_file(XERCES_JAR
+find_file(LDAPJDK_JAR
NAMES
- xerces-j2.jar
+ ldapjdk.jar
PATHS
/usr/lib/java
/usr/share/java
@@ -24,25 +24,33 @@ find_file(OSUTIL_JAR
/usr/share/java
)
-find_file(JSS_JAR
+find_file(SERVLET_JAR
NAMES
- jss4.jar
+ servlet.jar
PATHS
/usr/lib/java
/usr/share/java
)
-find_file(SERVLET_JAR
+find_file(VELOCITY_JAR
NAMES
- servlet.jar
+ velocity.jar
PATHS
/usr/lib/java
/usr/share/java
)
-find_file(VELOCITY_JAR
+find_file(XALAN_JAR
NAMES
- velocity.jar
+ xalan-j2.jar
+ PATHS
+ /usr/lib/java
+ /usr/share/java
+)
+
+find_file(XERCES_JAR
+ NAMES
+ xerces-j2.jar
PATHS
/usr/lib/java
/usr/share/java
@@ -978,49 +986,41 @@ set(cmscore_java_SRCS
com/netscape/cmscore/time/SimpleTimeSource.java
)
-set(cmsbundle_SRCS
+set(cmsbundle_RCS
LogMessages.properties
UserMessages.properties
)
-# build crtsrv
set(CMAKE_JAVA_INCLUDE_PATH
- ${JSS_JAR} ${LDAPJDK_JAR} ${OSUTIL_JAR}
- ${NSUTIL_JAR} ${CMSUTIL_JAR} ${SERVLET_JAR})
+ ${NSUTIL_JAR} ${CMSUTIL_JAR}
+ ${LDAPJDK_JAR} ${SERVLET_JAR} ${VELOCITY_JAR} ${XALAN_JAR} ${XERCES_JAR}
+ ${JSS_JAR} ${OSUTIL_JAR} ${SYMKEY_JAR})
+
set(CMAKE_JAVA_TARGET_VERSION ${APPLICATION_VERSION})
+
+# build certsrv
+set(CMAKE_JAR_CLASSES_PREFIX com/netscape/certsrv)
add_jar(certsrv ${certsrv_java_SRCS})
add_dependencies(certsrv osutil nsutil cmsutil)
install_jar(certsrv ${JAVA_JAR_INSTALL_DIR}/pki)
set(CERTSRV_JAR ${certsrv_JAR_FILE} CACHE INTERNAL "certsrv jar file")
# build cms
-set(CMAKE_JAVA_INCLUDE_PATH
- ${JSS_JAR} ${LDAPJDK_JAR} ${OSUTIL_JAR}
- ${NSUTIL_JAR} ${CMSUTIL_JAR} ${SERVLET_JAR}
- ${VELOCITY_JAR} ${SYMKEY_JAR} ${XERCES_JAR})
-set(CMAKE_JAVA_TARGET_VERSION ${APPLICATION_VERSION})
+set(CMAKE_JAR_CLASSES_PREFIX com/netscape/cms)
add_jar(cms ${cms_java_SRCS})
-add_dependencies(cms osutil nsutil cmsutil)
+add_dependencies(cms osutil nsutil cmsutil certsrv)
install_jar(cms ${JAVA_JAR_INSTALL_DIR}/pki)
set(CMS_JAR ${cms_JAR_FILE} CACHE INTERNAL "cms jar file")
# build cmscore
-set(CMAKE_JAVA_INCLUDE_PATH
- ${JSS_JAR} ${LDAPJDK_JAR} ${OSUTIL_JAR}
- ${NSUTIL_JAR} ${CMSUTIL_JAR} ${CERTSRV_JAR}
- ${SERVLET_JAR} ${XERCES_JAR})
-set(CMAKE_JAVA_TARGET_VERSION ${APPLICATION_VERSION})
+set(CMAKE_JAR_CLASSES_PREFIX com/netscape/cmscore)
add_jar(cmscore ${cmscore_java_SRCS})
-add_dependencies(cmscore osutil nsutil cmsutil certsrv)
+add_dependencies(cmscore osutil nsutil cmsutil certsrv cms)
install_jar(cmscore ${JAVA_JAR_INSTALL_DIR}/pki)
set(CMSCORE_JAR ${cmscore_JAR_FILE} CACHE INTERNAL "cmscore jar file")
# build cmsbundle
-set(CMAKE_JAVA_INCLUDE_PATH
- ${JSS_JAR} ${LDAPJDK_JAR} ${OSUTIL_JAR}
- ${NSUTIL_JAR} ${CMSUTIL_JAR} ${SERVLET_JAR}
- ${VELOCITY_JAR} ${SYMKEY_JAR} ${XERCES_JAR})
-set(CMAKE_JAVA_TARGET_VERSION ${APPLICATION_VERSION})
-add_jar(cmsbundle ${certserv_java_SRCS} ${cms_java_SRCS} ${cmscore_java_SRCS} ${cmsbundle_SRCS})
-add_dependencies(cmsbundle osutil nsutil cmsutil)
+add_jar(cmsbundle ${cmsbundle_RCS})
+add_dependencies(cmsbundle osutil nsutil cmsutil certsrv cms cmscore)
install_jar(cmsbundle ${JAVA_JAR_INSTALL_DIR}/pki)
+set(CMSBUNDLE_JAR ${cmsbundle_JAR_FILE} CACHE INTERNAL "cmsbundle jar file")
diff --git a/pki/base/java-tools/src/CMakeLists.txt b/pki/base/java-tools/src/CMakeLists.txt
index aed40fb16..8f55b2bf1 100644
--- a/pki/base/java-tools/src/CMakeLists.txt
+++ b/pki/base/java-tools/src/CMakeLists.txt
@@ -1,5 +1,13 @@
project(pkitools_java Java)
+find_file(JSS_JAR
+ NAMES
+ jss4.jar
+ PATHS
+ /usr/lib/java
+ /usr/share/java
+)
+
find_file(OSUTIL_JAR
NAMES
osutil.jar
@@ -8,9 +16,17 @@ find_file(OSUTIL_JAR
/usr/share/java
)
-find_file(JSS_JAR
+find_file(XALAN_JAR
NAMES
- jss4.jar
+ xalan-j2.jar
+ PATHS
+ /usr/lib/java
+ /usr/share/java
+)
+
+find_file(XERCES_JAR
+ NAMES
+ xerces-j2.jar
PATHS
/usr/lib/java
/usr/share/java
@@ -40,10 +56,15 @@ set(pkitools_java_SRCS
com/netscape/cmstools/PKCS10Client.java
)
-set(CMAKE_JAVA_INCLUDE_PATH ${JSS_JAR} ${OSUTIL_JAR} ${NSUTIL_JAR} ${CMSUTIL_JAR} ${CMS_JAR})
+set(CMAKE_JAVA_INCLUDE_PATH
+ ${NSUTIL_JAR} ${CMSUTIL_JAR}
+ ${XALAN_JAR} ${XERCES_JAR}
+ ${JSS_JAR} ${OSUTIL_JAR})
+
set(CMAKE_JAVA_TARGET_VERSION ${APPLICATION_VERSION})
-add_jar(pkitools ${netscape_java_SRCS} ${pkitools_java_SRCS})
-add_dependencies(pkitools osutil nsutil cmsutil cms)
+# build pkitools
+add_jar(pkitools ${pkitools_java_SRCS})
+add_dependencies(pkitools osutil nsutil cmsutil)
install_jar(pkitools ${JAVA_JAR_INSTALL_DIR})
-set(CMSTOOLS_JAR ${pkitools_JAR_FILE} CACHE INTERNAL "pkitools jar file")
+set(PKITOOLS_JAR ${pkitools_JAR_FILE} CACHE INTERNAL "pkitools jar file")
diff --git a/pki/base/silent/src/CMakeLists.txt b/pki/base/silent/src/CMakeLists.txt
index 45644e676..f442b095b 100644
--- a/pki/base/silent/src/CMakeLists.txt
+++ b/pki/base/silent/src/CMakeLists.txt
@@ -73,11 +73,13 @@ set(silent_java_SRCS
)
set(CMAKE_JAVA_INCLUDE_PATH
- ${JSS_JAR} ${LDAPJDK_JAR} ${XERCES_JAR} ${OSUTIL_JAR} ${SYMKEY_JAR}
- ${CERTSRV_JAR} ${CMS_JAR} ${CMSUTIL_JAR} ${NSUTIL_JAR})
+ ${CERTSRV_JAR} ${CMS_JAR} ${CMSUTIL_JAR} ${NSUTIL_JAR}
+ ${LDAPJDK_JAR} ${XERCES_JAR}
+ ${JSS_JAR} ${OSUTIL_JAR} ${SYMKEY_JAR})
+
set(CMAKE_JAVA_TARGET_VERSION ${APPLICATION_VERSION})
add_jar(silent ${silent_java_SRCS})
-add_dependencies(silent osutil symkey certsrv cms cmsutil nsutil)
+add_dependencies(silent osutil symkey cmsutil nsutil certsrv cms)
install_jar(silent ${JAVA_JAR_INSTALL_DIR})
set(SILENT_JAR ${silent_JAR_FILE} CACHE INTERNAL "silent jar file")
diff --git a/pki/base/util/src/CMakeLists.txt b/pki/base/util/src/CMakeLists.txt
index 64fd28001..54a6821b3 100644
--- a/pki/base/util/src/CMakeLists.txt
+++ b/pki/base/util/src/CMakeLists.txt
@@ -1,16 +1,16 @@
project(cmsutil_java Java)
-find_file(LDAPJDK_JAR
+find_file(JSS_JAR
NAMES
- ldapjdk.jar
+ jss4.jar
PATHS
/usr/lib/java
/usr/share/java
)
-find_file(XERCES_JAR
+find_file(LDAPJDK_JAR
NAMES
- xerces-j2.jar
+ ldapjdk.jar
PATHS
/usr/lib/java
/usr/share/java
@@ -24,9 +24,17 @@ find_file(OSUTIL_JAR
/usr/share/java
)
-find_file(JSS_JAR
+find_file(XALAN_JAR
NAMES
- jss4.jar
+ xalan-j2.jar
+ PATHS
+ /usr/lib/java
+ /usr/share/java
+)
+
+find_file(XERCES_JAR
+ NAMES
+ xerces-j2.jar
PATHS
/usr/lib/java
/usr/share/java
@@ -321,15 +329,22 @@ set(cmsutil_java_SRCS
com/netscape/cmsutil/ocsp/ResponderID.java
)
-set(CMAKE_JAVA_INCLUDE_PATH ${LDAPJDK_JAR} ${XERCES_JAR} ${JSS_JAR} ${OSUTIL_JAR})
+set(CMAKE_JAVA_INCLUDE_PATH
+ ${LDAPJDK_JAR} ${XALAN_JAR} ${XERCES_JAR}
+ ${JSS_JAR} ${OSUTIL_JAR})
set(CMAKE_JAVA_TARGET_VERSION ${APPLICATION_VERSION})
+
+# build nsutil
+set(CMAKE_JAR_CLASSES_PREFIX netscape)
add_jar(nsutil ${netscape_java_SRCS})
+add_dependencies(nsutil osutil)
install_jar(nsutil ${JAVA_JAR_INSTALL_DIR}/pki)
set(NSUTIL_JAR ${nsutil_JAR_FILE} CACHE INTERNAL "nsutil jar file")
-set(CMAKE_JAVA_TARGET_VERSION ${APPLICATION_VERSION})
+# build cmsutil
+set(CMAKE_JAR_CLASSES_PREFIX com/netscape/cmsutil)
add_jar(cmsutil ${cmsutil_java_SRCS})
-add_dependencies(cmsutil osutil)
+add_dependencies(cmsutil osutil nsutil)
install_jar(cmsutil ${JAVA_JAR_INSTALL_DIR}/pki)
set(CMSUTIL_JAR ${cmsutil_JAR_FILE} CACHE INTERNAL "cmsutil jar file")
diff --git a/pki/cmake/Modules/UseJava.cmake b/pki/cmake/Modules/UseJava.cmake
index a9699285f..75dda6a4c 100644
--- a/pki/cmake/Modules/UseJava.cmake
+++ b/pki/cmake/Modules/UseJava.cmake
@@ -5,7 +5,7 @@
#
# add_jar(TARGET_NAME SRC1 SRC2 .. SRCN RCS1 RCS2 .. RCSN)
#
-# This command create a <TARGET_NAME>.jar. It compiles the given source
+# This command creates a <TARGET_NAME>.jar. It compiles the given source
# files (SRC) and adds the given resource files (RCS) to the jar file.
# If only resource files are given then just a jar file is created.
#
@@ -33,6 +33,27 @@
# set(CMAKE_JAVA_TARGET_VERSION 1.2.0)
# add_jar(shibboleet shibbotleet.java)
#
+# If the target is a JNI library, utilize the following commands to
+# create a JNI symbolic link:
+#
+# set(CMAKE_JNI_TARGET TRUE)
+# set(CMAKE_JAVA_TARGET_VERSION 1.2.0)
+# add_jar(shibboleet shibbotleet.java)
+# install_jar(shibboleet ${LIB_INSTALL_DIR}/shibboleet)
+# install_jni_symlink(shibboleet ${JAVA_LIB_INSTALL_DIR})
+#
+# If a single target needs to produce more than one jar from its
+# java source code, to prevent the accumulation of duplicate class
+# files in subsequent jars, set/reset CMAKE_JAR_CLASSES_PREFIX prior
+# to calling the add_jar() function:
+#
+# set(CMAKE_JAR_CLASSES_PREFIX com/redhat/foo)
+# add_jar(foo foo.java)
+#
+# set(CMAKE_JAR_CLASSES_PREFIX com/redhat/bar)
+# add_jar(bar bar.java)
+#
+#
# Variables set:
# The add_jar() functions sets some variables which can be used in the
# same scope where add_jar() is called.
@@ -53,10 +74,11 @@
# should be called in the same scope as add_jar() or it will fail.
#
#
-# install_symlink(TARGET_NAME DESTINATION)
+# install_jni_symlink(TARGET_NAME DESTINATION)
#
-# This command installs the TARGET_NAME symlinks to the given DESTINATION. It
-# should be called in the same scope as add_jar() or it will fail.
+# This command installs the TARGET_NAME JNI symlinks to the given
+# DESTINATION. It should be called in the same scope as add_jar()
+# or it will fail.
#
#=============================================================================
# Copyright 2010 Andreas schneider <asn@redhat.com>
@@ -162,7 +184,7 @@ function(ADD_JAR _TARGET_NAME)
# create an empty java_class_filelist
file(WRITE ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_class_filelist "")
- # Check if we have a local UseJavaClassFilelist.cmake
+ # Check if we have a local UseJavaSymlinks.cmake
if (EXISTS ${CMAKE_MODULE_PATH}/UseJavaSymlinks.cmake)
set(_JAVA_SYMLINK_SCRIPT ${CMAKE_MODULE_PATH}/UseJavaSymlinks.cmake)
elseif (EXISTS ${CMAKE_ROOT}/Modules/UseJavaSymlinks.cmake)
@@ -180,6 +202,7 @@ function(ADD_JAR _TARGET_NAME)
${_JAVA_COMPILE_FILES}
COMMAND ${CMAKE_COMMAND}
-DCMAKE_JAVA_CLASS_OUTPUT_PATH=${CMAKE_JAVA_CLASS_OUTPUT_PATH}
+ -DCMAKE_JAR_CLASSES_PREFIX="${CMAKE_JAR_CLASSES_PREFIX}"
-P ${_JAVA_CLASS_FILELIST_SCRIPT}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMENT "Building Java objects for ${_TARGET_NAME}.jar"
@@ -195,6 +218,11 @@ function(ADD_JAR _TARGET_NAME)
${_JAVA_RESOURCE_FILES} @java_class_filelist
COMMAND ${CMAKE_COMMAND}
-D_JAVA_TARGET_DIR=${CMAKE_CURRENT_BINARY_DIR}
+ -D_JAVA_TARGET_OUTPUT_NAME=${_JAVA_TARGET_OUTPUT_NAME}
+ -D_JAVA_TARGET_OUTPUT_LINK=${_JAVA_TARGET_OUTPUT_LINK}
+ -P ${_JAVA_SYMLINK_SCRIPT}
+ COMMAND ${CMAKE_COMMAND}
+ -D_JAVA_TARGET_DIR=${CMAKE_CURRENT_BINARY_DIR}
-D_JAVA_TARGET_OUTPUT_NAME=${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_NAME}
-D_JAVA_TARGET_OUTPUT_LINK=${_JAVA_TARGET_OUTPUT_LINK}
-P ${_JAVA_SYMLINK_SCRIPT}
@@ -220,16 +248,17 @@ function(ADD_JAR _TARGET_NAME)
set(${_TARGET_NAME}_INSTALL_FILES
${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_NAME}
PARENT_SCOPE)
- if (CMAKE_JNI_TARGET AND _JAVA_TARGET_OUTPUT_LINK)
- set(${_TARGET_NAME}_JNI_SYMLINK
- ${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_LINK}
- PARENT_SCOPE)
- elseif (_JAVA_TARGET_OUTPUT_LINK )
+ if (_JAVA_TARGET_OUTPUT_LINK)
set(${_TARGET_NAME}_INSTALL_FILES
${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_NAME}
${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_LINK}
PARENT_SCOPE)
- endif (CMAKE_JNI_TARGET AND _JAVA_TARGET_OUTPUT_LINK)
+ if (CMAKE_JNI_TARGET)
+ set(${_TARGET_NAME}_JNI_SYMLINK
+ ${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_LINK}
+ PARENT_SCOPE)
+ endif (CMAKE_JNI_TARGET)
+ endif (_JAVA_TARGET_OUTPUT_LINK)
set(${_TARGET_NAME}_JAR_FILE
${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_NAME} PARENT_SCOPE)
set(${_TARGET_NAME}_CLASS_DIR
diff --git a/pki/cmake/Modules/UseJavaClassFilelist.cmake b/pki/cmake/Modules/UseJavaClassFilelist.cmake
index bee84a264..bceb56ad1 100644
--- a/pki/cmake/Modules/UseJavaClassFilelist.cmake
+++ b/pki/cmake/Modules/UseJavaClassFilelist.cmake
@@ -18,6 +18,13 @@
if (CMAKE_JAVA_CLASS_OUTPUT_PATH)
if (EXISTS "${CMAKE_JAVA_CLASS_OUTPUT_PATH}")
+
+ # if it exists, obtain the length of the selected jar classes prefix
+ if (CMAKE_JAR_CLASSES_PREFIX)
+ string(LENGTH "${CMAKE_JAR_CLASSES_PREFIX}"
+ _JAR_CLASSES_PREFIX_LENGTH)
+ endif (CMAKE_JAR_CLASSES_PREFIX)
+
# glob for class files
file(GLOB_RECURSE _JAVA_GLOBBED_FILES "${CMAKE_JAVA_CLASS_OUTPUT_PATH}/*.class")
@@ -25,7 +32,22 @@ if (CMAKE_JAVA_CLASS_OUTPUT_PATH)
set(_JAVA_CLASS_FILES)
foreach(_JAVA_GLOBBED_FILE ${_JAVA_GLOBBED_FILES})
file(RELATIVE_PATH _JAVA_CLASS_FILE ${CMAKE_JAVA_CLASS_OUTPUT_PATH} ${_JAVA_GLOBBED_FILE})
- set(_JAVA_CLASS_FILES "${_JAVA_CLASS_FILES}${_JAVA_CLASS_FILE}\n")
+ if (CMAKE_JAR_CLASSES_PREFIX)
+ # extract the prefix from this java class file corresponding
+ # to the length of the selected jar classes prefix
+ string(SUBSTRING "${_JAVA_CLASS_FILE}"
+ 0 ${_JAR_CLASSES_PREFIX_LENGTH} _JAVA_CLASS_PREFIX)
+ # save this java class file ONLY if its prefix is the
+ # same as the selected java classes prefix
+ if (_JAVA_CLASS_PREFIX STREQUAL CMAKE_JAR_CLASSES_PREFIX)
+ set(_JAVA_CLASS_FILES
+ "${_JAVA_CLASS_FILES}${_JAVA_CLASS_FILE}\n")
+ endif (_JAVA_CLASS_PREFIX STREQUAL CMAKE_JAR_CLASSES_PREFIX)
+ else ()
+ # save ALL java class files
+ set(_JAVA_CLASS_FILES
+ "${_JAVA_CLASS_FILES}${_JAVA_CLASS_FILE}\n")
+ endif (CMAKE_JAR_CLASSES_PREFIX)
endforeach(_JAVA_GLOBBED_FILE ${_JAVA_GLOBBED_FILES})
# write to file
diff --git a/pki/specs/osutil.spec b/pki/specs/osutil.spec
index 2cb41f21f..89ef80ca3 100644
--- a/pki/specs/osutil.spec
+++ b/pki/specs/osutil.spec
@@ -69,6 +69,10 @@ cd %{buildroot}%{_jnidir}
%{__rm} osutil.jar
%{__ln_s} %{_libdir}/osutil/osutil-%{version}.jar osutil.jar
+cd %{buildroot}%{_libdir}/osutil
+%{__rm} osutil.jar
+%{__ln_s} osutil-%{version}.jar osutil.jar
+
%files
%defattr(-,root,root,-)
diff --git a/pki/specs/pki-core.spec b/pki/specs/pki-core.spec
index f0115aab6..613115bb0 100644
--- a/pki/specs/pki-core.spec
+++ b/pki/specs/pki-core.spec
@@ -425,6 +425,10 @@ cd %{buildroot}%{_jnidir}
%{__rm} symkey.jar
%{__ln_s} %{_libdir}/symkey/symkey-%{version}.jar symkey.jar
+cd %{buildroot}%{_libdir}/symkey
+%{__rm} symkey.jar
+%{__ln_s} symkey-%{version}.jar symkey.jar
+
########################
## pki-native-tools ##