<?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.4 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-kohbrok-mls-virtual-clients-00" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.18.2 -->
  <front>
    <title abbrev="MVC">MLS Virtual Clients</title>
    <seriesInfo name="Internet-Draft" value="draft-kohbrok-mls-virtual-clients-00"/>
    <author initials="J." surname="Alwen">
      <organization/>
      <address>
        <email>alwenjo@amazon.com</email>
      </address>
    </author>
    <author initials="K." surname="Kohbrok" fullname="Konrad Kohbrok">
      <organization>Phoenix R&amp;D</organization>
      <address>
        <email>konrad.kohbrok@datashrine.de</email>
      </address>
    </author>
    <author initials="R." surname="Robert" fullname="Raphael Robert">
      <organization>Phoenix R&amp;D</organization>
      <address>
        <email>ietf@raphaelrobert.com</email>
      </address>
    </author>
    <date year="2023" month="December" day="14"/>
    <area>Security</area>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 26?>

<t>This document describes a method that allows multiple MLS clients to emulate a
virtual MLS client. A virtual client allows multiple emulator clients to jointly
participate in an MLS group under a single leaf. Depending on the design of the
application, virtual clients can help hide metadata and improve performance.</t>
    </abstract>
  </front>
  <middle>
    <?line 33?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The MLS protocol facilitates communication between clients, where in an MLS
group, each client is represented by the leaf to which it holds the private key
material. In this document, we propose the notion of a virtual client that is
jointly emulated by a group of emulator clients, where each emulator client
holds the key material necessary to act as the virtual client.</t>
      <t>The use of a virtual client allows multiple distinct clients to be represented
by a single leaf in an MLS group. This pattern of shared group membership
provides a new way for applications to structure groups, can improve performance
and help hide group metadata. The effect of the use of virtual clients depends
largely on how it is applied (see <xref target="applications"/>).</t>
      <t>We discuss technical challenges and propose a concrete scheme that allows a
group of clients to emulate a virtual client that can participate in one or more
MLS groups.</t>
    </section>
    <section anchor="terminology">
      <name>Terminology</name>
      <ul spacing="normal">
        <li>
          <t>Client: Any MLS client including emulator clients, virtual clients and real
clients.</t>
        </li>
        <li>
          <t>Real Client: An MLS client whose secret key material is held by a single
agent.</t>
        </li>
        <li>
          <t>Virtual Client: A client for which the secret key material is held by one or
more other clients, each of which can act on behalf of the virtual client.</t>
        </li>
        <li>
          <t>Emulator Client: A client that collaborates with other emulator clients in
emulating a virtual client. Emulator clients can be real or virtual clients.</t>
        </li>
        <li>
          <t>Heirarchical group: A generalization of an MLS group in which members can be
either virtual or real clients. Heirarchical group members may also act as
emulator clients to collaboratively emulate a virtual client representing the
heirarchical group in one or more other heirarchical groups.</t>
        </li>
        <li>
          <t>Group representative: A group representative of (heirarchical group) G is a
virtual client emulated by the clients in G. The group representative of group
G in another group S is the representative of G that is a member S.</t>
        </li>
        <li>
          <t>Subgroup: A heirarchical group with a representative in one or more other
groups.</t>
        </li>
        <li>
          <t>Supergroup: A heirarchical group with one or more virtual members.</t>
        </li>
      </ul>
      <t>TODO: Terminology is up for debate. We’ve sometimes called this “user trees”,
but since there are other use cases, we should choose a more neutral name. For
now, it’s virtual client emulation.</t>
    </section>
    <section anchor="applications">
      <name>Applications</name>
      <t>Virtual clients generally allow multiple emulator clients to share membership in
an MLS group, where the virtual client is represented as a single leaf. This is
in contrast to the case where each individual emulator client is a regular
member of the group, each with its own leaf.</t>
      <t>Depending on the application, the use of virtual clients can have different
effects. However, in all cases, virtual client emulation introduces a small
amount of overhead for the emulator clients and certain limitations (see
<xref target="limitations"/>).</t>
      <section anchor="virtual-clients-for-performance">
        <name>Virtual clients for performance</name>
        <t>If a group of emulator clients emulate a virtual client in more than one group,
the overhead caused by the emulation process can be outweighed by two
performance benefits.</t>
        <t>On the one hand, the use of virtual clients makes the higher-level groups (in
which the virtual client is a member) smaller. Instead of one leaf for each
emulator client, it only has a single leaf for the virtual client. As the
complexity of most MLS operations depends on the number of group members, this
increases performance for all members of that group.</t>
        <t>At the same time, the virtual client emulation process (see
<xref target="client-emulation"/>) allows emulator clients to carry the benefit of a single
operation in the emulation group to all virtual clients emulated in that group.</t>
      </section>
      <section anchor="hidden-subgroups">
        <name>Hidden subgroups</name>
        <t>Virtual clients can be used to hide the emulator clients from other members of
higher-level groups. For example, removing group members of the emulator group
will only be visible in the higher-level group as a regular group update.
Similarly, when an emulator client wants to send a message in a higher-level
group, recipients will see the virtual client as the sender and won't be able to
discern which emulator client sent the message, or indeed the fact that the
sender is a virtual client at all.</t>
        <t>Hiding emulator clients behind their virtual client(s) can, for example, hide
the number of devices a human user has, or which device the user is sending
messages from.</t>
        <t>As hiding of emulator clients by design obfuscates the membership in
higher-level groups, it also means that other higher-level group members can't
identify the actual senders and recipients of messages. From the point of view
of other group members, the "end" of the end-to-end encryption and
authentication provided by MLS ends with the virtual client. The relevance of
this fact largely depends on the security goals of the application and the
design of the authentication service.</t>
        <t>If the virtual client is used to hide the emulator clients, the delivery service and
other higher-level group members also lose the ability to enforce policies to
evict stale clients. For example, an emulator client could become stale (i.e.
inactive), while another keeps sending updates. From the point of view of the
higher-level group, the virtual client would remain active.</t>
      </section>
      <section anchor="transparent-subgroups">
        <name>Transparent subgroups</name>
        <t>TODO: The following text assumes that we have some mechanism of adding one or
more additional signatures to MLS messages.</t>
        <t>While applications can choose to use virtual clients to hide the corresponding
emulator clients, they don't have to. When using the virtual client to send
messages, the sending emulator client can provide an addition signature using
either its leaf credential in the emulation group, or another AS-provided
credential that allows higher-level group members to authenticate the message.</t>
      </section>
    </section>
    <section anchor="limitations">
      <name>Limitations</name>
      <t>The use of virtual clients comes with a few limitations when compared to MLS,
