Getting R and Java 1.8 to work together on OSX

Hey Mac OSX users with Java 1.8 installed. Did R just request a Java 1.6 installation and then promptly crash your session?  If so, read on…

The Problem

A few days ago I was attempting to use the mallet package for topic models and I found that typing

> library(mallet)

caused two things to happen:

  1. The operating system launches a dialog asking whether I would like to download Java 1.6
  2. The R session crashes (regardless of what I did about the dialog)

This seems to be a general problem for packages that depends on the rJava package.

I’m running the latest Mac OSX (Yosemite 10.10.1) and have installed the latest Java

$ java -version
java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b70, mixed mode)

and the latest R

$ R --version
R version 3.1.2 (2014-10-31) -- "Pumpkin Helmet"
Copyright (C) 2014 The R Foundation for Statistical Computing
Platform: x86_64-apple-darwin13.4.0 (64-bit)

But for some reason with R, it’s Java 1.6 (which is no longer even being updated) or bust.

The fix (maybe)

The trail of bug reports starts here, but before you delve into those and bother Simon Urbanek as much as I did, try the following:

  1. Download and install Apple’s Java version 1.6 like you were asked to.
  2. Reconfigure your R installation by typing
    sudo R CMD javareconf

    in a Terminal window. (Thanks to commenter Benjamin for pointing out that there shouldn’t have been a -n flag in this line)

  3. Trigger a recompile by reinstalling rJava by typing
    install.packages('rJava', type='source')

Now if you relauch R and load your package it should use your shiny new Java 1.8 and not crash any R sessions.

[Late addition] For this to work you may have to set (or have something else set) some environment variables too. See the comments below for my settings.

 

