blob: f35d3278f9f7a59adbacada76b2d4e7562498a4b [file] [log] [blame]
<!DOCTYPE HTML>
<html lang="" >
<head>
<title>Message Expiry ยท ActiveMQ Artemis Documentation</title>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<meta name="description" content="">
<meta name="generator" content="GitBook 3.1.1">
<link rel="stylesheet" href="gitbook/style.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-highlight/website.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-search/search.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-fontsettings/website.css">
<meta name="HandheldFriendly" content="true"/>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<link rel="apple-touch-icon-precomposed" sizes="152x152" href="gitbook/images/apple-touch-icon-precomposed-152.png">
<link rel="shortcut icon" href="gitbook/images/favicon.ico" type="image/x-icon">
<link rel="next" href="large-messages.html" />
<link rel="prev" href="undelivered-messages.html" />
</head>
<body>
<div class="book">
<div class="book-summary">
<div id="book-search-input" role="search">
<input type="text" placeholder="Type to search" />
</div>
<nav role="navigation">
<ul class="summary">
<li class="chapter " data-level="1.1" data-path="./">
<a href="./">
Introduction
</a>
</li>
<li class="chapter " data-level="1.2" data-path="notice.html">
<a href="notice.html">
Legal Notice
</a>
</li>
<li class="chapter " data-level="1.3" data-path="preface.html">
<a href="preface.html">
Preface
</a>
</li>
<li class="chapter " data-level="1.4" data-path="project-info.html">
<a href="project-info.html">
Project Info
</a>
</li>
<li class="chapter " data-level="1.5" data-path="versions.html">
<a href="versions.html">
Versions
</a>
</li>
<li class="chapter " data-level="1.6" data-path="messaging-concepts.html">
<a href="messaging-concepts.html">
Messaging Concepts
</a>
</li>
<li class="chapter " data-level="1.7" data-path="architecture.html">
<a href="architecture.html">
Architecture
</a>
</li>
<li class="chapter " data-level="1.8" data-path="using-server.html">
<a href="using-server.html">
Using the Server
</a>
</li>
<li class="chapter " data-level="1.9" data-path="upgrading.html">
<a href="upgrading.html">
Upgrading
</a>
</li>
<li class="chapter " data-level="1.10" data-path="address-model.html">
<a href="address-model.html">
Address Model
</a>
</li>
<li class="chapter " data-level="1.11" data-path="protocols-interoperability.html">
<a href="protocols-interoperability.html">
Protocols and Interoperability
</a>
</li>
<li class="chapter " data-level="1.12" data-path="amqp.html">
<a href="amqp.html">
AMQP
</a>
</li>
<li class="chapter " data-level="1.13" data-path="mqtt.html">
<a href="mqtt.html">
MQTT
</a>
</li>
<li class="chapter " data-level="1.14" data-path="stomp.html">
<a href="stomp.html">
STOMP
</a>
</li>
<li class="chapter " data-level="1.15" data-path="openwire.html">
<a href="openwire.html">
OpenWire
</a>
</li>
<li class="chapter " data-level="1.16" data-path="core.html">
<a href="core.html">
Core
</a>
</li>
<li class="chapter " data-level="1.17" data-path="jms-core-mapping.html">
<a href="jms-core-mapping.html">
Mapping JMS Concepts to the Core API
</a>
</li>
<li class="chapter " data-level="1.18" data-path="using-jms.html">
<a href="using-jms.html">
Using JMS
</a>
</li>
<li class="chapter " data-level="1.19" data-path="client-classpath.html">
<a href="client-classpath.html">
The Client Classpath
</a>
</li>
<li class="chapter " data-level="1.20" data-path="examples.html">
<a href="examples.html">
Examples
</a>
</li>
<li class="chapter " data-level="1.21" data-path="wildcard-routing.html">
<a href="wildcard-routing.html">
Routing Messages With Wild Cards
</a>
</li>
<li class="chapter " data-level="1.22" data-path="wildcard-syntax.html">
<a href="wildcard-syntax.html">
Wildcard Syntax
</a>
</li>
<li class="chapter " data-level="1.23" data-path="filter-expressions.html">
<a href="filter-expressions.html">
Filter Expressions
</a>
</li>
<li class="chapter " data-level="1.24" data-path="persistence.html">
<a href="persistence.html">
Persistence
</a>
</li>
<li class="chapter " data-level="1.25" data-path="configuring-transports.html">
<a href="configuring-transports.html">
Configuring Transports
</a>
</li>
<li class="chapter " data-level="1.26" data-path="config-reload.html">
<a href="config-reload.html">
Configuration Reload
</a>
</li>
<li class="chapter " data-level="1.27" data-path="connection-ttl.html">
<a href="connection-ttl.html">
Detecting Dead Connections
</a>
</li>
<li class="chapter " data-level="1.28" data-path="slow-consumers.html">
<a href="slow-consumers.html">
Detecting Slow Consumers
</a>
</li>
<li class="chapter " data-level="1.29" data-path="network-isolation.html">
<a href="network-isolation.html">
Avoiding Network Isolation
</a>
</li>
<li class="chapter " data-level="1.30" data-path="critical-analysis.html">
<a href="critical-analysis.html">
Detecting Broker Issues (Critical Analysis)
</a>
</li>
<li class="chapter " data-level="1.31" data-path="transaction-config.html">
<a href="transaction-config.html">
Resource Manager Configuration
</a>
</li>
<li class="chapter " data-level="1.32" data-path="flow-control.html">
<a href="flow-control.html">
Flow Control
</a>
</li>
<li class="chapter " data-level="1.33" data-path="send-guarantees.html">
<a href="send-guarantees.html">
Guarantees of sends and commits
</a>
</li>
<li class="chapter " data-level="1.34" data-path="undelivered-messages.html">
<a href="undelivered-messages.html">
Message Redelivery and Undelivered Messages
</a>
</li>
<li class="chapter active" data-level="1.35" data-path="message-expiry.html">
<a href="message-expiry.html">
Message Expiry
</a>
</li>
<li class="chapter " data-level="1.36" data-path="large-messages.html">
<a href="large-messages.html">
Large Messages
</a>
</li>
<li class="chapter " data-level="1.37" data-path="paging.html">
<a href="paging.html">
Paging
</a>
</li>
<li class="chapter " data-level="1.38" data-path="scheduled-messages.html">
<a href="scheduled-messages.html">
Scheduled Messages
</a>
</li>
<li class="chapter " data-level="1.39" data-path="last-value-queues.html">
<a href="last-value-queues.html">
Last-Value Queues
</a>
</li>
<li class="chapter " data-level="1.40" data-path="ring-queues.html">
<a href="ring-queues.html">
Ring Queues
</a>
</li>
<li class="chapter " data-level="1.41" data-path="retroactive-addresses.html">
<a href="retroactive-addresses.html">
Retroactive Addresses
</a>
</li>
<li class="chapter " data-level="1.42" data-path="exclusive-queues.html">
<a href="exclusive-queues.html">
Exclusive Queues
</a>
</li>
<li class="chapter " data-level="1.43" data-path="message-grouping.html">
<a href="message-grouping.html">
Message Grouping
</a>
</li>
<li class="chapter " data-level="1.44" data-path="consumer-priority.html">
<a href="consumer-priority.html">
Consumer Priority
</a>
</li>
<li class="chapter " data-level="1.45" data-path="pre-acknowledge.html">
<a href="pre-acknowledge.html">
Extra Acknowledge Modes
</a>
</li>
<li class="chapter " data-level="1.46" data-path="management.html">
<a href="management.html">
Management
</a>
</li>
<li class="chapter " data-level="1.47" data-path="management-console.html">
<a href="management-console.html">
Management Console
</a>
</li>
<li class="chapter " data-level="1.48" data-path="metrics.html">
<a href="metrics.html">
Metrics
</a>
</li>
<li class="chapter " data-level="1.49" data-path="security.html">
<a href="security.html">
Security
</a>
</li>
<li class="chapter " data-level="1.50" data-path="masking-passwords.html">
<a href="masking-passwords.html">
Masking Passwords
</a>
</li>
<li class="chapter " data-level="1.51" data-path="broker-plugins.html">
<a href="broker-plugins.html">
Broker Plugins
</a>
</li>
<li class="chapter " data-level="1.52" data-path="resource-limits.html">
<a href="resource-limits.html">
Resource Limits
</a>
</li>
<li class="chapter " data-level="1.53" data-path="jms-bridge.html">
<a href="jms-bridge.html">
The JMS Bridge
</a>
</li>
<li class="chapter " data-level="1.54" data-path="client-reconnection.html">
<a href="client-reconnection.html">
Client Reconnection and Session Reattachment
</a>
</li>
<li class="chapter " data-level="1.55" data-path="diverts.html">
<a href="diverts.html">
Diverting and Splitting Message Flows
</a>
</li>
<li class="chapter " data-level="1.56" data-path="core-bridges.html">
<a href="core-bridges.html">
Core Bridges
</a>
</li>
<li class="chapter " data-level="1.57" data-path="transformers.html">
<a href="transformers.html">
Transformers
</a>
</li>
<li class="chapter " data-level="1.58" data-path="duplicate-detection.html">
<a href="duplicate-detection.html">
Duplicate Message Detection
</a>
</li>
<li class="chapter " data-level="1.59" data-path="clusters.html">
<a href="clusters.html">
Clusters
</a>
</li>
<li class="chapter " data-level="1.60" data-path="federation.html">
<a href="federation.html">
Federation
</a>
<ul class="articles">
<li class="chapter " data-level="1.60.1" data-path="federation-address.html">
<a href="federation-address.html">
Address Federation
</a>
</li>
<li class="chapter " data-level="1.60.2" data-path="federation-queue.html">
<a href="federation-queue.html">
Queue Federation
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="1.61" data-path="ha.html">
<a href="ha.html">
High Availability and Failover
</a>
</li>
<li class="chapter " data-level="1.62" data-path="graceful-shutdown.html">
<a href="graceful-shutdown.html">
Graceful Server Shutdown
</a>
</li>
<li class="chapter " data-level="1.63" data-path="libaio.html">
<a href="libaio.html">
Libaio Native Libraries
</a>
</li>
<li class="chapter " data-level="1.64" data-path="thread-pooling.html">
<a href="thread-pooling.html">
Thread management
</a>
</li>
<li class="chapter " data-level="1.65" data-path="web-server.html">
<a href="web-server.html">
Embedded Web Server
</a>
</li>
<li class="chapter " data-level="1.66" data-path="logging.html">
<a href="logging.html">
Logging
</a>
</li>
<li class="chapter " data-level="1.67" data-path="rest.html">
<a href="rest.html">
REST Interface
</a>
</li>
<li class="chapter " data-level="1.68" data-path="embedding-activemq.html">
<a href="embedding-activemq.html">
Embedding the Broker
</a>
</li>
<li class="chapter " data-level="1.69" data-path="karaf.html">
<a href="karaf.html">
Apache Karaf
</a>
</li>
<li class="chapter " data-level="1.70" data-path="tomcat.html">
<a href="tomcat.html">
Apache Tomcat
</a>
</li>
<li class="chapter " data-level="1.71" data-path="spring-integration.html">
<a href="spring-integration.html">
Spring Integration
</a>
</li>
<li class="chapter " data-level="1.72" data-path="cdi-integration.html">
<a href="cdi-integration.html">
CDI Integration
</a>
</li>
<li class="chapter " data-level="1.73" data-path="intercepting-operations.html">
<a href="intercepting-operations.html">
Intercepting Operations
</a>
</li>
<li class="chapter " data-level="1.74" data-path="data-tools.html">
<a href="data-tools.html">
Data Tools
</a>
</li>
<li class="chapter " data-level="1.75" data-path="maven-plugin.html">
<a href="maven-plugin.html">
Maven Plugin
</a>
</li>
<li class="chapter " data-level="1.76" data-path="unit-testing.html">
<a href="unit-testing.html">
Unit Testing
</a>
</li>
<li class="chapter " data-level="1.77" data-path="perf-tuning.html">
<a href="perf-tuning.html">
Troubleshooting and Performance Tuning
</a>
</li>
<li class="chapter " data-level="1.78" data-path="configuration-index.html">
<a href="configuration-index.html">
Configuration Reference
</a>
</li>
<li class="divider"></li>
<li>
<a href="https://www.gitbook.com" target="blank" class="gitbook-link">
Published with GitBook
</a>
</li>
</ul>
</nav>
</div>
<div class="book-body">
<div class="body-inner">
<div class="book-header" role="navigation">
<!-- Title -->
<h1>
<i class="fa fa-circle-o-notch fa-spin"></i>
<a href="." >Message Expiry</a>
</h1>
</div>
<div class="page-wrapper" tabindex="-1" role="main">
<div class="page-inner">
<div id="book-search-results">
<div class="search-noresults">
<section class="normal markdown-section">
<h1 id="message-expiry">Message Expiry</h1>
<p>Messages can be set with an optional <em>time to live</em> when sending them.</p>
<p>Apache ActiveMQ Artemis will not deliver a message to a consumer after it&apos;s
time to live has been exceeded. If the message hasn&apos;t been delivered by the
time that time to live is reached the server can discard it.</p>
<p>Apache ActiveMQ Artemis&apos;s addresses can be assigned an expiry address so that,
when messages are expired, they are removed from the queue and sent to the
expiry address. Many different queues can be bound to an expiry address. These
<em>expired</em> messages can later be consumed for further inspection.</p>
<h2 id="core-api">Core API</h2>
<p>Using Apache ActiveMQ Artemis Core API, you can set an expiration time directly
on the message:</p>
<pre><code class="lang-java"><span class="hljs-comment">// message will expire in 5000ms from now</span>
message.setExpiration(System.currentTimeMillis() + <span class="hljs-number">5000</span>);
</code></pre>
<p>JMS MessageProducer allows to set a TimeToLive for the messages it sent:</p>
<pre><code class="lang-java"><span class="hljs-comment">// messages sent by this producer will be retained for 5s (5000ms) before expiration</span>
producer.setTimeToLive(<span class="hljs-number">5000</span>);
</code></pre>
<p>Expired messages which are consumed from an expiry address have the following
properties:</p>
<ul>
<li><p><code>_AMQ_ORIG_ADDRESS</code></p>
<p>a String property containing the <em>original address</em> of the expired
message</p>
</li>
<li><p><code>_AMQ_ORIG_QUEUE</code></p>
<p>a String property containing the <em>original queue</em> of the expired
message</p>
</li>
<li><p><code>_AMQ_ACTUAL_EXPIRY</code></p>
<p>a Long property containing the <em>actual expiration time</em> of the
expired message</p>
</li>
</ul>
<h2 id="configuring-expiry-delay">Configuring Expiry Delay</h2>
<p>Default Expiry delay can be configured in the address-setting configuration:</p>
<pre><code class="lang-xml"><span class="hljs-comment">&lt;!-- expired messages in exampleQueue will be sent to the expiry address expiryQueue --&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">address-setting</span> <span class="hljs-attr">match</span>=<span class="hljs-string">&quot;exampleQueue&quot;</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">expiry-address</span>&gt;</span>expiryQueue<span class="hljs-tag">&lt;/<span class="hljs-name">expiry-address</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">expiry-delay</span>&gt;</span>10<span class="hljs-tag">&lt;/<span class="hljs-name">expiry-delay</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">address-setting</span>&gt;</span>
</code></pre>
<p><code>expiry-delay</code> defines the expiration time in milliseconds that will be used for messages
which are using the default expiration time (i.e. 0). </p>
<p>For example, if <code>expiry-delay</code> is set to &quot;10&quot; and a message which is using the default
expiration time (i.e.10) arrives then its expiration time of &quot;0&quot; will be changed to &quot;10.&quot;
However, if a message which is using an expiration time of &quot;20&quot; arrives then its expiration
time will remain unchanged. Setting <code>expiry-delay</code> to &quot;-1&quot; will disable this feature. </p>
<p>The default is &quot;-1&quot;.</p>
<h2 id="configuring-expiry-addresses">Configuring Expiry Addresses</h2>
<p>Expiry address are defined in the address-setting configuration:</p>
<pre><code class="lang-xml"><span class="hljs-comment">&lt;!-- expired messages in exampleQueue will be sent to the expiry address expiryQueue --&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">address-setting</span> <span class="hljs-attr">match</span>=<span class="hljs-string">&quot;exampleQueue&quot;</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">expiry-address</span>&gt;</span>expiryQueue<span class="hljs-tag">&lt;/<span class="hljs-name">expiry-address</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">address-setting</span>&gt;</span>
</code></pre>
<p>If messages are expired and no expiry address is specified, messages are simply
removed from the queue and dropped. Address <a href="wildcard-syntax.html">wildcards</a> can
be used to configure expiry address for a set of addresses.</p>
<h2 id="configuring-automatic-creation-of-expiry-resources">Configuring Automatic Creation of Expiry Resources</h2>
<p>It&apos;s common to segregate expired messages by their original address.
For example, a message sent to the <code>stocks</code> address that expired for some
reason might be ultimately routed to the <code>EXP.stocks</code> queue, and likewise
a message sent to the <code>orders</code> address that expired might be routed to
the <code>EXP.orders</code> queue.</p>
<p>Using this pattern can make it easy to track and administrate
expired messages. However, it can pose a challenge in environments
which predominantly use auto-created addresses and queues. Typically
administrators in those environments don&apos;t want to manually create
an <code>address-setting</code> to configure the <code>expiry-address</code> much less
the actual <code>address</code> and <code>queue</code> to hold the expired messages.</p>
<p>The solution to this problem is to set the <code>auto-create-expiry-resources</code>
<code>address-setting</code> to <code>true</code> (it&apos;s <code>false</code> by default) so that the
broker will create the <code>address</code> and <code>queue</code> to deal with the
expired messages automatically. The <code>address</code> created will be the
one defined by the <code>expiry-address</code>. A <code>MULTICAST</code> <code>queue</code> will be
created on that <code>address</code>. It will be named by the <code>address</code> to which
the message was originally sent, and it will have a filter defined using
the aforementioned <code>_AMQ_ORIG_ADDRESS</code> property so that it will only
receive messages sent to the relevant <code>address</code>. The <code>queue</code> name can be
configured with a prefix and suffix. See the relevant settings in the
table below:</p>
<table>
<thead>
<tr>
<th><code>address-setting</code></th>
<th>default</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>expiry-queue-prefix</code></td>
<td><code>EXP.</code></td>
</tr>
<tr>
<td><code>expiry-queue-suffix</code></td>
<td>`` (empty string)</td>
</tr>
</tbody>
</table>
<p>Here is an example configuration:</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">address-setting</span> <span class="hljs-attr">match</span>=<span class="hljs-string">&quot;#&quot;</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">expiry-address</span>&gt;</span>expiryAddress<span class="hljs-tag">&lt;/<span class="hljs-name">expiry-address</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">auto-create-expiry-resources</span>&gt;</span>true<span class="hljs-tag">&lt;/<span class="hljs-name">auto-create-expiry-resources</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">expiry-queue-prefix</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">expiry-queue-prefix</span>&gt;</span> <span class="hljs-comment">&lt;!-- override the default --&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">expiry-queue-suffix</span>&gt;</span>.EXP<span class="hljs-tag">&lt;/<span class="hljs-name">expiry-queue-suffix</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">address-setting</span>&gt;</span>
</code></pre>
<p>The queue holding the expired messages can be accessed directly
either by using the queue&apos;s name by itself (e.g. when using the core
client) or by using the fully qualified queue name (e.g. when using
a JMS client) just like any other queue. Also, note that the queue is
auto-created which means it will be auto-deleted as per the relevant
<code>address-settings</code>.</p>
<h2 id="configuring-the-expiry-reaper-thread">Configuring The Expiry Reaper Thread</h2>
<p>A reaper thread will periodically inspect the queues to check if messages have
expired.</p>
<p>The reaper thread can be configured with the following properties in
<code>broker.xml</code></p>
<ul>
<li><p><code>message-expiry-scan-period</code></p>
<p>How often the queues will be scanned to detect expired messages (in
milliseconds, default is 30000ms, set to <code>-1</code> to disable the reaper thread)</p>
</li>
</ul>
<h2 id="example">Example</h2>
<p>See the <a href="examples.html#message-expiration">Message Expiration Example</a> which
shows how message expiry is configured and used with JMS.</p>
</section>
</div>
<div class="search-results">
<div class="has-results">
<h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1>
<ul class="search-results-list"></ul>
</div>
<div class="no-results">
<h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
</div>
</div>
</div>
</div>
</div>
</div>
<a href="undelivered-messages.html" class="navigation navigation-prev " aria-label="Previous page: Message Redelivery and Undelivered Messages">
<i class="fa fa-angle-left"></i>
</a>
<a href="large-messages.html" class="navigation navigation-next " aria-label="Next page: Large Messages">
<i class="fa fa-angle-right"></i>
</a>
</div>
<script>
var gitbook = gitbook || [];
gitbook.push(function() {
gitbook.page.hasChanged({"page":{"title":"Message Expiry","level":"1.35","depth":1,"next":{"title":"Large Messages","level":"1.36","depth":1,"path":"large-messages.md","ref":"large-messages.md","articles":[]},"previous":{"title":"Message Redelivery and Undelivered Messages","level":"1.34","depth":1,"path":"undelivered-messages.md","ref":"undelivered-messages.md","articles":[]},"dir":"ltr"},"config":{"plugins":[],"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"pluginsConfig":{"highlight":{},"search":{},"lunr":{"maxIndexSize":1000000},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"fontsettings":{"theme":"white","family":"sans","size":2},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false}},"github":"apache/activemq-artemis","theme":"default","githubHost":"https://github.com/","pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"variables":{},"title":"ActiveMQ Artemis Documentation","links":{"home":"http://activemq.apache.org/artemis","issues":"https://issues.apache.org/jira/browse/ARTEMIS","contribute":"http://activemq.apache.org/contributing.html"},"gitbook":"3.x.x","description":"ActiveMQ Artemis User Guide and Reference Documentation"},"file":{"path":"message-expiry.md","mtime":"2020-04-29T20:40:00.000Z","type":"markdown"},"gitbook":{"version":"3.1.1","time":"2020-04-29T20:47:49.444Z"},"basePath":".","book":{"language":""}});
});
</script>
</div>
<script src="gitbook/gitbook.js"></script>
<script src="gitbook/theme.js"></script>
<script src="gitbook/gitbook-plugin-search/search-engine.js"></script>
<script src="gitbook/gitbook-plugin-search/search.js"></script>
<script src="gitbook/gitbook-plugin-lunr/lunr.min.js"></script>
<script src="gitbook/gitbook-plugin-lunr/search-lunr.js"></script>
<script src="gitbook/gitbook-plugin-sharing/buttons.js"></script>
<script src="gitbook/gitbook-plugin-fontsettings/fontsettings.js"></script>
</body>
</html>