<?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.7.30 (Ruby 3.4.1) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-bormann-cbor-numbers-02" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.29.0 -->
  <front>
    <title abbrev="CBOR Numbers">On Numbers in CBOR</title>
    <seriesInfo name="Internet-Draft" value="draft-bormann-cbor-numbers-02"/>
    <author initials="C." surname="Bormann" fullname="Carsten Bormann">
      <organization>Universität Bremen TZI</organization>
      <address>
        <postal>
          <street>Postfach 330440</street>
          <city>Bremen</city>
          <code>D-28359</code>
          <country>Germany</country>
        </postal>
        <phone>+49-421-218-63921</phone>
        <email>cabo@tzi.org</email>
      </address>
    </author>
    <date year="2025" month="July" day="07"/>
    <area>Applications and Real-Time</area>
    <workgroup>Concise Binary Object Representation Maint&amp;Ext</workgroup>
    <abstract>
      <?line 104?>

<t>The Concise Binary Object Representation (CBOR), as defined in STD 94 (RFC 8949), is a data representation format whose design goals include the
possibility of extremely small code size, fairly small message
size, and extensibility without the need for version negotiation.</t>
      <t>Among the kinds of data that a data representation format needs to be
able to carry, numbers have a prominent role, but also have
inherent complexity that needs attention from protocol designers
and implementers of CBOR
libraries and of the applications that use them.</t>
      <t>This document gives an overview over number formats available in
CBOR and some notable CBOR tags registered, and it attempts to
provide information about opportunities and potential pitfalls of these
number formats.</t>
      <t><cref anchor="disclaimer">This is a rather drafty initial revision, pieced
