<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.39 (Ruby 4.0.6) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>


<rfc ipr="trust200902" docName="draft-yuyou-moq-conditional-filtering-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="Conditional Range Filters">Conditional Range Filters for Media over QUIC Transport</title>

    <author initials="Y." surname="You" fullname="Yu You">
      <organization>Nokia</organization>
      <address>
        <email>yu.you@nokia.com</email>
      </address>
    </author>
    <author initials="S." surname="Gül" fullname="Serhan Gül">
      <organization>Nokia</organization>
      <address>
        <email>serhan.guel@nokia.com</email>
      </address>
    </author>
    <author initials="A." surname="Begen" fullname="Ali Cengiz Begen">
      <organization>Networked Media</organization>
      <address>
        <email>ali.begen@networked.media</email>
      </address>
    </author>
    <author initials="A." surname="Sarker" fullname="ANM Zaheduzzaman Sarker">
      <organization>Nokia</organization>
      <address>
        <email>zaheduzzaman.sarker@nokia.com</email>
      </address>
    </author>

    <date year="2026" month="August" day="27"/>

    <area>Web and Internet Transport</area>
    <workgroup>Media Over QUIC</workgroup>
    <keyword>media over quic</keyword> <keyword>range filter</keyword> <keyword>moq</keyword> <keyword>moqt</keyword>

    <abstract>


