<!--********************************************************************************************

	XML ELEMENT DEFINITIONS
	BASED ON 2002-02-21 WebCGM

    This DTD is a prototype distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

	THIS IS NOT A PRODUCTION DTD!! USE WITH EXTREME CAUTION!! IT IS MERELY A PROTOTYPE DTD TO SHOW THAT THE webCGM TS 
 	CLEAR TEXT CGM SAMPLES CAN EASILY BE TRANSFORMED INTO XML.

	This script only understands the NIST/OPENCGM WebCGM Test Suite. Copyright (C) 2002, Lofton Henderson. All Rights 	Reserved.
	Please see accompanying license agreement 'copyright-license.html' for the full details.
    
    It is known to have 'orphan' elements which should be attached most likely into PIC, FIGURE, PICBODY or APSBODY
    

	**********THIS DTD WOULD BE BETTER SERVED AS AN XML-SCHEMA DUE TO THE NATURE OF THE DATA*********

	Version 0.7 2003-05-15
			Fixed BITONALTILE - added the param attribute
			
	Version 0.6 2002-11-21
			Fixed duplicate attribute charset in GLYPHMAP per Don A Gignac. Fix was to change first charset to charsetindex.
			Changed BITONALTILE to EMPTY with a data attribute
			Changed POLYGON and DISJTLINE
			
	Version 0.5
		2002-11-18 changed APSATTR
			-NOTE there are still a large number of orphan elements that need to be tied into the main elements as children.
			This needs to be addressed.
		2002-11-04 LJJ Major overhaul - Changed from Elements to Attributes
							Changed THREEPTARCSPEC back to 3PTARCSPEC (but it is not used anyhow)
	Version 0.4 
		2002-11-04 LJJ Added PATTABLE to PICBODY
						Added ARC3PT, PATINDEX, PATSIZE, HATCHINDEX, LINECAP to APSBODY
						Added LINEEDGETYPEDEF to PIC
						Changed V_DELTAPAIR, THREEPTARCSPEC, CLOSESPEC to ENTITIES
		2002-11-03 LJJ Added APNDTEXT to APSBODY
						Changed TEXTPIECE and POINTLIST to ENTITIES
	Version 0.3
		2002-10-28 LJJ Added CHARSPACE to APSBODY Content Model
		2002-10-23 LJJ Added ARCCTR, EDGEJOIN to APSBODY Content Model
						Added TILE, BITONALTILE  to TILEARRAY Content Model
		2002-10-17 LJJ Modification to include webCGM Components, Remove (R) and (I) Elements 
					so as to reduce file size which was at 100% the original clear text and afterwards became 30% larger.
					(Because you must add end-tags to every element, the XML representation will always be some percentage
					larger than straight clear text)
		2002-09-23,24,25  LJJ Modification of APSBody to include CIRCLE, TILEARRAY etc
							Revised SDR to remove entities
							Changed INCRPOLYGONSET,  NUB , NURB Elements to remove ambiguous content
							Changed DIRECTCOLR to ENTITY

	Version 0.2 2002-09-20 LJJ - changed VDC, V, VC, N,  SF, & K to ENTITIES
								- changed the "J" Elements back to their original names except for BEGPROTREGION
								which is now DEFPROTREGION
	Version 0.1 2002-09-09 by 
		L. John Junod, Code 2052, NAVSEA NSWC Carderock
		9500 MacArthur Blvd, W. Bethesda, MD 20817-5700
		junodLJ@nswccd.navy.mil

*********************************************************************************************-->
<!--
	Definitions