together from various components, so it has a higher level of
redundancy than ultimately desired.</cref></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-bormann-cbor-numbers/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Concise Binary Object Representation Maintenance and Extensions Working Group mailing list (<eref target="mailto:cbor@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/cbor/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/cbor/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/cabo/cbor-numbers"/>.</t>
    </note>
  </front>
  <middle>
    <?line 133?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The Concise Binary Object Representation (CBOR), as defined in RFC 8949 <xref target="STD94"/>, is a data representation format whose design goals include the
possibility of extremely small code size, fairly small message
size, and extensibility without the need for version negotiation.</t>
      <t>Among the kinds of data that a data representation format needs to be
able to carry, numbers have a prominent role, but also have
inherent complexity that needs attention from protocol designers
and implementers of CBOR
libraries and of the applications that use them.</t>
      <t>This document gives an overview over number formats available in
CBOR and some notable CBOR tags registered, and it attempts to
provide information about opportunities and potential pitfalls of these
number formats.</t>
      <t>It discusses CBOR representation of numbers in four main Sections:</t>
      <ul spacing="normal">
        <li>
          <t><xref format="title" target="sec-int"/> (<xref target="sec-int"/>),</t>
        </li>
        <li>
          <t><xref format="title" target="sec-ieee"/> (<xref target="sec-ieee"/>),</t>
        </li>
        <li>
          <t><xref format="title" target="sec-float"/> (<xref target="sec-float"/>),</t>
        </li>
        <li>
          <t><xref format="title" target="sec-array"/> (<xref target="sec-array"/>).</t>
        </li>
      </ul>
      <t>These sections will generally address considerations such as:</t>
      <ul spacing="normal">
        <li>
          <t>Encoding efficiency (number of bytes needed), possibly processing
efficiency (CPU used in processing)</t>
        </li>
        <li>
          <t>Preferred Serialization, Common Deterministic Encoding (CDE,
<xref target="I-D.ietf-cbor-cde"/>, see also <xref target="I-D.bormann-cbor-det"/> for more background discussion)</t>
        </li>
        <li>
          <t>Use by applications</t>
        </li>
        <li>
          <t>Interoperability considerations, potential "dark corners"</t>
        </li>
      </ul>
      <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="BCP14"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <?line -18?>

<t>Terms and definitions from <xref target="STD94"/>, <xref target="RFC8610"/>, and <xref target="IEEE754"/> apply.</t>
      </section>
    </section>
    <section anchor="sec-int">
      <name>Integer Numbers</name>
      <t>CBOR provides representations of integer numbers in unsigned and negative forms:</t>
      <ul spacing="normal">
        <li>
          <t>Unsigned integers up to 2<sup>64</sup>−1, major type 0</t>
        </li>
        <li>
          <t>Negative integers down to −2<sup>64</sup>, major type 1</t>
        </li>
        <li>
          <t>Unsigned integers with no size limitations, tag 2 on a byte string</t>
        </li>
        <li>
          <t>Negative integers with no size limitations, tag 3 on a byte string</t>
        </li>
      </ul>
      <t>The latter two forms are often called "bignums" for historical
reasons, the former "basic" integers.  The Concise Data Definition
Language (CDDL) <xref target="RFC8610"/> has the types <tt>uint</tt>,
<tt>nint</tt>, and <tt>int</tt>, for the ranges of values covered by major type 0,
major type 1, and either of them, respectively; <tt>biguint</tt>, <tt>bignint</tt>,
and <tt>bigint</tt> for the range of value covered by tag 2, tag3, and either;
and <tt>unsigned</tt> and <tt>integer</tt> for a choice of either form (but
interestingly no <tt>negative</tt>).
As the preferred encoding for an integer chooses between major type
0/1 and tag 2/3 automatically, in practice <tt>biguint</tt> and <tt>unsigned</tt>
are the same type, as are <tt>bigint</tt> and <tt>integer</tt>.</t>
      <t>The Major type 0 numbers come in five different encoding sizes, as
indicated by their initial byte:
immediate ("1+0") encoding (0..23), one-byte ("1+1") (0..255),
two-byte ("1+2", 0..65535), four-byte, and eight-byte.
The Preferred Serialization always uses the shortest of the major type
0 encodings
available for an unsigned integer.
The intention is that there is no semantic difference between the
major type 0 encodings, and there also is no semantic difference between major type 0 and
tag 2.
This means that Preferred Serialization always uses major type 0
over tag 2 when possible, and the shortest encoding of these (and thus no leading
zero bytes for the tagged encodings).
Major type 1 and tag 3 are analogous.</t>
      <t>Note that there is no "signed type" in CBOR: as any specific number to
be represented is either negative or not, it is represented as an
unsigned integer or as a negative integer.
Major type 0 unsigned integers cover exactly the range of platform
types such as <tt>uint64_t</tt> or <tt>u64</tt>.
Signed platform types such as <tt>int64_t</tt> or <tt>i64</tt> can be represented in
the lower half of the unsigned space and the upper half of the
negative space.
Platforms typically have no <tt>nint64_t</tt> type that could take all
negative numbers representable in major type 1; generic decoders will
therefore treat the lower half of the negative space in the same way
they will treat bignums that do not fit the signed platform type.
Similarly, generic encoders for a platform with <tt>u128</tt>/<tt>i128</tt> types
will choose between major type 0/1 and tag 2/3 just like they would
choose between the encoding sizes inside major type 0/1.</t>
      <t>While additional representation of integers could be developed, the
options already provided by <xref target="STD94"/> should be able to satisfy most
applications.</t>
    </section>
    <section anchor="sec-ieee">
      <name>IEEE 754 Floating Point Numbers</name>
      <t>While integer numbers are relatively easy to represent, floating point
numbers as a realization of rational or real numbers are a much more
varied subject.  Many rational or real numbers require rounding until
they can be encoded as a floating point number.</t>
      <t>There are many choices that can be made when designing a machine
representation for floating point numbers.
After decades of vendor-specific formats, IEEE standardized <xref target="IEEE754"/>,
initially in 1985, updated in 2008 and then 2019 (IEC 559 is then mirroring
IEEE 754).
This standard is widely adopted in hardware and software, offering
choices such as binary vs. decimal floating point numbers, and
different representation sizes.
Out of the large choice available, CBOR directly supports the three
formats binary16, binary32, and binary64, i.e., the signed binary
floating point formats in 16, 32, and 64 bits, colloquially known as
half (16 bits), single (32 bits), and double (64 bits) precision.
Most platforms that support floating point computation support at
least single precision, except for the most constrained ones also
double precision, while half precision is mostly used for storage and
interchange only and may be software-supported only.</t>
      <section anchor="integer-vs-floating-point">
        <name>Integer vs. Floating Point</name>
        <t>Mathematically speaking, integer numbers are a subset of the rational
or real numbers from which floating point numbers are drawn.
In many programming environments, however, integer numbers are clearly
separated from floating point numbers (the most notable exception
being the original JavaScript language, which only had one number type).</t>
        <t>For specific applications, it may be desirable to represent all
numbers that can be represented as integers as such, even if they are
used where floating point numbers are used for non-integers.
<xref target="I-D.mcnally-deterministic-cbor"/> defines application-level deterministic representation
rules that can be used with CDE to enforce this for
a certain subset of the integers.</t>
        <t>Most CBOR applications so far have tended to get by with the kind of
strong separation between the integer and floating point worlds that
programming environments usually favor, so our focus will not be on
approaches for intermingling them in this document.</t>
      </section>
      <section anchor="considerations-for-non-finite-numbers-and-non-numbers">
        <name>Considerations for non-finite numbers and non-numbers</name>
        <t>IEEE754 distinguishes three kinds of floating point data item:</t>
        <ul spacing="normal">
          <li>
            <t>finite floating-point number: A finite number that is representable
in a floating-point format.  Note that these further divide into
zero, subnormal, and normal; this distinction is usually not of
interest in interchange, except that there are a few platforms with
limited floating point support that may not support subnormal
numbers.</t>
          </li>
          <li>
            <t>infinite floating-point number: One of the two values −Infinite and
(positive) Infinite.
On many platforms, infinite numbers can be accessed via a floating
point operation such as 1.0/0.0 (positive infinity) or −1.0/0.0
(negative infinity); they react to comparisons as one would expect.</t>
          </li>
          <li>
            <t>NaN: a <em>floating point datum</em> that is not a number (NaN), used to
represent computations that didn't lead to a numeric result, not
even an infinity.
A commonly implemented example for such a computation is 0.0/0.0.
The formats provide a way to include additional information with a
NaN, such as its sign bit, whether operations on the NaN are
intended to fail immediately (signaling) or just return another NaN
(quiet), and some remaining bits that may carry additional
information (intended as diagnostic).  </t>
            <t>
It can be surprising that according to <xref target="IEEE754"/>, NaN values always
compare as different even if they have the same NaN information
(i.e., are identical).  (There is also a totalorder relation that
does give NaNs a defined place, depending on their sign bits; this
only recently has been standardized as part of std::strong_order in
C++20 <xref target="Cplusplus20"/>.)</t>
          </li>
        </ul>
        <t>Not all platforms that can use IEEE 754 do provide all these kinds, e.g.,
Erlang only provides finite floating-point numbers.
Platforms that do provide them widely vary in the way they provide
access to non-finite numbers and NaNs beyond the floating point
operations given above.
Usually there is an operation such as <tt>isnan()</tt> in C, which is needed
as comparison to a NaN always yields inequality.</t>
        <section anchor="protocol-design-considerations">
          <name>Protocol Design Considerations</name>
          <t>CBOR supports the interchange of all kinds of IEEE 754 data items,
including non-finite numbers and non-numbers (NaNs).
For an application developer that is already using IEEE 754 floating
point, there is little additional consideration required:
Both infinities and NaN are widely supported in IEEE-754 hardware and
software by CPUs, OS’s and programming environments.
CBOR protocol designs can generally rely on infinities and NaN as a
concept being supported, but implementations may run into dark corners
of their platforms when it comes to distinguishing and preserving NaN
information in NaN values.</t>
          <t>However, for a protocol that wants to achieve good interoperability
over a wide variety of platforms, the fact that platforms differ in
their support of non-finite numbers and NaNs becomes relevant.
(See <xref target="implcons"/> below for reasons for such differences.)
Protocol designs aiming for the widest possible platform support may
want to implement replacements for infinite numbers and NaNs, or at
least not rely on NaN information being successfully preserved during
interchange.</t>
          <section anchor="use-cases-for-full-support-of-nan-values">
            <name>Use Cases for Full Support of NaN Values</name>
            <t>Given the dark corners mentioned, a CBOR implementer might question
whether there even are good use cases for full NaN support.
The author conjectures that the main use case will be moving existing
complex algorithms from a monolithic implementation to a distributed one.
A data representation format is generally needed for this, and CBOR
may be a good choice if the target environment is not entirely
homogeneous.
Since existing algorithms may make use of IEEE 754 including its NaN
values, full support for inserting CBOR intermediate representation
into an algorithm implies full support for NaNs.
(This also means that the main objective for such implementations is
full data transparency, not necessary great internal APIs for dealing
with the data — IEEE 754 is that API!)</t>
          </section>
          <section anchor="json-compatibility">
            <name>JSON Compatibility</name>
            <t>Note that JSON supports neither infinite numbers nor NaN.
For protocols that are intended to work in both CBOR and JSON
representations and need an out-of-band indicator comparable to NaN, a
protocol developer might consider this (in CDDL, where <tt>float</tt> is not
intended to be a NaN value):</t>
            <sourcecode type="cddl"><![CDATA[
float-with-null = float / null
]]></sourcecode>
            <t>Additional choices can be added for the infinities (e.g., <tt>false</tt> and
<tt>true</tt>, to stay within the CBOR simple values), if required.</t>
            <t>Since <tt>null</tt>, <tt>false</tt> and <tt>true</tt> have single-byte representations, the
replacement of NaN, −Infinity, and (positive) Infinity by these values can save
bytes even if JSON compatibility is not a consideration.</t>
            <t>Applications that need to preserve the information in a NaN (sign bit,
quiet bit, payload) may want to replace <tt>null</tt> with an
application-oriented representation of that information, or simply
with a (left-aligned, truncating trailing zero bytes) byte string
representing those bits:</t>
            <sourcecode type="cddl"><![CDATA[
float-with-nan-replacement = float / bytes
]]></sourcecode>
            <t>For JSON, the byte string can be base16- or base64-encoded, or it can
be represented by an integer, preserving its left-aligned nature, or
even as a (tagged) floating point value with a different exponent.</t>
          </section>
        </section>
        <section anchor="implcons">
          <name>Implementation Considerations</name>
          <t>All floating-point numbers, including zeros and infinities, are signed.
A NaN also carries a sign bit.
Each of the three formats binary16, binary32, and binary64 define a
fixed assignment of bits in the representation towards the sign bit,
an exponent, and a "significand" (which represents the mantissa, with
details sometimes depending on the specific exponent value).</t>
          <table anchor="tab-bits">
            <name>Bit Allocation in Floating Point Formats</name>
            <thead>
              <tr>
                <th align="left">Format</th>
                <th align="left">Sign bit</th>
                <th align="left">Exponent</th>
                <th align="left">Significand</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">binary16</td>
                <td align="left">1</td>
                <td align="left">5</td>
                <td align="left">10</td>
              </tr>
              <tr>
                <td align="left">binary32</td>
                <td align="left">1</td>
                <td align="left">8</td>
                <td align="left">23</td>
              </tr>
              <tr>
                <td align="left">binary64</td>
                <td align="left">1</td>
                <td align="left">11</td>
                <td align="left">52</td>
              </tr>
            </tbody>
          </table>
          <t>Infinite numbers are represented in each format choice with a sign
bit, the highest available exponent value (all ones) and all-zero
significand.
NaN values are represented with a sign bit, the highest available
exponent value (all ones) and a non-zero significand, which carries a
leading quiet bit with the rest of the bits allocated to the NaN payload.</t>
          <t>To qualify as a generic encoder or decoder, a CBOR library needs to
implement as much of <xref target="IEEE754"/> support as reasonably possible on the
platform it addresses.
What is reasonably possible depends on:</t>
          <ul spacing="normal">
            <li>
              <t>platform support for <xref target="IEEE754"/> numbers.  If there is no such
support, the generic decoder may need to resort to offering the
interchanged value to the application, suitably tagged.</t>
            </li>
            <li>
              <t>If there is partial support, it may be harder to find a good
solution.  This is specifically a problem for platform support that
works well in most cases, but exhibits some dark corners.
E.g., the implementation may support a single NaN value
consistently, but not preserve NaN information present in the NaN
values.</t>
            </li>
          </ul>
          <t>Where an implementation needs to convert between different floating
point formats, e.g., because not all formats are fully supported by
the platform, or to implement Preferred Serialization (as needed for
Common Deterministic Encoding <xref target="I-D.ietf-cbor-cde"/>) in an encoder, conversion of NaNs in
these formats is best done by operating on the bit patterns of the
<xref target="IEEE754"/> number in the following way:</t>
          <ul spacing="normal">
            <li>
              <t>Expansion (towards a larger size format):
              </t>
              <ul spacing="normal">
                <li>
                  <t>preserve the sign bit</t>
                </li>
                <li>
                  <t>expand the (all-ones) exponent to the larger (all-ones) exponent</t>
                </li>
                <li>
                  <t>fill up the significand with zero bits on the right</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Contraction (towards a smaller size format):
              </t>
              <ul spacing="normal">
                <li>
                  <t>preserve the sign bit</t>
                </li>
                <li>
                  <t>truncate the (all-ones) exponent to the smaller (all-ones) exponent</t>
                </li>
                <li>
                  <t>truncate the significand from the right; check if the removed
bits were all zero.</t>
                </li>
              </ul>
            </li>
          </ul>
          <t>If the contraction is optional, e.g., for Preferred Serialization, do
not perform the contraction if the removed bits in the significand
truncation aren't all zero.
If the contraction is required to fit into limited platform types
(e.g., binary32 only), a failed truncation check indicates the loss of
information and should be signaled to the application.
We say a contraction "preserves the NaN information" if subsequent
expansion to the original size format recreates the exact same NaN value.</t>
          <t><xref target="app-nan"/> gives additional detailed considerations for implementations
that aspire to provide full support for NaNs, preserving NaN information.</t>
        </section>
      </section>
    </section>
    <section anchor="sec-float">
      <name>Other Floating Point Numbers</name>
      <t>RFC 8949 <xref target="STD94"/> also defines tags 4 and 5 for a representation of
decimal and binary floating point numbers that is not constrained by
the types provided by IEEE 754.
These tags are very flexible, but this flexibility comes with a choice
of ways they could be integrated into a generic encoder.
Because of this flexibility, tags 4 and 5 do not define a Preferred
Serialization or a deterministic encoding.</t>
      <t><xref section="3.2" sectionFormat="of" target="RFC9581"/> uses representations derived
from the tags 4 and 5 to represent timestamps.
<xref section="6.1" sectionFormat="of" target="RFC9581"/> lists various other tags that
can be used for representing numbers for advanced arithmetic,
including rational numbers in fraction form (tag 30).</t>
    </section>
    <section anchor="sec-array">
      <name>Tagged Arrays of Numbers</name>
      <t><xref target="RFC8746"/> defines tags for typed arrays, i.e., arrays of numbers that
all are represented in the same way.
The choices defined in the <xref target="RFC8746"/> are all based on traditional
platform number representations (unsigned integers, signed integers,
IEEE 754 floating point values) and even come in little-endian and
big-endian variants, often removing the need to convert the numbers
from an internal to an interchange form.
As conversion for interchange is not envisioned,
considerations for a preferred serialization are not applicable.
As the recipient may need a conversion for ingestion of the arrays,
some considerations from <xref target="sec-ieee"/> may apply.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The general security considerations for representing data in common
data representation formats apply, e.g., those in Section <xref target="RFC8949" section="10" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>.</t>
      <t>(TODO)</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>(TODO:</t>
      <t>Add nan'' registration when that is ready)</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <referencegroup anchor="STD94" target="https://www.rfc-editor.org/info/std94">
          <reference anchor="RFC8949" target="https://www.rfc-editor.org/info/rfc8949">
            <front>
              <title>Concise Binary Object Representation (CBOR)</title>
              <author fullname="C. Bormann" initials="C." surname="Bormann"/>
              <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
              <date month="December" year="2020"/>
              <abstract>
                <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
                <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049. It does not create a new version of the format.</t>
              </abstract>
            </front>
            <seriesInfo name="STD" value="94"/>
            <seriesInfo name="RFC" value="8949"/>
            <seriesInfo name="DOI" value="10.17487/RFC8949"/>
          </reference>
        </referencegroup>
        <reference anchor="RFC8746">
          <front>
            <title>Concise Binary Object Representation (CBOR) Tags for Typed Arrays</title>
            <author fullname="C. Bormann" initials="C." role="editor" surname="Bormann"/>
            <date month="February" year="2020"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR), as defined in RFC 7049, is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation.</t>
              <t>This document makes use of this extensibility to define a number of CBOR tags for typed arrays of numeric data, as well as additional tags for multi-dimensional and homogeneous arrays. It is intended as the reference document for the IANA registration of the CBOR tags defined.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8746"/>
          <seriesInfo name="DOI" value="10.17487/RFC8746"/>
        </reference>
        <reference anchor="IEEE754" target="https://ieeexplore.ieee.org/document/8766229">
          <front>
            <title>IEEE Standard for Floating-Point Arithmetic</title>
            <author>
              <organization>IEEE</organization>
            </author>
            <date/>
          </front>
          <seriesInfo name="IEEE Std" value="754-2019"/>
          <seriesInfo name="DOI" value="10.1109/IEEESTD.2019.8766229"/>
        </reference>
        <reference anchor="RFC8610">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="C. Vigano" initials="C." surname="Vigano"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2019"/>
            <abstract>
              <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
        <reference anchor="RFC9581">
          <front>
            <title>Concise Binary Object Representation (CBOR) Tags for Time, Duration, and Period</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="B. Gamari" initials="B." surname="Gamari"/>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <date month="August" year="2024"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR, RFC 8949) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation.</t>
              <t>In CBOR, one point of extensibility is the definition of CBOR tags. RFC 8949 defines two tags for time: CBOR tag 0 (RFC 3339 time as a string) and tag 1 (POSIX time as int or float). Since then, additional requirements have become known. The present document defines a CBOR tag for time that allows a more elaborate representation of time, as well as related CBOR tags for duration and time period. This document is intended as the reference document for the IANA registration of the CBOR tags defined.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9581"/>
          <seriesInfo name="DOI" value="10.17487/RFC9581"/>
        </reference>
        <referencegroup anchor="BCP14" target="https://www.rfc-editor.org/info/bcp14">
          <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/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" target="https://www.rfc-editor.org/info/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>
        </referencegroup>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="I-D.ietf-cbor-cde">
          <front>
            <title>CBOR Common Deterministic Encoding (CDE)</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="12" month="May" year="2025"/>
            <abstract>
              <t>   CBOR (STD 94, RFC 8949) defines "Deterministically Encoded CBOR" in
   its Section 4.2, providing some flexibility for application specific
   decisions.  To facilitate Deterministic Encoding to be offered as a
   selectable feature of generic encoders, the present document defines
   a CBOR Common Deterministic Encoding (CDE) that can be shared by a
   large set of applications with potentially diverging detailed
   requirements.  It also defines the term "Basic Serialization", which
   stops short of the potentially more onerous requirements that make
   CDE fully deterministic, while employing most of its reductions of
   the variability needing to be handled by decoders.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-cde-11"/>
        </reference>
        <reference anchor="I-D.bormann-cbor-det">
          <front>
            <title>CBOR: On Deterministic Encoding and Representation</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="21" month="January" year="2025"/>
            <abstract>
              <t>   CBOR (STD 94, RFC 8949) defines "Deterministically Encoded CBOR" in
   its Section 4.2.  The present document provides additional
   information about use cases, deployment considerations, and
   implementation choices for Deterministic Encoding and Representation.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-bormann-cbor-det-04"/>
        </reference>
        <reference anchor="I-D.mcnally-deterministic-cbor">
          <front>
            <title>dCBOR: A Deterministic CBOR Application Profile</title>
            <author fullname="Wolf McNally" initials="W." surname="McNally">
              <organization>Blockchain Commons</organization>
            </author>
            <author fullname="Christopher Allen" initials="C." surname="Allen">
              <organization>Blockchain Commons</organization>
            </author>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <author fullname="Laurence Lundblade" initials="L." surname="Lundblade">
              <organization>Security Theory LLC</organization>
            </author>
            <date day="7" month="February" year="2025"/>
            <abstract>
              <t>   The purpose of determinism is to ensure that semantically equivalent
   data items are encoded into identical byte streams.  CBOR (RFC 8949)
   defines "Deterministically Encoded CBOR" in its Section 4.2, but
   leaves some important choices up to the application developer.  The
   CBOR Common Deterministic Encoding (CDE) Internet Draft builds on
   this by specifying a baseline for application profiles that wish to
   implement deterministic encoding with CBOR.  The present document
   provides an application profile "dCBOR" that can be used to help
   achieve interoperable deterministic encoding based on CDE for a
   variety of applications wishing an even narrower and clearly defined
   set of choices.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-mcnally-deterministic-cbor-12"/>
        </reference>
        <reference anchor="Cplusplus20" target="https://isocpp.org/files/papers/N4860.pdf">
          <front>
            <title>Programming languages - C++</title>
            <author>
              <organization>International Organization for Standardization</organization>
            </author>
            <date year="2020" month="March"/>
          </front>
          <seriesInfo name="ISO/IEC" value="ISO/IEC JTC1 SC22 WG21 N 4860"/>
          <refcontent>Sixth Edition</refcontent>
        </reference>
        <reference anchor="C23" target="https://www.iso.org/standard/82075.html">
          <front>
            <title>Information technology — Programming languages — C</title>
            <author>
              <organization>International Organization for Standardization</organization>
            </author>
            <date year="2024" month="October"/>
          </front>
          <seriesInfo name="ISO/IEC" value="9899:2024"/>
          <annotation> 
