<?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.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-asdf-sdf-protocol-mapping-02" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="sdf-protocol-mapping">Protocol Mapping for SDF</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-asdf-sdf-protocol-mapping-02"/>
    <author initials="R." surname="Mohan" fullname="Rohit Mohan">
      <organization>Cisco Systems</organization>
      <address>
        <postal>
          <street>170 West Tasman Drive</street>
          <city>San Jose</city>
          <code>95134</code>
          <country>USA</country>
        </postal>
        <email>rohitmo@cisco.com</email>
      </address>
    </author>
    <author initials="B." surname="Brinckman" fullname="Bart Brinckman">
      <organization>Cisco Systems</organization>
      <address>
        <postal>
          <street>170 West Tasman Drive</street>
          <city>San Jose</city>
          <code>95134</code>
          <country>USA</country>
        </postal>
        <email>bbrinckm@cisco.com</email>
      </address>
    </author>
    <author initials="L." surname="Corneo" fullname="Lorenzo Corneo">
      <organization>Ericsson</organization>
      <address>
        <postal>
          <street>Hirsalantie 11</street>
          <city>Jorvas</city>
          <code>1296</code>
          <country>Finland</country>
        </postal>
        <email>lorenzo.corneo@ericsson.com</email>
      </address>
    </author>
    <date year="2025" month="December" day="02"/>
    <area>Applications and Real-Time</area>
    <workgroup>A Semantic Definition Format for Data and Interactions of Things</workgroup>
    <keyword>IoT</keyword>
    <abstract>
      <?line 66?>

<t>This document defines protocol mapping extensions for the Semantic Definition
Format (SDF) to enable mapping of protocol-agnostic SDF affordances to
protocol-specific operations. The protocol mapping mechanism allows SDF models
to specify how properties, actions, and events should be accessed using specific
IP and non-IP protocols such as Bluetooth Low Energy, Zigbee or HTTP and CoAP.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-asdf-sdf-protocol-mapping/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        A Semantic Definition Format for Data and Interactions of Things Working Group mailing list (<eref target="mailto:asdf@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/asdf/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/asdf/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/ietf-wg-asdf/sdf-protocol-mapping"/>.</t>
    </note>
  </front>
  <middle>
    <?line 74?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The Semantic Definition Format (SDF) <xref target="I-D.ietf-asdf-sdf"/> provides a protocol-agnostic way
to describe IoT devices and their capabilities through properties, actions, and
events (collectively called affordances). However, when implementing these
affordances on actual devices using specific communication protocols, there
needs to be a mechanism to map the protocol-agnostic SDF definitions to
protocol-specific operations.</t>
      <t>These protocols can be non-IP protocols that are commonly used in IoT
environments, such as <xref target="BLE53"/> and <xref target="Zigbee22"/>, or IP-based protocols, such as
HTTP <xref target="RFC2616"/> or CoAP <xref target="RFC7252"/>.</t>
      <t>To leverage an SDF model to perform protocol-specific operations on an instance
of a device, a mapping of the SDF affordance to a protocol-specific attribute is
required. This document defines the protocol mapping mechanism using the
<tt>sdfProtocolMap</tt> keyword, which allows SDF models to include protocol-specific
mapping information alongside the protocol-agnostic definitions.</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="structure">
      <name>Structure</name>
      <t>Protocol mapping is required to map a protocol-agnostic affordance to
a protocol-specific operation, as implementations of the same affordance
will differ between protocols. For example, BLE will address a property
as a service characteristic, while a property in Zigbee is addressed
as an attribute in a cluster of an endpoint.</t>
      <t>A protocol mapping object is a JSON object identified by the <tt>sdfProtocolMap</tt>
keyword. Protocol-specific properties are embedded within this object, organized
by protocol name, e.g., "ble" or "zigbee". The protocol name <bcp14>MUST</bcp14> be specified
in the IANA registry requested in <xref target="iana-prot-map"/>.</t>
      <figure anchor="protmap">
        <name>Property Mapping</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="240" width="328" viewBox="0 0 328 240" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 24,48 L 24,192" fill="none" stroke="black"/>
              <path d="M 96,80 L 96,96" fill="none" stroke="black"/>
              <path d="M 96,144 L 96,160" fill="none" stroke="black"/>
              <path d="M 96,208 L 96,224" fill="none" stroke="black"/>
              <path d="M 24,64 L 72,64" fill="none" stroke="black"/>
              <path d="M 96,96 L 120,96" fill="none" stroke="black"/>
              <path d="M 24,128 L 72,128" fill="none" stroke="black"/>
              <path d="M 96,160 L 120,160" fill="none" stroke="black"/>
              <path d="M 24,192 L 72,192" fill="none" stroke="black"/>
              <path d="M 96,224 L 120,224" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="128,224 116,218.4 116,229.6" fill="black" transform="rotate(0,120,224)"/>
              <polygon class="arrowhead" points="128,160 116,154.4 116,165.6" fill="black" transform="rotate(0,120,160)"/>
              <polygon class="arrowhead" points="128,96 116,90.4 116,101.6" fill="black" transform="rotate(0,120,96)"/>
              <polygon class="arrowhead" points="80,192 68,186.4 68,197.6" fill="black" transform="rotate(0,72,192)"/>
              <polygon class="arrowhead" points="80,128 68,122.4 68,133.6" fill="black" transform="rotate(0,72,128)"/>
              <polygon class="arrowhead" points="80,64 68,58.4 68,69.6" fill="black" transform="rotate(0,72,64)"/>
              <g class="text">
                <text x="60" y="36">sdfProtocolMap</text>
                <text x="96" y="68">ble</text>
                <text x="180" y="100">BLE-specific</text>
                <text x="264" y="100">mapping</text>
                <text x="108" y="132">zigbee</text>
                <text x="192" y="164">Zigbee-specific</text>
                <text x="288" y="164">mapping</text>
                <text x="112" y="196">openapi</text>
                <text x="196" y="228">OpenAPI-specific</text>
                <text x="296" y="228">mapping</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
sdfProtocolMap
  |
  +-----> ble
  |        |
  |        +--> BLE-specific mapping
  |
  +-----> zigbee
  |        |
  |        +--> Zigbee-specific mapping
  |
  +-----> openapi
           |
           +--> OpenAPI-specific mapping
]]></artwork>
        </artset>
      </figure>
      <t>As shown in <xref target="protmap"/>, protocol-specific properties must be embedded in an
