blob: 6f908db53bc9206b4dca40d186cf3e9087fdbff7 [file] [log] [blame]
<!DOCTYPE HTML>
<!-- NewPage -->
<html lang="en">
<head>
<!-- Generated by javadoc -->
<title>DefaultSplitAssigner</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
<link rel="stylesheet" type="text/css" href="../../../../../../jquery/jquery-ui.min.css" title="Style">
<link rel="stylesheet" type="text/css" href="../../../../../../jquery-ui.overrides.css" title="Style">
<script type="text/javascript" src="../../../../../../script.js"></script>
<script type="text/javascript" src="../../../../../../jquery/jszip/dist/jszip.min.js"></script>
<script type="text/javascript" src="../../../../../../jquery/jszip-utils/dist/jszip-utils.min.js"></script>
<!--[if IE]>
<script type="text/javascript" src="../../../../../../jquery/jszip-utils/dist/jszip-utils-ie.min.js"></script>
<![endif]-->
<script type="text/javascript" src="../../../../../../jquery/jquery-3.6.1.min.js"></script>
<script type="text/javascript" src="../../../../../../jquery/jquery-ui.min.js"></script>
</head>
<body>
<script type="text/javascript"><!--
try {
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="DefaultSplitAssigner";
}
}
catch(err) {
}
//-->
var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10};
var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
var altColor = "altColor";
var rowColor = "rowColor";
var tableTab = "tableTab";
var activeTableTab = "activeTableTab";
var pathtoroot = "../../../../../../";
var useModuleDirectories = true;
loadScripts(document, 'script');</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
<header role="banner">
<nav role="navigation">
<div class="fixedNav">
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a id="navbar.top">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
<a id="navbar.top.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../../../index.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" id="allclasses_navbar_top">
<li><a href="../../../../../../allclasses.html">All&nbsp;Classes</a></li>
</ul>
<ul class="navListSearch">
<li><label for="search">SEARCH:</label>
<input type="text" id="search" value="search" disabled="disabled">
<input type="reset" id="reset" value="reset" disabled="disabled">
</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>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.summary">Constr</a>&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><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a id="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
</div>
<div class="navPadding">&nbsp;</div>
<script type="text/javascript"><!--
$('.navPadding').css('padding-top', $('.fixedNav').css("height"));
//-->
</script>
</nav>
</header>
<!-- ======== START OF CLASS DATA ======== -->
<main role="main">
<div class="header">
<div class="subTitle"><span class="packageLabelInType">Package</span>&nbsp;<a href="package-summary.html">org.apache.iceberg.flink.source.assigner</a></div>
<h2 title="Class DefaultSplitAssigner" class="title">Class DefaultSplitAssigner</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
<li>java.lang.Object</li>
<li>
<ul class="inheritance">
<li>org.apache.iceberg.flink.source.assigner.DefaultSplitAssigner</li>
</ul>
</li>
</ul>
<div class="description">
<ul class="blockList">
<li class="blockList">
<dl>
<dt>All Implemented Interfaces:</dt>
<dd><code>java.io.Closeable</code>, <code>java.lang.AutoCloseable</code>, <code><a href="SplitAssigner.html" title="interface in org.apache.iceberg.flink.source.assigner">SplitAssigner</a></code></dd>
</dl>
<hr>
<pre>@Internal
public class <span class="typeNameLabel">DefaultSplitAssigner</span>
extends java.lang.Object
implements <a href="SplitAssigner.html" title="interface in org.apache.iceberg.flink.source.assigner">SplitAssigner</a></pre>
<div class="block">Since all methods are called in the source coordinator thread by enumerator, there is no need for
locking.</div>
</li>
</ul>
</div>
<div class="summary">
<ul class="blockList">
<li class="blockList">
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
<section>
<ul class="blockList">
<li class="blockList"><a id="constructor.summary">
<!-- -->
</a>
<h3>Constructor Summary</h3>
<table class="memberSummary">
<caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colFirst" scope="col">Constructor</th>
<th class="colLast" scope="col">Description</th>
</tr>
<tr class="altColor">
<th class="colConstructorName" scope="row"><code><span class="memberNameLink"><a href="#%3Cinit%3E(org.apache.iceberg.flink.source.split.SerializableComparator)">DefaultSplitAssigner</a></span>&#8203;(<a href="../split/SerializableComparator.html" title="interface in org.apache.iceberg.flink.source.split">SerializableComparator</a>&lt;<a href="../split/IcebergSourceSplit.html" title="class in org.apache.iceberg.flink.source.split">IcebergSourceSplit</a>&gt;&nbsp;comparator)</code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr class="rowColor">
<th class="colConstructorName" scope="row"><code><span class="memberNameLink"><a href="#%3Cinit%3E(org.apache.iceberg.flink.source.split.SerializableComparator,java.util.Collection)">DefaultSplitAssigner</a></span>&#8203;(<a href="../split/SerializableComparator.html" title="interface in org.apache.iceberg.flink.source.split">SerializableComparator</a>&lt;<a href="../split/IcebergSourceSplit.html" title="class in org.apache.iceberg.flink.source.split">IcebergSourceSplit</a>&gt;&nbsp;comparator,
java.util.Collection&lt;<a href="../split/IcebergSourceSplitState.html" title="class in org.apache.iceberg.flink.source.split">IcebergSourceSplitState</a>&gt;&nbsp;assignerState)</code></th>
<td class="colLast">&nbsp;</td>
</tr>
</table>
</li>
</ul>
</section>
<!-- ========== METHOD SUMMARY =========== -->
<section>
<ul class="blockList">
<li class="blockList"><a id="method.summary">
<!-- -->
</a>
<h3>Method Summary</h3>
<table class="memberSummary">
<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="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colSecond" scope="col">Method</th>
<th class="colLast" scope="col">Description</th>
</tr>
<tr id="i0" class="altColor">
<td class="colFirst"><code><a href="GetSplitResult.html" title="class in org.apache.iceberg.flink.source.assigner">GetSplitResult</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getNext(java.lang.String)">getNext</a></span>&#8203;(java.lang.String&nbsp;hostname)</code></th>
<td class="colLast">
<div class="block">Request a new split from the assigner when enumerator trying to assign splits to awaiting
readers.</div>
</td>
</tr>
<tr id="i1" class="rowColor">
<td class="colFirst"><code>java.util.concurrent.CompletableFuture&lt;java.lang.Void&gt;</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#isAvailable()">isAvailable</a></span>()</code></th>
<td class="colLast">
<div class="block">Enumerator can get a notification via CompletableFuture when the assigner has more splits
available later.</div>
</td>
</tr>
<tr id="i2" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#onDiscoveredSplits(java.util.Collection)">onDiscoveredSplits</a></span>&#8203;(java.util.Collection&lt;<a href="../split/IcebergSourceSplit.html" title="class in org.apache.iceberg.flink.source.split">IcebergSourceSplit</a>&gt;&nbsp;splits)</code></th>
<td class="colLast">
<div class="block">Add new splits discovered by enumerator</div>
</td>
</tr>
<tr id="i3" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#onUnassignedSplits(java.util.Collection)">onUnassignedSplits</a></span>&#8203;(java.util.Collection&lt;<a href="../split/IcebergSourceSplit.html" title="class in org.apache.iceberg.flink.source.split">IcebergSourceSplit</a>&gt;&nbsp;splits)</code></th>
<td class="colLast">
<div class="block">Forward addSplitsBack event (for failed reader) to assigner</div>
</td>
</tr>
<tr id="i4" class="altColor">
<td class="colFirst"><code>long</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#pendingRecords()">pendingRecords</a></span>()</code></th>
<td class="colLast">
<div class="block">Return the number of pending records, which can act as a measure of the source lag.</div>
</td>
</tr>
<tr id="i5" class="rowColor">
<td class="colFirst"><code>int</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#pendingSplitCount()">pendingSplitCount</a></span>()</code></th>
<td class="colLast">
<div class="block">Return the number of pending splits that haven't been assigned yet.</div>
</td>
</tr>
<tr id="i6" class="altColor">
<td class="colFirst"><code>java.util.Collection&lt;<a href="../split/IcebergSourceSplitState.html" title="class in org.apache.iceberg.flink.source.split">IcebergSourceSplitState</a>&gt;</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#state()">state</a></span>()</code></th>
<td class="colLast">
<div class="block">Simple assigner only tracks unassigned splits</div>
</td>
</tr>
</table>
<ul class="blockList">
<li class="blockList"><a id="methods.inherited.from.class.java.lang.Object">
<!-- -->
</a>
<h3>Methods inherited from class&nbsp;java.lang.Object</h3>
<code>clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</code></li>
</ul>
<ul class="blockList">
<li class="blockList"><a id="methods.inherited.from.class.org.apache.iceberg.flink.source.assigner.SplitAssigner">
<!-- -->
</a>
<h3>Methods inherited from interface&nbsp;org.apache.iceberg.flink.source.assigner.<a href="SplitAssigner.html" title="interface in org.apache.iceberg.flink.source.assigner">SplitAssigner</a></h3>
<code><a href="SplitAssigner.html#close()">close</a>, <a href="SplitAssigner.html#onCompletedSplits(java.util.Collection)">onCompletedSplits</a>, <a href="SplitAssigner.html#start()">start</a></code></li>
</ul>
</li>
</ul>
</section>
</li>
</ul>
</div>
<div class="details">
<ul class="blockList">
<li class="blockList">
<!-- ========= CONSTRUCTOR DETAIL ======== -->
<section>
<ul class="blockList">
<li class="blockList"><a id="constructor.detail">
<!-- -->
</a>
<h3>Constructor Detail</h3>
<a id="&lt;init&gt;(org.apache.iceberg.flink.source.split.SerializableComparator)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>DefaultSplitAssigner</h4>
<pre>public&nbsp;DefaultSplitAssigner&#8203;(<a href="../split/SerializableComparator.html" title="interface in org.apache.iceberg.flink.source.split">SerializableComparator</a>&lt;<a href="../split/IcebergSourceSplit.html" title="class in org.apache.iceberg.flink.source.split">IcebergSourceSplit</a>&gt;&nbsp;comparator)</pre>
</li>
</ul>
<a id="&lt;init&gt;(org.apache.iceberg.flink.source.split.SerializableComparator,java.util.Collection)">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>DefaultSplitAssigner</h4>
<pre>public&nbsp;DefaultSplitAssigner&#8203;(<a href="../split/SerializableComparator.html" title="interface in org.apache.iceberg.flink.source.split">SerializableComparator</a>&lt;<a href="../split/IcebergSourceSplit.html" title="class in org.apache.iceberg.flink.source.split">IcebergSourceSplit</a>&gt;&nbsp;comparator,
java.util.Collection&lt;<a href="../split/IcebergSourceSplitState.html" title="class in org.apache.iceberg.flink.source.split">IcebergSourceSplitState</a>&gt;&nbsp;assignerState)</pre>
</li>
</ul>
</li>
</ul>
</section>
<!-- ============ METHOD DETAIL ========== -->
<section>
<ul class="blockList">
<li class="blockList"><a id="method.detail">
<!-- -->
</a>
<h3>Method Detail</h3>
<a id="getNext(java.lang.String)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getNext</h4>
<pre class="methodSignature">public&nbsp;<a href="GetSplitResult.html" title="class in org.apache.iceberg.flink.source.assigner">GetSplitResult</a>&nbsp;getNext&#8203;(@Nullable
java.lang.String&nbsp;hostname)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="SplitAssigner.html#getNext(java.lang.String)">SplitAssigner</a></code></span></div>
<div class="block">Request a new split from the assigner when enumerator trying to assign splits to awaiting
readers.
<p>If enumerator wasn't able to assign the split (e.g., reader disconnected), enumerator should
call <a href="SplitAssigner.html#onUnassignedSplits(java.util.Collection)"><code>SplitAssigner.onUnassignedSplits(java.util.Collection&lt;org.apache.iceberg.flink.source.split.IcebergSourceSplit&gt;)</code></a> to return the split.</div>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="SplitAssigner.html#getNext(java.lang.String)">getNext</a></code>&nbsp;in interface&nbsp;<code><a href="SplitAssigner.html" title="interface in org.apache.iceberg.flink.source.assigner">SplitAssigner</a></code></dd>
</dl>
</li>
</ul>
<a id="onDiscoveredSplits(java.util.Collection)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>onDiscoveredSplits</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;onDiscoveredSplits&#8203;(java.util.Collection&lt;<a href="../split/IcebergSourceSplit.html" title="class in org.apache.iceberg.flink.source.split">IcebergSourceSplit</a>&gt;&nbsp;splits)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="SplitAssigner.html#onDiscoveredSplits(java.util.Collection)">SplitAssigner</a></code></span></div>
<div class="block">Add new splits discovered by enumerator</div>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="SplitAssigner.html#onDiscoveredSplits(java.util.Collection)">onDiscoveredSplits</a></code>&nbsp;in interface&nbsp;<code><a href="SplitAssigner.html" title="interface in org.apache.iceberg.flink.source.assigner">SplitAssigner</a></code></dd>
</dl>
</li>
</ul>
<a id="onUnassignedSplits(java.util.Collection)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>onUnassignedSplits</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;onUnassignedSplits&#8203;(java.util.Collection&lt;<a href="../split/IcebergSourceSplit.html" title="class in org.apache.iceberg.flink.source.split">IcebergSourceSplit</a>&gt;&nbsp;splits)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="SplitAssigner.html#onUnassignedSplits(java.util.Collection)">SplitAssigner</a></code></span></div>
<div class="block">Forward addSplitsBack event (for failed reader) to assigner</div>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="SplitAssigner.html#onUnassignedSplits(java.util.Collection)">onUnassignedSplits</a></code>&nbsp;in interface&nbsp;<code><a href="SplitAssigner.html" title="interface in org.apache.iceberg.flink.source.assigner">SplitAssigner</a></code></dd>
</dl>
</li>
</ul>
<a id="state()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>state</h4>
<pre class="methodSignature">public&nbsp;java.util.Collection&lt;<a href="../split/IcebergSourceSplitState.html" title="class in org.apache.iceberg.flink.source.split">IcebergSourceSplitState</a>&gt;&nbsp;state()</pre>
<div class="block">Simple assigner only tracks unassigned splits</div>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="SplitAssigner.html#state()">state</a></code>&nbsp;in interface&nbsp;<code><a href="SplitAssigner.html" title="interface in org.apache.iceberg.flink.source.assigner">SplitAssigner</a></code></dd>
</dl>
</li>
</ul>
<a id="isAvailable()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>isAvailable</h4>
<pre class="methodSignature">public&nbsp;java.util.concurrent.CompletableFuture&lt;java.lang.Void&gt;&nbsp;isAvailable()</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="SplitAssigner.html#isAvailable()">SplitAssigner</a></code></span></div>
<div class="block">Enumerator can get a notification via CompletableFuture when the assigner has more splits
available later. Enumerator should schedule assignment in the thenAccept action of the future.
<p>Assigner will return the same future if this method is called again before the previous
future is completed.
<p>The future can be completed from other thread, e.g. the coordinator thread from another
thread for event time alignment.
<p>If enumerator need to trigger action upon the future completion, it may want to run it in
the coordinator thread using <code>SplitEnumeratorContext.runInCoordinatorThread(Runnable)</code>.</div>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="SplitAssigner.html#isAvailable()">isAvailable</a></code>&nbsp;in interface&nbsp;<code><a href="SplitAssigner.html" title="interface in org.apache.iceberg.flink.source.assigner">SplitAssigner</a></code></dd>
</dl>
</li>
</ul>
<a id="pendingSplitCount()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>pendingSplitCount</h4>
<pre class="methodSignature">public&nbsp;int&nbsp;pendingSplitCount()</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="SplitAssigner.html#pendingSplitCount()">SplitAssigner</a></code></span></div>
<div class="block">Return the number of pending splits that haven't been assigned yet.
<p>The enumerator can poll this API to publish a metric on the number of pending splits.
<p>The enumerator can also use this information to throttle split discovery for streaming read.
If there are already many pending splits tracked by the assigner, it is undesirable to discover
more splits and track them in the assigner. That will increase the memory footprint and
enumerator checkpoint size.
<p>Throttling works better together with <a href="../ScanContext.html#maxPlanningSnapshotCount()"><code>ScanContext.maxPlanningSnapshotCount()</code></a>.
Otherwise, the next split discovery after throttling will just discover all non-enumerated
snapshots and splits, which defeats the purpose of throttling.</div>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="SplitAssigner.html#pendingSplitCount()">pendingSplitCount</a></code>&nbsp;in interface&nbsp;<code><a href="SplitAssigner.html" title="interface in org.apache.iceberg.flink.source.assigner">SplitAssigner</a></code></dd>
</dl>
</li>
</ul>
<a id="pendingRecords()">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>pendingRecords</h4>
<pre class="methodSignature">public&nbsp;long&nbsp;pendingRecords()</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="SplitAssigner.html#pendingRecords()">SplitAssigner</a></code></span></div>
<div class="block">Return the number of pending records, which can act as a measure of the source lag. This value
could be an estimation if the exact number of records cannot be accurately computed.</div>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="SplitAssigner.html#pendingRecords()">pendingRecords</a></code>&nbsp;in interface&nbsp;<code><a href="SplitAssigner.html" title="interface in org.apache.iceberg.flink.source.assigner">SplitAssigner</a></code></dd>
</dl>
</li>
</ul>
</li>
</ul>
</section>
</li>
</ul>
</div>
</div>
</main>
<!-- ========= END OF CLASS DATA ========= -->
<footer role="contentinfo">
<nav role="navigation">
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a id="navbar.bottom">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
<a id="navbar.bottom.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../../../index.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" id="allclasses_navbar_bottom">
<li><a href="../../../../../../allclasses.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>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.summary">Constr</a>&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><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a id="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
</nav>
</footer>
</body>
</html>