import lxml.etree
myrpki = lxml.etree.RelaxNG(lxml.etree.fromstring('''<?xml version="1.0" encoding="UTF-8"?>
<!--
  $Id: schema.rnc 2839 2009-10-27 18:53:00Z sra $
  
  RelaxNG Schema for MyRPKI XML messages
  
  libxml2 (including xmllint) only groks the XML syntax of RelaxNG, so
  run the compact syntax through trang to get XML syntax.
-->
<grammar ns="http://www.hactrn.net/uris/rpki/myrpki/" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
  <define name="base64">
    <data type="base64Binary">
      <param name="maxLength">512000</param>
    </data>
  </define>
  <define name="object_handle">
    <data type="string">
      <param name="maxLength">255</param>
      <param name="pattern">[\-_A-Za-z0-9]*</param>
    </data>
  </define>
  <define name="pubd_handle">
    <data type="string">
      <param name="maxLength">255</param>
      <param name="pattern">[\-_A-Za-z0-9/]*</param>
    </data>
  </define>
  <define name="uri">
    <data type="anyURI">
      <param name="maxLength">4096</param>
    </data>
  </define>
  <define name="asn_list">
    <data type="string">
      <param name="maxLength">512000</param>
      <param name="pattern">[\-,0-9]*</param>
    </data>
  </define>
  <define name="ipv4_list">
    <data type="string">
      <param name="maxLength">512000</param>
      <param name="pattern">[\-,0-9/.]*</param>
    </data>
  </define>
  <define name="ipv6_list">
    <data type="string">
      <param name="maxLength">512000</param>
      <param name="pattern">[\-,0-9/:a-fA-F]*</param>
    </data>
  </define>
  <start>
    <element name="myrpki">
      <attribute name="version">
        <data type="positiveInteger">
          <param name="maxInclusive">1</param>
        </data>
      </attribute>
      <attribute name="handle">
        <ref name="object_handle"/>
      </attribute>
      <attribute name="repository_handle">
        <ref name="pubd_handle"/>
      </attribute>
      <zeroOrMore>
        <ref name="roa_request_elt"/>
      </zeroOrMore>
      <zeroOrMore>
        <ref name="child_elt"/>
      </zeroOrMore>
      <zeroOrMore>
        <ref name="parent_elt"/>
      </zeroOrMore>
      <optional>
        <ref name="bpki_ca_certificate_elt"/>
      </optional>
      <optional>
        <ref name="bpki_crl_elt"/>
      </optional>
      <optional>
        <ref name="bpki_repository_certificate_elt"/>
      </optional>
      <optional>
        <ref name="bpki_bsc_certificate_elt"/>
      </optional>
      <optional>
        <ref name="bpki_bsc_pkcs10_elt"/>
      </optional>
    </element>
  </start>
  <define name="roa_request_elt">
    <element name="roa_request">
      <attribute name="asn">
        <data type="positiveInteger"/>
      </attribute>
      <attribute name="v4">
        <ref name="ipv4_list"/>
      </attribute>
      <attribute name="v6">
        <ref name="ipv6_list"/>
      </attribute>
    </element>
  </define>
  <define name="child_elt">
    <element name="child">
      <attribute name="handle">
        <ref name="object_handle"/>
      </attribute>
      <attribute name="valid_until">
        <data type="dateTime">
          <param name="pattern">.*Z</param>
        </data>
      </attribute>
      <optional>
        <attribute name="asns">
          <ref name="asn_list"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="v4">
          <ref name="ipv4_list"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="v6">
          <ref name="ipv6_list"/>
        </attribute>
      </optional>
      <optional>
        <element name="bpki_certificate">
          <ref name="base64"/>
        </element>
      </optional>
    </element>
  </define>
  <define name="parent_elt">
    <element name="parent">
      <attribute name="handle">
        <ref name="object_handle"/>
      </attribute>
      <optional>
        <attribute name="service_uri">
          <ref name="uri"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="myhandle">
          <ref name="object_handle"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="sia_base">
          <ref name="uri"/>
        </attribute>
      </optional>
      <optional>
        <element name="bpki_cms_certificate">
          <ref name="base64"/>
        </element>
      </optional>
      <optional>
        <element name="bpki_https_certificate">
          <ref name="base64"/>
        </element>
      </optional>
    </element>
  </define>
  <define name="bpki_ca_certificate_elt">
    <element name="bpki_ca_certificate">
      <ref name="base64"/>
    </element>
  </define>
  <define name="bpki_crl_elt">
    <element name="bpki_crl">
      <ref name="base64"/>
    </element>
  </define>
  <define name="bpki_repository_certificate_elt">
    <element name="bpki_repository_certificate">
      <ref name="base64"/>
    </element>
  </define>
  <define name="bpki_bsc_certificate_elt">
    <element name="bpki_bsc_certificate">
      <ref name="base64"/>
    </element>
  </define>
  <define name="bpki_bsc_pkcs10_elt">
    <element name="bpki_bsc_pkcs10">
      <ref name="base64"/>
    </element>
  </define>
</grammar>
<!--
  Local Variables:
  indent-tabs-mode: nil
  End:
-->
'''))