<?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.17 (Ruby 3.3.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-mahy-mimi-room-policy-01" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.22.0 -->
  <front>
    <title abbrev="MIMI Room Policy">Room Policy for the More Instant Messaging Interoperability (MIMI) Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-mahy-mimi-room-policy-01"/>
    <author fullname="Rohan Mahy">
      <organization>Rohan Mahy Consulting Services</organization>
      <address>
        <email>rohan.ietf@gmail.com</email>
      </address>
    </author>
    <date year="2024" month="October" day="21"/>
    <area>Applications and Real-Time</area>
    <workgroup>More Instant Messaging Interoperability</workgroup>
    <keyword>room policy</keyword>
    <abstract>
      <?line 35?>

<t>This document describes a set of concrete room policies for the
More Instant Messaging Interoperability (MIMI) Working Group. It describes
several independent properties and policy attributes which can be combined
to model a wide range of chat and multimedia conference types.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://rohanmahy.github.io/mimi-room-policy/draft-mahy-mimi-room-policy.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-mahy-mimi-room-policy/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        More Instant Messaging Interoperability Working Group mailing list (<eref target="mailto:mimi@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/mimi/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/mimi/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/rohanmahy/mimi-room-policy"/>.</t>
    </note>
  </front>
  <middle>
    <?line 42?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The MIMI architecture <xref target="I-D.ietf-mimi-arch"/> describes how each room
has an associated policy. Providers offer a "policy envelope"
of supported and allowed policy settings, from which the creator of a room
selects a specific room policy. The room policy might further allow
individual participants to make specific choices (for example, allowing
but not requiring read-message notifications), while constraining other
choices (for example, prohibiting self-deleting messages). Individual
users can examine the room policy to determine if it is consistent with
policies they accept either before or immediately on joining a room.
<xref section="4.4" sectionFormat="of" target="I-D.ietf-mimi-arch"/></t>
      <t>Making rooms interoperable across existing clients is challenging, as rooms
and clients can support different policies and capabilities across vendors
and providers. Our goal is to balance the policy and authorization goals of
the room with the policy and authorization goals of the end user, so we can support a broad range of vendors and providers.</t>
      <t>Each room is owned by one provider at a time. The owning provider controls the range of acceptable policies. The user responsible for the room can further choose among the acceptable policies. Users (regardless if on other providers) can either accept the policies of the room or not. However we want to make it as easy as possible for clients from other providers to comply with the room policy primitives without enumerating specific features or requiring all clients implementations to present an identical user experience.</t>
      <t>Configurable Role-based access control with permissions. An example
scheme is described in the Appendix.</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>Role:
A long-lived position reflecting the privilege level of a participant in a room. Possible values are owner, admin, regular-user, visitor, none, or outcast. A role closely maps to the MUC concept of affiliation, not the MUC concept of role.</t>
      <t>Occupant:
A user that has at least one client in the corresponding MLS group, and a role of owner, admin, regular-user, or visitor.</t>
      <t>Room ID:
An identifier which uniquely identifies a room.</t>
      <t>User ID:
An internal identifier which uniquely identifies a user.</t>
      <t>Nickname:
The identifier by which a user is referred inside a room. Depending on the context it may be a display name, handle, pseudonym, or temporary identifier. The nickname in one room need not correlate with the nickname for the same user in a different room.</t>
      <t>Client ID:
An internal identifier which uniquely identifies one client/device instance of one user account.</t>
      <t><strong>Persistent vs. Temporary rooms</strong>:
A temporary room is destroyed when the last occupant exits whereas a persistent room is not destroyed when the last occupant exist. As MLS has no notion of a group with no members, a persistent room could consist of a sequence of distinct MLS groups, zero or one of which would exist at a time.</t>
      <section anchor="moderation-terms">
        <name>Moderation Terms</name>
        <t>Knock:
To request entry into a room.</t>
        <t>Ban:
To remove a user from a room such that the user is not allowed to re-enter the room (until and unless the ban has been removed). A banned user has a role of "outcast". Typically this action is only used in an open or semi-open room. It is distinct than merely removing a user from an administered group.</t>
        <t>Kick:
To temporarily remove a participant or visitor from a room. The user is allowed to re-enter the room at any time.</t>
        <t>Voice (noun):
The privilege to send messages in a room.</t>
        <t>Revoke Voice:
To remove the permission to send messages in a room.</t>
        <t>Grant Voice:
To grant the permission to send messages in a room.</t>
        <t>Moderator:
A client whose user has a role of admin or owner in the room. A moderator can ban users, and (when allowed in the room) can grant and revoke voice, kick individual clients, and grant access (ex: in response to a knock).</t>
      </section>
    </section>
    <section anchor="room-capabilities">
      <name>Room Capabilities</name>
      <t>Membership-Style:
The overall approach of membership authorization in a room, which could be open, members-only (administrated), fixed-membership, or parent-dependent.</t>
      <t>Open room:
An open room can be joined by any non-banned user.</t>
      <t>Members-Only room:
A members-only room can only be joined by a user in the occupant list,
or who is pre-authorized. Authorized users can add or remove users to the
room. In an enterprise context, it is also common (but not required) for
users from a particular domain, group, or workgroup to be pre-authorized to
add themselves to a Members-Only room.</t>
      <t>Fixed-Membership room:
Fixed-membership rooms have the list of occupants specified when they are created. Other users cannot be added. Occupants cannot leave or be removed, however a user can remove all its clients from the associated MLS group. The most common case of a fixed-membership room is a 1:1 conversation. This room membership style is used to implement Direct Message (DM) and Group DM features. Only a single fixed-membership room can exist for any unique set of occupants.</t>
      <t>Parent-dependent room:
In a parent-dependent room, the list occupants of the room must be a strict subset of the occupants of the parent room. If a user leaves or is removed from the parent room, that user is automatically removed from any parent-dependent rooms of that parent.</t>
      <t>Multi-device vs. Single-device:
A multi-device room can have multiple simultaneous clients of the same user as participants in the room. A single-device room can have a maximum of one client per user in the room at any moment.</t>
      <t>Knock-Enabled vs. Knock-Disabled:
In a knock-enabled room, non-banned users are allowed to programmatically request entry into the room. In a knock-disabled room this functionality is disabled.</t>
      <t>Moderated vs. Unmoderated:
An an unmoderated room, any occupant can send messages to the room. In a moderated room, only occupants who have "voice" can send messages to the room.</t>
    </section>
    <section anchor="room-policy-format-syntax">
      <name>Room policy format syntax</name>
      <section anchor="membership-related-policy">
        <name>Membership-related policy</name>
        <t>The <tt>membership_style</tt> of a room can be one of the following values:</t>
        <ul spacing="normal">
          <li>
            <t>open</t>
          </li>
          <li>
            <t>members-only (default)</t>
          </li>
          <li>
            <t>fixed-membership</t>
          </li>
          <li>
            <t>parent-dependent</t>
          </li>
        </ul>
        <artwork><![CDATA[
enum {
  reserved(0)
  open(1),
  members-only(2),
  fixed-membership(3),
  parent-dependent(4),
  (255)
} MembershipStyle;
]]></artwork>
        <t>An open room allows any unbanned user. A members-only room allows only
invited or preauthorized users to join. A fixed-membership room (which can
be used for DMs or Group DMs) has a list of authorized users set at creation
time that cannot be added to. A parent-dependent room always has a strict subset of the participants of its parent room.</t>
        <t>If the membership_style is <tt>parent-dependent</tt> the <tt>parent_room_uri</tt> <bcp14>MUST</bcp14> be set with the room ID of the parent. Otherwise the field is zero-length.</t>
        <t>If <tt>multi_device</tt> is true (the default), the MLS group may contain multiple clients per user. If false only a single client can be an MLS member at one time.</t>
        <t>If <tt>knock_allowed</tt> is true, a non-participant can send a knock requesting access to the target room. If false, a user cannot. This option can only be enabled if the membership_style is members-only. The default is false.</t>
        <t>If <tt>moderated</tt> is true, the room supports granting and revoking voice. The default is false.</t>
        <artwork><![CDATA[
enum {
  false(0),
  true(1)
} bool;

struct {
  MembershipStyle membership_style;
  Uri parent_room_uri<V>;
  bool multi_device;
  bool knock_allowed;
  bool moderated;
  bool persistent_room;
  bool password_protected;
  ...
} RoomPolicy;
]]></artwork>
        <t>If persistent_room is false, the room will be automatically deleted when the corresponding MLS group is destroyed (when there are no clients in the group). If persistent_room is true, the room policy will remain and a client whose user has appropriate authorization can create a new MLS group for the same room. (There is not a 1:1 correlation of MLS group to room ID in a persistent room.)</t>
        <t>If password_protected is true, the room requires a passcode or passphrase when a client of a new user requests access to the GroupInfo used to join a group. The default is false.</t>
      </section>
      <section anchor="pre-authorized-users">
        <name>Pre-authorized users</name>
        <artwork><![CDATA[
enum {
  reserved(0),
  system(1),
  owner(2),
  admin(3),
  regular_user(4),
  visitor(5),
  banned(6),
  (255)
} Role;

struct {
  Role target_role;
  /* preauth_domain consists of ASCII letters, digits, and hyphens */
  opaque preauth_domain<V>;
  /* the remaining fields are in the form of a URI */
  opaque preauth_workgroup<V>;
  opaque preauth_group<V>;
  opaque preauth_user<V>;
} PreAuthPerRoleList;

struct {
  ...
  PreAuthPerRoleList pre_auth_list<V>;
  ...
} RoomPolicy;
]]></artwork>
        <t>In members-only rooms, it is convenient to pre-authorize specific users--or users from specific domains, workgroups/teams, and groups--to specific roles. The workgroup, group, and user are expressed as a Uri. The domain is expressed in US-ASCII letters, digits, and hyphens only. If the domain is internationalized, the Internationalized Domain Names <xref target="RFC5890"/> conversion <bcp14>MUST</bcp14> be done before filling in this value.</t>
        <t>Note that the system role is used to authorize external proposals for operations for other users. For example, the system role can be used to authorize a provider to remove clients from groups when the corresponding user account is deleted.</t>
      </section>
      <section anchor="delivery-and-read-notifications-pseudonyms">
        <name>Delivery and Read notifications, Pseudonyms</name>
        <artwork><![CDATA[
enum {
  optional(0),
  required(1),
  forbidden(2)
} Optionality;

struct {
  ...
  Optionality delivery_notifications;
  Optionality read_receipts;
  bool pseudonymous_ids;
  ...
} RoomPolicy;
]]></artwork>
        <t>The delivery_notifications value can be set to "forbidden", "optional", or "required". If the value is set to "optional", the client uses its local configuration to determine if it should send delivery notifications in the group.</t>
        <t>The read_receipts value can be set to "forbidden", "optional", or "required". If the value is set to "optional", the client uses its local configuration to determine if it should send read receipts in the group.</t>
        <t>The format for delivery notifications and read receipts is described in Section 5.12 of <xref target="I-D.ietf-mimi-content"/>.</t>
        <t>If pseudonymous_ids is true, clients in the MLS group are free to use pseudonymous identifiers in their MLS credentials. Otherwise the policy of the room is that "real" long-term identifiers are required in MLS credentials in the room's corresponding MLS group.</t>
      </section>
      <section anchor="link-logging-history-and-bot-policies">
        <name>Link, Logging, History, and Bot policies</name>
        <sourcecode type="tls"><![CDATA[
struct {
  bool on_request;
  Uri join_link;
  bool multiuser;
  uint32 expiration;
  Uri link_requests;
} LinkPolicy;

struct {
  Optionality logging;
  Uri logging_clients<V>;
  Uri machine_readable_policy;
  Uri human_readable_policy;
} LoggingPolicy;

struct {
  Optionality history_sharing;
  Role who_can_share<V>;
  bool automatically_share;
  uint32 max_time_period;
} HistoryPolicy;

struct {
  opaque name<V>;
  opaque description<V>;
  Uri homepage;
  Role bot_role;
  bool can_read;
  bool can_write;
  bool can_target_message_in_group;
  bool per_user_content;
} Bot;

struct {
  ...
  bool discoverable;
  LinkPolicy link_policy;
  LoggingPolicy logging_policy;
  HistoryPolicy history_sharing;
  Bot allowed_bots<V>;
  ...
} RoomPolicy;
]]></sourcecode>
        <section anchor="link-policies">
          <name>Link policies</name>
          <t>If discoverable is true, the room is searchable. Presumably this means the the only way to join the room in a client user interface is to be added by an administrator or to use a joining link.
Inside the LinkPolicy are several fields that describe the behavior of links.If the on_request field is true, no joining link will be provided in the room policy; the client will need to fetch a joining link out-of-band or generate a valid one for itself. If present, the URI in link_requests can be used by the client to request an invite code. The value of join_link is empty and the other fields are ignored.If the on_request field is false, the join_link field will contain a joining link. If the link will work for multiple users, multiuser is true. The expiration field represents the time, in seconds after the start of the UNIX epoch (1-January-1970) when the link will expire. The link_requests field can be empty.</t>
        </section>
        <section anchor="logging-policies">
          <name>Logging policies</name>
          <t>Inside the LoggingPolicy, the logging field can be forbidden, optional, or required. If logging is forbidden then the other fields are empty. If logging is required, the list of logging_clients needs to contain at least one logging URI. Each provider should have no more than one logging client at a time in a room. The machine_readable_policy and human_readable_policy fields optionally contain pointers to the owning provider's machine readable and human readable logging policies, respectively. If logging is optional and there is at least one logging_client then logging is active for the room.</t>
        </section>
        <section anchor="chat-history-policies">
          <name>Chat history policies</name>
          <t>Inside the HistoryPolicy, if history_sharing is forbidden, this means that clients (including bots) are expected to not to share chat history with new joiners, in which case who_can_share is empty, automatically_share is false, and max_time_period is zero.
Otherwise who_can_share is a list of roles that are authorized to share history (for example, only admins and owners can share). The values of none and outcast cannot be used in who_can_share. If automatically_share is true, clients can share history with new joiners without user initiation. The history that is shared is limited to max_time_period seconds worth of history.</t>
        </section>
        <section anchor="chat-bot-policies">
          <name>Chat bot policies</name>
          <t>Inside the RoomPolicy there is a list of allowed_bots. Each of which has several fields. The name, description, and homepage are merely descriptive. The bot_role indicates if the chat bot would be treated as a system-user, owner, admin, regular_user, or visitor.
The can_read and can_write fields indicate if the chat bot is allowed to read messages or send messages in the MLS group, respectively. If can_target_message_in_group is true it indicates that the chat bot can send an MLS targeted message (see Section 2.2 of [I-D.ietf-mls-extensions]) or use a different conversation or out-of-band channel to send a message to specific individual users in the room. If per_user_content is true, the chat bot is allowed to send messages with distinct content to each member. (For example a poker bot could deal a different hand to each user in a chat).Users could set policies to reject or leave groups with bots rights that are inconsistent with the user's privacy goals.</t>
        </section>
      </section>
      <section anchor="extensibility-of-the-policy-format">
        <name>Extensibility of the policy format</name>
        <t>Finally, The extensibility mechanism allows for future addition of new room policies.</t>
        <artwork><![CDATA[
enum {
  null(0),
  boolean(1),
  number(2),
  string(3),
  jsonObject(4)
} ExtType;

struct {
  opaque name<V>;
  ExtType type;
  opaque value<V>;
} PolicyExtension;

struct {
  ...
  PolicyExtension policy_extensions<V>;
} RoomPolicy;
]]></artwork>
        <t>foo</t>
      </section>
    </section>
    <section anchor="role-based-access-control">
      <name>Role-Based Access Control</name>
      <t>With Role-Based Access Control, the room policy defines a list of roles and the capabilities associated with each role.</t>
      <artwork><![CDATA[
enum {
  reserved(0),
  canAddParticipant(1),
  ...
  (65535)
} Capability;

struct {
  int role_index;
  opaque role_name<V>;
  opaque role_description<V>;
  Capability role_capabilities<V>;
  int minimum_participants_constraint;
  optional int maximum_participants_constraint;
  int minimum_active_participants_constraint;
  optional int maximum_active_participants_constraint;
} Role

struct {
  Role target_role;
  /* preauth_domain consists of ASCII letters, digits, and hyphens */
  opaque preauth_domain<V>;
  /* the remaining fields are in the form of a URI */
  opaque preauth_workgroup<V>;
  opaque preauth_group<V>;
  opaque preauth_user<V>;
} PreAuthPerRoleList;

struct {
  Role roles<V>;
  ...
  PreAuthPerRoleList pre_auth_list<V>;
  ...
} RoomPolicy;
]]></artwork>
      <section anchor="capability-categories">
        <name>Capability Categories</name>
        <section anchor="membership-capabilities">
          <name>Membership Capabilities</name>
          <ul spacing="normal">
            <li>
              <t>canAddParticipant</t>
            </li>
            <li>
              <t>canRemoveParticipant</t>
            </li>
            <li>
              <t>canAddOwnClient</t>
            </li>
            <li>
              <t>canRemoveSelf</t>
            </li>
            <li>
              <t>canAddSelf</t>
            </li>
            <li>
              <t>canCreateJoinLink</t>
            </li>
            <li>
              <t>canUseJoinLink</t>
            </li>
          </ul>
          <t>These actions are subject to role constraints described below.</t>
        </section>
        <section anchor="moderation-capabilities">
          <name>Moderation Capabilities</name>
          <ul spacing="normal">
            <li>
              <t>canBan</t>
            </li>
            <li>
              <t>canUnBan</t>
            </li>
            <li>
              <t>canKick</t>
            </li>
            <li>
              <t>canRevokeVoice</t>
            </li>
            <li>
              <t>canGrantVoice</t>
            </li>
            <li>
              <t>canKnock</t>
            </li>
            <li>
              <t>canAcceptKnock</t>
            </li>
            <li>
              <t>canChangeUserRole</t>
            </li>
            <li>
              <t>canCreateSubgroup</t>
            </li>
          </ul>
          <t>These actions are subject to role constraints described below.</t>
        </section>
        <section anchor="breakouts">
          <name>Breakouts</name>
          <ul spacing="normal">
            <li>
              <t>canSendDirectMessage</t>
            </li>
            <li>
              <t>canTargetMessage</t>
            </li>
          </ul>
        </section>
        <section anchor="message-capabilities">
          <name>Message Capabilities</name>
          <ul spacing="normal">
            <li>
              <t>canSendMessage</t>
            </li>
            <li>
              <t>canReceiveMessage</t>
            </li>
            <li>
              <t>canReportAbuse</t>
            </li>
            <li>
              <t>canReactToMessage</t>
            </li>
            <li>
              <t>canEditReaction</t>
            </li>
            <li>
              <t>canDeleteReaction</t>
            </li>
            <li>
              <t>canEditOwnMessage</t>
            </li>
            <li>
              <t>canDeleteOwnMessage</t>
            </li>
            <li>
              <t>canDeleteAnyMessage</t>
            </li>
            <li>
              <t>canStartTopic</t>
            </li>
            <li>
              <t>canReplyInTopic</t>
            </li>
            <li>
              <t>canSendDirectMessage</t>
            </li>
            <li>
              <t>canTargetMessage</t>
            </li>
          </ul>
          <t>The Hub can enforce whether a member can send a message and not fanout application messages. Other capabilities can only be enforced by other clients.</t>
        </section>
        <section anchor="asset-capabilities">
          <name>Asset Capabilities</name>
          <ul spacing="normal">
            <li>
              <t>canUploadImage</t>
            </li>
            <li>
              <t>canUploadVideo</t>
            </li>
            <li>
              <t>canUploadAttachment</t>
            </li>
            <li>
              <t>canDownloadImage</t>
            </li>
            <li>
              <t>canDownloadVideo</t>
            </li>
            <li>
              <t>canDownloadAttachment</t>
            </li>
            <li>
              <t>canSendLink</t>
            </li>
            <li>
              <t>canSendLinkPreview</t>
            </li>
            <li>
              <t>canFollowLink</t>
            </li>
          </ul>
        </section>
        <section anchor="adjust-metadata">
          <name>Adjust metadata</name>
          <ul spacing="normal">
            <li>
              <t>canChangeRoomName</t>
            </li>
            <li>
              <t>canChangeRoomSubject</t>
            </li>
            <li>
              <t>canChangeRoomAvatar</t>
            </li>
            <li>
              <t>canChangeOwnName</t>
            </li>
            <li>
              <t>canChangeOwnPresence</t>
            </li>
            <li>
              <t>canChangeOwnMood</t>
            </li>
            <li>
              <t>canChangeOwnAvatar</t>
            </li>
          </ul>
        </section>
        <section anchor="real-time-media">
          <name>Real-time media</name>
          <ul spacing="normal">
            <li>
              <t>canStartCall</t>
            </li>
            <li>
              <t>canJoinCall</t>
            </li>
            <li>
              <t>canSendAudio</t>
            </li>
            <li>
              <t>canReceiveAudio</t>
            </li>
            <li>
              <t>canSendVideo</t>
            </li>
            <li>
              <t>canReceiveVideo</t>
            </li>
            <li>
              <t>canShareScreen</t>
            </li>
            <li>
              <t>canViewSharedScreen</t>
            </li>
          </ul>
        </section>
        <section anchor="disruptive-policy-changes">
          <name>Disruptive Policy Changes</name>
          <ul spacing="normal">
            <li>
              <t>canChangeRoomMembershipStyle</t>
            </li>
            <li>
              <t>canChangeOtherPolicyAttribute</t>
            </li>
            <li>
              <t>canDestroyRoom</t>
            </li>
            <li>
              <t>MLS specific
              </t>
              <ul spacing="normal">
                <li>
                  <t>update</t>
                </li>
                <li>
                  <t>reinit</t>
                </li>
                <li>
                  <t>PSK</t>
                </li>
                <li>
                  <t>external proposal</t>
                </li>
                <li>
                  <t>external commit</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="role-constraints">
        <name>Role constraints</name>
        <t>Minimum and maximum number of each role.</t>
      </section>
    </section>
    <section anchor="operational-policy">
      <name>Operational policy</name>
      <t>Section 7 of the <xref target="I-D.ietf-mls-architecture"/> defines a set of operational
policy considerations that influence interoperability of MLS clients. MIMI
explicitly address a handful of the issues in the document by taking a position on ordering (Proposals referenced in a Commit need to be received before the Commit; the Commit entering a new epoch needs to be received before any other messages in that epoch), privacy of handshake messages (handshakes can be a PublicMessage or SemiPrivateMessage), and GroupInfo storage (committers need to provide a valid GroupInfo to the Hub). The rest of these issues are described here. Just because a topic is listed does not mean that a room needs to take a position; nor different rooms on a Hub need to have different policies for these items.</t>
      <section anchor="some-mls-related-policy-that-could-be-tied-to-a-room">
        <name>Some MLS-related policy that could be tied to a room</name>
        <ul spacing="normal">
          <li>
            <t>any mandatory or forbidden MLS extensions.</t>
          </li>
          <li>
            <t>which proposals are valid to have in a commit, including but not limited to:
            </t>
            <ul spacing="normal">
              <li>
                <t>when, and under what circumstances, a reinitialization proposal is allowed.</t>
              </li>
              <li>
                <t>when proposals from external senders are allowed and how to authorize those proposals.</t>
              </li>
              <li>
                <t>when external joiners are allowed and how to authorize those external commits.</t>
              </li>
              <li>
                <t>which other proposal types are allowed.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>when members should commit pending proposals in a group.</t>
          </li>
          <li>
            <t>when two credentials represent the same client.</t>
          </li>
          <li>
            <t>how long to allow a member to stay in a group without updating its leaf keys before removing them.</t>
          </li>
          <li>
            <t>When and how to pad messages.</t>
          </li>
          <li>
            <t>When to send a reinitialization proposal.</t>
          </li>
          <li>
            <t>How often clients should update their leaf keys.</t>
          </li>
          <li>
            <t>Whether to prefer sending full commits or partial/empty commits.</t>
          </li>
          <li>
            <t>Whether there should be a required_capabilities extension in groups.</t>
          </li>
          <li>
            <t>minimum and maximum lifetime of KeyPackages</t>
          </li>
          <li>
            <t>if last resort KeyPackages are allowed</t>
          </li>
          <li>
            <t>how long to store resumption PSK (how much time and how many epochs)</t>
          </li>
          <li>
            <t>minimum and maximum number past epochs to keep</t>
          </li>
          <li>
            <t>how long to keep unused nonce and key pairs for a sender</t>
          </li>
          <li>
            <t>maximum number of unused key pairs to keep</t>
          </li>
          <li>
            <t>maximum number of steps that clients will move a secret tree ratchet forward in response to a single message before rejecting it</t>
          </li>
          <li>
            <t>tolerance to out of order app messages</t>
          </li>
          <li>
            <t>tolerance to out of order handshake messages</t>
          </li>
          <li>
            <t>handshakes may be which of PublicMessage, PrivateMessage, or SemiPrivateMessage.</t>
          </li>
          <li>
            <t>if external joiners are allowed</t>
          </li>
          <li>
            <t>if external proposals are allowed
            </t>
            <ul spacing="normal">
              <li>
                <t>if so, who can submit</t>
              </li>
              <li>
                <t>which member(s) are responsible for submitting pending proposals</t>
              </li>
            </ul>
          </li>
          <li>
            <t>how a joiner gets access to the ratchet_tree</t>
          </li>
        </ul>
      </section>
      <section anchor="not-relevant-to-mimi-between-client-and-its-provider">
        <name>Not relevant to MIMI (between client and its provider)</name>
        <ul spacing="normal">
          <li>
            <t>how many KPs to keep active</t>
          </li>
          <li>
            <t>how group IDs are constructed</t>
          </li>
          <li>
            <t>which ciphersuites are acceptable.</t>
          </li>
        </ul>
      </section>
      <section anchor="areas-for-future-works">
        <name>Areas for future works</name>
        <t>Which credential types are allowed/required</t>
        <t>How to protect and share the GroupInfo objects needed for external joins.</t>
        <t>If an application wishes to detect and possibly discipline members that send malformed commits with the intention of corrupting a group's state, there must be a method for reporting and validating malformed commits.
MLS requires the following parameters to be defined, which must be the same for two implementations to interoperate:</t>
        <t>Which media types are required to send and required to understand in MIMI.</t>
        <t>What Additional authenticated data, can/should be sent unencrypted in an otherwise encrypted message.</t>
        <t>Application-level identifiers of public key material (specifically the application_id extension as defined in Section 5.3.3 of [RFC9420]).</t>
      </section>
    </section>
    <section anchor="some-types-of-rooms-with-rbac">
      <name>Some types of rooms with RBAC</name>
      <section anchor="strict-administrator-policy">
        <name>Strict administrator policy</name>
        <t>Role levels (low to high capabilities):</t>
        <ul spacing="normal">
          <li>
            <t>banned</t>
          </li>
          <li>
            <t>guest</t>
          </li>
          <li>
            <t>ordinary_user</t>
          </li>
          <li>
            <t>group_admin</t>
          </li>
          <li>
            <t>super_admin</t>
          </li>
        </ul>
        <t>Capabilities per role</t>
        <ul spacing="normal">
          <li>
            <t>banned
            </t>
            <ul spacing="normal">
              <li>
                <t>(no capabilities)</t>
              </li>
            </ul>
          </li>
          <li>
            <t>guest
      - canSendMessage
      - canReceiveMessage
      - canRemoveSelf</t>
          </li>
          <li>
            <t>ordinary_user
            </t>
            <ul spacing="normal">
              <li>
                <t>(everything guest can do, plus:)
                </t>
                <ul spacing="normal">
                  <li>
                    <t>canAddOwnClient</t>
                  </li>
                  <li>
                    <t>canChangeOwnName,Presence,Mood,Avatar</t>
                  </li>
                  <li>
                    <t>canReport</t>
                  </li>
                  <li>
                    <t>canSendLinks</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>canSendImages</t>
              </li>
              <li>
                <t>canSendVideos</t>
              </li>
            </ul>
          </li>
          <li>
            <t>group_admin
      - (everything ordinary_user can do, plus:)
      - canSendAttachments
      - canAddParticipant
      - canRemoveParticipant
      - canBanish - promote
      - canUnBanish
      - canKick
      - canChangeRoomName,Subject,Avatar
      - canPromoteRole(from=[ordinary]; to=[admin])
      - canDemoteRole([from=[admin], to=[ordinary])
      - canDestroyRoom
      - canCreateJoinLink</t>
          </li>
          <li>
            <t>super_admin
            </t>
            <ul spacing="normal">
              <li>
                <t>(everything group_admin can do, plus:)</t>
              </li>
              <li>
                <t>canPromoteRole(from=[ordinary,admin], to=[superadmin])</t>
              </li>
              <li>
                <t>canDemoteRole(from=[superadmin], to=[ordinary,admin])</t>
              </li>
              <li>
                <t>canChangeRoomMembershipStyle</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>Role constraints: must have at least 1 "admin"</t>
      </section>
      <section anchor="cooperative-room-everyone-can-add-and-remove">
        <name>Cooperative room (everyone can add and remove)</name>
        <t>Role levels (low to high capabilities):</t>
        <ul spacing="normal">
          <li>
            <t>banned</t>
          </li>
          <li>
            <t>ordinary_user</t>
          </li>
          <li>
            <t>group_admin</t>
          </li>
          <li>
            <t>super_admin</t>
          </li>
        </ul>
        <t>Capabilities per role</t>
        <ul spacing="normal">
          <li>
            <t>banned
            </t>
            <ul spacing="normal">
              <li>
                <t>(no capabilities)</t>
              </li>
            </ul>
          </li>
          <li>
            <t>ordinary_user
      - canSendMessage
      - canReceiveMessage
      - canRemoveSelf
      - canAddOwnClient
      - canChangeOwnName,Presence,Mood,Avatar
      - canReport
      - canAddParticipant
      - canRemoveParticipant
      - canKick
      - canChangeRoomName,Subject,Avatar
      - canCreateJoinLink
      - canSendLinks
            </t>
            <ul spacing="normal">
              <li>
                <t>canSendImages</t>
              </li>
              <li>
                <t>canSendVideos</t>
              </li>
              <li>
                <t>canSendAttachments</t>
              </li>
            </ul>
          </li>
          <li>
            <t>group_admin
      - (everything ordinary_user can do, plus:)
      - canBanish
      - canUnBanish
      - canPromoteRole(from=[ordinary], to=[admin])
      - canDemoteRole([from=[admin], to=[ordinary])
      - canDestroyRoom</t>
          </li>
          <li>
            <t>super_admin
            </t>
            <ul spacing="normal">
              <li>
                <t>(everything group_admin can do, plus:)</t>
              </li>
              <li>
                <t>canPromoteRole(from=[ordinary,admin], to=[superadmin])</t>
              </li>
              <li>
                <t>canDemoteRole(from=[superadmin], to=[ordinary,admin])</t>
              </li>
              <li>
                <t>canChangeRoomMembershipStyle</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>Role constraints: must have at least 1 "group_admin"</t>
      </section>
      <section anchor="moderated-room">
        <name>Moderated room</name>
        <t>Role levels (low to high capabilities):</t>
        <ul spacing="normal">
          <li>
            <t>banned</t>
          </li>
          <li>
            <t>non-participant</t>
          </li>
          <li>
            <t>guest</t>
          </li>
          <li>
            <t>attendee</t>
          </li>
          <li>
            <t>speaker</t>
          </li>
          <li>
            <t>moderator</t>
          </li>
          <li>
            <t>super_admin</t>
          </li>
        </ul>
        <t>Capabilities per role</t>
        <ul spacing="normal">
          <li>
            <t>banned
            </t>
            <ul spacing="normal">
              <li>
                <t>(no capabilities)</t>
              </li>
            </ul>
          </li>
          <li>
            <t>non-participant
      - canKnock
      - canJoinViaLink</t>
          </li>
          <li>
            <t>guest
      - canReceiveMessage
      - canRemoveSelf</t>
          </li>
          <li>
            <t>attendee
            </t>
            <ul spacing="normal">
              <li>
                <t>(everything guest can do, plus:)
                </t>
                <ul spacing="normal">
                  <li>
                    <t>canAddOwnClient</t>
                  </li>
                  <li>
                    <t>canChangeOwnName,Presence,Mood,Avatar</t>
                  </li>
                  <li>
                    <t>canReport</t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t>speaker
            </t>
            <ul spacing="normal">
              <li>
                <t>(everything attendee can do, plus:)
                </t>
                <ul spacing="normal">
                  <li>
                    <t>canSendMessage</t>
                  </li>
                  <li>
                    <t>canChangeRoomName,Subject,Avatar</t>
                  </li>
                  <li>
                    <t>canSendLinks</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>canSendImages</t>
              </li>
              <li>
                <t>canSendVideos</t>
              </li>
              <li>
                <t>canSendAttachments</t>
              </li>
            </ul>
          </li>
          <li>
            <t>moderator
      - (everything ordinary_user can do, plus:)
      - canAddParticipant
      - canRemoveParticipant
      - canAcceptKnock
      - canBan
      - canUnBan
      - canKick
      - canPromoteRole(from=[attendee]; to=[speaker])
      - canDemoteRole([from=[speaker], to=[attendee])
      - canCreateJoinLink</t>
          </li>
          <li>
            <t>super_admin
            </t>
            <ul spacing="normal">
              <li>
                <t>(everything moderator can do, plus:)
                </t>
                <ul spacing="normal">
                  <li>
                    <t>canDestroyRoom</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>canPromoteRole(from=[attendee,speaker], to=[moderator])</t>
              </li>
              <li>
                <t>canDemoteRole(from=[moderator], to=[attendee,speaker])</t>
              </li>
              <li>
                <t>canChangeRoomMembershipStyle</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>Role constraints: must have at least 1 "moderator"</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>TODO Security</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="I-D.ietf-mimi-arch">
          <front>
            <title>An Architecture for More Instant Messaging Interoperability (MIMI)</title>
            <author fullname="Richard Barnes" initials="R." surname="Barnes">
              <organization>Cisco</organization>
            </author>
            <date day="2" month="April" year="2024"/>
            <abstract>
              <t>   The More Instant Messaging Interoperability (MIMI) working group is
   defining a suite of protocols that allow messaging providers to
   interoperate with one another.  This document lays out an overall
   architecture enumerating the MIMI protocols and how they work
   together to enable an overall messaging experience.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-mimi-arch-00"/>
        </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>
        <reference anchor="RFC5890">
          <front>
            <title>Internationalized Domain Names for Applications (IDNA): Definitions and Document Framework</title>
            <author fullname="J. Klensin" initials="J." surname="Klensin"/>
            <date month="August" year="2010"/>
            <abstract>
              <t>This document is one of a collection that, together, describe the protocol and usage context for a revision of Internationalized Domain Names for Applications (IDNA), superseding the earlier version. It describes the document collection and provides definitions and other material that are common to the set. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5890"/>
          <seriesInfo name="DOI" value="10.17487/RFC5890"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="I-D.ietf-mimi-content">
          <front>
            <title>More Instant Messaging Interoperability (MIMI) message content</title>
            <author fullname="Rohan Mahy" initials="R." surname="Mahy">
              <organization>Rohan Mahy Consulting Services</organization>
            </author>
            <date day="10" month="June" year="2024"/>
            <abstract>
              <t>   This document describes content semantics common in Instant Messaging
   (IM) systems and describes a profile suitable for instant messaging
   interoperability of messages end-to-end encrypted inside the MLS
   (Message Layer Security) Protocol.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-mimi-content-04"/>
        </reference>
        <reference anchor="I-D.ietf-mls-architecture">
          <front>
            <title>The Messaging Layer Security (MLS) Architecture</title>
            <author fullname="Benjamin Beurdouche" initials="B." surname="Beurdouche">
              <organization>Inria &amp; Mozilla</organization>
            </author>
            <author fullname="Eric Rescorla" initials="E." surname="Rescorla">
              <organization>Windy Hill Systems, LLC</organization>
            </author>
            <author fullname="Emad Omara" initials="E." surname="Omara">
         </author>
            <author fullname="Srinivas Inguva" initials="S." surname="Inguva">
         </author>
            <author fullname="Alan Duric" initials="A." surname="Duric">
              <organization>Wire</organization>
            </author>
            <date day="3" month="August" year="2024"/>
            <abstract>
              <t>   The Messaging Layer Security (MLS) protocol (I-D.ietf-mls-protocol)
   provides a Group Key Agreement protocol for messaging applications.
   MLS is meant to protect against eavesdropping, tampering, message
   forgery, and provide Forward Secrecy (FS) and Post-Compromise
   Security (PCS).

   This document describes the architecture for using MLS in a general
   secure group messaging infrastructure and defines the security goals
   for MLS.  It provides guidance on building a group messaging system
   and discusses security and privacy tradeoffs offered by multiple
   security mechanisms that are part of the MLS protocol (e.g.,
   frequency of public encryption key rotation).  The document also
   provides guidance for parts of the infrastructure that are not
   standardized by MLS and are instead left to the application.

   While the recommendations of this document are not mandatory to
   follow in order to interoperate at the protocol level, they affect
   the overall security guarantees that are achieved by a messaging
   application.  This is especially true in the case of active
   adversaries that are able to compromise clients, the delivery
   service, or the authentication service.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-mls-architecture-15"/>
        </reference>
      </references>
    </references>
    <?line 741?>

<section anchor="complete-tls-presentation-language-syntax">
      <name>Complete TLS Presentation Language Syntax</name>
      <artwork><![CDATA[
enum {
  false(0),
  true(1)
} bool;

struct {
  /* a valid Uniform Resource Identifier (URI) */
  opaque uri<V>;
} Uri;

enum {
  optional(0),
  required(1),
  forbidden(2)
} Optionality;

enum {
  reserved(0),
  system(1),
  owner(2),
  admin(3),
  regular_user(4),
  visitor(5),
  banned(6),
  (255)
} Role;

struct {
  Role target_role;
  /* preauth_domain consists of ASCII letters, digits, and hyphens */
  opaque preauth_domain<V>;
  /* the remaining fields are in the form of a URI */
  opaque preauth_workgroup<V>;
  opaque preauth_group<V>;
  opaque preauth_user<V>;
} PreAuthPerRoleList;

enum {
  reserved(0)
  open(1),
  members-only(2),
  fixed-membership(3),
  parent-dependent(4),
  (255)
} MembershipStyle;

struct {
  Optionality logging;
  bool enabled;
  Uri logging_clients<V>;
  Uri machine_readable_policy;
  Uri human_readable_policy;
} LoggingPolicy;

struct {
  bool on_request;
  Uri join_link;
  bool multiuser;
  uint32 expiration;
  Uri link_requests;
} LinkPolicy;

struct {
  opaque name<V>;
  opaque description<V>;
  Uri homepage;
  Role bot_role;
  bool can_read;
  bool can_write;
  bool can_target_message_in_group;
  bool per_user_content;
} Bot;

struct {
  Optionality history_sharing;
  Role who_can_share<V>;
  bool automatically_share;
  uint32 max_time_period;
} HistoryPolicy;

enum {
  null(0),
  boolean(1),
  number(2),
  string(3),
  jsonObject(4)
} ExtType;

struct {
  opaque name<V>;
  ExtType type;
  opaque value<V>;
} PolicyExtension;

struct {
  MembershipStyle membership_style;
  bool multi_device;
  bool knock_allowed;
  bool moderated;
  bool password_protected;
  PreAuthPerRoleList pre_auth_list<V>;
  Uri parent_room_uri;
  bool persistent_room;
  Optionality delivery_notifications;
  Optionality read_receipts;
  bool semi_anonymous_ids;
  bool discoverable;
  LinkPolicy link_policy;
  LoggingPolicy logging_policy;
  HistoryPolicy history_sharing;
  Bot allowed_bots<V>;
  PolicyExtension policy_extensions<V>;
} RoomPolicy;

RoomPolicy room_policy;
]]></artwork>
    </section>
    <section anchor="example-roles-and-permissions-scheme">
      <name>Example Roles and Permissions scheme</name>
      <ul spacing="normal">
        <li>
          <t>Owner</t>
        </li>
        <li>
          <t>Admin</t>
        </li>
        <li>
          <t>Moderator</t>
        </li>
        <li>
          <t>Ordinary-user</t>
        </li>
        <li>
          <t>Guest</t>
        </li>
      </ul>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+1de3Mbx5H/fz/FHv1HQBcAWracxFJeFCnZjEWRR0r2pVwu
eIEdEGvtA9nZJYWolM9yn+U+2fWve54LkJJsXZzU5apyImbn0dPv7ukZTyaT
pCu6Uj1I9y6apkrPm7JYbNJl06bdSqWnTavSk1p3Wd2lp0rr7Kqor6ilU22z
Vm02L8qi26Sj05PTk/30vG26ZtGUe0k2n7fqmmbFhzSYei9ZZJ26atrNg7So
l02S5M2iziqCIG+zZTepstVmUhVVMWlp1GTNoyaf3Et0P68KrYum7jZr6n7y
+PmTNP0ozUrd0EJFnau1ov9Xd3vjdE/lRde0RVbix8nhI/qH9rR3cvH8yV5S
99VctQ+SnEB5kCyaWqta9/pB2rW9Sgjsz5KsVRnNerhe0/pZR6vqNKvz9EJl
5eR5Uam95KZpX161Tb/GNt8NUXvJS7WhcfmDJJ2k2GAqG0yuVd0TLGn63jOm
qeBj71uCB12+xAxor7KipHYg80+F6pbTpr1Ce9YuVtS+6rq1fnBwgG5oKq7V
1HY7QMPBvG1utDrABAcYeFV0q35OQ9tmldWg1MGQUuhWElp1F6zguk9lhmnR
bA08uIP801VXEVMlWd+tmha4o1WWfVkK41xg+vSURlIzAZ/Vxd+YZOGn9IhI
2JcdMHSp2utioTR1V4IkhpB3/6crtEwXTZUkddNWNNE1ESYBs/pfyWQySbO5
7tps0SXJ81WhU2LkviL2S3OlF20xV8QxqVZd2ixT4rFFqzoV0Lyg70bOkveU
s4jS0/QkWDLR6pr6l2kgD+maJ+mwInhYkJpmXUdDeqJVerMqFqt0QaiaK4K1
mhe1ypOuSasmVyVt46bICfasvlK8m1XW8UwVEFqRrGXY4VK1ql4o5kc9FRxV
RZ6XKkk+wmbaJu8XIAwwRtoFuoE5r1OLricUvH79HyeTY6aDMAG+vnkTYHTV
3KQqI2CByGSVYUdppnWzKIjr7N6mUEXXBHOrCV6Ci7awZ7at6mtVEj72EtqJ
7tfrpsVAbCcry+bGTQLagV30OF22RDVBEtQikTIj7QJUZAKIViVtgQm+Voti
WSxC6Z6m2G7QQGi5WnXEwi1N18q6xGF5QTD3RLx1RtRaFGtiB52CDNlL5Wde
rBpwbzoC+6hXWbUu1VgmIXATImlaN13aqr/2RQs+IXDzScVspfAJs4hO2x9j
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
dbcm9ycynLeQXfKRZlg8YfZhtxBfbpEzA1g6CQ44r2aubWDYfqCFOc2F2lvp
KbVnwQmPrTKL4JTD8d3bj+MEt+at2Hbl+sZ8F13hShf8KMYCfAbMxYgsUe8v
uBii2SpZ0uIdFxiZWUKmnEf+e8CQ3r0JhMGfkgVekdEmrlwRCeXYOzCVrFz/
GnibJj9kHE0mrqnKc52ujVa3zieXaeHOqbZnJwu7ixtbE9VJGYvkriTjYouP
dxUmz7YLk7Gi9W7NNR7j2VqdZcHYgmJY15cFZ85cmTiokYuixx0K6g4P2h20
Iano0OISWg4kf6glUaBMpxwc6UhTvGpj40+nHBp/5wPjUk+Q+6r5ksb3+6lk
JKNK4rDWxtSuOzeL4KhrVboKwcytGyYng/I7SXdGFRdy5hGFCbEvfQv+Y3Sz
yLkqUDsPdeMriJKunaajIGuHXFzzEjXhXGsNBssVTESw9xXbCzOJL7MGRPtT
uVm0MHmO4HIYM8ePKDFqTGGNy+oBSshV2uJaYaD5COz4Gp0rzf2V5oLQjISV
r3dJ3P5YqGZum9rD3bDGAUVlbHnHxn0LB1QKpCu0O5aHcl32fLWTYonCnuhA
iUUXYYdHh3Vf2qwhIjgyWiZpKDe3zUkHDsXrK3PU8aNu6rM58DO6j3wibeX5
Zq3eFtGabnxnNYhwWcPb5D/v/7Fl6J2Z/7iLQdnMC4GZaisCXDZNIsUkpZo8
4jtPh3KkdCR3npLkW5Dt1u/bJ3g57jOpbXNow4P4gqGvoGP2MFdry63D3MHp
E2mIwzw/9wfhhj6CjtGvP//8Mz5KcoWtg9RCwUd2JVRTrl4FiOfG7YwDN2+n
Hfz00iPcm+mClRC5Vn01CwsmZu7Ga/cwyFVLfynHuqt/OK14ce89+9uGyUHc
v8/h3uMcjvHD7B4kXn7uwRwcH89nR/J8BTs/H0WFXoMq7sm2kEjbBZ/PbDVT
17ObWq7WhB0vVbl0PfyPI/ZZ/kyuINIs0ka2wzXAJYHNXZhUNxIwPetHOUYP
73x3YdZ7rkh1G4cvuCyyY3OPstqs6//EhQcLPSrm+RKANPCtgOA31ymanfHV
2KCBPM36SsEWsgwEO77s58wrH2aDj2jOl+R72C1dkvmXQl5TxyvNz1nkbJOh
u7gkO/CCSaLhFzheuFaDNpTZHM6Ju20DbeV5E3V6TDaT21FGxi3HfDQXt6EX
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
yILKf7/HnsXeG+PyZK4nsv7J/wJidcAZTW8AAA==

-->

</rfc>