where all emulator clients are themselves members of the higher-level groups.</t>
      <section anchor="external-remove-proposals">
        <name>External remove proposals</name>
        <t>In some cases, it is desirable for an external sender (e.g. the messaging
provider of a user) to be able to propose the removal of an individual
(non-virtual) client from a group without requiring another client of the same
user to be online. Doing so would allow another client to commit to said remove
proposal and thus remove the client in question from the group.</t>
        <t>This is not possible when using virtual clients. Here, the non-virtual client
would be the emulator client of a virtual client in a higher-level group. While
the server could propose the removal of the client from the emulation group,
this would not effectively remove the client's access to the higher-level groups
in which the virtual client is a member.</t>
        <t>For such a removal to take place, another emulator client would have to be
online to update the key material of the virtual client (in addition to the
removal in the emulation group).</t>
        <t>Another possibility would be for emulator clients to provision KeyPackages for
which only a subset of emulator clients have access to. The external sender
could then propose the removal of the virtual client, coupled with the immediate
addition of a new one using one of the KeyPackages.</t>
      </section>
      <section anchor="external-joins">
        <name>External joins</name>
        <t>When there are no subgroups and all (emulator) clients are members of each
higher-level group, new (emulator) clients would be able to join via external
commit without influencing the operation of any other emulator client and
without requiring another emulator client to be online.</t>
        <t>When using virtual clients and a client wishes to externally join the emulator
group, it will not have immediate access to the secrets of the virtual clients
associated with that group.</t>
        <t>This can be remedied via one of the following options:</t>
        <ul spacing="normal">
          <li>
            <t>Another emulator client could provide it with the necessary secrets</t>
          </li>
          <li>
            <t>The new emulator client could have the virtual client rejoin all higher-level groups</t>
          </li>
        </ul>
        <t>While the first option has the benefit of not requiring an external commit in
any higher-level groups (thus reducing overhead), it either requires another
emulator client to be online to share the necessary secrets directly, or a way
for the new emulator client to retrieve the necessary without the help of
another client. The latter can be achieved, for example, by encrypting the
relevant secrets such that the new client can retrieve and decrypt them.</t>
        <t>The second option on the other hand additionally requires the new emulator
client to re-upload all KeyPackages of the virtual client, thus further
increasing the difficulty of coordinating actions between emulation group and
higher-level groups.</t>
      </section>
    </section>
    <section anchor="client-emulation">
      <name>Client emulation</name>
      <t>A set C of emulator clients that want to emulate one or more virtual clients
must first form an MLS heirarchical group G with membership C. The emulator
clients use G to coordinate their shared virtual clients. Just like real
clients, a virtual client V can create, join or participate in any group S, even
acting as an emulator client itself for some other virtual client. If V joins a
group S then this makes G a subgroup of supergroup G where V is called G's
representative in V. G may have 0 or more representatives which can each be a
member of 0 or more supergroups. But G can have at most 1 representative in a
given supergroup. Emulating clients in G MUST ensure that G and all of its
supergroups have distinct group IDs.</t>
      <t>An emulator client E in G creates a new virtual client V of G by assigning the V
a fresh virtual client ID (unique among all virtual clients of G) and a
signature key pair. The new creation of V, its ID and key pair are communicated
to rest of G via a commit in G sent by E. As an invariant, emulator client's in
G maintain a copy of the complete local MLS state of V. This includes all MLS
related secrets currently held by V. Using this state, each emulator clients can
independently process MLS messages sent to V to update their copy of V's state.
Emulator client's in G can also act on behalf of V (subject to application
policy) by taking a new action. Possible actions include anything an MLS client
can perform such as generating and publishing a new key packages and sending
commits, proposals, welcome messages or application messages. To help other
members of G update their copies of V's state according to the action, E
anounces the action using a commit to G. Any secrets created by E as part of
implementing the action are generated deterministically by exporting seeds from
G. This allows other emulator clients in G to reproduce the same secrets and
update their own copies of the V's state maintaining the invariant.</t>
      <t>OPEN QUESTION: It's also conceivable that emulator clients announce their
actions via application messages. This is sufficient for operations that are
affect individual groups, because the DS of that group will enforce message
ordering.</t>
      <section anchor="generating-virtual-client-secrets">
        <name>Generating Virtual Client Secrets</name>
        <t>An emulator client V in a group G may sample four types of MLS-related secrets
on behalf of a virtual client V which must be reproducable by the other clients
in G: init_key KEM keys in KeyPackage structs, encryption_key KEM keys in
LeafNode structs, path_secrets for an UpdatePath structs and signature key
pairs. In each case, to do this V (and all other clients in G) do this by
constructing an appropriate label for the new secret and exporting from G with
the label.</t>
      </section>
      <section anchor="dsas-details">
        <name>DS/AS Details</name>
        <t>Virtual client emulation should be largely agnostic to specific details of the
AS and DS of the application. However, a few conditions must be met.</t>
        <ul spacing="normal">
          <li>
            <t>Access control: All emulator clients must be able to act as the virtual
client, including, for example, queue access and KeyPackage upload</t>
          </li>
          <li>
            <t>Queue compatibility: The queue system must allow all emulator clients to
retrieve messages for the virtual clients. (Although workarounds like one
emulator client retrieving messages and then sending them to the emulation
group are possible.)</t>
          </li>
        </ul>
      </section>
      <section anchor="adding-emulator-clients">
        <name>Adding emulator clients</name>
        <t>If a client is added to the emulation group, it has to be provisioned with the
private key material and the group states of all higher-level groups. While the
latter might be able to be provisioned by the higher-level DS, the former has to
be provided by another emulator client.</t>
        <t>The other emulator client can provide the secret key material used to derive all
key material relevant to the virtual client (higher-level group secrets,
KeyPackage secrets, etc.)</t>
        <t>TODO: This means that all such key material must be derived in a well-separated
and forward-secure way. (See TODO above to specify further details on how to
derive key material for the virtual client.)</t>
        <t>Since the new emulator client can only emulate the virtual client if it has
access to those secrets, it cannot join the emulation group via external commit,
except if said secrets are provided asynchronously.</t>
      </section>
      <section anchor="sending-application-messages">
        <name>Sending application messages</name>
        <t>MLS applications messages are encrypted using key material derived from the
secret tree, where a unique key/nonce pair is derived for each message and
irrevocably deleted after the message was encrypted or decrypted.</t>
        <t>This poses a problem in the context of virtual client emulation, because the use
of such key material cannot easily be coordinated between emulating clients.
However, reusing a key/nonce pair for different application messages leaks
information about the plaintexts. Moreover, any client receving the two would
not be able to decrypt the second message as the requisit key would already
be deleted.</t>
      </section>
      <section anchor="challenge-based-application-message-encryption">
        <name>Challenge-based application message encryption</name>
        <t>This problem can be solved by introducing a new type of application message
where the encryption keys are derived using a challenge-based approach.</t>
        <t>Using a forward-secret exporter secret (provided by the safe extension API),