19 thoughts on “Getting R and Java 1.8 to work together on OSX”

  1. Thanks, Will.

    I followed the steps but found sudo R CMD javareconf -n didn’t set 1.6 as the default Java for R.

    You can point R to 1.6’s direction by setting environment variables, like

    Sys.setenv(JAVA_HOME = '/Library/Java//Home') 
    # Java 1.6 will set up the 'Home' link under /Library/Java
    Sys.setenv(LD_LIBRARY_PATH = '$LD_LIBRARY_PATH:$JAVA_HOME/lib')
    

    rJava can be loaded without any trouble after these.

    Cheers,
    Rich

  2. I was trying to get R to work with 1.8 not with the 1.6. When you followed the instructions did library(rJava) still fail, or did it just give you java 1.8?

    Your comment is reminding me that I have the lines

    export JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home"
    export LD_LIBRARY_PATH=/Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home/jre/lib/server 
    

    in my ~/.bash_profile.

    Weirdly, launched from the command line

    Sys.getenv('JAVA_HOME')
    [1] "/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home"
    > Sys.getenv('LD_LIBRARY_PATH')
    [1] "/Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home/jre/lib/server"
    

    but from inside RStudio

    > Sys.getenv('JAVA_HOME')
    [1] ""
    > Sys.getenv('LD_LIBRARY_PATH')
    [1] ":@JAVA_LD@"
    

    (still works in RStudio though.)

  3. If you look closely, you should actually run

    sudo R CMD javareconf
    

    that is, without the -n flag, which triggers a dry run and prevents any actual configuration happening.

    You may have to fix the file permissions afterwards:

    sudo find /Library/Frameworks/R.framework/Resources/etc -type f -exec chmod 664 "{}" \;
    
    1. This worked for me. I am on os x yosemite and rJava problem when I tried to install RDAVIDWebservice. After following this step (and changing the permission as suggested), I was able to install it without problem. Thank you!

  4. Hello, thanks for writing this post…it’s one of the first that comes up when Googling for “rJava” and Yosemite…for future travelers, you might want to edit your post to reflect Benjamin’s comment:

    If you look closely, you should actually run

    sudo R CMD javareconf
    that is, without the -n flag, which triggers a dry run and prevents any actual configuration happening.

    That -n flag really threw me off for about an hour.

  5. Sorry, for some reason the code snippets didn’t go through. One more try.

    Hi Will, I went through your instructions step-by-step to no avail. Worse, now rJava will no longer install. Hours later I still have no clue what is going on. I notice Sys.getenv(‘JAVA_HOME’) and Sys.getenv(‘LD_LIBRARY_PATH’) both return “” in R and RStudio. Below is the output from the reconfiguration showing the true ‘JAVA_HOME’ path. Any ideas? Thanks in advance.

    Lawrences-MacBook-Air:~ LawrenceDeGeest$ sudo R CMD javareconf
    Java interpreter : /usr/bin/java
    Java version     : 1.8.0_45
    Java home path   : /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre
    Java compiler    : /usr/bin/javac
    Java headers gen.: /usr/bin/javah
    Java archive tool: /usr/bin/jar
    Non-system Java on OS X
    
    trying to compile and link a JNI progam 
    detected JNI cpp flags    : -I$(JAVA_HOME)/../include -I$(JAVA_HOME)/../include/darwin
    detected JNI linker flags : -L$(JAVA_HOME)/lib/server -ljvm
    clang -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/../include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/../include/darwin -I/usr/local/include    -fPIC  -mtune=core2 -g -O2  -c conftest.c -o conftest.o
    clang -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/usr/local/lib -L/usr/local/lib -o conftest.so conftest.o -L/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/server -ljvm -F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework -Wl,CoreFoundation
    
    JAVA_HOME        : /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre
    Java library path: $(JAVA_HOME)/lib/server
    JNI cpp flags    : -I$(JAVA_HOME)/../include -I$(JAVA_HOME)/../include/darwin
    JNI linker flags : -L$(JAVA_HOME)/lib/server -ljvm
    Updating Java configuration in /Library/Frameworks/R.framework/Resources
    Done.
    
    1. Do you get the same result launching RStudio from the Finder as you do when you launch it from Terminal? That is, by typing: open -a RStudio

  6. Hi, I followed the instruction listed and set the env variables JAVA_HOME and LD_LIBRARY_PATH. However, when running the last step which install.packages(‘rJava’, type=’source’), I got an error that

    Unable to locate an executable at "/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/bin/javac" (-1)
    

    Any suggestion for solution?

    I am using the same configuration of R and Java. Below is the screen shot of error

    *************************************
    > install.packages('rJava', type='source')
    --- Please select a CRAN mirror for use in this session ---
    trying URL 'http://cran.cnr.Berkeley.edu/src/contrib/rJava_0.9-6.tar.gz'
    Content type 'application/x-gzip' length 567515 bytes (554 KB)
    ==================================================
    downloaded 554 KB
    
    * installing *source* package ‘rJava’ ...
    ** package ‘rJava’ successfully unpacked and MD5 sums checked
    checking for gcc... clang
    checking whether the C compiler works... yes
    checking for C compiler default output file name... a.out
    checking for suffix of executables... 
    checking whether we are cross compiling... no
    checking for suffix of object files... o
    checking whether we are using the GNU C compiler... yes
    checking whether clang accepts -g... yes
    checking for clang option to accept ISO C89... none needed
    checking how to run the C preprocessor... clang -E
    checking for grep that handles long lines and -e... /usr/bin/grep
    checking for egrep... /usr/bin/grep -E
    checking for ANSI C header files... rm: conftest.dSYM: is a directory
    rm: conftest.dSYM: is a directory
    yes
    checking for sys/wait.h that is POSIX.1 compatible... yes
    checking for sys/types.h... yes
    checking for sys/stat.h... yes
    checking for stdlib.h... yes
    checking for string.h... yes
    checking for memory.h... yes
    checking for strings.h... yes
    checking for inttypes.h... yes
    checking for stdint.h... yes
    checking for unistd.h... yes
    checking for string.h... (cached) yes
    checking sys/time.h usability... yes
    checking sys/time.h presence... yes
    checking for sys/time.h... yes
    checking for unistd.h... (cached) yes
    checking for an ANSI C-conforming const... yes
    checking whether time.h and sys/time.h may both be included... yes
    configure: checking whether clang supports static inline...
    yes
    checking whether setjmp.h is POSIX.1 compatible... yes
    checking whether sigsetjmp is declared... yes
    checking whether siglongjmp is declared... yes
    checking Java support in R... present:
    interpreter : '/usr/bin/java'
    archiver    : '/usr/bin/jar'
    compiler    : '/usr/bin/javac'
    header prep.: '/usr/bin/javah'
    cpp flags   : '-I/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/../include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/../include/darwin'
    java libs   : '-L/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/server -ljvm'
    checking whether Java run-time works... yes
    checking whether -Xrs is supported... yes
    checking whether JNI programs can be compiled... yes
    checking JNI data types... ok
    checking whether JRI should be compiled (autodetect)... yes
    checking whether debugging output should be enabled... no
    checking whether memory profiling is desired... no
    checking whether threads support is requested... no
    checking whether callbacks support is requested... no
    checking whether JNI cache support is requested... no
    checking whether headless init is enabled... yes
    checking whether JRI is requested... yes
    configure: creating ./config.status
    config.status: creating src/Makevars
    config.status: creating R/zzz.R
    config.status: creating src/config.h
    === configuring in jri (/private/var/folders/hm/4tgj4t6170bb9psty_sn1bl02hl9y4/T/Rtmp9hyY8o/R.INSTALL1e1cc9e4b0e/rJava/jri)
    configure: running /bin/sh ./configure --disable-option-checking '--prefix=/usr/local'  --cache-file=/dev/null --srcdir=.
    checking build system type... i386-apple-darwin14.4.0
    checking host system type... i386-apple-darwin14.4.0
    checking for gcc... clang
    checking for C compiler default output file name... a.out
    checking whether the C compiler works... yes
    checking whether we are cross compiling... no
    checking for suffix of executables... 
    checking for suffix of object files... o
    checking whether we are using the GNU C compiler... yes
    checking whether clang accepts -g... yes
    checking for clang option to accept ISO C89... none needed
    checking how to run the C preprocessor... clang -E
    checking for grep that handles long lines and -e... /usr/bin/grep
    checking for egrep... /usr/bin/grep -E
    checking for ANSI C header files... rm: conftest.dSYM: is a directory
    rm: conftest.dSYM: is a directory
    yes
    checking whether Java interpreter works... checking whether JNI programs can be compiled... yes
    checking whether JNI programs can be run... yes
    checking JNI data types... ok
    checking whether Rinterface.h exports R_CStackXXX variables... yes
    checking whether Rinterface.h exports R_SignalHandlers... yes
    configure: creating ./config.status
    config.status: creating src/Makefile
    config.status: creating Makefile
    config.status: creating run
    config.status: creating src/config.h
    ** libs
    clang -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I. -I/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/../include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/../include/darwin -I/usr/local/include -I/usr/local/include/freetype2 -I/opt/X11/include    -fPIC  -Wall -mtune=core2 -g -O2  -c Rglue.c -o Rglue.o
    Rglue.c:838:13: warning: unused function 'new_jrectRef' [-Wunused-function]
    static SEXP new_jrectRef(JNIEnv *env, jobject a, const char *sig, SEXP dim ) {
                ^
    1 warning generated.
    clang -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I. -I/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/../include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/../include/darwin -I/usr/local/include -I/usr/local/include/freetype2 -I/opt/X11/include    -fPIC  -Wall -mtune=core2 -g -O2  -c arrayc.c -o arrayc.o
    clang -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I. -I/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/../include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/../include/darwin -I/usr/local/include -I/usr/local/include/freetype2 -I/opt/X11/include    -fPIC  -Wall -mtune=core2 -g -O2  -c callJNI.c -o callJNI.o
    clang -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I. -I/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/../include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/../include/darwin -I/usr/local/include -I/usr/local/include/freetype2 -I/opt/X11/include    -fPIC  -Wall -mtune=core2 -g -O2  -c callback.c -o callback.o
    clang -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I. -I/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/../include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/../include/darwin -I/usr/local/include -I/usr/local/include/freetype2 -I/opt/X11/include    -fPIC  -Wall -mtune=core2 -g -O2  -c fields.c -o fields.o
    clang -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I. -I/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/../include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/../include/darwin -I/usr/local/include -I/usr/local/include/freetype2 -I/opt/X11/include    -fPIC  -Wall -mtune=core2 -g -O2  -c init.c -o init.o
    clang -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I. -I/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/../include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/../include/darwin -I/usr/local/include -I/usr/local/include/freetype2 -I/opt/X11/include    -fPIC  -Wall -mtune=core2 -g -O2  -c jri_glue.c -o jri_glue.o
    clang -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I. -I/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/../include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/../include/darwin -I/usr/local/include -I/usr/local/include/freetype2 -I/opt/X11/include    -fPIC  -Wall -mtune=core2 -g -O2  -c loader.c -o loader.o
    clang -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I. -I/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/../include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/../include/darwin -I/usr/local/include -I/usr/local/include/freetype2 -I/opt/X11/include    -fPIC  -Wall -mtune=core2 -g -O2  -c otables.c -o otables.o
    clang -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I. -I/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/../include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/../include/darwin -I/usr/local/include -I/usr/local/include/freetype2 -I/opt/X11/include    -fPIC  -Wall -mtune=core2 -g -O2  -c rJava.c -o rJava.o
    clang -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I. -I/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/../include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/../include/darwin -I/usr/local/include -I/usr/local/include/freetype2 -I/opt/X11/include    -fPIC  -Wall -mtune=core2 -g -O2  -c tools.c -o tools.o
    clang -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/Library/Frameworks/R.framework/Resources/lib -L/usr/local/lib -o rJava.so Rglue.o arrayc.o callJNI.o callback.o fields.o init.o jri_glue.o loader.o otables.o rJava.o tools.o -L/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/server -ljvm -F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework -Wl,CoreFoundation
    (cd ../jri && make)
    make -C src JRI.jar
    /usr/bin/javac -target 1.4 -source 1.4 -d . ../Mutex.java ../RBool.java ../RConsoleOutputStream.java ../REXP.java ../RFactor.java ../RList.java ../RMainLoopCallbacks.java ../RVector.java ../Rengine.java ../package-info.java
    Unable to locate an executable at "/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/bin/javac" (-1)
    make[2]: *** [org/rosuda/JRI/Rengine.class] Error 2
    make[1]: *** [src/JRI.jar] Error 2
    make: *** [jri] Error 2
    ERROR: compilation failed for package ‘rJava’
    * removing ‘/Library/Frameworks/R.framework/Versions/3.2/Resources/library/rJava’
    
    The downloaded source packages are in
    	‘/private/var/folders/hm/4tgj4t6170bb9psty_sn1bl02hl9y4/T/RtmpaLv6KZ/downloaded_packages’
    Warning message:
    In install.packages("rJava", type = "source") :
      installation of package ‘rJava’ had non-zero exit status
    
  7. Thank you for getting me started solving this problem on El Capitan (10.11). While I was unable to use exactly what you had here. The following allowed me to install rJava successfully.

    JAVA_HOME=/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home \
    JAVA_CPPFLAGS=-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers/ \
    r CMD javareconf

  8. From StackOverflow: On OSX El Capitan 10.11, the user doesn’t have permission to write to /usr/lib. So instead, use the following command:

    sudo ln -s $(/usr/libexec/java_home)/jre/lib/server/libjvm.dylib /usr/local/lib
    
    1. Tnx! This did the trick for me – I was getting

      unable to load shared object ‘/Library/Frameworks/R.framework/Versions/3.3/Resources/library/rJava/libs/rJava.so’.

      while loading rJava or any package that depends on it – and this linking solved the problem.

      Thanks!

  9. It all seems to be working on OS X 10.11.3 now. I could install the rJava directly using install.packages("rJava") but also by installing the R-forge latest version using the R CMD INSTALL method.

    However I am going nuts trying to figure out what is happening here when I try to use the coreNLP package.


    R version 3.2.3 (2015-12-10) -- "Wooden Christmas-Tree"
    Copyright (C) 2015 The R Foundation for Statistical Computing
    Platform: x86_64-apple-darwin13.4.0 (64-bit)

    R is free software and comes with ABSOLUTELY NO WARRANTY.
    You are welcome to redistribute it under certain conditions.
    Type 'license()' or 'licence()' for distribution details.

    Natural language support but running in an English locale

    R is a collaborative project with many contributors.
    Type 'contributors()' for more information and
    'citation()' on how to cite R or R packages in publications.

    Type 'demo()' for some demos, 'help()' for on-line help, or
    'help.start()' for an HTML browser interface to help.
    Type 'q()' to quit R.

    > require(rJava)
    Loading required package: rJava
    > require(coreNLP)
    Loading required package: coreNLP
    > initCoreNLP()
    Error in rJava::.jnew("edu.stanford.nlp.pipeline.StanfordCoreNLP", basename(path)) :
    java.lang.UnsupportedClassVersionError: edu/stanford/nlp/pipeline/StanfordCoreNLP : Unsupported major.minor version 52.0
    > sessionInfo()
    R version 3.2.3 (2015-12-10)
    Platform: x86_64-apple-darwin13.4.0 (64-bit)
    Running under: OS X 10.11.3 (El Capitan)

    locale:
    [1] en_GB.UTF-8/en_GB.UTF-8/en_GB.UTF-8/C/en_GB.UTF-8/en_GB.UTF-8

    attached base packages:
    [1] stats graphics grDevices utils datasets methods base

    other attached packages:
    [1] coreNLP_0.4-1 rJava_0.9-9

    loaded via a namespace (and not attached):
    [1] plotrix_3.6-1 XML_3.98-1.3

    My Java setup:

    KBsMBP15:/ kbenoit$ sudo R CMD javareconf
    Password:
    Java interpreter : /usr/bin/java
    Java version : 1.8.0_74
    Java home path : /Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Contents/Home/jre
    Java compiler : /usr/bin/javac
    Java headers gen.: /usr/bin/javah
    Java archive tool: /usr/bin/jar
    Non-system Java on OS X

    trying to compile and link a JNI program
    detected JNI cpp flags : -I$(JAVA_HOME)/../include -I$(JAVA_HOME)/../include/darwin
    detected JNI linker flags : -L$(JAVA_HOME)/lib/server -ljvm
    clang -I/Library/Frameworks/R.framework/Resources/include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Contents/Home/jre/../include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Contents/Home/jre/../include/darwin -I/usr/local/include -I/usr/local/include/freetype2 -I/opt/X11/include -fPIC -Wall -mtune=core2 -g -O2 -c conftest.c -o conftest.o
    clang -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/Library/Frameworks/R.framework/Resources/lib -L/usr/local/lib -o conftest.so conftest.o -L/Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Contents/Home/jre/lib/server -ljvm -F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework -Wl,CoreFoundation

    JAVA_HOME : /Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Contents/Home/jre
    Java library path: $(JAVA_HOME)/lib/server
    JNI cpp flags : -I$(JAVA_HOME)/../include -I$(JAVA_HOME)/../include/darwin
    JNI linker flags : -L$(JAVA_HOME)/lib/server -ljvm
    Updating Java configuration in /Library/Frameworks/R.framework/Resources
    Done.

  10. Phew that really helped a lot !!! successfully got java 1.8 running with Rstudio was having trouble installing packages like rJava and RWeka otherwise. Thanks a lot !

Leave a Reply

Your email address will not be published. Required fields are marked *