This revision of the standard is widely known as C23. Technically equivalent specification text is available at <eref target="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3220.pdf">https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3220.pdf</eref>.</annotation>
        </reference>
        <reference anchor="ARM" target="https://developer.arm.com/documentation/ddi0487/latest/">
          <front>
            <title>Arm Architecture Reference Manual for A-profile architecture</title>
            <author>
              <organization>Arm Limited</organization>
            </author>
            <date year="2025" month="April"/>
          </front>
        </reference>
      </references>
    </references>
    <?line 504?>

<section anchor="impcheck">
      <name>Implementers' Checklists for Floating Point Values</name>
      <t>This check list employs <xref target="BCP14"/> keywords to indicate interoperability
requirements on implementations.</t>
      <t>The following considerations apply to encoding (emitting) floating
point values in a generic encoder:</t>
      <ul spacing="normal">
        <li>
          <t>The length of the argument is encoded in the lower 5 bits of the
first byte ("ai"), which indicates half precision (binary16, ai = 0x19),
single precision (binary32, ai = 0x1a) and double precision
(binary64, ai = 0x1b).  </t>
          <t>
For preferred serialization: if multiple of these encodings
preserve the precision of the value to be encoded, only the
shortest form of these <bcp14>MUST</bcp14> be emitted.
That implies that encoders <bcp14>MUST</bcp14> support half-precision and (if
there is support for more than half precision on the platform)
single-precision floating point.
Positive and negative infinity and zero <bcp14>MUST</bcp14> be represented in
half-precision floating point.</t>
        </li>
        <li>
          <t>NaNs <bcp14>MUST</bcp14> be supported, for all values of NaN information allowed
