<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.35 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-kaestle-monitoring-plugins-interface-00" category="info" submissionType="independent" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.3 -->
  <front>
    <title abbrev="MPI">The Monitoring Plugins Interface</title>
    <seriesInfo name="Internet-Draft" value="draft-kaestle-monitoring-plugins-interface-00"/>
    <author fullname="Lorenz Kästle">
      <organization>The Monitoring Plugins Project</organization>
      <address>
        <email>lorenz@vulgrim.de</email>
      </address>
    </author>
    <date year="2023" month="June" day="21"/>
    <keyword>monitoring</keyword>
    <abstract>
      <?line 33?>

<t>This document aims to document the Monitoring Plugin Interface, a standard more or less
strictly implemented by different network monitoring solutions.
Implementers and Users of network monitoring solutions, monitoring plugins and libraries can use
this as a reference point as to how these programs interface with each other.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-kaestle-monitoring-plugins-interface/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/RincewindsHat/rfc-monitoring-plugins-interface"/>.</t>
    </note>
  </front>
  <middle>
    <?line 40?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>With the emergence of NetSaint/Nagios at the latest, these system and their successors/forks
have relied on a loose group of programs called "Monitoring Plugins" to do the lower level
task of actually determining the state of a particular entity or conduct measurements of certain
values.</t>
      <t>This document shall help users and especially developers of those programs as a basis
on how they should be implemented, how they should work and how they should behave.
It encourages the standardization of libraries, Monitoring Plugins and Monitoring Systems,
to reduce the cognitive load on users, administrators and developers, if they work with
different implementations.</t>
      <t>This document aims to be as general as possible and not to assume a special
implementation detail, e.g. the programming language, the install mechanism or the monitoring
system which executes the Monitoring Plugin.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<section anchor="def_range_expression">
        <name>Range expressions</name>
        <t>In many cases thresholds for metrics mark a certain range of values where the
values is considered to be good or bad if it is inside or outside. While for
significant number of metrics a upper (e.g. load on unixoid systems) or lower
(e.g. effective throughput, free space in memory or storage) border might
suffice, for some it does not, for example a temperature value from a
temperature sensor should be within certain range (e.g. between 10℃ and 45℃).</t>
        <t>Regarding input parameters this might be handled with options like
