<?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.39 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-robert-mls-slim-00" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.33.0 -->
  <front>
    <title abbrev="SlimMLS">SlimMLS</title>
    <seriesInfo name="Internet-Draft" value="draft-robert-mls-slim-00"/>
    <author fullname="Raphael Robert">
      <organization>Phoenix R&amp;D</organization>
      <address>
        <email>ietf@raphaelrobert.com</email>
      </address>
    </author>
    <author fullname="Konrad Kohbrok">
      <organization>Phoenix R&amp;D</organization>
      <address>
        <email>konrad@ratchet.ing</email>
      </address>
    </author>
    <date year="2026" month="May" day="29"/>
    <area>Security</area>
    <workgroup>Messaging Layer Security</workgroup>
    <keyword>mls</keyword>
    <keyword>post-quantum</keyword>
    <keyword>bandwidth</keyword>
    <keyword>storage</keyword>
    <abstract>
      <?line 38?>

<t>This document defines SlimMLS, an extension to the Messaging Layer Security
(MLS) protocol for reducing wire and per-client storage overhead in groups that
use ciphersuites with large public keys, ciphertexts, signatures, and
credentials. SlimMLS replaces many large objects that appear in MLS
authenticated or transcript-hashed structures with typed hash references.
Clients resolve the referenced objects only when needed, using a per-message
carrier, a local cache, or an application-specific retrieval channel. The
extension is most useful when an independent Delivery Service can assist with
retrieval and per-recipient delivery, although local caching and delayed
fetching also help without such assistance. SlimMLS defines slim variants of
KeyPackage, Commit, Welcome, GroupInfo, and message framing. When placing a
signature outside an encrypted envelope would reveal the signer, SlimMLS keeps
the signature inside the ciphertext.</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-robert-mls-slim/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Messaging Layer Security Working Group mailing list (<eref target="mailto:mls@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/mls/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/mls/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/raphaelrobert/slim-mls"/>.</t>
    </note>
  </front>
  <middle>
    <?line 54?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Post-quantum (PQ) signature and key encapsulation mechanism (KEM) primitives can
have substantially larger keys, ciphertexts, and signatures than their
classical counterparts. Large credentials can create similar pressure, including
in deployments that do not otherwise use large ciphersuite objects. In an MLS
group <xref target="RFC9420"/>, these values appear as larger LeafNodes, parent nodes,
Welcomes, Commits, GroupInfos, and messages. The increase is visible both on
the wire and in client storage.</t>
      <t>In MLS, many of these values are embedded in structures that are signed,
covered by tree hashes or parent hashes, or fed into transcript hashes. A
Delivery Service (DS) can already choose how to route messages, but it cannot
remove or replace authenticated bytes without invalidating the object. This
limits cache-aware delivery, server-assisted fanout, and operation with clients
that hold only part of the group state.</t>
      <t>SlimMLS addresses this by separating object identity from object delivery. The
authenticated or transcript-hashed structure carries a typed hash reference, and
the referenced object is delivered through a per-message carrier, a local cache,
or an application-specific retrieval channel. Recipients verify each object by
recomputing the reference before using it.</t>
      <t>The largest benefits come from deployments where the DS is an independent
service that can assist clients. In such deployments, the DS can omit objects a
recipient already has, reduce update path ciphertexts to the subset each
recipient needs, and supply GroupInfo separately from a SlimWelcome. Deployments
without an assisting DS still benefit from smaller authenticated state, local
caches of credentials and keys, and the ability to defer fetching large objects
until they are needed.</t>
      <t>The main protocol changes are:</t>
      <ul spacing="normal">
        <li>
          <t>SlimKeyPackages replace KeyPackages and batch the signatures needed to
authenticate multiple LeafNodes.</t>
        </li>
        <li>
          <t>SlimCommits carry commit content separately from update path delivery data, so
the Delivery Service can deliver only the ciphertexts each recipient needs.</t>
        </li>
        <li>
          <t>SlimWelcomes adapt Welcome messages to slim KeyPackage references and
server-assisted GroupInfo delivery.</t>
        </li>
        <li>
          <t>Slim message framing and SlimGroupInfo define when signatures are represented
by references and when the raw signature must remain inside encrypted
plaintext to avoid revealing the sender.</t>
        </li>
      </ul>
      <t>This pattern is not new in MLS. <xref target="RFC9420"/> already uses RefHash-based
references such as KeyPackageRef and ProposalRef. SlimMLS generalizes the
mechanism.</t>
      <t>[[TODO: quantify wire and storage savings for representative PQ
ciphersuites once the specification stabilizes.]]</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?>

<t>This document uses the TLS presentation language and notation of
<xref target="RFC9420"/>. Familiarity with MLS <xref target="RFC9420"/> is assumed.</t>
    </section>
    <section anchor="overview">
      <name>Overview</name>
      <t>A SlimMLS group is an MLS group whose GroupContext carries the <tt>slim_mls</tt>
extension (<xref target="slim-mls-extension"/>). In such a group:</t>
      <ul spacing="normal">
        <li>
          <t>In structures derived by mechanical substitution, each HPKEPublicKey,
SignaturePublicKey, Credential, HPKECiphertext, or signature is replaced with
a hash reference of the corresponding type. Structures specified explicitly in
this document define their own replacements and exceptions.</t>
        </li>
        <li>
          <t>The referenced large objects are retrieved per <xref target="large-object-retrieval"/> if
and when necessary.</t>
        </li>
      </ul>
    </section>
    <section anchor="ref-types">
      <name>Reference Computation</name>
      <t>All new references are computed in the same style as KeyPackageRef in <xref section="5.2" sectionFormat="of" target="RFC9420"/>, i.e., using RefHash instantiated with the relevant ciphersuite
hash function and a label unique to the referenced object type. Inputs are
TLS-encoded per <xref target="RFC9420"/>. For group-bound structures, the relevant
ciphersuite is the group's ciphersuite. For references contained in or computed
over a SlimKeyPackage, the relevant ciphersuite is
<tt>outer_key_package.cipher_suite</tt> of that SlimKeyPackage.</t>
      <t>The following reference types are defined:</t>
      <table>
        <thead>
          <tr>
            <th align="left">Referenced value</th>
            <th align="left">Reference type</th>
            <th align="left">RefHash label</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">HPKEPublicKey</td>
            <td align="left">HPKEPublicKeyRef</td>
            <td align="left">"MLS 1.0 SlimMLS HPKEPublicKey"</td>
          </tr>
          <tr>
            <td align="left">SignaturePublicKey</td>
            <td align="left">SignaturePublicKeyRef</td>
            <td align="left">"MLS 1.0 SlimMLS SignaturePublicKey"</td>
          </tr>
          <tr>
            <td align="left">Credential</td>
            <td align="left">CredentialRef</td>
            <td align="left">"MLS 1.0 SlimMLS Credential"</td>
          </tr>
          <tr>
            <td align="left">HPKECiphertext</td>
            <td align="left">HPKECiphertextRef</td>
            <td align="left">"MLS 1.0 SlimMLS HPKECiphertext"</td>
          </tr>
          <tr>
            <td align="left">Signature</td>
            <td align="left">SignatureRef</td>
            <td align="left">"MLS 1.0 SlimMLS Signature"</td>
          </tr>
          <tr>
            <td align="left">SlimKeyPackage</td>
            <td align="left">SlimKeyPackageRef</td>
            <td align="left">"MLS 1.0 SlimMLS KeyPackage Reference"</td>
          </tr>
        </tbody>
      </table>
      <t>Each reference is <tt>opaque&lt;V&gt;</tt> where <tt>V</tt> is the output length of the
ciphersuite hash function.</t>
      <t>For a SlimKeyPackageRef, the value input is the TLS-encoded SlimKeyPackage.
SlimKeyPackageRef is used to identify the recipient of a SlimWelcome; it is not
a large-object reference and has no corresponding LargeObjectCarrier entry.</t>
      <t>SignatureRef is used for signature fields that appear in slim structures unless
this document requires the raw signature to remain inside an encrypted envelope.
It is also used for detached signatures referenced by slim structures, such as
the SlimKeyPackage batch signature (<xref target="slim-key-package"/>).</t>
      <t>Some signature fields use SignatureOrRef, whose variant is constrained by the
wire envelope that carries the structure:</t>
      <artwork><![CDATA[
enum {
  reserved(0),
  signature(1),
  signature_ref(2),
  (255)
} SignatureOrRefType;

struct {
  SignatureOrRefType signature_type;
  select (SignatureOrRef.signature_type) {
    case signature:
      Signature signature;
    case signature_ref:
      SignatureRef signature_ref;
  };
} SignatureOrRef;
]]></artwork>
      <t>When <tt>signature_type = signature_ref</tt>, the raw signature bytes are resolved per
<xref target="large-object-retrieval"/>. When <tt>signature_type = signature</tt>, the raw
signature bytes are carried inline and <bcp14>MUST NOT</bcp14> be sent outside the encrypted
envelope in a LargeObjectCarrier.</t>
    </section>
    <section anchor="slim-structs">
      <name>SlimMLS Structs</name>
      <t>For every <xref target="RFC9420"/> struct not given an explicit replacement in this document
that embeds an HPKEPublicKey, SignaturePublicKey, Credential, HPKECiphertext, or
signature, SlimMLS defines a corresponding "Slim*" struct that is identical to
the original except that each occurrence of a large object is replaced by the
reference type from <xref target="ref-types"/> and that each occurrence of a struct for which
there exists a Slim equivalent is replaced by that equivalent.
Tree hashes and parent hashes are likewise computed over the slim encodings, so
the reference values stand in for the corresponding large objects in these
computations.</t>
      <t>The following signatures use SignatureOrRef because their correct presentation
depends on whether the signature is carried inside an encrypted envelope:</t>
      <ul spacing="normal">
        <li>
          <t>an encrypted GroupInfo carried in a SlimWelcome, whose signature remains
inline inside the encrypted GroupInfo plaintext, and</t>
        </li>
        <li>
          <t>a SlimPrivateMessage framing signature, which remains inline inside the
encrypted SlimPrivateMessageContent.</t>
        </li>
      </ul>
      <t>When either signature is carried inside an encrypted envelope, it <bcp14>MUST</bcp14> use the
<tt>signature</tt> variant.</t>
      <t>Welcome, KeyPackage, and Commit are not derived by mechanical substitution.
They are replaced by the SlimWelcome struct (<xref target="slim-welcome"/>), the
SlimKeyPackage struct (<xref target="slim-key-package"/>), and the SlimCommit struct
(<xref target="slim-commit"/>) respectively. As a consequence, the UpdatePath struct does not
appear in a SlimMLS group. Its contents are split between SlimCommit (which
carries the committer's SlimLeafNode) and SlimUpdatePath (which carries the path
nodes).</t>
      <t>In a SlimMLS group, the slim struct is sent on the wire wherever <xref target="RFC9420"/>
would specify the original struct. Validation rules of <xref target="RFC9420"/> apply in
the same way. References are only replaced by the corresponding large objects if
functionally necessary (e.g. to verify a signature, encrypt a ciphertext, or
retrieve referenced signature bytes).</t>
      <t>The <xref target="RFC9420"/> structs affected, the large objects they embed, and the
SlimMLS replacements are listed below. Structs whose only embedded large
objects appear via a nested struct (e.g., proposals that carry a
LeafNode or KeyPackage) inherit slim variants implicitly via the slim
nested struct.</t>
      <table>
        <thead>
          <tr>
            <th align="left">RFC 9420 struct</th>
            <th align="left">Embedded large object(s)</th>
            <th align="left">SlimMLS replacement(s)</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">LeafNode</td>
            <td align="left">HPKEPublicKey, SignaturePublicKey, Credential, signature</td>
            <td align="left">HPKEPublicKeyRef, SignaturePublicKeyRef, CredentialRef, SignatureRef</td>
          </tr>
          <tr>
            <td align="left">ParentNode</td>
            <td align="left">HPKEPublicKey</td>
            <td align="left">HPKEPublicKeyRef</td>
          </tr>
          <tr>
            <td align="left">ParentHashInput</td>
            <td align="left">HPKEPublicKey</td>
            <td align="left">HPKEPublicKeyRef</td>
          </tr>
          <tr>
            <td align="left">UpdatePathNode</td>
            <td align="left">HPKEPublicKey, HPKECiphertext (vector)</td>
            <td align="left">HPKEPublicKeyRef, HPKECiphertextRef (vector)</td>
          </tr>
          <tr>
            <td align="left">Signature-bearing structs except SignatureOrRef cases</td>
            <td align="left">signature</td>
            <td align="left">SignatureRef</td>
          </tr>
          <tr>
            <td align="left">Add proposal</td>
            <td align="left">KeyPackage</td>
            <td align="left">SlimKeyPackage</td>
          </tr>
          <tr>
            <td align="left">Update proposal</td>
            <td align="left">LeafNode</td>
            <td align="left">SlimLeafNode</td>
          </tr>
          <tr>
            <td align="left">ratchet_tree extension</td>
            <td align="left">LeafNode, ParentNode</td>
            <td align="left">slim_ratchet_tree extension with SlimLeafNode, SlimParentNode</td>
          </tr>
        </tbody>
      </table>
      <t>The exact TLS presentation of each remaining slim struct is obtained by
mechanical substitution against <xref target="RFC9420"/> and is not repeated here.</t>
      <t>[[TODO: provide explicit TLS presentations for each slim variant in a
later revision.]]</t>
      <section anchor="slim-leaf-node">
        <name>SlimLeafNode</name>
        <t>SlimLeafNode replaces LeafNode. SlimLeafNodeTBS replaces the LeafNodeTBS input
defined in <xref section="7.2" sectionFormat="of" target="RFC9420"/>.</t>
        <t>SlimMLS uses the <tt>app_data_dictionary</tt> extension specified in <xref section="7.2.1" sectionFormat="of" target="I-D.ietf-mls-extensions"/> to carry SlimMLS-specific components in a
SlimLeafNode's <tt>extensions</tt> field.</t>
        <artwork><![CDATA[
struct {
  opaque sibling_hash<V>;
} SlimKeyPackageMerkleProofNode;

struct {
  uint32                         leaf_index;
  uint32                         tree_size;
  SlimKeyPackageMerkleProofNode  path<V>;
} SlimKeyPackageMerkleProof;

struct {
  HPKEPublicKeyRef      encryption_key_ref;
  SignaturePublicKeyRef signature_key_ref;
  CredentialRef         credential_ref;
  Capabilities          capabilities;

  LeafNodeSource leaf_node_source;
  select (SlimLeafNodeTBS.leaf_node_source) {
    case key_package:
      Lifetime lifetime;

    case update:
      struct{};

    case commit:
      opaque parent_hash<V>;
  };

  Extension extensions<V>;

  select (SlimLeafNodeTBS.leaf_node_source) {
    case key_package:
      struct{};

    case update:
      opaque group_id<V>;
      uint32 leaf_index;

    case commit:
      opaque group_id<V>;
      uint32 leaf_index;
  };
} SlimLeafNodeTBS;

struct {
  HPKEPublicKeyRef      encryption_key_ref;
  SignaturePublicKeyRef signature_key_ref;
  CredentialRef         credential_ref;
  Capabilities          capabilities;

  LeafNodeSource leaf_node_source;
  select (SlimLeafNode.leaf_node_source) {
    case key_package:
      Lifetime lifetime;

    case update:
      struct{};

    case commit:
      opaque parent_hash<V>;
  };

  Extension extensions<V>;

  /*
    For key_package leaves, this is a SignatureRef to the batch signature.
    For update and commit leaves, this is a SignatureRef to the normal
    SlimLeafNode signature over SlimLeafNodeTBS.
  */
  SignatureRef signature;

  select (SlimLeafNode.leaf_node_source) {
    case key_package:
      SlimKeyPackageMerkleProof proof;

    case update:
      struct{};

    case commit:
      struct{};
  };
} SlimLeafNode;
]]></artwork>
        <t>The <tt>proof</tt> field is present only when <tt>leaf_node_source = key_package</tt>. It is
not part of SlimLeafNodeTBS to avoid a circulare dependency. Update and commit
leaf nodes do not carry this field.</t>
        <t>For <tt>leaf_node_source = key_package</tt>, the <tt>signature</tt> field references the
SlimKeyPackage batch signature and validation <bcp14>MUST</bcp14> verify both this signature
and the embedded <tt>proof</tt> as described in <xref target="slim-key-package-merkle-tree"/>. This
allows clients to validate a key-package SlimLeafNode even when it appears in a
ratchet tree without the enclosing SlimKeyPackage. For leaf nodes whose source
is <tt>update</tt> or <tt>commit</tt>, the <tt>signature</tt> field is the normal SlimLeafNode
signature over SlimLeafNodeTBS, verified as in <xref section="7.3" sectionFormat="of" target="RFC9420"/> after
applying the slim substitutions in this document.</t>
      </section>
      <section anchor="slim-parent-structures">
        <name>SlimParentNode and SlimParentHashInput</name>
        <t>The following slim tree structures are used in tree-hash and parent-hash
computations:</t>
        <artwork><![CDATA[
struct {
  HPKEPublicKeyRef encryption_key_ref;
  opaque           parent_hash<V>;
  uint32           unmerged_leaves<V>;
} SlimParentNode;

struct {
  HPKEPublicKeyRef encryption_key_ref;
  opaque           parent_hash<V>;
  opaque           original_sibling_tree_hash<V>;
} SlimParentHashInput;
]]></artwork>
        <t>SlimParentNode replaces ParentNode. SlimParentHashInput replaces the
ParentHashInput defined in <xref section="7.9" sectionFormat="of" target="RFC9420"/>.</t>
      </section>
      <section anchor="slim-group-info">
        <name>SlimGroupInfo</name>
        <t>SlimGroupInfo is the slim replacement for the <xref target="RFC9420"/> GroupInfo struct. It
uses the same fields and verification rules as GroupInfo, except that
GroupInfo extensions use SlimMLS replacements and the signature is represented
as SignatureOrRef.</t>
        <artwork><![CDATA[
struct {
  GroupContext group_context;
  Extension extensions<V>;
  MAC confirmation_tag;
  uint32 signer;
} SlimGroupInfoTBS;

struct {
  GroupContext group_context;
  Extension extensions<V>;
  MAC confirmation_tag;
  uint32 signer;

  /*
    SignWithLabel(., "GroupInfoTBS", SlimGroupInfoTBS)
  */
  SignatureOrRef signature;
} SlimGroupInfo;
]]></artwork>
        <t>The signature is computed and verified as in <xref target="RFC9420"/>, except that the
to-be-signed content is SlimGroupInfoTBS. A standalone SlimGroupInfo, or a
SlimGroupInfo carried in <tt>WelcomeGroupInfo.info_type = plaintext</tt>, <bcp14>MUST</bcp14> use
<tt>signature_type = signature_ref</tt>. A SlimGroupInfo encrypted into
<tt>WelcomeGroupInfo.info_type = encrypted</tt> <bcp14>MUST</bcp14> use <tt>signature_type = signature</tt>
so that the raw signature is protected by the SlimWelcome encryption.</t>
      </section>
    </section>
    <section anchor="large-object-retrieval">
      <name>Large Object Retrieval</name>
      <t>References to large objects in SlimMLS structures, in their associated companion
structures (e.g., SlimUpdatePath, <xref target="slim-commit"/>), and in GroupInfo extensions
defined by this document <bcp14>MUST</bcp14> be resolved to the corresponding large objects
when necessary for MLS operations or validation checks.</t>
      <t>SlimMLS defines three retrieval channels:</t>
      <ul spacing="normal">
        <li>
          <t>The LargeObjectCarrier (<xref target="large-object-carrier"/>), specified in this
document.</t>
        </li>
        <li>
          <t>A client-local cache of previously resolved objects.</t>
        </li>
        <li>
          <t>An application-specific fetch mechanism.</t>
        </li>
      </ul>
      <t>Applications can decide how or if they use one or more retrieval channels.</t>
      <t>On receipt of a SlimMLS structure, a client:</t>
      <ol spacing="normal" type="1"><li>
          <t>For every large-object <tt>*Ref</tt> it needs to process the structure or any
associated companion structure, locates a candidate object through any of the
three channels above.</t>
        </li>
        <li>
          <t>Computes the reference of each candidate object under the appropriate
label (<xref target="ref-types"/>) and verifies that it equals the <tt>*Ref</tt> being
resolved. A candidate object whose reference does not match <bcp14>MUST NOT</bcp14> be
used for any cryptographic operation.</t>
        </li>
        <li>
          <t>If a required <tt>*Ref</tt> cannot be resolved through any channel, the client <bcp14>MUST</bcp14>
either request the missing object through an application-specific mechanism,
for example from the DS, or drop the message.</t>
        </li>
      </ol>
      <section anchor="large-object-carrier">
        <name>Large Object Carrier</name>
        <t>A client sending a SlimMLS struct over the wire <bcp14>MAY</bcp14> also send a
LargeObjectCarrier struct that contains a subset of the large objects referenced
by the SlimMLS struct or by an associated structure such as SlimUpdatePath
(<xref target="slim-commit"/>).</t>
        <t>This document does not define a single MLSMessage wrapper for
LargeObjectCarrier. When a carrier is sent on the wire, its encoding,
multiplexing, and association with the SlimMLS message are provided by the
application or DS protocol using SlimMLS.</t>
        <t>For each large-object reference type that appears in a slim structure or an
associated structure, the LargeObjectCarrier contains a vector of the
corresponding large objects:</t>
        <artwork><![CDATA[
struct {
  HPKEPublicKey      hpke_public_keys<V>;
  SignaturePublicKey signature_public_keys<V>;
  Credential         credentials<V>;
  HPKECiphertext     hpke_ciphertexts<V>;
  Signature          signatures<V>;
} LargeObjectCarrier;
]]></artwork>
        <t>The carrier is NOT part of the signed structure. The DS <bcp14>MAY</bcp14> add, remove,
reorder, or substitute entries on a per-recipient basis, e.g., to omit objects
the recipient already has cached, or to distribute SlimUpdatePath ciphertexts
(see <xref target="slim-commit"/>). The LargeObjectCarrier is optional in the SlimMLS wire
protocol. The DS <bcp14>MAY</bcp14> reject a message based on a missing LargeObjectCarrier, or
on a LargeObjectCarrier that is missing the large objects that clients will need
to process a message, if its local deployment policy requires senders to provide
those objects proactively.</t>
      </section>
    </section>
    <section anchor="slim-key-package">
      <name>SlimKeyPackage</name>
      <t>SlimKeyPackage applies the slim reference replacement to KeyPackage and
amortizes KeyPackage authentication across a batch of KeyPackages uploaded by
the same client. The signature around the KeyPackage is omitted, and the
per-KeyPackage LeafNode signature is replaced by a detached batch signature over
the root of a Merkle tree. The leaves of this tree are the SlimLeafNodeTBS
values of the SlimKeyPackages in the batch.</t>
      <t>In a SlimMLS group, an <xref target="RFC9420"/> KeyPackage <bcp14>MUST NOT</bcp14> be used to add a new
member: Add proposals <bcp14>MUST</bcp14> carry a SlimKeyPackage, and standalone KeyPackage
publication <bcp14>MUST</bcp14> use the <tt>mls_slim_key_package</tt> wire format
(<xref target="wire-formats"/>). A recipient <bcp14>MUST</bcp14> reject any Add proposal or wire-format
message carrying an <xref target="RFC9420"/> KeyPackage in the context of a group with the
<tt>slim_mls</tt> extension.</t>
      <t><tt>SlimLeafNodeTBS</tt> is the unsigned part of a SlimLeafNode. It carries neither
the <tt>signature</tt> field nor the key-package Merkle proof.</t>
      <t>A SlimKeyPackage is partitioned into an OuterSlimKeyPackage (the fields of a
KeyPackage other than the LeafNode and signature) and a SlimLeafNode. The
SlimLeafNode carries the SignatureRef of the detached batch signature and its
Merkle inclusion proof:</t>
      <artwork><![CDATA[
struct {
  ProtocolVersion  version;
  CipherSuite      cipher_suite;
  HPKEPublicKeyRef init_key_ref;
  Extension        extensions<V>;
} OuterSlimKeyPackage;

struct {
  ProtocolVersion       version;
  CipherSuite           cipher_suite;
  SignaturePublicKeyRef signature_key_ref;
  uint32                tree_size;
  opaque                merkle_root<V>;
} SlimKeyPackageBatchTBS;

struct {
  OuterSlimKeyPackage              outer_key_package;
  SlimLeafNode                     leaf_node;
} SlimKeyPackage;
]]></artwork>
      <t>A SlimKeyPackage carries no outer signature and no per-package LeafNode
signature. Authenticity of <tt>outer_key_package</tt> is provided by an
OuterKeyPackageHash component (<xref target="outer-key-package-hash"/>) placed in the
SlimLeafNode's <tt>app_data_dictionary</tt> extension. Authenticity of the
SlimLeafNodeTBS, including this component, is provided by the batch signature
referenced by <tt>leaf_node.signature</tt> and the Merkle inclusion proof in
<tt>leaf_node.proof</tt>.</t>
      <t>The HPKEPublicKey corresponding to <tt>init_key_ref</tt>, together with any large
objects referenced by the SlimLeafNode, is resolved per
<xref target="large-object-retrieval"/>.</t>
      <section anchor="slim-key-package-merkle-tree">
        <name>KeyPackage Batch Merkle Tree</name>
        <t>The Merkle tree for a SlimKeyPackage batch is computed under the hash function
of the SlimKeyPackage ciphersuite. A batch <bcp14>MUST</bcp14> contain at least one leaf. All
SlimKeyPackages in a batch <bcp14>MUST</bcp14> have the same <tt>version</tt>, <tt>cipher_suite</tt>, and
<tt>signature_key_ref</tt>.</t>
        <t>The leaf hash for a SlimLeafNodeTBS is computed over the TLS-encoded
SlimLeafNodeTBS:</t>
        <artwork><![CDATA[
HashWithLabel("SlimKeyPackageLeaf", SlimLeafNodeTBS)
]]></artwork>
        <t>The parent hash for two child hashes is computed over their TLS-encoded ordered
pair:</t>
        <artwork><![CDATA[
struct {
  opaque left<V>;
  opaque right<V>;
} SlimKeyPackageMerkleParentInput;

HashWithLabel("SlimKeyPackageNode", SlimKeyPackageMerkleParentInput)
]]></artwork>
        <t>The tree is built bottom-up from the ordered list of leaf hashes. At each level,
adjacent nodes are paired from left to right. If the final node at a level has
no sibling, it is promoted unchanged to the next level. The single node
remaining after this process is the Merkle root.</t>
        <t>The <tt>path</tt> entries in SlimKeyPackageMerkleProof are ordered from the leaf level
toward the root. To verify a proof, a recipient starts with the leaf hash of
<tt>leaf_node_tbs</tt>, <tt>leaf_index</tt>, and <tt>tree_size</tt>. At each level, if the current
level width is odd and the current index is <tt>width - 1</tt>, the current hash is
promoted unchanged and no path entry is consumed. Otherwise, the next path entry
is consumed as the sibling hash and the parent hash is computed with the sibling
on the left when the current index is odd, and on the right when the current
index is even. The index is then divided by two, rounding down, and the level
width is divided by two, rounding up. A proof is valid only if <tt>tree_size</tt> is
nonzero, <tt>leaf_index &lt; tree_size</tt>, all path entries are consumed, and the final
computed hash is the Merkle root.</t>
        <t>The batch signature is computed over:</t>
        <artwork><![CDATA[
SignWithLabel(., "SlimKeyPackageBatchTBS", SlimKeyPackageBatchTBS)
]]></artwork>
        <t>where <tt>version</tt> and <tt>cipher_suite</tt> are taken from <tt>outer_key_package</tt>,
<tt>signature_key_ref</tt> is taken from <tt>leaf_node_tbs</tt>, <tt>tree_size</tt> is taken from
the proof in <tt>leaf_node</tt>, and <tt>merkle_root</tt> is the Merkle root computed as
above.</t>
      </section>
      <section anchor="outer-key-package-hash">
        <name>OuterKeyPackageHash component</name>
        <artwork><![CDATA[
struct {
  opaque outer_key_package_hash<V>;
} OuterKeyPackageHash;
]]></artwork>
        <t><tt>outer_key_package_hash</tt> is the hash, under the SlimKeyPackage's ciphersuite
hash function, of the TLS-encoded <tt>outer_key_package</tt> of the SlimKeyPackage
in which the SlimLeafNode appears.</t>
        <t>An OuterKeyPackageHash is valid only if the SlimLeafNode's
<tt>leaf_node_source</tt> is <tt>key_package</tt> and <tt>outer_key_package_hash</tt> equals the
hash of the enclosing SlimKeyPackage's <tt>outer_key_package</tt>.</t>
        <t>The <tt>app_data_dictionary</tt> extension <bcp14>MUST</bcp14> contain exactly one
OuterKeyPackageHash component under component identifier TBD. A missing,
malformed, or duplicated OuterKeyPackageHash component makes the enclosing
SlimKeyPackage invalid.</t>
      </section>
      <section anchor="creation-and-processing">
        <name>Creation and Processing</name>
        <t>A sender constructs a SlimKeyPackage as follows:</t>
        <ol spacing="normal" type="1"><li>
            <t>Construct an OuterSlimKeyPackage with the desired version, cipher_suite,
HPKEPublicKeyRef for the init key, and extensions.</t>
          </li>
          <li>
            <t>Construct a SlimLeafNodeTBS with <tt>leaf_node_source = key_package</tt>. Add an
<tt>app_data_dictionary</tt> extension containing an OuterKeyPackageHash whose
value is the hash of the OuterSlimKeyPackage from step 1.</t>
          </li>
          <li>
            <t>Construct all other SlimLeafNodeTBS values in the batch in the same way.</t>
          </li>
          <li>
            <t>Build the KeyPackage batch Merkle tree over the SlimLeafNodeTBS values.</t>
          </li>
          <li>
            <t>Construct a SlimKeyPackageBatchTBS for the root, sign it with the signature
private key corresponding to <tt>signature_key_ref</tt>, and compute the
SignatureRef over the raw signature bytes.</t>
          </li>
          <li>
            <t>Emit each SlimKeyPackage with the common SignatureRef in
<tt>leaf_node.signature</tt> and the leaf's inclusion proof in <tt>leaf_node.proof</tt>,
optionally accompanied by a LargeObjectCarrier holding the referenced
HPKEPublicKey and the large objects referenced by the SlimLeafNode and the
batch signature bytes.</t>
          </li>
        </ol>
        <t>A recipient processes a SlimKeyPackage like a KeyPackage with the following
exceptions:</t>
        <ul spacing="normal">
          <li>
            <t>There is no outer signature to verify.</t>
          </li>
          <li>
            <t>There is no per-package LeafNode signature to verify.</t>
          </li>
          <li>
            <t>The SlimLeafNode <bcp14>MUST</bcp14> contain an <tt>app_data_dictionary</tt> extension with a valid
OuterKeyPackageHash component.</t>
          </li>
          <li>
            <t>The SlimLeafNode <bcp14>MUST</bcp14> have <tt>leaf_node_source = key_package</tt> and therefore
carry a <tt>proof</tt> field.</t>
          </li>
          <li>
            <t>The recipient resolves the batch signature bytes using <tt>leaf_node.signature</tt>,
computes SignatureRef over those bytes, and verifies that it equals
<tt>leaf_node.signature</tt>.</t>
          </li>
          <li>
            <t>The recipient verifies the Merkle inclusion proof in <tt>leaf_node.proof</tt>,
reconstructs the SlimKeyPackageBatchTBS, resolves the SignaturePublicKey
corresponding to <tt>signature_key_ref</tt>, and verifies the raw batch signature
bytes identified by <tt>leaf_node.signature</tt> using VerifyWithLabel label
"SlimKeyPackageBatchTBS".</t>
          </li>
          <li>
            <t>All large-object <tt>*Ref</tt> values are resolved per <xref target="large-object-retrieval"/>.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="slim-welcome">
      <name>SlimWelcome</name>
      <t>SlimWelcome makes two changes relative to the <xref target="RFC9420"/> Welcome:</t>
      <ol spacing="normal" type="1"><li>
          <t>The per-recipient EncryptedGroupSecrets is replaced by a
SlimEncryptedGroupSecrets (<xref target="slim-egs"/>), which permits the recipient to be
identified either by SlimKeyPackageRef or by leaf index.</t>
        </li>
        <li>
          <t>The <tt>encrypted_group_info</tt> field is replaced by an
<tt>optional&lt;WelcomeGroupInfo&gt;</tt> (<xref target="welcome-group-info"/>), where
WelcomeGroupInfo is a tagged union over an encrypted form and a
plaintext form.</t>
        </li>
      </ol>
      <t>With the exception of changes described in this section, SlimWelcomes are
processed just like regular Welcome messages.</t>
      <artwork><![CDATA[
struct {
  CipherSuite                cipher_suite;
  SlimEncryptedGroupSecrets  secrets<V>;
  optional<WelcomeGroupInfo> group_info;
} SlimWelcome;
]]></artwork>
      <section anchor="sender-and-ds-behavior">
        <name>Sender and DS Behavior</name>
        <t>The sender <bcp14>MUST</bcp14> construct <tt>SlimWelcome.secrets</tt> to contain one
SlimEncryptedGroupSecrets for every recipient it intends to add, in
the same order it would use under <xref target="RFC9420"/>.</t>
        <t>The DS <bcp14>MAY</bcp14> remove entries from <tt>SlimWelcome.secrets</tt> on a per-recipient basis,
e.g., to deliver to each recipient only its own entry.</t>
        <t>If the sender omits the <tt>group_info</tt> field (presence octet 0), the DS <bcp14>MUST</bcp14>
populate it with a plaintext WelcomeGroupInfo before delivering the SlimWelcome
to a recipient (<xref target="welcome-group-info"/>). In this mode, the GroupInfo used by the
sender to encrypt the SlimEncryptedGroupSecrets and the GroupInfo populated by
the DS <bcp14>MUST</bcp14> be byte-for-byte identical SlimGroupInfo objects.</t>
        <t>A DS that supplies large objects alongside a SlimWelcome can distinguish
between basic-processing delivery and update-capable delivery. Basic-processing
delivery contains the large objects needed for the recipient to validate the
SlimWelcome, derive the epoch secrets, receive subsequent MLS messages, and send
application messages. It can omit HPKE public keys that are only needed to
construct a future Commit with an update path. Update-capable delivery
additionally includes enough HPKE public keys for the recipient to construct an
update path without a later fetch, such as the HPKE public keys for the
recipient's copath resolution in the delivered tree. A recipient that has only
basic-processing state <bcp14>MUST</bcp14> resolve the missing HPKEPublicKeyRefs before
sending a Commit with an update path.</t>
      </section>
      <section anchor="slim-egs">
        <name>SlimEncryptedGroupSecrets</name>
        <t>SlimEncryptedGroupSecrets extends the <xref target="RFC9420"/>
EncryptedGroupSecrets to allow either of two recipient identifiers:</t>
        <artwork><![CDATA[
enum {
  reserved(0),
  slim_key_package_ref(1),
  leaf_node_index(2),
  (255)
} RecipientIdentifierType;

struct {
  RecipientIdentifierType recipient_type;
  select (SlimEncryptedGroupSecrets.recipient_type) {
    case slim_key_package_ref:
      SlimKeyPackageRef new_member;
    case leaf_node_index:
      uint32 leaf_node_index;
  };
  HPKECiphertext encrypted_group_secrets;
} SlimEncryptedGroupSecrets;
]]></artwork>
        <t>A recipient locates the entry intended for it by matching either its own
SlimKeyPackageRef or its leaf in the group's ratchet tree via the leaf index.</t>
        <t>The <tt>leaf_node_index</tt> recipient type <bcp14>MUST</bcp14> be used only when the
SlimEncryptedGroupSecrets is encrypted using a plaintext SlimGroupInfo as
context and the delivered SlimWelcome carries
<tt>WelcomeGroupInfo.info_type = plaintext</tt>. Otherwise, the sender <bcp14>MUST</bcp14> use
<tt>slim_key_package_ref</tt>.</t>
      </section>
      <section anchor="welcome-group-info">
        <name>WelcomeGroupInfo</name>
        <t>WelcomeGroupInfo is a tagged union over two presentations of the
SlimGroupInfo: an encrypted form or a plaintext form:</t>
        <artwork><![CDATA[
enum {
  reserved(0),
  encrypted(1),
  plaintext(2),
  (255)
} WelcomeGroupInfoType;

struct {
  WelcomeGroupInfoType info_type;
  select (WelcomeGroupInfo.info_type) {
    case encrypted:
      opaque encrypted_group_info<V>;
    case plaintext:
      SlimGroupInfo group_info;
  };
} WelcomeGroupInfo;
]]></artwork>
        <t>The <tt>encrypted</tt> variant is encrypted under a key derived from the joiner secret,
as in the <tt>encrypted_group_info</tt> field of the <xref target="RFC9420"/> Welcome. Its
plaintext is a SlimGroupInfo whose SignatureOrRef uses
<tt>signature_type = signature</tt>. A sender <bcp14>MUST NOT</bcp14> encrypt a SlimGroupInfo with
<tt>signature_type = signature_ref</tt> into this field.</t>
        <t>The <tt>plaintext</tt> variant carries a SlimGroupInfo in the clear. Its
SignatureOrRef <bcp14>MUST</bcp14> use <tt>signature_type = signature_ref</tt>, which is resolved per
<xref target="large-object-retrieval"/> before signature verification.</t>
        <t>The HPKE context used to encrypt and decrypt
<tt>SlimEncryptedGroupSecrets.encrypted_group_secrets</tt> depends on the GroupInfo
presentation. For the <tt>encrypted</tt> variant, the context is the
<tt>encrypted_group_info</tt> value, as in <xref target="RFC9420"/>. For the <tt>plaintext</tt> variant,
and for SlimWelcomes sent with <tt>group_info</tt> absent, the context is the
TLS-encoded SlimGroupInfo.</t>
        <t>The outer <tt>optional&lt;WelcomeGroupInfo&gt;</tt> in the SlimWelcome additionally allows
the sender to omit the GroupInfo. This mode is intended for server-assisted
deployments where the sender and recipient can obtain the exact GroupInfo by
some channel other than the SlimWelcome.</t>
        <t>A recipient that receives a SlimWelcome whose <tt>group_info</tt> field is
absent <bcp14>MUST</bcp14> consider the SlimWelcome invalid.</t>
      </section>
    </section>
    <section anchor="slim-commit">
      <name>SlimCommit</name>
      <t>SlimCommit enables split delivery for SlimMLS Commits. The DS can deliver to
each recipient only the HPKECiphertextRefs and HPKECiphertexts intended for
that recipient. It also saves one signature when a commit contains a path but
does not rotate the sender's signature key.</t>
      <t>A SlimMLS-aware sender <bcp14>MUST</bcp14> use a SlimCommit in place of an MLS Commit in a
group with the <tt>slim_mls</tt> extension.</t>
      <t>A SlimCommit is carried in either a SlimPublicMessage or SlimPrivateMessage
(<xref target="slim-framing"/>). These message structures allow the unsigned SlimUpdatePath
to be carried alongside the framed SlimCommit without being included in the
transcript hash, the membership tag, or the framing signature.</t>
      <t>A SlimCommit carries the normal <xref target="RFC9420"/> confirmation tag in its
SlimFramedContentAuthData. When the single-signature construction of
<xref target="single-sig-commits"/> applies, the authentication data contains the
confirmation tag but omits the framing signature field. Otherwise, the
authentication data contains the confirmation tag and a SignatureOrRef whose
variant is determined by the message envelope.</t>
      <artwork><![CDATA[
struct {
  ProposalOrRef          proposals<V>;
  optional<SlimLeafNode> leaf_node;
} SlimCommit;
]]></artwork>
      <t><tt>leaf_node</tt>, when present, is the committer's new SlimLeafNode.</t>
      <section anchor="slimupdatepath">
        <name>SlimUpdatePath</name>
        <t>The path is conveyed separately from the framed SlimCommit:</t>
        <artwork><![CDATA[
struct {
  HPKEPublicKeyRef  encryption_key_ref;
  HPKECiphertextRef encrypted_path_secret_refs<V>;
} SlimUpdatePathNode;

struct {
  SlimUpdatePathNode nodes<V>;
} SlimUpdatePath;
]]></artwork>
        <t>Each SlimUpdatePathNode carries an HPKEPublicKeyRef for the new ParentNode
public key and a vector of HPKECiphertextRefs. In the sender-to-DS
SlimUpdatePath, the <tt>encrypted_path_secret_refs</tt> vector has the same order and
cardinality as the <tt>encrypted_path_secret</tt> vector in the corresponding
<xref target="RFC9420"/> UpdatePathNode. In a DS-to-recipient SlimUpdatePath, the DS <bcp14>MAY</bcp14>
reduce each <tt>encrypted_path_secret_refs</tt> vector to the subset the recipient
needs. The reduced path <bcp14>MUST</bcp14> contain enough HPKECiphertextRefs for the recipient
to decrypt one path secret and derive the remaining path secrets it needs to
process the Commit. The corresponding HPKECiphertexts, and any HPKEPublicKeys
that are functionally needed, are resolved per <xref target="large-object-retrieval"/>.</t>
        <t>The SlimUpdatePath is not signed. Its HPKEPublicKeyRefs are authenticated by
the parent hash in the committer's SlimLeafNode, as in <xref section="7.9" sectionFormat="of" target="RFC9420"/>, with HPKEPublicKeyRef replacing HPKEPublicKey in the parent-hash
computation. Its HPKECiphertextRefs are unauthenticated delivery objects: a
recipient validates them by decrypting the referenced HPKECiphertext, deriving
the path public keys, checking that the derived public keys hash to the
authenticated HPKEPublicKeyRefs, and verifying the Commit confirmation tag.</t>
      </section>
      <section anchor="slim-framing">
        <name>Slim Framing</name>
        <t>In a SlimMLS group, public and private message framing uses dedicated SlimMLS
structures. They are the same as <xref target="RFC9420"/> PublicMessage and PrivateMessage,
except that:</t>
        <ul spacing="normal">
          <li>
            <t>the framed content carries a SlimCommit or SlimProposal where <xref target="RFC9420"/>
carries a Commit or Proposal,</t>
          </li>
          <li>
            <t>the authentication data is a SlimFramedContentAuthData, and</t>
          </li>
          <li>
            <t>when the content is a SlimCommit, the unsigned SlimUpdatePath is carried
alongside the framed content, outside the authenticated content.</t>
          </li>
        </ul>
        <t>SlimProposal is the slim variant of the <xref target="RFC9420"/> Proposal struct obtained
by the mechanical-substitution rule of <xref target="slim-structs"/>: an Add proposal
carries a SlimKeyPackage and an Update proposal carries a SlimLeafNode. Other
proposal variants are unchanged.</t>
        <artwork><![CDATA[
struct {
  opaque group_id<V>;
  uint64 epoch;
  Sender sender;
  opaque authenticated_data<V>;

  ContentType content_type;
  select (SlimFramedContent.content_type) {
    case application:
      opaque application_data<V>;
    case proposal:
      SlimProposal proposal;
    case commit:
      SlimCommit commit;
  };
} SlimFramedContent;

struct {
  /*
    SignWithLabel(., "FramedContentTBS", SlimFramedContentTBS)
  */
  optional<SignatureOrRef> signature;

  select (SlimFramedContent.content_type) {
    case commit:
      /*
        MAC(confirmation_key,
            GroupContext.confirmed_transcript_hash)
      */
      MAC confirmation_tag;
    case application:
    case proposal:
      struct{};
  };
} SlimFramedContentAuthData;

struct {
  ProtocolVersion    version = mls10;
  WireFormat         wire_format;
  SlimFramedContent  content;
  select (SlimFramedContentTBS.content.sender.sender_type) {
    case member:
    case new_member_commit:
      GroupContext context;
    case external:
    case new_member_proposal:
      struct{};
  };
} SlimFramedContentTBS;

struct {
  WireFormat         wire_format;
  SlimFramedContent  content;
  SlimFramedContentAuthData auth;
} SlimAuthenticatedContent;

struct {
  SlimFramedContent         content;
  SlimFramedContentAuthData auth;
  select (SlimPublicMessage.content.sender.sender_type) {
    case member:
      MAC membership_tag;
    case external:
    case new_member_commit:
    case new_member_proposal:
      struct{};
  };
  select (SlimPublicMessage.content.content_type) {
    case commit:
      optional<SlimUpdatePath> path;
    case application:
    case proposal:
      struct{};
  };
} SlimPublicMessage;

struct {
  select (SlimPrivateMessage.content_type) {
    case application:
      opaque application_data<V>;
    case proposal:
      SlimProposal proposal;
    case commit:
      SlimCommit commit;
  };
  SlimFramedContentAuthData auth;
  opaque                    padding[length_of_padding];
} SlimPrivateMessageContent;

struct {
  opaque group_id<V>;
  uint64 epoch;
  ContentType content_type;
  opaque authenticated_data<V>;
  opaque encrypted_sender_data<V>;
  opaque ciphertext<V>;
  select (SlimPrivateMessage.content_type) {
    case commit:
      optional<SlimUpdatePath> path;
    case application:
    case proposal:
      struct{};
  };
} SlimPrivateMessage;
]]></artwork>
        <t>The optional <tt>signature</tt> field in SlimFramedContentAuthData <bcp14>MUST</bcp14> be
present whenever <tt>content_type</tt> is <tt>application</tt> or <tt>proposal</tt>. For
<tt>content_type = commit</tt>, <tt>signature</tt> <bcp14>MUST</bcp14> be absent if and only if the
single-signature construction of <xref target="single-sig-commits"/> applies.</t>
        <t>When present in a SlimPublicMessage, <tt>signature</tt> <bcp14>MUST</bcp14> use
<tt>signature_type = signature_ref</tt>. When present in a SlimPrivateMessage,
<tt>signature</tt> <bcp14>MUST</bcp14> use <tt>signature_type = signature</tt>. This ensures that a
SlimPrivateMessage framing signature is encrypted as part of
SlimPrivateMessageContent.</t>
        <t>When a framing signature is present, it is computed and verified as in
<xref target="RFC9420"/>, except that the to-be-signed content is SlimFramedContentTBS and
the WireFormat is either <tt>mls_slim_public_message</tt> or
<tt>mls_slim_private_message</tt>.</t>
        <t>For SlimPrivateMessage, the <tt>ciphertext</tt> field encrypts a
SlimPrivateMessageContent. The sender data encryption, content encryption,
padding, and decryption rules are otherwise the same as for PrivateMessage in
<xref target="RFC9420"/>.</t>
        <t>After decrypting a SlimPrivateMessage, the recipient reconstructs the
SlimFramedContent from the outer <tt>group_id</tt>, <tt>epoch</tt>, <tt>content_type</tt>, and
<tt>authenticated_data</tt> fields, the decrypted sender, and the decrypted content.
The reconstructed SlimFramedContent is used with the decrypted
SlimFramedContentAuthData for signature verification and, for commits, for
OuterUpdateHash verification, transcript hash computation, and confirmation tag
verification.</t>
        <t>For SlimPublicMessage, the membership tag is computed over the following
structure:</t>
        <artwork><![CDATA[
struct {
  SlimFramedContentTBS       content_tbs;
  SlimFramedContentAuthData  auth;
} SlimAuthenticatedContentTBM;
]]></artwork>
        <t>For commits, the input to the confirmed transcript hash is:</t>
        <artwork><![CDATA[
struct {
  WireFormat        wire_format;
  SlimFramedContent content;
} SlimConfirmedTranscriptHashInput;
]]></artwork>
        <t>The SlimUpdatePath is not part of SlimFramedContent,
SlimAuthenticatedContentTBM, or SlimConfirmedTranscriptHashInput. It is
therefore not authenticated by the membership tag, the framing signature, or
the transcript hash. In a SlimPrivateMessage carrying a commit, the path is
carried outside the ciphertext so the DS can reduce it per recipient.</t>
      </section>
      <section anchor="slimmessage">
        <name>SlimMessage</name>
        <t>SlimMessage is the generic term for the two concrete wire presentations,
SlimPublicMessage and SlimPrivateMessage. Both presentations are used for
sender-to-DS transport and for DS-to-recipient delivery. For commits, the
difference between the two is the cardinality of the HPKECiphertextRef vectors
in <tt>path</tt>.</t>
        <t>In a SlimMLS group, the <xref target="RFC9420"/> PublicMessage and PrivateMessage wire
formats <bcp14>MUST NOT</bcp14> be used. A SlimMLS-aware sender <bcp14>MUST</bcp14> emit a SlimPublicMessage
or SlimPrivateMessage in their place.</t>
      </section>
      <section anchor="single-sig-commits">
        <name>Single Signature Construction</name>
        <t>When a SlimCommit is sent by a member, contains a SlimLeafNode, and the
sender's signature key is unchanged, the framing signature is omitted, and
authenticity is provided by the SlimLeafNode's own signature in combination
with an OuterUpdateHash component placed in the SlimLeafNode's
<tt>app_data_dictionary</tt> extension. The confirmation tag is still present and
processed as in <xref target="RFC9420"/>.</t>
        <t>The OuterUpdateHash binds the framed SlimCommit (excluding the SlimLeafNode
itself, to avoid a circular dependency) and the GroupContext to the
SlimLeafNode:</t>
        <artwork><![CDATA[
struct {
  opaque outer_update_hash<V>;
} OuterUpdateHash;

struct {
  opaque       group_id<V>;
  uint64       epoch;
  Sender       sender;
  opaque       authenticated_data<V>;
  ContentType  content_type;
  select (OuterFramedContent.content_type) {
    case commit:
      ProposalOrRef proposals<V>;
  };
} OuterFramedContent;

struct {
  ProtocolVersion    version = mls10;
  WireFormat         wire_format;
  OuterFramedContent content;
  GroupContext       context;
} SlimFramedContentTBH;
]]></artwork>
        <t><tt>outer_update_hash</tt> is the hash, under the group's ciphersuite hash function,
of the TLS-encoded SlimFramedContentTBH. Fields of OuterFramedContent are
populated from the SlimCommit being framed. The SlimLeafNode is omitted to
prevent the circular dependency that would arise from including the very
component being computed.</t>
        <t>The <tt>app_data_dictionary</tt> extension <bcp14>MUST</bcp14> contain exactly one OuterUpdateHash
component under component identifier TBD. A missing, malformed, or duplicated
OuterUpdateHash component makes the single-signature construction invalid.</t>
        <t>The OuterUpdateHash authenticates the non-path commit contents that the omitted
framing signature would otherwise cover. The path's HPKEPublicKeyRefs are
authenticated separately by parent hash validation. The path's
HPKECiphertextRefs are not authenticated by the signature and do not contribute
to the group state. Tampering with them can only cause decryption, derived-key,
or confirmation-tag validation to fail.</t>
        <t>When the construction applies, the SignaturePublicKeyRef in the SlimLeafNode
<bcp14>MUST</bcp14> equal the sender's current SignaturePublicKeyRef. A sender that wishes
to change its signature key <bcp14>MUST</bcp14> instead emit a SlimCommit whose authentication
data carries a framing signature, so that the new key is bound by a signature
under the old one.</t>
        <t>A SlimCommit without a SlimLeafNode (e.g., a commit containing only Add or
Remove proposals) does not use this construction. Its authentication data
carries a framing signature.</t>
        <t>A SlimCommit whose sender type is not <tt>member</tt> does not use this construction.
Its authentication data carries a framing signature.</t>
      </section>
      <section anchor="sender-ds-and-recipient-behavior">
        <name>Sender, DS, and Recipient Behavior</name>
        <t>A committer constructs a SlimMessage carrying a SlimCommit as follows:</t>
        <ol spacing="normal" type="1"><li>
            <t>Perform the steps of an <xref target="RFC9420"/> commit, deriving the path's
HPKEPublicKeys, HPKECiphertexts, parent hashes, and the new epoch's key
schedule. Parent hashes are computed over the slim parent-hash inputs, with
HPKEPublicKeyRef replacing HPKEPublicKey.</t>
          </li>
          <li>
            <t>Build a SlimCommit containing the committed proposals and, if the commit
contains a path, the committer's new SlimLeafNode. The SlimLeafNode's
parent hash <bcp14>MUST</bcp14> authenticate the HPKEPublicKeyRefs in the SlimUpdatePath.</t>
          </li>
          <li>
            <t>Compute the confirmation tag for the new epoch as in <xref target="RFC9420"/>.</t>
          </li>
          <li>
            <t>If the single-signature construction applies, include a valid OuterUpdateHash
in the SlimLeafNode and leave the optional <tt>signature</tt> field absent. If the
construction does not apply, include the normal framing signature in
SlimFramedContentAuthData, using <tt>signature_type = signature_ref</tt> for
SlimPublicMessage and <tt>signature_type = signature</tt> for SlimPrivateMessage.</t>
          </li>
          <li>
            <t>Build a SlimUpdatePath whose SlimUpdatePathNodes carry the HPKEPublicKeyRefs
and HPKECiphertextRefs of the path, and emit a SlimPublicMessage or
SlimPrivateMessage, optionally accompanied by a LargeObjectCarrier holding
the corresponding HPKEPublicKeys, HPKECiphertexts, and any public-message
framing signature referenced by the SignatureOrRef.</t>
          </li>
        </ol>
        <t>The DS, knowing the ratchet tree before and after the commit, produces a
per-recipient SlimMessage by reducing each SlimUpdatePathNode's
HPKECiphertextRef vector to the subset needed by that recipient. The DS <bcp14>MUST</bcp14>
retain the HPKEPublicKeyRef in every SlimUpdatePathNode, and <bcp14>MUST</bcp14> retain enough
HPKECiphertextRefs for the recipient to decrypt one path secret and derive the
remaining path secrets it needs to process the Commit. If a LargeObjectCarrier
is present, the DS reduces it accordingly, retaining only any HPKEPublicKeys the
recipient must receive and the HPKECiphertexts corresponding to the retained
HPKECiphertextRefs. If the commit removes the recipient, <tt>path</tt> is omitted.</t>
        <t>For basic-processing delivery of a Commit with an update path, a recipient needs
enough ciphertext material to derive the epoch secrets and verify the Commit, but
does not necessarily need every HPKE public key referenced by the path. Such a
recipient can process the Commit, receive subsequent MLS messages, and send
application messages, but might not be able to construct its own Commit with an
update path until it resolves additional HPKEPublicKeyRefs. To make the
recipient immediately update-capable, the DS <bcp14>MAY</bcp14> include any updated HPKE
public keys in the recipient's copath that the recipient cannot derive from its
retained path secret. In a full tree with no blank nodes, this is one HPKE
public key for each non-committing recipient.</t>
        <t>A recipient processes a SlimMessage carrying a SlimCommit by:</t>
        <ol spacing="normal" type="1"><li>
            <t>Resolving the HPKECiphertextRefs required for the recipient and any
HPKEPublicKeyRefs that are functionally needed, per
<xref target="large-object-retrieval"/>. For SlimPublicMessage, this also includes any
SignatureRef in the SlimFramedContentAuthData SignatureOrRef. For
SlimPrivateMessage, the recipient decrypts SlimPrivateMessageContent and
uses the inline SignatureOrRef value when one is present.</t>
          </li>
          <li>
            <t>If the authentication data contains a framing signature, verifying it per
<xref target="RFC9420"/> using SlimFramedContentTBS. If the SignatureOrRef uses
<tt>signature_type = signature_ref</tt>, the recipient first resolves the referenced
signature. If it uses <tt>signature_type = signature</tt>, the recipient uses the
inline signature. If the framing signature is absent, verifying
the SlimLeafNode signature and OuterUpdateHash per <xref target="single-sig-commits"/>.</t>
          </li>
          <li>
            <t>Decrypting the resolved HPKECiphertext, deriving the path public keys, and
verifying that the derived public keys hash to the authenticated
HPKEPublicKeyRefs.</t>
          </li>
          <li>
            <t>Applying the path update and verifying parent hashes over the slim encodings
per <xref section="7.9.2" sectionFormat="of" target="RFC9420"/>.</t>
          </li>
          <li>
            <t>Processing the commit per <xref section="12.4" sectionFormat="of" target="RFC9420"/>, deriving the new
epoch, and verifying the confirmation tag. If confirmation tag validation
fails, the recipient <bcp14>MUST</bcp14> reject the commit.</t>
          </li>
        </ol>
        <t>The input to the confirmed transcript hash is
SlimConfirmedTranscriptHashInput (<xref target="slim-framing"/>). The interim transcript
hash is computed from the confirmed transcript hash and the confirmation tag
as in <xref target="RFC9420"/>.</t>
        <t>DSs that do not maintain the ratchet tree cannot perform the per-recipient
reduction described above. Strategies for such deployments are out of scope.</t>
      </section>
    </section>
    <section anchor="optimizing-payload-sizes">
      <name>Optimizing Payload Sizes</name>
      <t>The separation of large objects and their references in structs that are sent
over the wire or stored locally allows a few performance optimizations. They are
up to the application to implement.</t>
      <section anchor="storing-partial-trees">
        <name>Storing Partial Trees</name>
        <t>SlimMLS clients need the slim public tree for MLS tree computations, but they
do not need to fetch every large object referenced by that tree. Tree hashes,
parent hashes, and GroupInfo validation are computed over SlimLeafNode and
SlimParentNode encodings, so the references to public keys and credentials are
the values committed to by those computations. A client can therefore defer
fetching large objects that are not functionally needed, such as HPKE public
keys outside the client's copath. This is especially relevant when joining a
group, where the DS can selectively include the public keys and credentials the
joiner needs immediately.</t>
      </section>
      <section anchor="omitting-cached-large-objects">
        <name>Omitting Cached Large Objects</name>
        <t>If the DS keeps track of the group's public state, clients that send a commit
with an update path only need to proactively provide the signature public key and
credential if either of them change as part of the commit.</t>
      </section>
      <section anchor="cross-group-credential-caching">
        <name>Cross-group Credential Caching</name>
        <t>If clients use the same credential across multiple groups, other clients can
cache them and pull new credentials selectively when they encounter credential
references they can't resolve. Whether this is a performance increase depends on
the context of the application.</t>
        <t>The DS can similarly deduplicate stored credentials.</t>
      </section>
      <section anchor="delayed-fetching-of-large-objects">
        <name>Delayed Fetching of Large Objects</name>
        <t>A client that has been offline for some time can fetch and process slim messages
first. It can wait to fetch large objects that are not relevant for processing
(such as HPKE public keys) until it has arrived at the current group state. The
client thus avoids downloading stale, intermediate large objects.</t>
      </section>
    </section>
    <section anchor="wire-formats">
      <name>Wire Formats</name>
      <t>SlimMLS defines new WireFormat values for the SlimMLS variants of each
<xref target="RFC9420"/> wire format. The MLSMessage struct defined in <xref target="RFC9420"/> is
correspondingly extended with the following cases:</t>
      <artwork><![CDATA[
struct {
  ProtocolVersion version = mls10;
  WireFormat wire_format;
  select (MLSMessage.wire_format) {
    case mls_slim_welcome:          SlimWelcome        slim_welcome;
    case mls_slim_key_package:      SlimKeyPackage     slim_key_package;
    case mls_slim_group_info:       SlimGroupInfo      slim_group_info;
    case mls_slim_public_message:   SlimPublicMessage  slim_public_message;
    case mls_slim_private_message:  SlimPrivateMessage slim_private_message;
  };
} MLSMessage;
]]></artwork>
      <t>In a SlimMLS group, the <xref target="RFC9420"/> wire formats <tt>mls_public_message</tt>,
<tt>mls_private_message</tt>, <tt>mls_welcome</tt>, <tt>mls_group_info</tt>, and <tt>mls_key_package</tt>
        <bcp14>MUST NOT</bcp14> be used. A SlimMLS-aware sender <bcp14>MUST</bcp14> emit the corresponding SlimMLS
wire format instead: <tt>mls_slim_public_message</tt> or <tt>mls_slim_private_message</tt>
for member-originated messages, <tt>mls_slim_welcome</tt> for Welcomes,
<tt>mls_slim_group_info</tt> for standalone GroupInfos, and <tt>mls_slim_key_package</tt>
for KeyPackages. A recipient <bcp14>MUST</bcp14> reject any RFC 9420 wire format received in
the context of a group that carries the <tt>slim_mls</tt> extension.</t>
    </section>
    <section anchor="slim-mls-extension">
      <name>The slim_mls Extension</name>
      <t>SlimMLS is signaled by a GroupContext extension named <tt>slim_mls</tt>. Presence
of this extension in the GroupContext means that all wire formats within the
group use SlimMLS replacements (<xref target="wire-formats"/>).</t>
    </section>
    <section anchor="slim-ratchet-tree-extension">
      <name>The slim_ratchet_tree Extension</name>
      <t>The <xref target="RFC9420"/> <tt>ratchet_tree</tt> GroupInfo extension carries LeafNode and
ParentNode objects. SlimMLS defines a <tt>slim_ratchet_tree</tt> GroupInfo extension
that conveys the same tree using SlimLeafNode and SlimParentNode objects:</t>
      <artwork><![CDATA[
struct {
    NodeType node_type;
    select (SlimNode.node_type) {
        case leaf:   SlimLeafNode leaf_node;
        case parent: SlimParentNode parent_node;
    };
} SlimNode;

optional<SlimNode> slim_ratchet_tree<V>;
]]></artwork>
      <t>The ordering, truncation, and validation rules are the same as for the
<tt>ratchet_tree</tt> extension in <xref section="12.4.3.3" sectionFormat="of" target="RFC9420"/>, except that tree
hash and parent hash computations use the slim node encodings. The large
objects referenced by the slim nodes are resolved per
<xref target="large-object-retrieval"/>.</t>
      <t>In a SlimMLS group, the <xref target="RFC9420"/> <tt>ratchet_tree</tt> extension <bcp14>MUST NOT</bcp14> be used.
A sender that would include <tt>ratchet_tree</tt> <bcp14>MUST</bcp14> instead include the
<tt>slim_ratchet_tree</tt> extension.</t>
    </section>
    <section anchor="slim-external-pub-extension">
      <name>The slim_external_pub Extension</name>
      <t>The <xref target="RFC9420"/> <tt>external_pub</tt> GroupInfo extension carries an
HPKEPublicKey that external joiners use when issuing an External
Init proposal (<xref section="12.4.3.2" sectionFormat="of" target="RFC9420"/>). SlimMLS defines a
<tt>slim_external_pub</tt> GroupInfo extension that conveys the same
information using an HPKEPublicKeyRef:</t>
      <artwork><![CDATA[
struct {
  HPKEPublicKeyRef external_pub_ref;
} SlimExternalPub;
]]></artwork>
      <t>In a SlimMLS group, the <xref target="RFC9420"/> <tt>external_pub</tt> extension <bcp14>MUST NOT</bcp14>
be used. A sender that would include <tt>external_pub</tt> <bcp14>MUST</bcp14> instead
include the <tt>slim_external_pub</tt> extension, populated with the
reference to the relevant HPKEPublicKey. The actual public key is
resolved per <xref target="large-object-retrieval"/>, as for any other HPKEPublicKeyRef.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>Outside the SlimCommit split path described below, the signing and
transcript-hashing rules of <xref target="RFC9420"/> are preserved by SlimMLS: every struct
that was authenticated under <xref target="RFC9420"/> remains authenticated, with large
objects bound through the collision-resistant hash references defined in
<xref target="ref-types"/>. The strength of the binding is therefore at most the collision
resistance of the ciphersuite hash.</t>
      <t>SlimCommit (<xref target="slim-commit"/>) changes the exact authentication surface of
Commits with paths. The path's HPKEPublicKeyRefs are not covered directly by the
framing signature or OuterUpdateHash, but are authenticated by the parent hash
chain rooted in the signed SlimLeafNode. The path's HPKECiphertextRefs are not
authenticated by the signature and are treated as delivery objects. Tampering
with an HPKECiphertextRef or the referenced HPKECiphertext can only cause the
recipient to fail reference resolution, decryption, derived-public-key matching,
parent-hash validation, or confirmation-tag validation.</t>
      <t>Large-object retrieval channels (<xref target="large-object-retrieval"/>) may be
unauthenticated. The hash-reference verification in step 2 of that section is
what provides authentication of the resolved objects, and is what binds them to
the signed and transcript-hashed slim structures. A Delivery Service or network
attacker that withholds, modifies, or substitutes entries in any channel can
only cause a recipient to fail to resolve a reference, which is functionally
equivalent to dropping the message, which the DS can already do under
<xref target="RFC9420"/>. An attacker may also surface unsolicited or malformed objects
through any channel. Recipients <bcp14>MUST NOT</bcp14> treat the contents of any retrieval
channel as authoritative metadata and <bcp14>MUST</bcp14> ignore objects whose hash does not
match any reference the recipient needs to resolve.</t>
      <t>A client that caches resolved large objects across groups <bcp14>MUST</bcp14> index its
cache by the tuple (reference type, ciphersuite hash function, reference value).
The same underlying object yields different reference values under different
hash functions, and a cached object <bcp14>MUST NOT</bcp14> be treated as authoritative across
ciphersuites whose hash functions differ.</t>
      <t>SlimKeyPackage batch signatures (<xref target="slim-key-package"/>) replace independent
LeafNode signatures with one signature over a Merkle root. A recipient <bcp14>MUST</bcp14>
verify both the Merkle inclusion proof and the batch signature before treating
the SlimLeafNodeTBS as authenticated. The signed SlimKeyPackageBatchTBS binds
the protocol version, ciphersuite, tree size, Merkle root, and
SignaturePublicKeyRef. Together with the SignWithLabel label and the Merkle leaf
and parent hash labels, this prevents a valid batch signature from being
replayed across protocols, ciphersuites, or signing keys. The Merkle proof is
carried in the SlimLeafNode only for <tt>leaf_node_source = key_package</tt>, so group
members that later validate the ratchet tree can verify the authenticity of the
leaf without having received the original SlimKeyPackage.</t>
      <t>All SlimKeyPackages whose key-package SlimLeafNodes share the same <tt>signature</tt>
field are linkable as members of the same publication batch. Deployments that
consider this
linkability sensitive can reduce batch sizes or publish independently signed
batches.</t>
      <t>SlimWelcome (<xref target="slim-welcome"/>) introduces two confidentiality changes
relative to the <xref target="RFC9420"/> Welcome:</t>
      <ul spacing="normal">
        <li>
          <t>When <tt>WelcomeGroupInfo.info_type</tt> is <tt>plaintext</tt>, the GroupInfo is visible to
the DS and to anyone observing the SlimWelcome on the wire. This variant is
appropriate only in deployments where the GroupInfo is not considered
confidential with respect to those parties (e.g., where the DS already
maintains group state).</t>
        </li>
        <li>
          <t>When <tt>SlimWelcome.group_info</tt> is absent (presence octet 0), the DS
chooses which WelcomeGroupInfo a joiner ultimately receives.</t>
        </li>
      </ul>
      <t>In both cases authenticity is unchanged: the joiner <bcp14>MUST</bcp14> verify the
SlimGroupInfo signature as under <xref target="RFC9420"/>, and a SlimWelcome that reaches a
recipient with <tt>group_info</tt> still absent <bcp14>MUST</bcp14> be rejected
(<xref target="welcome-group-info"/>).</t>
      <t>SlimPrivateMessage and encrypted SlimWelcome GroupInfo signatures are carried
inside the encrypted plaintext using the SignatureOrRef <tt>signature</tt> variant.
This prevents a visible LargeObjectCarrier signature from being tested against
known signature public keys to identify the hidden signer.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="slimmls-mls-extension-types">
        <name>SlimMLS MLS Extension Types</name>
        <t>IANA is requested to add the following entries to the "MLS Extension
Types" registry defined in <xref section="17.3" sectionFormat="of" target="RFC9420"/>:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Name</th>
              <th align="left">Message(s)</th>
              <th align="left">Recommended</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0x000C</td>
              <td align="left">slim_mls</td>
              <td align="left">GC</td>
              <td align="left">Y</td>
              <td align="left">RFC XXXX</td>
            </tr>
            <tr>
              <td align="left">0x000D</td>
              <td align="left">slim_ratchet_tree</td>
              <td align="left">GI</td>
              <td align="left">Y</td>
              <td align="left">RFC XXXX</td>
            </tr>
            <tr>
              <td align="left">0x000E</td>
              <td align="left">slim_external_pub</td>
              <td align="left">GI</td>
              <td align="left">Y</td>
              <td align="left">RFC XXXX</td>
            </tr>
          </tbody>
        </table>
        <t>(Values are SlimMLS's suggested allocations. IANA may pick others.)</t>
        <t>The "Message(s)" abbreviations are those used in <xref section="17.3" sectionFormat="of" target="RFC9420"/>. "GC" denotes a GroupContext extension and "GI" denotes a
GroupInfo extension. RFC XXXX is to be replaced with the RFC number
assigned to this document upon publication.</t>
      </section>
      <section anchor="slimmls-wire-formats">
        <name>SlimMLS Wire Formats</name>
        <t>IANA is requested to add the following entries to the "MLS Wire
Formats" registry defined in <xref section="17.2" sectionFormat="of" target="RFC9420"/>:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Name</th>
              <th align="left">Recommended</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0x0007</td>
              <td align="left">mls_slim_welcome</td>
              <td align="left">Y</td>
              <td align="left">RFC XXXX</td>
            </tr>
            <tr>
              <td align="left">0x0008</td>
              <td align="left">mls_slim_key_package</td>
              <td align="left">Y</td>
              <td align="left">RFC XXXX</td>
            </tr>
            <tr>
              <td align="left">0x0009</td>
              <td align="left">mls_slim_group_info</td>
              <td align="left">Y</td>
              <td align="left">RFC XXXX</td>
            </tr>
            <tr>
              <td align="left">0x000A</td>
              <td align="left">mls_slim_public_message</td>
              <td align="left">Y</td>
              <td align="left">RFC XXXX</td>
            </tr>
            <tr>
              <td align="left">0x000B</td>
              <td align="left">mls_slim_private_message</td>
              <td align="left">Y</td>
              <td align="left">RFC XXXX</td>
            </tr>
          </tbody>
        </table>
        <t>(Values are SlimMLS's suggested allocations. IANA may pick others.)</t>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC9420">
          <front>
            <title>The Messaging Layer Security (MLS) Protocol</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes"/>
            <author fullname="B. Beurdouche" initials="B." surname="Beurdouche"/>
            <author fullname="R. Robert" initials="R." surname="Robert"/>
            <author fullname="J. Millican" initials="J." surname="Millican"/>
            <author fullname="E. Omara" initials="E." surname="Omara"/>
            <author fullname="K. Cohn-Gordon" initials="K." surname="Cohn-Gordon"/>
            <date month="July" year="2023"/>
            <abstract>
              <t>Messaging applications are increasingly making use of end-to-end security mechanisms to ensure that messages are only accessible to the communicating endpoints, and not to any servers involved in delivering messages. Establishing keys to provide such protections is challenging for group chat settings, in which more than two clients need to agree on a key but may not be online at the same time. In this document, we specify a key establishment protocol that provides efficient asynchronous group key establishment with forward secrecy (FS) and post-compromise security (PCS) for groups in size ranging from two to thousands.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9420"/>
          <seriesInfo name="DOI" value="10.17487/RFC9420"/>
        </reference>
        <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>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="I-D.ietf-mls-extensions">
          <front>
            <title>The Messaging Layer Security (MLS) Extensions</title>
            <author fullname="Raphael Robert" initials="R." surname="Robert">
              <organization>Phoenix R&amp;D</organization>
            </author>
            <date day="2" month="March" year="2026"/>
            <abstract>
              <t>   The Messaging Layer Security (MLS) protocol is an asynchronous group
   authenticated key exchange protocol.  MLS provides a number of
   capabilities to applications, as well as several extension points
   internal to the protocol.  This document provides a consolidated
   application API, guidance for how the protocol's extension points
   should be used, and a few concrete examples of both core protocol
   extensions and uses of the application API.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-mls-extensions-09"/>
        </reference>
      </references>
    </references>
    <?line 1429?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+V965Lbxrng/34K7LhqPZMiact2ThI58TljSU5UsSPFUpxN
JakhSGJmEIEAA4AajWXlWc6z7JPtd+3+utHkjJzs2Tq188MWSaCv3/06n8/d
WI9N9bA4edHU22++fnHiytWqr17bb9blWF11/e3Dom4vO+c23bott/DSpi8v
x3nfrap+nG+bYT7AK/OPP3bDfrWth6Hu2vF2Bw8+ffLyK9fut/DgQ7eB4R66
ddcOVTvsh4fF2O8rBzN+6sq+KnHmar3v6/H2xN10/aurvtvvHhbfVMNQXtXt
VfF1eVv1hT7kXlW38NjmoSvmBSwC/7frhnH+933Zjvstfl6V7eam3ozX+GEY
u768ghmrdg8LKQqZ4OTQDCfwDO/j5I+wHnzg1/gKfr8t6wa+h3n/o67Gy0XX
X+HXZb++hq+vx3E3PPzoI3wKv6pfVwt97CP84qNV390M1Ufw/kf43lU9Xu9X
8GZf7q7LquGz/YjOFZ45ca7cj9ddj5uFx4vict80fBnf8hvFt/QK/QizlG39
fTnCRTwsnl93VVu/Kb79n4/p14rXjuv5j2i6xbrbTsf/bdf25Qb+dw1rfnX/
8V/RezDDuL6uxgWcnnOLxcK5+XxelKth7Mv16NzL63ooALL226odi011WbfV
UAgMzoqyLao3IwAMTFWMXTFeV4ch4hReOSt2fTd2664pLru+6KvNfo2P3tR9
BaNtil3Vz9dNjbMJRBTd66q/rmCTdctAMcA85ej2Q1Ws69111Q/7eoRl3cA1
FXCj8M5uv2rqdQFAOMzkoRFWCh+G+qotx31fDbj8jVvDGmC2umyGhW4M1rVr
yjUMuS3bWxmyW/2tWo88d1HudlXZ44rgcbp9HANRcgPnD7hTtsO6r3fj/Loc
ruFLOND9mqblZSLkbgr8ESa7rPqqhekW7hFtfYDvhq55XdGB+t83fg1d29wW
NzBn0Vaw/M2s2A94jCWd35ZuoAIK0fd11cM+i6Zbl02xLuGyZ7hAuDjYQoMr
hqubD7tqXV/CgfXVCK+8xmevy7atmkXx8rpy4ZIBHLaAxjBfBUDIa4DB6nZT
7aoWT7J4XDWAUf0t3Hz/ul7DJeFsQHfgNdy7C5Pojfcw/a5mEOOXYdENoNT+
6tqsnbYIr8BDAFobd1mN8mUzdMV11exogm4PwLNfX8ukJRxduFqFYUTe4nXZ
1yWed3fpflvdPi/Xr+DgZsWjbrutx1nxx6oBrIMviLI8BTpLQFPICReXfbmF
+RfFH/EcEGZoNc4DWQFrGepNRZjSrvvbHUJI1b6umm5XFTfdvtnAob+uYId4
1/gi3piu9lVV7Qanv/CQdUsj4pcBsgVzt/Vm01TOfVA8bce+A+zC+3XuuSG9
xenz35+Z8XBDgCi4vnI37BsCCdgiQkA9wOO/ffIN4m0NRwJ3M+B9uusSoBMY
Ch4vIk8jaNLncA5nCHiHGNTi8uverRu8I7rfbt+OVb8r+xEQ8WtCOYObBETw
GTAMhtoi4YYlwTXAiDM4knWz3yARA4wESGy62y3hESHrpivabiw6mLK/qYFq
IOVgpDb0Q5FrAUeH14WITeSmePv2f3z71aNffPbJx+/ezXDh8DpA7x62InSg
HHT3X1fl5e+6DVIX2ApCdEufnIDSoMA1GKAaIqgaCOdwT7BdmApQ7nU91Kum
KlawB0B+AghPMmHLMcUEWHhK658x/eouk0XDixVw/Q1QDnzb0CYmbr0A4mYG
AgFgIzy2ugWiVlVEseA5ICGyPf6CiMolDYdswJM/+XlRnLsJWTh9DOyAaEMD
G93cAsnpOljldXeDvAQOBy5Fz2RWrACr6xFfgMsEGrKFlRXEQ4hWFzERXt0q
R0BqULew9RpEHERPPDy+azzoenANQvbA1HFe3uD2AxkaYLVAoZiUwMCXZQsj
8oUBCveMLUTT+RYQXeEQrzvAbKLTCNJyB8y/4MBhjXBLiuXlZoOgTOcPtw1n
PVTwFi+Xl1rUhAnjLdCcbqtf6jKZSr8PGyqYOQAwZFkR88Ys90F4lHnhu/G6
JyIdcZ7iAOdx78d5vlWuAAhQ9fUlkCgYRpexugUgAJTa7f2t+rUWqwrEi0q4
Yo3UEVGKcBS40KpqgQvglQNG8oFaogFMrWf6+vgF7jbmb24Q+KVrNrxNrp/o
B7EfM+ZMh8PnOwA3z8pLF5ifIgLcxYxlI9jCDiVzACIEsEBUVdpCElyNdDBm
IJQKlO7u4bRvA61R0KoaAaWSmI2QpwVwb79op+jj94inCZuAfzSNniKPMmyB
BwD9i2GQAH3GMOAIBpDVRnRduI+sFrdUruoGAR12uMELLTybjwQxB/yiJq55
SxSLJSG5aRBy2yBqIkRdMeF76NxPaMOB3Q+ehNjvcDUrlI6LiPsOMg+sDhUK
s9tiu2/GegdU2vOAhcwlFJ/Q4haBDgEAVK2RiHZyH/bCFb8L+KoEWoRzEiDl
RCx5mIlOLB0MjDkJgOjylDUBHSqBZMtHT3rxIkhaCsdjZFYiFMWETAZ48zRK
ZkuFJzpp/MG+gjIaC5fm5PGW4argn7CFCmcFShmvhN8hWlDeGBlnuwcE7SsC
C5GfvDgG48D1A+OCg8K9lq+7WoUypSwD4n6/EIUI7gZEFRKGUbBoqxvRBBaR
rODxeY+k/dvq8jdAY+cr4OkbZ5Ytoqo5XniUNvO870BnLhv4HATYK0C7Hlb2
PbGLynlBDVb357/8+eWzx88eFiTqIcX0UoJqU0P5GjY1iPolh1miYFc8/72L
9KmuXTMZVCLNvA6QGjEU5l/85a9/+SsKm486kGhb/JVv4TFeYE2fGR9RvkRz
wAD6/B9evDyZ8f+L3z2jf3/75Pd/ePrtk8f47xe/Of/6a/8PJ0+8+M2zP3z9
OPwrvPno2TffPPndY34Zvi2ir9zJN+d/OmHicvLs+cunz353/vUJXtcYqbYI
W3D3K5S7UAwFdgRQXA4O0Bg46IolpS8fPf/f//ngM7nlTx48+AXcMn/4+YOf
fQYfEP5EOFAdjWj/rQsqI1BKQNhdPQL9m+HNDyDytAVyHbjDn/wZT+avD4tf
rta7B599IV/ghqMv9cyiL+nMpt9MXuZDzHyVmcafZvR9ctLxes//FH3Wczdf
/vLfG0Tx+YOf//sXLrUz7FkUqoqXAO8BRAH2GiDkewRjPGHAPf4WtDeLd4vi
K6AsTV2i2YFFM0ScCDWRrYPysCWO8UHx7DUS0urGufOAaCSrMf8Pn2+uUUYl
WvWoY5qhohSueImU8mLbDEujNJ++fau2orn/9t27syAqlGLuAi2OvgsSOZAd
wE0SwAXTUZ4izase97j9GRP33zz/7ZPnZPYAQjIDovZCqV/4tnjkOe+MXnjk
WQRJ8EbJ9Fxxw0o7MLtERlSZdt31sNBd126IWoI0CcQqbECIB6q9b1Duq0fA
i7olTjY1LrFeWCA+yPwsk+F9V2/W1Y6IygKO6WUsnMZGGmYVJFFWZGKA26cn
5vzE3IubCAuXuDtlHm21RgaFDAsA41u/20ckajLAvf0AZp7jVod3ADKAz8gD
LCtCCZteYMJBVLQEpjqMtyAhTKg9PPL27YuKtfWfLj7Bs7VKZ72oFmrkEUaC
fIyV71HuSGTgBrYF52lIuaOLu9y3ND5tFQTzclU1xb6t/76vVJqcCvt8nU9b
2AntygFKzuGJbuPPNUI8ACKC5PkK9Hlr9ppFq7OMBmHN60YfDnbhPKA5VxSa
gFXzocJPesYO1VQRZa0h59CJwJxuiQpmfwGs6WLHzy/4iQt6ZMnwDTJ+PKhI
mJdd03Q3eB8BIQggCtYfEZg3gM8/BBDasAJeFIX5kl4q5O8Hf7l8Owf+fnA/
zDN/2S+PfJ8+BmuNiIiuKfoSoVW+P0Gq+GDxsaeY0YMnfq0ZSlTkvsShM6NO
HzyhUQMtCwdjvvQLza81PHhizzWhiuYEwpc68oETCA+eTE/AXGL40i716Amc
mMdw1AgwddToyyNrNW96aMSTdU9YV1AABfRcdrsSyMQvv/tiKdrx8rul4i2g
EeBg0VTtFVqniClE+B1RH0AfxOkUVWEFjK2MIjUSHJ3AkpwUF6e7hZdAfkAF
TWwml7dCBlT5gSVGSu/naFdiWd6VhWUT5hSQaMJG4KGE4ZGp8hk9/ojNHqBa
jMQ+ogvWdV1GfBYYY7OZOBVI3TJCwL5tgCe5mGH21d/3dS9yR6zuoPksUnay
5ueFe0r7Juu5X9umGlFRjyy2hi+gcSpe3Uw1GLIXJTDJKnRYmYpCQHXnQnVR
EIKzQpVzci5oqfWn+KwnKGEJTEz3uH50Wo49s4UVXbYjtceb2cVSE6Q0v3gg
0P/4xz9c1e63xVuQAlDWBEV2c/rxGYpQfj2nD+LPF3Aip5/Qd6ef/PSnZ+5d
ssyXQNU/d44noqGnv5vhRnoc1egGwe40fngRP3hG4xWwo8GM8dAxYQikxv/0
eeZx3MHkFYTT6Al8893nk919TqfmyOuxjBdX/CoeYTnLwCdbZ1lII0cXyRLu
sIwmHpYjc4V5XG4evn0UG0jvQGxWrQqVvoHogvhqcJxgHfBQhJpbBttJTPSU
mu57AAGRoJyvH2VEpHkVmWwiNUTgA60IVyDmt+xRZTHZCsAThZWNzGTFJwUl
lv5/hOwfTm028ZWVCcmjIISfnOjqaSmwNia3qJ6MHdGCrq+v6hY+s+TOD7IN
d73e916LKCPpPdI9BJ9jGYsNZW/fBiH8nVgPD40vK0X6dnNdr69xeUgh3tQD
yrVsmEJ6CtBWtZkl4MD+54V7aXwh5MS0zhACuKZ+VZGzyasBJKIS9aHJkKGh
JYbMerH1Wvw0KN6ToIvLnmpascbDSsYAnDfoKcNEVjU0fUpaARHWJX7NOhjN
BodmFXDHZnC0DaEggKcY20eJHntcO8x7SNONfgnmv/B+zKeV9IfJmMkNQKQE
r41vNDeyt/Oxf2Mu4z8HFRu0qG8Sw6TBCAIanW46GSwgTDcd8RGbehdCMaua
zu29z2yGcgpRLbkkF+jhUhkiTqLHZTUhBCW2Q7O1vBvvYVpYIPjcquHVYqS9
F8Uu5e03/DXwdaLJiYyWPh1LAsENEAzn8obTN9iADg8j99ih0gznc7sozplS
tQNgKjuxcJw/kD39OZrTZeZNV4mwF0xysdUHNN5xUAs94/MARBk9R+NNBVdo
FnfKBMWKF7xAUC4/5FgZdQiceVu3WRS/H4knaPt35Dc+Y19usrxZICOyJYAg
ZmFsaiDxhwT114mK7jjkgI0yfJOeSvNYi+I78ZXCYP2+YZdNbNcml1LNfmgy
a9yUt4ugRfCJkQE0BZujJOzSqZZAAQXeElOcVourBUq14gcsLW4KouDdxxxN
DUBWfE1kgzOhkBmmDJu4vIR1YXTNqM5DEwWEERPIfj3EendubLgiXkA+EdDo
u5uFlxGYmNEpeW88TeK8FYvh83VdwuaAEY/eg8snMkMXF3kIhiDjwuk4BTg0
kQTMO4Mrg/NBhIqCX+qtt8vhVApbLppxQaaMrx4VeEi6Cqu1Pon2IAd1Opwd
MmJEmvD05O5884AR5P1sHv/Cd1Eh9+ee2eN7SmgBUDMWmNzr9HVk/pjFgj0u
8DnJKbklZm0/9/w7ZCK68wJlPWjxIhPj//P1BLqcntHkAhND0elrAPeuP8tf
19SAFJ6PV+CvbL4C3CcxROiFCNGJzIZa3QBzGng5eCp5g9Odh3K+2XhCkw6Z
mJ/e4y9rvrrPcv4gDvLpio4h4P2W857v43IkhPaCwqOCzydazuwI4h1aDjmS
DgxO1n67XtbZzCQ/MF+r3pRApiduNGDoEhCAAi0BWSxMdKtR7SnugGxYlFco
DI+JaIAaC7vFgZhX5JsQx+ZfvHcaru41ueBV000XyO5pWqJlVSSpuQYGRacA
BsWBiCo+6A/i+xMFvIHPc5Sk3nG0lf/dR/jqN4vo/ZdfmiBgZIj2BzJOOjHx
R66b4mep68ZEeXmv5hL4+gVGdFxsapZ2+tulud3gMUvHXjxwMPq/P50/poD1
2KGIWvDYiQwgk4b4KlQLu5ZEEjpFu1sQU5dhmCUb3xZsGjMWLDYCFxiKCCBz
gcruL7/7gqxDESZ/U/Wvmup533U0emwG24MC9uknB+EeL+wCo63efH73w4gV
F0P9PRm4jq6hIJn6rtXGK83zEJE24aDIcyQ2srwzI1irzKN5D0UIifLPlTuO
hEKtIDxnvoXlFh4wX3T7fl3x+SHAXwz0RWRUjAF8kT4b2RWNW0zNhF/Xl9VY
b1Ge5X/QAuR5DlvSR/kY376zT7BWpE8IMLHhJMASmRvhv088NgTApAf+hfvJ
LTLehiySlK6LeiMrxD+BTAuud+z0foOouTXe2v9HgPnfFio/+gmNgYZes0rc
92v2fqOFlGyNVgoTx3viJln4oSQaENmqxA3eb8C267dlQ8NEfM9kJqBpIEUh
eOEnH7lDHoGD2Pfel3aQBKNsQIT4R19heCKDS+K4QNFoSTMJs8ODFAHEJNcs
020Vv7KbWaKZCCMJUNrRKO9UivABhWie6Nf7hsMDOJh4fbtQcTbcsMNZOW1A
UxeYp9ONK29G4LhrfTMJSQpGQt6sCajI2OdSlx2u7HUwCZEBUuwwlI9Ay/KP
O7XfeZuGHnSJwUwmmG5q/5tvCRDmyNfR50PR+SXargeNriYjEC8GVlaYl2M4
r9CZQpdYq2NVBB8RqTmdQSOcxWDcdBRhkziZCRHNpYgVmk7coXecQXSJ1pYl
3+HBoxeXNqNntGR3HDVnfOY1RSWmguGnsdBZlJcgIjsy0/kIVhLwjfw+THxK
Cy9GG0VCLZappi4CNlPKefAGv5u4HHBiOmzj0C4pOF9io+A3yk8wnhT6HLky
Hk7E0QkbzHNAIenhb0rcJ2LmvgVIvKo2F0xsjdwYTuYOnvyjFzN5RO2zFyp4
k9ibSN/J9QidS+7SazThu0X2cq3q49IfDyg+v5goPgJMwf0iMMMBYpi1LFpZ
eELQg2DGuj/VAxbpmianQSzXTykrdAjhdhJGQCSM0Gdt7dqASCaxzzgpXRg6
MHr2mGVtvELy0vBJH6kOEyUe/Qk0RxGlLCuu+dPnxwSPovjm/BF6Ki5roCgE
bmN5ZYCaMwoVTPy+JkLl/+35g4SEJ/FHoLtfY4jb6WJWnNhVncwmCz2bSCVs
+jJySbI7w+ZjL5v6YgNAGHpqAy6txxqRYOzmq2rOWXE+daMeJmtdFOfsty0b
0LbjnznzNoF44+xcij/N/7hAHNFIB++7BN6iTkB3V/AFLieeL7gVMVXPHZ/T
P7wMfsdjMRhu6PyRJSEfJGB1IzlUcj7EQC8poIITQDnQovjW54a9/eBAhIhz
xvsEMsLEOa6Ia+OWaklDxVDwbs2BtAgiZYuubsOuxNsSe+5mReqPnGk+Zo58
eIPR6jaJfKajXZlYGJHhj/jKXByqTPQRd+czEilF00htIPKsXw3GGqWxHeM1
suZJ9t1ADnpEoEx822kSqCPpfnQCkfEK9wl4GwSMOcAjS3JzkxhYkNxfva67
/UA+QzkHzcjF1w6kDVJuWGFzYM7DY4PkRa3R2IhppXAm9SX77vbkeyMP2bbr
cycAYz3DKPR1hYmsPmgwAiLMcOT9wHk9YEmRw3yiMMLlTwA6lyiKUuIVXjAg
A15eHI7Gqfm3SCZzIGnnxeMbOTYHgI7lYY3Z1pxMn/uLA/JF6+aKcgVS5sJ9
spDAdo0jtNH9ZICdDL/HVCjO1NuhEb7HVeIMHLN8GsXlnFlSK17KmmJp2GlZ
6dmsKkzfLgp/+0i6JnOz6B0Wqa78YktKiwnpwqF8TCOeBJGX7gpragDceERZ
uE9BbsDLlXjKja6IM41jxDQnKyfJgr4kYOP8OLFEeOCImG+KT1DllZDOG0bK
w7WHaAwxZGv4m3KL2YUU+8TZpMRQNnAFPAMHm7DgFdFPxduEeiraYtKLZpBX
TGxSUA/BSxRa8M35nzhqFJ9Hf/OURtjYMInaR2CVfFVJHYmpdHDTO8Mg7CJ6
JJ6cjarIEXBH8+hiKj2NGllMypooEEkKCkYXtFdw1DC1xgTd9KhE9ngTmd1K
eGKpic+5eAyM3hl82NfMabroG/zEORmyK+/hsUegWZOoOYn/xEfHGQjCM3r8
IqS+7r1Ci+mJEoeIaH0gzJlYuolGZqU5CfllMuVyt8DokIEHAwPs+fSR4oe5
3B06H6tH17tX1QXXe0FNS8XSTM5BEFymj2eSCUyWsjyUyQ2g2U2ibTp7UONC
6J2obdNDMmKrASSkZ7aGgAih/si5XARcOmHlZoOp41gcYeb6qus3mIaPIeeq
+lcUnl5Tfqek7YfQ+FU51CAYsbgDXMqmqrs4it4kqzMX39A8mLVdw9rqFU6V
xDqZg3KnQ1VNJKjFIZEDfZI7jgzSfCrFDEQupwAfHUZfEXSXHnko95b3rfR4
OhfFDnX5YF8f66qv5yKDSl8LANZGuWFA0QzL9+uZoTSCVIFloVAvoNh1AJ+3
IcSf849VcEDkh9ug8CGZFb4tNRBOA5KNTU80bxtr51K7H1GRKlLAlSpYVRyW
YF9qQbsFAWqkfGT7Q0iNJ2fxuu9o62xdBFC2yfZ72HjJBC3ElPEZ8oUaa2RP
iWX4lJkNwYNC7kw4FkK2eSRjAk+ifMuQ+5DaQJH9Mfx3nciCbLQm6xWvkW1F
jKVox0Bxq5RCEokxz0mEr2B0Wo9AAJwWcSAAsIwVVnsWNq5dM2GALFAI2Y3b
VlTvLQrqGPgdiR6bJNFx+rjXacNPjumosQtLYGqx3DbDBUUwWHs0Cw+XaPuk
aE78OOePAyH/uaEvNJ5iMMhbURQKxnGHl52tO3LLNQUOHo8crhg3+C4ltVd4
rgtJvEF/g3tYJrfoM6D2rdBkJdNldOHkJtD4zpZlQ5c3D7di57J2bQE0sqIv
NEE5hn2cl9LttQIP7P8ZZjcmj57i2GITw2WaoldcHqnQ2kwBXaLiTWeSPBpv
76U4Efw7Npg1ciUJwB/EM9KfgTnInqmuE5mdaPdTeeC5kP3vgDhS1M1r/gex
dGI2LygFjRm6ye78PGezxZoF1lr7xEbz4F9i/HqXO+TYrDZZIP0dW2V2qe/h
xs3HTEShEhMTM/2x8+UCKVw2UOJLvKuJ3TAHZtHfJMtWgzWOxlp5z9Z0HSIl
TfDAY1jHcyZgBV8jR9gl7CC4XYD8KM/CugEAqtMM4aXYsbz4DWIwnUBYB6Xv
+mgbVIdplMjPhcZ71I2F9zBJmoTkHA8Tmi43HYO8Rr40GnMlv7BZupOMGzqk
3dATwd24MIRLjd95lMUocfMeuwIl6DoW5pMyAl2xtOiIDrXuihNOiE77woxu
qj5a+2KIkKuH4r7ZZqRCG9D6kq0LvEPK/ZkKVJHzkjdoRAQ2Q+SzI61hOhhX
oqxZl5UU4lT5cxmOeTmrW0VJAQPDSLYuvAd4rmlcRuIo7etU3s9LYkuhV3AJ
yyhFntNolhM6pDdMTlPeiN9+FEk3ZNKjTLpvCs7CABDFggfhJN4MPi5OBPPm
WVCtTK4W+5VuumJ9XTcbTd/KraruozRk0qtgfbuy7qdcSehrU12OsVOvr6+u
88RVQiBoaeLBO75N3Jds88goZtsEhVhdbl83I3rux247B6nH25NkT5StgOTE
Xx7V75PEuqYCFWPmys3fgHJpdUM2SpRkPKPhcOeUhIz7JfMaCx6ovbUkVKBW
RmPhDA5oszg3Z5KLDYRi2zFCcPUubxVvUWqjV1U1IFsNDutCPCt5wJnkqdol
wpogJbK5hUaCgG669GqxOAvy4SmU2CIH5U+OToqWBGreTdkzQaQZipcmaYWo
34xMjSrlglzdj0Mw9wSM6S4N4bwYVwNiXwgVY9wrlp6xL9NLElN3wZmQGFaC
x00Fl0lf2mw87ZZHqMzdG0r458fmxQOJZNAnaGn14DL3o0wWFX3KgNfcbKqy
UzwbpfzmLFxjeNaZZ9GIx4YOAonCxwaMCfZaRPUnKG85Mb0RKPqqYJONdpuN
lmviS0OInTzv/PMYV6L1OeUrZMLFpg6M9KabFaSl4uI33U0bktoYSPwdHHwL
U9DOlYMO7MjhwCS4VHPnHH3Ufl/1XQQdxS+DxIeQ0jThrGtfn4aPO6yOENT5
I9UzzmNNKrqnVFPI4tTbm5cqJ7RMfxASJmUnlBMx8Mf1WkjZLl/BbRBmZqS3
WY5X0RbNaxOki47bPEo6nEo55j1FTSNQLzPnaLzRgxN3DModx+XJtx8cECcP
caHJKdjQkcxcIl5PT4/e8xvBDzMjrsSXF5fxiesPzVQLtAw1J2pnZR6s8MsZ
k6mEpxZr1JHb7ClOMCkd4sPBTWLqaMfLaGF0u4fOJ7i2nNDxo9FlKOhP966c
6Y5MgUjUo1wP2BfAyR06Cd9a+Cx1UtC++fLLx0h5xLw5c9uyQRuLGHc3e3Y0
wIUdn2ELSDLE+07NjVKTl2H+EVZ21tpUz5lhU036czF9SpEPzstMxeBykHiz
gb2wj/TZQ3YQzyxAeCGpRcjKLFK8yfU2MRJoKBJqJ2inmUltMrUMiE/Vr2Ai
9NLkd4eWnhN/xiXcBQUCAGL3yl0MuU1xKKmuE1BYwTN3SlzYdax2xQPykppN
AT9he1G6OTFsWgtmVP8ME4XdZ4viyz0K3IkVd2XVLJJXvVKQn2fhfjo96ykL
8XeGZJdTK1HMNCKDKrwYkcep+1SycqqTTtnHTEN3kZarsz02eukmMkVQFu7f
FsUT9LKQ5HYITtFBAjcdFxRi4DiqlOOPHw4ZpbyYKOUE7epjATJSriXuQI3j
GW8IFrmeFF/eTNAmLOeAvzensHs7PoyWyhpydM7ai0XMrzL0AWtxwLe5g/Vx
qi5UF9TQFxZqMuYkn4i+SB7MGZiOvBfvN9bb2zvRns0gzNHUEHeIIB+ekDT9
u6iR3kVPZbVd4V0FURB9qMqodyL2liFnXJLiPOygzkIxQuRag1NyGIUOMBpl
dizKxB1AkulyzQBH7Fl51MFa5J5DTcUWJUWz+Eymdl3a832pTrRgpC6pAa+Q
U/Yc/oghj2/iOwJQL7FzUA+Mc0hsp+CspsnGO5l+A9bydqQWp/ddalig2Nm0
pAg7LX2FapYyyH7DFb77quFaxmIsiJxA8hrLCGQJinzfTzTYkaL3XlRrWNcw
8RESdYc15J/WYJPqaqBoOJZUYR6q/x070KncMA5nLkcCh1a3mTJ+HP1CBgLS
8UjQICnRh2leSJJZe9mZhINo/cw0lM7/Mg3//GKJe5DjtpHavJuKeWT6Fuch
jeXVFVkEKA6FCnLaMjYoR7L7iNisL7mN32PVGiXJnhBTqXi52ChzhDNOKtEm
DERwiVLlBJvib1j2m6h/X11h6s2kuPk0EDvvkMl7ZQ7CAa4O/+HNf4eOuwg3
pkZBrUrIehgG0bMETIW1XxRfVkCy666X8Gb+TXmH7GNpxlnIUpaUHCzsBXWE
w6u/9FGMAVrRLIdRzxy9SGEmtgAM2cRIqKL6MugHZi0jqg/La/bRGdTCQ00S
rHxnF34wUMX5QBUtfg//TErds66HPX5uWl+ZUSyScnqdx87lFIFOOYwfIyLX
YzUWH5/5Zg4U7rfrdtgzp/ISZWlge4Io0phClquyk9k1BopYA+EhbKTa0YQI
W/Ju4DBhGvL7S3SYbHL0sd9+yvztq7BmymbJFn18huwdIwyQv6Abfo7/MCXg
4qhzH8kLIhu8TAyaOlPgzSelm5uuveIiWBEnoFBe7kGxr4drp6WYEBLW853X
GUPTBNwIp2bNKTu1qUzDlC+T15x/zUeqTSVW6f3g1QlLy31WmrrhfBkurrPF
tG3XIX/mk55xcLE0UqKiVWNhYv20g0eFMTYmxC/0CXo6hoYiKHHbvmeF7+VD
GBDaVqyNvnS5J1FMSlmJY822oND8xMkJOiABtVcW2MtYYXwjhbVOFpM9MrOS
1tm+F77xSMHFHijK29cZpYEOzRC6oKANqqPhSPjgohWii5oGNhS/YxUJbt9T
cpc1NwEv6mmi0SmhS5sGhKX2gkFQ3oXQ2iOn7ZOm8qgp0hBKF+4I/SYdYTNM
JCCXfxwpDmpBKn2gSeCms7Tf24eGuwqmJiE/VCeVa6cGFYOkl6R6qu/189TP
NS2heuChsNJpHdVDZ7SI34lLqmY2kU9cRrGsrW4uOKjKlFlNNqtv24T/8Ktk
Kk/iS1OxTsiGygnZffngiHB7minA1jjyyxAjF0KGVe1uOX4ewVNgQBhmpr5y
xz+KHEqjauX2KLVWS4lZgZWNmsn2lxb38DqVtew5WFOzsZWuHpTTg6jpuyF6
Rhyzo3JwGv+l3C5QhJjpUEzJHWlSITVr4uay8hknbGWAa8l4PxEW3n6QYf2+
vuOd0jcicVxVxwSJ+LcfZqR0ctbHEvodiO8HEGz3Lyd4nq59iuS5Jwp/2ha5
D99JhM5+aUmRh5zW5Itz0Jt+Exb7w7Fb0V1qDaRLsvUGTDKdKV5tgJalfDI8
amlO72L+W1e3aIMiaJ+50ptYjyp/YtzNacFU4tKFO67Vbhb2x8k2SdIl5tce
SzuklEML9RiJGko0JjNgZ5G7chilp6AtfsBee491/jxDU7skrVi8uUB5et54
sqv7ZDeK3YVV+vsHE6nIHwxfNhPZhEL5kFQN2vWnRi1P6d8cg5rnaAfYxbIw
NXsjud5Z4sC5a2MeUGdRyCy7D9wByCOjzyyTVGtmmF7djOpGID+K1HlKomGH
iZ2jXA3VgVWlzQICdeCTZlvuUQOIyS9QPhAJu1yRwhnyrpkS0fFy/QpSz6g6
tmW6Sbs0l28/OATFP7BIEvipPJtYS7DCm1Ewb91AnIvT09KwXqtfx2ICib2i
kAyJ7sWUIKMcY30OuotggaitR1gHMM4+WztX5FlJ/2CRVn6qWlQ3Bqm765Uz
hRBq4cFt9XzKh22CB3pOzg6gmkNUi5FV3vjr+L6cHg6PRYoX579xyH9r0ftG
UsFCmz/JeyJdZIWl4zThrO9G0Rjlrj80lVSQESxMQyppTZpIFHJTcmo1dyHm
qufctir8Uro4zr04EOd+Ho1oa1OrdChls0nN0Qw5uZi48rXPvpOa2priM3gL
XFQVhLQQXJmPqE+S+bhFmy4omArIlQNTyBtGw0I1knJLVUf14bZJl1qmJizJ
D9f1DgUqzmi6zpQET4/JRrxLcZeI69oKCTgyLgID3XGIr2jhUiQcg3ofl2Mp
KYWjj3CbB8DwerNvfhYeEWQapExzrZ2Xknwc9CtFlg43WSE23A2WsckJCDNO
BF531zzTk5CMgpghs8fayEmbakQreujx4QEotDPJZAdQuggP6f982ktqnbXe
sS+mIeh81RofY8N9COWFm87UvW6rgGN7sChnwiv6BrglOnWUwDbY1i3m+SX9
QbOgfo/qOAcq0kwr0wa2jmsRMQIft3Vw4kK5SaeTye8cJpp9XY7ziXq/kxe9
RNcejsTAww0VbVwwCglohXzTKekXM6qS1fnYzR+/cPFCZqmgnZ7LUqe41sjF
YBLHAGnYxAZD6zBOX57Ij+YH8klKxhMY9ThMKhVz03JggriBwPNy+2Dru5P2
wsQk77O1uN9wZMpz3E1WnKk47IbBOA5PCpbBhPtObIOODPos/CJvpcF4USIM
e4NqiPg1Dw220oK6g+hxxhZeauxmTdi/ZGS3tzHYSXNv5MNJqXq0rs7e09Wp
HnmTISu1c5n7cRuCqUURZ0nbnXMwog2ObSdUKM6HmJYRwxJOzlbBIUlhgnfs
T5wYO3XGAxW8wmZS4QtrgbXxfry8p5ngUZ9sNbXTnW6RHwi0TGNRJp1uCHYQ
m0YltsaIPOM6KTyMlLFRVdzamumAGSOSruuTyzKOel+L7ZEXDSNOGJhC8ZVw
WxGQVXrK54LKyqh6mgQvpT2WqSoWQKisUgYwJW4IJW59vioRMACQiOTE8h5H
6llhb+ZM1SQKojG8SmsmxSq6nISXHSW9k1WgyHRdmDfDW/rGTCbLSR/espGV
s7QTTAj5DsWd7Bpnx+RSIyXDQrNiqQw7i7pMxbCz9m1iosOwNdFUIMoZdvwL
Wi1Dang7Ly9pHe95VMcba6Fxiw+CNe1Z9Y4Mgzbr1sV3F2eB48NpZfb4+ZAv
SiKj84/5RhRMCSSf4GD96aSQLtrU/+0z9qyRU571I+bnJvcmOmuKq9LKrQIR
ZGiUO8g6EiL4WdgnI3ujcdUlFkfzS1hAsDbKeVhjo79T/dE8H5c9tbqIyKmm
/mm09FhaO1iVLXonROinX/vqbEGMjkT5L47Uj73nicY7lQXj3zfnj06j2nOv
uPVx+LNl7RbyKFx/0P0oavtM3qF9yMDZonaHrjh7gdlKtFkidGfOsMQnF78q
QFt/8DGO+Me6r76i9He/WUyJv+CUeA1PiaYrFLyPQjZWsVNSJH3v+X/Ti5Fi
AuGL4Ay7iC8tbpgdCguqjf4NSCitHl061Psf7CRN+Z89rYNXR3RF13BuaUwW
2zKzyN97TBZfXsSWf8zNMbgHy0cC7Mfvxl7ze97bfbZxT5oQqfCBL39BEt6/
BnGj9cWXGm0jEon+u3CJ+8BcvmoA/u3QPN5e/ZlbAF90lxfyzV/94eX64cWH
eD/ufoxXH2f0Gb+fIMf0kVCnSL7/MTf8Xw+h0cKM69FXTsrUo26P3Lw44tVP
RDIydZRb2k1zgpRZNxfC1iUvye/joleAj/k62XZN6vkXn0J9KamZPlvL3WUL
LY7bQrUFo+7It/6LsDuzqPsVWz0wdqIl5QY/WlZVPElVO+x7DW8v3XTojJE2
8jCXg1aoybycNKks84MFI+d4R0Fdd7SgbnGsoG7KyklFw5cMF8eNsTMi1BqS
sm6i/CIYOvMj79b/KsXwMhfEBrpAAxRX5CCH7Nnr8XFOOusgpH4Gs+vM79N8
54RUzqyb15So7qUyD/WStar5Jam/0fUnh44+CkqDN9aRLEQmkXlpKsPUSWGK
BrA7Vak24jPRaioVYYmElIqYEmc5XXFTyFKrjZzhzATo6C9eT2aDo1+sqOXx
SrXtukn5087Ohwlf3KM9qhwOy5nR70Jb6APnWzJVp8Qb+wpsLPY0FcYqptlj
sSXIJSECHlBjKjV1WOUraoQkp7Tx+THJFBEvEk0xH/q4qHCnMPzyy2+EL31l
jxAXSV21Qulj0dQmZ1dnqkJOhfs7ZXsvbatrR+Z76adLa+kfNtba1h/RLDN3
5BxmavU6Nrd2GBk194omTG2/Wc9l1mlHtQ2J/MbHKv6DDEsJJdXkumaFt5zC
wtQVa61agXIWQ6c+B3TOi88BWMeOquOqO93bPdVr7MwHtX9dgezR1+sC3YDe
ZUC5P12LRn8pTRsFvPEFTO2WGTGu+BJ7mcThcr5LBaK4dRDx8e26nv0Rl1R0
NXa9hEjzFNLdpr7UwooaxK57UdehcRiJqW/qp2PHzIAJ8VzB5Eiv4Pey43JF
TanLNyknqCXl8xEJFTWYnhIrl2W1oQI7RS0IIHBBl1BC9ZEV8d5+kJHvvMwS
By6QGEa5q4wcMxuNkThDJNk0H4ZBXEQNkwdQK61BGRwDeIuZYlt2AR9yeooZ
DNO6tysAAir/pLHiKZ8JGfdRKbFJUYO7Som9zDnm8QRHLGCqEi3uKiRXZSK8
mEqmi4RdbEIQQRyicQpyoa9PFq/bwc1WzeUs10LJdFA6ixNW1MYk3hk74MFC
TVx/gePwJ9Uxwkay+ir/5bVW/kst06LBpfZp/juovFrF96CVmhb8o4yqcahE
GiHxzp/GEUPyv8psOZ3H2saiSzbiyZvxgCHwN3FBE3PLB2uZaDy7KWESl2Ob
uUwJk9zcQP19tc3Mvihb0SdXeaHa4AeHLjHeLKYp3IHmsKcbyxONwoQnmMLK
FyfolT3qEzSjrRBIwu6tC2SF51eR8p8sS5IilJnn/iVJikMlSSZCeK4cyXH7
QQhTzNExi5sa6dXOSRIywX4Uw+nVXLkdN2UXfA9Bt1ujuC55yTDkhwcc/4m/
2UQHAVux/v/Q/MMO6g444A+KlXERTe1H17VS4duJwM6RhZQbBdOV2x0nN6rW
teWwVTTkrEs0dwRFV/PjNnNy3pCwFBjRHBmR6WMC012WdaNWCtEVwg1GMW/5
qqkZFulYdsFyAXEwptYLy45kIt0Zs2qslYcnwpIC5cnEcgTNg12Tq3JjZSUN
WKQ429iJ7TiEzrtSMzK97bqDwVAisayoUjbJP6EiQKByHYJfO4lkDLl3EaWR
FjhpXCu1tMBrRUcxSMnfclKvZyBnobsC14aWOm96YRwVknHbuyM7niyZG/LJ
VVC+CE+5ZLlvedci3IFFHDv2hcnNnlEzDkQQn6Jm8rTPQxDOtIxRRs8yO0sr
Gz2vekrQISAdq90ggb5JrCnraRrq4hW2D7EWRhLQlPamhy8MFdEcVIUskmUA
L15RoYpiwCLO+wZQ/rl9R8rLpWYIimAw0UGs8g8cZjRZ2ZFII6p8wBWEotMy
MGlDn2yhczLfaGFEbrcpEoQJ0p5Fr2fjNyesmM/WEmDCdUtTvR4XE3VDj4Jt
QQou+aJCU+ncRj9yWnFOIP/MV988zvk83ZQoaS0sM2HZsMkMASUgoQL4TFoO
OxzYtK+rksMP6/CISs0rw3LGEFed0byoqMWREB8pMnNXohGq+epSm+jIxwz0
Pi0hMSpgeSoLp8Z2JMlVk4jXwTd7zcAKrm6aq0BQJAIpgy9VJDugiRdmk4kZ
+MdVf8LRxmw85VEqo/GVbLSfi1keB5tecKZSVNpO8eU1d0R61XLbUTJp23xU
ScOiaaU4bOVJJRAINE2haT+uM2FJ9OqWLViUJpuPV84JWPkIWsnHX4lUbnJL
Xl6H4hJ95RN9MtXqpUjHdBl8upKjbqJvc9JfNjP/ftG37u7o2yIXfUvttqYA
5ax/ScyGbDKkIREk0Sx2hXSBt+Wlj2mgrqxP97TFSjBabkE5WpryMym8xOci
YXTZ4HHLSaSiSVLnZ6b1hYOuJhb9w5UrqIXE4TIBcQlhOmon4dXG9rrF0gnY
0IjuM1+CwgSnmhuaxVlK2mawlkBnAbukAkMGSbmAxAuq2uDiDLYpWPyz1TBo
0aAlYv1e6dtGBSuiOhNaByY+26j2xB64dVPUpnhZSP6bUmQq8IzqZQJv9Rb4
UM2KWVyDxEbhB27b6mNM3J2NNhYCkClsEXpt2sPlVmZ04azgj4NTKLaIKkb/
y33ThG7YWMZu1ZTtK87ZCH3mkRQkS+NCQUgJUREWeQkB2Zr2j9XoOy78rm5Z
6P2WLkKJeoaE+c59U1omXCYnXZoKKdlYfkzrhdeORPAXB/1yGDyM+YG+Loqs
ISng6OWovDstYXIUR3GAdce7FvI9HI69IVtuURS+XXLdNtj7LknD4nqhFBuN
9x8INIngQv2OpnxlFdYQDs++ID5no8KEtnWT0ESdNZeXDsPcncAdHxUI1UNS
qDCuZGn6gzzFbl18ZMekwXQKPWOWnemY40EP+hM0z9mfl8pakewdm2hSqxVn
oeSCYkjHeJxmTkjyyqG8ieD9i/ImBJxsnsP98idiq1MWT0mLObfN7JlQM9GO
0ysi3TVRPbX3ImtqdCwm92XxSdrAHIT3UIrY8vn43QefLD6LX01OC9tuqR8g
lw4yyQNBmJjoe8EIRjJyWTdDCmi2ZVZYrgjH9/avu7uc0sWBpF5Kme7hoMOY
blKn3xu5Dy/BdyVIoyKyHqfHL4SQi20SJVIvNEcagLDGnbGhRMI+58QxDfPl
Brkwe/FiRCvrFRWqo26KwPRs0j7F6ewpDGBYczLqB8UzwKtt/T3e8/PyFlvc
AdX6HuiUlO4j063ErSVF0PgI6j4QI9p7iMoRzoX0wcXNWXF5oG9gJw9sK+gL
FiAprm50+yVVtOMFsrs7pACBPOSx00ha8FWNLWi3wWcP8/Duemqdia1xhtBj
WrsgktAYLEBMCHxXHHyS7yeExYg0B+/cOrlXHqSTjs+myXKRNjENWpU058PB
xZrlMsatUDzBGJqnJqzU3sGxBT7vNJCXmYY99FFLcksAKegn9BelQyfvC1dM
DZYrTHjHzXRDfD4L30ibxOnRx4dscE5HhzTppxrABg80K/RoiTUj3DtacRTg
0URiqIQnYkQe9S+mAfuqASlJgkapfA3Jd06CEkKRC4kNYRcmNbCMjD7HTg15
qhTGYX3TSN3SS0El0kfcb862RR58GUhYwqsKjamA5OtXakpRL6CsgHwbMw/T
XMKQ2h+rITGjqYXae6ILa5NOjQZIfCxx7rILm0WbpSnPRh4VdjKEoM6Y5lNV
/W4YuHaUbXCLZ0HF9ZHNyHb2NrrQTCt9O7VZMR8KQDiXFdG34QIdd3KnlVEm
4p46n95EF2YvWRPubglx9i1Zx/2zzuIOPgRTfOjlNIq0Ha+1ww+l6lm6VmNE
UEluJi1944SjaNPHhLiF0qQEjEAVAXMaTCz1DkalqmZDfMyPq6bETP2vFOlg
+ATQPLL64oIrDPvpLi9JHCSWgnVSgBxzpUumcpzSyZoy0U5Vdh2Jrb4A5E1Z
j4E2HsF5j5U4oyl+eZrBe8K5s6AP46rRUIPCnMh26h6LvX9YTEJ3ux84dmOg
RjjIAqWGIirCJC8IxsarJvaJoQLFVxKG9PaDqFtoYDLctJtN9Ca4QCipaoT6
tM81lPb2cVK96U/KEo3pAC4WBJ5ukwoiFAtnzUcAO1yG0cae+kBMCsHIRDKm
MRTHAyiSwAmNAgmLXpgn4vQfjYqWAnMPQzIHnpSW7dFYFfPk55lBTDm7h2GQ
pCFk+mRuoFBg6KFZTeDPYaC49lo6ThwI/jBr0y8yT2bHiuPGH+b07yL3pA+c
CfchoSj3itIzsDhwjHsS3j7j4PY0rn3GD8t16UdTukm7E8G3tsa/+xGBflOz
v7zgzOrV3/3waKR+cThSH0MRJYJvDvLmFQbFAVYFw98yBWd2yGgVsZnJAohK
WJGk7PsaezAbzAmlUMuLMa0Tjzcthuss8D7tbaqdc6MFtA1X0lbE3ETc1BQ6
UKrpA043kN9Mw1opHABfzv3zhmjWEpjQqHsnCqsKkTwtxeuFyVEj5mrYTvtc
h4drU19Oh9pWZas8qGlioEayKLWYeNf7IRBq03KcyuqnvaKjvYuad0FqxOQQ
5FfqzBmdxssU55Z2oKVRDEyzHbmUSBMwWoAyML8R5U+lHOOdU3CJEa7/Y8rJ
0N6CXSzyvCaaiBbNmLCXoqD+OWiw4gZnEj8YJ7iRg9v/rnzDU0YsfKQk1a/C
FEuKHmZ162G6Qv7avOCT2KScUJQux/WYJqdHwYkhyQ3L7VCAGOy3XZvsCqPV
haQaf65lKB2dXH8E2bG9Z/Hp4tPU5hNlOMEAzhszbFSAVeKC1I2yXRspkdJT
/o4Ot/7FaZeN4/1t78WCDp7HhFW4JBKKYttUjUuGiWKgjKrncvhxgNhpTjIy
kinC669z+PUOhLcDHUd4UHHicje0U31fCrTylZJqUw/DXlpyPZGH4NTrMZTH
OJ3AVGKCPMtQETmlu9edpSIOOZ+a1KRK8rSy1j2qidn5uZSYFKWW7+Hh9xF2
knuYQpozQskRSIuHsZDmrFEhd4Z+zpnpd6CSe1BHg1tYNKk4MolAFJR8jCQ0
ynyNHrh7lYWaKUFC8YG17PTwARWwjGYF2hemFjySoptMUxyGwXpLjfGmcSFN
MkoE6+aqAn1k5o0QDA8bUxqRArXIpUeUkxJszb2VmnGDpaC1bQ1c9EMx0DEI
MUe7KYckxHTaIUTqeSUPSiGqmBhydON43ZPfm+WopqnxBuE8sa5qqTTX2BKC
+gb0Eb6fI4tDXwjTFiA6mMKuBgLMXCAv1WAsbLCVbTeM8ZROp+Tam/RbEj2+
iOqbqg1dap++O/OtbshJT1VdE8fasO8vubank9KnfC54p8PdkcMSuctFzjcg
TlFYtjQJmbqfAAQTVxLbZHPFx8Qp47mcg70Az8R2eyEnxVROisPozKLzkcnu
HpHJxNOxiyRnpqQFxExQsrfTTSN1vPv4QPmwNIo59vlLbHJ43TSemGUjniX2
CSmEFuBXC/U8CeKmYPcjkdEAXV/bFlyepGglYJKiD1GdM5j/FlP9k0JsfEG4
lHnYVZQPS06Jald8wmBPRlEJph/cDX4WS+ckwFbQxNNFuSmW2Wqsgwwv+9yh
LSY4GDAiD0lMpjAcHuUhW9XsHK1zDAkvgEjVawLsthpvuv6VK8cR1LgQvz1e
Y0wbLGELQtglxUOSs0eqZVF/E98kHAm0VllGA6iBCxueo1CB7dClX0gZQMTU
E7f2eIcRDXAzGo4FIsNO3YVb9fmHNrhitiwbQIDNLXrCiLTG2eDFOTyhG8br
5grGQlT2LawNc9XwJvqQZKHX4pTSmm0vQrizyRMkLFQHHqdDUJDybYBJp+cm
LAG0+pH7tm2rsaQAAh/ABteNVFfJPsdNEnJogJIj3JEZPJuOPKM+HE0NyKlJ
lqzXpqZ74o5jKzgbv1WsoPbf4yCGbyFK4x6t5KdmHcBfZkcyicySyWR5xmnt
pJrQJbLXW7D6lrOJNIN0TN8ehKf6B+LWyxp2ydvVu43EeUND45vhM3BmJ9Fl
+ClkbuF2k+6unmqHZnmmlTVSItH86YQ5dWl001gH4X1x6W1uOhc1K5+YZ5yE
u606McoeaPSoXuhJ20qWAuictI6k5WlUryIRYES6CAww06OWKJ22FCcjcNqV
mJsSsyEA25HP7EY5BONAnsrL7ordJd4SHZV74yaPfscyKqr0LlVf6UmNCpN8
s8EHi6dnRc5+SiFzdKvoJRFc0k0O0e6E4Iooig4IscPzkqQFZ0g7z4WiEx1G
CfqurqbkpyWcdpI8z7SAe07Zfl6TOAIbMxnl+UqHFWp6o5k0mAfCQXFs9hvJ
WkF2zCaBBqRLTfql4pnBk2jHQzFcRyYNE3XvJOq+xy647SuKiATo1P0KD6a3
WBhh3kwXicFBIcIBj4Z6h0mBf7gFHrGmNPUBlSciFCbTX+Hhe1Qdep6B8j48
ZsNVMVo4epYq9FgPhNIIbQAK9KEGFizR2pL+f1mLQw4XImK0u2cr0DkX7TnS
4IfrG4WWFWmvPewqDzoAx5q6QhkyYVOHXAlpVLdCHSnT70+7cqB9Uxzpoeo5
jFbu0F7Qk4uMCyG1Rb5bRLQiydKjy6KwKntMTAZ68tZLSFDHtroRZRtJ9Ypc
9CJawEAaXzNYr9/Zwh+k2dvCWtt9ONuRjoq4zuuuGwjkUbiZtDoqtRMOOqS3
HF+rTSvYrEV0ndxrRZqB71P4H9J8MhJxv4DPcXckq2UMGYVVGaq9UQnoZ4nC
Bj5PG5lwfr1tobGqxH8At3aw96PLFX+ipA9f68kuKLMbydGSmrV16y0GYYTQ
G2jvA+CSoEub3iNQi+JLwhoEOTIZJDlOUQAXIAHkCoFsdJjQ0WZDJEigk0Rh
JsXX9QY+MkXpyWL49Px35xMLiVYb+foFBR8F+yFaxjEsBF+qOa6YF8MtTxMf
ruoCQmBOorEcjXWCjWfrAZuuRY5jb/f7WWpHBpL0Q/Edhd0WPxS/K7dJxb0f
Crnv0+EMPoAA3m237GbGTyoN/uB+mMuf/4f5++Hgh+gTjFJ8/Objjz9+BIN7
L5NZy68fmQ9/ipaJrq//BX9F4Ud5rKNE/hoY5en7jPJER4mMwPcexZ1+F9pS
CxhgvY/91ZUAXkMd8zjKikABlaVdjZFBKEQNizO2JJ+EmzgBHF4ByNemcgwT
Vaofk7tzZ1Wzk18/OgEIAapNnqID3jjE8JNfPzVPuozldxG2Ww/cZTq0gPYC
ID7T7lEKcNiFiCRTbbO16db7LUUu71AcDnLBIsIdG5/xTyENDuRkoHtgzCfv
hzEx9vxIhHlPfPkZjJ06pdOV3AnoP7eDGMH1vQb5hR0ksJ73W8m5HST23d9/
kC+jQWIf/38V2jq4JJBK16+QN5yvkbc01eaKRCn39iEjRLX51cll2QzVCbqM
nj1+BjqLPgkS+v8BJjdziqDnAAA=

-->

</rfc>
