blob: bf9fceb0c19d8ed638ca2346c4d51fb5e4d0aae9 [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 (1.8.0_281) on Sun Jan 15 15:58:36 CET 2023 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>freemarker.ext.beans (FreeMarker 2.3.32 API)</title>
<meta name="date" content="2023-01-15">
<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="freemarker.ext.beans (FreeMarker 2.3.32 API)";
}
}
catch(err) {
}
//-->
</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 class="navBarCell1Rev">Package</li>
<li>Class</li>
<li><a href="package-use.html">Use</a></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="../../../freemarker/ext/ant/package-summary.html">Prev&nbsp;Package</a></li>
<li><a href="../../../freemarker/ext/beans/delme/package-summary.html">Next&nbsp;Package</a></li>
</ul>
<ul class="navList">
<li><a href="../../../index.html?freemarker/ext/beans/package-summary.html" target="_top">Frames</a></li>
<li><a href="package-summary.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>
<a name="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
<div class="header">
<h1 title="Package" class="title">Package&nbsp;freemarker.ext.beans</h1>
<div class="docSummary">
<div class="block">The <a href="../../../freemarker/template/DefaultObjectWrapper.html" title="class in freemarker.template">default object wrapper</a> of FreeMarker uses
this to expose Java Beans and POJO-s to templates.</div>
</div>
<p>See:&nbsp;<a href="#package.description">Description</a></p>
</div>
<div class="contentContainer">
<ul class="blockList">
<li class="blockList">
<table class="typeSummary" border="0" cellpadding="3" cellspacing="0" summary="Interface Summary table, listing interfaces, and an explanation">
<caption><span>Interface Summary</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colFirst" scope="col">Interface</th>
<th class="colLast" scope="col">Description</th>
</tr>
<tbody>
<tr class="altColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/AdhocTestMultimap.html" title="interface in freemarker.ext.beans">AdhocTestMultimap</a>&lt;K,V&gt;</td>
<td class="colLast">&nbsp;</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/ClassMemberAccessPolicy.html" title="interface in freemarker.ext.beans">ClassMemberAccessPolicy</a></td>
<td class="colLast">
<div class="block">Returned by <a href="../../../freemarker/ext/beans/MemberAccessPolicy.html#forClass-java.lang.Class-"><code>MemberAccessPolicy.forClass(Class)</code></a>.</div>
</td>
</tr>
<tr class="altColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/MemberAccessPolicy.html" title="interface in freemarker.ext.beans">MemberAccessPolicy</a></td>
<td class="colLast">
<div class="block">Implement this to restrict what class members (methods, fields, constructors) are accessible from templates.</div>
</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/MethodAppearanceFineTuner.html" title="interface in freemarker.ext.beans">MethodAppearanceFineTuner</a></td>
<td class="colLast">
<div class="block">Used for customizing how the methods are visible from templates, via
<a href="../../../freemarker/ext/beans/BeansWrapper.html#setMethodAppearanceFineTuner-freemarker.ext.beans.MethodAppearanceFineTuner-"><code>BeansWrapper.setMethodAppearanceFineTuner(MethodAppearanceFineTuner)</code></a>.</div>
</td>
</tr>
<tr class="altColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/SingletonCustomizer.html" title="interface in freemarker.ext.beans">SingletonCustomizer</a></td>
<td class="colLast">
<div class="block">Marker interface useful when used together with <a href="../../../freemarker/ext/beans/MethodAppearanceFineTuner.html" title="interface in freemarker.ext.beans"><code>MethodAppearanceFineTuner</code></a> and such customizer objects, to
indicate that it <b>doesn't contain reference to the <a href="../../../freemarker/template/ObjectWrapper.html" title="interface in freemarker.template"><code>ObjectWrapper</code></a></b> (so beware with non-static inner
classes) and can be and should be used in call introspection cache keys.</div>
</td>
</tr>
</tbody>
</table>
</li>
<li class="blockList">
<table class="typeSummary" border="0" cellpadding="3" cellspacing="0" summary="Class Summary table, listing classes, and an explanation">
<caption><span>Class Summary</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colFirst" scope="col">Class</th>
<th class="colLast" scope="col">Description</th>
</tr>
<tbody>
<tr class="altColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/AdhocTest2.html" title="class in freemarker.ext.beans">AdhocTest2</a></td>
<td class="colLast">&nbsp;</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/AdhocTest3.html" title="class in freemarker.ext.beans">AdhocTest3</a></td>
<td class="colLast">&nbsp;</td>
</tr>
<tr class="altColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/ArrayModel.html" title="class in freemarker.ext.beans">ArrayModel</a></td>
<td class="colLast">
<div class="block">A class that will wrap an arbitrary array into <a href="../../../freemarker/template/TemplateCollectionModel.html" title="interface in freemarker.template"><code>TemplateCollectionModel</code></a>
and <a href="../../../freemarker/template/TemplateSequenceModel.html" title="interface in freemarker.template"><code>TemplateSequenceModel</code></a> interfaces.</div>
</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/BeanModel.html" title="class in freemarker.ext.beans">BeanModel</a></td>
<td class="colLast">
<div class="block">A class that will wrap an arbitrary object into <a href="../../../freemarker/template/TemplateHashModel.html" title="interface in freemarker.template"><code>TemplateHashModel</code></a>
interface allowing calls to arbitrary property getters and invocation of
accessible methods on the object from a template using the
<tt>object.foo</tt> to access properties and <tt>object.bar(arg1, arg2)</tt> to
invoke methods on it.</div>
</td>
</tr>
<tr class="altColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/BeansModelCache.html" title="class in freemarker.ext.beans">BeansModelCache</a></td>
<td class="colLast">&nbsp;</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/BeansWrapper.html" title="class in freemarker.ext.beans">BeansWrapper</a></td>
<td class="colLast">
<div class="block"><a href="../../../freemarker/template/ObjectWrapper.html" title="interface in freemarker.template"><code>ObjectWrapper</code></a> that is able to expose the Java API of arbitrary Java objects.</div>
</td>
</tr>
<tr class="altColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/BeansWrapper.MethodAppearanceDecision.html" title="class in freemarker.ext.beans">BeansWrapper.MethodAppearanceDecision</a></td>
<td class="colLast">
<div class="block">Used for
<a href="../../../freemarker/ext/beans/MethodAppearanceFineTuner.html#process-freemarker.ext.beans.BeansWrapper.MethodAppearanceDecisionInput-freemarker.ext.beans.BeansWrapper.MethodAppearanceDecision-"><code>MethodAppearanceFineTuner.process(freemarker.ext.beans.BeansWrapper.MethodAppearanceDecisionInput, freemarker.ext.beans.BeansWrapper.MethodAppearanceDecision)</code></a>
to store the results; see there.</div>
</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/BeansWrapper.MethodAppearanceDecisionInput.html" title="class in freemarker.ext.beans">BeansWrapper.MethodAppearanceDecisionInput</a></td>
<td class="colLast">
<div class="block">Used for <a href="../../../freemarker/ext/beans/MethodAppearanceFineTuner.html#process-freemarker.ext.beans.BeansWrapper.MethodAppearanceDecisionInput-freemarker.ext.beans.BeansWrapper.MethodAppearanceDecision-"><code>MethodAppearanceFineTuner.process(freemarker.ext.beans.BeansWrapper.MethodAppearanceDecisionInput, freemarker.ext.beans.BeansWrapper.MethodAppearanceDecision)</code></a> as input parameter; see there.</div>
</td>
</tr>
<tr class="altColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/BeansWrapperBuilder.html" title="class in freemarker.ext.beans">BeansWrapperBuilder</a></td>
<td class="colLast">
<div class="block">Gets/creates a <a href="../../../freemarker/ext/beans/BeansWrapper.html" title="class in freemarker.ext.beans"><code>BeansWrapper</code></a> singleton instance that's already configured as specified in the properties of
this object; this is recommended over using the <a href="../../../freemarker/ext/beans/BeansWrapper.html" title="class in freemarker.ext.beans"><code>BeansWrapper</code></a> constructors.</div>
</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/BeansWrapperConfiguration.html" title="class in freemarker.ext.beans">BeansWrapperConfiguration</a></td>
<td class="colLast">
<div class="block">Holds <a href="../../../freemarker/ext/beans/BeansWrapper.html" title="class in freemarker.ext.beans"><code>BeansWrapper</code></a> configuration settings and defines their defaults.</div>
</td>
</tr>
<tr class="altColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/BlacklistMemberAccessPolicy.html" title="class in freemarker.ext.beans">BlacklistMemberAccessPolicy</a></td>
<td class="colLast">
<div class="block">Blacklist-based member access policy, that is, members that are matched by the listing will not be accessible, all
others will be.</div>
</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/BooleanModel.html" title="class in freemarker.ext.beans">BooleanModel</a></td>
<td class="colLast">
<div class="block">A class that will wrap instances of <code>Boolean</code> into a
<a href="../../../freemarker/template/TemplateBooleanModel.html" title="interface in freemarker.template"><code>TemplateBooleanModel</code></a>.</div>
</td>
</tr>
<tr class="altColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/CollectionModel.html" title="class in freemarker.ext.beans">CollectionModel</a></td>
<td class="colLast">
<div class="block">A special case of <a href="../../../freemarker/ext/beans/BeanModel.html" title="class in freemarker.ext.beans"><code>BeanModel</code></a> that can wrap Java collections
and that implements the <a href="../../../freemarker/template/TemplateCollectionModel.html" title="interface in freemarker.template"><code>TemplateCollectionModel</code></a> in order to be usable
in a <tt>&lt;#list&gt;</tt> block.</div>
</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/DateModel.html" title="class in freemarker.ext.beans">DateModel</a></td>
<td class="colLast">
<div class="block">Wraps arbitrary subclass of <code>Date</code> into a reflective model.</div>
</td>
</tr>
<tr class="altColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/DefaultMemberAccessPolicy.html" title="class in freemarker.ext.beans">DefaultMemberAccessPolicy</a></td>
<td class="colLast">
<div class="block">Member access policy, used to implement default behavior that's mostly compatible with pre-2.3.30 versions, but is
somewhat safer; it still can't provide safety in practice, if you allow untrusted users to edit templates! Use
<a href="../../../freemarker/ext/beans/WhitelistMemberAccessPolicy.html" title="class in freemarker.ext.beans"><code>WhitelistMemberAccessPolicy</code></a> if you need stricter control.</div>
</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/EnumerationModel.html" title="class in freemarker.ext.beans">EnumerationModel</a></td>
<td class="colLast">
<div class="block">A class that adds <a href="../../../freemarker/template/TemplateModelIterator.html" title="interface in freemarker.template"><code>TemplateModelIterator</code></a> functionality to the
<code>Enumeration</code> interface implementers.</div>
</td>
</tr>
<tr class="altColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/HashAdapter.html" title="class in freemarker.ext.beans">HashAdapter</a></td>
<td class="colLast">&nbsp;</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/IteratorModel.html" title="class in freemarker.ext.beans">IteratorModel</a></td>
<td class="colLast">
<div class="block">A class that adds <a href="../../../freemarker/template/TemplateModelIterator.html" title="interface in freemarker.template"><code>TemplateModelIterator</code></a> functionality to the
<code>Iterator</code> interface implementers.</div>
</td>
</tr>
<tr class="altColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/LegacyDefaultMemberAccessPolicy.html" title="class in freemarker.ext.beans">LegacyDefaultMemberAccessPolicy</a></td>
<td class="colLast">
<div class="block">Legacy blacklist based member access policy, used only to keep old behavior, as it can't provide meaningful safety.</div>
</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/MapModel.html" title="class in freemarker.ext.beans">MapModel</a></td>
<td class="colLast">
<div class="block">A special case of <a href="../../../freemarker/ext/beans/BeanModel.html" title="class in freemarker.ext.beans"><code>BeanModel</code></a> that adds implementation
for <a href="../../../freemarker/template/TemplateMethodModelEx.html" title="interface in freemarker.template"><code>TemplateMethodModelEx</code></a> on map objects that is a shortcut for the
<tt>Map.get()</tt> method.</div>
</td>
</tr>
<tr class="altColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/MemberSelectorListMemberAccessPolicy.html" title="class in freemarker.ext.beans">MemberSelectorListMemberAccessPolicy</a></td>
<td class="colLast">
<div class="block">Superclass for member-selector-list-based member access policies, like <a href="../../../freemarker/ext/beans/WhitelistMemberAccessPolicy.html" title="class in freemarker.ext.beans"><code>WhitelistMemberAccessPolicy</code></a>.</div>
</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/MemberSelectorListMemberAccessPolicy.MemberSelector.html" title="class in freemarker.ext.beans">MemberSelectorListMemberAccessPolicy.MemberSelector</a></td>
<td class="colLast">
<div class="block">A condition that matches some type members.</div>
</td>
</tr>
<tr class="altColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/NumberModel.html" title="class in freemarker.ext.beans">NumberModel</a></td>
<td class="colLast">
<div class="block">Wraps arbitrary subclass of <code>Number</code> into a reflective model.</div>
</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/OverloadedMethodsModel.html" title="class in freemarker.ext.beans">OverloadedMethodsModel</a></td>
<td class="colLast">
<div class="block">Wraps a set of same-name overloaded methods behind <a href="../../../freemarker/template/TemplateMethodModel.html" title="interface in freemarker.template"><code>TemplateMethodModel</code></a> interface,
like if it was a single method, chooses among them behind the scenes on call-time based on the argument values.</div>
</td>
</tr>
<tr class="altColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/ResourceBundleModel.html" title="class in freemarker.ext.beans">ResourceBundleModel</a></td>
<td class="colLast">
<div class="block">A hash model that wraps a resource bundle.</div>
</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/SimpleMapModel.html" title="class in freemarker.ext.beans">SimpleMapModel</a></td>
<td class="colLast">
<div class="block">Model used by <a href="../../../freemarker/ext/beans/BeansWrapper.html" title="class in freemarker.ext.beans"><code>BeansWrapper</code></a> when <tt>simpleMapWrapper</tt>
mode is enabled.</div>
</td>
</tr>
<tr class="altColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/SimpleMethodModel.html" title="class in freemarker.ext.beans">SimpleMethodModel</a></td>
<td class="colLast">
<div class="block">A class that will wrap a reflected method call into a
<a href="../../../freemarker/template/TemplateMethodModel.html" title="interface in freemarker.template"><code>TemplateMethodModel</code></a> interface.</div>
</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/StringModel.html" title="class in freemarker.ext.beans">StringModel</a></td>
<td class="colLast">
<div class="block">Subclass of <a href="../../../freemarker/ext/beans/BeanModel.html" title="class in freemarker.ext.beans"><code>BeanModel</code></a> that exposes the return value of the <code>Object.toString()</code> method through the <a href="../../../freemarker/template/TemplateScalarModel.html" title="interface in freemarker.template"><code>TemplateScalarModel</code></a>
interface.</div>
</td>
</tr>
<tr class="altColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/WhitelistMemberAccessPolicy.html" title="class in freemarker.ext.beans">WhitelistMemberAccessPolicy</a></td>
<td class="colLast">
<div class="block">Whitelist-based member access policy, that is, only members that are matched by the listing will be exposed.</div>
</td>
</tr>
</tbody>
</table>
</li>
<li class="blockList">
<table class="typeSummary" border="0" cellpadding="3" cellspacing="0" summary="Exception Summary table, listing exceptions, and an explanation">
<caption><span>Exception Summary</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colFirst" scope="col">Exception</th>
<th class="colLast" scope="col">Description</th>
</tr>
<tbody>
<tr class="altColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/InvalidPropertyException.html" title="class in freemarker.ext.beans">InvalidPropertyException</a></td>
<td class="colLast">
<div class="block">An exception thrown when there is an attempt to access
an invalid bean property when we are in a "strict bean" mode</div>
</td>
</tr>
</tbody>
</table>
</li>
<li class="blockList">
<table class="typeSummary" border="0" cellpadding="3" cellspacing="0" summary="Annotation Types Summary table, listing annotation types, and an explanation">
<caption><span>Annotation Types Summary</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colFirst" scope="col">Annotation Type</th>
<th class="colLast" scope="col">Description</th>
</tr>
<tbody>
<tr class="altColor">
<td class="colFirst"><a href="../../../freemarker/ext/beans/TemplateAccessible.html" title="annotation in freemarker.ext.beans">TemplateAccessible</a></td>
<td class="colLast">
<div class="block">Indicates that the the annotated member can be exposed to templates; if the annotated member will be actually
exposed depends on the <a href="../../../freemarker/template/ObjectWrapper.html" title="interface in freemarker.template"><code>ObjectWrapper</code></a> in use, and how that was configured.</div>
</td>
</tr>
</tbody>
</table>
</li>
</ul>
<a name="package.description">
<!-- -->
</a>
<h2 title="Package freemarker.ext.beans Description">Package freemarker.ext.beans Description</h2>
<div class="block"><p>The <a href="../../../freemarker/template/DefaultObjectWrapper.html" title="class in freemarker.template">default object wrapper</a> of FreeMarker uses
this to expose Java Beans and POJO-s to templates.</p>
<p>Most of the issues dealing with beans are handled by the
<a href="../../../freemarker/ext/beans/BeansWrapper.html#wrap-java.lang.Object-"><code>BeansWrapper.wrap(Object)</code></a>and <a href="../../../freemarker/ext/beans/BeansWrapper.html#getStaticModels--"><code>BeansWrapper.getStaticModels()</code></a> methods. In normal cases,
these are the only methods
you should use to turn an arbitrary Java object into a
FreeMarker <a href="../../../freemarker/template/TemplateModel.html" title="interface in freemarker.template"><code>TemplateModel</code></a>. Additionally, you can manually create
instance of any wrapper class using its constructors.
Note, however that in such cases you bypass the eventual model caching
of the wrapper.</p></div>
</div>
<!-- ======= 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 class="navBarCell1Rev">Package</li>
<li>Class</li>
<li><a href="package-use.html">Use</a></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="../../../freemarker/ext/ant/package-summary.html">Prev&nbsp;Package</a></li>
<li><a href="../../../freemarker/ext/beans/delme/package-summary.html">Next&nbsp;Package</a></li>
</ul>
<ul class="navList">
<li><a href="../../../index.html?freemarker/ext/beans/package-summary.html" target="_top">Frames</a></li>
<li><a href="package-summary.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>
<a name="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
</body>
</html>