sdfProtocolMap object, for example a "ble" or a "zigbee" object.</t>
      <table anchor="proobj">
        <name>Protocol objects</name>
        <thead>
          <tr>
            <th align="left">Attribute</th>
            <th align="left">Type</th>
            <th align="left">Example</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">ble</td>
            <td align="left">object</td>
            <td align="left">an object with BLE-specific attributes</td>
          </tr>
          <tr>
            <td align="left">zigbee</td>
            <td align="left">object</td>
            <td align="left">an object with Zigbee-specific attributes</td>
          </tr>
          <tr>
            <td align="left">openapi</td>
            <td align="left">object</td>
            <td align="left">an object with OpenAPI-specific attributes</td>
          </tr>
        </tbody>
      </table>
      <t>where-</t>
      <ul spacing="normal">
        <li>
          <t>"ble" is an object containing properties that are specific to the BLE
protocol.</t>
        </li>
        <li>
          <t>"zigbee" is an object containing properties that are specific to the
Zigbee protocol.</t>
        </li>
        <li>
          <t>Other protocol mapping objects can be added by creating a new protocol
object</t>
        </li>
      </ul>
      <t>Example protocol mapping:</t>
      <figure anchor="exprotmap">
        <name>Example property mapping</name>
        <sourcecode type="json"><![CDATA[
{
  "sdfObject": {
    "healthsensor": {
      "sdfProperty": {
        "heartrate": {
          "description": "The current measured heart rate",
          "type": "number",
          "unit": "beat/min",
          "observable": false,
          "writable": false,
          "sdfProtocolMap": {
            "ble": {
              "serviceID": "12345678-1234-5678-1234-56789abcdef4",
              "characteristicID":
                "12345678-1234-5678-1234-56789abcdef4"
            }
          }
        }
      }
    }
  }
}
]]></sourcecode>
      </figure>
      <t>For properties that have a different protocol mapping for read and write operations, the protocol mapping can be specified as such:</t>
      <figure anchor="exprotmap2">
        <name>Example property mapping</name>
        <sourcecode type="json"><![CDATA[
{
  "sdfObject": {
    "healthsensor": {
      "sdfProperty": {
        "heartrate": {
          "description": "The current measured heart rate",
          "type": "number",
          "unit": "beat/min",
          "observable": false,
          "sdfProtocolMap": {
            "ble": {
              "read": {
                "serviceID": "12345678-1234-5678-1234-56789abcdef4",
                "characteristicID":
                  "12345678-1234-5678-1234-56789abcdef5"
              },
              "write": {
                "serviceID": "12345678-1234-5678-1234-56789abcdef4",
                "characteristicID":
                  "12345678-1234-5678-1234-56789abcdef6"
              }
            }
          }
        }
      }
    }
  }
}
]]></sourcecode>
      </figure>
    </section>
    <section anchor="usage">
      <name>Usage</name>
      <t>A protocol map <bcp14>MAY</bcp14> be provided as part of the SDF model, specifically in the SDF
affordance definition. The extension points in the SDF affordance definition
defined in <xref target="I-D.ietf-asdf-sdf"/> are used to specify the protocol mapping information as a
part of the SDF model.</t>
      <t>For SDF properties, the protocol mapping is specified as an
extension to a named property quality using the <tt>sdfProtocolMap</tt> keyword.
For SDF actions and events, the protocol mapping can be specified
as an extension to the named quality or as part of the <tt>sdfInputData</tt> or
<tt>sdfOutputData</tt> objects.</t>
    </section>
    <section anchor="examples">
      <name>Examples</name>
      <section anchor="ble-protocol-mapping">
        <name>BLE Protocol Mapping</name>
        <t>The BLE protocol mapping allows SDF models to specify how properties,
actions, and events should be accessed using Bluetooth Low Energy (BLE)
protocol. The mapping includes details such as service IDs and characteristic
IDs that are used to access the corresponding SDF affordances.</t>
        <section anchor="ble-protocol-mapping-structure">
          <name>BLE Protocol Mapping Structure</name>
          <t>For SDF properties and actions, the BLE protocol mapping structure
is defined as follows:</t>
          <figure anchor="blemap1">
            <name>CDDL definition for BLE Protocol Mapping for properties and actions</name>
            <sourcecode type="cddl"><![CDATA[
$$SDF-PROTOCOL-MAP //= (
  ble: ble-protocol-map
)

ble-protocol-map = {
  ? ble-property,
  ? read: { ble-property },
  ? write: { ble-property }
}

ble-property = (
  serviceID: text,
  characteristicID: text
)
]]></sourcecode>
          </figure>
          <t>Where:</t>
          <ul spacing="normal">
            <li>
              <t><tt>serviceID</tt> is the BLE service ID that corresponds to the SDF property or action.</t>
            </li>
            <li>
              <t><tt>characteristicID</tt> is the BLE characteristic ID that corresponds to the SDF property or action.</t>
            </li>
          </ul>
          <t>For example, a BLE protocol mapping for a temperature property might look like:</t>
          <sourcecode type="json"><![CDATA[
{
  "sdfProperty": {
    "temperature": {
      "sdfProtocolMap": {
        "ble": {
          "serviceID": "12345678-1234-5678-1234-56789abcdef4",
          "characteristicID": "12345678-1234-5678-1234-56789abcdef5"
        }
      }
    }
  }
}
]]></sourcecode>
          <t>For a temperature property that has different mappings for read and write operations,
