<?xml version = "1.0" encoding="US-ASCII" ?>

<!--
   Revision: 101.pr1 (Public Reivew Draft 1)
   Date: 1/22/2000
  
   Interactive Financial Exchange DTD
   Copyright 1999, 2000
-->
<!--                                       -->
<!-- Interactive Financial Exchange Macros -->
<!--                                       -->
<!ENTITY % IFXSVCRQS "BaseSvcRq*
                      , BankSvcRq*
                      , PaySvcRq*
                      , PresSvcRq*">

<!ENTITY % IFXSVCRSS "BaseSvcRs*
                      , BankSvcRs*
                      , PaySvcRs*
                      , PresSvcRs*">

<!ENTITY % ADDRESS " (Addr1
                    ,  (Addr2
                    |  (Addr2
                    , Addr3+ )
                    |  (Addr2
                    , Addr3
                    , Addr4+ ) )?
                    , City?
                    , StateProv?
                    , PostalCode?
                    , Country? )">

<!ENTITY % CURRENCYAMOUNT " (Amt
                           , CurCode?
                           ,  (CurRate
                           , CurConvertRule )? )">

<!ENTITY % MINMAXCURAMT " (MinCurAmt?
                         , MaxCurAmt? )">

<!ENTITY % LOWHIGHCURAMT " (LowCurAmt?
                          , HighCurAmt? )">

<!ENTITY % DATERANGE " ( (StartDt
                      , EndDt? )
                      |  (StartDt?
                      , EndDt ) )">

<!--                 -->
<!-- IFX top element -->
<!--                 -->
<!ELEMENT IFX  ((SignonRq, %IFXSVCRQS;, SignoffRq?) | (SignonRs,
%IFXSVCRSS;, SignoffRs?))>

<!--               -->
<!-- Type Entities -->
<!--               -->
<!ENTITY % Long " (#PCDATA )">

<!--#ENTITY % Long     #DataType(I-10)-->
<!ENTITY % Type_Long " dt:type NMTOKEN  #FIXED 'integer'">
<!-- XXX what is length 'n' used in OFX style type DataType(I-n)???-->

<!ENTITY % Decimal " (#PCDATA )">

<!--#ENTITY % Decimal     #DataType(N-15)-->
<!ENTITY % Type_Decimal " dt:type NMTOKEN  #FIXED 'decimal'">
<!-- XXX what is length 'n' used in OFX style type DataType(N-n)???-->

<!ENTITY % Boolean " (#PCDATA )">

<!--#ENTITY % Boolean     #DataType(BOOL)-->
<!ENTITY % Type_Boolean " dt:type NMTOKEN  #FIXED 'boolean'">

<!ENTITY % NC-3 " (#PCDATA )">

<!--#ENTITY % NC-3     #DataType(B-3)-->
<!ENTITY % Type_NC-3 " dt:type      NMTOKEN  #FIXED 'string'
                     dt:maxLength CDATA    #FIXED '3'
                     dt:pattern   CDATA    #FIXED '[\000-\177]*'">

<!ENTITY % NC-6 " (#PCDATA )">

<!--#ENTITY % NC-6     #DataType(B-6)-->
<!ENTITY % Type_NC-6 " dt:type      NMTOKEN  #FIXED 'string'
                     dt:maxLength CDATA    #FIXED '6'
                     dt:pattern   CDATA    #FIXED '[\000-\177]*'">

<!ENTITY % NC-8 " (#PCDATA )">

<!--#ENTITY % NC-8     #DataType(B-8)-->
<!ENTITY % Type_NC-8 " dt:type      NMTOKEN  #FIXED 'string'
                     dt:maxLength CDATA    #FIXED '8'
                     dt:pattern   CDATA    #FIXED '[\000-\177]*'">

<!ENTITY % NC-9 " (#PCDATA )">

<!--#ENTITY % NC-9     #DataType(B-9)-->
<!ENTITY % Type_NC-9 " dt:type      NMTOKEN  #FIXED 'string'
                     dt:maxLength CDATA    #FIXED '9'
                     dt:pattern   CDATA    #FIXED '[\000-\177]*'">

<!ENTITY % NC-11 " (#PCDATA )">

<!--#ENTITY % NC-11     #DataType(B-11)-->
<!ENTITY % Type_NC-11 " dt:type      NMTOKEN  #FIXED 'string'
                     dt:maxLength CDATA    #FIXED '11'
                     dt:pattern   CDATA    #FIXED '[\000-\177]*'">

<!ENTITY % NC-12 " (#PCDATA )">

<!--#ENTITY % NC-12     #DataType(B-12)-->
<!ENTITY % Type_NC-12 " dt:type      NMTOKEN  #FIXED 'string'
                     dt:maxLength CDATA    #FIXED '12'
                     dt:pattern   CDATA    #FIXED '[\000-\177]*'">

<!ENTITY % NC-22 " (#PCDATA )">

<!--#ENTITY % NC-22     #DataType(B-22)-->
<!ENTITY % Type_NC-22 " dt:type      NMTOKEN  #FIXED 'string'
                     dt:maxLength CDATA    #FIXED '22'
                     dt:pattern   CDATA    #FIXED '[\000-\177]*'">

<!ENTITY % NC-32 " (#PCDATA )">

<!--#ENTITY % NC-32     #DataType(B-32)-->
<!ENTITY % Type_NC-32 " dt:type      NMTOKEN  #FIXED 'string'
                     dt:maxLength CDATA    #FIXED '32'
                     dt:pattern   CDATA    #FIXED '[\000-\177]*'">

<!ENTITY % NC-34 " (#PCDATA )">

<!--#ENTITY % NC-34     #DataType(B-34)-->
<!ENTITY % Type_NC-34 " dt:type      NMTOKEN  #FIXED 'string'
                     dt:maxLength CDATA    #FIXED '34'
                     dt:pattern   CDATA    #FIXED '[\000-\177]*'">

<!ENTITY % NC-64 " (#PCDATA )">

<!--#ENTITY % NC-64     #DataType(B-64)-->
<!ENTITY % Type_NC-64 " dt:type      NMTOKEN  #FIXED 'string'
                     dt:maxLength CDATA    #FIXED '64'
                     dt:pattern   CDATA    #FIXED '[\000-\177]*'">

<!ENTITY % NC-80 " (#PCDATA )">

<!--#ENTITY % NC-80     #DataType(B-80)-->
<!ENTITY % Type_NC-80 " dt:type      NMTOKEN  #FIXED 'string'
                     dt:maxLength CDATA    #FIXED '80'
                     dt:pattern   CDATA    #FIXED '[\000-\177]*'">

<!ENTITY % NC-128 " (#PCDATA )">

<!--#ENTITY % NC-128     #DataType(B-128)-->
<!ENTITY % Type_NC-128 " dt:type      NMTOKEN  #FIXED 'string'
                     dt:maxLength CDATA    #FIXED '128'
                     dt:pattern   CDATA    #FIXED '[\000-\177]*'">

<!ENTITY % NC-180 " (#PCDATA )">

<!--#ENTITY % NC-180     #DataType(B-180)-->
<!ENTITY % Type_NC-180 " dt:type      NMTOKEN  #FIXED 'string'
                     dt:maxLength CDATA    #FIXED '180'
                     dt:pattern   CDATA    #FIXED '[\000-\177]*'">

<!ENTITY % NC-1024 " (#PCDATA )">

<!--#ENTITY % NC-1024     #DataType(B-1024)-->
<!ENTITY % Type_NC-1024 " dt:type      NMTOKEN  #FIXED 'string'
                     dt:maxLength CDATA    #FIXED '1024'
                     dt:pattern   CDATA    #FIXED '[\000-\177]*'">

<!ENTITY % C-8 " (#PCDATA )">

<!--#ENTITY % C-8     #DataType(A-8)-->
<!ENTITY % Type_C-8 " dt:type      NMTOKEN  #FIXED 'string'
                     dt:maxLength CDATA    #FIXED '8'">

<!ENTITY % C-11 " (#PCDATA )">

<!--#ENTITY % C-11     #DataType(A-11)-->
<!ENTITY % Type_C-11 " dt:type      NMTOKEN  #FIXED 'string'
                     dt:maxLength CDATA    #FIXED '11'">

<!ENTITY % C-12 " (#PCDATA )">

<!--#ENTITY % C-12     #DataType(A-12)-->
<!ENTITY % Type_C-12 " dt:type      NMTOKEN  #FIXED 'string'
                     dt:maxLength CDATA    #FIXED '12'">

<!ENTITY % C-14 " (#PCDATA )">

<!--#ENTITY % C-14     #DataType(A-14)-->
<!ENTITY % Type_C-14 " dt:type      NMTOKEN  #FIXED 'string'
                     dt:maxLength CDATA    #FIXED '14'">

<!ENTITY % C-15 " (#PCDATA )">

<!--#ENTITY % C-15     #DataType(A-15)-->
<!ENTITY % Type_C-15 " dt:type      NMTOKEN  #FIXED 'string'
                     dt:maxLength CDATA    #FIXED '15'">

<!ENTITY % C-18 " (#PCDATA )">

<!--#ENTITY % C-18     #DataType(A-18)-->
<!ENTITY % Type_C-18 " dt:type      NMTOKEN  #FIXED 'string'
                     dt:maxLength CDATA    #FIXED '18'">

<!ENTITY % C-20 " (#PCDATA )">

<!--#ENTITY % C-20     #DataType(A-20)-->
<!ENTITY % Type_C-20 " dt:type      NMTOKEN  #FIXED 'string'
                     dt:maxLength CDATA    #FIXED '20'">

<!ENTITY % C-32 " (#PCDATA )">

<!--#ENTITY % C-32     #DataType(A-32)-->
<!ENTITY % Type_C-32 " dt:type      NMTOKEN  #FIXED 'string'
                     dt:maxLength CDATA    #FIXED '32'">

<!ENTITY % C-40 " (#PCDATA )">

<!--#ENTITY % C-40     #DataType(A-40)-->
<!ENTITY % Type_C-40 " dt:type      NMTOKEN  #FIXED 'string'
                     dt:maxLength CDATA    #FIXED '40'">

<!ENTITY % C-64 " (#PCDATA )">

<!--#ENTITY % C-64     #DataType(A-64)-->
<!ENTITY % Type_C-64 " dt:type      NMTOKEN  #FIXED 'string'
                     dt:maxLength CDATA    #FIXED '64'">

<!ENTITY % C-80 " (#PCDATA )">

<!--#ENTITY % C-80     #DataType(A-80)-->
<!ENTITY % Type_C-80 " dt:type      NMTOKEN  #FIXED 'string'
                     dt:maxLength CDATA    #FIXED '80'">

<!ENTITY % C-96 " (#PCDATA )">

<!--#ENTITY % C-96     #DataType(A-96)-->
<!ENTITY % Type_C-96 " dt:type      NMTOKEN  #FIXED 'string'
                     dt:maxLength CDATA    #FIXED '96'">

<!ENTITY % C-255 " (#PCDATA )">

<!--#ENTITY % C-255     #DataType(A-255)-->
<!ENTITY % Type_C-255 " dt:type      NMTOKEN  #FIXED 'string'
                     dt:maxLength CDATA    #FIXED '255'">

<!ENTITY % C-1024 " (#PCDATA )">

<!--#ENTITY % C-1024     #DataType(A-1024)-->
<!ENTITY % Type_C-1024 " dt:type      NMTOKEN  #FIXED 'string'
                     dt:maxLength CDATA    #FIXED '1024'">

<!ENTITY % C-Infinite " (#PCDATA )">

<!--#ENTITY % C-Infinite     #DataType(A-n)-->
<!ENTITY % Type_C-Infinite " dt:type NMTOKEN  #FIXED 'string'">

<!ENTITY % UUID " (#PCDATA )">

<!--#ENTITY % UUID     #DataType(B-36)-->
<!ENTITY % Type_UUID " dt:type    NMTOKEN  #FIXED 'string'
                     dt:length  CDATA    #FIXED '36'
                     dt:pattern CDATA    #FIXED '[0-9,a-f,A-F]{8}-[0-9,a-f,A-F]{4}-[0-9,a-f,A-F]{4}-[0-9,a-f,A-F]{4}-[0-9,a-f,A-F]{12}'">

<!ENTITY % Identifier " (#PCDATA )">

<!--#ENTITY % Identifier     #DataType(B-32)-->
<!ENTITY % Type_Identifier " dt:type      NMTOKEN  #FIXED 'string'
                     dt:maxLength CDATA    #FIXED '32'
                     dt:pattern   CDATA    #FIXED '[\000-\177]*'">

<!ENTITY % OpenEnum " (#PCDATA )">

<!--#ENTITY % OpenEnum     #DataType(B-80)-->
<!ENTITY % Type_OpenEnum " dt:type      NMTOKEN  #FIXED 'string'
                     dt:maxLength CDATA    #FIXED '80'
                     dt:pattern   CDATA    #FIXED '[\000-\177]*'">

<!ENTITY % Time " (#PCDATA )">

<!--#ENTITY % Time     #DataType(TIME)-->
<!ENTITY % Type_Time " dt:type NMTOKEN  #FIXED 'time'">

<!ENTITY % DateTime " (#PCDATA )">

<!--#ENTITY % DateTime     #DataType(DATE)-->
<!ENTITY % Type_DateTime " dt:type NMTOKEN  #FIXED 'dateTime'">

<!ENTITY % Date " (#PCDATA )">

<!--#ENTITY % Date     #DataType(DATE)-->
<!ENTITY % Type_Date " dt:type NMTOKEN  #FIXED 'date'">

<!ENTITY % TimeStamp " (#PCDATA )">

<!--#ENTITY % TimeStamp     #DataType(TIME)-->
<!ENTITY % Type_TimeStamp " dt:type NMTOKEN  #FIXED 'timeStamp'">

<!ENTITY % Year " (#PCDATA )">

<!--#ENTITY % Year     #DataType(YEAR)-->
<!ENTITY % Type_Year " dt:type NMTOKEN  #FIXED 'year'">

<!ENTITY % PhoneNumber " (#PCDATA )">

<!--#ENTITY % PhoneNumber     #DataType(B-32)-->
<!ENTITY % Type_PhoneNumber " dt:type      NMTOKEN  #FIXED 'string'
                     dt:maxLength CDATA    #FIXED '32'">
<!-- XXX need to use a pattern to narrowly define phone number -->

<!ENTITY % URL " (#PCDATA )">

<!--#ENTITY % URL     #DataType(B-1024)-->
<!ENTITY % Type_URL " dt:type      NMTOKEN  #FIXED 'string'
                     dt:maxLength CDATA    #FIXED '1024'
                     dt:pattern   CDATA    #FIXED '[\000-\177]*'">

<!ENTITY % Binary-128 " (#PCDATA )">

<!--#ENTITY % Binary-128     #DataType(BASE64)-->
<!ENTITY % Type_Binary-128 " dt:type      NMTOKEN  #FIXED 'binary'
                     dt:maxLength CDATA    #FIXED '128'
                     dt:encoding  CDATA    #FIXED 'base64'">

<!ENTITY % Binary " (#PCDATA )">

<!--#ENTITY % Binary     #DataType(Base64)-->
<!ENTITY % Type_Binary " dt:type     NMTOKEN  #FIXED 'binary'
                     dt:encoding CDATA    #FIXED 'base64'">

