<?xml version="1.0" encoding="UTF-8"?>

<schema targetNamespace="urn:ietf:params:xml:ns:epp-1.0"
        xmlns:epp="urn:ietf:params:xml:ns:epp-1.0"
        xmlns:eppcom="urn:ietf:params:xml:ns:eppcom-1.0"
        xmlns="http://www.w3.org/2001/XMLSchema"
        elementFormDefault="qualified">

<!--
Import common element types.
-->
  <import namespace="urn:ietf:params:xml:ns:eppcom-1.0"
          schemaLocation="eppcom-1.0.xsd"/>

  <annotation>
    <documentation>
      Extensible Provisioning Protocol v1.0 schema.
    </documentation>
  </annotation>

<!--
Every EPP XML instance must begin with this element.
-->
  <element name="epp" type="epp:eppType"/>

<!--
An EPP XML instance must contain a greeting, hello, command,
response, or extension.
-->
  <complexType name="eppType">
    <choice>
      <element name="greeting" type="epp:greetingType"/>
      <element name="hello"/>
      <element name="command" type="epp:commandType"/>
      <element name="response" type="epp:responseType"/>
      <element name="extension" type="epp:extAnyType"/>
    </choice>
  </complexType>

<!--
A greeting is sent by a server in response to a client connection
or <hello>.
-->
  <complexType name="greetingType">
    <sequence>
      <element name="svID" type="epp:sIDType"/>
      <element name="svDate" type="dateTime"/>
      <element name="svcMenu" type="epp:svcMenuType"/>
      <element name="dcp" type="epp:dcpType"
       minOccurs="0"/>
    </sequence>
  </complexType>

<!--
Server IDs are strings with minimum and maximum length restrictions.
-->
  <simpleType name="sIDType">
    <restriction base="normalizedString">
      <minLength value="3"/>
      <maxLength value="64"/>
    </restriction>
  </simpleType>

<!--
A server greeting identifies available object services.
-->
  <complexType name="svcMenuType">
    <sequence>
      <element name="version" type="epp:versionType"
       maxOccurs="unbounded"/>
      <element name="lang" type="language"
       maxOccurs="unbounded"/>
      <element name="objURI" type="anyURI"
       maxOccurs="unbounded"/>
      <element name="svcExtension" type="epp:extURIType"
       minOccurs="0"/>
    </sequence>
  </complexType>

<!--
Data Collection Policy types.
-->
  <complexType name="dcpType">
    <sequence>
      <element name="access" type="epp:dcpAccessType"/>
      <element name="statement" type="epp:dcpStatementType"
       maxOccurs="unbounded"/>
      <element name="expiry" type="epp:dcpExpiryType"
       minOccurs="0"/>
    </sequence>
  </complexType>

  <complexType name="dcpAccessType">
    <choice>
      <element name="all"/>
      <element name="none"/>
      <element name="null"/>
      <element name="other"/>
      <element name="personal"/>
      <element name="personalAndOther"/>
    </choice>
  </complexType>

  <complexType name="dcpStatementType">
    <sequence>
      <element name="purpose" type="epp:dcpPurposeType"/>
      <element name="recipient" type="epp:dcpRecipientType"/>
      <element name="retention" type="epp:dcpRetentionType"/>
    </sequence>
  </complexType>

  <complexType name="dcpPurposeType">
    <sequence>
      <element name="admin"
       minOccurs="0"/>
      <element name="contact"
       minOccurs="0"/>
      <element name="other"
       minOccurs="0"/>
      <element name="prov"
       minOccurs="0"/>
    </sequence>
  </complexType>

  <complexType name="dcpRecipientType">
    <sequence>
      <element name="other"
       minOccurs="0"/>
      <element name="ours" type="epp:dcpOursType"
       minOccurs="0" maxOccurs="unbounded"/>
      <element name="public"
       minOccurs="0"/>
      <element name="same"
       minOccurs="0"/>
      <element name="unrelated"
       minOccurs="0"/>
    </sequence>
  </complexType>

  <complexType name="dcpOursType">
    <sequence>
      <element name="recDesc" type="epp:dcpRecDescType"
       minOccurs="0"/>
    </sequence>
  </complexType>

  <simpleType name="dcpRecDescType">
    <restriction base="token">
      <minLength value="1"/>
      <maxLength value="255"/>
    </restriction>
  </simpleType>

  <complexType name="dcpRetentionType">
    <choice>
      <element name="business"/>
      <element name="indefinite"/>
      <element name="legal"/>
      <element name="none"/>
      <element name="stated"/>
    </choice>
  </complexType>

  <complexType name="dcpExpiryType">
    <choice>
      <element name="absolute" type="dateTime"/>
      <element name="relative" type="duration"/>
    </choice>
  </complexType>

