1      * Summary: The DTD validation
2      * Description: API for the DTD handling and the validity checking
3      *
4      * Copy: See Copyright for the status of this software.
5      *
6      * Author: Patrick Monnerat <pm@datasphere.ch>, DATASPHERE S.A.
7
8      /if not defined(XML_VALID_H__)
9      /define XML_VALID_H__
10
11      /include "libxmlrpg/xmlversion"
12      /include "libxmlrpg/xmlerror"
13      /include "libxmlrpg/tree"
14      /include "libxmlrpg/list"
15      /include "libxmlrpg/xmlautomata"
16      /include "libxmlrpg/xmlregexp"
17
18      * Validation state added for non-determinist content model.
19
20     d xmlValidStatePtr...
21     d                 s               *   based(######typedef######)
22
23      * xmlValidityErrorFunc:
24      * @ctx:  usually an xmlValidCtxtPtr to a validity error context,
25      *        but comes from ctxt->userData (which normally contains such
26      *        a pointer); ctxt->userData can be changed by the user.
27      * @msg:  the string to format *printf like vararg
28      * @...:  remaining arguments to the format
29      *
30      * Callback called when a validity error is found. This is a message
31      * oriented function similar to an *printf function.
32
33     d xmlValidityErrorFunc...
34     d                 s               *   based(######typedef######)
35     d                                     procptr
36
37      * xmlValidityWarningFunc:
38      * @ctx:  usually an xmlValidCtxtPtr to a validity error context,
39      *        but comes from ctxt->userData (which normally contains such
40      *        a pointer); ctxt->userData can be changed by the user.
41      * @msg:  the string to format *printf like vararg
42      * @...:  remaining arguments to the format
43      *
44      * Callback called when a validity warning is found. This is a message
45      * oriented function similar to an *printf function.
46
47     d xmlValidityWarningFunc...
48     d                 s               *   based(######typedef######)
49     d                                     procptr
50
51      * xmlValidCtxt:
52      * An xmlValidCtxt is used for error reporting when validating.
53
54     d xmlValidCtxtPtr...
55     d                 s               *   based(######typedef######)
56
57     d xmlValidCtxt    ds                  based(xmlValidCtxtPtr)
58     d                                     align qualified
59     d  userdata                       *                                        void *
60     d  error                              like(xmlValidityErrorFunc)           Error callback
61     d  warning                            like(xmlValidityWarningFunc)         Warning callback
62      *
63      * Node analysis stack used when validating within entities
64      *
65     d  node                               like(xmlNodePtr)                     Current parsed Node
66     d  nodeNr                       10i 0                                      Parsing stack depth
67     d  nodeMax                      10i 0                                      Max stack depth
68     d  nodeTab                        *                                        xmlNodePtr *
69      *
70     d  finishDtd                    10u 0                                      Finish validtng DTD?
71     d  doc                                like(xmlDocPtr)                      The document
72     d  valid                        10i 0                                      Temp check result
73      *
74      * state state used for non-determinist content validation
75      *
76     d  vstate                         *                                        xmlValidState *
77     d  vstateNr                     10i 0                                      Validat. stack depth
78     d  vstateMax                    10i 0                                      Max stack depth
79     d  vstateTab                      *                                        xmlValidState *
80      *
81      /if defined(LIBXML_REGEXP_ENABLED)
82     d  am                                 like(xmlAutomataPtr)                 The automata
83     d  state                              like(xmlAutomataStatePtr)            Automata build state
84      /else
85     d  am                             *
86     d  state                          *
87      /endif
88
89      * ALL notation declarations are stored in a table.
90      * There is one table per DTD.
91
92     d xmlNotationTablePtr...
93     d                 s               *   based(######typedef######)
94
95      * ALL element declarations are stored in a table.
96      * There is one table per DTD.
97
98     d xmlElementTablePtr...
99     d                 s               *   based(######typedef######)
100
101      * ALL attribute declarations are stored in a table.
102      * There is one table per DTD.
103
104     d xmlAttributeTablePtr...
105     d                 s               *   based(######typedef######)
106
107      * ALL IDs attributes are stored in a table.
108      * There is one table per document.
109
110     d xmlIDTablePtr   s               *   based(######typedef######)
111
112      * ALL Refs attributes are stored in a table.
113      * There is one table per document.
114
115     d xmlRefTablePtr  s               *   based(######typedef######)
116
117      * Notation
118
119     d xmlAddNotationDecl...
120     d                 pr                  extproc('xmlAddNotationDecl')
121     d                                     like(xmlNotationPtr)
122     d  ctxt                               value like(xmlValidCtxtPtr)
123     d  dtd                                value like(xmlDtdPtr)
124     d  name                           *   value options(*string)               const xmlChar *
125     d  PublicID                       *   value options(*string)               const xmlChar *
126     d  SystemID                       *   value options(*string)               const xmlChar *
127
128      /if defined(LIBXML_TREE_ENABLED)
129     d xmlCopyNotationTable...
130     d                 pr                  extproc('xmlCopyNotationTable')
131     d                                     like(xmlNotationPtr)
132     d  table                              value like(xmlNotationTablePtr)
133      /endif                                                                    LIBXML_TREE_ENABLED
134
135     d xmlFreeNotationTable...
136     d                 pr                  extproc('xmlFreeNotationTable')
137     d  table                              value like(xmlNotationTablePtr)
138
139      /if defined(LIBXML_OUTPUT_ENABLED)
140     d xmlDumpNotationDecl...
141     d                 pr                  extproc('xmlDumpNotationDecl')
142     d  buf                                value like(xmlBufferPtr)
143     d  nota                               value like(xmlNotationPtr)
144
145     d xmlDumpNotationTable...
146     d                 pr                  extproc('xmlDumpNotationTable')
147     d  buf                                value like(xmlBufferPtr)
148     d  table                              value like(xmlNotationTablePtr)
149      /endif                                                                    LIBXML_OUTPUT_ENABLD
150
151      * Element Content
152      * the non Doc version are being deprecated
153
154     d xmlNewElementContent...
155     d                 pr                  extproc('xmlNewElementContent')
156     d                                     like(xmlElementContentPtr)
157     d  name                           *   value                                const xmlChar *
158     d  type                               value like(xmlElementContentType)
159
160     d xmlCopyElementContent...
161     d                 pr                  extproc('xmlCopyElementContent')
162     d                                     like(xmlElementContentPtr)
163     d  content                            value like(xmlElementContentPtr)
164
165     d xmlFreeElementContent...
166     d                 pr                  extproc('xmlFreeElementContent')
167     d  cur                                value like(xmlElementContentPtr)
168
169      * the new versions with doc argument
170
171     d xmlNewDocElementContent...
172     d                 pr                  extproc('xmlNewDocElementContent')
173     d                                     like(xmlElementContentPtr)
174     d  doc                                value like(xmlDocPtr)
175     d  name                           *   value                                const xmlChar *
176     d  type                               value like(xmlElementContentType)
177
178     d xmlCopyDocElementContent...
179     d                 pr                  extproc('xmlCopyDocElementContent')
180     d                                     like(xmlElementContentPtr)
181     d  doc                                value like(xmlDocPtr)
182     d  content                            value like(xmlElementContentPtr)
183
184     d xmlFreeDocElementContent...
185     d                 pr                  extproc('xmlFreeDocElementContent')
186     d  doc                                value like(xmlDocPtr)
187     d  cur                                value like(xmlElementContentPtr)
188
189     d xmlSnprintfElementContent...
190     d                 pr                  extproc('xmlSnprintfElementContent')
191     d  buf                       65535    options(*varsize)
192     d  size                         10i 0 value
193     d  content                            value like(xmlElementContentPtr)
194     d  englob                       10i 0 value
195
196      /if defined(LIBXML_OUTPUT_ENABLED)
197      * DEPRECATED
198     d xmlSprintfElementContent...
199     d                 pr                  extproc('xmlSprintfElementContent')
200     d  buf                       65535    options(*varsize)
201     d  content                            value like(xmlElementContentPtr)
202     d  englob                       10i 0 value
203      /endif                                                                    LIBXML_OUTPUT_ENABLD
204
205      * DEPRECATED
206
207      * Element
208
209     d xmlAddElementDecl...
210     d                 pr                  extproc('xmlAddElementDecl')
211     d                                     like(xmlElementPtr)
212     d  ctxt                               value like(xmlValidCtxtPtr)
213     d  dtd                                value like(xmlDtdPtr)
214     d  name                           *   value options(*string)               const xmlChar *
215     d  type                               value like(xmlElementTypeVal)
216     d  content                            value like(xmlElementContentPtr)
217
218      /if defined(LIBXML_TREE_ENABLED)
219     d xmlCopyElementTable...
220     d                 pr                  extproc('xmlCopyElementTable')
221     d                                     like(xmlElementTablePtr)
222     d  table                              value like(xmlElementTablePtr)
223      /endif                                                                    LIBXML_TREE_ENABLED
224
225     d xmlFreeElementTable...
226     d                 pr                  extproc('xmlFreeElementTable')
227     d  table                              value like(xmlElementTablePtr)
228
229      /if defined(LIBXML_OUTPUT_ENABLED)
230     d xmlDumpElementTable...
231     d                 pr                  extproc('xmlDumpElementTable')
232     d  buf                                value like(xmlBufferPtr)
233     d  table                              value like(xmlElementTablePtr)
234
235     d xmlDumpElementDecl...
236     d                 pr                  extproc('xmlDumpElementDecl')
237     d  buf                                value like(xmlBufferPtr)
238     d  elem                               value like(xmlElementPtr)
239      /endif                                                                    LIBXML_OUTPUT_ENABLD
240
241      * Enumeration
242
243     d xmlCreateEnumeration...
244     d                 pr                  extproc('xmlCreateEnumeration')
245     d                                     like(xmlEnumerationPtr)
246     d  name                           *   value options(*string)               const xmlChar *
247
248     d xmlFreeEnumeration...
249     d                 pr                  extproc('xmlFreeEnumeration')
250     d  cur                                value like(xmlEnumerationPtr)
251
252      /if defined(LIBXML_TREE_ENABLED)
253     d xmlCopyEnumeration...
254     d                 pr                  extproc('xmlCopyEnumeration')
255     d                                     like(xmlEnumerationPtr)
256     d  cur                                value like(xmlEnumerationPtr)
257      /endif                                                                    LIBXML_TREE_ENABLED
258
259      * Attribute
260
261     d xmlAddAttributeDecl...
262     d                 pr                  extproc('xmlAddAttributeDecl')
263     d                                     like(xmlAttributePtr)
264     d  ctxt                               value like(xmlValidCtxtPtr)
265     d  dtd                                value like(xmlDtdPtr)
266     d  elem                           *   value options(*string)               const xmlChar *
267     d  name                           *   value options(*string)               const xmlChar *
268     d  ns                             *   value options(*string)               const xmlChar *
269     d  type                               value like(xmlAttributeType)
270     d  def                                value like(xmlAttributeDefault)
271     d  defaultValue                   *   value options(*string)               const xmlChar *
272     d  tree                               value like(xmlEnumerationPtr)
273
274      /if defined(LIBXML_TREE_ENABLED)
275     d xmlCopyAttributeTable...
276     d                 pr                  extproc('xmlCopyAttributeTable')
277     d                                     like(xmlAttributeTablePtr)
278     d  table                              value like(xmlAttributeTablePtr)
279      /endif                                                                    LIBXML_TREE_ENABLED
280
281     d xmlFreeAttributeTable...
282     d                 pr                  extproc('xmlFreeAttributeTable')
283     d  table                              value like(xmlAttributeTablePtr)
284
285      /if defined(LIBXML_OUTPUT_ENABLED)
286     d xmlDumpAttributeTable...
287     d                 pr                  extproc('xmlDumpAttributeTable')
288     d  buf                                value like(xmlBufferPtr)
289     d  table                              value like(xmlAttributeTablePtr)
290
291     d xmlDumpAttributeDecl...
292     d                 pr                  extproc('xmlDumpAttributeDecl')
293     d  buf                                value like(xmlBufferPtr)
294     d  attr                               value like(xmlAttributePtr)
295      /endif                                                                    LIBXML_OUTPUT_ENABLD
296
297      * IDs
298
299     d xmlAddID        pr                  extproc('xmlAddID')
300     d                                     like(xmlIDPtr)
301     d  ctxt                               value like(xmlValidCtxtPtr)
302     d  doc                                value like(xmlDocPtr)
303     d  value                          *   value options(*string)               const xmlChar *
304     d  attr                               value like(xmlAttrPtr)
305
306     d xmlFreeIdTable  pr                  extproc('xmlFreeIDTable')
307     d  table                              value like(xmlIDTablePtr)
308
309     d xmlGetID        pr                  extproc('xmlGetID')
310     d                                     like(xmlAttrPtr)
311     d  doc                                value like(xmlDocPtr)
312     d  ID                             *   value options(*string)               const xmlChar *
313
314     d xmlIsID         pr            10i 0 extproc('xmlIsID')
315     d  doc                                value like(xmlDocPtr)
316     d  node                               value like(xmlNodePtr)
317     d  attr                               value like(xmlAttrPtr)
318
319     d xmlRemoveID     pr            10i 0 extproc('xmlRemoveID')
320     d  doc                                value like(xmlDocPtr)
321     d  attr                               value like(xmlAttrPtr)
322
323      * IDREFs
324
325     d xmlAddRef       pr                  extproc('xmlAddRef')
326     d                                     like(xmlRefPtr)
327     d  ctxt                               value like(xmlValidCtxtPtr)
328     d  doc                                value like(xmlDocPtr)
329     d  value                          *   value options(*string)               const xmlChar *
330     d  attr                               value like(xmlAttrPtr)
331
332     d xmlFreeRefTable...
333     d                 pr                  extproc('xmlFreeRefTable')
334     d  table                              value like(xmlRefTablePtr)
335
336     d xmlIsRef        pr            10i 0 extproc('xmlIsRef')
337     d  doc                                value like(xmlDocPtr)
338     d  node                               value like(xmlNodePtr)
339     d  attr                               value like(xmlAttrPtr)
340
341     d xmlRemoveRef    pr            10i 0 extproc('xmlRemoveRef')
342     d  doc                                value like(xmlDocPtr)
343     d  attr                               value like(xmlAttrPtr)
344
345     d xmlGetRefs      pr                  extproc('xmlGetRefs')
346     d                                     like(xmlListPtr)
347     d  doc                                value like(xmlDocPtr)
348     d  ID                             *   value options(*string)               const xmlChar *
349
350      * The public function calls related to validity checking.
351
352      /if defined(LIBXML_VALID_ENABLED)
353      * Allocate/Release Validation Contexts
354
355     d xmlNewValidCtxt...
356     d                 pr                  extproc('xmlNewValidCtxt')
357     d                                     like(xmlValidCtxtPtr)
358
359     d xmlFreeValidCtxt...
360     d                 pr                  extproc('xmlFreeValidCtxt')
361     d  ctxt                               value like(xmlValidCtxtPtr)
362
363     d xmlValidateRoot...
364     d                 pr            10i 0 extproc('xmlValidateRoot')
365     d  ctxt                               value like(xmlValidCtxtPtr)
366     d  doc                                value like(xmlDocPtr)
367
368     d xmlValidateElementDecl...
369     d                 pr            10i 0 extproc('xmlValidateElementDecl')
370     d  ctxt                               value like(xmlValidCtxtPtr)
371     d  doc                                value like(xmlDocPtr)
372     d  elem                               value like(xmlElementPtr)
373
374     d xmlValidNormalizeAttributeValue...
375     d                 pr              *   extproc(                             xmlChar *
376     d                                      'xmlValidNormalizeAttributeValue')
377     d  doc                                value like(xmlDocPtr)
378     d  elem                               value like(xmlNodePtr)
379     d  name                           *   value options(*string)               const xmlChar *
380     d  value                          *   value options(*string)               const xmlChar *
381
382     d xmlValidCtxtNormalizeAttributeValue...
383     d                 pr              *   extproc('xmlValidCtxt+               xmlChar *
384     d                                     NormalizeAttributeValue')
385     d  ctxt                               value like(xmlValidCtxtPtr)
386     d  doc                                value like(xmlDocPtr)
387     d  elem                               value like(xmlNodePtr)
388     d  name                           *   value options(*string)               const xmlChar *
389     d  value                          *   value options(*string)               const xmlChar *
390
391     d xmlValidateAttributeDecl...
392     d                 pr            10i 0 extproc('xmlValidateAttributeDecl')
393     d  ctxt                               value like(xmlValidCtxtPtr)
394     d  doc                                value like(xmlDocPtr)
395     d  attr                               value like(xmlAttributePtr)
396
397     d xmlValidateAttributeValue...
398     d                 pr            10i 0 extproc('xmlValidateAttributeValue')
399     d  type                               value like(xmlAttributeType)
400     d  value                          *   value options(*string)               const xmlChar *
401
402     d xmlValidateNotationDecl...
403     d                 pr            10i 0 extproc('xmlValidateNotationDecl')
404     d  ctxt                               value like(xmlValidCtxtPtr)
405     d  doc                                value like(xmlDocPtr)
406     d  nota                               value like(xmlNotationPtr)
407
408     d xmlValidateDtd  pr            10i 0 extproc('xmlValidateDtd')
409     d  ctxt                               value like(xmlValidCtxtPtr)
410     d  doc                                value like(xmlDocPtr)
411     d  dtd                                value like(xmlDtdPtr)
412
413     d xmlValidateDtdFinal...
414     d                 pr            10i 0 extproc('xmlValidateDtdFinal')
415     d  ctxt                               value like(xmlValidCtxtPtr)
416     d  doc                                value like(xmlDocPtr)
417
418     d xmlValidateDocument...
419     d                 pr            10i 0 extproc('xmlValidateDocument')
420     d  ctxt                               value like(xmlValidCtxtPtr)
421     d  doc                                value like(xmlDocPtr)
422
423     d xmlValidateElement...
424     d                 pr            10i 0 extproc('xmlValidateElement')
425     d  ctxt                               value like(xmlValidCtxtPtr)
426     d  doc                                value like(xmlDocPtr)
427     d  elem                               value like(xmlNodePtr)
428
429     d xmlValidateOneElement...
430     d                 pr            10i 0 extproc('xmlValidateOneElement')
431     d  ctxt                               value like(xmlValidCtxtPtr)
432     d  doc                                value like(xmlDocPtr)
433     d  elem                               value like(xmlNodePtr)
434
435     d xmlValidateOneAttribute...
436     d                 pr            10i 0 extproc('xmlValidateOneAttribute')
437     d  ctxt                               value like(xmlValidCtxtPtr)
438     d  doc                                value like(xmlDocPtr)
439     d  elem                               value like(xmlNodePtr)
440     d  attr                               value like(xmlAttrPtr)
441     d  value                          *   value options(*string)               const xmlChar *
442
443     d xmlValidateOneNamespace...
444     d                 pr            10i 0 extproc('xmlValidateOneNamespace')
445     d  ctxt                               value like(xmlValidCtxtPtr)
446     d  doc                                value like(xmlDocPtr)
447     d  elem                               value like(xmlNodePtr)
448     d  prefix                         *   value options(*string)               const xmlChar *
449     d  ns                                 value like(xmlNsPtr)
450     d  value                          *   value options(*string)               const xmlChar *
451
452     d xmlValidateDocumentFinal...
453     d                 pr            10i 0 extproc('xmlValidateDocumentFinal')
454     d  ctxt                               value like(xmlValidCtxtPtr)
455     d  doc                                value like(xmlDocPtr)
456      /endif                                                                    LIBXML_VALID_ENABLED
457
458      /undefine XML_TESTVAL
459      /if defined(LIBXML_VALID_ENABLED)
460      /define XML_TESTVAL
461      /elseif defined(LIBXML_SCHEMAS_ENABLED)
462      /define XML_TESTVAL
463      /endif
464      /if defined(XML_TESTVAL)
465     d xmlValidateNotationUse...
466     d                 pr            10i 0 extproc('xmlValidateNotationUse')
467     d  ctxt                               value like(xmlValidCtxtPtr)
468     d  doc                                value like(xmlDocPtr)
469     d  notationName                   *   value options(*string)               const xmlChar *
470
471      /undefine XML_TESTVAL
472      /endif
473
474     d xmlIsMixedElement...
475     d                 pr            10i 0 extproc('xmlIsMixedElement')
476     d  doc                                value like(xmlDocPtr)
477     d  name                           *   value options(*string)               const xmlChar *
478
479     d xmlGetDtdAttrDesc...
480     d                 pr                  extproc('xmlGetDtdAttrDesc')
481     d                                     like(xmlAttributePtr)
482     d  dtd                                value like(xmlDtdPtr)
483     d  elem                           *   value options(*string)               const xmlChar *
484     d  name                           *   value options(*string)               const xmlChar *
485
486     d xmlGetDtdQAttrDesc...
487     d                 pr                  extproc('xmlGetDtdQAttrDesc')
488     d                                     like(xmlAttributePtr)
489     d  dtd                                value like(xmlDtdPtr)
490     d  elem                           *   value options(*string)               const xmlChar *
491     d  name                           *   value options(*string)               const xmlChar *
492     d  prefix                         *   value options(*string)               const xmlChar *
493
494     d xmlGetDtdNotationDesc...
495     d                 pr                  extproc('xmlGetDtdNotationDesc')
496     d                                     like(xmlNotationPtr)
497     d  dtd                                value like(xmlDtdPtr)
498     d  name                           *   value options(*string)               const xmlChar *
499
500     d xmlGetDtdQElementDesc...
501     d                 pr                  extproc('xmlGetDtdQElementDesc')
502     d                                     like(xmlElementPtr)
503     d  dtd                                value like(xmlDtdPtr)
504     d  name                           *   value options(*string)               const xmlChar *
505     d  prefix                         *   value options(*string)               const xmlChar *
506
507     d xmlGetDtdElementDesc...
508     d                 pr                  extproc('xmlGetDtdElementDesc')
509     d                                     like(xmlElementPtr)
510     d  dtd                                value like(xmlDtdPtr)
511     d  name                           *   value options(*string)               const xmlChar *
512
513      /if defined(LIBXML_VALID_ENABLED)
514     d xmlValidGetPotentialChildren...
515     d                 pr            10i 0 extproc(
516     d                                      'xmlValidGetPotentialChildren')
517     d  ctree                          *   value                                xmlElementContent *
518     d  names                          *                                        const xmlChar *(*)
519     d  len                          10i 0
520     d  max                          10i 0 value
521
522     d xmlValidGetValidElements...
523     d                 pr            10i 0 extproc('xmlValidGetValidElements')
524     d  prev                               like(xmlNodePtr)
525     d  next                               like(xmlNodePtr)
526     d  names                          *                                        const xmlChar *(*)
527     d  max                          10i 0 value
528
529     d xmlValidateNameValue...
530     d                 pr            10i 0 extproc('xmlValidateNameValue')
531     d  value                          *   value options(*string)               const xmlChar *
532
533     d xmlValidateNamesValue...
534     d                 pr            10i 0 extproc('xmlValidateNamesValue')
535     d  value                          *   value options(*string)               const xmlChar *
536
537     d xmlValidateNmtokenValue...
538     d                 pr            10i 0 extproc('xmlValidateNmtokenValue')
539     d  value                          *   value options(*string)               const xmlChar *
540
541     d xmlValidateNmtokensValue...
542     d                 pr            10i 0 extproc('xmlValidateNmtokensValue')
543     d  value                          *   value options(*string)               const xmlChar *
544
545      /if defined(LIBXML_REGEXP_ENABLED)
546      * Validation based on the regexp support
547
548     d xmlValidBuildContentModel...
549     d                 pr            10i 0 extproc('xmlValidBuildContentModel')
550     d  ctxt                               value like(xmlValidCtxtPtr)
551     d  elem                               value like(xmlElementPtr)
552
553     d xmlValidatePushElement...
554     d                 pr            10i 0 extproc('xmlValidatePushElement')
555     d  ctxt                               value like(xmlValidCtxtPtr)
556     d  doc                                value like(xmlDocPtr)
557     d  elem                               value like(xmlNodePtr)
558     d  qname                          *   value options(*string)               const xmlChar *
559
560     d xmlValidatePushCData...
561     d                 pr            10i 0 extproc('xmlValidatePushCData')
562     d  ctxt                               value like(xmlValidCtxtPtr)
563     d  data                           *   value options(*string)               const xmlChar *
564     d  len                          10i 0 value
565
566     d xmlValidatePopElement...
567     d                 pr            10i 0 extproc('xmlValidatePopElement')
568     d  ctxt                               value like(xmlValidCtxtPtr)
569     d  doc                                value like(xmlDocPtr)
570     d  elem                               value like(xmlNodePtr)
571     d  qname                          *   value options(*string)               const xmlChar *
572
573      /endif                                                                    LIBXML_REGEXP_ENABLD
574      /endif                                                                    LIBXML_VALID_ENABLED
575      /endif                                                                    XML_VALID_H__
576