in <xref target="IEEE754"/>.  </t>
          <t>
As with all floating point numbers, NaNs with payloads <bcp14>MUST</bcp14> be
contracted to the shortest of double, single or half precision that
preserves the NaN information.  </t>
          <t>
The reduction is performed by removing the rightmost N bits of the
payload, where N is the difference in the number of bits in the
significand (mantissa) between the original format and the
reduced format.
The reduction is performed only (preserves the value only) if all the
rightmost bits removed are zero.
(This will always reduce a double or single quiet NaN with an
otherwise zero NaN payload, which is typically what is returned
from an operation such as 0.0/0.0, to a half-precision quiet NaN
encoded as 0xf9 7e00.)</t>
        </li>
      </ul>
      <t>The following considerations apply to decoding (ingesting) floating
point values in a generic decoder that supports IEEE 754 floating-point numbers:</t>
      <ul spacing="normal">
        <li>
          <t>Half-precision values <bcp14>MUST</bcp14> be accepted.</t>
        </li>
        <li>
          <t>Double- and single-precision values <bcp14>SHOULD</bcp14> be accepted; leaving these out
is only foreseen for decoders that need to work in exceptionally
constrained environments.</t>
        </li>
        <li>
          <t>If double-precision values are accepted, single-precision values
<bcp14>MUST</bcp14> be accepted.</t>
        </li>
        <li>
          <t>NaNs, <bcp14>MUST</bcp14> be accepted, preserving the NaN information for use of
the application.</t>
        </li>
      </ul>
      <section anchor="app-nan">
        <name>NaN Payloads</name>
        <t>The basic data model of CBOR directly supports IEEE-754 data item of
the forms binary16, binary32, and binary64.
These have 10, 23, and 52 bits in the space provided for encoding the
significand (see <xref target="tab-bits"/>).
For a NaN, the first of these bits is used to indicate whether the NaN
is signalling (0) or quiet (1).
The up to 51 bits in the rest of the significand are called the "NAN
payload".</t>
        <t>The payload’s original purpose is diagnostic information to explain
why a NaN was generated by a local computation.
There is no standard for the contents of a NaN payload.</t>
        <t>CBOR allows NaNs with non-zero payloads to be encoded.
(Due to the way infinite numbers are encoded in <xref target="IEEE754"/>,
zero-payload NaN always must be quiet NaNs.)</t>
        <t>As a result, if a protocol design does not use NaNs with non-zero
payloads and is using preferred serialization then NaN must be encoded
as a half-precision with the quiet bit set and the payload set as 0,
specifically 0xF97E00.
If a design does not use NaNs with non-zero payloads and preferred
serialization is not used, then the single and double precision quiet
NaNs, 0xFA7FC00000 and 0xFB7FF0000000000000, may also be used.</t>
        <section anchor="working-with-nans">
          <name>Working with NaNs</name>
          <t>NaN payloads have been in the IEEE-754 standard since 2008, but
programming environments often still do not provide facilities (e.g.,
APIs) to make full use of them.
In C there is the <tt>isnan()</tt> API to check if a value is a
NaN, but there are only implementation-defined APIs to construct or
access the NaN payload <xref target="C23"/>.
For constructing a NaN with a payload, C for instance offers functions
specific to a floating point type, such as <tt>nanf()</tt> for single
precision (binary32) and <tt>nan()</tt> for double precision (binary64), or
their analogues in the <tt>strtof()</tt> and <tt>strtol()</tt> functions.
Section 7.24.1.5 and its Footnote 341 helpfully explain:</t>
          <blockquote>
            <t>[...] the meaning of the n-char sequence is
implementation-defined. [...]
An implementation can use the
n-char sequence to determine extra information to be represented in
the NaN’s significand.</t>
          </blockquote>
          <t>While Section 9.7 of <xref target="IEEE754"/> now defines abstract APIs for creating and
accessing NaN values (<tt>getPayload</tt>/<tt>setPayload</tt>), these definitions
are partially implementation-defined and are vague enough that
realizations of them have not made it into <xref target="C23"/>.</t>
          <t>The typical way to work with a NaN payload in C instead is to
reinterpret the floating-point value as an unsigned integer and then
use shifts and masks to unpack the IEEE-754 representation.</t>
          <t>The floating point conversion (narrowing/widening) instructions of the
most widely used CPU architectures cover NaNs in a comparable way as
they convert finite numbers: They narrow by removing the right-most
bits of the payload, and they widen by adding zero bits to the right.
(E.g., for ARM A-profile Architecture <xref target="ARM"/>:
See Section J1.3.3.193 FPConvertNaN, page 14208 at the time of writing.)</t>
        </section>
        <section anchor="nan-implementation-details">
          <name>NaN Implementation Details</name>
          <t>This section is primarily for CBOR library implementors.</t>
          <t>CBOR attempts to limit the MUSTs about CBOR implementations in order
to allow its use in a large variety of constrained use cases.
For example, support for integers is not required because a protocol
might need only strings.
Similarly, there is no <bcp14>MUST</bcp14> that requires support of NaN and NaNs with
non-zero payloads, but the recommendation here is that any generic
CBOR library that supports floating-point support NaNs, preferably
also with non-zero NaN payloads.</t>
          <t>In most environments, there is little extra work to do to support NaN
without payloads if floating-point is supported.
NaNs will usually flow through as any other floating-point value.</t>
          <t>Generic CBOR libraries are expected to support preferred serialization
of floating-point including NaNs.
For NaNs with zero payloads, this requires reducing to a half-precision
NaN without a payload.
This requires a few explicit extra lines of code.
See the sample half-precision implementation in Appendix D of RFC 8949.</t>
          <t>The implementation of preferred serialization of NaN payloads needs a
few more additional lines.
As with preferred serialization, NaN payloads must be reduced but only
if they can be reduced without the loss of any non-zero payload bits.
Programming platform provided floating-point hardware and software may
or may not do this correctly for double to single conversion.
The sample half-precision implementation in Appendix D of RFC 8949
only supports NaNs without payloads.</t>
          <t>A double precision NaN payload contains 51 bits, a single 22 bits and
a half 9 bits, in each case all but the first bit of the significand.
A double precision NaN can be reduced to a single precision NaN only if the right-most 29 payload bits are zero.
A single precision NaN can be reduced to a half precision NaN only if the right-most 13 payload bits are zero.
A double NaN can be reduced to a half precision NaN only if the right-most 42 payload bits are zero.
Note that the exponent is always all-ones for NaN, so this is simpler
than the equivalent contraction of regular, non-NAN, floating-point values.</t>
          <t>To implement the above, most CBOR libraries will have to reinterpret
the floating point value as an unsigned integer and use shifts and
masks, based in the internal representation defined in <xref target="IEEE754"/>.</t>
          <t>Testing on some CPUs has shown them to do this correctly for conversion between single and double.
However, it may not be very useful to rely on platform libraries for the following reasons.
First, they may provide no support at all for half-precision and half-precision is required for preferred serialization.
Second, NaN payloads are a relatively recent and very specialist
feature that is not usually used in interchange.</t>
          <t>If platform implementation is relied upon, NaN payload reduction should be tested on each platform.
Open source libraries intended to run on multiple platforms may be
better off not relying on the platform.</t>
        </section>
        <section anchor="nan-tests-examples">
          <name>NaN Tests Examples</name>
          <t>The IEEE-754 numbers are given as a 64-bit (binary64) or 32-bit