<!--
Extension framework types.
-->
  <complexType name="extAnyType">
    <sequence>
      <any namespace="##other"
       maxOccurs="unbounded"/>
    </sequence>
  </complexType>

  <complexType name="extURIType">
    <sequence>
      <element name="extURI" type="anyURI"
       maxOccurs="unbounded"/>
    </sequence>
  </complexType>

<!--
An EPP version number is a dotted pair of decimal numbers.
-->
  <simpleType name="versionType">
    <restriction base="token">
      <pattern value="[1-9]+\.[0-9]+"/>
      <enumeration value="1.0"/>
    </restriction>
  </simpleType>

<!--
Command types.
-->
  <complexType name="commandType">
    <sequence>
      <element name="creds" type="epp:credsType"
       minOccurs="0"/>
      <choice>
        <element name="check" type="epp:readWriteType"/>
        <element name="create" type="epp:readWriteType"/>
        <element name="delete" type="epp:readWriteType"/>
        <element name="info" type="epp:readWriteType"/>
        <element name="login" type="epp:loginType"/>
        <element name="logout"/>
        <element name="poll" type="epp:pollType"/>
        <element name="renew" type="epp:readWriteType"/>
        <element name="status" type="epp:statusType"/>
        <element name="transfer" type="epp:transferType"/>
        <element name="update" type="epp:readWriteType"/>
      </choice>
      <element name="extension" type="epp:extAnyType"
       minOccurs="0"/>
      <element name="clTRID" type="epp:trIDStringType"
       minOccurs="0"/>
    </sequence>
  </complexType>

<!--
Credentials and options may be specified as part of a <login>
command to create a session, or they may be specified with other
commands to operate in session-less mode.  The two modes can not
be mixed.
-->
  <complexType name="credsType">
    <sequence>
      <element name="clID" type="eppcom:clIDType"/>
      <element name="pw" type="epp:pwType"/>
      <element name="newPW" type="epp:pwType"
       minOccurs="0"/>
      <element name="options" type="epp:credsOptionsType"/>
    </sequence>
  </complexType>

  <complexType name="credsOptionsType">
    <sequence>
      <element name="version" type="epp:versionType"/>
      <element name="lang" type="language"/>
    </sequence>
  </complexType>

  <simpleType name="pwType">
    <restriction base="token">
      <minLength value="6"/>
      <maxLength value="16"/>
    </restriction>
  </simpleType>

<!--
The <login> command.
-->
  <complexType name="loginType">
    <sequence>
      <element name="svcs" type="epp:loginSvcType"/>
    </sequence>
  </complexType>

  <complexType name="loginSvcType">
    <sequence>
      <element name="objURI" type="anyURI"
       maxOccurs="unbounded"/>
      <element name="svcExtension" type="epp:extURIType"
       minOccurs="0"/>
    </sequence>
  </complexType>

<!--
The <poll> command.
-->
  <complexType name="pollType">
    <attribute name="op" type="epp:pollOpType"
     use="required"/>
    <attribute name="msgID" type="token"/>
  </complexType>

  <simpleType name="pollOpType">
    <restriction base="token">
      <enumeration value="ack"/>
      <enumeration value="req"/>
    </restriction>
  </simpleType>

<!--
The <status> command.
-->
  <complexType name="statusType">
    <sequence>
      <element name="clTRID" type="epp:trIDStringType"/>
    </sequence>
    <attribute name="command" type="epp:statusCommandType"
     use="required"/>
  </complexType>

  <simpleType name="statusCommandType">
    <restriction base="token">
      <enumeration value="create"/>
      <enumeration value="delete"/>
      <enumeration value="renew"/>
      <enumeration value="transfer"/>
      <enumeration value="update"/>
    </restriction>
  </simpleType>

<!--
The <transfer> command.  This is object-specific, and uses attributes
to identify the requested operation.
-->
  <complexType name="transferType">
    <sequence>
      <any namespace="##other"/>
    </sequence>
    <attribute name="op" type="epp:transferOpType"
     use="required"/>
  </complexType>

  <simpleType name="transferOpType">
    <restriction base="token">
      <enumeration value="approve"/>
      <enumeration value="cancel"/>
      <enumeration value="query"/>
      <enumeration value="reject"/>
      <enumeration value="request"/>
    </restriction>
  </simpleType>