the BLE protocol mapping might look like:</t>
          <sourcecode type="json"><![CDATA[
{
  "sdfProperty": {
    "temperature": {
      "sdfProtocolMap": {
        "ble": {
          "read": {
            "serviceID": "12345678-1234-5678-1234-56789abcdef4",
            "characteristicID": "12345678-1234-5678-1234-56789abcdef5"
          },
          "write": {
            "serviceID": "12345678-1234-5678-1234-56789abcdef4",
            "characteristicID": "12345678-1234-5678-1234-56789abcdef6"
          }
        }
      }
    }
  }
}
]]></sourcecode>
          <t>For SDF events, the BLE protocol mapping structure is similar, but it may
include additional attributes such as the type of the event.</t>
          <figure anchor="blemap2">
            <name>BLE Protocol Mapping for events</name>
            <sourcecode type="cddl"><![CDATA[
$$SDF-PROTOCOL-MAP //= (
  ble: ble-event-map
)

ble-event-map = {
  type: "gatt" / "advertisements" / "connection_events",
  ? serviceID: text,
  ? characteristicID: text
}
]]></sourcecode>
          </figure>
          <t>Where:</t>
          <ul spacing="normal">
            <li>
              <t><tt>type</tt> specifies the type of BLE event, such as "gatt" for GATT events,
"advertisements" for advertisement events, or "connection_events" for
connection-related events.</t>
            </li>
            <li>
              <t><tt>serviceID</tt> and <tt>characteristicID</tt> are optional attributes that are
specified if the type is "gatt".</t>
            </li>
          </ul>
          <t>For example, a BLE event mapping for a heart rate measurement event might look like:</t>
          <sourcecode type="json"><![CDATA[
{
  "sdfEvent": {
    "heartRate": {
      "sdfOutputData": {
        "sdfProtocolMap": {
          "ble": {
            "type": "gatt",
            "serviceID": "12345678-1234-5678-1234-56789abcdef4",
            "characteristicID": "12345678-1234-5678-1234-56789abcdef5"
          }
        }
      }
    }
  }
}
]]></sourcecode>
          <t>Another example of an <tt>isPresent</tt> event using BLE advertisements:</t>
          <sourcecode type="json"><![CDATA[
{
  "sdfEvent": {
    "isPresent": {
      "sdfOutputData": {
        "sdfProtocolMap": {
          "ble": {
            "type": "advertisements"
          }
        }
      }
    }
  }
}
]]></sourcecode>
        </section>
      </section>
      <section anchor="zigbee-protocol-mapping">
        <name>Zigbee Protocol Mapping</name>
        <t>The Zigbee protocol mapping allows SDF models to specify how properties,
actions, and events should be accessed using the Zigbee protocol. The
mapping includes details such as cluster IDs and attribute IDs that are
used to access the corresponding SDF affordances.</t>
        <section anchor="zigbee-protocol-mapping-structure">
          <name>Zigbee Protocol Mapping Structure</name>
          <t>For SDF properties and events, the Zigbee protocol mapping structure
is defined as follows:</t>
          <figure anchor="zigmap1">
            <name>CDDL definition for Zigbee Protocol Mapping for properties and actions</name>
            <sourcecode type="cddl"><![CDATA[
$$SDF-PROTOCOL-MAP //= (
  zigbee: zigbee-protocol-map
)

zigbee-protocol-map = {
  ? zigbee-property,
  ? read: { zigbee-property },
  ? write: { zigbee-property }
}

zigbee-property = (
  endpointID: uint,
  manufacturerCode: uint,
  clusterID: uint,
  attributeID: uint,
  type: uint
)
]]></sourcecode>
          </figure>
          <t>Where:</t>
          <ul spacing="normal">
            <li>
              <t><tt>endpointID</tt> is the Zigbee endpoint ID that corresponds to the SDF affordance.</t>
            </li>
            <li>
              <t><tt>clusterID</tt> is the Zigbee cluster ID that corresponds to the SDF affordance.</t>
            </li>
            <li>
              <t><tt>attributeID</tt> is the Zigbee attribute ID that corresponds to the SDF affordance.</t>
            </li>
            <li>
              <t><tt>type</tt> is the Zigbee data type of the attribute.</t>
            </li>
          </ul>
          <t>SDF properties are mapped to Zigbee cluster attributes and events are mapped to Zigbee cluster attribute reporting.</t>
          <t>For example, a Zigbee protocol mapping for a temperature property might look like:</t>
          <sourcecode type="jsonc"><![CDATA[
{
  "sdfProperty": {
    "temperature": {
      "sdfProtocolMap": {
        "zigbee": {
          "endpointID": 1,
          "clusterID": 1026, // 0x0402
          "attributeID": 0, // 0x0000
          "type": 41 // 0x29
        }
      }
    }
  }
}
]]></sourcecode>
          <t>SDF actions are mapped to Zigbee cluster commands. The Zigbee protocol mapping structure for actions is defined as follows:</t>
          <figure anchor="zigmap2">
            <name>CDDL definition for Zigbee Protocol Mapping for actions</name>
            <sourcecode type="cddl"><![CDATA[
$$SDF-PROTOCOL-MAP //= (
  zigbee: zigbee-action-map
)

zigbee-action-map = {
  endpointID: uint,
  manufacturerCode: uint,
  clusterID: uint,
  commandID: uint,
}
]]></sourcecode>
          </figure>
          <t>Where:</t>
          <ul spacing="normal">
            <li>
              <t><tt>endpointID</tt> is the Zigbee endpoint ID that corresponds to the SDF action.</t>
            </li>
            <li>
              <t><tt>clusterID</tt> is the Zigbee cluster ID that corresponds to the SDF action.</t>
            </li>
            <li>
              <t><tt>commandID</tt> is the Zigbee command ID that corresponds to the SDF action.</t>
            </li>
          </ul>
          <t>For example, a Zigbee protocol mapping to set a temperature might look like:</t>
          <sourcecode type="jsonc"><![CDATA[
{
  "sdfAction": {
    "setTemperature": {
      "sdfProtocolMap": {
        "zigbee": {
          "endpointID": 1,
          "clusterID": 1026, // 0x0402
          "commandID": 0 // 0x0000
        }
      }
    }
  }
}
]]></sourcecode>
        </section>
      </section>
      <section anchor="ip-based-protocol-mapping">
        <name>IP based Protocol Mapping</name>
        <t>The protocol mapping mechanism can potentially also be used for IP-based protocols