<tt>--critical-upper-temperature</tt> and <tt>--critical-lower-temperature</tt>, but this
creates a problem in the performance data output, if only scalar values could be
used. To resolve this situation the <em>Range expression</em> format was introduced,
with the following definition:</t>
        <t><tt>[@][start:][end]</tt></t>
        <t>where:</t>
        <ol spacing="normal" type="1"><li>At least <tt>start</tt> or <tt>end</tt> <bcp14>MUST</bcp14> be provided.</li>
          <li>
            <tt>start</tt> &lt;= <tt>end</tt></li>
          <li>If <tt>start</tt> == 0, then <tt>start</tt> can be omitted.</li>
          <li>If <tt>end</tt> is omitted, it has the "value" of positive infinity.</li>
          <li>Negative infinity can be specified with the tilde character <tt>~</tt>.</li>
          <li>If the prefix <tt>@</tt> IS given, the value exceeds the threshold if it is INSIDE the range between <tt>start</tt> and <tt>end</tt> (including the endpoints).</li>
          <li>If the prefix <tt>@</tt> is NOT given, the value exceeds the threshold if it is OUTSIDE of the range between <tt>start</tt> and <tt>end</tt> (including the endpoints).</li>
        </ol>
        <section anchor="examples">
          <name>Examples</name>
          <table>
            <thead>
              <tr>
                <th align="left">Range definition</th>
                <th align="left">Exceeds threshold if x...</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">10</td>
                <td align="left">&lt; 0 or &gt; 10, (outside the range of {0 .. 10})</td>
              </tr>
              <tr>
                <td align="left">10:</td>
                <td align="left">&lt; 10, (outside {10 .. &amp;#8734;})</td>
              </tr>
              <tr>
                <td align="left">~:10</td>
                <td align="left">&gt; 10, (outside the range of {-&amp;#8734; .. 10})</td>
              </tr>
              <tr>
                <td align="left">10:20</td>
                <td align="left">&lt; 10 or &gt; 20, (outside the range of {10 .. 20})</td>
              </tr>
              <tr>
                <td align="left">@10:20</td>
                <td align="left">&gt;= 10 and &lt;= 20, (inside the range of {10 .. 20})</td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
    </section>
    <section anchor="the-basic-monitoring-plugin-usage">
      <name>The basic Monitoring Plugin usage</name>
      <t>A Monitoring System executes a Monitoring Plugin. The Monitoring Plugin <bcp14>MAY</bcp14>
accept parameters in the form of command line arguments, environment variables
or a configuration file (the location of which <bcp14>MAY</bcp14> in turn be given on the
command line or via environment variable). The Monitoring Plugin then proceeds
to execute its duty and returns the result to the Monitoring System. Part of
the process of returning the result is the termination of the execution of the
Monitoring Plugin itself.</t>
    </section>
    <section anchor="input-parameters-for-a-monitoring-plugin">
      <name>Input Parameters for a Monitoring Plugin</name>
      <t>A Monitoring Plugin <bcp14>MUST</bcp14> expect input parameters as arguments during
execution, if any are needed/expected at all. It <bcp14>MAY</bcp14> accept these parameters
given as <em>environment variables</em> and it <bcp14>MAY</bcp14> accept them in a configuration file
(with a default path or a path given via arguments or <em>environment variables</em>).</t>
      <t>In general positional arguments are strongly discouraged.</t>
      <t>Some arguments <bcp14>MUST</bcp14> have this predetermined meaning, if they are used:</t>
      <table>
        <thead>
          <tr>
            <th align="left">Argument (long)</th>
            <th align="left">Argument (short version, optional)</th>
            <th align="left">Argument</th>
            <th align="left">Meaning</th>
            <th align="left">optional</th>
            <th align="left">can be given multiple times</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">--help</td>
            <td align="left">-h</td>
            <td align="left">None</td>
            <td align="left">Triggers the help functionality of the Monitoring Plugin, showing the individual parameters and their meaning, examples for usage of the Monitoring Plugin and general remarks about the how and why of the Monitoring Plugin. <bcp14>SHOULD</bcp14> overwrite all other options, meaning, they are ignored if <tt>--help</tt> is given. The Monitoring Plugin <bcp14>SHOULD</bcp14> exit with state UNKNOWN (3).</td>
            <td align="left">no</td>
            <td align="left">-- (makes no difference)</td>
          </tr>
          <tr>
            <td align="left">--version</td>
            <td align="left">-V</td>
            <td align="left">None</td>
            <td align="left">Shows the version of the Monitoring Plugin to allow users to report errors better and therefore help them and the developers. The Monitoring Plugin <bcp14>SHOULD</bcp14> exit with state UNKNOWN (3).</td>
            <td align="left">no</td>
            <td align="left">-- (makes no difference)</td>
          </tr>
          <tr>
            <td align="left">--timeout</td>
            <td align="left">-t</td>
            <td align="left">Integer (meaning seconds) or a time duration string</td>
            <td align="left">Sets a limit for the time which a Monitoring Plugin is given to execute. This is there to enforce the abortion of the test and improve the reaction time of the Monitoring System (e.g. in bad network conditions it might be helpful to abort the test prematurely and inform the user about that, than trying forever to do something which won't succeed. Or if soft real time constraints are present, a result might be worthless altogether after some time). A sane default is probably 30 seconds, although this depends heavily on the scenario and should be given a thought during development. If the execution is terminated by this timeout, it should exit with state UNKNOWN (3) and (if possible) give some helpful output in which stage of the execution the timeout occurred.</td>
            <td align="left">no</td>
            <td align="left">no</td>
          </tr>
          <tr>
            <td align="left">--hostname</td>
            <td align="left">-H</td>
            <td align="left">String, meaning either a DNS nameor an IP address of the targeted system</td>
            <td align="left">If the Monitoring Plugin targets exactly one other system on the network, this option should be used to tell it which one. If the Monitoring Plugin does its test just locally or the logic does not apply to it, this option is, of course, optional.</td>
            <td align="left">yes</td>
            <td align="left">no</td>
          </tr>
          <tr>
            <td align="left">--verbose</td>
            <td align="left">-v</td>
            <td align="left">None</td>
            <td align="left">Increases the verbosity of the output, thereby breaking the suggested rules about a short and concise output. The intention is to provide more information to a user.</td>
            <td align="left">yes</td>
            <td align="left">yes</td>
          </tr>
          <tr>
            <td align="left">--exit-ok</td>
            <td align="left"> </td>
            <td align="left">The Monitoring Plugin exits unconditionally with OK (0). Mostly useful for the purpose of packaging and testing plugins, but might be used to always ignore errors (e.g. to just collect data).</td>
            <td align="left">yes</td>
            <td align="left">no</td>
            <td align="left"> </td>
          </tr>
        </tbody>
      </table>
      <section anchor="examples-1">
        <name>Examples</name>
        <t>For the execution with <tt>--help</tt>:</t>
        <artwork><![CDATA[
$ my_check_plugin --help
]]></artwork>
        <t>the output might look like this:</t>
        <artwork><![CDATA[
my_check_plugin version 3.1.4
Licensed under the AGPLv1.
Repository: git.example.com/jdoe/my_check_plugin

This plugin just says hello. It fails if you don't give it a name.

Usage:
 my_check_plugin --name NAME [--greeting GREETING]

Options:
 --help
   this help
 --version
   Shows the version of the plugin
 --name NAME
   if given, uses NAME as a name to greet.
 --greeting GREETING
   if given, uses GREETING instead of Hello.

Examples:
$ my_check_plugin --name Jane
Hello Jane

$ my_check_plugin --greeting Ciao --name Alice
Ciao Alice
]]></artwork>
        <t>This imaginary Monitoring Plugin tries to be really helpful here, displays
the version, the license and the upstream repository with the help (although
not necessary), has a short description about the purpose, lists the options in
an easily readable way and even gives some examples.</t>
        <t>For the execution with <tt>--version</tt></t>
        <artwork><![CDATA[
$ my_check_plugin --version
]]></artwork>
        <t>the output might be a bit shorter:</t>
        <artwork><![CDATA[
my_check_plugin version 3.1.4
]]></artwork>
        <t>or even:</t>
        <artwork><![CDATA[
3.1.4
]]></artwork>
        <t>where both show the necessary information.</t>
      </section>
    </section>
    <section anchor="output-of-a-monitoring-plugin">
      <name>Output of a Monitoring Plugin</name>
      <t>The output of a Monitoring Plugin consists of two parts on the first level, the
<em>Exit Code</em> and output in textual form on <em>stdout</em>.</t>
      <section anchor="exit-code">
        <name>Exit Code</name>
        <t>The Monitoring Plugin <bcp14>MUST</bcp14> make use of the <em>Exit Code</em> as a
method to communicate a result to the Monitoring System. Since the <em>Exit
Code</em> is more or less standardized over different systems as an integer number
with a width of or greater than 8bit, the following mapping is used:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Exit Code (numerical)</th>
              <th align="left">Meaning (short)</th>
              <th align="left">Meaning (extended)</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0</td>
              <td align="left">OK</td>
              <td align="left">The execution of the Monitoring Plugin proceeded as planned and the tests appeared to function properly and the measured values are within their respective thresholds</td>
            </tr>
            <tr>
              <td align="left">1</td>
              <td align="left">WARNING</td>
              <td align="left">The execution of the Monitoring Plugin proceeded as planned and the tests appeared to <em>not</em> function properly or the measured values are <em>not</em> with their respective thresholds. The problem(s) do(es) <em>not</em> seem exceptionally grave though and do(es) <em>not</em> require immediate attention</td>
            </tr>
            <tr>
              <td align="left">2</td>
              <td align="left">CRITICAL</td>
              <td align="left">The execution of the Monitoring Plugin proceeded as planned and the tests appeared to <em>not</em> function properly or the measured values are <em>not</em> with their respective thresholds. The problem(s) <em>do(es)</em> seem exceptionally grave though and <em>do(es)</em> require immediate attention</td>
            </tr>
            <tr>
              <td align="left">3</td>
              <td align="left">UNKNOWN</td>
              <td align="left">The execution of the Monitoring Plugin <em>did not</em> proceed as planned. The reasons might be manifold, e.g. missing permissions, missing libraries, no available network connection to the destination, etc.. In summary: The Monitoring Plugin could <em>not</em> determine the state of whatever it should have been checking and can therefore make no reliable statement about it.</td>
            </tr>
            <tr>
              <td align="left">4-125</td>
              <td align="left">reserved for future use</td>
              <td align="left"> </td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="textual-output">
        <name>Textual Output</name>
        <t>The original purpose of the output on <em>stdout</em> was to provide human readable
information for the user of the Monitoring System, a way for the Monitoring
Plugin to communicate further details on what happened. This purpose still
exists, but was expanded with the, so called, performance data to
allow the machine readable communication of measured values for further
processing in the Monitoring System, e.g. for the creation of diagrams.</t>
        <t>Therefore the further explanation is split into <em>human readable output</em> and
<em>performance data</em>.</t>
        <section anchor="human-readable-output">
          <name>Human readable output</name>
          <t>This part of the output should give an user information about the state of the
test and, in the case of problems, ideally hint what the origin of the problem
might be or what the symptoms are. If the test relies on numeric values, this
might be displayed to give an user more information about the specific problem.
It might consist of one or more lines of printable symbols.</t>
          <t>Although no strict guidelines for creating this part of the output can really
be given, a developer should keep a potential user in mind. It might, for
example, be OK to put the output in a single line if there are only one or two
items of a similar type (think: multiple file systems, multiple sensors, etc.)
are present, but not if there 10 or 100, although this might present a valid
use case. If there are several different items exists in the output of the
Monitoring Plugin they probably <bcp14>SHOULD</bcp14> be given their own line in the output.</t>
          <section anchor="examples-2">
            <name>Examples</name>
            <artwork><![CDATA[
Remaining space on filesystem "/" is OK

Sensor temperature is within thresholds

Available Memory is too low

Sensore temperature exceeds thresholds
]]></artwork>
            <t>are OK, but</t>
            <artwork><![CDATA[
Remaining space on filesystem "/" is OK ( 62GiB / 128GiB )

Sensor temperature is within thresholds ( 42°C )

Available Memory is too low ( 126MiB / 32GiB )

Sensor temperature exceeds thresholds ( 78°C > 70°C )
]]></artwork>
            <t>are better.</t>
          </section>
        </section>
        <section anchor="performance-data">
          <name>Performance data</name>
          <t>In addition to the human readable part the output can
contain machine readable measurement values. These data points are separated
from the human readable part by the "|" symbol which is in effect until the end
of the output. The performance data then <bcp14>MUST</bcp14> consist of space (ASCII 0x20)
separated single values, these <bcp14>MUST</bcp14> have the following format:</t>
          <t><tt>[']label[']=value[UOM][;warn[;crit[;min[;max]]]]</tt></t>
          <t>with the following definitions:</t>
          <ol spacing="normal" type="1"><li>
              <tt>label</tt> <bcp14>MUST</bcp14> consist of at least on non-space character, but can otherwise
    contain any printable characters except for the equals sign (<tt>=</tt>) or single
    quotes (<tt>'</tt>). If it contains spaces, it must be surrounded by single quotes</li>
            <li>
              <tt>value</tt> is a numerical value, might be either an integer or a floating
    point number. Using floating point numbers if the value is really discreet
    <bcp14>SHOULD</bcp14> be avoided. The representation of a floating point number
    <bcp14>SHOULD NOT</bcp14> use the "scientific notation" (e.g. <tt>6.02e23</tt> or <tt>-3e-45</tt>),
    since some systems might not be able to parse them correctly. Values
    with a base other then 10 <bcp14>SHOULD</bcp14> be avoided (see below for more information
    on <tt>Byte</tt> values).</li>
            <li>
              <t><tt>UOM</tt> is the <em>Unit of measurement</em> (e.g. "B" for <em>Bytes</em>, "s" for seconds)
 which gives more context to the Monitoring System.  </t>
              <ul spacing="normal">
                <li>
                  <t>The following constraints <bcp14>MUST</bcp14> be applied:      </t>
                  <ol spacing="normal" type="1"><li>An <tt>UOM</tt> of <tt>%</tt> <bcp14>MUST</bcp14> be used for percentage values</li>
                    <li>An <tt>UOM</tt> of <tt>c</tt> <bcp14>MUST</bcp14> be used for continuous counters (commonly used
for the sum of bytes transmitted on an interface)</li>
                  </ol>
                </li>
                <li>
                  <t>The following recommendations <bcp14>SHOULD</bcp14> be applied:      </t>
                  <ol spacing="normal" type="1"><li>The <tt>UOM</tt> for <tt>Byte</tt> values is <tt>B</tt> and although many systems do
understand units like <tt>KB</tt>,<tt>KiB</tt>, <tt>MB</tt>, <tt>GB</tt>, <tt>TB</tt> they <bcp14>SHOULD</bcp14> be
avoided, at the least to avoid the ugly hassle about people
misinterpreting the <em>base10</em> values as <em>base2</em> values and the other way
round. This is also a prime example where floating point number <bcp14>SHOULD
NOT</bcp14> be used, since there are obviously only integer numbers included.</li>
                    <li>The <tt>UOM</tt> for time is <tt>s</tt>, meaning seconds, SI-Prefixes (e.g. <tt>ms</tt> for
milli seconds) are allowed if necessary or useful.</li>
                    <li>In general, SI units and SI prefixes <bcp14>MAY</bcp14> be used as <tt>UOM</tt> if
applicable, but the Monitoring System may not understand them correctly
(mostly in uncommon cases), in that cases appropriate workarounds <bcp14>MAY</bcp14> be
applied on the side of the Monitoring Plugin. Since the
values are not intented to be human readable normalized units are
recommended (e.g. <tt>overall_power=14000000000W</tt> instead of
<tt>overall_power=14GW</tt>)</li>
                    <li>
                      <tt>warn</tt> and <tt>crit</tt> are the threshold values for this measurement, which may
have been given by the user as input, may be hardcoded in the Monitoring
Plugin or may be retrieved from a file or a device or somewhere else
during the execution of the Monitoring Plugin. The unit used <bcp14>MUST</bcp14> be
the same as for <em>value</em>. These values are not simple numbers, but
range expressions (<xref target="def_range_expression"/>).</li>
                    <li>
                      <tt>min</tt> and <tt>max</tt> are the minimal respectively the maximal value the
<tt>value</tt> could possibly be. The unit <bcp14>MUST</bcp14> be the same as for <tt>value</tt>.
These values can be omitted, if the <tt>value</tt> is a percentage value,
since <tt>min</tt> and <tt>max</tt> are always <tt>0</tt> and <tt>100</tt> in this case.</li>
                  </ol>
                </li>
              </ul>
            </li>
          </ol>
        </section>
      </section>
    </section>
    <section anchor="implementation-status">
      <name>Implementation Status</name>
      <t>The interface metioned here is implemented by several network monitoring systems. A non-exhaustive
list of these systems includes:</t>
      <ul spacing="normal">
        <li>Icinga 2</li>
        <li>Naemon</li>
        <li>Nagios</li>
      </ul>
      <t>The other side of the interface is implemented by several different projects, again in an non-exhaustive
list:</t>
      <ul spacing="normal">
        <li>The Monitoring Plugins Project</li>
        <li>The Nagios Plugins Project</li>
        <li>The Linuxfabrik Monitoring Plugins</li>
        <li>Madrisan Nagios Plugins</li>
      </ul>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>Special security considerations are hard to define regarding this topic. Regarding the implementation
of this interface, the usual programming security considerations should apply (e.g. sanitize inputs),
but the risks and problems regarding security are dependent on the specific implementation and usage.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>Normative References</name>
      <reference anchor="RFC2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author fullname="S. Bradner" initials="S." surname="Bradner"/>
          <date month="March" year="1997"/>
          <abstract>
            <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized.  This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
        <seriesInfo name="DOI" value="10.17487/RFC2119"/>
      </reference>
      <reference anchor="RFC8174">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author fullname="B. Leiba" initials="B." surname="Leiba"/>
          <date month="May" year="2017"/>
          <abstract>
            <t>RFC 2119 specifies common key words that may be used in protocol specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
        <seriesInfo name="DOI" value="10.17487/RFC8174"/>
      </reference>
    </references>
    <?line 372?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
G6pHEMGy6wKopijWb0bRdAgKjE4l4KfjVzkVXL3kS0CDUs5YfaWbSjWFDGqb
EYFB4zpn7hIK7eFz0g5KbXLxg1KV5t9JAhql0Vz7hC2pyjtCgvgOYQolSkoT
KaWbBGrduOLzSoqilNOclaQO3o0rulwuF6MUuiqp1CoGljIa2LEel37ZdTbo
42rVlOrXkM3KTQzroB6TIHKCSvAgLkfK68I0boHtrxvBzN+p+3tRDHoEY0q5
cajrcC/Fg0T62mJlSLR8agr4CMdEaTPX4MqUQKiCu4ziTna4CdZb907SENy/
VNv54CC2nN2EAz6hDIzHth03Nb8dxkXuH9kriSbJhLABUFoj2eITRZs469K0
LktiUlA2+iMG3/mKeiKkV89JQ1hVGpOnjBU2qCenF4oWknoV6viV0llWhpCI
j4J75BpZqBV+jBRaY314qSdTz10KMl9iccPegH0Q955QUqxxh0vkUzl8M7DY
RFKmBoANNh/NFQ4KCVktfqjxhwJVKmwHa5C7CaLxWAlRej7HbzjFVot4WMgY
R8x16U3rrInCd+R0WxJDgUZUJcfn69ZaHxdUWvCmsdgjikkaTxWrCWxgIEwj
LL5qSv81PLInYpc1uUpRX60kgCAZghKk1kcwYp2pkFk0oupiZi+to6ZP5cQ7
sF1oL3PXxBEkvX13hWcfN9h8WuEVYoRopZi8LPBnL9T2HnT4BFKHZziDBDoa
4nldzolQlPXr9EpPCCj7Gly201SS8kxjN6Ic6PxG3/ngmqMnE/uJX5nXqctz
io6pYLOzxKqkm+n+NqDUqhPjH309Qrmff/45+Uc1u7tMpya9uhTUQgTFPyYt
GwOuuQPdqELFghRgLEOIvvv+YH/wIHlpYaHofnVBtTsCefTs1cvr/UFybjiK
5c7zxFaDEDgNkErd+wHye28Jcug3hGOYHJ7oBYRzx9H9WNvckw2/czU0gIw7
Wx9LskW6j0j4DUVkh8mai7MVOT06eare9fuT0hhm2bPzp09fH58+e58kZxJO
UTtWqKSUaJR8acIaer4xlgl36Z5H64F0KJLUpFKMBjejeBXYzwgNaN8Kamv2
x5+4OWKoKjtWz5lOSRJl5HAt+/m838FBJbxePq5d2eDx2GoXdx7lYHjCT+Qj
S5JEGzNSCF3erbOo3F2VGjX5XuhW9BZkP3qUzsxzcDvpkFQKSrlIWBPT1XP4
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
GQDElTj/fwF5XQGQrkEAAA==

-->

</rfc>
