<?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.6.20 (Ruby 3.2.0) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-asdf-sdf-13" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.15.3 -->
  <front>
    <title abbrev="OneDM SDF">Semantic Definition Format (SDF) for Data and Interactions of Things</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-asdf-sdf-13"/>
    <author initials="M." surname="Koster" fullname="Michael Koster" role="editor">
      <organization>PassiveLogic</organization>
      <address>
        <postal>
          <street>524 H Street</street>
          <city>Antioch, CA</city>
          <code>94509</code>
          <country>USA</country>
        </postal>
        <phone>+1-707-502-5136</phone>
        <email>michaeljohnkoster@gmail.com</email>
      </address>
    </author>
    <author initials="C." surname="Bormann" fullname="Carsten Bormann" role="editor">
      <organization ascii="Universitaet Bremen TZI">Universität Bremen TZI</organization>
      <address>
        <postal>
          <street>Postfach 330440</street>
          <city>Bremen</city>
          <code>D-28359</code>
          <country>Germany</country>
        </postal>
        <phone>+49-421-218-63921</phone>
        <email>cabo@tzi.org</email>
      </address>
    </author>
    <date year="2023" month="January" day="12"/>
    <area>Applications</area>
    <workgroup>ASDF</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>The Semantic Definition Format (SDF) is a format for domain experts to
use in the creation and maintenance of data and interaction models in
the Internet of Things. An SDF specification describes definitions of
SDF Objects 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>
      <t><cref anchor="status">A JSON format representation of SDF 1.0 was defined in
version (-00) of this document; version (-05) was designated as an
<em>implementation draft</em>, labeled SDF 1.1, at the IETF110 meeting of
the ASDF WG (2021-03-11).
The present version (-13) collects smaller changes up to 2023-01-12.</cref></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/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        A Semantic Definition Format for Data and Interactions of Things (ASDF) 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"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <!-- Just copying the abstract, for now... -->

<t>The Semantic Definition Format (SDF) is a format for domain experts to
use in the creation and maintenance of data and interaction models in
the Internet of Things. An SDF specification describes definitions of
SDF Objects 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>
      <t><cref anchor="status_1">A JSON format representation of SDF 1.0 was defined in
version (-00) of this document; version (-05) was designated as an
<em>implementation draft</em>, labeled SDF 1.1, at the IETF110 meeting of
the ASDF WG (2021-03-11).
The present version (-13) collects smaller changes up to 2023-01-12.</cref></t>
      <section anchor="terminology-and-conventions">
        <name>Terminology and Conventions</name>
        <dl>
          <dt>Thing:</dt>
          <dd>
            <t>A physical item that is also made available in the Internet of
Things.  The term is used here for Things that are notable for their
interaction with the physical world beyond interaction with humans;
a temperature sensor or a light might be a Thing, but a router that
employs both temperature sensors and indicator lights might exhibit
less Thingness, as the effects of its functioning are mostly on the
digital side.</t>
          </dd>
          <dt>Affordance:</dt>
          <dd>
            <t>An element of an interface offered for interaction, defining its
possible uses or making clear how it can or should be used.  The
term is used here for the digital interfaces of a Thing only; it
might also have physical affordances such as buttons, dials, and
displays.</t>
          </dd>
          <dt>Quality:</dt>
          <dd>
            <t>A metadata item in a definition or declaration which says something
about that definition or declaration.  A quality is represented in
SDF as an entry in a JSON map (object) that serves as a definition
or declaration.</t>
          </dd>
          <dt>Entry:</dt>
          <dd>
            <t>A key-value pair in a map. (In JSON maps, sometimes also called "member".)</t>
          </dd>
          <dt>Block:</dt>
          <dd>
            <t>One or more entries in a JSON map that is part of an SDF
specification; these entries together serve a specific function.</t>
          </dd>
          <dt>Group:</dt>
          <dd>
            <t>An entry in the main SDF map and in certain nested definitions that
has a Class Name Keyword as its key and a map of definition
entries (Definition Group) as a value.</t>
          </dd>
          <dt>Class Name Keyword:</dt>
          <dd>
            <t>One of sdfThing, sdfObject, sdfProperty, sdfAction,
sdfEvent, or sdfData; the Classes for these type keywords are
capitalized and prefixed with <tt>sdf</tt>.</t>
          </dd>
          <dt>Class:</dt>
          <dd>
            <t>Abstract term for the information that is contained in groups
identified by a Class Name Keyword.</t>
          </dd>
          <dt>Property:</dt>
          <dd>
            <t>An affordance that can potentially be used to read, write, and/or
observe state on an Object.  (Note that Entries are often called
properties in other environments; in this document, the term
Property is specifically reserved for affordances, even if the map
key "properties" might be imported from a data definition language
with the other semantics.)</t>
          </dd>
          <dt>Action:</dt>
          <dd>
            <t>An affordance that can potentially be used to perform a named operation on an Object.</t>
          </dd>
          <dt>Event:</dt>
          <dd>
            <t>An affordance that can potentially be used to obtain information about what happened to an Object.</t>
          </dd>
          <dt>Object:</dt>
          <dd>
            <t>A grouping of Property, Action, and Event definitions; the main
"atom" of reusable semantics for model construction. Objects are
similar to Things but do not allow nesting, i.e., they cannot contain
other Objects or Things. (Note that
JSON maps are often called JSON objects due to JSON's JavaScript
heritage; in this document, the
term Object is specifically reserved for the above grouping, even if
the type name "object" might be imported from a data definition
language with the other semantics.)</t>
          </dd>
          <dt>Element:</dt>
          <dd>
            <t>A part or an aspect of something abstract; used here in its usual English definition.
(Occasionally, also used specifically for the elements of JSON arrays.)</t>
          </dd>
          <dt>Definition:</dt>
          <dd>
            <t>An entry in a Definition Group; the entry creates a new semantic
term for use in SDF models and associates it with a set of
qualities.</t>
          </dd>
          <dt>Declaration:</dt>
          <dd>
            <t>A reference to and a use of a definition within an enclosing
definition, intended to create component instances within that
enclosing definition.  Every declaration can also be used as a
definition for reference in a different place.</t>
          </dd>
          <dt>Protocol Binding:</dt>
          <dd>
            <t>A companion document to an SDF specification that defines how to map
the abstract concepts in the specification into the protocols in use
in a specific ecosystem.  Might supply URL components, numeric IDs,
and similar details.</t>
          </dd>
        </dl>
        <t>The term "byte" is used in its now-customary sense as a synonym for
"octet".</t>
        <t>Conventions:</t>
        <ul spacing="normal">
          <li>The singular form is chosen as the preferred one for the keywords defined here.</li>
        </ul>
        <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>
      </section>
    </section>
    <section anchor="overview">
      <name>Overview</name>
      <section anchor="example-definition">
        <name>Example Definition</name>
        <t>We start with an example for the SDF definition of a simple Object called "Switch" (<xref target="example1"/>).</t>
        <figure anchor="example1">
          <name>A simple example of an SDF definition file</name>
          <sourcecode type="json"><![CDATA[
{
  "info": {
    "title": "Example file for OneDM Semantic Definition Format",
    "version": "2019-04-24",
    "copyright": "Copyright 2019 Example Corp. All rights reserved.",
    "license": "https://example.com/license"
  },
  "namespace": {
    "cap": "https://example.com/capability/cap"
  },
  "defaultNamespace": "cap",
  "sdfObject": {
    "Switch": {
      "sdfProperty": {
        "value": {
          "description": "The state of the switch; false for off and true for on.",
          "type": "boolean"
        }
      },
      "sdfAction": {
        "on": {
          "description": "Turn the switch on; equivalent to setting value to true."
        },
        "off": {
          "description": "Turn the switch off; equivalent to setting value to false."
        },
        "toggle": {
          "description": "Toggle the switch; equivalent to setting value to its complement."
        }
      }
    }
  }
}
]]></sourcecode>
        </figure>
        <t>This is a model of a switch.
The state <tt>value</tt> declared in the <tt>sdfProperty</tt> group, represented by a Boolean, will be true for "on" and will be false for "off".
The actions <tt>on</tt> or <tt>off</tt> declared in the <tt>sdfAction</tt> group are redundant with setting the <tt>value</tt> and are in the example to illustrate that there are often different ways of achieving the same effect.
The action <tt>toggle</tt> will invert the value of the sdfProperty value, so that 2-way switches can be created; having such action will avoid the need for first retrieving the current value and then applying/setting the inverted value.</t>
        <t>The <tt>sdfObject</tt> group lists the affordances of instances of this object.
The <tt>sdfProperty</tt> group lists the property affordances described by the model; these represent various perspectives on the state of the object.
Properties can have additional qualities to describe the state more precisely.
Properties can be annotated to be read, write or read/write; how this is actually done by the underlying transfer protocols is not described in the SDF model but left to companion protocol bindings.
Properties are often used with RESTful paradigms <xref target="I-D.irtf-t2trg-rest-iot"/>, describing state.
The <tt>sdfAction</tt> group is the mechanism to describe other interactions in terms of their names, input, and output data (no data are used in the example), as in a POST method in REST or in a remote procedure call.
The example <tt>toggle</tt> is an Action that
changes the state based on the current state of the Property named <tt>value</tt>.
(The third type of affordance is Events, which are not described in this example.)</t>
        <t>In the JSON representation, note how (with the exception of the <tt>info</tt>
group) maps that have keys taken from the SDF vocabulary (<tt>info</tt>,
<tt>namespace</tt>, <tt>sdfObject</tt>) alternate in nesting with maps that have keys
that are freely defined by the model writer (<tt>Switch</tt>, <tt>value</tt>, <tt>on</tt>,
etc.); the latter usually use the <tt>named&lt;&gt;</tt> production in the <xref target="syntax">formal
syntax of SDF</xref>, while the former SDF-defined vocabulary items
are often, but not always, called <em>qualities</em>.</t>
      </section>
      <section anchor="elements-of-an-sdf-model">
        <name>Elements of an SDF model</name>
        <t>The SDF language uses six predefined Class Name Keywords for modeling connected
Things which are illustrated in <xref target="fig-class-2"/>.</t>
        <figure anchor="fig-class-2">
          <name>Main classes used in SDF models</name>
          <artset>
            <artwork type="svg"><svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" height="437px" preserveAspectRatio="none" version="1.1" viewBox="0 0 542 437" width="542px">
                <defs/>
                <g>
                  <!--MD5=[f586c7dc61127226118a576b1af9a47e]
class sdfThing-->
    <g id="elem_sdfThing">
                    <rect fill="white" height="48" id="sdfThing" rx="2.5" ry="2.5" width="93" x="136.13" y="7" stroke="black" stroke-width="0.5"/>
                    <ellipse cx="151.13" cy="23" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                    <path d="M153.6031,29.1431 Q153.0221,29.4419 152.3829,29.5913 Q151.7438,29.7407 151.0382,29.7407 Q148.5314,29.7407 147.2115,28.0889 Q145.8917,26.437 145.8917,23.3159 Q145.8917,20.1865 147.2115,18.5347 Q148.5314,16.8828 151.0382,16.8828 Q151.7438,16.8828 152.3912,17.0322 Q153.0387,17.1816 153.6031,17.4805 L153.6031,20.2031 Q152.9723,19.6221 152.3788,19.3523 Q151.7853,19.0825 151.1544,19.0825 Q149.8097,19.0825 149.1249,20.1492 Q148.4401,21.2158 148.4401,23.3159 Q148.4401,25.4077 149.1249,26.4744 Q149.8097,27.541 151.1544,27.541 Q151.7853,27.541 152.3788,27.2712 Q152.9723,27.0015 153.6031,26.4204 Z " fill="black"/>
                    <text fill="black" font-family="sans-serif" font-size="14" x="165.13" y="28.291">sdfThing</text>
                    <line x1="137.13" x2="228.13" y1="39" y2="39" stroke="black" stroke-width="0.5"/>
                    <line x1="137.13" x2="228.13" y1="47" y2="47" stroke="black" stroke-width="0.5"/>
                  </g>
                  <!--MD5=[c2cb69c003582447ed3e9466f0338261]
class sdfObject-->
    <g id="elem_sdfObject">
                    <rect fill="white" height="48" id="sdfObject" rx="2.5" ry="2.5" width="97" x="205.13" y="132" stroke="black" stroke-width="0.5"/>
                    <ellipse cx="220.13" cy="148" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                    <path d="M222.6031,154.1431 Q222.0221,154.4419 221.3829,154.5913 Q220.7438,154.7407 220.0382,154.7407 Q217.5314,154.7407 216.2115,153.0889 Q214.8917,151.437 214.8917,148.3159 Q214.8917,145.1865 216.2115,143.5347 Q217.5314,141.8828 220.0382,141.8828 Q220.7438,141.8828 221.3912,142.0322 Q222.0387,142.1816 222.6031,142.4805 L222.6031,145.2031 Q221.9723,144.6221 221.3788,144.3523 Q220.7853,144.0825 220.1544,144.0825 Q218.8097,144.0825 218.1249,145.1492 Q217.4401,146.2158 217.4401,148.3159 Q217.4401,150.4077 218.1249,151.4744 Q218.8097,152.541 220.1544,152.541 Q220.7853,152.541 221.3788,152.2712 Q221.9723,152.0015 222.6031,151.4204 Z " fill="black"/>
                    <text fill="black" font-family="sans-serif" font-size="14" x="234.13" y="153.291">sdfObject</text>
                    <line x1="206.13" x2="301.13" y1="164" y2="164" stroke="black" stroke-width="0.5"/>
                    <line x1="206.13" x2="301.13" y1="172" y2="172" stroke="black" stroke-width="0.5"/>
                  </g>
                  <!--MD5=[79be1817db664391ee5ba2fd11c31888]
class sdfProperty-->
    <g id="elem_sdfProperty">
                    <rect fill="white" height="48" id="sdfProperty" rx="2.5" ry="2.5" width="111" x="29.13" y="257" stroke="black" stroke-width="0.5"/>
                    <ellipse cx="44.13" cy="273" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                    <path d="M46.6031,279.1431 Q46.0221,279.4419 45.3829,279.5913 Q44.7438,279.7407 44.0382,279.7407 Q41.5314,279.7407 40.2115,278.0889 Q38.8917,276.437 38.8917,273.3159 Q38.8917,270.1865 40.2115,268.5347 Q41.5314,266.8828 44.0382,266.8828 Q44.7438,266.8828 45.3912,267.0322 Q46.0387,267.1816 46.6031,267.4805 L46.6031,270.2031 Q45.9723,269.6221 45.3788,269.3523 Q44.7853,269.0825 44.1544,269.0825 Q42.8097,269.0825 42.1249,270.1492 Q41.4401,271.2158 41.4401,273.3159 Q41.4401,275.4077 42.1249,276.4744 Q42.8097,277.541 44.1544,277.541 Q44.7853,277.541 45.3788,277.2712 Q45.9723,277.0015 46.6031,276.4204 Z " fill="black"/>
                    <text fill="black" font-family="sans-serif" font-size="14" x="58.13" y="278.291">sdfProperty</text>
                    <line x1="30.13" x2="139.13" y1="289" y2="289" stroke="black" stroke-width="0.5"/>
                    <line x1="30.13" x2="139.13" y1="297" y2="297" stroke="black" stroke-width="0.5"/>
                  </g>
                  <!--MD5=[bdacf205fe3695f723a4cfa5db06fd81]
class sdfAction-->
    <g id="elem_sdfAction">
                    <rect fill="white" height="48" id="sdfAction" rx="2.5" ry="2.5" width="97" x="363.13" y="257" stroke="black" stroke-width="0.5"/>
                    <ellipse cx="378.13" cy="273" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                    <path d="M380.6031,279.1431 Q380.0221,279.4419 379.3829,279.5913 Q378.7438,279.7407 378.0382,279.7407 Q375.5314,279.7407 374.2115,278.0889 Q372.8917,276.437 372.8917,273.3159 Q372.8917,270.1865 374.2115,268.5347 Q375.5314,266.8828 378.0382,266.8828 Q378.7438,266.8828 379.3912,267.0322 Q380.0387,267.1816 380.6031,267.4805 L380.6031,270.2031 Q379.9723,269.6221 379.3788,269.3523 Q378.7853,269.0825 378.1544,269.0825 Q376.8097,269.0825 376.1249,270.1492 Q375.4401,271.2158 375.4401,273.3159 Q375.4401,275.4077 376.1249,276.4744 Q376.8097,277.541 378.1544,277.541 Q378.7853,277.541 379.3788,277.2712 Q379.9723,277.0015 380.6031,276.4204 Z " fill="black"/>
                    <text fill="black" font-family="sans-serif" font-size="14" x="392.13" y="278.291">sdfAction</text>
                    <line x1="364.13" x2="459.13" y1="289" y2="289" stroke="black" stroke-width="0.5"/>
                    <line x1="364.13" x2="459.13" y1="297" y2="297" stroke="black" stroke-width="0.5"/>
                  </g>
                  <!--MD5=[ccecbd8aeb25c61fe37a32079d0173e2]
class sdfEvent-->
    <g id="elem_sdfEvent">
                    <rect fill="white" height="48" id="sdfEvent" rx="2.5" ry="2.5" width="90" x="175.63" y="257" stroke="black" stroke-width="0.5"/>
                    <ellipse cx="190.63" cy="273" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                    <path d="M193.1031,279.1431 Q192.5221,279.4419 191.8829,279.5913 Q191.2438,279.7407 190.5382,279.7407 Q188.0314,279.7407 186.7115,278.0889 Q185.3917,276.437 185.3917,273.3159 Q185.3917,270.1865 186.7115,268.5347 Q188.0314,266.8828 190.5382,266.8828 Q191.2438,266.8828 191.8912,267.0322 Q192.5387,267.1816 193.1031,267.4805 L193.1031,270.2031 Q192.4723,269.6221 191.8788,269.3523 Q191.2853,269.0825 190.6544,269.0825 Q189.3097,269.0825 188.6249,270.1492 Q187.9401,271.2158 187.9401,273.3159 Q187.9401,275.4077 188.6249,276.4744 Q189.3097,277.541 190.6544,277.541 Q191.2853,277.541 191.8788,277.2712 Q192.4723,277.0015 193.1031,276.4204 Z " fill="black"/>
                    <text fill="black" font-family="sans-serif" font-size="14" x="204.63" y="278.291">sdfEvent</text>
                    <line x1="176.63" x2="264.63" y1="289" y2="289" stroke="black" stroke-width="0.5"/>
                    <line x1="176.63" x2="264.63" y1="297" y2="297" stroke="black" stroke-width="0.5"/>
                  </g>
                  <!--MD5=[154484d28240d22ab997079d2c9ce9cd]
class sdfData-->
    <g id="elem_sdfData">
                    <rect fill="white" height="48" id="sdfData" rx="2.5" ry="2.5" width="84" x="236.63" y="382" stroke="black" stroke-width="0.5"/>
                    <ellipse cx="251.63" cy="398" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                    <path d="M254.1031,404.1431 Q253.5221,404.4419 252.8829,404.5913 Q252.2438,404.7407 251.5382,404.7407 Q249.0314,404.7407 247.7115,403.0889 Q246.3917,401.437 246.3917,398.3159 Q246.3917,395.1865 247.7115,393.5347 Q249.0314,391.8828 251.5382,391.8828 Q252.2438,391.8828 252.8912,392.0322 Q253.5387,392.1816 254.1031,392.4805 L254.1031,395.2031 Q253.4723,394.6221 252.8788,394.3523 Q252.2853,394.0825 251.6544,394.0825 Q250.3097,394.0825 249.6249,395.1492 Q248.9401,396.2158 248.9401,398.3159 Q248.9401,400.4077 249.6249,401.4744 Q250.3097,402.541 251.6544,402.541 Q252.2853,402.541 252.8788,402.2712 Q253.4723,402.0015 254.1031,401.4204 Z " fill="black"/>
                    <text fill="black" font-family="sans-serif" font-size="14" x="265.63" y="403.291">sdfData</text>
                    <line x1="237.63" x2="319.63" y1="414" y2="414" stroke="black" stroke-width="0.5"/>
                    <line x1="237.63" x2="319.63" y1="422" y2="422" stroke="black" stroke-width="0.5"/>
                  </g>
                  <!--MD5=[474ac19abf738d5435f62202b2040a8c]
link sdfThing to sdfObject-->
    <g id="link_sdfThing_sdfObject">
                    <path d="M196.16,55.42 C207.75,75.52 224.51,104.54 236.94,126.08 " fill="none" id="sdfThing-to-sdfObject" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="239.41,130.35,238.3726,120.5559,236.9093,126.0203,231.445,124.557,239.41,130.35" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="222.63" y="98.5684">hasObject</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="216.4021" y="121.1091">0+</text>
                  </g>
                  <!--MD5=[84a99f3e6ba5135b350f4e647ff40b17]
link sdfThing to sdfThing-->
    <g id="link_sdfThing_sdfThing">
                    <path d="M229.53,19.35 C248.35,18.69 264.13,22.58 264.13,31 C264.13,38.44 251.83,42.33 236,42.69 " fill="none" id="sdfThing-to-sdfThing" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="231.05,42.66,240.027,46.7114,236.0499,42.6886,240.0727,38.7115,231.05,42.66" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="270.13" y="36.0684">hasThing</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="237.0416" y="40.7969">0+</text>
                  </g>
                  <!--MD5=[aafb040aa9bcf4f28b2a9ddbf948d7af]
link sdfThing to sdfProperty-->
    <g id="link_sdfThing_sdfProperty">
                    <path d="M136,47.85 C99.23,63.1 50.46,90.1 27.63,132 C6,171.7 35.57,221.37 59.56,251.88 " fill="none" id="sdfThing-to-sdfProperty" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="62.41,255.43,59.8985,245.9068,59.2813,251.5298,53.6582,250.9127,62.41,255.43" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="28.63" y="161.0684">hasProperty</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="37.9817" y="246.443">0+</text>
                  </g>
                  <!--MD5=[1d7f3d7beec3cd9affa0abce6a6b2567]
link sdfThing to sdfAction-->
    <g id="link_sdfThing_sdfAction">
                    <path d="M229.41,49.61 C250.34,58.6 274.73,70.67 294.63,85 C357.14,129.99 385.89,138.55 414.63,210 C419.75,222.7 419.78,237.77 418.22,250.67 " fill="none" id="sdfThing-to-sdfAction" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="417.55,255.31,422.7961,246.9746,418.2651,250.3614,414.8783,245.8304,417.55,255.31" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="400.63" y="161.0684">hasAction</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="398.4969" y="246.285">0+</text>
                  </g>
                  <!--MD5=[72d56d283d4f06699a13f84f73fb0c30]
link sdfThing to sdfEvent-->
    <g id="link_sdfThing_sdfEvent">
                    <path d="M164.06,55.38 C136.18,93.53 90.16,170.57 123.63,227 C129.23,236.43 149.15,248 169.5,257.92 " fill="none" id="sdfThing-to-sdfEvent" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="173.87,260.02,167.4833,252.5226,169.3613,257.8587,164.0252,259.7366,173.87,260.02" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="121.63" y="161.0684">hasEvent</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="149.5914" y="254.3466">0+</text>
                  </g>
                  <!--MD5=[c9f4ee01ef3119b1a79851932bb5a9a6]
link sdfObject to sdfProperty-->
    <g id="link_sdfObject_sdfProperty">
                    <path d="M204.71,177.95 C186.9,186.64 167.11,197.61 150.63,210 C134.71,221.98 119.28,238.01 107.36,251.7 " fill="none" id="sdfObject-to-sdfProperty" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="104.12,255.48,113.0049,251.2306,107.3657,251.6767,106.9196,246.0374,104.12,255.48" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="151.63" y="223.5684">hasProperty</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="87.5644" y="246.0715">0+</text>
                  </g>
                  <!--MD5=[ec9a56bd8655f4d1893aa031ec22e05c]