such as HTTP or CoAP.</t>
        <t>In the case of HTTP, SDF protocol mappings towards an SDF quality <bcp14>MAY</bcp14> be
expressed by directly pointing to OpenAPI schema and/or component.</t>
        <sourcecode type="cddl"><![CDATA[
$$SDF-PROTOCOL-MAP //= (
  openapi: openapi-protocol-map
)

openapi-protocol-map = {
  ? openapi-property,
  ? read: { openapi-property },
  ? write: { openapi-property }
}

openapi-property = (
  operationRef: text,
  $ref: text
)
]]></sourcecode>
        <t>An example of a protocol mapping for a property using HTTP might look like:</t>
        <sourcecode type="json"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

{
  "sdfProperty": {
    "heartrate": {
      "sdfProtocolMap": {
        "openapi": {
            "operationRef": "https://example.com/openapi.json#/paths\
/~1heartrate~1{id}~1current",
            "$ref": "https://example.com/openapi.json#/components/sc\
hema/HeartRate/properties/pulse"
        }
      }
    }
  }
}
]]></sourcecode>
        <t>The <tt>operationRef</tt> points to the OpenAPI operation that retrieves the
current heart rate, and the <tt>$ref</tt> points to the OpenAPI schema that
defines the heart rate property. An example of the OpenAPI schema
might look like:</t>
        <sourcecode type="yaml"><![CDATA[
paths:
  /heartrate/{id}/current:
    get:
      summary: Get current heart rate
      description: |-
        Retrieve the current heart rate for a specific user
        identified by {id}.
      parameters:
        - name: id
          in: path
          required: true
          description: |-
            The ID of the user whose heart rate is being queried.
          schema:
            type: string
      responses:
        "200":
          description: |-
            Successful response with current heart rate data.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/HeartRate"
    put:
      summary: Set current heart rate
      description: |-
        Set the current heart rate for a specific user
        identified by {id}.
      parameters:
        - name: id
          in: path
          required: true
          description: |-
            The ID of the user whose heart rate is being set.
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/HeartRate"

components:
  schemas:
    HeartRate:
      type: object
      properties:
        pulse:
          type: integer
          description: The current heart rate in beats per minute.
        spo2:
          type: number
          format: float
          description: |-
            The current body temperature in degrees Celsius.
]]></sourcecode>
        <t>We assume that the readable properties will map to GET operations and the writable properties will map to PUT operations.
If this is not the case, or if the API is different, the protocol mapping can be specified as such:</t>
        <sourcecode type="json"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

{
  "sdfProperty": {
    "heartrate": {
      "sdfProtocolMap": {
        "openapi": {
          "read": {
            "operationRef": "https://example.com/openapi.json#/paths\
/~1heartrate~1{id}~1current/get",
            "$ref": "https://example.com/openapi.json#/components/sc\
hema/HeartRate/properties/pulse"
          },
          "write": {
            "operationRef": "https://example.com/openapi.json#/paths\
/~1heartrate~1{id}~1current/put",
            "$ref": "https://example.com/openapi.json#/components/sc\
hema/HeartRate/properties/pulse"
          }
        }
      }
    }
  }
}
]]></sourcecode>
      </section>
    </section>
    <section anchor="scim-sdf-extension">
      <name>SCIM SDF Extension</name>
      <t>While SDF provides a way to describe a device, a method is needed to associate a
mapping between an instance of a device and its associated SDF models. To
accomplish this, we define a SCIM extension that can be used in conjunction with
<xref target="I-D.ietf-scim-device-model"/> in <xref target="scim-sdf-extension-schema"/>. Implementation
of this SCIM extension is <bcp14>OPTIONAL</bcp14> and independent of the protocol mapping
functionality defined in the rest of this document.
The SCIM schema attributes used here are described in Section 7 of <xref target="RFC7643"/>.</t>
      <figure anchor="scim-sdf-extension-schema">
        <name>SCIM SDF Extension Schema</name>
        <artwork><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

