'I want to Install JFROG Repository manager PRO on WIndows10, but getting some error
[enter image description here][1]I downloaded the Jfrog pro version from official site which is a .zip file, I extracted the file in C directory. I have followed the steps given in Jfrog document which is on JFrog official site.
This are the steps I followed: 1.Create a JFrog Home directory and move the downloaded installer archive into that directory, for example:
mkdir jfrog
- move jfrog-artifactory-<pro|oss|cpp-ce>--windows.zip jfrog cd jfrog
- Set the JFrog Home environment variable
set JFROG_HOME= Extract the contents of the compressed archive and go to the extracted folder. Define the path to this folder as an environment variable called JFROG_HOME.
Extract jfrog-artifactory-<pro|oss|cpp-ce>--windows.zip into jfrog folder
move artifactory-<pro|oss|cpp-ce>- artifactory Install Artifactory manually or as a service. Manual Installation Browse to %JFROG_HOME%\artifactory\app\bin and execute the file artifactory.bat.
But after doing this, I launch the artifactory.bat file, but it is giving error, it is showing that the artifactoty is running sucessfully.
- After Installing I want Integrate JFrog Repository Manager with Azure DevOps Pipeline, So when I want to create Service connection in Azure DEvOps but it is giving some error.
#Logs I m getting after running Artifactory.bat
enter code here
C:_artifactory\app\bin>artifactory.bat 2022-02-17T05:03:42:50Z [INFO ] [ ] [main]- JF_PRODUCT_HOME is - "C:_artifactory 2022-02-17T05:03:42:50Z [INFO ] [artifactory.bat ] [main]- Starting all services 2022-02-17T05:03:45:50Z [WARN ] [artifactoryCommon.bat ] [main]- System.yaml validation failed The system cannot find the file specified. Could Not Find C:_artifactory\app\artifactory\tomcat\webapps\mc.war Could Not Find C:_artifactory\app\artifactory\tomcat\conf\Catalina\localhost\mc.xml 2022-02-17T05:03:47:50Z [INFO ] [artifactoryCommon.bat ] [main]- resolved artifactory.port to default value : 8081 2022-02-17T05:03:48:50Z [INFO ] [artifactoryCommon.bat ] [main]- resolved artifactory.tomcat.connector.sendReasonPhrase to default value : false 2022-02-17T05:03:48:50Z [INFO ] [artifactoryCommon.bat ] [main]- resolved artifactory.tomcat.connector.maxThreads to default value : 200 2022-02-17T05:03:49:50Z [INFO ] [artifactoryCommon.bat ] [main]- resolved artifactory.tomcat.maintenanceConnector.port to default value : 8091 2022-02-17T05:03:50:50Z [INFO ] [artifactoryCommon.bat ] [main]- resolved artifactory.tomcat.maintenanceConnector.maxThreads to default value : 5 2022-02-17T05:03:51:50Z [INFO ] [artifactoryCommon.bat ] [main]- resolved artifactory.tomcat.maintenanceConnector.acceptCount to default value : 5 2022-02-17T05:03:52:50Z [INFO ] [artifactoryCommon.bat ] [main]- resolved access.http.port to default value : 8040 2022-02-17T05:03:53:50Z [INFO ] [artifactoryCommon.bat ] [main]- resolved access.tomcat.connector.sendReasonPhrase to default value : false 2022-02-17T05:03:53:50Z [INFO ] [artifactoryCommon.bat ] [main]- resolved access.tomcat.connector.maxThreads to default value : 50 2022-02-17T05:03:55:50Z [INFO ] [artifactoryCommon.bat ] [main]- resolved JF_PRODUCT_HOME with value 'C:_artifactory' from environment variable 2022-02-17T05:03:56:50Z [INFO ] [artifactoryCommon.bat ] [main]- resolved shared.tomcat.workDir to default value : C:/_artifactory/var/work/artifactory/tomcat 2022-02-17T05:03:56:50Z [INFO ] [artifactoryCommon.bat ] [main]- Attempting to create filebeat data directory 2022-02-17T05:03:57:50Z [INFO ] [artifactoryCommon.bat ] [main]- Setting JF_SHARED_NODE_ID to AutoOpsVM1 2022-02-17T05:03:58:50Z [INFO ] [artifactoryCommon.bat ] [main]- Setting JF_SHARED_NODE_IP to 10.0.0.4 2022-02-17T05:03:58:50Z [INFO ] [artifactoryCommon.bat ] [main]- Setting JF_SHARED_NODE_NAME to AutoOpsVM1 2022-02-17T05:04:00:50Z [INFO ] [artifactory.bat ] [main]- Starting router Starting service router from C:_artifactory\app\router\bin\jf-router.exe
2022-02-17T05:04:01:50Z [INFO ] [artifactory.bat ] [main]- Starting event The system cannot find the path specified. 2022-02-17T05:04:01:50Z [INFO ] [artifactory.bat ] [main]- Starting metadata Starting service metadata from C:_artifactory\app\metadata\bin\jf-metadata.exe
2022-02-17T05:04:02:50Z [INFO ] [artifactory.bat ] [main]- JFConnect is disabled, jfconnect is not started 2022-02-17T05:04:02:50Z [INFO ] [artifactory.bat ] [main]- Starting observability Starting service observability from C:_artifactory\app\observability\bin\jf-observability.exe
2022/02/17 05:04:02 Using high precision timer 2022-02-17T05:04:04:50Z [INFO ] [artifactory.bat ] [main]- Starting integration Starting service integration from C:_artifactory\app\integration\bin\jf-integration.exe
2022-02-17T05:04:04:50Z [INFO ] [artifactory.bat ] [main]- Replicator is disabled, replicator is not started 2022-02-17T05:04:05:50Z [INFO ] [artifactory.bat ] [main]- Starting frontend Starting service frontend from "C:_artifactory\app\third-party\node\node.exe" C:_artifactory\app\frontend\bin\server\dist\startup.js C:_artifactory\app\frontend
2022-02-17T05:04:10:50Z [INFO ] [artifactory.bat ] [main]- Starting artifactory
Using CATALINA_BASE: "C:_artifactory\app\artifactory\tomcat"
Using CATALINA_HOME: "C:_artifactory\app\artifactory\tomcat"
Using CATALINA_TMPDIR: "C:_artifactory\app\artifactory\tomcat\temp"
Using JRE_HOME: "C:_artifactory\app\third-party\java"
Using CLASSPATH: "C:_artifactory\app\artifactory\tomcat\bin\bootstrap.jar;C:_artifactory\app\artifactory\tomcat\bin\tomcat-juli.jar"
Using CATALINA_OPTS: "-server -Xms512m -Xmx4g -Xss256k -XX:+UseG1GC --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/java.lang.invoke=ALL-UNNAMED --add-opens java.base/java.text=ALL-UNNAMED --add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.desktop/java.awt.font=ALL-UNNAMED -Dfile.encoding=UTF8 -Djruby.compile.invokedynamic=false -Djruby.bytecode.version=1.8 -Dartdist=zip -Djf.product.home=C:_artifactory -Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true"
NOTE: Picked up JDK_JAVA_OPTIONS: --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
2022-02-17T05:04:13.035L ←[35m[tomct]←[0m [INFO ] [ ] [org.apache.coyote.http11.Http11NioProtocol] [org.apache.coyote.AbstractProtocol init] - Initializing ProtocolHandler ["http-nio-8081"]
2022-02-17T05:04:13.786L ←[35m[tomct]←[0m [INFO ] [ ] [org.apache.tomcat.util.net.NioSelectorPool] [org.apache.tomcat.util.net.NioSelectorPool getSharedSelector] - Using a shared selector for servlet write/read
2022-02-17T05:04:13.833L ←[35m[tomct]←[0m [INFO ] [ ] [org.apache.coyote.http11.Http11NioProtocol] [org.apache.coyote.AbstractProtocol init] - Initializing ProtocolHandler ["http-nio-127.0.0.1-8091"]
2022-02-17T05:04:13.836L ←[35m[tomct]←[0m [INFO ] [ ] [org.apache.tomcat.util.net.NioSelectorPool] [org.apache.tomcat.util.net.NioSelectorPool getSharedSelector] - Using a shared selector for servlet write/read
2022-02-17T05:04:13.838L ←[35m[tomct]←[0m [INFO ] [ ] [org.apache.coyote.http11.Http11NioProtocol] [org.apache.coyote.AbstractProtocol init] - Initializing ProtocolHandler ["http-nio-127.0.0.1-8040"]
2022-02-17T05:04:13.840L ←[35m[tomct]←[0m [INFO ] [ ] [org.apache.tomcat.util.net.NioSelectorPool] [org.apache.tomcat.util.net.NioSelectorPool getSharedSelector] - Using a shared selector for servlet write/read
2022-02-17T05:04:13.860L ←[35m[tomct]←[0m [INFO ] [ ] [org.apache.catalina.core.StandardService] [org.apache.catalina.core.StandardService startInternal] - Starting service [Catalina]
2022-02-17T05:04:13.875L ←[35m[tomct]←[0m [INFO ] [ ] [org.apache.catalina.core.StandardEngine] [org.apache.catalina.core.StandardEngine startInternal] - Starting Servlet engine: [Apache Tomcat/8.5.73]
2022-02-17T05:04:13.939L ←[35m[tomct]←[0m [INFO ] [ ] [org.apache.catalina.startup.HostConfig] [org.apache.catalina.startup.HostConfig deployDescriptor] - Deploying deployment descriptor [C:_artifactory\app\artifactory\tomcat\conf\Catalina\localhost\artifactory.xml]
2022-02-17T05:04:13.939L ←[35m[tomct]←[0m [INFO ] [ ] [org.apache.catalina.startup.HostConfig] [org.apache.catalina.startup.HostConfig deployDescriptor] - Deploying deployment descriptor [C:_artifactory\app\artifactory\tomcat\conf\Catalina\localhost\access.xml]
2022-02-17T05:04:14.025L ←[35m[tomct]←[0m [WARNING] [ ] [org.apache.catalina.startup.HostConfig] [org.apache.catalina.startup.HostConfig deployDescriptor] - A docBase [C:_artifactory\app\artifactory\tomcat\webapps\artifactory.war] inside the host appBase has been specified, and will be ignored
2022-02-17T05:04:14.031L ←[35m[tomct]←[0m [WARNING] [ ] [org.apache.catalina.startup.HostConfig] [org.apache.catalina.startup.HostConfig deployDescriptor] - A docBase [C:_artifactory\app\artifactory\tomcat\webapps\access.war] inside the host appBase has been specified, and will be ignored
2022-02-17T05:04:29.688Z ←[1;32m[jfrt ]←[0;39m ←[34m[INFO ]←[0;39m [e6a98b79aebf2989] [o.a.c.h.HaNodeProperties:65 ] [ocalhost-startStop-2] - Artifactory is running in non-clustered mode.
2022-02-17T05:04:29.747Z ←[1;32m[jfrt ]←[0;39m ←[34m[INFO ]←[0;39m [e6a98b79aebf2989] [tifactoryHomeConfigListener:85] [ocalhost-startStop-2] - Resolved Home: 'C:_artifactory
2022-02-17T05:04:30.804Z ←[1;32m[jfrt ]←[0;39m ←[34m[INFO ]←[0;39m [ ] [o.j.c.w.FileWatcher:146 ] [file-watcher-poller ] - Starting watch of folder configurations
2022-02-17T05:04:30.982Z ←[1;32m[jfrt ]←[0;39m ←[31m[WARN ]←[0;39m [e6a98b79aebf2989] [c.z.h.u.DriverDataSource:70 ] [ocalhost-startStop-2] - Registered driver with driverClassName=org.apache.derby.jdbc.EmbeddedDriver was not found, trying direct instantiation.
2022-02-17T05:04:32.304Z ←[1;33m[jfac ]←[0;39m ←[34m[INFO ]←[0;39m [1c3797c2344b90ae] [licationContextInitializer:162] [ocalhost-startStop-1] - Access (jfac) service initialization started. Version: 7.35.0 Revision: 73500900 PID: 10576 Home: C:_artifactory
2022-02-17T05:04:32.443Z ←[1;33m[jfac ]←[0;39m ←[34m[INFO ]←[0;39m [1c3797c2344b90ae] [o.j.a.AccessApplication:55 ] [ocalhost-startStop-1] - Starting AccessApplication v7.35.0 using Java 11.0.13 on AutoOpsVM1 with PID 10576 (C:_artifactory\app\artifactory\tomcat\webapps\access\WEB-INF\lib\access-application-7.35.0.jar started by AutoOpsVM1 in C:_artifactory\app\bin)
2022-02-17T05:04:32.453Z ←[1;33m[jfac ]←[0;39m ←[34m[INFO ]←[0;39m [1c3797c2344b90ae] [o.j.a.AccessApplication:674 ] [ocalhost-startStop-1] - The following profiles are active: production
2022-02-17T05:04:35.763Z ←[1;32m[jfrt ]←[0;39m ←[34m[INFO ]←[0;39m [e6a98b79aebf2989] [.BasicConfigurationManager:186] [ocalhost-startStop-2] - Artifactory (jfrt) service initialization started. Version: 7.33.8 Revision: 73308900 PID: 10576 Home: C:_artifactory
2022-02-17T05:04:36.752Z ←[1;32m[jfrt ]←[0;39m ←[34m[INFO ]←[0;39m [e6a98b79aebf2989] [d.c.m.ConverterManagerImpl:212] [ocalhost-startStop-2] - Triggering PRE_INIT conversion, from 7.33.8 to 7.33.8
2022-02-17T05:04:36.753Z ←[1;32m[jfrt ]←[0;39m ←[34m[INFO ]←[0;39m [e6a98b79aebf2989] [d.c.m.ConverterManagerImpl:215] [ocalhost-startStop-2] - Finished PRE_INIT conversion, current version is: 7.33.8
2022-02-17T05:04:36.758Z ←[1;32m[jfrt ]←[0;39m ←[34m[INFO ]←[0;39m [e6a98b79aebf2989] [d.i.DbInitializationManager:48] [ocalhost-startStop-2] - Initializing DB Schema initialization manager
2022-02-17T05:04:36.760Z ←[1;32m[jfrt ]←[0;39m ←[34m[INFO ]←[0;39m [e6a98b79aebf2989] [.i.DbInitializationManager:176] [ocalhost-startStop-2] - Database: Apache Derby 10.14.2.0 - (1828579). Driver: Apache Derby Embedded JDBC Driver 10.14.2.0 - (1828579) Pool: derby
2022-02-17T05:04:37.767Z ←[1;32m[jfrt ]←[0;39m ←[34m[INFO ]←[0;39m [e6a98b79aebf2989] [d.i.DbInitializationManager:52] [ocalhost-startStop-2] - DB Schema initialization manager initialized
2022-02-17T05:04:37.789Z ←[1;32m[jfrt ]←[0;39m ←[34m[INFO ]←[0;39m [e6a98b79aebf2989] [SchemaInitializationManager:48] [ocalhost-startStop-2] - Initializing Post-DB initialization manager
2022-02-17T05:04:37.984Z ←[1;32m[jfrt ]←[0;39m ←[34m[INFO ]←[0;39m [e6a98b79aebf2989] [.c.ConfigurationManagerImpl:97] [ocalhost-startStop-2] - Starting file sync
2022-02-17T05:04:38.379Z ←[1;32m[jfrt ]←[0;39m ←[34m[INFO ]←[0;39m [e6a98b79aebf2989] [SchemaInitializationManager:51] [ocalhost-startStop-2] - Post-DB initialization manager initialized
2022-02-17T05:04:38.501Z ←[1;32m[jfrt ]←[0;39m ←[34m[INFO ]←[0;39m [e6a98b79aebf2989] [o.a.m.MimeTypesReader:74 ] [ocalhost-startStop-2] - Converting mimetypes.xml version from 'v15' to 'v16'
2022-02-17T05:04:39.979Z ←[1;32m[jfrt ]←[0;39m ←[34m[INFO ]←[0;39m [b255e1d7573529dd] [ctoryContextConfigListener:331] [art-init ] -
_ _ __ _ ____ _____ _____
/\ | | ()/ | | | / __ \ / / |
/ \ _ | | | | __ _ | | ___ _ __ _ _ | | | | (| (
/ /\ \ | '__| | | / ` |/ | / _ | '| | | | | | | |_ \
/ ____ | | | || | || (| | (__| || () | | | || | | || |) |) |
// __| _||| _,|___|__/|| _, | _/|//
Version: 7.33.8 / |
Revision: 73308900 |/
Artifactory Home: 'C:_artifactory'
Node ID: 'AutoOpsVM1'
headers: Metadata(:status=503,content-type=text/plain; charset=utf-8,date=Thu, 17 Feb 2022 05:05:25 GMT,content-length=19)
DATA-----------------------------
Service Unavailable. Trying again
Thu, 17 Feb 2022 05:05:28 GMT helmet deprecated helmet.featurePolicy is deprecated (along with the HTTP header) and will be removed in helmet@4. You can use the feature-policy module instead. at ..\frontend\bin\server\dist\bundle.js:16844:24
2022-02-17T05:05:31.104Z ←[1;32m[jfrt ]←[0;39m ←[34m[INFO ]←[0;39m [ ] [o.j.c.ConfigWrapperImpl:342 ] [e-watcher-notifier-1] - [Node ID: AutoOpsVM1] detected local modify for config 'artifactory\config\security\access\access.admin.token'
2022-02-17T05:05:33.555Z ←[1;33m[jfac ]←[0;39m ←[34m[INFO ]←[0;39m [ ] [CertificateFileHandlerBase:181] [c-default-executor-1] - Loading root certificate from database.
2022-02-17T05:05:33.633Z ←[1;33m[jfac ]←[0;39m ←[34m[INFO ]←[0;39m [ ] [CertificateFileHandlerBase:328] [c-default-executor-1] - [ACCESS BOOTSTRAP] Saved new root certificate at: C:_artifactory\var\etc\access\keys\root.crt
2022-02-17T05:05:33.634Z ←[1;33m[jfac ]←[0;39m ←[34m[INFO ]←[0;39m [ ] [CertificateFileHandlerBase:190] [c-default-executor-1] - Finished loading root certificate from database.
2022-02-17T05:05:33.639Z ←[1;33m[jfac ]←[0;39m ←[34m[INFO ]←[0;39m [ ] [CertificateFileHandlerBase:181] [c-default-executor-1] - Loading ca certificate from database.
2022-02-17T05:05:33.735Z ←[1;33m[jfac ]←[0;39m ←[34m[INFO ]←[0;39m [1c3797c2344b90ae] [.s.b.AccessProjectBootstrap:88] [pool-9-thread-3 ] - Finished initializing Projects permissions in 179.8 millis
2022-02-17T05:05:33.750Z ←[1;33m[jfac ]←[0;39m ←[34m[INFO ]←[0;39m [ ] [CertificateFileHandlerBase:328] [c-default-executor-1] - [ACCESS BOOTSTRAP] Saved new ca certificate at: C:_artifactory\var\etc\access\keys\ca.crt
2022-02-17T05:05:33.751Z ←[1;33m[jfac ]←[0;39m ←[34m[INFO ]←[0;39m [ ] [CertificateFileHandlerBase:190] [c-default-executor-1] - Finished loading ca certificate from database.
2022-02-17T05:05:33.759Z ←[1;33m[jfac ]←[0;39m ←[34m[INFO ]←[0;39m [ ] [alConfigurationServiceBase:188] [c-default-executor-1] - Loading configuration from db finished successfully
2022-02-17T05:05:33.895Z ←[1;32m[jfrt ]←[0;39m ←[34m[INFO ]←[0;39m [ ] [ffectedConfigStreamObserver:32] [Stream_1645074313892] - publishing full invalidation and attempting to resubscribe to affected configuration changes
2022-02-17T05:05:35.833Z ←[1;33m[jfac ]←[0;39m ←[34m[INFO ]←[0;39m [1c3797c2344b90ae] [.s.b.AccessServerRegistrar:126] [pool-9-thread-1 ] - [ACCESS BOOTSTRAP] Updating server 'AutoOpsVM1' private key finger print to: bc0b09fc03898659c0f54136d1dd1b41cf79cc021042090987d44e6173ca73bf ca private key finger print to: b7db23cdacb6b7b085ae14dc8559f2c04744245199ff10427c7470a89467b623
2022-02-17T05:05:35.857Z ←[1;33m[jfac ]←[0;39m ←[34m[INFO ]←[0;39m [1c3797c2344b90ae] [a.s.b.AccessServerRegistrar:82] [pool-9-thread-1 ] - [ACCESS BOOTSTRAP] JFrog Access registrar finished.
2022-02-17T05:05:37.235Z ←[1;32m[jfrt ]←[0;39m ←[34m[INFO ]←[0;39m [ ] [.j.a.c.g.GrpcStreamObserver:76] [c-default-executor-0] - affected projects stream stopped gracefully - immediate cache invalidation will not work without restart
2022-02-17T05:05:37.284Z ←[1;32m[jfrt ]←[0;39m ←[34m[INFO ]←[0;39m [ ] [.j.a.c.g.GrpcStreamObserver:76] [c-default-executor-0] - affected projects stream stopped gracefully - immediate cache invalidation will not work without restart
2022-02-17T05:05:40.069Z ←[1;33m[jfac ]←[0;39m ←[34m[INFO ]←[0;39m [b40a725f21d7aaf5] [o.j.a.s.s.c.s.HeartbeatJob:81 ] [jf-access-task1 ] - Refreshing server state after it was considered as stale by peers [last previous successful update 1645074294749]
2022-02-17T05:05:40.070Z ←[1;33m[jfac ]←[0;39m ←[34m[INFO ]←[0;39m [b40a725f21d7aaf5] [CertificateFileHandlerBase:181] [jf-access-task1 ] - Loading root certificate from database.
2022-02-17T05:05:40.142Z ←[1;33m[jfac ]←[0;39m ←[34m[INFO ]←[0;39m [1c3797c2344b90ae] [.s.b.AccessProjectBootstrap:88] [pool-9-thread-1 ] - Finished initializing Projects permissions in 71.69 millis
2022-02-17T05:05:40.179Z ←[1;33m[jfac ]←[0;39m ←[34m[INFO ]←[0;39m [b40a725f21d7aaf5] [CertificateFileHandlerBase:328] [jf-access-task1 ] - [ACCESS BOOTSTRAP] Saved new root certificate at: C:_artifactory\var\etc\access\keys\root.crt
2022-02-17T05:05:40.179Z ←[1;33m[jfac ]←[0;39m ←[34m[INFO ]←[0;39m [b40a725f21d7aaf5] [CertificateFileHandlerBase:190] [jf-access-task1 ] - Finished loading root certificate from database.
2022-02-17T05:05:40.184Z ←[1;33m[jfac ]←[0;39m ←[34m[INFO ]←[0;39m [b40a725f21d7aaf5] [CertificateFileHandlerBase:181] [jf-access-task1 ] - Loading ca certificate from database.
2022-02-17T05:05:40.239Z ←[1;33m[jfac ]←[0;39m ←[34m[INFO ]←[0;39m [b40a725f21d7aaf5] [CertificateFileHandlerBase:328] [jf-access-task1 ] - [ACCESS BOOTSTRAP] Saved new ca certificate at: C:_artifactory\var\etc\access\keys\ca.crt
2022-02-17T05:05:40.240Z ←[1;33m[jfac ]←[0;39m ←[34m[INFO ]←[0;39m [b40a725f21d7aaf5] [CertificateFileHandlerBase:190] [jf-access-task1 ] - Finished loading ca certificate from database.
2022-02-17T05:05:40.248Z ←[1;33m[jfac ]←[0;39m ←[34m[INFO ]←[0;39m [b40a725f21d7aaf5] [alConfigurationServiceBase:188] [jf-access-task1 ] - Loading configuration from db finished successfully
[enter image description here][2]
#Error getting while creating a Service connection in Azure DevOps [1]: https://i.stack.imgur.com/u3AFI.png [2]: https://i.stack.imgur.com/5rofN.png
Solution 1:[1]
Can you please share the complete log message? so that it will be helpful to analyze the issue. The reason is sometimes we see few error message that is not harmful. Once the Artifactory is up and running the repository (local/remote/virtual) can be created and that repository can be configured to Azure DevOps Pipeline.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | JayanthSuresh |
