.. highlight:: bash .. _inst-guide: ##################################### Installation and Administration Guide ##################################### ******* Preface ******* Overview ======== This guide provides information about how to use the rasdaman array database system, in particular: installation and system administration. For storage of multi-dimensional array data, rasdaman can be configured to use some conventional database system (such as PostgreSQL) or use its own storage manager. For the purpose of this documentation, we will call the conventional database system to which rasdaman is interfaced the *base DBMS*, understanding that this base DBMS is in charge of all alphanumeric data maintained as relational tables or object-oriented semantic nets. This guide is specific for *rasdaman community*; for *rasdaman enterprise* (`what's the difference? `_) contact `rasdaman GmbH `_. Audience ======== The information in this manual is intended primarily for database and system administrators. Rasdaman Documentation Set ========================== This manual should be read in conjunction with the complete rasdaman documentation set which this guide is part of. The documentation set in its completeness covers all important information needed to work with the rasdaman system, such as programming and query access to databases, guidance to utilities such as *raswct*, release notes, and additional information on the rasdaman wiki. .. _sec-download-and-install: *************** Getting Started *************** There are several ways to ride rasdaman - installing from source, installing prefabricated RPM/DEB packages, or downloading a preconfectioned Virtual Machine. Make your choice below! **Hardware & Software Requirements** It is recommended to have at least 8 GB main memory. Disk space depends on the size of the databases, as well as the requirements of the base DBMS of rasdaman chosen. The footprint of the rasdaman installation itself is around 400 MB. In order to download, build, and run rasdaman, various tools and libraries are required. This varies depending on the mode of installation (:ref:`sec-system-install-packages` or :ref:`sec-system-install`). Some packages, such as HDF4, are optional. This means that the feature (e.g. support for the HDF4 data format) is not available unless its use is specified during configuration. See :ref:`sec-download-install` for more information on the cmake configure parameters. Rasdaman is continuously tested on the platforms listed below. The rasdaman code has been developed on SUN/Solaris and HP-UX originally, and has been ported to IBM AIX, SGI IRIX, and DEC Unix - but that was way back in the last millennium. - Ubuntu 20.04, 22.04 In general, compiling rasdaman should work on distributions with gcc 9.3 or later and Java 11 or later. **Alternative 1: Packages** Get preconfectioned packages for installing :ref:`sec-system-install-pkgs-rpm` on CentOS or :ref:`sec-system-install-pkgs-deb` on Debian / Ubuntu; this is the recommended way - among others because the package manager will be able to manage your installation. **Alternative 2: Guided Build** Download and compile rasdaman with the help of an :ref:`automated installer `. On supported operating systems this option works automatically out of the box, but also allows to easily adjust the build and install procedures by editing a configuration file. As such it is mainly aimed at non-developers who would like to customize their rasdaman installation to something different than the official packages. **Alternative 3: Source Code** :ref:`Download and compile rasdaman `; this is the most flexible alternative; however, it requires some experience in manual compilation and is generally done by developers who plan to contribute code to the rasdaman repository. **Alternative 4: Virtual Machine** By :ref:`downloading a Virtual Machine ` you get a fully configured system with rasdaman installed and ready to run. This alternative does not require any system administration skills other than starting the VM and working with the rasdaman services, e.g., via the OGC standards based geo service interface. **Support** Installation information, FAQs, and troubleshooting information is available on `www.rasdaman.org `__. For support in installing rasdaman and any other question you may contact rasdaman GmbH at `www.rasdaman.com `__. .. _sec-system-install-packages: Official Packages ================= This page describes installation of rasdaman RPM or Debian packages. During generation of these packages, some configuration decisions have been made (which can be chosen freely when :ref:`compiling from source `). Most importantly, the rasdaman engine in the packages uses embedded SQLite for managing its array metadata. Notice, though, that the geo service component, petascope, currently still relies on a PostgreSQL database; this is planned to be changed in the near future. .. _sec-system-install-pkgs-deb: Debian-based systems -------------------- Currently the following Debian-based distributions are supported: - Ubuntu 20.04 / 22.04 Installation ^^^^^^^^^^^^ 1. Import the rasdaman repository public key to the apt keychain: :: $ wget -O - https://download.rasdaman.org/packages/rasdaman.gpg | sudo apt-key add - .. note:: You may need to update the ca-certificates package to allow SSL-based applications (e.g. ``apt-get update`` or ``wget/curl``) to check for the authenticity of SSL connections: :: $ sudo apt-get install ca-certificates 2. Add the rasdaman repository to apt. There are three types of packages: - **stable:** these packages are only updated on stable releases of rasdaman, and hence recommended for operational production installations. .. hidden-code-block:: bash $ . /etc/os-release # provides $VERSION_CODENAME $ echo "deb [arch=amd64] https://download.rasdaman.org/packages/deb $VERSION_CODENAME stable" \ | sudo tee /etc/apt/sources.list.d/rasdaman.list - **testing:** updated more frequently with beta releases, so aimed for feature testing in non-critical installations. .. hidden-code-block:: bash $ . /etc/os-release # provides $VERSION_CODENAME $ echo "deb [arch=amd64] https://download.rasdaman.org/packages/deb $VERSION_CODENAME testing" \ | sudo tee /etc/apt/sources.list.d/rasdaman.list - **nightly:** updated nightly, so that they have the latest patches. It is not recommended to use these packages in a production installation as things could sometimes break. .. hidden-code-block:: bash $ . /etc/os-release # provides $VERSION_CODENAME $ echo "deb [arch=amd64] https://download.rasdaman.org/packages/deb $VERSION_CODENAME nightly" \ | sudo tee /etc/apt/sources.list.d/rasdaman.list 3. rasdaman can be installed now: :: $ sudo apt-get update $ sudo apt-get install rasdaman If during the install you get a prompt like the below, type **N** (default option): .. code-block:: text Configuration file `/etc/opt/rasdaman/petascope.properties' ==> Modified (by you or by a script) since installation. ==> Package distributor has shipped an updated version. What would you like to do about it ? Your options are: Y or I : install the package maintainer's version N or O : keep your currently-installed version D : show the differences between the versions Z : start a shell to examine the situation The default action is to keep your current version. *** petascope.properties (Y/I/N/O/D/Z) [default=N] ? If you are automating the installation (in a script for example), you can bypass this prompt with an apt-get option as follows: :: $ apt-get -o Dpkg::Options::="--force-confdef" install -y rasdaman You will find the rasdaman installation under ``/opt/rasdaman/``. Finally, to make rasql available on the PATH for your system user: :: $ source /etc/profile.d/rasdaman.sh 5. Check that the rasdaman server can answer queries: :: $ rasql -q 'select c from RAS_COLLECTIONNAMES as c' --out string Typical output: :: rasql: rasdaman query tool v1.0, rasdaman v10.0.0 -- generated on 26.02.2020 08:44:56. opening database RASBASE at localhost:7001...ok Executing retrieval query...ok Query result collection has 0 element(s): rasql done. 6. Check that petascope is initialized properly, typically at this URL: :: http://localhost:8080/rasdaman/ows .. _sec-system-update-pkgs-deb: Updating ^^^^^^^^ The packages are updated whenever a new rasdaman version is released. To update your installation: :: $ sudo apt-get update $ sudo service rasdaman stop $ sudo apt-get install rasdaman .. note:: You may need to update the ca-certificates package to allow SSL-based applications like ``wget/curl`` to check for the authenticity of SSL connections: :: $ sudo apt-get install ca-certificates .. _sec-system-install-pkgs-rpm: RPM-based systems ----------------- Currently no RPM-based distributions are supported. If an RPM-based OS must be used, then one way to install rasdaman is to setup the latest Ubuntu LTS in a VM or a docker container and install rasdaman packages in it. Alternatively rasdaman can be compiled from source. .. _customize-package-install: Customizing the package installation ------------------------------------ When installing or updating rasdaman from the official packages, the process can be optionally customized with an installation profile (see example `installer configuration `__). - To customize when installing rasdaman for the first time, it is necessary to first download the package install profile from `here `__. - When updating an existing rasdaman installation, you can find the default package install profile in your installation at ``/opt/rasdaman/share/rasdaman/installer/profiles/package/install.toml``. Download / copy the ``install.toml`` file to some place, e.g. ``$HOME/rasdaman_install.toml``, and make any desired changes to it before installing or updating rasdaman. Make sure that the ``RAS_INSTALL_PATH`` environment variable is set to point to the custom profile, e.g. .. code-block:: shell export RAS_INSTALL_PATH="$HOME/rasdaman_install.toml" When you install or update rasdaman afterwards, the configuration process will take the custom profile into account instead of the default one. .. _sec-system-install-administration: Running rasdaman ---------------- A ``rasdaman`` service script allows to start/stop rasdaman, e.g. :: $ service rasdaman start $ service rasdaman stop $ service rasdaman force-stop $ service rasdaman status It can be similarly referenced with ``systemctl``, e.g. :: $ systemctl start rasdaman $ systemctl stop rasdaman $ systemctl status rasdaman The service script can be customized by updating environment variables in ``/etc/default/rasdaman`` (create the file if it does not exist). The default settings can be seen below. .. hidden-code-block:: shell # rasdaman installation directory RMANHOME=/opt/rasdaman # local user running the rasdaman server RMANUSER=rasdaman # runuser, or sudo for older OS RUNUSER=runuser # login credentials for non-interactive rasdaman start/stop RASLOGIN=rasadmin:d293a15562d3e70b6fdc5ee452eaed40 # port on which clients connect to rasdaman RASMGR_PORT=7001 # options to be passed on to start_rasdaman.sh START_RASDAMAN_OPTS="-p $RASMGR_PORT" # options to be passed on to stop_rasdaman.sh STOP_RASDAMAN_OPTS="-p $RASMGR_PORT" # Java options to be passed on to embedded petascope JAVA_OPTS="-Xmx4000m" See also the dedicated pages on :ref:`configuration and log files ` and :ref:`administration `. Check :ref:`this section ` on how to start / stop the petascope component of rasdaman. .. _sec-system-install-installer: Build From Source Guided ======================== The *rasdaman installer* tool allows users to install rasdaman on a machine through a single script which wraps and hides all the :ref:`details of manual compilation ` - it can't be easier than that! And it is safe: you can inspect the script and see what's happening. Plus, you retain full control over your configuration by simply editing a JSON file. Currently, the following distributions are supported: - Debian (9, 10) - Ubuntu (16.04, 18.04, 20.04, 22.04) - CentOS (7) First-Time Installation ----------------------- Download the installer and execute it: :: $ wget https://download.rasdaman.org/installer/install.sh $ bash install.sh This creates a vanilla installation in ``/opt/rasdaman`` using reasonable default configurations from ``/tmp/rasdaman-installer/profiles/installer/default.toml`` (see the :ref:`installer configuration page ` for more details). Note that the script needs sudo rights for installing rasdaman into its proper system directory (``/opt/rasdaman``) and for installing package dependencies. If SELinux is running then likely some extra configuration is needed to get petascope run properly after the installer has finished. Continue :ref:`here ` for more details on this. Updating an Existing Installation --------------------------------- Updating a rasdaman installation (if established with the installer) is just as easy: :: $ update_rasdaman.sh That is all, follow the instructions on the screen and you should be done. .. note:: The updating feature of the installer has been introduced more recently. If you have an older installer on your system, please follow the steps for first-time installation after manually stopping rasdaman. Creating Your Own Profile ------------------------- The installer makes use of a configuration file, ``installer_profile.toml``, created during first-time rasdaman installation and reused during updates. While reasonable defaults are built in, settings can be tweaked by editing the TOML file. After establishing this file in e.g. ``/opt/rasdaman/share/rasdaman/installer/install_profile.toml``, apply it through :: $ ./install.sh -j /opt/rasdaman/share/rasdaman/installer/install_profile.toml .. _sec-system-install-installer-config: Installer configuration ----------------------- Default Installer configuration: .. hidden-code-block:: ini [general] # The user running rasdaman user = "rasdaman" # Run the installation automatically without requiring any user input auto = true # Build and install rasdaman? Updating an existing installation is supported install = true # Set to true to uninstall rasdaman; if install is enabled as well then # any existing rasdaman installation is removed first. # Important: review the [uninstall] section for customization of the uninstall process. uninstall = false # # Configure actions before rasdaman building and installation starts # [pre_install] # Install third party dependencies needed to compile / run rasdaman with # apt-get/yum for packages available in the standard package manager, or with # pip for python packages. # If this is set to false, the installer will just print the package list and # probably fail compilation or some further step if a package is missing. install_dependencies = true # # Configure how to install rasdaman # [install] # Install rasdaman from: "source" or "package" from = "source" # Target installation directory ($RMANHOME) install_path = "/opt/rasdaman/" # Database backend to use for storing RASBASE: sqlite or (deprecated) postgresql database = "sqlite" # Rasmgr port: best to stick to the default value of 7001, as otherwise it has # to be explicitly specified in clients that connect to rasdaman. rasmgr_port = 7001 [install.source] # Rasdaman sources will be fetched from this repo repository = "git://rasdaman.org/rasdaman.git" # Rasdaman version to compile, e.g. master, v9.5.0, etc. version = "master" # Generate debug-ready binaries (slower performance) debug = false # Build in strict mode (compiler warnings terminate compilation) strict = false # Apply a particular patch before building; can be a URL or a path patch = "https://rasdaman.org/patchmanager?patchop=Download+Selected-{patch_id}" # Whether to generate documentation generate_docs = false # Common servlet container settings for an externally deployed petascope/SECORE. [install.webapps] # Install Java web applications (petascope, SECORE) enable = true # Deployment type: "external" (e.g. in Tomcat), or "standalone" deployment = "external" # The options below are only taken into account for "external" deployment; # If these settings are not specified the installer will try to guess them: for # supported distributions/versions this works well. # Directory where Java web apps are deployed webapps_path = "/var/lib/tomcat7/webapps/" # Directory where the servlet container stores logs webapps_logs = "/var/log/tomcat7/" [install.webapps.petascope] # petascope will use this port when deployment is "standalone" standalone_port = 9009 # JDBC connection URL petascopedb_url = "jdbc:postgresql://localhost:5432/petascopedb" # Database username petascopedb_username = "petauser" # Database password; a random password will be generated if it is empty petascopedb_password = "" [install.webapps.secore] # SECORE will use this port when deployment is "standalone" standalone_port = 9010 # # Configure what to do after rasdaman is installed and running # [post_install] # Import demo collections (with rasdaman_insertdemo.sh) and demo coverages # (with petascope_insertdemo.sh) insert_demo = true # Run the systemtest systemtest = false # Generate a Linux package; if this is enabled then rasdaman will not be # configured to run but just compiled (dependencies needed to run rasdaman # will not be installed either) generate_package = false [post_install.package] # Profile to be used after the package is installed to configure rasdaman profile_path = "profiles/package/deb/default.toml" # Generated package details name = "rasdaman" description = """\ Rasdaman is the leading Array Database for flexible, scalable analytics of massive \ multi-dimensional array (raster) data, such as spatio-temporal datacubes.""" version = "9.5.0" # Each new package of the same version should have a progressively higher # iteration number (starting from 1); the resulting package version will # typically be - iteration = "{iteration}" vendor = "rasdaman" licence = "GPLv3" category = "devel" maintainer = "Dimitar Misev " url = "https://rasdaman.org" # # Configure rasdaman uninstall; these settings are only valid if uninstall # is set to true in the [general] section. # [uninstall] # Remove RASBASE and petascopedb? remove_data = true # Remove configuration files? remove_configs = true .. _sec-system-install: Build From Source Manually ========================== This section outlines the procedure for downloading and installing rasdaman from scratch. .. _sec-system-install-prep: Preparation ----------- Create Dedicated User ^^^^^^^^^^^^^^^^^^^^^ While rasdaman can be installed and run under any operating system user, for security reasons it is strongly recommended to create a dedicated user to shield rasdaman activity (e.g., log files) from the rest of the system. This user can be named ``rasdaman``, but any other (pre-existing or newly established) user will do as well; in this case, adjust the commands listed in the sequel where necessary. In the sequel it will be assumed that a user account named ``rasdaman`` has been created, e.g. with :: $ sudo adduser rasdaman and that you are logged in as user ``rasdaman``, e.g. with this command: :: $ sudo -u rasdaman -i .. warning:: The dollar sign ("$") symbolizes the command line prompt and is not to be typed in. .. note:: As user ``rasdaman`` probably does not have sudo rights, make sure to execute the commands that require sudo with a user that has sudo rights. Create Installation Directory ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ``$RMANHOME`` is the target directory where rasdaman will be installed; by default this directory is ``/opt/rasdaman``. Make sure it exists and the rasdaman user has write access to it: :: $ export RMANHOME=/opt/rasdaman $ mkdir -p $RMANHOME $ chown rasdaman: $RMANHOME Install Required Packages ^^^^^^^^^^^^^^^^^^^^^^^^^ **build tools:** * *git* -- needed to clone the rasdaman git repository * *cmake* -- for generating the makefiles needed to compile rasdaman * *make*, *libtool*, *pkg-config* -- general tools needed to configure and compile rasdaman * *flex*, *bison*, *g++*, *libstdc++* -- required for compilation of the C++ codebase * *unzip*, *curl* -- for compiling 3rd party dependencies of rasnet (grpc and protobuf) * *maven2*, *OpenJDK 7+* -- required for compilation of the Java code (Java client API, petascope OGC frontend, SECORE) **general libraries:** * *libssl-dev*, *libedit-dev*, *libreadline-dev*, *libboost-dev* (v1.48+), *libffi-dev* -- required for various system tasks * *libgdal-dev* -- required for data format support (TIFF, JPEG, PNG, `etc. `_) **database stuff:** Pick one option below for rasdaman storage: * *libsqlite*, *libsqlite-dev*, *sqlite3* -- required for storing arrays in a filesystem directory and the rasdaman technical metadata in SQLite; see :ref:`details `; note that petascope currently requires PostgreSQL independently from the PostgreSQL / file system array decision - in other words: even if for the array engine you chose to not use PostgreSQL you currently still need to install it for storing the geo metadata making an array an OGC coverage) * *libecpg-dev*, *postgresql* -- required for `PostgreSQL `_ to hold rasdaman arrays and/or petascope geo metadata **optional packages:** * *libnetcdf-dev*, *python-netcdf4* -- required for NetCDF support * *libeccodes-dev*, *libgrib2c-dev* -- for GRIB data support * *libhdf4-dev* -- required for HDF4 support * *libtiff-dev*, *libjpeg-dev*, *ligpng-dev* - internal encoder/decoder implementations for TIFF, JPEG, or PNG formants. * *libdw-dev* / *elfutils-devel* -- for segfault stacktraces, useful in development * *sphinx*, *sphinx_rtd_theme*, *latexmk*, *texlive* -- main HTML / PDF documentation * *doxygen* -- generate C++ API documentation * *r-base*, *r-base-dev* -- required for :ref:`sec-rrasdaman-install`, an R package providing database interface for rasdaman * *performance boosters and additional service components* offered by `rasdaman GmbH `__ **geo data support** (optional): * `Tomcat `_ (or another suitable servlet container) -- required for running the petascope and SECORE Java web applications, unless they are configured to start in standalone mode * *python3* -- Python 3.6+ to run `wcst_import `, a tool for importing geo-referenced data into rasdaman / petascope * *python3-pip*, *python3-setuptools*, *python3-wheel* -- required to install Python dependencies for wcst_import * *python-dateutil*, *lxml*, *numpy*, *netCDF4*, *GDAL*, *pygrib*, *jsonschema* -- Python 3 dependencies for wcst_import, best installed with pip3 Installation commands for the packages is depending on the platform used, here is a guidance for some of the most frequently used. .. note:: When installing the GDAL Python bindings with ``pip3 install --user GDAL==...``, it is possible to come across an error similar to ``cpl_port.h: No such file or directory``. To fix it, search for cpl_port.h on your system, e.g. ``find / -name cpl_port.h``; normally it will be in ``/usr/include/gdal``. Then retry the same pip3 command installing *only* GDAL, with additional ``--global-option`` arguments: :: $ pip3 install --user --global-option=build_ext \ --global-option="-I/usr/include/gdal" GDAL==... Ubuntu 20.04 ~~~~~~~~~~~~ .. hidden-code-block:: bash # To build rasdaman $ sudo apt install --no-install-recommends \ make libtool gawk autoconf automake bison flex git g++ unzip libpng-dev \ libjpeg-dev libboost-filesystem-dev libboost-thread-dev libboost-system-dev \ libtiff-dev libgdal-dev zlib1g-dev libffi-dev libboost-dev libnetcdf-dev \ libedit-dev libreadline-dev libdw-dev libsqlite3-dev libgrib2c-dev curl \ libssl-dev libeccodes-dev cmake ccache # To build Java components $ sudo apt install default-jdk-headless maven ant libgdal-java # To generate HTML documentation $ pip3 install --user sphinx sphinx_rtd_theme # To generate PDF documentation (in addition to above) $ sudo apt install --no-install-recommends latexmk texlive-latex-base \ texlive-fonts-recommended texlive-latex-extra # To generate C++ API documentation $ sudo apt install --no-install-recommends doxygen # To run rasdaman $ sudo apt install \ postgresql postgresql-contrib sqlite3 zlib1g libdw1 gdal-bin debianutils \ libedit-dev libnetcdf-dev python3-pip python3-setuptools python3-wheel \ libreadline-dev libssl1.1 libeccodes0 # To run Java components $ sudo apt install default-jre-headless libgdal-java tomcat9 # To run wcst_import.sh; it is recommended to install at least Python 3.6 $ pip3 install --user jsonschema python-dateutil lxml \ pyproj pygrib numpy netCDF4==1.3.1 GDAL==3.0.4 # To run rasdapy $ pip3 install --user grpcio==1.30.0 protobuf==3.6.1 # To run systemtest $ sudo apt install bc vim-common valgrind netcdf-bin libpython3-dev Ubuntu 22.04 ~~~~~~~~~~~~ .. hidden-code-block:: bash # To build rasdaman $ sudo apt install --no-install-recommends make libtool gawk autoconf automake \ pkg-config bison flex git g++ unzip libpng-dev libjpeg-dev libtiff-dev \ libgdal-dev libnetcdf-dev libeccodes-dev libboost-filesystem-dev libssl-dev \ libboost-thread-dev libboost-system-dev libboost-dev zlib1g-dev libffi-dev \ libedit-dev libreadline-dev libdw-dev libsqlite3-dev libgrib2c-dev curl # To build Java components $ sudo apt install default-jdk-headless maven ant # To generate HTML/PDF and C++ API documentation $ sudo apt install latexmk tex-gyre python3-sphinx python3-sphinx-rtd-theme \ texlive-latex-base texlive-fonts-recommended texlive-latex-extra doxygen # To run rasdaman $ sudo apt install sqlite3 zlib1g libdw1 debianutils sudo libssl3 gdal-bin \ libnetcdf-dev libgdal-dev libeccodes0 libreadline-dev libedit-dev \ python3-jsonschema python3-dateutil python3-lxml python3-grib python3-numpy \ python3-netcdf4 python3-pyproj # To run Java components $ sudo apt install postgresql postgresql-contrib default-jre-headless # To run systemtest $ sudo apt install bc vim-common valgrind netcdf-bin gdal-bin python3-protobuf \ python3-pip jq $ pip3 install grpcio pylint==2.13.4 .. note:: Two files - *gdal.jar* and *libgdalalljni.so*, are absent in Ubuntu 22.04. You need to manually paste *gdal.jar* at ``/usr/share/java`` and *libgdalalljni.so* at ``/usr/lib/jni/`` for a successful build. You can find these files here: https://download.rasdaman.org/installer/tpinstaller/ubuntu2204/ .. _sec-download-install: Download and Install rasdaman ----------------------------- Download ^^^^^^^^ You can get a complete *rasdaman Community* distribution from `www.rasdaman.org `__ by executing the following command: :: $ git clone git://rasdaman.org/rasdaman.git This will create a sub-directory rasdaman in your current working directory. Configure ^^^^^^^^^ Change into the newly cloned directory: :: $ cd rasdaman Optionally, select a tagged stable release. To activate a `particular tagged version `_ use its name prefixed with a "v", e.g: :: $ git checkout v9.8.1 .. note:: You can list all tags with ``git tag``. The following commands will prepare for building on your system. First create a build directory: :: $ mkdir -p build $ cd build In the build directory we next execute ``cmake`` to configure how rasdaman is compiled. A typical configuration looks like this: :: $ cmake .. -DCMAKE_INSTALL_PREFIX=$RMANHOME Any missing components will be reported; if this is the case, then install the missing packages and retry configuration. The ``..`` indicates the path to the rasdaman source tree, which is now the parent directory of the ``build`` directory in which the ``cmake`` command is executed. The general *format* of invoking ``cmake`` on the command-line is as follows: :: $ cmake /path/to/rasdaman/sources [ -D