<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.30 (Ruby 2.6.10) -->
<?rfc docmapping="yes"?>
<?rfc comments="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-haynes-nfsv4-swap-04" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="atomic EXCHANGE_RANGE">Adding an Atomic EXCHANGE_RANGE Operation to NFSv4.2</title>
    <seriesInfo name="Internet-Draft" value="draft-haynes-nfsv4-swap-04"/>
    <author initials="T." surname="Haynes" fullname="Thomas Haynes">
      <organization>Hammerspace</organization>
      <address>
        <email>loghyr@gmail.com</email>
      </address>
    </author>
    <date/>
    <area>General</area>
    <workgroup>Network File System Version 4</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 43?>

<t>The Network File System version 4.2 (NFSv4.2) does not provide
support for atomic multi-block updates to file data.  This document
introduces a new EXCHANGE_RANGE operation which provides for such
atomic updates.  This document extends NFSv4.2 (see RFC7862).</t>
    </abstract>
    <note>
      <name>Note to Readers</name>
      <?line 50?>

<t>Discussion of this draft takes place
on the NFSv4 working group mailing list (nfsv4@ietf.org),
which is archived at
<eref target="https://mailarchive.ietf.org/arch/search/?email_list=nfsv4"/>. Source
code and issues list for this draft can be found at
<eref target="https://github.com/ietf-wg-nfsv4/exchange_range"/>.</t>
      <t>Working Group information can be found at <eref target="https://github.com/ietf-wg-nfsv4"/>.</t>
    </note>
  </front>
  <middle>
    <?line 61?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>With the Network File System version 4.2 (NFSv4.2), atomic updates
to a file are not guaranteed. A single WRITE operation might span
multiple data blocks and another client doing a READ might encounter
a partial WRITE.  In addition, multiple WRITE operations, even
within the same compound, may not be atomically applied to a file.
In some implementations, multiple WRITE operations within the same
compound may appear to be applied atomically, but this behavior is
implementation-specific and not guaranteed by the protocol.</t>
      <t>This document introduces the <bcp14>OPTIONAL</bcp14> to implement EXCHANGE_RANGE
operation to NFSv4.2 to atomically apply multiple WRITE operations
to a file.  A client can easily determine whether or not a server
supports the EXCHANGE_RANGE operation by examining the return code
of the operation.  If the server does not support the EXCHANGE_RANGE
operation, it will return an error of NFS4ERR_NOTSUPP.</t>
      <t>One way to use the EXCHANGE_RANGE operation is to CLONE a file and
make modifications to the cloned copy. Once the cloned copy is
ready, the EXCHANGE_RANGE operation can be used to atomically
exchange the modified contents. Upon success, the cloned copy can
be deleted.</t>
      <section anchor="definitions">
        <name>Definitions</name>
        <t>The definitions of the following terms are referenced as follows:</t>
        <ul spacing="normal">
          <li>
            <t>CLONE (<xref section="15.13" sectionFormat="of" target="RFC7862"/>)</t>
          </li>
          <li>
            <t>clone_blksize (<xref section="12.2.1" sectionFormat="of" target="RFC7862"/>)</t>
          </li>
          <li>
            <t>NFS4ERR_NOTSUPP (<xref section="15.1.1.5" sectionFormat="of" target="RFC8881"/>)</t>
          </li>
          <li>
            <t>READ (<xref section="18.22" sectionFormat="of" target="RFC8881"/>)</t>
          </li>
          <li>
            <t>WRITE (<xref section="18.32" sectionFormat="of" target="RFC8881"/>)</t>
          </li>
        </ul>
      </section>
      <section anchor="requirements-language">
        <name>Requirements Language</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>
    <section anchor="operation-81-exchangerange-exchange-a-range-of-a-file-into-another-file">
      <name>Operation 81: EXCHANGE_RANGE - Exchange a range of a file into another file</name>
      <section anchor="arguments">
        <name>ARGUMENTS</name>
        <figure anchor="fig-EXCHANGE_RANGE4args">
          <name>XDR for EXCHANGE_RANGE4args</name>
          <sourcecode type="xdr"><![CDATA[
 /// struct EXCHANGE_RANGE4args {
 ///         /* SAVED_FH: source file */
 ///         /* CURRENT_FH: destination file */
 ///         stateid4        era_src_stateid;
 ///         stateid4        era_dst_stateid;
 ///         offset4         era_src_offset;
 ///         offset4         era_dst_offset;
 ///         length4         era_count;
 /// };
]]></sourcecode>
        </figure>
      </section>
      <section anchor="results">
        <name>RESULTS</name>
        <figure anchor="fig-EXCHANGE_RANGE4res">
          <name>XDR for EXCHANGE_RANGE4res</name>
          <sourcecode type="xdr"><![CDATA[
 /// struct EXCHANGE_RANGE4res {
 ///         nfsstat4        err_status;
 /// };
]]></sourcecode>
        </figure>
      </section>
      <section anchor="description">
        <name>DESCRIPTION</name>
        <t>The EXCHANGE_RANGE operation is used to exchange file content from
