blob: f194aeff85e355c8d671a115d4aeebd433085801 [file] [edit]
<!DOCTYPE html>
<html class="writer-html5" lang="en" data-content_root="../">
<head>
<meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Just-In-Time (JIT) API &mdash; ITT/JIT APIs Documentation documentation</title>
<link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=80d5e7a1" />
<link rel="stylesheet" type="text/css" href="../_static/css/theme.css?v=9edc463e" />
<link rel="canonical" href="https://intel.github.io/ittapi/src/jit-api-support.html" />
<script src="../_static/jquery.js?v=5d32c60e"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
<script src="../_static/documentation_options.js?v=5929fcd5"></script>
<script src="../_static/doctools.js?v=fd6eb6e6"></script>
<script src="../_static/sphinx_highlight.js?v=6ffebe34"></script>
<script src="../_static/js/theme.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="Compile and Link with JIT API" href="using-jit-api.html" />
<link rel="prev" title="User-Defined Synchronization API" href="ittapi/user-defined-synchronization-api.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../index.html" class="icon icon-home">
ITT/JIT APIs Documentation
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="overview.html">Overview</a></li>
<li class="toctree-l1"><a class="reference internal" href="build.html">Build from Source Code</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="api-support.html">Use the ITT/JIT APIs</a><ul class="current">
<li class="toctree-l2 current"><a class="reference internal" href="api-support.html#c-c-api-usage-and-reference">C/C++ API Usage and Reference:</a><ul class="current">
<li class="toctree-l3"><a class="reference internal" href="itt-api-support.html">Instrumentation and Tracing Technology (ITT) API</a></li>
<li class="toctree-l3 current"><a class="current reference internal" href="#">Just-In-Time (JIT) API</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#environment-variables-in-the-jit-profiling-api">Environment Variables in the JIT Profiling API</a></li>
<li class="toctree-l4"><a class="reference internal" href="#profile-trace-based-and-method-based-jit-compiled-code">Profile Trace-based and Method-based JIT-compiled Code</a></li>
<li class="toctree-l4"><a class="reference internal" href="#analyze-split-functions">Analyze Split Functions</a></li>
<li class="toctree-l4"><a class="reference internal" href="#explore-inline-functions">Explore Inline Functions</a></li>
<li class="toctree-l4"><a class="reference internal" href="#learn-more">Learn More</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="api-support.html#other-language-api-bindings">Other Language API Bindings:</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="ref_collector.html">ITT API Reference Collector</a></li>
<li class="toctree-l1"><a class="reference external" href="https://github.com/intel/ittapi">GitHub Project</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../index.html">ITT/JIT APIs Documentation</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content style-external-links">
<div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs">
<li><a href="../index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item"><a href="api-support.html">Use the ITT/JIT APIs</a></li>
<li class="breadcrumb-item active">Just-In-Time (JIT) API</li>
<li class="wy-breadcrumbs-aside">
<a href="../_sources/src/jit-api-support.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="just-in-time-jit-api">
<span id="jit-api-support"></span><h1>Just-In-Time (JIT) API<a class="headerlink" href="#just-in-time-jit-api" title="Link to this heading"></a></h1>
<p>Use the Just-In-Time (JIT) Profiling API to enable performance tools to collect
information about just-in-time generated codes. You must insert JIT Profiling
API calls in the code generator to report information before the JIT-compiled
code goes to execution. This information is collected at runtime and used by
tools like Intel® VTune™ Profiler to display performance metrics associated
with JIT-compiled code.</p>
<p>You can use the JIT Profiling API to profile scenarios like:</p>
<ul class="simple">
<li><p>Dynamic JIT compilation of JavaScript code traces</p></li>
<li><p>JIT execution in OpenCL™ applications</p></li>
<li><p>Java*/.NET* managed execution environments</p></li>
<li><p>Custom ISV JIT engines</p></li>
</ul>
<p>You can use the JIT Profiling API to profile such environments as
dynamic JIT compilation of JavaScript code traces, JIT execution in
OpenCL™ applications, Java*/.NET* managed execution environments, and
custom ISV JIT engines.</p>
<p>The JIT engine generates code during runtime and communicates through the
static part with a profiler object (Collector). During runtime, the JIT engine
reports the information about JIT-compiled code that is stored in a trace file
by the profiler object. After collection, the profiling tool uses the generated
trace file to resolve the JIT-compiled code.</p>
<p>Use the JIT Profiling API to:</p>
<ul class="simple">
<li><p><a class="reference internal" href="#profile-trace-based-and-method-based-jit-compiled-code"><span class="std std-ref">Profile Trace-based and Method-based JIT-compiled Code</span></a></p></li>
<li><p><a class="reference internal" href="#analyze-split-functions"><span class="std std-ref">Analyze Split Functions</span></a></p></li>
<li><p><a class="reference internal" href="#explore-inline-functions"><span class="std std-ref">Explore Inline Functions</span></a></p></li>
</ul>
<section id="environment-variables-in-the-jit-profiling-api">
<h2>Environment Variables in the JIT Profiling API<a class="headerlink" href="#environment-variables-in-the-jit-profiling-api" title="Link to this heading"></a></h2>
<p>The JIT Profiling API contains two environment variables:</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">INTEL_JIT_PROFILER32</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">INTEL_JIT_PROFILER64</span></code></p></li>
</ul>
<p>In turn, these variables contain paths to specific runtime libraries.</p>
<p>These variables are used to signal the replacement of the stub
implementation of the JIT API with the JIT API collector.
After you instrument your code with the JIT API and link it to the
JIT API stub (<code class="docutils literal notranslate"><span class="pre">libjitprofiling.lib/libjitprofiling.a</span></code>), when the
environment variables are set, your code loads the libraries defined
in the variables.</p>
<p>Make sure to set these environment variables for the <code class="docutils literal notranslate"><span class="pre">ittnotify_collector</span></code>
to enable data collection:</p>
<p>On Windows*:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="nv">INTEL_JIT_PROFILER32</span><span class="o">=</span>&lt;install-dir&gt;<span class="se">\b</span>in32<span class="se">\r</span>untime<span class="se">\i</span>ttnotify_collector.dll
<span class="nv">INTEL_JIT_PROFILER64</span><span class="o">=</span>&lt;install-dir&gt;<span class="se">\b</span>in64<span class="se">\r</span>untime<span class="se">\i</span>ttnotify_collector.dll
</pre></div>
</div>
<p>On Linux*:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="nv">INTEL_JIT_PROFILER32</span><span class="o">=</span>&lt;install-dir&gt;/lib32/runtime/libittnotify_collector.so
<span class="nv">INTEL_JIT_PROFILER64</span><span class="o">=</span>&lt;install-dir&gt;/lib64/runtime/libittnotify_collector.so
</pre></div>
</div>
<p>On FreeBSD*:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="nv">INTEL_JIT_PROFILER64</span><span class="o">=</span>&lt;target-package&gt;/lib64/runtime/libittnotify_collector.so
</pre></div>
</div>
</section>
<section id="profile-trace-based-and-method-based-jit-compiled-code">
<span id="id1"></span><h2>Profile Trace-based and Method-based JIT-compiled Code<a class="headerlink" href="#profile-trace-based-and-method-based-jit-compiled-code" title="Link to this heading"></a></h2>
<p>This is the most common scenario for using JIT Profiling API to profile
trace-based and method-based JIT-compiled code:</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;jitprofiling.h&gt;</span>
<span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">iJIT_IsProfilingActive</span><span class="p">()</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">iJIT_SAMPLING_ON</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="p">;</span>
<span class="p">}</span>
<span class="n">iJIT_Method_Load</span><span class="w"> </span><span class="n">jmethod</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="mi">0</span><span class="p">};</span>
<span class="n">jmethod</span><span class="p">.</span><span class="n">method_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">iJIT_GetNewMethodID</span><span class="p">();</span>
<span class="n">jmethod</span><span class="p">.</span><span class="n">method_name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;method_name&quot;</span><span class="p">;</span>
<span class="n">jmethod</span><span class="p">.</span><span class="n">class_file_name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;class_name&quot;</span><span class="p">;</span>
<span class="n">jmethod</span><span class="p">.</span><span class="n">source_file_name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;source_file_name&quot;</span><span class="p">;</span>
<span class="n">jmethod</span><span class="p">.</span><span class="n">method_load_address</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">code_addr</span><span class="p">;</span>
<span class="n">jmethod</span><span class="p">.</span><span class="n">method_size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">code_size</span><span class="p">;</span>
<span class="n">iJIT_NotifyEvent</span><span class="p">(</span><span class="n">iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="kt">void</span><span class="o">*</span><span class="p">)</span><span class="o">&amp;</span><span class="n">jmethod</span><span class="p">);</span>
<span class="n">iJIT_NotifyEvent</span><span class="p">(</span><span class="n">iJVM_EVENT_TYPE_SHUTDOWN</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">);</span>
</pre></div>
</div>
<p><strong>Usage Tips</strong></p>
<ul class="simple">
<li><p>If any <code class="docutils literal notranslate"><span class="pre">iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED</span></code> event overwrites a method
that has already been reported , that method becomes invalid. The memory
region of the method is treated as unloaded.</p></li>
<li><p>If the line number information that was provided contains multiple source
lines for the same assembly instruction (code location), the profiling tool
selects the first line number.</p></li>
<li><p>You can associate dynamically generated code with a module name. Use the
<code class="docutils literal notranslate"><span class="pre">iJIT_Method_Load_V2</span></code> structure for this purpose.</p></li>
<li><p>If you register a function with the same method ID multiple times and you
specify different module names, the profiling tool selects the module name
that was registered first. If you want to distinguish the same function
between different JIT engines, provide different method IDs for each
function. Other symbolic information, like source file, can be identical.</p></li>
</ul>
</section>
<section id="analyze-split-functions">
<span id="id2"></span><h2>Analyze Split Functions<a class="headerlink" href="#analyze-split-functions" title="Link to this heading"></a></h2>
<p>You can use the JIT Profiling API to analyze split functions. This scenario
often occurs in resource-limited environments where the code for the same
function is generated or updated in separate segments. Sometimes this code
generation can happen with overlapping lifetimes.</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;jitprofiling.h&gt;</span>
<span class="kt">unsigned</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">method_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">iJIT_GetNewMethodID</span><span class="p">();</span>
<span class="n">iJIT_Method_Load</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="mi">0</span><span class="p">};</span>
<span class="n">a</span><span class="p">.</span><span class="n">method_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">method_id</span><span class="p">;</span>
<span class="n">a</span><span class="p">.</span><span class="n">method_load_address</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mh">0x100</span><span class="p">;</span>
<span class="n">a</span><span class="p">.</span><span class="n">method_size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mh">0x20</span><span class="p">;</span>
<span class="n">iJIT_Method_Load</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="mi">0</span><span class="p">};</span>
<span class="n">b</span><span class="p">.</span><span class="n">method_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">method_id</span><span class="p">;</span>
<span class="n">b</span><span class="p">.</span><span class="n">method_load_address</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mh">0x200</span><span class="p">;</span>
<span class="n">b</span><span class="p">.</span><span class="n">method_size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mh">0x30</span><span class="p">;</span>
<span class="n">iJIT_NotifyEvent</span><span class="p">(</span><span class="n">iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="kt">void</span><span class="o">*</span><span class="p">)</span><span class="o">&amp;</span><span class="n">a</span><span class="p">);</span>
<span class="n">iJIT_NotifyEvent</span><span class="p">(</span><span class="n">iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="kt">void</span><span class="o">*</span><span class="p">)</span><span class="o">&amp;</span><span class="n">b</span><span class="p">)</span>
</pre></div>
</div>
<p><strong>Usage Tips</strong></p>
<ul class="simple">
<li><p>If a <code class="docutils literal notranslate"><span class="pre">iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED</span></code> event overwrites a method
that was already reported, that method becomes invalid and its memory
region is treated as unloaded.</p></li>
<li><p>All code regions that are reported with the same method ID are
considered to belong to the same method. Symbolic information
(method name, source file name) is taken from the first notification.
All subsequent notifications with the same method ID are processed only
for the information in the line number table.</p></li>
<li><p>If you register a second code region with a different source file
name and the same method ID, this information is saved and is not
considered as an extension of the first code region. However, the
profiling tool uses the source file of the first code region and
can map performance metrics incorrectly.</p></li>
<li><p>If you register a second code region with the same source file as
the one used for the first region and you use the same method ID,
the source file is discarded but the profiling tool maps metrics to
the source file correctly.</p></li>
<li><p>If you register a second code region with a null source file and
the same method ID, provided line number info will be associated
with the source file of the first code region.</p></li>
</ul>
</section>
<section id="explore-inline-functions">
<span id="id3"></span><h2>Explore Inline Functions<a class="headerlink" href="#explore-inline-functions" title="Link to this heading"></a></h2>
<p>You can use the JIT Profiling API to explore inline functions including
the multilevel hierarchy of nested inline methods that shows the distribution
of performance metrics.</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;jitprofiling.h&gt;</span>
<span class="c1">// method_id parent_id</span>
<span class="c1">// [-- c --] 3000 2000</span>
<span class="c1">// [---- d -----] 2001 1000</span>
<span class="c1">// [---- b ----] 2000 1000</span>
<span class="c1">// [------------ a ----------------] 1000 n/a</span>
<span class="n">iJIT_Method_Load</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="mi">0</span><span class="p">};</span>
<span class="n">a</span><span class="p">.</span><span class="n">method_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1000</span><span class="p">;</span>
<span class="n">iJIT_Method_Inline_Load</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="mi">0</span><span class="p">};</span>
<span class="n">b</span><span class="p">.</span><span class="n">method_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2000</span><span class="p">;</span>
<span class="n">b</span><span class="p">.</span><span class="n">parent_method_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1000</span><span class="p">;</span>
<span class="n">iJIT_Method_Inline_Load</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="mi">0</span><span class="p">};</span>
<span class="n">c</span><span class="p">.</span><span class="n">method_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">3000</span><span class="p">;</span>
<span class="n">c</span><span class="p">.</span><span class="n">parent_method_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2000</span><span class="p">;</span>
<span class="n">iJIT_Method_Inline_Load</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="mi">0</span><span class="p">};</span>
<span class="n">d</span><span class="p">.</span><span class="n">method_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2001</span><span class="p">;</span>
<span class="n">d</span><span class="p">.</span><span class="n">parent_method_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1000</span><span class="p">;</span>
<span class="n">iJIT_NotifyEvent</span><span class="p">(</span><span class="n">iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="kt">void</span><span class="o">*</span><span class="p">)</span><span class="o">&amp;</span><span class="n">a</span><span class="p">);</span>
<span class="n">iJIT_NotifyEvent</span><span class="p">(</span><span class="n">iJVM_EVENT_TYPE_METHOD_INLINE_LOAD_FINISHED</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="kt">void</span><span class="o">*</span><span class="p">)</span><span class="o">&amp;</span><span class="n">b</span><span class="p">);</span>
<span class="n">iJIT_NotifyEvent</span><span class="p">(</span><span class="n">iJVM_EVENT_TYPE_METHOD_INLINE_LOAD_FINISHED</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="kt">void</span><span class="o">*</span><span class="p">)</span><span class="o">&amp;</span><span class="n">c</span><span class="p">);</span>
<span class="n">iJIT_NotifyEvent</span><span class="p">(</span><span class="n">iJVM_EVENT_TYPE_METHOD_INLINE_LOAD_FINISHED</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="kt">void</span><span class="o">*</span><span class="p">)</span><span class="o">&amp;</span><span class="n">d</span><span class="p">);</span>
</pre></div>
</div>
<p><strong>Usage Tips</strong></p>
<ul class="simple">
<li><p>Each inline (<code class="docutils literal notranslate"><span class="pre">iJIT_Method_Inline_Load</span></code>) method should be associated
with two method IDs: one for itself; one for its immediate parent.</p></li>
<li><p>Address regions of inline methods of the same parent method cannot
overlap each other.</p></li>
<li><p>Execution of the parent method must not start until the parent method
and all its inline methods are reported.</p></li>
<li><p>For nested inline methods, the order of
<code class="docutils literal notranslate"><span class="pre">iJVM_EVENT_TYPE_METHOD_INLINE_LOAD_FINISHED</span></code> events is not important.</p></li>
<li><p>If any event overwrites either inline method or top parent method,
then the parent, including inline methods, becomes invalid and their
memory region is treated as unloaded.</p></li>
</ul>
</section>
<section id="learn-more">
<h2>Learn More<a class="headerlink" href="#learn-more" title="Link to this heading"></a></h2>
<div class="toctree-wrapper compound">
<ul>
<li class="toctree-l1"><a class="reference internal" href="using-jit-api.html">Compile and Link with JIT API</a></li>
<li class="toctree-l1"><a class="reference internal" href="jit-api-reference.html">JIT API Reference</a></li>
</ul>
</div>
</section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="ittapi/user-defined-synchronization-api.html" class="btn btn-neutral float-left" title="User-Defined Synchronization API" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="using-jit-api.html" class="btn btn-neutral float-right" title="Compile and Link with JIT API" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
<hr/>
<div role="contentinfo">
<p>&#169; Copyright 2026 Intel Corporation.</p>
</div>
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>