(binary32) unsigned integer in hex to show the bits that make up the
floating-point value.
All of the following are NaNs.</t>
          <table anchor="nan-examples">
            <name>Examples for Preferred Serialization of NaN values</name>
            <thead>
              <tr>
                <th align="left">IEEE-754 Number</th>
                <th align="left">CBOR Preferred Serialization</th>
                <th align="left">Comment</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">0x7ff8000000000000</td>
                <td align="left">0xf97e00</td>
                <td align="left">qNaN contracted from double to half</td>
              </tr>
              <tr>
                <td align="left">0x7ff8000000000001</td>
                <td align="left">0xfb7ff8000000000001</td>
                <td align="left">Can't be contracted because of bit set in right-side part of payload</td>
              </tr>
              <tr>
                <td align="left">0x7ffffc0000000000</td>
                <td align="left">0xf97fff</td>
                <td align="left">10-bit payload that can be contracted to half</td>
              </tr>
              <tr>
                <td align="left">0x7ff80000000003ff</td>
                <td align="left">0xfb7ff80000000003ff</td>
                <td align="left">right-justified payload can't be contracted</td>
              </tr>
              <tr>
                <td align="left">0x7fffffffe0000000</td>
                <td align="left">0xfa7fffffff</td>
                <td align="left">23-bit payload that reduces to single</td>
              </tr>
              <tr>
                <td align="left">0x7ffffffff0000000</td>
                <td align="left">0xfb7ffffffff0000000</td>
                <td align="left">24-bit payload that can't be contracted</td>
              </tr>
              <tr>
                <td align="left">0x7fffffffffffffff</td>
                <td align="left">0xfb7fffffffffffffff</td>
                <td align="left">All payload bits set, can't be contracted</td>
              </tr>
              <tr>
                <td align="left">0x7fc00000</td>
                <td align="left">0xf97e00</td>
                <td align="left">qNaN contracted from single to half</td>
              </tr>
              <tr>
                <td align="left">0x7fffe000</td>
                <td align="left">0xf97fff</td>
                <td align="left">single 10-bit payload that can be contracted</td>
              </tr>
              <tr>
                <td align="left">0x7fbff000</td>
                <td align="left">0xfa7fbff000</td>
                <td align="left">single payload that can't be contracted to 10 bits</td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
    </section>
    <section numbered="false" anchor="list-of-tables">
      <name>List of Tables</name>
      <ol spacing="compact" type="1"><li>
          <t><xref target="tab-bits">Bit Allocation in Floating Point Formats</xref></t>
        </li>
        <li>
          <t><xref target="nan-examples">Examples for Preferred Serialization of NaN values</xref></t>
        </li>
      </ol>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
    </section>
    <section anchor="contributors" numbered="false" toc="include" removeInRFC="false">
      <name>Contributors</name>
      <contact initials="L." surname="Lundblade" fullname="Laurence Lundblade">
        <organization>Security Theory LLC</organization>
        <address>
          <email>lgl@securitytheory.com</email>
        </address>
      </contact>
      <t>Laurence wrote much of the initial text about NaN processing.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA619W3MbR5bme/6KHCpimnQDIABeJNJuT1Mk1a0OmdRa9Dhm