a source file specified by the SAVED_FH value into a destination
file specified by CURRENT_FH without actually copying the data,
e.g., by using a block exchange mechanism.</t>
        <t>Both SAVED_FH and CURRENT_FH must be regular files.  If either
SAVED_FH or CURRENT_FH is not a regular file, the operation <bcp14>MUST</bcp14>
fail and return NFS4ERR_WRONG_TYPE.</t>
        <t>The era_dst_stateid <bcp14>MUST</bcp14> refer to a stateid that is valid for a WRITE
operation and follows the rules for stateids in Sections 8.2.5 of
<xref target="RFC7862"/> and 18.32.3 of <xref target="RFC8881"/>.  The era_src_stateid <bcp14>MUST</bcp14>
refer to a stateid that is valid for a READ operation and follows
the rules for stateids in Sections 8.2.5 of <xref target="RFC7862"/> and 18.22.3
of <xref target="RFC8881"/>.  If either stateid is invalid, then the operation
<bcp14>MUST</bcp14> fail.</t>
        <t>The era_src_offset is the starting offset within the source file
from which the data to be exchanged will be obtained, and the
era_dst_offset is the starting offset of the target region into which
the exchanged data will be placed.  An offset of 0 (zero) indicates
the start of the respective file.  The number of bytes to be exchanged
is obtained from era_count, except that a era_count of 0 (zero)
indicates that the number of bytes to be exchanged is the count of
bytes between era_src_offset and the EOF of the source file.  Both
era_src_offset and era_dst_offset must be aligned to the clone block
size (Section 12.2.1 of <xref target="RFC7862"/>).  The number of bytes to be
exchanged must be a multiple of the clone block size, except in the
case in which era_src_offset plus the number of bytes to be exchanged
is equal to the source file size.</t>
        <t>If the source offset or the source offset plus count is greater
than the size of the source file, the operation <bcp14>MUST</bcp14> fail with
NFS4ERR_INVAL.  The destination offset or destination offset plus
count may be greater than the size of the destination file.</t>
        <t>If SAVED_FH and CURRENT_FH refer to the same file and the source
and target ranges overlap, the operation <bcp14>MUST</bcp14> fail with NFS4ERR_INVAL.
This restriction avoids undefined behavior that could arise from
overlapping atomic replacement of data within a single file.</t>
        <t>If the target area of the EXCHANGE_RANGE operation ends beyond the
end of the destination file, the offset at the end of the target
area will determine the new size of the destination file.  The
contents of any block not part of the target area will be the same
as if the file size were extended by a WRITE.</t>
        <t>If the number of bytes to be exchanged is not a multiple of the clone
block size and era_dst_offset + era_count is less than the current
size of the destination file, the operation <bcp14>MUST</bcp14> fail with
NFS4ERR_INVAL.</t>
        <t>This restriction avoids modifying a portion of a clone block while
leaving the remainder of that clone block within the destination
file unchanged, which could otherwise lead to implementation-dependent
results and potential data integrity issues.</t>
        <t>The EXCHANGE_RANGE operation is atomic in that other operations may
not see any intermediate states between the state of the two files
before the operation and after the operation.  READs of the destination
file will never see some blocks of the target area cloned without
all of them being exchanged.  WRITEs of the source area will either
have no effect on the data of the target file or be fully reflected
in the target area of the destination file.</t>
        <t>Atomicity is defined with respect to NFSv4.2 READ and WRITE operations
issued by other clients; the protocol makes no guarantees regarding
the visibility of intermediate states to server-internal mechanisms.</t>
        <t>The completion status of the operation is indicated by err_status.</t>
        <t>The EXCHANGE_RANGE operation does not require the server to provide
