blob: 49ec8cd06834ff9e3ca273a3b9b5d665922c2ea2 [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- NewPage -->
<html lang="en">
<head>
<!-- Generated by javadoc -->
<title>SslDomain (Qpid Proton-J API)</title>
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
<script type="text/javascript" src="../../../../../script.js"></script>
</head>
<body>
<script type="text/javascript"><!--
try {
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="SslDomain (Qpid Proton-J API)";
}
}
catch(err) {
}
//-->
var methods = {"i0":6,"i1":6,"i2":6,"i3":6,"i4":6,"i5":6,"i6":6,"i7":6,"i8":6,"i9":6,"i10":6,"i11":6,"i12":6,"i13":6};
var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"]};
var altColor = "altColor";
var rowColor = "rowColor";
var tableTab = "tableTab";
var activeTableTab = "activeTableTab";
</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a name="navbar.top">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
<a name="navbar.top.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../../index-all.html">Index</a></li>
<li><a href="../../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li><a href="../../../../../org/apache/qpid/proton/engine/Ssl.html" title="interface in org.apache.qpid.proton.engine"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
<li><a href="../../../../../org/apache/qpid/proton/engine/SslDomain.Factory.html" title="class in org.apache.qpid.proton.engine"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
</ul>
<ul class="navList">
<li><a href="../../../../../index.html?org/apache/qpid/proton/engine/SslDomain.html" target="_top">Frames</a></li>
<li><a href="SslDomain.html" target="_top">No&nbsp;Frames</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_top">
<li><a href="../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_top");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li><a href="#nested.class.summary">Nested</a>&nbsp;|&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li>Constr&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li>Constr&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a name="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
<div class="subTitle">org.apache.qpid.proton.engine</div>
<h2 title="Interface SslDomain" class="title">Interface SslDomain</h2>
</div>
<div class="contentContainer">
<div class="description">
<ul class="blockList">
<li class="blockList">
<dl>
<dt>All Known Subinterfaces:</dt>
<dd><a href="../../../../../org/apache/qpid/proton/engine/ProtonJSslDomain.html" title="interface in org.apache.qpid.proton.engine">ProtonJSslDomain</a></dd>
</dl>
<dl>
<dt>All Known Implementing Classes:</dt>
<dd><a href="../../../../../org/apache/qpid/proton/engine/impl/ssl/SslDomainImpl.html" title="class in org.apache.qpid.proton.engine.impl.ssl">SslDomainImpl</a></dd>
</dl>
<hr>
<br>
<pre>public interface <span class="typeNameLabel">SslDomain</span></pre>
<div class="block">I store the details used to create SSL sessions.</div>
</li>
</ul>
</div>
<div class="summary">
<ul class="blockList">
<li class="blockList">
<!-- ======== NESTED CLASS SUMMARY ======== -->
<ul class="blockList">
<li class="blockList"><a name="nested.class.summary">
<!-- -->
</a>
<h3>Nested Class Summary</h3>
<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Nested Class Summary table, listing nested classes, and an explanation">
<caption><span>Nested Classes</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colLast" scope="col">Interface and Description</th>
</tr>
<tr class="altColor">
<td class="colFirst"><code>static class&nbsp;</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/qpid/proton/engine/SslDomain.Factory.html" title="class in org.apache.qpid.proton.engine">SslDomain.Factory</a></span></code>&nbsp;</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code>static class&nbsp;</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/qpid/proton/engine/SslDomain.Mode.html" title="enum in org.apache.qpid.proton.engine">SslDomain.Mode</a></span></code>
<div class="block">Determines whether the endpoint acts as a client or server.</div>
</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code>static class&nbsp;</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/qpid/proton/engine/SslDomain.VerifyMode.html" title="enum in org.apache.qpid.proton.engine">SslDomain.VerifyMode</a></span></code>
<div class="block">Determines the level of peer validation.</div>
</td>
</tr>
</table>
</li>
</ul>
<!-- ========== METHOD SUMMARY =========== -->
<ul class="blockList">
<li class="blockList"><a name="method.summary">
<!-- -->
</a>
<h3>Method Summary</h3>
<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t3" class="tableTab"><span><a href="javascript:show(4);">Abstract Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colLast" scope="col">Method and Description</th>
</tr>
<tr id="i0" class="altColor">
<td class="colFirst"><code>boolean</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/qpid/proton/engine/SslDomain.html#allowUnsecuredClient--">allowUnsecuredClient</a></span>()</code>&nbsp;</td>
</tr>
<tr id="i1" class="rowColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/qpid/proton/engine/SslDomain.html#allowUnsecuredClient-boolean-">allowUnsecuredClient</a></span>(boolean&nbsp;allowUnsecured)</code>
<div class="block">Permit a server to accept connection requests from non-SSL clients.</div>
</td>
</tr>
<tr id="i2" class="altColor">
<td class="colFirst"><code>java.lang.String</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/qpid/proton/engine/SslDomain.html#getCertificateFile--">getCertificateFile</a></span>()</code>&nbsp;</td>
</tr>
<tr id="i3" class="rowColor">
<td class="colFirst"><code><a href="../../../../../org/apache/qpid/proton/engine/SslDomain.Mode.html" title="enum in org.apache.qpid.proton.engine">SslDomain.Mode</a></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/qpid/proton/engine/SslDomain.html#getMode--">getMode</a></span>()</code>&nbsp;</td>
</tr>
<tr id="i4" class="altColor">
<td class="colFirst"><code><a href="../../../../../org/apache/qpid/proton/engine/SslDomain.VerifyMode.html" title="enum in org.apache.qpid.proton.engine">SslDomain.VerifyMode</a></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/qpid/proton/engine/SslDomain.html#getPeerAuthentication--">getPeerAuthentication</a></span>()</code>&nbsp;</td>
</tr>
<tr id="i5" class="rowColor">
<td class="colFirst"><code>java.lang.String</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/qpid/proton/engine/SslDomain.html#getPrivateKeyFile--">getPrivateKeyFile</a></span>()</code>&nbsp;</td>
</tr>
<tr id="i6" class="altColor">
<td class="colFirst"><code>java.lang.String</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/qpid/proton/engine/SslDomain.html#getPrivateKeyPassword--">getPrivateKeyPassword</a></span>()</code>&nbsp;</td>
</tr>
<tr id="i7" class="rowColor">
<td class="colFirst"><code>javax.net.ssl.SSLContext</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/qpid/proton/engine/SslDomain.html#getSslContext--">getSslContext</a></span>()</code>
<div class="block">Returns the SSLContext set by <a href="../../../../../org/apache/qpid/proton/engine/SslDomain.html#setSslContext-javax.net.ssl.SSLContext-"><code>setSslContext(SSLContext)</code></a>.</div>
</td>
</tr>
<tr id="i8" class="altColor">
<td class="colFirst"><code>java.lang.String</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/qpid/proton/engine/SslDomain.html#getTrustedCaDb--">getTrustedCaDb</a></span>()</code>&nbsp;</td>
</tr>
<tr id="i9" class="rowColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/qpid/proton/engine/SslDomain.html#init-org.apache.qpid.proton.engine.SslDomain.Mode-">init</a></span>(<a href="../../../../../org/apache/qpid/proton/engine/SslDomain.Mode.html" title="enum in org.apache.qpid.proton.engine">SslDomain.Mode</a>&nbsp;mode)</code>
<div class="block">Initialize the ssl domain object.</div>
</td>
</tr>
<tr id="i10" class="altColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/qpid/proton/engine/SslDomain.html#setCredentials-java.lang.String-java.lang.String-java.lang.String-">setCredentials</a></span>(java.lang.String&nbsp;certificateFile,
java.lang.String&nbsp;privateKeyFile,
java.lang.String&nbsp;password)</code>
<div class="block">Set the certificate that identifies the local node to the remote.</div>
</td>
</tr>
<tr id="i11" class="rowColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/qpid/proton/engine/SslDomain.html#setPeerAuthentication-org.apache.qpid.proton.engine.SslDomain.VerifyMode-">setPeerAuthentication</a></span>(<a href="../../../../../org/apache/qpid/proton/engine/SslDomain.VerifyMode.html" title="enum in org.apache.qpid.proton.engine">SslDomain.VerifyMode</a>&nbsp;mode)</code>
<div class="block">Configure the level of verification used on the peer certificate.</div>
</td>
</tr>
<tr id="i12" class="altColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/qpid/proton/engine/SslDomain.html#setSslContext-javax.net.ssl.SSLContext-">setSslContext</a></span>(javax.net.ssl.SSLContext&nbsp;sslContext)</code>
<div class="block">Sets an SSLContext for use when establishing SSL transport.</div>
</td>
</tr>
<tr id="i13" class="rowColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/qpid/proton/engine/SslDomain.html#setTrustedCaDb-java.lang.String-">setTrustedCaDb</a></span>(java.lang.String&nbsp;certificateDb)</code>
<div class="block">Configure the set of trusted CA certificates used by this node to verify peers.</div>
</td>
</tr>
</table>
</li>
</ul>
</li>
</ul>
</div>
<div class="details">
<ul class="blockList">
<li class="blockList">
<!-- ============ METHOD DETAIL ========== -->
<ul class="blockList">
<li class="blockList"><a name="method.detail">
<!-- -->
</a>
<h3>Method Detail</h3>
<a name="init-org.apache.qpid.proton.engine.SslDomain.Mode-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>init</h4>
<pre>void&nbsp;init(<a href="../../../../../org/apache/qpid/proton/engine/SslDomain.Mode.html" title="enum in org.apache.qpid.proton.engine">SslDomain.Mode</a>&nbsp;mode)</pre>
<div class="block">Initialize the ssl domain object.
An SSL object be either an SSL server or an SSL client. It cannot be both. Those
transports that will be used to accept incoming connection requests must be configured
as an SSL server. Those transports that will be used to initiate outbound connections
must be configured as an SSL client.</div>
</li>
</ul>
<a name="getMode--">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getMode</h4>
<pre><a href="../../../../../org/apache/qpid/proton/engine/SslDomain.Mode.html" title="enum in org.apache.qpid.proton.engine">SslDomain.Mode</a>&nbsp;getMode()</pre>
</li>
</ul>
<a name="setCredentials-java.lang.String-java.lang.String-java.lang.String-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>setCredentials</h4>
<pre>void&nbsp;setCredentials(java.lang.String&nbsp;certificateFile,
java.lang.String&nbsp;privateKeyFile,
java.lang.String&nbsp;password)</pre>
<div class="block">Set the certificate that identifies the local node to the remote.
This certificate establishes the identity for the local node. It will be sent to the
remote if the remote needs to verify the identity of this node. This may be used for
both SSL servers and SSL clients (if client authentication is required by the server).</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>certificateFile</code> - path to file/database containing the identifying
certificate.</dd>
<dd><code>privateKeyFile</code> - path to file/database containing the private key used to
sign the certificate</dd>
<dd><code>password</code> - the password used to sign the key, else null if key is not
protected.</dd>
</dl>
</li>
</ul>
<a name="getPrivateKeyFile--">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getPrivateKeyFile</h4>
<pre>java.lang.String&nbsp;getPrivateKeyFile()</pre>
</li>
</ul>
<a name="getPrivateKeyPassword--">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getPrivateKeyPassword</h4>
<pre>java.lang.String&nbsp;getPrivateKeyPassword()</pre>
</li>
</ul>
<a name="getCertificateFile--">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getCertificateFile</h4>
<pre>java.lang.String&nbsp;getCertificateFile()</pre>
</li>
</ul>
<a name="setTrustedCaDb-java.lang.String-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>setTrustedCaDb</h4>
<pre>void&nbsp;setTrustedCaDb(java.lang.String&nbsp;certificateDb)</pre>
<div class="block">Configure the set of trusted CA certificates used by this node to verify peers.
If the local SSL client/server needs to verify the identity of the remote, it must
validate the signature of the remote's certificate. This function sets the database of
trusted CAs that will be used to verify the signature of the remote's certificate.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>certificateDb</code> - database of trusted CAs, used to authenticate the peer.</dd>
</dl>
</li>
</ul>
<a name="getTrustedCaDb--">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getTrustedCaDb</h4>
<pre>java.lang.String&nbsp;getTrustedCaDb()</pre>
</li>
</ul>
<a name="setPeerAuthentication-org.apache.qpid.proton.engine.SslDomain.VerifyMode-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>setPeerAuthentication</h4>
<pre>void&nbsp;setPeerAuthentication(<a href="../../../../../org/apache/qpid/proton/engine/SslDomain.VerifyMode.html" title="enum in org.apache.qpid.proton.engine">SslDomain.VerifyMode</a>&nbsp;mode)</pre>
<div class="block">Configure the level of verification used on the peer certificate.
This method controls how the peer's certificate is validated, if at all. By default,
neither servers nor clients attempt to verify their peers (<a href="../../../../../org/apache/qpid/proton/engine/SslDomain.VerifyMode.html#ANONYMOUS_PEER"><code>SslDomain.VerifyMode.ANONYMOUS_PEER</code></a>).
Once certificates and trusted CAs are configured, peer verification can be enabled.
In order to verify a peer, a trusted CA must be configured. See
<a href="../../../../../org/apache/qpid/proton/engine/SslDomain.html#setTrustedCaDb-java.lang.String-"><code>setTrustedCaDb(String)</code></a>.
NOTE: Servers must provide their own certificate when verifying a peer. See
<a href="../../../../../org/apache/qpid/proton/engine/SslDomain.html#setCredentials-java.lang.String-java.lang.String-java.lang.String-"><code>setCredentials(String, String, String)</code></a>).</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>mode</code> - the level of validation to apply to the peer</dd>
</dl>
</li>
</ul>
<a name="getPeerAuthentication--">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getPeerAuthentication</h4>
<pre><a href="../../../../../org/apache/qpid/proton/engine/SslDomain.VerifyMode.html" title="enum in org.apache.qpid.proton.engine">SslDomain.VerifyMode</a>&nbsp;getPeerAuthentication()</pre>
</li>
</ul>
<a name="allowUnsecuredClient-boolean-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>allowUnsecuredClient</h4>
<pre>void&nbsp;allowUnsecuredClient(boolean&nbsp;allowUnsecured)</pre>
<div class="block">Permit a server to accept connection requests from non-SSL clients.
This configures the server to "sniff" the incoming client data stream, and dynamically
determine whether SSL/TLS is being used. This option is disabled by default: only
clients using SSL/TLS are accepted.</div>
</li>
</ul>
<a name="allowUnsecuredClient--">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>allowUnsecuredClient</h4>
<pre>boolean&nbsp;allowUnsecuredClient()</pre>
</li>
</ul>
<a name="setSslContext-javax.net.ssl.SSLContext-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>setSslContext</h4>
<pre>void&nbsp;setSslContext(javax.net.ssl.SSLContext&nbsp;sslContext)</pre>
<div class="block">Sets an SSLContext for use when establishing SSL transport. Setting a context this way overrides alternate
configuration that might otherwise have been used to create a context, such as key and trust store paths.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>sslContext</code> - the context to use</dd>
</dl>
</li>
</ul>
<a name="getSslContext--">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>getSslContext</h4>
<pre>javax.net.ssl.SSLContext&nbsp;getSslContext()</pre>
<div class="block">Returns the SSLContext set by <a href="../../../../../org/apache/qpid/proton/engine/SslDomain.html#setSslContext-javax.net.ssl.SSLContext-"><code>setSslContext(SSLContext)</code></a>.</div>
<dl>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the SSLContext, or null if none was set.</dd>
</dl>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
<!-- ========= END OF CLASS DATA ========= -->
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a name="navbar.bottom">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
<a name="navbar.bottom.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../../index-all.html">Index</a></li>
<li><a href="../../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li><a href="../../../../../org/apache/qpid/proton/engine/Ssl.html" title="interface in org.apache.qpid.proton.engine"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
<li><a href="../../../../../org/apache/qpid/proton/engine/SslDomain.Factory.html" title="class in org.apache.qpid.proton.engine"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
</ul>
<ul class="navList">
<li><a href="../../../../../index.html?org/apache/qpid/proton/engine/SslDomain.html" target="_top">Frames</a></li>
<li><a href="SslDomain.html" target="_top">No&nbsp;Frames</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_bottom");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li><a href="#nested.class.summary">Nested</a>&nbsp;|&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li>Constr&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li>Constr&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a name="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
</body>
</html>