<?line 56?>
<t>In Media over QUIC Transport (MOQT), subscribers can use Range Filters
to select specific subgroups, objects, or priorities within a subscribed
track. However, these subscription filters are static once established
and can only be modified through explicit subscriber control signaling.
This document proposes an extension to the Range Filter design that
binds conditional evaluation logic directly to specific Range Filter
sets. By introducing dynamic conditions to Range Filter configurations,
a relay can autonomously adapt the intra-track forwarding behavior based
on real-time network conditions, avoiding the round-trip delay of
explicit subscriber update signaling.</t>



    </abstract>

    <note title="About This Document" removeInRFC="true">
      <t>
        The latest revision of this draft can be found at <eref target="https://yuyou.github.io/conditional_filtering/"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-yuyou-moq-conditional-filtering/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Media Over QUIC Working Group mailing list (<eref target="mailto:moq@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/moq/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/moq/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/yuyou/conditional_filtering"/>.</t>
    </note>


  </front>

  <middle>


<?line 68?>

<section anchor="introduction"><name>Introduction</name>

<t>Media over QUIC Transport (MOQT) supports subscription filters in
SUBSCRIBE requests to indicate which objects within a track are to be
forwarded. Range Filters allow subscribers to restrict delivery based on
subgroup identifiers, object identifiers, publisher priorities, or
specific metadata properties.</t>

<t>However, current MOQT subscription filters are static once established.
If a subscriber wishes to change the adaptation policy (e.g., dropping
an enhancement subgroup due to network congestion), it requires a
closed-loop procedure: detecting the throughput drop, computing a new
filter, signaling via REQUEST_UPDATE, and waiting for the relay to apply
it. This reaction delay introduces a risk of temporary overdelivery and
queue build-up.</t>

<t>This document extends Range Filters with conditional logic that allows
relays to evaluate pre-authorized conditions and determine which SetIDs
remain active at runtime. It defines a new RANGE_FILTER_CONDITION
parameter that explicitly binds a specific Range Filter SetID to a
condition. If the condition for a particular SetID is met, the relay
keeps that SetID active in the Range Filter expression; otherwise, that
SetID is ignored. This enables autonomous, relay-side intra-track
adaptation without requiring further signaling from the subscriber.</t>

</section>
<section anchor="conventions-and-definitions"><name>Conventions and Definitions</name>
<t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>

<?line -18?>

</section>
<section anchor="the-inline-rangefiltercondition-parameter"><name>The Inline RANGE_FILTER_CONDITION Parameter</name>

<t>The inline design for conditional filtering embeds all necessary
algorithm configuration fields directly within a new message parameter,
making it a self-contained solution for intra-track adaptation.</t>

<section anchor="relationship-to-existing-setid"><name>Relationship to Existing SetID</name>

<t>Range Filters in MOQT (Section 5.1.3 of <xref target="I-D.ietf-moq-transport"/>)
already define a SetID field (8 bits) within each filter parameter
(SUBGROUP_FILTER, OBJECTID_FILTER, PRIORITY_FILTER,
OBJECT_PROPERTY_FILTER, TRACK_PROPERTY_FILTER). Filter parameters
sharing the same SetID are combined with logical AND, and different
SetID groups are combined with logical OR.</t>

<t>This document does not redefine SetID. RANGE_FILTER_CONDITION references
an existing SetID value to bind conditional evaluation logic to a
specific filter group that was already declared in the same message.</t>

</section>
<section anchor="parameter-definition"><name>Parameter Definition</name>

<t>To enable conditional functionality, this document introduces a new
Message Parameter: RANGE_FILTER_CONDITION. This parameter applies
conditional activation rules to an intra-track filter set identified by
a SetID.</t>

<t>The parameter <bcp14>MAY</bcp14> appear in SUBSCRIBE, PUBLISH_OK, or REQUEST_UPDATE
messages. Multiple instances <bcp14>MAY</bcp14> be present, each referencing a
different SetID. The same SetID <bcp14>MUST NOT</bcp14> appear in more than one
RANGE_FILTER_CONDITION within the same message.</t>

<t>The RANGE_FILTER_CONDITION parameter has the following wire format:</t>

<figure><artwork><![CDATA[
RANGE_FILTER_CONDITION {
  Set ID (8),
  Algorithm ID (vi64),
  Throughput threshold (vi64),
  Set throughput fraction (vi64),
  Activate switching (vi64),
  Set rank (8)
}
]]></artwork></figure>
<t>The fields are defined as follows:</t>

<dl>
  <dt>Set ID (8 bits):</dt>
  <dd>
    <t>Identifies the Range Filter set being made conditional. This value
<bcp14>MUST</bcp14> match a SetID used in at least one Range Filter parameter in the
same message. The field is 8 bits, consistent with the SetID encoding
defined in MOQT Range Filters.</t>
  </dd>
  <dt>Algorithm ID (vi64):</dt>
  <dd>
    <t>Identifies the conditional evaluation algorithm to be used. This
document defines Algorithm 0. Other algorithms <bcp14>MAY</bcp14> be defined in
future specifications.</t>
  </dd>
  <dt>Throughput threshold (vi64):</dt>
  <dd>
    <t>Algorithm 0 specific. The minimum estimated downstream throughput in
kbps required for the relay to keep this SetID active in the Range
Filter OR-combination. When bandwidth is constrained, the relay
determines which conditional SetIDs remain active according to the
bandwidth allocation algorithm (<xref target="bandwidth-allocation"/>).</t>
  </dd>
  <dt>Set throughput fraction (vi64):</dt>
  <dd>
    <t>Algorithm 0 specific. Relative weight for bandwidth allocation,
expressed as an integer 1 &lt;= N &lt;= 10. Each conditional SetID receives
bandwidth proportional to its fraction: <spanx style="verb">target = B_total x fraction /
sum_F</spanx>. Fractions are relative weights, not absolute percentages. For
example, fractions of 6, 4, 3 (sum_F = 13) allocate approximately 46%,
31%, and 23% respectively. This allows conditional SetIDs to be added
or removed without requiring other conditional SetIDs to update their
fractions.</t>
  </dd>
  <dt>Activate switching (vi64):</dt>
  <dd>
    <t>Controls whether conditional evaluation is active for this SetID.
When set to 0, the relay ignores the conditional state for this SetID
and includes it in the base MOQT OR-combination exactly as ordinary
Range Filters do. When set to a non-zero value N, the relay activates
condition-based admission for conditionally bound SetIDs as soon as at
least N RANGE_FILTER_CONDITION entries for this subscription have been
received. Activation takes effect at the next Group boundary.</t>
  </dd>
  <dt>Set rank (8 bits):</dt>
  <dd>
    <t>Degradation priority when estimated bandwidth is constrained,
expressed as an 8-bit unsigned integer in the range 1-255. The default
value is 1. Values of 0 and outside this range <bcp14>MUST</bcp14> result in a
REQUEST_ERROR with error code INVALID_FILTER. Lower values indicate
higher priority (protected from degradation). When bandwidth is
sufficient, all conditional SetIDs remain active. When bandwidth is
constrained, lower-priority conditional SetIDs (higher numeric rank)
are deactivated first, while higher-priority conditional SetIDs
maintain their target allocation.</t>
  </dd>
</dl>

</section>
<section anchor="conditional-set-assignment-design"><name>Alternative 1: Reference Design</name>

<t>The inline parameter design described in <xref target="parameter-definition"/> embeds
all algorithm fields directly in RANGE_FILTER_CONDITION. This produces a
self-contained parameter but duplicates the algorithm parameter
structure that Sender-Side Track Switching (SSTS) <xref target="SSTS"/> defines in
its SWITCHING-SET-ASSIGNMENT parameter, which has an identical set of
fields (Algorithm ID, Throughput threshold, Set throughput fraction,
Activate switching, Set rank).</t>

<t>A more composable design separates the algorithm configuration from the
filter binding. Under this design, a single common parameter
"CONDITIONAL-SET-ASSIGNMENT" carries the algorithm fields and is
shared by both intra-track conditional filtering and inter-track SSTS
switching. RANGE_FILTER_CONDITION is then reduced to a binding that maps
a Range Filter SetID to a Conditional set ID:</t>

<figure><artwork><![CDATA[
CONDITIONAL-SET-ASSIGNMENT {
  Conditional set ID (vi64),
  Algorithm ID (vi64),
  Throughput threshold (vi64),
  Set throughput fraction (vi64),
  Activate switching (vi64),
  Set rank (8)
}

RANGE_FILTER_CONDITION {
  Set ID (8),
  Conditional set ID (vi64)
}
]]></artwork></figure>
<t>CONDITIONAL-SET-ASSIGNMENT replaces the SWITCHING-SET-ASSIGNMENT
parameter currently defined in SSTS. The fields and semantics are
identical; only the name and scope change. For SSTS use, the subscriber
assigns a subscription to a conditional set by including
CONDITIONAL-SET-ASSIGNMENT in SUBSCRIBE or PUBLISH_OK, exactly as it
would have used SWITCHING-SET-ASSIGNMENT. For intra-track conditional
filtering, the subscriber additionally includes one
RANGE_FILTER_CONDITION per SetID to bind each Range Filter group to a
Conditional set ID.</t>

<t>This design has the following properties:</t>

<t><list style="symbols">
  <t>Algorithm parameters are defined once in CONDITIONAL-SET-ASSIGNMENT
and shared across use cases. Multiple RANGE_FILTER_CONDITION entries
can reference the same Conditional set ID if they share algorithm
configuration, or different IDs if they require different thresholds
or ranks.</t>
  <t>RANGE_FILTER_CONDITION becomes a lightweight binding with a fixed,
minimal wire footprint (one 8-bit SetID and one varint).</t>
  <t>A single relay implementation handles both conditional intra-track
filtering and inter-track SSTS switching through the same
CONDITIONAL-SET-ASSIGNMENT evaluation logic.</t>
  <t>Future algorithms defined for SSTS are automatically available for
conditional intra-track filtering without any changes to this
specification.</t>
</list></t>

<t>The trade-off is that the subscriber must include two parameter types
"CONDITIONAL-SET-ASSIGNMENT" and "RANGE_FILTER_CONDITION", rather
than one, and the relay must correlate them. This is a minor
implementation cost relative to the elimination of duplicated parameter
definitions across two specifications.</t>

</section>
<section anchor="conditional-filter-set-design"><name>Alternative 2: Self-Contained Design</name>

<t>The reference-based design maps existing SetIDs to dynamic conditions. A
second alternative is a self-contained design that introduces a new
parameter, CONDITIONAL_FILTER_SET, which explicitly carries a list of
alternative filter configurations for a single subscription.</t>

<t>In this design, the relay interprets the provided configurations as
mutually exclusive alternatives. The relay monitors the specified metric
and autonomously selects and applies exactly one configuration from the
set whose condition is satisfied.</t>

<section anchor="parameter-definition-1"><name>Parameter Definition</name>

<t>The CONDITIONAL_FILTER_SET parameter (Type 0x44) has the following
structure:</t>

<figure><artwork><![CDATA[
CONDITIONAL_FILTER_SET {
  Parameter Type (vi64) = 0x44,
  Set ID (vi64),
  Switching Metric (vi64),
  Switching Offset (uint8),
  Configuration Count (vi64),
  Configuration (..) ...,
}
]]></artwork></figure>
<t><list style="symbols">
  <t>Set ID: Uniquely identifies the conditional filter set within the
session scope, allowing it to be updated or removed via
REQUEST_UPDATE.</t>
  <t>Switching Metric: Identifies the relay-observable metric used for
selection, such as throughput (kbps), RTT (ms), or ECN marking rate.</t>
  <t>Switching Offset: Specifies the switching point. A value of 0
indicates an immediate "hard switch." A non-zero value indicates a
"soft switch," where the new configuration is applied starting from a
future Subgroup ID (Current ID + Offset).</t>
  <t>Configuration Count: The number of alternative filter configurations
included in this set.</t>
</list></t>

<t>Each Configuration entry within the set defines a specific threshold and
the filters to apply when active:</t>

<figure><artwork><![CDATA[
Configuration {
  Config ID (vi64),
  Metric Threshold (vi64),
  Filter Parameter Count (vi64),
  Filter Parameters (..) ...,
}
]]></artwork></figure>
<t><list style="symbols">
  <t>Config ID: An identifier for the specific configuration within the
set.</t>
  <t>Metric Threshold: The condition value for the selected Switching
Metric. For throughput, the relay selects the configuration with the
highest threshold that does not exceed the currently observed metric.</t>
  <t>Filter Parameters: A list of standard MOQT filter parameters (e.g.,
SUBGROUP_FILTER, OBJECTID_FILTER) to be applied when this
configuration is active.</t>
</list></t>

<t>Unlike the OR-preserving design, this model uses set-replacement logic.
If RTT is the metric and three configurations are defined with
thresholds of 80ms, 150ms, and 250ms, the relay selects only the one
that matches the current RTT range, stripping all other data</t>

</section>
</section>
<section anchor="summary-of-design-alternatives"><name>Summary of Design Alternatives</name>

<t>This draft explores three distinct architectural approaches for
conditional filtering.</t>

<t><list style="numbers" type="1">
  <t><strong>Inline Design:</strong> Embeds algorithm parameters directly into a new
message parameter that activates or deactivates existing Range
Filter SetIDs based on real-time metrics.</t>
  <t><strong>Reference-Based Design:</strong> Reuses the common algorithm structure
from SSTS by mapping standard Range Filter SetIDs to shared
conditional logic configurations.</t>
  <t><strong>Self-Contained Design:</strong> Defines an independent parameter carrying
an internal list of mutually exclusive filter profiles and their
corresponding metric thresholds.</t>
</list></t>

<t>The <strong>Inline Design</strong> is suggested as the option requiring the <strong>least
changes</strong> to the current MOQT specification. It functions as a <strong>purely
additive</strong> message parameter that references existing <spanx style="verb">SetID</spanx> values
already defined in the base protocol, thereby avoiding the need to
modify existing parameters or reorganize the structures of other
extensions like SSTS.</t>

</section>
</section>
<section anchor="relay-evaluation-and-bandwidth-allocation"><name>Relay Evaluation and Bandwidth Allocation</name>

<t>Most of the text in this section is adapted from Sender-Side Track
Switching for Media over QUIC Transport <xref target="SSTS"/>, specifically the
"Bandwidth Allocation Algorithm" material at
&lt;https://github.com/wilaw/moq-transport/blob/patch-1/draft-ietf-moq-tran
sport.md#bandwidth-allocation-allocation-algorithm&gt;.</t>

<section anchor="general-behavior"><name>General Behavior</name>

<t>With this parameter, the subscriber pre-authorizes the relay to
autonomously adjust intra-track forwarding within the subscribed track.</t>

<t>When RANGE_FILTER_CONDITION entries are present and activate switching
is non-zero, the relay evaluates each conditionally bound SetID at each
permitted switching point (Group boundary) and determines whether that
SetID remains active. The relay then applies the standard MOQT
OR-combination across all active conditional SetIDs together with any
unconditional SetIDs. In other words, RANGE_FILTER_CONDITION changes
whether a SetID participates in the OR expression; it does not change
the meaning of SetID itself.</t>

<t>When activate switching is 0 for all conditional SetIDs, or no
RANGE_FILTER_CONDITION is present, the relay applies the standard MOQT
Range Filter OR-combination behavior unchanged.</t>

</section>
<section anchor="algorithm-0-throughput-based-conditional-set-admission"><name>Algorithm 0: Throughput-Based Conditional Set Admission</name>

<section anchor="relay-state"><name>Relay State</name>

<t>The relay maintains the following state for each subscription that
carries one or more RANGE_FILTER_CONDITION parameters with Algorithm ID
0:</t>

<t><list style="symbols">
  <t><spanx style="verb">B_total</spanx>: Estimated downstream bandwidth capacity for the subscriber
connection. The relay <bcp14>MUST</bcp14> maintain a bandwidth estimate per
downstream subscriber. The measurement interval <bcp14>SHOULD</bcp14> be at least the
Group duration of the subscribed track. The estimate is obtained from
the QUIC congestion control state (e.g., pacing rate, congestion
window, smoothed RTT) and <bcp14>MAY</bcp14> be supplemented by external sources. The
exact mechanism is implementation-specific.</t>
  <t><spanx style="verb">sum_F</spanx>: Sum of all Set throughput fraction values across all
registered RANGE_FILTER_CONDITION entries for this subscription.
Updated when entries are added or removed.</t>
  <t><spanx style="verb">set.threshold</spanx>: The Throughput threshold for each conditional SetID.</t>
  <t><spanx style="verb">set.fraction</spanx>: The Set throughput fraction for each conditional
SetID.</t>
  <t><spanx style="verb">set.rank</spanx>: The Set rank for each conditional SetID.</t>
  <t><spanx style="verb">active_set_ids</spanx>: The set of conditional SetIDs currently admitted
into the MOQT OR-combination for this subscription.</t>
</list></t>

</section>
<section anchor="bandwidth-allocation"><name>Bandwidth Allocation Algorithm</name>

<t>On a periodic update interval or at a minimum at each Group boundary,
the relay executes the following algorithm to determine which
conditional SetIDs remain active:</t>

<figure><artwork><![CDATA[
active_set_ids = {}
reserved_bw = 0
B_available = B_total
for each set in ascending rank order:
  set.target     = B_total x set.fraction / sum_F
  B_available    = max(0, B_total - reserved_bw)
  if set.threshold <= min(set.target, B_available):
    active_set_ids += set.set_id
    reserved_bw += set.threshold
]]></artwork></figure>
<t>The relay then forwards Objects that pass the Range Filters associated
with any SetID in <spanx style="verb">active_set_ids</spanx>, combined using the standard MOQT OR
semantics, together with any unconditional SetIDs. If no conditional
SetID satisfies its threshold, the relay forwards only the unconditional
SetIDs, if any. If the subscription contains no unconditional SetIDs,
the relay <bcp14>MAY</bcp14> forward no Objects; this behavior <bcp14>SHOULD</bcp14> be documented by
the relay implementation.</t>

<t>The rank ordering ensures higher-priority conditional SetIDs (lower rank
value) are admitted first. The use of <spanx style="verb">reserved_bw</spanx> makes admission
monotonic: once a higher-priority conditional SetID has been admitted,
lower-priority SetIDs are evaluated only against the bandwidth that
remains after honoring those earlier admissions. Lower-priority
conditional SetIDs therefore absorb any shortfall by being deactivated
from the OR-combination.</t>

</section>
<section anchor="relay-procedure"><name>Relay Procedure</name>

<t>When the relay receives a subscription with one or more
RANGE_FILTER_CONDITION parameters:</t>

<t><list style="numbers" type="1">
  <t>Register each conditional SetID and its associated Algorithm
parameters.</t>
  <t>Store <spanx style="verb">B_total</spanx>, <spanx style="verb">sum_F</spanx>, <spanx style="verb">set.threshold</spanx>, <spanx style="verb">set.fraction</spanx>,
<spanx style="verb">set.rank</spanx>, and <spanx style="verb">active_set_ids</spanx> as subscription state.</t>
  <t>If activate switching is non-zero and the number of registered
RANGE_FILTER_CONDITION entries for this subscription is &gt;= the
activate switching value, begin active SetID admission by applying
the bandwidth allocation algorithm (<xref target="bandwidth-allocation"/>) at the
next Group boundary.</t>
</list></t>

<t>When a REQUEST_UPDATE is received:</t>

<t><list style="symbols">
  <t>A RANGE_FILTER_CONDITION with Length = 0 removes the conditional state
for the referenced SetID.</t>
  <t>A RANGE_FILTER_CONDITION with non-zero Length replaces the entire
conditional state for the referenced SetID.</t>
  <t>Conditional SetIDs not referenced in REQUEST_UPDATE remain unchanged.</t>
</list></t>

<t>When the subscription is terminated (PUBLISH_DONE or cancellation), the
relay removes all associated RANGE_FILTER_CONDITION state.</t>

</section>
</section>
</section>
<section anchor="example-or-preserving-conditional-layer-admission"><name>Example: OR-Preserving Conditional Layer Admission</name>

<t>A subscriber receives a scalable video track containing three subgroups:
Subgroup 0 (base layer), Subgroup 1 (enhancement layer 1), and Subgroup
2 (enhancement layer 2).</t>

<t>The subscriber defines three SetID groups that remain OR-combined in the
normal MOQT sense. The base layer is always included. Conditional
evaluation determines which enhancement layers stay active at any given
time.</t>

<section anchor="step-1-define-the-range-filters"><name>Step 1: Define the Range Filters</name>

<t>Using the standard MOQT SUBGROUP_FILTER parameter (SetID is 8 bits per
MOQT Section 5.1.3):</t>

<t><list style="symbols">
  <t>SUBGROUP_FILTER (SetID = 0): Range 0-0. Delivers the base layer. This
SetID is unconditional.</t>
  <t>SUBGROUP_FILTER (SetID = 1): Range 1-1. Delivers enhancement layer 1.</t>
  <t>SUBGROUP_FILTER (SetID = 2): Range 2-2. Delivers enhancement layer 2.</t>
</list></t>

</section>
<section anchor="step-2-bind-conditions-with-rangefiltercondition-algorithm-0"><name>Step 2: Bind Conditions with RANGE_FILTER_CONDITION (Algorithm 0)</name>

<figure><artwork><![CDATA[
RANGE_FILTER_CONDITION (SetID=1):
  Algorithm ID           = 0
  Throughput threshold   = 2000  (kbps)
  Set throughput fraction = 6
  Activate switching     = 2
  Set rank               = 1

RANGE_FILTER_CONDITION (SetID=2):
  Algorithm ID           = 0
  Throughput threshold   = 2500  (kbps)
  Set throughput fraction = 4
  Activate switching     = 2
  Set rank               = 2
]]></artwork></figure>
<t>Activate switching = 2 means condition-based admission activates once
both conditional RANGE_FILTER_CONDITION entries are registered. sum_F =
6 + 4 = 10.</t>

</section>
<section anchor="result"><name>Result</name>

<t>The relay applies the bandwidth allocation algorithm at each Group
boundary:</t>

<t><list style="symbols">
  <t>B_total = 7000 kbps: SetID=1 is allocated <spanx style="verb">7000 * 6 / 10 = 4200</spanx>,
which satisfies its 2000 kbps threshold. The remaining budget is 5000
kbps. SetID=2 is then allocated <spanx style="verb">7000 * 4 / 10 = 2800</spanx>, which
satisfies its 2500 kbps threshold. The relay therefore forwards SetID
0, SetID 1, and SetID 2.</t>
</list></t>

<t>Note: The subscriber should set fractions and thresholds such that, at
the expected B_total, each desired layer's threshold is within its
allocated fraction. The example above illustrates the mechanics; real
deployments may calibrate threshold and fraction values so the intended
set of layers remains active at expected bandwidth levels.</t>

<t>In a typical deployment:</t>

<t><list style="symbols">
  <t>B_total = 7000 kbps: The relay keeps SetID=1 and SetID=2 active.
Combined with unconditional SetID=0, subgroups 0, 1, and 2 are
forwarded.</t>
  <t>B_total = 4000 kbps: The relay keeps SetID=1 active but not SetID=2.
Combined with unconditional SetID=0, subgroups 0 and 1 are forwarded.</t>
  <t>B_total = 1500 kbps: No conditional enhancement SetID is admitted. The
relay still forwards the unconditional base layer in SetID=0.</t>
</list></t>

<t>By structuring the SetIDs as independently admitted OR terms evaluated
against bandwidth thresholds, the subscriber eliminates round-trip
signaling delays while preserving the existing SetID combination
semantics.</t>

</section>
</section>
<section anchor="call-flow"><name>Call flow</name>

<t><list style="numbers" type="1">
  <t>A typical SUBSCRIBE workflow for conditional range-filter evaluation.</t>
  <t>A publisher-initiated subscription workflow based on SUBSCRIBE_TRACKS
and Namespace Prefix Matching.</t>
  <t>A publisher-initiated subscription workflow where
RANGE_FILTER_CONDITION is carried in PUBLISH_OK.</t>
</list></t>

<section anchor="typical-subscribe-workflow"><name>Typical SUBSCRIBE workflow</name>

<figure><artwork><![CDATA[
+------------+                               +-------+
| Subscriber |                               | Relay |
+------------+                               +-------+
  |                                              |
  |    SUBSCRIBE (Standard Range Filters,        |
  |               RANGE_FILTER_CONDITIONs)       |
  |--------------------------------------------->|
  |                                              |
  |                  SUBSCRIBE_OK                |
  |<---------------------------------------------|
  |                                              |
  |                              +-----------------------------+
  |                              | 1. Measure B_total          |
  |                              | 2. Evaluate Conditions      |
  |                              | 3. Admit Active SetIDs      |
  |                              +-----------------------------+
  |                                              |
  |    Forward Objects (Active SetIDs)           |
  |<=============================================|
  |                                              |
  ~             Bandwidth Fluctuates             ~
  |                                              |
  |                              +-----------------------------+
  |                              | Group Boundary Re-eval:     |
  |                              | Update active SetIDs        |
  |                              +-----------------------------+
  |                                              |
  |    Forward Objects (Updated Active SetIDs)   |
  |    (w/ PRIOR_SUBGROUP_ID_GAP if skipped)     |
  |<=============================================|
  |                                              |
]]></artwork></figure>
<t><list style="symbols">
  <t><strong>Initial setup</strong>: The subscriber sends SUBSCRIBE with multiple SetID
groups (using standard Range Filters) and binds them using
RANGE_FILTER_CONDITION.</t>
  <t><strong>Continuous evaluation</strong>: The relay autonomously executes the
evaluation loop (measuring throughput, comparing thresholds, and
admitting or deactivating conditional SetIDs).</t>
  <t><strong>Dynamic adaptation</strong>: At the next group boundary, the relay can
deactivate lower-priority conditional SetIDs and, when subgroups are
skipped, uses PRIOR_SUBGROUP_ID_GAP to make intentional omissions
explicit.</t>
</list></t>

</section>
<section anchor="standard-publisher-initiated-subscribetracks-workflow-v19"><name>Standard Publisher-initiated SUBSCRIBE_TRACKS workflow (V19)</name>

<t>The following call flow illustrates a publisher-initiated subscription
workflow based on SUBSCRIBE_TRACKS and Namespace Prefix Matching.</t>

<figure><artwork><![CDATA[
+------------+                +-------+                  +-----------+
| Subscriber |                | Relay |                  | Publisher |
+------------+                +-------+                  +-----------+
  |                               |                            |
  | SUBSCRIBE_TRACKS              |                            |
  | (Track Namespace Prefix)      |                            |
  |                               |                            |
  |------------------------------>|                            |
  |                               | Namespace Prefix Matching  |
  |                               | against authorized tracks  |
  |                               |--------------------------->|
  |                               |<---------------------------|
  |                               | Matched Track List         |
  |                               |                            |
  |                               | PUBLISH (Track A)          |
  |<==============================|============================|
  | PUBLISH_OK (or REQUEST_OK)    |                            |
  |==============================>|============================|
  |                               | PUBLISH (Track B)          |
  |<==============================|============================|
  | PUBLISH_OK (or REQUEST_OK)    |                            |
  |==============================>|============================|
  |                               |                            |
  |<==== Objects (Filtered) ======|============================|
  |    (with PRIOR_GAP prop)      |                            |
]]></artwork></figure>
<t><list style="symbols">
  <t><strong>Discovery and matching</strong>: The subscriber requests a Track Namespace
Prefix on a bidirectional stream using SUBSCRIBE_TRACKS. The relay or
publisher performs Namespace Prefix Matching across known authorized
tracks.</t>
  <t><strong>Publisher-initiated delivery</strong>: For each matched track, the
publisher (directly or through the relay) initiates a new stream and
sends PUBLISH. The subscriber accepts each stream with PUBLISH_OK (or
REQUEST_OK), establishing the subscription.</t>
  <t><strong>Filter refinement</strong>: In this workflow, SUBSCRIBE_TRACKS <bcp14>MAY</bcp14> carry
optional Range Filter and/or Conditional Filter parameters to limit
delivered objects, either statically (fixed ranges) or dynamically
(runtime condition evaluation).</t>
</list></t>

</section>
<section anchor="publisher-initiated-workflow-with-rangefiltercondition"><name>Publisher-initiated workflow with RANGE_FILTER_CONDITION</name>

<t>The following call flow illustrates a publisher-initiated workflow where
the subscriber returns RANGE_FILTER_CONDITION in PUBLISH_OK.</t>

<figure><artwork><![CDATA[
+------------+                +-------+                  +-----------+
| Subscriber |                | Relay |                  | Publisher |
+------------+                +-------+                  +-----------+
  |                               |                            |
  | SUBSCRIBE_TRACKS              |                            |
  | (Track Namespace Prefix)      |                            |
  |------------------------------>|                            |
  |                               | Namespace Prefix Matching  |
  |                               | against authorized tracks  |
  |                               |--------------------------->|
  |                               |<---------------------------|
  |                               | Matched Track List         |
  |                               |                            |
  |                               | PUBLISH (Track A)          |
  |<==============================|============================|
  | PUBLISH_OK                    |                            |
  |   + RANGE_FILTER_CONDITION    |                            |
  |==============================>|============================|
  |                               | Apply returned conditions  |
  |                               | before forwarding objects  |
  |<==== Objects (filtered) ==================================>|
  |                               |                            |
  |                               | PUBLISH (Track B)          |
  |<==============================|============================|
  | PUBLISH_OK                    |                            |
  |   + RANGE_FILTER_CONDITION    |                            |
  |==============================>|============================|
  |                               | Apply returned conditions  |
  |                               | before forwarding objects  |
  |<==== Objects (filtered) ==================================>|
  |                               |                            |
]]></artwork></figure>
<t><list style="symbols">
  <t><strong>No filter parameters in SUBSCRIBE_TRACKS</strong>: The subscriber requests
only a Track Namespace Prefix.</t>
  <t><strong>Condition conveyed in acceptance</strong>: For each received PUBLISH
stream, the subscriber responds with PUBLISH_OK carrying
RANGE_FILTER_CONDITION.</t>
  <t><strong>Per-track activation</strong>: The relay applies the returned conditions to
that accepted stream and forwards only objects that satisfy the
resulting active SetID combination.</t>
</list></t>

</section>
</section>
<section anchor="design-rationale"><name>Design Rationale</name>

<section anchor="or-preserving-admission-versus-set-replacement"><name>OR-Preserving Admission Versus Set Replacement</name>

<t>Two high-level designs are possible for conditional intra-track
filtering.</t>

<t>In a set-replacement design, the relay interprets conditional SetIDs as
mutually exclusive alternatives and selects exactly one active SetID.
That model can be convenient for layered examples, but it changes the
base MOQT meaning of SetID because SetIDs no longer behave as
OR-combined filter groups once conditional logic is enabled.</t>

<t>The inline design instead uses an OR-preserving admission design. Under this
model, conditional logic determines only whether a SetID participates in
the existing OR expression at a given switching point. The AND semantics
within a SetID and the OR semantics across SetIDs remain unchanged. This
preserves compatibility with existing Range Filter processing, avoids
introducing a special-case interpretation of SetID, and lets
unconditional and conditional SetIDs coexist naturally in the same
subscription.</t>

<t>The main trade-off is that subscribers describe adaptation as
incremental admission or removal of OR terms, rather than as a single
explicit "current SetID". That requires examples and algorithms to be
phrased in terms of active SetID combinations. This document prefers
that trade-off because it keeps the extension additive and avoids
redefining core MOQT Range Filter behavior.</t>

</section>
<section anchor="alternative-embedding-conditions-in-existing-range-filter-parameters"><name>Alternative: Embedding Conditions in Existing Range Filter Parameters</name>

<t>An alternative design would embed the conditional evaluation fields
(Algorithm ID, Throughput threshold, Set throughput fraction, Activate
switching, Set rank) directly into the existing Range Filter parameters
SUBGROUP_FILTER, OBJECTID_FILTER, PRIORITY_FILTER,
OBJECT_PROPERTY_FILTER, and TRACK_PROPERTY_FILTER, rather than
introducing a separate RANGE_FILTER_CONDITION parameter.</t>

<t>Under this approach, a subscriber would signal the condition inline with
the filter that it governs, for example:</t>

<figure><artwork><![CDATA[
SUBGROUP_FILTER {
  Type=0x25, Length, [SetID], Range...,
  [Algorithm ID (vi64)],
  [Throughput threshold (vi64)],
  ...
}
]]></artwork></figure>
<t>This approach is not adopted for the following reasons.</t>

<t><strong>SetID is a grouping mechanism, not a per-filter attribute.</strong> A single
SetID typically comprises multiple Range Filter parameters that are
AND-combined (e.g., a SUBGROUP_FILTER and an OBJECTID_FILTER with the
same SetID). The conditional activation logic applies to the entire
SetID group, not to any individual filter within it. Embedding condition
fields in each Range Filter parameter would require either repeating the
fields identically across every parameter sharing the same SetID, or
designating one parameter as the canonical carrier while others are
implicitly governed by it. Both approaches introduce ambiguity and
implementation complexity without benefit.</t>

<t><strong>Modifying base MOQT parameters raises the change bar.</strong>
SUBGROUP_FILTER and related parameters are defined and registered in the
MOQT base specification (<xref target="I-D.ietf-moq-transport"/>, Section 15.7).
Extending their wire format would require a change to or an update of
that specification rather than a new parameter registration. A
standalone parameter type, by contrast, is a purely additive change.</t>

<t><strong>Separation of concerns is architecturally preferable.</strong> Range Filter
parameters define the <em>content selection criterion</em> (which subgroup IDs,
object IDs, priorities, or property values pass). The
RANGE_FILTER_CONDITION parameter defines the <em>activation condition</em>
(under what network state the SetID is active). Keeping these concerns
in separate parameters preserves the ability to use Range Filters
independently of any conditional logic, and allows future algorithms to
be introduced without touching the base filter format.</t>

<t>For these reasons, RANGE_FILTER_CONDITION is defined as a standalone
parameter that references an existing SetID by value.</t>

</section>
<section anchor="handling-filtered-subgroups-prior-subgroup-id-gap"><name>Handling Filtered Subgroups: Prior Subgroup ID Gap</name>

<t>When a relay dynamically filters out a subgroup due to network
conditions, a subscriber receiving the stream might notice a numerical
leap in Group IDs or Object IDs. To explicitly communicate that these
missing objects were intentionally skipped by a conditional filter
rather than lost to network congestion, we propose a new
PRIOR_SUBGROUP_ID_GAP Object Property.</t>

<t><list style="symbols">
  <t><strong>Prior Subgroup ID Gap (Property Type: 0x3F):</strong> A variable-length
integer containing the number of Subgroups prior to the current
Subgroup ID (within the current Group) that do not and will never
exist because they were conditionally filtered out.</t>
</list></t>

<t>If a relay drops Subgroup 1 but continues forwarding Subgroup 0 and
Subgroup 2, it injects PRIOR_SUBGROUP_ID_GAP = 1 into the first Object
of Subgroup 2. Relays <bcp14>MUST</bcp14> be permitted to modify this specific gap
property to support dynamic conditional filtering.</t>

</section>
<section anchor="extension-negotiation"><name>Extension negotiation</name>

<t>Per Section 10.3 of <xref target="I-D.ietf-moq-transport"/>, the SETUP message
allows endpoints to agree on the initial configuration before any other
control messages are exchanged. Extensions that modify control message
semantics, such as RANGE_FILTER_CONDITION, <bcp14>MUST</bcp14> be negotiated through
Setup Options before use.</t>

<t>The Setup Options defined in this section are intended for the inline
design of this extension. Alternative designs, such as the
reference-based design (<xref target="conditional-set-assignment-design"/>) or the
self-contained design (<xref target="conditional-filter-set-design"/>), may instead
rely on Setup Options defined in the Sender-Side Track Switching (SSTS)
extension <xref target="SSTS"/> or require different identifiers for their respective
parameters.</t>

<t>This document defines two new Setup Options: RANGE_FILTER_CONDITION and
MAX_CONDITIONAL_FILTERS.</t>

<dl>
  <dt>RANGE_FILTER_CONDITION (Type 0x09):</dt>
  <dd>
    <t>Declares support for the RANGE_FILTER_CONDITION message parameter
defined in <xref target="parameter-definition"/>. The value is a variable-length
integer identifying the version of the conditional filtering algorithm
set the endpoint is willing to use. The value indicates the highest
Algorithm ID the endpoint is capable of evaluating. An endpoint that
includes this option can process RANGE_FILTER_CONDITION parameters for
any Algorithm ID up to and including the advertised value. If not
present, the endpoint does not support this extension.</t>
  </dd>
  <dt>MAX_CONDITIONAL_FILTERS (Type 0x0A):</dt>
  <dd>
    <t>Limits the peer's total number of RANGE_FILTER_CONDITION parameters
allowed concurrently for a given subscription or fetch. The default
value is 0, so if not specified, the peer <bcp14>MUST NOT</bcp14> send any
RANGE_FILTER_CONDITION parameters. If this limit is exceeded, an
endpoint <bcp14>MUST</bcp14> reject this with REQUEST_ERROR with error code
INVALID_FILTER.</t>
  </dd>
</dl>

<t>An endpoint that wishes to send RANGE_FILTER_CONDITION parameters <bcp14>MUST</bcp14>
verify that the peer's SETUP message includes a RANGE_FILTER_CONDITION
Setup Option with a value greater than or equal to the Algorithm ID it
intends to use, and a MAX_CONDITIONAL_FILTERS value greater than zero.</t>

<t>Because RANGE_FILTER_CONDITION binds to Range Filter SetIDs, an endpoint
that sends RANGE_FILTER_CONDITION <bcp14>MUST</bcp14> also ensure that the
MAX_FILTER_RANGES Setup Option (Section 10.3.1.6 of
<xref target="I-D.ietf-moq-transport"/>) has been negotiated with a non-zero value;
otherwise Range Filters themselves would not be permitted and the
referenced SetIDs could not be established.</t>

<t>Endpoints that do not support this extension will not include the
RANGE_FILTER_CONDITION Setup Option in their SETUP message. As required
by Section 10.3 of <xref target="I-D.ietf-moq-transport"/>, endpoints <bcp14>MUST</bcp14> ignore
unknown Setup Options, so a peer that receives these options from an
endpoint that does not recognize them simply ignores them and does not
send RANGE_FILTER_CONDITION parameters in that session.</t>

</section>
</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<t>This extension relies on the existing security framework of MOQT.
Conditional filter evaluation must be computationally lightweight to
prevent denial-of-service attacks against relays. A malicious subscriber
could attempt to overwhelm a relay with highly complex
RANGE_FILTER_CONDITION thresholds or excessive conditional SetIDs.
Relays <bcp14>SHOULD</bcp14> implement rate limiting on the maximum number of
conditionally bound SetIDs a subscriber can declare in a single session.</t>

</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<t><list style="symbols">
  <t>A new Setup Option Type for RANGE_FILTER_CONDITION (suggested value:
0x09) in the "MOQ Setup Options" registry (Section 15.4 of
<xref target="I-D.ietf-moq-transport"/>), with Specification Required policy.</t>
  <t>A new Setup Option Type for MAX_CONDITIONAL_FILTERS (suggested value:
0x0A) in the "MOQ Setup Options" registry (Section 15.4 of
<xref target="I-D.ietf-moq-transport"/>), with Specification Required policy.</t>
  <t>A new Message Parameter Type for RANGE_FILTER_CONDITION in the "MOQT
Message Parameters" registry.</t>
  <t>A new Object Property Type for PRIOR_SUBGROUP_ID_GAP (suggested
value: 0x3F) in the "MOQ Properties" registry.</t>
</list></t>

</section>


  </middle>

  <back>


<references title='References' anchor="sec-combined-references">

    <references title='Normative References' anchor="sec-normative-references">




<reference anchor="I-D.ietf-moq-transport">
   <front>
      <title>Media over QUIC Transport</title>
      <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
         <organization>Cisco</organization>
      </author>
      <author fullname="Victor Vasiliev" initials="V." surname="Vasiliev">
         <organization>Google</organization>
      </author>
      <author fullname="Ian Swett" initials="I." surname="Swett">
         <organization>Google</organization>
      </author>
      <author fullname="Alan Frindell" initials="A." surname="Frindell">
         <organization>Meta</organization>
      </author>
      <date day="6" month="July" year="2026"/>
      <abstract>
	 <t>   This document defines Media over QUIC Transport (MOQT), a publish/
   subscribe protocol that runs over QUIC and WebTransport.  MOQT
   leverages the features of these transports, such as streams,
   datagrams, priorities, and partial reliability.  MOQT operates both
   point-to-point and through intermediate relays, enabling scalable
   low-latency delivery.  Despite its name, MOQT is media agnostic and
   can be used for a wide range of use cases.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-moq-transport-19"/>
   
</reference>
<reference anchor="RFC2119">
  <front>
    <title>Key words for use in RFCs to Indicate Requirement Levels</title>
    <author fullname="S. Bradner" initials="S." surname="Bradner"/>
    <date month="March" year="1997"/>
    <abstract>
      <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="2119"/>
  <seriesInfo name="DOI" value="10.17487/RFC2119"/>
</reference>
<reference anchor="RFC8174">
  <front>
    <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
    <author fullname="B. Leiba" initials="B." surname="Leiba"/>
    <date month="May" year="2017"/>
    <abstract>
      <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="8174"/>
  <seriesInfo name="DOI" value="10.17487/RFC8174"/>
</reference>



    </references>

    <references title='Informative References' anchor="sec-informative-references">

<reference anchor="SSTS" target="https://github.com/wilaw/moqt-ssts/blob/main/draft-wilaw-moq-moqt-ssts.md">
  <front>
    <title>Sender-Side Track Switching for Media over QUIC Transport</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>


    </references>

</references>


<?line 876?>

<section numbered="false" anchor="acknowledgments"><name>Acknowledgments</name>

<t>IETF MOQ Working Group.</t>

</section>


  </back>

<!-- ##markdown-source:
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
fr8D6CIkwBVkad1A23kVF6yKh7nYWiQgF28O2rirvRmVnS+4ZHQb+o8Er9HF
RouNGtZgzfL1rMy0/j6jKq/n7uyHGEGEH9MvkASXccRJiWbpLRaU+FrZjDwd
SbYvDw4qlW1e9TiTLWXo9i1WCMcv7emmSx8sD/TrgrLkg8KjL6KVS3NlEzU4
/HElPanydt/t1T7Vu2zBC3Zg+NQ8cgcsqXI6KJKEEtzlypcoVamJVihnXlhy
Rqo9dQQNpJo3ajTny2Wd8T3mtrx3aRTh/cDRdINFWoOwJqx3zAFRlErcUVRX
hWIkxcJpnTd1j6BpvgmsNFLSsDu2SqbwWviPPC5Y3a9zM/TAPkeY6UDv3n7x
fHhA8AKrxKP4GKcEoTCc3V1R1Eg/DdO23e6zPGgV1aM2GoVog7pj1vChDRlq
KSfKKAhvCk/omttrwwUC2b6zxkmFZfdp7ZvVw6yLD0kK3SYLT3cw7zLMiEWP
xJxD/zij3PoQg3RaVKHuz/0R37vFG9+9GU+gYYf2qTyD7I8K1grDnc84y4Iq
Ls2orJKkd2CoHJf04wR3Wyv2EjjJyVis91ivqB7eRmXzVjnNzzA52RpvmbnM
8XiT8o9fU/1IUZ27d168y36m86OLN69txUMlAg7EIbkiuDjvJSYF55lkOnHs
Z7PmqvhtUXJyDUJbqsleVcrFJG6dL+LI1yisxPeEK9R6LaxRYqtBd8vGkVt4
uyJkLJIJgIgU9uh0xZaojBWITjwHza8blRuDgodR4dO8nFXARo9gQy52hV4p
O7lJo0C++AvDwtaYpd5Z9h7w0d0XSH0ccpiDaV/b1N3IZuX9j8MRZbuJq0wR
aMmzbSti7nGnk69A6W93youOSzV8KWVbAQLhnb9QUIX1L9q3H1uIcZMTcmuM
ue+mX+L/V9P//naz9juWyOxL3pWy8rt/kkvk6E7j0nGspYae1zeqiarGVah9
d3uxAeYuios6xLm7b47XcW2lOWZqJ776Ws8VTkGhkdJUYsIx33OOZZrKvZ21
TetvVznHd6SOdDuvud0clq9DBzmMyTpt8KKoaeafojoyrvZ4ycwktV/RLS2O
yHtU2+Na8iiOGmOSm3HcxYt2vaL4Gm+9Qf5jZMSVjnAwjdqGbqSu8KIlgRbf
qz4i87Q0JVp6iYE3cpWD4TxXyrbx+vjOyeJEUWrz8Yovacb3S4iHOUxyg88X
BgvY991JiCmXOWYZ0AztdRAjN0p/QTSGTFERzN5EuYCDuaZTUnK0EbnvqcQ4
Nk3x62555bpDgkEcBEURQdtuPITXW3cekjuxQVvwTnnF/goa+N10hANRQBus
veVKGNmohuL0RBv1RS6FAspeAMRLDvo1qiyARPfYjzXfE4u9NQg4qRTroFLY
UswS3UduHR1g2RfMVBXg1Xd/USKddFSnHpFRISsrdjWNqact2s4oLXMpleWW
krhEHqd3zxtiHKsmeDQz2Zt8iXb8FkQz9MWtAhgga928quHPioAKUES71Brm
mYA+RduRnQvIBQ1EJ6cvql0EB08tghdc6B8dUB15SBXg4m75IVA5D64b6re6
GyvmLq5sUCeIWX97tJqtPw0lejBIG8nX3Ko646DOht4lwRGxkBBDVKrgsIWb
C6Tgqy0y1WRPJ1XhrfzS1rhe6hKdXo37dfmQ2D6v7snNiVz5I3ee0MEwrERN
KTKHeIM5ABu5AoPRht8RgEZc9LXp9i/t6wvshSw+WE70ek0a969tJD/zlU4z
vjmyriJn8ITXhVU5ntddM9zJ8IgtX4zpBBNN4aqiaDEbR0ZWEd6CBJAObV5M
fwpKxDJpwktmuSILFR2QN1cmXTqLihgF1bn4oFNz20d04Y0GBcnxsuyumDxR
YhlJrT3nwKSSrawL2KfKhRmiWypz6RSgatqDzbuHQ+cBIoSYoRnFSLirlYLd
Pp6eTDd2Gqzr6QaE5It/UIf2gUJfpZ4EClWJJIxogfIOkEGTPXasV3EdiLbH
k0c4TXh7m2Qb8e6cN/yXZ/ZC+FUOO76e3DWVXlDSM5fpP8VcXomKbV3KtGVv
gkHjBYSbLQSjDzpqOV58N92uAb9q2AcvHLtfGqv22t2pGHaqxuOxnmFUCJDl
dI6yNDXxJVUgUR8OmPxN/GRnAYrT7HxU6vjo4jlKFv19zncdkZtlov4vy94R
8Z+XAAA=

-->

</rfc>