<!--
All other object-centric commands. EPP doesn't specify the syntax or
semantics of object-centric command elements.  The elements MUST be
described in detail in another schema specific to the object.
-->
  <complexType name="readWriteType">
    <sequence>
      <any namespace="##other"/>
    </sequence>
  </complexType>

  <complexType name="trIDType">
    <sequence>
      <element name="clTRID" type="epp:trIDStringType"
       minOccurs="0"/>
      <element name="svTRID" type="epp:trIDStringType"/>
    </sequence>
  </complexType>

  <simpleType name="trIDStringType">
    <restriction base="token">
      <minLength value="3"/>
      <maxLength value="64"/>
    </restriction>
  </simpleType>

<!--
Response types.
-->
  <complexType name="responseType">
    <sequence>
      <element name="result" type="epp:resultType"
       maxOccurs="unbounded"/>
      <element name="msgQ" type="epp:msgQType"
       minOccurs="0"/>
      <element name="resData" type="epp:extAnyType"
       minOccurs="0"/>
      <element name="extension" type="epp:extAnyType"
       minOccurs="0"/>
      <element name="trID" type="epp:trIDType"/>
    </sequence>
  </complexType>

  <complexType name="resultType">
    <sequence>
      <element name="msg" type="epp:msgType"/>
      <element name="value" type="epp:errValueType"
       minOccurs="0" maxOccurs="unbounded"/>
      <element name="data" type="epp:resultDataType"
       minOccurs="0"/>
    </sequence>
    <attribute name="code" type="epp:resultCodeType"
     use="required"/>
  </complexType>

  <complexType name="errValueType" mixed="true">
    <sequence>
      <any namespace="##any" processContents="skip"/>
    </sequence>
    <anyAttribute namespace="##any" processContents="skip"/>
  </complexType>

  <complexType name="resultDataType">
    <sequence>
      <element name="status" type="epp:statusResultDataType"/>
    </sequence>
  </complexType>

  <complexType name="statusResultDataType">
    <sequence>
      <element name="clTRID" type="epp:trIDStatusType"
       minOccurs="0"/>
    </sequence>
  </complexType>

  <complexType name="trIDStatusType">
    <simpleContent>
      <extension base="epp:trIDStringType">
        <attribute name="ack" type="boolean"
         use="required"/>
      </extension>
    </simpleContent>
  </complexType>

  <complexType name="msgQType">
    <sequence>
      <element name="qDate" type="dateTime"
       minOccurs="0"/>
      <element name="msg" type="epp:msgType"
       minOccurs="0"/>
    </sequence>
    <attribute name="count" type="unsignedLong"
     use="required"/>
    <attribute name="id" type="eppcom:minTokenType"
     use="required"/>
  </complexType>

<!--
Human-readable text may be expressed in languages other than English.
-->
  <complexType name="msgType">
    <simpleContent>
      <extension base="normalizedString">
        <attribute name="lang" type="language"
         default="en"/>
      </extension>
    </simpleContent>
  </complexType>

<!--
EPP result codes.
-->
  <simpleType name="resultCodeType">
    <restriction base="unsignedShort">
      <enumeration value="1000"/>
      <enumeration value="1300"/>
      <enumeration value="1301"/>
      <enumeration value="1500"/>
      <enumeration value="2000"/>
      <enumeration value="2001"/>
      <enumeration value="2002"/>
      <enumeration value="2003"/>
      <enumeration value="2004"/>
      <enumeration value="2005"/>
      <enumeration value="2100"/>
      <enumeration value="2101"/>
      <enumeration value="2102"/>
      <enumeration value="2103"/>
      <enumeration value="2104"/>
      <enumeration value="2105"/>
      <enumeration value="2106"/>
      <enumeration value="2200"/>
      <enumeration value="2201"/>
      <enumeration value="2202"/>
      <enumeration value="2300"/>
      <enumeration value="2301"/>
      <enumeration value="2302"/>
      <enumeration value="2303"/>
      <enumeration value="2304"/>
      <enumeration value="2305"/>
      <enumeration value="2306"/>
      <enumeration value="2307"/>
      <enumeration value="2308"/>
      <enumeration value="2400"/>
      <enumeration value="2500"/>
      <enumeration value="2501"/>
      <enumeration value="2502"/>
    </restriction>
  </simpleType>

<!--
End of schema.
-->
</schema>