-->
<!-- 		Bitstream -->
<!ELEMENT B (#PCDATA)>
<!-- 		String -->
<!ELEMENT S (#PCDATA | S)*>
<!-- 		String Fixed -->
<!-- <!ENTITY SF "(S)"> -->
<!-- 		Integer -->
<!-- <!ENTITY % I "#PCDATA"> -->
<!-- 		Real -->
<!-- <!ENTITY % R "#PCDATA"> -->
<!-- 	Virtual Display Coordinate -->
<!--
	VDC (
	<I> | <R>
	)
	{ coordinate data, depending on VDC TYPE }

-->
<!-- <!ENTITY % VDC "(I | R)"> -->
<!-- set VDC to REAL for testing -->
<!-- <!ENTITY % VDC "#PCDATA"> -->
<!-- 	RED GREEN BLUE -->
<!--
	<RED GREEN BLUE> (
	<I:RED><I:GREEN><I:BLUE>
-->
<!-- 		V 	-->
<!--	V (
	<VDC> | <R>
	)

	This corresponds to the SS data type of ISO/IEC 8632-1. It is used for line width, marker size, fill
	interiors, and edge width, as well as some parameters of user line definition. The resolution of this
	parameter type to VDC or R depends on the corresponding SPECIFICATION MODE element.
	See part 1, 7.1.

-->
<!-- <!ENTITY % V "( I | R)"> -->
<!-- 	Name -->
<!--
	N (
	<I> {name}
	)

-->
<!-- <!ENTITY % N "(#PCDATA)"> -->
<!-- 		Viewport Coordinate -->
<!--
	VC (
	<R> | <I> {viewport coordinate data}
	)

	The abstract parameter type VC, a single VC value, is either a real or an integer, depending on the
	declaration of the picture descriptor element DEVICE VIEWPORT SPECIFICATION MODE. When
	DEVICE VIEWPORT SPECIFICATION MODE is 'fraction of display surface?, the value is real.
	When DEVICE VIEWPORT SPECIFICATION MODE is 'millimetres with scale factor? or 'physical
	device coordinates?, the value is integer.

 -->
<!-- <!ENTITY % VC "(R | I)"> -->
<!-- <!ENTITY % VC "(#PCDATA)"> -->
<!--            DIRECTCOLR      -->
<!--
	<DIRECTCOLR> (
	<RED GREEN BLUE> {if COLOUR MODEL is RGB}
	| <L A B> {if COLOUR MODEL is CIELAB}
	| <L U V> {if COLOUR MODEL is CIELUV}
	| <CYAN MAGENTA YELLOW BLACK>
		{if COLOUR MODEL is CMYK}
	| <A B C> {if COLOUR MODEL is RGB-related}

-->
<!-- <!ENTITY % DIRECTCOLR "(RGB | LAB | LUV | CMYB | ABC)"> -->
<!--    COLOUR  -->
<!--
	K (
	<I> | <DIRECTCOLR>
	)

	{colour specifier, depending on COLOUR SELECTION MODE}

-->
<!-- <!ENTITY % K "(%I; | %DIRECTCOLR;)"> -->
<!-- <!ENTITY % K "#PCDATA | RGB | LAB | LUV | CMYB | ABC"> -->
<!-- <!ELEMENT RGB EMPTY>
<!ATTLIST RGB
R CDATA #REQUIRED
G CDATA #REQUIRED
B CDATA #REQUIRED> -->
<!--		POINTLIST  	-->
<!--
	POINTLIST (
	<P:POINT>
	<<P:POINT>>+
	)

-->
<!-- <!ENTITY % POINTLIST "P, P+"> -->
<!--		<L A B>	-->
<!--
	<L A B> (
	<I:L><I:A><I:B>
	)

-->
<!-- <!ELEMENT LAB EMPTY>
<!ATTLIST LAB
L CDATA #REQUIRED
A CDATA #REQUIRED
B CDATA #REQUIRED> -->
<!--		<L u v>	-->
<!--
	<L U V> (
	<I:L><I:U><I:V>
	)

-->
<!-- <!ELEMENT LUV EMPTY>
<!ATTLIST LUV
L CDATA #REQUIRED
U CDATA #REQUIRED
V CDATA #REQUIRED> -->
<!--		<CYAN MAGENTA YELLOW BLACK>	-->
<!--
	<CYAN MAGENTA YELLOW BLACK> (
	<I:CYAN><I:MAGENTA><I:YELLOW><I:BLACK>
	)

-->
<!-- <!ELEMENT CMYB EMPTY>
<!ATTLIST CMYB
C CDATA #REQUIRED
M CDATA #REQUIRED
Y CDATA #REQUIRED
B CDATA #REQUIRED> -->
<!--		<A B C>	-->
<!--	
	<A B C> (
	<I:A><I:B><I:C>
	)

-->
<!-- <!ELEMENT ABC (#PCDATA)>
<!ATTLIST ABC
A CDATA #REQUIRED
B CDATA #REQUIRED
C CDATA #REQUIRED> -->
<!--            POINTREC        -->
<!--
	POINTREC (
	<VDC><VDC>
	)

-->
<!-- <!ELEMENT POINTREC (%VDC;, %VDC;)> -->
<!-- 		POINT 	-->
<!--
	P (
	<POINTREC>
	| < <LEFT PAREN> <OPTSEP> <POINTREC> <OPTSEP>
	<RIGHT PAREN> >

	POINT in VDC space. Parentheses are optional. If they are used, they shall group two VDC
	numbers. The parenthesized form is intended to aid readability of the metafile. If there are not two
	numbers in each parenthesized group, the metafile is non-conforming.

-->
<!-- <!ELEMENT P (%VDC;, %VDC;)> -->
<!--		VPOINTREC	-->
<!--
	VPOINTREC (
	<VC><SEP><VC>
	)

-->
<!-- <!ELEMENT VPOINTREC (%VC;, %VC;)> -->
<!-- <!ELEMENT VPOINTREC (#PCDATA)> -->
<!-- 		String Data Record 	-->
<!-- <!ELEMENT SDR (I | R | B | S | P | VP | TM)*> -->
<!-- 		View Point 	-->
<!--
	VP (
	<VPOINTREC>
	| < <LEFT PAREN> <OPTSEP> <VPOINTREC> <OPTSEP>
	<RIGHT PAREN> >
	)

-->
<!-- <!ELEMENT VP (VPOINTREC)> -->
<!--		TM	-->
<!--
	TM (
	<<R: a11><R: a12>
	<R: a21><R: a22>
	<VDC: a13><VDC: a23>>
	)

-->
<!ELEMENT TM EMPTY>
<!ATTLIST TM
	a11 CDATA #REQUIRED
	a12 CDATA #REQUIRED
	a21 CDATA #REQUIRED
	a22 CDATA #REQUIRED
	a13 CDATA #REQUIRED
	a23 CDATA #REQUIRED
>
<!-- ******************** END OF DEFINITIONS OF PRIMITIVES *******************************-->
<!--            BEGIN METAFILE          -->
<!--
	BEGMF (
	<SF:NAME>
	)

-->
<!ELEMENT CGM (S, MFVERSION, MFDESC, MFELEMLIST, FONTLIST, CHARSETLIST, VDCTYPE, COLRPREC, COLRINDEXPREC, COLRVALUEEXT, MAXCOLRINDEX, INTEGERPREC, REALPREC, CHARCODING, MAXVDCEXT, PIC+)>
<!--		END METAFILE  	-->
<!--
	ENDMF

-->
<!-- <!ELEMENT ENDMF EMPTY> -->
<!--		BEGIN PICTURE  	-->
<!--
	BEGPIC (
	<SF:PICTURENAME>
	)

-->
<!ELEMENT PIC (S, SCALEMODE, VDCEXT, COLRMODE, LINEWIDTHMODE, EDGEWIDTHMODE, LINEEDGETYPEDEF*, PICBODY)>
<!--		BEGIN PICTURE BODY  	-->
<!--
	BEGPICBODY

-->
<!ELEMENT PICBODY (LINECLIPMODE, MARKERCLIPMODE, EDGECLIPMODE, CLIP, VDCREALPREC, COLRTABLE?, EDGEVIS, TRANSPARENCY, RESTRTEXTTYPE, CHARSETINDEX, ALTCHARSETINDEX, PATTABLE*, APS*)>
<!--		END PICTURE  	-->
<!--
	ENDPIC

-->
<!-- <!ELEMENT ENDPIC EMPTY> -->
<!--		BEGIN SEGMENT  	-->
<!--	
	BEGSEG (
	<N:SEGID>
	)

-->
<!ELEMENT SEG EMPTY>
<!ATTLIST SEG
	segid CDATA #REQUIRED
>
<!--		END SEGMENT  	-->
<!--	
	ENDSEG

-->
<!-- <!ELEMENT ENDSEG EMPTY> -->
<!--		BEGIN FIGURE  	-->
<!--
	BEGFIGURE

-->
<!ELEMENT FIGURE ((POLYBEZIER)*)>
<!--		END FIGURE  	-->
<!--
	ENDFIGURE

-->
<!-- <!ELEMENT ENDFIGURE EMPTY> -->
<!--		BEGIN PROTECTION REGION  	-->
<!--
	BEGPROTREGION (
	<I:REGIONINDEX> {positive}
	)

-->
<!ELEMENT DEFPROTREGION EMPTY>
<!ATTLIST DEFPROTREGION
	regionindex CDATA #REQUIRED
>
<!--		END PROTECTION REGION  	-->
<!--
	ENDPROTREGION
-->
<!-- <!ELEMENT ENDPROTREGION EMPTY> -->
<!--		BEGIN COMPOUND LINE  	-->
<!--
	BEGCOMPOLINE
-->
<!ELEMENT COMPOLINE EMPTY>
<!-- IS THIS USED? -->
<!--		END COMPOUND LINE  	-->
<!--
	ENDCOMPOLINE

-->
<!-- <!ELEMENT ENDCOMPOLINE EMPTY> -->
<!--		BEGIN COMPOUND TEXT PATH  	-->
<!--
	BEGCOMPOTEXTPATH

-->
<!ELEMENT COMPOTEXTPATH EMPTY>
<!-- IS THIS USED? -->
<!--		END COMPOUND TEXT PATH  	-->
<!--
	ENDCOMPOTEXTPATH

-->
<!-- <!ELEMENT ENDCOMPOTEXTPATH EMPTY> -->
<!--		BEGIN TILE ARRAY  	-->
<!--
	<BEGTILEARRAY> (
	<P:POSITION>
	<0 | 90 | 180 | 270>
	<90 | 270>
	<I:TILESPERPATH> {positive}
	<I:TILESPERLINE> {positive}
	<I:CELLSPERTILEPATH> {positive}
	<I:CELLSPERTILELINE> {positive}
	<R:CELLSPACING> {positive}
	<R:LINESPACING> {positive}
	<I:PATHOFFSET> {non-negative}
	<I:LINEOFFSET> {non-negative}
	<I:CELLSPERPATH> {positive}
	<I:CELLSPERLINE> {positive}
	)

-->
<!ELEMENT TILEARRAY ((TILE | BITONALTILE)*)>
<!ATTLIST TILEARRAY
	position CDATA #REQUIRED
	angle1 (0 | 90 | 180 | 270) #REQUIRED
	angle2 (90 | 270) #REQUIRED
	tilesperpath CDATA #REQUIRED
	tilesperline CDATA #REQUIRED
	cellspertilepath CDATA #REQUIRED
	cellspertileline CDATA #REQUIRED
	cellspacing CDATA #REQUIRED
	linespacing CDATA #REQUIRED
	pathoffset CDATA #REQUIRED
	lineoffset CDATA #REQUIRED
	cellsperpath CDATA #REQUIRED
	cellsperline CDATA #REQUIRED
>
<!ELEMENT A0 EMPTY>
<!ELEMENT A90 EMPTY>
<!ELEMENT A180 EMPTY>
<!ELEMENT A270 EMPTY>
<!--		END TILE ARRAY  	-->
<!--
	ENDTILEARRAY

-->
<!-- <!ELEMENT ENDTILEARRAY EMPTY> -->
<!--		BEGIN APPLICATION STRUCTURE  	-->
<!--
	BEGAPS (
	<SF:APSID>
	<SF:APSTYPE>
	<STLIST | APS>
	)

From 3.2.1.5 of webCGM: This version and level of WebCGM do not allow additional APS elements to occur, other than 'grobject', 'layer', 'para', and 'subpara'. Private metadata may be associated with WebCGM objects by keeping the metadata outside of the CGM, and associating it with objects within the CGM. The methods, structures, and results of such private intelligent graphics architectures are not specified by WebCGM 1.0, and are outside the scope of standardized interchange under WebCGM 1.0.

-->
<!ELEMENT APS ((APSATTR | APSBODY)*)>
<!ATTLIST APS
	apsid CDATA #REQUIRED
	apstype (grobject | layer | para | subpara) #REQUIRED
	set (STLIST | DEFAPS) #REQUIRED
>
<!ELEMENT STLIST EMPTY>
<!ELEMENT DEFAPS EMPTY>
<!--		BEGIN APPLICATION STRUCTURE BODY 	-->
<!--
	BEGAPSBODY

-->
<!ELEMENT APSBODY ((APS | APNDTEXT | ARCCTR | ARC3PT | CHARHEIGHT | CHARORI | CHARSPACE | CIRCLE | EDGECOLR | EDGEJOIN | EDGEVIS | EDGETYPE | EDGEWIDTH | ELLIPSE | ELLIPARC | FIGURE | FILLCOLR | HATCHINDEX | INTSTYLE | LINE | LINECAP | LINEJOIN | LINECOLR | LINEWIDTH | LINETYPE | PATINDEX | PATSIZE | POLYBEZIER | POLYGON | RESTRTEXT | TEXTALIGN | TEXTCOLR | TEXTFONTINDEX | TILEARRAY | TRANSPARENCY)*)>
<!--		END APPLICATION STRUCTURE		-->
<!--
	ENDAPS
-->
<!-- <!ELEMENT ENDAPS EMPTY> -->
<!--		7.2 Encoding metafile descriptor elements	-->
<!--		METAFILE VERSION  	-->
<!--
	MFVERSION (
	<I:VERSION>
	{1=Version 1, 2=Version 2, 3=Version 3, 4=Version 4}
	)

-->
<!ELEMENT MFVERSION EMPTY>
<!ATTLIST MFVERSION
	version CDATA #REQUIRED
>
<!--		METAFILE DESCRIPTION  	-->
<!--
	MFDESC (
	<SF:DESCRIPTION>
	)

-->
<!ELEMENT MFDESC (S+)>
<!--		VDC TYPE  	-->
<!--	
	VDCTYPE (
	< INTEGER | REAL >
	)

-->
<!ELEMENT VDCTYPE EMPTY>
<!ATTLIST VDCTYPE
	type (INTEGER | REAL) #REQUIRED
>
<!--		INTEGER PRECISION  	-->
<!--
	INTEGERPREC (
	<I:MININT>
	<I:MAXINT>
	)

	The most negative and most positive integers (base 10) are given. These parameters are 
	interpreted independently of all precisions currently set.

-->
<!ELEMENT INTEGERPREC EMPTY>
<!ATTLIST INTEGERPREC
	min CDATA #REQUIRED
	max CDATA #REQUIRED
>
<!--		REAL PRECISION  	-->
<!--
	REALPREC (
	<R:MINREAL>
	<R:MAXREAL>
	<I:DIGITS>
	)

	The parameters of this element are interpreted independently of all precisions currently set. 
	The MINREAL and MAXREAL are signed real numbers giving the representable range of numbers. The 
	DIGITS parameter gives the minimum number of DECIMAL DIGITS of accuracy assumed, and is of key 
	importance in preventing roundoff error when the incremental forms of output primitives are 
	used.

	NOTE 1 This choice of format was patterned after the floating_point_constraint of the Ada 
	programming language.

-->
<!-- <!ELEMENT REALPREC (R, R, I)> -->
<!ELEMENT REALPREC EMPTY>
<!ATTLIST REALPREC
	min CDATA #REQUIRED
	max CDATA #REQUIRED
	digits CDATA #REQUIRED
>
<!--		INDEX PRECISION  	-->
<!--
	INDEXPREC (
	<I:MININT>
	<I:MAXINT>
	)

	The most negative and most positive integers (base 10) are given. These parameters are 
	interpreted independently of all precisions currently set.

-->
<!ELEMENT INDEXPREC EMPTY>
<!ATTLIST INDEXPREC
	min CDATA #REQUIRED
	max CDATA #REQUIRED
>
<!--		COLOUR PRECISION  	-->
<!--
	COLRPREC (
	<I:MAXCOMPONENT>
	)

	NOTE 2 Colour direct values are 3*I or 4*I, depending on COLOUR MODEL. COLOUR PRECISION gives a 
	single integer range, 0..MAXCOMPONENT, within which each of the three or four components is 
	contained. The parameters are interpreted independently of any currently set precisions.

-->
<!ELEMENT COLRPREC EMPTY>
<!ATTLIST COLRPREC
	max CDATA #REQUIRED
>
<!--		COLOUR INDEX PRECISION  	-->
<!--
	COLRINDEXPREC (
	<I:MAXINT>
	)

	The smallest colour index is 0. The most positive integer that may occur in a colour index 
	parameter is given. This parameter is interpreted independently of all precisions currently set. 
	See MAXCOLRINDEX.
-->
<!ELEMENT COLRINDEXPREC EMPTY>
<!ATTLIST COLRINDEXPREC
	max CDATA #REQUIRED
>
<!--		MAXIMUM COLOUR INDEX  	-->
<!--
	MAXCOLRINDEX (
	<I:MAXINDEXVALUE>
	)

	The MAXINDEXVALUE shall be less than or equal to the <MAXINT> parameter of COLRINDEXPREC.

-->
<!ELEMENT MAXCOLRINDEX EMPTY>
<!ATTLIST MAXCOLRINDEX
	max CDATA #REQUIRED
>
<!--		COLOUR VALUE EXTENT  	-->
<!--
	COLRVALUEEXT (
	<RGBCOLRMAP>
	|
	<LABCOLRMAP>
	|
	<LUVCOLRMAP>
	|
	<CMYKCOLRMAP>
	|
	<ABCCOLRMAP>
	)

-->
<!ELEMENT COLRVALUEEXT EMPTY>
<!-- note it is either white and black or the 3 scales and offsets -->
<!ATTLIST COLRVALUEEXT
	white CDATA #IMPLIED
	black CDATA #IMPLIED
	scale1 CDATA #IMPLIED
	offset1 CDATA #IMPLIED
	scale2 CDATA #IMPLIED
	offset2 CDATA #IMPLIED
	scale3 CDATA #IMPLIED
	offset3 CDATA #IMPLIED
>
<!--		<RGBCOLRMAP>  	-->
<!--	
	RGBCOLRMAP (
	<RED GREEN BLUE:BLACK> 
	<RED GREEN BLUE:WHITE>
	)
-->
<!--		<LABCOLRMAP>  	-->
<!--
	LABCOLRMAP (
	<R:COLRSCALE1>  <R:COLROFFSET1> 
	<R:COLRSCALE2>  <R:COLROFFSET2>
	<R:COLRSCALE3>  <R:COLROFFSET3>
	)

-->
<!--		<LUVCOLRMAP>  	-->
<!--		<CMYKCOLRMAP>  	-->
<!--
	CMYKCOLRMAP (
	<CYAN MAGENTA YELLOW BLACK:WHITE>
	<CYAN MAGENTA YELLOW BLACK:BLACK>
	)

-->
<!--		<ABCCOLRMAP>  	-->
<!--		METAFILE ELEMENT LIST  	-->
<!--
	MFELEMLIST (
	<S:ELEMENTNAMES>
	)

	The string parameter consists of a list of element names separated by . In addition, the words 
	DRAWINGPLUS, DRAWINGSET, VERSION2, EXTDPRIM, VERSION2GKSM, VERSION3, and VERSION4 may be used in 
	this string. See Part 1, 7.3.11 for the rules on which of these codes may be used in which 
	metafile versions, and Part 1, 6.3.2 for the meanings of these pseudo-codes.

-->
<!ELEMENT MFELEMLIST (S)>
<!--		METAFILE DEFAULTS REPLACEMENT 	-->
<!--
	BEGMFDEFAULTS
	<ELEMENT>+
	ENDMFDEFAULTS

	Between the two bracketing elements, applicable CGM elements shall use the same format as 
	described elsewhere in this section.
-->
<!ELEMENT MFDEFAULTS ANY>
<!--		FONT LIST  	-->
<!--
	FONTLIST (
	<SF:FONTNAME>
	<  <SF:FONTNAME> >*
	)

-->
<!ELEMENT FONTLIST ((S)+)>
<!--		CHARACTER SET LIST  	-->
<!--
	CHARSETLIST (
	<CHARSETDESIGNATOR>
	< <CHARSETDESIGNATOR> >*
	)

-->
<!ELEMENT CHARSETLIST (DESIGNATOR+)>
<!--		CHARSETDESIGNATOR  	-->
<!--
	CHARSETDESIGNATOR (
	< STD94 | 
	STD96 |
	STD94MULTIBYTE |
	STD96MULTIBYTE |
	COMPLETECODE >,
	<SF:TAIL>
	)

-->
<!ELEMENT DESIGNATOR EMPTY>
<!ATTLIST DESIGNATOR
	charset (STD94 | STD96 | STD94MULTIBYTE | STD96MULTIBYTE | COMPLETECODE) #REQUIRED
	tail CDATA #REQUIRED
>
<!--		 CHARACTER CODING ANNOUNCER	-->
<!--
	CHARCODING (
	< BASIC7BIT |
	BASIC8BIT |
	EXTD7BIT |
	EXTD8BIT >
	)

-->
<!ELEMENT CHARCODING EMPTY>
<!ATTLIST CHARCODING
	coding (BASIC7BIT | BASIC8BIT | EXTD7BIT | EXTD8BIT) #REQUIRED
>
<!--		NAME PRECISION  	-->
<!--
	NAMEPREC (
	<I:MININT>
	<I:MAXINT>
	)

-->
<!ELEMENT NAMEPREC EMPTY>
<!ATTLIST NAMEPREC
	min CDATA #REQUIRED
	max CDATA #REQUIRED
>
<!--		MAXIMUM VDC EXTENT  	-->
<!--
	MAXVDCEXT (
	<P:FIRSTCORNER>
	<P:SECONDCORNER>
	)

-->
<!ELEMENT MAXVDCEXT EMPTY>
<!ATTLIST MAXVDCEXT
	p1 CDATA #REQUIRED
	p2 CDATA #REQUIRED
>
<!--		SEGMENT PRIORITY EXTENT  	-->
<!--
	SEGPRIEXT (
	<I:MINSEGPRI> {non-negative}
	<I:MAXSEGPRI> {non-negative}
	) >

-->
<!ELEMENT SEGPRIEXT EMPTY>
<!ATTLIST SEGPRIEXT
	min CDATA #REQUIRED
	max CDATA #REQUIRED
>
<!--		COLOUR MODEL  	-->
<!--
	COLRMODEL (
	<I:MODELINDEX>
		{1=RGB, 2=CIELAB, 3=CIELUV, 4=CMYK, 5=RGB-related,
		>5, reserved for registered values}
	)
-->
<!ELEMENT COLRMODEL EMPTY>
<!ATTLIST COLRMODEL
	model CDATA #REQUIRED
>
<!--		COLOUR CALIBRATION  	-->
<!--
	COLRCALIB (
	<I:CALIBSELECTION>
		{1=unspecified, 2=reference white only,
		3=reference white, matrix1,
		4=reference white, matrix1, lookup tables,
		5=reference white, matrix1, lookup tables, matrix2,
		6=reference white, matrix1, matrix2,
		7=lookup tables, matrix2,
		8=matrix2,
		9=reference white, grid locations + grid values,
		>9, reserved for registered values}
	<R:XN>  <R:YN>  <R:ZN>
	<RGBCALIBDATA>
	<CMYKCALIBDATA>
	)

-->
<!ELEMENT COLRCALIB (RGBCALIBDATA, CMYKCALIBDATA)>
<!ATTLIST COLRCALIB
	calibselection CDATA #REQUIRED
	x CDATA #REQUIRED
	y CDATA #REQUIRED
	z CDATA #REQUIRED
>
<!--		<RGBCALIBDATA>  	-->
<!--
	RGBCALIBDATA (
	<RGBCALIBMATRIX>
	<ABCTRANMATRIX>
	<I:LUTLENGTH> {n>=0}
	<RLUTENTRY>(n)
	<GLUTENTRY>(n)
	<BLUTENTRY>(n)
	)

-->
<!ELEMENT RGBCALIBDATA (RLUTENTRY*, GLUTENTRY*, BLUTENTRY*)>
<!ATTLIST RGBCALIBDATA
	xr CDATA #REQUIRED
	xg CDATA #REQUIRED
	xb CDATA #REQUIRED
	yr CDATA #REQUIRED
	yg CDATA #REQUIRED
	yb CDATA #REQUIRED
	zr CDATA #REQUIRED
	zg CDATA #REQUIRED
	zb CDATA #REQUIRED
	ra CDATA #REQUIRED
	rb CDATA #REQUIRED
	rc CDATA #REQUIRED
	ga CDATA #REQUIRED
	gb CDATA #REQUIRED
	gc CDATA #REQUIRED
	ba CDATA #REQUIRED
	bb CDATA #REQUIRED
	bc CDATA #REQUIRED
	lutlength CDATA #REQUIRED
>
<!--		<RGBCALIBMATRIX>  	-->
<!--
	RGBCALIBMATRIX ( 
	<R: XR>  <R: XG>  <R: XB>  
	<R: YR>  <R: YG>  <R: YB> 
	<R: ZR>  <R: ZG>  <R: ZB>
	)

-->
<!--		<ABCTRANMATRIX>  	-->
<!--
	ABCTRANMATRIX (
	<R: RA>  <R: RB>  <R: RC>
	<R: GA>  <R: GB>  <R: GC> 
	<R: BA>  <R: BB>  <R: BC>
	)

-->
<!--		<RLUTENTRY>  	-->
<!--
	RLUTENTRY (
	<I:R>  <I:RPRIME>
	)

-->
<!ELEMENT RLUTENTRY EMPTY>
<!ATTLIST RLUTENTRY
	r CDATA #REQUIRED
	rprime CDATA #REQUIRED
>
<!--		<GLUTENTRY>  	-->
<!--
	GLUTENTRY (
	<I:G>  <I:GPRIME>
	)

-->
<!ELEMENT GLUTENTRY EMPTY>
<!ATTLIST GLUTENTRY
	g CDATA #REQUIRED
	gprime CDATA #REQUIRED
>
<!--		<BLUTENTRY>  	-->
<!--
	BLUTENTRY (
	<I:B>  <I:BPRIME>
	)

-->
<!ELEMENT BLUTENTRY EMPTY>
<!ATTLIST BLUTENTRY
	b CDATA #REQUIRED
	bprime CDATA #REQUIRED
>
<!--		<CMYKCALIBDATA>  	-->
<!--
	CMYKCALIBDATA (
	<I:GRIDTABLELENGTH> {n>=0} 
	<<DIRECTCOLR:CMYKGRIDLOCATION>>(n)
	<XYZGRIDLOCATION>(n)
	)

-->
<!ELEMENT CMYKCALIBDATA EMPTY>
<!ATTLIST CMYKCALIBDATA
	length CDATA #REQUIRED
	directk CDATA #REQUIRED
	xyzgridlocations CDATA #REQUIRED
>
<!--		<XYZGRIDLOCATION>  	-->
<!--
	XYZGRIDLOCATION
	<R:CIEXYZX>
	<R:CIEXYZY>  
	<R:CIEXYZZ>

-->
<!-- <!ELEMENT XYZGRIDLOCATION (R, R, R)> -->
<!ELEMENT XYZGRIDLOCATION EMPTY>
<!ATTLIST XYZGRIDLOCATION
	XYZX CDATA #REQUIRED
	XYZY CDATA #REQUIRED
	XYZZ CDATA #REQUIRED
>
<!--		FONT PROPERTIES  	-->
<!--
	FONTPROP (
	<PROPERTY3TUPLE>
	< <PROPERTY3TUPLE>>*
	)

-->
<!ELEMENT FONTPROP ((PROPERTY3TUPLE)+)>
<!--		<PROPERTY3TUPLE>  	-->
<!--
	PROPERTY3TUPLE (
	<I:PROPERTYINDICATOR> 
		{1=font index, 2=standard version,
		3=design source, 4=font family, 5=posture,
		6=weight, 7=proportionate width,
		8=included glyph collections,
		9=included glyphs, 10=design size,
		11=minimum size, 12=maximum size,
		13=design group, 14=structure,
		>14, reserved for registered values}
	<I:PRIORITY>
	<SDR:PRIORITYVALUERECORD>
		 SDR:PRIORITYVALUERECORD ( 
		<<I: i_IX><I: 1><I: FONTINDEX>> 
		| <<I: i_I><I: 1><I:STANDARDVERSION>>
		| <<I: i_SF><I: 1><SF:DESIGNSOURCE>>|
		| <I: i_SF><I: 1><SF:FONTFAMILY>>
		| <<I: i_IX><I: 1><I:POSTURE>>
		| <<I: i_IX><I: 1><I:WEIGHT>>
		| <<I: i_IX><I: 1><I:PROPORTIONATEWIDTH>>
		| <<I: i_IX><I: n><INCLUDGLYPHCOLLECT>(n)>
		| <<I: i_UI32><I: m><INCLUDGLYPHS>(m)>
		| <<I: i_R><I: 1><R:DESIGNSIZE>>
		| <<I: i_R><I: 1><R:MINIMUMSIZE>>
		| <<I: i_R><I: 1><R:MAXIMUMSIZE>>
		| <<I: i_UI8><I: 3><DESIGNGROUP>>
		| <<I: i_IX><I: 1><I:STRUCTURE>>
	
		NOTE 3 i_XX in the above denotes the integer value of the 'data type designator? for data type 	
		?XX? as assigned in annex C of ISO/IEC 8632-1. For example i_IX represents the designator for 	
		data type IX, which is assigned the value 11.
	
		See 6.3.7 for complete SDR delimiting and formatting requirements.

	<I:FONTINDEX> {positive}
	<I:STANDARDVERSION> {positive}
	<I:POSTURE>
		{0=not applicable, 1=upright,
		2=oblique, 3=back slanted oblique,
		4=italic, 5=back slanted italic, 6=other,
		>6 reserved for registered values}
	<I:WEIGHT>
		{0=not applicable, 1=ultra light,
		2=extra light, 3=light,
		4=semi light, 5=medium,
		6=semi bold, 7=bold,
		8=extra bold, 9= ultra bold,
		>9 reserved for registered values}
	<I:PROPORTIONATEWIDTH>
		{0=not applicable, 1=ultra condensed,
		2=extra condensed, 3=condensed,
		4=semi condensed, 5=medium,
		6=semi expanded, 7=expanded,
		8=extra expanded, 9=ultra expanded,
		>9 reserved for registered values}
-->
<!ELEMENT PROPERTY3TUPLE EMPTY>
<!ATTLIST PROPERTY3TUPLE
	priorityindicator CDATA #REQUIRED
	priority CDATA #REQUIRED
	sdr CDATA #REQUIRED
	fontindex CDATA #REQUIRED
	standardversion CDATA #REQUIRED
	posture CDATA #REQUIRED
	weight CDATA #REQUIRED
	proportionatewidth CDATA #REQUIRED
>
<!--		<INCLUDGLYPHCOLLECT>  	-->
<!--
 	INCLUDGLYPHCOLLECT (
	<I:CHARSETINDEX> {positive} 
	)

-->
<!ELEMENT INCLUDGLYPHCOLLECT EMPTY>
<!ATTLIST INCLUDGLYPHCOLLECT
	charsetindex CDATA #REQUIRED
>
<!--		<INCLUDGLYPH>  	-->
<!--
	INCLUDGLYPH (
	<I:AFII32BITIDENTIFIER>
	<R:DESIGNSIZE> {positive}
	<R:MINIMUMSIZE> {positive}
	<R:MAXIMUMSIZE> {positive}
	<I:STRUCTURE>
		{0=undefined or not applicable,
		1=solid, 2=outline,
		>2 reserved for registered values}
	)

-->
<!ELEMENT INCLUDGLYPH EMPTY>
<!ATTLIST INCLUDGLYPH
	afii CDATA #REQUIRED
	designsize CDATA #REQUIRED
	minsize CDATA #REQUIRED
	maxsize CDATA #REQUIRED
	structure CDATA #REQUIRED
>
<!--		<DESIGNGROUP>  	-->
<!--
	DESIGNGROUP (
	<I:CLASS> 
	<I:SUBCLASS>
	<I:SPECIFICGROUP>
	)

-->
<!ELEMENT DESIGNGROUP EMPTY>
<!ATTLIST DESIGNGROUP
	class CDATA #REQUIRED
	subclass CDATA #REQUIRED
	specificgroup CDATA #REQUIRED
>
<!--		GLYPH MAPPING  	-->
<!--
	GLYPHMAP (
	<I:CHARSETINDEX> {positive}
	<BASISSET>
	<I:OCTETSPERCODE> {this defines m>0}
	<I:GLYPHSOURCE>
		{1=afii registry of 4-byte identifiers,
		>1 reserved for registered values}
	<SDR:CODEGLYPHASSOCIATION>
	
		<SDR:CODEGLYPHASSOCIATION>  (
		<I:i_UI8><I:2n>
		< <I:RUNCOUNT><I:CODE> >(n)
		>
		
		<
		<I:i_UI32><I:n>
		< <I:AFII32BITIDENTIFIER> >(n)
		)

	NOTE 4 i_UI8 and i_UI32 in the above respectively denote the integer value of the 'data type 
	designator? for data type UI8 and UI32 as assigned in annex C of ISO/IEC 8632-1.

	NOTE 5 The code and glyphname lists are encoded in a runlength form. The runlength syntax in the 
	code list is explicit: each entry is of the form (N, CODE), N=1..255. If N=1, then only the 
	single specified code is defined. If N>1, then a sequence of codes is defined. The base code of 
	the sequence is the explicitly specified one, and each successive code is 1 greater than the 
	previous pair. N is the number of codes in the sequence, and is limited to 255 per sequence (for 
	uniformity of results across encodings). The list of glyph names is parallel to the code list. 
	The glyph names are associated with the corresponding codes, and when there is a run longer than 
	1 in the codes, there is also a run longer than 1 in the glyph names. Each glyph name in a run 
	is 1 greater than its predecessor.

	NOTE 6 See 6.3.7 for complete SDR delimiting and formatting requirements.

	NOTE 7 The first (enumerated) parameter selects the location data type ([ldt]) for the 
	subsequent PICLOCATION and APSDIRLOCATION parameters. These are integer-bound parameters, and 
	the [ldt] selects one of three unsigned integer precisions. The values of PICLOCATION are the 
	offsets measured in characters from the first character of the metafile to the first character 
	of the associated BEGIN PICTURE element. The values of APSDIRLOCATION are the offsets measured 
	in characters from the start of the metafile to the first character of the APPLICATION STRUCTURE 
	DIRECTORY element of the associated picture. For the purpose of measuring offsets, a character 
	is a generic unit as defined in subclause 5.1. For string parameters, a character represents a 
	single byte, regardless of the ISO 2022 coding environment in effect for the string parameter 
	(See 6.7.3.2 ISO/IEC 8632-1:1992).

	NOTE 8 Editing of clear-text encoded Version 4 metafiles may invalidate PICLOCATION and 
	APSDIRLOCATION values. If so, these values must be recomputed. Also, translation of clear text 
	metafiles between computing environments may invalidate PICLOCATION and APSDIRLOCATION values as 
	different environments represent line endings differenly."


-->
<!-- <!ELEMENT GLYPHMAP (I, BASISSET, I, I, SDR)> -->
<!ELEMENT GLYPHMAP (#PCDATA)>
<!ATTLIST GLYPHMAP
	charsetindex CDATA #REQUIRED
	charset (STD94 | STD96 | STD94MULTIBYTE | STD96MULTIBYTE | COMPLETECODE) #REQUIRED
	tail CDATA #REQUIRED
	octets CDATA #REQUIRED
	source CDATA #REQUIRED
>
<!--		<BASISSET>  	-->
<!--
	BASISSET ( 
	<CHARSETDESIGNATOR> 
	)

	{see CHARACTER SET LIST}

-->
<!-- <!ELEMENT BASISSET (CHARSETDESIGNATOR)> -->
<!--		SYMBOL LIBRARY LIST  	-->
<!--
	SYMBOLLIBLIST (
	<SF:SYMBOLNAME>
	<<SF:SYMBOLNAME>>*
	)

-->
<!ELEMENT SYMBOLLIBLIST EMPTY>
<!ATTLIST SYMBOLLIBLIST
	symbolnames CDATA #REQUIRED
>
<!--		PICTURE DIRECTORY  	-->
<!--
	PICDIR (
	<UI8 | UI16 | UI32>
	<<PICDIRTRIPLE>>+
	)

-->
<!ELEMENT PICDIR EMPTY>
<!ATTLIST PICDIR
	set (UI8 | UI16 | UI32) #REQUIRED
	picid CDATA #REQUIRED
	picloc CDATA #REQUIRED
	apsdirloc CDATA #REQUIRED
>
<!--		PICDIRTRIPLE  	-->
<!--
	PICDIRTRIPLE ( 
	<SF:PICID>
	<I:PICLOCATION>
	<I:APSDIRLOCATION>
	)

	NOTE 9 The first (enumerated) parameter selects the location data type ([ldt]) for the 	subsequent PICLOCATION and 
	APSDIRLOCATION parameters. These are integer-bound parameters, and the [ldt] selects one of three unsigned integer 
	precisions. The values of PICLOCATION are the offsets measured in characters from the first character of the
	metafile to the first character	of the associated BEGIN PICTURE element. The values of APSDIRLOCATION are the offsets 
	measured in characters from the start of the metafile to the first character of the APPLICATION STRUCTURE 
	DIRECTORY element of the associated picture. For the purpose of measuring offsets, a character 	
	is a generic unit as	defined in Subclause 5.1. For string parameters, a character represents 	
	a single byte, regardless of the ISO 2022 coding environment in effect for the string parameter 	
	(See 6.7.3.2 ISO/IEC 8632-1:1992).

	NOTE 10 Editing of clear-text encoded Version 4 metafiles may invalidate PICLOCATION and 
	APSDIRLOCATION values. If so, these values must be recomputed. Also, translation of clear text 
	metafiles between computing environments may invalidate PICLOCATION and APSDIRLOCATION values as 
	different environments represent line endings differenly.

-->
<!ELEMENT PICDIRTRIPLE EMPTY>
<!ATTLIST PICDIRTRIPLE
	picid CDATA #REQUIRED
	picloc CDATA #REQUIRED
	apsdirloc CDATA #REQUIRED
>
<!--		7.3 Encoding picture descriptor elements	-->
<!--		SCALING MODE  	-->
<!--
	SCALEMODE (
	< ABSTRACT | METRIC >
	<R:SCALEFACTOR>
	)

-->
<!ELEMENT SCALEMODE EMPTY>
<!ATTLIST SCALEMODE
	type (ABSTRACT | METRIC) #REQUIRED
	scalefactor CDATA #REQUIRED
>
<!--		COLOUR SELECTION MODE  	-->
<!--
	COLRMODE (
	< INDEXED | DIRECT >
	)

-->
<!ELEMENT COLRMODE EMPTY>
<!ATTLIST COLRMODE
	set (INDEXED | DIRECT) #REQUIRED
>
<!--		LINE WIDTH SPECIFICATION MODE:  	-->
<!--
	LINEWIDTHMODE (
	<ABS | SCALED | FRACTIONAL | MM>
	)

-->
<!ELEMENT LINEWIDTHMODE EMPTY>
<!ATTLIST LINEWIDTHMODE
	set (ABS | SCALED | FRACTIONAL | MM) #REQUIRED
>
<!--		MARKER SIZE SPECIFICATION MODE 	-->
<!--
	MARKERSIZEMODE (
	<ABS | SCALED | FRACTIONAL | MM>
	)

-->
<!ELEMENT MARKERSIZEMODE EMPTY>
<!ATTLIST MARKERSIZEMODE
	set (ABS | SCALED | FRACTIONAL | MM) #REQUIRED
>
<!--		EDGE WIDTH SPECIFICATION MODE 	-->
<!--
	EDGEWIDTHMODE (
	<ABS | SCALED | FRACTIONAL | MM>
	)

-->
<!ELEMENT EDGEWIDTHMODE EMPTY>
<!ATTLIST EDGEWIDTHMODE
	set (ABS | SCALED | FRACTIONAL | MM) #REQUIRED
>
<!--		VDC EXTENT  	-->
<!--
	VDCEXT (
	<P:FIRSTCORNER>
	<P:SECONDCORNER>
	)

-->
<!ELEMENT VDCEXT EMPTY>
<!ATTLIST VDCEXT
	p1 CDATA #REQUIRED
	p2 CDATA #REQUIRED
>
<!--		BACKGROUND COLOUR  	-->
<!--
	BACKCOLR (
	<DIRECTCOLR>
	) >

-->
<!ELEMENT BACKCOLR EMPTY>
<!ATTLIST BACKCOLR
	directk CDATA #REQUIRED
>
<!--		DEVICE VIEWPORT  	-->
<!--
	DEVVP (
	<VP:FIRSTCORNER>
	<VP:SECONDCORNER>
	)

-->
<!-- <!ELEMENT DEVVP (VP, VP)> -->
<!--		DEVICE VIEWPORT SPECIFICATION MODE 	-->
<!--
	DEVVPMODE (
	<FRACTION | MM | PHYDEVCOORD>
	<R:SCALEFACTOR>
	)

-->
<!-- <!ELEMENT DEVVPMODE ((FRACTION | MM | PHYDEVCOORD), R)> -->
<!ELEMENT DEVVPMODE EMPTY>
<!ATTLIST DEVVPMODE
	set (FRACTION | MM | PHYDEVCOORD) #REQUIRED
	scalefactor CDATA #REQUIRED
>
<!--		DEVICE VIEWPORT MAPPING  	-->
<!--
	DEVVPMAP (
	<NOTFORCED|FORCED>
	<LEFT | CTR | RIGHT>
	<BOTTOM | CTR | TOP>
	)

-->
<!ELEMENT DEVVPMAP EMPTY>
<!ATTLIST DEVVPMAP
	f (NOTFORCED | FORCED) #REQUIRED
	h (LEFT | CTR | RIGHT) #REQUIRED
	v (BOTTOM | CTR | TOP) #REQUIRED
>
<!--		LINE REPRESENTATION  	-->
<!--
	LINEREP (
	<I:BUNDLEINDEX> {positive}
	<I:LINETYPE>
		{1=solid, 2=dash
		3=dot, 4=dash-dot
		5=dash-dot-dot
		>5=reserved for registered values
		<0 private line types}
	<V:LINEWIDTH> {non-negative}
	<K:LINECOLR>
	)

-->
<!-- <!ELEMENT LINEREP (I, I, %V;, %K;)> -->
<!ELEMENT LINEREP EMPTY>
<!ATTLIST LINEREP
	bundle CDATA #REQUIRED
	type CDATA #REQUIRED
	width CDATA #REQUIRED
	color CDATA #REQUIRED
>
<!--		MARKER REPRESENTATION  	-->
<!--
	MARKERREP (
	<I:BUNDLEINDEX> {positive}
	<I:MARKERTYPE>
		{1=dot, 2=plus
		3=asterisk, 4=circle
		5=cross
		>5=reserved for registered values
		<0 private marker types}
	<V:MARKERSIZE> {non-negative}
	<K:MARKERCOLR>
	)

-->
<!-- <!ELEMENT MARKERREP (I, I, %V;, %K;)> -->
<!ELEMENT MARKERREP EMPTY>
<!ATTLIST MARKERREP
	bundle CDATA #REQUIRED
	type CDATA #REQUIRED
	size CDATA #REQUIRED
	color CDATA #REQUIRED
>
<!--		TEXT REPRESENTATION  	-->
<!--
	TEXTREP (
	<I:BUNDLEINDEX> {positive}
	<I:FONTINDEX> {positive}
	<STRING|CHAR|STROKE>
	<R:SPACING>
	<R:FACTOR> {non-negative}
	<K:TEXTCOLR>
	)

-->
<!ELEMENT TEXTREP EMPTY>
<!ATTLIST TEXTREP
	font CDATA #REQUIRED
	set (STRING | CHAR | STROKE) #REQUIRED
	spacing CDATA #REQUIRED
	factor CDATA #REQUIRED
	color CDATA #REQUIRED
>
<!--		FILL REPRESENTATION  	-->
<!--
	FILLREP (
	<I:BUNDLEINDEX> {positive}
	<HOLLOW | SOLID | PAT | HATCH | EMPTY |	GEOPAT | INTERP>
	<K:FILLCOLR>
	<I:HATCHINDEX>
		{1=horizontal,2=vertical
		3=positive slope
		4=negative slope
		5=horizontal/vertical cross
		6=positive/negative slope cross
		>6=reserved for registered values
		<0 private hatch styles}
	<I:PATINDEX> {positive}
	)

-->
<!ELEMENT FILLREP EMPTY>
<!ATTLIST FILLREP
	bundle CDATA #REQUIRED
	set (HOLLOW | SOLID | PAT | HATCH | EMPTY | GEOPAT | INTERP) #REQUIRED
	fillk CDATA #REQUIRED
	hatch CDATA #REQUIRED
	pat CDATA #REQUIRED
>
<!--		EDGE REPRESENTATION  	-->
<!--
	EDGEREP (
	<I:BUNDLEINDEX> {positive}
	<I:EDGETYPE>
		{1=solid, 2=dash
		3=dot, 4=dash-dot
		5=dash-dot-dot
		>5=reserved for registered values
		<0 private edge types}
	<V:EDGEWIDTH> {non-negative}
	<K:EDGECOLR>

	)

-->
<!-- <!ELEMENT EDGEREP (I, I, %V;, %K;)> -->
<!ELEMENT EDGEREP (#PCDATA)>
<!--		INTERIOR STYLE SPECIFICATION MODE 	-->
<!--	
	INTSTYLEMODE (
	<ABS | SCALED | FRACTIONAL | MM>
	)

-->
<!ELEMENT INTSTYLEMODE EMPTY>
<!ATTLIST INTSTYLEMODE
	set (ABS | SCALED | FRACTIONAL | MM) #REQUIRED
>
<!--		LINE AND EDGE TYPE DEFINITION  	-->
<!--
	LINEEDGETYPEDEF (
	<I:LINETYPE> {negative}
	<V:REPEATLENGTH>
	<I:DASHELEMENT> {non-negative}
	<<I:DASHELEMENT>>* {non-negative}
	)

-->
<!ELEMENT LINEEDGETYPEDEF EMPTY>
<!ATTLIST LINEEDGETYPEDEF
	type CDATA #REQUIRED
	repeatlenght CDATA #REQUIRED
	dashelements CDATA #REQUIRED
>
<!--		HATCH STYLE DEFINITION  	-->
<!--
	HATCHSTYLEDEF (
	<I:HATCHINDEX> {negative}
	<PARALLEL | CROSSHATCH>
	<V:FIRSTDIRX>
	<V:FIRSTDIRY>
	<V:SECONDDIRX>
	<V:SECONDDIRY>
	<V:DUTYCYCLE>
	<I:NUMBEROFLINES> {positive, this defines n}
	<<I:GAPWIDTH>>(n) {positive}
	<<I:LINETYPE>>(n)
	)

-->
<!ELEMENT HATCHSTYLEDEF EMPTY>
<!ATTLIST HATCHSTYLEDEF
	index CDATA #REQUIRED
	set (PARALLEL | CROSSHATCH) #REQUIRED
	v1x CDATA #REQUIRED
	v1y CDATA #REQUIRED
	v2x CDATA #REQUIRED
	v2y CDATA #REQUIRED
	dutycycle CDATA #REQUIRED
	numlines CDATA #REQUIRED
	gap CDATA #REQUIRED
	linetype CDATA #REQUIRED
>
<!--		GEOMETRIC PATTERN DEFINITION 	-->
<!--
	GEOPATDEF (
	<I:GEOPATINDEX> {positive}
	<N:SEGID>
	<P:FIRSTPOINT>
	<P:SECONDPOINT>
	)

-->
<!ELEMENT GEOPATDEF EMPTY>
<!ATTLIST GEOPATDEF
	geopatindex CDATA #REQUIRED
	segid CDATA #REQUIRED
	p1 CDATA #REQUIRED
	p2 CDATA #REQUIRED
>
<!--		APPLICATION STRUCTURE DIRECTORY 	-->
<!--
	APSDIR (
	<UI8 | UI16 | UI32>
	<<APSDIRPAIR>>+
	)

-->
<!ELEMENT APSDIR (APSDIRPAIR+)>
<!ATTLIST APSDIR
	type (UI8 | UI16 | UI32) #REQUIRED
>
<!--		APSDIRPAIR  	-->
<!--	
	APSDIRPAIR (
	<SF:APSID>
	<I:APSLOCATION>
	)

	NOTE 11 The first (enumerated) parameter selects the location data type ([ldt]) for the subsequent APSLOCATION
	parameter. This is an integer-bound parameter, and the [ldt] selects one of three unsigned integer precisions. The
	values of APSLOCATION are the offsets measured in characters from the first character of the BEGIN PICTURE
	element containing the APS to the first character of the associated BEGIN APPLICATION STRUCTURE element.

	NOTE 12 Editing of clear text encoded Version 4 metafiles may invalidate APSLOCATION values. If so, these values must 
	be recomputed.
-->
<!ELEMENT APSDIRPAIR EMPTY>
<!ATTLIST APSDIRPAIR
	apsid CDATA #REQUIRED
	location CDATA #REQUIRED
>
<!-- 		7.4 Encoding control elements -->
<!--		VDC INTEGER PRECISION  	-->
<!--
	VDCINTEGERPREC (
	<I:MININT>
	<I:MAXINT>
	)

	See INTEGERPREC for description of the parameters.

-->
<!ELEMENT VDCINTEGERPREC EMPTY>
<!ATTLIST VDCINTEGERPREC
	min CDATA #REQUIRED
	max CDATA #REQUIRED
>
<!--		VDC REAL PRECISION  	-->
<!--
	VDCREALPREC (
	<R:MINREAL>
	<R:MAXREAL>
	<I:DIGITS>
	)

	See REALPREC for description of the parameters.

-->
<!ELEMENT VDCREALPREC EMPTY>
<!ATTLIST VDCREALPREC
	min CDATA #REQUIRED
	max CDATA #REQUIRED
	digits CDATA #REQUIRED
>
<!--		AUXILIARY COLOUR  	-->
<!--
	AUXCOLR (
	<K:AUXCOLR>
	)

-->
<!ELEMENT AUXCOLR EMPTY>
<!ATTLIST AUXCOLR
	k CDATA #REQUIRED
>
<!--		TRANSPARENCY  	-->
<!--
	TRANSPARENCY (
	< OFF | ON >
	)

-->
<!ELEMENT TRANSPARENCY EMPTY>
<!ATTLIST TRANSPARENCY
	set (OFF | ON) #REQUIRED
>
<!--		CLIP RECTANGLE  	-->
<!--
	CLIPRECT (
	<P:FIRSTCORNER>
	<P:SECONDCORNER>
	)

-->
<!ELEMENT CLIPRECT EMPTY>
<!ATTLIST CLIPRECT
	p1 CDATA #REQUIRED
	p2 CDATA #REQUIRED
>
<!--		CLIP INDICATOR  	-->
<!--
	CLIP (
	< OFF | ON >
	)

-->
<!ELEMENT CLIP EMPTY>
<!ATTLIST CLIP
	set (OFF | ON) #REQUIRED
>
<!--		LINE CLIPPING MODE  	-->
<!--
	LINECLIPMODE (
	<LOCUS|SHAPE|LOCUSTHENSHAPE>
	)

-->
<!ELEMENT LINECLIPMODE EMPTY>
<!ATTLIST LINECLIPMODE
	set (LOCUS | SHAPE | LOCUSTHENSHAPE) #REQUIRED
>
<!--		MARKER CLIPPING MODE  	-->
<!--
	MARKERCLIPMODE (
	<LOCUS|SHAPE|LOCUSTHENSHAPE>
	)

-->
<!ELEMENT MARKERCLIPMODE EMPTY>
<!ATTLIST MARKERCLIPMODE
	set (LOCUS | SHAPE | LOCUSTHENSHAPE) #REQUIRED
>
<!--		EDGE CLIPPING MODE  	-->
<!--
	EDGECLIPMODE (
	<LOCUS|SHAPE|LOCUSTHENSHAPE>
	) 

-->
<!ELEMENT EDGECLIPMODE EMPTY>
<!ATTLIST EDGECLIPMODE
	set (LOCUS | SHAPE | LOCUSTHENSHAPE) #REQUIRED
>
<!--		NEW REGION  	-->
<!--
	NEWREGION (
	)

-->
<!ELEMENT NEWREGION EMPTY>
<!--		SAVE PRIMITIVE CONTEXT  	-->
<!--
	SAVEPRIMCONT (
	<I:CONTEXTNAME>
	)

-->
<!ELEMENT SAVEPRIMCONT EMPTY>
<!ATTLIST SAVEPRIMCONT
	contextname CDATA #REQUIRED
>
<!--		RESTORE PRIMITIVE CONTEXT  	-->
<!--
	RESPRIMCONT (
	<I:CONTEXTNAME>
	)

-->
<!ELEMENT RESPRIMCONT EMPTY>
<!ATTLIST RESPRIMCONT
	contextname CDATA #REQUIRED
>
<!--		PROTECTION REGION INDICATOR  	-->
<!--
	PROTREGION (
	<I:REGIONINDEX> {positive}
	<I:REGIONINDICATOR>
		{1=off, 2=clip, 3=shield}
	)

-->
<!ELEMENT PROTREGION EMPTY>
<!ATTLIST PROTREGION
	regionindex CDATA #REQUIRED
	regionindicator (1 | 2 | 3) #REQUIRED
>
<!--		GENERALIZED TEXT PATH MODE 	-->
<!--
	GENTEXTPATHMODE (
	<OFF | NONAXIS | AXIS>
	)

-->
<!ELEMENT GENTEXTPATHMODE EMPTY>
<!ATTLIST GENTEXTPATHMODE
	set (OFF | NONAXIS | AXIS) #REQUIRED
>
<!--		MITRE LIMIT  	-->
<!--
	MITRELIMIT (
	<R:MITRELIMIT> {non-negative}
	)

-->
<!ELEMENT MITRELIMIT EMPTY>
<!ATTLIST MITRELIMIT
	mitrelimit CDATA #REQUIRED
>
<!--		TRANSPARENT CELL COLOUR  	-->
<!--
	TRANSPCELLCOLR (
	<OFF | ON>
	<K:TRANSPCELLCOLOUR>
	)

-->
<!ELEMENT TRANSPCELLCOLR EMPTY>
<!ATTLIST TRANSPCELLCOLR
	set (OFF | ON) #REQUIRED
	k CDATA #REQUIRED
>
<!-- 		7.5 Encoding graphical primitive elements 	-->
<!--		POLYLINE  	-->
<!--
        LINE (
	<POINTLIST> 
	)
	
	LINE and INCRLINE shall always have at least two points.

-->
<!ELEMENT LINE EMPTY>
<!ATTLIST LINE
	pointlist CDATA #REQUIRED
>
<!--		 INCRLINE -->
<!-- INCRLINE (
	<INCRPOINTLIST> >
	
	INCRPOINTLIST  (
	<P:FIRSTPOINT>
	<DELTA>+
	)
	
LINE and INCRLINE shall always have at least two points.
-->
<!ELEMENT INCRLINE EMPTY>
<!ATTLIST INCRLINE
	p1 CDATA #REQUIRED
	deltas CDATA #REQUIRED
>
<!--		DELTA  	-->
<!--
	DELTA (
	<<DELTAPAIR>> | 
	<<LEFT PAREN><DELTAPAIR><RIGHT PAREN>>
	)

-->
<!-- <!ELEMENT DELTA (DELTAPAIR)> -->
<!--		DELTAPAIR  	-->
<!--
	DELTAPAIR (
	<VDC:DELTAX>
	<VDC:DELTAY>
	)


	NOTE 1 Absolute coordinates correspond in a straightforward way to the functionality definition, but incremental 
	coordinates can realize a significant savings in this encoding. Even more important, incremental coordinates are high 
	on the priority list for user-friendly graphics, which is a high priority objective of this encoding.

-->
<!-- <!ELEMENT DELTAPAIR (%VDC;, %VDC;)>  -->
<!-- <!ELEMENT DELTAPAIR (#PCDATA)> -->
<!--		DISJOINT POLYLINE  	-->
<!--
	DISJTLINE (
	< <P:POINT><P:POINT> >
	< <P:POINT><P:POINT> >*
	)

	
	INCRDISJTLINE (
	<P:POINT>
	<DELTA>
	< <DELTA> <DELTA> >*
	)


	DISJTLINE and INCRDISJTLINE shall have pairs of points, and at least one pair.
-->
<!ELEMENT DISJTLINE EMPTY>
<!ATTLIST DISJTLINE
	p1 CDATA #REQUIRED
	p2 CDATA #REQUIRED
	pointpairs CDATA #IMPLIED
>
<!ELEMENT INCRDISJTLINE EMPTY>
<!ATTLIST INCRDISJTLINE
	p1 CDATA #REQUIRED
	deltas CDATA #REQUIRED
>
<!--		POLYMARKER  	-->
<!--
	MARKER (
	<P:POINT>
	<<P:POINT>>*
	)

	INCRMARKER
	<P:FIRSTPOINT>
	<DELTA>*
	)

-->
<!ELEMENT MARKER EMPTY>
<!ATTLIST MARKER
	points CDATA #REQUIRED
>
<!ELEMENT INCRMARKER EMPTY>
<!ATTLIST INCRMARKER
	p1 CDATA #REQUIRED
	deltas CDATA #REQUIRED
>
<!--		TEXT  	-->
<!--
	TEXT (
	<P:TEXTLOCATION>
	<TEXTPIECE>
	)

-->
<!ELEMENT TEXT (S)>
<!ATTLIST TEXT
	textlocation CDATA #REQUIRED
	textpiece (NOTFINAL | FINAL) #REQUIRED
>
<!--		TEXTPIECE  	-->
<!--
	TEXTPIECE ( < NOTFINAL | FINAL > 
	<S:TEXTSTRING>
	)

-->
<!--		RESTRICTED TEXT  	-->
<!--
	RESTRTEXT (
	<VDC:MAXWIDTH> {non-negative}
	<VDC:MAXHEIGHT> {non-negative}
	<P:TEXTLOCATION>
	<TEXTPIECE>
	)

-->
<!ELEMENT RESTRTEXT (S)>
<!ATTLIST RESTRTEXT
	maxwidth CDATA #REQUIRED
	maxheight CDATA #REQUIRED
	textlocation CDATA #REQUIRED
	textpiece (NOTFINAL | FINAL | notfinal | final) #REQUIRED
>
<!--		APPEND TEXT  	-->
<!--
	APNDTEXT (
	<TEXTPIECE>
	)

-->
<!ELEMENT APNDTEXT (S)>
<!ATTLIST APNDTEXT
	textpiece (NOTFINAL | FINAL) #REQUIRED
>
<!--		POLYGON  	-->
<!--
	POLYGON (
	<P:POINT>
	<P:POINT>
	<<P:POINT>>+

	INCRPOLYGON (
	<P:POINT>
	<DELTA>
	<DELTA>+
	)

	For all POLYGON-type primitives, at least three points shall be present.
-->
<!ELEMENT POLYGON EMPTY>
<!ATTLIST POLYGON
	p1 CDATA #REQUIRED
	p2 CDATA #REQUIRED
	points CDATA #REQUIRED
>
<!ELEMENT INCRPOLYGON EMPTY>
<!ATTLIST INCRPOLYGON
	p1 CDATA #REQUIRED
	deltas CDATA #REQUIRED
>
<!--		POLYGON SET  	-->
<!--
	POLYGONSET (
	<FLAGGEDPOINT>
	<FLAGGEDPOINT>
	<<FLAGGEDPOINT>>+
	)

	INCRPOLYGONSET (
	<FLAGGEDPOINT>
	<<FLAGGEDDELTA>>+
	<FLAGGEDDELTA>
	)

-->
<!ELEMENT POLYGONSET (FLAGGEDPOINT, FLAGGEDPOINT, FLAGGEDPOINT+)>
<!-- <!ELEMENT INCRPOLYGONSET (FLAGGEDPOINT, FLAGGEDDELTA+, FLAGGEDDELTA)> -->
<!ELEMENT INCRPOLYGONSET (FLAGGEDPOINT, FLAGGEDDELTA+)>
<!--		EDGEFLAG  	-->
<!--
	EDGEFLAG (
	INVIS | VIS | CLOSEINVIS | CLOSEVIS 
	)

-->
<!ELEMENT EDGEFLAG EMPTY>
<!ATTLIST EDGEFLAG
	type (INVIS | VIS | CLOSEINVIS | CLOSEVIS) #REQUIRED
>
<!--		FLAGGEDPOINT  	-->
<!--
	FLAGGEDPOINT (
	<P:VERTEX>  
	<EDGEFLAG> 
	)

-->
<!ELEMENT FLAGGEDPOINT EMPTY>
<!ATTLIST FLAGGEDPOINT
	vertex CDATA #REQUIRED
	edgeflag CDATA #REQUIRED
>
<!--		FLAGGEDDELTA  	-->
<!--
	FLAGGEDDELTA (
	<DELTA>  <EDGEFLAG> 
	)

-->
<!ELEMENT FLAGGEDDELTA EMPTY>
<!ATTLIST FLAGGEDDELTA
	delta CDATA #REQUIRED
	edgeflag CDATA #REQUIRED
>
<!--		CELL ARRAY  	-->
<!--
	CELLARRAY (
	<P:P_POINT>
	<P:Q_POINT>
	<P:R_POINT>
	<I:NX> {positive}
	<I:NY> {positive}
	<LOCLCOLRPREC>
	<CELLROW>+
	)

-->
<!-- <!ELEMENT CELLARRAY (P, P, P, I, I, LOCLCOLRPREC, CELLROW+)> -->
<!ELEMENT CELLARRAY EMPTY>
<!ATTLIST CELLARRAY
	p CDATA #REQUIRED
	q CDATA #REQUIRED
	r CDATA #REQUIRED
	nx CDATA #REQUIRED
	ny CDATA #REQUIRED
	maxint CDATA #IMPLIED
	maxcomponent CDATA #IMPLIED
	cellrow CDATA #REQUIRED
>
<!--		LOCLCOLRPREC  	-->
<!--
	LOCLCOLRPREC ( 
	<<I:MAXINT>> | 
	<<I:MAXCOMPONENT>> |
	<<I:0>>
	)

	The LOCLCOLRPREC takes the form of COLRINDEXPREC or COLRPREC, depending on whether the 
	COLRMODE is <INDEXED> or <DIRECT>, respectively. The value 0 is the 'default precision indicator?, and 
	denotes that the precision currently in effect shall be used.

-->
<!--
<!ELEMENT LOCLCOLRPREC EMPTY>
<!ATTLIST LOCLCOLRPREC
	maxint CDATA #IMPLIED
	maxcomponent CDATA #IMPLIED
>
<!ELEMENT CELLCOLRPREC EMPTY>
<!ATTLIST CELLCOLRPREC
	maxint CDATA #IMPLIED
	maxcomponent CDATA #IMPLIED
>
-->
<!--		CELLROW  	-->
<!--
	CELLROW ( 
	<  <CELLLIST> > | 
	<  <LEFT PAREN> <CELLLIST> <RIGHT PAREN> >
	)

-->
<!-- <!ELEMENT CELLROW (#PCDATA)> -->
<!--		CELLIST  	-->
<!--
	CELLIST (
	<K:CELL> 
	<<K:CELL>>* 
	)

	The parenthesized form of the list is optional. If parentheses are used, they delimit a row of 
	cells. Each row is considered to start from the side defined by the points (P,Q,R) as defined in 
	ISO/IEC 8632-1. The number of cells between parentheses shall be less than or equal to the row 
	length. If a row is not complete, then the last defined cell in the row is replicated to fill 
	the row.
	
	The local colour precision parameter, LOCLCOLRPREC, takes the form of the parameter of a 
	colourprecision-setting element, either of COLRPREC or of COLRINDEXPREC, depending on the 
	COLRMODE. Legal values are either legal values of one of those colour precision elements, or 
	zero. If the value is zero, then the metafile?s COLRPREC or COLRINDEXPREC is to be used within 
	the CELLARRAY element as well.

-->
<!-- <!ELEMENT CELLIST ((%K;)+)> -->
<!--		GENERALIZED DRAWING PRIMITIVE  	-->
<!--
	GDP (
	<I:GDP_IDENTIFIER>
	<<P:POINT>>*
	<S:DATARECORD>
	)

-->
<!-- <!ELEMENT GDP (I, P+, S)> -->
<!ELEMENT GDP EMPTY>
<!ATTLIST GDP
	ident CDATA #REQUIRED
	pointlist CDATA #REQUIRED
	data CDATA #REQUIRED
>
<!--		RECTANGLE  	-->
<!--
	RECT (
	<P:FIRSTCORNER>
	<P:SECONDCORNER>
	)

-->
<!ELEMENT RECT EMPTY>
<!ATTLIST RECT
	p1 CDATA #REQUIRED
	p2 CDATA #REQUIRED
>
<!--		CIRCLE  	-->
<!--
	CIRCLE (
	<P:CENTRE>
	<VDC:RADIUS> {non-negative}
	)

-->
<!ELEMENT CIRCLE EMPTY>
<!ATTLIST CIRCLE
	p1 CDATA #REQUIRED
	radius CDATA #REQUIRED
>
<!--		3PTARCSPEC  	-->
<!--
	3PTARCSPEC (
	<P:STARTPOINT>
	<P:INTERMEDIATEPOINT>
	<P:ENDPOINT>
	)

-->
<!--  <!ELEMENT THREEPTARCSPEC EMPTY>
 <!ATTLIST THREEPTARCSPEC
p1 CDATA #REQUIRED
p2 CDATA #REQUIRED
p3 CDATA #REQUIRED> -->
<!--		CIRCULAR ARC 3 POINT  	-->
<!--
	ARC3PT (
	<3PTARCSPEC>
	)

-->
<!--		CLOSESPEC  	-->
<!--
	CLOSESPEC (
	< PIE | CHORD >
	)

-->
<!-- <!ENTITY % CLOSESPEC "(PIE | CHORD)"> -->
<!ELEMENT ARC3PT EMPTY>
<!ATTLIST ARC3PT
	p1 CDATA #REQUIRED
	p2 CDATA #REQUIRED
	p3 CDATA #REQUIRED
>
<!--		CIRCULAR ARC 3 POINT CLOSE  	-->
<!--
	ARC3PTCLOSE (
	<3PTARCSPEC>
	<CLOSESPEC>
	)

-->
<!ELEMENT ARC3PTCLOSE EMPTY>
<!ATTLIST ARC3PTCLOSE
	p1 CDATA #REQUIRED
	p2 CDATA #REQUIRED
	p3 CDATA #REQUIRED
	closespec (PIE | CHORD) #REQUIRED
>
<!--		CIRCULAR ARC CENTRE  	-->
<!--
	ARCCTR (
	<CTRARCSPEC>
	)

-->
<!ELEMENT ARCCTR EMPTY>
<!ATTLIST ARCCTR
	center CDATA #REQUIRED
	start CDATA #REQUIRED
	end CDATA #REQUIRED
	radius CDATA #REQUIRED
>
<!--		CIRCULAR ARC CENTRE CLOSE  	-->
<!--
	ARCCTRCLOSE (
	<CTRARCSPEC>
	<CLOSESPEC>
	)

-->
<!ELEMENT ARCCTRCLOSE EMPTY>
<!ATTLIST ARCCTRCLOSE
	center CDATA #REQUIRED
	start CDATA #REQUIRED
	end CDATA #REQUIRED
	radius CDATA #REQUIRED
	closespec (PIE | CHORD) #REQUIRED
>
<!--		CTRARCSPEC  	-->
<!--
	CTRARCSPEC (
	<P:CENTREPOINT>
	<ARCBOUNDS>
	<VDC:RADIUS> {non-negative}
	)
-->
<!--		ARCBOUNDS  	-->
<!--
	ARCBOUNDS (
	<P:STARTVECTOR>
	<P:ENDVECTOR>
	)

	NOTE 2 The start and end vectors are given as point records rather than 2*VDC to permit the parenthesized form to be 
	used to represent the vectors.

-->
<!--		ELLIPSE  	-->
<!--
	ELLIPSE (
	<ELLIPSESPEC>
	)

-->
<!ELEMENT ELLIPSE EMPTY>
<!ATTLIST ELLIPSE
	center CDATA #REQUIRED
	endp1 CDATA #REQUIRED
	endp2 CDATA #REQUIRED
>
<!--		ELLIPSESPEC  	-->
<!--
	ELLIPSESPEC (
	<P:CENTRE>
	<P:ENDPOINT_FIRST_CONJUGATE_DIAMETER>
	<P:ENDPOINT_SECOND_CONJUGATE_DIAMETER>

-->
<!--		ELLIPTICAL ARC  	-->
<!--
	ELLIPARC (
	<ELLIPSESPEC>
	<ARCBOUNDS>
	)

-->
<!ELEMENT ELLIPARC EMPTY>
<!ATTLIST ELLIPARC
	center CDATA #REQUIRED
	endp1 CDATA #REQUIRED
	endp2 CDATA #REQUIRED
	start CDATA #REQUIRED
	end CDATA #REQUIRED
>
<!--		ELLIPTICAL ARC CLOSE  	-->
<!--
	ELLIPARCCLOSE (
	<ELLIPSESPEC>
	<ARCBOUNDS>
	<CLOSESPEC>
	)

-->
<!ELEMENT ELLIPARCCLOSE EMPTY>
<!ATTLIST ELLIPARCCLOSE
	center CDATA #REQUIRED
	endp1 CDATA #REQUIRED
	endp2 CDATA #REQUIRED
	start CDATA #REQUIRED
	end CDATA #REQUIRED
	closespec (PIE | CHORD) #REQUIRED
>
<!--		CIRCULAR ARC CENTRE REVERSED  	-->
<!--
	ARCCTRREV (
	<CTRARCSPEC>
	)

-->
<!ELEMENT ARCCTRREV EMPTY>
<!ATTLIST ARCCTRREV
	center CDATA #REQUIRED
	start CDATA #REQUIRED
	end CDATA #REQUIRED
	radius CDATA #REQUIRED
>
<!--		CONNECTING EDGE  	-->
<!--
	CONNEDGE (
	)

-->
<!ELEMENT CONNEDGE EMPTY>
<!--		HYPERBOLIC ARC  	-->
<!--
	HYPERBARC (
	<P:CENTREPOINT>
	<P:TRANSVERSPOINT>
	<P:CONJUGATEPOINT>
	<VDC:STARTX>
	<VDC:STARTY>
	<VDC:ENDX>
	<VDC:ENDY>
	)

-->
<!ELEMENT HYPERBARC EMPTY>
<!ATTLIST HYPERBARC
	center CDATA #REQUIRED
	transversep CDATA #REQUIRED
	conjugatep CDATA #REQUIRED
	startx CDATA #REQUIRED
	starty CDATA #REQUIRED
	endx CDATA #REQUIRED
	endy CDATA #REQUIRED
>
<!--		PARABOLIC ARC  	-->
<!--
	PARABARC (
	<P:TANGENTPOINT>
	<P:STARTPOINT>
	<P:ENDPOINT>
	)

-->
<!ELEMENT PARABARC EMPTY>
<!ATTLIST PARABARC
	p1 CDATA #REQUIRED
	p2 CDATA #REQUIRED
	p3 CDATA #REQUIRED
>
<!--		NON-UNIFORM B-SPLINE  	-->
<!--
	NUB (
	<I:SPLINEORDER> {m}
	<I:NUMBERCONTROLPOINTS> {n>=m}
	<<P:CONTROLPOINT>>(n)
	<<R:KNOT>>(m+n)
	<R:STARTVALUE>
	<R:ENDVALUE>
	)

-->
<!ELEMENT NUB EMPTY>
<!ATTLIST NUB
	splineorder CDATA #REQUIRED
	numpoints CDATA #REQUIRED
	controlpoint CDATA #REQUIRED
	knot CDATA #REQUIRED
	start CDATA #REQUIRED
	end CDATA #REQUIRED
>
<!--		NON-UNIFORM RATIONAL B-SPLINE  	-->
<!--
	NURB (
	<I:SPLINEORDER> {m}
	<I:NUMBERCONTROLPOINTS> {n>=m}
	<<P:CONTROLPOINT>>(n)
	<<R:KNOT>>(m+n)
	<R:STARTVALUE>
	<R:ENDVALUE>
	<<R:WEIGHT>>(n)
	)

-->
<!ELEMENT NURB EMPTY>
<!ATTLIST NURB
	splineorder CDATA #REQUIRED
	numpoints CDATA #REQUIRED
	controlpoint CDATA #REQUIRED
	knot CDATA #REQUIRED
	start CDATA #REQUIRED
	end CDATA #REQUIRED
	weight CDATA #REQUIRED
>
<!--		POLYBEZIER  	-->
<!--
	POLYBEZIER (
	<I:CONTINUITYINDICATOR>
		{1=discontinuous, 2=continuous,
		>2, reserved for registered values}
	< <P:CONTROLPOINT>>(n) {n>=4}
	)

-->
<!-- <!ELEMENT POLYBEZIER (I, P, P, P, P+)> -->
<!ELEMENT POLYBEZIER EMPTY>
<!ATTLIST POLYBEZIER
	continuity CDATA #REQUIRED
	points CDATA #REQUIRED
>
<!--		POLYSYMBOL  	-->
<!--
	SYMBOL (
	<I:INDEX>
	<P:POINT>
	<<P:POINT>>*
	)
	
	 INCRSYMBOL (
	<I:INDEX>
	<P:FIRSTPOINT>
	<DELTA>*
	)

-->
<!-- <!ELEMENT SYMBOL (I, P, P+)> -->
<!ELEMENT SYMBOL EMPTY>
<!ATTLIST SYMBOL
	index CDATA #REQUIRED
	p1 CDATA #REQUIRED
	points CDATA #REQUIRED
>
<!-- <!ELEMENT INCRSYMBOL (I, P, DELTA+)> -->
<!ELEMENT INCRSYMBOL EMPTY>
<!ATTLIST INCRSYMBOL
	index CDATA #REQUIRED
	p1 CDATA #REQUIRED
	deltas CDATA #REQUIRED
>
<!--		BITONAL TILE  	-->
<!--
	BITONALTILE (
	<I:CMPRSNTYPE>
		{0=null background, 1=null foreground,
		2=T6, 3=T4 1-dimensional, 4=T4 2-dimensional,
		5=bitmap, 6=run length,
		>6, reserved for registered values}
	<I:ROWPADINDICATOR> {non-negative}
	<K:BACKGROUND>
	<K:FOREGROUND>
	<SDR:METHODSPECIFICPARAMS>
	<B:COMPRESSEDCELLS>
	)

	Where 		<SDR:METHODSPECIFICPARAMS>   ( <> |<<I: i_I><I: 1> <I: RUNCOUNTPRECISION>>{for type 6}	
							| {defined in the register, for type>6} )

	SDR ( (I,I,I)? ) 

	NOTE 3 i_I in the above denotes the integer value of the 'data type designator? for data type I as assigned in Annex 
	C of ISO/IEC 8632-1.

	NOTE 4 See 6.3.7 for complete SDR delimiting and formatting requirements.

-->
<!ELEMENT BITONALTILE EMPTY>
<!ATTLIST BITONALTILE
	type CDATA #REQUIRED
	rowpad CDATA #REQUIRED
	background CDATA #REQUIRED
	foreground CDATA #REQUIRED
	params CDATA #REQUIRED
	data CDATA #REQUIRED
>
<!--		TILE  	-->
<!--
	TILE (
	<TILE>
	<I:CMPRSNTYPE>
		{0=null background, 1=null foreground,
		2=T6, 3=T4 1-dimensional, 4=T4 2-dimensional,
		5=bitmap, 6=run length,
		>6, reserved for registered values}
	<I:ROWPADINDICATOR> {non-negative}
	<CELLCOLRPREC>
	<SDR:METHODSPECIFICPARAMS>
	<B:COMPRESSEDCELLS>
	)

	See CELL ARRAY (LOCLCOLRPREC parameter) for discussion of the CELLCOLRPREC production.

-->
<!ELEMENT TILE EMPTY>
<!ATTLIST TILE
	type CDATA #REQUIRED
	rowpad CDATA #REQUIRED
	maxint CDATA #IMPLIED
	maxcomponent CDATA #IMPLIED
	data CDATA #IMPLIED
>
<!--		7.6 Encoding attribute elements -->
<!--		LINE BUNDLE INDEX  	-->
<!--
	LINEINDEX (
	<I:BUNDLEINDEX> {positive}
	)

-->
<!ELEMENT LINEINDEX EMPTY>
<!ATTLIST LINEINDEX
	bundleindex CDATA #REQUIRED
>
<!--		LINE TYPE  	-->
<!--
	LINETYPE (
	<I:LINETYPE>
		{ 1=solid, 2=dash, 3=dot,
		4=dash-dot, 5=dash-dot-dot,
		>5 reserved for registered values,
		<0 private line types}
	)

-->
<!ELEMENT LINETYPE EMPTY>
<!ATTLIST LINETYPE
	type CDATA #REQUIRED
>
<!--		LINE WIDTH  	-->
<!--
	LINEWIDTH (
	<V:LINEWIDTH> {non-negative}
	)

-->
<!-- <!ELEMENT LINEWIDTH (%V;)> -->
<!ELEMENT LINEWIDTH EMPTY>
<!ATTLIST LINEWIDTH
	width CDATA #REQUIRED
>
<!--		LINE COLOUR  	-->
<!--
	LINECOLR (
	<K:LINECOLR>
	)

-->
<!-- <!ELEMENT LINECOLR (%K;)> -->
<!ELEMENT LINECOLR EMPTY>
<!ATTLIST LINECOLR
	k CDATA #REQUIRED
>
<!--		MARKER BUNDLE INDEX  	-->
<!--
	MARKERINDEX (
	<I:BUNDLEINDEX> {positive}
	)

-->
<!ELEMENT MARKERINDEX EMPTY>
<!ATTLIST MARKERINDEX
	bundleindex CDATA #REQUIRED
>
<!--		MARKER TYPE  	-->
<!--
	MARKERTYPE (
	<I:MARKERTYPE>
		{ 1=dot, 2=plus, 3=asterisk, 4=circle
		5=cross,
		>5 reserved for registered values,
		<0 private marker types }
) >
-->
<!ELEMENT MARKERTYPE EMPTY>
<!ATTLIST MARKERTYPE
	type CDATA #REQUIRED
>
<!--		MARKER SIZE  	-->
<!--
	MARKERSIZE (
	<V:MARKERSIZE> {non-negative}
	)

-->
<!-- <!ELEMENT MARKERSIZE (%V;)> -->
<!ELEMENT MARKERSIZE EMPTY>
<!ATTLIST MARKERSIZE
	size CDATA #REQUIRED
>
<!--		MARKER COLOUR  	-->
<!--
	MARKERCOLR (
	<K:MARKERCOLR>
	)

-->
<!-- <!ELEMENT MARKERCOLR (%K;)> -->
<!ELEMENT MARKERCOLR EMPTY>
<!ATTLIST MARKERCOLR
	k CDATA #REQUIRED
>
<!--		TEXT BUNDLE INDEX  	-->
<!--
	TEXTINDEX (
	<I:BUNDLEINDEX> {positive}
	)

-->
<!ELEMENT TEXTINDEX EMPTY>
<!ATTLIST TEXTINDEX
	bundle CDATA #REQUIRED
>
<!--		TEXT FONT INDEX  	-->
<!--
	TEXTFONTINDEX (
	<I:FONTINDEX> {positive}
	)

-->
<!ELEMENT TEXTFONTINDEX EMPTY>
<!ATTLIST TEXTFONTINDEX
	font CDATA #REQUIRED
>
<!--		TEXT PRECISION  	-->
<!--
	TEXTPREC (
	< STRING | CHAR | STROKE >
	)

-->
<!ELEMENT TEXTPREC EMPTY>
<!ATTLIST TEXTPREC
	set (STRING | CHAR | STROKE) #REQUIRED
>
<!--		CHARACTER EXPANSION FACTOR  	-->
<!--
	CHAREXPAN (
	<R:FACTOR> {non-negative}
	)

-->
<!ELEMENT CHAREXPAN EMPTY>
<!ATTLIST CHAREXPAN
	factor CDATA #REQUIRED
>
<!--		CHARACTER SPACING  	-->
<!--
	CHARSPACE (
	<R:SPACING>
	)

-->
<!ELEMENT CHARSPACE EMPTY>
<!ATTLIST CHARSPACE
	k CDATA #REQUIRED
>
<!--		TEXT COLOUR  	-->
<!--
	TEXTCOLR (
	<K:TEXTCOLR>
	)

-->
<!-- <!ELEMENT TEXTCOLR (%K;)> -->
<!ELEMENT TEXTCOLR EMPTY>
<!ATTLIST TEXTCOLR
	k CDATA #REQUIRED
>
<!--		CHARACTER HEIGHT  	-->
<!--
	CHARHEIGHT (
	<VDC:CHARHEIGHT> {non-negative}
	)

-->
<!-- <!ELEMENT CHARHEIGHT (%VDC;)> -->
<!ELEMENT CHARHEIGHT EMPTY>
<!ATTLIST CHARHEIGHT
	height CDATA #REQUIRED
>
<!--		CHARACTER ORIENTATION  	-->
<!--
	CHARORI (
	<DELTAPAIR> {up vector}
	<DELTAPAIR> {base vector}
	)

-->
<!ELEMENT CHARORI EMPTY>
<!ATTLIST CHARORI
	up CDATA #REQUIRED
	base CDATA #REQUIRED
>
<!--		TEXT PATH  	-->
<!--
	TEXTPATH (
	< RIGHT | LEFT | UP | DOWN >
	)

-->
<!ELEMENT TEXTPATH EMPTY>
<!ATTLIST TEXTPATH
	path (RIGHT | LEFT | UP | DOWN) #REQUIRED
>
<!--		TEXT ALIGNMENT  	-->
<!--
	TEXTALIGN (
	< NORMHORIZ | LEFT | CTR | RIGHT | CONTHORIZ >
	< NORMVERT | TOP | CAP | HALF | BASE | BOTTOM |CONTVERT >
	<R:CONTINUOUS_HORIZONTAL>
	<R:CONTINUOUS_VERTICAL>
	)

-->
<!-- <!ELEMENT TEXTALIGN ((NORMHORIZ | LEFT | CTR | RIGHT | CONTHORIZ), (NORMVERT | TOP | CAP | HALF | BASE | BOTTOM | CONTVERT), R, R)> -->
<!ELEMENT TEXTALIGN EMPTY>
<!ATTLIST TEXTALIGN
	h (NORMHORIZ | LEFT | CTR | RIGHT | CONTHORIZ) #REQUIRED
	v (NORMVERT | TOP | CAP | HALF | BASE | BOTTOM | CONTVERT) #REQUIRED
	chorizontal CDATA #REQUIRED
	cvertical CDATA #REQUIRED
>
<!--		CHARACTER SET INDEX  	-->
<!--
	CHARSETINDEX (
	<I:CHARSETINDEX> {positive}
	)

-->
<!ELEMENT CHARSETINDEX EMPTY>
<!ATTLIST CHARSETINDEX
	index CDATA #REQUIRED
>
<!--		ALTERNATE CHARACTER SET INDEX  	-->
<!--
	ALTCHARSETINDEX (
	<I:ALTCHARSETINDEX> {positive}
	)

-->
<!ELEMENT ALTCHARSETINDEX EMPTY>
<!ATTLIST ALTCHARSETINDEX
	index CDATA #REQUIRED
>
<!--		FILL BUNDLE INDEX  	-->
<!--
	FILLINDEX (
	<I:BUNDLEINDEX> {positive}
	)

-->
<!ELEMENT FILLINDEX EMPTY>
<!ATTLIST FILLINDEX
	index CDATA #REQUIRED
>
<!--		INTERIOR STYLE  	-->
<!--
	INTSTYLE (
	<HOLLOW | SOLID | PAT | HATCH | EMPTY | GEOPAT | INTERP>
	)

-->
<!ELEMENT INTSTYLE EMPTY>
<!ATTLIST INTSTYLE
	style (HOLLOW | SOLID | PAT | HATCH | EMPTY | GEOPAT | INTERP) #REQUIRED
>
<!--		FILL COLOUR  	-->
<!--
	FILLCOLR (
	<K:FILLCOLR>
	)

-->
<!-- <!ELEMENT FILLCOLR (%K;)> -->
<!ELEMENT FILLCOLR EMPTY>
<!ATTLIST FILLCOLR
	k CDATA #REQUIRED
>
<!--		HATCH INDEX  	-->
<!--
	HATCHINDEX (
	<I:HATCHINDEX>
		{ 1=horizontal,
		2=vertical
		3=positive slope
		4=negative slope
		5=horizontal/vertical cross
		6= positive/negative slope cross
		>6 reserved for registered values,
		<0 private hatch styles }
	)

-->
<!ELEMENT HATCHINDEX EMPTY>
<!ATTLIST HATCHINDEX
	index CDATA #REQUIRED
>
<!--		PATTERN INDEX  	-->
<!--
	PATINDEX (
	<I:PATINDEX> {positive}
	)

-->
<!ELEMENT PATINDEX EMPTY>
<!ATTLIST PATINDEX
	index CDATA #REQUIRED
>
<!--		EDGE BUNDLE INDEX  	-->
<!--
	EDGEINDEX (
	<I:BUNDLEINDEX> {positive}
	)

-->
<!ELEMENT EDGEINDEX EMPTY>
<!ATTLIST EDGEINDEX
	index CDATA #REQUIRED
>
<!--		EDGE TYPE  	-->
<!--
	EDGETYPE (
	<I:EDGETYPE>
		{ 1=solid, 2=dash, 3=dot,
		4=dash-dot, 5=dash-dot-dot,
		>5 reserved for registered values,
		<0 private edge types }
	)

-->
<!ELEMENT EDGETYPE EMPTY>
<!ATTLIST EDGETYPE
	type CDATA #REQUIRED
>
<!--		EDGE WIDTH  	-->
<!--
	EDGEWIDTH (
	<V:EDGEWIDTH> {non-negative}
	)

-->
<!ELEMENT EDGEWIDTH EMPTY>
<!ATTLIST EDGEWIDTH
	width CDATA #REQUIRED
>
<!--		EDGE COLOUR  	-->
<!--
	EDGECOLR (
	<K:EDGECOLR>
	)

-->
<!-- <!ELEMENT EDGECOLR (%K;)> -->
<!ELEMENT EDGECOLR EMPTY>
<!ATTLIST EDGECOLR
	k CDATA #REQUIRED
>
<!--		EDGE VISIBILITY  	-->
<!--
	EDGEVIS (
	< OFF | ON >
	)

-->
<!ELEMENT EDGEVIS EMPTY>
<!ATTLIST EDGEVIS
	set (OFF | ON) #REQUIRED
>
<!--		FILL REFERENCE POINT  	-->
<!--
	FILLREFPT (
	<P:FILLREFPT>
	)

-->
<!ELEMENT FILLREFPT EMPTY>
<!ATTLIST FILLREFPT
	p1 CDATA #REQUIRED
>
<!--		PATTERN TABLE  	-->
<!--
	PATTABLE (
	<I:PATINDEX> {positive}
	<I:NX> {positive}
	<I:NY> {positive}
	<LOCLCOLRPREC>
	<CELLROW>*
	)

	See CELL ARRAY for discussion of the LOCLCOLRPREC and CELLROW productions.

-->
<!ELEMENT PATTABLE EMPTY>
<!ATTLIST PATTABLE
	pat CDATA #REQUIRED
	nx CDATA #REQUIRED
	ny CDATA #REQUIRED
	maxint CDATA #IMPLIED
	maxcomponent CDATA #IMPLIED
	cellrow CDATA #REQUIRED
>
<!--		PATTERN SIZE  	-->
<!--
	PATSIZE (
	<V_DELTAPAIR> {height vector}
	<V_DELTAPAIR> {width vector}
	)

	NOTE 1 Pattern size may only be 'absolute? (VDC) in Version 1 and 2 metafiles. In Version 3 and Version 4 metafiles 
	it may be expressed in any of the 4 modes which can be selected with INTERIOR STYLE SPECIFICATION MODE.

-->
<!ELEMENT PATSIZE EMPTY>
<!ATTLIST PATSIZE
	h CDATA #REQUIRED
	w CDATA #REQUIRED
>
<!--		<V_DELTAPAIR>  	-->
<!--
	V_DELTAPAIR  (
	<V:DELTAX>
	<V:DELTAY>
	)

-->
<!-- <!ELEMENT V_DELTAPAIR (%V;, %V;)> -->
<!-- <!ENTITY V_DELTAPAIR (#PCDATA)> -->
<!--		COLOUR TABLE  	-->
<!--
	COLRTABLE (
	<I:STARTINGINDEX> {non-negative}
	<<DIRECTCOLR>>+
	)

-->
<!ELEMENT COLRTABLE EMPTY>
<!ATTLIST COLRTABLE
	start CDATA #REQUIRED
	directk CDATA #REQUIRED
>
<!--		ASPECT SOURCE FLAGS  	-->
<!--
	ASF (
	<ASFPAIR>
	<<ASFPAIR>>*
	)

-->
<!ELEMENT ASF (ASFPAIR+)>
<!--		ASFPAIR  	-->
<!--
	ASFPAIR
	< ASFTYPE >
	< INDIV | BUNDLED >
	)

-->
<!ELEMENT ASFPAIR EMPTY>
<!ATTLIST ASFPAIR
	type (ASFNAME | PSEUDOASF) #REQUIRED
	pairtype (INDIV | BUNDLED) #REQUIRED
>
<!--		ASFTYPE  	-->
<!--
	ASFTYPE (
	< ASFNAME | PSEUDOASF >
	)

-->
<!--		ASFNAME  	-->
<!--
	ASFNAME ( 
	< LINETYPE | LINEWIDTH | LINECOLR |
	MARKERTYPE | MARKERSIZE | MARKERCOLR |
	TEXTFONTINDEX | TEXTPREC | CHAREXPAN |
	CHARSPACE | TEXTCOLR | INTSTYLE |
	FILLCOLR | HATCHINDEX | PATINDEX |
	EDGETYPE | EDGEWIDTH | EDGECOLR >
	)

-->
<!ELEMENT ASFNAME EMPTY>
<!ATTLIST ASFNAME
	asfname (LINETYPE | LINEWIDTH | LINECOLR | MARKERTYPE | MARKERSIZE | MARKERCOLR | TEXTFONTINDEX | TEXTPREC | CHAREXPAN | CHARSPACE | TEXTCOLR | INTSTYLE | FILLCOLR | HATCHINDEX | PATINDEX | EDGETYPE | EDGEWIDTH | EDGECOLR) #REQUIRED
>
<!--		PSEUDOASF  	-->
<!--
	PSEUDOASF (
	< ALL | ALLLINE | ALLMARKER | ALLTEXT | ALLFILL | ALLEDGE >
	)

	The ASF type may either be a valid ASF name, or a pseudo-ASF. If the former, then the name shall match the name of 
	the corresponding attribute element.

	NOTE 2 The pseudo-ASFs are a shorthand convenience for setting a number of ASFs at once.

	The pseudo-ASFs have the meanings:
		ALL set all ASFs as indicated.
		ALLLINE: set LINETYPE, LINEWIDTH, and LINECOLR ASFs as indicated.
		ALLMARKER: set MARKERTYPE, MARKERSIZE, and MARKERCOLR ASFs as indicated.
		ALLTEXT: set TEXTFONTINDEX, TEXTPREC, CHAREXPAN, CHARSPACE, and TEXTCOLR ASFs as indicated.
		ALLFILL: set INTSTYLE, FILLCOLR, HATCHINDEX, and PATINDEX ASFs as indicated.
		ALLEDGE: set EDGETYPE, EDGEWIDTH, and EDGECOLR as indicated.

-->
<!ELEMENT PSEUDOASF EMPTY>
<!ATTLIST PSEUDOASF
	pseudoasf (ALL | ALLLINE | ALLMARKER | ALLTEXT | ALLFILL | ALLEDGE) #REQUIRED
>
<!--		PICK IDENTIFIER  	-->
<!--
	PICKID (
	<I:PICKID>
	)

-->
<!ELEMENT PICKID EMPTY>
<!ATTLIST PICKID
	pick CDATA #REQUIRED
>
<!--		LINE CAP  	-->
<!--
	LINECAP (
	<I:LINECAP>
		{1=unspecified, 2=butt, 3=round,
		4=projecting square, 5=triangle,
		>5 reserved for registered values }
	<I:DASHCAP>
		{1=unspecified, 2=butt, 3=match,
		>3 reserved for registered values}
	)

-->
<!ELEMENT LINECAP EMPTY>
<!ATTLIST LINECAP
	linecap CDATA #REQUIRED
	dashcap CDATA #REQUIRED
>
<!--		LINE JOIN  	-->
<!--
	LINEJOIN (
	<I:JOIN>
		{1=unspecified, 2=mitre,
		3=round, 4=bevel,
		>4 reserved for registered values}
	)

-->
<!ELEMENT LINEJOIN EMPTY>
<!ATTLIST LINEJOIN
	join CDATA #REQUIRED
>
<!--		LINE TYPE CONTINUATION  	-->
<!--
	LINETYPECONT (
	<I:CONTMODE>
		{1=unspecified, 2=continue,
		3=restart, 4=adaptive continue,
		>4 reserved for registered values}
	)

-->
<!ELEMENT LINETYPECONT EMPTY>
<!ATTLIST LINETYPECONT
	set CDATA #REQUIRED
>
<!--		LINE TYPE INITIAL OFFSET  	-->
<!--
	LINETYPEINITOFFSET (
	<R:PATTERNOFFSET>
	)

-->
<!ELEMENT LINETYPEINITOFFSET EMPTY>
<!ATTLIST LINETYPEINITOFFSET
	offset CDATA #REQUIRED
>
<!--		TEXT SCORE TYPE  	-->
<!--

	TEXTSCORETYPE (
	< <I:SCORETYPE>
		{1=right score, 2=left score,
		3=through score, 4=kendot,
		>4 reserved for registered values}
	 <OFF | ON> >+
	)

-->
<!-- <!ELEMENT TEXTSCORETYPE ((I, (OFF | ON))+)> -->
<!ELEMENT TEXTSCORETYPE EMPTY>
<!ATTLIST TEXTSCORETYPE
	scoretype CDATA #REQUIRED
	set (OFF | ON) #REQUIRED
>
<!--		RESTRICTED TEXT TYPE  	-->
<!--
	RESTRTEXTTYPE (
	<I:RESTRICTIONTYPE>
		{1=basic, 2=boxed-cap, 3=boxed-all,
		4=isotropic-cap, 5=isotropic-all, 6=justified,
		>6 reserved for registered values}
	)

-->
<!ELEMENT RESTRTEXTTYPE EMPTY>
<!ATTLIST RESTRTEXTTYPE
	type CDATA #REQUIRED
>
<!--		INTERPOLATED INTERIOR  	-->
<!--
	INTERPINT (
	<I:STYLE>
		{1=parallel, 2=elliptical, 3=triangular,
		>3 reserved for registered values}
	< <<V:X><V:Y>>(1) {parallel}
	| <<V:X><V:Y>>(2) > {elliptical, triangular}
	<I:NBROFSTAGES>
	<<R:STAGEDESGN>>(m)
	<<<K:REFCOLRLIST>>(m+1) {parallel,elliptical}
	| <<K:REFCOLRLIST>>(3)> {triangular}
		{m is the number of stages}
	) 

-->
<!ELEMENT INTERPINT EMPTY>
<!ATTLIST INTERPINT
	style CDATA #REQUIRED
	p1 CDATA #REQUIRED
	p2 CDATA #IMPLIED
	stages CDATA #REQUIRED
	stagedesign CDATA #REQUIRED
	refcolrlist CDATA #REQUIRED
>
<!--		EDGE CAP  	-->
<!--
	EDGECAP (
	<I:EDGECAP>
		{1=unspecified, 2=butt, 3=round,
		4=projecting square, 5=triangle,
		>5 reserved for registered values}
	<I:DASHCAP>
		{1=unspecified, 2=butt, 3=match,
		>3 reserved for registered values}
	)

-->
<!-- <!ELEMENT EDGECAP (I, I)> -->
<!ELEMENT EDGECAP EMPTY>
<!ATTLIST EDGECAP
	edgecap CDATA #REQUIRED
	dashcap CDATA #REQUIRED
>
<!--		EDGE JOIN  	-->
<!--
	EDGEJOIN (
	<I:JOIN>
		{1=unspecified, 2=mitre,
		3=round, 4=bevel,
		>4 reserved for registered values}
	)

-->
<!ELEMENT EDGEJOIN EMPTY>
<!ATTLIST EDGEJOIN
	join CDATA #REQUIRED
>
<!--		EDGE TYPE CONTINUATION  	-->
<!--
	EDGETYPECONT (
	<I:CONTMODE>
		{1=unspecified, 2=continue,
		3=restart, 4=adaptive continue,
		>4 reserved for registered values}
	)

-->
<!ELEMENT EDGETYPECONT EMPTY>
<!ATTLIST EDGETYPECONT
	set CDATA #REQUIRED
>
<!--		EDGE TYPE INITIAL OFFSET  	-->
<!--
	EDGETYPEINITOFFSET (
	<R:PATTERNOFFSET>
	) 

-->
<!ELEMENT EDGETYPEINITOFFSET EMPTY>
<!ATTLIST EDGETYPEINITOFFSET
	offset CDATA #REQUIRED
>
<!--		SYMBOL LIBRARY INDEX  	-->
<!--
	SYMBOLINDEX (
	<I:INDEX> {positive}
	)

-->
<!ELEMENT SYMBOLINDEX EMPTY>
<!ATTLIST SYMBOLINDEX
	index CDATA #REQUIRED
>
<!--		SYMBOL COLOUR  	-->
<!--
	SYMBOLCOLR (
	<K:SYMBOLCOLOUR>
	)

-->
<!-- <!ELEMENT SYMBOLCOLR (%K;)> -->
<!ELEMENT SYMBOLCOLR EMPTY>
<!ATTLIST SYMBOLCOLR
	k CDATA #REQUIRED
>
<!--		SYMBOL SIZE  	-->
<!--
	SYMBOLSIZE (
	<HEIGHT | WIDTH | BOTH>
	<VDC:HEIGHT>
	<VDC:WIDTH>
	)

-->
<!-- <!ELEMENT SYMBOLSIZE ((HEIGHT | WIDTH | BOTH), %VDC;, %VDC;)> -->
<!ELEMENT SYMBOLSIZE EMPTY>
<!ATTLIST SYMBOLSIZE
	size (HEIGHT | WIDTH | BOTH) #REQUIRED
	height CDATA #IMPLIED
	width CDATA #IMPLIED
>
<!--		SYMBOL ORIENTATION  	-->
<!--
	SYMBOLORI (
	<DELTAPAIR> {up vector}
	<DELTAPAIR> {base vector}
	)

-->
<!ELEMENT SYMBOLORI EMPTY>
<!ATTLIST SYMBOLORI
	up CDATA #REQUIRED
	base CDATA #REQUIRED
>
<!--		7.7 Encoding escape elements	-->
<!--		ESCAPE  	-->
<!--
	ESCAPE (
	<I:IDENTIFIER>
	<S:DATARECORD>
	)

-->
<!ELEMENT ESCAPE EMPTY>
<!ATTLIST ESCAPE
	identifier CDATA #REQUIRED
	data CDATA #REQUIRED
>
<!--		7.8 Encoding external elements 	-->
<!--		MESSAGE  	-->
<!--
	MESSAGE (
	< NOACTION | ACTION >
	<SF:MESSAGE_TEXT>
	)

-->
<!ELEMENT MESSAGE (#PCDATA)>
<!ATTLIST MESSAGE
	action (NOACTION | ACTION) #REQUIRED
>
<!--		APPLICATION DATA  	-->
<!--
	APPLDATA (
	<I:IDENTIFIER>
	<S:DATARECORD>
	)

-->
<!-- <!ELEMENT APPLDATA (I, S)> -->
<!ELEMENT APPLDATA EMPTY>
<!ATTLIST APPLDATA
	identifier CDATA #REQUIRED
	data CDATA #REQUIRED
>
<!--		7.9 Encoding segment control and segment attribute elements -->
<!--		COPY SEGMENT  	-->
<!--
	COPYSEG (
	<I:SEGID>
	<TM:TRANMATRIX>
	<NO|YES>
	)

-->
<!ELEMENT COPYSEG EMPTY>
<!ATTLIST COPYSEG
	segid CDATA #REQUIRED
	tm CDATA #REQUIRED
	yn (NO | YES) #REQUIRED
>
<!--		INHERITANCE FILTER  	-->
<!--
	INHFILTER (
	<ELEMORGROUPNAME>
	<<ELEMORGROUPNAME>>*
	<STLIST|SEG>
	)

-->
<!ELEMENT INHFILTER EMPTY>
<!ATTLIST INHFILTER
	elemorgroups CDATA #REQUIRED
	set (STLIST | DEFSEG) #REQUIRED
>
<!--		ELEMORGROUPNAME  	-->
<!--
	ELEMORGROUPNAME (
	<LINEINDEX | 
	LINETYPE |
	LINEWIDTH |
	LINECOLR |
	LINECLIPMODE |
	MARKERINDEX |
	MARKERTYPE |
	MARKERSIZE |
	MARKERCOLR |
	MARKERCLIPMODE |
	TEXTINDEX |
	TEXTFONTINDEX |
	TEXTPREC |
	CHAREXPAN |
	CHARSPACE |
	TEXTCOLR |
	CHARHEIGHT |
	CHARORI |
	TEXTPATH |
	TEXTALIGN |
	FILLINDEX |
	INTSTYLE |
	FILLCOLR |
	HATCHINDEX |
	PATINDEX |
	EDGEINDEX |
	EDGETYPE |
	EDGEWIDTH |
	EDGECOLR |
	EDGEVIS |
	EDGECLIPMODE |
	FILLREFPT |
	PATSIZE |
	AUXCOLR |
	TRANSPARENCY |
	LINEATTR |
	MARKERATTR |
	TEXPRESANDPLACEMATTR |
	TEXTPLACEMANDORIATTR |
	FILLATTR |
	EDGEATTR |
	PATATTR |
	OUTPUTCTRL |
	PICKID |
	ALLATTRCTRL |
	ALLINH |
	LINETYPEASF |
	LINEWIDTHASF |
	LINECOLRASF |
	MARKERTYPEASF |
	MARKERSIZEASF |
	MARKERCOLRASF |
	TEXTFONTINDEXASF |
	TEXTPRECASF |
	CHAREXPANASF |
	CHARSPACEASF |
	TEXTCOLRASF |
	INTSTYLEASF |
	FILLCOLRASF |
	HATCHINDEXASF |
	PATINDEXASF |
	EDGETYPEASF |
	EDGEWIDTHASF |
	EDGECOLRASF |
	ALLLINE |
	ALLMARKER |
	ALLTEXT |
	ALLFILL |
	ALLEDGE |
	ALL |
	MITRELIMIT |
	LINECAP |
	LINEJOIN |
	LINETYPECONT |
	LINETYPEINITOFFSET |
	TEXTSCORETYPE |
	RESTRTEXTTYPE |
	INTERPOLATEDINTERIOR |
	EDGECAP |
	EDGEJOIN |
	EDGETYPECONT |
	EDGETYPEINITOFFSET |
	SYMBOLLIBINDEX |
	SYMBOLCOLR |
	SYMBOLSIZE |
	SYMBOLORI |
	SYMBOLATTR>
	)

	NOTE 1 ALLINH means all attributes, control elements and ASFs. ALLLINE, ALLMARKER, ALLTEXT, ALLFILL, ALLEDGE
	and ALL have the meaning defined in 7.7.
-->
<!ELEMENT ELEMORGROUPNAME (LINEINDEX | LINETYPE | LINEWIDTH | LINECOLR | LINECLIPMODE | MARKERINDEX | MARKERTYPE | MARKERSIZE | MARKERCOLR | MARKERCLIPMODE | TEXTINDEX | TEXTFONTINDEX | TEXTPREC | CHAREXPAN | CHARSPACE | TEXTCOLR | CHARHEIGHT | CHARORI | TEXTPATH | TEXTALIGN | FILLINDEX | INTSTYLE | FILLCOLR | HATCHINDEX | PATINDEX | EDGEINDEX | EDGETYPE | EDGEWIDTH | EDGECOLR | EDGEVIS | EDGECLIPMODE | FILLREFPT | PATSIZE | AUXCOLR | TRANSPARENCY | LINEATTR | MARKERATTR | TEXPRESANDPLACEMATTR | TEXTPLACEMANDORIATTR | FILLATTR | EDGEATTR | PATATTR | OUTPUTCTRL | PICKID | ALLATTRCTRL | ALLINH | LINETYPEASF | LINEWIDTHASF | LINECOLRASF | MARKERTYPEASF | MARKERSIZEASF | MARKERCOLRASF | TEXTFONTINDEXASF | TEXTPRECASF | CHAREXPANASF | CHARSPACEASF | TEXTCOLRASF | INTSTYLEASF | FILLCOLRASF | HATCHINDEXASF | PATINDEXASF | EDGETYPEASF | EDGEWIDTHASF | EDGECOLRASF | ALLLINE | ALLMARKER | ALLTEXT | ALLFILL | ALLEDGE | ALL | MITRELIMIT | LINECAP | LINEJOIN | LINETYPECONT | LINETYPEINITOFFSET | TEXTSCORETYPE | RESTRTEXTTYPE | INTERPOLATEDINTERIOR | EDGECAP | EDGEJOIN | EDGETYPECONT | EDGETYPEINITOFFSET | SYMBOLLIBINDEX | SYMBOLCOLR | SYMBOLSIZE | SYMBOLORI | SYMBOLATTR)>
<!ELEMENT ALL EMPTY>
<!ELEMENT ALLATTRCTRL EMPTY>
<!ELEMENT ALLINH EMPTY>
<!ELEMENT ALLLINE EMPTY>
<!ELEMENT ALLMARKER EMPTY>
<!ELEMENT ALLTEXT EMPTY>
<!ELEMENT ALLFILL EMPTY>
<!ELEMENT ALLEDGE EMPTY>
<!ELEMENT CHAREXPANASF EMPTY>
<!ELEMENT CHARSPACEASF EMPTY>
<!ELEMENT EDGEATTR EMPTY>
<!ELEMENT EDGECOLRASF EMPTY>
<!ELEMENT EDGETYPEASF EMPTY>
<!ELEMENT EDGEWIDTHASF EMPTY>
<!ELEMENT FILLATTR EMPTY>
<!ELEMENT FILLCOLRASF EMPTY>
<!ELEMENT HATCHINDEXASF EMPTY>
<!ELEMENT INTERPOLATEDINTERIOR EMPTY>
<!ELEMENT INTSTYLEASF EMPTY>
<!ELEMENT LINEATTR EMPTY>
<!ELEMENT LINECOLRASF EMPTY>
<!ELEMENT LINETYPEASF EMPTY>
<!ELEMENT LINEWIDTHASF EMPTY>
<!ELEMENT MARKERATTR EMPTY>
<!ELEMENT MARKERCOLRASF EMPTY>
<!ELEMENT MARKERSIZEASF EMPTY>
<!ELEMENT MARKERTYPEASF EMPTY>
<!ELEMENT OUTPUTCTRL EMPTY>
<!ELEMENT PATATTR EMPTY>
<!ELEMENT PATINDEXASF EMPTY>
<!ELEMENT SYMBOLATTR EMPTY>
<!ELEMENT SYMBOLLIBINDEX EMPTY>
<!ELEMENT TEXPRESANDPLACEMATTR EMPTY>
<!ELEMENT TEXTCOLRASF EMPTY>
<!ELEMENT TEXTFONTINDEXASF EMPTY>
<!ELEMENT TEXTPLACEMANDORIATTR EMPTY>
<!ELEMENT TEXTPRECASF EMPTY>
<!--		CLIP INHERITANCE  	-->
<!--
	CLIPINH (
	<STLIST|INTERSECTION>
	)

-->
<!ELEMENT CLIPINH EMPTY>
<!ATTLIST CLIPINH
	set (STLIST | INTERSECTION) #REQUIRED
>
<!--		SEGMENT TRANSFORMATION  	-->
<!--
	SEGTRAN (
	<I:SEGID>
	<TM:TRANMATRIX>
	)

-->
<!ELEMENT SEGTRAN EMPTY>
<!ATTLIST SEGTRAN
	segid CDATA #REQUIRED
	tm CDATA #REQUIRED
>
<!--		SEGMENT HIGHLIGHTING  	-->
<!--
	SEGHIGHL (
	<I:SEGID>
	<NORMAL|HIGHL>
	)

-->
<!ELEMENT SEGHIGHL EMPTY>
<!ATTLIST SEGHIGHL
	segid CDATA #REQUIRED
	set (NORMAL | HIGHL) #REQUIRED
>
<!--		SEGMENT DISPLAY PRIORITY  	-->
<!--
	SEGDISPPRI (
	<I:SEGID>
	<I:DISPLAYPRIORITY> {non-negative}
	)

-->
<!-- <!ELEMENT SEGDISPPRI (I, I)> -->
<!ELEMENT SEGDISPPRI EMPTY>
<!ATTLIST SEGDISPPRI
	segid CDATA #REQUIRED
	priority CDATA #REQUIRED
>
<!--		SEGMENT PICK PRIORITY  	-->
<!--
	SEGPICKPRI (
	<I:SEGID>
	<I:PICKPRIORITY> {non-negative}
	)

-->
<!ELEMENT SEGPICKPRI EMPTY>
<!ATTLIST SEGPICKPRI
	segid CDATA #REQUIRED
	priority CDATA #REQUIRED
>
<!--		7.10 Encoding application structure descriptor elements	-->
<!--		APPLICATION STRUCTURE ATTRIBUTE 	-->
<!--
	APSATTR (
	<SF:APSATTRTYPE>
	<SDR:DATARECORD>
	)
	
-->
<!ELEMENT APSATTR EMPTY>
<!ATTLIST APSATTR
	type (layername | layerdesc | region | viewcontext | linkuri | screentip | content | name) #REQUIRED
	apsnum CDATA #REQUIRED
	data CDATA #REQUIRED
>
<!--
<!ELEMENT layerbody (layername, layerdesc?, (grobjectbody | parabody | gdata)+)> 
<!ELEMENT grobjectbody (region?, viewcontext?, linkuri?, screentip?, name?, (grobjectbody | parabody | gdata)*)>
<!ELEMENT parabody (region?, viewcontext?, linkuri?, screentip?, content?, (subparabody | gdata)*)>
<!ELEMENT subparabody (region?, viewcontext?, linkuri?, screentip?, content?, (gdata)*)>
-->
<!-- ************************************************************************************************** -->
<!--
Layer

Description. The 'layer' APS declares that the graphical content within this APS and any valid nested APS ('grobject' and 'para', but not 'layer') belong to the layer identified by the contained 'layername' APS attribute. Each 'layer' APS shall contain exactly one 'layername' APS attribute and also may contain one 'layerdesc' APS attribute.

Viewer Behavior. Viewers shall provide functionality to inform users of the presence of layers, their names and descriptions. Viewers shall provide functionality to selectively turn on and off the visibility of layers. Viewer may, but are not required to, provide additional functionality for the view manipulation and browsing of layers.

-->
<!-- <!ELEMENT layer (grobject | para | gdata)+                 > 
<!ATTLIST layer
  id           ID         #REQUIRED
  layername    CDATA      #REQUIRED
  layerdesc    CDATA      #IMPLIED                         >
-->
<!ELEMENT layerbody (layername, layerdesc?, (grobjectbody | parabody | gdata)+)>
<!--
Layername
Description. The 'layername' APS Attribute declares that the graphics associated with the 'layer' APS containing this attribute belong to the identified layer. The 'layername' need not be unique. If more than one 'layer' APS contains the same 'layername', then the occurrences following the first occurrence shall be construed as continuing the definition of the named layer. At most one 'layername' attribute may be present within a single 'layer' APS.

Note: as a consequence of ISO CGM Defect Resolution 8632-1/064, the definition of any application structure can be continued by the occurrence of a disjoint APS (i.e., a separate BeginAPS-content-EndAPS group) with the same APS id parameter value. Therefore, the definition of a given layer can be continued by repeating the value of the 'layername' APS attribute in a disjoint APS, either with different APS id value, or with the same APS id value. However, it is not permitted for a subsequent disjoint APS to have the same APS id value as a previous APS, but with a different value of the 'layername' APS attribute.

Parameters. The data record is a SDR of one member, containing one string (type SF, String Fixed) - the Layer Name (identifier). The string can be null (zero-length). If the Layer Name is null, then the graphics of this object belong to the null layer.

-->
<!ELEMENT layername (apsnum, S)>
<!-- apsnum - ****THIS IS A PLACEHOLDER FOR UNKNOWN pair of Intergers at the beginning of the content of the APSATTR specific entry -->
<!ELEMENT apsnum (#PCDATA)>
<!--
Layerdesc

Description. The 'layerdesc' APS Attribute provides optional descriptive text which is associated with the 'layer' APS in which it occurs. This may be used by viewers to facilitate required and optional layer manipulation functions, as described in 3.2.1.2. At most one 'layerdesc' attribute may be contained within a single 'layer' APS.

Parameters. The data record is a SDR of one member, containing one string (type SF, String Fixed).

-->
<!ELEMENT layerdesc (apsnum, S)>
<!--
Grobject

Description. The application structure (APS) of type 'grobject' is used to group graphical primitives in a picture together and assign certain attributes to the group. The object is geometrically identified either by the set of primitives enclosed between the BEGIN APS and END APS elements (if any), or by the spatial region associated with the 'region' APS Attribute (if present). 'Grobject' APSs may contain any CGM graphical content allowed by this profile, and may contain other APS and APS attribute content as defined in section 3.3 (the complete, normative WebCGM content model).

Viewer Behavior. A 'grobject' APS may be selected by the user ("pick"). The viewer shall decide about the pick selection in the following manner:

If the object contains at least one 'linkuri' attribute but no 'region' attribute, then the object is selected by a click anywhere on the drawn primitives of the object. Note, for filled-area primitives this includes: the edge, if edge visibility is 'on'; the interior, if the interior style is other than 'empty' or 'hollow'; and, the boundary, for interior style 'hollow'. 
If the object contains at least one 'linkuri' attribute but no 'region' attribute, then the object is selected by a click anywhere on the drawn primitives of the object. If the object does not contain any graphical primitives no further action is required. If the object contains more than one 'linkuri' attribute, the user shall be given a choice of which URI to navigate. 
If the object contains a 'region' attribute and contains at least one 'linkuri' attribute, then the 'region' shall be used for selection. If the object contains more than one 'linkuri' attribute, the user shall be given a choice of which URI to navigate. 
If the object contains a 'region' attribute but no 'linkuri' attributes no further action is required. 
It is possible that a user selection ("pick") of a object in a displayed WebCGM picture may not have a single unambiguous result - the cursor location may reside within the geometric extent or 'region' of more than one APS. In such a case, the pick priority is as follows:

If the pick has selected only one APS (and it contains a 'linkuri'), then it is the one which is picked; 
If the pick has selected more than one APS (and each contains a 'linkuri'), and the APSs are not nested, then the APS with the highest pick priority is the one whose picking region occurs latest in the picture (see the 'region' APS Attribute for definition of "picking region"). 
If the pick has selected more than one APS (and each contains a 'linkuri'), and the APSs are nested, the user shall be given a choice of which URI to navigate. 
Viewers shall give visual feedback to the user that a successful pick has occurred, and an indication of the particular object (or region) which has been picked. The exact method of feedback is viewer dependent.

If an APS is the target of a link, either from within the picture or from content external to the picture, then the default behavior of the viewer shall be as follows:

If the object contains a 'viewcontext' APS attribute, the viewer shall "fit" the view context into the viewer's display rectangle and create a new display inside this rectangle. 
If the object does not contain a 'viewcontext' attribute, but contains a 'region' attribute, the viewer shall move the object into view and indicate visually that the region is the target of the link. The manner in which the viewer creates the new display is viewer dependent. The resulting view is a full-picture view, not a zoomed view. 
If the object contains neither a 'viewcontext' nor a 'region' attribute, the viewer shall move the object into view and indicate visually that the graphical primitives of the grobject are the target of the link. The manner in which the viewer creates the new display is viewer dependent. The resulting view is a full-picture view, not a zoomed view. 
The case of default object behavior and no 'viewcontext' APS attribute requires a full-picture view, not a zoomed view. Some legacy intelligent graphics content, as well as some closely related IG profiles, have specified that this case requires a zoomed view. Viewers should have an operating mode to select zoomed view for these default cases. The next functional edition of WebCGM will have explicit controls for this viewer behavior.

Caveat: the CGM standard allows the definition of an APS to be continued in pieces which are disjoint in the file. If an APS occurs which has the same value of the 'id' parameter as an earlier APS occurrance, then that is construed as a continuation of the definition of that object. This has not been prohibited in the WebCGM 1.0 profile. However, it is considered to be problematic, separating the logical structure from the file structure, and allowing non-hierarchical constructs in the latter. Prohibiting continued APS in the next functional Edition of WebCGM is under active discussion, and is considered likely.
-->
<!-- <!ELEMENT grobject (grobject | para | gdata)*              >
<!ATTLIST grobject
  id           ID         #REQUIRED
  region       CDATA      #IMPLIED
  viewcontext  CDATA      #IMPLIED
  linkuri      CDATA      #IMPLIED
  screentip    CDATA      #IMPLIED
  name         CDATA      #IMPLIED                         >
-->
<!ELEMENT grobjectbody (region?, viewcontext?, linkuri?, screentip?, name?, (grobjectbody | parabody | gdata)*)>
<!--
 Region

Description. The 'region' APS Attribute provides an optional spatial region, associated with a graphical object, which assumes precedence for user picking operations directed at the object. Simple regions of type rectangle, ellipse, polygon, and continuous polybezier can be defined. Complex regions which comprise a collection of simple regions can be built, allowing definition of disjoint subregions, regions with holes, etc. Their semantics (subregions, and interior/exterior definition) are identical to those of the CGM element CLOSED FIGURE. At most one 'region' attribute may be present within a single APS.

Parameters. The data record is a SDR of one or more member pairs (i.e., 2*m members, m>=1). Each member-pair defines a simple region: the first member is of data type Index, whose valid values are:

1 rectangle 
2 ellipse 
3 polygon 
4 continuous polybezier 

The second member is type VDC and contains:

for rectangle: 4 VDC defining two corner points; 
for ellipse: 6 VDC defining respectively the center, and two CDP endpoints; 
for polygon: 2n VDC defining polygon vertex points 
for polybezier: 2*(3n+1) VDC values, representing 3n+1 points, defining n contiguous cubic bezier segments; 
For polygon and polybezier regions, closure is implicit (if the last given point does not match the first, then the viewer closes the region with a straight line segment from the last to the first).

-->
<!-- <!ELEMENT region (I, (%VDC;)*)> -->
<!-- <!ELEMENT region (apsnum, I, (%VDC;)*)> -->
<!ELEMENT region (apsnum, S)>
<!--
Viewcontext

Description. The 'viewcontext' APS Attribute provides specification to viewers of the initial view of an object, when the viewer has been directed to navigate to the graphical object which contains this attribute. A 'viewcontext' APS Attribute may be contained within an otherwise empty APS, in which case the APS provides only a viewport specification. At most one 'viewcontext' attribute may be present within a single APS.

Parameters. The data record is a SDR of 1 member of type VDC defining two corner points of a rectangle.

-->
<!-- <!ELEMENT viewcontext (%VDC;, %VDC;)> -->
<!ELEMENT viewcontext (apsnum, S)>
<!--
Linkuri

Description. The 'linkuri' APS Attribute defines a URI, to be associated with the object containing this attribute. When the object is selected by a graphical pick operation, then the viewer shall take necessary action to navigate the link. Multiple 'linkuri' attributes may be contained within a single APS.

Parameters. The data record is a SDR of one member, containing three strings (type SF, String Fixed). The first string is the link destination, a URI, the second string (possibly null) is a Link Title parameter, and the third string is (possibly null) the Behavior parameter. Note that a null string is a zero-length string, and is not the same as an omitted parameter.

The destination of a link is specified by a Uniform Resource Identifier, or URI. Any valid URL under the specifications of RFC-2396 is a valid value of this parameter. This specification does not constrain the syntax or semantics of a URI in a 'linkuri' that identifies a resource that is not a CGM file (for example, an HTML or XML document).

The Behavior string defines picture behavior associated with the link. The values and meanings are as defined in 3.1.2.2. In cases that the destination is not CGM media type, the 3rd parameter, Behavior, shall be used if picture behavior is to be specified for the link (there is no other option). The Behavior string may also be used for links to CGM media types, and is the preferred method.

In the case that the URI points to CGM media type, the picture behavior may be encoded within the optional fragment identifier in conjunction with the URI structure, per section 3.1.1, "Addressing Pictures and Objects". This form is deprecated, and may be removed in a future edition of this profile. For specifying picture behavior, particular WebCGM 'linkuri' instances shall use either the Behavior string (preferred), or the picture behavior specification embedded in the fragment, but not both.
-->
<!ELEMENT linkuri (apsnum, S)>
<!--
Screentip

Description. The 'screentip' APS Attribute provides an optional string, to be associated with a graphical object, which viewers can display when the graphical cursor passes over the graphical object. This APS Attribute may occur within any graphical object of WebCGM, specifically, within any APS of type 'grobject', 'para', and 'subpara', and there shall be at most one occurrence within any particular APS.

Parameters. The data record is a SDR of one member, containing one string (type SF, String Fixed).

Viewer Behavior. Viewers shall be capable of displaying the screen tip, if one is defined for a graphical object, visible to the user when the cursor passes over the graphical object, in the common style of Web browsers.

-->
<!ELEMENT screentip (apsnum, S)>
<!--
Name
Description. The 'name' APS Attribute provides an optional string, that defines a "common name" associated with an object. Unlike the APS 'id' parameter, the 'name' APS attribute need not be unique within a metafile. This is the same as the Name ("common name") APS Attribute of ATA Grexchange 2.4. Multiple 'name' attributes may be contained within a single APS.

Parameters. The data record is a SDR of one member, containing one string (type SF, String Fixed).

Viewer Behavior. The 'name' gives applications a way to associate common names with objects. The object can optionally be addressed by the value of the 'name' attribute.
-->
<!ELEMENT name (apsnum, S)>
<!--
Para

Description. The application structure (APS) of type 'para', may be used to identify text ("paragraphs"). In the case that the underlying graphic does not represent graphical text in a searchable form (e.g., the text has been rasterized, polygonized, broken into small units, or pieces of a single string occur in awkward order), 'para' together with 'content' can potentially enable text search functionality. 'Para' APSs may contain any CGM graphical content allowed by this profile, and may contain other APS and APS attribute 'content' as defined in section 3.3 (the complete, normative WebCGM content model).

Viewer Behavior. The WebCGM prescription for priority of text search matching is: 'para' with matching 'content' (1st priority match); 'para' without 'content' but with recognizable single-element RESTRICTED TEXT match (2nd priority match); or, single-element RESTRICTED TEXT match, outside of any 'para' (3rd priority match). Further details of behavior of viewers with respect to identifying matches or communicating the identity of matches is not specified in WebCGM 1.0.

In other respects, e.g., picking and link navigation, the viewer behavior of 'para' is identical to that of 'grobject'.
-->
<!-- <!ELEMENT para (subpara | gdata)*   >
<!ATTLIST para
  id           ID         #REQUIRED
  region       (rectangle | ellipse | polygon | continuous polybezier)      #IMPLIED
  linkuri      CDATA      #IMPLIED
  screentip    CDATA      #IMPLIED
  content      CDATA      #IMPLIED                         >
 -->
<!ELEMENT parabody (region?, viewcontext?, linkuri?, screentip?, content?, (subparabody | gdata)*)>
<!--  
Content
Description. The 'content' APS Attribute provides a means to declare what is the first priority searchable text content of a 'para' APS. The 'content' APS Attribute may occur only within APS of type 'para' and 'sub-para', and there shall be at most one occurrence within any such APS.

Parameters. The data record is a SDR of one member, containing one string (type SF, String Fixed).

Viewer Behavior. See the description under the 'para' 
-->
<!ELEMENT content (apsnum, S)>
<!--
Subpara

Description. The application structure (APS) of type 'subpara', may be used to identify smaller fragments of text within APS of type 'para'. This enables, for example, the identification of the larger text block (the "paragraph") for searching purposes, and the tagging of smaller fragments as hotspots. 'Subpara' APSs may contain any CGM graphical content allowed by this profile, may not contain nested APS, and may contain APS attribute 'content' as defined in section 3.3. The APS attribute content rules of sub-para matches those of 'para'.

-->
<!-- <!ELEMENT subpara (gdata)*                                 >
<!ATTLIST subpara
 id           ID         #REQUIRED
 region       CDATA      #IMPLIED
 viewcontext  CDATA      #IMPLIED
 linkuri      CDATA      #IMPLIED
 screentip    CDATA      #IMPLIED
 content      CDATA      #IMPLIED                          >
 -->
<!ELEMENT subparabody (region?, viewcontext?, linkuri?, screentip?, content?, (gdata)*)>
<!ELEMENT gdata EMPTY>
<!ATTLIST gdata
	cgmprim ENTITY #REQUIRED
>
<!--
when the graphical cursor passes over the graphical object. This APS Attribute may occur within any valid APS of WebCGM, and there shall be at most one occurrence within any particular APS

Fixed Herein and is NO LONGER TRUE...... Note: the use of XML to express the content model of WebCGM implies that a particular attribute can have at most one instance within a particular APS instance. This is not the case, and the normative rules are as specified in 3.2.2.1 through 3.2.2.8.
-->