<!--                                -->
<!-- Common Elements and Aggregates -->
<!--                                -->
<!-- Amt Decimal -->
<!ELEMENT Amt %Decimal;>
<!ATTLIST Amt  %Type_Decimal; >
<!-- CurRate Decimal -->
<!ELEMENT CurRate %Decimal;>
<!ATTLIST CurRate  %Type_Decimal; >
<!-- CurConvertRule Closed Enum -->
<!ELEMENT CurConvertRule  (#PCDATA )>
<!ATTLIST CurConvertRule  dt:type        NMTOKEN  #FIXED 'string'
                          dt:enumeration CDATA    #FIXED 'Direct Indirect' >
<!--#ENTITY % CurConvertRule     #Enum("Direct", "Indirect")-->
<!-- AcctMask NC-32 -->
<!ELEMENT AcctMask %NC-32;>
<!ATTLIST AcctMask  %Type_NC-32; >
<!-- SecretMask NC-80 -->
<!ELEMENT SecretMask %NC-80;>
<!ATTLIST SecretMask  %Type_NC-80; >
<!-- CustLoginId Identifier -->
<!ELEMENT CustLoginId %Identifier;>
<!ATTLIST CustLoginId  %Type_Identifier; >
<!-- CustPermId Identifier -->
<!ELEMENT CustPermId %Identifier;>
<!ATTLIST CustPermId  %Type_Identifier; >
<!-- RqUID UUID -->
<!ELEMENT RqUID %UUID;>
<!ATTLIST RqUID  %Type_UUID; >
<!-- CSPRefId Identifier -->
<!ELEMENT CSPRefId %Identifier;>
<!ATTLIST CSPRefId  %Type_Identifier; >
<!-- SPRefId Identifier -->
<!ELEMENT SPRefId %Identifier;>
<!ATTLIST SPRefId  %Type_Identifier; >
<!-- SPName Identifier -->
<!ELEMENT SPName %Identifier;>
<!ATTLIST SPName  %Type_Identifier; >
<!-- Org Identifier -->
<!ELEMENT Org %Identifier;>
<!ATTLIST Org  %Type_Identifier; >
<!-- Token Identifier -->
<!ELEMENT Token %Identifier;>
<!ATTLIST Token  %Type_Identifier; >
<!-- CustId aggregate -->
<!ELEMENT CustId  (SPName ,  (CustPermId | CustLoginId |  (CustPermId , CustLoginId ) ) )>

<!-- CustName aggregate -->
<!ELEMENT CustName  (LastName+ , FirstName , MiddleName* , TitlePrefix? , NameSuffix? , Nickname? , LegalName? )>

<!-- LastName C-40 -->
<!ELEMENT LastName %C-40;>
<!ATTLIST LastName  %Type_C-40; >
<!-- FirstName C-40 -->
<!ELEMENT FirstName %C-40;>
<!ATTLIST FirstName  %Type_C-40; >
<!-- MiddleName C-40 -->
<!ELEMENT MiddleName %C-40;>
<!ATTLIST MiddleName  %Type_C-40; >
<!-- TitlePrefix C-8 -->
<!ELEMENT TitlePrefix %C-8;>
<!ATTLIST TitlePrefix  %Type_C-8; >
<!-- NameSuffix C-40 -->
<!ELEMENT NameSuffix %C-40;>
<!ATTLIST NameSuffix  %Type_C-40; >
<!-- Nickname C-40 -->
<!ELEMENT Nickname %C-40;>
<!ATTLIST Nickname  %Type_C-40; >
<!-- LegalName C-96 -->
<!ELEMENT LegalName %C-96;>
<!ATTLIST LegalName  %Type_C-96; >
<!-- CustContact aggregate -->
<!ELEMENT CustContact  (CustContactPref? , PrefTimeStart? , PrefTimeEnd? , DayPhone? , EvePhone? , DayFax? , EveFax? , EmailAddr? )>

<!-- CustContactPref Open Enum -->
<!ELEMENT CustContactPref %OpenEnum;>
<!ATTLIST CustContactPref  %Type_OpenEnum; >
<!-- PrefTimeStart Time -->
<!ELEMENT PrefTimeStart %Time;>
<!ATTLIST PrefTimeStart  %Type_Time; >
<!-- PrefTimeEnd Time -->
<!ELEMENT PrefTimeEnd %Time;>
<!ATTLIST PrefTimeEnd  %Type_Time; >
<!-- DayPhone Phone Number -->
<!ELEMENT DayPhone %PhoneNumber;>
<!ATTLIST DayPhone  %Type_PhoneNumber; >
<!-- EvePhone Phone Number -->
<!ELEMENT EvePhone %PhoneNumber;>
<!ATTLIST EvePhone  %Type_PhoneNumber; >
<!-- DayFax Phone Number -->
<!ELEMENT DayFax %PhoneNumber;>
<!ATTLIST DayFax  %Type_PhoneNumber; >
<!-- EveFax Phone Number -->
<!ELEMENT EveFax %PhoneNumber;>
<!ATTLIST EveFax  %Type_PhoneNumber; >
<!-- EmailAddr NC-128 -->
<!ELEMENT EmailAddr %NC-128;>
<!ATTLIST EmailAddr  %Type_NC-128; >
<!-- PostAddr aggregate -->
<!ELEMENT PostAddr %ADDRESS;>

<!-- Addr1 C-64 -->
<!ELEMENT Addr1 %C-64;>
<!ATTLIST Addr1  %Type_C-64; >
<!-- Addr2 C-64 -->
<!ELEMENT Addr2 %C-64;>
<!ATTLIST Addr2  %Type_C-64; >
<!-- Addr3 C-64 -->
<!ELEMENT Addr3 %C-64;>
<!ATTLIST Addr3  %Type_C-64; >
<!-- Addr4 C-64 -->
<!ELEMENT Addr4 %C-64;>
<!ATTLIST Addr4  %Type_C-64; >
<!-- City C-32 -->
<!ELEMENT City %C-32;>
<!ATTLIST City  %Type_C-32; >
<!-- StateProv C-32 -->
<!ELEMENT StateProv %C-32;>
<!ATTLIST StateProv  %Type_C-32; >
<!-- PostalCode C-11 -->
<!ELEMENT PostalCode %C-11;>
<!ATTLIST PostalCode  %Type_C-11; >
<!-- Country NC-3 -->
<!ELEMENT Country %NC-3;>
<!ATTLIST Country  %Type_NC-3; >
<!-- CustNameAddr aggregate -->
<!ELEMENT CustNameAddr  (NameAddrType ,  (FullName | CustName ) , PostAddr , CustContact? )>

<!-- NameAddrType Open Enum -->
<!ELEMENT NameAddrType %OpenEnum;>
<!ATTLIST NameAddrType  %Type_OpenEnum; >
<!-- FullName C-96 -->
<!ELEMENT FullName %C-96;>
<!ATTLIST FullName  %Type_C-96; >
<!-- OrgContact aggregate -->
<!ELEMENT OrgContact  (ContactType , Desc? , Phone? , Fax? , EmailAddr? , URL? )>

<!-- ContactType Open Enum-->
<!ELEMENT ContactType %OpenEnum;>
<!ATTLIST ContactType  %Type_OpenEnum; >
<!-- Desc C-80 -->
<!ELEMENT Desc %C-80;>
<!ATTLIST Desc  %Type_C-80; >
<!-- Phone Phone Number -->
<!ELEMENT Phone %PhoneNumber;>
<!ATTLIST Phone  %Type_PhoneNumber; >
<!-- Fax Phone Number -->
<!ELEMENT Fax %PhoneNumber;>
<!ATTLIST Fax  %Type_PhoneNumber; >
<!-- URL URL -->
<!ELEMENT URL %URL;>
<!ATTLIST URL  %Type_URL; >
<!-- BillerContact aggregate -->
<!ELEMENT BillerContact  (LegalName? , Name? , PostAddr? , BillRetAddr? , RemitName? , RemitAddr? , OrgContact* )>

<!-- Name C-40 -->
<!ELEMENT Name %C-40;>
<!ATTLIST Name  %Type_C-40; >
<!-- BillRetAddr aggregate -->
<!ELEMENT BillRetAddr %ADDRESS;>

<!-- RemitName C-40 -->
<!ELEMENT RemitName %C-40;>
<!ATTLIST RemitName  %Type_C-40; >
<!-- RemitAddr aggregate -->
<!ELEMENT RemitAddr %ADDRESS;>

<!-- BillerPayInfo aggregate -->
<!ELEMENT BillerPayInfo  (PmtInst* , DaysToEPost? , PrenoteReqd? )>

<!-- DaysToEPost Long -->
<!ELEMENT DaysToEPost %Long;>
<!ATTLIST DaysToEPost  %Type_Long; >
<!-- PrenoteReqd Boolean -->
<!ELEMENT PrenoteReqd %Boolean;>
<!ATTLIST PrenoteReqd  %Type_Boolean; >
<!-- DepAcctId, DepAcctIdFrom, DepAcctIdTo aggregate -->
<!-- XXX Added DepAcctIdFromProf and DepAcctIdToProf for PaySvcProInfo -->
<!--     bug in PR draft -->
<!ENTITY % DEPACCTID " (BankId?
                      , BranchId?
                      , AcctId
                      , AcctType
                      , AcctKey?
                      , BankInfo? )">

<!ELEMENT DepAcctId %DEPACCTID;>

<!ELEMENT DepAcctIdFrom %DEPACCTID;>

<!ELEMENT DepAcctIdTo %DEPACCTID;>

<!ELEMENT DepAcctIdFromProf %DEPACCTID;>

<!ELEMENT DepAcctIdToProf %DEPACCTID;>

<!-- BankId NC-34 -->
<!ELEMENT BankId %NC-34;>
<!ATTLIST BankId  %Type_NC-34; >
<!-- BranchId NC-22 -->
<!ELEMENT BranchId %NC-22;>
<!ATTLIST BranchId  %Type_NC-22; >
<!-- AcctId NC-32 -->
<!ELEMENT AcctId %NC-32;>
<!ATTLIST AcctId  %Type_NC-32; >
<!-- AcctType Open Enum -->
<!ELEMENT AcctType %OpenEnum;>
<!ATTLIST AcctType  %Type_OpenEnum; >
<!-- AcctKey NC-22 -->
<!ELEMENT AcctKey %NC-22;>
<!ATTLIST AcctKey  %Type_NC-22; >
<!-- BankInfo aggregate -->
<!ELEMENT BankInfo  (Name? , BranchName? ,  (PostAddr |  (City? , StateProv? , PostalCode? ) ) )>

<!-- BranchName C-40 -->
<!ELEMENT BranchName %C-40;>
<!ATTLIST BranchName  %Type_C-40; >
<!-- CardAcctId, CardAcctIdFrom, CardAcctIdTo aggregate -->
<!ENTITY % CARDACCTID " ( (AcctId
                       | CardMagData )
                       , AcctType
                       , CCMotoAcct? )">

<!ELEMENT CardAcctId %CARDACCTID;>

<!ELEMENT CardAcctIdFrom %CARDACCTID;>

<!ELEMENT CardAcctIdTo %CARDACCTID;>

<!-- CardMagData aggregate -->
<!ELEMENT CardMagData  ( (MagData1 , MagData2? , MagData3? ) |  (MagData1? , MagData2 , MagData3? ) |  (MagData1? , MagData2? , MagData3 ) )>

<!-- MagData1 NC-180 -->
<!ELEMENT MagData1 %NC-180;>
<!ATTLIST MagData1  %Type_NC-180; >
<!-- MagData2 NC-180 -->
<!ELEMENT MagData2 %NC-180;>
<!ATTLIST MagData2  %Type_NC-180; >
<!-- MagData3 NC-180 -->
<!ELEMENT MagData3 %NC-180;>
<!ATTLIST MagData3  %Type_NC-180; >
<!-- CCMotoAcct aggregate -->
<!ELEMENT CCMotoAcct  (ExpDt , Name? ,  (PostAddr | PostalCode )? , Phone? , Brand? )>

<!-- TODO - ExpDt (Date) conflicts with other definitions (DateTime) -->
<!-- LoanAcctId, LoanAcctIdFrom, LoanAcctIdTo aggregate -->
<!ENTITY % LOANACCTID " (AcctId
                       , AcctType )">

<!ELEMENT LoanAcctId %LOANACCTID;>

<!ELEMENT LoanAcctIdFrom %LOANACCTID;>

<!ELEMENT LoanAcctIdTo %LOANACCTID;>

<!-- BankAcctRec aggregate -->
<!ELEMENT BankAcctRec  ( (DepAcctId | CardAcctId | LoanAcctId ) , BankAcctInfo , BankAcctStatus , AcctTaxType? , XferFromSupt? , XferToSupt? , PaySupt? , AcctBal* )>

<!-- BankAcctInfo aggregate -->
<!ELEMENT BankAcctInfo  (CurCode , Desc? , CustName? , OrgContact? , CustAcctUse? , PrimaryAcct? , Term? )>

<!-- CurCode NC-3 -->
<!ELEMENT CurCode %NC-3;>
<!ATTLIST CurCode  %Type_NC-3; >
<!-- CustAcctUse Open Enum -->
<!ELEMENT CustAcctUse %OpenEnum;>
<!ATTLIST CustAcctUse  %Type_OpenEnum; >
<!-- PrimaryAcct Boolean -->
<!ELEMENT PrimaryAcct %Boolean;>
<!ATTLIST PrimaryAcct  %Type_Boolean; >
<!-- BankAcctStatus Closed Enum -->
<!ELEMENT BankAcctStatus  (BankAcctStatusCode , StatusDesc? , EffDt? , StatusModBy? )>

<!--#ENTITY % BankAcctStatus #Enum("Open", "Closed", "Inactive", "NotAvail")-->
<!-- StatusDesc C-255 -->
<!ELEMENT StatusDesc %C-255;>
<!ATTLIST StatusDesc  %Type_C-255; >
<!-- AcctTaxStatus Open Enum -->
<!ELEMENT AcctTaxType %OpenEnum;>
<!ATTLIST AcctTaxType  %Type_OpenEnum; >
<!-- XferFromSupt, XferToSupt, PaySupt aggregate -->
<!ELEMENT XferFromSupt %MINMAXCURAMT;>

<!ELEMENT XferToSupt %MINMAXCURAMT;>

<!ELEMENT PaySupt %MINMAXCURAMT;>

<!-- MinCurAmt Currency Amount -->
<!ELEMENT MinCurAmt %CURRENCYAMOUNT;>

<!-- MaxCurAmt Currency Amount -->
<!ELEMENT MaxCurAmt %CURRENCYAMOUNT;>

<!-- AcctBal aggregate -->
<!ELEMENT AcctBal  (BalType , CurAmt , EffDt? , ExpDt? , Desc? )>

<!-- BalType Open Enum -->
<!ELEMENT BalType %OpenEnum;>
<!ATTLIST BalType  %Type_OpenEnum; >
<!-- CurAmt Currency Amount -->
<!ELEMENT CurAmt %CURRENCYAMOUNT;>

<!-- EffDt DateTime -->
<!ELEMENT EffDt %DateTime;>
<!ATTLIST EffDt  %Type_DateTime; >
<!-- ExpDt DateTime -->
<!ELEMENT ExpDt %DateTime;>
<!ATTLIST ExpDt  %Type_DateTime; >
<!-- ExtAcctBal aggregate -->
<!ELEMENT ExtAcctBal  (ExtBalType , CurAmt , EffDt , ExpDt? , Desc? )>

<!-- ExtBalType Open Enum -->
<!ELEMENT ExtBalType %OpenEnum;>
<!ATTLIST ExtBalType  %Type_OpenEnum; >
<!-- Term aggregate -->
<!ELEMENT Term  (Count , TermUnits , Desc? , DaysCall? )>