each member creates a new secret tree. Whenever a group member wants to send a
message, it creates a fresh random challenge (see <xref target="challenge-generation"/>) for
that message. Each challenge is mapped to its own secret using a forward-secure
KDF implimented using a new secret tree (see <xref target="forward-secure-kdf"/>). The secret
is used to derive the key/nonce used to encrypt a message. The sender includes
the challenge in the AAD of the application message so that receivers can also
derive the decryption key. Finally, to ensure forward secrecy of the
challenge-based application message both sender and recipients apply the same
deletion schedule as for the standard secret tree in normal MLS.</t>
        <section anchor="challenge-generation">
          <name>Challenge generation</name>
          <t>To send an application message the sender must first sample a challenge. It is
crucial for application message confidentiality that challenges have high
entropy and are never used more than once. The following method for sampling
challenges ensures this by introducing sufficient entropy and guaranting that
two challenges can only ever be the same if they are sampled by the same sender,
in the same epoch, for the same message generation using the same entropy.</t>
          <t>For each epoch in which a client wants to send challenge-based application
messages it maintains a local uint32 message generation counter for the epoch.
The counter is initilized to 0 and incremented after each challenge is sampled.
If the counter wraps around to 0 then all subsequent attempts by the client to
send in the epoch MUST result in a failure.</t>
          <artwork><![CDATA[
uint32 generation;
]]></artwork>
          <t>To sample a challenge the sender first samples AEAD.Nk uniform random octets
called the challenge-seed. Next the they populate a ChallengeContext including
their leaf index in the group in which the message is sent, the current
generation counter and the confirmation tag of the current epoch (which in turn
contains the hashed group context).</t>
          <t>Additionally, the sender also includes their leaf index and the confirmation tag
of each hierarchical group between the sending (virtual) client and the real
client that actually samples the entropy.</t>
          <t>The application may supply further context in the applicaiton_context field.
Finally, the challenge is derived from the challenge-seed and ChallengeContext
using the FS-KDF and the generation counter is incremented.</t>
          <artwork><![CDATA[
struct {
  optional<GroupChallengeContext> subgroup_context;
  uint32 leaf_index;
  MAC confirmation_tag;
} GroupChallengeContext

struct {
  GroupChallengeContext group_challenge_context;
  uint32 generation;
  opaque application_context<V>;
} ChallengeContext

challenge = FS-KDF.Expand(challenge-seed, ChallengeContext, KDF.Nh)
]]></artwork>
        </section>
        <section anchor="message-framing">
          <name>Message Framing</name>
          <t>The following enum and structs define the wire format for challenge-based
application messages.</t>
          <artwork><![CDATA[
struct {
  opaque challenge<V>;
  uint32 sender_index;
} CBAMSender;

struct {
    ProtocolVersion version = mls10;
    WireFormat wire_format;
    CBAMPrivateMessage private_message;
} CBAMMLSMessage;
]]></artwork>
        </section>
        <section anchor="message-authentication">
          <name>Message Authentication</name>
          <t>The following structs are used to authenticate data in a challenge-based
application message.</t>
          <artwork><![CDATA[
// See the "MLS Wire Formats" IANA registry for values
uint16 WireFormat;

struct {
  opaque group_id<V>;
  uint64 epoch;
  CBAMSender sender;
  opaque authenticated_data<V>;
  opaque application_data<V>;
} CBAMFramedContent

struct {
  ProtocolVersion version = mls10;
  WireFormat wire_format;
  CBAMFramedContent content;
  GroupContext context;
} CBAMFramedContentTBS;

struct {
  /* SignWithLabel(., "CBAMFramedContentTBS", CBAMFramedContentTBS) */
  opaque signature<V>;
} CBAMFramedContentAuthData;

struct {
  WireFormat wire_format;
  CBAMFramedContent content;
  CBAMFramedContentAuthData auth_data;
} CBAMAuthenticatedContent;

]]></artwork>
          <t>Challenge-based application messages are encoded, authenticated and encrypted
much like MLS private messages using the CBAMPrivateMessage struct.</t>
          <artwork><![CDATA[
struct {
    opaque group_id<V>;
    uint64 epoch;
    opaque authenticated_data<V>;
    opaque encrypted_cbam_sender_data<V>;
    opaque cbam_encrypted_cbam_private_message_content<V>;
} CBAMPrivateMessage;
]]></artwork>
        </section>
        <section anchor="content-encryption">
          <name>Content Encryption</name>
          <t>Content to be encrypted is encoded with a CBAMPrivateMessageContent and the
Additional Authenticated data is encoded with a CBAMPrivateContentAAD. The key
and nonce used for encryption are derived from the encryption_secret and the
challenge C using the challenge-based secret tree as described in
<xref target="forward-secure-kdf"/>.</t>
          <artwork><![CDATA[
struct {
  opaque application_data<V>;
  CBAMFramedContentAuthData auth_data;
  opaque padding[length_of_padding];
} CBAMPrivateMessageContent;

struct {
  opaque group_id<V>;
  uint64 epoch;
  opaque cbam_authenticated_data<V>;
} CBMAPrivateContentAAD;

aead_key = aead_key[C]

aead_nonce = aead_nonce[C]
]]></artwork>
        </section>
        <section anchor="sender-data-encryption">
          <name>Sender Data Encryption</name>
          <t>The encrypted_cbam_sender_data is obtained by encrypting the CBAMSenderData
using keys derived from the cbam_sender_data_secret. This secret is exported
using the safe API's forward-secure exporter function MLS-FS-Exporter using the
label "CBAM Sender Data Secret" and an empty context. Other than that, the same
method is used to encrypt sender data as for standard application messages.</t>
          <artwork><![CDATA[
cbam_sender_data_secret = MLS-FS-Export("CBAM Sender Data Secret", "", KDF.Nk)

ciphertext_sample = ciphertext[0..KDF.Nh-1]

sender_data_key = ExpandWithLabel(cbam_sender_data_secret, "key",
                      ciphertext_sample, AEAD.Nk)
sender_data_nonce = ExpandWithLabel(cbam_sender_data_secret, "nonce",
                      ciphertext_sample, AEAD.Nn)
]]></artwork>
        </section>
        <section anchor="forward-secure-kdf">
          <name>Forward Secure KDF</name>
          <t>A consequence of the secret tree structure in MLS is that deriving the key/nonce
for a given application message requires knowing the leaf node of the client.</t>
          <t>The symmetric ratchets in MLS require performing as many (KDF and storage)
operations as application messages are being skipped. The challenge-based secret
tree (CBST) described in this section avoids these issues. Like the secret tree
in MLS, it consists of a binary tree of secrets. However, leaves are indexed by
challenges instead of leaf nodes which means the tree now has depth KDF.Nh.</t>
          <t>Nodes in the CBST are identified by the string encoding the path from the root