{
    "id": "urn:ietf:params:scim:schemas:extension:sdf:2.0:Device",
    "name": "SDFExtension",
    "description": "Device extension schema for SDF.",
    "attributes": [
        {
            "name": "sdf",
            "type": "string",
            "description": "SDF models supported by the device.",
            "multiValued": true,
            "required": true,
            "caseExact": true,
            "mutability": "readWrite",
            "returned": "default",
            "uniqueness": "none"
        }
    ],
    "meta": {
        "resourceType": "Schema",
        "location": "/v2/Schemas/urn:ietf:params:scim:schemas:extens\
ion:sdf:2.0:Device"
    }
}
]]></artwork>
      </figure>
      <t>An example SCIM device schema extension might look like:</t>
      <sourcecode type="json"><![CDATA[
{
    "schemas": [
        "urn:ietf:params:scim:schemas:core:2.0:Device",
        "urn:ietf:params:scim:schemas:extension:sdf:2.0:Device"
    ],
    "id": "e9e30dba-f08f-4109-8486-d5c6a3316111",
    "displayName": "Heart Monitor",
    "active": true,
    "urn:ietf:params:scim:schemas:extension:sdf:2.0:Device": {
        "sdf": [
            "https://example.com/thermometer#/sdfThing/thermometer",
            "https://example.com/heartrate#/sdfObject/healthsensor"
        ]
    }
}
]]></sourcecode>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>TODO Security</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This section provides guidance to the Internet Assigned Numbers Authority
(IANA) regarding registration of values related to this document,
in accordance with <xref target="RFC8126"/>.</t>
      <section anchor="iana-prot-map">
        <name>Protocol Mapping</name>
        <t>IANA is requested to create a new registry called "SDF Protocol Mapping".</t>
        <t>The registry must contain the following attributes:</t>
        <ul spacing="normal">
          <li>
            <t>Protocol map name</t>
          </li>
          <li>
            <t>Protocol name</t>
          </li>
          <li>
            <t>Description</t>
          </li>
          <li>
            <t>Reference of the specification describing the protocol mapping. This specification must be reviewed by an expert.</t>
          </li>
        </ul>
        <t>The registrant of an existing entry may request updates to that entry, subject to the same expert review.
They should verify that updates preserve backward compatibility with deployed implementations, or if breaking changes are necessary, consider whether a new registry entry is more appropriate.</t>
        <t>Following protocol mappings are described in this document:</t>
        <table anchor="protmap-reg">
          <name>Protocol Mapping Registry</name>
          <thead>
            <tr>
              <th align="left">Protocol map</th>
              <th align="left">Protocol Name</th>
              <th align="left">Description</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">ble</td>
              <td align="left">Bluetooth Low Energy (BLE)</td>
              <td align="left">Protocol mapping for BLE devices</td>
              <td align="left">This document</td>
            </tr>
            <tr>
              <td align="left">zigbee</td>
              <td align="left">Zigbee</td>
              <td align="left">Protocol mapping for Zigbee devices</td>
              <td align="left">This document</td>
            </tr>
            <tr>
              <td align="left">openapi</td>
              <td align="left">OpenAPI</td>
              <td align="left">Protocol mapping for OpenAPI</td>
              <td align="left">This document</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="scim-device-schema-sdf-extension">
        <name>SCIM Device Schema SDF Extension</name>
        <t>IANA is requested to create the following extensions in the SCIM