link sdfObject to sdfAction-->
    <g id="link_sdfObject_sdfAction">
                    <path d="M283.72,180.42 C310.19,201.03 348.73,231.03 376.58,252.71 " fill="none" id="sdfObject-to-sdfAction" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="380.46,255.73,375.8181,247.0436,376.5155,252.6573,370.9019,253.3548,380.46,255.73" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="342.63" y="223.5684">hasAction</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="353.6739" y="246.1091">0+</text>
                  </g>
                  <!--MD5=[e82b08c6210a768f8efa9371b7de17ad]
link sdfObject to sdfEvent-->
    <g id="link_sdfObject_sdfEvent">
                    <path d="M247.35,180.42 C242,200.34 234.3,229.05 228.54,250.53 " fill="none" id="sdfObject-to-sdfEvent" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="227.29,255.2,233.4711,247.5323,228.5765,250.3684,225.7404,245.4738,227.29,255.2" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="239.63" y="223.5684">hasEvent</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="208.2004" y="246.1091">0+</text>
                  </g>
                  <!--MD5=[7eee11d65eceecf8b941af956a7f2b88]
link sdfAction to sdfData-->
    <g id="link_sdfAction_sdfData">
                    <path d="M380.17,305.36 C368.69,314.29 355.78,324.78 344.63,335 C330.27,348.17 315.29,363.87 303.24,377.07 " fill="none" id="sdfAction-to-sdfData" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="299.96,380.69,308.97,376.7126,303.3198,376.9871,303.0453,371.3369,299.96,380.69" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="345.63" y="348.5684">hasInputData</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="283.8382" y="371.2976">0+</text>
                  </g>
                  <!--MD5=[7eee11d65eceecf8b941af956a7f2b88]
link sdfAction to sdfData-->
    <g id="link_sdfAction_sdfData">
                    <path d="M429.32,305.37 C437.95,319.82 444.54,338.17 434.63,352 C410.38,385.85 363.27,398.34 327.13,402.82 " fill="none" id="sdfAction-to-sdfData-1" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="322.48,403.35,331.8779,406.2961,327.4473,402.779,330.9644,398.3484,322.48,403.35" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="439.63" y="348.5684">hasOutputData</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="328.522" y="399.6454">0+</text>
                  </g>
                  <!--MD5=[1d999dc69acbeb1774ac85a19f512fd6]
link sdfEvent to sdfData-->
    <g id="link_sdfEvent_sdfData">
                    <path d="M209.17,305.42 C203.95,319.53 200.38,337.53 207.63,352 C213.04,362.77 221.78,371.92 231.32,379.42 " fill="none" id="sdfEvent-to-sdfData" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="235.15,382.28,230.3303,373.691,231.1431,379.2892,225.545,380.102,235.15,382.28" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="208.63" y="348.5684">hasOutputData</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="210.5093" y="376.1409">0+</text>
                  </g>
                  <!--MD5=[0c4745fb3134cadd1f7ab6e63b3ea9cc]
link sdfProperty to sdfData-->
    <g id="link_sdfProperty_sdfData">
                    <path d="M89.02,305.4 C93.01,320.6 100.38,339.79 113.63,352 C145.64,381.48 194.15,394.57 230.3,400.38 " fill="none" id="sdfProperty-to-sdfData" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="234.94,401.08,226.6344,395.7868,229.9955,400.3369,225.4455,403.698,234.94,401.08" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="114.63" y="348.5684">isInstanceOf</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="220.5011" y="396.8099">1</text>
                  </g>
                  <!--MD5=[deebae7f7682a287bd7eeea252c2b62e]
@startuml

sdfThing - -> "0+" sdfObject : hasObject
sdfThing - -> "0+" sdfThing : hasThing
sdfThing - -> "0+" sdfProperty : hasProperty
sdfThing - -> "0+" sdfAction : hasAction
sdfThing - -> "0+" sdfEvent : hasEvent

sdfObject - -> "0+" sdfProperty : hasProperty
sdfObject - -> "0+" sdfAction : hasAction
sdfObject - -> "0+" sdfEvent : hasEvent

sdfAction - -> "0+" sdfData : hasInputData
sdfAction - -> "0+" sdfData : hasOutputData

sdfEvent - -> "0+" sdfData : hasOutputData

sdfProperty - -> "1" sdfData : isInstanceOf

class sdfThing {
}

class sdfObject {
}

class sdfProperty {
}

class sdfAction {
}

class sdfEvent {
}

class sdfData {
}

@enduml