to the node. The root is identified by the empty string "". If a node is
identified by string <tt>N</tt> then its left child is identified the string <tt>N||0</tt> and
the right child by the string <tt>N||1</tt>. Each node is assigned a secret. The root
is assigned the cbam_encryption_secret which is exported from the MLS session
using the safe API's FS-Export function. All other nodes in the CBST are
assigned a secrety by applying ExpandWithLabel to its parents secret with
appropriate labels.</t>
          <artwork><![CDATA[
cbst_encryption_secret = MLS-FS-Export("CBST", "", KDF.Nh)

cbst_tree_node_[""]_secret = cbst_encryption_secret

cbst_tree_node_[N]_secret
        |
        |
        +--> ExpandWithLabel(., "CBST", "left", KDF.Nh)
        |    = cbst_tree_node_[left(N)]_secret
        |
        +--> ExpandWithLabel(., "CBST", "right", KDF.Nh)
             = cbst_tree_node_[right(N)]_secret
]]></artwork>
          <t>The key and nonce for a KDF.Nh octet long challenge C are derived from the
secret for leaf node identified by C.</t>
          <artwork><![CDATA[
aead_key[C] = ExpandWithLabel(cbst_tree_node[C]_secret, "CBST", "key", KDF.Nh)

nonce_key[C] = ExpandWithLabel(cbst_tree_node[C]_secret, "CBST", "nonce",
KDF.Nh)
]]></artwork>
          <t>The same deletion schedule applies to the CBST (including the
cbst_encryption_secret) as for the secret tree in MLS.</t>
        </section>
      </section>
      <section anchor="rotation-of-authentication-key-material">
        <name>Rotation of authentication key material</name>
        <t>If the design of the AS specifies the use of cross-group authentication key
material, emulator clients must coordinate the rotation of said key material in
the emulation group to avoid multiple emulator clients rotating a key at the
same time. Details depend on the design of the AS.</t>
      </section>
      <section anchor="example-protocol-flow">
        <name>Example protocol flow</name>
        <t>Virtual clients can, for example, be used by users with multiple devices. Here,
each device acts as an emulator client that emulates the virtual client which
represents Alice towards other users.</t>
        <t>A group with Alice and Bob would thus still only have two members, regardless of
the number of clients Alice and Bob have.</t>
        <t>Each of Alice's devices would thus keep the state of one emulator client, as
well as the virtual client jointly emulated by all of Alice's clients.</t>
        <t>If one of Alice's devices wanted to update its key material to achieve
post-compromise security, it would first perform a commit in the emulation
group, both to signal the action to other emulator clients and to update the key
material from which the randomness for the virtual client is sampled. From the
updated emulation group, the emulator client would then export the randomness to
perform an update in each group in which Alice (through the virtual client) is a
member.</t>
        <t>Alice's other clients would receive and process the commit in the emulation
group. Using the information included about the virtual client operation, they
also update their virtual client state.</t>
        <t>Bob (or other members in the higher level group) will only see the update in the
higher-level group, which they can simply process with their (virtual) clients.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security considerations</name>
      <t>TODO: Detail security considerations once the protocol has evolved a little
more. Starting points:</t>
      <t>Some of the performance benefits of this scheme depend on the fact that one can
update once in the emulation group and “re-use” the new randomness for updates
in multiple higher-level groups. At that point, clients only really recover when
they update the emulation group, i.e. re-using somewhat old randomness of the
emulation group won’t provide real PCS in higher-level groups.</t>
    </section>
    <section anchor="privacy-considerations">
      <name>Privacy considerations</name>
      <t>TODO: Specify the metadata hiding properties of the protocol. The details depend
on how we solve some of the problems described throughout this document.
However, using a virtual client should mask add/remove activity in the
underlying emulation group. If it actually hides the identity of the members may
depend on the details of the AS, as well as how we solve the application
messages problem.</t>
    </section>
    <section anchor="performance-considerations">
      <name>Performance considerations</name>
      <t>There are several use cases, where a specific group of clients represents a
higher-level entity such as a user, or a part of an organization. If that group
of clients shares membership in a large number of groups, where its sole purpose
is to represent the higher-level entity, then instead emulating a virtual client
can yield a number of performance benefits, especially if this strategy is
employed across an implementation. Generally, the more emulator clients are
hidden behind a single virtual client and the more clients are replaced by
virtual clients, the higher the potential performance benefits.</t>
      <section anchor="smaller-trees">
        <name>Smaller Trees</name>
        <t>As a general rule, groups where one or more sets of clients are replaced by
virtual clients have fewer members, which leads to cheaper MLS operations where
the cost depends on the group size, e.g., commits with a path, the download size
of the group state for new members, etc. This increase in performance can offset
performance penalties, for example, when using a PQ-secure cipher suite, or if
the application requires high update frequencies (deniability).</t>
      </section>
      <section anchor="fewer-blanks">
        <name>Fewer blanks</name>
        <t>Blanks are typically created in the process of client removals. With virtual
clients, the removal of an emulator client will not cause the leaf of the
virtual client (or indeed any node in the virtual client’s direct path) to be
blanked, except if it is the last remaining emulator client. As a result,
fluctuation in emulator clients does not necessarily lead to blanks in the group
of the corresponding virtual clients, resulting in fewer overall blanks and
better performance for all group members.</t>
      </section>
    </section>
    <section anchor="emulation-costs">
      <name>Emulation costs</name>
      <t>From a performance standpoint, using virtual clients only makes sense if the
performance benefits from smaller trees and fewer blanks outweigh the
performance overhead incurred by emulating the virtual client in the first
place.</t>
    </section>
  </middle>
  <back>






  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA6U825LbxpXv/RVdStVqJkvScnYrVTuOUxlLo4liS1bMsfzg