Server-Related Schema URIs registry as described in <xref target="scim-sdf-extension"/>:</t>
        <table>
          <thead>
            <tr>
              <th align="left">URN</th>
              <th align="left">Description</th>
              <th align="left">Resource Type</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">urn:ietf:params:scim: schemas:extension: sdf:2.0:Device</td>
              <td align="left">SDF Extension</td>
              <td align="left">Device</td>
              <td align="left">This memo, <xref target="scim-sdf-extension"/></td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="I-D.ietf-asdf-sdf">
          <front>
            <title>Semantic Definition Format (SDF) for Data and Interactions of Things</title>
            <author fullname="Michael Koster" initials="M." surname="Koster">
              <organization>KTC Control AB</organization>
            </author>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <author fullname="Ari Keränen" initials="A." surname="Keränen">
              <organization>Ericsson</organization>
            </author>
            <date day="13" month="October" year="2025"/>
            <abstract>
              <t>   The Semantic Definition Format (SDF) is concerned with Things, namely
   physical objects that are available for interaction over a network.
   SDF is a format for domain experts to use in the creation and
   maintenance of data and interaction models that describe Things.  An
   SDF specification describes definitions of SDF Objects/SDF Things and
   their associated interactions (Events, Actions, Properties), as well
   as the Data types for the information exchanged in those
   interactions.  Tools convert this format to database formats and
   other serializations as needed.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-asdf-sdf-25"/>
        </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="I-D.ietf-scim-device-model">
          <front>
            <title>Device Schema Extensions to the SCIM model</title>
            <author fullname="Muhammad Shahzad" initials="M." surname="Shahzad">
              <organization>North Carolina State University</organization>
            </author>
            <author fullname="Hassan Iqbal" initials="H." surname="Iqbal">
              <organization>North Carolina State University</organization>
            </author>
            <author fullname="Eliot Lear" initials="E." surname="Lear">
              <organization>Cisco Systems</organization>
            </author>
            <date day="3" month="September" year="2025"/>
            <abstract>
              <t>   The initial core schema for SCIM (System for Cross-domain Identity
   Management) was designed for provisioning users.  This memo specifies
   schema extensions that enables provisioning of devices, using various
   underlying bootstrapping systems, such as Wi-fi Easy Connect, FIDO
   device onboarding vouchers, BLE passcodes, and MAC authenticated
   bypass.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-scim-device-model-18"/>
        </reference>
        <reference anchor="RFC7643">
          <front>
            <title>System for Cross-domain Identity Management: Core Schema</title>
            <author fullname="P. Hunt" initials="P." role="editor" surname="Hunt"/>
            <author fullname="K. Grizzle" initials="K." surname="Grizzle"/>
            <author fullname="E. Wahlstroem" initials="E." surname="Wahlstroem"/>
            <author fullname="C. Mortimore" initials="C." surname="Mortimore"/>
            <date month="September" year="2015"/>
            <abstract>
              <t>The System for Cross-domain Identity Management (SCIM) specifications are designed to make identity management in cloud-based applications and services easier. The specification suite builds upon experience with existing schemas and deployments, placing specific emphasis on simplicity of development and integration, while applying existing authentication, authorization, and privacy models. Its intent is to reduce the cost and complexity of user management operations by providing a common user schema and extension model as well as binding documents to provide patterns for exchanging this schema using HTTP.</t>
              <t>This document provides a platform-neutral schema and extension model for representing users and groups and other resource types in JSON format. This schema is intended for exchange and use with cloud service providers.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7643"/>
          <seriesInfo name="DOI" value="10.17487/RFC7643"/>
        </reference>
        <reference anchor="RFC8126">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton"/>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <author fullname="T. Narten" initials="T." surname="Narten"/>
            <date month="June" year="2017"/>
            <abstract>
              <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters. To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper. For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
              <t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed. This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
              <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="26"/>
          <seriesInfo name="RFC" value="8126"/>
          <seriesInfo name="DOI" value="10.17487/RFC8126"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="BLE53" target="https://www.bluetooth.com/specifications/specs/core-specification-5-3/">
          <front>
            <title>Bluetooth Core Specification Version 5.3</title>
            <author>
              <organization>Bluetooth SIG</organization>
            </author>
            <date year="2021" month="July" day="13"/>
          </front>
        </reference>
        <reference anchor="Zigbee22" target="https://zigbeealliance.org/solution/zigbee/">
          <front>
            <title>Zigbee 3.0 Specification</title>
            <author>
              <organization>Zigbee Alliance</organization>
            </author>
            <date year="2022"/>
          </front>
        </reference>
        <reference anchor="RFC2616">
          <front>
            <title>Hypertext Transfer Protocol -- HTTP/1.1</title>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <author fullname="J. Gettys" initials="J." surname="Gettys"/>
            <author fullname="J. Mogul" initials="J." surname="Mogul"/>
            <author fullname="H. Frystyk" initials="H." surname="Frystyk"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <author fullname="P. Leach" initials="P." surname="Leach"/>
            <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
            <date month="June" year="1999"/>
            <abstract>
              <t>HTTP has been in use by the World-Wide Web global information initiative since 1990. This specification defines the protocol referred to as "HTTP/1.1", and is an update to RFC 2068. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2616"/>
          <seriesInfo name="DOI" value="10.17487/RFC2616"/>
        </reference>
        <reference anchor="RFC7252">
          <front>
            <title>The Constrained Application Protocol (CoAP)</title>
            <author fullname="Z. Shelby" initials="Z." surname="Shelby"/>
            <author fullname="K. Hartke" initials="K." surname="Hartke"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2014"/>
            <abstract>
              <t>The Constrained Application Protocol (CoAP) is a specialized web transfer protocol for use with constrained nodes and constrained (e.g., low-power, lossy) networks. The nodes often have 8-bit microcontrollers with small amounts of ROM and RAM, while constrained networks such as IPv6 over Low-Power Wireless Personal Area Networks (6LoWPANs) often have high packet error rates and a typical throughput of 10s of kbit/s. The protocol is designed for machine- to-machine (M2M) applications such as smart energy and building automation.</t>
              <t>CoAP provides a request/response interaction model between application endpoints, supports built-in discovery of services and resources, and includes key concepts of the Web such as URIs and Internet media types. CoAP is designed to easily interface with HTTP for integration with the Web while meeting specialized requirements such as multicast support, very low overhead, and simplicity for constrained environments.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7252"/>
          <seriesInfo name="DOI" value="10.17487/RFC7252"/>
        </reference>
      </references>
    </references>
    <?line 728?>

<section anchor="cddl-definition">
      <name>CDDL Definition</name>
      <t>This appendix contains the combined CDDL definitions for the SDF protocol mappings.</t>
      <sourcecode type="cddl"><![CDATA[
<CODE BEGINS> file "sdf-protocol-map.cddl"
$$SDF-EXTENSION-DATA //= (
  sdfProtocolMap: {
    * $$SDF-PROTOCOL-MAP
  }
)

$$SDF-PROTOCOL-MAP //= (
  ble: ble-protocol-map
)

ble-protocol-map = {
  ? ble-property,
  ? read: { ble-property },
  ? write: { ble-property }
}

ble-property = (
  serviceID: text,
  characteristicID: text
)

$$SDF-PROTOCOL-MAP //= (
  ble: ble-event-map
)

ble-event-map = {
  type: "gatt" / "advertisements" / "connection_events",
  ? serviceID: text,
  ? characteristicID: text
}

$$SDF-PROTOCOL-MAP //= (
  zigbee: zigbee-protocol-map
)

zigbee-protocol-map = {
  ? zigbee-property,
  ? read: { zigbee-property },
  ? write: { zigbee-property }
}

zigbee-property = (
  endpointID: uint,
  manufacturerCode: uint,
  clusterID: uint,
  attributeID: uint,
  type: uint
)

$$SDF-PROTOCOL-MAP //= (
  zigbee: zigbee-action-map
)

zigbee-action-map = {
  endpointID: uint,
  manufacturerCode: uint,
  clusterID: uint,
  commandID: uint,
}
<CODE ENDS>
]]></sourcecode>
    </section>
    <section anchor="openapi-definition">
      <name>OpenAPI Definition</name>
      <t>The following non-normative model is provided for convenience of the implementor.</t>
      <figure anchor="protocolmapmodel">
        <sourcecode markers="true" name="ProtocolMap.yaml"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

openapi: 3.0.3
info:
  title: SDF Protocol Mapping
  description: |-
    SDF Protocol Mapping. When adding a
    new protocol mapping please add a reference to the protocol map
    for all the schemas in this file.
  version: 0.10.0