<!-- Count Long -->
<!ELEMENT Count %Long;>
<!ATTLIST Count  %Type_Long; >
<!-- TermUnits Closed Enum -->
<!ELEMENT TermUnits  (#PCDATA )>
<!ATTLIST TermUnits  dt:type        NMTOKEN  #FIXED 'string'
                     dt:enumeration CDATA    #FIXED 'TO DO' >
<!--#ENTITY % TermUnits #Enum("TODO", "")-->
<!-- DaysCall Long -->
<!ELEMENT DaysCall %Long;>
<!ATTLIST DaysCall  %Type_Long; >
<!-- SelRangeDt, SelRangeDueDt, SelRangePrcDt aggregate -->
<!ELEMENT SelRangeDt %DATERANGE;>

<!ELEMENT SelRangeDueDt %DATERANGE;>

<!ELEMENT SelRangePrcDt %DATERANGE;>

<!-- SelRangeCurAmt aggregate -->
<!ELEMENT SelRangeCurAmt %LOWHIGHCURAMT;>

<!-- LowCurAmt Currency Amount -->
<!ELEMENT LowCurAmt %CURRENCYAMOUNT;>

<!-- HighCurAmt Current Amount -->
<!ELEMENT HighCurAmt %CURRENCYAMOUNT;>

<!-- RecModelInfo aggregate -->
<!ELEMENT RecModelInfo  (Freq ,  (NumInsts | FinalPrcDt | FinalDueDt )? , InitialCurAmt? , FinalCurAmt? , Nickname? , SkipNextN? )>

<!-- Freq Open Enum -->
<!ELEMENT Freq %OpenEnum;>
<!ATTLIST Freq  %Type_OpenEnum; >
<!-- NumInsts Long -->
<!ELEMENT NumInsts %Long;>
<!ATTLIST NumInsts  %Type_Long; >
<!-- FinalPrcDt Date -->
<!ELEMENT FinalPrcDt %Date;>
<!ATTLIST FinalPrcDt  %Type_Date; >
<!-- FinalDueDt Date -->
<!ELEMENT FinalDueDt %Date;>
<!ATTLIST FinalDueDt  %Type_Date; >
<!-- InitialCurAmt Currency Amount -->
<!ELEMENT InitialCurAmt %CURRENCYAMOUNT;>

<!-- FinalCurAmt Currency Amount -->
<!ELEMENT FinalCurAmt %CURRENCYAMOUNT;>

<!-- SkipNextN Long -->
<!ELEMENT SkipNextN %Long;>
<!ATTLIST SkipNextN  %Type_Long; >
<!-- Status aggregate -->
<!ELEMENT Status  (StatusCode , SrvrStatusCode? , Severity , StatusDesc? )>

<!-- StatusCode Long -->
<!ELEMENT StatusCode %Long;>
<!ATTLIST StatusCode  %Type_Long; >
<!-- SrvrStatusCode C-20 -->
<!ELEMENT SrvrStatusCode %C-20;>
<!ATTLIST SrvrStatusCode  %Type_C-20; >
<!-- Severity Closed Enum -->
<!ELEMENT Severity  (#PCDATA )>
<!ATTLIST Severity  dt:type        NMTOKEN  #FIXED 'string'
                    dt:enumeration CDATA    #FIXED 'TODO - Appendix A' >
<!--#ENTITY % Severity #Enum("TODO", "")-->
<!-- RecCtrlIn aggregate -->
<!ELEMENT RecCtrlIn  (MaxRec , Cursor? )>

<!-- MaxRec Long -->
<!ELEMENT MaxRec %Long;>
<!ATTLIST MaxRec  %Type_Long; >
<!-- Cursor Binary -->
<!ELEMENT Cursor %Binary;>
<!ATTLIST Cursor  %Type_Binary; >
<!-- RecCtrlOut aggregate -->
<!ELEMENT RecCtrlOut  (MatchedRec , SentRec , Cursor? )>

<!-- MatchedRec Long -->
<!ELEMENT MatchedRec %Long;>
<!ATTLIST MatchedRec  %Type_Long; >
<!-- SentRec Long -->
<!ELEMENT SentRec %Long;>
<!ATTLIST SentRec  %Type_Long; >
<!-- ClientApp aggregate -->
<!ELEMENT ClientApp  (Org , Name , Version )>

<!-- Version NC-12 -->
<!ELEMENT Version %NC-12;>
<!ATTLIST Version  %Type_NC-12; >
<!-- IndustId aggregate -->
<!ELEMENT IndustId  (Org , IndustNum )>

<!-- IndustNum NC-6 -->
<!ELEMENT IndustNum %NC-6;>
<!ATTLIST IndustNum  %Type_NC-6; >
<!-- SecretPrompt aggregate -->
<!ELEMENT SecretPrompt  (SecretId , Prompt , Memo? , SecretOptional? , SecretFormat? , SecretMask? )>

<!-- SecretId Identifier -->
<!ELEMENT SecretId %Identifier;>
<!ATTLIST SecretId  %Type_Identifier; >
<!-- Prompt C-20 -->
<!ELEMENT Prompt %C-20;>
<!ATTLIST Prompt  %Type_C-20; >
<!-- Memo C-255 -->
<!ELEMENT Memo %C-255;>
<!ATTLIST Memo  %Type_C-255; >
<!-- SecretOptional Boolean -->
<!ELEMENT SecretOptional %Boolean;>
<!ATTLIST SecretOptional  %Type_Boolean; >
<!-- SecretFormat NC-1024 -->
<!ELEMENT SecretFormat %NC-1024;>
<!ATTLIST SecretFormat  %Type_NC-1024; >
<!-- SecretList aggregate -->
<!ELEMENT SecretList  (SecretId , CryptType ,  (Secret | CryptSecret ) )>

<!-- Secret C-80 -->
<!ELEMENT Secret %C-80;>
<!ATTLIST Secret  %Type_C-80; >
<!-- CryptSecret Binary-128 -->
<!ELEMENT CryptSecret %Binary-128;>
<!ATTLIST CryptSecret  %Type_Binary-128; >
<!-- PmtInst aggregate -->
<!ELEMENT PmtInst  (PmtInstType , Brand? , SettlementInfo* )>

<!-- PmtInstType Closed Enum -->
<!ELEMENT PmtInstType  (#PCDATA )>
<!ATTLIST PmtInstType  dt:type        NMTOKEN  #FIXED 'string'
                       dt:enumeration CDATA    #FIXED 'TO DO' >
<!--#ENTITY % PmtInstType     #Enum("TODO", "TODO")-->
<!-- Brand Open Enum -->
<!ELEMENT Brand %OpenEnum;>
<!ATTLIST Brand  %Type_OpenEnum; >
<!-- SettlementInfo aggregate -->
<!ELEMENT SettlementInfo  (SettlementMethod ,  ( (DepAcctId , SettlementId? , OrgContact? , Memo? ) |  (DepAcctId? , SettlementId , OrgContact? , Memo? ) |  (DepAcctId? , SettlementId? , OrgContact , Memo? ) |  (DepAcctId? , SettlementId? , OrgContact? , Memo ) ) )>

<!-- SettlementMethod OpenEnum -->
<!ELEMENT SettlementMethod %OpenEnum;>
<!ATTLIST SettlementMethod  %Type_OpenEnum; >
<!-- SettlementId C-20 -->
<!ELEMENT SettlementId %C-20;>
<!ATTLIST SettlementId  %Type_C-20; >
<!-- CustPswd aggregate -->
<!ELEMENT CustPswd  (CryptType ,  (Pswd | CryptPswd )? )>

<!-- CryptType Open Enum -->
<!ELEMENT CryptType %OpenEnum;>
<!ATTLIST CryptType  %Type_OpenEnum; >
<!-- Pswd C-32 -->
<!ELEMENT Pswd %C-32;>
<!ATTLIST Pswd  %Type_C-32; >
<!-- CryptPswd Binary-128 -->
<!ELEMENT CryptPswd %Binary-128;>
<!ATTLIST CryptPswd  %Type_Binary-128; >
<!-- SignonRole Open Enum -->
<!ELEMENT SignonRole %OpenEnum;>
<!ATTLIST SignonRole  %Type_OpenEnum; >
<!-- GenSessKey Boolean -->
<!ELEMENT GenSessKey %Boolean;>
<!ATTLIST GenSessKey  %Type_Boolean; >
<!-- Certificate Binary -->
<!ELEMENT Certificate %Binary;>
<!ATTLIST Certificate  %Type_Binary; >
<!-- PINBlock NC-32 -->
<!ELEMENT PINBlock %NC-32;>
<!ATTLIST PINBlock  %Type_NC-32; >
<!-- Signon Request -->
<!ELEMENT SignonRq  ( (SignonPswd | SignonCert | SignonTransport | SignonMagPIN | SessKey )? , ClientDt , CustLangPref , ClientApp , ProxyClient? , EU.Cur? )>

<!-- SignonPswd Aggregate -->
<!ELEMENT SignonPswd  (SignonRole? , CustId , CustPswd , GenSessKey? )>

<!-- SignonCert Aggregate -->
<!ELEMENT SignonCert  (SignonRole? , CustId , Certificate , GenSessKey? )>

<!-- SignonTransport Aggregate -->
<!ELEMENT SignonTransport  (SignonRole? , CustId , GenSessKey? )>

<!-- SignonMagPIN Aggregate -->
<!ELEMENT SignonMagPIN  (CardMagData , PINBlock , GenSessKey? )>

<!-- ClientDt DateTime -->
<!ELEMENT ClientDt %DateTime;>
<!ATTLIST ClientDt  %Type_DateTime; >
<!-- CustLangPref NC-6 -->
<!ELEMENT CustLangPref %NC-6;>
<!ATTLIST CustLangPref  %Type_NC-6; >
<!-- ProxyClient aggregate -->
<!ELEMENT ProxyClient  (Org , Name , Version )>

<!-- EU.Cur Closed Enum -->
<!ELEMENT EU.Cur  (#PCDATA )>
<!ATTLIST EU.Cur  dt:type        NMTOKEN  #FIXED 'string'
                  dt:enumeration CDATA    #FIXED 'TO DO' >
<!--#ENTITY % EU.Cur     #Enum("TODO", "TODO")-->
<!-- Signon Response -->
<!ELEMENT SignonRs  (Status ,  ( (SignonRole? , CustId? , GenSessKey? , ClientDt , CustLangPref , ClientApp , ProxyClient? , EU.Cur? , ServerDt , SessKey? , ExpDt? , Language ) | CustId? ) )>

<!-- ServerDt DateTime -->
<!ELEMENT ServerDt %DateTime;>
<!ATTLIST ServerDt  %Type_DateTime; >
<!-- SessKey NC-64 -->
<!ELEMENT SessKey %NC-64;>
<!ATTLIST SessKey  %Type_NC-64; >
<!-- Language NC-11 -->
<!ELEMENT Language %NC-11;>
<!ATTLIST Language  %Type_NC-11; >
<!-- Signoff Request -->
<!ELEMENT SignoffRq  (CustId? )>

<!-- Signoff Response -->
<!ELEMENT SignoffRs  (Status , CustId? )>

<!--                              -->
<!-- Base Service Messages (Base) -->
<!--                              -->
<!ELEMENT BaseSvcRq  (SPName? , RqUID , (SvcProfInqRq | HolInqRq |
CustAddRq | CustModRq | CustPswdModRq | CustStatusModRq | CustDelRq |
CustInqRq | CustIdInqRq | CustAudRq | CustSyncRq | SvcAcctSyncRq |
CustSvcAddRq | CustSvcModRq | CustSvcAudRq | CustSvcSyncRq |
CustSvcStatusModRq | CustSvcDelRq | SvcAcctAddRq | SvcAcctModRq |
SvcAcctDelRq | SvcAcctInqRq | SvcAcctAudRq | SvcAcctSyncRq |
CustDiscStatusModRq | CustDiscInqRq)* )>

<!ELEMENT BaseSvcRs  (Status , SPName? , RqUID , (SvcProfInqRs |
HolInqRs | CustAddRs | CustModRs | CustPswdModRs | CustStatusModRs |
CustDelRs | CustInqRs | CustIdInqRs | CustAudRs | CustSyncRq |
SvcAcctSyncRs | CustSvcAddRs | CustSvcModRs | CustSvcAudRs |
CustSvcSyncRs | CustSvcStatusModRs | CustSvcDelRs | SvcAcctAddRs |
SvcAcctModRs | SvcAcctDelRs | SvcAcctInqRs | SvcAcctAudRs |
SvcAcctSyncRs | CustDiscStatusModRs | CustDiscInqRs)*)>

<!-- MsgSupt Open Enum -->
<!ELEMENT MsgSupt %OpenEnum;>
<!ATTLIST MsgSupt  %Type_OpenEnum; >
<!-- OptSupt Open Enum -->
<!ELEMENT OptSupt %OpenEnum;>
<!ATTLIST OptSupt  %Type_OpenEnum; >
<!-- SvcCore aggregate -->
<!ELEMENT SvcCore  (Version , SPName , LegalName , Nickname? , HoldCold? , USA.RTN? , OrgContact+ , Language+ , URL? )>

<!-- HoldCold Identifier -->
<!ELEMENT HoldCold %Identifier;>
<!ATTLIST HoldCold  %Type_Identifier; >
<!-- USA.RTN NC-9 -->
<!ELEMENT USA.RTN %NC-9;>
<!ATTLIST USA.RTN  %Type_NC-9; >
<!-- PrcSched aggregate -->
<!ELEMENT PrcSched  (PrcDaysOff* , CutoffTm , PrcDtAdj )>

<!-- PrcDaysOff Closed Enum -->
<!ELEMENT PrcDaysOff  (#PCDATA )>
<!ATTLIST PrcDaysOff  dt:type        NMTOKEN  #FIXED 'string'
                      dt:enumeration CDATA    #FIXED 'Monday Tuesday Wednesday Thursday Friday Saturday Sunday Holiday' >
<!--#ENTITY % PrcDaysOff     #Enum("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday", "Holiday")-->
<!-- CutoffTm Time -->
<!ELEMENT CutoffTm %Time;>
<!ATTLIST CutoffTm  %Type_Time; >
<!-- PrcDtAdj Open Enum -->
<!ELEMENT PrcDtAdj %OpenEnum;>
<!ATTLIST PrcDtAdj  %Type_OpenEnum; >
<!-- CustInfo aggregate -->
<!ELEMENT CustInfo  (CustName , PostAddr? , CustContact? , TaxId? , CustType? )>

<!-- TaxId NC-12 -->
<!ELEMENT TaxId %NC-12;>
<!ATTLIST TaxId  %Type_NC-12; >
<!-- CustType Open Enum -->
<!ELEMENT CustType %OpenEnum;>
<!ATTLIST CustType  %Type_OpenEnum; >
<!-- CustDiscRec aggregate -->
<!ELEMENT CustDiscRec  (CustId , DiscId , DiscInfo , CustDiscStatus )>

<!-- DiscId UUID -->
<!ELEMENT DiscId %UUID;>
<!ATTLIST DiscId  %Type_UUID; >
<!-- DiscInfo aggregate -->
<!ELEMENT DiscInfo  ( (LongText | DiscURL ) , AcceptReqd? )>

<!-- LongText C-Infinite -->
<!ELEMENT LongText %C-Infinite;>
<!ATTLIST LongText  %Type_C-Infinite; >
<!-- DiscURL URL -->
<!ELEMENT DiscURL %URL;>
<!ATTLIST DiscURL  %Type_URL; >
<!-- AcceptReqd Boolean -->
<!ELEMENT AcceptReqd %Boolean;>
<!ATTLIST AcceptReqd  %Type_Boolean; >
<!-- CustDiscStatus -->
<!ELEMENT CustDiscStatus  (CustDiscStatusCode , StatusDesc? , EffDt? , StatusModBy? )>

<!-- CustDiscStatusCode Closed Enum -->
<!ELEMENT CustDiscStatusCode  (#PCDATA )>
<!ATTLIST CustDiscStatusCode  dt:type        NMTOKEN  #FIXED 'string'
                              dt:enumeration CDATA    #FIXED 'None Accepted Rejected Viewed' >
<!--#ENTITY % CustDiscStatusCode #Enum("None", "Accepted", "Rejected", "Viewed")-->
<!-- StatusModBy Open Enum -->
<!ELEMENT StatusModBy %OpenEnum;>
<!ATTLIST StatusModBy  %Type_OpenEnum; >
<!-- SvcProfInq Request -->
<!ELEMENT SvcProfInqRq  (UpDt? )>

<!-- UpDt TimeStamp -->
<!ELEMENT UpDt %DateTime;>
<!ATTLIST UpDt  %Type_DateTime; >
<!-- SvcProfInq Response -->
<!ELEMENT SvcProfInqRs  (Status , UpDt? , xxxSvcProfInfo* )>

<!-- xxxSvcProfInfo Aggregate -->
<!ELEMENT xxxSvcProfInfo  (BaseSvcProfInfo | BankSvcProfInfo | PaySvcProfInfo | PresSvcProfInfo )>

<!-- HolInq Request -->
<!ELEMENT HolInqRq  (SPName? , SvcName? )>

<!-- SvcName Open Enum -->
<!ELEMENT SvcName %OpenEnum;>
<!ATTLIST SvcName  %Type_OpenEnum; >
<!-- HolInq Response -->
<!ELEMENT HolInqRs  (Status , SPName? , SvcName? , HolInfo* )>

<!-- HolInfo aggregate -->
<!ELEMENT HolInfo  (Name , HolDt )>

<!-- HolDt Date -->
<!ELEMENT HolDt %Date;>
<!ATTLIST HolDt  %Type_Date; >
<!-- CustAdd Request -->
<!ELEMENT CustAddRq  (RqUID , CustInfo? , SecretList* , CryptType , CustId? , AuthInfo? )>

<!-- AuthInfo Aggregate -->
<!ELEMENT AuthInfo  (CustPswd? )>

<!-- CustAdd Response -->
<!ELEMENT CustAddRs  (Status , RqUID ,  ( (CustInfo? , CustId? , CustRec , PswdDelivery? , SPRefId? ) | CustId? ) )>

<!ELEMENT CustRec  (CustId , CustInfo? , CustStatus , UpDt? )>

<!-- CustStatus aggregate -->
<!ELEMENT CustStatus  (CustStatusCode , StatusDesc? , EffDt? , StatusModBy? , ResolvePendingDt? )>

<!-- CustStatusCode Open Enum -->
<!ELEMENT CustStatusCode %OpenEnum;>
<!ATTLIST CustStatusCode  %Type_OpenEnum; >
<!-- ResolvePendingDt Date -->
<!ELEMENT ResolvePendingDt %Date;>
<!ATTLIST ResolvePendingDt  %Type_Date; >
<!ELEMENT PswdDelivery  (CustPswd , ExpDt )>

<!-- CustMod Request -->
<!ELEMENT CustModRq  (RqUID , CustId? , CustInfo )>

<!-- CustMod Response -->
<!ELEMENT CustModRs  (Status , RqUID , CustId? ,  (CustInfo , CustRec? , SPRefId? )? )>

<!-- CustPswdMod Request -->
<!ELEMENT CustPswdModRq  (RqUID , CustId? , CustPswd )>

<!-- CustPswdMod Response -->
<!ELEMENT CustPswdModRs  (Status , RqUID , CustId? ,  (ExpDt? , SPRefId? )? )>

<!-- CustStatusModRq Request -->
<!ELEMENT CustStatusModRq  (RqUID , CustId? , CustStatus )>

<!-- CustStatusModRs Response -->
<!ELEMENT CustStatusModRs  (Status , RqUID , CustId? ,  (CustStatus , CustRec )? )>

<!-- CustDel Request -->
<!ELEMENT CustDelRq  (RqUID , CustId? , CascadeDel? )>

<!-- CustDel Response -->
<!ELEMENT CustDelRs  (Status , RqUID , CustId? ,  (CascadeDel? ,  (CustRec |  (DependentType* ) ) , SPRefId? )? )>

<!-- CustInq Request -->
<!ELEMENT CustInqRq  (RqUID , CustId* , UpDt? , IncToken? )>

<!-- IncToken Boolean -->
<!ELEMENT IncToken %Boolean;>
<!ATTLIST IncToken  %Type_Boolean; >
<!-- CustInq Response -->
<!ELEMENT CustInqRs  (Status , RqUID , CustId* ,  (UpDt? , IncToken? , CustRec* , Token? )? )>

<!-- CustIdInq Request -->
<!ELEMENT CustIdInqRq  (RqUID ,  (CustPermId | CustLoginId |  (CustPermId , CustLoginId ) ) )>

<!-- CustIdInq Response -->
<!ELEMENT CustIdInqRs  (Status , RqUID , CustId )>

<!-- CustAud Request -->
<!ELEMENT CustAudRq  (SPName? , RqUID , CustId? , RecCtrlIn? , SelRangeDt? )>

<!-- CustAud Response -->
<!ELEMENT CustAudRs  (Status , RqUID , CustId? ,  (RecCtrlOut? , SelRangeDt? , CustMsgRec* )? )>

<!-- CustMsgRec Aggregate -->
<!ELEMENT CustMsgRec  (CustId? , MsgRecDt? ,  (CustAddRs | CustModRs | CustDelRs ) )>

<!-- MsgRecDt DateTime -->
<!ELEMENT MsgRecDt %DateTime;>
<!ATTLIST MsgRecDt  %Type_DateTime; >
<!-- CustSync Request -->
<!ELEMENT CustSyncRq  (RqUID , CustId? , RecCtrlIn? , Token )>

<!-- CustSync Response -->
<!ELEMENT CustSyncRs  (Status , RqUID , CustId? ,  (RecCtrlOut? , Token , NewToken , CustMsgRec* )? )>

<!-- NewToken Identifier -->
<!ELEMENT NewToken %Identifier;>
<!ATTLIST NewToken  %Type_Identifier; >
<!-- CustSvcAdd Request -->
<!ELEMENT CustSvcAddRq  (RqUID , CustId? , CustSvcId , CustSvcInfo )>

<!-- CustSvcAdd Response -->
<!-- XXX DiscRec renamed to CustDiscRec, a bug in PR Draft -->
<!ELEMENT CustSvcAddRs  (Status , RqUID , CustId? , CustSvcId , CustSvcInfo , CustSvcRec , CustDiscRec* , CSPRefId? , SPRefId? )>

<!-- CustSvcStatusCode Closed Enum -->
<!ELEMENT CustSvcStatusCode  (#PCDATA )>
<!ATTLIST CustSvcStatusCode  dt:type        NMTOKEN  #FIXED 'string'
                             dt:enumeration CDATA    #FIXED 'Enabled EnablePend Disabled DisablePend Rejected' >
<!--#ENTITY % CustSvcStatusCode #Enum("Enabled", "EnablePend", "Disabled", "DisablePend", "Rejected")-->
<!-- CustSvcMod Request -->
<!ELEMENT CustSvcModRq  (RqUID , CustId? , CustSvcId , CustSvcInfo )>

<!-- CustSvcMod Response -->
<!-- XXX DiscRec renamed to CustDiscRec, a bug in PR Draft -->
<!ELEMENT CustSvcModRs  (Status , RqUID , CustId? ,  (CustSvcId , CustSvcInfo , CustSvcRec , CustSvcRec , CustDiscRec* , CSPRefId? , SPRefId? )? )>

<!-- CustSvcStatusModRq Request -->
<!ELEMENT CustSvcStatusModRq  (RqUID , CustId? , CustSvcId , CustSvcStatus )>

<!-- CustSvcStatusModRs Response -->
<!ELEMENT CustSvcStatusModRs  (Status , RqUID , CustId? ,  (CustSvcId , CustSvcStatus , CustSvcRec , CSPRefId? , SPRefId? )? )>

<!-- CustSvcDel Request -->
<!ELEMENT CustSvcDelRq  (RqUID , CustId? , CustSvcId , CascadeDel? )>

<!-- CascadeDel Boolean -->
<!ELEMENT CascadeDel %Boolean;>
<!ATTLIST CascadeDel  %Type_Boolean; >
<!-- CustSvcDel Response -->
<!ELEMENT CustSvcDelRs  (Status , RqUID , CustId? ,  (CustSvcId , CascadeDel? ,  (CustSvcRec | DependentType* ) , CSPRefId? , SPRefId? )? )>

<!-- DependentType Open Enum -->
<!ELEMENT DependentType %OpenEnum;>
<!ATTLIST DependentType  %Type_OpenEnum; >
<!-- CustSvcAud Request -->
<!ELEMENT CustSvcAudRq  (RqUID , CustId? , RecCtrlIn? , SelRangeDt? , Method? , SvcName? , SPName? )>

<!-- Method Closed Enum -->
<!ELEMENT Method  (#PCDATA )>
<!ATTLIST Method  dt:type        NMTOKEN  #FIXED 'string'
                  dt:enumeration CDATA    #FIXED 'TODO TODO' >
<!--#ENTITY % Method #Enum("TODO", "TODO")-->
<!-- CustSvcAud Response -->
<!ELEMENT CustSvcAudRs  (Status , RqUID , CustId? ,  (RecCtrlOut? , SelRangeDt? , Method? , SvcName? , SPName? , CustSvcMsgRec* )? )>

<!-- CustSvcMsgRec Aggregate -->
<!ELEMENT CustSvcMsgRec  (CustId? , MsgRecDt? ,  (CustSvcAddRs | CustSvcModRs | CustSvcDelRs ) )>

<!-- CustSvcSync Request -->
<!ELEMENT CustSvcSyncRq  (RqUID , CustId? , RecCtrlIn? , Token )>

<!-- CustSvcSync Response -->
<!ELEMENT CustSvcSyncRs  (Status , RqUID , CustId? ,  (RecCtrlOut? , Token , NewToken , CustSvcMsgRec* )? )>

<!-- SvcAcctAdd Request -->
<!ELEMENT SvcAcctAddRq  (RqUID , CustId? , SvcAcctId , SvcAcctInfo , SecretList* , CryptType? , CustNameAddr* )>

<!-- SvcAcctAdd Response -->
<!-- XXX renamed DiscRec to CustDescRec.  Assuming a bug in PR Draft -->
<!ELEMENT SvcAcctAddRs  (Status , RqUID , CustId? ,  (SvcAcctId , SvcAcctInfo , SvcAcctRec , CustDiscRec* , CSPRefId? , SPRefId? )? )>

<!-- SvcAcctStatusCode Closed Enum -->
<!ELEMENT SvcAcctStatusCode  (#PCDATA )>
<!ATTLIST SvcAcctStatusCode  dt:type        NMTOKEN  #FIXED 'string'
                             dt:enumeration CDATA    #FIXED 'TODO TODO' >
<!--#ENTITY % SvcAcctStatusCode #Enum("TODO", "TODO")-->
<!-- SvcAcctMod Request -->
<!ELEMENT SvcAcctModRq  (RqUID , SvcName , CustId? , SvcAcctId , SvcAcctInfo , SecretList* , CryptType? , CustNameAddr* )>

<!-- SvcAcctMod Response -->
<!-- XXX renamed DiscRec to CustDiscRec assuming it is a bug in PR -->
<!-- draft -->
<!ELEMENT SvcAcctModRs  (Status , RqUID , CustId? ,  (SvcAcctId , SvcAcctInfo , SvcAcctRec , CustDiscRec* , CSPRefId? , SPRefId? )? )>

<!-- SvcAcctDel Request -->
<!ELEMENT SvcAcctDelRq  (RqUID , CustId? , SvcAcctId , CascadeDel? )>

<!-- SvcAcctDel Response -->
<!ELEMENT SvcAcctDelRs  (Status , RqUID , CustId? ,  (SvcAcctId , CascadeDel? ,  (SvcAcctRec | DependentType* ) , CSPRefId? , SPRefId? )? )>

<!-- SvcAcctInq Request -->
<!ELEMENT SvcAcctInqRq  (RqUID , CustId? , SvcName* , IncBal? , IncToken? , UpDt? )>

<!-- IncBal Boolean -->
<!ELEMENT IncBal %Boolean;>
<!ATTLIST IncBal  %Type_Boolean; >
<!-- SvcAcctInq Response -->
<!ELEMENT SvcAcctInqRs  (Status , RqUID , CustId? ,  (SvcName* , IncBal? , IncToken? , UpDt? , SvcUpDt , xxxAcctRec* , CustSvcRec* , Token? )? )>

<!-- SvcUpDt DateTime -->
<!ELEMENT SvcUpDt %DateTime;>
<!ATTLIST SvcUpDt  %Type_DateTime; >

<!-- XXX make sure these are the only two acct rec -->
<!ELEMENT xxxAcctRec  (BankAcctRec | PresAcctRec )>

<!-- CustSvcRec Aggregate -->
<!ELEMENT CustSvcRec  (CustSvcId , CustSvcInfo , CustSvcStatus )>

<!-- CustSvcId Aggregate -->
<!ELEMENT CustSvcId  (SvcName , SPName )>

<!-- CustSvcInfo Aggregate -->
<!ELEMENT CustSvcInfo  (DepAcctId? | CardAcctId? )>

<!-- CustSvcStatus Aggregate -->
<!ELEMENT CustSvcStatus  (CustSvcStatusCode , StatusDesc? , EffDt? , StatusModBy? , ResolvePendingDt? )>

<!-- SvcStatus OpenEnum -->
<!ELEMENT SvcStatus %OpenEnum;>
<!ATTLIST SvcStatus  %Type_OpenEnum; >
<!-- SvcAcctRec Aggregate -->
<!ELEMENT SvcAcctRec  (SvcAcctId , SvcAcctInfo , SvcAcctStatus , EffDt? )>

<!-- SvcAcctId Aggregate -->
<!-- XXX PresAcctInfo in Draft 5 seems to be unnecessary -->
<!ELEMENT SvcAcctId  (SvcName , SPName? ,  (DepAcctId | CardAcctId | LoanAcctId | PresAcctId ) )>

<!-- SvcAcctInfo Aggregate -->
<!ELEMENT SvcAcctInfo  (Nickname? )>

<!-- SvcAcctStatus Aggregate -->
<!ELEMENT SvcAcctStatus  (SvcAcctStatusCode , StatusDesc? , EffDt? , StatusModBy? , ResolvePendingDt? )>

<!-- SvcAcctAud Request -->
<!ELEMENT SvcAcctAudRq  (RqUID , CustId? , RecCtrlIn? , SelRangeDt? , Method? )>

<!-- SvcAcctAud Response -->
<!ELEMENT SvcAcctAudRs  (Status , RqUID , CustId? ,  (RecCtrlOut? , SelRangeDt? , Method? , SvcAcctMsgRec* )? )>

<!ELEMENT SvcAcctMsgRec  (CustId? , MsgRecDt? ,  (SvcAcctAddRs | SvcAcctModRs | SvcAcctDelRs ) )>

<!-- SvcAcctSync Request -->
<!ELEMENT SvcAcctSyncRq  (RqUID , CustId? , RecCtrlIn? , Token )>

<!-- SvcAcctSync Response -->
<!ELEMENT SvcAcctSyncRs  (Status , RqUID , CustId? ,  (RecCtrlOut? , Token , NewToken , SvcAcctMsgRec* )? )>

<!-- CustDiscStatusMod Request -->
<!ELEMENT CustDiscStatusModRq  (RqUID , CustId? , DiscId , CustDiscStatusCode )>

<!-- CustDiscStatusMod Response -->
<!ELEMENT CustDiscStatusModRs  (Status , RqUID , CustId? ,  (DiscId , CustDiscStatusCode , CSPRefId? , SPRefId? )? )>

<!-- CustDiscInq Request -->
<!ELEMENT CustDiscInqRq  (SvcName , RqUID , CustId? , DiscId? , CustDiscStatusCode? , IncDisc? )>

<!-- IncDisc Boolean -->
<!ELEMENT IncDisc %Boolean;>
<!ATTLIST IncDisc  %Type_Boolean; >
<!-- CustDiscInq Response -->
<!-- XXX SvcName is not echoed.  Reported as a bug in Draft 5 -->
<!ELEMENT CustDiscInqRs  (Status , RqUID , CustId? ,  (DiscId? , CustDiscStatusCode? , IncDisc? ,  (CustDiscRec | CustDiscStatus )? )? )>

<!-- BaseSvcProfInfo aggregate -->
<!ELEMENT BaseSvcProfInfo  (SvcCore , MsgSupt+ , OptSupt* , SignonInfo , EnrollProf? )>

<!-- SignonInfo Aggregate -->
<!ELEMENT SignonInfo  (AuthSupt* , CryptType+ , ChgPswdFirst? , Min? , Max? , CharType? , CaseSen? , SpaceAlwd? , Memo? )>

<!-- AuthSupt Open Enum -->
<!ELEMENT AuthSupt %OpenEnum;>
<!ATTLIST AuthSupt  %Type_OpenEnum; >
<!-- ChgPswdFirst Boolean -->
<!ELEMENT ChgPswdFirst %Boolean;>
<!ATTLIST ChgPswdFirst  %Type_Boolean; >
<!-- Min Long -->
<!ELEMENT Min %Long;>
<!ATTLIST Min  %Type_Long; >
<!-- Max Long -->
<!ELEMENT Max %Long;>
<!ATTLIST Max  %Type_Long; >
<!-- CharType Open Enum -->
<!ELEMENT CharType %OpenEnum;>
<!ATTLIST CharType  %Type_OpenEnum; >
<!-- CaseSen Boolean -->
<!ELEMENT CaseSen %Boolean;>
<!ATTLIST CaseSen  %Type_Boolean; >
<!-- SpaceAlwd Boolean -->
<!ELEMENT SpaceAlwd %Boolean;>
<!ATTLIST SpaceAlwd  %Type_Boolean; >
<!-- EnrollProf Aggregate -->
<!ELEMENT EnrollProf  (WebEnrollURL? , EnrollDesc? , CryptType? , SecretPrompt* , CustNameReqd? , PostAddrReqd? )>

<!-- WebEnrollURL URL -->
<!ELEMENT WebEnrollURL %URL;>
<!ATTLIST WebEnrollURL  %Type_URL; >
<!-- EnrollDesc C-255 -->
<!ELEMENT EnrollDesc %C-255;>
<!ATTLIST EnrollDesc  %Type_C-255; >
<!-- CustNameReqd Boolean -->
<!ELEMENT CustNameReqd %Boolean;>
<!ATTLIST CustNameReqd  %Type_Boolean; >
<!-- PostAddrReqd Boolean -->
<!ELEMENT PostAddrReqd %Boolean;>
<!ATTLIST PostAddrReqd  %Type_Boolean; >
<!--                                 -->
<!-- Banking Service Messages (Bank) -->
<!--                                 -->
<!ELEMENT BankSvcRq  (SPName? , RqUID , (BalInqRq | AcctInqRq |
DepAcctStmtInqRq | CCAcctStmtInqRq | DepAcctTrnInqRq |
CCAcctTrnInqRq | IntRateInqRq | BankAcctTaxInqRq | ForExRateInqRq |
StopChkAddRq | StopChkCanRq | StopChkInqRq | StopChkAudRq |
StopChkSyncRq | XferAddRq | XferModRq | XferCanRq | XferStatusModRq |
XferInqRq | XferAudRq | XferSyncRq | RecXferAddRq | RecXferModRq |
RecXferCanRq | RecXferInqRq | RecXferAudRq | RecXferSyncRq |
ChkOrdAddRq | DepBkOrdAddRq)*)>

<!ELEMENT BankSvcRs  (Status , SPName? , RqUID , (BalInqRs |
AcctInqRs | DepAcctStmtInqRs | CCAcctStmtInqRs | DepAcctTrnInqRs |
CCAcctTrnInqRs | IntRateInqRs | BankAcctTaxInqRs | ForExRateInqRs |
StopChkAddRs | StopChkCanRs | StopChkInqRs | StopChkAudRs |
StopChkSyncRs | XferAddRs | XferModRs | XferCanRs | XferStatusModRq |
XferInqRs | XferAudRs | XferSyncRs | RecXferAddRs | RecXferModRs |
RecXferCanRs | RecXferInqRs | RecXferAudRs | RecXferSyncRs |
ChkOrdAddRs | DepBkOrdAddRs)*)>

<!-- DepAcctRec aggregate -->
<!ELEMENT DepAcctRec  (StopCount? , HoldCount? , LastDepDt? , LastDepCurAmt? , DepMatureDt? )>

<!-- StopCount Long -->
<!ELEMENT StopCount %Long;>
<!ATTLIST StopCount  %Type_Long; >
<!-- HoldCount Long -->
<!ELEMENT HoldCount %Long;>
<!ATTLIST HoldCount  %Type_Long; >
<!-- LastDepDt Date -->
<!ELEMENT LastDepDt %Date;>
<!ATTLIST LastDepDt  %Type_Date; >
<!-- LastDepCurAmt Currency Amount -->
<!ELEMENT LastDepCurAmt %CURRENCYAMOUNT;>

<!-- DepMatureDt Date -->
<!ELEMENT DepMatureDt %Date;>
<!ATTLIST DepMatureDt  %Type_Date; >
<!-- CCAcctRec aggregate -->
<!ELEMENT CCAcctRec  (DueDt? , ExpDt? , LastPmtDt? , LastPmtCurAmt? )>

<!-- DueDt Date -->
<!ELEMENT DueDt %Date;>
<!ATTLIST DueDt  %Type_Date; >
<!-- TODO - ExpDt YrMon conflicts with previous definition -->
<!-- LastPmtDt Date -->
<!ELEMENT LastPmtDt %Date;>
<!ATTLIST LastPmtDt  %Type_Date; >
<!-- LastPmtCurAmt Currency Amount -->
<!ELEMENT LastPmtCurAmt %CURRENCYAMOUNT;>

<!-- LoanInfoCommon aggregate -->
<!ELEMENT LoanInfoCommon  (OrigDt? , Freq? , PurposeDesc? , CollateralDesc? , CompletedPmtCount? , RegPmtCurAmt? , PmtDueDt? , NextPmtCurAmt? , LastPmtDt? , LastPmtCurAmt? , PastDuePmtCount? )>

<!-- OrigDt Date -->
<!ELEMENT OrigDt %Date;>
<!ATTLIST OrigDt  %Type_Date; >
<!-- PurposeDesc C-80 -->
<!ELEMENT PurposeDesc %C-80;>
<!ATTLIST PurposeDesc  %Type_C-80; >
<!-- CollateralDesc C-80 -->
<!ELEMENT CollateralDesc %C-80;>
<!ATTLIST CollateralDesc  %Type_C-80; >
<!-- CompletedPmtCount Long -->
<!ELEMENT CompletedPmtCount %Long;>
<!ATTLIST CompletedPmtCount  %Type_Long; >
<!-- RegPmtCurAmt Currency Amount -->
<!ELEMENT RegPmtCurAmt %CURRENCYAMOUNT;>

<!-- PmtDueDt Date -->
<!ELEMENT PmtDueDt %Date;>
<!ATTLIST PmtDueDt  %Type_Date; >
<!-- NextPmtCurAmt Currency Amount -->
<!ELEMENT NextPmtCurAmt %CURRENCYAMOUNT;>

<!-- PastDuePmtCount Long -->
<!ELEMENT PastDuePmtCount %Long;>
<!ATTLIST PastDuePmtCount  %Type_Long; >
<!-- LoanAcctRec aggregate -->
<!ELEMENT LoanAcctRec  (Term? , MatDt? , LoanInfoCommon? )>

<!-- MatDt Date -->
<!ELEMENT MatDt %Date;>
<!ATTLIST MatDt  %Type_Date; >
<!-- LOCAcctRec aggregate -->
<!ELEMENT LOCAcctRec  (LocLimit? , MinPmtCurAmt? , ExpDt? , LoanInfoCommon? )>

<!-- LocLimit Currency Amount -->
<!ELEMENT LocLimit %CURRENCYAMOUNT;>

<!-- MinPmtCurAmt Currency Amount -->
<!ELEMENT MinPmtCurAmt %CURRENCYAMOUNT;>

<!-- TODO - ExpDt (Date) conflicts with other definitions (DateTime) -->
<!-- MortAcctRec aggregate -->
<!ELEMENT MortAcctRec  (OrigDt? , LoanInfoCommon? , LastPmtDt? , TaxPaidDt? , TaxPaidCurAmt? , LastYrTaxPaidDt? , LastYrTaxPaidCurAmt? , InsPaidDt? , InsPaidCurAmt? , LastYrInsPaidDt? , LastYrInsPaidCurAmt? )>

<!-- RemainingPmtCount Long -->
<!ELEMENT RemainingPmtCount %Long;>
<!ATTLIST RemainingPmtCount  %Type_Long; >
<!-- TaxPaidDt Date -->
<!ELEMENT TaxPaidDt %Date;>
<!ATTLIST TaxPaidDt  %Type_Date; >
<!-- TaxPaidCurAmt Currency Amount -->
<!ELEMENT TaxPaidCurAmt %CURRENCYAMOUNT;>

<!-- LastYrTaxPaidDt Date -->
<!ELEMENT LastYrTaxPaidDt %Date;>
<!ATTLIST LastYrTaxPaidDt  %Type_Date; >
<!-- LastYrTaxPaidCurAmt Currency Amount -->
<!ELEMENT LastYrTaxPaidCurAmt %CURRENCYAMOUNT;>

<!-- InsPaidDt Date -->
<!ELEMENT InsPaidDt %Date;>
<!ATTLIST InsPaidDt  %Type_Date; >
<!-- InsPaidCurAmt Currency Amount -->
<!ELEMENT InsPaidCurAmt %CURRENCYAMOUNT;>

<!-- LastYrInsPaidDt Date -->
<!ELEMENT LastYrInsPaidDt %Date;>
<!ATTLIST LastYrInsPaidDt  %Type_Date; >
<!-- LastYrInsPaidCurAmt Currency Amount -->
<!ELEMENT LastYrInsPaidCurAmt %CURRENCYAMOUNT;>

<!-- BankTrnRec aggregate -->
<!ELEMENT BankAcctTrnRec  (TrnType? , TrnSrc? , PostedDt , OrigDt? , CurAmt , OrigCurAmt? , IndustId? , Memo? ,  (Name | CustPayeeInfo )? , CSPRefId? , SPRefId? , SPRefIdCorrect? )>

<!-- SPRefId has no usage info in the spec - I assumed it's optional -->
<!-- TrnType Open Enum -->
<!ELEMENT TrnType %OpenEnum;>
<!ATTLIST TrnType  %Type_OpenEnum; >
<!-- TrnSrc Open Enum -->
<!ELEMENT TrnSrc %OpenEnum;>
<!ATTLIST TrnSrc  %Type_OpenEnum; >
<!-- PostedDt Date -->
<!ELEMENT PostedDt %Date;>
<!ATTLIST PostedDt  %Type_Date; >
<!-- OrigCurAmt Currency Amount -->
<!ELEMENT OrigCurAmt %CURRENCYAMOUNT;>

<!ELEMENT SPRefIdCorrect  (SPRefId , CorrectAction )>

<!-- CorrectAction Closed Enum -->
<!ELEMENT CorrectAction  (#PCDATA )>
<!ATTLIST CorrectAction  dt:type        NMTOKEN  #FIXED 'string'
                         dt:enumeration CDATA    #FIXED 'TO DO' >
<!--#ENTITY % CorrectAction     #Enum("TODO", "TODO")-->
<!-- DepTrnRec aggregate -->
<!ELEMENT DepAcctTrnRec  (BankAcctTrnRec , AvailDt? , ChkNum? , XferId? , PmtId? ,  (DepAcctIdTo | CardAcctIdTo | LoanAcctIdTo )? , ATMTrnInfo? , USA.ACHTrnInfo? )>

<!-- AvailDt Date -->
<!ELEMENT AvailDt %Date;>
<!ATTLIST AvailDt  %Type_Date; >
<!-- ChkNum NC-12 -->
<!ELEMENT ChkNum %NC-12;>
<!ATTLIST ChkNum  %Type_NC-12; >
<!-- XferId Identifier -->
<!ELEMENT XferId %Identifier;>
<!ATTLIST XferId  %Type_Identifier; >
<!-- PmtId Open Enum -->
<!ELEMENT PmtId %OpenEnum;>
<!ATTLIST PmtId  %Type_OpenEnum; >
<!-- ATMTrnInfo Aggregate -->
<!ELEMENT ATMTrnInfo  (ATMOwner? , ATMLocation? , ATMCityState? )>

<!-- ATMOwner C-14 -->
<!ELEMENT ATMOwner %C-14;>
<!ATTLIST ATMOwner  %Type_C-14; >
<!-- ATMLocation C-18 -->
<!ELEMENT ATMLocation %C-18;>
<!ATTLIST ATMLocation  %Type_C-18; >
<!-- ATMCityState C-15 -->
<!ELEMENT ATMCityState %C-15;>
<!ATTLIST ATMCityState  %Type_C-15; >
<!-- USA.ACHTrnInfo Aggregate -->
<!ELEMENT USA.ACHTrnInfo  (OriginatorName , USA.RTN? )>

<!-- OriginatorName C-40 -->
<!ELEMENT OriginatorName %C-40;>
<!ATTLIST OriginatorName  %Type_C-40; >
<!-- CCTrnRec aggregate -->
<!ELEMENT CCAcctTrnRec  (BankAcctTrnRec , SalesSlipRefNum , Memo? )>

<!-- SalesSlipRefNum NC-12 -->
<!ELEMENT SalesSlipRefNum %NC-12;>
<!ATTLIST SalesSlipRefNum  %Type_NC-12; >
<!-- ChkRange aggregate -->
<!ELEMENT ChkRange  ( (ChkNumStart , ChkNumEnd? ) |  (ChkNumStart? , ChkNumEnd ) )>

<!-- ChkNumStart NC-12 -->
<!ELEMENT ChkNumStart %NC-12;>
<!ATTLIST ChkNumStart  %Type_NC-12; >
<!-- ChkNumEnd NC-12 -->
<!ELEMENT ChkNumEnd %NC-12;>
<!ATTLIST ChkNumEnd  %Type_NC-12; >
<!-- StopChkInfo aggregate -->
<!ELEMENT StopChkInfo  (ChkNum , Name? , CurAmt? , OrigDt? )>

<!-- StopChkRec aggregate -->
<!ELEMENT StopChkRec  (StopChkInfo , PostedDt? , StopChkStatusCode , StatusDesc? )>

<!-- StopChkStatusCode Closed Enum -->
<!ELEMENT StopChkStatusCode  (#PCDATA )>
<!ATTLIST StopChkStatusCode  dt:type        NMTOKEN  #FIXED 'string'
                             dt:enumeration CDATA    #FIXED 'TO DO' >
<!--#ENTITY % StopChkStatusCode     #Enum("TODO", "TODO")-->
<!-- ForExRateInfo aggregate -->
<!ELEMENT ForExRateInfo  (CurAmt? , CurRate , CurConvertRule , FeeCurAmt? , ExpDt? , CSPRefId? , SPRefId? )>

<!-- Fee Currency Amount -->
<!ELEMENT FeeCurAmt %CURRENCYAMOUNT;>

<!-- XferInfo aggregate -->
<!-- XXX ForExInfo renamed to ForExRateInfo - Bug in PR Draft -->
<!ELEMENT XferInfo  ( (DepAcctIdFrom | CardAcctIdFrom | LoanAcctIdFrom ) ,  (DepAcctIdTo | CardAcctIdTo | LoanAcctIdTo ) , CurAmt , DueDt? , Category? , ImmediateXfer? )>

<!-- Category C-40 -->
<!ELEMENT Category %C-40;>
<!ATTLIST Category  %Type_C-40; >
<!-- ImmediateXfer Boolean -->
<!ELEMENT ImmediateXfer %Boolean;>
<!ATTLIST ImmediateXfer  %Type_Boolean; >
<!-- XferProf aggregate -->
<!ELEMENT XferProf  (OptSupt* , PrcSched? , RecXferProf? )>

<!-- RecXferProf Aggregate -->
<!ELEMENT RecXferProf  (Freq+ , ModPendingType )>

<!-- ModPendingType Closed Enum -->
<!ELEMENT ModPendingType  (#PCDATA )>
<!ATTLIST ModPendingType  dt:type        NMTOKEN  #FIXED 'string'
                          dt:enumeration CDATA    #FIXED 'TO DO' >
<!--#ENTITY % ModPendingType     #Enum("TODO", "TODO")-->
<!-- BalInq Request -->
<!ELEMENT BalInqRq  (RqUID , CustId? ,  (DepAcctId | CardAcctId | LoanAcctId ) , IncExtBal? )>

<!-- IncExtBal Boolean -->
<!ELEMENT IncExtBal %Boolean;>
<!ATTLIST IncExtBal  %Type_Boolean; >
<!-- BalInq Response -->
<!ELEMENT BalInqRs  (Status , RqUID , CustId? ,  ( (DepAcctId | CardAcctId | LoanAcctId ) , IncExtBal? , AcctBal+ , ExtAcctBal* , MktgInfo? )? )>

<!-- MktgInfo C-255 -->
<!ELEMENT MktgInfo %C-255;>
<!ATTLIST MktgInfo  %Type_C-255; >
<!-- AcctInq Request -->
<!ELEMENT AcctInqRq  (RqUID , CustId? ,  (DepAcctId | CardAcctId | LoanAcctId ) , IncExtBal? , IncBal? )>

<!-- AcctInq Response -->
<!ELEMENT AcctInqRs  (Status , RqUID , CustId? ,  ( (DepAcctId | CardAcctId | LoanAcctId ) , IncExtBal? , IncBal? , UpDt , LastTrnDt? , LastStmtDt? , AcctBal* , ExtAcctBal* ,  (DepAcctRec | CCAcctRec | LoanAcctRec | LOCAcctRec | MortAcctRec )? )? )>

<!-- LastTrnDt Date -->
<!ELEMENT LastTrnDt %Date;>
<!ATTLIST LastTrnDt  %Type_Date; >
<!-- LastStmtDt Date -->
<!ELEMENT LastStmtDt %Date;>
<!ATTLIST LastStmtDt  %Type_Date; >
<!-- DepAcctStmtInq Request -->
<!ELEMENT DepAcctStmtInqRq  (RqUID , CustId? ,  (DepAcctId | CardAcctId ) , SelRangeDt? , IncDetail? )>

<!-- IncDetail Boolean -->
<!ELEMENT IncDetail %Boolean;>
<!ATTLIST IncDetail  %Type_Boolean; >
<!-- DepAcctStmtInq Response -->
<!ELEMENT DepAcctStmtInqRs  (Status , RqUID , CustId? ,  ( (DepAcctId | CardAcctId ) , SelRangeDt? , IncDetail? , DepAcctStmtRec* )? )>

<!-- DepAcctStmtRec Aggregate -->
<!ELEMENT DepAcctStmtRec  (SPRefId? , NextDt? , AcctBal+ , StmtSummAmt+ , StartDt , EndDt , MktgInfo? , URL? , DepAcctTrnRec* )>

<!-- NextDt DateTime -->
<!ELEMENT NextDt %DateTime;>
<!ATTLIST NextDt  %Type_DateTime; >
<!-- StartDt DateTime -->
<!ELEMENT StartDt %DateTime;>
<!ATTLIST StartDt  %Type_DateTime; >
<!-- EndDt DateTime -->
<!ELEMENT EndDt %DateTime;>
<!ATTLIST EndDt  %Type_DateTime; >
<!-- StmtSummType Open Enum -->
<!ELEMENT StmtSummType %OpenEnum;>
<!ATTLIST StmtSummType  %Type_OpenEnum; >
<!-- CCAcctStmtInq Request -->
<!ELEMENT CCAcctStmtInqRq  (RqUID , CustId? , CardAcctId , SelRangeDt? , IncDetail? )>

<!-- CCAcctStmtInq Response -->
<!ELEMENT CCAcctStmtInqRs  (Status , RqUID , CustId? ,  (CardAcctId , SelRangeDt? , IncDetail? , CCAcctStmtRec* )? )>

<!-- CCAcctStmtRec Aggregate -->
<!ELEMENT CCAcctStmtRec  (SPRefId? , NextDt? , AcctBal+ , ExtAcctBal* , PmtDueDt? , MinAmtDue? , StmtSummAmt* , DelinqAging* , StartDt , EndDt , MktgInfo? , URL? , CCAcctTrnRec* )>

<!-- MinAmtDue Currency Amount -->
<!ELEMENT MinAmtDue %CURRENCYAMOUNT;>

<!-- StmtSummAmt Aggregate -->
<!ELEMENT StmtSummAmt  (StmtSummType , CurAmt )>

<!-- DelinqAging Aggregate -->
<!ELEMENT DelinqAging  (Aging , CurAmt )>

<!-- Aging Open Enum -->
<!ELEMENT Aging %OpenEnum;>
<!ATTLIST Aging  %Type_OpenEnum; >
<!-- DepAcctTrnInq Request -->
<!ELEMENT DepAcctTrnInqRq  (RqUID , CustId? , RecCtrlIn? ,  (DepAcctId | CardAcctId ) , SelRangeDt? , SelRangeCurAmt? , ChkRange? , TrnType* , TrnSrc* , CSPRefId* , SPRefId* )>

<!-- DepAcctTrnInq Response -->
<!ELEMENT DepAcctTrnInqRs  (Status , RqUID , CustId? ,  (RecCtrlOut? ,  (DepAcctId | CardAcctId ) , SelRangeDt? , SelRangeCurAmt? , ChkRange? , TrnType* , TrnSrc* , CSPRefId* , SPRefId* , MktgInfo? , DepAcctTrnRec* )? )>

<!-- CCAcctTrnInq Request -->
<!ELEMENT CCAcctTrnInqRq  (RqUID , CustId? , CardAcctId , RecCtrlIn? , SelRangeDt? , SelRangeCurAmt? , TrnType* , TrnSrc* , CSPRefId* , SPRefId* )>

<!-- CCAcctTrnInq Response -->
<!ELEMENT CCAcctTrnInqRs  (Status , RqUID , CustId? ,  (CardAcctId , RecCtrlOut? , SelRangeDt? , SelRangeCurAmt? , TrnType* , TrnSrc* , CSPRefId* , SPRefId* , MktgInfo? , CCAcctTrnRec* )? )>

<!-- BankAcctTrnImgInq Request -->
<!ELEMENT BankAcctTrnImgInqRq  (RqUID , CustId? , DeliveryMethod ,  (DepAcctId | CardAcctId | LoanAcctId ) , StopChkInfo* , CustContact? )>

<!-- DeliveryMethod Open Enum -->
<!ELEMENT DeliveryMethod %OpenEnum;>
<!ATTLIST DeliveryMethod  %Type_OpenEnum; >
<!-- BankAcctTrnImgInq Response -->
<!ELEMENT BankAcctTrnImgInqRs  (Status , RqUID , CustId? ,  (DeliveryMethod? ,  (DepAcctId | CardAcctId | LoanAcctId ) , StopChkInfo* , CustContact? , CSPRefId? , SPRefId? )? )>

<!-- IntRateInq Request -->
<!ELEMENT IntRateInqRq  (RqUID , CustId? , RecCtrlIn? , AcctType , AcctTaxType? , CurAmt? , Term? )>

<!-- IntRateInq Response -->
<!ELEMENT IntRateInqRs  (Status , RqUID , CustId? ,  (RecCtrlOut? , AcctType , AcctTaxType? , CurAmt? , Term? , IntRateInfo* )? )>

<!-- IntRateInfo Aggregate -->
<!ELEMENT IntRateInfo  (Rate , Desc? , IntAPY? , Term? , LowCurAmt? , HighCurAmt? )>

<!-- Rate Decimal -->
<!ELEMENT Rate %Decimal;>
<!ATTLIST Rate  %Type_Decimal; >
<!-- IntAPY Decimal -->
<!ELEMENT IntAPY %Decimal;>
<!ATTLIST IntAPY  %Type_Decimal; >
<!-- BankAcctTaxInq Request -->
<!ELEMENT BankAcctTaxInqRq  (RqUID , CustId? ,  (DepAcctId | CardAcctId | LoanAcctId ) , TaxYear )>

<!-- TaxYear Year -->
<!ELEMENT TaxYear %Year;>
<!ATTLIST TaxYear  %Type_Year; >
<!-- BankAcctTaxInq Response -->
<!ELEMENT BankAcctTaxInqRs  (Status , RqUID , CustId? ,  ( (DepAcctId | CardAcctId | LoanAcctId ) , TaxYear , TaxId , AcctTaxInfo* )? )>

<!-- AcctTaxInfo Aggregate -->
<!ELEMENT AcctTaxInfo  (Org , TaxType? , CurAmt? , PrevYrCurAmt? , Rate? )>

<!-- TaxType Open Enum -->
<!ELEMENT TaxType %OpenEnum;>
<!ATTLIST TaxType  %Type_OpenEnum; >
<!-- PrevYrCurAmt Currency Amount -->
<!ELEMENT PrevYrCurAmt %CURRENCYAMOUNT;>

<!-- ForExRateInq Request -->
<!ELEMENT ForExRateInqRq  (RqUID , CustId? ,  (DepAcctId | CardAcctId ) , CurAmt , CurCode , ForExRateType? )>

<!-- ForExRateType Closed Enum -->
<!ELEMENT ForExRateType  (#PCDATA )>
<!ATTLIST ForExRateType  dt:type        NMTOKEN  #FIXED 'string'
                         dt:enumeration CDATA    #FIXED 'TO DO' >
<!--#ENTITY % ForExRateType     #Enum("TODO", "TODO")-->
<!-- ForExRateInq Response -->
<!ELEMENT ForExRateInqRs  (Status , RqUID , CustId? ,  ( (DepAcctId | CardAcctId ) , CurAmt , CurCode , ForExRateType? , ForExRateRec )? )>

<!-- ForExRateRec Aggregate -->
<!ELEMENT ForExRateRec  (ForExRateId? , ForExRateInfo )>

<!-- ForExRateId Identifier -->
<!ELEMENT ForExRateId %Identifier;>
<!ATTLIST ForExRateId  %Type_Identifier; >
<!-- StopChkAdd Request -->
<!ELEMENT StopChkAddRq  (RqUID , CustId? ,  (DepAcctId | CardAcctId | LoanAcctId ) ,  (ChkRange | StopChkInfo ) )>

<!-- StopChkAdd Response -->
<!ELEMENT StopChkAddRs  (Status , RqUID , CustId? ,  ( (DepAcctId | CardAcctId | LoanAcctId ) ,  (ChkRange | StopChkInfo ) , StopChkRec , CSPRefId? , SPRefId? )? )>

<!-- StopChkCan Request -->
<!ELEMENT StopChkCanRq  (RqUID , CustId? ,  (DepAcctId | CardAcctId | LoanAcctId ) ,  (ChkRange | StopChkInfo ) )>

<!-- StopChkCan Response -->
<!ELEMENT StopChkCanRs  (Status , RqUID , CustId? ,  ( (DepAcctId | CardAcctId | LoanAcctId ) ,  (ChkRange | StopChkInfo ) , StopChkRec , CSPRefId? , SPRefId? )? )>

<!-- StopChkInq Request -->
<!ELEMENT StopChkInqRq  (RqUID , CustId? , RecCtrlIn? ,  (DepAcctId | CardAcctId | LoanAcctId ) ,  (ChkRange | StopChkInfo* | SelRangeDt )? , IncToken? )>

<!-- StopChkInq Response -->
<!ELEMENT StopChkInqRs  (Status , RqUID , CustId? ,  (RecCtrlOut? ,  (DepAcctId | CardAcctId | LoanAcctId ) ,  (ChkRange | StopChkInfo* | SelRangeDt )? , StopChkRec* , Token? )? )>

<!-- StopChkAud Request -->
<!ELEMENT StopChkAudRq  (RqUID , CustId? , RecCtrlIn? ,  (DepAcctId | CardAcctId | LoanAcctId ) , SelRangeDt? , ChkRange? )>

<!-- StopChkAud Response -->
<!ELEMENT StopChkAudRs  (Status , RqUID , CustId? ,  (RecCtrlOut? ,  (DepAcctId | CardAcctId | LoanAcctId ) , SelRangeDt? , ChkRange? , StopChkMsgRec* )? )>

<!-- StopChkSyncRq Aggregate -->
<!ELEMENT StopChkMsgRec  (CustId? , MsgRecDt? ,  (StopChkAddRs | StopChkCanRs ) )>

<!-- StopChkSync Request -->
<!ELEMENT StopChkSyncRq  (RqUID , CustId? , RecCtrlIn? ,  (DepAcctId | CardAcctId | LoanAcctId ) , Token )>

<!-- StopChkSync Response -->
<!ELEMENT StopChkSyncRs  (Status , RqUID , CustId? ,  (RecCtrlOut? ,  (DepAcctId | CardAcctId | LoanAcctId ) , Token , NewToken , StopChkMsgRec* )? )>

<!-- XferAdd Request -->
<!ELEMENT XferAddRq  (RqUID , CustId? , XferInfo , DupChkOverride? )>

<!-- DupChkOverride Boolean -->
<!ELEMENT DupChkOverride %Boolean;>
<!ATTLIST DupChkOverride  %Type_Boolean; >
<!-- XferAdd Response -->
<!ELEMENT XferAddRs  (Status , RqUID , CustId? , XferInfo , DupChkOverride? , XferRec , CSPRefId? , SPRefId? )>

<!-- XferRec Aggregate -->
<!ELEMENT XferRec  (XferId , RecXferId? , RecXferMod? , XferInfo , XferStatus )>

<!-- RecXferId Identifier -->
<!ELEMENT RecXferId %Identifier;>
<!ATTLIST RecXferId  %Type_Identifier; >
<!-- RecXferMod Boolean -->
<!ELEMENT RecXferMod %Boolean;>
<!ATTLIST RecXferMod  %Type_Boolean; >
<!-- XferStatusCode Closed Enum -->
<!ELEMENT XferStatusCode  (#PCDATA )>
<!ATTLIST XferStatusCode  dt:type        NMTOKEN  #FIXED 'string'
                          dt:enumeration CDATA    #FIXED 'TO DO' >
<!--#ENTITY % XferStatusCode     #Enum("TODO", "TODO")-->
<!-- XferMod Request -->
<!ELEMENT XferModRq  (RqUID , CustId? , XferId , XferInfo , DupChkOverride? )>

<!-- XferMod Response -->
<!ELEMENT XferModRs  (Status , RqUID , CustId? , XferId , XferInfo , DupChkOverride? , XferRec , CSPRefId? , SPRefId? )>

<!-- XferCan Request -->
<!ELEMENT XferCanRq  (RqUID , CustId? , XferId )>

<!-- XferCan Response -->
<!ELEMENT XferCanRs  (Status , RqUID , CustId? , XferId , XferRec , CSPRefId? , SPRefId? )>

<!-- XferStatusMod Request -->
<!ELEMENT XferStatusModRq  (RqUID , CustId? , XferId , XferStatus )>

<!-- XferStatus aggregate -->
<!ELEMENT XferStatus  (XferStatusCode , EffDt , StatusModBy )>

<!-- XferStatusMod Response -->
<!ELEMENT XferStatusModRs  (Status , RqUID , CustId? ,  (XferId , XferStatus , CSPRefId? , SPRefId? )? )>

<!-- XferInq Request -->
<!ELEMENT XferInqRq  (RqUID , CustId? , RecCtrlIn? , XferId* , RecXferId* , CSPRefId* , SPRefId* ,  (DepAcctIdFrom | CardAcctIdFrom | LoanAcctIdFrom )? ,  (DepAcctIdTo | CardAcctIdTo | LoanAcctIdTo )? , XferStatusCode* , SelRangeDueDt? , SelRangeCurAmt? , IncToken? )>

<!-- XferInq Response -->
<!ELEMENT XferInqRs  (Status , RqUID , CustId? , RecCtrlOut? , XferId* , RecXferId* , CSPRefId* , SPRefId* ,  (DepAcctIdFrom | CardAcctIdFrom | LoanAcctIdFrom )? ,  (DepAcctIdTo | CardAcctIdTo | LoanAcctIdTo )? , XferStatusCode* , SelRangeDueDt? , SelRangeCurAmt? , XferRec* , Token )>

<!-- XferAud Request -->
<!ELEMENT XferAudRq  (RqUID , CustId? , RecCtrlIn? , SelRangeDt? , Method? , XferId? , RecXferId? )>

<!-- XferAud Response -->
<!ELEMENT XferAudRs  (Status , RqUID , CustId? , RecCtrlOut? , SelRangeDt? , Method? , XferId? , RecXferId? , XferMsgRec* )>

<!-- XferMsgRec aggregate -->
<!ELEMENT XferMsgRec  (CustId? , MsgRecDt? ,  (XferAddRs | XferModRs | XferCanRs ) )>

<!-- XferSync Request -->
<!ELEMENT XferSyncRq  (RqUID , CustId? , RecCtrlIn? , Token ,  (DepAcctIdFrom | CardAcctIdFrom | LoanAcctIdFrom ) )>

<!-- XferSync Response -->
<!ELEMENT XferSyncRs  (Status , RqUID , CustId? , RecCtrlOut? , Token ,  (DepAcctIdFrom | CardAcctIdFrom | LoanAcctIdFrom ) , NewToken , XferMsgRec* )>

<!-- RecXferAdd Request -->
<!ELEMENT RecXferAddRq  (RqUID , CustId? , XferInfo , RecModelInfo , DupChkOverride? )>

<!-- RecXferAdd Response -->
<!ELEMENT RecXferAddRs  (Status , RqUID , CustId? , XferInfo , RecModelInfo , DupChkOverride? , RecXferRec , CSPRefId? , SPRefId? )>

<!-- RecXferRec aggregate -->
<!ELEMENT RecXferRec  (RecXferId , XferInfo , RecModelInfo , RemainingInsts )>

<!-- RemainingInsts Long -->
<!ELEMENT RemainingInsts %Long;>
<!ATTLIST RemainingInsts  %Type_Long; >
<!-- RecXferMod Request -->
<!ELEMENT RecXferModRq  (RqUID , CustId? , RecXferId , XferInfo , RecModelInfo , ModPending? )>

<!-- ModPending Boolean -->
<!ELEMENT ModPending %Boolean;>
<!ATTLIST ModPending  %Type_Boolean; >
<!-- RecXferMod Response -->
<!ELEMENT RecXferModRs  (Status , RqUID , CustId? , RecXferId , XferInfo , RecModelInfo , ModPending? , RecXferRec , CSPRefId? , SPRefId? )>

<!-- RecXferCan Request -->
<!ELEMENT RecXferCanRq  (RqUID , CustId? , RecXferId , CascadeDel? )>

<!-- RecXferCan Response -->
<!ELEMENT RecXferCanRs  (Status , RqUID , CustId? , RecXferId , CascadeDel? ,  (RecXferRec , DependentType* ) , CSPRefId? , SPRefId? )>

<!-- RecXferInq Request -->
<!ELEMENT RecXferInqRq  (RqUID , CustId? , RecCtrlIn? , RecXferId* ,  (DepAcctIdFrom | CardAcctIdFrom | LoanAcctIdFrom )? , SelRangeCurAmt? , CSPRefId* , SPRefId* , IncToken? )>

<!-- RecXferInq Response -->
<!ELEMENT RecXferInqRs  (Status , RqUID , CustId? , RecCtrlOut? , RecXferId* ,  (DepAcctIdFrom | CardAcctIdFrom | LoanAcctIdFrom )? , SelRangeCurAmt? , CSPRefId* , SPRefId* , RecXferRec* , Token? )>

<!-- RecXferAud Request -->
<!ELEMENT RecXferAudRq  (RqUID , CustId? , RecCtrlIn? , SelRangeDt? , Method? , RecXferId? )>

<!-- RecXferAud Response -->
<!ELEMENT RecXferAudRs  (Status , RqUID , CustId? , RecCtrlOut? , SelRangeDt? , Method? , RecXferId? , RecXferMsgRec* )>

<!-- RecXferMsgRec aggregate -->
<!ELEMENT RecXferMsgRec  (CustId? , MsgRecDt? ,  (RecXferAddRs | RecXferModRs | RecXferCanRs ) )>

<!-- RecXferSync Request -->
<!ELEMENT RecXferSyncRq  (RqUID , CustId? , RecCtrlIn? , Token ,  (DepAcctIdFrom | CardAcctIdFrom | LoanAcctIdFrom ) )>

<!-- RecXferSync Response -->
<!ELEMENT RecXferSyncRs  (Status , RqUID , CustId? ,  (RecCtrlOut? ,  (DepAcctIdFrom | CardAcctIdFrom | LoanAcctIdFrom ) , NewToken , RecXferMsgRec* )? )>

<!-- ChkOrdAdd Request -->
<!ELEMENT ChkOrdAddRq  (RqUID , CustId? , ChkOrdInfo )>

<!-- ChkPrint aggregate -->
<!ELEMENT ChkPrint  (CustName , PostAddr , Phone? , Desc )>

<!-- ShipTo aggregate -->
<!ELEMENT ShipTo  (CustName , PostAddr )>

<!-- ChkBkStyleId Identifier -->
<!ELEMENT ChkBkStyleId %Identifier;>
<!ATTLIST ChkBkStyleId  %Type_Identifier; >
<!-- ChkOrdAdd Response -->
<!ELEMENT ChkOrdAddRs  (Status, RqUID, CustId?, (ChkOrdInfo,
ChkOrdRec, CSPRefId?, SPRefId?)?)>

<!-- DepBkOrdAdd Request -->
<!ELEMENT DepBkOrdAddRq  (RqUID , CustId? , DepBkOrdInfo)>

<!-- DepBkOrdAdd Response -->
<!ELEMENT DepBkOrdAddRs  (Status, RqUID, CustId?, (DepBkOrdInfo,
DepBkOrdRec, CSPRefId?, SPRefId?))>

<!-- DepBkStyleId Identifier -->
<!ELEMENT DepBkStyleId %Identifier;>
<!ATTLIST DepBkStyleId  %Type_Identifier; >

<!-- BankSvcProfInfo aggregate -->
<!ELEMENT BankSvcProfInfo  (SvcCore , MsgSupt* , OptSupt* , DeliveryMethod* , StopChkProf? , XferProf? , InterXferProf? )>

<!-- StopChkProf aggregate -->
<!ELEMENT StopChkProf  (OptSupt* , PrcSched? , FeeCurAmt? )>

<!-- InterXferProf aggregate -->
<!ELEMENT InterXferProf  (XferProf? , DomXferFeeCurAmt? , IntlXferFeeCurAmt? , USA.ACHProf? )>

<!-- USA.ACHProf aggregate -->
<!ELEMENT USA.ACHProf  (DaysWith , DfltDaysToPay , CanWind )>

<!-- DomXferFeeCurAmt Currency Amount -->
<!ELEMENT DomXferFeeCurAmt %CURRENCYAMOUNT;>

<!-- IntlXferFeeCurAmt Currency Amount -->
<!ELEMENT IntlXferFeeCurAmt %CURRENCYAMOUNT;>

<!-- DaysWith Long -->
<!ELEMENT DaysWith %Long;>
<!ATTLIST DaysWith  %Type_Long; >
<!-- DfltDaysToPay Long -->
<!ELEMENT DfltDaysToPay %Long;>
<!ATTLIST DfltDaysToPay  %Type_Long; >
<!-- CanWind Long -->
<!ELEMENT CanWind %Long;>
<!ATTLIST CanWind  %Type_Long; >
<!--                            -->
<!-- Pay Service Messages (Pay) -->
<!--                            -->
<!ELEMENT PaySvcRq  (SPName? , RqUID , (StdPayeeInqRq |
CustPayeeAddRq | CustPayeeModRq | CustPayeeTypeModRq | CustPayeeDelRq |
CustPayeeInqRq | CustPayeeAudRq | CustPayeeSyncRq | PmtAddRq |
PmtModRq | PmtStatusModRq | PmtCanRq | PmtInqRq | PmtAudRq |
PmtSyncRq | PmtAuthAddRq | PmtAuthModRq | PmtAuthCanRq |
PmtAuthInqRq | PmtAuthAudRq | PmtAuthSyncRq | RemitAddRq |
RemitModRq | RemitStatusModRq | RemitDelRq | RemitInqRq | RemitAudRq |
RemitSyncRq | RecPmtAddRq | RecPmtModRq | RecPmtCanRq |
RecPmtInqRq | RecPmtAudRq | RecPmtSyncRq)*)>

<!ELEMENT PaySvcRs  (Status , SPName? , RqUID , (StdPayeeInqRs |
CustPayeeAddRs | CustPayeeModRs | CustPayeeTypeModRs | CustPayeeDelRs |
CustPayeeInqRs | CustPayeeAudRs | CustPayeeSyncRs | PmtAddRs |
PmtModRs | PmtStatusModRs | PmtCanRs | PmtInqRs | PmtAudRs |
PmtSyncRs | PmtAuthAddRs | PmtAuthModRs | PmtAuthCanRs |
PmtAuthInqRs | PmtAuthAudRs | PmtAuthSyncRs | RemitAddRs |
RemitModRs | RemitStatusModRs | RemitDelRs | RemitInqRs | RemitAudRs |
RemitSyncRs | RecPmtAddRs | RecPmtModRs | RecPmtCanRs |
RecPmtInqRs | RecPmtAudRs | RecPmtSyncRs)*)>

<!-- StdPayeeId aggregate -->
<!ELEMENT StdPayeeId  (SPName , BillerNum )>

<!-- BillerNum Identifier -->
<!ELEMENT BillerNum %Identifier;>
<!ATTLIST BillerNum  %Type_Identifier; >
<!-- PayeeInfo aggregate -->
<!ELEMENT CustPayeeInfo  (Name? , Nickname? ,  (StdPayeeId | FSPayee | XferPayee | BillerPayee ) , BillingAcct? , DfltPmtInfo? )>

<!-- DfltPmtInfo aggregate -->
<!ELEMENT DfltPmtInfo  ( (DepAcctIdFrom | CardAcctIdFrom )? , Category? , Memo )>

<!-- BillingAcct C-32 -->
<!ELEMENT BillingAcct %C-32;>
<!ATTLIST BillingAcct  %Type_C-32; >
<!-- FSPayee aggregate -->
<!ELEMENT FSPayee  (PostAddr , OrgContact )>

<!-- BillerPayee aggregate -->
<!ELEMENT BillerPayee  (BillerId , BillerContact? , HistRetentionDays? , BillerPayInfo? )>

<!-- HistRetentionDays Long -->
<!ELEMENT HistRetentionDays %Long;>
<!ATTLIST HistRetentionDays  %Type_Long; >
<!-- XferPayee aggregate -->
<!ELEMENT XferPayee  (BankInfo? , DepAcctIdTo )>

<!-- RemitInfo aggregate -->
<!ELEMENT RemitInfo  ( (CustPayeeId | CustPayeeInfo ) , BillRefInfo? , BillId? , PmtId? , Memo? , BillingAcct? , CurAmt , PmtSummAmt* , InvoiceInfo* )>

<!-- PmtInfo Aggregate -->
<!ELEMENT PmtInfo  (RemitInfo ,  (DepAcctIdFrom | CardAcctIdFrom ) , Category? ,  (PmtPrcDt | DueDt ) , ImmediatePmt? )>

<!-- CustPayeeId Identifier -->
<!ELEMENT CustPayeeId %Identifier;>
<!ATTLIST CustPayeeId  %Type_Identifier; >
<!-- BillRefInfo NC-80 -->
<!ELEMENT BillRefInfo %NC-80;>
<!ATTLIST BillRefInfo  %Type_NC-80; >
<!-- BillId UUID -->
<!ELEMENT BillId %UUID;>
<!ATTLIST BillId  %Type_UUID; >
<!-- PmtSummAmt aggregate -->
<!ELEMENT PmtSummAmt  (BillSummAmtId , CurAmt )>

<!-- BillSummAmtId Identifier -->
<!ELEMENT BillSummAmtId %Identifier;>
<!ATTLIST BillSummAmtId  %Type_Identifier; >
<!-- PmtPrcDt Date -->
<!ELEMENT PmtPrcDt %Date;>
<!ATTLIST PmtPrcDt  %Type_Date; >
<!-- ImmediatePmt Boolean -->
<!ELEMENT ImmediatePmt %Boolean;>
<!ATTLIST ImmediatePmt  %Type_Boolean; >
<!-- InvoiceInfo aggregate -->
<!ENTITY % INVOICEINFO " (InvoiceNum
                        , TotalCurAmt
                        , PaidCurAmt?
                        , EffDt
                        , Desc?
                        , InvoiceVouchNum?
                        , LateFeeCurAmt?
                        , InvoicePremium?
                        , Discount?
                        , InvoiceAdj?
                        , InvoiceLineItem* )">

<!ELEMENT InvoiceInfo %INVOICEINFO;>

<!-- InvoiceNum C-32 -->
<!ELEMENT InvoiceNum %C-32;>
<!ATTLIST InvoiceNum  %Type_C-32; >
<!-- TotalCurAmt Currency Amount -->
<!ELEMENT TotalCurAmt %CURRENCYAMOUNT;>

<!-- PaidCurAmt Currency Amount -->
<!ELEMENT PaidCurAmt %CURRENCYAMOUNT;>

<!-- InvoiceVouchNum C-80 -->
<!ELEMENT InvoiceVouchNum %C-80;>
<!ATTLIST InvoiceVouchNum  %Type_C-80; >
<!-- LateFeeCurAmt Currency Amount -->
<!ELEMENT LateFeeCurAmt %CURRENCYAMOUNT;>

<!-- InvoicePremium Decimal -->
<!ELEMENT InvoicePremium %Decimal;>
<!ATTLIST InvoicePremium  %Type_Decimal; >
<!-- Discount aggregate -->
<!ELEMENT Discount  ( (Rate | CurAmt ) , EffDt? , Desc )>

<!-- InvoiceAdj aggregate -->
<!ELEMENT InvoiceAdj  (InvoiceAdjNum? , CurAmt , EffDt? , Desc? )>

<!-- InvoiceAdjNum C-32 -->
<!ELEMENT InvoiceAdjNum %C-32;>
<!ATTLIST InvoiceAdjNum  %Type_C-32; >
<!-- InvoiceLineItem aggregate -->
<!ELEMENT InvoiceLineItem  (InvoiceLineItemNum? , CurAmt , Desc? )>

<!-- InvoiceLineItemNum C-12 -->
<!ELEMENT InvoiceLineItemNum %C-12;>
<!ATTLIST InvoiceLineItemNum  %Type_C-12; >
<!-- PmtStatus aggregate -->
<!ELEMENT PmtStatus  (PmtStatusCode , EffDt , PmtAuthId? , RemitId? , RecPmtMod? , PmtAuthCount? , PmtMethod? , ChkNum? , Memo? )>

<!-- PmtStatusCode Closed Enum -->
<!ELEMENT PmtStatusCode  (#PCDATA )>
<!ATTLIST PmtStatusCode  dt:type        NMTOKEN  #FIXED 'string'
                         dt:enumeration CDATA    #FIXED 'TO DO' >
<!--#ENTITY % PmtStatusCode #Enum("TODO", "TODO")-->
<!-- ChkClrDt Date -->
<!ELEMENT ChkClrDt %Date;>
<!ATTLIST ChkClrDt  %Type_Date; >
<!-- PmtAuthId Identifier -->
<!ELEMENT PmtAuthId %Identifier;>
<!ATTLIST PmtAuthId  %Type_Identifier; >
<!-- RecPmtMod Boolean -->
<!ELEMENT RecPmtMod %Boolean;>
<!ATTLIST RecPmtMod  %Type_Boolean; >
<!-- PmtAuthCount Long -->
<!ELEMENT PmtAuthCount %Long;>
<!ATTLIST PmtAuthCount  %Type_Long; >
<!-- PmtMethod Open Enum -->
<!ELEMENT PmtMethod %OpenEnum;>
<!ATTLIST PmtMethod  %Type_OpenEnum; >
<!-- StdPayeeInq Request -->
<!ELEMENT StdPayeeInqRq  (RqUID , CustId? , RecCtrlIn? , StdPayeeId? , Name* , BillingAcct* , PostalCode* , IndustId* )>

<!-- StdPayeeInq Response -->
<!ELEMENT StdPayeeInqRs  (Status , RqUID , CustId? ,  (RecCtrlOut? , StdPayeeId? , Name* , BillingAcct* , PostalCode* , IndustId* , StdPayeeRec* )? )>

<!-- StdPayeeRec aggregate -->
<!ELEMENT StdPayeeRec  (StdPayeeId , StdPayeeInfo )>

<!-- DaysToPay Long -->
<!ELEMENT DaysToPay %Long;>
<!ATTLIST DaysToPay  %Type_Long; >
<!-- CustPayeeAdd Request -->
<!ELEMENT CustPayeeAddRq  (RqUID , CustId? , CustPayeeInfo )>

<!-- CustPayeeAdd Response -->
<!ELEMENT CustPayeeAddRs  (Status , RqUID , CustId? ,  (CustPayeeInfo , CustPayeeRec , CSPRefId? , SPRefId? )? )>

<!-- CustPayeeRec aggregate -->
<!ELEMENT CustPayeeRec  (CustPayeeId , CustPayeeInfo? , BillerContact? , DaysToPay )>

<!-- CustPayeeMod Request -->
<!ELEMENT CustPayeeModRq  (RqUID , CustId? , CustPayeeId , CustPayeeInfo , ModPending )>

<!-- CustPayeeMod Response -->
<!ELEMENT CustPayeeModRs  (Status , RqUID , CustId? ,  (CustPayeeId , CustPayeeInfo , ModPending? , CustPayeeRec , CSPRefId? , SPRefId? )? )>

<!-- CustPayeeDel Request -->
<!ELEMENT CustPayeeDelRq  (RqUID , CustId? , CustPayeeId , CascadeDel? )>

<!-- CustPayeeDel Response -->
<!ELEMENT CustPayeeDelRs  (Status , RqUID , CustId? ,  (CustPayeeId , CascadeDel? , DependentType* , CSPRefId? , SPRefId? )? )>

<!-- CustPayeeInq Request -->
<!ELEMENT CustPayeeInqRq  (RqUID , CustId? , RecCtrlIn? , DeliveryMethod? , CustPayeeId , PayeeType* , Name* , Nickname* , IncToken? )>

<!-- CustPayeeInq Response -->
<!ELEMENT CustPayeeInqRs  (Status , RqUID , CustId? ,  (RecCtrlOut? , DeliveryMethod? , CustPayeeId , PayeeType* , Name* , Nickname* , CustPayeeRec* , IncToken? )? )>

<!-- CustPayeeAud Request -->
<!ELEMENT CustPayeeAudRq  (RqUID , CustId? , RecCtrlIn? , SelRangeDt? , Method? , CustPayeeId? )>

<!-- CustPayeeAud Response -->
<!ELEMENT CustPayeeAudRs  (Status , RqUID , CustId? ,  (RecCtrlOut? , SelRangeDt? , Method? , CustPayeeId , CustPayeeMsgRec* )? )>

<!-- CustPayeeMsgRec aggregate -->
<!ELEMENT CustPayeeMsgRec  (CustId? , MsgRecDt? ,  (CustPayeeAddRs | CustPayeeModRs | CustPayeeDelRs ) )>

<!-- CustPayeeSync Request -->
<!ELEMENT CustPayeeSyncRq  (RqUID , CustId? , RecCtrlIn? , Token )>

<!-- CustPayeeSync Response -->
<!ELEMENT CustPayeeSyncRs  (Status , RqUID , CustId? ,  (RecCtrlOut? , Token , NewToken , CustPayeeMsgRec* )? )>

<!-- PayeeTypeMod Request -->
<!ELEMENT CustPayeeTypeModRq  (RqUID , CustId? , CustPayeeId , PayeeType )>

<!-- PayeeType Closed Enum -->
<!ELEMENT PayeeType  (#PCDATA )>
<!ATTLIST PayeeType  dt:type        NMTOKEN  #FIXED 'string'
                     dt:enumeration CDATA    #FIXED 'TO DO' >
<!--#ENTITY % PayeeType #Enum("TODO", "TODO")-->
<!-- PayeeTypeMod Response -->
<!ELEMENT CustPayeeTypeModRs  (Status , RqUID , CustId? , CustPayeeId , PayeeType , CSPRefId? , SPRefId? )>

<!-- PmtAdd Request -->
<!ELEMENT PmtAddRq  (RqUID , CustId? , PmtInfo , DupChkOverride )>

<!-- PmtAdd Response -->
<!ELEMENT PmtAddRs  (Status , RqUID , CustId? ,  (PmtInfo , DupChkOverride , PmtRec , CSPRefId? , SPRefId? )? )>

<!-- PmtRec aggregate -->
<!ELEMENT PmtRec  (PmtId , RecPmtId? , PmtInfo , PmtStatus , PmtRemitName? , PmtRemitAddr? , CreatedDt? ,  (OrigPmtPrcDt | OrigPmtDueDt )? , FIDebitTrcNum? , FICreditTrcNum? , CSPRefId? , SPRefId? , ClientApp? )>

<!-- CreatedDt Date -->
<!ELEMENT CreatedDt %Date;>
<!ATTLIST CreatedDt  %Type_Date; >
<!-- OrigPmtPrcDt Date -->
<!ELEMENT OrigPmtPrcDt %Date;>
<!ATTLIST OrigPmtPrcDt  %Type_Date; >
<!-- OrigPmtDueDt Date -->
<!ELEMENT OrigPmtDueDt %Date;>
<!ATTLIST OrigPmtDueDt  %Type_Date; >
<!-- FIDebitTrcNum NC-8 -->
<!ELEMENT FIDebitTrcNum %NC-8;>
<!ATTLIST FIDebitTrcNum  %Type_NC-8; >
<!-- FICreditTrcNum NC-8 -->
<!ELEMENT FICreditTrcNum %NC-8;>
<!ATTLIST FICreditTrcNum  %Type_NC-8; >
<!-- PmtMod Request -->
<!ELEMENT PmtModRq  (RqUID , CustId? , PmtId , PmtInfo , UpdatePayee? , DupChkOverride? )>

<!-- UpdatePayee Boolean -->
<!ELEMENT UpdatePayee %Boolean;>
<!ATTLIST UpdatePayee  %Type_Boolean; >
<!-- PmtMod Response -->
<!ELEMENT PmtModRs  (Status , RqUID , CustId? ,  (PmtId , PmtInfo , UpdatePayee? , DupChkOverride? , PmtRec , CSPRefId? , SPRefId? )? )>

<!-- PmtStatusMod Request -->
<!ELEMENT PmtStatusModRq  (RqUID , CustId? , PmtId , PmtStatus )>

<!-- PmtStatusMod Response -->
<!ELEMENT PmtStatusModRs  (Status , RqUID , CustId? ,  (PmtId , PmtStatus , CSPRefId? , SPRefId? )? )>

<!-- PmtCan Request -->
<!ELEMENT PmtCanRq  (RqUID , CustId? , PmtId )>

<!-- PmtCan Response -->
<!ELEMENT PmtCanRs  (Status , RqUID , CustId? ,  (PmtId , CSPRefId? , SPRefId? )? )>

<!-- PmtInq Request -->
<!ELEMENT PmtInqRq  (RqUID , CustId? , RecCtrlIn? , PmtType* , PmtId , RecPmtId* ,  (DepAcctIdFrom | CardAcctIdFrom )? , Category* , Memo* , ChkNum* , ChkClrDt* , FIDebitTrcNum* , FICreditTrcNum* , PmtMethod* , CustPayeeId* , BillingAcct* , Name* , StdPayeeId* , Nickname* , PmtStatusCode* , SelRangeDueDt? , SelRangePrcDt? , SelRangeCurAmt? , LastNRec? , DeliveryMethod? , CSPRefId* , SPRefId* , IncToken? , IncHistory? )>

<!-- LastNRec Long -->
<!ELEMENT LastNRec %Long;>
<!ATTLIST LastNRec  %Type_Long; >
<!-- PmtInq Response -->
<!ELEMENT PmtInqRs  (Status , RqUID , CustId? ,  (RecCtrlOut? , PmtType* , PmtId , RecPmtId* ,  (DepAcctIdFrom | CardAcctIdFrom )? , Category* , Memo* , ChkNum* , ChkClrDt* , FIDebitTrcNum* , FICreditTrcNum* , PmtMethod* , CustPayeeId* , BillingAcct* , Name* , StdPayeeId* , Nickname* , PmtStatusCode* , SelRangeDueDt? , SelRangePrcDt? , SelRangeCurAmt? , LastNRec? , DeliveryMethod? , CSPRefId* , SPRefId* , IncToken? , IncHistory? , PmtRec* , Token? )? )>

<!-- PmtType Closed Enum -->
<!ELEMENT PmtType  (#PCDATA )>
<!ATTLIST PmtType  dt:type        NMTOKEN  #FIXED 'string'
                   dt:enumeration CDATA    #FIXED 'TO DO' >
<!--#ENTITY % PmtType #Enum("TODO", "TODO") -->
<!-- IncHistory Boolean -->
<!ELEMENT IncHistory %Boolean;>
<!ATTLIST IncHistory  %Type_Boolean; >
<!-- PmtAud Request -->
<!ELEMENT PmtAudRq  (RqUID , CustId? , RecCtrlIn? , SelRangeDt? , Method? , PmtId? )>

<!-- PmtAud Response -->
<!ELEMENT PmtAudRs  (Status , RqUID , CustId? ,  (RecCtrlOut? , SelRangeDt? , Method? , PmtId? , PmtMsgRec* )? )>

<!-- PmtMsgRec aggregate -->
<!ELEMENT PmtMsgRec  (CustId? , MsgRecDt? ,  (PmtAddRs | PmtModRs | PmtCanRs ) )>

<!-- PmtSync Request -->
<!ELEMENT PmtSyncRq  (RqUID , CustId? , RecCtrlIn? , Token )>

<!-- PmtSync Response -->
<!ELEMENT PmtSyncRs  (Status , RqUID , CustId? ,  (RecCtrlOut? , Token , NewToken , PmtMsgRec* )? )>

<!-- PmtAuthAdd Request -->
<!ELEMENT PmtAuthAddRq  (RqUID , CustId? , PmtAuthInfo )>

<!-- PmtAuthInfo aggregate -->
<!ELEMENT PmtAuthInfo  ( (DepAcctIdFrom | CardAcctIdFrom ) , CurAmt , Name )>

<!-- PmtAuthAdd Response -->
<!ELEMENT PmtAuthAddRs  (Status , RqUID , CustId? ,  (PmtAuthInfo , PmtAuthRec )? )>

<!-- PmtAuthRec aggregate -->
<!ELEMENT PmtAuthRec  (PmtAuthId , PmtAuthInfo , PmtAuthStatus )>

<!-- PmtAuthStatus aggregate -->
<!ELEMENT PmtAuthStatus  (PmtAuthStatusCode , EffDt , StatusModBy? )>

<!-- PmtAuthStatusCode aggregate -->
<!ELEMENT PmtAuthStatusCode  (EffDt , StatusModBy? )>

<!-- PmtAuthMod Request -->
<!ELEMENT PmtAuthModRq  (RqUID , CustId? , PmtAuthId , PmtAuthInfo )>

<!-- PmtAuthMod Response -->
<!ELEMENT PmtAuthModRs  (Status , RqUID , CustId? ,  (PmtAuthId , PmtAuthInfo , PmtAuthRec )? )>

<!-- PmtAuthCan Request -->
<!ELEMENT PmtAuthCanRq  (RqUID , CustId? , PmtAuthId )>

<!-- PmtAuthCan Response -->
<!ELEMENT PmtAuthCanRs  (Status , RqUID , CustId? ,  (PmtAuthId , CurAmt* , PmtInst* )? )>

<!-- PmtAuthInq Request -->
<!ELEMENT PmtAuthInqRq  (RqUID , CustId? , PmtAuthId , CurAmt* , PmtInst* , SelRangeDt? )>

<!-- PmtAuthInq Response -->
<!ELEMENT PmtAuthInqRs  (Status , RqUID , CustId? ,  (PmtAuthId , CurAmt* , PmtInst* , SelRangeDt? , PmtAuthRec* )? )>

<!-- PmtAuthAud Request -->
<!ELEMENT PmtAuthAudRq  (RqUID , CustId? , RecCtrlIn? , SelRangeDt? , Method? , PmtAuthId )>

<!-- PmtAuthAud Response -->
<!ELEMENT PmtAuthAudRs  (Status , RqUID , CustId? ,  (RecCtrlOut? , SelRangeDt? , Method? , PmtAuthId , PmtAuthMsgRec* )? )>

<!-- PmtAuthMsgRec aggregate -->
<!ELEMENT PmtAuthMsgRec  (CustId? , MsgRecDt? ,  (PmtAuthAddRs | PmtAuthModRs | PmtAuthCanRs ) )>

<!-- PmtAuthSync Request -->
<!ELEMENT PmtAuthSyncRq  (RqUID , CustId? , RecCtrlIn? , Token )>

<!-- PmtAuthSync Response -->
<!ELEMENT PmtAuthSyncRs  (Status , RqUID , CustId? ,  (RecCtrlOut? , Token , NewToken , PmtAuthMsgRec* )? )>

<!-- RemitAdd Request -->
<!ELEMENT RemitAddRq  (RqUID , CustId? , EffDt , PmtId? , RemitInfo , DupChkOverride? )>

<!-- RemitAdd Response -->
<!ELEMENT RemitAddRs  (Status , RqUID , CustId? ,  (EffDt , PmtId? , RemitInfo , DupChkOverride? , RemitRec , SPRefId? )? )>

<!--RemitRec aggregate -->
<!ELEMENT RemitRec  (RemitId , RemitInfo , RemitStatus )>

<!-- RemitId Identifier -->
<!ELEMENT RemitId %Identifier;>
<!ATTLIST RemitId  %Type_Identifier; >
<!--RemitStatus aggregate -->
<!ELEMENT RemitStatus  (RemitStatusCode , EffDt , Memo? )>

<!-- RemitStatusCode Closed Enum -->
<!ELEMENT RemitStatusCode  (#PCDATA )>
<!ATTLIST RemitStatusCode  dt:type        NMTOKEN  #FIXED 'string'
                           dt:enumeration CDATA    #FIXED 'TO DO' >
<!--#ENTITY % RemitStatusCode #Enum("TODO", "TODO")-->
<!-- RemitMod Request -->
<!ELEMENT RemitModRq  (RqUID , CustId? , RemitId , EffDt , PmtId? , RemitInfo , DupChkOverride? )>

<!-- RemitMod Response -->
<!ELEMENT RemitModRs  (Status , RqUID , CustId? ,  (EffDt , PmtId? , RemitId , RemitInfo , DupChkOverride? , RemitRec , SPRefId? )? )>

<!-- RemitDel Request -->
<!ELEMENT RemitDelRq  (RqUID , CustId? , RemitId )>

<!-- RemitDel Response -->
<!ELEMENT RemitDelRs  (Status , RqUID , CustId? ,  (RemitId , SPRefId? )? )>

<!-- RemitInq Request -->
<!ELEMENT RemitInqRq  (RqUID , CustId? , RemitId* , CurAmt* , SelRangeDt? )>

<!-- RemitInq Response -->
<!ELEMENT RemitInqRs  (Status , RqUID , CustId? ,  (RemitId* , CurAmt* , SelRangeDt? , RemitRec )? )>

<!-- RemitAud Request -->
<!ELEMENT RemitAudRq  (RqUID , CustId? , RecCtrlIn? , SelRangeDt? , Method? , RemitId? )>

<!-- RemitAud Response -->
<!ELEMENT RemitAudRs  (Status , RqUID , CustId? ,  (RecCtrlOut? , SelRangeDt? , RemitId* , RemitMsgRec* )? )>

<!-- RemitMsgRec aggregate -->
<!ELEMENT RemitMsgRec  (CustId? , MsgRecDt? ,  (RemitAddRs | RemitModRs | RemitDelRs ) )>

<!-- RemitSync Request -->
<!ELEMENT RemitSyncRq  (RqUID , CustId? , RecCtrlIn? , Token )>

<!-- RemitSync Response -->
<!ELEMENT RemitSyncRs  (Status , RqUID , CustId? ,  (RecCtrlOut? , Token , NewToken , RemitMsgRec* )? )>

<!-- RecPmtAdd Request -->
<!ELEMENT RecPmtAddRq  (RqUID , CustId? , PmtInfo , RecModelInfo , DupChkOverride? )>

<!-- RecPmtAdd Response -->
<!ELEMENT RecPmtAddRs  (Status , RqUID , CustId? ,  (PmtInfo , RecModelInfo , DupChkOverride? , RecPmtRec* , CSPRefId? , SPRefId? )? )>

<!-- RecPmtRec aggregate -->
<!ELEMENT RecPmtRec  (RecPmtId , PmtInfo , RecModelInfo , RemainingInsts )>

<!-- RecPmtId Identifier -->
<!ELEMENT RecPmtId %Identifier;>
<!ATTLIST RecPmtId  %Type_Identifier; >
<!-- RecPmtMod Request -->
<!ELEMENT RecPmtModRq  (RqUID , CustId? , RecPmtId , PmtInfo , RecModelInfo , ModPending? )>

<!-- RecPmtMod Response -->
<!ELEMENT RecPmtModRs  (Status , RqUID , CustId? ,  (PmtInfo , RecModelInfo , DupChkOverride? , RecPmtRec* , CSPRefId? , SPRefId? )? )>

<!-- RecPmtCan Request -->
<!ELEMENT RecPmtCanRq  (RqUID , CustId? , RecPmtId , CascadeDel? )>

<!-- RecPmtCan Response -->
<!ELEMENT RecPmtCanRs  (Status , RqUID , CustId? ,  (RecPmtId , CascadeDel? ,  (RecPmtRec | DependentType+ ) , CSPRefId? , SPRefId? )? )>

<!-- RecPmtInq Request -->
<!ELEMENT RecPmtInqRq  (RqUID , CustId? , RecCtrlIn? , RecPmtId* , CustPayeeId* ,  (DepAcctIdFrom | CardAcctIdFrom )? , Category* , Memo* , BillingAcct* , SelRangeCurAmt? , CSPRefId* , SPRefId* , IncToken? )>

<!-- RecPmtInq Response -->
<!ELEMENT RecPmtInqRs  (Status , RqUID , CustId? ,  (RecCtrlOut? , RecPmtId* , CustPayeeId* ,  (DepAcctIdFrom | CardAcctIdFrom )? , Category* , Memo* , BillingAcct* , SelRangeCurAmt? , CSPRefId* , SPRefId* , RecPmtRec* , Token? )? )>

<!-- RecPmtAud Request -->
<!ELEMENT RecPmtAudRq  (RqUID , CustId? , RecCtrlIn? , SelRangeDt? , Method? , RecPmtId? )>

<!-- RecPmtAud Response -->
<!ELEMENT RecPmtAudRs  (Status , RqUID , CustId? ,  (RecCtrlOut? , SelRangeDt? , Method? , RecPmtId? , RecPmtMsgRec* )? )>

<!-- RecPmtMsgRec aggregate -->
<!ELEMENT RecPmtMsgRec  (CustId? , MsgRecDt? ,  (RecPmtAddRs | RecPmtModRs | RecPmtCanRs ) )>

<!-- RecPmtSync Request -->
<!ELEMENT RecPmtSyncRq  (RqUID , CustId? , RecCtrlIn? , Token )>

<!-- RecPmtSync Response -->
<!ELEMENT RecPmtSyncRs  (Status , RqUID , CustId? ,  (RecCtrlOut? , Token , NewToken , RecPmtMsgRec* )? )>

<!-- PaySvcProfInfo aggregate -->
<!-- XXX BankAcctFromProf renamed to DepAcctIdFromProf - bug in PR Draft -->
<!-- XXX BankAcctToProf renamed to DepAcctIdToProf - bug in PR Draft -->
<!ELEMENT PaySvcProfInfo  (SvcCore , MsgSupt+ , OptSupt* , PrcSched? , DepAcctIdFromProf , DepAcctIdToProf? , PmtModel , DfltDaysToPay , DfltXferDaysToPay , DaysWith , HistRetentionDays , DeliveryMethod* , ModPendingType , RecPmtProf? )>

<!-- PmtModel ClosedEnum -->
<!ELEMENT PmtModel  (#PCDATA )>
<!ATTLIST PmtModel  dt:type        NMTOKEN  #FIXED 'string'
                    dt:enumeration CDATA    #FIXED 'DueDt PrcDt' >
<!--#ENTITY % PmtModel     #Enum("DueDt", "PrcDt")-->
<!-- DfltXferDaysToPay Long -->
<!ELEMENT DfltXferDaysToPay %Long;>
<!ATTLIST DfltXferDaysToPay  %Type_Long; >
<!-- RecPmtProf aggregate -->
<!ELEMENT RecPmtProf  (Freq* , ModPendingType )>

<!--                                     -->
<!-- Presentment Service Messages (Pres) -->
<!--                                     -->
<!ELEMENT PresSvcRq  (SPName? , RqUID , (BillerInqRq | BillInqRq |
BillStatusModRq)*)>

<!ELEMENT PresSvcRs  (Status , SPName? , RqUID , (BillerInqRs |
BillInqRs | BillStatusModRs)*)>

<!-- Presentment Service Common Aggregates -->
<!-- BillerId aggregate -->
<!ELEMENT BillerId  (SPName , BillerNum )>

<!-- BillerRec aggregate -->
<!ELEMENT BillerRec  (BillerId+ , BillerInfo , BillerStatus? , BSPReferTo? )>

<!-- BillerInfo aggregate -->
<!-- XXX edu: Why is there an AND for SecretPrompt, CryptType -->
<!ELEMENT BillerInfo  (Name , BillerContact? , IndustId? , (SecretPrompt, CryptType)*, HistRetentionDays? , CSPCustInfoReq? , BillerPayInfo? , LogoURL? , Logo? , BillerEnrollURL? , BillerAcctIdInfo? , DiscReqd? , DiscDt? , OptSupt* )>

<!--CSPCustInfoReq Boolean -->
<!ELEMENT CSPCustInfoReq %Boolean;>
<!ATTLIST CSPCustInfoReq  %Type_Boolean; >
<!--LogoURL URL -->
<!ELEMENT LogoURL %URL;>
<!ATTLIST LogoURL  %Type_URL; >
<!--Logo Binary -->
<!ELEMENT Logo %Binary;>
<!ATTLIST Logo  %Type_Binary; >
<!--BillerEnrollURL URL -->
<!ELEMENT BillerEnrollURL %URL;>
<!ATTLIST BillerEnrollURL  %Type_URL; >
<!--DiscReqd Boolean -->
<!ELEMENT DiscReqd %Boolean;>
<!ATTLIST DiscReqd  %Type_Boolean; >
<!--DiscDt Date -->
<!ELEMENT DiscDt %Date;>
<!ATTLIST DiscDt  %Type_Date; >
<!-- BillerStatus aggregate -->
<!ELEMENT BillerStatus  (BillerStatusCode , EffDt? , StatusModBy? , Memo? )>

<!-- BillerStatusCode ClosedEnum -->
<!ELEMENT BillerStatusCode  (#PCDATA )>
<!ATTLIST BillerStatusCode  dt:type        NMTOKEN  #FIXED 'string'
                            dt:enumeration CDATA    #FIXED 'Available
                               Deleted Delpend' >
<!-- #ENTITY % BillerStatusCode     #Enum("Available", "Deleted", "Delpend")-->
<!-- BSPReferTo aggregate -->
<!ELEMENT BSPReferTo  (SPName? , OrgContact? )>

<!-- BillerAcctIdInfo aggregate -->
<!ELEMENT BillerAcctIdInfo  (AcctFormat? , AcctMask* , AcctHelpMsg? , AcctRestrictMsg? , AcctValidateURL? )>

<!--AcctFormat NC-1024 -->
<!ELEMENT AcctFormat %NC-1024;>
<!ATTLIST AcctFormat  %Type_NC-1024; >
<!-- XXX Typo in PR Draft.  AcctMask should be NC-32, according to -->
<!-- section 3.1.1 -->
<!--AcctMask C-32 -->
<!-- ELEMENT AcctMask     %C-32; -->
<!-- ATTLIST AcctMask     %Type_C-32; -->
<!--AcctHelpMsg C-Infinite -->
<!ELEMENT AcctHelpMsg %C-Infinite;>
<!ATTLIST AcctHelpMsg  %Type_C-Infinite; >
<!--AcctRestrictMsg C-1024 -->
<!ELEMENT AcctRestrictMsg %C-1024;>
<!ATTLIST AcctRestrictMsg  %Type_C-1024; >
<!--AcctValidateURL URL -->
<!ELEMENT AcctValidateURL %URL;>
<!ATTLIST AcctValidateURL  %Type_URL; >
<!--Bill Status Aggregate -->
<!ELEMENT BillStatus  (BillStatusCode , EffDt? , StatusModBy? , Memo? )>

<!--BillStatusCode Open Enum -->
<!ELEMENT BillStatusCode %OpenEnum;>
<!ATTLIST BillStatusCode  %Type_OpenEnum; >
<!-- BillPmtStatus aggregate -->
<!ELEMENT BillPmtStatus  (PmtId? , BillPmtStatusCode , EffDt? , StatusModBy? , Memo? )>

<!-- BillPmtStatusCode Open Enum -->
<!ELEMENT BillPmtStatusCode %OpenEnum;>
<!ATTLIST BillPmtStatusCode  %Type_OpenEnum; >
<!-- PresAcctId aggregate -->
<!ENTITY % PRESACCTID " (BillingAcct
                       , BillerId )">

<!ELEMENT PresAcctId %PRESACCTID;>

<!-- BillRec aggregate -->
<!ELEMENT BillRec  (BillId , BillInfo , BillStatus? , BillPmtStatus? )>

<!-- BillInfo aggregate -->
<!ELEMENT BillInfo  (BillType , PresAcctId , Memo? , BillSummAmt* , PmtDueDt? , BillDt , OpenDt? , CloseDt? , PmtInst* , NotifyReqd , MustViewDtlToPay? , StmtImage? , BillRefInfo? )>

<!-- BillType Open Enum -->
<!ELEMENT BillType %OpenEnum;>
<!ATTLIST BillType  %Type_OpenEnum; >
<!-- BillSummAmt aggregate -->
<!ELEMENT BillSummAmt  (BillSummAmtId? , BillSummAmtCode? , ShortDesc , Desc? , Memo? , CurAmt , BillSummAmtType , BillSummSubAmt* )>

<!-- BillSummSubAmt aggregate -->
<!ELEMENT BillSummSubAmt  (BillSummAmtId , ShortDesc , Desc? , Memo? , CurAmt , AllocateAllowed? )>

<!-- BillDt Date -->
<!ELEMENT BillDt %Date;>
<!ATTLIST BillDt  %Type_Date; >
<!-- OpenDt Date -->
<!ELEMENT OpenDt %Date;>
<!ATTLIST OpenDt  %Type_Date; >
<!-- CloseDt Date -->
<!ELEMENT CloseDt %Date;>
<!ATTLIST CloseDt  %Type_Date; >
<!-- NotifyReqd Boolean -->
<!ELEMENT NotifyReqd %Boolean;>
<!ATTLIST NotifyReqd  %Type_Boolean; >
<!-- MustViewDtlToPay Boolean -->
<!ELEMENT MustViewDtlToPay %Boolean;>
<!ATTLIST MustViewDtlToPay  %Type_Boolean; >
<!-- BillSummAmtCode Open Enum -->
<!ELEMENT BillSummAmtCode %OpenEnum;>
<!ATTLIST BillSummAmtCode  %Type_OpenEnum; >
<!-- ShortDesc C-15 -->
<!ELEMENT ShortDesc %C-15;>
<!ATTLIST ShortDesc  %Type_C-15; >
<!-- BillSummAmtType Closed Enum -->
<!ELEMENT BillSummAmtType  (#PCDATA )>
<!ATTLIST BillSummAmtType  dt:type        NMTOKEN  #FIXED 'string'
                           dt:enumeration CDATA    #FIXED 'Payable Supplemental InfoOnly' >
<!--#ENTITY % BillSummAmtType     #Enum("Payable", "Supplemental", "InfoOnly")-->
<!-- AllocateAllowed Boolean -->
<!ELEMENT AllocateAllowed %Boolean;>
<!ATTLIST AllocateAllowed  %Type_Boolean; >
<!-- StmtImage aggregate -->
<!ELEMENT StmtImage  (ImageURL , PrefetchURL* , ExpDt? )>

<!-- ImageURL URL -->
<!ELEMENT ImageURL %URL;>
<!ATTLIST ImageURL  %Type_URL; >
<!-- PrefetchURL URL -->
<!ELEMENT PrefetchURL %URL;>
<!ATTLIST PrefetchURL  %Type_URL; >
<!-- BillerInqRq aggregate -->
<!ELEMENT BillerInqRq  (RqUID , CustId? , RecCtrlIn? , BillerId* , Name* , PostAddr* , Phone* , PostalCode* , UpDt? , IndustId* , IncBillerContact? , IncImages? )>

<!-- IncBillerContact Boolean -->
<!ELEMENT IncBillerContact %Boolean;>
<!ATTLIST IncBillerContact  %Type_Boolean; >
<!-- IncImages Boolean -->
<!ELEMENT IncImages %Boolean;>
<!ATTLIST IncImages  %Type_Boolean; >
<!-- BillerInqRs aggregate -->
<!ELEMENT BillerInqRs  (Status , RqUID , CustId? , RecCtrlOut? , BillerId* , Name* , PostAddr* , Phone* , PostalCode* , UpDt? , IndustId* , IncBillerContact? , IncImages? , IncBillerContact? , IncImages? , NewUpDt? , BillerRec* )>

<!-- NewBillerDirDt TimeStamp -->
<!ELEMENT NewUpDt %TimeStamp;>
<!ATTLIST NewUpDt  %Type_TimeStamp; >
<!-- BillInqRq Aggregate -->
<!ELEMENT BillInqRq  (RqUID , CustId? , RecCtrlIn? , SPName , SelRangeDt? , BillId* , BillerId* , BillType* , BillStatusCode* , BillPmtStatusCode* , NotifyWilling? , IncCounts? , IncSummary? )>

<!-- NotifyWilling Boolean -->
<!ELEMENT NotifyWilling %Boolean;>
<!ATTLIST NotifyWilling  %Type_Boolean; >
<!-- IncCounts Boolean -->
<!ELEMENT IncCounts %Boolean;>
<!ATTLIST IncCounts  %Type_Boolean; >
<!-- IncSummary Boolean -->
<!ELEMENT IncSummary %Boolean;>
<!ATTLIST IncSummary  %Type_Boolean; >
<!-- BillInqRs Aggregate -->
<!ELEMENT BillInqRs  (Status , RqUID , CustId? ,  (RecCtrlOut? , SelRangeDt? , BillId* , BillerId* , BillStatusCode* , BillPmtStatusCode* , NotifyWilling? , IncCounts? , IncSummary? , BillRec* , BillCounts* )? )>

<!-- BillCounts Aggregate -->
<!ELEMENT BillCounts  (BillStatusCounts* , BillPmtStatusCounts* )>

<!-- BillStatusCounts Aggregate -->
<!ELEMENT BillStatusCounts  (BillStatusCode , Count )>

<!-- BillPmtStatusCounts Aggregate -->
<!ELEMENT BillPmtStatusCounts  (BillPmtStatusCode , Count )>

<!-- BillStatusModeRq Aggregate -->
<!ELEMENT BillStatusModRq  (RqUID , CustId? , BillId ,  (BillStatus | BillPmtStatus |  (BillStatus , BillPmtStatus ) ) )>

<!-- BillStatusModRs Aggregate -->
<!ELEMENT BillStatusModRs  (Status , RqUID , CustId? ,  (BillId ,  (BillStatus | BillPmtStatus |  (BillStatus , BillPmtStatus ) ) , CSPRefId? , SPRefId? )? )>

<!-- PresSvcProfInfo aggregate -->
<!ELEMENT PresSvcProfInfo  (SvcCore , MsgSupt+ , OptSupt* , PrcSched? )>

<!-- BankAcctStatusCode ClosedEnum -->
<!ELEMENT BankAcctStatusCode  (#PCDATA )>
<!ATTLIST BankAcctStatusCode  dt:type        NMTOKEN  #FIXED 'string'
                              dt:enumeration CDATA    #FIXED 'Open Closed Inactive NotAvail' >
<!ELEMENT PresAcctRec  (PresAcctId , PresAcctInfo , PresAcctStatus? )>

<!ELEMENT PresAcctInfo  (StdPayeeId? )>

<!ELEMENT PresAcctStatus  (PresAcctStatusCode , StatusDesc? , EffDt? , StatusModBy? )>

<!-- PresAcctStatusCode ClosedEnum-->
<!ELEMENT PresAcctStatusCode  (#PCDATA )>
<!ATTLIST PresAcctStatusCode  dt:type        NMTOKEN  #FIXED 'string'
                              dt:enumeration CDATA    #FIXED 'Open Closed Inactive NotAvail' >
<!-- ENTITY % PresAcctStatusCode     #Enum("Open", "Closed", "Inactive", "NotAvail")-->
<!ELEMENT ChkOrdRec  (ChkOrdId , ChkOrdInfo , ChkOrdStatus )>

<!-- ChkOrdId Identifier -->
<!ELEMENT ChkOrdId %Identifier;>
<!ATTLIST ChkOrdId  %Type_Identifier; >
<!ELEMENT ChkOrdInfo  ( (DepAcctId | CardAcctId | LoanAcctId ) , ChkPrint? , ShipTo? , Count? , ChkNumStart? , ChkBkStyleId? , DeliveryMethod? )>

<!ELEMENT ChkOrdStatus  (ChkOrdStatusCode )>

<!-- ChkOrdStatusCode Open Enum -->
<!ELEMENT ChkOrdStatusCode %OpenEnum;>
<!ATTLIST ChkOrdStatusCode  %Type_OpenEnum; >
<!ELEMENT DepBkOrdRec  (DepBkOrdId , DepBkOrdInfo , DepBkOrdStatus )>

<!-- DepBkOrdId Identifier -->
<!ELEMENT DepBkOrdId %Identifier;>
<!ATTLIST DepBkOrdId  %Type_Identifier; >
<!ELEMENT DepBkOrdInfo  (DepAcctId , Count? , DepBkStyleId? , DeliveryMethod? )>

<!ELEMENT DepBkOrdStatus  (DepBkOrdStatusCode , EffDt , StatusModBy? )>

<!-- DepBkOrdStatusCode ClosedEnum-->
<!ELEMENT DepBkOrdStatusCode  (#PCDATA )>
<!ATTLIST DepBkOrdStatusCode  dt:type        NMTOKEN  #FIXED 'string'
                              dt:enumeration CDATA    #FIXED 'TO DO' >
<!ELEMENT StdPayeeInfo  (Name? , PostAddr? , AcctMask* , IndustId? , DaysToPay )>

<!-- PmtRemitName C-40 -->
<!ELEMENT PmtRemitName %C-40;>
<!ATTLIST PmtRemitName  %Type_C-40; >
<!-- PmtRemitAddr aggregate -->
<!ELEMENT PmtRemitAddr %ADDRESS;>

<!ELEMENT RemitStatusModRq  (RqUID , CustId? , RemitId , RemitStatus )>

<!ELEMENT RemitStatusModRs  (Status , RqUID , CustId? , PmtId , RemitStatus , CSPRefId? , SPRefId? )>