e73NAlAAyipUwVUFUmhaHf04zxPzsm9+2If9Hd5/4l+y5zvnZFZWAZTk6eVE
jwBU5fXcvnPJdLfbNXen9sCYKqnS+NReZ/ZqtRjFRWmTzJ4/v/7aRKNREdNL
+OIemkk+zqIFNZgU0bTqjvJiEWVZd0wfupm8002jKi4rM6Z/ZnmxPqUep7kp
qyKOFqf25eXNC2Mm9PDUjPOsjLNyVZ7aqljFJqJXTu3O2XKZJtQ8occ2yib2
6zhKuzfJIt4x93nxdlbkqyW9d55n46SM7fMki4q1vR59H48renlZxNRtxR3Y
r6Ikq/758l21Y97Ga2o+OTXmLs5WNL61v76rOIuycczTok5p9pjlDnW1iJKU
esJW/D6Jq2kvL2b4fZZU89Xo1I6jUb4fbpQx0aqa58Wp6VprZVvPo6KkTu1z
2Vhqbi31c2q/yZI7apNU//d/V/Z5ES/opZv//pJfwNbG1al9nZfVNBrP7cFB
//Cwz8/GSUUUkAbyQz6hcS66w2cHRyf6yyqrQKc/xBh0zT8u53lG7/328KR7
OBx0h4Nn3eODk+GAH8ayVqzo99VfE6wUtKyKZLSqZEGynFfRqoixXa9W2WSU
RpPY6HrexONVQXOzN/OYmMS+enVufMfpLP19qS9U/Lw3zhcGU9VBaNOD3u+L
vIrtYkVLz6eWWhDLJVUSpbaK31WWprmq7FV0ZZdFPo7LMslmPWMy7HFF2wpG
eHNzcXJISyL6mCdY4+9O7dcvzp+dHGKT8Onp4fGpjYoiWpf0y8vLy8unR4en
vB9VVMxAgHlVLcvT/f0kjuN3yzQv4h4+Yn/2SXJWRINq/9nT4+PhULZepQ+d
2TcV8VRUTOw0L+yLNKepZbPu65x4zp7RTswXcZWMuZnjG3zuyn6iC/7OkmWn
UVrGwhxxkcQlRFDet260yamlBXSH/cGJPri4fnlqB/3eYNA/2cdbtCk9PO/V
c8ZOHA/6tFOTSSrfT46eDUiASTy7VTQzBmP5naW9fNm96G1TFNRmnvBe0guQ
GHk6Bn+OmVM2Wk6wy/T/9NmClFGarvEzsS7RvKQd4jfpLW6QF8kMczhfpqsS
/zsV6rYpdn9/30vKnClVKiH2nx0cD49782qRaiOh1usinxXRgsab2TTKZqto
Fpf2l7//pz3/7W/lTUegJyGFSHcUGWsSYszrYhZlyV9FsYDijvz6mzQVYg77
w8PuoC8/hfR8ogR9c03kOifaHT57NjzF6/KoiKeQGOI6P5XLScJDPtWJZlku
2u3Ufun6++Xv/8d9vCEKUTd3CdScEy63QZae3SeTOF3bt1l+n9moxBYMD3p+
ZlVJIjieZ6TOU6tzQTNiz9xGdyTt0SiN7V0SuSZfOJLkyzjrltWEafJ9NR7s
l+PhcP9+NhxAmMr9ZbQkLtqn5R7sZ4cnR/3ecjL9smcCag/7jwhomY+XS+55
mqSx7+vq8NkxdxNK53Z6d5naj0njr6N1g9T9bv/gMcl1hNYP9k835wP75nw4
tN/+YTiwVxbzN23Sy8TeJO+quaM/Nml4cPr/cf66WV+6qTolQE2YA/I0n61Z
Sj4gP8FOXI+rnLQEM/9WGm4X2WH/6ZGI7Ee28OTZycmp75zkoJ47+P+/yv5g
fm3r+J6exz+skrsoBfOXy3icTBXeiH2CPHhRiCrTEgQs9FFhGBziuQhEdjAc
1kJw9vVX25l/Et/FKXVY9KJiAcPqbRPPaX8ySfqHz57uC47bD6l7Vizof+N5
QiStyPgSQprGYoO/irIV8QrY46xLdhZyReayfneD1xQJoM9XyYJemwTkP+jb
s2WRpKD/kTGm2+2SHSekE40rY/78P+nzoPsdzPbPP50c2l2yQz//BGu917H8
dNj9rn5PBiSoYT8J6O0C81JHRNBJPE2ymGidaW9D1xuohslGxCCN1sL49n6e
0zgTYr9ZZmc5aTzqZJyuJjG4SEBWTlhklKTAQcRcxAvAacQv5YLYhqGaLZO/
xh2y50nhf18QhCGZEQ7nx0CjsaBR7e6eAANQDxg2i2NBFYwgaYYZAXOCR5gt
4SB0c7bISRrx8tskm5SYDS+tmtNKPrhMdE5KPrcjpTCYmL6OCSqtO1ZtvZ1H
d8QOAGAk95CDIk9p4gTlxBbguWxrNgdHVbT6xTKN32ExPAsZKKqg03h86gr9
Vfk4T3WfgapFnIliaA6uxvC0HnZq8DBNRkUEvcCvqVBHoc/B461KJtRCd4hV
gRMUAvV33N7mtKd3SXzPH3S1ujWhVCeiJNmXwqhlviC6kOnFQ/6VoBNUzYww
DK1/IjRNKl7wYgk7mgvPFPkdKR2bBApWAG6+XOZFtQLy1bUtc94sEstlQp5B
mpa6XMWGzen2wOGTpBynEWG54rvW11PZAmb7IqJOCnEC1x5sO0XZoeHisYpz
lZPywctMrzva+HxVMnFz8EHZob3AOucROp4nM7ybQkXRXNWUTch7IK+LGSGz
q5SwJikJkgdQnR73RD8sEsKksSEkQfaryCerMVunQF08PCim/z2jxPfvQ2Xx
srJY7qosafuYJi2Op73Laid5mq8KOH0ZfBnmG3IsP6MhvviCfJcuwfb37+3u
w4P/stcJH5NfEDznb40XpvAA6jf0a+MVdkbqV/TrHu3GDUhM1k/mRcqAtMYs
JvFgaxRNJrQsEIH0xYR+lLdK+E+RrOIyI+UDAx1PyVYlMTZ/V9mFtmG0JtPA
EhlPSE+KHqOea/8KzlzQ9Pz1NxAo6NHgpT0a6XUBE0JEpG0siIsUU3RIUy9I
KdmLENvX89o9v7js0CAPD3AYQMgyjkWV0E/kENC+QOUtyAmzo2jMQQMSCaUw
jYDBv6FdGq0bwk+/MvqBgYxUmTY3qhPI1Q4Bgbf0vIDq2SHWewILcycqSoTw
AhYkkb5BGPs2JvWcF6TMdr765s3NTkf+tVfX/Pnry//2zcuvLy/w+c0fz169
8h+MvvHmj9ffvLqoP9Utz6+/+ury6kIa06+28ZPZ+ers33ZEs+xcv755eX11
9moHJKkayi0qYlHoFvGOgmSAbDNxhiFxG5P7LWR8fv76558Gh7Td/0QfB4e0
4ffzOJPu84y4Qb6S8K8N7XAcFWjGhi0ifUS0YgtbzoGdoPSJcT/7M7aCdM0X
o/FycPil/oAVNn50m9T4kTdp85eNxrJrW37aMozfvsbvra1tzvfs3xrf3UYH
P37xLykZQdsdPPuXL0k93RCDC69Mal4RfQn2VkXFnD5J8RGvPjxoCIL2Hfy7
7qnii2ckoy6Y9/DEqR9jWKWp+Shbuo0NQ6KNAyW3ytisTnhIgg3s1bPBED3x
jXuubUu7WoJ3hl+Uq+WXx4df7OPfX/79PwYd0pXfk0BW62Vs+9T0yvXmm07A
CNSYXm+2b7QdbB0WeIcMKuMhsvAEJ52wkmG1QwsryWoL0TLop20T+HAnB5ud
sDynMNE0uftcNoblJ58ijAf0T7PcGdFsV4tyh1USyVqVF/AMTBFHpfQ/l12l
fnZGUZmMd/ysek3gegEoVusU80o9KGjEi1d7NZuwRUW/2LXS3q6ow9uOuc34
XyborXzEpPBiQV3FzAnkq6xiGIg7YBGoyJB4HROSQ9FnwkZe4MWiQ+wFRwfb
m64/t7e0ATI+f5QpGJ4CfcW35iT8HMIpMCGZFAfhmJ9LP45Tb/3KsHvSb2TH
8zwZc7c6UWy23SX4aVjHkaND9CSdRdS/dXx+S6b0TPZw6a1U7CwQd5x5oaER
cgCHUVzdx0T6eotMf3/Ak+IF7B/ACcqB3Ng37IhJJLcGE/QbZZuLMqyT4XxG
C6Eo60786newsW4BAeSV1WTzcj0G+ASCAfNPkulUALdfGdifdTPtzQR2Ufd/
HieFB3sQg1OTLBbxhDwJYr+dwW/7O3t1L7v9Xm94QOiAcF6XhQavDOgVfnJ0
RFiGZKZ+NCTTRE+Oj44O6BnjK37oiD2bV/y9xyt7BDeQfbmP1iXAhlCOzEsB
P9YB/ZAufrKlqaG60nXVUjEyKicAeJxE3QRwU4xv0BvxIsoAU9ymEkUdP8Dn
C4WoHlvWJ/0wgPl4Z42OqLVh1sIUqe0ijpwP8ymb1FDL7MWIxoT1dsgu9nOs
99MT2rkUdlfeWfH00zjCU/NXglKKF52IU/+zQJJKErOAT2tZOWD+jrIozWfk
NBBLXyHOv7HtO0opNN9x+atTlo9s7QMuztshP4qQjTd/McdxVCt4C0eTIe+s
A8ckKRsvc6+mzR1owA5M1jIqjaX1N7hKdSw576QA0nVTAy7JskBPGdHgis9F
kx8f/oVEnjq+XR0fkrS/kW5dE9tq0miRUAsyTZlt70NmMH6a39OM5lE6dTLj
Z10uI8198c8E6hovGr96frFnXut0SsxHY2EcCWA16yfFm8NkHeerFMR/C1FI
6/6c6qpRi3jVDWDwufg4EJkYsZNCPB/DvDKFI4AcpMRENhfZnLugYtW3JCzo
ZC2OlHSiJl2mPcnBLqRQpfNyCzFAogWpmAIq382TRQDzFCvlGzAQuV0Nhs9u
928T/CMENTwBMTVblUHL0ny/IkFNk7dsO+B10O6aVnNMuKn6ae1wd1odk/h9
O+eg3kRiyOzxtx3kgK9ByREiYBJunDDKMflSXaOUtnGydoCULYxHu9Ay2tzF
k0oaopwSEMnLyoQOm+Be5LQIDPvEmZXEWQsHw812y2ijXeiaIk4jwSyWkNka
4/olkkVyfS/Rt/ENOSIS19qVtqFwsXPaQDxqjBJJqhKuqUFABIK14kAkYb2v
oLMebV4gkoyJwpnFVFZkIlJhTpVo4SlRVK0pazeCDTCRAkSm8QQeKTNrP4uI
WICNgMTW0AvNPBrPyXcxm8HA7WMRec6mgMckktFE0WWcTfKi6xWzxp86QsXS
JxfihpfTMQo9UkSc7ODk2VGHVNAkEtVlh/3+M6ea8G1wYndfXp7//NPR0YlY
a8hKUhQ5Q3f0+/NP1POems0tYf1oQtwqvc/pyb2YI0TvphW+ELaBaUZ3bged
xh1JfPmO4DutPFkgNL51f9iymhqFtTaWBbJnrlcewKQI5ztA62FLRyJWE2IO
NiTkNiEaqB7AvIhj46KSMrXBcUc/HQzFusu340Oyer241wk1mTwyrRW4DkEN
6s31c3xI74Oc4zxNc+JXJplLkRjWubuDY36JcB4CQSSOuwdD9wt7wvkKgr+r
ne0BgY85ukgWlVSA15XKtLre9iYjzrhyW6mvRJUhcEJd6Mi+5w6Z4XG8rDxQ
ga7h4E9VRJwFICgruUuj8wva3rNW4dX5X8FL6ITWz9EvdAznD/4ayM6+x3gu
Bh8hEyx9Ea0hf47JujrvWKIqPQ4yOT8f/NVUeYYAB1ww518A/0Rv6XFnq8aL
oHrK2HOX0zymrXk4HEFrJPbezsjc3aSI7olCLzPRK8sg1Rdnd0mRZwsJ+s7J
/hLw2T6pMdGH7KQp42VUsHzz6I+Mu+tJ5QLqQkZ4x6M40bwGKgESqNQ/kcy8
GRcJ0dllHzu6MCbBPGI6e7hI5g8h1RcgndNYof1hkKg043i0s1hekgXK6GxD
FdvCld52RqJHiB9JVdpkKtabdsYwF92z8v4AFTyvZXnW9XEEg8Cor4ogIyu5
rTJcTVci742CipZKMsUqbZkKmRUwy/nFJZYeIzkxjiWuSB8NeeBxUSFY3mS3
enIi1ZIgCXMx5A9No0JQI/lesGw0wIy6GEmWy2etkC8gSUUiSxkHEhjCHMdr
kLLW9t3nRTqRVZnHuJbWuWKRmkZ3ecGJC+QApvl4pTF2gMARRBkIpcjJVqrb
w4KODlPlx8VG2JW2QMPHYVDeUZHjPTUO5nAc/exLydRMIr6NVa2Scs5EIsVf
p/Raa+asHvW64FCejuDe6YZsdWrPbGMGQv6kBciN5Qhvuw+xE4RtGu4bQdDp
qpA8UqIpLc5xwWPsgE+4QCvt6GLx+XPdMl7k2PnhjizYfc4ZuZAOZhOoWK/f
Aw9SdOA0vg8MCrjKWAkAxhuc4swIdwK5x7DuRz9rY2sA9BmSdR/c3essdhKB
MKKG33759/946RrCWli7S/54AoC6Z90TpPqvnbp1S+jUI/qgj4hqNEbuhVZ1
l0QBpYzV1XHaQ82lIJlBr7/f7/XrsV3f6z3AU8R25Q3ML3B/9Z3PRXmRLRlX
nBcmi0yYt2QfoGRNy24J0QYBQ+zWVXRF3rv9yya7rhZ/8ZyHbY8cO+5SG0IO
rIiYiWrlG0AA560lk+w3FUcoMCPuhN0xarFKCehT18hfQflyhE+WwkUV6G7B
dqLOL2PuEb6Jfed9ayAPmm1f9gh93GisF9DJZXMj+JiYjCsRCJysMNPLCi+i
Tmi9HU8iAkiM1ACVYMsk4epJiV1m3kIJZFTEKiFOl04JQlofyKOV7aKvCJqK
KcxOZBFXqwLbkXPf1BPITeAurhSxcUq7QAUnuwpAbbWMcDVAsCieQr2sXT8f
lFwk0SzLYXn2OPf+0tuZclUsiXVEhaIwYTzOC3aDqrzhKvBKVYok1sXFo+C8
WIbwQc/QwoqRcV4/+ggmifUKMEYnRLSMEdYe6bXdGxeNkro2mk4VpTS1uFCX
kgnApT2TnOaE8gH0zyUkWmFCwjsmFTWJl7G4dkK0pPCkLT93FZPMgAQyaQ6M
WBB2pnU0XCf6kZbLlrasJqenYhr/IrPiegTU6vVp34Jyuffve3scZuM8XQtj
gwqoivDO9iSvGRiBEVbqbG1I1fZmvY65LICxZL4+9fQhXVg2gkYaW3GDsN1U
3+wO7pUGaVh2QEB90YiWA1c8Yjt570fxOtdQVsu1D0QHpOIKiztStd+opfHR
R1SAbGjM26TMomx375ZjkQ5cJi5hbqIy0IKigVgyJSi7TmIgEeKJH2gw1juE
C56gbE5KXS6kpKgJFDS913D7Gt7FlEnkoUBNQwcCSjjYUD7Yho9DDla5CN2+
kHh5ANp8yKeGCS7as2Lh9YN788Pb3qn3ldZdNUNNjRy8i4NMTs1zUkhORbu6
F9VzjlVqB4rogbG7GDv06I1ztgAqz19/Q/x7/eaXv/8vLaN5BA/2fEo1rEES
U1tXWxSYQp5tnSN9ROE8gxJxVfxcpTbKGxnlRujSYsWoJrdh7YER+EDaIsAx
iHgkbAFjFoYAHHI0h9dGMlvc4St0eqiUabNqNUpM+Efnsmmw0i2baXwfZVyj
ZBEfotfsLM8lyh1WUkh+IWLCcC1QLJVvAXBhaWSsgG7rxYjK1hg1lKIiLhTl
fFDGZfVEhfguAsrefUOQ+OEBOwueIj9oRMx6z6vSfGxtx+vcS0mK8XWb0lGy
cKlA1kNQb5VPmtTxXDdZIp/BTrGld6QFVoHuFx9DvIVHltPhPIOLXwABOe5q
GSvPTawIp6uU9S+TmsRgsuKYVaAfRMc84YKY86hUr+UFtbNv6o3GIP/K7GDM
H1gvYtUhG9qFpMe4gE28uaAOzy6QxLM/rJBuJYvqkIqIveCtQlkHhmbsZ4IV
8PC6k5KNk2pSqIbvpca0zslJZZbrRLwzBDVzZvX4nUiC0SJD0k+znM9YaKAj
ojeznFiWVHdLCEVhQ5T4JIpEhXrm7ENFkqTRaoUgVkCZJtH0H1cnahQhkh3Q
EF+ifgFX8Yb6x4Fg7DjYwMzzRY5hOFf2JkHC0C00XCBGWSDDgt0JTUGt/oHd
oA5E9juy/T7ExhxKrMQdC43ZvdVMcCtcwKoKBsLNgPcTanCjV7A4CSiHYxlJ
BalMT9OcI+VahiJS2taShJG4bylhLagPAL9svGZoTwSAUAA/zDiVk0i1e2rP
Xr8UdpvEDH+Njy9wTyhRrzdL50Vt/mlPpedPb66vULe2pHmowgtSlvzUG+hM
U44bsp7JRohhdUpWB2PkGUB3nIaDnh7BCPriUgxk2vU9UsDDlTw2X1XdfNod
cYmppPhZjIBJXPSKHYzIBMbN2XQRYmePxSPfBdK5uHjV0eDULVv2W2VRE86Z
Gdwblr1TY/72t7/JcSJu1MWmE8og+v1OAILdt/iK94w5CyCBxtydazupxSoO
ze0uY1GaEw5FcZ2EucV5w9sOJ5aqSAJJCiYFRzFLqe0jB4eE0EEOUpUiW7eY
1G2jXyv9iiMh4WWpb2hRQ1Jhgd5X7doJfP61KIZNl3+txRhl7Ot0aANKFFBL
nt35NMxw45Ada7+5AadoSWcb9c/MLFXuzYbb1RAfCCF3ve9p2CEUN3QZrYl4
kz3WN87o6ZJ179SdzcJ8HoKT4lRvJhcFTdZTYHPIpFqLqEZ2N42nVZekd8Y2
iMiRjQXZI4bP0be6ImGvUczlxxP/knOkpAgfY9Ao64YErHmVuxZmhQiDCgJr
gsEcz47IOA2OceqGPx4fdjV9x0tL2OdqlyugYNXXHXVCBAe1Ha7fZhGsIvoy
Yl3hcO5K/cVeO7AlBVe6j4GH/E4qtdUNedk0hq1w5cMTj6sMMVWaPuLldQJj
A3qIfqplVpxsyT7Btop/VMqxAobQ3ivumcuoPvgpEc9PTXWp8016bpq8Y58Z
vTqB5BCGaoUWM1Y5eQuT0ufIhPuJLG63ZJxIalP4vE822bG74gr6zko1a8Rz
ZJA6EnmcxBVxaskBFZyqLDdiAnUiwg2nypRo9KN9IZjD2h/tG50afbx0b8qv
OiX7IzVwu0SP9G9QfzyqP9Lv/aDBwXBrg2dhg+FB0ID2e0uDwSBscESdmodT
+6SKRl2JIeHo0e92ntMqiJ/ysVc+rVS/LLvcscR5LzcAdNEudbExuEbxmUIt
5X2QzLAOw17zkQRC23WFWHPT7S4ca2QG94TmadoFS5uA8j0TBqRacwlGtY+P
aj4yKntBrNqCcV3swUuN0bIs6xV1nUMpgio53vlItlvMgIsfqlpHDUFuOUIx
XYteaRW1WMZR/NH7AnL0Zu0PDZnaCaIu3AHusLTZJ21Ldc4iPmfgPCyRB+Md
LRyYkdMNcFm/9UmKzZYiUwiNcvZjw1UDjggn4sJT1r6cNov+aNbGunZCvVYd
kqQJ1J7S5Dh9kPviASvnwQJ3bKJE1n0PzCOCvknFSxE1joB5OCPE/FCf6edT
ZycR8eACOETgJupmYOp5yifqe9Yf8fGnFPm8CGAo7dmCN2VjpzSwCSxa2vs4
Tbkui1Pn8N8kkBG/myfMVBwmDl1GhMQvGaAxwGiaF8zcs4BL2HtZkhsBShyZ
QiBURgK+8Zil7Ra7pEDiA+LUh49wfCspoaw9C3/GbYyzHUXlk4q1lWxGsuqS
FoGeo3gcwdvKNLDqD4ghj8vOeR2jGnGtmd9mBgKNcMFjRZ27URn4lubD52fc
uZk9hnGZE9qOLtGdd+UYisRcytqsJoirlAjNZhwx0xBobZ+gV5ZcFp+5I2dm
U5gcFaaoE7lH8/toLceP3i0jvlmDwIpa2kgKXwopzpeZ7PFJzM+aENXpUXkU
oyeJ8UJjdkVjel2qAqZdb3lDepkifICTDdq/s56sOwVPgrd19QUcJFrFOW6r
iCRNGayDD3H+6oUoko0/thTX+6NraXQULoYDH37+n5NRjMdvXfihiBf5nR7p
k8XeS71yyusn4RElJFd0RD43K+V+yOKKJECDPHrka5Iblt64kLLJdneNqTTg
WbAO4zB/ztEkZPrqWW6fpHPtRDVWEl116d9mSa1RZ9JDIKQ2kAHjNBq6qEfX
DdQa+lLrTktIRCPQytkzX/Aoybfa6AbKnywaclNr8d/8CnYc25TeSgfd72Df
uOrihxWYIPaypQP4ypiAIZFcQmxEu+Ty5DorxgqTSP7wQJODJ0QirSdia+9c
YCytY7xZ0dAK2BgJbpTLRE6euXzP1gBRpxWzDtfKNRT2mgMrH6wEleOUWEHr
QKh4Ga4yhg/lHjKBjjTsveGVGlffVzsWj9XmhKnrsKxMVb7UbIcFsS7a1NMT
nTwfGA1S0RglfifF+SM+6Y1aG/7JnVqE76DoUhAusgScZJKCUcdy7EsWWkjJ
4c0WluuZ52rBWJk3B+o0t0lroZ1nVUu7aZor3s1moZErQ2bW0lO19qA3xKhd
d8EM0YjPLbQDXDTNBBrKq7HGrBr1WOxVVdFiyUVRbqDj3qA9UErzKv2hZUl9
c7eMecLqJ8keBAEEXzeHdU7ucGkUQS5/j0+YbPPVvuHpYifcclCJj0P097jW
+UaOT5zxVURspBusLceAsYPysQwqvXjuUy3qnuhtRq7eM/IdhvxqoDy3uE9h
cbxE4104rr4ygV8K5xGpyUCsY8Lmsoh8SYBXtIoO2gTe3Tg80bHtH8xGajEM
bqivxKEQdwhKMo1d+NcRq2Ly/GbuKygfcb2inOdj0+MqCh2gd6CQf9N6LEki
ZHVoWWLgYUYWS+XzZQHi8qVi+o6P8MvB+njSMVu0aRQcTyub53wKxZxiQ0hX
+BNtKFFdItJWOyfR5lRmkqnxtyQIwxgG8e2ZyHnV4HA7Oq6Ppvobv9qJ6xvn
MMEEuZe2LLMhXpK2zrQcxzyee5HyxrXDHxLXo4a13A/60OItO0BT3r25vrje
49MFZ1dnG9Pmx6cckLZkAn/zG729QTPUnHytq+SiyXpPbinAYXTuNLif4jf2
HFhB1E14/5caL0m6SXSNUcV7I0XrAjHQzsbUX07y+/DgjmPrfXel1BUJCtlM
ySr4kexj3vZ9Sj1IWGP0FmV4d6Xm0x38iwk4VVw91PKKNADCgeOWhTk1gk4x
Vhpns2pe89xs5dJd7myDqhY5xHOk4HuqfjT9TZOirKyeLIySnT1fhOHBWKtQ
e7cOFUaJ/Z3tvxuc7HWkt3aduHuZo4n6crQXlq37V6WD3bq03r0/2tN7Rayk
ebbK7ymg2wL3XSAZ4c/Z1acWrdwIEjgN9SR1+3wgoT4a0pF6HL9b/kgfa18/
DB+8RyuQE4EGK/egRJXP4DF/+0NM3MDBNexvt54NpzISudCjDlaE2I5vauAL
PlqkUa/KmYe9kCjBCE2Fr7N97WoWG+fXXUUf/8rum1tr6zgc99FaSXsc4Vt2
lF0vQREH62eyeMr6mkRvoH8IlvOsWDF5P9mxyJmDcenjp0h4AvyWRuj8dKQP
5zDUjkV4Mlb41h/GyIs2ETTIE7DbVmfDzfiGLYzewMJhKfHpBNY2zCh7mxwu
utoUZF2LSyte6UGe8Eys6oLgcpLaL3SsUju5uy7YvteoDPc+kLo/GjOQ9rwQ
wXioY/7oClm6dpv7JGLIziKEWsvltH+/Azx159/CeIvXKkqEFT4XMmilmMwL
KFq0DifDmH4S3QVtXIaNu2AAe49bBJjpg3BuUKRWn9S899YLtZ+ORR202ax7
0xrXjlRItMTGT0l6CU6p9d9NT37+6Wnc76P28NOMDQdW2dgoRvlEa+MCsuGZ
oXKzHq2ZrHK26Y/NFWn/TuhRc7h0evIze8E06Ypz39ZV2lRvHQkaf46qZCca
cLdWKnUIpYCtcIy1BNdO6/B6K2HrigL8KRgQ0ysB73Q2K9l4zi+dIticKiN3
nWTnsQXJII9siPju7YcNb36LQuF1iuPpbUczJMKnJtDqtdN7D09cWELYiS/U
EMS4oP1K3W1gW07L+epAXxaJgSut2P54QtE56lwAMCBRGOpdFUfDZryKzxh7
Vx+L9PgJeqGhskouWHMJMb7hiYsupWKAJ8d4x1tuGal05fA1+AsKrqTcr9Rw
Uyo3NnC9t0jq7mBP3Dq50OVo0EqH1rmicK58eksuPcGjnauzK6MqZkeRpH7l
6kqvdperYsnAPCz/bvABEOY7wgAJysbWWnlwH7nCKpcYt0hZpWH1fU8Pu2q2
Jrxl14UCBfpOtdM6wyUVNdBFZWBffaLNG9oGuuqZ3Ys6dYPS5M1yviIOoWzj
kCt67mrPYVnwAlX4o0C1oyARzlzkjy3ArrSrUaXeHD4ghGhzEcYvghPwpVbo
PuZQVvBqMCs3HV2GkdvbmgrSZxbrZCOOfrl4vFsk/1biWplG1qn/7sXJ00sy
CgjaRp+4HNtYjl+Faa4i8V3IoXQXQ2bbuQ3GywqMqDCa2NnTF+d9/PHb9MPz
py9e9MO/jni/CCZqiEjrJ74l7cypDkwbHRoTMJ1elMjV/CpqXiV51i25/Ajn
nTny9/h5NQlakCihFi7XzJiGVqMx3L+6PMqg+G0PbMu1gRx69QE/3IL4MrPn
NXLHzOo6d2rLkRCXMYgU76COz7CWkgilO3HVPEAjdT8ubMRFeBJWIVtF+ArV
K66gv5mExtmF4QFw8gspA5UGclK9Rj81yDl3xYsVX+LOCVjUIcpZstIzoCCY
FtSWW3d8kT8tfYq1Tz3sMls8RHELb3Wf2Gi3ect7h3tcqFNxebPceqL4hTeb
1lblPCL3yF9T7tRNv2dcSONpb3jYG/SO9BLJkpzMvMpQiXhwOLDzOF1K1lE1
KgGch9MfVvT8vfnS/I8/93q976QyJY6y+ooXm3XH84hWy5kEQO/SbCdiz0on
5mwjl+oOkcDKtftjYCcB4ZhvQ43aJmD7jSVEajYnjYoLvebBbclJ72m7tiDL
7+szsHq3bF0DyvkPLZNX/nMZB8VEu7ezuFLUcbt/W9Zf9jpqiYML3fgKJ83O
P879zojeRUR8kuZ8NZuL8xXcMOF8pIW7TKWS2xpc6sqLBRtcBfTuhBnDQxWM
UJZQwcmigWNxCVdnFLG/AFBgRhMei4zzhTgbF9v4mxhwZJlczWRalXq6vXzL
8r3KCAO9baq4ZgTPhZ7aR/p9jHKX5KZgR2EfpfcZewGJ0wL1Phl2rvQ0CIMi
3EcZXk7s7uHRfLee39NqWGxcVOolGxrsbVp03I1KD2U62z3cLl9cEji4tVbS
rVrzDDOGMRNfGacH6fK6JwIYlz6Xevb1V8F9y427mR8e6OH796cGBx6cGPxp
0Dug/xucHNgXr89lMaygl7iTYHA4xCUaQm3kQTDX+yLB9vekypl5plUEeCEV
axqT1GtH2ScukkVUJOK3NEuAPP/nfPpboFZ9162kX3kecBlKveO2eaLAlXsj
mUR+kIHWBlpjlbeSOK/WDYSnTUIvyB8zEBuiBzk7rWJ3PZevuMGni11ZR426
jBRHsyvGRk7KPcvG7T9h9RD7Q+y+aa9leLKF8Z87ysLFgRtAx5tWRPTzBW3L
RIhSW2qOZ6ydD2waZGg6wi0BdzPxadcpwsbkTDKuaQKvEMSgGkBLgJq3PlSt
812i41kjQffnXI9dD2rcLdYeHSXT9hzrKGIsZXYaI/Fn9cEP1bxgRapXgkki
b5s2o5n/QUMFwTYl6gDLEWXxqdw0H0HKJt+cqU/4yTmHF5rQDqpIaqJW87ou
QSM9es61DbONAzrYqKj2Xm4aPcgZd9j7ZJxUuvEpmz6WiAkuqIr96delXmUS
oPmWHSfROltyWeo7e4E+vn5xbpFBUa3dej2fPupTKJ97GutF3wYT5qBwUFTA
M+YcloQ6t3fZaXbofBUXx4PAQDiNO/frr+OQ5+Hd6VqvwWzTlj1WzT0T/vcM
fA6zdu2bTLD1HiE+F5YX/jYBCAJnd/JCAxQBcATviadSW0Lx1P8xuhnRV04V
eM4M5Q8HBTYBbIgi4E6TZi1dwKBTl+0NNQTCeEriyyf6jivH5bNanCDW7ddE
TrIt2NB7bC4tcrLMbORw8KK4IdOWkbbDkwaFg0Ds2fZ+tg3Yip9/YLjBwePD
6fr+8UEOh48N0riUoy4nS9zJeesKyVwFDl98UrlCUWYveC2RXiVX/6cuwhol
3IkWz1ZkATssR1dnV52tGriUyuK63JEDfjh+3RGL0tLLrOzl4D5KPDxgNdUm
dPwoYG1iVcNYtaPVCkl9h0yx5e67oOqhmcG5kfA00licNsfxYj6yLxdfM4xX
47cp8wHYdemKjTBFrz6Zm9Q3koy0SIiWRL6ebI4cFfU6qt5EFwyrA+96Epas
FCRQbvHmvl0AIatNYOSLWrdl/drqKCi3mz6e+mRfNkcFe0OVy3UtwTV9cgkC
D8TLZQ8+QkKc7AeffmlUXTlU4O6ibx6BfVmfRN5Qm3yEGFf1rZYtAxOkgeoq
PiTWpMSFFZvrtmeul6BhvsL1SDUBwgNyON+N0meX963PQEsdtyFOqDjVNfVH
gIPa23ooD9fBgqW9FGyrFRfe5wqDknrZAeDC8SGizUFwAqHhgyF+NEF0Y0OM
cFde/I6t1JyRV9y4CuRtrHW0Zjv8wpEhVfU1M2JqgpkMHxXxc5fKp/r8COuG
x+qjf+T/pAC45R/6w3mW/run0+mzMN4XnmGhP+S0kNGSFvYHVuB1BpZzaLU9
ZzX+XxsYh2dosNGWn88j1L6O4nDgUV3G58KxRDCxE3znp7syxPG2H3Q6HX94
tfQG/Tzod6X4W5qHt4Q1M9AfWvOWlR5w7xsrlZ9l/rinhqABSnYdGNmyAx/f
Xv6LN1dKg0fuMf08PNhcqRjnMsBon0pT+asH1ZW2fx4ebt3eT1/llkHrJTUG
rX+GTDbAA7FN59cO+6MJd/KpctNjYvOIyOim/iqRCQcVuj7Ovdr/pzHxpw46
YgJuMJL/2UHKj9GUVj3oCwG2DYpDcziUqiEMf3DOqf0Pld47H0wQ2M57LqN+
lUiO7wZBsJL6X2ViK+IJyktPOUI2rt6bQc/++VOP532360/27ZkhNfz106Mu
wnVyhd7ZGPeLpvFkxpGG1mT/HyMtZ8/vdgAA

-->

</rfc>