externalDocs:
  description: SDF Protocol Mapping IETF draft
  url: https://datatracker.ietf.org/doc/draft-ietf-asdf-sdf-protocol\
-mapping/

paths: {}

components:
  schemas:
# Protocol Mapping
## Protocol Map for Service Discovery
    ProtocolMap-ServiceList:
      type: object
      properties:
        sdfProtocolMap:
          oneOf:
            - $ref: './ProtocolMap-BLE.yaml#/components/schemas/Prot\
ocolMap-BLE-ServiceList'

## Protocol Map for Service Discovery result
    ProtocolMap-ServiceMap:
      type: object
      properties:
        sdfProtocolMap:
          oneOf:
            - $ref: './ProtocolMap-BLE.yaml#/components/schemas/Prot\
ocolMap-BLE-ServiceMap'
            - $ref: './ProtocolMap-Zigbee.yaml#/components/schemas/P\
rotocolMap-Zigbee-ServiceMap'

## Protocol Map for Broadcasts
    ProtocolMap-Broadcast:
      type: object
      properties:
        sdfProtocolMap:
          oneOf:  
            - $ref: './ProtocolMap-BLE.yaml#/components/schemas/Prot\
ocolMap-BLE-Broadcast'
            - $ref: './ProtocolMap-Zigbee.yaml#/components/schemas/P\
rotocolMap-Zigbee-Broadcast'

## Protocol Map for a property
    ProtocolMap-Property:
      type: object
      properties:
        sdfProtocolMap:
          oneOf:  
            - $ref: './ProtocolMap-BLE.yaml#/components/schemas/Prot\
ocolMap-BLE-Propmap'
            - $ref: './ProtocolMap-Zigbee.yaml#/components/schemas/P\
rotocolMap-Zigbee-Propmap'

## Protocol Map for an event
    ProtocolMap-Event:
      type: object
      properties:
        sdfProtocolMap:
          oneOf:  
            - $ref: './ProtocolMap-BLE.yaml#/components/schemas/Prot\
ocolMap-BLE-Event'
            - $ref: './ProtocolMap-Zigbee.yaml#/components/schemas/P\
rotocolMap-Zigbee-Event'
 
]]></sourcecode>
      </figure>
      <section anchor="protocol-map-for-ble">
        <name>Protocol map for BLE</name>
        <figure anchor="protocolmapble">
          <sourcecode markers="true" name="ProtocolMap-BLE.yaml"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

openapi: 3.0.3
info:
  title: SDF Protocol Mapping for BLE
  description: |-
    SDF Protocol Mapping for BLE devices.
  version: 0.10.0
externalDocs:
  description: SDF Protocol Mapping IETF draft
  url: https://datatracker.ietf.org/doc/draft-ietf-asdf-sdf-protocol\
-mapping/

paths: {}

components:
  schemas:
# BLE Protocol Mapping
## A Service is a device with optional service IDs
    ProtocolMap-BLE-ServiceList:
      type: object
      properties:
        ble:
          type: object
          properties:
            services:
              type: array
              items:
                type: object
                properties:
                  serviceID:
                    type: string
                    format: uuid
                    example: 00001809-0000-1000-8000-00805f9b34fb
            cached:
              description: |-
                If we can cache information, then device doesn't need
                to be rediscovered before every connected.
              type: boolean
              default: false
            cacheIdlePurge:
              description: cache expiry period, when device allows
              type: integer
              example: 3600 # default 1 hour
            autoUpdate:
              description: |-
                autoupdate services if device supports it (default)
              type: boolean
              example: true
            bonding: #optional, by default defined in SCIM object 
              type: string
              example: default
              enum:
                - default 
                - none
                - justworks
                - passkey
                - oob

##  Protocol Mapping for BLE Service Map
    ProtocolMap-BLE-ServiceMap:
      required:
        - services
      type: object
      properties:
        ble:
          type: array
          items:
            $ref: '#/components/schemas/ProtocolMap-BLE-Service'

    ProtocolMap-BLE-Service:
      required:
        - serviceID
        - characteristics
      type: object
      properties:
        serviceID:
          type: string
          format: uuid
          example: 00001809-0000-1000-8000-00805f9b34fb
        characteristics:
          type: array
          items:
            $ref: '#/components/schemas/ProtocolMap-BLE-Characterist\
ic'

    ProtocolMap-BLE-Characteristic:
      required:
        - characteristicID
        - flags
        - descriptors
      type: object
      properties:
        characteristicID:
          type: string
          format: uuid
          example: 00002a1c-0000-1000-8000-00805f9b34fb
        flags:
          type: array
          example:
          - read
          - write
          items:
            type: string
            enum:
              - read
              - write
              - notify
        descriptors:
          type: array
          items:
            $ref: '#/components/schemas/ProtocolMap-BLE-Descriptor'

    ProtocolMap-BLE-Descriptor:
      required:
        - descriptorID
      type: object
      properties:
        descriptorID:
          type: string
          format: uuid
          example: 00002902-0000-1000-8000-00805f9b34fb

##  Protocol Mapping for BLE Broadcast
    ProtocolMap-BLE-Broadcast:
      required:
        - ble
      type: object
      properties:
        ble:
          type: object
          properties:
            connectable:
              type: boolean

## Protocol Mapping for BLE Property
    ProtocolMap-BLE-Propmap:
      required:
        - ble
      type: object
      properties:
        ble:
          required:
            - serviceID
            - characteristicID
          type: object
          properties:
            serviceID:
              type: string
              format: uuid
              example: 00001809-0000-1000-8000-00805f9b34fb
            characteristicID:
              type: string
              format: uuid
              example: 00002a1c-0000-1000-8000-00805f9b34fb
              
