<?xml version="1.0" encoding="utf-8"?>
<!--
  DESCRIPTION: XML Schema Definition (XSD) for ISO 22376 VDS manifest.
  This file defines the structure and constraints for VDS (Visible Digital Seal) manifest.
  LAST UPDATED: 2025-05-21
-->
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="https://trust.vdsic.org/schemas/04"
  xmlns="https://trust.vdsic.org/schemas/04"
  xmlns:xml="http://www.w3.org/XML/1998/namespace"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:ds="http://www.w3.org/2000/09/xmldsig#">

  <xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2009/01/xml.xsd"/>
  <xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="http://www.w3.org/TR/xmldsig-core/xmldsig-core-schema.xsd"/>

  <xs:element name="Manifest" type="ManifestType">
    <xs:annotation>
      <xs:documentation>Root element for a Use Case descriptor.</xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:element name="Id">
    <xs:annotation>
      <xs:documentation>Use case unique identifier. Restriction: 6 chars hexadecimal (uppercase and lowercase allowed).</xs:documentation>
    </xs:annotation>
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:pattern value="[0-9a-fA-F]{6}"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
  <xs:element name="Version">
    <xs:annotation>
      <xs:documentation>
        Use case version. Allows for non-breaking changes in the
        data schema, such as changes in the name or description of the use case, or
        non-breaking changes to extension information.
      </xs:documentation>
    </xs:annotation>
    <xs:simpleType>
      <xs:restriction base="xs:integer">
        <xs:minInclusive value="1"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
  <xs:element name="Name" type="NameType">
    <xs:annotation>
      <xs:documentation>
        Use case name. Multilingual. Restriction: At least 1 name must be
        defined.
      </xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:element name="Description" type="DescriptionType">
    <xs:annotation>
      <xs:documentation>
        Use case description. Multilingual. Restriction: At least 1
        description must be defined.
      </xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:element name="Schema" type="SchemaType">
    <xs:annotation>
      <xs:documentation>
        Use case data schema. Used to decode a VDS payload. Restriction:
        Exactly 1 schema MUST be defined.
      </xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:element name="Extensions" type="ExtensionsType">
    <xs:annotation>
      <xs:documentation>
        Defines an extension point where new features (proprietary or not) can
        be added. Default extensions are: - Policies: Validation policies
      </xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:complexType name="ValueType">
    <xs:annotation>
      <xs:documentation>
        Element used to define a translatable value. Translation is based on
        the xml:lang provide, ie a 2 letter language code.
      </xs:documentation>
    </xs:annotation>
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute ref="xml:lang"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="NameType">
    <xs:sequence>
      <xs:element type="ValueType" name="Value" maxOccurs="unbounded" minOccurs="1"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="DescriptionType">
    <xs:sequence>
      <xs:element type="ValueType" name="Value" maxOccurs="unbounded" minOccurs="1"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="BaseConstraintsType" abstract="true">
    <xs:sequence>
      <xs:element type="xs:string" name="Nillable" nillable="true" minOccurs="0">
        <xs:annotation>
          <xs:documentation>
            Sets an element as Nillable. By default, an element is not
            nillable.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="StringConstraintsType">
    <xs:annotation>
      <xs:documentation>Sets constraints on a String field.</xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="BaseConstraintsType">
        <xs:sequence>
          <xs:element type="xs:unsignedInt" name="MinLength" minOccurs="0">
            <xs:annotation>
              <xs:documentation>
                Minimum string length. Optional. Values from 0 to
                4,294,967,295.
              </xs:documentation>
            </xs:annotation>
          </xs:element>
          <xs:element type="xs:unsignedInt" name="MaxLength" minOccurs="0">
            <xs:annotation>
              <xs:documentation>
                Maximum string length. Optional. Values from 0 to
                4,294,967,295.
              </xs:documentation>
            </xs:annotation>
          </xs:element>
          <xs:element type="xs:string" name="Pattern" minOccurs="0">
            <xs:annotation>
              <xs:documentation>
                Allowed string pattern. Supports JavaScript RegEx.
                Optional.
              </xs:documentation>
            </xs:annotation>
          </xs:element>
          <xs:element name="Encoding" minOccurs="0">
            <xs:annotation>
              <xs:documentation>
                The field value encoding. If specified, the
                restrictions are validated against the decoded value.
              </xs:documentation>
            </xs:annotation>
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:enumeration value="BASE32"/>
                <xs:enumeration value="BASE64"/>
                <xs:enumeration value="C40"/>
              </xs:restriction>
            </xs:simpleType>
          </xs:element>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="TypeDef" abstract="true">
    <xs:annotation>
      <xs:documentation>Base entity for a schema field.</xs:documentation>
    </xs:annotation>
    <xs:attribute type="xs:string" name="name" use="required">
      <xs:annotation>
        <xs:documentation>Field name. Required.</xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>
  <xs:complexType name="StringType">
    <xs:annotation>
      <xs:documentation>
        Field representing a sequence of characters. Restrictions can be
        applied using StringConstraints element.
      </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="TypeDef">
        <xs:sequence>
          <xs:element type="StringConstraintsType" name="StringConstraints" minOccurs="0">
            <xs:annotation>
              <xs:documentation>Value restrictions. Optional.</xs:documentation>
            </xs:annotation>
          </xs:element>
          <xs:element name="Extension" type="FieldExtensionType" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="BinaryConstraintsType">
    <xs:annotation>
      <xs:documentation>Sets constraints on a Binary field.</xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="BaseConstraintsType">
        <xs:sequence>
          <xs:element type="xs:unsignedInt" name="MinLength" minOccurs="0">
            <xs:annotation>
              <xs:documentation>
                Minimum string length. Optional. Values from 0 to
                4,294,967,295.
              </xs:documentation>
            </xs:annotation>
          </xs:element>
          <xs:element type="xs:unsignedInt" name="MaxLength" minOccurs="0">
            <xs:annotation>
              <xs:documentation>
                Maximum string length. Optional. Values from 0 to
                4,294,967,295.
              </xs:documentation>
            </xs:annotation>
          </xs:element>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="BinaryType">
    <xs:annotation>
      <xs:documentation>
        Field representing a sequence of bytes. Restrictions can be applied
        using BinaryConstraints element.
      </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="TypeDef">
        <xs:sequence>
          <xs:element type="BinaryConstraintsType" name="BinaryConstraints" minOccurs="0">
            <xs:annotation>
              <xs:documentation>Value restrictions. Optional.</xs:documentation>
            </xs:annotation>
          </xs:element>
          <xs:element name="Extension" type="FieldExtensionType" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="BooleanConstraintsType">
    <xs:annotation>
      <xs:documentation>Boolean field restrictions.</xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="BaseConstraintsType"></xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="BooleanType">
    <xs:annotation>
      <xs:documentation>Boolean field type.</xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="TypeDef">
        <xs:sequence>
          <xs:element type="BooleanConstraintsType" name="BooleanConstraints" minOccurs="0">
            <xs:annotation>
              <xs:documentation>Boolean field restrictions.</xs:documentation>
            </xs:annotation>
          </xs:element>
          <xs:element name="Extension" type="FieldExtensionType" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="IntegerConstraintsType">
    <xs:annotation>
      <xs:documentation>Integer field restrictions.</xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="BaseConstraintsType">
        <xs:sequence>
          <xs:element type="xs:long" name="Min" minOccurs="0">
            <xs:annotation>
              <xs:documentation>
                Minimum value. Optional. Values from
                -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807.
              </xs:documentation>
            </xs:annotation>
          </xs:element>
          <xs:element type="xs:long" name="Max" minOccurs="0">
            <xs:annotation>
              <xs:documentation>
                Maximum value. Optional. Values from
                -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807.
              </xs:documentation>
            </xs:annotation>
          </xs:element>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="IntegerType">
    <xs:annotation>
      <xs:documentation>Integer type field.</xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="TypeDef">
        <xs:sequence>
          <xs:element type="IntegerConstraintsType" name="IntegerConstraints" minOccurs="0">
            <xs:annotation>
              <xs:documentation>Integer field restrictions. Optional.</xs:documentation>
            </xs:annotation>
          </xs:element>
          <xs:element name="Extension" type="FieldExtensionType" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="FloatConstraintsType">
    <xs:annotation>
      <xs:documentation>Float field restrictions.</xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="BaseConstraintsType">
        <xs:sequence>
          <xs:element type="xs:decimal" name="Min" minOccurs="0">
            <xs:annotation>
              <xs:documentation>
                Minimum value. Optional. The decimal separator is
                always a point (.), and no separation at the thousand mark may be
                added. There is no support for scientific notation. Allows any
                number of insignificant leading and trailing zeros (after the
                decimal point).
              </xs:documentation>
            </xs:annotation>
          </xs:element>
          <xs:element type="xs:decimal" name="Max" minOccurs="0">
            <xs:annotation>
              <xs:documentation>
                Maximum value. Optional. The decimal separator is
                always a point (.), and no separation at the thousand mark may be
                added. There is no support for scientific notation. Allows any
                number of insignificant leading and trailing zeros (after the
                decimal point).
              </xs:documentation>
            </xs:annotation>
          </xs:element>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="FloatType">
    <xs:annotation>
      <xs:documentation>Float type field.</xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="TypeDef">
        <xs:sequence>
          <xs:element type="FloatConstraintsType" name="FloatConstraints" minOccurs="0">
            <xs:annotation>
              <xs:documentation>Float field restrictions. Optional.</xs:documentation>
            </xs:annotation>
          </xs:element>
          <xs:element name="Extension" type="FieldExtensionType" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="DateConstraintsType">
    <xs:annotation>
      <xs:documentation>Date field restrictions.</xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="BaseConstraintsType">
        <xs:sequence>
          <xs:element type="xs:date" name="NotBefore" minOccurs="0">
            <xs:annotation>
              <xs:documentation>
                Minimum date allowed. Optional. Date must have the
                following format: YYYY-MM-DD.
              </xs:documentation>
            </xs:annotation>
          </xs:element>
          <xs:element type="xs:date" name="NotAfter" minOccurs="0">
            <xs:annotation>
              <xs:documentation>
                Maximum date allowed. Optional. Date must have the
                following format: YYYY-MM-DD.
              </xs:documentation>
            </xs:annotation>
          </xs:element>
          <xs:element type="xs:date" name="From" minOccurs="0">
            <xs:annotation>
              <xs:documentation>
                Date from which to calculate the number of days.
                Optional. Must be a date format (YYYY-MM-DD)
              </xs:documentation>
            </xs:annotation>
          </xs:element>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="DateType">
    <xs:annotation>
      <xs:documentation>
        Date type field. Represents the number of days from 2000-01-01, to a
        maximum of 65535 days (2 bytes).
      </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="TypeDef">
        <xs:sequence>
          <xs:element type="DateConstraintsType" name="DateConstraints" minOccurs="0">
            <xs:annotation>
              <xs:documentation>Date field restrictions. Optional.</xs:documentation>
            </xs:annotation>
          </xs:element>
          <xs:element name="Extension" type="FieldExtensionType" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="TimestampConstraintsType">
    <xs:annotation>
      <xs:documentation>Timestamp field restrictions.</xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="BaseConstraintsType">
        <xs:sequence>
          <xs:element type="xs:dateTime" name="NotBefore" minOccurs="0">
            <xs:annotation>
              <xs:documentation>
                Minimum date allowed. Optional. The dateTime is
                specified in the following form "YYYY-MM-DDThh:mm:ss".
              </xs:documentation>
            </xs:annotation>
          </xs:element>
          <xs:element type="xs:dateTime" name="NotAfter" minOccurs="0">
            <xs:annotation>
              <xs:documentation>
                Maximum date allowed. Optional. The dateTime is
                specified in the following form "YYYY-MM-DDThh:mm:ss".
              </xs:documentation>
            </xs:annotation>
          </xs:element>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="TimestampType">
    <xs:complexContent>
      <xs:extension base="TypeDef">
        <xs:sequence>
          <xs:element type="TimestampConstraintsType" name="TimestampConstraints" minOccurs="0">
            <xs:annotation>
              <xs:documentation>Timestamp field restrictions. Optional.</xs:documentation>
            </xs:annotation>
          </xs:element>
          <xs:element name="Extension" type="FieldExtensionType" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="ObjectConstraintsType">
    <xs:annotation>
      <xs:documentation>Object constraints type.</xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="BaseConstraintsType"></xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="ObjectType">
    <xs:annotation>
      <xs:documentation>Object type field.</xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="TypeDef">
        <xs:sequence>
          <xs:element type="ObjectConstraintsType" name="ObjectConstraints" minOccurs="0"/>
          <xs:element name="Extension" type="FieldExtensionType" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:attribute type="xs:string" name="type" use="required">
          <xs:annotation>
            <xs:documentation>
              Type of object. Must be a reference to an object defined
              in Types.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="ArrayConstraintsType">
    <xs:annotation>
      <xs:documentation>Restrictions common to all Array field type.</xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="BaseConstraintsType">
        <xs:sequence>
          <xs:element type="xs:unsignedInt" name="MinSize" minOccurs="0">
            <xs:annotation>
              <xs:documentation>
                Minimum array size. Optional. Values from 0 to
                4,294,967,295.
              </xs:documentation>
            </xs:annotation>
          </xs:element>
          <xs:element type="xs:unsignedInt" name="MaxSize" minOccurs="0">
            <xs:annotation>
              <xs:documentation>
                Maximum array size. Optional. Values from 0 to
                4,294,967,295.
              </xs:documentation>
            </xs:annotation>
          </xs:element>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="ArrayType">
    <xs:annotation>
      <xs:documentation>Base type for Array fields.</xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="TypeDef">
        <xs:sequence>
          <xs:element type="ArrayConstraintsType" name="ArrayConstraints" minOccurs="0">
            <xs:annotation>
              <xs:documentation>Array field restrictions. Optional.</xs:documentation>
            </xs:annotation>
          </xs:element>
          <xs:element name="Extension" type="FieldExtensionType" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="StringArrayType">
    <xs:annotation>
      <xs:documentation>String array field type.</xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="ArrayType">
        <xs:sequence>
          <xs:element type="StringConstraintsType" name="StringConstraints" minOccurs="0">
            <xs:annotation>
              <xs:documentation>String value restrictions. Optional.</xs:documentation>
            </xs:annotation>
          </xs:element>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="BinaryArrayType">
    <xs:annotation>
      <xs:documentation>Binary array field type.</xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="ArrayType">
        <xs:sequence>
          <xs:element type="BinaryConstraintsType" name="BinaryConstraints" minOccurs="0">
            <xs:annotation>
              <xs:documentation>Binary value restrictions. Optional.</xs:documentation>
            </xs:annotation>
          </xs:element>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="BooleanArrayType">
    <xs:annotation>
      <xs:documentation>Boolean array field type.</xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="ArrayType">
        <xs:sequence>
          <xs:element type="BooleanConstraintsType" name="BooleanConstraints" minOccurs="0">
            <xs:annotation>
              <xs:documentation>Boolean restrictions. Optional.</xs:documentation>
            </xs:annotation>
          </xs:element>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="IntegerArrayType">
    <xs:annotation>
      <xs:documentation>Integer array field type.</xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="ArrayType">
        <xs:sequence>
          <xs:element type="IntegerConstraintsType" name="IntegerConstraints" minOccurs="0">
            <xs:annotation>
              <xs:documentation>Integer value restrictions. Optional.</xs:documentation>
            </xs:annotation>
          </xs:element>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="FloatArrayType">
    <xs:annotation>
      <xs:documentation>Float array field type.</xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="ArrayType">
        <xs:sequence>
          <xs:element type="FloatConstraintsType" name="FloatConstraints" minOccurs="0">
            <xs:annotation>
              <xs:documentation>Float value restrictions. Optional.</xs:documentation>
            </xs:annotation>
          </xs:element>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="DateArrayType">
    <xs:annotation>
      <xs:documentation>Date array field type.</xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="ArrayType">
        <xs:sequence>
          <xs:element type="DateConstraintsType" name="DateConstraints" minOccurs="0">
            <xs:annotation>
              <xs:documentation>Date value restrictions. Optional.</xs:documentation>
            </xs:annotation>
          </xs:element>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="TimestampArrayType">
    <xs:annotation>
      <xs:documentation>Timestamp array field type.</xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="ArrayType">
        <xs:sequence>
          <xs:element type="TimestampConstraintsType" name="TimestampConstraints" minOccurs="0">
            <xs:annotation>
              <xs:documentation>Timestamp value restrictions. Optional.</xs:documentation>
            </xs:annotation>
          </xs:element>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="ObjectArrayType">
    <xs:annotation>
      <xs:documentation>Object array field type.</xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="ArrayType">
        <xs:sequence>
          <xs:element type="ObjectConstraintsType" name="ObjectConstraints" minOccurs="0">
            <xs:annotation>
              <xs:documentation>Object value restrictions. Optional.</xs:documentation>
            </xs:annotation>
          </xs:element>
        </xs:sequence>
        <xs:attribute type="xs:string" name="type" use="required"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="PayloadType">
    <xs:sequence>
      <xs:element type="FieldsType" name="Fields">
        <xs:annotation>
          <xs:documentation>List of fields defined in the payload.</xs:documentation>
        </xs:annotation>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="AuxDataType">
    <xs:sequence>
      <xs:element type="FieldsType" name="Fields" minOccurs="0">
        <xs:annotation>
          <xs:documentation>
            List of fields defined in the Auxiliary data. Optional. If not
            specified, this means there are no auxiliary data.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="FieldsType">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element type="StringType" name="String" maxOccurs="unbounded" minOccurs="0"/>
      <xs:element type="BinaryType" name="Binary" maxOccurs="unbounded" minOccurs="0"/>
      <xs:element type="BooleanType" name="Boolean" maxOccurs="unbounded" minOccurs="0"/>
      <xs:element type="IntegerType" name="Integer" maxOccurs="unbounded" minOccurs="0"/>
      <xs:element type="FloatType" name="Float" maxOccurs="unbounded" minOccurs="0"/>
      <xs:element type="DateType" name="Date" maxOccurs="unbounded" minOccurs="0"/>
      <xs:element type="TimestampType" name="Timestamp" maxOccurs="unbounded" minOccurs="0"/>
      <xs:element type="ObjectType" name="Object" maxOccurs="unbounded" minOccurs="0"/>
      <xs:element type="StringArrayType" name="StringArray" maxOccurs="unbounded" minOccurs="0"/>
      <xs:element type="BooleanArrayType" name="BooleanArray" maxOccurs="unbounded" minOccurs="0"/>
      <xs:element type="IntegerArrayType" name="IntegerArray" maxOccurs="unbounded" minOccurs="0"/>
      <xs:element type="FloatArrayType" name="FloatArray" maxOccurs="unbounded" minOccurs="0"/>
      <xs:element type="DateArrayType" name="DateArray" maxOccurs="unbounded" minOccurs="0"/>
      <xs:element type="TimestampArrayType" name="TimestampArray" maxOccurs="unbounded" minOccurs="0"/>
      <xs:element type="ObjectArrayType" name="ObjectArray" maxOccurs="unbounded" minOccurs="0"/>
      <xs:element type="BinaryArrayType" name="BinaryArray" maxOccurs="unbounded" minOccurs="0"/>
    </xs:choice>
  </xs:complexType>
  <xs:complexType name="TypeType">
    <xs:sequence>
      <xs:element type="FieldsType" name="Fields"/>
    </xs:sequence>
    <xs:attribute type="xs:string" name="name" use="required">
      <xs:annotation>
        <xs:documentation>
          Type name. Required. Must match any object in schema with same
          type.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>
  <xs:complexType name="TypesType">
    <xs:sequence>
      <xs:element type="TypeType" name="Type" maxOccurs="unbounded" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="SchemaType">
    <xs:sequence>
      <xs:element type="PayloadType" name="Payload" minOccurs="0">
        <xs:annotation>
          <xs:documentation>Payload definition </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element type="AuxDataType" name="AuxData" minOccurs="0">
        <xs:annotation>
          <xs:documentation>Auxiliary data definition. Optional </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element type="TypesType" name="Types" minOccurs="0">
        <xs:annotation>
          <xs:documentation>List of custom object types defined by this schema.</xs:documentation>
        </xs:annotation>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="ExtensionType" abstract="true">
    <xs:annotation>
      <xs:documentation>Base type for an extension.</xs:documentation>
    </xs:annotation>
  </xs:complexType>
  <xs:complexType name="ExtensionsType">
    <xs:sequence>
      <xs:element type="ExtensionType" name="Extension" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="FieldExtensionType" abstract="true">
    <xs:annotation>
      <xs:documentation>Base type for a field extension.</xs:documentation>
    </xs:annotation>
  </xs:complexType>
  <xs:complexType name="ManifestType">
    <xs:sequence>
      <xs:element ref="Id"/>
      <xs:element ref="Version"/>
      <xs:element ref="Name"/>
      <xs:element ref="Description"/>
      <xs:element ref="Schema" minOccurs="0"/>
      <xs:element ref="Extensions" minOccurs="0"/>
      <xs:element ref="ds:Signature" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute type="xs:int" name="version" use="required" fixed="1">
      <xs:annotation>
        <xs:documentation>Manifest format version. MUST be 1.</xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>
</xs:schema>