exactly-once execution semantics.  A server that does not maintain
a persistent reply cache <bcp14>MAY</bcp14> execute a replayed EXCHANGE_RANGE
operation more than once, provided the associated stateids remain
valid.</t>
        <t>Stateids supplied with the EXCHANGE_RANGE operation provide protection
against replay across server reboots, lease expiration, or state
revocation.  After a server reboot, all previously issued stateids
are invalidated, and replay of a prior EXCHANGE_RANGE operation
<bcp14>MUST</bcp14> fail with an appropriate error.</t>
        <t>Clients <bcp14>MUST NOT</bcp14> assume that a successfully replayed EXCHANGE_RANGE
operation was executed only once. Clients that require confirmation
of the effects of a EXCHANGE_RANGE operation <bcp14>MUST</bcp14> validate the
resulting file contents or metadata, such as via the change attribute,
as required for other non-idempotent operations in NFSv4.2.</t>
      </section>
    </section>
    <section anchor="operations-and-their-valid-errors">
      <name>Operations and Their Valid Errors</name>
      <t>The operations and their valid errors are presented in
<xref target="tbl-ops-and-errors"/>.  All error codes not defined in this document
are defined in Section 15 of <xref target="RFC8881"/> and Section 11 of <xref target="RFC7862"/>.</t>
      <table anchor="tbl-ops-and-errors">
        <name>Operations and Their Valid Errors</name>
        <thead>
          <tr>
            <th align="left">Operation</th>
            <th align="left">Errors</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">EXCHANGE_RANGE</td>
            <td align="left">NFS4ERR_ACCESS, NFS4ERR_ADMIN_REVOKED, NFS4ERR_BADXDR, NFS4ERR_BAD_STATEID, NFS4ERR_DEADSESSION, NFS4ERR_DELAY, NFS4ERR_DELEG_REVOKED, NFS4ERR_DQUOT, NFS4ERR_EXPIRED, NFS4ERR_FBIG, NFS4ERR_FHEXPIRED, NFS4ERR_GRACE, NFS4ERR_INVAL, NFS4ERR_IO, NFS4ERR_ISDIR, NFS4ERR_LOCKED, NFS4ERR_MOVED, NFS4ERR_NOFILEHANDLE, NFS4ERR_NOSPC, NFS4ERR_NOTSUPP, NFS4ERR_OLD_STATEID, NFS4ERR_OPENMODE, NFS4ERR_OP_NOT_IN_SESSION, NFS4ERR_PNFS_IO_HOLE, NFS4ERR_PNFS_NO_LAYOUT, NFS4ERR_REP_TOO_BIG, NFS4ERR_REP_TOO_BIG_TO_CACHE, NFS4ERR_REQ_TOO_BIG, NFS4ERR_RETRY_UNCACHED_REP, NFS4ERR_ROFS, NFS4ERR_SERVERFAULT, NFS4ERR_STALE, NFS4ERR_SYMLINK, NFS4ERR_TOO_MANY_OPS, NFS4ERR_WRONG_TYPE</td>
          </tr>
        </tbody>
      </table>
      <t>If the destination file has active pNFS layouts that prevent atomic
modification of the target range, the server may return an appropriate
pNFS-related error.</t>
    </section>
    <section anchor="extraction-of-xdr">
      <name>Extraction of XDR</name>
      <t>This document contains the external data representation (XDR)
<xref target="RFC4506"/> description of the EXCHANGE_RANGE operation.  The XDR
description is presented in a manner that facilitates easy extraction
into a ready-to-compile format. To extract the machine-readable XDR
description, use the following shell script:</t>
      <sourcecode type="shell"><![CDATA[
#!/bin/sh
grep '^ *///' $* | sed 's?^ */// ??' | sed 's?^ *///$??'
]]></sourcecode>
      <t>For example, if the script is named 'extract.sh' and this document is
named 'exchange_range.txt', execute the following command:</t>
      <sourcecode type="shell"><![CDATA[
sh extract.sh < exchange_range.txt > exchange_range_prot.x
]]></sourcecode>
      <t>This script removes leading blank spaces and the sentinel sequence '///'
from each line. XDR descriptions with the sentinel sequence are embedded
throughout the document.</t>
      <t>Note that the XDR code contained in this document depends on types from