## Defines different types of BLE events
    ProtocolMap-BLE-Event:
      required:
        - ble
      type: object
      properties:
        ble:
          required:
            - type
          type: object
          properties:
            type:
              type: string
              example: gatt
              enum:
                - gatt
                - connection_events
                - advertisements
            serviceID:
              type: string
              example: 00001809-0000-1000-8000-00805f9b34fb
            characteristicID:
              type: string
              example: 00002a1c-0000-1000-8000-00805f9b34fb
]]></sourcecode>
        </figure>
      </section>
      <section anchor="protocol-map-for-zigbee">
        <name>Protocol map for Zigbee</name>
        <figure anchor="protocolmapzigbee">
          <sourcecode markers="true" name="ProtocolMap-Zigbee.yaml"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

openapi: 3.0.3
info:
  title: SDF Protocol Mapping for Zigbee
  description: |-
    SDF Protocol Mapping for Zigbee devices.
  version: 0.10.0
externalDocs:
  description: SDF Protocol Mapping IETF draft
  url: https://datatracker.ietf.org/doc/draft-ietf-asdf-sdf-protocol\
-mapping/

paths: {}

components:
  schemas:
# Zigbee Protocol Mapping
##  Protocol Mapping for Zigbee Service Map
    ProtocolMap-Zigbee-ServiceMap:
      required:
        - zigbee
      type: object
      properties:
        zigbee:
          type: array
          items:
            $ref: '#/components/schemas/ProtocolMap-Zigbee-Endpoint'

    ProtocolMap-Zigbee-Endpoint:
      required:
        - endpointID
        - clusters
      type: object
      properties:
        endpointID:
          type: integer
          format: int32
          example: 10
        clusters:
          type: array
          items:
            $ref: '#/components/schemas/ProtocolMap-Zigbee-Cluster'

    ProtocolMap-Zigbee-Cluster:
      required:
        - clusterID
        - properties
      type: object
      properties:
        clusterID:
          type: integer
          format: int32
          example: 0
        properties:
          type: array
          items:
            $ref: '#/components/schemas/ProtocolMap-Zigbee-Property'

    ProtocolMap-Zigbee-Property:
      required:
        - attributeID
        - propertyType
      type: object
      properties:
        attributeID:
          type: integer
          format: int32
          example: 1
        propertyType:
          type: integer
          format: int32
          example: 32
          
## Protocol Mapping for Zigbee broadcast
    ProtocolMap-Zigbee-Broadcast:
      required:
        - zigbee
      type: object
      properties:
        zigbee:
          type: object

## Protocol mapping for Zigbee property
    ProtocolMap-Zigbee-Propmap:
      required:
        - zigbee
      type: object
      properties:
        zigbee:
          required:
            - endpointID
            - clusterID
            - attributeID
          type: object
          properties:
            endpointID:
              type: integer
              format: int32
              example: 1
            clusterID:
              type: integer
              format: int32
              example: 6
            attributeID:
              type: integer
              format: int32
              example: 16
            type:
              type: integer
              format: int32
              example: 1

    ProtocolMap-Zigbee-Event:
      allOf:  
        - $ref: '#/components/schemas/ProtocolMap-Zigbee-Propmap'
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
Np4MBuyBxpMN2Ulauo15WaRvF6F1rGzVdcGeMgNv+B7z6HrLUW4r53g5/qEa
/9ENSGumUDs6CCIqr1eCgdD6YI2O8qs5WgcVKK+pXg30Du0VAzOyglivTsp5
U7S6ZnxPFW5Ce4p/hnge/wmN+spi3YLn+QdR1xZYk6ZjsoPtZkLrz9cq3mzR
jpYfYc4+BtU4ek3vQH/WFZ9H6SmvotUx8eAPbteS2a0wtb0dq8zNi91w1l6d
28JiLfr1dlq1hvW9k37bGu9dEE1a1mDbQWvZUtTTkVbVNOaz3Pqt9VGa3XB1
GinPu1mkdT6crLRINJHrl0YDt4q6lCl1Cig3unxBW3WbT3U1hvAPI0uTtIim
Fc7Witw75+2YsVp4rmqwjN8qlA2vrchFds+74qDng/WlHLRcz5sw3kuPRtLD
Rw75hvUNqPB5/rFysngNSgVJ+wLekxrWS2L+5IQV9N/npJswJdymWZHlrTru
tvFF07df4s4s8ec/w5NfolLvCJ+V1av8IMfsqDtj1RNgiEfuvCLkDxidlMyv
yTMI7fb8QM1v4dnibuKKbq2nKfF0fc/R08bdqvxsRv4i3Hozlmwksup5LOCK
liyWzImtmsiy8m1fOpf1N/1PGNwoneWeofn3yGi1PYDUasRVh2XxWmP3Y5mS
Mv+aRMXU1+optXF9n+6bTveq3W6P/1ZrsWyO1Z65HUXIrfEbxgXW9ntj+s28
irZbULNhv65gNMSwelBB4/NrkHVbjtVOVdVgaRSmjxZYZRXFbhhtmWMKd0HU
iqZ+G3hfVNU+ZjtZ6zthPrpaZ0qalD0/rmz/irS1z6jcCcvWqUs43Qlop7TV
nVcacNwaydR3LH8t9af/UY+aqa4j3rpP6u4Q3j/Wbf6lR13KiqbIy3Ify97Y
L/Vr1gqQP2vdxlMEscmy+PEqmzsZ54lT0SJ4dzMjd6h2n/6zqNZqc+3Ih8ex
u5fcvY3epC3x6/d0JRPTP4+wNfmQpGexCGcyVLgYyUvjIvy6Q1sreFCZbqRw
01L0gv8DBfCK22B7AAA=

-->

</rfc>
