windows-nt/Source/XPSP1/NT/sdktools/restools/mui/msi/wischema.xml
2020-09-26 16:20:57 +08:00

1534 lines
99 KiB
XML

<?xml-stylesheet type="text/xsl" href="xdr-schema.xsl"?>
<!--Schema for generating or adding data to Windows Installer databases
Items may be added, replaced, or removed, or may reference existing items.
Components must either be defined or else reference existing components.
New components are defined at the appropriate node in the Directory tree
and are referenced at the appropriate node in the Feature tree.
Component elements associated with advertisement must be defined under
the appropriate component in the feature tree, not the directory tree,
these component elements being: Class, Shortcut(if advertised), Category.
Unless the component has a single File or a single Registry with no File,
a KeyPath attribute must be 'yes' on a File, Registry, or CreateFolder child
element, or on the Component itself in which case its Directory is the KeyPath.
A TypeLib elements defined a child of a Class will also be registered
under the class in HKCR, else if defined as a child of a Component
only the typelib is registered on its own, but not under the class.
A ProgId elements must be defined as a child of a Class element, and the
first child ProgId of a class will be registered as the default ProgId.
A version-independent ProgId must be a child element of the versioned ProgId.
The op attribute is always optional, in which case it defaults to 'merge'
'exist' : element must already exist in the output database, else fails
'insert' : element is inserted, fails if exists
'merge' : element is inserted, fails if exists unless all attributes identical
'ensure' : element is inserted only if row with the same key(s) does not exist
'replace' : element is inserted, replacing any existing row with the same key(s)
'delete' : element with the same key(s) is deleted, no error if not present
-->
<Schema xmlns ="urn:schemas-microsoft-com:xml-data"
xmlns:dt="urn:schemas-microsoft-com:datatypes"
schemaname="Windows Installer Database">
<AttributeType name='op' dt:type='enumeration' dt:values='exist insert merge ensure replace delete' default='merge' description='Operation to act on element'/>
<ElementType name='Column' content='textOnly' model='closed'>
<!-- Element value is name for the column -->
<description> Column definition for a Custom Table </description>
<attribute type='op'/>
<AttributeType name='PrimaryKey' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='PrimaryKey'/>
<AttributeType name='Type' dt:type='enumeration' dt:values='binary int string' required='yes'/>
<attribute type ='Type'/>
<AttributeType name='Width' dt:type='int'/>
<attribute type ='Width'/>
<AttributeType name='Nullable' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='Nullable'/>
<AttributeType name='Localizable' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='Localizable'/>
</ElementType>
<ElementType name='Data' content='textOnly' model='closed'>
<!-- Element value is data the data value -->
<description> Data item for a row of a Custom Table </description>
<attribute type='op'/>
<AttributeType name='Column' dt:type='string' required='yes'/>
<attribute type ='Column'/>
</ElementType>
<ElementType name='Row' content='eltOnly' model='closed'>
<description> Row data for a Custom Table </description>
<attribute type='op'/>
<element type ='Data' minOccurs='0' maxOccurs='*'/>
</ElementType>
<ElementType name='CustomTable' content='mixed' model='closed'>
<!-- Element value is name for the custom table -->
<description> Provides definition of Custom Table </description>
<attribute type='op'/>
<element type ='Column' minOccurs='1' maxOccurs='*'/>
<element type ='Row' minOccurs='0' maxOccurs='*'/>
</ElementType>
<ElementType name='IniFile' content='textOnly' model='closed'>
<!-- Element value is IniFile identifier -->
<description> Adds or removes .ini file entries</description>
<attribute type='op'/>
<AttributeType name='Name' dt:type='string'/>
<attribute type ='Name'/>
<AttributeType name='Directory' dt:type='string' required='no'/>
<attribute type ='Directory'/>
<AttributeType name='Section' dt:type='string'/>
<attribute type ='Section'/>
<AttributeType name='Key' dt:type='string'/>
<attribute type ='Key'/>
<AttributeType name='Value' dt:type='string' required='no'/>
<attribute type ='Value'/>
<AttributeType name='Action' dt:type='enumeration' dt:values='addLine createLine addTag removeLine removeTag'/>
<attribute type ='Action'/>
</ElementType>
<ElementType name='ODBCDataSource' content='mixed' model='closed'>
<!-- Element value is an internal identifier to the ODBCDataSource -->
<description> ODBCDataSource for a Component </description>
<attribute type='op'/>
<AttributeType name='Name' dt:type='string' required='yes'/>
<attribute type ='Name'/>
<AttributeType name='DriverName' dt:type='string'/>
<attribute type ='DriverName'/> <!-- required if not found as child of ODBCDriver element -->
<AttributeType name='Registration' dt:type='enumeration' dt:values='machine user' required='yes'/>
<attribute type ='Registration'/>
<AttributeType name='KeyPath' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='KeyPath'/> <!-- set yes to force this file to be key path for parent Component -->
<element type='Property' minOccurs='0' maxOccurs='*'/> <!-- ODBCSourceAttributes -->
</ElementType>
<ElementType name='ODBCDriver' content='mixed' model='closed'>
<!-- Element value is an internal identifier to the ODBCDriver -->
<description> ODBCDriver for a Component </description>
<attribute type='op'/>
<AttributeType name='Name' dt:type='string' required='yes'/>
<attribute type ='Name'/>
<AttributeType name='File' dt:type='string'/>
<attribute type ='File'/> <!-- required if not found as child of File element -->
<AttributeType name='SetupFile' dt:type='string'/>
<attribute type ='SetupFile'/> <!-- required if not found as child of File element or different from File attribute above-->
<element type='ODBCDataSource' minOccurs='0' maxOccurs='*'/>
<element type='Property' minOccurs='0' maxOccurs='*'/> <!-- ODBCAttributes -->
</ElementType>
<ElementType name='ODBCTranslator' content='mixed' model='closed'>
<!-- Element value is an internal identifier to the ODBCTranslator -->
<description> ODBCTranslator for a Component </description>
<attribute type='op'/>
<AttributeType name='Name' dt:type='string' required='yes'/>
<attribute type ='Name'/>
<AttributeType name='File' dt:type='string'/>
<attribute type ='File'/> <!-- required if not found as child of File element -->
<AttributeType name='SetupFile' dt:type='string'/>
<attribute type ='SetupFile'/> <!-- required if not found as child of File element -->
</ElementType>
<ElementType name='FileSearch' content='textOnly' model='closed'>
<!-- Element value is an internal identifier to the Signature or it may be empty and will use parent's value instead -->
<description> Searches for file and assigns to fullpath value of parent Property</description>
<attribute type='op'/>
<AttributeType name='Name' dt:type='string' required='yes'/>
<attribute type ='Name'/>
<AttributeType name='MinSize' dt:type='i4'/>
<attribute type ='MinSize'/>
<AttributeType name='MaxSize' dt:type='i4'/>
<attribute type ='MaxSize'/>
<AttributeType name='MinVersion' dt:type='string'/>
<attribute type ='MinVersion'/>
<AttributeType name='MaxVersion' dt:type='string'/>
<attribute type ='MaxVersion'/>
<AttributeType name='MinDate' dt:type='dateTime'/>
<attribute type ='MinDate'/>
<AttributeType name='MaxDate' dt:type='dateTime'/>
<attribute type ='MaxDate'/>
<AttributeType name='Languages' dt:type='string'/>
<attribute type ='Languages'/>
</ElementType>
<ElementType name='DirectorySearch' content='mixed' model='closed'>
<!-- Element value is an internal identifier to the DrLocator -->
<description> Searches for directory and assigns to value of parent Property</description>
<attribute type='op'/>
<AttributeType name='Path' dt:type='string'/>
<attribute type ='Path'/>
<AttributeType name='Depth' dt:type='int'/>
<attribute type ='Depth'/>
<element type='DirectorySearch'/>
<element type='FileSearch'/>
</ElementType>
<ElementType name='ComponentSearch' content='mixed' model='closed'>
<!-- Element value is an internal identifier to the CompLocator -->
<description> Searches for file or directory and assigns to value of parent Property</description>
<attribute type='op'/>
<AttributeType name='Id' dt:type='uuid'/>
<attribute type ='Id'/>
<AttributeType name='Type' dt:type='enumeration' dt:values='directory file' default='file'/>
<attribute type ='Type'/> <!-- must be file if last child is FileSearch element and must be directory if last child is DirectorySearch element -->
<element type='DirectorySearch'/>
<element type='FileSearch'/>
</ElementType>
<ElementType name='IniFileSearch' content='mixed' model='closed'>
<!-- Element value is an internal identifier to the IniLocator -->
<description> Searches for file, directory or registry key and assigns to value of parent Property</description>
<attribute type='op'/>
<AttributeType name='File' dt:type='string' required='yes'/>
<attribute type ='File'/>
<AttributeType name='Section' dt:type='string' required='yes'/>
<attribute type ='Section'/>
<AttributeType name='Key' dt:type='string' required='yes'/>
<attribute type ='Key'/>
<AttributeType name='Field' dt:type='int'/>
<attribute type ='Field'/>
<AttributeType name='Type' dt:type='enumeration' dt:values='directory file registry' default='file'/>
<attribute type ='Type'/> <!-- must be file if last child is FileSearch element and must be directory if last child is DirectorySearch element -->
<element type='DirectorySearch'/>
<element type='FileSearch'/>
</ElementType>
<ElementType name='RegistrySearch' content='mixed' model='closed'>
<!-- Element value is an internal identifier to the RegLocator -->
<description> Searches for file, directory or registry key and assigns to value of parent Property</description>
<attribute type='op'/>
<AttributeType name='Root' dt:type='enumeration' dt:values='HKCR HKCU HKLM HKU' required='yes'/>
<attribute type ='Root'/>
<AttributeType name='Key' dt:type='string' required='yes'/>
<attribute type ='Key'/>
<AttributeType name='Name' dt:type='string'/>
<attribute type ='Name'/>
<AttributeType name='Type' dt:type='enumeration' dt:values='directory file registry' default='file'/>
<attribute type ='Type'/> <!-- must be file if last child is FileSearch element and must be directory if last child is DirectorySearch element -->
<element type='DirectorySearch'/>
<element type='FileSearch'/>
</ElementType>
<ElementType name='Property' content='mixed' model='closed'>
<!-- Element value is Property name -->
<description> Property value for product</description>
<attribute type='op'/>
<AttributeType name='Value' dt:type='string'/>
<attribute type='Value'/> <!-- not valid when Property is used for search -->
<!-- if Property is determined by an AppSearch -->
<element type ='ComponentSearch' minOccurs='0' maxOccurs='1'/>
<element type ='FileSearch' minOccurs='0' maxOccurs='1'/>
<element type ='DirectorySearch' minOccurs='0' maxOccurs='1'/>
<element type ='IniFileSearch' minOccurs='0' maxOccurs='1'/>
<element type ='RegistrySearch' minOccurs='0' maxOccurs='1'/>
</ElementType>
<ElementType name='Shortcut' content='mixed' model='closed'>
<!-- Element value is an internal identifier for the shortcut -->
<description> Shortcut, default target is parent File, CreateFolder, or Component's Directory </description>
<attribute type='op'/>
<AttributeType name='Directory' dt:type='string' required='yes'/>
<attribute type ='Directory'/><!-- Directory Id where shortcut is to be created -->
<AttributeType name='Name' dt:type='string' required='yes'/>
<attribute type ='Name'/><!-- must be 8.3 format -->
<AttributeType name='LongName' dt:type='string'/>
<attribute type ='LongName'/><!-- required if preferred name not 8.3 format -->
<AttributeType name='Target' dt:type='string'/>
<attribute type ='Target'/><!-- default value taken from parent -->
<AttributeType name='Description' dt:type='string'/>
<attribute type ='Description'/>
<AttributeType name='Arguments' dt:type='string'/>
<attribute type ='Arguments'/>
<AttributeType name='Hotkey' dt:type='int'/>
<attribute type ='Hotkey'/>
<AttributeType name='Icon' dt:type='string'/>
<attribute type ='Icon'/><!-- reference to Icon element -->
<AttributeType name='IconIndex' dt:type='int'/>
<attribute type ='IconIndex'/>
<AttributeType name='Show' dt:type='enumeration' dt:values='normal minimized maximized'/>
<attribute type ='Show'/>
<AttributeType name='WorkingDirectory' dt:type='string'/>
<attribute type ='WorkingDirectory'/>
</ElementType>
<ElementType name='Permission' content='empty' model='closed'>
<!-- No element value, table and key taken from parent element -->
<description> Sets ACLs on File, Registry, or CreateFolder </description>
<attribute type='op'/>
<AttributeType name='Domain' dt:type='string'/>
<attribute type ='Domain'/>
<AttributeType name='User' dt:type='string' required='yes'/>
<attribute type ='User'/>
<!-- Common ACLs -->
<AttributeType name='Read' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='Read'/>
<AttributeType name='Delete' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='Delete'/>
<AttributeType name='ReadPermission' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='ReadPermission'/>
<AttributeType name='ChangePermission' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='ChangePermission'/>
<AttributeType name='TakeOwnership' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='TakeOwnership'/>
<!-- Folder and File ACLs -->
<AttributeType name='ReadAttributes' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='ReadAttributes'/>
<AttributeType name='WriteAttributes' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='WriteAttributes'/>
<AttributeType name='ReadExtendedAttributes' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='ReadExtendedAttributes'/>
<AttributeType name='WritExtendedeAttributes' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='WritExtendedeAttributes'/>
<AttributeType name='Synchronize' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='Synchronize'/>
<!-- Folder only ACLs -->
<AttributeType name='CreateChild' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='CreateChild'/>
<AttributeType name='DeleteChild' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='DeleteChild'/>
<AttributeType name='Traverse' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='Traverse'/>
<!-- File only ACLs -->
<AttributeType name='Append' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='Append'/>
<AttributeType name='Execute' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='Execute'/>
<!-- File and Registry ACLs -->
<AttributeType name='Write' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='Write'/>
<!-- Registry only ACLs -->
<AttributeType name='CreateSubkeys' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='CreateSubkeys'/>
<AttributeType name='EnumerateSubkeys' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='EnumerateSubkeys'/>
<AttributeType name='Notify' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='Notify'/>
<AttributeType name='CreateLink' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='CreateLink'/>
<!-- Generic ACLs, mapped by system to appropriate permissions -->
<AttributeType name='GenericAll' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='GenericAll'/>
<AttributeType name='GenericExecute' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='GenericExecute'/>
<AttributeType name='GenericWrite' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='GenericWrite'/>
<AttributeType name='GenericRead' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='GenericRead'/> <!-- specifying this will fail to grant read access -->
</ElementType>
<ElementType name='CopyFile' content='textOnly' model='closed'>
<!-- Element value is an internal identifier for the MoveFile or DuplicateFile table -->
<description> Causes a file to be duplicated, copied or moved to a new location </description>
<attribute type='op'/>
<AttributeType name='SourceFolder' dt:type='string'/>
<attribute type ='SourceFolder'/> <!-- not allowed when found under a File element -->
<AttributeType name='SourceName' dt:type='string'/>
<attribute type ='SourceName'/> <!-- not allowed when found under a File element -->
<AttributeType name='DestinationFolder' dt:type='string' required='yes'/>
<attribute type ='DestinationFolder'/>
<AttributeType name='DestinationName' dt:type='string' required='no'/>
<attribute type ='DestinationName'/>
<AttributeType name='Delete' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='Delete'/> <!-- not allowed when found under a File element -->
</ElementType>
<ElementType name='Patch' content='empty' model='closed'>
<description> Patch information for parent File element </description>
<attribute type='op'/>
<AttributeType name='Sequence' default='1'/>
<attribute type ='Sequence'/><!-- may be defaulted if not in cabinet if build tools supply sequence -->
<AttributeType name='PatchSize' default='1'/>
<attribute type ='PatchSize'/><!-- may be defaulted if build tools supply actual size -->
<AttributeType name='Header' dt:type='string' required='yes'/>
<attribute type ='Header'/><!-- stream in Binary table -->
<!-- 'Attributes' column integer value generated from XML attributes below -->
<AttributeType name='Vital' dt:type='enumeration' dt:values='no yes' default='yes'/>
<attribute type ='Vital'/>
</ElementType>
<ElementType name='File' content='mixed' model='closed'>
<!-- Element value is File key, 'Component_' value defined by parent node -->
<description> File specification for File table, must be child node of Component </description>
<attribute type='op'/>
<AttributeType name='Name' dt:type='string' required='yes'/>
<attribute type ='Name'/><!-- must be 8.3 format -->
<AttributeType name='LongName' dt:type='string'/>
<attribute type ='LongName'/><!-- required if preferred name not 8.3 format -->
<AttributeType name='FileSize' default='1'/>
<attribute type ='FileSize'/><!-- may be defaulted if build tools supply actual size -->
<AttributeType name='Version' dt:type='string'/>
<attribute type ='Version' /><!-- may be defaulted if build tools supply actual version -->
<AttributeType name='Language' dt:type='string'/>
<attribute type ='Language'/><!-- may be defaulted if build tools supply actual language -->
<AttributeType name='Sequence' default='1'/>
<attribute type ='Sequence'/><!-- may be defaulted if CD or if build tools supply sequence -->
<AttributeType name='KeyPath' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='KeyPath' /><!-- set yes to force this file to be key path for parent component -->
<!-- 'Attributes' column integer value generated from XML attributes below -->
<AttributeType name='ReadOnly' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='ReadOnly'/>
<AttributeType name='Hidden' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='Hidden'/>
<AttributeType name='System' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='System'/>
<AttributeType name='Vital' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='Vital'/>
<AttributeType name='Checksum' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='Checksum'/>
<AttributeType name='PatchAdded' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='PatchAdded'/>
<AttributeType name='Compressed' dt:type='enumeration' dt:values='default no yes' default='default'/>
<attribute type ='Compressed'/>
<AttributeType name='BindPath' dt:type='string'/>
<attribute type ='BindPath'/><!-- generates BindImage table row, value my be empty string -->
<AttributeType name='SelfRegCost' dt:type='int'/>
<attribute type ='SelfRegCost'/><!-- generates SelfReg table row -->
<AttributeType name='TrueType' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='TrueType'/> <!-- generates entries in Font table with no FontTitle -->
<AttributeType name='FontTitle' dt:type='string'/>
<attribute type ='FontTitle'/> <!-- generates entries in Font table with the FontTitle -->
<!-- used only for build time, should probably move into a different schema -->
<AttributeType name='DiskId' dt:type='string'/>
<attribute type ='DiskId'/> <!-- specify media 'diskid' should match to -->
<AttributeType name='src' dt:type='string'/>
<attribute type ='src'/> <!-- specify path to file for build process -->
<!-- child elements specifying additional processing for this file -->
<element type='Permission' minOccurs='0' maxOccurs='*'/>
<element type='Shortcut' minOccurs='0' maxOccurs='*'/><!-- Non-advertised shortcut, Target is preset to this file -->
<element type='CopyFile' minOccurs='0' maxOccurs='1'/><!-- to DuplicateFile table -->
<element type='ODBCDriver' minOccurs='0' maxOccurs='*'/>
<element type='ODBCTranslator' minOccurs='0' maxOccurs='*'/>
<element type='Patch' minOccurs='0' maxOccurs='*'/><!-- to Patch table -->
</ElementType>
<ElementType name='Registry' content='mixed' model='closed'>
<!-- Element value is Registry key, must be child node of Component -->
<description> Registry value for parent Component </description>
<attribute type='op'/>
<AttributeType name='Root' dt:type='enumeration' dt:values='HKMU HKCR HKCU HKLM HKU' required='yes'/>
<attribute type ='Root'/>
<AttributeType name='Key' dt:type='string' required='yes'/>
<attribute type ='Key'/>
<AttributeType name='Name' dt:type='string'/>
<attribute type ='Name'/>
<AttributeType name='Value' dt:type='string'/>
<attribute type ='Value'/>
<AttributeType name='KeyPath' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='KeyPath'/>
<AttributeType name='Action' dt:type='enumeration' dt:values='write remove removeKey' default='write'/>
<attribute type ='Action'/>
<!-- ACL permission -->
<element type ='Permission' minOccurs='0' maxOccurs='*'/>
</ElementType>
<ElementType name='RemoveFile' content='textOnly' model='closed'>
<!-- Element value is unique key of RemoveFile table -->
<description> Files to remove from specied folder if parent Component is installed </description>
<attribute type='op'/>
<AttributeType name='Directory' dt:type='string' required='no'/>
<attribute type='Directory'/><!-- defaults to Directory of parent Component -->
<AttributeType name='Name' dt:type='string' required='no'/>
<attribute type='Name'/><!-- removes folder if not specified -->
<AttributeType name='On' dt:type='enumeration' dt:values='install uninstall both'/>
<attribute type='On'/>
</ElementType>
<ElementType name='CreateFolder' content='eltOnly' model='closed'>
<description> Create folder as part of parent Component </description>
<attribute type='op'/>
<AttributeType name='Directory' dt:type='string' required='no'/>
<attribute type ='Directory'/><!-- defaults to Directory parent of parent Component -->
<!-- Non-advertised shortcut to this folder, Shortcut Target is preset to the folder -->
<element type ='Shortcut' minOccurs='0' maxOccurs='*'/>
<!-- ACL permission -->
<element type ='Permission' minOccurs='0' maxOccurs='*'/>
</ElementType>
<ElementType name='AppData' content='textOnly' model='closed' />
<ElementType name='Category' content='mixed' model='closed'>
<!-- Element value is category Id GUID, must be child node of Component -->
<description> Qualified published component for parent Feature Component </description>
<attribute type='op'/>
<AttributeType name='Qualifier' dt:type='string' required='yes'/>
<attribute type ='Qualifier'/>
<AttributeType name='AppData' dt:type='string'/>
<attribute type ='AppData'/>
<!-- optional way for defining AppData, generally used for complex CDATA -->
<element type ='AppData' minOccurs='0' maxOccurs='1'/>
</ElementType>
<ElementType name='MIME' content='textOnly' model='closed'>
<!-- Element value is content-type -->
<description> MIME content-type for an Extension </description>
<attribute type='op'/>
<AttributeType name='Class' dt:type='uuid'/>
<attribute type ='Class'/>
<AttributeType name='Default' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='Default'/><!-- if 'yes' become the content type for parent Extension -->
</ElementType>
<ElementType name='Verb' content='textOnly' model='closed'>
<!-- Element value is Verb string -->
<description> Verb definition for an Extension </description>
<attribute type='op'/>
<AttributeType name='Command' dt:type='string'/>
<attribute type ='Command'/>
<AttributeType name='Argument' dt:type='string'/>
<attribute type ='Argument'/>
<AttributeType name='Default' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='Default'/>
<!-- used only for non-advertised Verbs -->
<AttributeType name='Target' dt:type='string'/>
<attribute type ='Target'/>
</ElementType>
<ElementType name='Extension' content='mixed' model='closed'>
<!-- Element value is extension name, ProgId taken possible parent ProgId element -->
<description> Extension for Component </description>
<attribute type='op'/>
<AttributeType name='ContentType' dt:type='string'/>
<attribute type ='ContentType'/>
<!-- if MIME and Verbs are associated with Extensions -->
<element type ='MIME' minOccurs='0' maxOccurs='*'/>
<element type ='Verb' minOccurs='0' maxOccurs='*'/>
</ElementType>
<ElementType name='TypeLib' dt:type='uuid' content='textOnly' model='closed'>
<!-- Element value is LibId GUID -->
<description> TypeLib registration for parent Component </description>
<attribute type='op'/>
<AttributeType name='Language' dt:type='int' required='yes'/>
<attribute type ='Language'/>
<AttributeType name='MajorVersion' dt:type='string'/>
<attribute type ='MajorVersion'/>
<AttributeType name='MinorVersion' dt:type='string'/>
<attribute type ='MinorVersion'/>
<AttributeType name='Description' dt:type='string'/>
<attribute type ='Description'/>
<AttributeType name='HelpDirectory' dt:type='string'/>
<attribute type ='HelpDirectory'/>
</ElementType>
<ElementType name='ProgId' content='mixed' model='closed'>
<!-- Element value is ProgId string -->
<!-- If ProgId has an associated Class, it must be a child of that element -->
<description> ProgId registration for parent Component </description>
<attribute type='op'/>
<AttributeType name='Description' dt:type='string'/>
<attribute type ='Description'/>
<AttributeType name='Icon' dt:type='string'/>
<attribute type ='Icon'/><!-- reference to Icon element -->
<AttributeType name='IconIndex' dt:type='int'/>
<attribute type ='IconIndex'/>
<!-- extensions that refer to this ProgId -->
<element type='Extension' minOccurs='0' maxOccurs='*'/>
<!-- Version-independent ProgId must be child element of actual ProgId -->
<element type='ProgId' minOccurs = '0' maxOccurs='1'/>
</ElementType>
<ElementType name='AppId' dt:type='uuid' content='textOnly' model='closed'>
<!-- Element value is AppId string -->
<description> AppId registration, referenced by Class AppId attributes</description>
<attribute type='op'/>
<AttributeType name='RemoteServerName' dt:type='string'/>
<attribute type ='RemoteServerName'/>
<AttributeType name='LocalService' dt:type='string'/>
<attribute type ='LocalService'/>
<AttributeType name='ServiceParameters' dt:type='string'/>
<attribute type ='ServiceParameters'/>
<AttributeType name='DllSurrogate' dt:type='string'/>
<attribute type ='DllSurrogate'/>
<AttributeType name='ActivateAtStorage' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='ActivateAtStorage'/>
<AttributeType name='RunAsInteractiveUser' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='RunAsInteractiveUser'/>
</ElementType>
<ElementType name='Class' content='mixed' model='closed'><!-- type='uuid', but this prohibits child elements -->
<!-- Element value is ClassId GUID -->
<description> COM Class registration for parent Component </description>
<attribute type='op'/>
<AttributeType name='Context' dt:type='enumeration' dt:values='LocalServer LocalServer32 InprocServer InprocServer32' default='InprocServer32'/>
<attribute type ='Context'/>
<AttributeType name='Description' dt:type='string'/>
<attribute type ='Description'/>
<AttributeType name='AppId' dt:type='uuid'/>
<attribute type ='AppId'/>
<AttributeType name='FileTypeMask' dt:type='string'/>
<attribute type ='FileTypeMask'/>
<AttributeType name='Icon' dt:type='string'/>
<attribute type ='Icon'/><!-- reference to Icon element -->
<AttributeType name='IconIndex' dt:type='int'/>
<attribute type ='IconIndex'/>
<AttributeType name='Handler' dt:type='string'/>
<attribute type ='Handler'/>
<AttributeType name='Argument' dt:type='string'/>
<attribute type ='Argument'/>
<AttributeType name='RelativePath' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='RelativePath'/>
<!-- Following attributes are not advertised, but add the appropriate rows to the Registry table -->
<AttributeType name='ThreadingModel' dt:type='enumeration' dt:values='apartment free both single rental'/>
<attribute type ='ThreadingModel'/>
<AttributeType name='Version' dt:type='string'/>
<attribute type ='Version'/>
<AttributeType name='Insertable' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='Insertable'/>
<AttributeType name='Programmable' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='Programmable'/>
<AttributeType name='Server' dt:type='string' /> <!-- only valid when not advertised -->
<attribute type ='Server'/>
<!-- A ProgId associated with Class must be a child element of the Class element -->
<element type='ProgId' minOccurs = '0' maxOccurs='*'/>
<!-- TypeLib registered under class will be registered with the Class as well -->
<element type='TypeLib' minOccurs = '0' maxOccurs='1'/>
</ElementType>
<ElementType name='ServiceDependency' content='textOnly' model='closed'>
<!-- Element value is value to be added to ServiceInstall dependency -->
<description> Service or group of services that are dependencies for services in ServiceInstall </description>
<AttributeType name='Group' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='Group'/>
</ElementType>
<ElementType name='ServiceInstall' content='mixed' model='closed'>
<!-- Element value is an internal identifier for the ServiceInstall table -->
<description> Starts, stops, and removes services for parent Component </description>
<attribute type='op'/>
<AttributeType name='Name' dt:type='string' required='yes'/>
<attribute type ='Name'/>
<AttributeType name='DisplayName' dt:type='string'/>
<attribute type ='DisplayName'/>
<AttributeType name='Type' dt:type='enumeration' dt:values='ownProcess shareProcess kernelDriver systemDriver' required='yes'/>
<attribute type ='Type'/> <!-- Windows installer (v1.2) does not currently support kernelDriver or systemDriver -->
<AttributeType name='Interactive' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='Interactive'/>
<AttributeType name='Start' dt:type='enumeration' dt:values='auto demand disabled boot system' required='yes'/>
<attribute type ='Start'/> <!-- Windows installer (v1.2) does not currently support boot or system -->
<AttributeType name='ErrorControl' dt:type='enumeration' dt:values='ignore normal critical' required='yes'/>
<attribute type ='ErrorControl'/>
<AttributeType name='Vital' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='Vital'/>
<AttributeType name='LocalGroup' dt:type='string'/>
<attribute type ='LocalGroup'/>
<AttributeType name='Account' dt:type='string'/>
<attribute type ='Account'/> <!-- valid only when ServiceType is ownProcess -->
<AttributeType name='Password' dt:type='string'/>
<attribute type ='Password'/> <!-- valid only when Account has password -->
<AttributeType name='Arguments' dt:type='string'/>
<attribute type ='Arguments'/>
<!-- not available for Windows Install v1.0 -->
<AttributeType name='Description' dt:type='string'/>
<attribute type ='Description'/>
<AttributeType name='EraseDescription' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='EraseDescription'/> <!-- yes will cause Description attribute to be ignored-->
<!-- ordered list of dependencies when installing services -->
<element type='ServiceDependency' minOccurs='0' maxOccurs='*'/>
</ElementType>
<ElementType name='ServiceArgument' content='textOnly' model='closed'>
<!-- Element value is value to be added to ServiceControl -->
<description> Argument used in ServiceControl parent </description>
</ElementType>
<ElementType name='ServiceControl' content='mixed' model='closed'>
<!-- Element value is an internal identifier for the ServiceControl table -->
<description> Starts, stops, and removes services for parent Component </description>
<attribute type='op'/>
<AttributeType name='Name' dt:type='string' required='yes'/>
<attribute type ='Name'/>
<AttributeType name='Start' dt:type='enumeration' dt:values='install uninstall both'/>
<attribute type ='Start'/>
<AttributeType name='Stop' dt:type='enumeration' dt:values='install uninstall both'/>
<attribute type ='Stop'/>
<AttributeType name='Remove' dt:type='enumeration' dt:values='install uninstall both'/>
<attribute type ='Remove'/>
<AttributeType name='Wait' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='Wait'/>
<!-- ordered list of arguments when modifying services -->
<element type='ServiceArgument' minOccurs='0' maxOccurs='*'/>
</ElementType>
<ElementType name='Environment' content='textOnly' model='closed'>
<!-- Element value is an internal identifier for the Environment table -->
<description> Environment variables added or removed for parent Component </description>
<attribute type='op'/>
<AttributeType name='Name' dt:type='string' required='yes'/>
<attribute type ='Name'/>
<AttributeType name='Value' dt:type='string'/>
<attribute type ='Value'/>
<AttributeType name='Action' dt:type='enumeration' dt:values='create set remove' required='yes'/>
<attribute type ='Action'/>
<AttributeType name='Part' dt:type='enumeration' dt:values='all first last' default='all'/>
<attribute type ='Part'/>
<AttributeType name='Permanent' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='Permanent'/>
<AttributeType name='System' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='System'/>
</ElementType>
<ElementType name='Condition' content='textOnly' model='closed'>
<!-- Element value is Condition expression, may need to use CDATA or else escape delimiters -->
<attribute type='op'/>
<AttributeType name='Level' dt:type='string'/>
<attribute type ='Level'/> <!-- used only for Features -->
<AttributeType name='Action' dt:type='enumeration' dt:values='default enable disable hide show'/>
<attribute type='Action'/> <!-- used only for Controls and required -->
<AttributeType name='Message' dt:type='string'/>
<attribute type='Message'/> <!-- used only at top level, for LaunchCondition table -->
</ElementType>
<ElementType name='IsolateComponent' content='textOnly' model='closed'>
<!-- Element value is Component to be isolated and bound to EXE of parent Component -->
<description> Shared Component to be privately replicated in folder of parent Component </description>
<attribute type='op'/>
</ElementType>
<ElementType name='ReserveCost' content='textOnly' model='closed'>
<!-- Element value is unique key of ReserveCost table -->
<description> Disk cost to reserve in a folder for running locally and/or from source </description>
<attribute type='op'/>
<AttributeType name='Directory' dt:type='string' required='no'/>
<attribute type='Directory'/><!-- defaults to Directory of parent Component -->
<AttributeType name='RunLocal' dt:type='int' required='no'/>
<attribute type='RunLocal'/>
<AttributeType name='RunFromSource' dt:type='int' required='no'/>
<attribute type='RunFromSource'/>
</ElementType>
<ElementType name='Component' content='mixed' model='closed' order='many'>
<elementvalue> Component table primary key </elementvalue>
<description> Component for parent Directory </description>
<attribute type='op'/>
<AttributeType name='Id' dt:type='uuid'/>
<attribute type ='Id'/>
<!-- 'Attributes' column integer value generated from XML attributes below -->
<AttributeType name='Location' dt:type='enumeration' dt:values='local source either' default='local'/>
<attribute type ='Location'/> <!-- ignored when Component is child of Feature -->
<AttributeType name='SharedDllRefCount' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='SharedDllRefCount'/>
<AttributeType name='Permanent' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='Permanent'/>
<AttributeType name='Transitive' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='Transitive'/>
<AttributeType name='NeverOverwrite' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='NeverOverwrite'/>
<AttributeType name='KeyPath' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='KeyPath'/> <!-- use parent Directory as KeyPath -->
<AttributeType name='ComPlusFlags' dt:type='int'/>
<attribute type ='ComPlusFlags'/>
<!-- Condition attribute as element to allow delimiters and for consistency -->
<element type='Condition' minOccurs='0' maxOccurs='1'/>
<!-- Non-advertised component resources, appear in Directory tree -->
<element type='File' minOccurs='0' maxOccurs='*'/>
<element type='RemoveFile' minOccurs='0' maxOccurs='*'/>
<element type='Registry' minOccurs='0' maxOccurs='*'/>
<element type='TypeLib' minOccurs='0' maxOccurs='1'/>
<element type='CreateFolder' minOccurs='0' maxOccurs='*'/>
<element type='IniFile' minOccurs='0' maxOccurs='*'/>
<element type='CopyFile' minOccurs='0' maxOccurs='*'/>
<element type='Environment' minOccurs='0' maxOccurs='*'/>
<element type='IsolateComponent' minOccurs='0' maxOccurs='*'/>
<element type='ServiceControl' minOccurs='0' maxOccurs='*'/>
<element type='ServiceInstall' minOccurs='0' maxOccurs='*'/>
<element type='ODBCDriver' minOccurs='0' maxOccurs='*'/>
<element type='ODBCTranslator' minOccurs='0' maxOccurs='*'/>
<element type='ODBCDataSource' minOccurs='0' maxOccurs='*'/>
<element type='ReserveCost' minOccurs='0' maxOccurs='*'/>
<!-- Advertised component resources, appear in Feature tree -->
<element type='Category' minOccurs='0' maxOccurs='*'/>
<element type='Extension' minOccurs='0' maxOccurs='*'/>
<element type='ProgId' minOccurs='0' maxOccurs='*'/>
<!-- Advertised if component withing Feature tree, non-advertised if in Directory tree -->
<element type='Class' minOccurs='0' maxOccurs='*'/>
<element type='Shortcut' minOccurs='0' maxOccurs='*'/><!-- Target preset to component's parent -->
<!-- used only for build time, should probably move into a different schema -->
<AttributeType name='DiskId' dt:type='string'/>
<attribute type ='DiskId'/> <!-- specify media 'diskid' should match to -->
</ElementType>
<ElementType name='Module' content='mixed' model='closed' order='many'>
<!-- Element value is used to link Module definitions together -->
<description> Module to be redirected to parent directory </description>
<attribute type='op'/>
<!-- valid only under a Directory element -->
<AttributeType name='Language' dt:type='int'/>
<attribute type='Language'/>
<AttributeType name='src' dt:type='string'/>
<attribute type='src'/>
<!-- valid only under a Feature element -->
<AttributeType name='Primary' dt:type='enumeration' dt:values='no yes'/>
<attribute type='Primary'/>
<!-- used only for build time, should probably move into a different schema -->
<AttributeType name='DiskId' dt:type='string'/>
<attribute type ='DiskId'/> <!-- specify media 'diskid' should match to -->
</ElementType>
<ElementType name='Directory' content='mixed' model='closed'>
<!-- Element value is Directory key, must be child node of Directory -->
<description> Folder for Directory table, must be child node of Directory or Product </description>
<attribute type='op'/>
<AttributeType name='Name' dt:type='string'/>
<attribute type ='Name'/> <!-- may be empty string if same folder as parent, or if op='exist' -->
<AttributeType name='LongName' dt:type='string'/>
<attribute type ='LongName'/> <!-- used if non 8.3 name preferred on systems supporting long names -->
<AttributeType name='SourceName' dt:type='string'/>
<attribute type ='SourceName'/> <!-- used only if directory on source is named differently -->
<AttributeType name='LongSource' dt:type='string'/>
<attribute type ='LongSource'/> <!-- used only if non 8.3 name needed on source -->
<element type='Directory' minOccurs = '0' maxOccurs='*'/>
<element type='Component' minOccurs = '0' maxOccurs='*'/>
<element type='Module' minOccurs = '0' maxOccurs='*'/>
</ElementType>
<ElementType name='UpgradeVersion' content='textOnly' model='closed'>
<attribute type='op'/><!-- default inherited from parent Upgrade element -->
<AttributeType name='Minimum' dt:type='string' required='no'/>
<attribute type='Minimum'/>
<AttributeType name='Maximum' dt:type='string' required='no'/>
<attribute type='Maximum'/>
<AttributeType name='Language' dt:type='string' required='no'/>
<attribute type='Language'/>
<AttributeType name='RemoveFeatures' dt:type='string' required='no'/>
<attribute type='RemoveFeatures'/>
<AttributeType name='Property' dt:type='string' required='no'/>
<attribute type='Property'/>
<AttributeType name='MigrateFeatures' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='MigrateFeatures'/>
<AttributeType name='OnlyDetect' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='OnlyDetect'/>
<AttributeType name='IgnoreRemoveFailure' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='IgnoreRemoveFailure'/>
<AttributeType name='IncludeMinimum' dt:type='enumeration' dt:values='no yes' default='yes'/>
<attribute type ='IncludeMinimum'/>
<AttributeType name='IncludeMaximum' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='IncludeMaximum'/>
<AttributeType name='ExcludeLanguages' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='ExcludeLanguages'/>
</ElementType>
<ElementType name='Upgrade' content='mixed' model='closed'>
<!-- Element value is the UpgradeCode to be detected -->
<description> Upgrade info for a particular UpgradeCode </description>
<attribute type='op'/><!-- used only to supply default op for child elements -->
<element type='UpgradeVersion' minOccurs='0' maxOccurs='*'/>
</ElementType>
<ElementType name='Feature' content='mixed' model='closed'>
<!-- Element value is Feature key, must be child node of Feature -->
<description> Feature for Feature table, must be child node of Feature or Product </description>
<attribute type='op'/>
<AttributeType name='Title' dt:type='string'/>
<attribute type ='Title'/>
<AttributeType name='Description' dt:type='string'/>
<attribute type ='Description'/>
<AttributeType name='Display' dt:type='enumeration' dt:values='hidden expand collapse' default='collapse'/>
<attribute type ='Display'/>
<AttributeType name='Level' dt:type='int'/>
<attribute type ='Level'/><!-- required for new or replaced feature -->
<AttributeType name='ConfigurableDirectory' dt:type='string'/>
<attribute type ='ConfigurableDirectory'/>
<!-- 'Attributes' column integer value generated from XML attributes below -->
<AttributeType name='InstallDefault' dt:type='enumeration' dt:values='local source' default='local'/>
<attribute type ='InstallDefault'/>
<AttributeType name='TypicalDefault' dt:type='enumeration' dt:values='install advertise' default='install'/>
<attribute type ='TypicalDefault'/>
<AttributeType name='FollowParent' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='FollowParent'/>
<AttributeType name='Absent' dt:type='enumeration' dt:values='allow disallow' default='allow'/>
<attribute type ='Absent'/>
<AttributeType name='AllowAdvertise' dt:type='enumeration' dt:values='no system yes' default='yes'/>
<attribute type ='AllowAdvertise'/>
<!-- Feature table hierarchy expressed by nesting Feature elements -->
<element type='Condition' minOccurs='0' maxOccurs='*'/>
<element type='Feature' minOccurs='0' maxOccurs='*'/>
<element type='Component' minOccurs='0' maxOccurs='*'/>
<element type='Module' minOccurs='0' maxOccurs='*'/>
</ElementType>
<ElementType name='PatchPackage' dt:type='uuid' content='textOnly' model='closed'>
<!-- Element value is PatchId GUID -->
<description> PatchPackage found on parent Media element </description>
<attribute type='op'/>
</ElementType>
<ElementType name='Media' content='eltOnly' model='closed'>
<description> Media specification </description>
<attribute type='op'/>
<AttributeType name='DiskId' dt:type='int'/>
<attribute type='DiskId'/>
<AttributeType name='LastSequence' dt:type='int'/>
<attribute type='LastSequence'/>
<AttributeType name='DiskPrompt' dt:type='string'/>
<attribute type='DiskPrompt'/>
<AttributeType name='Cabinet' dt:type='string'/>
<attribute type='Cabinet'/>
<AttributeType name='EmbedCab' dt:type='enumeration' dt:values='no yes'/>
<attribute type='EmbedCab'/>
<AttributeType name='VolumeLabel' dt:type='string'/>
<attribute type='VolumeLabel'/>
<AttributeType name='Source' dt:type='string'/>
<attribute type='Source'/>
<element type='PatchPackage' minOccurs='0' maxOccurs='*'/>
<element type='Directory' minOccurs='0' maxOccurs='1'/>
</ElementType>
<ElementType name='CustomAction' content='textOnly' model='closed'>
<!-- Element value is CustomAction key, as used in sequence tables -->
<description> Custom action specification </description>
<attribute type='op'/>
<!-- CustomAction Source specification, sets source Attribute bits -->
<AttributeType name='BinaryKey' dt:type='string'/>
<attribute type='BinaryKey'/><!-- stream in Binary table -->
<AttributeType name='FileKey' dt:type='string'/>
<attribute type='FileKey'/>
<AttributeType name='Property' dt:type='string'/>
<attribute type='Property'/>
<AttributeType name='Directory' dt:type='string'/>
<attribute type='Directory'/>
<!-- CustomAction Target specification, sets target Attribute bits -->
<AttributeType name='DllEntry' dt:type='string'/>
<attribute type='DllEntry'/>
<AttributeType name='ExeCommand' dt:type='string'/>
<attribute type='ExeCommand'/>
<AttributeType name='JScriptCall' dt:type='string'/>
<attribute type='JScriptCall'/>
<AttributeType name='VBScriptCall' dt:type='string'/>
<attribute type='VBScriptCall'/>
<AttributeType name='Value' dt:type='string'/>
<attribute type='Value'/>
<AttributeType name='InstallProperties' dt:type='string'/>
<attribute type='InstallProperties'/>
<!-- Other CustomAction type attributes -->
<AttributeType name='Return' dt:type='enumeration' dt:values='check ignore asyncWait asyncNoWait' default='check'/>
<attribute type='Return'/>
<AttributeType name='Execute' dt:type='enumeration' dt:values='immediate deferred rollback commit oncePerProcess firstSequence secondSequence' default='immediate'/>
<attribute type='Execute'/>
<AttributeType name='Impersonate' dt:type='enumeration' dt:values='no yes' default='yes'/>
<attribute type='Impersonate'/>
</ElementType>
<!-- - - - - - - - - - - Sequence Table Definitions - - - - - - - - - - - - - - -->
<!-- optional Condition expression is element text to allow use of CDATA section to escape delimiters -->
<AttributeType name='Sequence' dt:type='int'/>
<ElementType name='ScheduleReboot' content='textOnly'><attribute type='Sequence' /><attribute type='op'/></ElementType>
<ElementType name='ForceReboot' content='textOnly'><attribute type='Sequence' /><attribute type='op'/></ElementType>
<ElementType name='LaunchConditions' content='textOnly'><attribute type='Sequence' default= '100'/><attribute type='op'/></ElementType>
<ElementType name='FindRelatedProducts' content='textOnly'><attribute type='Sequence' default= '200'/><attribute type='op'/></ElementType>
<ElementType name='AppSearch' content='textOnly'><attribute type='Sequence' default= '400'/><attribute type='op'/></ElementType>
<ElementType name='CCPSearch' content='textOnly'><attribute type='Sequence' default= '500'/><attribute type='op'/></ElementType>
<ElementType name='RMCCPSearch' content='textOnly'><attribute type='Sequence' default= '600'/><attribute type='op'/></ElementType>
<ElementType name='ValidateProductID' content='textOnly'><attribute type='Sequence' default= '700'/><attribute type='op'/></ElementType>
<ElementType name='CostInitialize' content='textOnly'><attribute type='Sequence' default= '800'/><attribute type='op'/></ElementType>
<ElementType name='FileCost' content='textOnly'><attribute type='Sequence' default= '900'/><attribute type='op'/></ElementType>
<ElementType name='IsolateComponents' content='textOnly'><attribute type='Sequence' default= '950'/><attribute type='op'/></ElementType>
<ElementType name='CostFinalize' content='textOnly'><attribute type='Sequence' default='1000'/><attribute type='op'/></ElementType>
<ElementType name='SetODBCFolders' content='textOnly'><attribute type='Sequence' default='1100'/><attribute type='op'/></ElementType>
<ElementType name='MigrateFeatureStates' content='textOnly'><attribute type='Sequence' default='1200'/><attribute type='op'/></ElementType>
<ElementType name='ExecuteAction' content='textOnly'><attribute type='Sequence' default='1300'/><attribute type='op'/></ElementType>
<ElementType name='InstallValidate' content='textOnly'><attribute type='Sequence' default='1400'/><attribute type='op'/></ElementType>
<ElementType name='InstallInitialize' content='textOnly'><attribute type='Sequence' default='1500'/><attribute type='op'/></ElementType>
<ElementType name='AllocateRegistrySpace' content='textOnly'><attribute type='Sequence' default='1550'/><attribute type='op'/></ElementType>
<ElementType name='ProcessComponents' content='textOnly'><attribute type='Sequence' default='1600'/><attribute type='op'/></ElementType>
<ElementType name='UnpublishComponents' content='textOnly'><attribute type='Sequence' default='1700'/><attribute type='op'/></ElementType>
<ElementType name='UnpublishFeatures' content='textOnly'><attribute type='Sequence' default='1800'/><attribute type='op'/></ElementType>
<ElementType name='StopServices' content='textOnly'><attribute type='Sequence' default='1900'/><attribute type='op'/></ElementType>
<ElementType name='DeleteServices' content='textOnly'><attribute type='Sequence' default='2000'/><attribute type='op'/></ElementType>
<ElementType name='UnregisterComPlus' content='textOnly'><attribute type='Sequence' default='2100'/><attribute type='op'/></ElementType>
<ElementType name='SelfUnregModules' content='textOnly'><attribute type='Sequence' default='2200'/><attribute type='op'/></ElementType>
<ElementType name='UnregisterTypeLibraries' content='textOnly'><attribute type='Sequence' default='2300'/><attribute type='op'/></ElementType>
<ElementType name='RemoveODBC' content='textOnly'><attribute type='Sequence' default='2400'/><attribute type='op'/></ElementType>
<ElementType name='UnregisterFonts' content='textOnly'><attribute type='Sequence' default='2500'/><attribute type='op'/></ElementType>
<ElementType name='RemoveRegistryValues' content='textOnly'><attribute type='Sequence' default='2600'/><attribute type='op'/></ElementType>
<ElementType name='UnregisterClassInfo' content='textOnly'><attribute type='Sequence' default='2700'/><attribute type='op'/></ElementType>
<ElementType name='UnregisterExtensionInfo' content='textOnly'><attribute type='Sequence' default='2800'/><attribute type='op'/></ElementType>
<ElementType name='UnregisterProgIdInfo' content='textOnly'><attribute type='Sequence' default='2900'/><attribute type='op'/></ElementType>
<ElementType name='UnregisterMIMEInfo' content='textOnly'><attribute type='Sequence' default='3000'/><attribute type='op'/></ElementType>
<ElementType name='RemoveIniValues' content='textOnly'><attribute type='Sequence' default='3100'/><attribute type='op'/></ElementType>
<ElementType name='RemoveShortcuts' content='textOnly'><attribute type='Sequence' default='3200'/><attribute type='op'/></ElementType>
<ElementType name='RemoveEnvironmentStrings' content='textOnly'><attribute type='Sequence' default='3300'/><attribute type='op'/></ElementType>
<ElementType name='RemoveDuplicateFiles' content='textOnly'><attribute type='Sequence' default='3400'/><attribute type='op'/></ElementType>
<ElementType name='RemoveFiles' content='textOnly'><attribute type='Sequence' default='3500'/><attribute type='op'/></ElementType>
<ElementType name='RemoveFolders' content='textOnly'><attribute type='Sequence' default='3600'/><attribute type='op'/></ElementType>
<ElementType name='CreateFolders' content='textOnly'><attribute type='Sequence' default='3700'/><attribute type='op'/></ElementType>
<ElementType name='MoveFiles' content='textOnly'><attribute type='Sequence' default='3800'/><attribute type='op'/></ElementType>
<ElementType name='InstallAdminPackage' content='textOnly'><attribute type='Sequence' default='3900'/><attribute type='op'/></ElementType>
<ElementType name='InstallFiles' content='textOnly'><attribute type='Sequence' default='4000'/><attribute type='op'/></ElementType>
<ElementType name='DuplicateFiles' content='textOnly'><attribute type='Sequence' default='4100'/><attribute type='op'/></ElementType>
<ElementType name='PatchFiles' content='textOnly'><attribute type='Sequence' default='4200'/><attribute type='op'/></ElementType>
<ElementType name='BindImage' content='textOnly'><attribute type='Sequence' default='4300'/><attribute type='op'/></ElementType>
<ElementType name='CreateShortcuts' content='textOnly'><attribute type='Sequence' default='4500'/><attribute type='op'/></ElementType>
<ElementType name='RegisterClassInfo' content='textOnly'><attribute type='Sequence' default='4600'/><attribute type='op'/></ElementType>
<ElementType name='RegisterExtensionInfo' content='textOnly'><attribute type='Sequence' default='4700'/><attribute type='op'/></ElementType>
<ElementType name='RegisterProgIdInfo' content='textOnly'><attribute type='Sequence' default='4800'/><attribute type='op'/></ElementType>
<ElementType name='RegisterMIMEInfo' content='textOnly'><attribute type='Sequence' default='4900'/><attribute type='op'/></ElementType>
<ElementType name='WriteRegistryValues' content='textOnly'><attribute type='Sequence' default='5000'/><attribute type='op'/></ElementType>
<ElementType name='WriteIniValues' content='textOnly'><attribute type='Sequence' default='5100'/><attribute type='op'/></ElementType>
<ElementType name='WriteEnvironmentStrings' content='textOnly'><attribute type='Sequence' default='5200'/><attribute type='op'/></ElementType>
<ElementType name='RegisterFonts' content='textOnly'><attribute type='Sequence' default='5300'/><attribute type='op'/></ElementType>
<ElementType name='InstallODBC' content='textOnly'><attribute type='Sequence' default='5400'/><attribute type='op'/></ElementType>
<ElementType name='RegisterTypeLibraries' content='textOnly'><attribute type='Sequence' default='5500'/><attribute type='op'/></ElementType>
<ElementType name='SelfRegModules' content='textOnly'><attribute type='Sequence' default='5600'/><attribute type='op'/></ElementType>
<ElementType name='RegisterComPlus' content='textOnly'><attribute type='Sequence' default='5700'/><attribute type='op'/></ElementType>
<ElementType name='InstallServices' content='textOnly'><attribute type='Sequence' default='5800'/><attribute type='op'/></ElementType>
<ElementType name='StartServices' content='textOnly'><attribute type='Sequence' default='5900'/><attribute type='op'/></ElementType>
<ElementType name='RegisterUser' content='textOnly'><attribute type='Sequence' default='6000'/><attribute type='op'/></ElementType>
<ElementType name='RegisterProduct' content='textOnly'><attribute type='Sequence' default='6100'/><attribute type='op'/></ElementType>
<ElementType name='PublishComponents' content='textOnly'><attribute type='Sequence' default='6200'/><attribute type='op'/></ElementType>
<ElementType name='PublishFeatures' content='textOnly'><attribute type='Sequence' default='6300'/><attribute type='op'/></ElementType>
<ElementType name='PublishProduct' content='textOnly'><attribute type='Sequence' default='6400'/><attribute type='op'/></ElementType>
<ElementType name='InstallFinalize' content='textOnly'><attribute type='Sequence' default='6600'/><attribute type='op'/></ElementType>
<ElementType name='RemoveExistingProducts' content='textOnly'><attribute type='Sequence' default='6700'/><attribute type='op'/></ElementType>
<ElementType name='Custom' content='textOnly'><attribute type='Sequence' required= 'no'/><attribute type='op'/>
<AttributeType name='Action' required='yes'/><attribute type='Action'/>
</ElementType>
<ElementType name='Show' content='textOnly'><attribute type='Sequence' required= 'no'/><attribute type='op'/>
<AttributeType name='OnExit' dt:type='enumeration' dt:values='success cancel error suspend'/><attribute type='OnExit'/> <!-- mutually exclusive with Sequence attribute -->
<AttributeType name='Dialog' dt:type='string' required='yes'/><attribute type='Dialog'/>
</ElementType>
<!-- standard sequence table compositions -->
<ElementType name='InstallUISequence' model='closed'>
<element type='Custom' minOccurs='0' maxOccurs='*'/>
<element type='Show' minOccurs='0' maxOccurs='*'/>
<element type='ScheduleReboot' minOccurs='0' maxOccurs='1'/><!-- not fixed sequence -->
<element type='LaunchConditions' minOccurs='0' maxOccurs='1'/>
<element type='FindRelatedProducts' minOccurs='0' maxOccurs='1'/>
<element type='AppSearch' minOccurs='0' maxOccurs='1'/>
<element type='CCPSearch' minOccurs='0' maxOccurs='1'/>
<element type='RMCCPSearch' minOccurs='0' maxOccurs='1'/>
<element type='ValidateProductID' minOccurs='1' maxOccurs='1'/>
<element type='CostInitialize' minOccurs='1' maxOccurs='1'/>
<element type='FileCost' minOccurs='1' maxOccurs='1'/>
<element type='IsolateComponents' minOccurs='1' maxOccurs='1'/>
<element type='CostFinalize' minOccurs='1' maxOccurs='1'/>
<element type='MigrateFeatureStates' minOccurs='1' maxOccurs='1'/>
<element type='ExecuteAction' minOccurs='0' maxOccurs='1'/>
</ElementType>
<ElementType name='InstallExecuteSequence' model='closed'>
<attribute type='op'/><!-- used only to supply default op for child action elements -->
<element type='Custom' minOccurs='0' maxOccurs='*'/>
<element type='ScheduleReboot' minOccurs='0' maxOccurs='1'/><!-- not fixed sequence -->
<element type='ForceReboot' minOccurs='0' maxOccurs='1'/><!-- not fixed sequence -->
<element type='LaunchConditions' minOccurs='0' maxOccurs='1'/>
<element type='FindRelatedProducts' minOccurs='0' maxOccurs='1'/>
<element type='AppSearch' minOccurs='0' maxOccurs='1'/>
<element type='CCPSearch' minOccurs='1' maxOccurs='1'/>
<element type='RMCCPSearch' minOccurs='1' maxOccurs='1'/>
<element type='ValidateProductID' minOccurs='1' maxOccurs='1'/>
<element type='CostInitialize' minOccurs='1' maxOccurs='1'/>
<element type='FileCost' minOccurs='1' maxOccurs='1'/>
<element type='IsolateComponents' minOccurs='1' maxOccurs='1'/>
<element type='CostFinalize' minOccurs='1' maxOccurs='1'/>
<element type='SetODBCFolders' minOccurs='1' maxOccurs='1'/>
<element type='MigrateFeatureStates' minOccurs='1' maxOccurs='1'/>
<element type='InstallValidate' minOccurs='1' maxOccurs='1'/>
<element type='InstallInitialize' minOccurs='1' maxOccurs='1'/>
<element type='AllocateRegistrySpace' minOccurs='0' maxOccurs='1'/>
<element type='ProcessComponents' minOccurs='1' maxOccurs='1'/>
<element type='UnpublishComponents' minOccurs='0' maxOccurs='1'/>
<element type='UnpublishFeatures' minOccurs='0' maxOccurs='1'/>
<element type='StopServices' minOccurs='1' maxOccurs='1'/>
<element type='DeleteServices' minOccurs='1' maxOccurs='1'/>
<element type='UnregisterComPlus' minOccurs='1' maxOccurs='1'/>
<element type='SelfUnregModules' minOccurs='0' maxOccurs='1'/>
<element type='UnregisterTypeLibraries' minOccurs='0' maxOccurs='1'/>
<element type='RemoveODBC' minOccurs='1' maxOccurs='1'/>
<element type='UnregisterFonts' minOccurs='1' maxOccurs='1'/>
<element type='RemoveRegistryValues' minOccurs='0' maxOccurs='1'/>
<element type='UnregisterClassInfo' minOccurs='0' maxOccurs='1'/>
<element type='UnregisterExtensionInfo' minOccurs='1' maxOccurs='1'/>
<element type='UnregisterProgIdInfo' minOccurs='0' maxOccurs='1'/>
<element type='UnregisterMIMEInfo' minOccurs='1' maxOccurs='1'/>
<element type='RemoveIniValues' minOccurs='1' maxOccurs='1'/>
<element type='RemoveShortcuts' minOccurs='0' maxOccurs='1'/>
<element type='RemoveEnvironmentStrings' minOccurs='1' maxOccurs='1'/>
<element type='RemoveDuplicateFiles' minOccurs='1' maxOccurs='1'/>
<element type='RemoveFiles' minOccurs='0' maxOccurs='1'/>
<element type='RemoveFolders' minOccurs='0' maxOccurs='1'/>
<element type='CreateFolders' minOccurs='0' maxOccurs='1'/>
<element type='MoveFiles' minOccurs='1' maxOccurs='1'/>
<element type='InstallFiles' minOccurs='0' maxOccurs='1'/>
<element type='DuplicateFiles' minOccurs='1' maxOccurs='1'/>
<element type='PatchFiles' minOccurs='1' maxOccurs='1'/>
<element type='BindImage' minOccurs='0' maxOccurs='1'/>
<element type='CreateShortcuts' minOccurs='0' maxOccurs='1'/>
<element type='RegisterClassInfo' minOccurs='0' maxOccurs='1'/>
<element type='RegisterExtensionInfo' minOccurs='1' maxOccurs='1'/>
<element type='RegisterProgIdInfo' minOccurs='0' maxOccurs='1'/>
<element type='RegisterMIMEInfo' minOccurs='1' maxOccurs='1'/>
<element type='WriteRegistryValues' minOccurs='0' maxOccurs='1'/>
<element type='WriteIniValues' minOccurs='1' maxOccurs='1'/>
<element type='WriteEnvironmentStrings' minOccurs='1' maxOccurs='1'/>
<element type='RegisterFonts' minOccurs='1' maxOccurs='1'/>
<element type='InstallODBC' minOccurs='1' maxOccurs='1'/>
<element type='RegisterTypeLibraries' minOccurs='0' maxOccurs='1'/>
<element type='SelfRegModules' minOccurs='0' maxOccurs='1'/>
<element type='RegisterComPlus' minOccurs='1' maxOccurs='1'/>
<element type='InstallServices' minOccurs='1' maxOccurs='1'/>
<element type='StartServices' minOccurs='1' maxOccurs='1'/>
<element type='RegisterUser' minOccurs='0' maxOccurs='1'/>
<element type='RegisterProduct' minOccurs='0' maxOccurs='1'/>
<element type='PublishComponents' minOccurs='0' maxOccurs='1'/>
<element type='PublishFeatures' minOccurs='0' maxOccurs='1'/>
<element type='PublishProduct' minOccurs='0' maxOccurs='1'/>
<element type='InstallFinalize' minOccurs='1' maxOccurs='1'/>
<element type='RemoveExistingProducts' minOccurs='1' maxOccurs='1'/>
</ElementType>
<ElementType name='AdminUISequence' model='closed'>
<element type='Custom' minOccurs='0' maxOccurs='*'/>
<element type='Show' minOccurs='0' maxOccurs='*'/>
<element type='CostInitialize' minOccurs='1' maxOccurs='1'/>
<element type='FileCost' minOccurs='1' maxOccurs='1'/>
<element type='CostFinalize' minOccurs='1' maxOccurs='1'/>
<element type='ExecuteAction' minOccurs='1' maxOccurs='1'/>
<element type='InstallValidate' minOccurs='1' maxOccurs='1'/>
<element type='InstallInitialize' minOccurs='1' maxOccurs='1'/>
<element type='InstallAdminPackage' minOccurs='1' maxOccurs='1'/>
<element type='InstallFiles' minOccurs='1' maxOccurs='1'/>
<element type='InstallFinalize' minOccurs='1' maxOccurs='1'/>
</ElementType>
<ElementType name='AdminExecuteSequence' model='closed'>
<element type='Custom' minOccurs='0' maxOccurs='*'/>
<element type='CostInitialize' minOccurs='1' maxOccurs='1'/>
<element type='FileCost' minOccurs='1' maxOccurs='1'/>
<element type='CostFinalize' minOccurs='1' maxOccurs='1'/>
<element type='InstallValidate' minOccurs='1' maxOccurs='1'/>
<element type='InstallInitialize' minOccurs='1' maxOccurs='1'/>
<element type='InstallAdminPackage' minOccurs='1' maxOccurs='1'/>
<element type='InstallFiles' minOccurs='1' maxOccurs='1'/>
<element type='InstallFinalize' minOccurs='1' maxOccurs='1'/>
</ElementType>
<ElementType name='AdvtExecuteSequence' model='closed'>
<element type='Custom' minOccurs='0' maxOccurs='*'/>
<element type='CostInitialize' minOccurs='1' maxOccurs='1'/>
<element type='FileCost' minOccurs='1' maxOccurs='1'/>
<element type='CostFinalize' minOccurs='1' maxOccurs='1'/>
<element type='InstallValidate' minOccurs='1' maxOccurs='1'/>
<element type='InstallInitialize' minOccurs='1' maxOccurs='1'/>
<element type='CreateShortcuts' minOccurs='1' maxOccurs='1'/>
<element type='RegisterClassInfo' minOccurs='1' maxOccurs='1'/>
<element type='RegisterExtensionInfo' minOccurs='1' maxOccurs='1'/>
<element type='RegisterMIMEInfo' minOccurs='1' maxOccurs='1'/>
<element type='RegisterProgIdInfo' minOccurs='1' maxOccurs='1'/>
<element type='PublishComponents' minOccurs='1' maxOccurs='1'/>
<element type='PublishFeatures' minOccurs='1' maxOccurs='1'/>
<element type='PublishProduct' minOccurs='1' maxOccurs='1'/>
<element type='InstallFinalize' minOccurs='1' maxOccurs='1'/>
</ElementType>
<!-- - - - - - - - - - - Binary tables - - - - - - - - - - - - - -->
<ElementType name='Binary' content='textOnly' model='closed'>
<!-- Element value is binary data encoded in bin.base64 -->
<description> binary data used for CustomAction elements and UI controls </description>
<attribute type='op'/>
<AttributeType name='Name' dt:type='string' required='yes'/>
<attribute type='Name'/>
<AttributeType name='src' dt:type='string'/>
<attribute type='src'/>
</ElementType>
<ElementType name='Icon' content='textOnly' model='closed'>
<!-- Element value is binary data encoded in bin.base64 -->
<description> binary icon data used for Shortcut, ProgId, Class elements, not by UI controls </description>
<attribute type='op'/>
<AttributeType name='Name' dt:type='string' required='yes'/>
<attribute type='Name'/>
<AttributeType name='src' dt:type='string'/>
<attribute type='src'/>
</ElementType>
<!-- - - - - - - - - - - UI Definitions - - - - - - - - - - - - - -->
<ElementType name='Error' content='textOnly' model='closed'>
<!-- Element value is Message, use CDATA if message contains delimiter characters -->
<attribute type='op'/>
<AttributeType name='Id' dt:type='int'/>
<attribute type='Id'/>
</ElementType>
<ElementType name='Publish' content='textOnly' model='closed'>
<!-- Ordering of these elements is registered in the ControlEvent table -->
<!-- Element value is the optional Condition expression -->
<AttributeType name='Event' dt:type='string'/><!-- must be one of the standard control events' -->
<attribute type='Event'/>
<AttributeType name='Property' dt:type='string'/><!-- mutually exclusive with 'Event' -->
<attribute type='Property'/>
<AttributeType name='Value' dt:type='string' required='yes'/>
<attribute type='Value'/>
</ElementType>
<ElementType name='Subscribe' content='empty' model='closed'>
<!-- Sets attributes for events in the EventMapping table -->
<AttributeType name='Event' dt:type='string'/><!-- must be one of the standard control events' -->
<attribute type='Event'/>
<AttributeType name='Attribute' dt:type='string'/>
<attribute type='Attribute'/> <!-- if not present can only handle enable, disable, hide, unhide events -->
</ElementType>
<ElementType name='Text' content='textOnly' model='closed'>
<!-- Element value is used for control text, where CDATA is used to escape delimiters -->
</ElementType>
<ElementType name='Control' content='mixed' model='closed'>
<!-- Element value is the Control identifier -->
<attribute type='op'/>
<AttributeType name='Type' dt:type='string' required='yes'/>
<attribute type='Type'/>
<AttributeType name='X' dt:type='int' required='yes'/>
<attribute type='X'/>
<AttributeType name='Y' dt:type='int' required='yes'/>
<attribute type='Y'/>
<AttributeType name='Width' dt:type='int' required='yes'/>
<attribute type='Width'/>
<AttributeType name='Height' dt:type='int' required='yes'/>
<attribute type='Height'/>
<AttributeType name='Property' dt:type='string'/>
<attribute type='Property'/>
<AttributeType name='Text' dt:type='string'/>
<attribute type='Text'/>
<AttributeType name='Help' dt:type='string'/>
<attribute type='Help'/>
<AttributeType name='CheckBoxValue' dt:type='string'/>
<attribute type='CheckBoxValue'/><!-- Only for CheckBox control to set Property to a value on check -->
<!-- Control ordering - order of declaration in Dialog determines tab ordering -->
<AttributeType name='TabSkip' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='TabSkip'/><!-- yes if this control is skipped in the tab sequence -->
<AttributeType name='First' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='First'/><!-- yes if this is the control that first gets focus -->
<AttributeType name='Default' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='Default'/><!-- yes if this control invoked by the return key -->
<AttributeType name='Cancel' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='Cancel'/><!-- yes if this is the control invoked on cancel of dialog -->
<!-- common Control attributes -->
<AttributeType name='Hidden' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='Hidden'/>
<AttributeType name='Disabled' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='Disabled'/>
<AttributeType name='Sunken' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='Sunken'/>
<AttributeType name='Indirect' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='Indirect'/>
<AttributeType name='Integer' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='Integer'/>
<AttributeType name='RightToLeft' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='RightToLeft'/>
<AttributeType name='RightAligned' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='RightAligned'/>
<AttributeType name='LeftScroll' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='LeftScroll'/>
<!-- attributes applied to specific Controls -->
<AttributeType name='Transparent' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='Transparent'/> <!-- only valid for Text Controls -->
<AttributeType name='NoPrefix' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='NoPrefix'/> <!-- only valid for Text Controls -->
<AttributeType name='NoWrap' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='NoWrap'/> <!-- only valid for Text Controls -->
<AttributeType name='FormatSize' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='FormatSize'/> <!-- only valid for Text Controls -->
<AttributeType name='UserLanguage' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='UserLanguage'/> <!-- only valid for Text Controls -->
<AttributeType name='Multiline' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='Multiline'/> <!-- only valid for Edit Controls -->
<AttributeType name='Password' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='Password'/> <!-- only valid for Edit Controls -->
<AttributeType name='ProgressBlocks' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='ProgressBlocks'/><!-- only valid for Progress Controls -->
<AttributeType name='Removable' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='Removable'/> <!-- only valid for Volume and Directory Controls -->
<AttributeType name='Fixed' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='Fixed'/> <!-- only valid for Volume and Directory Controls -->
<AttributeType name='Remote' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='Remote'/> <!-- only valid for Volume and Directory Controls -->
<AttributeType name='CDROM' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='CDROM'/> <!-- only valid for Volume and Directory Controls -->
<AttributeType name='RAMDisk' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='RAMDisk'/> <!-- only valid for Volume and Directory Controls -->
<AttributeType name='Floppy' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='Floppy'/> <!-- only valid for Volume and Directory Controls -->
<AttributeType name='ShowRollbackCost' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='ShowRollbackCost'/><!-- only valid for VolumeCostList Controls -->
<AttributeType name='Sorted' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='Sorted'/> <!-- only valid for Listbox and ComboBox Controls -->
<AttributeType name='ComboList' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='ComboList'/> <!-- only valid for ComboBox Controls -->
<AttributeType name='Image' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='Image'/> <!-- only valid for RadioButton, PushButton, and Icon Controls -->
<AttributeType name='IconSize' dt:type='enumeration' dt:values='16 32 48'/>
<attribute type ='IconSize'/> <!-- only valid for RadioButton, PushButton, and Icon Controls -->
<AttributeType name='FixedSize' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='FixedSize'/> <!-- only valid for RadioButton, PushButton, and Icon Controls -->
<AttributeType name='Icon' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='Icon'/> <!-- only valid for RadioButton and PushButton Controls -->
<AttributeType name='Bitmap' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='Bitmap'/> <!-- only valid for RadioButton and PushButton Controls -->
<AttributeType name='PushLike' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='PushLike'/> <!-- only valid for RadioButton and Checkbox Controls -->
<AttributeType name='HasBorder' dt:type='enumeration' dt:values='no yes'/>
<attribute type ='HasBorder'/> <!-- only valid for RadioButton Controls -->
<!-- alternative to Text attribute when CDATA is needed to escape XML delimiters -->
<element type='Text' minOccurs='0' maxOccurs='1'/>
<!-- child elements affecting operation of this control -->
<element type='Publish' minOccurs='0' maxOccurs='*'/>
<element type='Subscribe' minOccurs='0' maxOccurs='*'/>
<element type='Condition' minOccurs='0' maxOccurs='*'/>
</ElementType>
<ElementType name='Billboard' content='mixed' model='closed'>
<!-- Element value is internal identifier for the Billboard -->
<description> Bilboard to display during install of a Feature </description>
<attribute type='op'/>
<AttributeType name='Feature' dt:type='string'/>
<attribute type ='Feature'/> <!-- Feature whose state determines is Billboard is used -->
<element type='Control'/> <!-- can only have controls of type: Text, Bitmap, Icon, and custom -->
</ElementType>
<ElementType name='BillboardAction' content='mixed' model='closed'>
<!-- Element value is sequence Action during which the child Billboards are played -->
<description> Bilboard action during which child Billboards are displayed </description>
<element type='Billboard'/> <!-- order of Billboard elements determines order of display -->
</ElementType>
<ElementType name='Dialog' content='mixed' model='closed'>
<!-- Element value is the Dialog identifier -->
<attribute type='op'/>
<AttributeType name='X' dt:type='int' required='no'/>
<attribute type='X'/><!-- in %, defaults to centered on screen (50) -->
<AttributeType name='Y' dt:type='int' required='no'/>
<attribute type='Y'/><!-- in %, defaults to centered on screen (50) -->
<AttributeType name='Width' dt:type='int' required='yes'/>
<attribute type='Width'/><!-- in dialog units -->
<AttributeType name='Height' dt:type='int' required='yes'/>
<attribute type='Height'/><!-- in dialog units -->
<AttributeType name='Title' dt:type='string'/>
<attribute type='Title'/>
<!-- 'Attributes' column integer value generated from XML attributes below -->
<AttributeType name='Hidden' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='Hidden'/>
<AttributeType name='Modeless' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='Modeless'/>
<AttributeType name='NoMinimize' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='NoMinimize'/>
<AttributeType name='SystemModal' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='SystemModal'/>
<AttributeType name='KeepModeless' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='KeepModeless'/>
<AttributeType name='TrackDiskSpace' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='TrackDiskSpace'/>
<AttributeType name='CustomPalette' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='CustomPalette'/>
<AttributeType name='RightToLeft' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='RightToLeft'/>
<AttributeType name='RightAligned' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='RightAligned'/>
<AttributeType name='LeftScroll' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='LeftScroll'/>
<AttributeType name='ErrorDialog' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='ErrorDialog'/>
<!-- Control elements belonging to this dialog -->
<element type='Control' minOccurs='0' maxOccurs='*'/>
</ElementType>
<ElementType name='ProgressText' content='textOnly' model='closed'>
<!-- Element value is progress message text for action -->
<attribute type='op'/>
<AttributeType name='Action' dt:type='string'/>
<attribute type='Action'/>
<AttributeType name='Template' dt:type='string'/>
<attribute type='Template'/><!-- used to format ActionData messages from action processing -->
</ElementType>
<ElementType name='TextStyle' content='textOnly' model='closed'>
<!-- Element value is the TextStyle identifier, used in Control Text -->
<description> TextStyle definition </description>
<attribute type='op'/>
<AttributeType name='FaceName' dt:type='string' required='yes'/>
<attribute type='FaceName'/>
<AttributeType name='Size' dt:type='int' required='yes'/>
<attribute type='Size'/>
<AttributeType name='Red' dt:type='int'/>
<attribute type='Red'/> <!-- 0 to 255 -->
<AttributeType name='Green' dt:type='int'/>
<attribute type='Green'/> <!-- 0 to 255 -->
<AttributeType name='Blue' dt:type='int'/>
<attribute type='Blue'/> <!-- 0 to 255 -->
<AttributeType name='Bold' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='Bold'/>
<AttributeType name='Italic' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='Italic'/>
<AttributeType name='Underline' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='Underline'/>
<AttributeType name='Strike' dt:type='enumeration' dt:values='no yes' default='no'/>
<attribute type ='Strike'/>
</ElementType>
<ElementType name='ListItem' content='textOnly' model='closed'>
<!-- Element value is value assigned to the associated control Property -->
<description> Text and value associated with Property with Control set to listBox,listView,comboBox</description>
<attribute type='op'/>
<AttributeType name='Text' dt:type='string'/>
<attribute type ='Text'/> <!-- defaults to ListItem's value -->
<AttributeType name='Icon' dt:type='string'/>
<attribute type ='Icon'/> <!-- only valid in ListView Properties -->
</ElementType>
<ElementType name='ListBox' content='eltOnly' model='closed'>
<description> Set of items for a particular ListBox control tied to an install Property </description>
<attribute type='op'/><!-- used only to supply default op for child elements -->
<AttributeType name='Property' dt:type='string'/>
<attribute type ='Property' required='yes'/><!-- installer Property tied to this group -->
<element type='ListItem' minOccurs='0' maxOccurs='*'/><!-- entry for ListBox table-->
</ElementType>
<ElementType name='ComboBox' content='eltOnly' model='closed'>
<description> Set of items for a particular ComboBox control tied to an install Property </description>
<attribute type='op'/><!-- used only to supply default op for child elements -->
<AttributeType name='Property' dt:type='string'/>
<attribute type ='Property' required='yes'/><!-- installer Property tied to this group -->
<element type='ListItem' minOccurs='0' maxOccurs='*'/><!-- entry for ComboBox table-->
</ElementType>
<ElementType name='ListView' content='eltOnly' model='closed'>
<description> Set of items for a particular ListView control tied to an install Property </description>
<attribute type='op'/><!-- used only to supply default op for child elements -->
<AttributeType name='Property' dt:type='string'/>
<attribute type ='Property' required='yes'/><!-- installer Property tied to this group -->
<element type='ListItem' minOccurs='0' maxOccurs='*'/><!-- entry for ListView table-->
</ElementType>
<ElementType name='RadioButton' content='textOnly' model='closed'>
<!-- Element value is value assigned to the associated control Property -->
<description> Text and value associated with Property with Control set to radioGroup </description>
<attribute type='op'/>
<AttributeType name='X' dt:type='int' required='yes'/>
<attribute type ='X'/>
<AttributeType name='Y' dt:type='int' required='yes'/>
<attribute type ='Y'/>
<AttributeType name='Width' dt:type='int' required='yes'/>
<attribute type ='Width'/>
<AttributeType name='Height' dt:type='int' required='yes'/>
<attribute type ='Height'/>
<AttributeType name='Text' dt:type='string'/>
<attribute type ='Text'/> <!-- mutually exclusive with Icon-->
<AttributeType name='Icon' dt:type='string'/>
<attribute type ='Icon'/> <!-- mutually exclusive with Text attribute -->
<AttributeType name='ToolTip' dt:type='string'/>
<attribute type ='ToolTip'/>
<AttributeType name='Help' dt:type='string'/>
<attribute type ='Help'/>
</ElementType>
<ElementType name='RadioGroup' content='eltOnly' model='closed'>
<description> Set of radio buttons tied to a particular install Property </description>
<attribute type='op'/><!-- used only to supply default op for child elements -->
<AttributeType name='Property' dt:type='string'/>
<attribute type ='Property' required='yes'/><!-- installer Property tied to this group -->
<element type='RadioButton' minOccurs='0' maxOccurs='*'/><!-- entry for RadioButton table-->
</ElementType>
<ElementType name='UIText' content='mixed' model='closed'>
<!-- Element value is name as referenced from controls -->
<description> Text associated with certain controls </description>
<attribute type='op'/>
<AttributeType name='Text' dt:type='string' required='no'/>
<attribute type='Text'/>
<!-- alternative to Text attribute when CDATA is needed to escape XML delimiters -->
<element type='Text' minOccurs='0' maxOccurs='1'/>
</ElementType>
<ElementType name='UI' content='eltOnly' model='closed' order='many'>
<description> Enclosing tag to compartmentalize UI specifications </description>
<attribute type='op'/><!-- used only to supply default op for child Property elements -->
<element type='Dialog' minOccurs='0' maxOccurs='*'/><!-- Dialog specification, called from Sequence -->
<element type='BillboardAction' minOccurs='0' maxOccurs='*'/><!-- Billboard table item with child Controls -->
<element type='ListBox' minOccurs='0' maxOccurs='*'/><!-- ListBox table with ListItem children -->
<element type='ComboBox' minOccurs='0' maxOccurs='*'/><!-- ComboBox table with ListItem children -->
<element type='ListView' minOccurs='0' maxOccurs='*'/><!-- ListView table with ListItem children -->
<element type='RadioGroup' minOccurs='0' maxOccurs='*'/><!-- RadioButton table with RadioButton children -->
<element type='Error' minOccurs='0' maxOccurs='*'/><!-- Error text associated with install error -->
<element type='ProgressText' minOccurs='0' maxOccurs='*'/><!-- ActionText entry associated with an action -->
<element type='TextStyle' minOccurs='0' maxOccurs='*'/><!-- TextStyle entry for use in control text -->
<element type='UIText' minOccurs='0' maxOccurs='*'/><!-- values for UIText property, not installer Property -->
<!-- elements with identical behavior as under Product key, solely to allow grouping with other UI elements -->
<element type='Property' minOccurs='0' maxOccurs='*'/>
<element type='Binary' minOccurs='0' maxOccurs='*'/>
<element type='InstallUISequence' minOccurs='0' maxOccurs='1'/>
<element type='AdminUISequence' minOccurs='0' maxOccurs='1'/>
</ElementType>
<!-- - - - - - - - - - - Product Definitions - - - - - - - - - - - - - -->
<ElementType name='Package' content='empty' model='closed'>
<description> Package attributes from SummaryInformation </description>
<AttributeType name='Id' dt:type='uuid'><description> Package code GUID for SKU </description></AttributeType>
<attribute type ='Id'/>
<AttributeType name='Description' dt:type='string'><description> Product full name or description </description></AttributeType>
<attribute type ='Description'/>
<AttributeType name='Platforms' dt:type='string'><description> List of platforms supported in package </description></AttributeType>
<attribute type ='Platforms'/>
<AttributeType name='Languages' dt:type='string'><description> List of language IDs supported in package </description></AttributeType>
<attribute type ='Languages'/>
<AttributeType name='InstallerVersion' dt:type='int'><description> Minimum installer version, major*100 + minor </description></AttributeType>
<attribute type ='InstallerVersion'/>
<AttributeType name='Manufacturer' dt:type='string'><description> Vendor releasing the package </description></AttributeType>
<attribute type ='Manufacturer'/>
<AttributeType name='Keywords' dt:type='string'><description> Optional keywords for browsing </description></AttributeType>
<attribute type ='Keywords'/>
<AttributeType name='Comments' dt:type='string'><description> Optional comments for browsing </description></AttributeType>
<attribute type ='Comments'/>
<AttributeType name='SummaryCodepage' dt:type='int'><description> Codepage for summary info strings only </description></AttributeType>
<attribute type ='SummaryCodepage'/>
<AttributeType name='ShortNames' dt:type='enumeration' dt:values='no yes'><description> Short filenames on source </description></AttributeType>
<attribute type ='ShortNames'/>
<AttributeType name='Compressed' dt:type='enumeration' dt:values='no yes'><description> Compressed files on source </description></AttributeType>
<attribute type ='Compressed'/>
<AttributeType name='AdminImage' dt:type='enumeration' dt:values='no yes'><description> Source is an admin image </description></AttributeType>
<attribute type ='AdminImage'/>
</ElementType>
<ElementType name='Product' content='eltOnly' model='open' order='many'>
<!-- Product attributes from Property table -->
<attribute type='op'/>
<AttributeType name='Id' dt:type='uuid'><description> Product code GUID for product </description></AttributeType>
<attribute type ='Id'/>
<AttributeType name='Name' dt:type='string'><description> Descriptive name of product </description></AttributeType>
<attribute type ='Name'/>
<AttributeType name='Language' dt:type='int'><description> Decimal language ID for product </description></AttributeType>
<attribute type ='Language'/>
<AttributeType name='Manufacturer' dt:type='string'><description> Manufacturer of product </description></AttributeType>
<attribute type ='Manufacturer'/>
<AttributeType name='Version' dt:type='string'><description> Product version string </description></AttributeType>
<attribute type ='Version'/>
<AttributeType name='UpgradeCode' dt:type='uuid'><description> Upgrade code GUID for product </description></AttributeType>
<attribute type ='UpgradeCode'/>
<!-- Program-level elements -->
<element type='Package' minOccurs='0' maxOccurs='1'/><!-- Package properties from summary info -->
<element type='Condition' minOccurs='0' maxOccurs='*'/><!-- LaunchCondition -->
<element type='Property' minOccurs='0' maxOccurs='*'/><!-- product Property, parent of bound controls -->
<element type='Directory' minOccurs='0' maxOccurs='*'/><!-- root of Directory tree -->
<element type='Feature' minOccurs='0' maxOccurs='*'/><!-- root of Feature tree -->
<element type='Component' minOccurs='0' maxOccurs='*'/><!-- reference to existing Component -->
<element type='Media' minOccurs='0' maxOccurs='*'/>
<element type='AppId' minOccurs='0' maxOccurs='*'/>
<element type='Upgrade' minOccurs='0' maxOccurs='*'/>
<element type='CustomAction' minOccurs='0' maxOccurs='*'/>
<element type='CustomTable' minOccurs='0' maxOccurs='*'/>
<element type='UI' minOccurs='0' maxOccurs='*'/><!-- encloses UI specifications, may be multiple -->
<element type='InstallExecuteSequence' minOccurs='0' maxOccurs='1'/>
<element type='InstallUISequence' minOccurs='0' maxOccurs='1'/>
<element type='AdminExecuteSequence' minOccurs='0' maxOccurs='1'/>
<element type='AdminUISequence' minOccurs='0' maxOccurs='1'/>
<element type='AdvtExecuteSequence' minOccurs='0' maxOccurs='1'/>
<element type='Binary' minOccurs='0' maxOccurs='*'/>
<element type='Icon' minOccurs='0' maxOccurs='*'/>
</ElementType>
<ElementType name='Fragment' content='mixed' model='open'/>
</Schema>