the NFSv4.2 nfs4_prot.x file (generated from <xref target="RFC7863"/>).  This includes
both nfs types that end with a 4, such as offset4, length4, etc., as
well as more generic types such as uint32_t and uint64_t.</t>
      <t>While the XDR can be appended to that from <xref target="RFC7863"/>, the code snippets
should be placed in their appropriate sections within the existing XDR.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>This document imposes no new security considerations to NFSv4.2.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <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="RFC4506">
          <front>
            <title>XDR: External Data Representation Standard</title>
            <author fullname="M. Eisler" initials="M." role="editor" surname="Eisler"/>
            <date month="May" year="2006"/>
            <abstract>
              <t>This document describes the External Data Representation Standard (XDR) protocol as it is currently deployed and accepted. This document obsoletes RFC 1832. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="67"/>
          <seriesInfo name="RFC" value="4506"/>
          <seriesInfo name="DOI" value="10.17487/RFC4506"/>
        </reference>
        <reference anchor="RFC4949">
          <front>
            <title>Internet Security Glossary, Version 2</title>
            <author fullname="R. Shirey" initials="R." surname="Shirey"/>
            <date month="August" year="2007"/>
            <abstract>
              <t>This Glossary provides definitions, abbreviations, and explanations of terminology for information system security. The 334 pages of entries offer recommendations to improve the comprehensibility of written material that is generated in the Internet Standards Process (RFC 2026). The recommendations follow the principles that such writing should (a) use the same term or definition whenever the same concept is mentioned; (b) use terms in their plainest, dictionary sense; (c) use terms that are already well-established in open publications; and (d) avoid terms that either favor a particular vendor or favor a particular technology or mechanism over other, competing techniques that already exist or could be developed. This memo provides information for the Internet community.</t>
            </abstract>
          </front>
          <seriesInfo name="FYI" value="36"/>
          <seriesInfo name="RFC" value="4949"/>
          <seriesInfo name="DOI" value="10.17487/RFC4949"/>
        </reference>
        <reference anchor="RFC7862">
          <front>
            <title>Network File System (NFS) Version 4 Minor Version 2 Protocol</title>
            <author fullname="T. Haynes" initials="T." surname="Haynes"/>
            <date month="November" year="2016"/>
            <abstract>
              <t>This document describes NFS version 4 minor version 2; it describes the protocol extensions made from NFS version 4 minor version 1. Major extensions introduced in NFS version 4 minor version 2 include the following: Server-Side Copy, Application Input/Output (I/O) Advise, Space Reservations, Sparse Files, Application Data Blocks, and Labeled NFS.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7862"/>
          <seriesInfo name="DOI" value="10.17487/RFC7862"/>
        </reference>
        <reference anchor="RFC7863">
          <front>
            <title>Network File System (NFS) Version 4 Minor Version 2 External Data Representation Standard (XDR) Description</title>
            <author fullname="T. Haynes" initials="T." surname="Haynes"/>
            <date month="November" year="2016"/>
            <abstract>
              <t>This document provides the External Data Representation (XDR) description for NFS version 4 minor version 2.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7863"/>
          <seriesInfo name="DOI" value="10.17487/RFC7863"/>
        </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="RFC8178">
          <front>
            <title>Rules for NFSv4 Extensions and Minor Versions</title>
            <author fullname="D. Noveck" initials="D." surname="Noveck"/>
            <date month="July" year="2017"/>
            <abstract>
              <t>This document describes the rules relating to the extension of the NFSv4 family of protocols. It covers the creation of minor versions, the addition of optional features to existing minor versions, and the correction of flaws in features already published as Proposed Standards. The rules relating to the construction of minor versions and the interaction of minor version implementations that appear in this document supersede the minor versioning rules in RFC 5661 and other RFCs defining minor versions.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8178"/>
          <seriesInfo name="DOI" value="10.17487/RFC8178"/>
        </reference>
        <reference anchor="RFC8881">
          <front>
            <title>Network File System (NFS) Version 4 Minor Version 1 Protocol</title>
            <author fullname="D. Noveck" initials="D." role="editor" surname="Noveck"/>
            <author fullname="C. Lever" initials="C." surname="Lever"/>
            <date month="August" year="2020"/>
            <abstract>
              <t>This document describes the Network File System (NFS) version 4 minor version 1, including features retained from the base protocol (NFS version 4 minor version 0, which is specified in RFC 7530) and protocol extensions made subsequently. The later minor version has no dependencies on NFS version 4 minor version 0, and is considered a separate protocol.</t>
              <t>This document obsoletes RFC 5661. It substantially revises the treatment of features relating to multi-server namespace, superseding the description of those features appearing in RFC 5661.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8881"/>
          <seriesInfo name="DOI" value="10.17487/RFC8881"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="XFS-EXCHANGE-RANGE">
          <front>
            <title>ioctl_xfs_exchange_range(2) - Exchange data between files (Accessed January 2026)</title>
            <author>
              <organization>Linux man-pages project</organization>
            </author>
            <date year="2024" month="July"/>
          </front>
          <seriesInfo name="Linux" value="6.10"/>
        </reference>
      </references>
    </references>
    <?line 291?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Christoph Helwig inadvertently pointed out the XFS exchange range
