https://issues.shibboleth.net/jira/browse/CPPOST-49
[shibboleth/cpp-opensaml.git] / saml / saml2 / core / impl / Protocols20Impl.cpp
1 /*
2  *  Copyright 2001-2010 Internet2
3  * 
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 /**
18  * Protocols20Impl.cpp
19  * 
20  * Implementation classes for SAML 2.0 Protocols schema.
21  */
22
23 #include "internal.h"
24 #include "exceptions.h"
25 #include "saml2/core/Protocols.h"
26 #include "signature/ContentReference.h"
27
28 #include <xmltooling/AbstractComplexElement.h>
29 #include <xmltooling/AbstractSimpleElement.h>
30 #include <xmltooling/encryption/Encryption.h>
31 #include <xmltooling/impl/AnyElement.h>
32 #include <xmltooling/io/AbstractXMLObjectMarshaller.h>
33 #include <xmltooling/io/AbstractXMLObjectUnmarshaller.h>
34 #include <xmltooling/signature/Signature.h>
35 #include <xmltooling/util/DateTime.h>
36 #include <xmltooling/util/XMLHelper.h>
37
38 #include <ctime>
39 #include <xercesc/util/XMLUniDefs.hpp>
40
41 using namespace opensaml::saml2p;
42 using namespace opensaml::saml2;
43 using namespace xmlsignature;
44 using namespace xmlencryption;
45 using namespace xmltooling;
46 using namespace std;
47 using xmlconstants::XMLSIG_NS;
48 using xmlconstants::XMLENC_NS;
49 using xmlconstants::XML_BOOL_NULL;
50 using samlconstants::SAML20_NS;
51 using samlconstants::SAML20P_NS;
52
53 #if defined (_MSC_VER)
54     #pragma warning( push )
55     #pragma warning( disable : 4250 4251 )
56 #endif
57
58 namespace opensaml {
59     namespace saml2p {
60
61         DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,Artifact);
62         DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,GetComplete);
63         DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,NewID);
64         DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,RequesterID);
65         DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,SessionIndex);
66         DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,StatusMessage);
67
68         DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,RespondTo);
69
70         //TODO need unit test for this, using objects from another namespace
71         class SAML_DLLLOCAL ExtensionsImpl : public virtual Extensions,
72              public AbstractComplexElement,
73              public AbstractDOMCachingXMLObject,
74              public AbstractXMLObjectMarshaller,
75              public AbstractXMLObjectUnmarshaller
76         {
77         public:
78             virtual ~ExtensionsImpl() {}
79     
80             ExtensionsImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
81                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
82             }
83                 
84             ExtensionsImpl(const ExtensionsImpl& src)
85                     : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
86                 VectorOf(XMLObject) v=getUnknownXMLObjects();
87                 for (vector<XMLObject*>::const_iterator i=src.m_UnknownXMLObjects.begin(); i!=src.m_UnknownXMLObjects.end(); ++i)
88                     v.push_back((*i)->clone());
89             }
90             
91             IMPL_XMLOBJECT_CLONE(Extensions);
92             IMPL_XMLOBJECT_CHILDREN(UnknownXMLObject,m_children.end());
93     
94         protected:
95             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
96                 // Unknown child.
97                 const XMLCh* nsURI=root->getNamespaceURI();
98                 if (!XMLString::equals(nsURI,SAML20P_NS) && nsURI && *nsURI) {
99                     getUnknownXMLObjects().push_back(childXMLObject);
100                     return;
101                 }
102                 
103                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
104             }
105         };
106
107         class SAML_DLLLOCAL StatusCodeImpl : public virtual StatusCode,
108              public AbstractComplexElement,
109              public AbstractDOMCachingXMLObject,
110              public AbstractXMLObjectMarshaller,
111              public AbstractXMLObjectUnmarshaller
112         {
113             void init() {
114                 m_Value=nullptr;
115                 m_StatusCode=nullptr;
116                 m_children.push_back(nullptr);
117                 m_pos_StatusCode=m_children.begin();
118             }
119             public:
120                 virtual ~StatusCodeImpl() {
121                     XMLString::release(&m_Value);
122                 }
123
124                 StatusCodeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
125                     : AbstractXMLObject(nsURI, localName, prefix, schemaType)
126                 {
127                         init();
128                 }
129
130                 StatusCodeImpl(const StatusCodeImpl& src)
131                         : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
132                     init();
133                     setValue(src.getValue());
134                     if (src.getStatusCode())
135                         setStatusCode(src.getStatusCode()->cloneStatusCode());
136                 }
137
138                 IMPL_XMLOBJECT_CLONE(StatusCode);
139                 IMPL_STRING_ATTRIB(Value);
140                 IMPL_TYPED_CHILD(StatusCode);
141
142             protected:
143                 void marshallAttributes(DOMElement* domElement) const {
144                     MARSHALL_STRING_ATTRIB(Value,VALUE,nullptr);
145                 }
146
147                 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
148                     PROC_TYPED_CHILD(StatusCode,SAML20P_NS,false);
149                     AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
150                 }
151
152                 void processAttribute(const DOMAttr* attribute) {
153                     PROC_STRING_ATTRIB(Value,VALUE,nullptr);
154                     AbstractXMLObjectUnmarshaller::processAttribute(attribute);
155                 }
156         };
157
158         //TODO need unit tests for non-SAML namespace children
159         class SAML_DLLLOCAL StatusDetailImpl : public virtual StatusDetail,
160             public AbstractComplexElement,
161             public AbstractDOMCachingXMLObject,
162             public AbstractXMLObjectMarshaller,
163             public AbstractXMLObjectUnmarshaller
164         {
165             public:
166                 virtual ~StatusDetailImpl() {}
167
168                 StatusDetailImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
169                     : AbstractXMLObject(nsURI, localName, prefix, schemaType) { }
170
171                 StatusDetailImpl(const StatusDetailImpl& src)
172                         : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
173                     VectorOf(XMLObject) v=getUnknownXMLObjects();
174                     for (vector<XMLObject*>::const_iterator i=src.m_UnknownXMLObjects.begin(); i!=src.m_UnknownXMLObjects.end(); ++i)
175                         v.push_back((*i)->clone());
176                 }
177
178                 IMPL_XMLOBJECT_CLONE(StatusDetail);
179                 IMPL_XMLOBJECT_CHILDREN(UnknownXMLObject,m_children.end());
180
181             protected:
182                 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
183                     getUnknownXMLObjects().push_back(childXMLObject);
184                 }
185         };
186
187
188         class SAML_DLLLOCAL StatusImpl : public virtual Status,
189              public AbstractComplexElement,
190              public AbstractDOMCachingXMLObject,
191              public AbstractXMLObjectMarshaller,
192              public AbstractXMLObjectUnmarshaller
193         {
194             void init() {
195                 m_StatusCode=nullptr;
196                 m_StatusMessage=nullptr;
197                 m_StatusDetail=nullptr;
198                 m_children.push_back(nullptr);
199                 m_children.push_back(nullptr);
200                 m_children.push_back(nullptr);
201                 m_pos_StatusCode=m_children.begin();
202                 m_pos_StatusMessage=m_pos_StatusCode;
203                 ++m_pos_StatusMessage;
204                 m_pos_StatusDetail=m_pos_StatusMessage;
205                 ++m_pos_StatusDetail;
206             }
207         public:
208             virtual ~StatusImpl() { }
209     
210             StatusImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
211                     : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
212                 init();
213             }
214                 
215             StatusImpl(const StatusImpl& src)
216                     : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
217                 init();
218                 if (src.getStatusCode())
219                     setStatusCode(src.getStatusCode()->cloneStatusCode());
220                 if (src.getStatusMessage())
221                     setStatusMessage(src.getStatusMessage()->cloneStatusMessage());
222                 if (src.getStatusDetail())
223                     setStatusDetail(src.getStatusDetail()->cloneStatusDetail());
224             }
225             
226             IMPL_XMLOBJECT_CLONE(Status);
227             IMPL_TYPED_CHILD(StatusCode);
228             IMPL_TYPED_CHILD(StatusMessage);
229             IMPL_TYPED_CHILD(StatusDetail);
230     
231         protected:
232     
233             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
234                 PROC_TYPED_CHILD(StatusCode,SAML20P_NS,false);
235                 PROC_TYPED_CHILD(StatusMessage,SAML20P_NS,false);
236                 PROC_TYPED_CHILD(StatusDetail,SAML20P_NS,false);
237                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
238             }
239     
240         };
241
242
243         class SAML_DLLLOCAL RequestAbstractTypeImpl : public virtual RequestAbstractType,
244             public AbstractComplexElement,
245             public AbstractDOMCachingXMLObject,
246             public AbstractXMLObjectMarshaller,
247             public AbstractXMLObjectUnmarshaller
248         {
249             void init() {
250                 m_ID=nullptr;
251                 m_Version=nullptr;
252                 m_IssueInstant=nullptr;
253                 m_Destination=nullptr;
254                 m_Consent=nullptr;
255                 m_Issuer=nullptr;
256                 m_Signature=nullptr;
257                 m_Extensions=nullptr;
258                 m_children.push_back(nullptr);
259                 m_children.push_back(nullptr);
260                 m_children.push_back(nullptr);
261                 m_pos_Issuer=m_children.begin();
262                 m_pos_Signature=m_pos_Issuer;
263                 ++m_pos_Signature;
264                 m_pos_Extensions=m_pos_Signature;
265                 ++m_pos_Extensions;
266             }
267         protected:
268             RequestAbstractTypeImpl() {
269                 init();
270             }
271         public:
272             virtual ~RequestAbstractTypeImpl() {
273                 XMLString::release(&m_ID);
274                 XMLString::release(&m_Version);
275                 XMLString::release(&m_Destination);
276                 XMLString::release(&m_Consent);
277                 delete m_IssueInstant;
278             }
279     
280             RequestAbstractTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
281                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
282                 init();
283             }
284                 
285             RequestAbstractTypeImpl(const RequestAbstractTypeImpl& src)
286                     : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
287                 init();
288                 setID(src.getID());
289                 setVersion(src.getVersion());
290                 setIssueInstant(src.getIssueInstant());
291                 setDestination(src.getDestination());
292                 setConsent(src.getConsent());
293                 if (src.getIssuer())
294                     setIssuer(src.getIssuer()->cloneIssuer());
295                 if (src.getSignature())
296                     setSignature(src.getSignature()->cloneSignature());
297                 if (src.getExtensions())
298                     setExtensions(src.getExtensions()->cloneExtensions());
299             }
300             
301             //IMPL_TYPED_CHILD(Signature);
302             // Need customized setter.
303         protected:
304             Signature* m_Signature;
305             list<XMLObject*>::iterator m_pos_Signature;
306         public:
307             Signature* getSignature() const {
308                 return m_Signature;
309             }
310             
311             void setSignature(Signature* sig) {
312                 prepareForAssignment(m_Signature,sig);
313                 *m_pos_Signature=m_Signature=sig;
314                 // Sync content reference back up.
315                 if (m_Signature)
316                     m_Signature->setContentReference(new opensaml::ContentReference(*this));
317             }
318             
319             IMPL_STRING_ATTRIB(Version);
320             IMPL_ID_ATTRIB_EX(ID,ID,nullptr);
321             IMPL_DATETIME_ATTRIB(IssueInstant,0);
322             IMPL_STRING_ATTRIB(Destination);
323             IMPL_STRING_ATTRIB(Consent);
324             IMPL_TYPED_FOREIGN_CHILD(Issuer,saml2);
325             IMPL_TYPED_CHILD(Extensions);
326     
327         protected:
328             void marshallAttributes(DOMElement* domElement) const {
329                 if (!m_Version)
330                     const_cast<RequestAbstractTypeImpl*>(this)->m_Version=XMLString::transcode("2.0");
331                 MARSHALL_STRING_ATTRIB(Version,VER,nullptr);
332                 if (!m_ID)
333                     const_cast<RequestAbstractTypeImpl*>(this)->m_ID=SAMLConfig::getConfig().generateIdentifier();
334                 MARSHALL_ID_ATTRIB(ID,ID,nullptr);
335                 if (!m_IssueInstant) {
336                     const_cast<RequestAbstractTypeImpl*>(this)->m_IssueInstantEpoch=time(nullptr);
337                     const_cast<RequestAbstractTypeImpl*>(this)->m_IssueInstant=new DateTime(m_IssueInstantEpoch);
338                 }
339                 MARSHALL_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,nullptr);
340                 MARSHALL_STRING_ATTRIB(Destination,DESTINATION,nullptr);
341                 MARSHALL_STRING_ATTRIB(Consent,CONSENT,nullptr);
342             }
343     
344             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
345                 PROC_TYPED_FOREIGN_CHILD(Issuer,saml2,SAML20_NS,false);
346                 PROC_TYPED_FOREIGN_CHILD(Signature,xmlsignature,XMLSIG_NS,false);
347                 PROC_TYPED_CHILD(Extensions,SAML20P_NS,false);
348                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
349             }
350     
351             void processAttribute(const DOMAttr* attribute) {
352                 PROC_ID_ATTRIB(ID,ID,nullptr);
353                 PROC_STRING_ATTRIB(Version,VER,nullptr);
354                 PROC_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,nullptr);
355                 PROC_STRING_ATTRIB(Destination,DESTINATION,nullptr);
356                 PROC_STRING_ATTRIB(Consent,CONSENT,nullptr);
357                 AbstractXMLObjectUnmarshaller::processAttribute(attribute);
358             }
359         };
360
361
362         class SAML_DLLLOCAL AssertionIDRequestImpl : public virtual AssertionIDRequest, public RequestAbstractTypeImpl
363         {
364         public:
365             virtual ~AssertionIDRequestImpl() { }
366     
367             AssertionIDRequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
368                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) { }
369                 
370             AssertionIDRequestImpl(const AssertionIDRequestImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
371                 VectorOf(AssertionIDRef) v=getAssertionIDRefs();
372                 for (vector<AssertionIDRef*>::const_iterator i=src.m_AssertionIDRefs.begin(); i!=src.m_AssertionIDRefs.end(); i++) {
373                     if (*i) {                               
374                         v.push_back((*i)->cloneAssertionIDRef());
375                     }
376                 }
377
378             }
379             
380             IMPL_XMLOBJECT_CLONE(AssertionIDRequest);
381             RequestAbstractType* cloneRequestAbstractType() const {
382                 return cloneAssertionIDRequest();
383             }
384
385             IMPL_TYPED_FOREIGN_CHILDREN(AssertionIDRef,saml2,m_children.end());
386     
387         protected:
388             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
389                 PROC_TYPED_FOREIGN_CHILDREN(AssertionIDRef,saml2,SAML20_NS,false);
390                 RequestAbstractTypeImpl::processChildElement(childXMLObject,root);
391             }
392         };
393
394         class SAML_DLLLOCAL SubjectQueryImpl : public virtual SubjectQuery, public RequestAbstractTypeImpl
395         {
396             void init()
397             {
398                 m_Subject = nullptr;
399                 m_children.push_back(nullptr);
400                 m_pos_Subject = m_pos_Extensions;
401                 ++m_pos_Subject;
402             }
403         protected:
404             SubjectQueryImpl() {
405                 init();
406             }
407         public:
408             virtual ~SubjectQueryImpl() { }
409     
410             SubjectQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
411                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
412             { 
413                 init();
414             }
415                 
416             SubjectQueryImpl(const SubjectQueryImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
417                 init();
418                 if (src.getSubject())
419                     setSubject(src.getSubject()->cloneSubject());
420             }
421             
422             IMPL_TYPED_FOREIGN_CHILD(Subject,saml2);
423     
424         protected:
425             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
426                 PROC_TYPED_FOREIGN_CHILD(Subject,saml2,SAML20_NS,false);
427                 RequestAbstractTypeImpl::processChildElement(childXMLObject,root);
428             }
429         };
430
431
432         class SAML_DLLLOCAL RequestedAuthnContextImpl : public virtual RequestedAuthnContext,
433             public AbstractComplexElement,
434             public AbstractDOMCachingXMLObject,
435             public AbstractXMLObjectMarshaller,
436             public AbstractXMLObjectUnmarshaller
437         {
438             void init() {
439                 m_Comparison=nullptr;
440             }
441         public:
442             virtual ~RequestedAuthnContextImpl() {
443                 XMLString::release(&m_Comparison);
444             }
445     
446             RequestedAuthnContextImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
447                     : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
448                 init();
449             }
450                 
451             RequestedAuthnContextImpl(const RequestedAuthnContextImpl& src)
452                     : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
453                 init();
454                 setComparison(src.getComparison());
455                 for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
456                     if (*i) {
457                         AuthnContextClassRef* classref=dynamic_cast<AuthnContextClassRef*>(*i);
458                         if (classref) {
459                             getAuthnContextClassRefs().push_back(classref->cloneAuthnContextClassRef());
460                             continue;
461                         }
462
463                         AuthnContextDeclRef* declref=dynamic_cast<AuthnContextDeclRef*>(*i);
464                         if (declref) {
465                             getAuthnContextDeclRefs().push_back(declref->cloneAuthnContextDeclRef());
466                             continue;
467                         }
468                     }
469                 }
470             }
471             
472             IMPL_XMLOBJECT_CLONE(RequestedAuthnContext);
473             IMPL_STRING_ATTRIB(Comparison);
474             IMPL_TYPED_FOREIGN_CHILDREN(AuthnContextClassRef,saml2,m_children.end());
475             IMPL_TYPED_FOREIGN_CHILDREN(AuthnContextDeclRef,saml2,m_children.end());
476     
477         protected:
478             void marshallAttributes(DOMElement* domElement) const {
479                 MARSHALL_STRING_ATTRIB(Comparison,COMPARISON,nullptr);
480             }
481     
482             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
483                 PROC_TYPED_FOREIGN_CHILDREN(AuthnContextClassRef,saml2,SAML20_NS,false);
484                 PROC_TYPED_FOREIGN_CHILDREN(AuthnContextDeclRef,saml2,SAML20_NS,false);
485                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
486             }
487     
488             void processAttribute(const DOMAttr* attribute) {
489                 PROC_STRING_ATTRIB(Comparison,COMPARISON,nullptr);
490                 AbstractXMLObjectUnmarshaller::processAttribute(attribute);
491             }
492         };
493
494
495         class SAML_DLLLOCAL AuthnQueryImpl : public virtual AuthnQuery, public SubjectQueryImpl
496         {
497             void init() {
498                 m_SessionIndex=nullptr;
499                 m_RequestedAuthnContext=nullptr;
500                 m_children.push_back(nullptr);
501                 m_pos_RequestedAuthnContext = m_pos_Subject;
502                 ++m_pos_RequestedAuthnContext;
503                 
504             }
505         public:
506             virtual ~AuthnQueryImpl() {
507                 XMLString::release(&m_SessionIndex);
508             }
509     
510             AuthnQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
511                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
512             {
513                 init();
514             }
515                 
516             AuthnQueryImpl(const AuthnQueryImpl& src) : AbstractXMLObject(src), SubjectQueryImpl(src) {
517                 init();
518                 setSessionIndex(src.getSessionIndex());
519                 if (src.getRequestedAuthnContext())
520                     setRequestedAuthnContext(src.getRequestedAuthnContext()->cloneRequestedAuthnContext());
521             }
522             
523             IMPL_XMLOBJECT_CLONE(AuthnQuery);
524             SubjectQuery* cloneSubjectQuery() const {
525                 return cloneAuthnQuery();
526             }
527             RequestAbstractType* cloneRequestAbstractType() const {
528                 return cloneAuthnQuery();
529             }
530
531             IMPL_STRING_ATTRIB(SessionIndex);
532             IMPL_TYPED_CHILD(RequestedAuthnContext);
533     
534         protected:
535             void marshallAttributes(DOMElement* domElement) const {
536                 MARSHALL_STRING_ATTRIB(SessionIndex,SESSIONINDEX,nullptr);
537                 SubjectQueryImpl::marshallAttributes(domElement);
538             }
539     
540             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
541                 PROC_TYPED_CHILD(RequestedAuthnContext,SAML20P_NS,false);
542                 SubjectQueryImpl::processChildElement(childXMLObject,root);
543             }
544             void processAttribute(const DOMAttr* attribute) {
545                 PROC_STRING_ATTRIB(SessionIndex,SESSIONINDEX,nullptr);
546                 SubjectQueryImpl::processAttribute(attribute);
547             }
548         };
549
550         class SAML_DLLLOCAL AttributeQueryImpl : public virtual AttributeQuery, public SubjectQueryImpl
551         {
552         public:
553             virtual ~AttributeQueryImpl() { }
554     
555             AttributeQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
556                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) { }
557                 
558             AttributeQueryImpl(const AttributeQueryImpl& src) : AbstractXMLObject(src), SubjectQueryImpl(src) {
559                 for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
560                     if (*i) {
561                         Attribute* attrib=dynamic_cast<Attribute*>(*i);
562                         if (attrib) {
563                             getAttributes().push_back(attrib->cloneAttribute());
564                             continue;
565                         }
566                     }
567                 }
568
569             }
570             
571             IMPL_XMLOBJECT_CLONE(AttributeQuery);
572             SubjectQuery* cloneSubjectQuery() const {
573                 return cloneAttributeQuery();
574             }
575             RequestAbstractType* cloneRequestAbstractType() const {
576                 return cloneAttributeQuery();
577             }
578
579             IMPL_TYPED_FOREIGN_CHILDREN(Attribute,saml2,m_children.end());
580     
581         protected:
582             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
583                 PROC_TYPED_FOREIGN_CHILDREN(Attribute,saml2,SAML20_NS,false);
584                 SubjectQueryImpl::processChildElement(childXMLObject,root);
585             }
586         };
587
588         class SAML_DLLLOCAL AuthzDecisionQueryImpl : public virtual AuthzDecisionQuery, public SubjectQueryImpl
589         {
590             void init() {
591                 m_Resource=nullptr;
592                 m_Evidence=nullptr;
593                 m_children.push_back(nullptr);
594                 m_pos_Evidence=m_pos_Subject;
595                 ++m_pos_Evidence;
596                 
597             }
598         public:
599             virtual ~AuthzDecisionQueryImpl() {
600                 XMLString::release(&m_Resource);
601             }
602     
603             AuthzDecisionQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
604                     : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
605                 init();
606             }
607                 
608             AuthzDecisionQueryImpl(const AuthzDecisionQueryImpl& src) : AbstractXMLObject(src), SubjectQueryImpl(src) {
609                 init();
610                 setResource(src.getResource());
611                 if (src.getEvidence())
612                     setEvidence(src.getEvidence()->cloneEvidence());
613                 for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
614                     if (*i) {
615                         Action* action=dynamic_cast<Action*>(*i);
616                         if (action) {
617                             getActions().push_back(action->cloneAction());
618                             continue;
619                         }
620                     }
621                 }
622             }
623             
624             IMPL_XMLOBJECT_CLONE(AuthzDecisionQuery);
625             SubjectQuery* cloneSubjectQuery() const {
626                 return cloneAuthzDecisionQuery();
627             }
628             RequestAbstractType* cloneRequestAbstractType() const {
629                 return cloneAuthzDecisionQuery();
630             }
631
632             IMPL_STRING_ATTRIB(Resource);
633             IMPL_TYPED_FOREIGN_CHILDREN(Action,saml2,m_pos_Evidence);
634             IMPL_TYPED_FOREIGN_CHILD(Evidence,saml2);
635     
636         protected:
637             void marshallAttributes(DOMElement* domElement) const {
638                 MARSHALL_STRING_ATTRIB(Resource,RESOURCE,nullptr);
639                 SubjectQueryImpl::marshallAttributes(domElement);
640             }
641     
642             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
643                 PROC_TYPED_FOREIGN_CHILD(Evidence,saml2,SAML20_NS,false);
644                 PROC_TYPED_FOREIGN_CHILDREN(Action,saml2,SAML20_NS,false);
645                 SubjectQueryImpl::processChildElement(childXMLObject,root);
646             }
647             void processAttribute(const DOMAttr* attribute) {
648                 PROC_STRING_ATTRIB(Resource,RESOURCE,nullptr);
649                 SubjectQueryImpl::processAttribute(attribute);
650             }
651         };
652
653         class SAML_DLLLOCAL NameIDPolicyImpl : public virtual NameIDPolicy,
654             public AbstractSimpleElement,
655             public AbstractDOMCachingXMLObject,
656             public AbstractXMLObjectMarshaller,
657             public AbstractXMLObjectUnmarshaller
658         {
659             void init() {
660                 m_Format=nullptr;
661                 m_SPNameQualifier=nullptr;
662                 m_AllowCreate=XML_BOOL_NULL;
663             }
664             public:
665                 virtual ~NameIDPolicyImpl()
666                 {
667                     XMLString::release(&m_Format);
668                     XMLString::release(&m_SPNameQualifier);
669                 }
670
671                 NameIDPolicyImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
672                     : AbstractXMLObject(nsURI, localName, prefix, schemaType)
673                 {
674                         init();
675                 }
676
677                 NameIDPolicyImpl(const NameIDPolicyImpl& src)
678                         : AbstractXMLObject(src), AbstractSimpleElement(src), AbstractDOMCachingXMLObject(src) {
679                     init();
680                     setFormat(src.getFormat());
681                     setSPNameQualifier(src.getSPNameQualifier());
682                     AllowCreate(m_AllowCreate);
683                 }
684
685                 IMPL_XMLOBJECT_CLONE(NameIDPolicy);
686                 IMPL_STRING_ATTRIB(Format);
687                 IMPL_STRING_ATTRIB(SPNameQualifier);
688                 IMPL_BOOLEAN_ATTRIB(AllowCreate);
689
690             protected:
691                 void marshallAttributes(DOMElement* domElement) const {
692                     MARSHALL_STRING_ATTRIB(Format,FORMAT,nullptr);
693                     MARSHALL_STRING_ATTRIB(SPNameQualifier,SPNAMEQUALIFIER,nullptr);
694                     MARSHALL_BOOLEAN_ATTRIB(AllowCreate,ALLOWCREATE,nullptr);
695                 }
696
697                 void processAttribute(const DOMAttr* attribute) {
698                     PROC_STRING_ATTRIB(Format,FORMAT,nullptr);
699                     PROC_STRING_ATTRIB(SPNameQualifier,SPNAMEQUALIFIER,nullptr);
700                     PROC_BOOLEAN_ATTRIB(AllowCreate,ALLOWCREATE,nullptr);
701                     AbstractXMLObjectUnmarshaller::processAttribute(attribute);
702                 }
703         };
704
705         class SAML_DLLLOCAL IDPEntryImpl : public virtual IDPEntry,
706             public AbstractSimpleElement,
707             public AbstractDOMCachingXMLObject,
708             public AbstractXMLObjectMarshaller,
709             public AbstractXMLObjectUnmarshaller
710         {
711             void init() {
712                 m_ProviderID=nullptr;
713                 m_Name=nullptr;
714                 m_Loc=nullptr;
715             }
716             public:
717                 virtual ~IDPEntryImpl()
718                 {
719                     XMLString::release(&m_ProviderID);
720                     XMLString::release(&m_Name);
721                     XMLString::release(&m_Loc);
722                 }
723
724                 IDPEntryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
725                     : AbstractXMLObject(nsURI, localName, prefix, schemaType)
726                 {
727                         init();
728                 }
729
730                 IDPEntryImpl(const IDPEntryImpl& src)
731                         : AbstractXMLObject(src), AbstractSimpleElement(src), AbstractDOMCachingXMLObject(src) {
732                     init();
733                     setProviderID(src.getProviderID());
734                     setName(src.getName());
735                     setLoc(src.getLoc());
736                 }
737
738                 IMPL_XMLOBJECT_CLONE(IDPEntry);
739                 IMPL_STRING_ATTRIB(ProviderID);
740                 IMPL_STRING_ATTRIB(Name);
741                 IMPL_STRING_ATTRIB(Loc);
742
743             protected:
744                 void marshallAttributes(DOMElement* domElement) const {
745                     MARSHALL_STRING_ATTRIB(ProviderID,PROVIDERID,nullptr);
746                     MARSHALL_STRING_ATTRIB(Name,NAME,nullptr);
747                     MARSHALL_STRING_ATTRIB(Loc,LOC,nullptr);
748                 }
749
750                 void processAttribute(const DOMAttr* attribute) {
751                     PROC_STRING_ATTRIB(ProviderID,PROVIDERID,nullptr);
752                     PROC_STRING_ATTRIB(Name,NAME,nullptr);
753                     PROC_STRING_ATTRIB(Loc,LOC,nullptr);
754                     AbstractXMLObjectUnmarshaller::processAttribute(attribute);
755                 }
756         };
757
758         class SAML_DLLLOCAL IDPListImpl : public virtual IDPList,
759             public AbstractComplexElement,
760             public AbstractDOMCachingXMLObject,
761             public AbstractXMLObjectMarshaller,
762             public AbstractXMLObjectUnmarshaller
763         {
764             void init() {
765                 m_GetComplete=nullptr;
766                 m_children.push_back(nullptr);
767                 m_pos_GetComplete=m_children.begin();
768                 
769             }
770         public:
771             virtual ~IDPListImpl() { }
772     
773             IDPListImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
774                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
775             {
776                 init();
777             }
778                 
779             IDPListImpl(const IDPListImpl& src)
780                     : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
781                 init();
782                 if (src.getGetComplete())
783                     setGetComplete(src.getGetComplete()->cloneGetComplete());
784                 for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
785                     if (*i) {
786                         IDPEntry* entry=dynamic_cast<IDPEntry*>(*i);
787                         if (entry) {
788                             getIDPEntrys().push_back(entry->cloneIDPEntry());
789                             continue;
790                         }
791                     }
792                 }
793             }
794             
795             IMPL_XMLOBJECT_CLONE(IDPList);
796             IMPL_TYPED_CHILDREN(IDPEntry,m_pos_GetComplete);
797             IMPL_TYPED_CHILD(GetComplete);
798     
799         protected:
800             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
801                 PROC_TYPED_CHILDREN(IDPEntry,SAML20P_NS,false);
802                 PROC_TYPED_CHILD(GetComplete,SAML20P_NS,false);
803                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
804             }
805         };
806
807
808         class SAML_DLLLOCAL ScopingImpl : public virtual Scoping,
809             public AbstractComplexElement,
810             public AbstractDOMCachingXMLObject,
811             public AbstractXMLObjectMarshaller,
812             public AbstractXMLObjectUnmarshaller
813         {
814             void init() {
815                 m_ProxyCount=nullptr;
816                 m_IDPList=nullptr;
817                 m_children.push_back(nullptr);
818                 m_pos_IDPList=m_children.begin();
819                 
820             }
821         public:
822             virtual ~ScopingImpl() {
823                 XMLString::release(&m_ProxyCount); 
824             }
825     
826             ScopingImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
827                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
828             {
829                 init();
830             }
831                 
832             ScopingImpl(const ScopingImpl& src)
833                     : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
834                 init();
835                 setProxyCount(m_ProxyCount);
836                 if (src.getIDPList())
837                     setIDPList(src.getIDPList()->cloneIDPList());
838                 for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
839                     if (*i) {
840                         RequesterID* reqid =dynamic_cast<RequesterID*>(*i);
841                         if (reqid) {
842                             getRequesterIDs().push_back(reqid->cloneRequesterID());
843                             continue;
844                         }
845                     }
846                 }
847             }
848             
849             IMPL_XMLOBJECT_CLONE(Scoping);
850             IMPL_INTEGER_ATTRIB(ProxyCount);
851             IMPL_TYPED_CHILD(IDPList);
852             IMPL_TYPED_CHILDREN(RequesterID,m_children.end());
853     
854         protected:
855             void marshallAttributes(DOMElement* domElement) const {
856                     MARSHALL_INTEGER_ATTRIB(ProxyCount,PROXYCOUNT,nullptr);
857             }
858     
859             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
860                 PROC_TYPED_CHILD(IDPList,SAML20P_NS,false);
861                 PROC_TYPED_CHILDREN(RequesterID,SAML20P_NS,false);
862                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
863             }
864
865             void processAttribute(const DOMAttr* attribute) {
866                 PROC_INTEGER_ATTRIB(ProxyCount,PROXYCOUNT,nullptr);
867                 AbstractXMLObjectUnmarshaller::processAttribute(attribute);
868             }
869         };
870
871         class SAML_DLLLOCAL AuthnRequestImpl : public virtual AuthnRequest, public RequestAbstractTypeImpl
872         {
873             void init() {
874                 m_ForceAuthn=XML_BOOL_NULL;
875                 m_IsPassive=XML_BOOL_NULL;
876                 m_ProtocolBinding=nullptr;
877                 m_AssertionConsumerServiceIndex=nullptr;
878                 m_AssertionConsumerServiceURL=nullptr;
879                 m_AttributeConsumingServiceIndex=nullptr;
880                 m_ProviderName=nullptr;
881
882                 m_Subject=nullptr;
883                 m_NameIDPolicy=nullptr;
884                 m_Conditions=nullptr;
885                 m_RequestedAuthnContext=nullptr;
886                 m_Scoping=nullptr;
887                 m_children.push_back(nullptr);
888                 m_children.push_back(nullptr);
889                 m_children.push_back(nullptr);
890                 m_children.push_back(nullptr);
891                 m_children.push_back(nullptr);
892                 m_pos_Subject=m_pos_Extensions;
893                 ++m_pos_Subject;
894                 m_pos_NameIDPolicy=m_pos_Subject;
895                 ++m_pos_NameIDPolicy;
896                 m_pos_Conditions=m_pos_NameIDPolicy;
897                 ++m_pos_Conditions;
898                 m_pos_RequestedAuthnContext=m_pos_Conditions;
899                 ++m_pos_RequestedAuthnContext;
900                 m_pos_Scoping=m_pos_RequestedAuthnContext;
901                 ++m_pos_Scoping;
902                 
903             }
904         public:
905             virtual ~AuthnRequestImpl() {
906                 XMLString::release(&m_ProtocolBinding);
907                 XMLString::release(&m_AssertionConsumerServiceURL);
908                 XMLString::release(&m_ProviderName);
909                 XMLString::release(&m_AssertionConsumerServiceIndex);
910                 XMLString::release(&m_AttributeConsumingServiceIndex);
911             }
912     
913             AuthnRequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
914                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
915             {
916                 init();
917             }
918                 
919             AuthnRequestImpl(const AuthnRequestImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
920                 init();
921
922                 ForceAuthn(m_ForceAuthn);
923                 IsPassive(m_IsPassive);
924                 setProtocolBinding(src.getProtocolBinding());
925                 setAssertionConsumerServiceIndex(m_AssertionConsumerServiceIndex);
926                 setAssertionConsumerServiceURL(src.getAssertionConsumerServiceURL());
927                 setAttributeConsumingServiceIndex(m_AttributeConsumingServiceIndex);
928                 setProviderName(src.getProviderName());
929
930                 if (src.getSubject())
931                     setSubject(src.getSubject()->cloneSubject());
932                 if (src.getNameIDPolicy())
933                     setNameIDPolicy(src.getNameIDPolicy()->cloneNameIDPolicy());
934                 if (src.getConditions())
935                     setConditions(src.getConditions()->cloneConditions());
936                 if (src.getRequestedAuthnContext())
937                     setRequestedAuthnContext(src.getRequestedAuthnContext()->cloneRequestedAuthnContext());
938                 if (src.getScoping())
939                     setScoping(src.getScoping()->cloneScoping());
940             }
941             
942             IMPL_XMLOBJECT_CLONE(AuthnRequest);
943             RequestAbstractType* cloneRequestAbstractType() const {
944                 return cloneAuthnRequest();
945             }
946
947             IMPL_BOOLEAN_ATTRIB(ForceAuthn);
948             IMPL_BOOLEAN_ATTRIB(IsPassive);
949             IMPL_STRING_ATTRIB(ProtocolBinding);
950             IMPL_INTEGER_ATTRIB(AssertionConsumerServiceIndex);
951             IMPL_STRING_ATTRIB(AssertionConsumerServiceURL);
952             IMPL_INTEGER_ATTRIB(AttributeConsumingServiceIndex);
953             IMPL_STRING_ATTRIB(ProviderName);
954
955             IMPL_TYPED_FOREIGN_CHILD(Subject,saml2);
956             IMPL_TYPED_CHILD(NameIDPolicy);
957             IMPL_TYPED_FOREIGN_CHILD(Conditions,saml2);
958             IMPL_TYPED_CHILD(RequestedAuthnContext);
959             IMPL_TYPED_CHILD(Scoping);
960     
961         protected:
962             void marshallAttributes(DOMElement* domElement) const {
963                 MARSHALL_BOOLEAN_ATTRIB(ForceAuthn,FORCEAUTHN,nullptr);
964                 MARSHALL_BOOLEAN_ATTRIB(IsPassive,ISPASSIVE,nullptr);
965                 MARSHALL_STRING_ATTRIB(ProtocolBinding,PROTOCOLBINDING,nullptr);
966                 MARSHALL_INTEGER_ATTRIB(AssertionConsumerServiceIndex,ASSERTIONCONSUMERSERVICEINDEX,nullptr);
967                 MARSHALL_STRING_ATTRIB(AssertionConsumerServiceURL,ASSERTIONCONSUMERSERVICEURL,nullptr);
968                 MARSHALL_INTEGER_ATTRIB(AttributeConsumingServiceIndex,ATTRIBUTECONSUMINGSERVICEINDEX,nullptr);
969                 MARSHALL_STRING_ATTRIB(ProviderName,PROVIDERNAME,nullptr);
970                 RequestAbstractTypeImpl::marshallAttributes(domElement);
971             }
972     
973             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
974                 PROC_TYPED_FOREIGN_CHILD(Subject,saml2,SAML20_NS,false);
975                 PROC_TYPED_CHILD(NameIDPolicy,SAML20P_NS,false);
976                 PROC_TYPED_FOREIGN_CHILD(Conditions,saml2,SAML20_NS,false);
977                 PROC_TYPED_CHILD(RequestedAuthnContext,SAML20P_NS,false);
978                 PROC_TYPED_CHILD(Scoping,SAML20P_NS,false);
979                 RequestAbstractTypeImpl::processChildElement(childXMLObject,root);
980             }
981             void processAttribute(const DOMAttr* attribute) {
982                 PROC_BOOLEAN_ATTRIB(ForceAuthn,FORCEAUTHN,nullptr);
983                 PROC_BOOLEAN_ATTRIB(IsPassive,ISPASSIVE,nullptr);
984                 PROC_STRING_ATTRIB(ProtocolBinding,PROTOCOLBINDING,nullptr);
985                 PROC_INTEGER_ATTRIB(AssertionConsumerServiceIndex,ASSERTIONCONSUMERSERVICEINDEX,nullptr);
986                 PROC_STRING_ATTRIB(AssertionConsumerServiceURL,ASSERTIONCONSUMERSERVICEURL,nullptr);
987                 PROC_INTEGER_ATTRIB(AttributeConsumingServiceIndex,ATTRIBUTECONSUMINGSERVICEINDEX,nullptr);
988                 PROC_STRING_ATTRIB(ProviderName,PROVIDERNAME,nullptr);
989                 RequestAbstractTypeImpl::processAttribute(attribute);
990             }
991         };
992
993         class SAML_DLLLOCAL StatusResponseTypeImpl : public virtual StatusResponseType,
994             public AbstractComplexElement,
995             public AbstractDOMCachingXMLObject,
996             public AbstractXMLObjectMarshaller,
997             public AbstractXMLObjectUnmarshaller
998         {
999             void init() {
1000                 m_ID=nullptr;
1001                 m_InResponseTo=nullptr;
1002                 m_Version=nullptr;
1003                 m_IssueInstant=nullptr;
1004                 m_Destination=nullptr;
1005                 m_Consent=nullptr;
1006                 m_Issuer=nullptr;
1007                 m_Signature=nullptr;
1008                 m_Extensions=nullptr;
1009                 m_Status=nullptr;
1010                 m_children.push_back(nullptr);
1011                 m_children.push_back(nullptr);
1012                 m_children.push_back(nullptr);
1013                 m_children.push_back(nullptr);
1014                 m_pos_Issuer=m_children.begin();
1015                 m_pos_Signature=m_pos_Issuer;
1016                 ++m_pos_Signature;
1017                 m_pos_Extensions=m_pos_Signature;
1018                 ++m_pos_Extensions;
1019                 m_pos_Status=m_pos_Extensions;
1020                 ++m_pos_Status;
1021             }
1022         protected:
1023             StatusResponseTypeImpl() {
1024                 init();
1025             }
1026         public:
1027             virtual ~StatusResponseTypeImpl() {
1028                 XMLString::release(&m_ID);
1029                 XMLString::release(&m_InResponseTo);
1030                 XMLString::release(&m_Version);
1031                 XMLString::release(&m_Destination);
1032                 XMLString::release(&m_Consent);
1033                 delete m_IssueInstant;
1034             }
1035     
1036             StatusResponseTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
1037                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
1038             {
1039                 init();
1040             }
1041                 
1042             StatusResponseTypeImpl(const StatusResponseTypeImpl& src)
1043                     : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
1044                 init();
1045                 setID(src.getID());
1046                 setInResponseTo(src.getInResponseTo());
1047                 setVersion(src.getVersion());
1048                 setIssueInstant(src.getIssueInstant());
1049                 setDestination(src.getDestination());
1050                 setConsent(src.getConsent());
1051                 if (src.getIssuer())
1052                     setIssuer(src.getIssuer()->cloneIssuer());
1053                 if (src.getSignature())
1054                     setSignature(src.getSignature()->cloneSignature());
1055                 if (src.getExtensions())
1056                     setExtensions(src.getExtensions()->cloneExtensions());
1057                 if (src.getStatus())
1058                     setStatus(src.getStatus()->cloneStatus());
1059             }
1060             
1061             //IMPL_TYPED_CHILD(Signature);
1062             // Need customized setter.
1063         protected:
1064             Signature* m_Signature;
1065             list<XMLObject*>::iterator m_pos_Signature;
1066         public:
1067             Signature* getSignature() const {
1068                 return m_Signature;
1069             }
1070             
1071             void setSignature(Signature* sig) {
1072                 prepareForAssignment(m_Signature,sig);
1073                 *m_pos_Signature=m_Signature=sig;
1074                 // Sync content reference back up.
1075                 if (m_Signature)
1076                     m_Signature->setContentReference(new opensaml::ContentReference(*this));
1077             }
1078             
1079             IMPL_STRING_ATTRIB(Version);
1080             IMPL_ID_ATTRIB_EX(ID,ID,nullptr);
1081             IMPL_STRING_ATTRIB(InResponseTo);
1082             IMPL_DATETIME_ATTRIB(IssueInstant,0);
1083             IMPL_STRING_ATTRIB(Destination);
1084             IMPL_STRING_ATTRIB(Consent);
1085             IMPL_TYPED_FOREIGN_CHILD(Issuer,saml2);
1086             IMPL_TYPED_CHILD(Extensions);
1087             IMPL_TYPED_CHILD(Status);
1088     
1089         protected:
1090             void marshallAttributes(DOMElement* domElement) const {
1091                 if (!m_Version)
1092                     const_cast<StatusResponseTypeImpl*>(this)->m_Version=XMLString::transcode("2.0");
1093                 MARSHALL_STRING_ATTRIB(Version,VER,nullptr);
1094                 if (!m_ID)
1095                     const_cast<StatusResponseTypeImpl*>(this)->m_ID=SAMLConfig::getConfig().generateIdentifier();
1096                 MARSHALL_ID_ATTRIB(ID,ID,nullptr);
1097                 if (!m_IssueInstant) {
1098                     const_cast<StatusResponseTypeImpl*>(this)->m_IssueInstantEpoch=time(nullptr);
1099                     const_cast<StatusResponseTypeImpl*>(this)->m_IssueInstant=new DateTime(m_IssueInstantEpoch);
1100                 }
1101                 MARSHALL_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,nullptr);
1102                 MARSHALL_STRING_ATTRIB(Destination,DESTINATION,nullptr);
1103                 MARSHALL_STRING_ATTRIB(Consent,CONSENT,nullptr);
1104                 MARSHALL_STRING_ATTRIB(InResponseTo,INRESPONSETO,nullptr);
1105             }
1106     
1107             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
1108                 PROC_TYPED_FOREIGN_CHILD(Issuer,saml2,SAML20_NS,false);
1109                 PROC_TYPED_FOREIGN_CHILD(Signature,xmlsignature,XMLSIG_NS,false);
1110                 PROC_TYPED_CHILD(Extensions,SAML20P_NS,false);
1111                 PROC_TYPED_CHILD(Status,SAML20P_NS,false);
1112                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
1113             }
1114     
1115             void processAttribute(const DOMAttr* attribute) {
1116                 PROC_ID_ATTRIB(ID,ID,nullptr);
1117                 PROC_STRING_ATTRIB(Version,VER,nullptr);
1118                 PROC_STRING_ATTRIB(InResponseTo,INRESPONSETO,nullptr);
1119                 PROC_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,nullptr);
1120                 PROC_STRING_ATTRIB(Destination,DESTINATION,nullptr);
1121                 PROC_STRING_ATTRIB(Consent,CONSENT,nullptr);
1122                 AbstractXMLObjectUnmarshaller::processAttribute(attribute);
1123             }
1124         };
1125
1126         class SAML_DLLLOCAL ResponseImpl : public virtual Response, public StatusResponseTypeImpl
1127         {
1128         public:
1129             virtual ~ResponseImpl() { }
1130     
1131             ResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
1132                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) { }
1133                 
1134             ResponseImpl(const ResponseImpl& src) : AbstractXMLObject(src), StatusResponseTypeImpl(src) {
1135                 for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
1136                     if (*i) {
1137                         saml2::Assertion* assertion=dynamic_cast<saml2::Assertion*>(*i);
1138                         if (assertion) {
1139                             getAssertions().push_back(assertion->cloneAssertion());
1140                             continue;
1141                         }
1142                         EncryptedAssertion* encAssertion=dynamic_cast<EncryptedAssertion*>(*i);
1143                         if (encAssertion) {
1144                             getEncryptedAssertions().push_back(encAssertion->cloneEncryptedAssertion());
1145                             continue;
1146                         }
1147                     }
1148                 }
1149
1150             }
1151             
1152             IMPL_XMLOBJECT_CLONE(Response);
1153             StatusResponseType* cloneStatusResponseType() const {
1154                 return cloneResponse();
1155             }
1156
1157             IMPL_TYPED_FOREIGN_CHILDREN(Assertion,saml2,m_children.end());
1158             IMPL_TYPED_FOREIGN_CHILDREN(EncryptedAssertion,saml2,m_children.end());
1159     
1160         protected:
1161             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
1162                 PROC_TYPED_FOREIGN_CHILDREN(Assertion,saml2,SAML20_NS,false);
1163                 PROC_TYPED_FOREIGN_CHILDREN(EncryptedAssertion,saml2,SAML20_NS,false);
1164                 StatusResponseTypeImpl::processChildElement(childXMLObject,root);
1165             }
1166         };
1167
1168         class SAML_DLLLOCAL ArtifactResolveImpl : public virtual ArtifactResolve, public RequestAbstractTypeImpl
1169         {
1170             void init() {
1171                 m_Artifact=nullptr;
1172                 m_children.push_back(nullptr);
1173                 m_pos_Artifact=m_pos_Extensions;
1174                 ++m_pos_Artifact;
1175             }
1176         public:
1177             virtual ~ArtifactResolveImpl() { }
1178     
1179             ArtifactResolveImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
1180                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
1181             { 
1182                 init();
1183             }
1184                 
1185             ArtifactResolveImpl(const ArtifactResolveImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
1186                 init();
1187                 if(src.getArtifact())
1188                     setArtifact(src.getArtifact()->cloneArtifact());
1189             }
1190             
1191             IMPL_XMLOBJECT_CLONE(ArtifactResolve);
1192             RequestAbstractType* cloneRequestAbstractType() const {
1193                 return cloneArtifactResolve();
1194             }
1195
1196             IMPL_TYPED_CHILD(Artifact);
1197     
1198         protected:
1199             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
1200                 PROC_TYPED_CHILD(Artifact,SAML20P_NS,false);
1201                 RequestAbstractTypeImpl::processChildElement(childXMLObject,root);
1202             }
1203         };
1204
1205         class SAML_DLLLOCAL ArtifactResponseImpl : public virtual ArtifactResponse, public StatusResponseTypeImpl
1206         {
1207             void init() {
1208                 m_Payload=nullptr;
1209                 m_children.push_back(nullptr);
1210                 m_pos_Payload=m_pos_Status;
1211                 ++m_pos_Payload;
1212             }
1213         public:
1214             virtual ~ArtifactResponseImpl() { }
1215     
1216             ArtifactResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
1217                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
1218             {
1219                 init();
1220             }
1221                 
1222             ArtifactResponseImpl(const ArtifactResponseImpl& src) : AbstractXMLObject(src), StatusResponseTypeImpl(src) {
1223                 init();
1224                 if (src.getPayload())
1225                     setPayload(getPayload()->clone());
1226
1227             }
1228             
1229             IMPL_XMLOBJECT_CLONE(ArtifactResponse);
1230             StatusResponseType* cloneStatusResponseType() const {
1231                 return cloneArtifactResponse();
1232             }
1233
1234             IMPL_XMLOBJECT_CHILD(Payload);
1235     
1236         protected:
1237             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
1238                 // These are valid elements for the parent StatusResponseType, so don't process these.
1239                 // If not one of these, then it must be the payload.
1240                 if (
1241                     ! XMLHelper::isNodeNamed(root,SAML20_NS,saml2::Issuer::LOCAL_NAME) &&
1242                     ! XMLHelper::isNodeNamed(root,XMLSIG_NS,xmlsignature::Signature::LOCAL_NAME) &&
1243                     ! XMLHelper::isNodeNamed(root,SAML20P_NS,saml2p::Extensions::LOCAL_NAME) &&
1244                     ! XMLHelper::isNodeNamed(root,SAML20P_NS,saml2p::Status::LOCAL_NAME)
1245                    )
1246                 {
1247                     setPayload(childXMLObject);
1248                     return;
1249                 }
1250
1251                 StatusResponseTypeImpl::processChildElement(childXMLObject,root);
1252             }
1253         };
1254
1255         class SAML_DLLLOCAL NewEncryptedIDImpl : public virtual NewEncryptedID,
1256             public AbstractComplexElement,
1257             public AbstractDOMCachingXMLObject,
1258             public AbstractXMLObjectMarshaller,
1259             public AbstractXMLObjectUnmarshaller
1260         {
1261             void init() {
1262                 m_EncryptedData=nullptr;
1263                 m_children.push_back(nullptr);
1264                 m_pos_EncryptedData=m_children.begin();
1265             }
1266             
1267         protected:
1268             NewEncryptedIDImpl()
1269             {
1270                 init();
1271             }
1272             
1273         public:
1274             virtual ~NewEncryptedIDImpl() {}
1275     
1276             NewEncryptedIDImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
1277                     : AbstractXMLObject(nsURI, localName, prefix, schemaType)
1278             {
1279                 init();
1280             }
1281                 
1282             NewEncryptedIDImpl(const NewEncryptedIDImpl& src)
1283                     : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
1284                 init();
1285                 if (src.getEncryptedData())
1286                     setEncryptedData(src.getEncryptedData()->cloneEncryptedData());
1287                 VectorOf(xmlencryption::EncryptedKey) v=getEncryptedKeys();
1288                 for (vector<xmlencryption::EncryptedKey*>::const_iterator i=src.m_EncryptedKeys.begin(); i!=src.m_EncryptedKeys.end(); i++) {
1289                     if (*i) {
1290                         v.push_back((*i)->cloneEncryptedKey());
1291                     }
1292                 }
1293             }
1294     
1295             IMPL_XMLOBJECT_CLONE(NewEncryptedID);
1296             EncryptedElementType* cloneEncryptedElementType() const {
1297                 return new NewEncryptedIDImpl(*this);
1298             }
1299
1300             IMPL_TYPED_FOREIGN_CHILD(EncryptedData,xmlencryption);
1301             IMPL_TYPED_FOREIGN_CHILDREN(EncryptedKey,xmlencryption,m_children.end());
1302     
1303         protected:
1304             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
1305                 PROC_TYPED_FOREIGN_CHILD(EncryptedData,xmlencryption,XMLENC_NS,false);
1306                 PROC_TYPED_FOREIGN_CHILDREN(EncryptedKey,xmlencryption,XMLENC_NS,false);
1307                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
1308             }
1309         };
1310
1311         class SAML_DLLLOCAL TerminateImpl : public virtual Terminate,
1312             public AbstractSimpleElement,
1313             public AbstractDOMCachingXMLObject,
1314             public AbstractXMLObjectMarshaller,
1315             public AbstractXMLObjectUnmarshaller
1316         {
1317             public:
1318                 virtual ~TerminateImpl() { }
1319
1320                 TerminateImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
1321                     : AbstractXMLObject(nsURI, localName, prefix, schemaType) { }
1322
1323                 TerminateImpl(const TerminateImpl& src)
1324                     : AbstractXMLObject(src), AbstractSimpleElement(src), AbstractDOMCachingXMLObject(src) {
1325                 }
1326
1327                 IMPL_XMLOBJECT_CLONE(Terminate);
1328
1329             protected:
1330                 // has no attributes or children
1331         };
1332
1333         class SAML_DLLLOCAL ManageNameIDRequestImpl : public virtual ManageNameIDRequest, public RequestAbstractTypeImpl
1334         {
1335             void init() {
1336                 m_NameID=nullptr;
1337                 m_EncryptedID=nullptr;
1338                 m_NewID=nullptr;
1339                 m_NewEncryptedID=nullptr;
1340                 m_Terminate=nullptr;
1341                 m_children.push_back(nullptr);
1342                 m_children.push_back(nullptr);
1343                 m_children.push_back(nullptr);
1344                 m_children.push_back(nullptr);
1345                 m_children.push_back(nullptr);
1346                 m_pos_NameID=m_pos_Extensions;
1347                 ++m_pos_NameID;
1348                 m_pos_EncryptedID=m_pos_NameID;
1349                 ++m_pos_EncryptedID;
1350                 m_pos_NewID=m_pos_EncryptedID;
1351                 ++m_pos_NewID;
1352                 m_pos_NewEncryptedID=m_pos_NewID;
1353                 ++m_pos_NewEncryptedID;
1354                 m_pos_Terminate=m_pos_NewEncryptedID;
1355                 ++m_pos_Terminate;
1356                 
1357             }
1358         public:
1359             virtual ~ManageNameIDRequestImpl() { }
1360     
1361             ManageNameIDRequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
1362                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
1363             {
1364                 init();
1365             }
1366                 
1367             ManageNameIDRequestImpl(const ManageNameIDRequestImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
1368                 init();
1369
1370                 if (src.getNameID())
1371                     setNameID(src.getNameID()->cloneNameID());
1372                 if (src.getEncryptedID())
1373                     setEncryptedID(src.getEncryptedID()->cloneEncryptedID());
1374                 if (src.getNewID())
1375                     setNewID(src.getNewID()->cloneNewID());
1376                 if (src.getNewEncryptedID())
1377                     setNewEncryptedID(src.getNewEncryptedID()->cloneNewEncryptedID());
1378                 if (src.getTerminate())
1379                     setTerminate(src.getTerminate()->cloneTerminate());
1380
1381             }
1382             
1383             IMPL_XMLOBJECT_CLONE(ManageNameIDRequest);
1384             RequestAbstractType* cloneRequestAbstractType() const {
1385                 return cloneManageNameIDRequest();
1386             }
1387
1388             IMPL_TYPED_FOREIGN_CHILD(NameID,saml2);
1389             IMPL_TYPED_FOREIGN_CHILD(EncryptedID,saml2);
1390             IMPL_TYPED_CHILD(NewID);
1391             IMPL_TYPED_CHILD(NewEncryptedID);
1392             IMPL_TYPED_CHILD(Terminate);
1393     
1394         protected:
1395             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
1396                 PROC_TYPED_FOREIGN_CHILD(NameID,saml2,SAML20_NS,false);
1397                 PROC_TYPED_FOREIGN_CHILD(EncryptedID,saml2,SAML20_NS,false);
1398                 PROC_TYPED_CHILD(NewID,SAML20P_NS,false);
1399                 PROC_TYPED_CHILD(NewEncryptedID,SAML20P_NS,false);
1400                 PROC_TYPED_CHILD(Terminate,SAML20P_NS,false);
1401                 RequestAbstractTypeImpl::processChildElement(childXMLObject,root);
1402             }
1403         };
1404
1405         class SAML_DLLLOCAL ManageNameIDResponseImpl : public virtual ManageNameIDResponse, public StatusResponseTypeImpl
1406         {
1407         public:
1408             virtual ~ManageNameIDResponseImpl() { }
1409
1410             ManageNameIDResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
1411                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) { }
1412             
1413             ManageNameIDResponseImpl(const ManageNameIDResponseImpl& src) : AbstractXMLObject(src), StatusResponseTypeImpl(src) {
1414             }
1415
1416             IMPL_XMLOBJECT_CLONE(ManageNameIDResponse);
1417             StatusResponseType* cloneStatusResponseType() const {
1418                 return cloneManageNameIDResponse();
1419             }
1420         };
1421
1422         class SAML_DLLLOCAL LogoutRequestImpl : public virtual LogoutRequest, public RequestAbstractTypeImpl
1423         {
1424             void init() {
1425                 m_Reason=nullptr;
1426                 m_NotOnOrAfter=nullptr;
1427
1428                 m_BaseID=nullptr;
1429                 m_NameID=nullptr;
1430                 m_EncryptedID=nullptr;
1431                 m_children.push_back(nullptr);
1432                 m_children.push_back(nullptr);
1433                 m_children.push_back(nullptr);
1434                 m_pos_BaseID=m_pos_Extensions;
1435                 ++m_pos_BaseID;
1436                 m_pos_NameID=m_pos_BaseID;
1437                 ++m_pos_NameID;
1438                 m_pos_EncryptedID=m_pos_NameID;
1439                 ++m_pos_EncryptedID;
1440                 
1441             }
1442         public:
1443             virtual ~LogoutRequestImpl() {
1444                 XMLString::release(&m_Reason);
1445                 delete m_NotOnOrAfter;
1446             }
1447     
1448             LogoutRequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
1449                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
1450             {
1451                 init();
1452             }
1453                 
1454             LogoutRequestImpl(const LogoutRequestImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
1455                 init();
1456
1457                 setReason(src.getReason());
1458                 setNotOnOrAfter(src.getNotOnOrAfter());
1459
1460                 if (src.getBaseID())
1461                     setBaseID(src.getBaseID()->cloneBaseID());
1462                 if (src.getNameID())
1463                     setNameID(src.getNameID()->cloneNameID());
1464                 if (src.getEncryptedID())
1465                     setEncryptedID(src.getEncryptedID()->cloneEncryptedID());
1466
1467                 for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
1468                     if (*i) {
1469                         SessionIndex* si = dynamic_cast<SessionIndex*>(*i);
1470                         if (si) {
1471                             getSessionIndexs().push_back(si->cloneSessionIndex());
1472                             continue;
1473                         }
1474                     }
1475                 }
1476             }
1477             
1478             IMPL_XMLOBJECT_CLONE(LogoutRequest);
1479             RequestAbstractType* cloneRequestAbstractType() const {
1480                 return cloneLogoutRequest();
1481             }
1482
1483             IMPL_STRING_ATTRIB(Reason);
1484             IMPL_DATETIME_ATTRIB(NotOnOrAfter,SAMLTIME_MAX);
1485             IMPL_TYPED_FOREIGN_CHILD(BaseID,saml2);
1486             IMPL_TYPED_FOREIGN_CHILD(NameID,saml2);
1487             IMPL_TYPED_FOREIGN_CHILD(EncryptedID,saml2);
1488             IMPL_TYPED_CHILDREN(SessionIndex,m_children.end());
1489     
1490         protected:
1491             void marshallAttributes(DOMElement* domElement) const {
1492                 MARSHALL_STRING_ATTRIB(Reason,REASON,nullptr);
1493                 MARSHALL_DATETIME_ATTRIB(NotOnOrAfter,NOTONORAFTER,nullptr);
1494                 RequestAbstractTypeImpl::marshallAttributes(domElement);
1495             }
1496     
1497             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
1498                 PROC_TYPED_FOREIGN_CHILD(BaseID,saml2,SAML20_NS,false);
1499                 PROC_TYPED_FOREIGN_CHILD(NameID,saml2,SAML20_NS,false);
1500                 PROC_TYPED_FOREIGN_CHILD(EncryptedID,saml2,SAML20_NS,false);
1501                 PROC_TYPED_CHILDREN(SessionIndex,SAML20P_NS,false);
1502                 RequestAbstractTypeImpl::processChildElement(childXMLObject,root);
1503             }
1504             void processAttribute(const DOMAttr* attribute) {
1505                 PROC_STRING_ATTRIB(Reason,REASON,nullptr);
1506                 PROC_DATETIME_ATTRIB(NotOnOrAfter,NOTONORAFTER,nullptr);
1507                 RequestAbstractTypeImpl::processAttribute(attribute);
1508             }
1509         };
1510
1511         class SAML_DLLLOCAL LogoutResponseImpl : public virtual LogoutResponse, public StatusResponseTypeImpl
1512         {
1513         public:
1514             virtual ~LogoutResponseImpl() { }
1515
1516             LogoutResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
1517                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) { }
1518             
1519             LogoutResponseImpl(const LogoutResponseImpl& src) : AbstractXMLObject(src), StatusResponseTypeImpl(src) {
1520             }
1521
1522             IMPL_XMLOBJECT_CLONE(LogoutResponse);
1523             StatusResponseType* cloneStatusResponseType() const {
1524                 return cloneLogoutResponse();
1525             }
1526         };
1527
1528
1529         class SAML_DLLLOCAL NameIDMappingRequestImpl : public virtual NameIDMappingRequest, public RequestAbstractTypeImpl
1530         {
1531             void init() {
1532                 m_BaseID=nullptr;
1533                 m_NameID=nullptr;
1534                 m_EncryptedID=nullptr;
1535                 m_NameIDPolicy=nullptr;
1536                 m_children.push_back(nullptr);
1537                 m_children.push_back(nullptr);
1538                 m_children.push_back(nullptr);
1539                 m_children.push_back(nullptr);
1540                 m_pos_BaseID=m_pos_Extensions;
1541                 ++m_pos_BaseID;
1542                 m_pos_NameID=m_pos_BaseID;
1543                 ++m_pos_NameID;
1544                 m_pos_EncryptedID=m_pos_NameID;
1545                 ++m_pos_EncryptedID;
1546                 m_pos_NameIDPolicy=m_pos_EncryptedID;
1547                 ++m_pos_NameIDPolicy;
1548                 
1549             }
1550         public:
1551             virtual ~NameIDMappingRequestImpl() { }
1552     
1553             NameIDMappingRequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
1554                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
1555             {
1556                 init();
1557             }
1558                 
1559             NameIDMappingRequestImpl(const NameIDMappingRequestImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
1560                 init();
1561
1562                 if (src.getBaseID())
1563                     setBaseID(src.getBaseID()->cloneBaseID());
1564                 if (src.getNameID())
1565                     setNameID(src.getNameID()->cloneNameID());
1566                 if (src.getEncryptedID())
1567                     setEncryptedID(src.getEncryptedID()->cloneEncryptedID());
1568                 if (src.getNameIDPolicy())
1569                     setNameIDPolicy(src.getNameIDPolicy()->cloneNameIDPolicy());
1570
1571             }
1572             
1573             IMPL_XMLOBJECT_CLONE(NameIDMappingRequest);
1574             RequestAbstractType* cloneRequestAbstractType() const {
1575                 return cloneNameIDMappingRequest();
1576             }
1577
1578             IMPL_TYPED_FOREIGN_CHILD(BaseID,saml2);
1579             IMPL_TYPED_FOREIGN_CHILD(NameID,saml2);
1580             IMPL_TYPED_FOREIGN_CHILD(EncryptedID,saml2);
1581             IMPL_TYPED_CHILD(NameIDPolicy);
1582     
1583         protected:
1584             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
1585                 PROC_TYPED_FOREIGN_CHILD(BaseID,saml2,SAML20_NS,false);
1586                 PROC_TYPED_FOREIGN_CHILD(NameID,saml2,SAML20_NS,false);
1587                 PROC_TYPED_FOREIGN_CHILD(EncryptedID,saml2,SAML20_NS,false);
1588                 PROC_TYPED_CHILD(NameIDPolicy,SAML20P_NS,false);
1589                 RequestAbstractTypeImpl::processChildElement(childXMLObject,root);
1590             }
1591         };
1592
1593         class SAML_DLLLOCAL NameIDMappingResponseImpl : public virtual NameIDMappingResponse, public StatusResponseTypeImpl
1594         {
1595             void init() {
1596                 m_NameID=nullptr;
1597                 m_EncryptedID=nullptr;
1598                 m_children.push_back(nullptr);
1599                 m_children.push_back(nullptr);
1600                 m_pos_NameID=m_pos_Status;
1601                 ++m_pos_NameID;
1602                 m_pos_EncryptedID=m_pos_NameID;
1603                 ++m_pos_EncryptedID;
1604             }
1605         public:
1606             virtual ~NameIDMappingResponseImpl() { }
1607     
1608             NameIDMappingResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
1609                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
1610             {
1611                 init();
1612             }
1613                 
1614             NameIDMappingResponseImpl(const NameIDMappingResponseImpl& src) : AbstractXMLObject(src), StatusResponseTypeImpl(src) {
1615                 init();
1616
1617                 if (src.getNameID())
1618                     setNameID(getNameID()->cloneNameID());
1619                 if (src.getEncryptedID())
1620                     setEncryptedID(getEncryptedID()->cloneEncryptedID());
1621
1622             }
1623             
1624             IMPL_XMLOBJECT_CLONE(NameIDMappingResponse);
1625             StatusResponseType* cloneStatusResponseType() const {
1626                 return cloneNameIDMappingResponse();
1627             }
1628
1629             IMPL_TYPED_FOREIGN_CHILD(NameID,saml2);
1630             IMPL_TYPED_FOREIGN_CHILD(EncryptedID,saml2);
1631     
1632         protected:
1633             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
1634                 PROC_TYPED_FOREIGN_CHILD(NameID,saml2,SAML20_NS,false);
1635                 PROC_TYPED_FOREIGN_CHILD(EncryptedID,saml2,SAML20_NS,false);
1636                 StatusResponseTypeImpl::processChildElement(childXMLObject,root);
1637             }
1638         };
1639     };
1640 };
1641
1642 #if defined (_MSC_VER)
1643     #pragma warning( pop )
1644 #endif
1645
1646 // Builder Implementations
1647 IMPL_XMLOBJECTBUILDER(Artifact);
1648 IMPL_XMLOBJECTBUILDER(ArtifactResolve);
1649 IMPL_XMLOBJECTBUILDER(ArtifactResponse);
1650 IMPL_XMLOBJECTBUILDER(AssertionIDRequest);
1651 IMPL_XMLOBJECTBUILDER(AttributeQuery);
1652 IMPL_XMLOBJECTBUILDER(AuthnQuery);
1653 IMPL_XMLOBJECTBUILDER(AuthnRequest);
1654 IMPL_XMLOBJECTBUILDER(AuthzDecisionQuery);
1655 IMPL_XMLOBJECTBUILDER(Extensions);
1656 IMPL_XMLOBJECTBUILDER(GetComplete);
1657 IMPL_XMLOBJECTBUILDER(IDPEntry);
1658 IMPL_XMLOBJECTBUILDER(IDPList);
1659 IMPL_XMLOBJECTBUILDER(LogoutRequest);
1660 IMPL_XMLOBJECTBUILDER(LogoutResponse);
1661 IMPL_XMLOBJECTBUILDER(ManageNameIDRequest);
1662 IMPL_XMLOBJECTBUILDER(ManageNameIDResponse);
1663 IMPL_XMLOBJECTBUILDER(NameIDMappingRequest);
1664 IMPL_XMLOBJECTBUILDER(NameIDMappingResponse);
1665 IMPL_XMLOBJECTBUILDER(NameIDPolicy);
1666 IMPL_XMLOBJECTBUILDER(NewEncryptedID);
1667 IMPL_XMLOBJECTBUILDER(NewID);
1668 IMPL_XMLOBJECTBUILDER(RequestedAuthnContext);
1669 IMPL_XMLOBJECTBUILDER(RequesterID);
1670 IMPL_XMLOBJECTBUILDER(Response);
1671 IMPL_XMLOBJECTBUILDER(Scoping);
1672 IMPL_XMLOBJECTBUILDER(SessionIndex);
1673 IMPL_XMLOBJECTBUILDER(Status);
1674 IMPL_XMLOBJECTBUILDER(StatusCode);
1675 IMPL_XMLOBJECTBUILDER(StatusDetail);
1676 IMPL_XMLOBJECTBUILDER(StatusMessage);
1677 IMPL_XMLOBJECTBUILDER(Terminate);
1678
1679 IMPL_XMLOBJECTBUILDER(RespondTo);
1680
1681 // Unicode literals
1682 const XMLCh Artifact::LOCAL_NAME[] = UNICODE_LITERAL_8(A,r,t,i,f,a,c,t);
1683 const XMLCh ArtifactResolve::LOCAL_NAME[] = UNICODE_LITERAL_15(A,r,t,i,f,a,c,t,R,e,s,o,l,v,e);
1684 const XMLCh ArtifactResolve::TYPE_NAME[] = UNICODE_LITERAL_19(A,r,t,i,f,a,c,t,R,e,s,o,l,v,e,T,y,p,e);
1685 const XMLCh ArtifactResponse::LOCAL_NAME[] = UNICODE_LITERAL_16(A,r,t,i,f,a,c,t,R,e,s,p,o,n,s,e);
1686 const XMLCh ArtifactResponse::TYPE_NAME[] = UNICODE_LITERAL_20(A,r,t,i,f,a,c,t,R,e,s,p,o,n,s,e,T,y,p,e);
1687 const XMLCh AssertionIDRequest::LOCAL_NAME[] = UNICODE_LITERAL_18(A,s,s,e,r,t,i,o,n,I,D,R,e,q,u,e,s,t);
1688 const XMLCh AssertionIDRequest::TYPE_NAME[] = UNICODE_LITERAL_22(A,s,s,e,r,t,i,o,n,I,D,R,e,q,u,e,s,t,T,y,p,e);
1689 const XMLCh AttributeQuery::LOCAL_NAME[] = UNICODE_LITERAL_14(A,t,t,r,i,b,u,t,e,Q,u,e,r,y);
1690 const XMLCh AttributeQuery::TYPE_NAME[] = UNICODE_LITERAL_18(A,t,t,r,i,b,u,t,e,Q,u,e,r,y,T,y,p,e);
1691 const XMLCh AuthnQuery::LOCAL_NAME[] = UNICODE_LITERAL_10(A,u,t,h,n,Q,u,e,r,y);
1692 const XMLCh AuthnQuery::TYPE_NAME[] = UNICODE_LITERAL_14(A,u,t,h,n,Q,u,e,r,y,T,y,p,e);
1693 const XMLCh AuthnQuery::SESSIONINDEX_ATTRIB_NAME[] = UNICODE_LITERAL_12(S,e,s,s,i,o,n,I,n,d,e,x);
1694 const XMLCh AuthnRequest::LOCAL_NAME[] = UNICODE_LITERAL_12(A,u,t,h,n,R,e,q,u,e,s,t);
1695 const XMLCh AuthnRequest::TYPE_NAME[] = UNICODE_LITERAL_16(A,u,t,h,n,R,e,q,u,e,s,t,T,y,p,e);
1696 const XMLCh AuthnRequest::FORCEAUTHN_ATTRIB_NAME[] = UNICODE_LITERAL_10(F,o,r,c,e,A,u,t,h,n);
1697 const XMLCh AuthnRequest::ISPASSIVE_ATTRIB_NAME[] = UNICODE_LITERAL_9(I,s,P,a,s,s,i,v,e);
1698 const XMLCh AuthnRequest::PROTOCOLBINDING_ATTRIB_NAME[] = UNICODE_LITERAL_15(P,r,o,t,o,c,o,l,B,i,n,d,i,n,g);
1699 const XMLCh AuthnRequest::ASSERTIONCONSUMERSERVICEINDEX_ATTRIB_NAME[] = UNICODE_LITERAL_29(A,s,s,e,r,t,i,o,n,C,o,n,s,u,m,e,r,S,e,r,v,i,c,e,I,n,d,e,x);
1700 const XMLCh AuthnRequest::ASSERTIONCONSUMERSERVICEURL_ATTRIB_NAME[] = UNICODE_LITERAL_27(A,s,s,e,r,t,i,o,n,C,o,n,s,u,m,e,r,S,e,r,v,i,c,e,U,R,L);
1701 const XMLCh AuthnRequest::ATTRIBUTECONSUMINGSERVICEINDEX_ATTRIB_NAME[] = UNICODE_LITERAL_30(A,t,t,r,i,b,u,t,e,C,o,n,s,u,m,i,n,g,S,e,r,v,i,c,e,I,n,d,e,x);
1702 const XMLCh AuthnRequest::PROVIDERNAME_ATTRIB_NAME[] = UNICODE_LITERAL_12(P,r,o,v,i,d,e,r,N,a,m,e);
1703 const XMLCh AuthzDecisionQuery::LOCAL_NAME[] = UNICODE_LITERAL_18(A,u,t,h,z,D,e,c,i,s,i,o,n,Q,u,e,r,y);
1704 const XMLCh AuthzDecisionQuery::TYPE_NAME[] = UNICODE_LITERAL_22(A,u,t,h,z,D,e,c,i,s,i,o,n,Q,u,e,r,y,T,y,p,e);
1705 const XMLCh AuthzDecisionQuery::RESOURCE_ATTRIB_NAME[] = UNICODE_LITERAL_8(R,e,s,o,u,r,c,e);
1706 const XMLCh Extensions::LOCAL_NAME[] = UNICODE_LITERAL_10(E,x,t,e,n,s,i,o,n,s);
1707 const XMLCh Extensions::TYPE_NAME[] = UNICODE_LITERAL_14(E,x,t,e,n,s,i,o,n,s,T,y,p,e);
1708 const XMLCh GetComplete::LOCAL_NAME[] = UNICODE_LITERAL_11(G,e,t,C,o,m,p,l,e,t,e);
1709 const XMLCh IDPEntry::LOCAL_NAME[] = UNICODE_LITERAL_8(I,D,P,E,n,t,r,y);
1710 const XMLCh IDPEntry::TYPE_NAME[] = UNICODE_LITERAL_12(I,D,P,E,n,t,r,y,T,y,p,e);
1711 const XMLCh IDPEntry::PROVIDERID_ATTRIB_NAME[] = UNICODE_LITERAL_10(P,r,o,v,i,d,e,r,I,D);
1712 const XMLCh IDPEntry::NAME_ATTRIB_NAME[] = UNICODE_LITERAL_4(N,a,m,e);
1713 const XMLCh IDPEntry::LOC_ATTRIB_NAME[] = UNICODE_LITERAL_3(L,o,c);
1714 const XMLCh IDPList::LOCAL_NAME[] = UNICODE_LITERAL_7(I,D,P,L,i,s,t);
1715 const XMLCh IDPList::TYPE_NAME[] = UNICODE_LITERAL_11(I,D,P,L,i,s,t,T,y,p,e);
1716 const XMLCh LogoutRequest::LOCAL_NAME[] = UNICODE_LITERAL_13(L,o,g,o,u,t,R,e,q,u,e,s,t);
1717 const XMLCh LogoutRequest::TYPE_NAME[] = UNICODE_LITERAL_17(L,o,g,o,u,t,R,e,q,u,e,s,t,T,y,p,e);
1718 const XMLCh LogoutRequest::REASON_ATTRIB_NAME[] = UNICODE_LITERAL_6(R,e,a,s,o,n);
1719 const XMLCh LogoutRequest::NOTONORAFTER_ATTRIB_NAME[] = UNICODE_LITERAL_12(N,o,t,O,n,O,r,A,f,t,e,r);
1720 const XMLCh LogoutResponse::LOCAL_NAME[] = UNICODE_LITERAL_14(L,o,g,o,u,t,R,e,s,p,o,n,s,e);
1721 const XMLCh ManageNameIDRequest::LOCAL_NAME[] = UNICODE_LITERAL_19(M,a,n,a,g,e,N,a,m,e,I,D,R,e,q,u,e,s,t);
1722 const XMLCh ManageNameIDRequest::TYPE_NAME[] = UNICODE_LITERAL_23(M,a,n,a,g,e,N,a,m,e,I,D,R,e,q,u,e,s,t,T,y,p,e);
1723 const XMLCh ManageNameIDResponse::LOCAL_NAME[] = UNICODE_LITERAL_20(M,a,n,a,g,e,N,a,m,e,I,D,R,e,s,p,o,n,s,e);
1724 const XMLCh NameIDMappingRequest::LOCAL_NAME[] = UNICODE_LITERAL_20(N,a,m,e,I,D,M,a,p,p,i,n,g,R,e,q,u,e,s,t);
1725 const XMLCh NameIDMappingRequest::TYPE_NAME[] = UNICODE_LITERAL_24(N,a,m,e,I,D,M,a,p,p,i,n,g,R,e,q,u,e,s,t,T,y,p,e);
1726 const XMLCh NameIDMappingResponse::LOCAL_NAME[] = UNICODE_LITERAL_21(N,a,m,e,I,D,M,a,p,p,i,n,g,R,e,s,p,o,n,s,e);
1727 const XMLCh NameIDMappingResponse::TYPE_NAME[] = UNICODE_LITERAL_25(N,a,m,e,I,D,M,a,p,p,i,n,g,R,e,s,p,o,n,s,e,T,y,p,e);
1728 const XMLCh NameIDPolicy::LOCAL_NAME[] = UNICODE_LITERAL_12(N,a,m,e,I,D,P,o,l,i,c,y);
1729 const XMLCh NameIDPolicy::TYPE_NAME[] = UNICODE_LITERAL_16(N,a,m,e,I,D,P,o,l,i,c,y,T,y,p,e);
1730 const XMLCh NameIDPolicy::FORMAT_ATTRIB_NAME[] = UNICODE_LITERAL_6(F,o,r,m,a,t);
1731 const XMLCh NameIDPolicy::SPNAMEQUALIFIER_ATTRIB_NAME[] = UNICODE_LITERAL_15(S,P,N,a,m,e,Q,u,a,l,i,f,i,e,r);
1732 const XMLCh NameIDPolicy::ALLOWCREATE_ATTRIB_NAME[] = UNICODE_LITERAL_11(A,l,l,o,w,C,r,e,a,t,e);
1733 const XMLCh NewEncryptedID::LOCAL_NAME[] = UNICODE_LITERAL_14(N,e,w,E,n,c,r,y,p,t,e,d,I,D);
1734 const XMLCh NewID::LOCAL_NAME[] = UNICODE_LITERAL_5(N,e,w,I,D);
1735 const XMLCh RequesterID::LOCAL_NAME[] = UNICODE_LITERAL_11(R,e,q,u,e,s,t,e,r,I,D);
1736 const XMLCh RequestedAuthnContext::LOCAL_NAME[] = UNICODE_LITERAL_21(R,e,q,u,e,s,t,e,d,A,u,t,h,n,C,o,n,t,e,x,t);
1737 const XMLCh RequestedAuthnContext::TYPE_NAME[] = UNICODE_LITERAL_25(R,e,q,u,e,s,t,e,d,A,u,t,h,n,C,o,n,t,e,x,t,T,y,p,e);
1738 const XMLCh RequestedAuthnContext::COMPARISON_ATTRIB_NAME[] = UNICODE_LITERAL_10(C,o,m,p,a,r,i,s,o,n);
1739 const XMLCh RequestedAuthnContext::COMPARISON_EXACT[] = UNICODE_LITERAL_5(e,x,a,c,t);
1740 const XMLCh RequestedAuthnContext::COMPARISON_MINIMUM[] = UNICODE_LITERAL_7(m,i,n,i,m,u,m);
1741 const XMLCh RequestedAuthnContext::COMPARISON_MAXIMUM[] = UNICODE_LITERAL_7(m,a,x,i,m,u,m);
1742 const XMLCh RequestedAuthnContext::COMPARISON_BETTER[] = UNICODE_LITERAL_6(b,e,t,t,e,r);
1743 const XMLCh RequestAbstractType::LOCAL_NAME[] = {chNull};
1744 const XMLCh RequestAbstractType::TYPE_NAME[] = UNICODE_LITERAL_19(R,e,q,u,e,s,t,A,b,s,t,r,a,c,t,T,y,p,e);
1745 const XMLCh RequestAbstractType::ID_ATTRIB_NAME[] = UNICODE_LITERAL_2(I,D);
1746 const XMLCh RequestAbstractType::VER_ATTRIB_NAME[] = UNICODE_LITERAL_7(V,e,r,s,i,o,n);
1747 const XMLCh RequestAbstractType::ISSUEINSTANT_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,s,s,u,e,I,n,s,t,a,n,t);
1748 const XMLCh RequestAbstractType::DESTINATION_ATTRIB_NAME[] = UNICODE_LITERAL_11(D,e,s,t,i,n,a,t,i,o,n);
1749 const XMLCh RequestAbstractType::CONSENT_ATTRIB_NAME[] = UNICODE_LITERAL_7(C,o,n,s,e,n,t);
1750 const XMLCh RespondTo::LOCAL_NAME[] = UNICODE_LITERAL_9(R,e,s,p,o,n,d,T,o);
1751 const XMLCh Response::LOCAL_NAME[] = UNICODE_LITERAL_8(R,e,s,p,o,n,s,e);
1752 const XMLCh Response::TYPE_NAME[] = UNICODE_LITERAL_12(R,e,s,p,o,n,s,e,T,y,p,e);
1753 const XMLCh Scoping::LOCAL_NAME[] = UNICODE_LITERAL_7(S,c,o,p,i,n,g);
1754 const XMLCh Scoping::TYPE_NAME[] = UNICODE_LITERAL_11(S,c,o,p,i,n,g,T,y,p,e);
1755 const XMLCh Scoping::PROXYCOUNT_ATTRIB_NAME[] = UNICODE_LITERAL_10(P,r,o,x,y,C,o,u,n,t);
1756 const XMLCh SessionIndex::LOCAL_NAME[] = UNICODE_LITERAL_12(S,e,s,s,i,o,n,I,n,d,e,x);
1757 const XMLCh Status::LOCAL_NAME[] = UNICODE_LITERAL_6(S,t,a,t,u,s);
1758 const XMLCh Status::TYPE_NAME[] = UNICODE_LITERAL_10(S,t,a,t,u,s,T,y,p,e);
1759 const XMLCh StatusCode::LOCAL_NAME[] = UNICODE_LITERAL_10(S,t,a,t,u,s,C,o,d,e);
1760 const XMLCh StatusCode::TYPE_NAME[] = UNICODE_LITERAL_14(S,t,a,t,u,s,C,o,d,e,T,y,p,e);
1761 const XMLCh StatusCode::VALUE_ATTRIB_NAME[] = UNICODE_LITERAL_5(V,a,l,u,e);
1762 const XMLCh StatusDetail::LOCAL_NAME[] = UNICODE_LITERAL_12(S,t,a,t,u,s,D,e,t,a,i,l);
1763 const XMLCh StatusDetail::TYPE_NAME[] = UNICODE_LITERAL_16(S,t,a,t,u,s,D,e,t,a,i,l,T,y,p,e);
1764 const XMLCh StatusMessage::LOCAL_NAME[] = UNICODE_LITERAL_13(S,t,a,t,u,s,M,e,s,s,a,g,e);
1765 const XMLCh StatusResponseType::LOCAL_NAME[] = {chNull};
1766 const XMLCh StatusResponseType::TYPE_NAME[] = UNICODE_LITERAL_18(S,t,a,t,u,s,R,e,s,p,o,n,s,e,T,y,p,e);
1767 const XMLCh StatusResponseType::ID_ATTRIB_NAME[] = UNICODE_LITERAL_2(I,D);
1768 const XMLCh StatusResponseType::INRESPONSETO_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,n,R,e,s,p,o,n,s,e,T,o);
1769 const XMLCh StatusResponseType::VER_ATTRIB_NAME[] = UNICODE_LITERAL_7(V,e,r,s,i,o,n);
1770 const XMLCh StatusResponseType::ISSUEINSTANT_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,s,s,u,e,I,n,s,t,a,n,t);
1771 const XMLCh StatusResponseType::DESTINATION_ATTRIB_NAME[] = UNICODE_LITERAL_11(D,e,s,t,i,n,a,t,i,o,n);
1772 const XMLCh StatusResponseType::CONSENT_ATTRIB_NAME[] = UNICODE_LITERAL_7(C,o,n,s,e,n,t);
1773 const XMLCh SubjectQuery::LOCAL_NAME[] = UNICODE_LITERAL_12(S,u,b,j,e,c,t,Q,u,e,r,y);
1774 const XMLCh SubjectQuery::TYPE_NAME[] = UNICODE_LITERAL_24(S,u,b,j,e,c,t,Q,u,e,r,y,A,b,s,t,r,a,c,t,T,y,p,e);
1775 const XMLCh Terminate::LOCAL_NAME[] = UNICODE_LITERAL_9(T,e,r,m,i,n,a,t,e);
1776 const XMLCh Terminate::TYPE_NAME[] = UNICODE_LITERAL_13(T,e,r,m,i,n,a,t,e,T,y,p,e);
1777
1778 // Unicode literals: LogoutRequest element, Reason attribute
1779 const XMLCh LogoutRequest::REASON_USER[] = // urn:oasis:names:tc:SAML:2.0:logout:user
1780 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1781   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1782   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1783   chLatin_l, chLatin_o, chLatin_g, chLatin_o, chLatin_u, chLatin_t, chColon,
1784   chLatin_u, chLatin_s, chLatin_e, chLatin_r, chNull
1785 };
1786
1787 const XMLCh LogoutRequest::REASON_ADMIN[] = // urn:oasis:names:tc:SAML:2.0:logout:admin
1788 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1789   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1790   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1791   chLatin_l, chLatin_o, chLatin_g, chLatin_o, chLatin_u, chLatin_t, chColon,
1792   chLatin_a, chLatin_d, chLatin_m, chLatin_i, chLatin_n, chNull
1793 };
1794
1795
1796 const XMLCh LogoutRequest::REASON_GLOBAL_TIMEOUT[] = // urn:oasis:names:tc:SAML:2.0:logout:global-timeout
1797 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1798   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1799   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1800   chLatin_l, chLatin_o, chLatin_g, chLatin_o, chLatin_u, chLatin_t, chColon,
1801   chLatin_g, chLatin_l, chLatin_o, chLatin_b, chLatin_a, chLatin_l, 
1802     chDash, chLatin_t, chLatin_i, chLatin_m, chLatin_e, chLatin_o, chLatin_u, chLatin_t, chNull
1803 };
1804
1805
1806 const XMLCh LogoutRequest::REASON_SP_TIMEOUT[] = // urn:oasis:names:tc:SAML:2.0:logout:sp-timeout
1807 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1808   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1809   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1810   chLatin_l, chLatin_o, chLatin_g, chLatin_o, chLatin_u, chLatin_t, chColon,
1811   chLatin_s, chLatin_p, chDash, chLatin_t, chLatin_i, chLatin_m, chLatin_e, chLatin_o, chLatin_u, chLatin_t, chNull
1812 };
1813
1814
1815 // Unicode literals, StatusCode Value
1816 const XMLCh StatusCode::SUCCESS[] = //  urn:oasis:names:tc:SAML:2.0:status:Success 
1817 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1818   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1819   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1820   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1821   chLatin_S, chLatin_u, chLatin_c, chLatin_c, chLatin_e, chLatin_s, chLatin_s, chNull
1822 };
1823
1824 const XMLCh StatusCode::REQUESTER[] = //  urn:oasis:names:tc:SAML:2.0:status:Requester 
1825 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1826   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1827   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1828   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1829   chLatin_R, chLatin_e, chLatin_q, chLatin_u, chLatin_e, chLatin_s, chLatin_t, chLatin_e, chLatin_r, chNull
1830 };
1831
1832 const XMLCh StatusCode::RESPONDER[] = //  urn:oasis:names:tc:SAML:2.0:status:Responder 
1833 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1834   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1835   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1836   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1837   chLatin_R, chLatin_e, chLatin_s, chLatin_p, chLatin_o, chLatin_n, chLatin_d, chLatin_e, chLatin_r, chNull
1838 };
1839
1840 const XMLCh StatusCode::VERSION_MISMATCH[] = //  urn:oasis:names:tc:SAML:2.0:status:VersionMismatch 
1841 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1842   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1843   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1844   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1845   chLatin_V, chLatin_e, chLatin_r, chLatin_s, chLatin_i, chLatin_o, chLatin_n,
1846     chLatin_M, chLatin_i, chLatin_s, chLatin_m, chLatin_a, chLatin_t, chLatin_c, chLatin_h, chNull
1847 };
1848
1849 const XMLCh StatusCode::AUTHN_FAILED[] = //  urn:oasis:names:tc:SAML:2.0:status:AuthnFailed 
1850 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1851   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1852   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1853   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1854   chLatin_A, chLatin_u, chLatin_t, chLatin_h, chLatin_n,
1855     chLatin_F, chLatin_a, chLatin_i, chLatin_l, chLatin_e, chLatin_d, chNull
1856 };
1857
1858 const XMLCh StatusCode::INVALID_ATTR_NAME_OR_VALUE[] = //  urn:oasis:names:tc:SAML:2.0:status:InvalidAttrNameOrValue 
1859 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1860   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1861   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1862   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1863   chLatin_I, chLatin_n, chLatin_v, chLatin_a, chLatin_l, chLatin_i, chLatin_d, 
1864     chLatin_A, chLatin_t, chLatin_t, chLatin_r, chLatin_N, chLatin_a, chLatin_m, chLatin_e, 
1865     chLatin_O, chLatin_r, chLatin_V, chLatin_a, chLatin_l, chLatin_u, chLatin_e, chNull
1866 };
1867
1868 const XMLCh StatusCode::INVALID_NAMEID_POLICY[] = //  urn:oasis:names:tc:SAML:2.0:status:InvalidNameIDPolicy 
1869 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1870   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1871   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1872   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1873   chLatin_I, chLatin_n, chLatin_v, chLatin_a, chLatin_l, chLatin_i, chLatin_d, 
1874    chLatin_N, chLatin_a, chLatin_m, chLatin_e, chLatin_I, chLatin_D, 
1875    chLatin_P, chLatin_o, chLatin_l, chLatin_i, chLatin_c, chLatin_y, chNull
1876 };
1877
1878 const XMLCh StatusCode::NO_AUTHN_CONTEXT[] = //  urn:oasis:names:tc:SAML:2.0:status:NoAuthnContext 
1879 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1880   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1881   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1882   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1883   chLatin_N, chLatin_o, chLatin_A, chLatin_u, chLatin_t, chLatin_h, chLatin_n, 
1884   chLatin_C, chLatin_o, chLatin_n, chLatin_t, chLatin_e, chLatin_x, chLatin_t, chNull
1885 };
1886
1887 const XMLCh StatusCode::NO_AVAILABLE_IDP[] = //  urn:oasis:names:tc:SAML:2.0:status:NoAvailableIDP 
1888 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1889   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1890   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1891   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1892   chLatin_N, chLatin_o, chLatin_A, chLatin_v, chLatin_a, chLatin_i, chLatin_l, chLatin_a, chLatin_b, chLatin_l, chLatin_e, 
1893    chLatin_I, chLatin_D, chLatin_P, chNull
1894 };
1895
1896 const XMLCh StatusCode::NO_PASSIVE[] = //  urn:oasis:names:tc:SAML:2.0:status:NoPassive 
1897 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1898   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1899   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1900   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1901   chLatin_N, chLatin_o, chLatin_P, chLatin_a, chLatin_s, chLatin_s, chLatin_i, chLatin_v, chLatin_e, chNull
1902 };
1903
1904 const XMLCh StatusCode::NO_SUPPORTED_IDP[] = //  urn:oasis:names:tc:SAML:2.0:status:NoSupportedIDP 
1905 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1906   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1907   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1908   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1909   chLatin_N, chLatin_o, chLatin_S, chLatin_u, chLatin_p, chLatin_p, chLatin_o, chLatin_r, chLatin_t, chLatin_e, chLatin_d,
1910       chLatin_I, chLatin_D, chLatin_P, chNull
1911 };
1912
1913 const XMLCh StatusCode::PARTIAL_LOGOUT[] = //  urn:oasis:names:tc:SAML:2.0:status:PartialLogout 
1914 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1915   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1916   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1917   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1918   chLatin_P, chLatin_a, chLatin_r, chLatin_t, chLatin_i, chLatin_a, chLatin_l, 
1919     chLatin_L, chLatin_o, chLatin_g, chLatin_o, chLatin_u, chLatin_t, chNull
1920 };
1921
1922 const XMLCh StatusCode::PROXY_COUNT_EXCEEDED[] = //  urn:oasis:names:tc:SAML:2.0:status:ProxyCountExceeded 
1923 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1924   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1925   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1926   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1927   chLatin_P, chLatin_r, chLatin_o, chLatin_x, chLatin_y, chLatin_C, chLatin_o, chLatin_u, chLatin_n, chLatin_t, 
1928     chLatin_E, chLatin_x, chLatin_c, chLatin_e, chLatin_e, chLatin_d, chLatin_e, chLatin_d, chNull
1929 };
1930
1931 const XMLCh StatusCode::REQUEST_DENIED[] = //  urn:oasis:names:tc:SAML:2.0:status:RequestDenied 
1932 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1933   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1934   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1935   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1936   chLatin_R, chLatin_e, chLatin_q, chLatin_u, chLatin_e, chLatin_s, chLatin_t, 
1937     chLatin_D, chLatin_e, chLatin_n, chLatin_i, chLatin_e, chLatin_d, chNull
1938 };
1939
1940 const XMLCh StatusCode::REQUEST_UNSUPPORTED[] = //  urn:oasis:names:tc:SAML:2.0:status:RequestUnsupported 
1941 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1942   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1943   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1944   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1945   chLatin_R, chLatin_e, chLatin_q, chLatin_u, chLatin_e, chLatin_s, chLatin_t, 
1946     chLatin_U, chLatin_n, chLatin_s, chLatin_u, chLatin_p, chLatin_p, chLatin_o, chLatin_r, chLatin_t, chLatin_e, chLatin_d, chNull
1947 };
1948
1949 const XMLCh StatusCode::REQUEST_VERSION_DEPRECATED[] = //  urn:oasis:names:tc:SAML:2.0:status:RequestVersionDeprecated 
1950 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1951   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1952   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1953   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1954   chLatin_R, chLatin_e, chLatin_q, chLatin_u, chLatin_e, chLatin_s, chLatin_t, 
1955     chLatin_V, chLatin_e, chLatin_r, chLatin_s, chLatin_i, chLatin_o, chLatin_n, 
1956     chLatin_D, chLatin_e, chLatin_p, chLatin_r, chLatin_e, chLatin_c, chLatin_a, chLatin_t, chLatin_e, chLatin_d, chNull
1957 };
1958
1959 const XMLCh StatusCode::REQUEST_VERSION_TOO_HIGH[] = //  urn:oasis:names:tc:SAML:2.0:status:RequestVersionTooHigh 
1960 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1961   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1962   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1963   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1964   chLatin_R, chLatin_e, chLatin_q, chLatin_u, chLatin_e, chLatin_s, chLatin_t, 
1965   chLatin_V, chLatin_e, chLatin_r, chLatin_s, chLatin_i, chLatin_o, chLatin_n, 
1966   chLatin_T, chLatin_o, chLatin_o, chLatin_H, chLatin_i, chLatin_g, chLatin_h, chNull
1967 };
1968
1969 const XMLCh StatusCode::REQUEST_VERSION_TOO_LOW[] = //  urn:oasis:names:tc:SAML:2.0:status:RequestVersionTooLow 
1970 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1971   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1972   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1973   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1974   chLatin_R, chLatin_e, chLatin_q, chLatin_u, chLatin_e, chLatin_s, chLatin_t, 
1975     chLatin_V, chLatin_e, chLatin_r, chLatin_s, chLatin_i, chLatin_o, chLatin_n, 
1976     chLatin_T, chLatin_o, chLatin_o, chLatin_L, chLatin_o, chLatin_w, chNull
1977 };
1978
1979 const XMLCh StatusCode::RESOURCE_NOT_RECOGNIZED[] = //  urn:oasis:names:tc:SAML:2.0:status:ResourceNotRecognized 
1980 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1981   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1982   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1983   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1984   chLatin_R, chLatin_e, chLatin_s, chLatin_o, chLatin_u, chLatin_r, chLatin_c, chLatin_e, 
1985     chLatin_N, chLatin_o, chLatin_t, 
1986     chLatin_R, chLatin_e, chLatin_c, chLatin_o, chLatin_g, chLatin_n, chLatin_i, chLatin_z, chLatin_e, chLatin_d, chNull
1987 };
1988
1989 const XMLCh StatusCode::TOO_MANY_RESPONSES[] = //  urn:oasis:names:tc:SAML:2.0:status:TooManyResponses 
1990 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1991   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1992   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1993   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1994   chLatin_T, chLatin_o, chLatin_o, chLatin_M, chLatin_a, chLatin_n, chLatin_y, 
1995     chLatin_R, chLatin_e, chLatin_s, chLatin_p, chLatin_o, chLatin_n, chLatin_s, chLatin_e, chLatin_s, chNull
1996 };
1997
1998 const XMLCh StatusCode::UNKNOWN_ATTR_PROFILE[] = //  urn:oasis:names:tc:SAML:2.0:status:UnknownAttrProfile 
1999 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
2000   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
2001   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
2002   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
2003   chLatin_U, chLatin_n, chLatin_k, chLatin_n, chLatin_o, chLatin_w, chLatin_n, 
2004     chLatin_A, chLatin_t, chLatin_t, chLatin_r, 
2005     chLatin_P, chLatin_r, chLatin_o, chLatin_f, chLatin_i, chLatin_l, chLatin_e, chNull
2006 };
2007
2008 const XMLCh StatusCode::UNKNOWN_PRINCIPAL[] = //  urn:oasis:names:tc:SAML:2.0:status:UnknownPrincipal 
2009 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
2010   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
2011   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
2012   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
2013   chLatin_U, chLatin_n, chLatin_k, chLatin_n, chLatin_o, chLatin_w, chLatin_n, 
2014     chLatin_P, chLatin_r, chLatin_i, chLatin_n, chLatin_c, chLatin_i, chLatin_p, chLatin_a, chLatin_l, chNull
2015 };
2016
2017 const XMLCh StatusCode::UNSUPPORTED_BINDING[] = //  urn:oasis:names:tc:SAML:2.0:status:UnsupportedBinding 
2018 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
2019   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
2020   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
2021   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
2022   chLatin_U, chLatin_n, chLatin_s, chLatin_u, chLatin_p, chLatin_p, chLatin_o, chLatin_r, chLatin_t, chLatin_e, chLatin_d, 
2023     chLatin_B, chLatin_i, chLatin_n, chLatin_d, chLatin_i, chLatin_n, chLatin_g, chNull
2024 };
2025