co2bQHOIDAgwaHAo2smWfyNVyc/5S/bc+gKgOfLu6sGWQKD79Lnf+sznc9VX
fW0v9Osvlvpd1fV7U+vndWWb3imzWnX2AX5791yVbdGYLbxYdmbdz+/bzapr
7+fb2s0f+LN5wZ/Nnz1ThentXdsdL3TVrFulql13oftu7/rfPHv2X89+o0xn
zYVe2mLfVf1R3dvjoe3KC/2q6W3X2H7+ArdRyvWmKW9N3Taw9dE6tasu9Ld9
W8y0a7u+s2sHfztu8S/fKWX2/abtLpSea9jZXeg/LfRlfbCN0vDHbk1VX2iD
D/7S/sFszQ9tsyjabXz/84X+nI9GX/CRP2+bzpSDH9ruzjTVD6av2uZCv920
tqne66/+7UW60T19txBc/aE0vXGbrmrsorRxy68W+qt2Zbs+2fErs9sYW6c/
/KIdK9uv/9Dxxx19S8dT8/lcm5XrO1MAUm82ldNA0P0W6KVL64quWlmnjd5a
wF+p+43pAU11e3B6u6/7aldb4hAhse5b2HFfA5W1UUL/5AVAuvZP+clkNf68
7dIl/9JWTV8f1c50fVVUO1y+arRpaOm7rt3v9L4pbQeQuqq5g2Vqa9YL/cLu
bFPCE902ALzFM1V3jW7X+C9ldru6KghzsxFcThew/MbWO72pSosIMEgn2LTU
1XbXtQ9W72y3brutaQq7YFxuq7KsrVK/Qobt2nJf4OKIWcYTfAc82tZ6bYqq
rno4CezUbrf7RgDRK9sfrG08HDN92NguOa+i8860NcXGIxHI1tldZx38w5Z6
daTDIg4QfYdNBa9Wvd60denop11XPSAWQb7UFv7SVaZeAMzwY8ICsDe+2u5a
Z+mzpiUQAX1mTEdijcopoZVnAwLGCI3guzF5/fHoNKMfVYQX4NQeTt3Ywjpn
uiMeDhhXG35pCNGCsb4H0HPwjvmurFxfNbBYwncrm6JV0UkS/hrz4EKTAAF7
oq7CXd0G9Fkpp9/aLQie21Q7hewDXIWS1diDPpijBkbSCT/S/iCXwEB7QA+t
AMhCpsxwn0KujMzq92OWRbAAweu1hdMx53usjHm+JHlxqjbdnQUiAq037QFZ
B85F0MFpzpy1+scfU2D//vdzQPc3hMVi7wB4W2yQo2HpDWDaNnd4WADSc5MB
rm+KzgIPumJjt3agW4wKDJPTLFneQ9SMFAQYB1CPett2VgUquQWK543ttlXT
1u3dESRXLNuFvmyOibqCNYp6T/pjyrdj3OHpwHjVoHbl0QIW/soGu4mrp4sf
NogIZxELQwYHZAMxRXSY4WBVc0dcPR+ZY1jWr4g8xMKONP7AyowcWBfRo1v4
IjkciSNgn1dD1KKckXYCeq49G40lbq6vPJ4mwDGR2ro2q7YjvXeo+o1sPNH6
FVpmforoH5N8ETdK9TUJLLwEj0fkQdj+aKvOdMWG+JJ4AcEDrNrO1GJBSVek
dgXYiJEg4iv7IHQVge43gj1pb79hZruwxhYE3tTOa69w1KHZi8iqHmxUqVP+
D0oKUYWGTQOVJ5sPBUIQP32PUHVNX4R1CQJCVuY5ouxsus65viatAcCMwE1N
A3JRpLm+ZmV1aht6Dgtes+rlI/DLS9wMV5t+de2NEzkySAG9xEMu96vABRl8
EXua8Xo5LAJEEXXLPSjmD66bruHRI9yBhuvLF19epDoKgYdPUcBLuwLkLfQ3
9uef/gEAuRYUfbVFPwI1bckm/Oef/gk6vgPf2lr380//mqnVvkddUpAlh11N
4AE0BoVx1pG9d5t2Dxqi2LSspwnExu7BR6zJC13ol6A3mvYwA8MAMLg8fUGY
SNNeJnZCqXcjrSnSVx9Z9T/uB5I5TewoaolUWL0zMVVNYw/JuLGrSKYb/Beg
L1gmOKzrcUviT8BN6qZU4FKC+cbVR1Ayj3X2Dp52SnhNdGXqthELVHCo9tDw
/kpNfNWBd/qI0SZH1Tyg8QUb36HjxMYedVB7sA+2m5G81LUn8ymCwWvstZJr
4rbwiTLbdt+Q4wBOR7exEPAgGyJAExqhDSwguDCwXV1t0b8lXwZdBvXjj8kj
9hh+9Ss9ZghcO/Vs1Kv1Y/7jaaUIIBDrguyzyDIBFAIeTlIYQGpQRBEP4Kag
j+mNSrsHn7y628irh1YlIMILjV1XaGPUl0w63A62LR+l29bcW1ZZG1y6m9dA
Kq+E9RnwdrTlU272quycyWQ7dN9dj4dCUjXioiI6keXUCHEou/AWyN1mLAuB
vGOTe0nQKghXQEDfQ3iOO21bEBSUwBZQIuQWN9IzcrP3cjCwgjPSVCBw4KYg
W6ZkZ3e4DjqRhQiUODvaSl327OMY9BxB+81yaJrSUxiRf5+H34EbveuZNcSm
65hDhNQcUYhnFg6OLDdkIz4vRilwlDH9gxmkz5KzgVT8EeJIiAGdWKiM4hTO
JPaFDcjvz8rkumu3ougjMlWG5Uiva/veIHlnoMW2EKSAOhq6LqLNwjZskg8V
HJDYaYVUcNWqth4d061Y/Yqa9PH7rkSzppagI+BpfSRlTgHWWMkejLcHwGUk
CBAN3nGIPNjNh8qdhZiAsUGAYgCTYRcJI3FVTCXA2oe2edrjkQyep28VxjcY
27FkjgFz7OdaD9EMTTxYC0tW2WLQL34wypHsQ7I8hoQiIWAF4INc9IFuOKyL
y1RjV/fMnSNzzFj0PTWRP9RQGEv7ULGi3+xB6DT5C6ANCGo+IL/ilRjB6thI
KTki8xcKpMM9yHxltDRoTZ96Wa33riD/nzGVGvMMV5KiIl95aw2GxYg+8V2n
jJU46U97BWcGn3jNogu4RyQx1n24FvgCNZmcCOQARYbSJJjMYN1tDwr1auJx
JmrM6iew7JMgHE0579s5cqcF7XbckTKAHSkPiTAVQS1hHoCsCupQ0prkHOT0
7w15t3Bc0pAgxOTpEVP5gH2keZ3kUfVdCyj04CWOBaEBmXGQGNMjMIH0yAcL
MsZ5c/RBPTST/FsNTjQoU1mSkPJBahL5a5+EMivMnFHyxzbA5AXSCQ5UIUu1
ClkWRLE3dYgsRpoto1IK8nlXFmyblW/PqgWcuGoAvQDyOaqjqrYh6ri3dhek
QbTXSdbxCcfpGbN260DQdJi7pcAb9mezcNOBCOxMR8om2gYJF1DDtGjFKAy0
71Gjuf3WitAcLLuJGDAAagtwUCq3JVNWit9JGQHymvAR0h4lBhjDYBaKdC6y
aZAUpb5hpKSJK7RMEj3A++j8jC1fyidF28HKu5a1SpZrgK1JDxP0fQuhDxqG
vZNod5INYsMQNNQsaPWMKuW0EYshMoY/dzw1b6Qk2kennZwkcFpIu2BSJWv2
SY16brlczr2sq+TLNOf1CP+jAxEl0qYmhkKsL6JfPUh6TiKFduvTLkavgS1T
H52sLfp2lLJkSs8Uhz3ovkydfY60ts7WD7DsyEHIORjEw1fvMTsKUJGD4fPL
IOKgXRpmTolSOO2Imqkj+0s+IciuX0AM6Jld3C0SnCC1BNkdO2pou84loSuW
fJDWJkgwhUO5nxjeqbOmbXwZ6zxk2VDETRLMQ3QAS/x1X3WUqmrSXJpHBzqq
iiNyAgN8Jaz36BctfgPqjWWeg+DREpQK2gKliLVNVQrqlEedaPG98ziNWRVk
zr/urSO+XHvl5D1NCXoxrw8Ky7HbdojSNU6i6T8CN8ykFBAw49P1B1GiOf2f
zcFPHDafRyetolhsuwfEBC19gmbJacMJx8LItpIhxNNyhMx5tQnSngJzFxQv
SAYgw8wqJAYfj88Ay2h83L7gZBJDjetC+Kd3tSnIImXToAKv6D3MOjLbkF4l
izMtjmQzsxhNRtXGh1Ielrz6wvD8UsBi1mCrG4hM7mUmWCLRc7jO5/b41hT3
7CWCYWF0UZRg0Hw522edRTpvIICUL4ZCr5ghUCc+xhVDLMyQjXaYIgsuVrXd
2rIC3KmAHWJUrMqgOWQxIMPIKyZnGqkzLHw5NIi2STJsTRsNNYkpqtIzf+Tz
gTJNNCiF7DlvAQHLfB6o4tUbQgPHNwFxSlSIV1hVs6734J16IxqjWNKCx3xi
nvy10zpv/PZA1wluspqFURPYvnIb9jY89MAydKJUs/jojg4FWEWxJtYJRB1J
MRdEXJ45nAJnqS0qisiFP5KYnDRlKDHg+vAa4jfhjeh8teTxuwssLV2ewE1Q
aeR6CGVYtYb6pkAMq9zQ88OJVVhDTMW+s4Q15LmcChPvjWCvOtcL3JQSGmU7
ELkpvaNACl9RKvaYT2WJaSr3xG0++XZOpBO/itemIiGn1B9jpZgLzqJLl7BS
0WMKAT0GLK8qn9PK4RBWg8+6yj6MF/ScTjYAy6sQdA2NM2unmkq+nj9AdnGt
chSCQ4zno0Ep00gw1wfAyUr4BAHBmnipAUaUldLSSuSASaUbFgEv2tNQIkCJ
rUi8gktPNk/wPUaKSpEyB3XZGlZaqTY/oV6Jzut9RwSUvJ7XL5icrop9zVnD
om07cMeluFewB+o7H8b5M9Q5J9xJKTPGT8BoabQrz7OWheMgw8fzmeNcKcbr
hO0epIJlA1OTvjSYqepcs/wm+YznYrmGiKVQGUtSbUSClUSOtAtMvK4/IRR1
dc/VTb/QbOpQvePgC97qgeFI9jGdPm6bOfqa2UwDPkFwC6aDy4XGEPHYmpPC
5JwzR41zE6/WsDmZwFC8X7J5JseLc93XbPdDMt+FUhmij2zmO12FQtb1U6em
1bd3C3gZC6ik9J4F0g3fdEnpmkouKJdJRSZ+F4EATH8Gwn4dKyrALZTf/jhT
BYRjwt+a5HtflEZcpjVN/frr5Q3Ivtt30uZwHVwBAAUQrBIgfC1H2lEYPa9e
OPLHJtS54h2Y5L6fZMIVVATFbgKHYa0XyXcKokA41Wb8wasX+mzfVBA3aLNt
kTMy6Wtc85zPoWKwjL7ozlTdIlgsAk38inczCqBhffzOv0vOT2yCghCZlI/r
GW60siaaGXhCeVY4zhXVJChkezDg/aIOGiHoKbUSIMNUDZWlcKXdMYQNVMsA
uajbQjrVXE9KYY2MxvERNYEgcmt6A9U2eQleaxf7DjMyWEuR3gr49GvRfJgy
7Ukccy1O5FMoTBFj3o4X8bWKNNMiqeUWaDnw/asuHOfdU9lpoa4yOBC2Dl0H
g16Od/oM5PIv2CCEuYaYzVGUWTueU9nL3HMrBlKVdfZCv/VRo1figi3UMnB4
9hVi04uidAvXeSQm8jVgVkHYIrRf1eAAxr2YT8T04Bs+B808AYow5BCwgl0X
nOASzA37qpIs700rNp3MVeJ8X08QXLHNCyhGx5J09533Lfn4M32F/sG+KcSy
8mPxeU0Sxl8vqNcosBDJL/HOFaIEVTY6GxWy5zZ2dvgFUWIEbRadgZ5aBVBn
FGTe0dd4v2s7+s5ZW3KeXl0LT0vO6WTzDRsoVHpUDY61Ng8w2uQBlrCSHTFF
6iVgywufP0QQV6yYvr16o//89dXy5tWXby70Kwq+kUmxP8xWDxzQoNLMVJsZ
1QyB8hxI+iJPcUl3uD36IqFlKqlcckKug3CQ2+WSUr8vR6wsFY3pIC+Ww8Ik
ByI+Ky0bK+AUi24zB4zXkduHjVzY9Uzefk7Pv+NkiTeWaP8c+ZVwgj24tscd
Ix5EbT7ST2og6hmfQfqb0MmQjkckOiFeCuOD7jDMfFxjA3fV36Jofn71GkWU
2CY6idK8iL1koQQyfl19Yc36TVsmL4OTsrn1TCYJv6+Jz97CL/491gKp0VFo
SBy1sHJjrHGYqGp12bISBhUXbG56GmL28/Da6ghapeFtRHsBL4F66SigrM0K
/M80mJAuO1w7ShylodgjpCwWfcbkf7H86HKpX1iQh3pS1k1cX2nDWdlQ2zF3
TYsCTtHPzhYV8DCKPi7kCwywNELi+XKQmU+6QTj7i+FCxXzvib+1KJMQtHLg
TJ0wbX2hL3MJYP+RzzlMW3FDL+QstlKOoiJwMvYhUEfYExbi6APA+TO9RMnp
XhJRXO/gr93R9XbL8EgGNQdv3wI8IYqKBcxsuwPw0tlljeHf3UYf2u7egOhh
aY38cIgZpk17fm3kgLC6FNiaUIDAiM1bjRi2aB/rdDZkYhfnxDGXZbYGLJ0x
ScaxLDlxny1GYPu38V3NIUeX5MJU0hMe04kCvkDnuGEd1Ug+pSCpW1pPguIt
vDVgk9H+omIGi71YziSj0m25KI3E8x9KwfRE0kmi4RNJl6TaE1NCwyP7UiYq
7QeqfajB7yFqF1SPU62ZQo4otJlK9aM807YvkNK+iIfRUqx0I57JTxqA4CWP
QSzZNoDnU8+dBdeBfGikHODvYLpyTnVgi4kQ4OqltRo3A4K0nFhmbXL0oXtU
Ktz+jX0PjIsBECfahOAoS99mmE9ZUT9W0s+aS6CvhWFVmsKL/dJcHSrQA+jH
mcGYOEjzn+J7zZR9X9gd7UCllODQdAl3GXdsik3Xgn/h6iMr7qXIb861UNRe
PqiCRgWAbYNsAmFl9gQHePRE9LULJUyJrZu+o9Foicfgy48a9Iw4cqL6mHwu
nV6hHQZdtAoik4cWbTn2BmCkA4dbo1gmNUTgC5eASD2m8g+f+cQEO0aXgCGQ
4q2vGaB9wDrzpNYYSTF0mOD/igL/MUcLKTFhxE1EMTlSjhNDMbxeqGDSOuud
7BGKqGfWd0ZmqYcF3Xt0a6j7jP3rlU/77Wp0XuGQoNtet51t2YCC7x6UfsEq
H9/uD1LJU3iaROkl+TqfqAt08n3Lf92DTmRl5KuBEBaUR0WSTsRjVnzu71TM
VwaVVeZQidflSSikkySla+sH1qO+5zMGXOhNkpKfrqtih23S2kL+HDK6Z8YQ
8Ewh7VpgUjjH1/JKoqOQ69mJAgaVf5+lKp/DkDWXgxoqMl2+fXUOQm1Ch/4o
F5IIEzcOILsET1o+GXWUqdC/hUomLMe5kg7kCgQ1nMzfh4lH9fEs9xVi5YtU
ua/Y6ytyUMP3lB7b7djo+KZgAXs/RRIocvX5i5d4DaiuMDRM0D06sAdt+PX8
vlxj+62+CQZQJR08ouqlsCiS5H8UmsemO78Kt7JJpoR83uSArCwuL1/kOpA8
w7qWLR7KE/YIuZCvUAlIIkfCdAv9sqJ89oyBowybnJaPVvhUj8qw4gSGVYsx
Ruz/SxrE8HXPgFvslwJ5JD+92NhyX5MYe4tIl1MDCEILwEKD+oVySCTHiSDr
yDMgrp4PmyyQfUR4kp6WaDAROQiG6EZeAbGMt9e59UAZrSvpSKG+KrqoE69t
UT4SnRplUVPsjpz0o1sBD3x9oBy0WhfCFbEeJtdHKYeMcFLyJu7AhHM+Ahto
pCRWT7e/24Ob49MipleoeJMVo4+BEK6SBEa15pYihJ9xlmiWrcfsTAnT0jO7
a4vNLJLXxPxSQrikI4m/YnClAYCzf7hQvFIUC54D/fMIp8a2S9BMPq2Cuonz
l3t48B+/ycFWYBO/7WLrPkKyIE/Z/0SpTogH6+oHFvZnfNkV6ziiZ9h1sBP9
JYhc+P5Av+ShM1j2psiJV6RQiJ3alQOLx92uEL3tuEs0NmGg20no8M4d4Y5S
6cAr+1raR9bgqQLzAJb/G/4owUA8+Sf8nIRqIiKpLKVi5PTl1eWLxZt7dLso
Vylavy16zKiEmzaJmptjmm2h36A/RK4Actmu3fnrCUHWn4vTFCJixRk0uVJa
2vf+yKMbaKnLxp24PYdJkoBWGXr7+I2E3Hs3vbkLCXD+VLB7JleF4ZV912Am
hPmLAjTjNuEuqzh+1CSSlBVnKUIpixeS55MznoJMSfsDqBw7LrJ5R9DvgvJ2
Nu7P8gsntTKJpagDuD4GIrMX46X0ZmyYMMe2J7XvA6MikC41Y1XfNrf+p3Vl
axCEaJeGptBN3P0RBxH4Y15RUbW8XM7R+oe4fEpyLll4mfWCwSkt/aPSUiE2
9e/olt94r9+HEp0/0yfwjcgV0u+W6IcPX18+H5DvFsj3ifq7zq6rUhCyb2jZ
1T/O7J/KNR7EUI0qEs1/8rt3v0dApjBEUnwqqFxcvd8BNs+GZJhNvp1pfPnN
5lwUCtrv1yKNLzuzRUFWQ7Nnm/2WU5WStiztmtoX4K1Dxa4KYI6U8kjpq2wG
O0dLQkH4mg4e0MWS6AkG+Pjs8vWSnn0yIIfWb2UwwTtwvHDLB/n/p3pbu4+f
fUIvfQMwv2SQEfxbBp9/w6XfcgbJY0USSrcCvgcA3J/X/skUlZeD1vMxRkP+
t4s+6aA1lmY0cJnvwwj1+FQffaSXcifkCUbyeFDNJ3VP9KvLN5d4W6WC3fmi
/oOp9+DmIpY//m2CliFWhTbM1VWZkOa3/8kKF/8daSLkSjk7OVp5i2eTRTKc
H35lLCNL2pJ4txnK3i8g9WlCT5ZmndjQjyzVIsxBeDPw3Hy2HKLqo1/rZXXX
fFP1my8wV362mOknuc+ezLKrnetffxTREioDp/CBTPYC8DUE4v946pOrE/mI
Lh6Iy5Sez/0SwoS/IKoP2aS2RBU1YA8uQfgsjtpiioVy1Tx3hHO7YZ1oUDKC
yzjJaJtTPD3l6g+zcHgjwHxbrMz2VnRW7k36ffT6SMncCmESyg8Pl+ocT8yr
JFfin3GiOmbFKufx7hvop2v7b/2lmuga6QHlRUs9tqJnJfBCKZbCEhcum4Tj
lPBLrhcl6ZfYBh1rb0mhahAO6+cJM4xDjzSANS6MBEKnXOXzCqdtVFZZ/ULx
CYvs+K7Ktwgk/Nqub+XJd3lyRyH7XyvmlOlOcDHu+PpyQjLYzVhTUrnzU+3/
+u3z7+Q5E1F+oX/gb5EvxRwQEq4GebzHpAUZql2hw84h7bDZMLEzuK4Kieic
RzpaWXhHCujCE8i+nKsrVRr5ri3m5J66cfEhJPbW+4abGLBWDT7Ylf8hrKK4
zEoGYIAMrpA/4QQE5oN3/dEbmoX+knx0SkKgvz+L2RrJPyRZLp/IkliFRztx
Bidkbx5zwU6gCIg6ONXZyTOAfXsiLuX9Ofil1Q6Ax3PcSpj6qY7Pvn22WLD3
Of8YmCjdl3mMfdhoPk+AB5vC+09mpFSnfyZAzHwcfD7Y0/PvL9+Vvvjf79uk
zvZLyestmZ8AH9jsidV6yiMUoQ87VVpxhFLFfUiVFNaI6T3XhkQn9QkbzZ19
uWRZ6Ju9b+Se3UZuzTfYxzC4jeL7co/bLRaGCw2RS7Gx3HOAsMhiviFKejC3
WFw480Ge69sONj5XSZeKcaedg5UlP/m+wowy2468UlecIX7+2fLmfKDYpWnN
SqfRQ1vxEC6H4avbYyPNF+hXjFCt+FCcMwcowVvmSrFeQSyM9+dxPyz+cMUt
aUcA/D0I+BSqkP5KE4RVnGwQcO3CXB4jGQraAMhC9eLS7sCmstAAId7QFxK3
45l5N74gXCU5wL7jyA0Msycv9qRE5di1ba+k9ItwyL1ceEqR92RFVlKy7pMn
1CprmFtw+sHgfXnr+zffc6KMbxuuMR1b1eVo/QTc79/87W/PvqeKH4FIJXf+
ZngufPHj76UEITBIVyh6kDoqejlo+nMwDVOvQvJG0SREfFFPJXAoWrCsnQjK
MliGBfWbcAW/yRFOTUCmljfK0eMOI8XkCyt8czZYMGrPmXT3JCre9ZmjZjT8
8iZV5xtU5/gt8uMtwn/77ZMn38Xv8wtPP3rjvwlq82+Zv/37fP77iSbm8Inh
QgZKYAsr4H8EmGRTfPvszfkjW39wQ2K/zI46vyO9nm4pCVvWyzp6vaybeVXO
xOoau5NTVzbnBfuCOn4fVfVQ8p57qifeWtbCpbDDO9HE+dOTgY2cQKD/vxb0
tnOYfrrxZYZMJYoG9YVrTyQ0Z3GUHXn/WRY8HxSxhrUrX7TSX7V9vCc2nBOQ
VvTDrIDhZIHLpe9dk/yrXFUuuta5ufRATVYNMyon/d3ShTa8SgGqK8JIXR7D
IXiNynWLYCoJjd0jM6h4Xd9loP0gDz+EZuH7+mQOQ3bqKKDA3xxkRy/OBK3b
Q3bQy/gikQSAwLZ4o1hudMdJljzXQy7rcmlcBnkYyp1lr3kkLbY2N06TVXy8
j+FAR9NskBadMhdHidEAs8vQDwuQ8Ysox5+1K2ltoKtCrg9jY/gG26GNUzU6
ewcL19j8Q6Mu0tElHjfDlXEN2PtKZhfSj09dmHOSbIzDG3yllpv98RLQZESS
cQqbqvLzRXV20ilf6fBbhzYVFAa5KTgBy1BpLbb1o6Ua8Cu1VtKVMrVrXT/H
PkhQbZWLAz74FiQdkOtYvsc+vTgxYHp/e5JK3lh5xJxZzWWNwl8TPtEfbpoU
XnGgVWwMQ70bS1ZcOmuQkPmWsbSCGAZoSHd5Oe1kjMcYX5Qmn4k9kPHOfRjZ
hczvMS3NwqM6G3PVWb/pqPlzCvA5DzYMF7w9SYeNxX6KB7Uz+OGn3My2sY+T
JV4fsTptS5JqWpn0J41QGaIEnpyhqAg3aNQffSBXRhQK0Bk2w/fppKjBCCed
tDSe6zjyyY9TiljtT8w6CUxxpAq9wx6WeOHFd6ICkOOiHl/282PBOb4ofTzk
eydZ+cahN8O3qDGB/XmvcDFOsA/cCGV0XfV9bWn8yUIve8Ot3DTHBW/yLuny
G6vw3PQ3/g1ZmefZDk1AHP2EagAv/Qi2CKoT/YvIMz//9E+8h+nszz/9i2MO
exiLlEyfwQgsWIFsc+6lwECHmsWrXA3dCJWLoQW2uNEUCEWUSsR82lW8AFwR
fDzGYmsPdEZk/AijdOCMj3dom59/+kcfGnJpfOrb50tEx6n7npRrK05xwFIa
WblSLhO7ZSwVuvkWaBovqHg+4HCnHJhuJb2vB+mUk7uP4UNspUvzoaIsWCqT
EdpJh6Jv0hoLIDf6b427xxbuj2QaBY39QS4WcaL55hzdjPBIEWWVlLc3lRTc
xcftw3W3ZP6sGrso6T0C8FHQ+mlv/QaYSCrfw5YUQQvTKZGQCa3CdASHmOGW
6zCBVPpdww2HySToxAUxQy0jh/X3ynjwi1wClxtVqP3TifmEvHiBRyX70G3c
MNeGJ5ShmsDrGOOZhnFMO37Yole377BpFgNouUllw3i4DNAzCfgl0XF68jHd
oDtikwFmEQIUOY0EzjJhkZii8tqpx/ZwmigLArmr2yMqP3K/NQ8X5wtngp1r
P5+V7S61eeUmAQEhaGKhDKYLAyXHg+2kbYHWSWdfAIJwFAolfkYXMWapCSLx
a3vuVsueWrq1eSimvsH5tzSdzvhZs7rboxctt22ZbOkdcCczIn4heOy6ru0h
mk1v6CDYLHmA5MYagHU8J5P25mZJvGU8Gt4mVweqH/Du6OJuMROfIUxwwryU
jFVrDw1d1Me3VTpwVjxctBJoOAKAeOkgXG+l+ZvI3Sk+qYVuvQZsDIadAoim
Ri06CkqSqUFGv/2zz/pzahdEsuplHCL78mn+MuRUkcbe3Kw7zuqivj4Dzqpk
7JuMjX1J+F7VprkH8n5G/+eJVMed3IH0dyrFuHovI1DWD4vBSyuIUH9nacB2
w9FQE7fTzx2JHe6UYBCDN74ZEqdBYoqXsxBNxoujoco8xIKILLOrFB0XC7/x
DgPPyKKNcWIxz4zLXBfim9LSOTdT6xqz4mFq6USiy9byVCg/CwO78pGdCRLG
dtqk5nluMM1tfKNqJtvjT/Axi0xLFqD2i2IKc2Xp4lBuHOxgLhoZmqtgDFGG
gBde8niu9Guq6IjPkx8/Qx4QDykALe18m2h2zC/HNzJ1lwdsk15bJywZJgZP
Vgmjh0HusPeOS3VB3eeiI/EgMa5TpIYW6n8Ack9ZIKFnAAA=

-->

</rfc>