PlantUML version 1.2022.13(Sat Nov 19 14:22:17 CET 2022)
(GPL source distribution)
Java Runtime: OpenJDK Runtime Environment
JVM: OpenJDK 64-Bit Server VM
Default Encoding: UTF-8
Language: en
Country: DE
-->
  </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[                  ,--------.           
                  |sdfThing|           
                  |--------|           
                  `--------'           
                                       
                                       
            ,---------.                
            |sdfObject|                
            |---------|                
            `---------'                
                                       
,-----------.  ,---------.   ,--------.
|sdfProperty|  |sdfAction|   |sdfEvent|
|-----------|  |---------|   |--------|
`-----------'  `---------'   `--------'
                    |                  
                                       
                ,-------.              
                |sdfData|              
                |-------|              
                `-------'              
]]></artwork>
          </artset>
        </figure>
        <t>The six main Class Name Keywords are discussed below.</t>
        <section anchor="sdfobject">
          <name>sdfObject</name>
          <t>Objects, the items listed in an <tt>sdfObject</tt> group, are the main "atom" of reusable semantics for model construction.
It aligns in scope with common definition items from many IoT modeling
systems, for example ZigBee Clusters <xref target="ZCL"/>, OMA SpecWorks LwM2M
Objects <xref target="OMA"/>, and
OCF Resource Types <xref target="OCF"/>.</t>
          <t>An <tt>sdfObject</tt> contains a set of <tt>sdfProperty</tt>, <tt>sdfAction</tt>, and
<tt>sdfEvent</tt> definitions that describe the interaction affordances
associated with some scope of functionality.</t>
          <t>For the granularity of definition, <tt>sdfObject</tt> definitions are meant
to be kept narrow enough in scope to enable broad reuse and
interoperability.
For example, defining a light bulb using separate <tt>sdfObject</tt>
definitions for on/off control, dimming, and color control affordances
will enable interoperable functionality to be configured for diverse
product types.
An <tt>sdfObject</tt> definition for a common on/off control may be used to
control may different kinds of Things that require on/off control.</t>
          <t>Optional qualities "minItems" and "maxItems" can be used to define
sdfObjects as arrays.</t>
        </section>
        <section anchor="sdfproperty">
          <name>sdfProperty</name>
          <t><tt>sdfProperty</tt> is used to model elements of state within <tt>sdfObject</tt> instances.</t>
          <t>An instance of <tt>sdfProperty</tt> may be associated with some protocol
affordance to enable the application to obtain the state variable and,
optionally, modify the state variable.
Additionally, some protocols provide for in-time reporting of state
changes.
(These three aspects are described by the qualities <tt>readable</tt>,
<tt>writable</tt>, and <tt>observable</tt> defined for an <tt>sdfProperty</tt>.)</t>
          <t>Definitions in <tt>sdfProperty</tt> groups include the definitions from <tt>sdfData</tt> groups, however, they actually also declare a Property with the given qualities to be potentially present in the containing Object.</t>
          <t>For definitions in <tt>sdfProperty</tt> and <tt>sdfData</tt>, SDF provides qualities that can
constrain the structure and values of data allowed in an instance of
these data, as well as qualities that associate semantics to these
data, for engineering units and unit scaling information.</t>
          <t>For the data definition within <tt>sdfProperty</tt> or <tt>sdfData</tt>, SDF borrows
some vocabulary proposed for the drafts 4 and 7 of the
json-schema.org "JSON Schema"
format (collectively called JSO here), enhanced by qualities that are specific to SDF.
Details about the former are in <xref target="jso-inspired"/>.
For the current version of SDF, data are constrained to be of
simple types (number, string, Boolean),
JSON maps composed of named data ("objects"), and arrays of these types.
Syntax extension points are provided that can be used to provide
richer types in future versions of this specification (possibly more
of which can be borrowed from json-schema.org).</t>
          <t>Note that <tt>sdfProperty</tt> definitions (and <tt>sdfData</tt> definitions in
general) are not intended to constrain the formats of data used for
communication over network interfaces.
Where needed, data definitions for payloads of protocol messages are
expected to be part of the protocol binding.</t>
        </section>
        <section anchor="sdfaction-overview">
          <name>sdfAction</name>
          <t>The <tt>sdfAction</tt> group contains declarations of Actions, model affordances that, when triggered,
have more effect than just reading, updating, or observing Thing
state, often resulting in some outward physical effect (which, itself,
cannot be modeled in SDF).  From a programmer's perspective, they
might be considered to be roughly analogous to method calls.</t>
          <t>Actions may have data parameters; these are modeled as a single item of input
data and output data, each.  (Where multiple parameters need to be
modeled, an "object" type can be used to combine these parameters into one.)
<!-- (using `sdfData` definitions, i.e., the same entries as for `sdfProperty` declarations). -->
Actions may be long-running, that is to say that the effects may not
take place immediately as would be expected for an update to an
<tt>sdfProperty</tt>; the effects may play out over time and emit action
results.
Actions may also not always complete and may result in application
errors, such as an item blocking the closing of an automatic door.</t>
          <t>Actions may have (or lack) qualities of idempotency and side-effect safety.</t>
          <t>The current version of SDF only provides data constraint modeling and semantics for the input and output data of definitions in <tt>sdfAction</tt> groups.
Again, data definitions for payloads of protocol messages, and
detailed protocol settings for invoking the action, are expected to be
part of the protocol binding.</t>
        </section>
        <section anchor="sdfevent-overview">
          <name>sdfEvent</name>
          <t>The <tt>sdfEvent</tt> group contains declarations of Events, which can model
affordances that inform about "happenings" associated with an instance
of an Object; these may result in a signal being stored or emitted as
a result.</t>
          <t>Note that there is a trivial overlap with sdfProperty state changes,
which may also be defined as events but are not generally required to
be defined as such.
However, Events may exhibit certain ordering, consistency, and
reliability requirements that are expected to be supported in various
implementations of <tt>sdfEvent</tt> that do distinguish sdfEvent from
sdfProperty.
For instance, while a state change may simply be superseded by another
state change, some events are "precious" and need to be preserved even
if further events follow.</t>
          <t>The current version of SDF only provides data constraint modeling and
semantics for the output data of Event affordances.
Again, data definitions for payloads of protocol messages, and
detailed protocol settings for invoking the action, are expected to be
part of the protocol binding.</t>
        </section>
        <section anchor="sdfdata">
          <name>sdfData</name>
          <t>Definitions in <tt>sdfData</tt> groups are provided separately from those in
<tt>sdfProperty</tt> groups to enable common
modeling patterns, data constraints, and semantic anchor concepts to
be factored out for data items that make up <tt>sdfProperty</tt> items and
serve as input and output data for <tt>sdfAction</tt> and <tt>sdfEvent</tt> items.</t>
          <t>It is a common use case for such a data definition to be shared
between an <tt>sdfProperty</tt> item and input or output parameters of an
<tt>sdfAction</tt> or output data provided by an <tt>sdfEvent</tt>.
<tt>sdfData</tt> definitions also enable factoring out extended application
data types such as mode and machine state enumerations to be reused
across multiple definitions that have similar basic characteristics
and requirements.</t>
        </section>
        <section anchor="sdfthing">
          <name>sdfThing</name>
          <t>Back at the top level, the <tt>sdfThing</tt> groups enables definition of models for
complex devices that will use one or more <tt>sdfObject</tt> definitions.
<tt>sdfThing</tt> groups, however, also allow for including interaction
affordances, <tt>sdfData</tt>, as well as <tt>minItems</tt> and <tt>maxItems</tt> qualities.
Therefore, they can be seen as a superset of <tt>sdfObject</tt> groups, additionally
allowing for composition.</t>
          <t>A definition in an <tt>sdfThing</tt> group can refine the metadata of the definitions it
is composed of: other definitions in <tt>sdfThing</tt> groups definitions in <tt>sdfObject</tt> groups.</t>
        </section>
      </section>
      <section anchor="member-names-given-names-and-quality-names">
        <name>Member names: Given Names and Quality Names</name>
        <t>SDF models are JSON objects (maps) that mostly employ JSON objects as
member values, which in turn mostly employ JSON objects as their
member values, and so on.
This nested structure of JSON objects creates a tree, where the edges
are the member names (map keys) used in these JSON objects.
(In certain cases, where member names are not needed, JSON arrays may
be interspersed in this tree.)</t>
        <section anchor="given-names-and-quality-names">
          <name>Given Names and Quality Names</name>
          <t>For any particular JSON object in an SDF model, the set of member
names that are used is either of:</t>
          <ul spacing="normal">
            <li>A set of "<em>Quality Names</em>", where the entries in the object are
Qualities.  Quality Names are defined by the present specification
and its extensions, together with specific semantics to be
associated with the member value given with a certain Quality Name.</li>
            <li>A set of "<em>Given Names</em>", where the entries in the object are separate
entities (definitions, declarations, etc.) that each have names that
are chosen by the SDF model author in order that these names can be
employed by a user of that model.</li>
          </ul>
          <t>In a path from the root of the tree to any leaf, Quality Names and
Given Names roughly alternate (with the information block,
<xref target="information-block"/>, as a prominent exception).</t>
          <t>The meaning of the JSON object that is the member value associated
with a Given Name is derived from the Quality Name that was used as
the member name associated to the parent.
In the CDDL grammar given in <xref target="syntax"/>, JSON objects with member names that are
Given Names are defined using the CDDL generic rule reference <tt>named&lt;objectmembers&gt;</tt>,
where <tt>objectmembers</tt> is in turn the structure of the members of the
JSON object that is the value of the member named by the Given Name.
As quality-named objects and given-named objects roughly alternate in
a path down the tree, <tt>objectmembers</tt> is usually an object built from
Quality Names.</t>
        </section>
        <section anchor="hierarchical-names">
          <name>Hierarchical Names</name>
          <t>From the outside of a specification, Given Names are usually used as
part of a hierarchical name that looks like a JSON pointer <xref target="RFC6901"/>,
itself generally rooted in (used as the fragment identifier in) an
outer namespace that looks like an <tt>https://</tt> URL (see <xref target="names-and-namespaces"/>).</t>
          <t>As Quality Names and Given Names roughly alternate in a path into the
model, the JSON pointer part of the hierarchical name also alternates
between Quality Names and Given Names.</t>
        </section>
        <section anchor="extensibility-of-given-names-and-quality-names">
          <name>Extensibility of Given Names and Quality Names</name>
          <t>In SDF, both Quality Names and Given Names are <em>extension points</em>.
This is more obvious for Quality Names: Extending SDF is mostly done
by defining additional qualities.  To enable non-conflicting third
party extensions to SDF, an extension is planned that will allow the
use of qualified names (names with an embedded colon) as Quality
Names.
Until that extension is defined, Quality Names with (one or more)
embedded colons are reserved and <bcp14>MUST NOT</bcp14> be used in an SDF model.</t>
          <t>Further, to enable Given Names to have a more powerful role in building
global hierarchical names, an extension is planned that makes use of
qualified names for Given Names.
So, until that extension is defined, Given Names with (one or more)
embedded colons are reserved and <bcp14>MUST NOT</bcp14> be used in an SDF model.</t>
        </section>
      </section>
    </section>
    <section anchor="sdf-structure">
      <name>SDF structure</name>
      <t>SDF definitions are contained in SDF files.  One or more SDF files can
work together to provide the definitions and declarations that are the
payload of the SDF format.</t>
      <t>An SDF definition file contains a single JSON map (JSON object).
This object has three blocks: the information block, the namespaces block, and the definitions block.</t>
      <section anchor="information-block">
        <name>Information block</name>
        <t>The information block contains generic meta data for the file itself and all included definitions.
To enable tool integration, the information block is optional in the grammar
of SDF; most processes for working with SDF files will have policies
that only SDF models with an info block can be processed.
It is therefore <bcp14>RECOMMENDED</bcp14> that SDF validator tools emit a warning
when no information block is found.</t>
        <t>The keyword (map key) that defines an information block is "info". Its
value is a JSON map in turn, with a set of entries that represent qualities that apply to the included definition.</t>
        <t>Qualities of the information block are shown in <xref target="infoblockqual"/>.</t>
        <table anchor="infoblockqual">
          <name>Qualities of the Information Block</name>
          <thead>
            <tr>
              <th align="left">Quality</th>
              <th align="left">Type</th>
              <th align="left">Required</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">title</td>
              <td align="left">string</td>
              <td align="left">no</td>
              <td align="left">A short summary to be displayed in search results, etc.</td>
            </tr>
            <tr>
              <td align="left">version</td>
              <td align="left">string</td>
              <td align="left">no</td>
              <td align="left">The incremental version of the definition</td>
            </tr>
            <tr>
              <td align="left">copyright</td>
              <td align="left">string</td>
              <td align="left">no</td>
              <td align="left">Link to text or embedded text containing a copyright notice</td>
            </tr>
            <tr>
              <td align="left">license</td>
              <td align="left">string</td>
              <td align="left">no</td>
              <td align="left">Link to text or embedded text containing license terms</td>
            </tr>
          </tbody>
        </table>
        <t>The version quality is used to indicate version information about the set of definitions in the file.
The version is <bcp14>RECOMMENDED</bcp14> to be lexicographically increasing over the life of a model: a newer model always has a version string that string-compares higher than all previous versions.
This is easily achieved by following the convention to start the version with an <xref target="RFC3339"/> <tt>date-time</tt> or, if new versions are generated less frequently than once a day, just the <tt>full-date</tt> (i.e., YYYY-MM-DD); in many cases, that will be all that is needed (see <xref target="example1"/> for an example).
This specification does not give a strict definition for the format of the version string but each using system or organization should define internal structure and semantics to the level needed for their use.
If no further details are provided, a <tt>date-time</tt> or <tt>full-date</tt> in this field can be assumed to indicate the latest update time of the definitions in the file.</t>
        <t>The license string is preferably either a URI that points to a web page with an unambiguous definition of the license, or an <xref target="SPDX"/> license identifier.
(For models to be handled by the One Data Model liaison group, this will typically be "BSD-3-Clause".)</t>
      </section>
      <section anchor="namespaces-block">
        <name>Namespaces block</name>
        <t>The namespaces block contains the namespace map and the defaultNamespace setting.</t>
        <t>The namespace map is a map from short names for URIs to the namespace URIs
themselves.</t>
        <t>The defaultNamespace setting selects one of the entries in the
namespace map by giving its short name.  The associated URI (value of
this entry) becomes the default namespace for the SDF definition file.</t>
        <table anchor="nssec">
          <name>Namespaces Block</name>
          <thead>
            <tr>
              <th align="left">Quality</th>
              <th align="left">Type</th>
              <th align="left">Required</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">namespace</td>
              <td align="left">map</td>
              <td align="left">no</td>
              <td align="left">Defines short names mapped to namespace URIs, to be used as identifier prefixes</td>
            </tr>
            <tr>
              <td align="left">defaultNamespace</td>
              <td align="left">string</td>
              <td align="left">no</td>
              <td align="left">Identifies one of the prefixes in the namespace map to be used as a default in resolving identifiers</td>
            </tr>
          </tbody>
        </table>
        <t>The following example declares a set of namespaces and defines <tt>cap</tt>
as the default namespace.
By convention, the values in the namespace map contain full URIs
without a fragment identifier, and the fragment identifier is then
added, if needed, where the namespace entry is used.</t>
        <sourcecode type="json"><![CDATA[
"namespace": {
  "cap": "https://example.com/capability/cap",
  "zcl": "https://zcl.example.com/sdf"
},
"defaultNamespace": "cap"
]]></sourcecode>
        <t>If no defaultNamespace setting is given, the SDF definition file does not
contribute to a global namespace.  As the defaultNamespace is set by giving a
namespace short name, its presence requires a namespace map that contains a
mapping for that namespace short name.</t>
        <t>If no namespace map is given, no short names for namespace URIs are
set up, and no defaultNamespace can be given.</t>
      </section>
      <section anchor="definitions-block">
        <name>Definitions block</name>
        <t>The Definitions block contains one or more groups, each identified by a Class Name Keyword (there can only be one group per keyword; the actual grouping is just a shortcut and does not carry any specific semantics).
The value of each group is a JSON map (object), the keys of which serve for naming the individual definitions in this group, and the corresponding values provide a set of qualities (name-value pairs) for the individual definition.
(In short, we speak of the map entries as "named sets of qualities".)</t>
        <t>Each group may contain zero or more definitions.
Each identifier defined creates a new type and term in the target namespace.
Declarations have a scope of the current definition block. <!-- what exactly does this mean? -->
        </t>
        <t>A definition may in turn contain other definitions. Each definition is a named set of qualities, i.e., it consists of the newly defined identifier and a set of key-value pairs that represent the defined qualities and contained definitions.</t>
        <t>An example for an Object definition is given in <xref target="exobject"/>:</t>
        <figure anchor="exobject">
          <name>Example Object definition</name>
          <sourcecode type="json"><![CDATA[
"sdfObject": {
  "foo": {
    "sdfProperty": {
      "bar": {
        "type": "boolean"
      }
    }
  }
}
]]></sourcecode>
        </figure>
        <t>This example defines an Object "foo" that is defined in the default namespace (full address: <tt>#/sdfObject/foo</tt>), containing a property that can be addressed as
<tt>#/sdfObject/foo/sdfProperty/bar</tt>, with data of type boolean.
<!-- we could define a URN-style namespace that looks exactly that way -->
        </t>
        <t>Some of the definitions are also declarations: the definition of the entry "bar" in the property "foo" means that each instance of a "foo" can have zero or one instance of a "bar".  Entries within <tt>sdfProperty</tt>, <tt>sdfAction</tt>, and <tt>sdfEvent</tt>, within <tt>sdfObject</tt> entries, are declarations.  Similarly, entries within an <tt>sdfThing</tt> describe instances of <tt>sdfObject</tt> (or nested <tt>sdfThing</tt>) that form part of instances of the Thing.</t>
      </section>
    </section>
    <section anchor="names-and-namespaces">
      <name>Names and namespaces</name>
      <t>SDF definition files may contribute to a global namespace, and may
reference elements from that global namespace.
(An SDF definition file that does not set a defaultNamespace does not
contribute to a global namespace.)</t>
      <section anchor="structure">
        <name>Structure</name>
        <t>Global names look exactly like <tt>https://</tt> URIs with attached fragment identifiers.</t>
        <t>There is no intention to require that these URIs can be dereferenced.
<!-- Looking things up there is a convenience -->
(However, as future versions of SDF might find a use for dereferencing
global names, the URI should be chosen in such a way that this may
become possible in the future.)</t>
        <t>The absolute URI of a global name should be a URI as per <xref section="3" sectionFormat="of" target="RFC3986"/>, with a scheme of "https" and a path (<tt>hier-part</tt> in <xref target="RFC3986"/>).
For the present version of this specification, the query part should
not be used (it might be used in later versions).</t>
        <t>The fragment identifier is constructed as per <xref section="6" sectionFormat="of" target="RFC6901"/>.</t>
      </section>
      <section anchor="contributing-global-names">
        <name>Contributing global names</name>
        <t>The fragment identifier part of a global name defined in an SDF
definition file is constructed from a JSON pointer that selects the
element defined for this name in the SDF definition file.</t>
        <t>The absolute URI part is a copy of the default namespace, i.e., the
default namespace is always the target namespace for a name for which
a definition is contributed.
When emphasizing that name definitions are contributed to the default namespace,
we therefore also call it the "target namespace" of the SDF definition file.</t>
        <t>E.g., in <xref target="example1"/>, definitions for the following global names are contributed:</t>
        <ul spacing="normal">
          <li>https://example.com/capability/cap#/sdfObject/Switch</li>
          <li>https://example.com/capability/cap#/sdfObject/Switch/sdfProperty/value</li>
          <li>https://example.com/capability/cap#/sdfObject/Switch/sdfAction/on</li>
          <li>https://example.com/capability/cap#/sdfObject/Switch/sdfAction/off</li>
        </ul>
        <t>Note the <tt>#</tt>, which separates the absolute-URI part (<xref section="4.3" sectionFormat="of" target="RFC3986"/>) from the fragment identifier part.</t>
      </section>
      <section anchor="referencing-global-names">
        <name>Referencing global names</name>
        <t>A name reference takes the form of the production <tt>curie</tt> in
<xref target="W3C.NOTE-curie-20101216"/> (note that this excludes the production <tt>safe-curie</tt>),
but also limiting the IRIs involved in that production to URIs as per <xref target="RFC3986"/>
and the prefixes to ASCII characters <xref target="RFC0020"/>.</t>
        <t>A name that is contributed by the current SDF definition file can be
referenced by a Same-Document Reference as per <xref section="4.4" sectionFormat="of" target="RFC3986"/>.
As there is little point in referencing the entire SDF definition
file, this will be a <tt>#</tt> followed by a JSON pointer.
This is the only kind of name reference to itself that is possible in an SDF
definition file that does not set a default namespace.</t>
        <t>Name references that point outside the current SDF definition file
need to contain curie prefixes.  These then reference namespace
declarations in the namespaces block.</t>
        <t>For example, if a namespace prefix is defined:</t>
        <sourcecode type="json"><![CDATA[
"namespace": {
  "foo": "https://example.com/"
}
]]></sourcecode>
        <t>Then this reference to that namespace:</t>
        <sourcecode type="json"><![CDATA[
{ "sdfRef": "foo:#/sdfData/temperatureData" }
]]></sourcecode>
        <t>references the global name:</t>
        <sourcecode type="json"><![CDATA[
"https://example.com/#/sdfData/temperatureData"
]]></sourcecode>
        <t>Note that there is no way to provide a URI scheme name in a curie, so
all references outside of the document need to go through the
namespace map.</t>
        <t>Name references occur only in specific elements of the syntax of SDF:</t>
        <ul spacing="normal">
          <li>copying elements via sdfRef values</li>
          <li>pointing to elements via sdfRequired value elements</li>
        </ul>
      </section>
      <section anchor="sdfref">
        <name>sdfRef</name>
        <t>In a JSON map establishing a definition, the keyword "sdfRef" is used
to copy all of the qualities and enclosed definitions of the referenced definition, indicated
by the included name reference, into the newly formed definition.
(This can be compared to the processing of the "$ref" keyword in <xref target="I-D.handrews-json-schema-validation-01"/>.)</t>
        <t>For example, this reference:</t>
        <sourcecode type="json"><![CDATA[
"temperatureProperty": {
  "sdfRef": "#/sdfData/temperatureData"
}
]]></sourcecode>
        <t>creates a new definition "temperatureProperty" that contains all of the qualities defined in the definition at /sdfData/temperatureData.</t>
        <t>The sdfRef member need not be the only member of a map.
Additional members may be present with the intention to override parts
of the referenced map or to add new qualities or definitions.</t>
        <t>When processing sdfRef, if the target definition contains also sdfRef (i.e., is based on yet another definition), that <bcp14>MUST</bcp14> be processed as well.</t>
        <t>More formally, for a JSON map that contains an
sdfRef member, the semantics is defined to be as if the following steps were performed:</t>
        <ol spacing="normal" type="1"><li>The JSON map that contains the sdfRef member is copied into a
variable named "patch".</li>
          <li>The sdfRef member of the copy in "patch" is removed.</li>
          <li>the JSON pointer that is the value of the sdfRef member is
dereferenced and the result is copied into a variable named "original".</li>
          <li>The JSON Merge Patch algorithm <xref target="RFC7396"/> is applied to patch
the contents of "original" with the contents of "patch".</li>
          <li>The result of the Merge Patch is used in place of the value of the
original JSON map.</li>
        </ol>
        <t>TODO: Make sure that the grammar in <xref target="syntax"/> allows specifying the
null values that are necessary to remove members in a merge-patch.</t>
        <section anchor="resolved-models">
          <name>Resolved models</name>
          <t>A model where all sdfRef references are processed as described in <xref target="sdfref"/> is called a resolved model.</t>
          <t>For example, given the following sdfData definitions:</t>
          <sourcecode type="json"><![CDATA[
"sdfData": {
  "Coordinate" : {
    "type": "number", "unit": "m"
  },
  "X-Coordinate" : {
    "sdfRef" : "#/sdfData/Coordinate",
    "description": "Distance from the base of the Thing along the X axis."
  },
  "Non-neg-X-Coordinate" : {
    "sdfRef": "#/sdfData/X-Coordinate",
    "minimum": 0
  }
}
]]></sourcecode>
          <t>After resolving the definitions would look as follows:</t>
          <sourcecode type="json"><![CDATA[
"sdfData": {
  "Coordinate" : {
    "type": "number", "unit": "m"
  },
  "X-Coordinate" : {
    "description": "Distance from the base of the Thing along the X axis.",
    "type": "number", "unit": "m"
  },
  "Non-neg-X-Coordinate" : {
    "description": "Distance from the base of the Thing along the X axis.",
    "minimum": 0, "type": "number", "unit": "m"
  }
}
]]></sourcecode>
        </section>
      </section>
      <section anchor="sdfrequired">
        <name>sdfRequired</name>
        <t>The keyword "sdfRequired" is provided to apply a constraint that
defines for which declarations corresponding data are mandatory in an
instance conforming the current definition.</t>
        <t>The value of "sdfRequired" is an array of name references (JSON pointers), each
indicating one declaration that is mandatory to be represented.</t>
        <t>The example in <xref target="example-req"/> shows two required elements in the sdfObject definition for "temperatureWithAlarm", the sdfProperty "currentTemperature", and the sdfEvent "overTemperatureEvent". The example also shows the use of JSON pointer with "sdfRef" to use a pre-existing definition in this definition, for the "alarmType" data (sdfOutputData) produced by the sdfEvent "overTemperatureEvent".</t>
        <figure anchor="example-req">
          <name>Using sdfRequired</name>
          <sourcecode type="json"><![CDATA[
{
  "sdfObject": {
    "temperatureWithAlarm": {
      "sdfRequired": [
        "#/sdfObject/temperatureWithAlarm/sdfProperty/currentTemperature",
        "#/sdfObject/temperatureWithAlarm/sdfEvent/overTemperatureEvent"
      ],
      "sdfData":{
        "temperatureData": {
          "type": "number"
        }
      },
      "sdfProperty": {
        "currentTemperature": {
          "sdfRef": "#/sdfObject/temperatureWithAlarm/sdfData/temperatureData"
        }
      },
      "sdfEvent": {
        "overTemperatureEvent": {
          "sdfOutputData": {
            "type": "object",
            "properties": {
              "alarmType": {
                "sdfRef": "cap:#/sdfData/alarmTypes/quantityAlarms",
                "const": "OverTemperatureAlarm"
              },
              "temperature": {
                "sdfRef": "#/sdfObject/temperatureWithAlarm/sdfData/temperatureData"
              }
            }
          }
        }
      }
    }
  }
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="common-qualities">
        <name>Common Qualities</name>
        <t>Definitions in SDF share a number of qualities that provide metadata for
them.  These are listed in <xref target="tbl-common-qualities"/>.  None of these
qualities are required or have default values that are assumed if the
quality is absent.
If a label is required for an application and no label is given in the SDF model, the
last part (<tt>reference-token</tt>, <xref section="3" sectionFormat="of" target="RFC6901"/>) of the JSON
pointer to the definition can be used.</t>
        <table anchor="tbl-common-qualities">
          <name>Common Qualities</name>
          <thead>
            <tr>
              <th align="left">Quality</th>
              <th align="left">Type</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">description</td>
              <td align="left">text</td>
              <td align="left">long text (no constraints)</td>
            </tr>
            <tr>
              <td align="left">label</td>
              <td align="left">text</td>
              <td align="left">short text (no constraints)</td>
            </tr>
            <tr>
              <td align="left">$comment</td>
              <td align="left">text</td>
              <td align="left">source code comments only, no semantics</td>
            </tr>
            <tr>
              <td align="left">sdfRef</td>
              <td align="left">sdf-pointer</td>
              <td align="left">(see <xref target="sdfref"/>)</td>
            </tr>
            <tr>
              <td align="left">sdfRequired</td>
              <td align="left">pointer-list</td>
              <td align="left">(see <xref target="sdfrequired"/>, applies to qualities of properties, of data)</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="data-qualities">
        <name>Data Qualities</name>
        <t>Data qualities are used in <tt>sdfData</tt> and <tt>sdfProperty</tt> definitions,
which are named sets of data qualities (abbreviated as <tt>named-sdq</tt>).</t>
        <t><xref target="jso-inspired"/> lists data qualities inspired by the various
proposals at json-schema.org; the
intention is that these (information model level) qualities are
compatible with the (data model) semantics from the
versions of the json-schema.org proposal they were imported from.</t>
        <t><xref target="sdfdataqual2"/> lists data qualities defined specifically for the
present specification.</t>
        <table anchor="sdfdataqual2">
          <name>SDF-defined Qualities of sdfData</name>
          <thead>
            <tr>
              <th align="left">Quality</th>
              <th align="left">Type</th>
              <th align="left">Description</th>
              <th align="left">Default</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">(common)</td>
              <td align="left"> </td>
              <td align="left">
                <xref target="common-qualities"/></td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">unit</td>
              <td align="left">string</td>
              <td align="left">unit name (note 1)</td>
              <td align="left">N/A</td>
            </tr>
            <tr>
              <td align="left">scaleMinimum</td>
              <td align="left">number</td>
              <td align="left">lower limit of value in units given by unit (note 2)</td>
              <td align="left">N/A</td>
            </tr>
            <tr>
              <td align="left">scaleMaximum</td>
              <td align="left">number</td>
              <td align="left">upper limit of value in units given by unit (note 2)</td>
              <td align="left">N/A</td>
            </tr>
            <tr>
              <td align="left">nullable</td>
              <td align="left">boolean</td>
              <td align="left">indicates a null value is available for this type</td>
              <td align="left">true</td>
            </tr>
            <tr>
              <td align="left">contentFormat</td>
              <td align="left">string</td>
              <td align="left">content type (IANA media type string plus parameters), encoding (note 3)</td>
              <td align="left">N/A</td>
            </tr>
            <tr>
              <td align="left">sdfType</td>
              <td align="left">string (<xref target="sdftype"/>)</td>
              <td align="left">sdfType enumeration (extensible)</td>
              <td align="left">N/A</td>
            </tr>
            <tr>
              <td align="left">sdfChoice</td>
              <td align="left">named set of data qualities (<xref target="sdfchoice"/>)</td>
              <td align="left">named alternatives</td>
              <td align="left">N/A</td>
            </tr>
            <tr>
              <td align="left">enum</td>
              <td align="left">array of strings</td>
              <td align="left">abbreviation for string-valued named alternatives</td>
              <td align="left">N/A</td>
            </tr>
          </tbody>
        </table>
        <ol spacing="normal" type="1"><li>
            <t>Note that the quality <tt>unit</tt> was called <tt>units</tt> in SDF 1.0.
The unit name <bcp14>SHOULD</bcp14> be as
per the <xref section="SenML Units" relative="#senml-units" sectionFormat="bare" target="RFC8428"/> Registry
or the <xref section="Secondary Units" relative="#secondary-units" sectionFormat="bare" target="RFC8798"/> Registry in <xref target="IANA.senml"/>
as specified by
Sections <xref target="RFC8428" section="4.5.1" sectionFormat="bare"/> and <xref target="RFC8428" section="12.1" sectionFormat="bare"/> of <xref target="RFC8428"/> and <xref section="3" sectionFormat="of" target="RFC8798"/>, respectively.  </t>
            <t>
Exceptionally, if a registration in these registries cannot be
obtained or would be inappropriate, the unit name can also be a URI
that is pointing to a definition of the unit.  Note that SDF
processors are not expected to (and normally <bcp14>SHOULD NOT</bcp14>)
dereference these URIs; they may be useful to humans, though.
A URI unit name is distinguished from a registered unit name by the
presence of a colon; registered unit names that contain a colon (at
the time of writing, none) can therefore not be used in SDF.  </t>
            <t>
For use by translators into ecosystems that require URIs for unit
names, the URN sub-namespace "urn:ietf:params:unit" is provided
(<xref target="unit-urn"/>); URNs from this sub-namespace <bcp14>MUST NOT</bcp14> be used in a
<tt>unit</tt> quality, in favor of simply notating the unit name (e.g.,
<tt>kg</tt> instead of <tt>urn:ietf:params:unit:kg</tt>).</t>
          </li>
          <li>these qualities were included in SDF 1.0, but were not fully
 defined; they are not included in SDF 1.1.  In 1.next, they will
 be replaced by qualities to express scaling that are more aligned
 with the processes that combine ecosystem and instance specific
 information with an SDF model.</li>
          <li>The <tt>contentFormat</tt> quality follows the Content-Format-Spec as defined in
<xref section="6" sectionFormat="of" target="RFC9193"/>, allowing for expressing both numeric and string
based Content-Formats.</li>
        </ol>
        <section anchor="sdftype">
          <name>sdfType</name>
          <t>SDF defines a number of basic types beyond those provided by JSON or
JSO.  These types are identified by the <tt>sdfType</tt> quality, which
is a text string from a set of type names defined by SDF.</t>
          <t>To aid interworking with <xref target="I-D.handrews-json-schema-validation-01"/> implementations, it is <bcp14>RECOMMENDED</bcp14>
that <tt>sdfType</tt> is always used in conjunction with the <tt>type</tt> quality
inherited from <xref target="I-D.handrews-json-schema-validation-01"/>, in such a way as to yield a common
representation of the type's values in JSON.</t>
          <t>Values for <tt>sdfType</tt> that are defined in SDF 1.1 are shown in
<xref target="sdftype1"/>.
This table also gives a description of the semantics of the sdfType,
the conventional value for <tt>type</tt> to be used with the <tt>sdfType</tt> value,
and a conventional JSON representation for values of the type.</t>
          <table anchor="sdftype1">
            <name>Values defined in SDF 1.1 for sdfType quality</name>
            <thead>
              <tr>
                <th align="left">sdfType</th>
                <th align="left">Description</th>
                <th align="left">type</th>
                <th align="left">JSON Representation</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">byte-string</td>
                <td align="left">A sequence of zero or more bytes</td>
                <td align="left">string</td>
                <td align="left">base64url without padding (<xref section="3.4.5.2" sectionFormat="of" target="RFC8949"/>)</td>
              </tr>
              <tr>
                <td align="left">unix-time</td>
                <td align="left">A point in civil time (note 1)</td>
                <td align="left">number</td>
                <td align="left">POSIX time (<xref section="3.4.2" sectionFormat="of" target="RFC8949"/>)</td>
              </tr>
            </tbody>
          </table>
          <t>(1) Note that the definition of <tt>unix-time</tt> does not imply the
capability to represent points in time that fall on leap seconds.
More date/time-related sdfTypes are likely to be added in future versions
of this specification.</t>
          <t>In SDF 1.0, a similar concept was called <tt>subtype</tt>.</t>
        </section>
        <section anchor="sdfchoice">
          <name>sdfChoice</name>
          <t>Data can be a choice of named alternatives, called <tt>sdfChoice</tt>.
Each alternative is identified by a name (string, key in the JSON
object used to represent the choice) and a set of dataqualities
(object, the value in the JSON object used to represent the choice).
Dataqualities that are specified at the same level as the sdfChoice
apply to all choices in the sdfChoice, except those specific choices
where the dataquality is overridden at the choice level.</t>
          <t>sdfChoice merges the functions of two constructs found in <xref target="I-D.handrews-json-schema-validation-01"/>:</t>
          <ul spacing="normal">
            <li>
              <t><tt>enum</tt>  </t>
              <t>
What would have been  </t>
              <sourcecode type="json"><![CDATA[
"enum": ["foo", "bar", "baz"]
]]></sourcecode>
              <t>
in SDF 1.0, is often best represented as:  </t>
              <sourcecode type="json"><![CDATA[
"sdfChoice": {
  "foo": { "description": "This is a foonly"},
  "bar": { "description": "As defined in the second world congress"},
  "baz": { "description": "From zigbee foobaz"}
}
]]></sourcecode>
              <t>
This allows the placement of other dataqualities such as
<tt>description</tt> in the example.  </t>
              <t>
If an enum needs to use a data type different from text string,
e.g. what would have been  </t>
              <sourcecode type="json"><![CDATA[
"type": "number",
"enum": [1, 2, 3]
]]></sourcecode>
              <t>
in SDF 1.0, is represented as:  </t>
              <sourcecode type="json"><![CDATA[
"type": "number",
"sdfChoice": {
  "a-better-name-for-alternative-1": { "const": 1 },
  "alternative-2": { "const": 2 },
  "the-third-alternative": { "const": 3 }
}
]]></sourcecode>
              <t>
where the string names obviously would be chosen in a way that is
descriptive for what these numbers actually stand for; sdfChoice
also makes it easy to add number ranges into the mix.  </t>
              <t>
(Note that <tt>const</tt> can also be used for strings as in the previous
example, e.g., if the actual string value is indeed a crucial
element for the data model.)</t>
            </li>
            <li>
              <t>anyOf  </t>
              <t><xref target="I-D.handrews-json-schema-validation-01"/> provides a type union called <tt>anyOf</tt>, which provides a
choice between anonymous alternatives.  </t>
              <t>
What could have been  </t>
              <sourcecode type="json"><![CDATA[
"anyOf": [
  {"type": "array", "minItems": 3, "maxItems": "3", "items": {
     "$ref": "#/sdfData/rgbVal"}},
  {"type": "array", "minItems": 4, "maxItems": "4", "items": {
     "$ref": "#/sdfData/cmykVal"}}
]
]]></sourcecode>
              <t>
in <xref target="I-D.handrews-json-schema-validation-01"/> can be more descriptively notated in SDF as:  </t>
              <sourcecode type="json"><![CDATA[
"sdfChoice": {
  "rgb": {"type": "array", "minItems": 3, "maxItems": "3", "items": {
            "sdfRef": "#/sdfData/rgbVal"}},
  "cmyk": {"type": "array", "minItems": 4, "maxItems": "4", "items": {
            "sdfRef": "#/sdfData/cmykVal"}}
}
]]></sourcecode>
            </li>
          </ul>
          <t>Note that there is no need in SDF for the type intersection construct
<tt>allOf</tt> or the peculiar type-xor construct <tt>oneOf</tt> found in <xref target="I-D.handrews-json-schema-validation-01"/>.</t>
          <t>As a simplification for readers of SDF specifications accustomed to
the <xref target="I-D.handrews-json-schema-validation-01"/> enum keyword, this is retained, but limited to a choice
of text string values, such that</t>
          <sourcecode type="json"><![CDATA[
"enum": ["foo", "bar", "baz"]
]]></sourcecode>
          <t>is syntactic sugar for</t>
          <sourcecode type="json"><![CDATA[
"sdfChoice": {
  "foo": { "const": "foo"},
  "bar": { "const": "bar"},
  "baz": { "const": "baz"}
}
]]></sourcecode>
        </section>
      </section>
    </section>
    <section anchor="keywords-for-definition-groups">
      <name>Keywords for definition groups</name>
      <t>The following SDF keywords are used to create definition groups in the target namespace.
All these definitions share some common qualities as discussed in <xref target="common-qualities"/>.</t>
      <section anchor="sdfobject-1">
        <name>sdfObject</name>
        <t>The sdfObject keyword denotes a group of zero or more Object definitions.
Object definitions may contain or include definitions of Properties, Actions, Events declared for the object, as well as data types (sdfData group) to be used in this or other Objects.</t>
        <t>The qualities of an sdfObject include the common qualities, additional qualities are shown in <xref target="sdfobjqual"/>.
None of these
qualities are required or have default values that are assumed if the
quality is absent.</t>
        <table anchor="sdfobjqual">
          <name>Qualities of sdfObject</name>
          <thead>
            <tr>
              <th align="left">Quality</th>
              <th align="left">Type</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">(common)</td>
              <td align="left"> </td>
              <td align="left">
                <xref target="common-qualities"/></td>
            </tr>
            <tr>
              <td align="left">sdfProperty</td>
              <td align="left">property</td>
              <td align="left">zero or more named property definitions for this object</td>
            </tr>
            <tr>
              <td align="left">sdfAction</td>
              <td align="left">action</td>
              <td align="left">zero or more named action definitions for this object</td>
            </tr>
            <tr>
              <td align="left">sdfEvent</td>
              <td align="left">event</td>
              <td align="left">zero or more named event definitions for this object</td>
            </tr>
            <tr>
              <td align="left">sdfData</td>
              <td align="left">named-sdq</td>
              <td align="left">zero or more named data type definitions that might be used in the above</td>
            </tr>
            <tr>
              <td align="left">minItems</td>
              <td align="left">number</td>
              <td align="left">(array) Minimum number of sdfObject instances in array</td>
            </tr>
            <tr>
              <td align="left">maxItems</td>
              <td align="left">number</td>
              <td align="left">(array) Maximum number of sdfObject instances in array</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="sdfproperty-1">
        <name>sdfProperty</name>
        <t>The sdfProperty keyword denotes a group of zero or more Property definitions.</t>
        <t>Properties are used to model elements of state.</t>
        <t>The qualities of a Property definition include the data qualities (and
thus the common qualities), see <xref target="data-qualities"/>, additional qualities are shown in <xref target="sdfpropqual"/>.</t>
        <table anchor="sdfpropqual">
          <name>Qualities of sdfProperty</name>
          <thead>
            <tr>
              <th align="left">Quality</th>
              <th align="left">Type</th>
              <th align="left">Description</th>
              <th align="left">Default</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">(data)</td>
              <td align="left"> </td>
              <td align="left">
                <xref target="data-qualities"/></td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">readable</td>
              <td align="left">boolean</td>
              <td align="left">Reads are allowed</td>
              <td align="left">true</td>
            </tr>
            <tr>
              <td align="left">writable</td>
              <td align="left">boolean</td>
              <td align="left">Writes are allowed</td>
              <td align="left">true</td>
            </tr>
            <tr>
              <td align="left">observable</td>
              <td align="left">boolean</td>
              <td align="left">flag to indicate asynchronous notification is available</td>
              <td align="left">true</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="sdfaction">
        <name>sdfAction</name>
        <t>The sdfAction keyword denotes a group of zero or more Action definitions.</t>
        <t>Actions are used to model commands and methods which are invoked. Actions have parameter data that are supplied upon invocation.</t>
        <t>The qualities of an Action definition include the common qualities, additional qualities are shown in <xref target="sdfactqual"/>.</t>
        <table anchor="sdfactqual">
          <name>Qualities of sdfAction</name>
          <thead>
            <tr>
              <th align="left">Quality</th>
              <th align="left">Type</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">(common)</td>
              <td align="left"> </td>
              <td align="left">
                <xref target="common-qualities"/></td>
            </tr>
            <tr>
              <td align="left">sdfInputData</td>
              <td align="left">map</td>
              <td align="left">data qualities of the input data for an Action</td>
            </tr>
            <tr>
              <td align="left">sdfOutputData</td>
              <td align="left">map</td>
              <td align="left">data qualities of the output data for an Action</td>
            </tr>
            <tr>
              <td align="left">sdfData</td>
              <td align="left">named-sdq</td>
              <td align="left">zero or more named data type definitions that might be used in the above</td>
            </tr>
          </tbody>
        </table>
        <t><tt>sdfInputData</tt> defines the input data of the action.  <tt>sdfOutputData</tt>
defines the output data of the action.
As discussed in <xref target="sdfaction-overview"/>, a set of data qualities with
type "object" can be used to substructure either data item, with
optionality indicated by the data quality <tt>required</tt>.</t>
      </section>
      <section anchor="sdfevent">
        <name>sdfEvent</name>
        <t>The sdfEvent keyword denotes zero or more Event definitions.</t>
        <t>Events are used to model asynchronous occurrences that may be communicated proactively. Events have data elements which are communicated upon the occurrence of the event.</t>
        <t>The qualities of sdfEvent include the common qualities, additional qualities are shown in <xref target="sdfevqual"/>.</t>
        <table anchor="sdfevqual">
          <name>Qualities of sdfEvent</name>
          <thead>
            <tr>
              <th align="left">Quality</th>
              <th align="left">Type</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">(common)</td>
              <td align="left"> </td>
              <td align="left">
                <xref target="common-qualities"/></td>
            </tr>
            <tr>
              <td align="left">sdfOutputData</td>
              <td align="left">map</td>
              <td align="left">data qualities of the output data for an Event</td>
            </tr>
            <tr>
              <td align="left">sdfData</td>
              <td align="left">named-sdq</td>
              <td align="left">zero or more named data type definitions that might be used in the above</td>
            </tr>
          </tbody>
        </table>
        <t><tt>sdfOutputData</tt> defines the output data of the action.
As discussed in <xref target="sdfevent-overview"/>, a set of data qualities with
type "object" can be used to substructure the output data item, with
optionality indicated by the data quality <tt>required</tt>.</t>
      </section>
      <section anchor="sdfdata-1">
        <name>sdfData</name>
        <t>The sdfData keyword denotes a group of zero or more named data type
definitions (named-sdq).</t>
        <t>An sdfData definition provides a reusable semantic identifier for a
type of data item and describes the constraints on the defined type.
It is not itself a declaration, i.e., it does not cause any of these
data items to be included in an affordance definition.</t>
        <t>The qualities of sdfData include the data qualities (and thus the common qualities), see <xref target="data-qualities"/>.</t>
      </section>
    </section>
    <section anchor="high-level-composition">
      <name>High Level Composition</name>
      <t>The requirements for high level composition include the following:</t>
      <ul spacing="normal">
        <li>The ability to represent products, standardized product types, and modular products while maintaining the atomicity of Objects.</li>
        <li>The ability to compose a reusable definition block from Objects, for example a single plug unit of an outlet strip with on/off control, energy monitor, and optional dimmer objects, while retaining the atomicity of the individual objects.</li>
        <li>The ability to compose Objects and other definition blocks into a higher level thing that represents a product, while retaining the atomicity of objects.</li>
        <li>The ability to enrich and refine a base definition to have product-specific qualities and quality values, e.g. unit, range, and scale settings.</li>
        <li>The ability to reference items in one part of a complex definition from another part of the same definition, for example to summarize the energy readings from all plugs in an outlet strip.</li>
      </ul>
      <section anchor="paths-in-the-model-namespaces">
        <name>Paths in the model namespaces</name>
        <t>The model namespace is organized according to terms that are defined in the definition files that are present in the namespace. For example, definitions that originate from an organization or vendor are expected to be in a namespace that is specific to that organization or vendor. There is expected to be an SDF namespace for common SDF definitions used in OneDM.</t>
        <t>The structure of a path in a namespace is defined by the JSON Pointers to the definitions in the files in that namespace. For example, if there is a file defining an object "Switch" with an action "on", then the reference to the action would be "ns:/sdfObject/Switch/sdfAction/on" where <tt>ns</tt> is the namespace prefix (short name for the namespace).</t>
      </section>
      <section anchor="modular-composition">
        <name>Modular Composition</name>
        <t>Modular composition of definitions enables an existing definition (could be in the same file or another file) to become part of a new definition by including a reference to the existing definition within the model namespace.</t>
        <section anchor="use-of-the-sdfref-keyword-to-re-use-a-definition">
          <name>Use of the "sdfRef" keyword to re-use a definition</name>
          <t>An existing definition may be used as a template for a new definition, that is, a new definition is created in the target namespace which uses the defined qualities of some existing definition. This pattern will use the keyword "sdfRef" as a quality of a new definition with a value consisting of a reference to the existing definition that is to be used as a template.</t>
          <t>In the definition that uses "sdfRef", new qualities may be added
and existing qualities from the referenced definition may be
overridden.  (Note that JSON maps (objects) do not have a defined
order, so the SDF processor may see these overrides before seeing the
<tt>sdfRef</tt>.)</t>
          <t>As a convention, overrides are intended to be used only for further restricting
the set of data values, as shown in <xref target="exa-sdfref"/>:  any value for a
<tt>cable-length</tt> also is a valid value for a <tt>length</tt>, with the
additional restriction that the length cannot be smaller than 5 cm.
(This is labeled as a convention as it cannot be checked in the
general case; a quality of implementation consideration for a tool
might be to provide at least some form of checking.)
Note that a description is provided that overrides the description of
the referenced definition; as this quality is intended for human
consumption there is no conflict with the intended goal.</t>
          <figure anchor="exa-sdfref">
            <artwork><![CDATA[
"sdfData":
  "length" : {
    "type": "number",
    "minimum": 0,
    "unit": "m"
    "description": "There can be no negative lengths."
  }
...
  "cable-length" : {
    "sdfRef": "#/sdfData/length"
    "minimum": 5e-2,
    "description": "Cables must be at least 5 cm."
  }
]]></artwork>
          </figure>
        </section>
      </section>
      <section anchor="sdfthing-1">
        <name>sdfThing</name>
        <t>An sdfThing is a set of declarations and qualities that may be part of a more complex model. For example, the object declarations that make up the definition of a single socket of an outlet strip could be encapsulated in an sdfThing, and the socket-thing itself could be used in a declaration in the sdfThing definition for the outlet strip
(see <xref target="exa-sdfthing-outlet-strip"/> in {outlet-strip-example}} for an example SDF model).</t>
        <t>sdfThing definitions carry semantic meaning, such as a defined refrigerator compartment and a defined freezer compartment, making up a combination refrigerator-freezer product.
An <tt>sdfThing</tt> can also contain Interaction Affordances and sdfData itself, such
as a status (on/off) for the refrigerator-freezer as a whole (see
<xref target="exa-sdfthing-fridge-freezer"/> in <xref target="fridge-freezer-example"/> for an example SDF
model illustrating these aspects).</t>
        <t>An sdfThing may be composed of sdfObjects and other sdfThings.</t>
        <t>The qualities of sdfThing are shown in <xref target="sdfthingqual"/>.</t>
        <table anchor="sdfthingqual">
          <name>Qualities of sdfThing</name>
          <thead>
            <tr>
              <th align="left">Quality</th>
              <th align="left">Type</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">(common)</td>
              <td align="left"> </td>
              <td align="left">
                <xref target="common-qualities"/></td>
            </tr>
            <tr>
              <td align="left">sdfThing</td>
              <td align="left">thing</td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">sdfObject</td>
              <td align="left">object</td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">sdfProperty</td>
              <td align="left">property</td>
              <td align="left">zero or more named property definitions for this thing</td>
            </tr>
            <tr>
              <td align="left">sdfAction</td>
              <td align="left">action</td>
              <td align="left">zero or more named action definitions for this thing</td>
            </tr>
            <tr>
              <td align="left">sdfEvent</td>
              <td align="left">event</td>
              <td align="left">zero or more named event definitions for this thing</td>
            </tr>
            <tr>
              <td align="left">sdfData</td>
              <td align="left">named-sdq</td>
              <td align="left">zero or more named data type definitions that might be used in the above</td>
            </tr>
            <tr>
              <td align="left">minItems</td>
              <td align="left">number</td>
              <td align="left">(array) Minimum number of sdfThing instances in array</td>
            </tr>
            <tr>
              <td align="left">maxItems</td>
              <td align="left">number</td>
              <td align="left">(array) Maximum number of sdfThing instances in array</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <section anchor="media-type">
        <name>Media Type</name>
        <t>IANA is requested to add the following Media-Type to the "Media Types" registry.</t>
        <table align="left">
          <thead>
            <tr>
              <th align="left">Name</th>
              <th align="left">Template</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">sdf+json</td>
              <td align="left">application/sdf+json</td>
              <td align="left">RFC XXXX, <xref target="media-type"/></td>
            </tr>
          </tbody>
        </table>
        <t>// RFC Ed.: please replace RFC XXXX with this RFC number and remove this note.</t>
        <dl spacing="compact">
          <dt>Type name:</dt>
          <dd>
            <t>application</t>
          </dd>
          <dt>Subtype name:</dt>
          <dd>
            <t>sdf+json</t>
          </dd>
          <dt>Required parameters:</dt>
          <dd>
            <t>none</t>
          </dd>
          <dt>Optional parameters:</dt>
          <dd>
            <t>none</t>
          </dd>
          <dt>Encoding considerations:</dt>
          <dd>
            <t>binary (JSON is UTF-8-encoded text)</t>
          </dd>
          <dt>Security considerations:</dt>
          <dd>
            <t><xref target="seccons"/> of RFC XXXX</t>
          </dd>
          <dt>Interoperability considerations:</dt>
          <dd>
            <t>none</t>
          </dd>
          <dt>Published specification:</dt>
          <dd>
            <t><xref target="media-type"/> of RFC XXXX</t>
          </dd>
          <dt>Applications that use this media type:</dt>
          <dd>
            <t>Tools for data and interaction modeling in the Internet of Things</t>
          </dd>
          <dt>Fragment identifier considerations:</dt>
          <dd>
            <t>A JSON Pointer fragment identifier may be used, as defined in
<xref section="6" sectionFormat="of" target="RFC6901"/>.</t>
          </dd>
          <dt>Person &amp; email address to contact for further information:</dt>
          <dd>
            <t>ASDF WG mailing list (asdf@ietf.org),
or IETF Applications and Real-Time Area (art@ietf.org)</t>
          </dd>
          <dt>Intended usage:</dt>
          <dd>
            <t>COMMON</t>
          </dd>
          <dt>Restrictions on usage:</dt>
          <dd>
            <t>none</t>
          </dd>
          <dt>Author/Change controller:</dt>
          <dd>
            <t>IETF</t>
          </dd>
          <dt>Provisional registration:</dt>
          <dd>
            <t>no</t>
          </dd>
        </dl>
      </section>
      <section anchor="unit-urn">
        <name>IETF URN Sub-namespace for Unit Names (urn:ietf:params:unit)</name>
        <t>IANA is requested to register the following value in the "<xref section="IETF URN Sub-namespace for Registered Protocol Parameter Identifiers" relative="#params-1" sectionFormat="bare" target="IANA.params"/>" registry, following the template in
<xref target="RFC3553"/>:</t>
        <dl>
          <dt>Registry name:</dt>
          <dd>
            <t>unit</t>
          </dd>
          <dt>Specification:</dt>
          <dd>
            <t>RFC XXXX</t>
          </dd>
          <dt>Repository:</dt>
          <dd>
            <t>combining the symbol values from the <xref section="SenML Units" relative="#senml-units" sectionFormat="bare" target="IANA.senml"/> Registry and the <xref section="Secondary Units" relative="#secondary-units" sectionFormat="bare" target="IANA.senml"/> Registry in <xref target="IANA.senml"/> as specified by Sections <xref target="RFC8428" section="4.5.1" sectionFormat="bare"/> and <xref target="RFC8428" section="12.1" sectionFormat="bare"/> of <xref target="RFC8428"/> and <xref section="3" sectionFormat="of" target="RFC8798"/>,
respectively (which by the registration policy are guaranteed to be
non-overlapping).</t>
          </dd>
          <dt>Index value:</dt>
          <dd>
            <t>Percent-encoding (<xref section="2.1" sectionFormat="of" target="RFC3986"/>) is required of
any characters in unit names as required by ABNF rule "pchar" in
<xref section="3.3" sectionFormat="of" target="RFC3986"/>, specifically at the time of writing for the
unit names "%" (deprecated in favor of "/"), "%RH", "%EL".</t>
          </dd>
        </dl>
      </section>
      <section anchor="registries">
        <name>Registries</name>
        <t>(TBD: After future additions, check if we need any.)</t>
      </section>
    </section>
    <section anchor="seccons">
      <name>Security Considerations</name>
      <t>Some wider issues are discussed in <xref target="RFC8576"/>.</t>
      <t>(Specifics: TBD.)</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="IANA.senml" target="https://www.iana.org/assignments/senml">
          <front>
            <title>Sensor Measurement Lists (SenML)</title>
            <author>
              <organization>IANA</organization>
            </author>
          </front>
          <format target="http://www.iana.org/assignments/senml" type="TXT"/>
        </reference>
        <reference anchor="IANA.params" target="https://www.iana.org/assignments/params">
          <front>
            <title>Uniform Resource Name (URN) Namespace for IETF Use</title>
            <author>
              <organization>IANA</organization>
            </author>
          </front>
          <format target="http://www.iana.org/assignments/params" type="TXT"/>
        </reference>
        <reference anchor="RFC3339" target="https://www.rfc-editor.org/info/rfc3339">
          <front>
            <title>Date and Time on the Internet: Timestamps</title>
            <author fullname="G. Klyne" initials="G." surname="Klyne">
              <organization/>
            </author>
            <author fullname="C. Newman" initials="C." surname="Newman">
              <organization/>
            </author>
            <date month="July" year="2002"/>
            <abstract>
              <t>This document defines a date and time format for use in Internet protocols that is a profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3339"/>
          <seriesInfo name="DOI" value="10.17487/RFC3339"/>
        </reference>
        <reference anchor="RFC8428" target="https://www.rfc-editor.org/info/rfc8428">
          <front>
            <title>Sensor Measurement Lists (SenML)</title>
            <author fullname="C. Jennings" initials="C." surname="Jennings">
              <organization/>
            </author>
            <author fullname="Z. Shelby" initials="Z." surname="Shelby">
              <organization/>
            </author>
            <author fullname="J. Arkko" initials="J." surname="Arkko">
              <organization/>
            </author>
            <author fullname="A. Keranen" initials="A." surname="Keranen">
              <organization/>
            </author>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <date month="August" year="2018"/>
            <abstract>
              <t>This specification defines a format for representing simple sensor measurements and device parameters in Sensor Measurement Lists (SenML).  Representations are defined in JavaScript Object Notation (JSON), Concise Binary Object Representation (CBOR), Extensible Markup Language (XML), and Efficient XML Interchange (EXI), which share the common SenML data model.  A simple sensor, such as a temperature sensor, could use one of these media types in protocols such as HTTP or the Constrained Application Protocol (CoAP) to transport the measurements of the sensor or to be configured.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8428"/>
          <seriesInfo name="DOI" value="10.17487/RFC8428"/>
        </reference>
        <reference anchor="RFC8798" target="https://www.rfc-editor.org/info/rfc8798">
          <front>
            <title>Additional Units for Sensor Measurement Lists (SenML)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <date month="June" year="2020"/>
            <abstract>
              <t>The Sensor Measurement Lists (SenML) media type supports the indication of units for a quantity represented.  This short document registers a number of additional unit names in the IANA registry for units in SenML.  It also defines a registry for secondary units that cannot be in SenML's main registry, as they are derived by linear transformation from units already in that registry.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8798"/>
          <seriesInfo name="DOI" value="10.17487/RFC8798"/>
        </reference>
        <reference anchor="RFC3986" target="https://www.rfc-editor.org/info/rfc3986">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee">
              <organization/>
            </author>
            <author fullname="R. Fielding" initials="R." surname="Fielding">
              <organization/>
            </author>
            <author fullname="L. Masinter" initials="L." surname="Masinter">
              <organization/>
            </author>
            <date month="January" year="2005"/>
            <abstract>
              <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource.  This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet.  The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier.  This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="66"/>
          <seriesInfo name="RFC" value="3986"/>
          <seriesInfo name="DOI" value="10.17487/RFC3986"/>
        </reference>
        <reference anchor="RFC4122" target="https://www.rfc-editor.org/info/rfc4122">
          <front>
            <title>A Universally Unique IDentifier (UUID) URN Namespace</title>
            <author fullname="P. Leach" initials="P." surname="Leach">
              <organization/>
            </author>
            <author fullname="M. Mealling" initials="M." surname="Mealling">
              <organization/>
            </author>
            <author fullname="R. Salz" initials="R." surname="Salz">
              <organization/>
            </author>
            <date month="July" year="2005"/>
            <abstract>
              <t>This specification defines a Uniform Resource Name namespace for UUIDs (Universally Unique IDentifier), also known as GUIDs (Globally Unique IDentifier).  A UUID is 128 bits long, and can guarantee uniqueness across space and time.  UUIDs were originally used in the Apollo Network Computing System and later in the Open Software Foundation\'s (OSF) Distributed Computing Environment (DCE), and then in Microsoft Windows platforms.</t>
              <t>This specification is derived from the DCE specification with the kind permission of the OSF (now known as The Open Group).  Information from earlier versions of the DCE specification have been incorporated into this document.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4122"/>
          <seriesInfo name="DOI" value="10.17487/RFC4122"/>
        </reference>
        <reference anchor="RFC6901" target="https://www.rfc-editor.org/info/rfc6901">
          <front>
            <title>JavaScript Object Notation (JSON) Pointer</title>
            <author fullname="P. Bryan" initials="P." role="editor" surname="Bryan">
              <organization/>
            </author>
            <author fullname="K. Zyp" initials="K." surname="Zyp">
              <organization/>
            </author>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham">
              <organization/>
            </author>
            <date month="April" year="2013"/>
            <abstract>
              <t>JSON Pointer defines a string syntax for identifying a specific value within a JavaScript Object Notation (JSON) document.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6901"/>
          <seriesInfo name="DOI" value="10.17487/RFC6901"/>
        </reference>
        <reference anchor="RFC7396" target="https://www.rfc-editor.org/info/rfc7396">
          <front>
            <title>JSON Merge Patch</title>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman">
              <organization/>
            </author>
            <author fullname="J. Snell" initials="J." surname="Snell">
              <organization/>
            </author>
            <date month="October" year="2014"/>
            <abstract>
              <t>This specification defines the JSON merge patch format and processing rules.  The merge patch format is primarily intended for use with the HTTP PATCH method as a means of describing a set of modifications to a target resource's content.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7396"/>
          <seriesInfo name="DOI" value="10.17487/RFC7396"/>
        </reference>
        <reference anchor="RFC8610" target="https://www.rfc-editor.org/info/rfc8610">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz">
              <organization/>
            </author>
            <author fullname="C. Vigano" initials="C." surname="Vigano">
              <organization/>
            </author>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <date month="June" year="2019"/>
            <abstract>
              <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049).  Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
        <reference anchor="RFC8949" target="https://www.rfc-editor.org/info/rfc8949">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman">
              <organization/>
            </author>
            <date month="December" year="2020"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
              <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049.  It does not create a new version of the format.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="94"/>
          <seriesInfo name="RFC" value="8949"/>
          <seriesInfo name="DOI" value="10.17487/RFC8949"/>
        </reference>
        <reference anchor="RFC9193" target="https://www.rfc-editor.org/info/rfc9193">
          <front>
            <title>Sensor Measurement Lists (SenML) Fields for Indicating Data Value Content-Format</title>
            <author fullname="A. Keränen" initials="A." surname="Keränen">
              <organization/>
            </author>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Sensor Measurement Lists (SenML) media types support multiple types of values, from numbers to text strings and arbitrary binary Data Values. In order to facilitate processing of binary Data Values, this document specifies a pair of new SenML fields for indicating the content format of those binary Data Values, i.e., their Internet media type, including parameters as well as any content codings applied.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9193"/>
          <seriesInfo name="DOI" value="10.17487/RFC9193"/>
        </reference>
        <reference anchor="W3C.NOTE-curie-20101216" target="https://www.w3.org/TR/2010/NOTE-curie-20101216/">
          <front>
            <title>CURIE Syntax 1.0</title>
            <author fullname="Mark Birbeck" role="editor"/>
            <author fullname="Shane McCarron" role="editor"/>
            <date day="16" month="December" year="2010"/>
          </front>
          <seriesInfo name="W3C NOTE" value="NOTE-curie-20101216"/>
          <seriesInfo name="W3C" value="NOTE-curie-20101216"/>
        </reference>
        <reference anchor="RFC0020" target="https://www.rfc-editor.org/info/rfc20">
          <front>
            <title>ASCII format for network interchange</title>
            <author fullname="V.G. Cerf" initials="V.G." surname="Cerf">
              <organization/>
            </author>
            <date month="October" year="1969"/>
          </front>
          <seriesInfo name="STD" value="80"/>
          <seriesInfo name="RFC" value="20"/>
          <seriesInfo name="DOI" value="10.17487/RFC0020"/>
        </reference>
        <reference anchor="SPDX" target="https://spdx.org/licenses/">
          <front>
            <title>SPDX License List</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="RFC9165" target="https://www.rfc-editor.org/info/rfc9165">
          <front>
            <title>Additional Control Operators for the Concise Data Definition Language (CDDL)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <date month="December" year="2021"/>
            <abstract>
              <t>The Concise Data Definition Language (CDDL), standardized in RFC 8610, provides "control operators" as its main language extension point.</t>
              <t>The present document defines a number of control operators that were not yet ready at the time RFC 8610 was completed: , , and  for the construction of constants; / for including ABNF (RFC 5234 and RFC 7405) in CDDL specifications; and for indicating the use of a non-basic feature in an instance.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9165"/>
          <seriesInfo name="DOI" value="10.17487/RFC9165"/>
        </reference>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner">
              <organization/>
            </author>
            <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" target="https://www.rfc-editor.org/info/rfc8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <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="RFC3553" target="https://www.rfc-editor.org/info/rfc3553">
          <front>
            <title>An IETF URN Sub-namespace for Registered Protocol Parameters</title>
            <author fullname="M. Mealling" initials="M." surname="Mealling">
              <organization/>
            </author>
            <author fullname="L. Masinter" initials="L." surname="Masinter">
              <organization/>
            </author>
            <author fullname="T. Hardie" initials="T." surname="Hardie">
              <organization/>
            </author>
            <author fullname="G. Klyne" initials="G." surname="Klyne">
              <organization/>
            </author>
            <date month="June" year="2003"/>
            <abstract>
              <t>This document describes a new sub-delegation for the 'ietf' URN namespace for registered protocol items.  The 'ietf' URN namespace is defined in RFC 2648 as a root for persistent URIs that refer to IETF- defined resources.  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="73"/>
          <seriesInfo name="RFC" value="3553"/>
          <seriesInfo name="DOI" value="10.17487/RFC3553"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="I-D.handrews-json-schema-validation-01" target="https://www.ietf.org/archive/id/draft-handrews-json-schema-validation-01.txt">
          <front>
            <title>JSON Schema Validation: A Vocabulary for Structural Validation of JSON</title>
            <author fullname="Austin Wright" initials="A." surname="Wright">
         </author>
            <author fullname="Henry Andrews" initials="H." surname="Andrews">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <author fullname="Geraint Luff" initials="G." surname="Luff">
         </author>
            <date day="19" month="March" year="2018"/>
            <abstract>
              <t>   JSON Schema (application/schema+json) has several purposes, one of
   which is JSON instance validation.  This document specifies a
   vocabulary for JSON Schema to describe the meaning of JSON documents,
   provide hints for user interfaces working with JSON data, and to make
   assertions about what a valid document must look like.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-handrews-json-schema-validation-01"/>
        </reference>
        <reference anchor="I-D.wright-json-schema" target="https://www.ietf.org/archive/id/draft-wright-json-schema-01.txt">
          <front>
            <title>JSON Schema: A Media Type for Describing JSON Documents</title>
            <author fullname="Austin Wright" initials="A." surname="Wright">
         </author>
            <author fullname="Henry Andrews" initials="H." surname="Andrews">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <date day="16" month="April" year="2017"/>
            <abstract>
              <t>   JSON Schema defines the media type "application/schema+json", a JSON-
   based format for describing the structure of JSON data.  JSON Schema
   asserts what a JSON document must look like, ways to extract
   information from it, and how to interact with it, ideal for
   annotating existing JSON APIs that would not otherwise have
   hypermedia controls or be machine-readable.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-wright-json-schema-01"/>
        </reference>
        <reference anchor="I-D.irtf-t2trg-rest-iot" target="https://www.ietf.org/archive/id/draft-irtf-t2trg-rest-iot-11.txt">
          <front>
            <title>Guidance on RESTful Design for Internet of Things Systems</title>
            <author fullname="Ari Keränen" initials="A." surname="Keränen">
              <organization>Ericsson</organization>
            </author>
            <author fullname="Matthias Kovatsch" initials="M." surname="Kovatsch">
              <organization>Siemens</organization>
            </author>
            <author fullname="Klaus Hartke" initials="K." surname="Hartke">
         </author>
            <date day="11" month="January" year="2023"/>
            <abstract>
              <t>   This document gives guidance for designing Internet of Things (IoT)
   systems that follow the principles of the Representational State
   Transfer (REST) architectural style.  This document is a product of
   the IRTF Thing-to-Thing Research Group (T2TRG).

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-t2trg-rest-iot-11"/>
        </reference>
        <reference anchor="ZCL">
          <front>
            <title>The ZigBee Cluster Library</title>
            <author>
              <organization/>
            </author>
            <date year="2008"/>
          </front>
          <seriesInfo name="Zigbee Wireless Networking" value="pp. 239-271"/>
          <seriesInfo name="DOI" value="10.1016/b978-0-7506-8597-9.00006-9"/>
        </reference>
        <reference anchor="OMA" target="http://www.openmobilealliance.org/wp/omna/lwm2m/lwm2mregistry.html">
          <front>
            <title>OMA LightweightM2M (LwM2M) Object and Resource Registry</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="OCF" target="https://openconnectivity.org/specs/OCF_Resource_Type_Specification.pdf">
          <front>
            <title>OCF Resource Type Specification</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="RFC8576" target="https://www.rfc-editor.org/info/rfc8576">
          <front>
            <title>Internet of Things (IoT) Security: State of the Art and Challenges</title>
            <author fullname="O. Garcia-Morchon" initials="O." surname="Garcia-Morchon">
              <organization/>
            </author>
            <author fullname="S. Kumar" initials="S." surname="Kumar">
              <organization/>
            </author>
            <author fullname="M. Sethi" initials="M." surname="Sethi">
              <organization/>
            </author>
            <date month="April" year="2019"/>
            <abstract>
              <t>The Internet of Things (IoT) concept refers to the usage of standard Internet protocols to allow for human-to-thing and thing-to-thing communication.  The security needs for IoT systems are well recognized, and many standardization steps to provide security have been taken -- for example, the specification of the Constrained Application Protocol (CoAP) secured with Datagram Transport Layer Security (DTLS).  However, security challenges still exist, not only because there are some use cases that lack a suitable solution, but also because many IoT devices and systems have been designed and deployed with very limited security capabilities.  In this document, we first discuss the various stages in the lifecycle of a thing. Next, we document the security threats to a thing and the challenges that one might face to protect against these threats.  Lastly, we discuss the next steps needed to facilitate the deployment of secure IoT systems.  This document can be used by implementers and authors of IoT specifications as a reference for details about security considerations while documenting their specific security challenges, threat models, and mitigations.</t>
              <t>This document is a product of the IRTF Thing-to-Thing Research Group (T2TRG).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8576"/>
          <seriesInfo name="DOI" value="10.17487/RFC8576"/>
        </reference>
        <reference anchor="ECMA-262" target="https://www.ecma-international.org/wp-content/uploads/ECMA-262.pdf">
          <front>
            <title>ECMAScript 2020 Language Specification</title>
            <author>
              <organization>Ecma International</organization>
            </author>
            <date year="2020" month="June"/>
          </front>
          <seriesInfo name="ECMA" value="Standard ECMA-262, 11th Edition"/>
        </reference>
        <reference anchor="I-D.bormann-jsonpath-iregexp" target="https://www.ietf.org/archive/id/draft-bormann-jsonpath-iregexp-04.txt">
          <front>
            <title>I-Regexp: An Interoperable Regexp Format</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <author fullname="Tim Bray" initials="T." surname="Bray">
              <organization>Textuality</organization>
            </author>
            <date day="25" month="April" year="2022"/>
            <abstract>
              <t>   This document specifies I-Regexp, a flavor of regular expressions
   that is limited in scope with the goal of interoperation across many
   different regular-expression libraries.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-bormann-jsonpath-iregexp-04"/>
        </reference>
      </references>
    </references>
    <section anchor="syntax">
      <name>Formal Syntax of SDF</name>
      <t>This appendix describes the syntax of SDF using CDDL <xref target="RFC8610"/>.  Note
that this appendix was derived from Ari Keranen's "alt-schema" and
Michael Koster's "schema", with a view of covering the syntax that is
currently in use at the One Data Model <tt>playground</tt> repository.</t>
      <t>This appendix shows the framework syntax only, i.e., a syntax with liberal extension points.
Since this syntax is nearly useless in finding typos in an SDF
specification, a second syntax, the validation syntax, is defined that
does not include the extension points.
The validation syntax can be generated from the framework syntax by
leaving out all lines containing the string <tt>EXTENSION-POINT</tt>; as this
is trivial, the result is not shown here.</t>
      <t>This appendix makes use of CDDL "features" as defined in <xref section="4" sectionFormat="of" target="RFC9165"/>.
A feature named "1.0" is used to indicate parts of the syntax being
deprecated towards SDF 1.1, and a feature named "1.1" is used to
indicate new syntax intended for SDF 1.1.
Features whose names end in "-ext" indicate extension points for
further evolution.</t>
      <sourcecode type="cddl"><![CDATA[
start = sdf-syntax

sdf-syntax = {
 ? info: sdfinfo                  ; This will be required in most process policies, but not a syntax error
 ? namespace: named<text>
 ? defaultNamespace: text
 ? sdfThing: named<thingqualities>   ; Thing is a composition of objects that work together in some way
 ? sdfObject: named<objectqualities> ; Object is a set of Properties, Actions, and Events that together perform a particular function
 paedataqualities                 ; Includes Properties, Actions, and Events as well as sdfData
 EXTENSION-POINT<"top-ext">
}

sdfinfo = {
 ? title: text
 ? version: text
 ? copyright: text
 ? license: text
 EXTENSION-POINT<"info-ext">
}

; Shortcut for a map that gives names to instances of X (has text keys and values of type X)
named<X> = { * text => X }

EXTENSION-POINT<f> = ( * (text .feature f) => any ) ; only used in framework syntax

sdf-pointer = text ; .regexp curie-regexp -- TO DO!
pointer-list = [* sdf-pointer]  ; ISSUE: no point in having an empty list, no? but used for sdfRequired in odmobject-multiple_axis_joystick.sdf.json

commonqualities = (
 ? description: text            ; long text (no constraints)
 ? label: text                  ; short text (no constraints); default to key
 ? $comment: text               ; source code comments only, no semantics
 ? sdfRef: sdf-pointer
 ? sdfRequired: pointer-list    ; applies to qualities of properties, of data
)

arraydefinitionqualities = (
 ? ("minItems" .feature "1.2") => uint
 ? ("maxItems" .feature "1.2") => uint
)

paedataqualities = (
 ? sdfProperty: named<propertyqualities> ; Property represents the state of an instance of an object
 ? sdfAction: named<actionqualities>     ; Action is a directive to invoke an application layer verb associated with an object
 ? sdfEvent: named<eventqualities>       ; Event represents an occurrence of something associated with an object
 ? sdfData: named<dataqualities>         ; Data represents a piece of information that can be the
                                         ; state of a property or a parameter to an action or a signal in an event
)

; for building hierarchy
thingqualities = {
 commonqualities
 ? sdfObject: named<objectqualities>
 ? sdfThing: named<thingqualities>
 paedataqualities
 arraydefinitionqualities
 EXTENSION-POINT<"thing-ext">
}

; for single objects, or for arrays of objects (1.2)
objectqualities = {
 commonqualities
 paedataqualities
 arraydefinitionqualities
 EXTENSION-POINT<"object-ext">
}

parameter-list =
  pointer-list .feature (["1.0", "pointerlist-as-parameter"]) /
  dataqualities .feature (["1.1", "dataqualities-as-parameter"])

actionqualities = {
 commonqualities
 ? sdfInputData: parameter-list   ; sdfRequiredInputData applies here (a bit redundant)
 ? ("sdfRequiredInputData" .feature "1.0") => pointer-list
 ? sdfOutputData: parameter-list  ; sdfRequired applies here
 ? sdfData: named<dataqualities>  ; zero or more named data type definitions that might be used in the above
 EXTENSION-POINT<"action-ext">
}

eventqualities = {
 commonqualities
 ? sdfOutputData: parameter-list  ; sdfRequired applies here
 ? sdfData: named<dataqualities>  ; zero or more named data type definitions that might be used in the above
 EXTENSION-POINT<"event-ext">
}

dataqualities = {
 commonqualities
 jsonschema
 ? ("units" .feature "1.0") => text
 ? ("unit" .feature "1.1") => text
 ? ("scaleMinimum" .feature "1.0") => number
 ? ("scaleMaximum" .feature "1.0") => number
 ? nullable: bool
 ? ("subtype" .feature "1.0") => "byte-string" / "unix-time"
            / (text .feature "subtype-ext")                       ; EXTENSION-POINT
 ? ("sdfType" .feature "1.1") => "byte-string" / "unix-time"
            / (text .feature "sdftype-ext")                       ; EXTENSION-POINT
 ? contentFormat: text
 EXTENSION-POINT<"data-ext">
}

propertyqualities = {
 ? observable: bool
 ? readable: bool
 ? writable: bool
 ~dataqualities
}

allowed-types = number / text / bool / null
              / [* number] / [* text] / [* bool]
              / {* text => any}
              / (any .feature "allowed-ext")                     ; EXTENSION-POINT

compound-type = (
  "type" => ("object" .feature "1.1")
  ? required: [+text]
  ? properties: named<dataqualities>
)

jsonschema = (
 ? (("type" => "number" / "string" / "boolean" / "integer" / "array")
    // compound-type
    // (type: text .feature "type-ext")                       ; EXTENSION-POINT
   )
 ? ("sdfChoice" .feature "1.1") => named<dataqualities> ; if present, all other qualities apply to all choices
 ? "enum" => [+ text]               ; limited to text strings in SDF 1.1
 ? ("enum" .feature "1.0") => [+ allowed-types]    ; should validate against type
 ? const: allowed-types                            ; should validate against type
 ? default: allowed-types                          ; should validate against type
 ; number/integer constraints
 ? minimum: number
 ? maximum: number
 ? exclusiveMinimum: number
 ? exclusiveMaximum: number
 ? multipleOf: number                   ; ISSUE: Do we need this?
 ; text string constraints
 ? minLength: uint
 ? maxLength: uint
 ? pattern: text                ; regexp
 ? format: "date-time" / "date" / "time"
           / "uri" / "uri-reference" / "uuid"
           / (text .feature "format-ext")                       ; EXTENSION-POINT
 ; array constraints
 ? minItems: uint
 ? maxItems: uint
 ? uniqueItems: bool
 ? items: { ;;; ultimately, this will be mostly recursive, but, for now
            ;;; let's find out what we actually need
     ? sdfRef: sdf-pointer          ; import limited to the subset that we allow here...
     ? description: text            ; long text (no constraints)
     ? $comment: text               ; source code comments only, no semantics
     ; commonqualities, ; -- ISSUE: should leave this out for non-complex data types, but need the above three
     ? ((type: "number" / "string" / "boolean" / "integer") ; no "array"
        // compound-type
        // (type: text .feature "itemtype-ext")                       ; EXTENSION-POINT
       )
     ? ("sdfChoice" .feature "1.1") => named<dataqualities>
     ; jso subset
     ? minimum: number
     ? maximum: number
     ? "enum" => [+ text] ; limited to text strings in SDF 1.1
     ? ("enum" .feature "1.0") => [+ any]
     ? format: text
     ? minLength: uint
     ? maxLength: uint
     EXTENSION-POINT<"items-ext">
   }
)
]]></sourcecode>
    </section>
    <section anchor="json-schemaorg-rendition-of-sdf-syntax">
      <name>json-schema.org Rendition of SDF Syntax</name>
      <t>This appendix describes the syntax of SDF defined in <xref target="syntax"/>, but
using a version of the description techniques advertised on
json-schema.org <xref target="I-D.handrews-json-schema-validation-01"/>.</t>
      <t>The appendix shows both the validation and the framework syntax.
Since most of the lines are the same between these two files, those lines are shown only once, with a leading space, in the form of a unified diff.
Lines leading with a <tt>-</tt> are part of the validation syntax, and lines leading with a <tt>+</tt> are part of the framework syntax.</t>
      <sourcecode type="jso.json"><![CDATA[
 {
-  "title": "sdf-validation.cddl -- Generated: 2023-01-12T12:53:21Z",
+  "title": "sdf-framework.cddl -- Generated: 2023-01-12T12:53:22Z",
   "$schema": "http://json-schema.org/draft-07/schema#",
   "$ref": "#/definitions/sdf-syntax",
   "definitions": {
     "sdf-syntax": {
       "type": "object",
       "properties": {
         "sdfProperty": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/propertyqualities"
           }
         },
         "sdfAction": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/actionqualities"
           }
         },
         "sdfEvent": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/eventqualities"
           }
         },
         "sdfData": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/dataqualities"
           }
         },
         "info": {
           "$ref": "#/definitions/sdfinfo"
         },
         "namespace": {
           "type": "object",
           "additionalProperties": {
             "type": "string"
           }
         },
         "defaultNamespace": {
           "type": "string"
         },
         "sdfThing": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/thingqualities"
           }
         },
         "sdfObject": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/objectqualities"
           }
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "sdfinfo": {
       "type": "object",
       "properties": {
         "title": {
           "type": "string"
         },
         "version": {
           "type": "string"
         },
         "copyright": {
           "type": "string"
         },
         "license": {
           "type": "string"
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "thingqualities": {
       "type": "object",
       "properties": {
         "minItems": {
           "$ref": "#/definitions/uint"
         },
         "maxItems": {
           "$ref": "#/definitions/uint"
         },
         "sdfProperty": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/propertyqualities"
           }
         },
         "sdfAction": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/actionqualities"
           }
         },
         "sdfEvent": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/eventqualities"
           }
         },
         "sdfData": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/dataqualities"
           }
         },
         "description": {
           "type": "string"
         },
         "label": {
           "type": "string"
         },
         "$comment": {
           "type": "string"
         },
         "sdfRef": {
           "$ref": "#/definitions/sdf-pointer"
         },
         "sdfRequired": {
           "$ref": "#/definitions/pointer-list"
         },
         "sdfObject": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/objectqualities"
           }
         },
         "sdfThing": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/thingqualities"
           }
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "sdf-pointer": {
       "type": "string"
     },
     "pointer-list": {
       "type": "array",
       "items": {
         "$ref": "#/definitions/sdf-pointer"
       }
     },
     "objectqualities": {
       "type": "object",
       "properties": {
         "minItems": {
           "$ref": "#/definitions/uint"
         },
         "maxItems": {
           "$ref": "#/definitions/uint"
         },
         "sdfProperty": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/propertyqualities"
           }
         },
         "sdfAction": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/actionqualities"
           }
         },
         "sdfEvent": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/eventqualities"
           }
         },
         "sdfData": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/dataqualities"
           }
         },
         "description": {
           "type": "string"
         },
         "label": {
           "type": "string"
         },
         "$comment": {
           "type": "string"
         },
         "sdfRef": {
           "$ref": "#/definitions/sdf-pointer"
         },
         "sdfRequired": {
           "$ref": "#/definitions/pointer-list"
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "propertyqualities": {
       "anyOf": [
         {
           "type": "object",
           "properties": {
             "type": {
               "type": "string",
               "enum": [
                 "number",
                 "string",
                 "boolean",
                 "integer",
                 "array"
               ]
             },
             "sdfChoice": {
               "type": "object",
               "additionalProperties": {
                 "$ref": "#/definitions/dataqualities"
               }
             },
             "enum": {
               "type": "array",
               "items": {
-                "type": "string"
+                "$ref": "#/definitions/allowed-types"
               },
               "minItems": 1
             },
             "const": {
               "$ref": "#/definitions/allowed-types"
             },
             "default": {
               "$ref": "#/definitions/allowed-types"
             },
             "minimum": {
               "type": "number"
             },
             "maximum": {
               "type": "number"
             },
             "exclusiveMinimum": {
               "type": "number"
             },
             "exclusiveMaximum": {
               "type": "number"
             },
             "multipleOf": {
               "type": "number"
             },
             "minLength": {
               "$ref": "#/definitions/uint"
             },
             "maxLength": {
               "$ref": "#/definitions/uint"
             },
             "pattern": {
               "type": "string"
             },
             "format": {
-              "type": "string",
-              "enum": [
-                "date-time",
-                "date",
-                "time",
-                "uri",
-                "uri-reference",
-                "uuid"
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "date-time"
+                },
+                {
+                  "type": "string",
+                  "const": "date"
+                },
+                {
+                  "type": "string",
+                  "const": "time"
+                },
+                {
+                  "type": "string",
+                  "const": "uri"
+                },
+                {
+                  "type": "string",
+                  "const": "uri-reference"
+                },
+                {
+                  "type": "string",
+                  "const": "uuid"
+                },
+                {
+                  "type": "string"
+                }
               ]
             },
             "minItems": {
               "$ref": "#/definitions/uint"
             },
             "maxItems": {
               "$ref": "#/definitions/uint"
             },
             "uniqueItems": {
               "type": "boolean"
             },
             "items": {
               "anyOf": [
                 {
                   "type": "object",
                   "properties": {
                     "type": {
                       "type": "string",
                       "enum": [
                         "number",
                         "string",
                         "boolean",
                         "integer"
                       ]
                     },
                     "sdfRef": {
                       "$ref": "#/definitions/sdf-pointer"
                     },
                     "description": {
                       "type": "string"
                     },
                     "$comment": {
                       "type": "string"
                     },
                     "sdfChoice": {
                       "type": "object",
                       "additionalProperties": {
                         "$ref": "#/definitions/dataqualities"
                       }
                     },
                     "minimum": {
                       "type": "number"
                     },
                     "maximum": {
                       "type": "number"
                     },
                     "enum": {
                       "type": "array",
-                      "items": {
-                        "type": "string"
-                      },
                       "minItems": 1
                     },
                     "format": {
                       "type": "string"
                     },
                     "minLength": {
                       "$ref": "#/definitions/uint"
                     },
                     "maxLength": {
                       "$ref": "#/definitions/uint"
                     }
                   },
-                  "additionalProperties": false
+                  "additionalProperties": {
+                  }
                 },
                 {
                   "type": "object",
                   "properties": {
                     "type": {
                       "type": "string",
                       "const": "object"
                     },
                     "required": {
                       "type": "array",
                       "items": {
                         "type": "string"
                       },
                       "minItems": 1
                     },
                     "properties": {
                       "type": "object",
                       "additionalProperties": {
                         "$ref": "#/definitions/dataqualities"
                       }
                     },
                     "sdfRef": {
                       "$ref": "#/definitions/sdf-pointer"
                     },
                     "description": {
                       "type": "string"
                     },
                     "$comment": {
                       "type": "string"
                     },
                     "sdfChoice": {
                       "type": "object",
                       "additionalProperties": {
                         "$ref": "#/definitions/dataqualities"
                       }
                     },
                     "minimum": {
                       "type": "number"
                     },
                     "maximum": {
                       "type": "number"
                     },
                     "enum": {
                       "type": "array",
-                      "items": {
-                        "type": "string"
-                      },
                       "minItems": 1
                     },
                     "format": {
                       "type": "string"
                     },
                     "minLength": {
                       "$ref": "#/definitions/uint"
                     },
                     "maxLength": {
                       "$ref": "#/definitions/uint"
                     }
                   },
-                  "additionalProperties": false
+                  "additionalProperties": {
+                  }
+                },
+                {
+                  "type": "object",
+                  "properties": {
+                    "type": {
+                      "type": "string"
+                    },
+                    "sdfRef": {
+                      "$ref": "#/definitions/sdf-pointer"
+                    },
+                    "description": {
+                      "type": "string"
+                    },
+                    "$comment": {
+                      "type": "string"
+                    },
+                    "sdfChoice": {
+                      "type": "object",
+                      "additionalProperties": {
+                        "$ref": "#/definitions/dataqualities"
+                      }
+                    },
+                    "minimum": {
+                      "type": "number"
+                    },
+                    "maximum": {
+                      "type": "number"
+                    },
+                    "enum": {
+                      "type": "array",
+                      "minItems": 1
+                    },
+                    "format": {
+                      "type": "string"
+                    },
+                    "minLength": {
+                      "$ref": "#/definitions/uint"
+                    },
+                    "maxLength": {
+                      "$ref": "#/definitions/uint"
+                    }
+                  },
+                  "additionalProperties": {
+                  }
                 }
               ]
             },
             "description": {
               "type": "string"
             },
             "label": {
               "type": "string"
             },
             "$comment": {
               "type": "string"
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "sdfRequired": {
               "$ref": "#/definitions/pointer-list"
             },
+            "units": {
+              "type": "string"
+            },
             "unit": {
               "type": "string"
             },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
             "nullable": {
               "type": "boolean"
             },
+            "subtype": {
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "byte-string"
+                },
+                {
+                  "type": "string",
+                  "const": "unix-time"
+                },
+                {
+                  "type": "string"
+                }
+              ]
+            },
             "sdfType": {
-              "type": "string",
-              "enum": [
-                "byte-string",
-                "unix-time"
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "byte-string"
+                },
+                {
+                  "type": "string",
+                  "const": "unix-time"
+                },
+                {
+                  "type": "string"
+                }
               ]
             },
             "contentFormat": {
               "type": "string"
             },
             "observable": {
               "type": "boolean"
             },
             "readable": {
               "type": "boolean"
             },
             "writable": {
               "type": "boolean"
             }
           },
-          "additionalProperties": false
+          "additionalProperties": {
+          }
         },
         {
           "type": "object",
           "properties": {
             "type": {
               "type": "string",
               "const": "object"
             },
             "required": {
               "type": "array",
               "items": {
                 "type": "string"
               },
               "minItems": 1
             },
             "properties": {
               "type": "object",
               "additionalProperties": {
                 "$ref": "#/definitions/dataqualities"
               }
             },
             "sdfChoice": {
               "type": "object",
               "additionalProperties": {
                 "$ref": "#/definitions/dataqualities"
               }
             },
             "enum": {
               "type": "array",
               "items": {
-                "type": "string"
+                "$ref": "#/definitions/allowed-types"
               },
               "minItems": 1
             },
             "const": {
               "$ref": "#/definitions/allowed-types"
             },
             "default": {
               "$ref": "#/definitions/allowed-types"
             },
             "minimum": {
               "type": "number"
             },
             "maximum": {
               "type": "number"
             },
             "exclusiveMinimum": {
               "type": "number"
             },
             "exclusiveMaximum": {
               "type": "number"
             },
             "multipleOf": {
               "type": "number"
             },
             "minLength": {
               "$ref": "#/definitions/uint"
             },
             "maxLength": {
               "$ref": "#/definitions/uint"
             },
             "pattern": {
               "type": "string"
             },
             "format": {
-              "type": "string",
-              "enum": [
-                "date-time",
-                "date",
-                "time",
-                "uri",
-                "uri-reference",
-                "uuid"
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "date-time"
+                },
+                {
+                  "type": "string",
+                  "const": "date"
+                },
+                {
+                  "type": "string",
+                  "const": "time"
+                },
+                {
+                  "type": "string",
+                  "const": "uri"
+                },
+                {
+                  "type": "string",
+                  "const": "uri-reference"
+                },
+                {
+                  "type": "string",
+                  "const": "uuid"
+                },
+                {
+                  "type": "string"
+                }
               ]
             },
             "minItems": {
               "$ref": "#/definitions/uint"
             },
             "maxItems": {
               "$ref": "#/definitions/uint"
             },
             "uniqueItems": {
               "type": "boolean"
             },
             "items": {
               "anyOf": [
                 {
                   "type": "object",
                   "properties": {
                     "type": {
                       "type": "string",
                       "enum": [
                         "number",
                         "string",
                         "boolean",
                         "integer"
                       ]
                     },
                     "sdfRef": {
                       "$ref": "#/definitions/sdf-pointer"
                     },
                     "description": {
                       "type": "string"
                     },
                     "$comment": {
                       "type": "string"
                     },
                     "sdfChoice": {
                       "type": "object",
                       "additionalProperties": {
                         "$ref": "#/definitions/dataqualities"
                       }
                     },
                     "minimum": {
                       "type": "number"
                     },
                     "maximum": {
                       "type": "number"
                     },
                     "enum": {
                       "type": "array",
-                      "items": {
-                        "type": "string"
-                      },
                       "minItems": 1
                     },
                     "format": {
                       "type": "string"
                     },
                     "minLength": {
                       "$ref": "#/definitions/uint"
                     },
                     "maxLength": {
                       "$ref": "#/definitions/uint"
                     }
                   },
-                  "additionalProperties": false
+                  "additionalProperties": {
+                  }
                 },
                 {
                   "type": "object",
                   "properties": {
                     "type": {
                       "type": "string",
                       "const": "object"
                     },
                     "required": {
                       "type": "array",
                       "items": {
                         "type": "string"
                       },
                       "minItems": 1
                     },
                     "properties": {
                       "type": "object",
                       "additionalProperties": {
                         "$ref": "#/definitions/dataqualities"
                       }
                     },
                     "sdfRef": {
                       "$ref": "#/definitions/sdf-pointer"
                     },
                     "description": {
                       "type": "string"
                     },
                     "$comment": {
                       "type": "string"
                     },
                     "sdfChoice": {
                       "type": "object",
                       "additionalProperties": {
                         "$ref": "#/definitions/dataqualities"
                       }
                     },
                     "minimum": {
                       "type": "number"
                     },
                     "maximum": {
                       "type": "number"
                     },
                     "enum": {
                       "type": "array",
-                      "items": {
-                        "type": "string"
-                      },
                       "minItems": 1
                     },
                     "format": {
                       "type": "string"
                     },
                     "minLength": {
                       "$ref": "#/definitions/uint"
                     },
                     "maxLength": {
                       "$ref": "#/definitions/uint"
                     }
                   },
-                  "additionalProperties": false
+                  "additionalProperties": {
+                  }
+                },
+                {
+                  "type": "object",
+                  "properties": {
+                    "type": {
+                      "type": "string"
+                    },
+                    "sdfRef": {
+                      "$ref": "#/definitions/sdf-pointer"
+                    },
+                    "description": {
+                      "type": "string"
+                    },
+                    "$comment": {
+                      "type": "string"
+                    },
+                    "sdfChoice": {
+                      "type": "object",
+                      "additionalProperties": {
+                        "$ref": "#/definitions/dataqualities"
+                      }
+                    },
+                    "minimum": {
+                      "type": "number"
+                    },
+                    "maximum": {
+                      "type": "number"
+                    },
+                    "enum": {
+                      "type": "array",
+                      "minItems": 1
+                    },
+                    "format": {
+                      "type": "string"
+                    },
+                    "minLength": {
+                      "$ref": "#/definitions/uint"
+                    },
+                    "maxLength": {
+                      "$ref": "#/definitions/uint"
+                    }
+                  },
+                  "additionalProperties": {
+                  }
                 }
               ]
             },
             "description": {
               "type": "string"
             },
             "label": {
               "type": "string"
             },
             "$comment": {
               "type": "string"
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "sdfRequired": {
               "$ref": "#/definitions/pointer-list"
             },
+            "units": {
+              "type": "string"
+            },
             "unit": {
               "type": "string"
             },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
             "nullable": {
               "type": "boolean"
             },
+            "subtype": {
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "byte-string"
+                },
+                {
+                  "type": "string",
+                  "const": "unix-time"
+                },
+                {
+                  "type": "string"
+                }
+              ]
+            },
             "sdfType": {
-              "type": "string",
-              "enum": [
-                "byte-string",
-                "unix-time"
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "byte-string"
+                },
+                {
+                  "type": "string",
+                  "const": "unix-time"
+                },
+                {
+                  "type": "string"
+                }
               ]
             },
             "contentFormat": {
               "type": "string"
             },
             "observable": {
               "type": "boolean"
             },
             "readable": {
               "type": "boolean"
             },
             "writable": {
               "type": "boolean"
             }
           },
-          "additionalProperties": false
-        }
-      ]
-    },
-    "dataqualities": {
-      "anyOf": [
+          "additionalProperties": {
+          }
+        },
         {
           "type": "object",
           "properties": {
             "type": {
-              "type": "string",
-              "enum": [
-                "number",
-                "string",
-                "boolean",
-                "integer",
-                "array"
-              ]
+              "type": "string"
             },
             "sdfChoice": {
               "type": "object",
               "additionalProperties": {
                 "$ref": "#/definitions/dataqualities"
               }
             },
             "enum": {
               "type": "array",
               "items": {
-                "type": "string"
+                "$ref": "#/definitions/allowed-types"
               },
               "minItems": 1
             },
             "const": {
               "$ref": "#/definitions/allowed-types"
             },
             "default": {
               "$ref": "#/definitions/allowed-types"
             },
             "minimum": {
               "type": "number"
             },
             "maximum": {
               "type": "number"
             },
             "exclusiveMinimum": {
               "type": "number"
             },
             "exclusiveMaximum": {
               "type": "number"
             },
             "multipleOf": {
               "type": "number"
             },
             "minLength": {
               "$ref": "#/definitions/uint"
             },
             "maxLength": {
               "$ref": "#/definitions/uint"
             },
             "pattern": {
               "type": "string"
             },
             "format": {
-              "type": "string",
-              "enum": [
-                "date-time",
-                "date",
-                "time",
-                "uri",
-                "uri-reference",
-                "uuid"
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "date-time"
+                },
+                {
+                  "type": "string",
+                  "const": "date"
+                },
+                {
+                  "type": "string",
+                  "const": "time"
+                },
+                {
+                  "type": "string",
+                  "const": "uri"
+                },
+                {
+                  "type": "string",
+                  "const": "uri-reference"
+                },
+                {
+                  "type": "string",
+                  "const": "uuid"
+                },
+                {
+                  "type": "string"
+                }
               ]
             },
             "minItems": {
               "$ref": "#/definitions/uint"
             },
             "maxItems": {
               "$ref": "#/definitions/uint"
             },
             "uniqueItems": {
               "type": "boolean"
             },
             "items": {
               "anyOf": [
                 {
                   "type": "object",
                   "properties": {
                     "type": {
                       "type": "string",
                       "enum": [
                         "number",
                         "string",
                         "boolean",
                         "integer"
                       ]
                     },
                     "sdfRef": {
                       "$ref": "#/definitions/sdf-pointer"
                     },
                     "description": {
                       "type": "string"
                     },
                     "$comment": {
                       "type": "string"
                     },
                     "sdfChoice": {
                       "type": "object",
                       "additionalProperties": {
                         "$ref": "#/definitions/dataqualities"
                       }
                     },
                     "minimum": {
                       "type": "number"
                     },
                     "maximum": {
                       "type": "number"
                     },
                     "enum": {
                       "type": "array",
-                      "items": {
-                        "type": "string"
-                      },
                       "minItems": 1
                     },
                     "format": {
                       "type": "string"
                     },
                     "minLength": {
                       "$ref": "#/definitions/uint"
                     },
                     "maxLength": {
                       "$ref": "#/definitions/uint"
                     }
                   },
-                  "additionalProperties": false
+                  "additionalProperties": {
+                  }
                 },
                 {
                   "type": "object",
                   "properties": {
                     "type": {
                       "type": "string",
                       "const": "object"
                     },
                     "required": {
                       "type": "array",
                       "items": {
                         "type": "string"
                       },
                       "minItems": 1
                     },
                     "properties": {
                       "type": "object",
                       "additionalProperties": {
                         "$ref": "#/definitions/dataqualities"
                       }
                     },
                     "sdfRef": {
                       "$ref": "#/definitions/sdf-pointer"
                     },
                     "description": {
                       "type": "string"
                     },
                     "$comment": {
                       "type": "string"
                     },
                     "sdfChoice": {
                       "type": "object",
                       "additionalProperties": {
                         "$ref": "#/definitions/dataqualities"
                       }
                     },
                     "minimum": {
                       "type": "number"
                     },
                     "maximum": {
                       "type": "number"
                     },
                     "enum": {
                       "type": "array",
-                      "items": {
-                        "type": "string"
-                      },
                       "minItems": 1
                     },
                     "format": {
                       "type": "string"
                     },
                     "minLength": {
                       "$ref": "#/definitions/uint"
                     },
                     "maxLength": {
                       "$ref": "#/definitions/uint"
                     }
                   },
-                  "additionalProperties": false
-                }
-              ]
-            },
-            "description": {
-              "type": "string"
-            },
-            "label": {
-              "type": "string"
-            },
-            "$comment": {
-              "type": "string"
-            },
-            "sdfRef": {
-              "$ref": "#/definitions/sdf-pointer"
-            },
-            "sdfRequired": {
-              "$ref": "#/definitions/pointer-list"
-            },
-            "unit": {
-              "type": "string"
-            },
-            "nullable": {
-              "type": "boolean"
-            },
-            "sdfType": {
-              "type": "string",
-              "enum": [
-                "byte-string",
-                "unix-time"
-              ]
-            },
+                  "additionalProperties": {
+                  }
+                },
+                {
+                  "type": "object",
+                  "properties": {
+                    "type": {
+                      "type": "string"
+                    },
+                    "sdfRef": {
+                      "$ref": "#/definitions/sdf-pointer"
+                    },
+                    "description": {
+                      "type": "string"
+                    },
+                    "$comment": {
+                      "type": "string"
+                    },
+                    "sdfChoice": {
+                      "type": "object",
+                      "additionalProperties": {
+                        "$ref": "#/definitions/dataqualities"
+                      }
+                    },
+                    "minimum": {
+                      "type": "number"
+                    },
+                    "maximum": {
+                      "type": "number"
+                    },
+                    "enum": {
+                      "type": "array",
+                      "minItems": 1
+                    },
+                    "format": {
+                      "type": "string"
+                    },
+                    "minLength": {
+                      "$ref": "#/definitions/uint"
+                    },
+                    "maxLength": {
+                      "$ref": "#/definitions/uint"
+                    }
+                  },
+                  "additionalProperties": {
+                  }
+                }
+              ]
+            },
+            "description": {
+              "type": "string"
+            },
+            "label": {
+              "type": "string"
+            },
+            "$comment": {
+              "type": "string"
+            },
+            "sdfRef": {
+              "$ref": "#/definitions/sdf-pointer"
+            },
+            "sdfRequired": {
+              "$ref": "#/definitions/pointer-list"
+            },
+            "units": {
+              "type": "string"
+            },
+            "unit": {
+              "type": "string"
+            },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
+            "nullable": {
+              "type": "boolean"
+            },
+            "subtype": {
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "byte-string"
+                },
+                {
+                  "type": "string",
+                  "const": "unix-time"
+                },
+                {
+                  "type": "string"
+                }
+              ]
+            },
+            "sdfType": {
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "byte-string"
+                },
+                {
+                  "type": "string",
+                  "const": "unix-time"
+                },
+                {
+                  "type": "string"
+                }
+              ]
+            },
+            "contentFormat": {
+              "type": "string"
+            },
+            "observable": {
+              "type": "boolean"
+            },
+            "readable": {
+              "type": "boolean"
+            },
+            "writable": {
+              "type": "boolean"
+            }
+          },
+          "additionalProperties": {
+          }
+        }
+      ]
+    },
+    "dataqualities": {
+      "anyOf": [
+        {
+          "type": "object",
+          "properties": {
+            "type": {
+              "type": "string",
+              "enum": [
+                "number",
+                "string",
+                "boolean",
+                "integer",
+                "array"
+              ]
+            },
+            "sdfChoice": {
+              "type": "object",
+              "additionalProperties": {
+                "$ref": "#/definitions/dataqualities"
+              }
+            },
+            "enum": {
+              "type": "array",
+              "items": {
+                "$ref": "#/definitions/allowed-types"
+              },
+              "minItems": 1
+            },
+            "const": {
+              "$ref": "#/definitions/allowed-types"
+            },
+            "default": {
+              "$ref": "#/definitions/allowed-types"
+            },
+            "minimum": {
+              "type": "number"
+            },
+            "maximum": {
+              "type": "number"
+            },
+            "exclusiveMinimum": {
+              "type": "number"
+            },
+            "exclusiveMaximum": {
+              "type": "number"
+            },
+            "multipleOf": {
+              "type": "number"
+            },
+            "minLength": {
+              "$ref": "#/definitions/uint"
+            },
+            "maxLength": {
+              "$ref": "#/definitions/uint"
+            },
+            "pattern": {
+              "type": "string"
+            },
+            "format": {
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "date-time"
+                },
+                {
+                  "type": "string",
+                  "const": "date"
+                },
+                {
+                  "type": "string",
+                  "const": "time"
+                },
+                {
+                  "type": "string",
+                  "const": "uri"
+                },
+                {
+                  "type": "string",
+                  "const": "uri-reference"
+                },
+                {
+                  "type": "string",
+                  "const": "uuid"
+                },
+                {
+                  "type": "string"
+                }
+              ]
+            },
+            "minItems": {
+              "$ref": "#/definitions/uint"
+            },
+            "maxItems": {
+              "$ref": "#/definitions/uint"
+            },
+            "uniqueItems": {
+              "type": "boolean"
+            },
+            "items": {
+              "anyOf": [
+                {
+                  "type": "object",
+                  "properties": {
+                    "type": {
+                      "type": "string",
+                      "enum": [
+                        "number",
+                        "string",
+                        "boolean",
+                        "integer"
+                      ]
+                    },
+                    "sdfRef": {
+                      "$ref": "#/definitions/sdf-pointer"
+                    },
+                    "description": {
+                      "type": "string"
+                    },
+                    "$comment": {
+                      "type": "string"
+                    },
+                    "sdfChoice": {
+                      "type": "object",
+                      "additionalProperties": {
+                        "$ref": "#/definitions/dataqualities"
+                      }
+                    },
+                    "minimum": {
+                      "type": "number"
+                    },
+                    "maximum": {
+                      "type": "number"
+                    },
+                    "enum": {
+                      "type": "array",
+                      "minItems": 1
+                    },
+                    "format": {
+                      "type": "string"
+                    },
+                    "minLength": {
+                      "$ref": "#/definitions/uint"
+                    },
+                    "maxLength": {
+                      "$ref": "#/definitions/uint"
+                    }
+                  },
+                  "additionalProperties": {
+                  }
+                },
+                {
+                  "type": "object",
+                  "properties": {
+                    "type": {
+                      "type": "string",
+                      "const": "object"
+                    },
+                    "required": {
+                      "type": "array",
+                      "items": {
+                        "type": "string"
+                      },
+                      "minItems": 1
+                    },
+                    "properties": {
+                      "type": "object",
+                      "additionalProperties": {
+                        "$ref": "#/definitions/dataqualities"
+                      }
+                    },
+                    "sdfRef": {
+                      "$ref": "#/definitions/sdf-pointer"
+                    },
+                    "description": {
+                      "type": "string"
+                    },
+                    "$comment": {
+                      "type": "string"
+                    },
+                    "sdfChoice": {
+                      "type": "object",
+                      "additionalProperties": {
+                        "$ref": "#/definitions/dataqualities"
+                      }
+                    },
+                    "minimum": {
+                      "type": "number"
+                    },
+                    "maximum": {
+                      "type": "number"
+                    },
+                    "enum": {
+                      "type": "array",
+                      "minItems": 1
+                    },
+                    "format": {
+                      "type": "string"
+                    },
+                    "minLength": {
+                      "$ref": "#/definitions/uint"
+                    },
+                    "maxLength": {
+                      "$ref": "#/definitions/uint"
+                    }
+                  },
+                  "additionalProperties": {
+                  }
+                },
+                {
+                  "type": "object",
+                  "properties": {
+                    "type": {
+                      "type": "string"
+                    },
+                    "sdfRef": {
+                      "$ref": "#/definitions/sdf-pointer"
+                    },
+                    "description": {
+                      "type": "string"
+                    },
+                    "$comment": {
+                      "type": "string"
+                    },
+                    "sdfChoice": {
+                      "type": "object",
+                      "additionalProperties": {
+                        "$ref": "#/definitions/dataqualities"
+                      }
+                    },
+                    "minimum": {
+                      "type": "number"
+                    },
+                    "maximum": {
+                      "type": "number"
+                    },
+                    "enum": {
+                      "type": "array",
+                      "minItems": 1
+                    },
+                    "format": {
+                      "type": "string"
+                    },
+                    "minLength": {
+                      "$ref": "#/definitions/uint"
+                    },
+                    "maxLength": {
+                      "$ref": "#/definitions/uint"
+                    }
+                  },
+                  "additionalProperties": {
+                  }
+                }
+              ]
+            },
+            "description": {
+              "type": "string"
+            },
+            "label": {
+              "type": "string"
+            },
+            "$comment": {
+              "type": "string"
+            },
+            "sdfRef": {
+              "$ref": "#/definitions/sdf-pointer"
+            },
+            "sdfRequired": {
+              "$ref": "#/definitions/pointer-list"
+            },
+            "units": {
+              "type": "string"
+            },
+            "unit": {
+              "type": "string"
+            },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
+            "nullable": {
+              "type": "boolean"
+            },
+            "subtype": {
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "byte-string"
+                },
+                {
+                  "type": "string",
+                  "const": "unix-time"
+                },
+                {
+                  "type": "string"
+                }
+              ]
+            },
+            "sdfType": {
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "byte-string"
+                },
+                {
+                  "type": "string",
+                  "const": "unix-time"
+                },
+                {
+                  "type": "string"
+                }
+              ]
+            },
+            "contentFormat": {
+              "type": "string"
+            }
+          },
+          "additionalProperties": {
+          }
+        },
+        {
+          "type": "object",
+          "properties": {
+            "type": {
+              "type": "string",
+              "const": "object"
+            },
+            "required": {
+              "type": "array",
+              "items": {
+                "type": "string"
+              },
+              "minItems": 1
+            },
+            "properties": {
+              "type": "object",
+              "additionalProperties": {
+                "$ref": "#/definitions/dataqualities"
+              }
+            },
+            "sdfChoice": {
+              "type": "object",
+              "additionalProperties": {
+                "$ref": "#/definitions/dataqualities"
+              }
+            },
+            "enum": {
+              "type": "array",
+              "items": {
+                "$ref": "#/definitions/allowed-types"
+              },
+              "minItems": 1
+            },
+            "const": {
+              "$ref": "#/definitions/allowed-types"
+            },
+            "default": {
+              "$ref": "#/definitions/allowed-types"
+            },
+            "minimum": {
+              "type": "number"
+            },
+            "maximum": {
+              "type": "number"
+            },
+            "exclusiveMinimum": {
+              "type": "number"
+            },
+            "exclusiveMaximum": {
+              "type": "number"
+            },
+            "multipleOf": {
+              "type": "number"
+            },
+            "minLength": {
+              "$ref": "#/definitions/uint"
+            },
+            "maxLength": {
+              "$ref": "#/definitions/uint"
+            },
+            "pattern": {
+              "type": "string"
+            },
+            "format": {
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "date-time"
+                },
+                {
+                  "type": "string",
+                  "const": "date"
+                },
+                {
+                  "type": "string",
+                  "const": "time"
+                },
+                {
+                  "type": "string",
+                  "const": "uri"
+                },
+                {
+                  "type": "string",
+                  "const": "uri-reference"
+                },
+                {
+                  "type": "string",
+                  "const": "uuid"
+                },
+                {
+                  "type": "string"
+                }
+              ]
+            },
+            "minItems": {
+              "$ref": "#/definitions/uint"
+            },
+            "maxItems": {
+              "$ref": "#/definitions/uint"
+            },
+            "uniqueItems": {
+              "type": "boolean"
+            },
+            "items": {
+              "anyOf": [
+                {
+                  "type": "object",
+                  "properties": {
+                    "type": {
+                      "type": "string",
+                      "enum": [
+                        "number",
+                        "string",
+                        "boolean",
+                        "integer"
+                      ]
+                    },
+                    "sdfRef": {
+                      "$ref": "#/definitions/sdf-pointer"
+                    },
+                    "description": {
+                      "type": "string"
+                    },
+                    "$comment": {
+                      "type": "string"
+                    },
+                    "sdfChoice": {
+                      "type": "object",
+                      "additionalProperties": {
+                        "$ref": "#/definitions/dataqualities"
+                      }
+                    },
+                    "minimum": {
+                      "type": "number"
+                    },
+                    "maximum": {
+                      "type": "number"
+                    },
+                    "enum": {
+                      "type": "array",
+                      "minItems": 1
+                    },
+                    "format": {
+                      "type": "string"
+                    },
+                    "minLength": {
+                      "$ref": "#/definitions/uint"
+                    },
+                    "maxLength": {
+                      "$ref": "#/definitions/uint"
+                    }
+                  },
+                  "additionalProperties": {
+                  }
+                },
+                {
+                  "type": "object",
+                  "properties": {
+                    "type": {
+                      "type": "string",
+                      "const": "object"
+                    },
+                    "required": {
+                      "type": "array",
+                      "items": {
+                        "type": "string"
+                      },
+                      "minItems": 1
+                    },
+                    "properties": {
+                      "type": "object",
+                      "additionalProperties": {
+                        "$ref": "#/definitions/dataqualities"
+                      }
+                    },
+                    "sdfRef": {
+                      "$ref": "#/definitions/sdf-pointer"
+                    },
+                    "description": {
+                      "type": "string"
+                    },
+                    "$comment": {
+                      "type": "string"
+                    },
+                    "sdfChoice": {
+                      "type": "object",
+                      "additionalProperties": {
+                        "$ref": "#/definitions/dataqualities"
+                      }
+                    },
+                    "minimum": {
+                      "type": "number"
+                    },
+                    "maximum": {
+                      "type": "number"
+                    },
+                    "enum": {
+                      "type": "array",
+                      "minItems": 1
+                    },
+                    "format": {
+                      "type": "string"
+                    },
+                    "minLength": {
+                      "$ref": "#/definitions/uint"
+                    },
+                    "maxLength": {
+                      "$ref": "#/definitions/uint"
+                    }
+                  },
+                  "additionalProperties": {
+                  }
+                },
+                {
+                  "type": "object",
+                  "properties": {
+                    "type": {
+                      "type": "string"
+                    },
+                    "sdfRef": {
+                      "$ref": "#/definitions/sdf-pointer"
+                    },
+                    "description": {
+                      "type": "string"
+                    },
+                    "$comment": {
+                      "type": "string"
+                    },
+                    "sdfChoice": {
+                      "type": "object",
+                      "additionalProperties": {
+                        "$ref": "#/definitions/dataqualities"
+                      }
+                    },
+                    "minimum": {
+                      "type": "number"
+                    },
+                    "maximum": {
+                      "type": "number"
+                    },
+                    "enum": {
+                      "type": "array",
+                      "minItems": 1
+                    },
+                    "format": {
+                      "type": "string"
+                    },
+                    "minLength": {
+                      "$ref": "#/definitions/uint"
+                    },
+                    "maxLength": {
+                      "$ref": "#/definitions/uint"
+                    }
+                  },
+                  "additionalProperties": {
+                  }
+                }
+              ]
+            },
+            "description": {
+              "type": "string"
+            },
+            "label": {
+              "type": "string"
+            },
+            "$comment": {
+              "type": "string"
+            },
+            "sdfRef": {
+              "$ref": "#/definitions/sdf-pointer"
+            },
+            "sdfRequired": {
+              "$ref": "#/definitions/pointer-list"
+            },
+            "units": {
+              "type": "string"
+            },
+            "unit": {
+              "type": "string"
+            },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
+            "nullable": {
+              "type": "boolean"
+            },
+            "subtype": {
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "byte-string"
+                },
+                {
+                  "type": "string",
+                  "const": "unix-time"
+                },
+                {
+                  "type": "string"
+                }
+              ]
+            },
+            "sdfType": {
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "byte-string"
+                },
+                {
+                  "type": "string",
+                  "const": "unix-time"
+                },
+                {
+                  "type": "string"
+                }
+              ]
+            },
             "contentFormat": {
               "type": "string"
             }
           },
-          "additionalProperties": false
+          "additionalProperties": {
+          }
         },
         {
           "type": "object",
           "properties": {
             "type": {
-              "type": "string",
-              "const": "object"
-            },
-            "required": {
-              "type": "array",
-              "items": {
-                "type": "string"
-              },
-              "minItems": 1
-            },
-            "properties": {
-              "type": "object",
-              "additionalProperties": {
-                "$ref": "#/definitions/dataqualities"
-              }
+              "type": "string"
             },
             "sdfChoice": {
               "type": "object",
               "additionalProperties": {
                 "$ref": "#/definitions/dataqualities"
               }
             },
             "enum": {
               "type": "array",
               "items": {
-                "type": "string"
+                "$ref": "#/definitions/allowed-types"
               },
               "minItems": 1
             },
             "const": {
               "$ref": "#/definitions/allowed-types"
             },
             "default": {
               "$ref": "#/definitions/allowed-types"
             },
             "minimum": {
               "type": "number"
             },
             "maximum": {
               "type": "number"
             },
             "exclusiveMinimum": {
               "type": "number"
             },
             "exclusiveMaximum": {
               "type": "number"
             },
             "multipleOf": {
               "type": "number"
             },
             "minLength": {
               "$ref": "#/definitions/uint"
             },
             "maxLength": {
               "$ref": "#/definitions/uint"
             },
             "pattern": {
               "type": "string"
             },
             "format": {
-              "type": "string",
-              "enum": [
-                "date-time",
-                "date",
-                "time",
-                "uri",
-                "uri-reference",
-                "uuid"
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "date-time"
+                },
+                {
+                  "type": "string",
+                  "const": "date"
+                },
+                {
+                  "type": "string",
+                  "const": "time"
+                },
+                {
+                  "type": "string",
+                  "const": "uri"
+                },
+                {
+                  "type": "string",
+                  "const": "uri-reference"
+                },
+                {
+                  "type": "string",
+                  "const": "uuid"
+                },
+                {
+                  "type": "string"
+                }
               ]
             },
             "minItems": {
               "$ref": "#/definitions/uint"
             },
             "maxItems": {
               "$ref": "#/definitions/uint"
             },
             "uniqueItems": {
               "type": "boolean"
             },
             "items": {
               "anyOf": [
                 {
                   "type": "object",
                   "properties": {
                     "type": {
                       "type": "string",
                       "enum": [
                         "number",
                         "string",
                         "boolean",
                         "integer"
                       ]
                     },
                     "sdfRef": {
                       "$ref": "#/definitions/sdf-pointer"
                     },
                     "description": {
                       "type": "string"
                     },
                     "$comment": {
                       "type": "string"
                     },
                     "sdfChoice": {
                       "type": "object",
                       "additionalProperties": {
                         "$ref": "#/definitions/dataqualities"
                       }
                     },
                     "minimum": {
                       "type": "number"
                     },
                     "maximum": {
                       "type": "number"
                     },
                     "enum": {
                       "type": "array",
-                      "items": {
-                        "type": "string"
-                      },
                       "minItems": 1
                     },
                     "format": {
                       "type": "string"
                     },
                     "minLength": {
                       "$ref": "#/definitions/uint"
                     },
                     "maxLength": {
                       "$ref": "#/definitions/uint"
                     }
                   },
-                  "additionalProperties": false
+                  "additionalProperties": {
+                  }
                 },
                 {
                   "type": "object",
                   "properties": {
                     "type": {
                       "type": "string",
                       "const": "object"
                     },
                     "required": {
                       "type": "array",
                       "items": {
                         "type": "string"
                       },
                       "minItems": 1
                     },
                     "properties": {
                       "type": "object",
                       "additionalProperties": {
                         "$ref": "#/definitions/dataqualities"
                       }
                     },
                     "sdfRef": {
                       "$ref": "#/definitions/sdf-pointer"
                     },
                     "description": {
                       "type": "string"
                     },
                     "$comment": {
                       "type": "string"
                     },
                     "sdfChoice": {
                       "type": "object",
                       "additionalProperties": {
                         "$ref": "#/definitions/dataqualities"
                       }
                     },
                     "minimum": {
                       "type": "number"
                     },
                     "maximum": {
                       "type": "number"
                     },
                     "enum": {
                       "type": "array",
-                      "items": {
-                        "type": "string"
-                      },
                       "minItems": 1
                     },
                     "format": {
                       "type": "string"
                     },
                     "minLength": {
                       "$ref": "#/definitions/uint"
                     },
                     "maxLength": {
                       "$ref": "#/definitions/uint"
                     }
                   },
-                  "additionalProperties": false
+                  "additionalProperties": {
+                  }
+                },
+                {
+                  "type": "object",
+                  "properties": {
+                    "type": {
+                      "type": "string"
+                    },
+                    "sdfRef": {
+                      "$ref": "#/definitions/sdf-pointer"
+                    },
+                    "description": {
+                      "type": "string"
+                    },
+                    "$comment": {
+                      "type": "string"
+                    },
+                    "sdfChoice": {
+                      "type": "object",
+                      "additionalProperties": {
+                        "$ref": "#/definitions/dataqualities"
+                      }
+                    },
+                    "minimum": {
+                      "type": "number"
+                    },
+                    "maximum": {
+                      "type": "number"
+                    },
+                    "enum": {
+                      "type": "array",
+                      "minItems": 1
+                    },
+                    "format": {
+                      "type": "string"
+                    },
+                    "minLength": {
+                      "$ref": "#/definitions/uint"
+                    },
+                    "maxLength": {
+                      "$ref": "#/definitions/uint"
+                    }
+                  },
+                  "additionalProperties": {
+                  }
                 }
               ]
             },
             "description": {
               "type": "string"
             },
             "label": {
               "type": "string"
             },
             "$comment": {
               "type": "string"
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "sdfRequired": {
               "$ref": "#/definitions/pointer-list"
             },
+            "units": {
+              "type": "string"
+            },
             "unit": {
               "type": "string"
             },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
             "nullable": {
               "type": "boolean"
             },
+            "subtype": {
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "byte-string"
+                },
+                {
+                  "type": "string",
+                  "const": "unix-time"
+                },
+                {
+                  "type": "string"
+                }
+              ]
+            },
             "sdfType": {
-              "type": "string",
-              "enum": [
-                "byte-string",
-                "unix-time"
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "byte-string"
+                },
+                {
+                  "type": "string",
+                  "const": "unix-time"
+                },
+                {
+                  "type": "string"
+                }
               ]
             },
             "contentFormat": {
               "type": "string"
             }
           },
-          "additionalProperties": false
+          "additionalProperties": {
+          }
         }
       ]
     },
     "allowed-types": {
       "anyOf": [
         {
           "type": "number"
         },
         {
           "type": "string"
         },
         {
           "type": "boolean"
         },
         {
           "type": "null"
         },
         {
           "type": "array",
           "items": {
             "type": "number"
           }
         },
         {
           "type": "array",
           "items": {
             "type": "string"
           }
         },
         {
           "type": "array",
           "items": {
             "type": "boolean"
           }
         },
         {
           "type": "object",
           "additionalProperties": {
           }
+        },
+        {
         }
       ]
     },
     "uint": {
       "type": "integer",
       "minimum": 0
     },
     "actionqualities": {
       "type": "object",
       "properties": {
         "description": {
           "type": "string"
         },
         "label": {
           "type": "string"
         },
         "$comment": {
           "type": "string"
         },
         "sdfRef": {
           "$ref": "#/definitions/sdf-pointer"
         },
         "sdfRequired": {
           "$ref": "#/definitions/pointer-list"
         },
         "sdfInputData": {
           "$ref": "#/definitions/parameter-list"
         },
+        "sdfRequiredInputData": {
+          "$ref": "#/definitions/pointer-list"
+        },
         "sdfOutputData": {
           "$ref": "#/definitions/parameter-list"
         },
         "sdfData": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/dataqualities"
           }
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "parameter-list": {
-      "$ref": "#/definitions/dataqualities"
+      "anyOf": [
+        {
+          "$ref": "#/definitions/pointer-list"
+        },
+        {
+          "$ref": "#/definitions/dataqualities"
+        }
+      ]
     },
     "eventqualities": {
       "type": "object",
       "properties": {
         "description": {
           "type": "string"
         },
         "label": {
           "type": "string"
         },
         "$comment": {
           "type": "string"
         },
         "sdfRef": {
           "$ref": "#/definitions/sdf-pointer"
         },
         "sdfRequired": {
           "$ref": "#/definitions/pointer-list"
         },
         "sdfOutputData": {
           "$ref": "#/definitions/parameter-list"
         },
         "sdfData": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/dataqualities"
           }
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     }
   }
 }
]]></sourcecode>
    </section>
    <section anchor="jso-inspired">
      <name>Data Qualities inspired by json-schema.org</name>
      <t>Data qualities define data used in SDF affordances at an information
model level.
A popular way to describe JSON data at a data model level is proposed
by a number of drafts on json-schema.org (which collectively are
abbreviated JSO here)); for reference to a popular version we will
point here to <xref target="I-D.handrews-json-schema-validation-01"/>.
As the vocabulary used by JSO is familiar to many JSON modelers, the
present specification borrows some of the terms and ports their
semantics to the information model level needed for SDF.</t>
      <t>The main data quality imported is the "<tt>type</tt>".
In SDF, this can take one of six (text string) values, which are
discussed in the following subsections (note that the JSO type
"<tt>null</tt>" is not supported as a value of this data quality in SDF).</t>
      <t>The additional quality "<tt>const</tt>" restricts the data to one specific
value (given as the value of the <tt>const</tt> quality).</t>
      <t>Similarly, the additional quality "<tt>default</tt>" provides data that can
be used in the absence of the data (given as the value of the <tt>const</tt>
quality); this is mainly documentary and not very well-defined for SDF
as no process is defined that would add default values to an instance
of something.</t>
      <section anchor="type-number-type-integer">
        <name>type "<tt>number</tt>", type "<tt>integer</tt>"</name>
        <t>The types "<tt>number</tt>" and "<tt>integer</tt>" are associated with floating point
and integer numbers, as they are available in JSON.
A type value of <tt>integer</tt> means that only integer values of JSON
numbers can be used (note that <tt>10.0</tt> is an integer value, even if it
is in a notation that would also allow non-zero decimal fractions).</t>
        <t>The additional data qualities "<tt>minimum</tt>", "<tt>maximum</tt>",
"<tt>exclusiveMinimum</tt>", "<tt>exclusiveMaximum</tt>" provide number values that
serve as inclusive/exclusive lower/upper bounds for the number.
(Note that the Boolean form of
"<tt>exclusiveMinimum</tt>"/"<tt>exclusiveMaximum</tt>" found in earlier JSO drafts
is not used.)</t>
        <t>The data quality "<tt>multipleOf</tt>" gives a positive number that
constrains the data value to be an integer multiple of the number
given.
(Type "<tt>integer</tt>" can also be expressed as a "<tt>multipleOf</tt>" quality of
value 1, unless another "<tt>multipleOf</tt>" quality is present.)</t>
      </section>
      <section anchor="type-string">
        <name>type "<tt>string</tt>"</name>
        <t>The type "<tt>string</tt>" is associated with Unicode text string values as
they are available in JSON.</t>
        <t>The length (as measured in characters) can be constrained by the
additional data qualities "<tt>minLength</tt>" and "<tt>maxLength</tt>", which are
inclusive bounds.
Note that the previous version of the present document explained
text string length values in bytes, which however is not meaningful
unless bound to a specific encoding (which could be UTF-8, if this
unusual behavior is to be restored).</t>
        <t>The data quality "<tt>pattern</tt>" takes a string value that is interpreted
as an <xref target="ECMA-262"/> regular expression in Unicode mode that constrain the
string (note that these are not anchored by default, so unless <tt>^</tt> and
<tt>$</tt> anchors are employed, ECMA-262 regular expressions match any string that <em>contains</em> a match).
The JSO proposals acknowledge that regular expression support is
rather diverse in various platforms, so the suggestion is to limit
them to:</t>
        <ul spacing="compact">
          <li>characters;</li>
          <li>character classes in square brackets, including ranges; their complements;</li>
          <li>simple quantifiers <tt>*</tt>, <tt>+</tt>, <tt>?</tt>, and range quantifiers <tt>{n}</tt>,
<tt>{n,m}</tt>, and <tt>{n,}</tt>;</li>
          <li>grouping parentheses;</li>
          <li>the choice operator <tt>|</tt>;</li>
          <li>and anchors (beginning-of-input <tt>^</tt> and end-of-input <tt>$</tt>).</li>
        </ul>
        <t>Note that this subset is somewhat similar to the subset introduced by
iregexps <xref target="I-D.bormann-jsonpath-iregexp"/>, which however are anchored
regular expressions, and which include certain backslash escapes for
characters and character classes.</t>
        <t>The additional data quality "<tt>format</tt>" can take one of the following
values.  Note that, at an information model level, the presence of
this data quality changes the type from being a simple text string to
the abstract meaning of the format given (i.e., the format "date-time"
is less about the specific syntax employed in <xref target="RFC3339"/> than about the usage
as an absolute point in civil time).</t>
        <ul spacing="compact">
          <li>"<tt>date-time</tt>", "<tt>date</tt>", "<tt>time</tt>":
An <xref target="RFC3339"/> <tt>date-time</tt>, <tt>full-date</tt>, or <tt>full-time</tt>, respectively.</li>
          <li>"<tt>uri</tt>", "<tt>uri-reference</tt>":
An <xref target="RFC3986"/> URI or URI Reference, respectively.</li>
          <li>"<tt>uuid</tt>": An <xref target="RFC4122"/> UUID.</li>
        </ul>
      </section>
      <section anchor="type-boolean">
        <name>type "<tt>boolean</tt>"</name>
        <t>The type "<tt>boolean</tt>" can take the values "<tt>true</tt>" or "<tt>false</tt>".</t>
      </section>
      <section anchor="type-array">
        <name>type "<tt>array</tt>"</name>
        <t>The type "<tt>array</tt>" is associated with arrays as they are available in
JSON.</t>
        <t>The additional quality "<tt>items</tt>" gives the type that each of the
elements of the array must match.</t>
        <t>The number of elements in the array can be constrained by the additional
data qualities "<tt>minItems</tt>" and "<tt>maxItems</tt>", which are inclusive
bounds.</t>
        <t>The additional data quality "<tt>uniqueItems</tt>" gives a Boolean value
that, if true, requires the elements to be all different.</t>
      </section>
      <section anchor="type-object">
        <name>type "<tt>object</tt>"</name>
        <t>The type "<tt>object</tt>" is associated with maps, from strings to values, as
they are available in JSON ("objects").</t>
        <t>The additional quality "<tt>properties</tt>" is a map the entries of which
describe entries in the specified JSON object: The key gives an
allowable map key for the specified JSON object, and the value is a
map with a named set of data qualities giving the type for the
corresponding value in the specified JSON object.</t>
        <t>All entries specified this way are optional, unless they are listed in
the value of the additional quality "<tt>required</tt>", which is an array of
string values that give the key names of required entries.</t>
        <t>Note that the term "properties" as an additional quality for
defining map entries is unrelated to sdfProperty.</t>
      </section>
      <section anchor="implementation-notes">
        <name>Implementation notes</name>
        <t>JSO-based keywords are also used in the specification techniques of a
number of ecosystems, but some adjustments may be required.</t>
        <t>E.g., <xref target="OCF"/> is based on Swagger 2.0 which appears to be based on
"draft-4" <xref target="I-D.wright-json-schema"/> (also called draft-5, but semantically intended to
be equivalent to draft-4).
The "<tt>exclusiveMinimum</tt>" and "<tt>exclusiveMaximum</tt>" keywords use the
Boolean form there, so on import to SDF their values have to be
replaced by the values of the respective "<tt>minimum</tt>"/"<tt>maximum</tt>"
keyword, which are themselves then removed; the reverse transformation
applies on export.</t>
        <t>TBD: add any useful implementation notes we can find for other
ecosystems that use JSO.</t>
      </section>
    </section>
    <section anchor="composition-examples">
      <name>Composition Examples</name>
      <t>This appendix contains two examples illustrating different composition approaches
using the <tt>sdfThing</tt> quality.</t>
      <section anchor="outlet-strip-example">
        <name>Outlet Strip Example</name>
        <figure anchor="exa-sdfthing-outlet-strip">
          <artwork><![CDATA[
{
  "sdfThing": {
    "outlet-strip" : {
      "label": "An outlet Strip",
      "description": "Contains a number of Sockets",
      "sdfObject": {
        "socket": {
          "label": "An array of sockets in the outlet strip",
          "minItems": 2,
          "maxItems": 10
        }
      }
    }
  }
}
]]></artwork>
        </figure>
      </section>
      <section anchor="fridge-freezer-example">
        <name>Refrigerator-Freezer Example</name>
        <figure anchor="exa-sdfthing-fridge-freezer">
          <artwork><![CDATA[
{
  "sdfThing": {
    "refrigerator-freezer" : {
      "label": "A refrigerator combined with a freezer",
      "sdfProperty": {
        "status": {
          "type": "boolean",
          "label": {
            "Indicates if the refrigerator-freezer combination is powered"
          }
        }
      },
      "sdfObject": {
        "refrigerator": {
          "label": "A refrigerator compartment",
          "sdfProperty": {
            "temperature": {
              "sdfRef": "#/sdfProproperty/temperature",
              "maximum": 8
            }
          }
        },
        "freezer": {
          "label": "A freezer compartment",
          "sdfProperty": {
            "temperature": {
              "sdfRef": "#/sdfProproperty/temperature",
              "maximum": -6
            }
          }
        }
      },
    }
  },
  "sdfProperty": {
    "temperature": {
      "label": "The temperature for this compartment",
      "type": "integer",
      "unit": "C"
    }
  }
}
]]></artwork>
        </figure>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>This draft is based on <tt>sdf.md</tt> and <tt>sdf-schema.json</tt> in the old
one-data-model <tt>language</tt> repository, as well as <contact fullname="Ari Keränen"/>'s
"alt-schema" from the Ericsson Research <tt>ipso-odm</tt> repository (which
is now under subdirectory <tt>sdflint</tt> in the one-data model <tt>tools</tt>
repository).</t>
      <!--  LocalWords:  SDF namespace defaultNamespace instantiation OMA
 -->
<!--  LocalWords:  affordances ZigBee LWM OCF sdfObject sdfThing
 -->
<!--  LocalWords:  idempotency Thingness sdfProperty sdfEvent sdfRef
 -->
<!--  LocalWords:  namespaces sdfRequired Optionality sdfAction
 -->
<!--  LocalWords:  dereferenced dereferencing atomicity
 -->
<!--  LocalWords:  interworking
 -->

</section>
    <section anchor="contributors" numbered="false" toc="include" removeInRFC="false">
      <name>Contributors</name>
      <contact initials="A." surname="Keränen" fullname="Ari Keränen">
        <organization>Ericsson</organization>
        <address>
          <postal>
            <street/>
            <city>Jorvas</city>
            <code>02420</code>
            <country>Finland</country>
          </postal>
          <email>ari.keranen@ericsson.com</email>
        </address>
      </contact>
      <contact initials="J." surname="Romann" fullname="Jan Romann">
        <organization>Universität Bremen</organization>
        <address>
          <email>jan.romann@uni-bremen.de</email>
        </address>
      </contact>
      <contact initials="W." surname="van der Beek" fullname="Wouter van der Beek">
        <organization>Cascoda Ltd.</organization>
        <address>
          <postal>
            <street>Threefield House</street>
            <street>Threefield Lane</street>
            <city>Southampton</city>
            <country>United Kingdom</country>
          </postal>
          <email>w.vanderbeek@cascoda.com</email>
        </address>
      </contact>
    </section>
  </back>
  <!-- ##markdown-source:
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
oYUcahNoQJ8X6WkKBAsTeOAh5wXegW6+QWiBKk6hVXU2Q+bgXY4Oqivad3gI
WYpJyZXpMmWicGJ+bhS3AYLfFYefMQgCvMzZh8W7d4erwGhekYckhEAHtEuN
u/rVk1dH5gUeRi8XnovInlYKzilxZr/6JfSu2ShDr7KEf9ydrQlSvKQ/8sJa
BkDS2MOanLZ4TYFy3NqUSYPatFSD5ksAYBRZa0/YSoKS215BNW2AnYUdrYtU
TYslJK8j1ZUwDhvUNo+Up/XYSj2QQIxbePzjHGRHigdOOsbd4yJhAi5+hvcE
YUk6fDJzN5r8sdf6rgrdQGp4LeUWltqVGE9ScTpbw47ucPbdsYDWXGyAP5r4
fVr2HSwv86yXJae91TAFIAVNBagZYGy2mEHDfS8WEh1PcFu77Ii6556rF5Fz
NNbaGT8t0u8Em90bwLEG4XcJj7co3fXQ6ZqpGslqZpjL3vF+6XBmnlbZyyW5
PKhlQsddNaZlfV3hUY0wxGwrDM7wZvoql1vwssgGV/AcU17YeHYzsiqajOWN
DaAxMxYPdDcN1lJOd4hAwlvYMQQUia5KKmQWxF2szHLwanEJe1+LAKQxPt9P
1iuSvwHjwmx6YKwX1pE/dnq/Ft20Fblr2aa+mvgdiJljAG3W6epLtuhQRzD1
1jXvuEC/LbnTQa3Ma0NPOyygdAasMDHMZ4ne/xeIchJ4lqVVdC8ihRuTXvKe
S/3UyjHwLWmegaAuw06MM8Ksu46Uh0Rc2JLnu+Lmcf6XdXOpX8VVjxCbJTgN
r5SyJHVk/uzixL47r62TwNPYtiI364pmtNc6Tenoe/9mKWalfli7ZpTUrl+q
8YzV11a137HVMsfaIDUZs2bG7bbUSsAYH+F1Wm0Ya8LlqKz2o4cbKUHYDX/1
7u2tv2l8im7+GGBkFM89Z4x9rdwDQwhLEVwSXsra6Ix4ZMPYx6twrkzLtfbX
9Q58ylgH5O2XTYCIln27bi7wqmu7kKtq7sW3zhiU/XotMS2ql2RPlDSKUNGR
xjMu08z0H6Y6qYeZ3FG2UAxW5wEeNLO+Q+zA3SpwdVUNpz2u1dSzfV1fQ/OX
LhG1TCLPvVIkTioAS+QinOIPravkmovPlmHknX6JhyXXK0CzfRoPQecmc0w6
lhwbv064pOXZtjbVRgNB7rB2NI3LSiIPAytNe1X+LsG8hjC0alx4cdev8RBZ
MzCvKYp+Zc9GVrZNyDby9Q5yseuZ1rWE6jvJr+ZsZQfqj3w2ys2D1Tp8hrco
eeXJdm8yD1k/7bQ2Bmdp3moQHOPfkaJR4raOwbdJjLAul7QryZPEeaLWw7Fm
DLELtdPxRMkIv8pxHrUEN8dQyxg2qV/67+H2rY3BbaiYCTkCKG4UFB51AqCr
tZd3JSO8jQUou6qzJeFWZJj6vAq/hzxCHQSurpqmE7VWmNayk2TIB4mV47Dv
nXg4xDNkseQLcIWRXjn+2wATDepFxOUiuVon+ruqaFobksunx3gKqaqXyqas
2sh5DNPST2/Z8U/tsQ+Bjj7thmihUmnQCH0/1gmzQ9DRS7t+2VaxsaKw/ndS
B8wo1PjjJbvbgkvLCS2AeBwGoTlchhb16LXdFx61FlRqOZRSY4DryPzuzqrQ
sQ4SQ82TKZ/eiBferPWGXeGG3uF9tqsA32x6V1dNSf2BmLKfACi6pcD7TQ6o
bNgTvU1mK0fQDz6E2XFXL/eOLVB4a0Lygj0GdHiHVZ4Ne8JIccEhedw0cnA9
k6sZWHOArU+wM9iH7WC3ARW//zCgFvP5xwAKfaHkS5bfJNd1Q6A07EUBH+tV
JQ3tPE65Y5vAVK3Y2D/yha9GD3wTn+Q7oW9MU/I2j7dzcvzy2FCVcX4gfc2n
eK+nLf5JF1KAUMefGHv3d+vLN554rMkCtUPMEbteIand217lTrMjNU4ASzfQ
gupAPT7L05Ee7w8S4uuyjyAdUXOEVVtrrSG63fTD/kKgcI7+b9Y/xShbrRwZ
K6HVJySHwom0xjeA2QcKNRVfhqmG4l+TGJzHV/8CaCwYcQrC+PYc/gB324Bq
rYmrnp6UAzW5Dvr7fbTt0N/kWJ1cGU9hL/x1LqfnYX2SDK8wpC298ybJXjw3
3+KX3V++fvb4yweHXwLLfp2cgvQtLjlEYl8Eqh/HxaV7WR74HXzx0O9Akzvx
92syQWObwknKDT6y1k5pHvQ/6x+QHnZwCB/Q9iF4Mc4CD2spp/Buz5sOXtWI
9z7rdQ54vS22ear18jiqSPkkBQMYO2caX8tLT+UyXI7jEg6GcuSC6q5IMmya
gSoLik2R0r0VVYD/EVUT4OLklHrB8S7N6XHpCkEao6hP2A0ZuEoQmPWDi8gx
nbxwVTf9ItI7bIBy9FQp4OWrt7u16J9x+c6PWCNz14phcSYs2rQAHY9SjjHD
g+jrmBJI3AzR+ehKkLvUU8YhXZrhGrMWy3OQE3YUDqcaSo9a39HblCTTSNrC
JCsNHeoJebzIiuqxZ3kGXA5R73I1/VRg3jFMFBjdQhcrQoY3E0/RFy1XXQBd
y3WBJrg7jRLikF0gkNhJkJj90pSLoSvzZjqLIjtKk2pyRDKgPKLwgR8EwC6A
Y+LzHjQGhvkI+7GKNaY7B122lpbCXoRLCNOg1NJJfJ6TB0ZKu9OlzhoE8HSi
BHNRqY93p3y9WsKlnwZt8B9BI7RiDvtCRY73s1qvOSmOO/EFsPQrLgaet6Ft
r8q80KC7mafeA/BGc5LBhwyEmRQ9xtQ76oQjBxjjrV/zlOPmwGM59oIr6/WZ
cRZveprxIjhLx9VYEurjK1EsRUiBbwmtqKVBffj2lZZT8It+3eeYwCDQPOya
aTCPoHjMTXrcpoc3UXIYV/NUArZJOegGmO/Dg4f3ycT2azoLEqiMBpbgI+WA
irSPRexhZ5y8EY7rF+UGvcI7iyLKmPr4uMQ3VxUfJpc5hUiwxrxfzZyrgBVY
E9PlCdIrdLtWcLiUkndlWI+qOfGbr4xAl4moR8J4RCMhDYwZiFdwl/f9W+C3
6ZhLgwT1szSdydTuXqADfmGxmsheRMXQudx13ZGwwH+VeyEdYQ0qfy5gpQOH
Sm3Gvo7frZ3liImOL6l6iJasj8Irr21pWuj/F6V3VB0RDnP+//iBVsdnoO1O
8FKfZLMF1aoiq3keYPYsZY1VfO8hCrdT0o3iwC2nGSjWS+BSUnDsbiRZHXLA
PlaFngBkJHmFAxz+LOzUvBvxcZKgo5YLwalbd+OeIoq8Ar62vYGV/6NaFz/y
QK/DgTb8W+Mpbftrq1hx8z/UmoeXVdKz5R2wyDPWEWJhHJz8xYalXwoC+cPn
DxbF1Gh1gzkW0WTjxCplfdTfDoUbffnwwUOyAdiCf89XWnIxMJtzPUrPsRpj
Glrn1nD9EW+5P/mjNAhHqo/TgmpRyYl+VR2X/dBC+GQICE3IPkXdfAdACnXz
UGMb2MkNXBY2y1zUedzpBc76US+VlOFB3TPV9PgJpSdmWFp6bljfBiZMWXFY
E2gPW/aKZEquRQG1lIjJu2SqoXSqHmGa1/NFrYeo+lqjlYV1bG9ukPs7AtsD
9BHao040sG0oHlY9D2vYBNSEgdCY6rre9PWBnC/3mlGt5VrJAdZY9ILEd8ml
RlcoHCJniLVsWXiYmgHaDQ9hq63GTmIpDeCV/PC7N5t03yc0LL9rEjEh1dJw
Klx7KrYphYJLW3UQyYF79tMauFVX6oCLqLUp1dI+cgVD3CwpsCVZpOMkU1hk
sQiaPt2ILgY/5aPJURWRaMxGLzT0sRhVUsXRzwqmzO0B2ugDVLa/o1PJZDdR
MG6YJBk+t1kFxnSwMWYGUMJ+lw8D0z8/dL7npviGr1XiVOiuwGFSVn76CCD0
qN69nZNLWZBj7Y0UIj2rgbFJjLp0JNarZ9wbLxw3Moh562KJzikd2D9FDczr
54fWfqho9g/pKaAHh8ZmHK+10yfQYqcnkt5LcSRYFEm4DehP7niBVwfeYAOF
U08ZYN8ndNUX+VUwi7l0OSj2zhjvjmm2UJwShlNDS4IrM6xZ63pmlb/+B11z
2DX3l6/5moVu67tl8ePeMMHbjMi46gHn73msp3fA66MZAQca7u/4jQ7DRoe2
EWC2RwWj/T7DxvdNbWXdbhWRyxqsFLsGbnDRPPPrHfelDF+7wud6TtJdhLDg
LFN7rTIaMBTEfuTxHcNaHddUTvE0f3lpk8lZIBd0BZs7YTBL3xP17Hh3tNIk
B4ELRC9Rte652DI0rbeIBKTZpgmfj2R9TcrECF6s9zfNxgklro6ACaUxWoN6
rtVeLWyjVnhM4RMsHfNqgtBadd9eKiYEDqKcoucsnqi9PULo2kIPwjLdZVB5
djnDonm+oOtb5jdavSFoIJsXdWWJmLyayAbthexAOl3vQnZocx9/T+WbTTvh
ExtBGmpxOgTdp3MtZLp6lAe1UR5sOspodvmOh4FG4S62WBctQWrMWKJVJ4XT
yjZj5DAx/HIHWNNptWXx1tDXwYmuHXYzNK4aNsCnZRjtR77o9IkWC5c9QGTN
yZmiO1vBHQ2AzoHA1cULGsRimsZ8vXPvPd/gxk3NIM8SbNoQ9XyTQcxeJlf4
E4fHa3/lMgzKDfKVTmRFo0VZ5VwIM2IXs9AHCSFJoZUTRcT42QnL/iSKUkke
rexGUm89v4BeqkRCkDJrvTzplfoG4Rj1ZEzyH+GVduXiFBCDyUphrnVAi06l
sLlk+ITzmK32YH/DJ/rbD43fUPhrhrEW2CqlRoQ1P7hAV70kHmL7nb5hUx3w
TBodnWp2sLxQ0zFVgqV76L1sL07zolsg5Ro9L4eA/MKwtqVmcLVkb2nWNCfB
2ZNUkrCr2dOgouYc+ONCVXUrtZHfCxy3+Syob2VvZwsnBD1/4+Wf2Muv5RpQ
qS3oLq1XS8G7u827WW9HT0YQ2Lu+P0PzdtE1S/raK71ti3AQZMQAl3Q4UajZ
exLivNt6oUW97Dj0BWBrzfGfKHtuRe7ZXSZW1Jwqny75fMu/eoKEnx5xl8kP
7Juyieg/uoJL8DnYAWxc25+bBSTcXQvLhpFb4yksqh/bh5GfbzSIHYYTzKnr
RD+2D8M/33AUHYa2HXdt067ah/Gsmvr9lY1yMaSGDvG4Fg6j8l2GsSkWQByk
A+waTQtxLnJ/I2sFqFSPVbTPRvWGFcNIoscthhEPmTCG1rLxLtv/2h6aVtq0
nNsS66a8+5sWmgV24bhwILg4X80/LU6XlLZyzbauA/bZyNfLxqB/LMpW3rrb
NZzGiG/5W3tjpou7s/WmB17Mu2CImyaWfTgvdL0SE+TsTDu6D0kTU5vOwVHl
j6Q7tucMYRnpeKxF7LjixqYj+AlAGDVeNsJ3GJr5gCHCEfIhFhTVMcIRJtP4
NCgAD6Z2Njor8gyNSLw4wqrSQaaTP4LsXaWvZZvXHjO51t3LLN/uXZEAm+7c
44YYQBtg5CoqhZsWNxTsMC57MEuqsxw+u1Rauh47GfdV55K7azRrSti0daMu
5BjxYk6b+jy3Puw29akB6t2oUSAIP/KGblLWR9rXzY2+Mgn07rWck0wODHmV
0GmgGpe2l+sE9327NV47kDuatNFA9ZvFNxiproJ8RCVEtr4Q4rKdzwDjvh/4
mB7YIH4No7l1uOGWMlzh0qJtEPmv+fgJ30N/QM0CZFDhxx4GH87T5ILk55Ik
QowwRoQUPSvmn2ehm1UWQ3erh9xwYW+T5xKEkV6pRQaJlk7R5AJvxEszUHtn
YO1S0lYtg2Tdtc4fg+V8WldascobG49NlhjweqqM41dkkmQs3GaLTMAGHh9r
TpsapWyZ4USsXuTYavA2MUtaNDuWre56zmZag3vaad8Jx0zOtwzzjhjm7fmY
NcVWD/QT8jEmj2VsjA+bChfz+JG5DT8iwv8Y7KgOzF2xJJyy5Ui0NpsqbLUl
ivwl2rELu8s1xJtFPfwgSZEsStJDNb3HL4ZI5MWYUiymmjKnFUjUyLLH5kzu
FV1CdFJ2Dl88SIkUcueiX0PAK77uXQ5Awcrs0jm1LAR6AZGfWojBqQlAPKZE
vkYxhDovJJysMSLNzY1IKvz8O9gh5jmlAjzOZ/O8TJ16LnQgVZvRH4eNOW9g
5BoHoFlH8FEU9fjen9YEFC72iA5yDAbGxTj9gUUNPmZXphSRhieYEKJvoJyZ
YsWJ1BZGp/1W5bN0JLcCO79mAwSGO/HJqV7mn+PL0kdX8hilloJeMDqfLk45
kZWVfdh004Sd/3POG+OCoFxxMp/i8YukOL2E6cBLudzEYm/eHKezGTpRdEye
IwcdWmfIypO9oyFfP+FX3sXd9fJYcgOq1l+SW+l4oanktKYiy/LJlfC4HhvA
ugK4JCtIaQCYCq02TzVTPNj0Gl8ZsGeTTcKidsq9NPBCCQG4Ql2OGzPG6YyS
XgLTCpLLVOfdi377LPFKJCNCp8n7oLIHJYFK1TH/9usyLPobEhMxbyzqBKTP
+hCTCLofKE7N3eK1gEBtpTAOn9KYP38TV2c2isJKnl/E/W3zKaWv8O115Fod
UW2bU74Dsph5Tvbl1em4GLxtqBu7Xlezb4JSTg0JLUWwqkSRGF6rhwmUSTZG
5o7atnfgYChFJGtXEngJZraMZnuPlBHN4ctav5I7HdaAFrZavyxZFYtXWfLk
hZbls/KYCEYuTQ9gTYMEYZvm9Y2Usmmeqg/u3itt0dxleOagiFaI5/uMEr2A
PFNfdodrGHdsyrh42TtguFEmGg9ZK0yqyo1LC+lk5dHq6sodSTIZZOVAi8Y1
yqruuGuIbLDLNtplYn8h4iAQVvrQF0p5eBsoX4tc8qWRzZI2OyN3ssbtXMIb
6a28tfG7RNS4sL1lCrVqkMNLEYpcurOBwDYQ5PaHlk0s+Y7fulpStlaPqmHE
uHqSMuXqBfPFLM2x3JkbuR4Ni31MaRdyufNgOl3dWt3mTLGKGwV2LY9oVFBn
w3BRJqWj6WRc03IQnS2Q9jntDLYQZrZw0eMFF/ltFkClmagcaFsWuR6A03jk
6hypNLrhItmih3k7/jiftcYq6SWav4LardXHlPWg3FlKLrdjuza2qFhriVbp
InIJlv0gMUprDJZ6CVW5C/oraa9yBZKsSwQoxYKWJSMB+Z09+kWDoDLJUXkt
CYoHL+i8E/ykNQgHPNMBJj8du1sqmJzci+yFrYAhW+674EqecrZe7z8F8ULX
t+KREc5ydOaSivy49C1/4IU9LTFxZEg7d8n+cTQYIUPoTZPstDobcLIYMUu6
UtxvagbSqGtPBESe68FCpiuN4PEb7iCfKfFgnF71+9n/+7+jmRbCxWLgWPVD
Scm7xzemTDjXyegsGb2zOy3im3mndIvuo5D0w6MkTOtjPZfLs8IL0yNrIPvV
mivMAS8r3pRaJp7Gxutidr0EoPD0RVBijgSvXWfeEf5BjWgpKT/ipGTozYvp
WyIhOwRPCOItL6A/zQXxLhMJa85N8abfsJAtvnyax1OuKOYVK8QkGF6vFWUK
m0X6+ElQlq9ZEvCtvZNumHCW1CknmPOAUtwx6vfxmGPHJ8k1dR2lUR2sz5Le
YXvpyccs/2Z4yd3QW+TPDJAiQ+EVZtKdow4AKl6oNjpXMky92y6DGoFOG09r
bkUnL8k3oJo0Z0mGCoxLdAk7l+7eJXIJTu08hDXQSjBoklbrzEp6oDvgh4up
Cq/YTc4rtUf99NgKEn+A7cEegwyKDLpkeUZUrQSg+GgsQJG73RqxTiP1uAEd
l5njyTBgaP6jnuCpcRO2O/S3y8n0dRBKucnQ+lDwAi2asaRrO0mAuxO0c+Qa
rP/i8lGOK59jsDe4FEnyQxK06OIS4cCwSLEcZGTk+H329E0x7fpIX97VVzaJ
VxOoTlA5FuXz2DpQmOKsn4TWiKcT0XQwWr9AuUcWubvjsBUUeuPiLJ8mVEIo
qq0LvDE+TbS1rMxV+HTl4kSs24Ees+Aj4CwvUXGjo+Olc4Xx0jmP/JxqtvtJ
Eb41ry+0ZnPZ3precZrXEgf5T+Qe/3HJ5zt2jn9c1zjjl7qu9OMNa9hsMswr
zUL60UtIuvth7ir/y6GidZi7yf9aNsjd5n8tH+VnkP8lInuTvKzb5H/dbBg9
IakcaFkMhnqlBDAqdvPYV2ZLc3UvjbP4OvpV8y+KXlBhHDpB7nEG6UhKKvLV
iXLUJPBhG3q9R0xQjMKO67HsaM2OS+KcdO0II+mtmtPBhL2rgpZQ0KeY242b
wVV23PMev3722PwR/rBII5X86XFdHkEmFRX4FeiyE4pY7e3RC0/H/SMzR2XP
ViuwHamKjKfM4ZGsJbtjqUI838yWk2F7dUQSflRdR2/1nPtRdOQDG0Vv+Iym
/VGhjyJbq89VJcIGWDcjil6pJ7ztx6dauSgwY6gB6hWgzXAhaAD127fPel/2
qNQRrmnyvgL7802CN81Uly3vU2UZfAxI5BO9hBe04gEG5GzqGm6+y8B9s6A7
Wvy6cNiCOw8WKej/2CGttA4CIxcJazEn7OQtmGmSek/VtjMpISAMkdQJ3nRE
nwR3xpov6wNR9Kzl8rDmdI4DF2TrjWOe26jbqAnRLAnx+cN9OrkffQPLCc//
twGlM7UX3tq7nEZVYOp7tSwILlRpv/stRnxoolTgcScGwvoNFgjBGn+7aPJA
DydP3z4zAWYRXa+TeNp7i+ecj4skRgZWuTd5pck4XJTxKaEcyy28eokUay17
ChXaBrzyx4vqLC/2Hp9heEEDPWDjYwuEhBJKz9NS3QSu6A/3gfwMAcbqLW+C
UiuIDSxrJNey7rQVQ9kFxmeLt0RLlSD/bwnb0wI4Nd4XHELuXF3x2L2DaGcF
1K9dMR2YfJWP8qn5Rrd0dOLuR939JcLS506vrx0r7XogkDtRWSkVhPg3IKv7
n312n4752kJPymyoNE70pr4P3a57nZB/OC8u8bkYJjpSeTkb5vbiDOtua6ta
hRa21J2iaWidKAuRmo+rKlet7SSoX1UvXuVVrsKOblS8qlm5Crvwi1eZHfba
SnAiqFg1z2F/cc2c0wWsH+wfdd5RXSLJtJqCXADU7pJLdAxmPiEW8Q7sYIQJ
EK4inQNPgZcLEP2qx1R0C9143mV/UiBQL6b0WgPkx1+/fGaKBRhenTm+06kz
qvv9+26wbljYUxx5tTpPtt6n8cft/K+O2RljdHSkzgRbAamz19ntQovXv8Mj
Xv/r6XMsaf/a1vqK/O258/brJ8Dw6B4OKZ+gjkYsXIAeOIzsXCR82g5wge5V
J98ampEKtzbliBUkuqb7Al8CXJcLccnWUlZ6VkgC7Du6v0oQTl8/IQgAejOM
R+8wo4Dq90zNG/82NQSF76yRK9SBNoDppu9ruRnBFWzAbxHjj588eY4wjMbj
qdTerpLIXUVpu7ogiVSk51rY5rhIzR8AG1mS/aKk89NSF5buA45eAIHHYIv/
IUeOhS3kV3uPMGbnkO8T6dmxCYJRjz5LyXy+W44CMEw4r7KECwG/IIN/AEzs
ElNksvEA1TBhQ/06PtxFDRPkmlgoyGKFqjBz9kmsDwnSKSAQHcFSb5H2KOa3
9KM3Kddc0/OEdHdhluC94wjsFMUwUmvKF3qA0pFroBmdFbULj2MtLsB92WIV
6Zg5gz72r7+iS0VsZRIvU6QJ7Nu23tR5ys5uW7SoFUPDywj0XLq8JqebR6eA
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
WVBDNmZBbT5ueppxQ4taaDBFf5eLckb3Gtdcvsb4k8YLcAZvxKO7ebw1iE1J
vPaaqDPiUGys7nMNOPlHOqpkdEZMCUYbn6PmxAd5ojqkXvVWOnsbhj7pnpha
XFGzKeruao1vUgRHQOKAX6wFrekCKCmUzHnWWD+eDlHSDVOl/wbH9chDjtcP
2DjwlE/kGorpdO1JTDkZEyMzpqwMLFHej55Tf/qOdDHoDficrHc6uCVyijOd
tr7/afP9Jjq0Piy7wMFk6KEWjBEQPAKCXNmN2cfgGrKt32pk9cgc7h/e7+0f
9A4O3x4cHn12/+jw4E+dbvRpvRc78madHP6JD9B0/l0i7NDNWVXNj/b2asSx
Ny7iSdXb/2KPn93TF22tZ89E33NRQGnm/ehqHHe8Zn796GV3wi+9Dr7jFzSr
lVBeecN8xx0X+2ZJ32b5LBvGYKCLeOaUfy98x5Vg+ukgrTnZNoWTa6z8dGCG
fqhNoeTDYj8ZkIEo3AhG9MA3AFy6caj1kp5sgPujzFf7EA1mk6nV4+pL4Wr0
WV9FziX/6ZYxjAdsSmtS8/SnA7MWJFgKp34EgHurx53E0zJBybEauE+DjhUP
HSXQ2/FrlVkfQiui6Xzg2zar4APflxSEG7z9U61MjaBvt0DebQWbsC3UlJdh
zLvp4LZdbcX8aki3Yv4fKebDc90fxFwwi+UD31U/yodLYD7KvqGWol6klf2x
937DTv3o6ope/2kl8M9Dn/kJ9QRLIm2iKKBG+1ZAA22vyXU69nnLrTk3oNk6
0PWl3spQ78etDN3K0K0M/XnK0J+K6ze3uc9Cwwvt6O8GlLiMz/pv1i9Pa6xc
t9FAr/yq/2BqJYbCn5Z1Bz9p0KftNw0Ctf1WCwjJXy1p47r2ZsvNd/6vqxDK
g260vanpTbc4gbsGekH+csBr8t7+7uR+rwFofbN+uuFUgmSA5lSaQHgC/mDN
RPUKt+ZMbw5Lo3Nxwn2s7l0Rq+XrJFtlXU+Sy3b7nuq5Enfa5Z1B6TIz7qIz
jVfeYJ1rimB7vxrwvON+JSdkE668pieO3rbt9iZ7rzew7L3JJ1wKSuM1+bX1
h6VvYJ7Kkude3kprC8pjqfEpT1w2ONhV81EbMtoa2csk3fSb7a5b3r2rMX/C
4X7i2SEB/KSjeWT1E47bRqy3GK6lq5sqQcssbfrxVpzxY3TrZYitZI6qSK7p
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

-->

</rfc>