implementation (<xref target="XFS-EXCHANGE-RANGE"/>) which prompted this document.</t>
      <t>Darrick Wong, David Noveck, Pali Rohar, Rick Macklem, and Christoph
Helwig helped review the document.</t>
      <t>Chris Inacio, Brian Pawlowski, and Gorry Fairhurst helped guide
this process.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAL1AjmkAA5Va63LbOJb+j6fAOFMVOyvJseNOp9WXjGLJiWdsyy3ZuVRX
r4oiIYljiuQSpG21O/0s+yz7ZPudA4AXSU4y7qoOCQE4B+fynQvYbrdFHuaR
6speEITxXHqx7OXJMvTl4OPxu97F28FkRP+Xw1RlXh4mscwTeXEyvj3qHApv
Os3UbVd625aIIPFjb4m9g8yb5e2Ft4qVbsczfXvU1nde2n5+JHwvV/MkW3Wl
zgMR4K0rH/q9q8Fn4SexVrEudFfmWaFEmGb8pPPD589/eA7qmfK68q2KwVkk
7pLsZp4lRdqVFyqnN3kSRkqOVzpXS/leZZq4PxI3aoVfg648jXOVxSpv94k/
IXTuxcHEi5IYTKyUFmnYlb/lid+SOsnyTM00nlZL84DTLb00hdBa0k+WSxXn
+nchvCJfJFlXyLaQ+AtjsH/Vke/48DxkZHK1SJaero8n2dyLwz9YyF38gC0z
nXq+4l/V0gujroyS+WKV/WNObx2QFSJOsiXW3CrQlKOT48ODgx/s49F3z1+6
xx+O3Oj3r14eVo8v7OOrg++PqsdX7vHVq4OuEGE8q1P5eDJuO123Wddd5tGa
Upj4eTS5n+mJuvcXXjxXk4z+v3u4J9tyYMcklO3JKVSlVCxnUJWWuz3fV1qr
QP7TiwsvW8nD54cv93jzUrD4a5OwuvIsjIt7ufTidurNsTzNkn8rP+cp4MbL
5irvykWep7q7v49533ewbj+iZfvlMno63H+M6c5hZ5EvI97TmOc/i4j5OuIx
rbJQaRJQ19Jlrrpy52Xn4PmOEO12W3pTnWceOBNXC7XVPG+deXYO5a51rz3Y
GE4VJzmd7DYMlNBFmsIUJdThnG5ZRHnYnkaJfyOLlFjU5KIkUBZxR8LWQk32
WpCRQpl5lgQFBC09Gau7dU9PSk+/W4T+wtHWTFQX/kJYypbaOgGp7nMVB9qh
hNzVSjnD2+sYieBQanJB/8uTyUh5Ac4vRD/UfqFZEMlM5rwr+SZ0eUP6jcgb
CIJIirS7JEESbrHnS/IKeotCnctdRpp/hCqfkdr3WsKcB5t6mb+ALQeQofjt
993KQsLI/tRxy/ZpYF8r/uc1e+GEtv+Zd9/ryHFSZODKTwIF9AywvS7AK7NA
Equdwge6ThVGi3id9DzMF8WUPHqfKLfv5gYo95vWSOL7YI/8lo9cuibEsra/
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
MFsUGao3u9+8oCqX+cYpqJzpiP8HKbvWN48uAAA=

-->

</rfc>
