Internal change

PiperOrigin-RevId: 54775386
Change-Id: If390e1b755ad97d74ed53a9bbb4b2aefa955956d
diff --git a/BlankFile.zip b/BlankFile.zip
new file mode 100644
index 0000000..e6709a2
--- /dev/null
+++ b/BlankFile.zip
Binary files differ
diff --git a/CPL.TXT b/CPL.TXT
new file mode 100644
index 0000000..5207f81
--- /dev/null
+++ b/CPL.TXT
@@ -0,0 +1,94 @@
+Common Public License Version 1.0
+
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+
+1. DEFINITIONS 
+
+"Contribution" means:
+
+a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and 
+
+b) in the case of each subsequent Contributor:
+
+i) changes to the Program, and
+
+ii) additions to the Program;
+
+where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.
+
+"Contributor" means any person or entity that distributes the Program. 
+
+"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.
+
+"Program" means the Contributions distributed in accordance with this Agreement. 
+
+"Recipient" means anyone who receives the Program under this Agreement, including all Contributors. 
+
+
+2. GRANT OF RIGHTS
+
+a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.
+
+b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
+
+c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.
+
+d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.
+
+
+3. REQUIREMENTS 
+
+A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: 
+
+a) it complies with the terms and conditions of this Agreement; and
+
+b) its license agreement:
+
+i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; 
+
+ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; 
+
+iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and 
+
+iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. 
+
+When the Program is made available in source code form:
+
+a) it must be made available under this Agreement; and
+
+b) a copy of this Agreement must be included with each copy of the Program. 
+
+Contributors may not remove or alter any copyright notices contained within the Program.
+
+Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. 
+
+
+4. COMMERCIAL DISTRIBUTION 
+
+Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. 
+
+For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. 
+
+
+5. NO WARRANTY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. 
+
+
+6. DISCLAIMER OF LIABILITY 
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 
+
+
+7. GENERAL
+
+If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. 
+
+If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.
+
+All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. 
+
+Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. 
+
+This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.
diff --git a/CustomActionCPP_2005.zip b/CustomActionCPP_2005.zip
new file mode 100644
index 0000000..dba1960
--- /dev/null
+++ b/CustomActionCPP_2005.zip
Binary files differ
diff --git a/CustomActionCPP_2008.zip b/CustomActionCPP_2008.zip
new file mode 100644
index 0000000..d97a473
--- /dev/null
+++ b/CustomActionCPP_2008.zip
Binary files differ
diff --git a/IncludeFile.ico b/IncludeFile.ico
new file mode 100644
index 0000000..1429bf2
--- /dev/null
+++ b/IncludeFile.ico
Binary files differ
diff --git a/IncludeFile.zip b/IncludeFile.zip
new file mode 100644
index 0000000..466fe93
--- /dev/null
+++ b/IncludeFile.zip
Binary files differ
diff --git a/LocalizationFile.ico b/LocalizationFile.ico
new file mode 100644
index 0000000..b5bcc9f
--- /dev/null
+++ b/LocalizationFile.ico
Binary files differ
diff --git a/LocalizationFile.zip b/LocalizationFile.zip
new file mode 100644
index 0000000..df85620
--- /dev/null
+++ b/LocalizationFile.zip
Binary files differ
diff --git a/LuxTasks.dll b/LuxTasks.dll
new file mode 100755
index 0000000..54c3e50
--- /dev/null
+++ b/LuxTasks.dll
Binary files differ
diff --git a/Microsoft.Deployment.WindowsInstaller.dll b/Microsoft.Deployment.WindowsInstaller.dll
new file mode 100755
index 0000000..bf179ae
--- /dev/null
+++ b/Microsoft.Deployment.WindowsInstaller.dll
Binary files differ
diff --git a/Microsoft.Tools.WindowsInstallerXml.NAntTasks.dll b/Microsoft.Tools.WindowsInstallerXml.NAntTasks.dll
new file mode 100755
index 0000000..0bddbbc
--- /dev/null
+++ b/Microsoft.Tools.WindowsInstallerXml.NAntTasks.dll
Binary files differ
diff --git a/ProductFile.ico b/ProductFile.ico
new file mode 100644
index 0000000..def49d5
--- /dev/null
+++ b/ProductFile.ico
Binary files differ
diff --git a/ProjectFile.ico b/ProjectFile.ico
new file mode 100644
index 0000000..53134de
--- /dev/null
+++ b/ProjectFile.ico
Binary files differ
diff --git a/SetupBuilder.dll b/SetupBuilder.dll
new file mode 100755
index 0000000..04b214e
--- /dev/null
+++ b/SetupBuilder.dll
Binary files differ
diff --git a/TextFile.zip b/TextFile.zip
new file mode 100644
index 0000000..a4b699c
--- /dev/null
+++ b/TextFile.zip
Binary files differ
diff --git a/WixComPlusExtension.dll b/WixComPlusExtension.dll
new file mode 100755
index 0000000..00cc4e1
--- /dev/null
+++ b/WixComPlusExtension.dll
Binary files differ
diff --git a/WixCop.exe b/WixCop.exe
new file mode 100755
index 0000000..07dd4f4
--- /dev/null
+++ b/WixCop.exe
Binary files differ
diff --git a/WixDifxAppExtension.dll b/WixDifxAppExtension.dll
new file mode 100755
index 0000000..159d218
--- /dev/null
+++ b/WixDifxAppExtension.dll
Binary files differ
diff --git a/WixDirectXExtension.dll b/WixDirectXExtension.dll
new file mode 100755
index 0000000..15f4c9f
--- /dev/null
+++ b/WixDirectXExtension.dll
Binary files differ
diff --git a/WixFirewallExtension.dll b/WixFirewallExtension.dll
new file mode 100755
index 0000000..afe457d
--- /dev/null
+++ b/WixFirewallExtension.dll
Binary files differ
diff --git a/WixGamingExtension.dll b/WixGamingExtension.dll
new file mode 100755
index 0000000..ee3381e
--- /dev/null
+++ b/WixGamingExtension.dll
Binary files differ
diff --git a/WixIIsExtension.dll b/WixIIsExtension.dll
new file mode 100755
index 0000000..b8e266a
--- /dev/null
+++ b/WixIIsExtension.dll
Binary files differ
diff --git a/WixLibrary.zip b/WixLibrary.zip
new file mode 100644
index 0000000..c6aa11d
--- /dev/null
+++ b/WixLibrary.zip
Binary files differ
diff --git a/WixLibraryFile.ico b/WixLibraryFile.ico
new file mode 100644
index 0000000..86c3cbe
--- /dev/null
+++ b/WixLibraryFile.ico
Binary files differ
diff --git a/WixLuxExtension.dll b/WixLuxExtension.dll
new file mode 100755
index 0000000..63ac934
--- /dev/null
+++ b/WixLuxExtension.dll
Binary files differ
diff --git a/WixMergeModule.zip b/WixMergeModule.zip
new file mode 100644
index 0000000..6b2ad0c
--- /dev/null
+++ b/WixMergeModule.zip
Binary files differ
diff --git a/WixMsmqExtension.dll b/WixMsmqExtension.dll
new file mode 100755
index 0000000..1d417d5
--- /dev/null
+++ b/WixMsmqExtension.dll
Binary files differ
diff --git a/WixNetFxExtension.dll b/WixNetFxExtension.dll
new file mode 100755
index 0000000..542ff21
--- /dev/null
+++ b/WixNetFxExtension.dll
Binary files differ
diff --git a/WixPSExtension.dll b/WixPSExtension.dll
new file mode 100755
index 0000000..bb199d8
--- /dev/null
+++ b/WixPSExtension.dll
Binary files differ
diff --git a/WixProject.zip b/WixProject.zip
new file mode 100644
index 0000000..8feca5a
--- /dev/null
+++ b/WixProject.zip
Binary files differ
diff --git a/WixSqlExtension.dll b/WixSqlExtension.dll
new file mode 100755
index 0000000..0a0e182
--- /dev/null
+++ b/WixSqlExtension.dll
Binary files differ
diff --git a/WixTasks.dll b/WixTasks.dll
new file mode 100755
index 0000000..7af495f
--- /dev/null
+++ b/WixTasks.dll
Binary files differ
diff --git a/WixUIExtension.dll b/WixUIExtension.dll
new file mode 100755
index 0000000..95d8e5b
--- /dev/null
+++ b/WixUIExtension.dll
Binary files differ
diff --git a/WixUtilExtension.dll b/WixUtilExtension.dll
new file mode 100755
index 0000000..eb4c24a
--- /dev/null
+++ b/WixUtilExtension.dll
Binary files differ
diff --git a/WixVSExtension.dll b/WixVSExtension.dll
new file mode 100755
index 0000000..8df14f3
--- /dev/null
+++ b/WixVSExtension.dll
Binary files differ
diff --git a/candle.exe b/candle.exe
new file mode 100755
index 0000000..453b362
--- /dev/null
+++ b/candle.exe
Binary files differ
diff --git a/candle.exe.config b/candle.exe.config
new file mode 100644
index 0000000..bed32a7
--- /dev/null
+++ b/candle.exe.config
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (c) Microsoft Corporation.  All rights reserved.
+-->
+<configuration>
+    <startup useLegacyV2RuntimeActivationPolicy="true">
+        <supportedRuntime version="v4.0" />
+        <supportedRuntime version="v2.0.50727" />
+    </startup>
+</configuration>
diff --git a/darice.cub b/darice.cub
new file mode 100644
index 0000000..dab4567
--- /dev/null
+++ b/darice.cub
Binary files differ
diff --git a/dark.exe b/dark.exe
new file mode 100755
index 0000000..6a24516
--- /dev/null
+++ b/dark.exe
Binary files differ
diff --git a/dark.exe.config b/dark.exe.config
new file mode 100644
index 0000000..0743e49
--- /dev/null
+++ b/dark.exe.config
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (c) Microsoft Corporation.  All rights reserved.
+-->
+<configuration>
+    <appSettings>
+        <add key="extensions" value="WixDifxAppExtension;WixDirectXExtension;WixFirewallExtension;WixGamingExtension;WixIIsExtension;WixNetFxExtension;WixSqlExtension;WixUIExtension;WixUtilExtension;WixVSExtension" />
+    </appSettings>
+    <startup useLegacyV2RuntimeActivationPolicy="true">
+        <supportedRuntime version="v4.0" />
+        <supportedRuntime version="v2.0.50727" />
+    </startup>
+</configuration>
diff --git a/difxapp_ia64.wixlib b/difxapp_ia64.wixlib
new file mode 100644
index 0000000..33e607f
--- /dev/null
+++ b/difxapp_ia64.wixlib
Binary files differ
diff --git a/difxapp_x64.wixlib b/difxapp_x64.wixlib
new file mode 100644
index 0000000..2054bc0
--- /dev/null
+++ b/difxapp_x64.wixlib
Binary files differ
diff --git a/difxapp_x86.wixlib b/difxapp_x86.wixlib
new file mode 100644
index 0000000..6d90219
--- /dev/null
+++ b/difxapp_x86.wixlib
Binary files differ
diff --git a/doc/DTF.chm b/doc/DTF.chm
new file mode 100644
index 0000000..6e5706b
--- /dev/null
+++ b/doc/DTF.chm
Binary files differ
diff --git a/doc/DTFAPI.chm b/doc/DTFAPI.chm
new file mode 100644
index 0000000..e314968
--- /dev/null
+++ b/doc/DTFAPI.chm
Binary files differ
diff --git a/doc/difxapp.xsd b/doc/difxapp.xsd
new file mode 100644
index 0000000..a3d34f3
--- /dev/null
+++ b/doc/difxapp.xsd
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:html="http://www.w3.org/1999/xhtml"
+            xmlns:wix="http://schemas.microsoft.com/wix/2006/wi"
+             xmlns:xs="http://www.w3.org/2001/XMLSchema"
+            xmlns:xse="http://schemas.microsoft.com/wix/2005/XmlSchemaExtension"
+      targetNamespace="http://schemas.microsoft.com/wix/DifxAppExtension"
+                xmlns="http://schemas.microsoft.com/wix/DifxAppExtension">
+    <xs:annotation>
+        <xs:documentation>
+            Copyright (c) Microsoft Corporation.  All rights reserved.
+            
+            The use and distribution terms for this software are covered by the
+            Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+            which can be found in the file CPL.TXT at the root of this distribution.
+            By using this software in any fashion, you are agreeing to be bound by
+            the terms of this license.
+            
+            You must not remove this notice, or any other, from this software.
+
+            The source code schema for the Windows Installer XML Toolset Driver Install Frameworks for Applications Extension.
+        </xs:documentation>
+    </xs:annotation>
+
+    <xs:import namespace="http://schemas.microsoft.com/wix/2006/wi" />
+
+    <xs:element name="Driver">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Component" />
+            </xs:appinfo>
+            <xs:documentation>
+                Installs a driver. To use this element, you need to reference the WixDifxAppExtension extension and add the 
+                .wixlib appropriate for the target platform (difxapp_x86.wixlib, difxapp_x64.wixlib, or difxapp_ia64.wixlib) 
+                to your project.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="AddRemovePrograms" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>
+                        Specifies that the DIFxApp CustomActions should add an entry in the Add/Remove Programs Control
+                        Panel applet.  The default is 'yes'.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DeleteFiles" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>
+                        If set to "yes", configures DIFxApp to delete binary files that were copied to the system from the driver
+                        store when a driver package was installed. If this attribute is set to "no" or not present, DIFxApp does not
+                        remove these files from a system. Note that configuring DIFxApp to delete these files is controlled by the
+                        Flags entry value of the component that represents the driver package in the MsiDriverPackages custom table.
+                        Setting DriverDeleteFiles to "yes" sets the corresponding bit in the Flags entry value. Setting DriverLegacy
+                        to "no" clears the corresponding bit in the Flags entry value. If this attribute is not present, DIFxApp uses
+                        a default value of "no".
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ForceInstall" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>
+                        Specifies that the DIFxApp CustomActions should force the installation of a new Plug and Play driver
+                        on a device, even if the currently installed driver on the device is a better match than the new driver.
+                        Specifying 'no' is an excellent way to ensure the DIFxApp CustomActions recognize the Component contains
+                        a driver for installation.  The default is null which means the Component does not install a driver via
+                        DIFxApp CustomActions. See <html:a href='http://www.microsoft.com/whdc/driver/install/difxtools.mspx'>http://www.microsoft.com/whdc/driver/install/difxtools.mspx</html:a>
+                        for more information.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Legacy" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>
+                        If set to "yes", configures DIFxApp to install unsigned driver packages and driver packages with missing
+                        files. For more information, see "Installing Unsigned Driver Packages in Legacy Mode" earlier in this paper.
+                        If this attribute is set to "no" or not present, DIFxApp will install only signed driver packages. Note
+                        that configuring DIFxApp to install unsigned drivers is controlled by the Flags entry value of the component
+                        that represents the driver package in the MsiDriverPackages custom table. Setting DriverLegacy to "yes" sets
+                        the corresponding bit in the Flags entry value. Setting DriverLegacy to "no" clears the bit in the Flags
+                        entry value that configures DIFxApp to install unsigned driver packages. If this attribute is not present,
+                        DIFxApp uses a default value of "no".
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="PlugAndPlayPrompt" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>
+                        Specifies that the DIFxApp CustomActions should prompt the user to connect the Plug and Play
+                        device if it is not connected.  The default is 'yes'.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Sequence" type="xs:integer">
+                <xs:annotation>
+                    <xs:documentation>
+                        Specifies an optional installation sequence number. DIFxApp CustomActions install the driver packages in
+                        an installation package in the order of increasing sequence numbers. The same sequence number can be used
+                        for more than one driver; however, the order in which packages with the same sequence number are actually
+                        installed cannot be determined.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:simpleType name="YesNoType">
+        <xs:annotation>
+            <xs:documentation>Values of this type will either be "yes" or "no".</xs:documentation>
+        </xs:annotation>
+        <xs:restriction base='xs:NMTOKEN'>
+            <xs:enumeration value="no"/>
+            <xs:enumeration value="yes"/>
+        </xs:restriction>
+    </xs:simpleType>
+</xs:schema>
diff --git a/doc/firewall.xsd b/doc/firewall.xsd
new file mode 100644
index 0000000..dccca1d
--- /dev/null
+++ b/doc/firewall.xsd
@@ -0,0 +1,193 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+          xmlns:xse="http://schemas.microsoft.com/wix/2005/XmlSchemaExtension"
+         xmlns:html="http://www.w3.org/1999/xhtml"
+    targetNamespace="http://schemas.microsoft.com/wix/FirewallExtension"
+              xmlns="http://schemas.microsoft.com/wix/FirewallExtension">
+    <xs:annotation>
+        <xs:documentation>
+            Copyright (c) Microsoft Corporation.  All rights reserved.
+            
+            The use and distribution terms for this software are covered by the
+            Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+            which can be found in the file CPL.TXT at the root of this distribution.
+            By using this software in any fashion, you are agreeing to be bound by
+            the terms of this license.
+            
+            You must not remove this notice, or any other, from this software.
+
+            The source code schema for the Windows Installer XML Toolset Firewall Extension.
+        </xs:documentation>
+    </xs:annotation>
+
+    <xs:import namespace="http://schemas.microsoft.com/wix/2006/wi" />
+
+    <xs:element name="FirewallException">
+        <xs:annotation>
+            <xs:documentation>
+                Registers an exception for a program or a specific port and protocol in the Windows Firewall
+                on Windows XP SP2, Windows Server 2003 SP1, and later. For more information about the Windows
+                Firewall, see <html:a href="http://msdn2.microsoft.com/en-us/library/aa364679.aspx">
+                About Windows Firewall API</html:a>.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Component" />
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="File" />
+            </xs:appinfo>
+        </xs:annotation>
+
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:annotation>
+                    <xs:documentation>
+                        Explicitly-listed remote addresses that this exception allows through the 
+                        firewall.
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:element ref="RemoteAddress" />
+            </xs:choice>
+
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>
+                        Unique ID of this firewall exception.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+
+            <xs:attribute name="Name" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>
+                        Name of this firewall exception, visible to the user in the firewall 
+                        control panel.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+
+            <xs:attribute name="Scope">
+                <xs:annotation>
+                    <xs:documentation>
+                        The scope of this firewall exception, which indicates whether incoming
+                        connections can come from any computer including those on the Internet
+                        or only those on the local network subnet. To more precisely specify
+                        allowed remote address, specify a custom scope using RemoteAddress 
+                        child elements.
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="any" />
+                        <xs:enumeration value="localSubnet" />
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+
+            <xs:attribute name="Port" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Port to allow through the firewall for this exception. If you use Port, you 
+                        cannot also use File or Program.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+
+            <xs:attribute name="Protocol">
+                <xs:annotation>
+                    <xs:documentation>
+                        IP protocol used for this firewall exception. If not specified, "tcp" is 
+                        assumed. If you use Protocol, you must also specify Port and you cannot 
+                        also use File or Program.
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="tcp" />
+                        <xs:enumeration value="udp" />
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+
+            <xs:attribute name="File" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Identifier of a file to be granted access to all incoming ports and 
+                        protocols. If you use File, you cannot also use Program, Port, or Protocol.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+
+            <xs:attribute name="Program" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Path to a target program to be granted access to all incoming ports and 
+                        protocols. Note that this is a formatted field, so you can use [#fileId] 
+                        syntax to refer to a file being installed. If you use Program, you cannot 
+                        also use File, Port, or Protocol.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+
+            <xs:attribute name="IgnoreFailure" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>
+                        If "yes," failures to register this firewall exception will be silently 
+                        ignored. If "no" (the default), failures will cause rollback.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+
+            <xs:attribute name="Profile">
+              <xs:annotation>
+                <xs:documentation>
+                  Profile type for this firewall exception. Default is "all".
+                </xs:documentation>
+              </xs:annotation>
+              <xs:simpleType>
+                <xs:restriction base="xs:NMTOKEN">
+                  <xs:enumeration value="domain" />
+                  <xs:enumeration value="private" />
+                  <xs:enumeration value="public" />
+                  <xs:enumeration value="all" />
+                </xs:restriction>
+              </xs:simpleType>
+            </xs:attribute>
+          
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="RemoteAddress">
+        <xs:annotation>
+            <xs:documentation>
+                A remote address to which the port or program can listen. Address formats vary 
+                based on the version of Windows and Windows Firewall the program is being installed
+                on. For Windows XP SP2 and Windows Server 2003 SP1, see
+                <html:a href="http://msdn2.microsoft.com/en-us/library/aa365270.aspx">
+                    RemoteAddresses Property</html:a>.
+                For Windows Vista and Windows Server 2008, see
+                <html:a href="http://msdn2.microsoft.com/en-us/library/aa365366.aspx">
+                    RemoteAddresses Property</html:a>.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:simpleContent>
+                <xs:extension base="xs:string">
+                    <xs:annotation>
+                        <xs:documentation>
+                            A remote address.
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:extension>
+            </xs:simpleContent>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:simpleType name="YesNoType">
+        <xs:annotation>
+            <xs:documentation>Values of this type will either be "yes" or "no".</xs:documentation>
+        </xs:annotation>
+        <xs:restriction base='xs:NMTOKEN'>
+            <xs:enumeration value="no"/>
+            <xs:enumeration value="yes"/>
+        </xs:restriction>
+    </xs:simpleType>
+</xs:schema>
diff --git a/doc/gaming.xsd b/doc/gaming.xsd
new file mode 100644
index 0000000..8ceae8b
--- /dev/null
+++ b/doc/gaming.xsd
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+          xmlns:xse="http://schemas.microsoft.com/wix/2005/XmlSchemaExtension"
+         xmlns:html="http://www.w3.org/1999/xhtml"
+    targetNamespace="http://schemas.microsoft.com/wix/GamingExtension"
+              xmlns="http://schemas.microsoft.com/wix/GamingExtension">
+    <xs:annotation>
+        <xs:documentation>
+            Copyright (c) Microsoft Corporation.  All rights reserved.
+            
+            The use and distribution terms for this software are covered by the
+            Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+            which can be found in the file CPL.TXT at the root of this distribution.
+            By using this software in any fashion, you are agreeing to be bound by
+            the terms of this license.
+            
+            You must not remove this notice, or any other, from this software.
+
+            The source code schema for the Windows Installer XML Toolset Gaming Extension.
+        </xs:documentation>
+    </xs:annotation>
+
+    <xs:import namespace="http://schemas.microsoft.com/wix/2006/wi" />
+
+    <xs:attribute name="IsRichSavedGame">
+        <xs:annotation>
+            <xs:documentation>
+                Registers this extension for the 
+                <html:a href="http://msdn.microsoft.com/library/bb173448.aspx" target="_blank">rich saved games</html:a> 
+                property handler on Windows Vista and later.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Extension" />
+            </xs:appinfo>
+        </xs:annotation>
+    </xs:attribute>
+
+    <xs:element name="Game">
+        <xs:annotation>
+            <xs:documentation>
+                Registers a game in Game Explorer on Windows Vista and later. The executable must have an
+                embedded Game Definition File. For more information about Game Explorer and GDFs, see
+                <html:a href="http://msdn.microsoft.com/library/bb173432.aspx" target="_blank">The Windows Vista Game Explorer</html:a>.
+                This registration is accomplished via custom action.
+
+                On Windows XP, this element instead records the same information in the registry so that
+                later upgrades to Windows Vista register the game in Game Explorer.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="File" />
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:annotation>
+                    <xs:documentation>Each game can support multiple play and support tasks that are shown in the Game Explorer context menu.  PlayTask and SupportTask are not needed when using when authoring the tasks in the GDF using ExtendedProperties\GameTasks available in Windows 7.  At least one play task should be created using either PlayTask or the ExtendedProperties\GameTasks\Play in the GDF.</xs:documentation>
+                </xs:annotation>
+                <xs:element ref="PlayTask"/>
+                <xs:element ref="SupportTask"/>
+            </xs:choice>
+
+            <xs:attribute name="Id" type="Guid" use="required">
+                <xs:annotation>
+                    <xs:documentation>The game's instance ID.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="GdfResourceFile" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Identifier of the file that contains the game's GDF resource, if it doesn't exist in the parent file.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ExecutableFile" type="xs:string">
+              <xs:annotation>
+                <xs:documentation>Identifier of the file that is the game's executable, if it isn't the parent file.</xs:documentation>
+              </xs:annotation>
+            </xs:attribute>
+          </xs:complexType>
+    </xs:element>
+
+    <xs:element name="PlayTask">
+        <xs:annotation>
+            <xs:documentation>
+                Creates a shortcut to the parent File and registers it as a "play task" in Game Explorer. For more information, see
+                <html:a href="http://msdn.microsoft.com/library/bb173450.aspx" target="_blank">
+                    Game Explorer Tasks
+                </html:a>.  PlayTask should not be used when authoring the tasks in the GDF using ExtendedProperties\GameTasks available in Windows 7.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Name" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>User-visible task name Game Explorer shows on its context menu. Note that the first task is named "Play" regardless of the name you provide.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Arguments" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Command-line arguments to be passed to the game executable for this task.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="SupportTask">
+        <xs:annotation>
+            <xs:documentation>
+                Creates an Internet shortcut and registers it as a "support task" in Game Explorer. For more information, see
+                <html:a href="http://msdn.microsoft.com/library/bb173450.aspx" target="_blank">
+                    Game Explorer Tasks
+                </html:a>.  SupportTask should not be used when authoring the tasks in the GDF using ExtendedProperties\GameTasks available in Windows 7.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Name" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>User-visible task name Game Explorer shows on its context menu. Note that the first task is named "Play" regardless of the name you provide.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Address" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>URI for this task.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:simpleType name="Guid">
+        <xs:annotation>
+            <xs:documentation>Values of this type will look like: "01234567-89AB-CDEF-0123-456789ABCDEF" or "{01234567-89AB-CDEF-0123-456789ABCDEF}". Also allows "PUT-GUID-HERE" for use in examples.</xs:documentation>
+        </xs:annotation>
+        <xs:restriction base="xs:string">
+            <xs:pattern value="[{(]?[0-9A-Fa-f]{8}\-?[0-9A-Fa-f]{4}\-?[0-9A-Fa-f]{4}\-?[0-9A-Fa-f]{4}\-?[0-9A-Fa-f]{12}[})]?|PUT\-GUID\-HERE|([!$])\(loc\.[_A-Za-z][0-9A-Za-z_.]*\)|!\(wix\.[_A-Za-z][0-9A-Za-z_.]*\)"/>
+        </xs:restriction>
+    </xs:simpleType>
+</xs:schema>
diff --git a/doc/iis.xsd b/doc/iis.xsd
new file mode 100644
index 0000000..ffb4750
--- /dev/null
+++ b/doc/iis.xsd
@@ -0,0 +1,1114 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:html="http://www.w3.org/1999/xhtml"
+            xmlns:wix="http://schemas.microsoft.com/wix/2006/wi"
+             xmlns:xs="http://www.w3.org/2001/XMLSchema"
+            xmlns:xse="http://schemas.microsoft.com/wix/2005/XmlSchemaExtension"
+      targetNamespace="http://schemas.microsoft.com/wix/IIsExtension"
+                xmlns="http://schemas.microsoft.com/wix/IIsExtension">
+    <xs:annotation>
+        <xs:documentation>
+            Copyright (c) Microsoft Corporation.  All rights reserved.
+            
+            The use and distribution terms for this software are covered by the
+            Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+            which can be found in the file CPL.TXT at the root of this distribution.
+            By using this software in any fashion, you are agreeing to be bound by
+            the terms of this license.
+            
+            You must not remove this notice, or any other, from this software.
+
+            The source code schema for the Windows Installer XML Toolset Internet Information Services Extension.
+        </xs:documentation>
+    </xs:annotation>
+
+    <xs:import namespace="http://schemas.microsoft.com/wix/2006/wi" />
+
+    <xs:element name="WebDirProperties">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Fragment" />
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Module" />
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Product" />
+            </xs:appinfo>
+            <xs:documentation>
+                WebDirProperties used by one or more WebSites. Lists properties common to IIS web sites and vroots. Corresponding properties can be viewed through the IIS Manager snap-in. One property entry can be reused by multiple sites or vroots using the Id field as a reference, using WebVirtualDir.DirProperties, WebSite.DirProperties, or WebDir.DirProperties.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string" use="required"/>
+            <xs:attribute name="Read" type="YesNoType"/>
+            <xs:attribute name="Write" type="YesNoType"/>
+            <xs:attribute name="Script" type="YesNoType"/>
+            <xs:attribute name="Execute" type="YesNoType"/>
+            <xs:attribute name="AnonymousAccess" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Sets the Enable Anonymous Access checkbox, which maps anonymous users to a Windows user account. When setting this to 'yes' you should also provide the user account using the AnonymousUser attribute, and determine what setting to use for the IIsControlledPassword attribute. Defaults to 'no.'</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="AnonymousUser" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Reference to the Id attribute on the User element to be used as the anonymous user for the directory. See the User element for more information.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IIsControlledPassword" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Sets whether IIS should control the password used for the Windows account specified in the AnonymousUser attribute. Defaults to 'no.'</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="WindowsAuthentication" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Sets the Windows Authentication option, which enables integrated Windows authentication to be used on the site. Defaults to 'no.'</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DigestAuthentication" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Sets the Digest Authentication option, which allows using digest authentication with domain user accounts. Defaults to 'no.'</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="BasicAuthentication" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Sets the Basic Authentication option, which allows clients to provide credentials in plaintext over the wire. Defaults to 'no.'</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="PassportAuthentication" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Sets the Passport Authentication option, which allows clients to provide credentials via a .Net Passport account. Defaults to 'no.'</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="LogVisits" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Sets whether visits to this site should be logged. Defaults to 'no.'</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Index" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Sets the Index Resource option, which specifies whether this web directory should be indexed. Defaults to 'no.'</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DefaultDocuments" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>The list of default documents to set for this web directory, in comma-delimited format.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="AspDetailedError" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Sets the option for whether to send detailed ASP errors back to the client on script error. Default is 'no.'</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="HttpExpires" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Value to set the HttpExpires attribute to for a Web Dir in the metabase.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="CacheControlMaxAge" type="xs:nonNegativeInteger">
+                <xs:annotation>
+                    <xs:documentation>Integer value specifying the cache control maximum age value.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="CacheControlCustom" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Custom HTTP 1.1 cache control directives.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ClearCustomError" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Specifies whether IIs will return custom errors for this directory.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="AccessSSL" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>A value of true indicates that file access requires SSL file permission processing, with or without a client certificate. This corresponds to AccessSSL flag for AccessSSLFlags IIS metabase property.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="AccessSSL128" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>A value of true indicates that file access requires SSL file permission processing with a minimum key size of 128 bits, with or without a client certificate. This corresponds to AccessSSL128 flag for AccessSSLFlags IIS metabase property.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="AccessSSLMapCert" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>This corresponds to AccessSSLMapCert flag for AccessSSLFlags IIS metabase property.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="AccessSSLNegotiateCert" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>This corresponds to AccessSSLNegotiateCert flag for AccessSSLFlags IIS metabase property.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="AccessSSLRequireCert" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>This corresponds to AccessSSLRequireCert flag for AccessSSLFlags IIS metabase property.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="AuthenticationProviders" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Comma delimited list, in order of precedence, of Windows authentication providers that IIS will attempt to use: NTLM, Kerberos, Negotiate, and others.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="WebError">
+        <xs:annotation>
+            <xs:documentation>Custom Web Errors used by WebSites and Virtual Directories.</xs:documentation>
+            <xs:appinfo>
+                <xse:remarks>
+                    You can only use error code and sub code combinations which are supported by IIS.  Attempting to set a custom error for
+                    an error code and sub code combination that is not supported by IIS (in the default list of error codes) will result in
+                    an installation failure.
+                </xse:remarks>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="ErrorCode" use="required" type="xs:integer">
+                <xs:annotation>
+                    <xs:documentation>HTTP 1.1 error code.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SubCode" use="required" type="xs:integer">
+                <xs:annotation>
+                    <xs:documentation>Error sub code.  Set to 0 to get the wild card "*".</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="File" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>File to be sent to the client for this error code and sub code.  This can be formatted.  For example: [#FileId].</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="URL" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>URL to be sent to the client for this error code and sub code.  This can be formatted.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="HttpHeader">
+        <xs:annotation>
+            <xs:documentation>Custom HTTP Header definition for IIS resources such as WebSite and WebVirtualDir.</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Primary key for custom HTTP Header entry.  This will default to the Name attribute.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Name" use="required" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Name of the custom HTTP Header.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Value" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Value for the custom HTTP Header. This attribute can contain a formatted string that is processed at install time to insert the values of properties using [PropertyName] syntax. Also supported are environment variables, file installation paths, and component installation directories; see <a href="http://msdn2.microsoft.com/library/aa368609.aspx" target="_blank">Formatted</a> for details.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="MimeMap">
+        <xs:annotation>
+            <xs:documentation>MimeMap definition for IIS resources.</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" use="required" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Id for the MimeMap.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Type" use="required" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Mime-type covered by the MimeMap.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Extension" use="required" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Extension covered by the MimeMap.  Must begin with a dot.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="WebFilter">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Component" />
+            </xs:appinfo>
+            <xs:documentation>IIs Filter for a Component</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" use="required" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>The unique Id for the web filter.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Name" use="required" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>The name of the filter to be used in IIS.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Path" use="required" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        The path of the filter executable file.
+                        This should usually be a value like '[!FileId]', where 'FileId' is the file identifier
+                        of the filter executable file.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="WebSite" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Specifies the parent website for this filter (if there is one).
+                        If this is a global filter, then this attribute should not be specified.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Description" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Description of the filter.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Flags" type="xs:integer">
+                <xs:annotation>
+                    <xs:documentation>Sets the MD_FILTER_FLAGS metabase key for the filter. This must be an integer. See MSDN 'FilterFlags' documentation for more details.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="LoadOrder" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        The legal values are "first", "last", or a number.
+                        If a number is specified, it must be greater than 0.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="WebApplicationExtension">
+        <xs:annotation>
+            <xs:documentation>Extension for WebApplication</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Executable" use="required" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>usually a Property that resolves to short file name path</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Extension" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Extension being registered. Do not prefix with a '.' (e.g. you should use "html", not ".html").  To register for all extensions, use Extension="*".  To register a wildcard application map (which handles all requests, even those for directories or files with no extension) omit the Extension attribute completely.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Verbs" type="xs:string">
+            </xs:attribute>
+            <xs:attribute name="Script" type="YesNoType">
+            </xs:attribute>
+            <xs:attribute name="CheckPath" type="YesNoType">
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="WebAppPool">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Component" />
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Fragment" />
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Module" />
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Product" />
+            </xs:appinfo>
+            <xs:documentation>IIS6 Application Pool</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element ref="RecycleTime" minOccurs="0" maxOccurs="unbounded"/>
+            </xs:sequence>
+            <xs:attribute name="Id" use="required" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Id of the AppPool.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Name" use="required" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Name of the AppPool to be shown in IIs.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="User" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>User account to run the AppPool as.  To use this, you must set the Identity attribute to 'other'.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="RecycleMinutes" type="xs:integer">
+                <xs:annotation>
+                    <xs:documentation>How often, in minutes, you want the AppPool to be recycled.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="RecycleRequests" type="xs:integer">
+                <xs:annotation>
+                    <xs:documentation>How often, in requests, you want the AppPool to be recycled.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="VirtualMemory" type="xs:integer">
+                <xs:annotation>
+                    <xs:documentation>Specifies the amount of virtual memory (in KB) that a worker process can use before the worker process recycles. The maximum value supported for this attribute is 4,294,967 KB.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="PrivateMemory" type="xs:integer">
+                <xs:annotation>
+                    <xs:documentation>Specifies the amount of private memory (in KB) that a worker process can use before the worker process recycles. The maximum value supported for this attribute is 4,294,967 KB.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IdleTimeout" type="xs:integer">
+                <xs:annotation>
+                    <xs:documentation>Shutdown worker process after being idle for (time in minutes).</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="QueueLimit" type="xs:integer">
+                <xs:annotation>
+                    <xs:documentation>Limit the kernel request queue (number of requests).</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="MaxCpuUsage" type="PercentType">
+                <xs:annotation>
+                    <xs:documentation>Maximum CPU usage (percent).</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="RefreshCpu" type="xs:integer">
+                <xs:annotation>
+                    <xs:documentation>Refresh CPU usage numbers (in minutes).</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="CpuAction">
+                <xs:annotation>
+                    <xs:documentation>Action taken when CPU exceeds maximum CPU use (as defined with MaxCpuUsage and RefreshCpu).</xs:documentation>
+                </xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:string">
+                        <xs:enumeration value="none"/>
+                        <xs:enumeration value="shutdown"/>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="MaxWorkerProcesses" type="xs:integer">
+                <xs:annotation>
+                    <xs:documentation>Maximum number of worker processes.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Identity">
+                <xs:annotation>
+                    <xs:documentation>Identity you want the AppPool to run under.  Use the 'other' value in conjunction with the User attribute to specify non-standard user.</xs:documentation>
+                </xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:string">
+                        <xs:enumeration value="networkService"/>
+                        <xs:enumeration value="localService"/>
+                        <xs:enumeration value="localSystem"/>
+                        <xs:enumeration value="other"/>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+          <xs:attribute name="ManagedPipelineMode">
+            <xs:annotation>
+              <xs:documentation>Specifies the request-processing mode that is used to process requests for managed content.  Only available on IIS7, ignored on IIS6.</xs:documentation>
+            </xs:annotation>
+            <xs:simpleType>
+              <xs:restriction base="xs:string">
+                <xs:enumeration value="classic"/>
+                <xs:enumeration value="integrated"/>
+              </xs:restriction>
+            </xs:simpleType>
+          </xs:attribute>
+          <xs:attribute name="ManagedRuntimeVersion">
+            <xs:annotation>
+              <xs:documentation>Specifies the .NET Framework version to be used by the application pool.  Only available on IIS7, ignored on IIS6.</xs:documentation>
+            </xs:annotation>
+            <xs:simpleType>
+              <xs:restriction base="xs:string">
+                <xs:enumeration value="v1.1"/>
+                <xs:enumeration value="v2.0"/>
+                <xs:enumeration value="v4.0"/>
+              </xs:restriction>
+            </xs:simpleType>
+          </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="RecycleTime">
+        <xs:annotation>
+            <xs:documentation>IIS6 Application Pool Recycle Times on 24 hour clock.</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Value" use="required">
+                <xs:simpleType>
+                    <xs:restriction base="xs:string">
+                        <xs:pattern value="\d{1,2}:\d{2}"/>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Certificate">
+        <xs:annotation>
+            <xs:documentation>
+                Used to install and uninstall certificates.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Component" />
+                <xse:seeAlso ref="CertificateRef"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" use="required" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Unique identifier for this certificate in the installation package.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Name" use="required" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Name of the certificate that will be installed or uninstalled in the specified store.
+                        This attribute may be set via a formatted Property (e.g. [MyProperty]).
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="StoreName" use="required">
+                <xs:simpleType>
+                    <xs:restriction base="xs:string">
+                        <xs:enumeration value="ca">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Contains the certificates of certificate authorities that the user trusts to issue certificates to others. Certificates in these stores are normally supplied with the operating system or by the user's network administrator.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="my">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Use the "personal" value instead.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="personal">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Contains personal certificates. These certificates will usually have an associated private key. This store is often
+                                    referred to as the "MY" certificate store.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="request"/>
+                        <xs:enumeration value="root">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Contains the certificates of certificate authorities that the user trusts to issue certificates to others. Certificates in these stores are normally supplied with the operating system or by the user's network administrator. Certificates in this store are typically self-signed.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="otherPeople">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Contains the certificates of those that the user normally sends enveloped messages to or receives signed messages from.
+                                    See <a href="http://msdn2.microsoft.com/library/aa388160.aspx" target="_blank">MSDN documentation</a> for more information.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="trustedPeople">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Contains the certificates of those directly trusted people and resources.
+                                    See <a href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.storename.aspxx" target="_blank">MSDN documentation</a> for more information.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="trustedPublisher">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Contains the certificates of those publishers who are trusted.
+                                    See <a href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.storename.aspxx" target="_blank">MSDN documentation</a> for more information.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="StoreLocation" use="required">
+                <xs:simpleType>
+                    <xs:restriction base="xs:string">
+                        <xs:enumeration value="currentUser"/>
+                        <xs:enumeration value="localMachine"/>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="Overwrite" type="YesNoType"/>
+            <xs:attribute name="Request" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>
+                        This attribute controls whether the CertificatePath attribute is a path to a certificate file (Request=&apos;no&apos;) or the
+                        certificate authority to request the certificate from  (Request=&apos;yes&apos;).
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="BinaryKey" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Reference to a Binary element that will store the certificate as a stream inside the package.  This attribute cannot be specified with
+                        the CertificatePath attribute.
+                    </xs:documentation>
+                    <xs:appinfo>
+                        <xse:seeAlso ref="Binary"/>
+                    </xs:appinfo>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="CertificatePath" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        If the Request attribute is "no" then this attribute is the path to the certificate file outside of the package.
+                        If the Request attribute is "yes" then this atribute is the certificate authority to request the certificate from.
+                        This attribute may be set via a formatted Property (e.g. [MyProperty]).
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="PFXPassword" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        If the Binary stream or path to the file outside of the package is a password protected PFX file, the password for that
+                        PFX must be specified here.  This attribute may be set via a formatted Property (e.g. [MyProperty]).
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="CertificateRef">
+        <xs:annotation>
+            <xs:documentation>
+                Associates a certificate with the parent WebSite.  The Certificate element should be
+                in the same Component as the parent WebSite.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:seeAlso ref="Certificate"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" use="required" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        The identifier of the referenced Certificate.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="WebProperty">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Component" />
+                <xse:remarks>
+                    Here is an explanation of the acceptable values for each property and their meaning:
+                    <html:ul>
+                        <html:li>
+                            For the Ids IIs5IsolationMode and LogInUTF8, no value should be specified since
+                            the presence of this property indicates that the setting should be set.
+                        </html:li>
+                        <html:li>
+                            For the MaxGlobalBandwidth Id, the value should be specified in kilobytes.  The
+                            value should be a base 10 number.
+                        </html:li>
+                        <html:li>
+                            ETagChangeNumber sets the machine-specific portion of ETag as a number. This value,
+                            when synchronized across servers in a web farm, allows the web farm to return an
+                            identical ETag for a given resource regardless of the server that handled the
+                            request.  The value should be a base 10 number.
+                        </html:li>
+                    </html:ul>
+                </xse:remarks>
+            </xs:appinfo>
+            <xs:documentation>IIS Properties</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" use="required">
+                <xs:simpleType>
+                    <xs:restriction base="xs:string">
+                        <xs:enumeration value="ETagChangeNumber"/>
+                        <xs:enumeration value="IIs5IsolationMode"/>
+                        <xs:enumeration value="MaxGlobalBandwidth"/>
+                        <xs:enumeration value="LogInUTF8"/>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="Value" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        The value to be used for the WebProperty specified in the Id attribute.  See
+                        the remarks section for information on acceptable values for each Id.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="WebApplication">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Fragment" />
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Module" />
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Product" />
+            </xs:appinfo>
+            <xs:documentation>Defines properties for a web application. These properties can be used for more than one application defined in a web site or vroot, by defining this element in a common location and referring to it by setting the WebApplication attribute of the WebSite and WebVirtualDir elements.</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element ref="WebApplicationExtension" minOccurs="0" maxOccurs="unbounded"/>
+            </xs:sequence>
+            <xs:attribute name="Id" use="required" type="xs:string"/>
+            <xs:attribute name="Name" use="required" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Sets the name of this application.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Isolation">
+                <xs:annotation>
+                    <xs:documentation>
+                        Sets the application isolation level for this application for pre-IIS 6 applications.
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="low">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Means the application executes within the IIS process.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="medium">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Executes pooled in a separate process.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="high">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Means execution alone in a separate process.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="AllowSessions" type="YesNoDefaultType">
+                <xs:annotation>
+                    <xs:documentation>Sets the Enable Session State option. When enabled, you can set the session timeout using the SessionTimeout attribute.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SessionTimeout" type="xs:integer">
+                <xs:annotation>
+                    <xs:documentation>Sets the timeout value for sessions in minutes.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Buffer" type="YesNoDefaultType">
+                <xs:annotation>
+                    <xs:documentation>Sets the option that enables response buffering in the application, which allows ASP script to set response headers anywhere in the script.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ParentPaths" type="YesNoDefaultType">
+                <xs:annotation>
+                    <xs:documentation>Sets the parent paths option, which allows a client to use relative paths to reach parent directories from this application.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DefaultScript">
+                <xs:annotation>
+                    <xs:documentation>Sets the default script language for the site.</xs:documentation>
+                </xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="VBScript"/>
+                        <xs:enumeration value="JScript"/>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="ScriptTimeout" type="xs:integer">
+                <xs:annotation>
+                    <xs:documentation>Sets the timeout value in seconds for executing ASP scripts.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ServerDebugging" type="YesNoDefaultType">
+                <xs:annotation>
+                    <xs:documentation>Enable ASP server-side script debugging.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ClientDebugging" type="YesNoDefaultType">
+                <xs:annotation>
+                    <xs:documentation>Enable ASP client-side script debugging.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="WebAppPool" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>References the Id attribute of a WebAppPool element to use as the application pool for this application in IIS 6 applications.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="WebAddress">
+        <xs:annotation>
+            <xs:documentation>WebAddress for WebSite</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" use="required" type="xs:string"/>
+            <xs:attribute name="IP" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                      The IP address to locate an existing WebSite or create a new WebSite. When the WebAddress is part of a WebSite element
+                      used to locate an existing web site the following rules are used:
+                      <html:ul>
+                      <html:li>When this attribute is not specified only the “All Unassigned” IP address will be located.</html:li>
+                      <html:li>When this attribute is explicitly specified only the specified IP address will be located.</html:li>
+                      <html:li>When this attribute has the value “*” then any IP address including the “All Unassigned” IP address will be located</html:li>
+                      </html:ul>
+                      When the WebAddress is part of a WebSite element used to create a new web site the following rules are used:
+                      <html:ul>
+                      <html:li>When this attribute is not specified or the value is "*" the "All Unassigned" IP address will be used.</html:li>
+                      <html:li>When this attribute is explicitly specified the IP address will use that value.</html:li>
+                      </html:ul>
+                      The IP attribute can contain a formatted string that is processed at install time to insert the values of properties using
+                      [PropertyName] syntax. 
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Port" use="required" type="xs:string"/>
+            <xs:attribute name="Header" type="xs:string"/>
+            <xs:attribute name="Secure" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Determines if this address represents a secure binding.  The default is 'no'.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="WebVirtualDir">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Component" />
+            </xs:appinfo>
+            <xs:documentation>Defines an IIS virtual directory. When this element is a child of WebSite element, the virtual directory is defined within that web site. Otherwise this virtual directory must reference a WebSite element via the WebSite attribute</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="WebApplication" minOccurs="0" maxOccurs="1" />
+                <xs:element ref="WebDirProperties" minOccurs="0" maxOccurs="1" />
+                <xs:element ref="WebError" minOccurs="0" maxOccurs="unbounded"/>
+                <xs:element ref="WebVirtualDir" minOccurs="0" maxOccurs="unbounded"/>
+                <xs:element ref="HttpHeader" minOccurs="0" maxOccurs="unbounded"/>
+                <xs:element ref="MimeMap" minOccurs="0" maxOccurs="unbounded"/>
+            </xs:choice>
+            <xs:attribute name="Id" use="required" type="xs:string"/>
+            <xs:attribute name="WebSite" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>References the Id attribute for a WebSite in which this virtual directory belongs. Required when this element is not a child of WebSite element.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Alias" use="required" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Sets the application name, which is the URL relative path used to access this virtual directory</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Directory" use="required" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>References the Id attribute for a Directory element that points to the content for this virtual directory.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DirProperties" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        References the Id attribute for a WebDirProperties element that specifies the security and access properties for this virtual directory.
+                        This attribute may not be specified if a WebDirProperties element is directly nested in this element.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="WebApplication" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>References the Id attribute for a WebApplication element that specifies web application settings for this virtual directory.  If a WebApplication child is not specified, the virtual directory does not host web applications.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="WebDir">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Component" />
+            </xs:appinfo>
+            <xs:documentation>Defines a subdirectory within an IIS web site. When this element is a child of WebSite, the web directory is defined within that web site. Otherwise the web directory must reference a WebSite element via the WebSite attribute.</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice>
+                <xs:element ref="WebDirProperties" minOccurs="0"/>
+            </xs:choice>
+            <xs:attribute name="Id" use="required" type="xs:string"/>
+            <xs:attribute name="WebSite" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>References the Id attribute for a WebSite element in which this directory belongs. Required when this element is not a child of a WebSite element.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Path" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>Specifies the name of this web directory.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DirProperties" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        References the Id attribute for a WebDirProperties element that specifies the security and access properties for this web directory.
+                        This attribute may not be specified if a WebDirProperties element is directly nested in this element.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="WebSite">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Component" />
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Fragment" />
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Module" />
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Product" />
+                <xse:remarks>
+                    <html:dl>
+                        <html:dd>Nesting WebSite under a Component element will result in a WebSite being installed to the machine as the package is installed.</html:dd>
+                        <html:dd>
+                            Nesting WebSite under Product, Fragment, or Module
+                            results in a web site "locator" record being created in
+                            the IIsWebSite table.  This means that the web site
+                            itself is neither installed nor uninstalled by the MSI
+                            package.  It does make the database available for referencing
+                            from a WebApplication, WebVirtualDir or WebDir record.  This allows an MSI to install
+                            WebApplications, WebVirtualDirs or WebDirs to already existing web sites on the machine.
+                            The install will fail if the web site does not exist in these cases.
+                        </html:dd>
+                    </html:dl>
+                </xse:remarks>
+            </xs:appinfo>
+            <xs:documentation>IIs Web Site</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="WebAddress" minOccurs="1" maxOccurs="unbounded"/>
+                <xs:element ref="WebApplication" minOccurs="0" maxOccurs="1" />
+                <xs:element ref="WebDirProperties" minOccurs="0" maxOccurs="1" />
+                <xs:element ref="MimeMap" minOccurs="0" maxOccurs="unbounded"/>
+                <xs:element ref="CertificateRef"/>
+                <xs:element ref="HttpHeader"/>
+                <xs:element ref="WebDir"/>
+                <xs:element ref="WebError"/>
+                <xs:element ref="WebFilter"/>
+                <xs:element ref="WebVirtualDir"/>
+            </xs:choice>
+
+            <xs:attribute name="Id" use="required" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Identifier for the WebSite.  Used within the MSI package only.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="AutoStart" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Specifies whether to automatically start the web site.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ConfigureIfExists" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Specifies whether to configure the web site if it already exists.  Note: This will not affect uninstall behavior.  If the web site exists on uninstall, it will be removed.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ConnectionTimeout" type="xs:nonNegativeInteger">
+                <xs:annotation>
+                    <xs:documentation>Sets the timeout value for connections in seconds.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Description" use="required" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>This is the name of the web site that will show up in the IIS management console.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Directory" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Root directory of the web site.  Resolved to a directory in the Directory table at install time by the server custom actions.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DirProperties" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        References the Id attribute for a WebDirProperties element that specifies the security and access properties for this website root directory.
+                        This attribute may not be specified if a WebDirProperties element is directly nested in this element.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Sequence" type="xs:integer">
+                <xs:annotation>
+                    <xs:documentation>Sequence that the web site is to be created in.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SiteId" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                      Optional attribute to directly specify the site id of the WebSite.  Use this to ensure all web
+                      sites in a web garden get the same site id.  If a number is provided, the site id must be unique
+                      on all target machines.  If "*" is used, the Description attribute will be hashed to create a unique
+                      value for the site id. This value must be a positive number or a "*" or a formatted value that resolves
+                      to "-1" (for the same behavior as "*") or a positive number or blank.  If this attribute is absent then
+                      the web site will be located using the WebAddress element associated with the web site.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="StartOnInstall" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Specifies whether to start the web site on install.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="WebApplication" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Reference to a WebApplication that is to be installed as part of this web site.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="WebLog" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Reference to WebLog definition.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="WebLog">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Fragment" />
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Module" />
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Product" />
+            </xs:appinfo>
+            <xs:documentation>WebLog definition.</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" use="required" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Identifier for the WebLog.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Type" use="required">
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="IIS">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Microsoft IIS Log File Format
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="NCSA">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    NCSA Common Log File Format
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="none">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Disables logging.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="ODBC">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    ODBC Logging
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="W3C">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    W3C Extended Log File Format
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="WebServiceExtension">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Component" />
+            </xs:appinfo>
+            <xs:documentation>The WebServiceExtension property is used by the Web server to determine whether a Web service extension is permitted to run.</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" use="required" type="xs:string"/>
+            <xs:attribute name="File" use="required" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Usually a Property that resolves to short file name path</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Description" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Description of the extension.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Group" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>String used to identify groups of extensions.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Allow" use="required" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Indicates if the extension is allowed or denied.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="UIDeletable" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Indicates if the UI is allowed to delete the extension from the list of not.  Default: Not deletable.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:simpleType name="PercentType">
+        <xs:annotation>
+            <xs:documentation>Values of this type are any integers between 0 and 100, inclusive.</xs:documentation>
+        </xs:annotation>
+        <xs:restriction base="xs:nonNegativeInteger">
+            <xs:maxInclusive value="100"/>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:simpleType name="YesNoType">
+        <xs:annotation>
+            <xs:documentation>Values of this type will either be "yes" or "no".</xs:documentation>
+        </xs:annotation>
+        <xs:restriction base='xs:NMTOKEN'>
+            <xs:enumeration value="no"/>
+            <xs:enumeration value="yes"/>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:simpleType name="YesNoDefaultType">
+        <xs:annotation>
+            <xs:documentation>Values of this type will either be "default", "yes", or "no".</xs:documentation>
+        </xs:annotation>
+        <xs:restriction base='xs:NMTOKEN'>
+            <xs:enumeration value="default"/>
+            <xs:enumeration value="no"/>
+            <xs:enumeration value="yes"/>
+        </xs:restriction>
+    </xs:simpleType>
+
+</xs:schema>
diff --git a/doc/lux.xsd b/doc/lux.xsd
new file mode 100644
index 0000000..2bf770c
--- /dev/null
+++ b/doc/lux.xsd
@@ -0,0 +1,228 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+          xmlns:xse="http://schemas.microsoft.com/wix/2005/XmlSchemaExtension"
+         xmlns:html="http://www.w3.org/1999/xhtml"
+    targetNamespace="http://schemas.microsoft.com/wix/2009/Lux"
+              xmlns="http://schemas.microsoft.com/wix/2009/Lux">
+  <xs:annotation>
+    <xs:documentation>
+      Copyright (c) Microsoft Corporation.  All rights reserved.
+            
+            The use and distribution terms for this software are covered by the
+            Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+            which can be found in the file CPL.TXT at the root of this distribution.
+            By using this software in any fashion, you are agreeing to be bound by
+            the terms of this license.
+            
+            You must not remove this notice, or any other, from this software.
+
+      The source code schema for the Windows Installer XML Toolset Lux Extension.
+    </xs:documentation>
+  </xs:annotation>
+
+  <xs:import namespace="http://schemas.microsoft.com/wix/2006/wi" />
+
+    <xs:element name="Mutation">
+        <xs:annotation>
+            <xs:documentation>
+              Test mutations let you author unit tests with different expected results. The mutation 
+              id is passed as the value of the WIXLUX_RUNNING_MUTATION property. Your custom action, 
+              typically in an '#ifdef DEBUG' block, can retrieve the WIXLUX_RUNNING_MUTATION property 
+              and hard-code different behavior based on the mutation. To author test mutations, use 
+              the Mutation element with UnitTest elements as children.            
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Fragment" />
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:annotation>
+                    <xs:documentation>
+                        Child UnitTest elements are validated when the parent mutation is being executed.
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:element ref="UnitTest"/>
+            </xs:choice>
+
+            <xs:attribute name="Id" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Value of the WIXLUX_RUNNING_MUTATION property set by the mutation.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="UnitTest">
+        <xs:annotation>
+            <xs:documentation>
+                Describes a unit test to be executed against a particular custom action, resulting in a
+                particular property value. Single-value properties, multi-value properties, and
+                name/value-pair properties can all be tested declaratively.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2009/Lux" ref="Mutation" />
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Fragment" />
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:annotation>
+                    <xs:documentation>
+                        Child UnitTest elements are used to test multi-value properties. Note that Property
+                        and ValueDelimiter or NameValueDelimiter must be specified in the parent element.
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:element ref="Condition"/>
+                <xs:element ref="Expression"/>
+                <xs:element ref="UnitTest"/>
+            </xs:choice>
+
+            <xs:attribute name="Id" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Identifier of the unit test. If you omit this attribute, a stable identifier is generated for you.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+
+            <xs:attribute name="CustomAction" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Identifier of the custom action to be tested.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+
+            <xs:attribute name="Property" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Name of the property set by the custom action.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+
+            <xs:attribute name="Operator" default="equal">
+                <xs:annotation>
+                    <xs:documentation>
+                        The operator to apply to the property and value. Default is "equal."
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="equal">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    (Default) Compares Property to Value and succeeds if they are equal.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="notEqual">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Compares Property to Value and succeeds if they are NOT equal.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="caseInsensitiveEqual">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Compares Property to Value and succeeds if they are equal (ignoring case).
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="caseInsensitiveNotEqual">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Compares Property to Value and succeeds if they are NOT equal (ignoring case).
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+
+            <xs:attribute name="Value" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        The value to compare to the property.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+
+            <xs:attribute name="ValueSeparator" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        One character that is used to separate values in a multi-value property.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+
+            <xs:attribute name="NameValueSeparator" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        One character that is used to separate values in a name/value-pair multi-value property.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+
+            <xs:attribute name="Index" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        A formatted string that evaluates to either an integer index into a multi-value property or a string name of a name/value-pair multi-value property.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Condition">
+    <xs:annotation>
+      <xs:documentation>
+        Conditions for a unit test.
+      </xs:documentation>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:simpleContent>
+        <xs:extension base="xs:string" />
+      </xs:simpleContent>
+    </xs:complexType>
+  </xs:element>
+
+  <xs:element name="Expression">
+    <xs:annotation>
+      <xs:documentation>
+        An expression that must evaluate to true to succeed. Cannot be specified if Property is specified.
+      </xs:documentation>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:simpleContent>
+        <xs:extension base="xs:string" />
+      </xs:simpleContent>
+    </xs:complexType>
+  </xs:element>
+
+  <xs:element name="UnitTestRef">
+    <xs:annotation>
+      <xs:documentation>
+        Identifies a unit test to be linked into a project.
+      </xs:documentation>
+      <xs:appinfo>
+        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Fragment" />
+        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Product" />
+      </xs:appinfo>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:attribute name="Id" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>
+            Identifier of the unit test to be included.
+          </xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+
+</xs:schema>
\ No newline at end of file
diff --git a/doc/msmq.xsd b/doc/msmq.xsd
new file mode 100644
index 0000000..3299399
--- /dev/null
+++ b/doc/msmq.xsd
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:html="http://www.w3.org/1999/xhtml"
+            xmlns:wix="http://schemas.microsoft.com/wix/2006/wi"
+             xmlns:xs="http://www.w3.org/2001/XMLSchema"
+            xmlns:xse="http://schemas.microsoft.com/wix/2005/XmlSchemaExtension"
+      targetNamespace="http://schemas.microsoft.com/wix/MsmqExtension"
+                xmlns="http://schemas.microsoft.com/wix/MsmqExtension">
+  <xs:annotation>
+    <xs:documentation>
+      Copyright (c) Microsoft Corporation.  All rights reserved.
+
+      The use and distribution terms for this software are covered by the
+      Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+      which can be found in the file CPL.TXT at the root of this distribution.
+      By using this software in any fashion, you are agreeing to be bound by
+      the terms of this license.
+
+      You must not remove this notice, or any other, from this software.
+
+      The source code schema for the Windows Installer XML Toolset MSMQ Extension.
+    </xs:documentation>
+  </xs:annotation>
+
+  <xs:import namespace="http://schemas.microsoft.com/wix/2006/wi" />
+
+  <xs:element name="MessageQueue">
+    <xs:annotation><xs:documentation>
+    </xs:documentation>
+      <xs:appinfo>
+        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Component" />
+      </xs:appinfo>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="MessageQueuePermission" minOccurs="0" maxOccurs="unbounded" />
+      </xs:sequence>
+      <xs:attribute name="Id" use="required" type="xs:string">
+        <xs:annotation><xs:documentation>
+        </xs:documentation></xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Authenticate" use="optional" type="YesNoType">
+        <xs:annotation><xs:documentation>
+          Default: No.
+        </xs:documentation></xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="BasePriority" use="optional" type="xs:integer" />
+      <xs:attribute name="Journal" use="optional" type="YesNoType">
+        <xs:annotation><xs:documentation>
+          Default: No.
+        </xs:documentation></xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="JournalQuota" use="optional" type="xs:integer" />
+      <xs:attribute name="Label" use="required" type="xs:string" />
+      <xs:attribute name="MulticastAddress" use="optional" type="xs:string" />
+      <xs:attribute name="PathName" use="required" type="xs:string" />
+      <xs:attribute name="PrivLevel" use="optional">
+        <xs:simpleType>
+          <xs:restriction base="xs:NMTOKEN">
+            <xs:enumeration value="none" />
+            <xs:enumeration value="optional" />
+            <xs:enumeration value="body" />
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="Quota" use="optional" type="xs:integer" />
+      <xs:attribute name="Transactional" use="optional" type="YesNoType">
+        <xs:annotation><xs:documentation>
+          Default: No.
+        </xs:documentation></xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="ServiceTypeGuid" use="optional" type="xs:string" />
+    </xs:complexType>
+  </xs:element>
+
+  <xs:element name="MessageQueuePermission">
+    <xs:annotation><xs:documentation>
+    </xs:documentation>
+      <xs:appinfo>
+        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Component" />
+      </xs:appinfo>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:attribute name="Id" use="required" type="xs:string">
+        <xs:annotation><xs:documentation>
+        </xs:documentation></xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="MessageQueue" use="optional" type="xs:string">
+        <xs:annotation><xs:documentation>
+        </xs:documentation></xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="User" use="optional" type="xs:string">
+        <xs:annotation><xs:documentation>
+        </xs:documentation></xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Group" use="optional" type="xs:string">
+        <xs:annotation><xs:documentation>
+        </xs:documentation></xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="DeleteMessage" use="optional" type="YesNoType" />
+      <xs:attribute name="PeekMessage" use="optional" type="YesNoType" />
+      <xs:attribute name="WriteMessage" use="optional" type="YesNoType" />
+      <xs:attribute name="DeleteJournalMessage" use="optional" type="YesNoType" />
+      <xs:attribute name="SetQueueProperties" use="optional" type="YesNoType" />
+      <xs:attribute name="GetQueueProperties" use="optional" type="YesNoType" />
+      <xs:attribute name="DeleteQueue" use="optional" type="YesNoType" />
+      <xs:attribute name="GetQueuePermissions" use="optional" type="YesNoType" />
+      <xs:attribute name="ChangeQueuePermissions" use="optional" type="YesNoType" />
+      <xs:attribute name="TakeQueueOwnership" use="optional" type="YesNoType" />
+      <xs:attribute name="ReceiveMessage" use="optional" type="YesNoType" />
+      <xs:attribute name="ReceiveJournalMessage" use="optional" type="YesNoType" />
+      <xs:attribute name="QueueGenericRead" use="optional" type="YesNoType" />
+      <xs:attribute name="QueueGenericWrite" use="optional" type="YesNoType" />
+      <xs:attribute name="QueueGenericExecute" use="optional" type="YesNoType" />
+      <xs:attribute name="QueueGenericAll" use="optional" type="YesNoType" />
+    </xs:complexType>
+  </xs:element>
+
+  <xs:simpleType name="YesNoType">
+    <xs:annotation>
+      <xs:documentation>Values of this type will either be "yes" or "no".</xs:documentation>
+    </xs:annotation>
+    <xs:restriction base="xs:NMTOKEN">
+      <xs:enumeration value="no" />
+      <xs:enumeration value="yes" />
+    </xs:restriction>
+  </xs:simpleType>
+
+</xs:schema>
diff --git a/doc/netfx.xsd b/doc/netfx.xsd
new file mode 100644
index 0000000..7121eca
--- /dev/null
+++ b/doc/netfx.xsd
@@ -0,0 +1,207 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+          xmlns:xse="http://schemas.microsoft.com/wix/2005/XmlSchemaExtension"
+         xmlns:html="http://www.w3.org/1999/xhtml"
+    targetNamespace="http://schemas.microsoft.com/wix/NetFxExtension"
+              xmlns="http://schemas.microsoft.com/wix/NetFxExtension">
+    <xs:annotation>
+        <xs:documentation>
+            Copyright (c) Microsoft Corporation.  All rights reserved.
+            
+            The use and distribution terms for this software are covered by the
+            Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+            which can be found in the file CPL.TXT at the root of this distribution.
+            By using this software in any fashion, you are agreeing to be bound by
+            the terms of this license.
+            
+            You must not remove this notice, or any other, from this software.
+
+            The source code schema for the Windows Installer XML Toolset .NET Framework Extension.
+        </xs:documentation>
+    </xs:annotation>
+
+    <xs:element name="NativeImage">
+        <xs:annotation>
+            <xs:documentation>
+                Improves the performance of managed applications by creating native images.
+                Requires the .NET Framework 2.0 or newer to be installed on the target machine since
+                it runs <html:a href="http://msdn2.microsoft.com/en-us/library/6t9t5wcf.aspx">NGen</html:a>.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="File" />
+                <xse:remarks>
+                    Native images are files containing compiled processor-specific machine code, which
+                    are installed into the native image cache on the local computer. The runtime
+                    can use native images from the cache instead using the just-in-time (JIT)
+                    compiler to compile the original assembly.
+                    The native image custom actions are configured to ignore failures so that failing
+                    to generate or remove a native image will not cause setup to fail and roll back.
+                </xse:remarks>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>
+                        The identifier for this NativeImage.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="AppBaseDirectory" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        The identifier of the directory to use for locating dependent assemblies.
+                        For DLL assemblies and assemblies installed to the Global Assembly Cache (GAC),
+                        this attribute should be set to the directory of the application which loads this
+                        assembly.  For EXE assemblies, this attribute does not need to be set because NGen
+                        will use the directory of the assembly file by default.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="AssemblyApplication" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        The identifier of the application which will load this assembly.
+                        For DLL assemblies which are loaded via reflection, this attribute should
+                        be set to indicate the application which will load this assembly.
+                        The configuration of the application (usually specified via an exe.config file) will be used
+                        to determine how to resolve dependencies for this assembly.
+                        When a shared component is loaded at run time, using the Load method, the
+                        application's configuration file determines the dependencies that are loaded
+                        for the shared component — for example, the version of a dependency that is loaded.
+                        This attribute gives guidance on which dependencies would be loaded at run time in order
+                        to figure out which dependency assemblies will also need to have native images generated
+                        (assuming the Dependency attribute is not set to "no").
+                        This attribute cannot be set if the AssemblyApplication attribute is set on the parent
+                        File element (please note that these attributes both refer to the same application
+                        assembly but do very different things: specifiying File/@AssemblyApplication will force
+                        an assembly to install to a private location next to the indicated application, whereas
+                        this AssemblyApplication attribute will be used to help resolve dependent assemblies
+                        while generating native images for this assembly).
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Debug" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>
+                        Set to "yes" to generate native images that can be used under a debugger.
+                        The default value is "no".
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Dependencies" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>
+                        Set to "no" to generate the minimum number of native images.
+                        The default value is "yes".
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Platform">
+                <xs:annotation>
+                    <xs:documentation>
+                        Sets the platform(s) for which native images will be generated.
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="32bit">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Attempt to generate native images only for the 32-bit version of the .NET Framework
+                                    on the target machine.  If the 32-bit version of the .NET Framework 2.0 or newer is not
+                                    present on the target machine, native image custom actions will not be scheduled.
+                                    This is the default value.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="64bit">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Attempt to generate native images only for the 64-bit version of the .NET Framework
+                                    on the target machine.  If a 64-bit version of the .NET Framework 2.0 or newer is not
+                                    present on the target machine, native image custom actions will not be scheduled.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="all">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Attempt to generate native images for the 32-bit and 64-bit versions of the .NET Framework
+                                    on the target machine.  If a version of the .NET Framework 2.0 or newer is not present on the
+                                    target machine for a processor architecture, native image custom actions will not be
+                                    scheduled for that processor architecture.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="Priority">
+                <xs:annotation>
+                    <xs:documentation>
+                        Sets the priority of generating the native images for this assembly.
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="0">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    This is the highest priority, it means that image generation occurs syncronously
+                                    during the setup process.  This option will slow down setup performance.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="1">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    This will queue image generation to the NGen service to occur immediately.
+                                    This option will slow down setup performance.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="2">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    This will queue image generation to the NGen service to occur after all priority 1
+                                    assemblies have completed.
+                                    This option will slow down setup performance.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="3">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    This is the lowest priority, it will queue image generation to occur when the
+                                    machine is idle.
+                                    This option should not slow down setup performance.
+                                    This is the default value.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="Profile" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>
+                        Set to "yes" to generate native images that can be used under a profiler.
+                        The default value is "no".
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:simpleType name="YesNoType">
+        <xs:annotation>
+            <xs:documentation>Values of this type will either be "yes" or "no".</xs:documentation>
+        </xs:annotation>
+        <xs:restriction base='xs:NMTOKEN'>
+            <xs:enumeration value="no"/>
+            <xs:enumeration value="yes"/>
+        </xs:restriction>
+    </xs:simpleType>
+
+</xs:schema>
diff --git a/doc/ps.xsd b/doc/ps.xsd
new file mode 100644
index 0000000..0ef768f
--- /dev/null
+++ b/doc/ps.xsd
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+          xmlns:xse="http://schemas.microsoft.com/wix/2005/XmlSchemaExtension"
+         xmlns:html="http://www.w3.org/1999/xhtml"
+          xmlns:wix="http://schemas.microsoft.com/wix/2006/wi"
+    targetNamespace="http://schemas.microsoft.com/wix/PSExtension"
+              xmlns="http://schemas.microsoft.com/wix/PSExtension">
+  <xs:annotation>
+    <xs:documentation>
+      Copyright (c) Microsoft Corporation.  All rights reserved.
+
+      The use and distribution terms for this software are covered by the
+      Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+      which can be found in the file CPL.TXT at the root of this distribution.
+      By using this software in any fashion, you are agreeing to be bound by
+      the terms of this license.
+
+      You must not remove this notice, or any other, from this software.
+
+      The source code schema for the Windows Installer XML Toolset PowerShell Extension.
+    </xs:documentation>
+  </xs:annotation>
+  <xs:import namespace="http://schemas.microsoft.com/wix/2006/wi" />
+  <xs:element name="FormatsFile">
+    <xs:annotation>
+      <xs:documentation>
+        Identifies the parent File as a formats XML file for the referenced PowerShell snap-in.
+      </xs:documentation>
+      <xs:appinfo>
+        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="File" />
+        <xse:remarks>
+          A formats XML file that defines output formats for objects on the pipeline.
+        </xse:remarks>
+      </xs:appinfo>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:attribute name="FileId" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>
+            Reference to the formats File ID. This is required when nested under the SnapIn element.
+          </xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="SnapIn" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>
+            Reference to the PowerShell snap-in ID for which this formats file is associated. This is required when nested under the File element.
+          </xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="TypesFile">
+    <xs:annotation>
+      <xs:documentation>
+        Identifies the parent File as a types XML file for the referenced PowerShell snap-in.
+      </xs:documentation>
+      <xs:appinfo>
+        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="File" />
+        <xse:remarks>
+          A types XML file used by the extensible type system.
+        </xse:remarks>
+      </xs:appinfo>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:attribute name="FileId" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>
+            Reference to the types File ID. This is required when nested under the SnapIn element.
+          </xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="SnapIn" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>
+            Reference to the PowerShell snap-in ID for which this types file is associated. This is required when nested under the File element.
+          </xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="SnapIn">
+    <xs:annotation>
+      <xs:documentation>
+        Identifies the parent File as a PowerShell snap-in to be registered on the system.
+      </xs:documentation>
+      <xs:appinfo>
+        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="File" />
+        <xse:remarks>
+          <html:a href="http://www.microsoft.com/powershell">PowerShell</html:a> snap-ins
+          allow developers to extend the functionality of of the PowerShell engine.
+          Add this element to identify the parent File as a PowerShell snap-in that will
+          get registered on the system.
+        </xse:remarks>
+      </xs:appinfo>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="FormatsFile" />
+        <xs:element ref="TypesFile" />
+      </xs:choice>
+      <xs:attribute name="Id" type="xs:string" use="required">
+        <xs:annotation>
+          <xs:documentation>
+            The identifier for this PowerShell snap-in.
+          </xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="AssemblyName" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>
+            The fully-qualified name of the assembly.
+          </xs:documentation>
+          <xs:appinfo>
+            <xse:deprecated />
+          </xs:appinfo>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="CustomSnapInType" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>
+            The full type name of a class that is used to register a list of cmdlets and providers.
+          </xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Description" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>
+            A brief description of the snap-in.
+          </xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="DescriptionIndirect" type="EmbeddedResource">
+        <xs:annotation>
+          <xs:documentation>
+            An embedded resource that contains a brief description of the snap-in.
+            This resource must be embedded in the current snap-in assembly.
+          </xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="RequiredPowerShellVersion" type="VersionType">
+        <xs:annotation>
+          <xs:documentation>
+            The required version of PowerShell that must be installed and is associated with the
+            snap-in registration. The default value is "1.0".
+          </xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Vendor" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>
+            The name of the snap-in vendor.
+          </xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="VendorIndirect" type="EmbeddedResource">
+        <xs:annotation>
+          <xs:documentation>
+            An embedded resource that contains the name of the snap-in vendor.
+            This resource must be embedded in the current snap-in assembly.
+          </xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Version" type="VersionType">
+        <xs:annotation>
+          <xs:documentation>
+            The version of the snapin. If not specified, this is taken from the assembly name.
+          </xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:attribute name="RequiredVersion" type="xs:string">
+    <xs:annotation>
+      <xs:documentation>
+        The version of this extension required to compile the defining source.
+      </xs:documentation>
+      <xs:appinfo>
+        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Wix" />
+      </xs:appinfo>
+    </xs:annotation>
+  </xs:attribute>
+  <xs:simpleType name="EmbeddedResource">
+    <xs:annotation>
+      <xs:documentation>
+        <html:p>
+          Values should be in the format <html:i>ResourceName,StringName</html:i>, where <html:i>ResourceName</html:i>
+          is the name of the embedded resource in your assembly sans the ".resources" extension, and <html:i>StringName</html:i>
+          is the name of the string resource in the embedded resource.
+        </html:p>
+        <html:p>
+          Example: UtilityMshSnapInResources,Description
+        </html:p>
+      </xs:documentation>
+    </xs:annotation>
+    <xs:restriction base="xs:string" />
+  </xs:simpleType>
+  <xs:simpleType name="VersionType">
+    <xs:annotation>
+      <xs:documentation>
+        Values of this type will look like: "x", "x.x", "x.x.x", or "x.x.x.x" where x is an integer from 0 to 65534.
+      </xs:documentation>
+    </xs:annotation>
+    <xs:restriction base="xs:string">
+      <xs:pattern value="\d{1,5}(\.\d{1,5}){0,3}"/>
+    </xs:restriction>
+  </xs:simpleType>
+</xs:schema>
diff --git a/doc/sql.xsd b/doc/sql.xsd
new file mode 100644
index 0000000..55c2481
--- /dev/null
+++ b/doc/sql.xsd
@@ -0,0 +1,349 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:html="http://www.w3.org/1999/xhtml"
+            xmlns:wix="http://schemas.microsoft.com/wix/2006/wi"
+             xmlns:xs="http://www.w3.org/2001/XMLSchema"
+            xmlns:xse="http://schemas.microsoft.com/wix/2005/XmlSchemaExtension"
+      targetNamespace="http://schemas.microsoft.com/wix/SqlExtension"
+                xmlns="http://schemas.microsoft.com/wix/SqlExtension">
+    <xs:annotation>
+        <xs:documentation>
+            Copyright (c) Microsoft Corporation.  All rights reserved.
+            
+            The use and distribution terms for this software are covered by the
+            Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+            which can be found in the file CPL.TXT at the root of this distribution.
+            By using this software in any fashion, you are agreeing to be bound by
+            the terms of this license.
+            
+            You must not remove this notice, or any other, from this software.
+
+            The source code schema for the Windows Installer XML Toolset SQL Server Extension.
+        </xs:documentation>
+    </xs:annotation>
+
+    <xs:import namespace="http://schemas.microsoft.com/wix/2006/wi" />
+
+    <xs:element name="SqlDatabase">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Component" />
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Fragment" />
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Module" />
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Product" />
+                <xse:remarks>
+                    <html:dl>
+                        <html:dd>Nesting SqlDatabase under a Component element will result in a SqlDatabase being installed to the machine as the package is installed.</html:dd>
+                        <html:dd>
+                            Nesting SqlDatabase under Product, Fragment, or Module
+                            results in a database "locator" record being created in
+                            the SqlDatabase table.  This means that the database
+                            itself is neither installed nor uninstalled by the MSI
+                            package.  It does make the database available for referencing
+                            from a SqlString or SqlScript record.  This allows MSI to install
+                            SqlScripts or SqlStrings to already existing databases on the machine.
+                            The install will fail if the database does not exist in these cases.
+                        </html:dd>
+                        <html:dd>
+                            The User attribute references credentials specified in a User element.
+                            If a user is not specified then Windows Authentication will be used by default
+                            using the credentials of the user performing the install to execute sql
+                            strings, etc.
+                        </html:dd>
+                    </html:dl>
+                </xse:remarks>
+                <xse:seeAlso ref="User"/>
+            </xs:appinfo>
+            <xs:documentation>SQL Database</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:sequence>
+                  <xs:element ref="SqlFileSpec" minOccurs="0"/>
+                  <xs:element ref="SqlLogFileSpec" minOccurs="0"/>
+                </xs:sequence>
+                <xs:element ref="SqlScript"/>
+                <xs:element ref="SqlString"/>
+            </xs:choice>
+            <xs:attribute name="Id" use="required" type="xs:string"/>
+            <xs:attribute name="Server" use="required" type="xs:string">
+            </xs:attribute>
+            <xs:attribute name="Instance" type="xs:string">
+            </xs:attribute>
+            <xs:attribute name="Database" use="required" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        The name of the database. The value can be a literal value or derived from a
+                        Property element using the <html:a href='http://msdn.microsoft.com/library/aa368609.aspx' target='_blank'>Formatted</html:a>
+                        syntax.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="User" type="xs:string">
+            </xs:attribute>
+            <xs:attribute name="CreateOnInstall" type="YesNoType">
+            </xs:attribute>
+            <xs:attribute name="CreateOnReinstall" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>
+                        Specifies whether to create the database when the associated component is reinstalled.  Setting CreateOnInstall to yes does <html:b>not</html:b> imply CreateOnReinstall is set to yes.  CreateOnReinstall must be set in addition to CreateOnInstall for it to be created during both install and reinstall.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="CreateOnUninstall" type="YesNoType">
+            </xs:attribute>
+            <xs:attribute name="DropOnInstall" type="YesNoType">
+            </xs:attribute>
+            <xs:attribute name="DropOnReinstall" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>
+                        Specifies whether to drop the database when the associated component is reinstalled.  Setting DropOnInstall to yes does <html:b>not</html:b> imply DropOnReinstall is set to yes.  DropOnReinstall must be set in addition to DropOnInstall for it to be dropped during both install and reinstall.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DropOnUninstall" type="YesNoType">
+            </xs:attribute>
+            <xs:attribute name="ContinueOnError" type="YesNoType">
+            </xs:attribute>
+            <xs:attribute name="ConfirmOverwrite" type="YesNoType">
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="SqlFileSpec">
+        <xs:annotation>
+            <xs:documentation>File specification for a Sql database.</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" use="required" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>ID of the file specification.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Name" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Specifies the logical name for the database file.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Filename" use="required" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Specifies the operating-system file name for the database file.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Size" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Specifies the size of the database file. The GB, MB and KB suffixes can be used to specify gigabytes, 
+                        megabytes or kilobytes. The default is megabytes if no suffix is specified. When a Size is not 
+                        supplied for a database file, SQL Server uses the size of the primary file in the model database. 
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="MaxSize" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Specifies the maximum size to which the database file can grow. The GB, MB and KB suffixes can be used to 
+                        to specify gigabytes, megabytes or kilobytes. The default is megabytes if no suffix is specified. If 
+                        MaxSize is not specified, the file will grow until the disk is full.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="GrowthSize" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Specifies the growth increment of the database file. The GB, MB and KB and % suffixes can be used to 
+                        specify gigabytes, megabytes, kilobytes or a percentage of the current file size to grow. The default is 
+                        megabytes if no suffix is specified. The default value is 10% if GrowthSize is not specified, and the 
+                        minimum value is 64 KB. The GrowthSize setting for a file cannot exceed the MaxSize setting.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="SqlLogFileSpec">
+        <xs:annotation>
+            <xs:documentation>File specification for a Sql database.</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>ID of the log file specification.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Name" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Specifies the logical name for the log file.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Filename" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Specifies the operating-system file name for the log file.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Size" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Specifies the size of the log file. The GB, MB and KB suffixes can be used to specify gigabytes, 
+                        megabytes or kilobytes. The default is megabytes if no suffix is specified. When a Size is not 
+                        supplied for a log file, SQL Server makes the file 1 MB.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="MaxSize" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Specifies the maximum size to which the log file can grow. The GB, MB and KB suffixes can be used to 
+                        to specify gigabytes, megabytes or kilobytes. The default is megabytes if no suffix is specified. If 
+                        MaxSize is not specified, the file will grow until the disk is full.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="GrowthSize" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Specifies the growth increment of the log file. The GB, MB and KB and % suffixes can be used to 
+                        specify gigabytes, megabytes, kilobytes or a percentage of the current file size to grow. The default is 
+                        megabytes if no suffix is specified. The default value is 10% if GrowthSize is not specified, and the 
+                        minimum value is 64 KB. The GrowthSize setting for a file cannot exceed the MaxSize setting.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="SqlScript">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Component" />
+            </xs:appinfo>
+            <xs:documentation>SQL Script</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" use="required" type="xs:string"/>
+            <xs:attribute name="SqlDb" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>required when not child of SqlDatabase</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="User" type="xs:string">
+            </xs:attribute>
+            <xs:attribute name="BinaryKey" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>Reference to Binary stream that contains the SQL script to execute.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ExecuteOnInstall" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Specifies to execute the script when the associated component is installed.  This attribute is mutually exclusive with the RollbackOnInstall, RollbackOnReinstall and RollbackOnUninstall attributes.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ExecuteOnReinstall" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Specifies whether to execute the script when the associated component is reinstalled.  Setting ExecuteOnInstall to yes does <html:b>not</html:b> imply ExecuteOnReinstall is set to yes.  ExecuteOnReinstall must be set in addition to ExecuteOnInstall for it to be executed during both install and reinstall.  This attribute is mutually exclusive with the RollbackOnInstall, RollbackOnReinstall and RollbackOnUninstall attributes.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ExecuteOnUninstall" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Specifies to execute the script when the associated component is uninstalled.  This attribute is mutually exclusive with the RollbackOnInstall, RollbackOnReinstall and RollbackOnUninstall attributes.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="RollbackOnInstall" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Specifies whether to execute the script on rollback if an attempt is made to install the associated component.  This attribute is mutually exclusive with the ExecuteOnInstall, ExecuteOnReinstall and ExecuteOnUninstall attributes.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="RollbackOnReinstall" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Specifies whether to execute the script on rollback if an attempt is made to reinstall the associated component.  This attribute is mutually exclusive with the ExecuteOnInstall, ExecuteOnReinstall and ExecuteOnUninstall attributes.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="RollbackOnUninstall" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Specifies whether to execute the script on rollback if an attempt is made to uninstall the associated component.  This attribute is mutually exclusive with the ExecuteOnInstall, ExecuteOnReinstall and ExecuteOnUninstall attributes.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ContinueOnError" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Continue executing scripts even if this one fails.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Sequence" type="xs:integer">
+                <xs:annotation>
+                    <xs:documentation>Specifes the order to run the SQL Scripts.  It is recommended that rollback scripts be scheduled before their complementary execution script.  This order is also relative across the SqlString element.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="SqlString">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Component" />
+            </xs:appinfo>
+            <xs:documentation>SQL String</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" use="required" type="xs:string">
+            </xs:attribute>
+            <xs:attribute name="SQL" use="required" type="xs:string">
+            </xs:attribute>
+            <xs:attribute name="User" type="xs:string">
+            </xs:attribute>
+            <xs:attribute name="SqlDb" type="xs:string">
+            </xs:attribute>
+            <xs:attribute name="ExecuteOnInstall" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Specifies to execute the string when the associated component is installed.  This attribute is mutually exclusive with the RollbackOnInstall, RollbackOnReinstall and RollbackOnUninstall attributes.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ExecuteOnReinstall" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>
+                        Specifies whether to execute the string when the associated component is reinstalled.  Setting ExecuteOnInstall to yes does <html:b>not</html:b> imply ExecuteOnReinstall is set to yes.  ExecuteOnReinstall must be set in addition to ExecuteOnInstall for it to be executed during both install and reinstall.  This attribute is mutually exclusive with the RollbackOnInstall, RollbackOnReinstall and RollbackOnUninstall attributes.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ExecuteOnUninstall" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Specifies to execute the string when the associated component is uninstalled.  This attribute is mutually exclusive with the RollbackOnInstall, RollbackOnReinstall and RollbackOnUninstall attributes.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="RollbackOnInstall" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Specifies whether to execute the string on rollback if an attempt is made to install the associated component.  This attribute is mutually exclusive with the ExecuteOnInstall, ExecuteOnReinstall and ExecuteOnUninstall attributes.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="RollbackOnReinstall" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Specifies whether to execute the string on rollback if an attempt is made to reinstall the associated component.  This attribute is mutually exclusive with the ExecuteOnInstall, ExecuteOnReinstall and ExecuteOnUninstall attributes.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="RollbackOnUninstall" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Specifies whether to execute the string on rollback if an attempt is made to uninstall the associated component.  This attribute is mutually exclusive with the ExecuteOnInstall, ExecuteOnReinstall and ExecuteOnUninstall attributes.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ContinueOnError" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Continue executing strings even if this one fails.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Sequence" type="xs:integer">
+                <xs:annotation>
+                    <xs:documentation>Specifes the order to run the SQL Strings.  It is recommended that rollback strings be scheduled before their complementary execution string.  This order is also relative across the SqlScript element.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:simpleType name="YesNoType">
+        <xs:annotation>
+            <xs:documentation>Values of this type will either be "yes" or "no".</xs:documentation>
+        </xs:annotation>
+        <xs:restriction base='xs:NMTOKEN'>
+            <xs:enumeration value="no"/>
+            <xs:enumeration value="yes"/>
+        </xs:restriction>
+    </xs:simpleType>
+
+</xs:schema>
diff --git a/doc/util.xsd b/doc/util.xsd
new file mode 100644
index 0000000..77d10d6
--- /dev/null
+++ b/doc/util.xsd
@@ -0,0 +1,1130 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:html="http://www.w3.org/1999/xhtml" xmlns:wix="http://schemas.microsoft.com/wix/2006/wi" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xse="http://schemas.microsoft.com/wix/2005/XmlSchemaExtension" targetNamespace="http://schemas.microsoft.com/wix/UtilExtension" xmlns="http://schemas.microsoft.com/wix/UtilExtension">
+  <xs:annotation>
+    <xs:documentation>
+            Copyright (c) Microsoft Corporation.  All rights reserved.
+            
+            The use and distribution terms for this software are covered by the
+            Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+            which can be found in the file CPL.TXT at the root of this distribution.
+            By using this software in any fashion, you are agreeing to be bound by
+            the terms of this license.
+            
+            You must not remove this notice, or any other, from this software.
+
+            The source code schema for the Windows Installer XML Toolset Utility Extension.
+        </xs:documentation>
+  </xs:annotation>
+  <xs:import namespace="http://schemas.microsoft.com/wix/2006/wi" />
+  <xs:element name="CloseApplication">
+    <xs:annotation>
+      <xs:appinfo>
+        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Product" />
+        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Module" />
+        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Fragment" />
+      </xs:appinfo>
+      <xs:documentation>Closes applications or schedules a reboot if application cannot be closed.</xs:documentation>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:simpleContent>
+        <xs:extension base="xs:string">
+          <xs:annotation>
+            <xs:documentation>
+                            Condition that determines if the application should be closed.  Must be blank or evaluate to true
+                            for the application to be scheduled for closing.
+                        </xs:documentation>
+          </xs:annotation>
+          <xs:attribute name="Id" type="xs:string" use="required">
+            <xs:annotation>
+              <xs:documentation>Identifier for the close application (primary key).</xs:documentation>
+            </xs:annotation>
+          </xs:attribute>
+          <xs:attribute name="Target" type="xs:string" use="required">
+            <xs:annotation>
+              <xs:documentation>Name of the exectuable to be closed.  This should only be file name.</xs:documentation>
+            </xs:annotation>
+          </xs:attribute>
+          <xs:attribute name="Description" type="xs:string">
+            <xs:annotation>
+              <xs:documentation>Description to show if application is running and needs to be closed.</xs:documentation>
+            </xs:annotation>
+          </xs:attribute>
+          <xs:attribute name="Sequence" type="xs:integer">
+            <xs:annotation>
+              <xs:documentation>Optionally orders the applications to be closed.</xs:documentation>
+            </xs:annotation>
+          </xs:attribute>
+          <xs:attribute name="CloseMessage" type="YesNoType">
+            <xs:annotation>
+              <xs:documentation>Optionally sends a close message to the application. Default is no.</xs:documentation>
+            </xs:annotation>
+          </xs:attribute>
+          <xs:attribute name="ElevatedCloseMessage" type="YesNoType">
+            <xs:annotation>
+              <xs:documentation>Optionally sends a close message to the application from deffered action without impersonation. Default is no.</xs:documentation>
+            </xs:annotation>
+          </xs:attribute>
+          <xs:attribute name="RebootPrompt" type="YesNoType">
+            <xs:annotation>
+              <xs:documentation>Optionally prompts for reboot if application is still running. Default is yes.</xs:documentation>
+            </xs:annotation>
+          </xs:attribute>
+          <xs:attribute name="Property" type="xs:string">
+            <xs:annotation>
+              <xs:documentation>Property to be set if application is still running. Useful for launch conditions or to conditionalize custom UI to ask user to shut down apps.</xs:documentation>
+            </xs:annotation>
+          </xs:attribute>
+        </xs:extension>
+      </xs:simpleContent>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="EventSource">
+    <xs:annotation>
+      <xs:appinfo>
+        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Component" />
+      </xs:appinfo>
+      <xs:documentation>Creates an event source.</xs:documentation>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:attribute name="CategoryCount" type="xs:integer">
+        <xs:annotation>
+          <xs:documentation>
+                        The number of categories in CategoryMessageFile. CategoryMessageFile
+                        must be specified too.
+                    </xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="CategoryMessageFile" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>
+                        Name of the category message file. CategoryCount must be specified too.
+                        Note that this is a formatted field, so you can use [#fileId] syntax to
+                        refer to a file being installed. It is also written as a REG_EXPAND_SZ
+                        string, so you can use %environment_variable% syntax to refer to a file
+                        already present on the user's machine.
+                    </xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="EventMessageFile" type="xs:string" use="required">
+        <xs:annotation>
+          <xs:documentation>
+                        Name of the event message file.
+                        Note that this is a formatted field, so you can use [#fileId] syntax to
+                        refer to a file being installed. It is also written as a REG_EXPAND_SZ
+                        string, so you can use %environment_variable% syntax to refer to a file
+                        already present on the user's machine.
+                    </xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="KeyPath" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>
+                        Marks the EventSource registry as the key path of the component it belongs to.
+                    </xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Log" type="xs:string" use="required">
+        <xs:annotation>
+          <xs:documentation>Name of the event source's log.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Name" type="xs:string" use="required">
+        <xs:annotation>
+          <xs:documentation>Name of the event source.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="ParameterMessageFile" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>
+                        Name of the parameter message file.
+                        Note that this is a formatted field, so you can use [#fileId] syntax to
+                        refer to a file being installed. It is also written as a REG_EXPAND_SZ
+                        string, so you can use %environment_variable% syntax to refer to a file
+                        already present on the user's machine.
+                    </xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="SupportsErrors" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>
+                        Equivalent to EVENTLOG_ERROR_TYPE.
+                    </xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="SupportsFailureAudits" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>
+                        Equivalent to EVENTLOG_AUDIT_FAILURE.
+                    </xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="SupportsInformationals" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>
+                        Equivalent to EVENTLOG_INFORMATION_TYPE.
+                    </xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="SupportsSuccessAudits" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>
+                        Equivalent to EVENTLOG_AUDIT_SUCCESS.
+                    </xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="SupportsWarnings" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>
+                        Equivalent to EVENTLOG_WARNING_TYPE.
+                    </xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="FileShare">
+    <xs:annotation>
+      <xs:appinfo>
+        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Component" />
+      </xs:appinfo>
+      <xs:documentation>Creates a file share out of the component's directory.</xs:documentation>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="FileSharePermission" minOccurs="1" maxOccurs="unbounded">
+          <xs:annotation>
+            <xs:documentation>ACL permission</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+      <xs:attribute name="Id" type="xs:string" use="required">
+        <xs:annotation>
+          <xs:documentation>Identifier for the file share (primary key).</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Name" type="xs:string" use="required">
+        <xs:annotation>
+          <xs:documentation>Name of the file share.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Description" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>Description of the file share.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="FileSharePermission">
+    <xs:annotation>
+      <xs:documentation>
+                Sets ACLs on a FileShare.  This element has no Id attribute.
+                The table and key are taken from the parent element.
+            </xs:documentation>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:attribute name="User" use="required" type="xs:string"></xs:attribute>
+      <!-- Common ACLs -->
+      <xs:attribute name="Read" type="YesNoType"></xs:attribute>
+      <xs:attribute name="Delete" type="YesNoType"></xs:attribute>
+      <xs:attribute name="ReadPermission" type="YesNoType"></xs:attribute>
+      <xs:attribute name="ChangePermission" type="YesNoType"></xs:attribute>
+      <xs:attribute name="TakeOwnership" type="YesNoType"></xs:attribute>
+      <!-- Folder and File ACLs -->
+      <xs:attribute name="ReadAttributes" type="YesNoType"></xs:attribute>
+      <xs:attribute name="WriteAttributes" type="YesNoType"></xs:attribute>
+      <xs:attribute name="ReadExtendedAttributes" type="YesNoType"></xs:attribute>
+      <xs:attribute name="WriteExtendedAttributes" type="YesNoType"></xs:attribute>
+      <xs:attribute name="Synchronize" type="YesNoType"></xs:attribute>
+      <!-- Folder only ACLs -->
+      <xs:attribute name="CreateFile" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>For a directory, the right to create a file in the directory.  Only valid under a 'CreateFolder' parent.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="CreateChild" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>For a directory, the right to create a subdirectory.  Only valid under a 'CreateFolder' parent.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="DeleteChild" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>For a directory, the right to delete a directory and all the files it contains, including read-only files.  Only valid under a 'CreateFolder' parent.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Traverse" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>For a directory, the right to traverse the directory.  By default, users are assigned the BYPASS_TRAVERSE_CHECKING privilege, which ignores the FILE_TRAVERSE access right.  Only valid under a 'CreateFolder' parent.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <!-- Generic ACLs, mapped by system to appropriate permissions -->
+      <xs:attribute name="GenericAll" type="YesNoType"></xs:attribute>
+      <xs:attribute name="GenericExecute" type="YesNoType"></xs:attribute>
+      <xs:attribute name="GenericWrite" type="YesNoType"></xs:attribute>
+      <xs:attribute name="GenericRead" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>specifying this will fail to grant read access</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="Group">
+    <xs:annotation>
+      <xs:appinfo>
+        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Fragment" />
+        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Module" />
+        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Product" />
+      </xs:appinfo>
+      <xs:documentation>
+                Finds user groups on the local machine or specified Active Directory domain. The local machine will be
+                searched for the group first then fallback to looking in Active Directory. This element is not capable
+                of creating new groups but can be used to add new or existing users to an existing group.
+            </xs:documentation>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:attribute name="Id" type="xs:string" use="required">
+        <xs:annotation>
+          <xs:documentation>Unique identifier in your installation package for this group.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Name" type="xs:string" use="required">
+        <xs:annotation>
+          <xs:documentation>A <html:a href="http://msdn.microsoft.com/library/aa368609.aspx" target="_blank">Formatted</html:a> string that contains the name of the group to be found.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Domain" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>An optional <html:a href="http://msdn.microsoft.com/library/aa368609.aspx" target="_blank">Formatted</html:a> string that specifies the domain for the group.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="GroupRef">
+    <xs:annotation>
+      <xs:documentation>Used to join a user to a group</xs:documentation>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:attribute name="Id" type="xs:string" use="required" />
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="InternetShortcut">
+    <xs:annotation>
+      <xs:appinfo>
+        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Component" />
+        <xse:howtoRef href="create_internet_shortcut.htm">How To: Create a shortcut to a webpage</xse:howtoRef>
+      </xs:appinfo>
+      <xs:documentation>Creates a shortcut to a URL.</xs:documentation>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:attribute name="Id" type="xs:string" use="required">
+        <xs:annotation>
+          <xs:documentation>Unique identifier in your installation package for this Internet shortcut.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Directory" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>Identifier reference to Directory element where shortcut is to be created. This attribute's value defaults to the parent Component directory.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Name" type="xs:string" use="required">
+        <xs:annotation>
+          <xs:documentation>
+                        The name of the shortcut file, which is visible to the user. (The .lnk 
+                        extension is added automatically and by default, is not shown to the user.)
+                    </xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Target" type="xs:string" use="required">
+        <xs:annotation>
+          <xs:documentation>
+                        URL that should be opened when the user selects the shortcut. Windows
+                        opens the URL in the appropriate handler for the protocol specified 
+                        in the URL. Note that this is a formatted field, so you can use 
+                        [#fileId] syntax to refer to a file being installed (using the file: 
+                        protocol).
+                    </xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Type">
+        <xs:annotation>
+          <xs:documentation>Which type of shortcut should be created.</xs:documentation>
+        </xs:annotation>
+        <xs:simpleType>
+          <xs:restriction base="xs:NMTOKEN">
+            <xs:enumeration value="url">
+              <xs:annotation>
+                <xs:documentation>Creates .url files using IUniformResourceLocatorW.</xs:documentation>
+              </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="link">
+              <xs:annotation>
+                <xs:documentation>Creates .lnk files using IShellLinkW (default).</xs:documentation>
+              </xs:annotation>
+            </xs:enumeration>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="PerformanceCategory">
+    <xs:annotation>
+      <xs:appinfo>
+        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Component" />
+      </xs:appinfo>
+      <xs:documentation>Used to create performance categories and configure performance counters.</xs:documentation>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="PerformanceCounter" minOccurs="0" maxOccurs="unbounded" />
+      </xs:sequence>
+      <xs:attribute name="Id" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>Unique identifier in your installation package for this performance counter category.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Name" type="xs:string" use="optional">
+        <xs:annotation>
+          <xs:documentation>Name for the performance counter category.  If this attribute is not provided the Id attribute is used as the name of the performance counter category.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Help" type="xs:string" use="optional">
+        <xs:annotation>
+          <xs:documentation>Optional help text for the performance counter category.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="MultiInstance" type="YesNoType" use="optional">
+        <xs:annotation>
+          <xs:documentation>Flag that specifies whether the performance counter category is multi or single instanced.  Default is single instance.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Library" type="xs:string" use="optional">
+        <xs:annotation>
+          <xs:documentation>DLL that contains the performance counter.  The default is "netfxperf.dll" which should be used for all managed code performance counters.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Open" type="xs:string" use="optional">
+        <xs:annotation>
+          <xs:documentation>Function entry point in to the Library DLL called when opening the performance counter.  The default is "OpenPerformanceData" which should be used for all managed code performance counters.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Close" type="xs:string" use="optional">
+        <xs:annotation>
+          <xs:documentation>Function entry point in to the Library DLL called when closing the performance counter.  The default is "ClosePerformanceData" which should be used for all managed code performance counters.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Collect" type="xs:string" use="optional">
+        <xs:annotation>
+          <xs:documentation>Function entry point in to the Library DLL called when collecting data from the performance counter.  The default is "CollectPerformanceData" which should be used for all managed code performance counters.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="DefaultLanguage" type="PerformanceCounterLanguageType">
+        <xs:annotation>
+          <xs:documentation>Default language for the performance category and contained counters' names and help text.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="PerformanceCounter">
+    <xs:annotation>
+      <xs:documentation>Creates a performance counter in a performance category.</xs:documentation>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:attribute name="Name" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>Name for the performance counter.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Help" type="xs:string" use="optional">
+        <xs:annotation>
+          <xs:documentation>Optional help text for the performance counter.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Type" type="PerformanceCounterTypesType">
+        <xs:annotation>
+          <xs:documentation>Type of the performance counter.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Language" type="PerformanceCounterLanguageType" use="optional">
+        <xs:annotation>
+          <xs:documentation>Language for the peformance counter name and help.  The default is to use the parent PerformanceCategory element's DefaultLanguage attribute.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="PerfCounter">
+    <xs:annotation>
+      <xs:appinfo>
+        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="File" />
+        <xse:deprecated ref="PerformanceCounter" />
+      </xs:appinfo>
+      <xs:documentation>Used to install Perfmon counters.</xs:documentation>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:attribute name="Name" type="xs:string" />
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="PerfCounterManifest">
+    <xs:annotation>
+      <xs:appinfo>
+        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="File" />
+      </xs:appinfo>
+      <xs:documentation>Used to install Perfmon Counter Manifests.</xs:documentation>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:attribute name="ResourceFileDirectory" type="xs:string" use="optional">
+        <xs:annotation>
+          <xs:documentation>The directory that holds the resource file of the providers in the perfmon counter manifest. Often the resource file path cannot be determined until setup time. Put the directory here and during perfmon manifest registrtion the path will be updated in the registry. If not specified, Perfmon will look for the resource file in the same directory of the perfmon counter manifest file.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="EventManifest">
+    <xs:annotation>
+      <xs:appinfo>
+        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="File" />
+      </xs:appinfo>
+      <xs:documentation>Used to install Event Manifests.</xs:documentation>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:attribute name="MessageFile" type="xs:string" use="optional">
+        <xs:annotation>
+          <xs:documentation>The message file (including path) of all the providers in the event manifest. Often the message file path cannot be determined until setup time. Put your MessageFile here and the messageFileName attribute of the all the providers in the manifest will be updated with the path before it is registered. </xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="ParameterFile" type="xs:string" use="optional">
+        <xs:annotation>
+          <xs:documentation>The parameter file (including path) of all the providers in the event manifest. Often the parameter file path cannot be determined until setup time. Put your ParameterFile here and the parameterFileName attribute of the all the providers in the manifest will be updated with the path before it is registered. </xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="ResourceFile" type="xs:string" use="optional">
+        <xs:annotation>
+          <xs:documentation>The resource file (including path) of all the providers in the event manifest. Often the resource file path cannot be determined until setup time. Put your ResourceFile here and the resourceFileName attribute of the all the providers in the manifest will be updated with the path before it is registered. </xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="PermissionEx">
+    <xs:annotation>
+      <xs:documentation>
+                Sets ACLs on File, Registry, CreateFolder, or ServiceInstall.  When under a Registry element, this cannot be used
+                if the Action attribute's value is remove or removeKeyOnInstall.  This element has no Id attribute.
+                The table and key are taken from the parent element. To use PermissionEx with an IA-64 MSI, you must
+                compile all of your source files with the "-arch ia64" switch, to ensure the IA-64 custom action is used, and not
+                the x64 custom action.
+            </xs:documentation>
+      <xs:appinfo>
+        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="CreateFolder" />
+        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="File" />
+        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Registry" />
+        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="RegistryKey" />
+        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="RegistryValue" />
+      </xs:appinfo>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:attribute name="Domain" type="xs:string"></xs:attribute>
+      <xs:attribute name="User" use="required" type="xs:string"></xs:attribute>
+      <!-- Common ACLs -->
+      <xs:attribute name="Read" type="YesNoType"></xs:attribute>
+      <xs:attribute name="Delete" type="YesNoType"></xs:attribute>
+      <xs:attribute name="ReadPermission" type="YesNoType"></xs:attribute>
+      <xs:attribute name="ChangePermission" type="YesNoType"></xs:attribute>
+      <xs:attribute name="TakeOwnership" type="YesNoType"></xs:attribute>
+      <!-- Folder and File ACLs -->
+      <xs:attribute name="ReadAttributes" type="YesNoType"></xs:attribute>
+      <xs:attribute name="WriteAttributes" type="YesNoType"></xs:attribute>
+      <xs:attribute name="ReadExtendedAttributes" type="YesNoType"></xs:attribute>
+      <xs:attribute name="WriteExtendedAttributes" type="YesNoType"></xs:attribute>
+      <xs:attribute name="Synchronize" type="YesNoType"></xs:attribute>
+      <!-- Folder only ACLs -->
+      <xs:attribute name="CreateFile" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>For a directory, the right to create a file in the directory.  Only valid under a 'CreateFolder' parent.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="CreateChild" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>For a directory, the right to create a subdirectory.  Only valid under a 'CreateFolder' parent.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="DeleteChild" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>For a directory, the right to delete a directory and all the files it contains, including read-only files.  Only valid under a 'CreateFolder' parent.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Traverse" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>For a directory, the right to traverse the directory.  By default, users are assigned the BYPASS_TRAVERSE_CHECKING privilege, which ignores the FILE_TRAVERSE access right.  Only valid under a 'CreateFolder' parent.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <!-- File only ACLs -->
+      <xs:attribute name="Append" type="YesNoType"></xs:attribute>
+      <xs:attribute name="Execute" type="YesNoType"></xs:attribute>
+      <!-- File and Registry ACLs -->
+      <xs:attribute name="Write" type="YesNoType"></xs:attribute>
+      <!-- Registry only ACLs -->
+      <xs:attribute name="CreateSubkeys" type="YesNoType"></xs:attribute>
+      <xs:attribute name="EnumerateSubkeys" type="YesNoType"></xs:attribute>
+      <xs:attribute name="Notify" type="YesNoType"></xs:attribute>
+      <xs:attribute name="CreateLink" type="YesNoType"></xs:attribute>
+      <!-- Generic ACLs, mapped by system to appropriate permissions -->
+      <xs:attribute name="GenericAll" type="YesNoType"></xs:attribute>
+      <xs:attribute name="GenericExecute" type="YesNoType"></xs:attribute>
+      <xs:attribute name="GenericWrite" type="YesNoType"></xs:attribute>
+      <xs:attribute name="GenericRead" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>specifying this will fail to grant read access</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <!-- Service only ACLs -->
+      <xs:attribute name="ServiceQueryConfig" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>Required to call the QueryServiceConfig and QueryServiceConfig2 functions to query the service configuration.  Only valid under a 'ServiceInstall' parent.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="ServiceChangeConfig" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>Required to call the ChangeServiceConfig or ChangeServiceConfig2 function to change the service configuration.  Only valid under a 'ServiceInstall' parent.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="ServiceQueryStatus" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>Required to call the QueryServiceStatus function to ask the service control manager about the status of the service.  Only valid under a 'ServiceInstall' parent.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="ServiceEnumerateDependents" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>Required to call the EnumDependentServices function to enumerate all the services dependent on the service.  Only valid under a 'ServiceInstall' parent.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="ServiceStart" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>Required to call the StartService function to start the service.  Only valid under a 'ServiceInstall' parent.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="ServiceStop" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>Required to call the ControlService function to stop the service.  Only valid under a 'ServiceInstall' parent.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="ServicePauseContinue" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>Required to call the ControlService function to pause or continue the service.  Only valid under a 'ServiceInstall' parent.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="ServiceInterrogate" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>Required to call the ControlService function to ask the service to report its status immediately.  Only valid under a 'ServiceInstall' parent.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="ServiceUserDefinedControl" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>Required to call the ControlService function to specify a user-defined control code.  Only valid under a 'ServiceInstall' parent.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="RestartResource">
+    <xs:annotation>
+      <xs:documentation>Registers a resource with the Restart Manager.</xs:documentation>
+      <xs:appinfo>
+          <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Component" />
+          <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Fragment" />
+          <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Module" />
+          <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Product" />
+      </xs:appinfo>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:attribute name="Id" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>The unique identifier for this resource. A unique identifier will
+                    be generated automatically if not specified.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Path" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>The full path to the process module to register with the Restart Manager.
+                    This can be a formatted value that resolves to a full path.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="ProcessName" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>The name of a process to register with the Restart Manager.
+                    This can be a formatted value that resolves to a process name.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="ServiceName" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>The name of a Windows service to register with the Restart Manager.
+                    This can be a formatted value that resolves to a service name.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="ServiceConfig">
+    <xs:annotation>
+      <xs:documentation>Service configuration information for failure actions.</xs:documentation>
+      <xs:appinfo>
+        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Component" />
+        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="ServiceInstall" />
+        <xse:remarks>
+          <html:dl>
+            <html:dd>Nesting a ServiceConfig element under a ServiceInstall element will result in the service being installed to be configured.</html:dd>
+            <html:dd>Nesting a ServiceConfig element under a component element will result in an already installed service to be configured.  If the service does not exist prior to the install of the MSI package, the install will fail.</html:dd>
+          </html:dl>
+        </xse:remarks>
+      </xs:appinfo>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:attribute name="ServiceName" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>Required if not under a ServiceInstall element.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="FirstFailureActionType" use="required">
+        <xs:annotation>
+          <xs:documentation>Action to take on the first failure of the service.</xs:documentation>
+        </xs:annotation>
+        <xs:simpleType>
+          <xs:restriction base="xs:NMTOKEN">
+            <xs:enumeration value="none" />
+            <xs:enumeration value="reboot" />
+            <xs:enumeration value="restart" />
+            <xs:enumeration value="runCommand" />
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="SecondFailureActionType" use="required">
+        <xs:annotation>
+          <xs:documentation>Action to take on the second failure of the service.</xs:documentation>
+        </xs:annotation>
+        <xs:simpleType>
+          <xs:restriction base="xs:NMTOKEN">
+            <xs:enumeration value="none" />
+            <xs:enumeration value="reboot" />
+            <xs:enumeration value="restart" />
+            <xs:enumeration value="runCommand" />
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="ThirdFailureActionType" use="required">
+        <xs:annotation>
+          <xs:documentation>Action to take on the third failure of the service.</xs:documentation>
+        </xs:annotation>
+        <xs:simpleType>
+          <xs:restriction base="xs:NMTOKEN">
+            <xs:enumeration value="none" />
+            <xs:enumeration value="reboot" />
+            <xs:enumeration value="restart" />
+            <xs:enumeration value="runCommand" />
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="ResetPeriodInDays" type="xs:integer">
+        <xs:annotation>
+          <xs:documentation>Number of days after which to reset the failure count to zero if there are no failures.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="RestartServiceDelayInSeconds" type="xs:integer">
+        <xs:annotation>
+          <xs:documentation>If any of the three *ActionType attributes is "restart", this specifies the number of seconds to wait before doing so.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="ProgramCommandLine" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>If any of the three *ActionType attributes is "runCommand", this specifies the command to run when doing so.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="RebootMessage" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>If any of the three *ActionType attributes is "reboot", this specifies the message to broadcast to server users before doing so.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="User">
+    <xs:annotation>
+      <xs:documentation>User for all kinds of things.  When it is not nested under a component it is included in the MSI so it can be referenced by other elements such as the User attribute in the AppPool element.  When it is nested under a Component element, the User will be created on install and can also be used for reference.</xs:documentation>
+      <xs:appinfo>
+        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Component" />
+        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Fragment" />
+        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Module" />
+        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Product" />
+        <xse:seeAlso ref="Group" />
+        <xse:seeAlso ref="GroupRef" />
+      </xs:appinfo>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="GroupRef" minOccurs="0" maxOccurs="unbounded" />
+      </xs:sequence>
+      <xs:attribute name="Id" type="xs:string" use="required" />
+      <xs:attribute name="Name" use="required" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>A <a href="http://msdn2.microsoft.com/library/aa368609.aspx" target="_blank">Formatted</a> string that contains the name of the user account.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Domain" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>A <a href="http://msdn2.microsoft.com/library/aa368609.aspx" target="_blank">Formatted</a> string that contains the local machine or Active Directory domain for the user.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Password" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>Usually a Property that is passed in on the command-line to keep it more secure.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="PasswordNeverExpires" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>The account's password never expires. Equivalent to UF_DONT_EXPIRE_PASSWD.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="CanNotChangePassword" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>The user cannot change the account's password. Equivalent to UF_PASSWD_CANT_CHANGE.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="RemoveOnUninstall" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>Indicates whether the user account should be removed or left behind on uninstall.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="FailIfExists" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>Indicates if the install should fail if the user already exists.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="LogonAsService" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>Indicates whether or not the user can logon as a serivce.  User creation can be skipped if all that is desired is to set this access right on the user.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="UpdateIfExists" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>Indicates if the user account properties should be updated if the user already exists.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="PasswordExpired" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>Indicates whether the user must change their password on their first login.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Disabled" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>The account is disabled. Equivalent to UF_ACCOUNTDISABLE.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="CreateUser" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>Indicates whether or not to create the user.  User creation can be skipped if all that is desired is to join a user to groups.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="XmlFile">
+    <xs:annotation>
+      <xs:documentation>
+                Adds or removes .xml file entries.  If you use the XmlFile element you must reference WixUtilExtension.dll as it contains the XmlFile custom actions.
+            </xs:documentation>
+      <xs:appinfo>
+        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Component" />
+      </xs:appinfo>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:attribute name="Id" use="required" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>Identifier for xml file modification.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="ElementPath" use="required" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>The XPath of the element to be modified.  Note that this is a formatted field and therefore, square brackets in the XPath must be escaped. In addition, XPaths allow backslashes to be used to escape characters, so if you intend to include literal backslashes, you must escape them as well by doubling them in this attribute. The string is formatted by MSI first, and the result is consumed as the XPath.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="File" use="required" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>Path of the .xml file to configure.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Name" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>Name of XML node to set/add to the specified element.  Not setting this attribute causes the element's text value to be set.  Otherwise this specified the attribute name that is set.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Value" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>
+                        The value to be written.  See the <html:a href="http://msdn.microsoft.com/library/aa368609(VS.85).aspx" target="_blank">Formatted topic</html:a> for information how to escape square brackets in the value.
+                    </xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Action" use="required">
+        <xs:annotation>
+          <xs:documentation>The type of modification to be made to the XML file when the component is installed.</xs:documentation>
+        </xs:annotation>
+        <xs:simpleType>
+          <xs:restriction base="xs:NMTOKEN">
+            <xs:enumeration value="createElement">
+              <xs:annotation>
+                <xs:documentation>Creates a new element under the element specified in ElementPath.  The Name attribute is required in this case and specifies the name of the new element.  The Value attribute is not necessary when createElement is specified as the action.  If the Value attribute is set, it will cause the new element's text value to be set.</xs:documentation>
+              </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="deleteValue">
+              <xs:annotation>
+                <xs:documentation>Deletes a value from the element specified in the ElementPath.  If Name is specified, the attribute with that name is deleted.  If Name is not specified, the text value of the element specified in the ElementPath is deleted.  The Value attribute is ignored if deleteValue is the action specified.</xs:documentation>
+              </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="setValue">
+              <xs:annotation>
+                <xs:documentation>Sets a value in the element specified in the ElementPath.  If Name is specified, and attribute with that name is set to the value specified in Value.  If Name is not specified, the text value of the element is set.  Value is a required attribute if setValue is the action specified.</xs:documentation>
+              </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="bulkSetValue">
+              <xs:annotation>
+                <xs:documentation>Sets all the values in the elements that match the ElementPath.  If Name is specified, attributes with that name are set to the same value specified in Value.  If Name is not specified, the text values of the elements are set.  Value is a required attribute if setBulkValue is the action specified.</xs:documentation>
+              </xs:annotation>
+            </xs:enumeration>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="Permanent" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>Specifies whether or not the modification should be removed on uninstall.  This has no effect on uninstall if the action was deleteValue.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="PreserveModifiedDate" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>Specifies wheter or not the modification should preserve the modified date.  Preserving the modified date will allow the file to be patched if no other modifications have been made.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Sequence" use="optional" type="xs:integer">
+        <xs:annotation>
+          <xs:documentation>Specifies the order in which the modification is to be attempted on the XML file.  It is important to ensure that new elements are created before you attempt to add an attribute to them.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="SelectionLanguage">
+        <xs:annotation>
+          <xs:documentation>
+                        Specify whether the DOM object should use XPath language or the old XSLPattern language (default) as the query language.                        
+                    </xs:documentation>
+        </xs:annotation>
+        <xs:simpleType>
+          <xs:restriction base="xs:NMTOKEN">
+            <xs:enumeration value="XPath" />
+            <xs:enumeration value="XSLPattern" />
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="XmlConfig">
+    <xs:annotation>
+      <xs:documentation>
+                Adds or removes .xml file entries.  If you use the XmlConfig element you must reference WixUtilExtension.dll as it contains the XmlConfig custom actions.
+            </xs:documentation>
+      <xs:appinfo>
+        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Component" />
+      </xs:appinfo>
+    </xs:annotation>
+    <xs:complexType mixed="true">
+      <xs:sequence>
+        <xs:element ref="XmlConfig" minOccurs="0" maxOccurs="unbounded" />
+      </xs:sequence>
+      <xs:attribute name="Id" use="required" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>Identifier for xml file modification.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Action">
+        <xs:simpleType>
+          <xs:restriction base="xs:NMTOKEN">
+            <xs:enumeration value="create" />
+            <xs:enumeration value="delete" />
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="ElementId" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>The Id of another XmlConfig to add attributes to.  In this case, the 'Action' 'Node' and 'On' attributes must be left unspecified.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="ElementPath" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>The XPath of the parent element being modified.  Note that this is a formatted field and therefore, square brackets in the XPath must be escaped. In addition, XPaths allow backslashes to be used to escape characters, so if you intend to include literal backslashes, you must escape them as well by doubling them in this attribute. The string is formatted by MSI first, and the result is consumed as the XPath.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="File" use="required" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>Path of the .xml file to configure.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Name" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>Name of XML node to set/add to the specified element.  Not setting this attribute causes the element's text value to be set.  Otherwise this specified the attribute name that is set.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Node">
+        <xs:simpleType>
+          <xs:restriction base="xs:NMTOKEN">
+            <xs:enumeration value="element" />
+            <xs:enumeration value="value" />
+            <xs:enumeration value="document" />
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="On">
+        <xs:simpleType>
+          <xs:restriction base="xs:NMTOKEN">
+            <xs:enumeration value="install" />
+            <xs:enumeration value="uninstall" />
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="PreserveModifiedDate" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>Specifies wheter or not the modification should preserve the modified date.  Preserving the modified date will allow the file to be patched if no other modifications have been made.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Sequence" use="optional" type="xs:integer">
+        <xs:annotation>
+          <xs:documentation>Specifies the order in which the modification is to be attempted on the XML file.  It is important to ensure that new elements are created before you attempt to add an attribute to them.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Value" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>
+                        The value to be written.  See the <html:a href="http://msdn.microsoft.com/library/aa368609(VS.85).aspx" target="_blank">Formatted topic</html:a> for information how to escape square brackets in the value.
+                    </xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="VerifyPath" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>The XPath to the element being modified.  This is required for 'delete' actions.  For 'create' actions, VerifyPath is used to decide if the element already exists. Note that this is a formatted field and therefore, square brackets in the XPath must be escaped. In addition, XPaths allow backslashes to be used to escape characters, so if you intend to include literal backslashes, you must escape them as well by doubling them in this attribute. The string is formatted by MSI first, and the result is consumed as the XPath.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:simpleType name="YesNoType">
+    <xs:annotation>
+      <xs:documentation>Values of this type will either be "yes" or "no".</xs:documentation>
+    </xs:annotation>
+    <xs:restriction base="xs:NMTOKEN">
+      <xs:enumeration value="no" />
+      <xs:enumeration value="yes" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:simpleType name="PerformanceCounterLanguageType">
+    <xs:annotation>
+      <xs:documentation>Enumeration of valid languages for performance counters.</xs:documentation>
+    </xs:annotation>
+    <xs:restriction base="xs:NMTOKEN">
+      <xs:enumeration value="afrikaans" />
+      <xs:enumeration value="albanian" />
+      <xs:enumeration value="arabic" />
+      <xs:enumeration value="armenian" />
+      <xs:enumeration value="assamese" />
+      <xs:enumeration value="azeri" />
+      <xs:enumeration value="basque" />
+      <xs:enumeration value="belarusian" />
+      <xs:enumeration value="bengali" />
+      <xs:enumeration value="bulgarian" />
+      <xs:enumeration value="catalan" />
+      <xs:enumeration value="chinese" />
+      <xs:enumeration value="croatian" />
+      <xs:enumeration value="czech" />
+      <xs:enumeration value="danish" />
+      <xs:enumeration value="divehi" />
+      <xs:enumeration value="dutch" />
+      <xs:enumeration value="english" />
+      <xs:enumeration value="estonian" />
+      <xs:enumeration value="faeroese" />
+      <xs:enumeration value="farsi" />
+      <xs:enumeration value="finnish" />
+      <xs:enumeration value="french" />
+      <xs:enumeration value="galician" />
+      <xs:enumeration value="georgian" />
+      <xs:enumeration value="german" />
+      <xs:enumeration value="greek" />
+      <xs:enumeration value="gujarati" />
+      <xs:enumeration value="hebrew" />
+      <xs:enumeration value="hindi" />
+      <xs:enumeration value="hungarian" />
+      <xs:enumeration value="icelandic" />
+      <xs:enumeration value="indonesian" />
+      <xs:enumeration value="italian" />
+      <xs:enumeration value="japanese" />
+      <xs:enumeration value="kannada" />
+      <xs:enumeration value="kashmiri" />
+      <xs:enumeration value="kazak" />
+      <xs:enumeration value="konkani" />
+      <xs:enumeration value="korean" />
+      <xs:enumeration value="kyrgyz" />
+      <xs:enumeration value="latvian" />
+      <xs:enumeration value="lithuanian" />
+      <xs:enumeration value="macedonian" />
+      <xs:enumeration value="malay" />
+      <xs:enumeration value="malayalam" />
+      <xs:enumeration value="manipuri" />
+      <xs:enumeration value="marathi" />
+      <xs:enumeration value="mongolian" />
+      <xs:enumeration value="nepali" />
+      <xs:enumeration value="norwegian" />
+      <xs:enumeration value="oriya" />
+      <xs:enumeration value="polish" />
+      <xs:enumeration value="portuguese" />
+      <xs:enumeration value="punjabi" />
+      <xs:enumeration value="romanian" />
+      <xs:enumeration value="russian" />
+      <xs:enumeration value="sanskrit" />
+      <xs:enumeration value="serbian" />
+      <xs:enumeration value="sindhi" />
+      <xs:enumeration value="slovak" />
+      <xs:enumeration value="slovenian" />
+      <xs:enumeration value="spanish" />
+      <xs:enumeration value="swahili" />
+      <xs:enumeration value="swedish" />
+      <xs:enumeration value="syriac" />
+      <xs:enumeration value="tamil" />
+      <xs:enumeration value="tatar" />
+      <xs:enumeration value="telugu" />
+      <xs:enumeration value="thai" />
+      <xs:enumeration value="turkish" />
+      <xs:enumeration value="ukrainian" />
+      <xs:enumeration value="urdu" />
+      <xs:enumeration value="uzbek" />
+      <xs:enumeration value="vietnamese" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:simpleType name="PerformanceCounterTypesType">
+    <xs:annotation>
+      <xs:documentation>Enumeration of valid types for performance counters.</xs:documentation>
+    </xs:annotation>
+    <xs:restriction base="xs:NMTOKEN">
+      <xs:enumeration value="averageBase" />
+      <xs:enumeration value="averageCount64" />
+      <xs:enumeration value="averageTimer32" />
+      <xs:enumeration value="counterDelta32" />
+      <xs:enumeration value="counterTimerInverse" />
+      <xs:enumeration value="sampleFraction" />
+      <xs:enumeration value="timer100Ns" />
+      <xs:enumeration value="counterTimer" />
+      <xs:enumeration value="rawFraction" />
+      <xs:enumeration value="timer100NsInverse" />
+      <xs:enumeration value="counterMultiTimer" />
+      <xs:enumeration value="counterMultiTimer100Ns" />
+      <xs:enumeration value="counterMultiTimerInverse" />
+      <xs:enumeration value="counterMultiTimer100NsInverse" />
+      <xs:enumeration value="elapsedTime" />
+      <xs:enumeration value="sampleBase" />
+      <xs:enumeration value="rawBase" />
+      <xs:enumeration value="counterMultiBase" />
+      <xs:enumeration value="rateOfCountsPerSecond64" />
+      <xs:enumeration value="rateOfCountsPerSecond32" />
+      <xs:enumeration value="countPerTimeInterval64" />
+      <xs:enumeration value="countPerTimeInterval32" />
+      <xs:enumeration value="sampleCounter" />
+      <xs:enumeration value="counterDelta64" />
+      <xs:enumeration value="numberOfItems64" />
+      <xs:enumeration value="numberOfItems32" />
+      <xs:enumeration value="numberOfItemsHEX64" />
+      <xs:enumeration value="numberOfItemsHEX32" />
+    </xs:restriction>
+  </xs:simpleType>
+</xs:schema>
\ No newline at end of file
diff --git a/doc/vs.xsd b/doc/vs.xsd
new file mode 100644
index 0000000..a8a73bd
--- /dev/null
+++ b/doc/vs.xsd
@@ -0,0 +1,209 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+          xmlns:xse="http://schemas.microsoft.com/wix/2005/XmlSchemaExtension"
+    targetNamespace="http://schemas.microsoft.com/wix/VSExtension"
+              xmlns="http://schemas.microsoft.com/wix/VSExtension">
+    <xs:annotation>
+        <xs:documentation>
+            Copyright (c) Microsoft Corporation.  All rights reserved.
+            
+            The use and distribution terms for this software are covered by the
+            Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+            which can be found in the file CPL.TXT at the root of this distribution.
+            By using this software in any fashion, you are agreeing to be bound by
+            the terms of this license.
+            
+            You must not remove this notice, or any other, from this software.
+
+            The source code schema for the Windows Installer XML Toolset Visual Studio Extension.
+        </xs:documentation>
+    </xs:annotation>
+
+    <xs:element name="HelpCollection">
+        <xs:annotation>
+            <xs:documentation>
+                Help Namespace for a help collection.  The parent file is the key for the HxC (Collection) file.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="File" />
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="HelpFileRef" />
+                <xs:element ref="HelpFilterRef" />
+                <xs:element ref="PlugCollectionInto" />
+            </xs:choice>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Primary Key for HelpNamespace.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Description" type="xs:string">
+                <xs:annotation><xs:documentation>Friendly name for Namespace.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Name" use="required" type="xs:string">
+                <xs:annotation><xs:documentation>Internal Microsoft Help ID for this Namespace.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SuppressCustomActions" type="YesNoType">
+                <xs:annotation><xs:documentation>Suppress linking Help registration custom actions.  Help redistributable merge modules will be required.  Use this when building a merge module.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="HelpFilter">
+        <xs:annotation>
+            <xs:documentation>
+                Filter for Help Namespace.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Fragment" />
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Module" />
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Product" />
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" use="required" type="xs:string">
+                <xs:annotation><xs:documentation>Primary Key for HelpFilter.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="FilterDefinition" type="xs:string">
+                <xs:annotation><xs:documentation>Query String for Help Filter.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Name" use="required" type="xs:string">
+                <xs:annotation><xs:documentation>Friendly name for Filter.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SuppressCustomActions" type="YesNoType">
+                <xs:annotation><xs:documentation>Suppress linking Help registration custom actions.  Help redistributable merge modules will be required.  Use this when building a merge module.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="HelpFile">
+        <xs:annotation>
+            <xs:documentation>
+                File for Help Namespace.  The parent file is the key for HxS (Title) file.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="File" />
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" use="required" type="xs:string">
+                <xs:annotation><xs:documentation>Primary Key for HelpFile Table.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="AttributeIndex" type="xs:string">
+                <xs:annotation><xs:documentation>Key for HxR (Attributes) file.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Index" type="xs:string">
+                <xs:annotation><xs:documentation>Key for HxI (Index) file.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Language" use="required" type="xs:integer">
+                <xs:annotation><xs:documentation>Language ID for content file.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Name" use="required" type="xs:string">
+                <xs:annotation><xs:documentation>Internal Microsoft Help ID for this HelpFile.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SampleLocation" type="xs:string">
+                <xs:annotation><xs:documentation>Key for a file that is in the "root" of the samples directory for this HelpFile.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Search" type="xs:string">
+                <xs:annotation><xs:documentation>Key for HxQ (Query) file.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SuppressCustomActions" type="YesNoType">
+                <xs:annotation><xs:documentation>Suppress linking Help registration custom actions.  Help redistributable merge modules will be required.  Use this when building a merge module.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="PlugCollectionInto">
+        <xs:annotation><xs:documentation>Plugin for Help Namespace.</xs:documentation></xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Attributes" type="xs:string">
+                <xs:annotation><xs:documentation>Key for HxA (Attributes) file of child namespace.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="TableOfContents" type="xs:string">
+                <xs:annotation><xs:documentation>Key for HxT  file of child namespace.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="TargetCollection" use="required" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    Foriegn Key into HelpNamespace table for the parent namespace into which the child will be inserted.
+                    The following special keys can be used to plug into external namespaces defined outside of the installer.
+                      MS_VSIPCC_v80 : Visual Studio 2005
+                      MS.VSIPCC.v90 : Visual Studio 2008
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="TargetTableOfContents" type="xs:string">
+                <xs:annotation><xs:documentation>Key for HxT  file of parent namespace that now includes the new child namespace.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="TargetFeature" type="xs:string">
+                <xs:annotation><xs:documentation>Key for the feature parent of this help collection.  Required only when plugging into external namespaces.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SuppressExternalNamespaces" type="YesNoType">
+                <xs:annotation><xs:documentation>Suppress linking Visual Studio Help namespaces.  Help redistributable merge modules will be required.  Use this when building a merge module.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="HelpFileRef">
+        <xs:annotation><xs:documentation>Create a reference to a HelpFile element in another Fragment.</xs:documentation></xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" use="required" type="xs:string">
+                <xs:annotation><xs:documentation>Primary Key for HelpFile Table.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:anyAttribute namespace="##other" processContents="lax">
+                <xs:annotation><xs:documentation>
+                    Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                    attributes at this point in the schema.
+                </xs:documentation></xs:annotation>
+            </xs:anyAttribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="HelpFilterRef">
+        <xs:annotation><xs:documentation>Create a reference to a HelpFile element in another Fragment.</xs:documentation></xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" use="required" type="xs:string">
+                <xs:annotation><xs:documentation>Primary Key for HelpFilter.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:anyAttribute namespace="##other" processContents="lax">
+                <xs:annotation><xs:documentation>
+                    Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                    attributes at this point in the schema.
+                </xs:documentation></xs:annotation>
+            </xs:anyAttribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="HelpCollectionRef">
+        <xs:annotation>
+            <xs:documentation>Create a reference to a HelpCollection element in another Fragment.</xs:documentation>
+            <xs:appinfo>
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Fragment" />
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Module" />
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Product" />
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="HelpFileRef" />
+            </xs:choice>
+            <xs:attribute name="Id" use="required" type="xs:string">
+                <xs:annotation><xs:documentation>Primary Key for HelpNamespace Table.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:anyAttribute namespace="##other" processContents="lax">
+                <xs:annotation><xs:documentation>
+                    Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                    attributes at this point in the schema.
+                </xs:documentation></xs:annotation>
+            </xs:anyAttribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:simpleType name="YesNoType">
+        <xs:annotation>
+            <xs:documentation>Values of this type will either be "yes" or "no".</xs:documentation>
+        </xs:annotation>
+        <xs:restriction base='xs:NMTOKEN'>
+            <xs:enumeration value="no"/>
+            <xs:enumeration value="yes"/>
+        </xs:restriction>
+    </xs:simpleType>
+</xs:schema>
diff --git a/doc/wix.chm b/doc/wix.chm
new file mode 100644
index 0000000..12ac811
--- /dev/null
+++ b/doc/wix.chm
Binary files differ
diff --git a/doc/wix.xsd b/doc/wix.xsd
new file mode 100644
index 0000000..128e46e
--- /dev/null
+++ b/doc/wix.xsd
@@ -0,0 +1,10369 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+          xmlns:xse="http://schemas.microsoft.com/wix/2005/XmlSchemaExtension"
+         xmlns:html="http://www.w3.org/1999/xhtml"
+    targetNamespace="http://schemas.microsoft.com/wix/2006/wi"
+              xmlns="http://schemas.microsoft.com/wix/2006/wi">
+    <xs:annotation>
+        <xs:documentation>
+            Copyright (c) Microsoft Corporation.  All rights reserved.
+            
+            The use and distribution terms for this software are covered by the
+            Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+            which can be found in the file CPL.TXT at the root of this distribution.
+            By using this software in any fashion, you are agreeing to be bound by
+            the terms of this license.
+            
+            You must not remove this notice, or any other, from this software.
+
+            Schema for describing Windows Installer database files (.msi/.msm/.pcp).
+        </xs:documentation>
+    </xs:annotation>
+
+    <xs:import namespace="http://www.w3.org/1999/xhtml" />
+
+    <xs:element name="Wix">
+        <xs:annotation><xs:documentation>
+            This is the top-level container element for every wxs file.  Among the possible children,
+            the Product, Module, Patch, and PatchCreation elements are analogous to the main function in a C program.
+            There can only be one of these present when linking occurs.  Product compiles into an msi file,
+            Module compiles into an msm file, PatchCreation compiles into a pcp file.  The Fragment element
+            is an atomic unit which ultimately links into either a Product, Module, or PatchCreation.  The
+            Fragment can either be completely included or excluded during linking.
+        </xs:documentation></xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0">
+                <xs:sequence>
+                    <xs:choice minOccurs="0">
+                        <xs:element ref="Product"/>
+                        <xs:element ref="Module"/>
+                        <xs:element ref="Patch"/>
+                    </xs:choice>
+                    <xs:element ref="Fragment" minOccurs="0" maxOccurs="unbounded"/>
+                </xs:sequence>
+                <xs:element ref="PatchCreation"/>
+            </xs:choice>
+            <xs:attribute name="RequiredVersion" type="VersionType">
+                <xs:annotation>
+                    <xs:documentation>Required version of the WiX toolset to compile this input file.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:anyAttribute namespace="##other" processContents="lax">
+                <xs:annotation><xs:documentation>
+                    Extensibility point in the WiX XML Schema. Schema extensions can register additional attributes at this point in the schema.
+                </xs:documentation></xs:annotation>
+            </xs:anyAttribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Include">
+        <xs:annotation><xs:documentation>
+            This is the top-level container element for every wxi file.
+        </xs:documentation></xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:any namespace="##any" processContents="lax"/>
+            </xs:choice>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="LayoutDirectory">
+        <xs:annotation>
+            <xs:documentation>Representation of layout directory.</xs:documentation>
+            <xs:appinfo>
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Fragment" />
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Product" />
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Module" />
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Patch" />
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="PatchCreation" />
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="LayoutDirectoryRef" />
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="LayoutDirectory"/>
+                <xs:element ref="LayoutDirectoryRef"/>
+                <xs:element ref="LayoutFile"/>
+            </xs:choice>
+            <xs:attribute name="Name" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>The destination path of this layout. It can contain multiple levels of directory structure (i.e. src\files\product)</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Id" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Identifier for LayoutDirectory. Only required if this is shared and is referenced by LayoutDirectoryRef.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="LayoutDirectoryRef">
+        <xs:annotation>
+            <xs:documentation>Create a reference to an existing LayoutDirectory element.</xs:documentation>
+            <xs:appinfo>
+                <xse:seeAlso ref="LayoutDirectory"/>
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="LayoutDirectory" />
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Fragment" />
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Product" />
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Module" />
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Patch" />
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="PatchCreation" />
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="LayoutDirectory"/>
+                <xs:element ref="LayoutDirectoryRef"/>
+                <xs:element ref="LayoutFile"/>
+            </xs:choice>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>The identifier of LayoutDirectory element to reference.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="LayoutFile">
+        <xs:annotation>
+            <xs:documentation>Describes the file to copy into the final layout.</xs:documentation>
+            <xs:appinfo>
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="LayoutDirectory" />
+                <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="LayoutDirectoryRef"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="SourceFile" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>Location of the source file.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Name" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>The destination path and file name for this file. The default is the source file name.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Product">
+        <xs:annotation>
+            <xs:documentation>
+                The Product element is analogous to the main function in a C program.  When linking, only one Product section
+                can be given to the linker to produce a successful result.  Using this element creates an msi file.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:remarks>
+                    <html:p>You can specify any valid Windows code by integer like 1252, or by web name like Windows-1252. See <html:a href="codepage.htm">Code Pages</html:a> for more information.</html:p>
+                </xse:remarks>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element ref="Package" />
+                <xs:choice minOccurs="0" maxOccurs="unbounded">
+                    <xs:element ref="AppId"/>
+                    <xs:element ref="Binary"/>
+                    <xs:element ref="ComplianceCheck"/>
+                    <xs:element ref="Component"/>
+                    <xs:element ref="ComponentGroup"/>
+                    <xs:element ref="Condition"/>
+                    <xs:element ref="CustomAction"/>
+                    <xs:element ref="CustomActionRef"/>
+                    <xs:element ref="CustomTable"/>
+                    <xs:element ref="Directory"/>
+                    <xs:element ref="DirectoryRef"/>
+                    <xs:element ref="EmbeddedChainer"/>
+                    <xs:element ref="EmbeddedChainerRef"/>
+                    <xs:element ref="EnsureTable"/>
+                    <xs:element ref="Feature"/>
+                    <xs:element ref="FeatureRef"/>
+                    <xs:element ref="FeatureGroupRef"/>
+                    <xs:element ref="Icon"/>
+                    <xs:element ref="InstanceTransforms"/>
+                    <xs:element ref="LayoutDirectory" minOccurs="0" maxOccurs="unbounded"/>
+                    <xs:element ref="LayoutDirectoryRef" minOccurs="0" maxOccurs="unbounded"/>
+                    <xs:element ref="MajorUpgrade"/>
+                    <xs:element ref="Media"/>
+                    <xs:element ref="PackageCertificates"/>
+                    <xs:element ref="PatchCertificates"/>
+                    <xs:element ref="Property"/>
+                    <xs:element ref="PropertyRef"/>
+                    <xs:element ref="SetDirectory"/>
+                    <xs:element ref="SetProperty"/>
+                    <xs:element ref="SFPCatalog"/>
+                    <xs:element ref="SymbolPath"/>
+                    <xs:element ref="UI"/>
+                    <xs:element ref="UIRef"/>
+                    <xs:element ref="Upgrade"/>
+                    <xs:element ref="WixVariable"/>
+                    <xs:sequence>
+                        <xs:element ref="InstallExecuteSequence" minOccurs="0"/>
+                        <xs:element ref="InstallUISequence" minOccurs="0"/>
+                        <xs:element ref="AdminExecuteSequence" minOccurs="0"/>
+                        <xs:element ref="AdminUISequence" minOccurs="0"/>
+                        <xs:element ref="AdvertiseExecuteSequence" minOccurs="0"/>
+                    </xs:sequence>
+                    <xs:any namespace="##other" processContents="lax">
+                        <xs:annotation><xs:documentation>
+                            Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                            elements at this point in the schema.
+                        </xs:documentation></xs:annotation>
+                    </xs:any>
+                </xs:choice>
+            </xs:sequence>
+
+            <xs:attribute name="Id" type="AutogenGuid" use="required">
+                <xs:annotation>
+                    <xs:documentation>The product code GUID for the product.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Codepage" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>The code page integer value or web name for the resulting MSI. See remarks for more information.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Language" type="LocalizableInteger" use="required">
+                <xs:annotation>
+                    <xs:documentation>The decimal language ID (LCID) for the product.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Manufacturer" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>The manufacturer of the product.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Name" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>The descriptive name of the product.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="UpgradeCode" type="Guid">
+                <xs:annotation>
+                    <xs:documentation>The upgrade code GUID for the product.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Version" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>The product's version string.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:anyAttribute namespace="##other" processContents="lax">
+                <xs:annotation><xs:documentation>
+                    Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                    attributes at this point in the schema.
+                </xs:documentation></xs:annotation>
+            </xs:anyAttribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Module">
+        <xs:annotation>
+            <xs:documentation>
+            The Module element is analogous to the main function in a C program.  When linking, only
+            one Module section can be given to the linker to produce a successful result.  Using this
+            element creates an msm file.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:remarks>
+                    <html:p>You can specify any valid Windows code by by integer like 1252, or by web name like Windows-1252. See <html:a href="codepage.htm">Code Pages</html:a> for more information.</html:p>
+                </xse:remarks>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element ref="Package" />
+                <xs:choice minOccurs="0" maxOccurs="unbounded">
+                    <xs:element ref="AppId"/>
+                    <xs:element ref="Binary"/>
+                    <xs:element ref="Component"/>
+                    <xs:element ref="ComponentGroupRef"/>
+                    <xs:element ref="ComponentRef"/>
+                    <xs:element ref="Configuration"/>
+                    <xs:element ref="CustomAction"/>
+                    <xs:element ref="CustomActionRef"/>
+                    <xs:element ref="CustomTable"/>
+                    <xs:element ref="Dependency"/>
+                    <xs:element ref="Directory"/>
+                    <xs:element ref="DirectoryRef"/>
+                    <xs:element ref="EmbeddedChainer"/>
+                    <xs:element ref="EmbeddedChainerRef"/>
+                    <xs:element ref="EnsureTable"/>
+                    <xs:element ref="Exclusion"/>
+                    <xs:element ref="Icon"/>
+                    <xs:element ref="IgnoreModularization"/>
+                    <xs:element ref="IgnoreTable"/>
+                    <xs:element ref="LayoutDirectory" minOccurs="0" maxOccurs="unbounded"/>
+                    <xs:element ref="LayoutDirectoryRef" minOccurs="0" maxOccurs="unbounded"/>
+                    <xs:element ref="Property"/>
+                    <xs:element ref="PropertyRef"/>
+                    <xs:element ref="SetDirectory"/>
+                    <xs:element ref="SetProperty"/>
+                    <xs:element ref="SFPCatalog"/>
+                    <xs:element ref="Substitution"/>
+                    <xs:element ref="UI"/>
+                    <xs:element ref="UIRef"/>
+                    <xs:element ref="WixVariable"/>
+                    <xs:sequence>
+                        <xs:element ref="InstallExecuteSequence" minOccurs="0"/>
+                        <xs:element ref="InstallUISequence" minOccurs="0"/>
+                        <xs:element ref="AdminExecuteSequence" minOccurs="0"/>
+                        <xs:element ref="AdminUISequence" minOccurs="0"/>
+                        <xs:element ref="AdvertiseExecuteSequence" minOccurs="0"/>
+                    </xs:sequence>
+                    <xs:any namespace="##other" processContents="lax">
+                        <xs:annotation><xs:documentation>
+                            Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                            elements at this point in the schema.
+                        </xs:documentation></xs:annotation>
+                    </xs:any>
+                </xs:choice>
+            </xs:sequence>
+
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>The name of the merge module (not the file name).</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Codepage" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>The code page integer value or web name for the resulting MSM. See remarks for more information.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Guid" type="Guid">
+                <xs:annotation>
+                    <xs:documentation>This attribute is deprecated. Use the Package/@Id attribute instead.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Language" type="LocalizableInteger" use="required">
+                <xs:annotation>
+                    <xs:documentation>The decimal language ID (LCID) of the merge module.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Version" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>The major and minor versions of the merge module.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Dependency">
+        <xs:annotation>
+            <xs:documentation>Declares a dependency on another merge module.</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="RequiredId" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Identifier of the merge module required by the merge module.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="RequiredLanguage" type="xs:integer" use="required">
+                <xs:annotation><xs:documentation>Numeric language ID of the merge module in RequiredID.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="RequiredVersion" type="xs:string">
+                <xs:annotation><xs:documentation>Version of the merge module in RequiredID.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Exclusion">
+        <xs:annotation>
+            <xs:documentation>Declares a merge module with which this merge module is incompatible.</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="ExcludedId" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Identifier of the merge module that is incompatible.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ExcludeExceptLanguage" type="xs:integer">
+                <xs:annotation><xs:documentation>Numeric language ID of the merge module in ExcludedID. All except this language will be excluded. Only one of ExcludeExceptLanguage and ExcludeLanguage may be specified.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ExcludeLanguage" type="xs:integer">
+                <xs:annotation><xs:documentation>Numeric language ID of the merge module in ExcludedID. The specified language will be excluded. Only one of ExcludeExceptLanguage and ExcludeLanguage may be specified.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ExcludedMinVersion" type="xs:string">
+                <xs:annotation><xs:documentation>Minimum version excluded from a range. If not set, all versions before max are excluded. If neither max nor min, no exclusion based on version.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ExcludedMaxVersion" type="xs:string">
+                <xs:annotation><xs:documentation>Maximum version excluded from a range. If not set, all versions after min are excluded. If neither max nor min, no exclusion based on version.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Configuration">
+        <xs:annotation>
+            <xs:documentation>Defines the configurable attributes of merge module.</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Name" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Defines the name of the configurable item.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Format" use="required">
+                <xs:annotation><xs:documentation>Specifies the format of the data being changed.</xs:documentation></xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:string">
+                        <xs:enumeration value="Text"/>
+                        <xs:enumeration value="Key"/>
+                        <xs:enumeration value="Integer"/>
+                        <xs:enumeration value="Bitfield"/>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="Type" type="xs:string">
+                <xs:annotation><xs:documentation>Specifies the type of the data being changed.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ContextData" type="xs:string">
+                <xs:annotation><xs:documentation>Specifies a semantic context for the requested data.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DefaultValue" type="xs:string">
+                <xs:annotation><xs:documentation>Specifies a default value for the item in this record if the merge tool declines to provide a value.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="KeyNoOrphan" type="YesNoType">
+                <xs:annotation><xs:documentation>Does not merge rule according to rules in MSI SDK.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="NonNullable" type="YesNoType">
+                <xs:annotation><xs:documentation>If yes, null is not a valid entry.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DisplayName" type="xs:string">
+                <xs:annotation><xs:documentation>Display name for authoring.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Description" type="xs:string">
+                <xs:annotation><xs:documentation>Description for authoring.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="HelpLocation" type="xs:string">
+                <xs:annotation><xs:documentation>Location of chm file for authoring.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="HelpKeyword" type="xs:string">
+                <xs:annotation><xs:documentation>Keyword into chm file for authoring.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+    
+    <xs:element name="Substitution">
+        <xs:annotation>
+            <xs:documentation>Specifies the configurable fields of a module database and provides a template for the configuration of each field.</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Table" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Specifies the name of the table being modified in the module database.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Row" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Specifies the primary keys of the target row in the table named in the Table column. If multiple keys, separated by semicolons.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Column" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Specifies the target column in the row named in the Row column.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Value" type="xs:string">
+                <xs:annotation><xs:documentation>Provides a formatting template for the data being substituted into the target field specified by Table, Row, and Column.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="IgnoreTable">
+        <xs:annotation>
+            <xs:documentation>
+                Specifies a table from the merge module that is not merged into an .msi file.
+                If the table already exists in an .msi file, it is not modified by the merge.
+                The specified table can therefore contain data that is unneeded after the merge.
+                To minimize the size of the .msm file, it is recommended that developers remove
+                unused tables from modules intended for redistribution rather than creating
+                IgnoreTable elements for those tables.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>
+                        The name of the table in the merge module that is not to be merged into the .msi file.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Fragment">
+        <xs:annotation>
+            <xs:documentation>
+                The Fragment element is the building block of creating an installer database in WiX.  Once defined,
+                the Fragment becomes an immutable, atomic unit which can either be completely included or excluded
+                from a product.  The contents of a Fragment element can be linked into a product by utilizing one
+                of the many *Ref elements.  When linking in a Fragment, it will be necessary to link in all of its
+                individual units.  For instance, if a given Fragment contains two Component elements, you must link
+                both under features using ComponentRef for each linked Component.  Otherwise, you will get a linker
+                warning and have a floating Component that does not appear under any Feature.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="AppId"/>
+                <xs:element ref="Binary"/>
+                <xs:element ref="ComplianceCheck"/>
+                <xs:element ref="Component"/>
+                <xs:element ref="ComponentGroup"/>
+                <xs:element ref="Condition"/>
+                <xs:element ref="CustomAction"/>
+                <xs:element ref="CustomActionRef"/>
+                <xs:element ref="CustomTable"/>
+                <xs:element ref="Directory"/>
+                <xs:element ref="DirectoryRef"/>
+                <xs:element ref="EmbeddedChainer"/>
+                <xs:element ref="EmbeddedChainerRef"/>
+                <xs:element ref="EnsureTable"/>
+                <xs:element ref="Feature"/>
+                <xs:element ref="FeatureGroup"/>
+                <xs:element ref="FeatureRef"/>
+                <xs:element ref="Icon"/>
+                <xs:element ref="IgnoreModularization"/>
+                <xs:element ref="LayoutDirectory"/>
+                <xs:element ref="LayoutDirectoryRef"/>
+                <xs:element ref="Media"/>
+                <xs:element ref="PackageCertificates"/>
+                <xs:element ref="PatchCertificates"/>
+                <xs:element ref="PatchFamily"/>
+                <xs:element ref="Property"/>
+                <xs:element ref="PropertyRef"/>
+                <xs:element ref="SetDirectory"/>
+                <xs:element ref="SetProperty"/>
+                <xs:element ref="SFPCatalog"/>
+                <xs:element ref="UI"/>
+                <xs:element ref="UIRef"/>
+                <xs:element ref="Upgrade"/>
+                <xs:element ref="WixVariable"/>
+                <xs:sequence>
+                    <xs:element ref="InstallExecuteSequence" minOccurs="0"/>
+                    <xs:element ref="InstallUISequence" minOccurs="0"/>
+                    <xs:element ref="AdminExecuteSequence" minOccurs="0"/>
+                    <xs:element ref="AdminUISequence" minOccurs="0"/>
+                    <xs:element ref="AdvertiseExecuteSequence" minOccurs="0"/>
+                </xs:sequence>
+                <xs:any namespace="##other" processContents="lax">
+                    <xs:annotation><xs:documentation>
+                        Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                        elements at this point in the schema.
+                    </xs:documentation></xs:annotation>
+                </xs:any>
+            </xs:choice>
+
+            <xs:attribute name="Id" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    Optional identifier for a Fragment.  Should only be set by advanced users to tag sections.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Patch">
+        <xs:annotation>
+            <xs:documentation>
+            The Patch element is analogous to the main function in a C program.  When linking, only one Patch section
+            can be given to the linker to produce a successful result.  Using this element creates an MSP file.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:remarks>
+                    <html:p>You can specify any valid Windows code by by integer like 1252, or by web name like Windows-1252. See <html:a href="codepage.htm">Code Pages</html:a> for more information.</html:p>
+                    <html:p>The ClientPatchId attribute allows you to specify an easily referenced identity that you can use in product authoring. This identity prefixes properties added by WiX to a patch transform, such as <html:i>ClientPatchId</html:i>.PatchCode and <html:i>ClientPatchId</html:i>.AllowRemoval. If the patch code GUID is auto-generated you could not reference any properties using this auto-generated prefix.</html:p>
+					<html:p>For example, if you were planning to ship a patch referred to as "QFE1" and needed to write your own registry values for Add/Remove Programs in product authoring such as the UninstallString for this patch, you could author a RegistryValue with the name UninstallString and the value <html:code><html:nobr>[SystemFolder]msiexec.exe</html:nobr> /package [ProductCode] /uninstall [QFE1.PatchCode]</html:code>. In your patch authoring you would then set ClientPatchId to "QFE1" and WiX will add the QFE1.PatchCode property to the patch transform when the patch is created. If the Id attribute specified the patch code to be generated automatically, you could not reference the <html:i>prefix</html:i>.PatchCode property as shown above.</html:p>
+					<html:p>The summary information is automatically populated from attribute values of the Patch element including the code page. If you want to override some of these summary information properties or use a different code page for the summary information itself, author the PatchInformation element.</html:p>
+                </xse:remarks>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:sequence>
+                <xs:choice minOccurs="0" maxOccurs="unbounded">
+                     <xs:element ref="PatchInformation" minOccurs="0" maxOccurs="1">
+                        <xs:annotation>
+                            <xs:documentation>Optional element that allows overriding summary information properties.</xs:documentation>
+                        </xs:annotation>
+                    </xs:element>
+                    <xs:element ref="LayoutDirectory" minOccurs="0" maxOccurs="unbounded"/>
+                    <xs:element ref="LayoutDirectoryRef" minOccurs="0" maxOccurs="unbounded"/>
+                    <xs:element ref="Media" minOccurs="1" maxOccurs="unbounded"/>
+                    <xs:element ref="OptimizeCustomActions" minOccurs="0" maxOccurs="1">
+                        <xs:annotation><xs:documentation>Indicates whether custom actions can be skipped when applying the patch.</xs:documentation></xs:annotation>
+                    </xs:element>
+                    <xs:element ref="PatchFamily" minOccurs="1" maxOccurs="unbounded"/>
+                    <xs:element ref="PatchFamilyRef" minOccurs="0" maxOccurs="unbounded"/>
+                    <xs:element ref="PatchProperty"/>
+                    <xs:element ref="TargetProductCodes"/>
+                    <xs:any namespace="##other" processContents="lax">
+                        <xs:annotation><xs:documentation>
+                            Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                            elements at this point in the schema.
+                        </xs:documentation></xs:annotation>
+                    </xs:any>
+                </xs:choice>
+            </xs:sequence>
+
+            <xs:attribute name="Id" type="AutogenGuid">
+                <xs:annotation><xs:documentation>Patch code for this patch.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Codepage" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>The code page integer value or web name for the resulting MSP. See remarks for more information.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="AllowRemoval" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Whether this is an uninstallable patch.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Classification" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>Category of updates. Recommended values are Critical Update, Hotfix, Security Rollup, Security Update, Service Pack, Update, Update Rollup.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ClientPatchId" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>An easily referenced identity unique to a patch that can be used in product authoring. See remarks for more information.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ApiPatchingSymbolNoImagehlpFlag" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Flag used when creating a binary file patch. Default is &quot;no&quot;. Don't use imagehlp.dll.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ApiPatchingSymbolNoFailuresFlag" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Flag used when creating a binary file patch. Default is &quot;no&quot;. Don't fail patch due to imagehlp failures.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ApiPatchingSymbolUndecoratedTooFlag" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Flag used when creating a binary file patch. Default is &quot;no&quot;. After matching decorated symbols, try to match remaining by undecorated names.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Description" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>Description of the patch.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DisplayName" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>A title for the patch that is suitable for public display. In Add/Remove Programs from XP SP2 on.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Comments" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Optional comments for browsing.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Manufacturer" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Vendor releasing the package</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="MinorUpdateTargetRTM" type="YesNoType">
+                <xs:annotation><xs:documentation>
+                    Indicates that the patch targets the RTM version of the product or the most recent major
+                    upgrade patch.  Author this optional property in minor update patches that contain sequencing
+                    information to indicate that the patch removes all patches up to the RTM version of the
+                    product, or up to the most recent major upgrade patch.  This property is available beginning
+                    with Windows Installer 3.1.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="MoreInfoURL" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>A URL that provides information specific to this patch.  In Add/Remove Programs from XP SP2 on.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="OptimizedInstallMode" type="YesNoType">
+                <xs:annotation><xs:documentation>
+                    If this attribute is set to 'yes' in all the patches to be applied in a transaction, the
+                    application of the patch is optimized if possible.  Available beginning with Windows Installer 3.1.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="TargetProductName" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Name of the application or target product suite.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="OptimizePatchSizeForLargeFiles" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>When this attribute is set, patches for files greater than approximately 4 MB in size may be made smaller.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Validate">
+        <xs:annotation>
+            <xs:documentation>Sets information in the patch transform that determines if the transform applies to an installed product and what errors should be ignored when applying the patch transform.</xs:documentation>
+            <xs:appinfo>
+                <xse:remarks>
+                    <html:p>A transform contains the differences between the target product and the upgraded product. When a transform or a patch (which contains transforms) is applied, the following properties of the installed product are validated against the properties of the target product stored in a transform.</html:p>
+                    <html:ul>
+                        <html:li>ProductCode</html:li>
+                        <html:li>ProductLanguage</html:li>
+                        <html:li>ProductVersion</html:li>
+                        <html:li>UpgradeCode</html:li>
+                    </html:ul>
+                    <html:p>Windows Installer simply validates that the ProductCode, ProductLanguage, and UpgradeCode of an installed product are equivalent to those propeties of the target product used to create the transform; however, the ProductVersion can be validated with a greater range of comparisons.</html:p>
+                    <html:p>You can compare up to the first three fields of the ProductVersion. Changes to the fourth field are not validated and are useful for small updates. You can also choose how to compare the target ProductVersion used to create the transform with the installed ProductVersion. For example, while the default value of 'Equals' is recommended, if you wanted a minor upgrade patch to apply to the target ProductVersion and all older products with the same ProductCode, you would use 'LesserOrEqual'.</html:p>
+                </xse:remarks>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="ProductId" type="YesNoType" default="yes">
+                <xs:annotation>
+                    <xs:documentation>Requires that the installed ProductCode match the target ProductCode used to create the transform. The default is 'yes'.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ProductLanguage" type="YesNoType" default="no">
+                <xs:annotation>
+                    <xs:documentation>Requires that the installed ProductLanguage match the target ProductLanguage used to create the transform. The default is 'no'.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ProductVersion" default="Update">
+                <xs:annotation>
+                    <xs:documentation>Determines how many fields of the installed ProductVersion to compare. See remarks for more information. The default is 'Update'.</xs:documentation>
+                </xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="Major">
+                            <xs:annotation>
+                                <xs:documentation>Checks the major version.</xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="Minor">
+                            <xs:annotation>
+                                <xs:documentation>Checks the major and minor versions.</xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="Update">
+                            <xs:annotation>
+                                <xs:documentation>Checks the major, minor, and update versions.</xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="ProductVersionOperator" default="Equal">
+                <xs:annotation>
+                    <xs:documentation>Determines how the installed ProductVersion is compared to the target ProductVersion used to create the transform. See remarks for more information. The default is 'Equal'.</xs:documentation>
+                </xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="Lesser">
+                            <xs:annotation>
+                                <xs:documentation>Installed ProductVersion &lt; target ProductVersion.</xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="LesserOrEqual">
+                            <xs:annotation>
+                                <xs:documentation>Installed ProductVersion &lt;= target ProductVersion.</xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="Equal">
+                            <xs:annotation>
+                                <xs:documentation>Installed ProductVersion = target ProductVersion.</xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="GreaterOrEqual">
+                            <xs:annotation>
+                                <xs:documentation>Installed ProductVersion &gt;= target ProductVersion.</xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="Greater">
+                            <xs:annotation>
+                                <xs:documentation>Installed ProductVersion &gt; target ProductVersion.</xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="UpgradeCode" type="YesNoType" default="yes">
+                <xs:annotation>
+                    <xs:documentation>Requires that the installed UpgradeCode match the target UpgradeCode used to create the transform. The default is 'yes'.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IgnoreAddExistingRow" type="YesNoType" default="yes">
+                <xs:annotation>
+                    <xs:documentation>Ignore errors when adding existing rows. The default is 'yes'.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IgnoreAddExistingTable" type="YesNoType" default="yes">
+                <xs:annotation>
+                    <xs:documentation>Ignore errors when adding existing tables. The default is 'yes'.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IgnoreDeleteMissingRow" type="YesNoType" default="yes">
+                <xs:annotation>
+                    <xs:documentation>Ignore errors when deleting missing rows. The default is 'yes'.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IgnoreDeleteMissingTable" type="YesNoType" default="yes">
+                <xs:annotation>
+                    <xs:documentation>Ignore errors when deleting missing tables. The default is 'yes'.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IgnoreUpdateMissingRow" type="YesNoType" default="yes">
+                <xs:annotation>
+                    <xs:documentation>Ignore errors when updating missing rows. The default is 'yes'.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IgnoreChangingCodePage" type="YesNoType" default="no">
+                <xs:annotation>
+                    <xs:documentation>Ignore errors when changing the database code page. The default is 'no'.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="OptimizeCustomActions">
+        <xs:annotation>
+            <xs:documentation>Indicates whether custom actions can be skipped when applying the patch.</xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="MsiPatchMetadata" href="http://msdn.microsoft.com/library/aa370344.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="SkipAssignment" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Skip property (type 51) and directory (type 35) assignment custom actions.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SkipImmediate" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Skip immediate custom actions that are not property or directory assignment custom actions.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SkipDeferred" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Skip custom actions that run within the script.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="PatchBaseline">
+        <xs:annotation><xs:documentation>Identifies a set of product versions.</xs:documentation></xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0">
+                <xs:element ref="Validate" minOccurs="0" />
+            </xs:choice>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>Identifier for a set of product versions.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="PatchFamily">
+        <xs:annotation><xs:documentation>Collection of items that should be kept from the differences between two products.</xs:documentation></xs:annotation>
+        <xs:complexType>
+            <xs:sequence>
+                <xs:choice minOccurs="0" maxOccurs="unbounded">
+                    <xs:element ref="BinaryRef" minOccurs="0" maxOccurs="unbounded"/>
+                    <xs:element ref="ComponentRef" minOccurs="0" maxOccurs="unbounded"/>
+                    <xs:element ref="CustomActionRef" minOccurs="0" maxOccurs="unbounded"/>
+                    <xs:element ref="FeatureRef" minOccurs="0" maxOccurs="unbounded"/>
+                    <xs:element ref="IconRef" minOccurs="0" maxOccurs="unbounded"/>
+                    <xs:element ref="PropertyRef" minOccurs="0" maxOccurs="unbounded"/>
+                    <xs:element ref="DirectoryRef" minOccurs="0" maxOccurs="unbounded"/>
+                    <xs:element ref="UIRef" minOccurs="0" maxOccurs="unbounded"/>
+                    <xs:any namespace="##other" processContents="lax">
+                        <xs:annotation><xs:documentation>
+                            Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                            elements at this point in the schema.
+                        </xs:documentation></xs:annotation>
+                    </xs:any>
+                </xs:choice>
+            </xs:sequence>
+
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>Identifier which indicates a sequence family to which this patch belongs.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ProductCode" type="Guid">
+                <xs:annotation>
+                    <xs:documentation>
+                        Specifies the ProductCode of the product that this family applies to.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Version" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>Used to populate the sequence column of the MsiPatchSequence table in the final MSP file. Specified in x.x.x.x format. See documentation for Sequence column of MsiPatchSequence table in MSI SDK.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Supersede" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>
+                        Set this value to 'yes' to indicate that this patch will supersede all previous patches in this patch family.
+                        The default value is 'no'.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="PatchCreation">
+        <xs:annotation>
+            <xs:documentation>
+            The PatchCreation element is analogous to the main function in a C program.  When linking, only one PatchCreation section
+            can be given to the linker to produce a successful result.  Using this element creates a pcp file.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:remarks>
+                    <html:p>You can specify any valid Windows code by by integer like 1252, or by web name like Windows-1252. See <html:a href="codepage.htm">Code Pages</html:a> for more information.</html:p>
+                </xse:remarks>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element ref="PatchInformation" />
+                <xs:element ref="PatchMetadata" minOccurs="0"/>
+                <xs:element ref="Family" maxOccurs="unbounded"/>
+                <xs:choice minOccurs="0" maxOccurs="unbounded">
+                    <xs:element ref="LayoutDirectory" minOccurs="0" maxOccurs="unbounded"/>
+                    <xs:element ref="LayoutDirectoryRef" minOccurs="0" maxOccurs="unbounded"/>
+                    <xs:element ref="PatchProperty"/>
+                    <xs:element ref="PatchSequence"/>
+                    <xs:element ref="ReplacePatch"/>
+                    <xs:element ref="TargetProductCode"/>
+                </xs:choice>
+            </xs:sequence>
+        
+            <xs:attribute name="Id" type="Guid" use="required">
+                <xs:annotation><xs:documentation>PatchCreation identifier; this is the primary key for identifying patches.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="AllowMajorVersionMismatches" type="YesNoType">
+                <xs:annotation><xs:documentation>Use this to set whether the major versions between the upgrade and target images match. See <html:a href="http://msdn2.microsoft.com/library/aa370890.aspx" target="_blank">AllowProductVersionMajorMismatches</html:a> for more information.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="AllowProductCodeMismatches" type="YesNoType">
+                <xs:annotation><xs:documentation>Use this to set whether the product code between the upgrade and target images match. See <html:a href="http://msdn2.microsoft.com/library/aa370890.aspx" target="_blank">AllowProductCodeMismatches</html:a> for more information.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="CleanWorkingFolder" type="YesNoType">
+                <xs:annotation><xs:documentation>Use this to set whether Patchwiz should clean the temp folder when finished. See <html:a href="http://msdn2.microsoft.com/library/aa370890.aspx" target="_blank">DontRemoveTempFolderWhenFinished</html:a> for more information.	</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Codepage" type="xs:string">
+                <xs:annotation><xs:documentation>The code page integer value or web name for the resulting PCP. See remarks for more information.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="OutputPath" type="xs:string">
+                <xs:annotation><xs:documentation>The full path, including file name, of the patch package file that is to be generated. See <html:a href="http://msdn2.microsoft.com/library/aa370890.aspx" target="_blank">PatchOutputPath</html:a> for more information.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SourceList" type="xs:string">
+                <xs:annotation><xs:documentation>Used to locate the .msp file for the patch if the cached copy is unavailable. See <html:a href="http://msdn2.microsoft.com/library/aa370890.aspx" target="_blank">PatchSourceList</html:a> for more information.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SymbolFlags" type="xs:int">
+                <xs:annotation><xs:documentation>An 8-digit hex integer representing the combination of patch symbol usage flags to use when creating a binary file patch. See <html:a href="http://msdn2.microsoft.com/library/aa370890.aspx" target="_blank">ApiPatchingSymbolFlags</html:a> for more information.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="WholeFilesOnly" type="YesNoType">
+                <xs:annotation><xs:documentation>Use this to set whether changing files should be included in their entirety. See <html:a href="http://msdn2.microsoft.com/library/aa370890.aspx" target="_blank">IncludeWholeFilesOnly</html:a> for more information.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="PatchInformation">
+        <xs:annotation>
+            <xs:documentation>Properties about the patch to be placed in the Summary Information Stream.  These are visible from COM through the IStream interface, and these properties can be seen on the package in Explorer.</xs:documentation>
+            <xs:appinfo>
+                <xse:remarks>
+                    <html:p>You can specify any valid Windows code by by integer like 1252, or by web name like Windows-1252. See <html:a href="codepage.htm">Code Pages</html:a> for more information.</html:p>
+                </xse:remarks>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Description" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>A short description of the patch that includes the name of the product.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Platforms" type="xs:string">
+                <xs:annotation>
+                    <xs:appinfo>
+                        <xse:deprecated />
+                    </xs:appinfo>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Languages" type="xs:string">
+                <xs:annotation>
+                    <xs:appinfo>
+                        <xse:deprecated />
+                    </xs:appinfo>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Manufacturer" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>The name of the manufacturer of the patch package.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Keywords" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>A semicolon-delimited list of network or URL locations for alternate sources of the patch. The default is "Installer,Patching,PCP,Database".</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Comments" type="xs:string">
+                <xs:annotation>
+					<xs:documentation>General purpose of the patch package. For example, "This patch contains the logic and data required to install <html:i>&lt;product&gt;</html:i>."</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ReadOnly" type="YesNoDefaultType">
+                <xs:annotation>
+                    <xs:documentation>
+                        The value of this attribute conveys whether the package should be opened as read-only.
+                        A database editing tool should not modify a read-only enforced database and should
+                        issue a warning at attempts to modify a read-only recommended database.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SummaryCodepage" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>The code page integer value or web name for summary info strings only.  The default is 1252.  See remarks for more information.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ShortNames" type="YesNoType">
+                <xs:annotation>
+                    <xs:appinfo>
+                        <xse:deprecated />
+                    </xs:appinfo>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Compressed" type="YesNoType">
+                <xs:annotation>
+                    <xs:appinfo>
+                        <xse:deprecated />
+                    </xs:appinfo>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="AdminImage" type="YesNoType">
+                <xs:annotation>
+                    <xs:appinfo>
+                        <xse:deprecated />
+                    </xs:appinfo>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="PatchMetadata">
+        <xs:annotation>
+            <xs:documentation>Properties about the patch to be placed in the PatchMetadata table.</xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="MsiPatchMetadata" href="http://msdn.microsoft.com/library/aa370344.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:sequence>
+                <xs:choice minOccurs="0" maxOccurs="unbounded">
+                    <xs:element ref="CustomProperty" minOccurs="0">
+                        <xs:annotation><xs:documentation>A custom property that extends the standard set.</xs:documentation></xs:annotation>
+                    </xs:element>
+                    <xs:element ref="OptimizeCustomActions" minOccurs="0" maxOccurs="1">
+                        <xs:annotation><xs:documentation>Indicates whether custom actions can be skipped when applying the patch.</xs:documentation></xs:annotation>
+                    </xs:element>
+                </xs:choice>
+            </xs:sequence>
+
+            <xs:attribute name="AllowRemoval" type="YesNoType" use="required">
+                <xs:annotation>
+                    <xs:documentation>Whether this is an uninstallable patch.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+          <xs:attribute name="Classification" type="xs:string" use="required">
+            <xs:annotation>
+              <xs:documentation>Category of updates. Recommended values are Critical Update, Hotfix, Security Rollup, Security Update, Service Pack, Update, Update Rollup.</xs:documentation>
+            </xs:annotation>
+          </xs:attribute>
+          <xs:attribute name="CreationTimeUTC" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Creation time of the .msp file in the form mm-dd-yy HH:MM (month-day-year hour:minute).</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Description" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>Description of the patch.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DisplayName" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>A title for the patch that is suitable for public display. In Add/Remove Programs from XP SP2 on.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ManufacturerName" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>Name of the manufacturer.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="MinorUpdateTargetRTM" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    Indicates that the patch targets the RTM version of the product or the most recent major
+                    upgrade patch.  Author this optional property in minor update patches that contain sequencing
+                    information to indicate that the patch removes all patches up to the RTM version of the
+                    product, or up to the most recent major upgrade patch.  This property is available beginning
+                    with Windows Installer 3.1.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="MoreInfoURL" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>A URL that provides information specific to this patch.  In Add/Remove Programs from XP SP2 on.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="OptimizedInstallMode" type="YesNoType">
+                <xs:annotation><xs:documentation>
+                    If this attribute is set to 'yes' in all the patches to be applied in a transaction, the
+                    application of the patch is optimized if possible.  Available beginning with Windows Installer 3.1.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="TargetProductName" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>Name of the application or target product suite.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="CustomProperty">
+        <xs:annotation><xs:documentation>A custom property for the PatchMetadata table.</xs:documentation></xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Company" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>The name of the company.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Property" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>The name of the metadata property.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Value" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>Value of the metadata property.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="ReplacePatch">
+        <xs:annotation><xs:documentation>A patch that is deprecated by this patch.</xs:documentation></xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="Guid" use="required">
+                <xs:annotation>
+                    <xs:documentation>Patch GUID to be unregistered if it exists on the machine targeted by this patch.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="TargetProductCodes">
+        <xs:annotation>
+            <xs:documentation>
+                The product codes for products that can accept the patch.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice maxOccurs="unbounded">
+                <xs:element ref="TargetProductCode"/>
+            </xs:choice>
+            <xs:attribute name="Replace" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Whether to replace the product codes that can accept the patch from the target packages with the child elements.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="TargetProductCode">
+        <xs:annotation>
+            <xs:documentation>
+                A product code for a product that can accept the patch.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:remarks>
+                    <html:p>When using the PatchCreation element, if the Id attribute value is '*' or this element is not authored, the product codes of all products referenced by the TargetImages element are used.</html:p>
+                    <html:p>When using the Patch element, the Id attribute value must not be '*'. Use the TargetProductCodes/@Replace attribute instead.</html:p>
+                </xse:remarks>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>
+                        The product code for a product that can accept the patch. This can be '*'. See remarks for more information.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+    
+    <xs:element name="PatchProperty">
+        <xs:annotation>
+            <xs:documentation>A property for this patch database.</xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="MsiPatchMetadata" href="http://msdn.microsoft.com/library/aa370344.aspx"/>
+                <xse:remarks>
+                    <html:p>When authored under the Patch element, the PatchProperty defines entries in the MsiPatchMetadata table.</html:p>
+                </xse:remarks>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Company" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Name of the company for a custom metadata property.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Name" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>Name of the patch property.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Value" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>Value of the patch property.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+    
+    <xs:element name="PatchSequence">
+        <xs:annotation>
+            <xs:documentation>Sequence information for this patch database. Sequence information is generated automatically in most cases, and rarely needs to be set explicitly.</xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="MsiPatchSequence" href="http://msdn.microsoft.com/library/aa370350.aspx" />
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="PatchFamily" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>Identifier which indicates a sequence family to which this patch belongs.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ProductCode" type="Guid">
+                <xs:annotation>
+                    <xs:documentation>
+                        Specifies the ProductCode of the product that this family applies to.
+                        This attribute cannot the specified if the TargetImage attribute is specified.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Sequence" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Used to populate the sequence column of the MsiPatchSequence table in the final MSP file. Specified in x.x.x.x format. See documentation for Sequence column of MsiPatchSequence table in MSI SDK.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Supersede" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>
+                        Set this value to 'yes' to indicate that this patch will supersede all previous patches in this patch family.
+                        The default value is 'no'.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Target" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        This attribute has been deprecated. Use the TargetImage attribute instead.
+                    </xs:documentation>
+                    <xs:appinfo>
+                        <xse:deprecated ref="TargetImage" />
+                    </xs:appinfo>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="TargetImage" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Specifies the TargetImage that this family applies to.
+                        This attribute cannot the specified if the ProductCode attribute is specified.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Family">
+        <xs:annotation><xs:documentation>Group of one or more upgraded images of a product.</xs:documentation></xs:annotation>
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element ref="UpgradeImage" maxOccurs="unbounded"/>
+                <xs:choice minOccurs="0" maxOccurs="unbounded">
+                    <xs:element ref="ExternalFile"/>
+                    <xs:element ref="ProtectFile"/>
+                </xs:choice>
+            </xs:sequence>
+
+            <xs:attribute name="DiskId" type="xs:int">
+                <xs:annotation><xs:documentation>Entered into the DiskId field of the new Media table record.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DiskPrompt" type="xs:string">
+                <xs:annotation><xs:documentation>Value to display in the "[1]" of the DiskPrompt Property.  Using this attribute will require you to define a DiskPrompt Property.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="MediaSrcProp" type="xs:string">
+                <xs:annotation><xs:documentation>Entered into the Source field of the new Media table entry of the upgraded image.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Name" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Identifier for the family.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SequenceStart" type="xs:int">
+                <xs:annotation><xs:documentation>Sequence number for the starting file.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="VolumeLabel" type="xs:string">
+                <xs:annotation><xs:documentation>Entered into the VolumeLabel field of the new Media table record.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+    
+    <xs:element name="UpgradeImage">
+        <xs:annotation><xs:documentation>Contains information about the upgraded images of the product.</xs:documentation></xs:annotation>
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element ref="TargetImage" maxOccurs="unbounded"/>
+                <xs:choice minOccurs="0" maxOccurs="unbounded">
+                    <xs:element ref="SymbolPath"/>
+                    <xs:element ref="UpgradeFile"/>
+                </xs:choice>
+            </xs:sequence>
+            
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Identifier to connect target images with upgraded image.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SourceFile" type="xs:string">
+                <xs:annotation><xs:documentation>Full path to location of msi file for upgraded image.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="src" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        This attribute has been deprecated. Use the SourceFile attribute instead.
+                    </xs:documentation>
+                    <xs:appinfo>
+                        <xse:deprecated ref="SourceFile" />
+                    </xs:appinfo>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SourcePatch" type="xs:string">
+                <xs:annotation><xs:documentation>Modified copy of the upgraded installation database that contains additional authoring specific to patching.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="srcPatch" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        This attribute has been deprecated. Use the SourcePatch attribute instead.
+                    </xs:documentation>
+                    <xs:appinfo>
+                        <xse:deprecated ref="SourcePatch" />
+                    </xs:appinfo>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+    
+    <xs:element name="TargetImage">
+        <xs:annotation><xs:documentation>Contains information about the target images of the product.</xs:documentation></xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="SymbolPath"/>
+                <xs:element ref="TargetFile"/>
+            </xs:choice>
+
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Identifier for the target image.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SourceFile" type="xs:string">
+                <xs:annotation><xs:documentation>Full path to the location of the msi file for the target image.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="src" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        This attribute has been deprecated. Use the SourceFile attribute instead.
+                    </xs:documentation>
+                    <xs:appinfo>
+                        <xse:deprecated ref="SourceFile" />
+                    </xs:appinfo>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Order" type="xs:int" use="required">
+                <xs:annotation><xs:documentation>Relative order of the target image.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Validation" type="xs:string">
+                <xs:annotation><xs:documentation>Product checking to avoid applying irrelevant transforms.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IgnoreMissingFiles" type="YesNoType">
+                <xs:annotation><xs:documentation>Files missing from the target image are ignored by the installer.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+    
+    <xs:element name="TargetFile">
+        <xs:annotation><xs:documentation>Information about specific files in a target image.</xs:documentation></xs:annotation>
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element ref="SymbolPath" minOccurs="0"/>
+                <xs:choice minOccurs="0" maxOccurs="unbounded">
+                    <xs:element ref="IgnoreRange"/>
+                    <xs:element ref="ProtectRange"/>
+                </xs:choice>
+            </xs:sequence>
+            
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Foreign key into the File table.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+    
+    <xs:element name="IgnoreRange">
+        <xs:annotation><xs:documentation>Specifies part of a file that is to be ignored during patching.</xs:documentation></xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Offset" type="xs:int" use="required">
+                <xs:annotation><xs:documentation>Offset of the start of the range.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Length" type="xs:int" use="required">
+                <xs:annotation><xs:documentation>Length of the range.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="ProtectRange">
+        <xs:annotation><xs:documentation>Specifies part of a file that cannot be overwritten during patching.</xs:documentation></xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Offset" type="xs:int" use="required">
+                <xs:annotation><xs:documentation>Offset of the start of the range.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Length" type="xs:int" use="required">
+                <xs:annotation><xs:documentation>Length of the range.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="ProtectFile">
+        <xs:annotation><xs:documentation>Specifies a file to be protected.</xs:documentation></xs:annotation>
+        <xs:complexType>
+            <xs:choice maxOccurs="unbounded">
+                <xs:element ref="ProtectRange"/>
+            </xs:choice>
+
+            <xs:attribute name="File" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Foreign key into the File table.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="ExternalFile">
+        <xs:annotation><xs:documentation>Contains information about specific files that are not part of a regular target image.</xs:documentation></xs:annotation>
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element ref="ProtectRange" maxOccurs="unbounded"/>
+                <xs:element ref="SymbolPath" maxOccurs="unbounded"/>
+                <xs:choice minOccurs="0" maxOccurs="unbounded">
+                    <xs:element ref="IgnoreRange"/>
+                </xs:choice>
+            </xs:sequence>
+            
+            <xs:attribute name="File" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Foreign key into the File table.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Source" type="xs:string">
+                <xs:annotation><xs:documentation>Full path of the external file.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="src" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        This attribute has been deprecated. Use the Source attribute instead.
+                    </xs:documentation>
+                    <xs:appinfo>
+                        <xse:deprecated ref="Source" />
+                    </xs:appinfo>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Order" type="xs:int" use="required">
+                <xs:annotation><xs:documentation>Specifies the order of the external files to use when creating the patch.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="UpgradeFile">
+        <xs:annotation><xs:documentation>Specifies files to either ignore or to specify optional data about a file.</xs:documentation></xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="SymbolPath"/>
+            </xs:choice>
+            
+            <xs:attribute name="File" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Foreign key into the File table.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Ignore" type="YesNoType" use="required">
+                <xs:annotation><xs:documentation>If yes, the file is ignored during patching, and the next two attributes are ignored.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="AllowIgnoreOnError" type="YesNoType">
+                <xs:annotation><xs:documentation>Specifies whether patching this file is vital.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="WholeFile" type="YesNoType">
+                <xs:annotation><xs:documentation>Whether the whole file should be installed, rather than creating a binary patch.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="SymbolPath">
+        <xs:annotation><xs:documentation>A path to symbols.</xs:documentation></xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Path" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>The path.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+  
+    <xs:element name="Package">
+        <xs:annotation>
+            <xs:documentation>
+            Properties about the package to be placed in the Summary Information Stream.  These are
+            visible from COM through the IStream interface, and these properties can be seen on the package in Explorer.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:remarks>
+                    <html:p>You can specify any valid Windows code by by integer like 1252, or by web name like Windows-1252. See <html:a href="codepage.htm">Code Pages</html:a> for more information.</html:p>
+                </xse:remarks>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="AutogenGuid">
+                <xs:annotation>
+                    <xs:documentation>
+                        The package code GUID for a product or merge module.
+                        When compiling a product, this attribute should not be set in order to allow the package
+                        code to be generated for each build.
+                        When compiling a merge module, this attribute must be set to the modularization guid.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="AdminImage" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Set to 'yes' if the source is an admin image.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Comments" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Optional comments for browsing.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Compressed" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>
+                        Set to 'yes' to have compressed files in the source.
+                        This attribute cannot be set for merge modules.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Description" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>The product full name or description.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="InstallPrivileges">
+                <xs:annotation>
+                    <xs:documentation>Use this attribute to specify the priviliges required to install the package on Windows Vista and above.</xs:documentation>
+                </xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="limited">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Set this value to declare that the package does not require elevated privileges to install.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="elevated">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Set this value to declare that the package requires elevated privileges to install.
+                                    This is the default value.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="InstallScope">
+                <xs:annotation>
+                    <xs:documentation>Use this attribute to specify the installation scope of this package: per-machine or per-user.</xs:documentation>
+                </xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="perMachine">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Set this value to declare that the package is a per-machine installation and requires elevated privileges to install.
+                                    Sets the ALLUSERS property to 1.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="perUser">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Set this value to declare that the package is a per-user installation and does not require elevated privileges to install.
+                                    Sets the package's InstallPrivileges attribute to "limited."
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="InstallerVersion" type="xs:integer">
+                <xs:annotation>
+                    <xs:documentation>
+                        The minimum version of the Windows Installer required to install this package. Take the major version of the required Windows Installer
+                        and multiply by a 100 then add the minor version of the Windows Installer. For example, "200" would represent Windows Installer 2.0 and
+                        "405" would represent Windows Installer 4.5. For 64-bit Windows Installer packages, this property is set to 200 by default as
+                        Windows Installer 2.0 was the first version to support 64-bit packages.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Keywords" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Optional keywords for browsing.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Languages" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>The list of language IDs (LCIDs) supported in the package.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Manufacturer" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>The vendor releasing the package.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Platforms" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        The list of platforms supported by the package. This attribute has been deprecated.
+                        Use the Platform attribute instead.
+                    </xs:documentation>
+                    <xs:appinfo>
+                        <xse:deprecated ref="Platform" />
+                    </xs:appinfo>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Platform">
+                <xs:annotation>
+                    <xs:documentation>The platform supported by the package.</xs:documentation>
+                </xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="x86">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Set this value to declare that the package is an x86 package.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="ia64">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Set this value to declare that the package is an ia64 package.
+                                    This value requires that the InstallerVersion property be set to 200 or greater.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="x64">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Set this value to declare that the package is an x64 package.
+                                    This value requires that the InstallerVersion property be set to 200 or greater.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="intel">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    This value has been deprecated. Use &quot;x86&quot; instead.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="intel64">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    This value has been deprecated. Use &quot;ia64&quot; instead.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="ReadOnly" type="YesNoDefaultType">
+                <xs:annotation>
+                    <xs:documentation>
+                        The value of this attribute conveys whether the package should be opened as read-only.
+                        A database editing tool should not modify a read-only enforced database and should
+                        issue a warning at attempts to modify a read-only recommended database.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ShortNames" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Set to 'yes' to have short filenames in the source.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SummaryCodepage" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>The code page integer value or web name for summary info strings only.  See remarks for more information.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="AssemblyName">
+        <xs:annotation>
+            <xs:documentation>
+                The MsiAssemblyName table specifies the schema for the elements of a strong assembly cache name for a .NET Framework or Win32 assembly.
+                Consider using the Assembly attribute on File element to have the toolset populate these entries automatically.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="MsiAssemblyName" href="http://msdn.microsoft.com/library/aa370062.aspx" />
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" use="required" type="xs:string">
+                <xs:annotation><xs:documentation>Name of the attribute associated with the value specified in the Value column.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Value" type="xs:string">
+                <xs:annotation><xs:documentation>Value associated with the name specified in the Name column.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="PatchCertificates">
+        <xs:annotation>
+            <xs:documentation>
+                Identifies the possible signer certificates used to digitally sign patches.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="MsiPatchCertificate" href="http://msdn.microsoft.com/library/aa370342.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice maxOccurs="unbounded">
+                <xs:element ref="DigitalCertificate" />
+            </xs:choice>
+        </xs:complexType>
+    </xs:element>
+  
+    <xs:element name="PackageCertificates">
+      <xs:annotation>
+        <xs:documentation>
+          Digital signatures that identify installation packages in a multi-product transaction.
+        </xs:documentation>
+        <xs:appinfo>
+          <xse:msiRef table="MsiPackageCertificate" href="http://msdn.microsoft.com/library/cc542575.aspx" />
+        </xs:appinfo>
+      </xs:annotation>
+      <xs:complexType>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="DigitalCertificate" />
+        </xs:choice>
+      </xs:complexType>
+    </xs:element>
+
+    <xs:element name="DigitalCertificate">
+        <xs:annotation>
+            <xs:documentation>
+                Adds a digital certificate.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="MsiDigitalCertificate" href="http://msdn.microsoft.com/library/aa370086.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Identifier for a certificate file.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SourceFile" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>The path to the certificate file.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="DigitalSignature">
+        <xs:annotation>
+            <xs:documentation>
+                Adds a digital signature.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="MsiDigitalSignature" href="http://msdn.microsoft.com/library/aa370087.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice>
+                <xs:element ref="DigitalCertificate"/>
+            </xs:choice>
+
+            <xs:attribute name="SourceFile" type="xs:string">
+                <xs:annotation><xs:documentation>The path to signature's optional hash file.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="SFPCatalog">
+        <xs:annotation>
+            <xs:documentation>
+                Adds a system file protection update catalog file
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="SFPCatalog" href="http://msdn.microsoft.com/library/aa371833.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="SFPCatalog" minOccurs="0" maxOccurs="unbounded"/>
+                <xs:element ref="SFPFile" minOccurs="0" maxOccurs="unbounded">
+                    <xs:annotation><xs:documentation>Primary Key to File Table.</xs:documentation></xs:annotation>
+                </xs:element>
+            </xs:choice>
+
+            <xs:attribute name="Name" type="xs:string">
+                <xs:annotation><xs:documentation>Filename for catalog file when installed.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Dependency" type="xs:string">
+                <xs:annotation><xs:documentation>Used to define dependency outside of the package.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SourceFile" type="xs:string">
+                <xs:annotation><xs:documentation>Path to catalog file in binary.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="SFPFile">
+        <xs:annotation>
+            <xs:documentation>
+                Provides a many-to-many mapping from the SFPCatalog table to the File table
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="FileSFPCatalog" href="http://msdn.microsoft.com/library/aa368591.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" use="required" type="xs:string">
+                <xs:annotation><xs:documentation>Primary Key to File Table.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            </xs:complexType>
+    </xs:element>
+
+    <xs:element name="IniFile">
+        <xs:annotation>
+            <xs:documentation>
+                Adds or removes .ini file entries.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="IniFile" href="http://msdn.microsoft.com/library/aa369282.aspx"/>
+                <xse:msiRef table="RemoveIniFile" href="http://msdn.microsoft.com/library/aa371204.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" use="required" type="xs:string">
+                <xs:annotation><xs:documentation>Identifier for ini file.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Action" use="required">
+                <xs:annotation><xs:documentation>The type of modification to be made.</xs:documentation></xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="addLine">
+                            <xs:annotation><xs:documentation>Creates or updates an .ini entry.</xs:documentation></xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="addTag">
+                            <xs:annotation><xs:documentation>Creates a new entry or appends a new comma-separated value to an existing entry.</xs:documentation></xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="createLine">
+                            <xs:annotation><xs:documentation>Creates an .ini entry only if the entry does no already exist.</xs:documentation></xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="removeLine">
+                            <xs:annotation><xs:documentation>Removes an .ini entry.</xs:documentation></xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="removeTag">
+                            <xs:annotation><xs:documentation>Removes a tag from an .ini entry.</xs:documentation></xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="Directory" type="xs:string">
+                <xs:annotation><xs:documentation>Name of a property, the value of which is the full path of the folder containing the .ini file. Can be name of a directory in the Directory table, a property set by the AppSearch table, or any other property representing a full path.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Key" use="required" type="xs:string">
+                <xs:annotation><xs:documentation>The localizable .ini file key within the section.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="LongName" type="LongFileNameType">
+                <xs:annotation>
+                    <xs:documentation>
+                        This attribute has been deprecated. Use the Name attribute instead.
+                    </xs:documentation>
+                    <xs:appinfo>
+                        <xse:deprecated ref="Name" />
+                    </xs:appinfo>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Name" type="LongFileNameType" use="required">
+                <xs:annotation>
+                    <xs:documentation>
+                        In prior versions of the WiX toolset, this attribute specified the short name.
+                        This attribute's value may now be either a short or long name.
+                        If a short name is specified, the ShortName attribute may not be specified.
+                        If a long name is specified, the LongName attribute may not be specified.
+                        Also, if this value is a long name, the ShortName attribute may be omitted to
+                        allow WiX to attempt to generate a unique short name.
+                        However, if this name collides with another file or you wish to manually specify
+                        the short name, then the ShortName attribute may be specified.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Section" use="required" type="xs:string">
+                <xs:annotation><xs:documentation>The localizable .ini file section.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ShortName" type="ShortFileNameType">
+                <xs:annotation>
+                    <xs:documentation>
+                        The short name of the in 8.3 format.
+                        This attribute should only be set if there is a conflict between generated short names
+                        or the user wants to manually specify the short name.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Value" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        The localizable value to be written or deleted.  This attribute must be set if
+                        the Action attribute's value is "addLine", "addTag", or "createLine".
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="ODBCDataSource">
+        <xs:annotation>
+            <xs:documentation>
+                ODBCDataSource for a Component
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="ODBCDataSource" href="http://msdn.microsoft.com/library/aa370546.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element ref="Property" minOccurs="0" maxOccurs="unbounded">
+                    <xs:annotation><xs:documentation>Translates into ODBCSourceAttributes</xs:documentation></xs:annotation>
+                </xs:element>
+            </xs:sequence>
+
+            <xs:attribute name="Id" use="required" type="xs:string">
+                <xs:annotation><xs:documentation>Identifier of the data source.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Name" use="required" type="xs:string">
+                <xs:annotation><xs:documentation>Name for the data source.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DriverName" type="xs:string">
+                <xs:annotation><xs:documentation>Required if not found as child of ODBCDriver element</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Registration" use="required">
+                <xs:annotation><xs:documentation>Scope for which the data source should be registered.</xs:documentation></xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="machine">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Data source is registered per machine.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="user">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Data source is registered per user.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="KeyPath" type="YesNoType">
+                <xs:annotation><xs:documentation>Set 'yes' to force this file to be key path for parent Component</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="ODBCDriver">
+        <xs:annotation>
+            <xs:documentation>
+                ODBCDriver for a Component
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="ODBCDriver" href="http://msdn.microsoft.com/library/aa370547.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element ref="Property" minOccurs="0" maxOccurs="unbounded">
+                    <xs:annotation><xs:documentation>Translates into ODBCSourceAttributes</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="ODBCDataSource" minOccurs="0" maxOccurs="unbounded"/>
+            </xs:sequence>
+
+            <xs:attribute name="Id" use="required" type="xs:string">
+                <xs:annotation><xs:documentation>Identifier for the driver.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Name" use="required" type="xs:string">
+                <xs:annotation><xs:documentation>Name for the driver.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="File" type="xs:string">
+                <xs:annotation><xs:documentation>Required if not found as child of File element</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SetupFile" type="xs:string">
+                <xs:annotation><xs:documentation>Required if not found as child of File element or different from File attribute above</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="ODBCTranslator">
+        <xs:annotation>
+            <xs:documentation>
+                ODBCTranslator for a Component
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="ODBCTranslator" href="http://msdn.microsoft.com/library/aa370549.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" use="required" type="xs:string">
+                <xs:annotation><xs:documentation>Identifier for the translator.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Name" use="required" type="xs:string">
+                <xs:annotation><xs:documentation>Name for the translator.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="File" type="xs:string">
+                <xs:annotation><xs:documentation>Required if not found as child of File element</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SetupFile" type="xs:string">
+                <xs:annotation><xs:documentation>Required if not found as child of File element or different from File attribute above</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="FileSearch">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="ComponentSearch"/>
+                <xse:seeAlso ref="DirectorySearch"/>
+                <xse:seeAlso ref="DirectorySearchRef"/>
+                <xse:seeAlso ref="FileSearchRef"/>
+                <xse:seeAlso ref="IniFileSearch"/>
+                <xse:seeAlso ref="RegistrySearch"/>
+                <xse:msiRef table="DrLocator" href="http://msdn.microsoft.com/library/aa368331.aspx"/>
+                <xse:msiRef table="Signature" href="http://msdn.microsoft.com/library/aa371853.aspx"/>
+                <xse:howtoRef href="check_the_version_number.htm">How To: Check the version number of a file during installation</xse:howtoRef>
+                <xse:remarks>
+                    <html:a>When the parent DirectorySearch/@Depth attribute is greater than 0, the FileSearch/@Id attribute must be absent or the same as the parent DirectorySearch/@Id attribute value, unless the parent DirectorySearch/@AssignToProperty attribute value is 'yes'.</html:a>
+                </xse:remarks>
+            </xs:appinfo>
+            <xs:documentation>Searches for file and assigns to fullpath value of parent Property</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string">
+                <xs:annotation><xs:documentation>Unique identifier for the file search and external key into the Signature table. If this attribute value is not set then the parent element's @Id attribute is used.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Name" type="LongFileNameType">
+                <xs:annotation>
+                    <xs:documentation>
+                        In prior versions of the WiX toolset, this attribute specified the short file name.
+                        This attribute's value may now be either a short or long file name.
+                        If a short file name is specified, the ShortName attribute may not be specified.
+                        If a long file name is specified, the LongName attribute may not be specified.
+                        If you wish to manually specify the short file name, then the ShortName
+                        attribute may be specified.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="LongName" type="LongFileNameType">
+                <xs:annotation>
+                    <xs:documentation>
+                        This attribute has been deprecated. Use the Name attribute instead.
+                    </xs:documentation>
+                    <xs:appinfo>
+                        <xse:deprecated ref="Name" />
+                    </xs:appinfo>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ShortName" type="ShortFileNameType">
+                <xs:annotation>
+                    <xs:documentation>
+                        The short file name of the file in 8.3 format.
+                        There is a Windows Installer bug which prevents the FileSearch functionality from working
+                        if both a short and long file name are specified.  Since the Name attribute allows either
+                        a short or long name to be specified, it is the only attribute related to file names which
+                        should be specified.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="MinSize" type="xs:int">
+                <xs:annotation><xs:documentation>The minimum size of the file.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="MaxSize" type="xs:int">
+                <xs:annotation><xs:documentation>The maximum size of the file.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="MinVersion" type="xs:string">
+                <xs:annotation><xs:documentation>The minimum version of the file.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="MaxVersion" type="xs:string">
+                <xs:annotation><xs:documentation>The maximum version of the file.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="MinDate" type="xs:dateTime">
+                <xs:annotation><xs:documentation>The minimum modification date and time of the file. Formatted as YYYY-MM-DDTHH:mm:ss, where YYYY is the year, MM is month, DD is day, 'T' is literal, HH is hour, mm is minute and ss is second.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="MaxDate" type="xs:dateTime">
+                <xs:annotation><xs:documentation>The maximum modification date and time of the file. Formatted as YYYY-MM-DDTHH:mm:ss, where YYYY is the year, MM is month, DD is day, 'T' is literal, HH is hour, mm is minute and ss is second.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Languages" type="xs:string">
+                <xs:annotation><xs:documentation>The languages supported by the file.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="FileSearchRef">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="FileSearch"/>
+                <xse:remarks>
+                    <html:p>A reference to another FileSearch element must reference the same Id and the same Parent Id. If any of these attribute values are different you must instead use a FileSearch element.</html:p>
+                </xse:remarks>
+            </xs:appinfo>
+            <xs:documentation>References an existing FileSearch element.</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" use="required" type="xs:string">
+                <xs:annotation><xs:documentation>Specify the Id to the FileSearch to reference.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="DirectorySearch">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="ComponentSearch"/>
+                <xse:seeAlso ref="IniFileSearch"/>
+                <xse:seeAlso ref="RegistrySearch"/>
+                <xse:msiRef table="DrLocator" href="http://msdn.microsoft.com/library/aa368331.aspx"/>
+                <xse:msiRef table="Signature" href="http://msdn.microsoft.com/library/aa371853.aspx"/>
+                <xse:howtoRef href="check_the_version_number.htm">How To: Check the version number of a file during installation</xse:howtoRef>
+                <xse:howtoRef href="directorysearchref.htm">How To: Reference another DirectorySearch element</xse:howtoRef>
+                <xse:howtoRef href="parentdirectorysearch.htm">How To: Get the parent directory of a file search</xse:howtoRef>
+                <xse:remarks>
+                    <html:p>Use the AssignToProperty attribute to search for a file but set the outer property to the directory containing the file. When this attribute is set to 'yes', you may only nest a FileSearch element with a unique Id or define no child element.</html:p>
+                    <html:a>When the parent DirectorySearch/@Depth attribute is greater than 1, the FileSearch/@Id attribute must be absent or the same as the parent DirectorySearch/@Id attribute value, unless the parent DirectorySearch/@AssignToProperty attribute value is 'yes'.</html:a>
+                </xse:remarks>
+            </xs:appinfo>
+            <xs:documentation>Searches for directory and assigns to value of parent Property.</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0">
+                <xs:element ref="DirectorySearch"/>
+                <xs:element ref="DirectorySearchRef"/>
+                <xs:element ref="FileSearch"/>
+                <xs:element ref="FileSearchRef"/>
+            </xs:choice>
+
+            <xs:attribute name="Id" use="required" type="xs:string">
+                <xs:annotation><xs:documentation>Unique identifier for the directory search.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Path" type="xs:string">
+                <xs:annotation><xs:documentation>Path on the user's system. Either absolute, or relative to containing directories.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Depth" type="xs:integer">
+                <xs:annotation>
+                    <xs:documentation>
+                        Depth below the path that the installer searches for the file or directory specified by the search. See remarks for more information.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="AssignToProperty" type="YesNoType">
+                <xs:annotation><xs:documentation>Set the value of the outer Property to the result of this search. See remarks for more information.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="DirectorySearchRef">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="ComponentSearch"/>
+                <xse:seeAlso ref="IniFileSearch"/>
+                <xse:seeAlso ref="RegistrySearch"/>
+                <xse:howtoRef href="directorysearchref.htm">How To: Reference another DirectorySearch element</xse:howtoRef>
+                <xse:remarks>
+                    <html:p>A reference to another DirectorySearch element must reference the same Id, the same Parent Id, and the same Path. If any of these attribute values are different you must instead use a DirectorySearch element.</html:p>
+                </xse:remarks>
+            </xs:appinfo>
+            <xs:documentation>References an existing DirectorySearch element.</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0">
+                <xs:element ref="DirectorySearch"/>
+                <xs:element ref="DirectorySearchRef"/>
+                <xs:element ref="FileSearch"/>
+                <xs:element ref="FileSearchRef"/>
+            </xs:choice>
+
+            <xs:attribute name="Id" use="required" type="xs:string">
+                <xs:annotation><xs:documentation>Id of the search being referred to.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Parent" type="xs:string">
+                <xs:annotation><xs:documentation>This attribute is the signature of the parent directory of the file or directory in the Signature_ column. If this field is null, and the Path column does not expand to a full path, then all the fixed drives of the user's system are searched by using the Path.  This field is a key into one of the following tables: the RegLocator, the IniLocator, the CompLocator, or the DrLocator tables.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Path" type="xs:string">
+                <xs:annotation><xs:documentation>Path on the user's system. Either absolute, or relative to containing directories.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="ComponentSearch">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="IniFileSearch"/>
+                <xse:seeAlso ref="RegistrySearch"/>
+                <xse:msiRef table="CompLocator" href="http://msdn.microsoft.com/library/aa368001.aspx"/>
+                <xse:msiRef table="Signature" href="http://msdn.microsoft.com/library/aa371853.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Searches for file or directory and assigns to value of parent Property.</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0">
+                <xs:element ref="DirectorySearch"/>
+                <xs:element ref="DirectorySearchRef"/>
+                <xs:element ref="FileSearch"/>
+                <xs:element ref="FileSearchRef"/>
+            </xs:choice>
+
+            <xs:attribute name="Id" use="required" type="xs:string"/>
+            <xs:attribute name="Guid" type="Guid">
+                <xs:annotation><xs:documentation>The component ID of the component whose key path is to be used for the search.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Type">
+                <xs:annotation><xs:documentation>Must be file if last child is FileSearch element and must be directory if last child is DirectorySearch element.</xs:documentation></xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="directory">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    The key path of the component is a directory.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="file">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    The key path of the component is a file.  This is the default value.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="IniFileSearch">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="ComponentSearch"/>
+                <xse:seeAlso ref="RegistrySearch"/>
+                <xse:msiRef table="IniLocator" href="http://msdn.microsoft.com/library/aa369283.aspx"/>
+                <xse:msiRef table="Signature" href="http://msdn.microsoft.com/library/aa371853.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Searches for file, directory or registry key and assigns to value of parent Property</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0">
+                <xs:element ref="DirectorySearch"/>
+                <xs:element ref="DirectorySearchRef"/>
+                <xs:element ref="FileSearch"/>
+                <xs:element ref="FileSearchRef"/>
+            </xs:choice>
+
+            <xs:attribute name="Id" use="required" type="xs:string">
+                <xs:annotation><xs:documentation>External key into the Signature table.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Field" type="xs:integer">
+                <xs:annotation><xs:documentation>The field in the .ini line. If field is Null or 0, the entire line is read.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Key" use="required" type="xs:string">
+                <xs:annotation><xs:documentation>The key value within the section.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="LongName" type="LongFileNameType">
+                <xs:annotation>
+                    <xs:documentation>
+                        This attribute has been deprecated. Use the Name attribute instead.
+                    </xs:documentation>
+                    <xs:appinfo>
+                        <xse:deprecated ref="Name" />
+                    </xs:appinfo>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Name" type="LongFileNameType" use="required">
+                <xs:annotation>
+                    <xs:documentation>
+                        In prior versions of the WiX toolset, this attribute specified the short name.
+                        This attribute's value may now be either a short or long name.
+                        If a short name is specified, the ShortName attribute may not be specified.
+                        If a long name is specified, the LongName attribute may not be specified.
+                        Also, if this value is a long name, the ShortName attribute may be omitted to
+                        allow WiX to attempt to generate a unique short name.
+                        However, if you wish to manually specify the short name, then the ShortName
+                        attribute may be specified.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Section" use="required" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>The localizable .ini file section.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ShortName" type="ShortFileNameType">
+                <xs:annotation>
+                    <xs:documentation>
+                        The short name of the file in 8.3 format.
+                        This attribute should only be set if the user wants to manually specify the short name.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Type">
+                <xs:annotation><xs:documentation>Must be file if last child is FileSearch element and must be directory if last child is DirectorySearch element.</xs:documentation></xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="directory">
+                            <xs:annotation><xs:documentation>A directory location.</xs:documentation></xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="file">
+                            <xs:annotation><xs:documentation>A file location.  This is the default value.</xs:documentation></xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="raw">
+                            <xs:annotation><xs:documentation>A raw .ini value.</xs:documentation></xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="RegistrySearch">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="ComponentSearch"/>
+                <xse:seeAlso ref="IniFileSearch"/>
+                <xse:msiRef table="RegLocator" href="http://msdn.microsoft.com/library/aa371171.aspx"/>
+                <xse:msiRef table="Signature" href="http://msdn.microsoft.com/library/aa371853.aspx"/>
+                <xse:howtoRef href="read_a_registry_entry.htm">How To: Read a registry entry during installation</xse:howtoRef>
+                <xse:remarks>
+                    <html:p>
+                        When the Type attribute value is 'directory' the registry value must specify the path to a directory excluding the file name.
+                        When the Type attribute value is 'file' the registry value must specify the path to a file including the file name;
+                        however, if there is no child FileSearch element the parent directory of the file is returned. The FileSearch element requires
+                        that you author the name of the file you are searching for. If you do not know the file name
+                        you must set the Type attribute to 'raw' to return the full file path including the file name.
+                    </html:p>
+                </xse:remarks>
+            </xs:appinfo>
+            <xs:documentation>Searches for file, directory or registry key and assigns to value of parent Property</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0">
+                <xs:element ref="DirectorySearch"/>
+                <xs:element ref="DirectorySearchRef"/>
+                <xs:element ref="FileSearch"/>
+                <xs:element ref="FileSearchRef"/>
+            </xs:choice>
+
+            <xs:attribute name="Id" use="required" type="xs:string">
+                <xs:annotation><xs:documentation>Signature to be used for the file, directory or registry key being searched for.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Root" use="required">
+                <xs:annotation><xs:documentation>Root key for the registry value.</xs:documentation></xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="HKCR">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    HKEY_CLASSES_ROOT
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="HKCU">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    HKEY_CURRENT_USER
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="HKLM">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    HKEY_LOCAL_MACHINE
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="HKU">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    HKEY_USERS
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="Key" use="required" type="xs:string">
+                <xs:annotation><xs:documentation>Key for the registry value.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Name" type="xs:string">
+                <xs:annotation><xs:documentation>Registry value name. If this value is null, then the value from the key's unnamed or default value, if any, is retrieved.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Type" use="required">
+                <xs:annotation>
+                    <xs:documentation>
+                        The value must be 'file' if the child is a FileSearch element, and must be 'directory' if child is a DirectorySearch element.
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="directory">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    The registry value contains the path to a directory.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="file">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    The registry value contains the path to a file. To return the full file path you must add a FileSearch element as a child of this element; otherwise, the parent directory of the file path is returned.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="raw">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Sets the raw value from the registry value.  Please note that this value will contain a prefix as follows:<html:br/><html:br/>
+                                    <html:dl>
+                                        <html:dt>DWORD</html:dt>
+                                        <html:dd>Starts with '#' optionally followed by '+' or '-'.</html:dd>
+                                        <html:dt>REG_BINARY</html:dt>
+                                        <html:dd>Starts with '#x' and the installer converts and saves each hexadecimal digit (nibble) as an ASCII character prefixed by '#x'.</html:dd>
+                                        <html:dt>REG_EXPAND_SZ</html:dt>
+                                        <html:dd>Starts with '#%'.</html:dd>
+                                        <html:dt>REG_MULTI_SZ</html:dt>
+                                        <html:dd>Starts with '[~]' and ends with '[~]'.</html:dd>
+                                        <html:dt>REG_SZ</html:dt>
+                                        <html:dd>No prefix, but if the first character of the registry value is '#', the installer escapes the character by prefixing it with another '#'.</html:dd>
+                                    </html:dl>
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="Win64" type="YesNoType">
+                <xs:annotation><xs:documentation>Instructs the search to look in the 64-bit registry when the value is 'yes'. When the value is 'no', the search looks in the 32-bit registry. The default value depends on the value of the Package/@Platform attribute: if the @Platform attribute value is 'x86', the default @Win64 attribute value is 'no'; otherwise, the default value is 'yes'.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="RegistrySearchRef">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="RegistrySearch"/>
+            </xs:appinfo>
+            <xs:documentation>References an existing RegistrySearch element.</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Specify the Id of the RegistrySearch to reference.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="ComplianceDrive">
+        <xs:annotation><xs:documentation>Sets the parent of a nested DirectorySearch element to CCP_DRIVE.</xs:documentation></xs:annotation>
+        <xs:complexType>
+            <xs:choice>
+                <xs:element ref="DirectorySearch"/>
+                <xs:element ref="DirectorySearchRef"/>
+            </xs:choice>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="ComplianceCheck">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="Property"/>
+                <xse:msiRef table="CCPSearch" href="http://msdn.microsoft.com/library/aa367846.aspx"/>
+                <xse:msiRef table="Signature" href="http://msdn.microsoft.com/library/aa371853.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Adds a row to the CCPSearch table.</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:sequence>
+                    <xs:element ref="ComplianceDrive" minOccurs="0">
+                        <xs:annotation><xs:documentation>Starts searches from the CCP_DRIVE.</xs:documentation></xs:annotation>
+                    </xs:element>
+                    <xs:element ref="ComponentSearch" minOccurs="0" maxOccurs="unbounded"/>
+                    <xs:element ref="RegistrySearch" minOccurs="0" maxOccurs="unbounded"/>
+                    <xs:element ref="IniFileSearch" minOccurs="0" maxOccurs="unbounded"/>
+                    <xs:element ref="DirectorySearch" minOccurs="0" maxOccurs="unbounded"/>
+                </xs:sequence>
+                <xs:any namespace="##other" processContents="lax">
+                    <xs:annotation><xs:documentation>
+                        Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                        elements at this point in the schema.
+                    </xs:documentation></xs:annotation>
+                </xs:any>
+            </xs:choice>
+            <xs:anyAttribute namespace="##other" processContents="lax">
+                <xs:annotation><xs:documentation>
+                    Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                    attributes at this point in the schema.
+                </xs:documentation></xs:annotation>
+            </xs:anyAttribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Property">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="PropertyRef"/>
+                <xse:msiRef table="Property" href="http://msdn.microsoft.com/library/aa370908.aspx"/>
+                <xse:howtoRef href="check_the_version_number.htm">How To: Check the version number of a file during installation</xse:howtoRef>                
+            </xs:appinfo>
+            <xs:documentation>Property value for a Product or Module.</xs:documentation>
+        </xs:annotation>
+        <xs:complexType mixed="true">
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:sequence>
+                    <xs:element ref="ComplianceDrive" minOccurs="0">
+                        <xs:annotation><xs:documentation>Starts searches from the CCP_DRIVE.</xs:documentation></xs:annotation>
+                    </xs:element>
+                    <xs:element ref="ComponentSearch" minOccurs="0" maxOccurs="unbounded"/>
+                    <xs:element ref="RegistrySearch" minOccurs="0" maxOccurs="unbounded"/>
+                    <xs:element ref="RegistrySearchRef" minOccurs="0" maxOccurs="unbounded"/>
+                    <xs:element ref="IniFileSearch" minOccurs="0" maxOccurs="unbounded"/>
+                    <xs:element ref="DirectorySearch" minOccurs="0" maxOccurs="unbounded"/>
+                    <xs:element ref="DirectorySearchRef" minOccurs="0" maxOccurs="unbounded"/>
+                </xs:sequence>
+                <xs:any namespace="##other" processContents="lax">
+                    <xs:annotation><xs:documentation>
+                        Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                        elements at this point in the schema.
+                    </xs:documentation></xs:annotation>
+                </xs:any>
+            </xs:choice>
+
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Unique identifier for Property.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Value" type="xs:string">
+                <xs:annotation><xs:documentation>Sets a default value for the property.  The value will be overwritten if the Property is used for a search.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ComplianceCheck" type="YesNoType">
+                <xs:annotation><xs:documentation>Adds a row to the CCPSearch table.  This attribute is only valid when this Property contains a search element.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Admin" type="YesNoType">
+                <xs:annotation><xs:documentation>Denotes that the Property is saved during <html:a href='http://msdn.microsoft.com/library/aa367541.aspx' target='_blank'>admininistrative installation</html:a>. See the <html:a href='http://msdn.microsoft.com/library/aa367542.aspx' target='_blank'>AdminProperties Property</html:a> for more information.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Secure" type="YesNoType">
+                <xs:annotation><xs:documentation>Denotes that the Property can be passed to the server side when doing a managed installation with elevated privileges. See the <html:a href='http://msdn.microsoft.com/library/aa371571.aspx' target='_blank'>SecureCustomProperties Property</html:a> for more information.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Hidden" type="YesNoType">
+                <xs:annotation><xs:documentation>Denotes that the Property is not logged during installation. See the <html:a href='http://msdn.microsoft.com/library/aa370308.aspx' target='_blank'>MsiHiddenProperties Property</html:a> for more information.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SuppressModularization" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>
+                        Use to suppress modularization of this property identifier in merge modules.
+                        Using this functionality is strongly discouraged; it should only be
+                        necessary as a workaround of last resort in rare scenarios.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:anyAttribute namespace="##other" processContents="lax">
+                <xs:annotation><xs:documentation>
+                    Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                    attributes at this point in the schema.
+                </xs:documentation></xs:annotation>
+            </xs:anyAttribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="PropertyRef">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="Property"/>
+                <xse:howtoRef href="check_for_dotnet.htm">How To: Check for .NET Framework versions</xse:howtoRef>
+            </xs:appinfo>
+            <xs:documentation>Reference to a Property value.</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Identifier of Property to reference.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:anyAttribute namespace="##other" processContents="lax">
+                <xs:annotation><xs:documentation>
+                    Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                    attributes at this point in the schema.
+                </xs:documentation></xs:annotation>
+            </xs:anyAttribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Shortcut">
+        <xs:annotation>
+            <xs:documentation>
+                Shortcut, default target is parent File, CreateFolder, or Component's Directory
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="Shortcut" href="http://msdn.microsoft.com/library/aa371847.aspx"/>
+                <xse:howtoRef href="create_start_menu_shortcut.htm">How To: Create a shortcut on the Start Menu</xse:howtoRef>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="Icon" minOccurs="0" />
+                <xs:element ref="ShortcutProperty" minOccurs="0" />
+            </xs:choice>
+
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Unique identifier for the shortcut. This value will serve as the primary key for the row.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Directory" type="xs:string">
+                <xs:annotation><xs:documentation>Identifier reference to Directory element where shortcut is to be created. When nested under a Component element, this attribute's value will default to the parent directory. Otherwise, this attribute is required.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Name" type="LongFileNameType" use="required">
+                <xs:annotation>
+                    <xs:documentation>
+                        In prior versions of the WiX toolset, this attribute specified the short name.
+                        This attribute's value may now be either a short or long name.
+                        If a short name is specified, the ShortName attribute may not be specified.
+                        If a long name is specified, the LongName attribute may not be specified.
+                        Also, if this value is a long name, the ShortName attribute may be omitted to
+                        allow WiX to attempt to generate a unique short name.
+                        However, if this name collides with another shortcut or you wish to manually specify
+                        the short name, then the ShortName attribute may be specified.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="LongName" type="LongFileNameType">
+                <xs:annotation>
+                    <xs:documentation>
+                        This attribute has been deprecated. Use the Name attribute instead.
+                    </xs:documentation>
+                    <xs:appinfo>
+                        <xse:deprecated ref="Name" />
+                    </xs:appinfo>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ShortName" type="ShortFileNameType">
+                <xs:annotation>
+                    <xs:documentation>
+                        The short name of the shortcut in 8.3 format.
+                        This attribute should only be set if there is a conflict between generated short names
+                        or the user wants to manually specify the short name.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Target" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        This attribute can only be set if this Shortcut element is nested under a Component element.
+                        When nested under a Component element, this attribute's value will default to the parent directory.
+                        This attribute's value is the target for a non-advertised shortcut.
+                        This attribute is not valid for advertised shortcuts.
+                        If you specify this value, its value should be a property identifier enclosed by square brackets ([ ]), that is expanded into the file or a folder pointed to by the shortcut.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Description" type="xs:string">
+                <xs:annotation><xs:documentation>The localizable description for the shortcut.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Arguments" type="xs:string">
+                <xs:annotation><xs:documentation>The command-line arguments for the shortcut. Note that the resolution of properties 
+                in the Arguments field is limited. A property formatted as [Property] in this field can only be resolved if the 
+                property already has the intended value when the component owning the shortcut is installed. For example, for the 
+                argument "[#MyDoc.doc]" to resolve to the correct value, the same process must be installing the file MyDoc.doc and 
+                the component that owns the shortcut.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Hotkey" type="xs:integer">
+                <xs:annotation><xs:documentation>The hotkey for the shortcut. The low-order byte contains the virtual-key code for 
+                the key, and the high-order byte contains modifier flags. This must be a non-negative number. Authors of 
+                installation packages are generally recommend not to set this option, because this can add duplicate hotkeys to a 
+                users desktop. In addition, the practice of assigning hotkeys to shortcuts can be problematic for users using hotkeys 
+                for accessibility.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Icon" type="xs:string">
+                <xs:annotation><xs:documentation>Identifier reference to Icon element. The Icon identifier should have the same extension 
+                as the file that it points at.  For example, a shortcut to an executable (e.g. "my.exe") should reference an Icon with identifier
+                like "MyIcon.exe"</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IconIndex" type="xs:integer">
+                <xs:annotation><xs:documentation>Identifier reference to Icon element.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Show">
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="normal">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    The shortcut target will be displayed using the SW_SHOWNORMAL attribute.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="minimized">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    The shortcut target will be displayed using the SW_SHOWMINNOACTIVE attribute.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="maximized">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    The shortcut target will be displayed using the SW_SHOWMAXIMIZED attribute.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="WorkingDirectory" type="xs:string">
+                <xs:annotation><xs:documentation>Directory identifier (or Property identifier that resolves to a directory) that resolves
+                to the path of the working directory for the shortcut.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Advertise" type="YesNoType">
+                <xs:annotation><xs:documentation>Specifies if the shortcut should be advertised or not. Note that advertised shortcuts 
+                always point at a particular application, identified by a ProductCode, and should not be shared between applications. 
+                Advertised shortcuts only work for the most recently installed application, and are removed when that application is 
+                removed.  The default value is 'no'.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DisplayResourceDll" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        The Formatted string providing the full path to the language neutral file containing the MUI Manifest.   Generally 
+                        authored using [#filekey] form.  When this attribute is specified, the DisplayResourceId attribute must also 
+                        be provided.
+
+                        This attribute is only used on Windows Vista and above.  If this attribute is not populated and the install 
+                        is running on Vista and above, the value in the Name attribute is used.  If this attribute is populated and 
+                        the install is running on Vista and above, the value in the Name attribute is ignored.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DisplayResourceId" type="xs:integer">
+                <xs:annotation>
+                    <xs:documentation>
+                        The display name index for the shortcut. This must be a non-negative number.  When this attribute is specified, the 
+                        DisplayResourceDll attribute must also be provided.
+
+                        This attribute is only used on Windows Vista and above.  If this attribute is not specified and the install 
+                        is running on Vista and above, the value in the Name attribute is used.  If this attribute is specified and 
+                        the install is running on Vista and above, the value in the Name attribute is ignored.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DescriptionResourceDll" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        The Formatted string providing the full path to the language neutral file containing the MUI Manifest.   Generally 
+                        authored using [#filekey] form.  When this attribute is specified, the DescriptionResourceId attribute must also 
+                        be provided.
+
+                        This attribute is only used on Windows Vista and above.  If this attribute is not specified and the install 
+                        is running on Vista and above, the value in the Name attribute is used.  If this attribute is provided and 
+                        the install is running on Vista and above, the value in the Name attribute is ignored.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DescriptionResourceId" type="xs:integer">
+                <xs:annotation>
+                    <xs:documentation>
+                        The description name index for the shortcut. This must be a non-negative number.  When this attribute is specified,
+                        the DescriptionResourceDll attribute must also be populated.
+
+                        This attribute is only used on Windows Vista and above.  If this attribute is not specified and the install 
+                        is running on Vista and above, the value in the Name attribute is used.  If this attribute is populated and the
+                        install is running on Vista and above, the value in the Name attribute is ignored.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="ShortcutProperty">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="Shortcut"/>
+                <xse:msiRef table="MsiShortcutProperty" />
+            </xs:appinfo>
+            <xs:documentation>Property values for a shortcut. This element's functionality is available starting with MSI 5.0.</xs:documentation>
+        </xs:annotation>
+        <xs:complexType mixed="true">
+            <xs:attribute name="Id" type="xs:string">
+                <xs:annotation><xs:documentation>Unique identifier for MsiShortcutProperty table. If omitted, a stable identifier will be generated from the parent shortcut identifier and Key value.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Key" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>A formatted string identifying the property to be set.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Value" type="xs:string">
+                <xs:annotation><xs:documentation>A formatted string supplying the value of the property.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Permission">
+        <xs:annotation>
+            <xs:documentation>
+                Sets ACLs on File, Registry, or CreateFolder.  When under a Registry element, this cannot be used
+                if the Action attribute's value is remove or removeKeyOnInstall.  This element has no Id attribute.
+                The table and key are taken from the parent element.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="LockPermissions" href="http://msdn.microsoft.com/library/aa369774.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Domain" type="xs:string">
+            </xs:attribute>
+            <xs:attribute name="User" use="required" type="xs:string">
+            </xs:attribute>
+            <!-- Common ACLs -->
+            <xs:attribute name="Read" type="YesNoType">
+            </xs:attribute>
+            <xs:attribute name="Delete" type="YesNoType">
+            </xs:attribute>
+            <xs:attribute name="ReadPermission" type="YesNoType">
+            </xs:attribute>
+            <xs:attribute name="ChangePermission" type="YesNoType">
+            </xs:attribute>
+            <xs:attribute name="TakeOwnership" type="YesNoType">
+            </xs:attribute>
+            <!-- Folder and File ACLs -->
+            <xs:attribute name="ReadAttributes" type="YesNoType">
+            </xs:attribute>
+            <xs:attribute name="WriteAttributes" type="YesNoType">
+            </xs:attribute>
+            <xs:attribute name="ReadExtendedAttributes" type="YesNoType">
+            </xs:attribute>
+            <xs:attribute name="WriteExtendedAttributes" type="YesNoType">
+            </xs:attribute>
+            <xs:attribute name="Synchronize" type="YesNoType">
+            </xs:attribute>
+            <!-- Folder only ACLs -->
+            <xs:attribute name="CreateFile" type="YesNoType">
+                <xs:annotation><xs:documentation>For a directory, the right to create a file in the directory.  Only valid under a 'CreateFolder' parent.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="CreateChild" type="YesNoType">
+                <xs:annotation><xs:documentation>For a directory, the right to create a subdirectory.  Only valid under a 'CreateFolder' parent.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DeleteChild" type="YesNoType">
+                <xs:annotation><xs:documentation>For a directory, the right to delete a directory and all the files it contains, including read-only files.  Only valid under a 'CreateFolder' parent.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Traverse" type="YesNoType">
+                <xs:annotation><xs:documentation>For a directory, the right to traverse the directory.  By default, users are assigned the BYPASS_TRAVERSE_CHECKING privilege, which ignores the FILE_TRAVERSE access right.  Only valid under a 'CreateFolder' parent.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <!-- File only ACLs -->
+            <xs:attribute name="Append" type="YesNoType">
+            </xs:attribute>
+            <xs:attribute name="Execute" type="YesNoType">
+            </xs:attribute>
+            <!-- File and Registry ACLs -->
+            <xs:attribute name="Write" type="YesNoType">
+            </xs:attribute>
+            <!-- Registry only ACLs -->
+            <xs:attribute name="CreateSubkeys" type="YesNoType">
+            </xs:attribute>
+            <xs:attribute name="EnumerateSubkeys" type="YesNoType">
+            </xs:attribute>
+            <xs:attribute name="Notify" type="YesNoType">
+            </xs:attribute>
+            <xs:attribute name="CreateLink" type="YesNoType">
+            </xs:attribute>
+            <!-- Generic ACLs, mapped by system to appropriate permissions -->
+            <xs:attribute name="GenericAll" type="YesNoType">
+            </xs:attribute>
+            <xs:attribute name="GenericExecute" type="YesNoType">
+            </xs:attribute>
+            <xs:attribute name="GenericWrite" type="YesNoType">
+            </xs:attribute>
+            <xs:attribute name="GenericRead" type="YesNoType">
+                <xs:annotation><xs:documentation>specifying this will fail to grant read access</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="PermissionEx">
+        <xs:annotation>
+            <xs:documentation>
+                Sets ACLs on File, Registry, or CreateFolder.  When under a Registry element, this cannot be used
+                if the Action attribute's value is remove or removeKeyOnInstall.  This element is only available
+                when installing with MSI 5.0.  For downlevel support, see the PermissionEx element from the
+                WixUtilExtension.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="MsiLockPermissionsEx" href="http://msdn.microsoft.com/library/aa369774.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element ref="Condition" minOccurs="0">
+                    <xs:annotation><xs:documentation>
+                        Optional condition that controls whether the permissions are applied.
+                    </xs:documentation></xs:annotation>
+                </xs:element>
+            </xs:sequence>
+
+            <xs:attribute name="Id" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    Primary key used to identify this particular entry. If this is not specified the parent element's Id attribute
+                    will be used instead.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Sddl" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>
+                    Security descriptor to apply to parent object.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="CopyFile">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="RemoveFile" />
+                <xse:msiRef table="DuplicateFile" href="http://msdn.microsoft.com/library/aa368335.aspx"/>
+                <xse:msiRef table="MoveFile" href="http://msdn.microsoft.com/library/aa370055.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>
+                Copy or move an existing file on the target machine, or copy a file that is being installed, to another destination.  When
+                this element is nested under a File element, the parent file will be installed, then copied to the specified destination
+                if the parent component of the file is selected for installation or removal.  When this element is nested under
+                a Component element and no FileId attribute is specified, the file to copy or move must already be on the target machine.
+                When this element is nested under a Component element and the FileId attribute is specified, the specified file is installed,
+                then copied to the specified destination if the parent component is selected for installation or removal (use
+                this option to control the copy of a file in a different component by the parent component's installation state).  If the 
+                specified destination directory is the same as the directory containing the original file and the name for the proposed source
+                file is the same as the original, then no action takes place.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Primary key used to identify this particular entry.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="FileId" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    This attribute cannot be specified if the element is nested under a File element.  Set this attribute's value to the identifier
+                    of a file from a different component to copy it based on the install state of the parent component.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SourceDirectory" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    This attribute cannot be specified if the element is nested under a File element or the FileId attribute is specified.  Set
+                    this value to the source directory from which to copy or move an existing file on the target machine.  This Directory must
+                    exist in the installer database at creation time.  This attribute cannot be specified in conjunction with SourceProperty.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SourceProperty" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    This attribute cannot be specified if the element is nested under a File element or the FileId attribute is specified.  Set
+                    this value to a property that will have a value that resolves to the full path of the source directory (or full path
+                    including file name if SourceName is not specified).  The property does not have to exist in the installer database at
+                    creation time; it could be created at installation time by a custom action, on the command line, etc.  This attribute
+                    cannot be specified in conjunction with SourceDirectory.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SourceName" type="WildCardLongFileNameType">
+                <xs:annotation><xs:documentation>
+                    This attribute cannot be specified if the element is nested under a File element or the FileId attribute is specified.  Set
+                    this value to the localizable name of the file(s) to be copied or moved.  All of the files that
+                    match the wild card will be removed from the specified directory.  The value is a filename that may also
+                    contain the wild card characters "?" for any single character or "*" for zero or more occurrences of any character.  If this
+                    attribute is not specified (and this element is not nested under a File element or specify a FileId attribute) then the
+                    SourceProperty attribute should be set to the name of a property that will resolve to the full path of the source filename.
+                    If the value of this attribute contains a "*" wildcard and the DestinationName attribute is specified, all moved or copied
+                    files retain the file names from their sources.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DestinationDirectory" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    Set this value to the destination directory where an existing file on the target machine should be moved or copied to.  This
+                    Directory must exist in the installer database at creation time.  This attribute cannot be specified in conjunction with
+                    DestinationProperty.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DestinationProperty" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    Set this value to a property that will have a value that resolves to the full path of the destination directory.  The property
+                    does not have to exist in the installer database at creation time; it could be created at installation time by a custom
+                    action, on the command line, etc.  This attribute cannot be specified in conjunction with DestinationDirectory.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DestinationName" type="LongFileNameType">
+              <xs:annotation>
+                <xs:documentation>
+                  In prior versions of the WiX toolset, this attribute specified the short file name.
+                  Now set this value to the localizable name to be given to the original file after it is moved or copied.
+                  If this attribute is not specified, then the destination file is given the same name as the source file.
+                  If a short file name is specified, the DestinationShortName attribute may not be specified.
+                  If a long file name is specified, the DestinationLongName attribute may not be specified.
+                  Also, if this value is a long file name, the DestinationShortName attribute may be omitted to
+                  allow WiX to attempt to generate a unique short file name.
+                  However, if this name collides with another file or you wish to manually specify
+                  the short file name, then the DestinationShortName attribute may be specified.
+                </xs:documentation>
+              </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DestinationLongName" type="LongFileNameType">
+              <xs:annotation>
+                    <xs:documentation>
+                        This attribute has been deprecated. Use the DestinationName attribute instead.
+                    </xs:documentation>
+                <xs:appinfo>
+                  <xse:deprecated ref="DestinationName" />
+                </xs:appinfo>
+              </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DestinationShortName" type="ShortFileNameType">
+              <xs:annotation>
+                <xs:documentation>
+                  The short file name of the file in 8.3 format.
+                  This attribute should only be set if there is a conflict between generated short file names
+                  or you wish to manually specify the short file name.
+                </xs:documentation>
+              </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Delete" type="YesNoType">
+                <xs:annotation><xs:documentation>
+                    This attribute cannot be specified if the element is nested under a File element or the FileId attribute is specified.  In other
+                    cases, if the attribute is not specified, the default value is "no" and the file is copied, not moved.  Set the value to "yes"
+                    in order to move the file (thus deleting the source file) instead of copying it.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="File">
+        <xs:annotation>
+            <xs:documentation>
+                File specification for File table, must be child node of Component.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="File" href="http://msdn.microsoft.com/library/aa368596.aspx"/>
+                <xse:howtoRef href="add_a_file.htm">How To: Add a file to your installer</xse:howtoRef>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="AssemblyName"/>
+                <xs:element ref="Permission">
+                    <xs:annotation><xs:documentation>Used to configure the ACLs for this file.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="PermissionEx">
+                    <xs:annotation><xs:documentation>Can also configure the ACLs for this file.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="CopyFile">
+                    <xs:annotation><xs:documentation>Used to create a duplicate of this file elsewhere.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="Shortcut">
+                    <xs:annotation><xs:documentation>Target of the shortcut will be set to this file.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="ODBCDriver"/>
+                <xs:element ref="ODBCTranslator"/>
+                <xs:element ref="SymbolPath"/>
+                <xs:element ref="Class"/>
+                <xs:element ref="AppId"/>
+                <xs:element ref="TypeLib"/>
+                <xs:any namespace="##other" processContents="lax">
+                    <xs:annotation><xs:documentation>
+                        Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                        elements at this point in the schema.
+                    </xs:documentation></xs:annotation>
+                </xs:any>
+            </xs:choice>
+
+            <xs:attribute name="Id" type="xs:string">
+                <xs:annotation>
+                  <xs:documentation>
+                    The unique identifier for this File element. If you omit Id, it defaults to the file name portion of the Source attribute, if specified. May be referenced as a Property by specifying [#value].
+                  </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="CompanionFile" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Set this attribute to make this file a companion child of another file.  The installation 
+                    state of a companion file depends not on its own file versioning information, but on the versioning of its 
+                    companion parent.  A file that is the key path for its component can not be a companion file (that means 
+                    this attribute cannot be set if KeyPath="yes" for this file).  The Version attribute cannot be set along 
+                    with this attribute since companion files are not installed based on their own version.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Name" type="LongFileNameType">
+                <xs:annotation>
+                    <xs:documentation>
+                        In prior versions of the WiX toolset, this attribute specified the short file name.
+                        This attribute's value may now be either a short or long file name.
+                        If a short file name is specified, the ShortName attribute may not be specified.
+                        If a long file name is specified, the LongName attribute may not be specified.
+                        Also, if this value is a long file name, the ShortName attribute may be omitted to
+                        allow WiX to attempt to generate a unique short file name.
+                        However, if this name collides with another file or you wish to manually specify
+                        the short file name, then the ShortName attribute may be specified.
+                        Finally, if this attribute is omitted then its default value is the file name portion 
+                        of the Source attribute, if one is specified, or the value of the Id attribute, if 
+                        the Source attribute is omitted or doesn't contain a file name.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="LongName" type="LongFileNameType">
+                <xs:annotation>
+                    <xs:documentation>
+                        This attribute has been deprecated. Use the Name attribute instead.
+                    </xs:documentation>
+                    <xs:appinfo>
+                        <xse:deprecated ref="Name" />
+                    </xs:appinfo>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="KeyPath" type="YesNoType">
+                <xs:annotation><xs:documentation>Set to yes in order to force this file to be the key path for the parent component.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ShortName" type="ShortFileNameType">
+                <xs:annotation>
+                    <xs:documentation>
+                        The short file name of the file in 8.3 format.
+                        This attribute should only be set if there is a conflict between generated short file names
+                        or the user wants to manually specify the short file name.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <!-- 'Attributes' column integer value generated from XML attributes below -->
+            <xs:attribute name="ReadOnly" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Set to yes in order to have the file's read-only attribute set when it is installed on the target machine.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Hidden" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Set to yes in order to have the file's hidden attribute set when it is installed on the target machine.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="System" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Set to yes in order to have the file's system attribute set when it is installed on the target machine.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Vital" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>If a file is vital, then installation cannot proceed unless the file is successfully installed.  The user will have no option to ignore an error installing this file.  If an error occurs, they can merely retry to install the file or abort the installation. The default is "yes," unless the -sfdvital switch (candle.exe) or SuppressFileDefaultVital property (.wixproj) is used.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Checksum" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>This attribute should be set to "yes" for every executable file in the installation that has a valid checksum stored in the Portable Executable (PE) file header.  Only those files that have this attribute set will be verified for valid checksum during a reinstall.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Compressed" type="YesNoDefaultType">
+                <xs:annotation>
+                    <xs:documentation>Sets the file's source type compression.  A setting of "yes" or "no" will override the setting in the Word Count Summary Property.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="BindPath" type="xs:string">
+                <xs:annotation><xs:documentation>A list of paths, separated by semicolons, that represent the paths to be searched to find the imported DLLs. The list is usually a list of properties, with each property enclosed inside square brackets. The value may be set to an empty string. Including this attribute will cause an entry to be generated for the file in the BindImage table.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SelfRegCost" type="xs:integer">
+                <xs:annotation><xs:documentation>The cost of registering the file in bytes. This must be a non-negative number. Including this attribute will cause an entry to be generated for the file in the SelfReg table.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="TrueType" type="YesNoType">
+                <xs:annotation><xs:documentation>Causes an entry to be generated for the file in the Font table with no FontTitle specified. This attribute is intended to be used to register the file as a TrueType font.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="FontTitle" type="xs:string">
+                <xs:annotation><xs:documentation>Causes an entry to be generated for the file in the Font table with the specified FontTitle. This attribute is intended to be used to register the file as a non-TrueType font.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DefaultLanguage" type="xs:string">
+                <xs:annotation><xs:documentation>This is the default language of this file.  The linker will replace this value from the value in the file if the suppress files option is not used.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DefaultSize" type="xs:integer">
+                <xs:annotation><xs:documentation>This is the default size of this file.  The linker will replace this value from the value in the file if the suppress files option is not used.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DefaultVersion" type="xs:string">
+                <xs:annotation><xs:documentation>This is the default version of this file.  The linker will replace this value from the value in the file if the suppress files option is not used.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <!-- assembly information -->
+            <xs:attribute name="Assembly">
+                <xs:annotation>
+                    <xs:documentation>
+                        Specifies if this File is a Win32 Assembly or .NET Assembly that needs to be installed into the 
+                        Global Assembly Cache (GAC).  If the value is '.net' or 'win32', this file must also be the key path of the Component.
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value=".net">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    The file is a .NET Framework assembly.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="no">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    The file is not a .NET Framework or Win32 assembly. This is the default value.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="win32">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    The file is a Win32 assembly.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="AssemblyManifest" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Specifies the file identifier of the manifest file that describes this assembly.
+                        The manifest file should be in the same component as the assembly it describes.
+                        This attribute may only be specified if the Assembly attribute is set to '.net' or 'win32'.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="AssemblyApplication" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Specifies the file identifier of the application file.  This assembly will be isolated
+                        to the same directory as the application file.
+                        If this attribute is absent, the assembly will be installed to the Global Assembly Cache (GAC).
+                        This attribute may only be specified if the Assembly attribute is set to '.net' or 'win32'.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ProcessorArchitecture">
+                <xs:annotation><xs:documentation>Specifies the architecture for this assembly. This attribute should only be used on .NET Framework 2.0 or higher assemblies.</xs:documentation></xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="msil">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    The file is a .NET Framework assembly that is processor-neutral.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="x86">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    The file is a .NET Framework assembly for the x86 processor.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="x64">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    The file is a .NET Framework assembly for the x64 processor.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="ia64">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    The file is a .NET Framework assembly for the ia64 processor.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="DiskId" type="xs:integer">
+                <xs:annotation><xs:documentation>
+                    The value of this attribute should correspond to the Id attribute of a Media
+                    element authored elsewhere.  By creating this connection between a file and
+                    its media, you set the packaging options to the values specified in the Media
+                    element (values such as compression level, cab embedding, etc...). Specifying
+                    the DiskId attribute on the File element overrides the default DiskId attribute
+                    from the parent Component element. If no DiskId attribute is specified,
+                    the default is "1". This DiskId attribute is ignored when creating a merge module
+                    because merge modules do not have media.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Source" type="xs:string">
+                <xs:annotation><xs:documentation>Specifies the path to the File in the build process. Overrides default source path set by parent directories and Name attribute. This attribute must be set if no source information can be gathered from parent directories. For more information, see <html:a href="specifying_source_files.htm">Specifying source files</html:a>.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="src" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        This attribute has been deprecated. Use the Source attribute instead.
+                    </xs:documentation>
+                    <xs:appinfo>
+                        <xse:deprecated ref="Source" />
+                    </xs:appinfo>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="PatchGroup" type="xs:integer">
+                <xs:annotation><xs:documentation>
+                    This attribute must be set for patch-added files.  Each patch should be assigned a different patch group number.  Patch groups
+                    numbers must be greater 0 and should be assigned consecutively.  For example, the first patch should use PatchGroup='1', the
+                    second patch will have PatchGroup='2', etc...
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="PatchIgnore" type="YesNoType">
+                <xs:annotation><xs:documentation>Prevents the updating of the file that is in fact changed in the upgraded image relative to the target images.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="PatchAllowIgnoreOnError" type="YesNoType">
+                <xs:annotation><xs:documentation>Set to indicate that the patch is non-vital.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="PatchWholeFile" type="YesNoType">
+                <xs:annotation><xs:documentation>Set if the entire file should be installed rather than creating a binary patch.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:anyAttribute namespace="##other" processContents="lax">
+                <xs:annotation><xs:documentation>
+                    Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                    attributes at this point in the schema.
+                </xs:documentation></xs:annotation>
+            </xs:anyAttribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="MultiStringValue">
+        <xs:annotation>
+            <xs:documentation>
+                Use several of these elements to specify each registry value in a multiString registry value.  This element
+                cannot be used if the Value attribute is specified unless the Type attribute is set to 'multiString'.  The
+                values should go in the text area of the MultiStringValue element.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="Registry" href="http://msdn.microsoft.com/library/aa371168.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+    </xs:element>
+
+    <xs:element name="RegistryKey">
+        <xs:annotation>
+            <xs:documentation>
+                Used for organization of child RegistryValue elements or to create a registry key
+                (and optionally remove it during uninstallation).
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="Registry" href="http://msdn.microsoft.com/library/aa371168.aspx"/>
+                <xse:howtoRef href="read_a_registry_entry.htm">How To: Read a registry entry during installation</xse:howtoRef>
+                <xse:howtoRef href="write_a_registry_entry.htm">How To: Write a registry entry during installation</xse:howtoRef>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="RegistryKey"/>
+                <xs:element ref="RegistryValue"/>
+                <xs:element ref="Permission" minOccurs="0" maxOccurs="unbounded">
+                    <xs:annotation><xs:documentation>ACL permission</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="PermissionEx">
+                    <xs:annotation><xs:documentation>Can also configure the ACLs for this registry key.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:any namespace="##other" processContents="lax">
+                    <xs:annotation>
+                        <xs:documentation>
+                            Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                            elements at this point in the schema.
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:any>
+            </xs:choice>
+            <xs:attribute name="Id" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Primary key used to identify this particular entry.  If this attribute is not specified, an identifier will be
+                        generated by hashing the parent Component identifier, Root, Key, and Name.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Action">
+                <xs:annotation>
+                    <xs:documentation>
+                        This is the action that will be taken for this registry value.
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="create">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Creates the key, if absent, when the parent component is installed.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="createAndRemoveOnUninstall">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Creates the key, if absent, when the parent component is installed then remove the key with all its values and subkeys when the parent component is uninstalled.
+                                    Note that this value is useful only if your program creates additional values or subkeys under this key and you want an uninstall to remove them. MSI already
+                                    removes all values and subkeys that it creates, so this option just adds additional overhead to uninstall.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="none">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Does nothing; this element is used merely in WiX authoring for organization and does nothing to the final output.
+                                    This is the default value.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="Key" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        The localizable key for the registry value.
+                        If the parent element is a RegistryKey, this value may be omitted to use the
+                        path of the parent, or if its specified it will be appended to the path of the parent.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Root" type="RegistryRootType">
+                <xs:annotation>
+                    <xs:documentation>
+                        The predefined root key for the registry value.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="RegistryValue">
+        <xs:annotation>
+            <xs:documentation>
+                Used to create a registry value.  For multi-string values, this can be used to prepend or append values.
+
+                For legacy authoring: Use several of these elements to specify each registry value in a multiString registry value.  This element
+                cannot be used if the Value attribute is specified unless the Type attribute is set to 'multiString'.  The
+                values should go in the text area of the RegistryValue element.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="Registry" href="http://msdn.microsoft.com/library/aa371168.aspx"/>
+                <xse:howtoRef href="write_a_registry_entry.htm">How To: Write a registry entry during installation</xse:howtoRef>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType mixed="true">
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="Permission"/>
+                <xs:element ref="PermissionEx">
+                    <xs:annotation><xs:documentation>Can also configure the ACLs for this registry value.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="MultiStringValue"/>
+                <xs:any namespace="##other" processContents="lax">
+                    <xs:annotation>
+                        <xs:documentation>
+                            Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                            elements at this point in the schema.
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:any>
+            </xs:choice>
+            <xs:attribute name="Id" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Primary key used to identify this particular entry.  If this attribute is not specified, an identifier will be
+                        generated by hashing the parent Component identifier, Root, Key, and Name.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Root" type="RegistryRootType">
+                <xs:annotation>
+                    <xs:documentation>
+                        The predefined root key for the registry value.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Key" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        The localizable key for the registry value.
+                        If the parent element is a RegistryKey, this value may be omitted to use the
+                        path of the parent, or if its specified it will be appended to the path of the parent.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Name" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        The localizable registry value name.  If this attribute is not provided the default value for the registry key will
+                        be set instead.  The Windows Installer allows several special values to be set for this attribute.  You should not
+                        use them in WiX.  Instead use appropriate values in the Action attribute to get the desired behavior.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Value" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Set this attribute to the localizable registry value.  This value is formatted.  The Windows Installer allows
+                        several special values to be set for this attribute.  You should not use them in WiX.  Instead use appropriate
+                        values in the Type attribute to get the desired behavior.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <!-- unfortunately, this attribute cannot yet be set to required due to backwards-compatibility, once the Registry element is removed, this should be required -->
+            <xs:attribute name="Type">
+                <xs:annotation>
+                    <xs:documentation>
+                        Set this attribute to the type of the desired registry key.  This attribute must be specified whenever the Value
+                        attribute or a child RegistryValue element is specified.    This attribute
+                        should only be set when the value of the Action attribute does not include the word 'remove'.
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="string">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    The value is interpreted and stored as a string (REG_SZ).
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="integer">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    The value is interpreted and stored as an integer (REG_DWORD).
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="binary">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    The value is interpreted and stored as a hexadecimal value (REG_BINARY).
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="expandable">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    The value is interpreted and stored as an expandable string (REG_EXPAND_SZ).
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="multiString">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    The value is interpreted and stored as a multiple strings (REG_MULTI_SZ).
+                                    Please note that this value will only result in a multi-string value if there is more than one registry value
+                                    or the Action attribute's value is 'append' or 'prepend'.  Otherwise a string value will be created.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="Action">
+                <xs:annotation>
+                    <xs:documentation>
+                        This is the action that will be taken for this registry value.
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="append">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Appends the specified value(s) to a multiString registry value.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="prepend">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Prepends the specified value(s) to a multiString registry value.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="write">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Writes a registry value.  This is the default value.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="KeyPath" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>
+                        Set this attribute to 'yes' to make this registry key the KeyPath of the parent component.
+                        Only one resource (registry, file, etc) can be the KeyPath of a component.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="RemoveRegistryKey">
+        <xs:annotation>
+            <xs:documentation>
+                Used for removing registry keys and all child keys either during install or uninstall.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="Registry" href="http://msdn.microsoft.com/library/aa371168.aspx"/>
+                <xse:msiRef table="RemoveRegistry" href="http://msdn.microsoft.com/library/aa371208.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Primary key used to identify this particular entry.  If this attribute is not specified, an identifier will be
+                        generated by hashing the parent Component identifier, Root, Key, and Name.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Action">
+                <xs:annotation>
+                    <xs:documentation>
+                        This is the action that will be taken for this registry value.
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="removeOnInstall">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Removes a key with all its values and subkeys when the parent component is installed.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="removeOnUninstall">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Removes a key with all its values and subkeys when the parent component is uninstalled.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="Key" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        The localizable key for the registry value.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Root" type="RegistryRootType">
+                <xs:annotation>
+                    <xs:documentation>
+                        The predefined root key for the registry value.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="RemoveRegistryValue">
+        <xs:annotation>
+            <xs:documentation>
+                Used to remove a registry value during installation.
+                There is no standard way to remove a single registry value during uninstall (but you can remove an entire key with RemoveRegistryKey).
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="RemoveRegistry" href="http://msdn.microsoft.com/library/aa371208.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Primary key used to identify this particular entry.  If this attribute is not specified, an identifier will be
+                        generated by hashing the parent Component identifier, Root, Key, and Name.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Key" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        The localizable key for the registry value.
+                        If the parent element is a RegistryKey, this value may be omitted to use the
+                        path of the parent, or if its specified it will be appended to the path of the parent.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Name" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        The localizable registry value name.  If this attribute is not provided the default value for the registry key will
+                        be set instead.  The Windows Installer allows several special values to be set for this attribute.  You should not
+                        use them in WiX.  Instead use appropriate values in the Action attribute to get the desired behavior.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Root" type="RegistryRootType">
+                <xs:annotation>
+                    <xs:documentation>
+                        The predefined root key for the registry value.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Registry">
+        <xs:annotation>
+            <xs:appinfo>
+                <xs:documentation>
+                    This element has been deprecated. Use the RegistryValue element instead.
+                </xs:documentation>
+                <xse:msiRef table="Registry" href="http://msdn.microsoft.com/library/aa371168.aspx"/>
+                <xse:deprecated ref="RegistryValue" />
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="Permission"/>
+                <xs:element ref="PermissionEx">
+                    <xs:annotation><xs:documentation>Can also configure the ACLs for this registry key.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="RegistryValue"/>
+                <xs:element ref="Registry"/>
+                <xs:any namespace="##other" processContents="lax">
+                    <xs:annotation>
+                        <xs:documentation>
+                            Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                            elements at this point in the schema.
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:any>
+            </xs:choice>
+            <xs:attribute name="Id" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    Primary key used to identify this particular entry.  If this attribute is not specified, an identifier will be
+                    generated by hashing the parent Component identifier, Root, Key, and Name.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Action">
+                <xs:annotation>
+                    <xs:documentation>
+                        This is the action that will be taken for this registry key.
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="append">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Appends the specified value(s) to a multiString registry key.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="createKey">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Creates the key, if absent, when the parent component is installed.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="createKeyAndRemoveKeyOnUninstall">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Creates the key, if absent, when the parent component is installed then remove the key with all its values and subkeys when the parent component is uninstalled.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="prepend">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Prepends the specified value(s) to a multiString registry key.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="remove">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Removes a registry name when the parent component is installed.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="removeKeyOnInstall">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Removes a key with all its values and subkeys when the parent component is installed.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="removeKeyOnUninstall">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Removes a key with all its values and subkeys when the parent component is uninstalled.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="write">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Writes a registry value.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="Key" type="xs:string">
+                <xs:annotation><xs:documentation>The localizable key for the registry value.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="KeyPath" type="YesNoType">
+                <xs:annotation><xs:documentation>
+                    Set this attribute to 'yes' to make this registry key the KeyPath of the parent component.  Only one resource (registry,
+                    file, etc) can be the KeyPath of a component.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Name" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    The localizable registry value name.  If this attribute is not provided the default value for the registry key will 
+                    be set instead.  The Windows Installer allows several special values to be set for this attribute.  You should not
+                    use them in WiX.  Instead use appropriate values in the Action attribute to get the desired behavior.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Root" type="RegistryRootType">
+                <xs:annotation>
+                    <xs:documentation>
+                        The predefined root key for the registry value.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Type">
+                <xs:annotation>
+                    <xs:documentation>
+                        Set this attribute to the type of the desired registry key.  This attribute must be specified whenever the Value
+                        attribute or a child RegistryValue element is specified.    This attribute
+                        should only be set when the value of the Action attribute does not include the word 'remove'.
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="string">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    The value is interpreted and stored as a string (REG_SZ).
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="integer">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    The value is interpreted and stored as an integer (REG_DWORD).
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="binary">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    The value is interpreted and stored as a hexadecimal value (REG_BINARY).
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="expandable">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    The value is interpreted and stored as an expandable string (REG_EXPAND_SZ).
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="multiString">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    The value is interpreted and stored as a multiple strings (REG_MULTI_SZ).
+                                    Please note that this value will only result in a multi-string value if there is more than one registry value
+                                    or the Action attribute's value is 'append' or 'prepend'.  Otherwise a string value will be created.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="Value" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    Set this attribute to the localizable registry value.  This value is formatted.  The Windows Installer allows
+                    several special values to be set for this attribute.  You should not use them in WiX.  Instead use appropriate
+                    values in the Type attribute to get the desired behavior.  This attribute cannot be specified if the Action
+                    attribute's value contains the word 'remove'.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="RemoveFile">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="CopyFile" />
+                <xse:msiRef table="RemoveFile" href="http://msdn.microsoft.com/library/aa371201.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>
+                Remove a file(s) if the parent component is selected for installation or removal.  Multiple files can be removed
+                by specifying a wildcard for the value of the Name attribute.  By default, the source
+                directory of the file is the directory of the parent component.  This can be overridden by specifying the
+                Directory attribute with a value corresponding to the Id of the source directory, or by specifying the Property
+                attribute with a value corresponding to a property that will have a value that resolves to the full path
+                to the source directory.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Primary key used to identify this particular entry.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Directory" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    Overrides the directory of the parent component with a specific Directory.  This Directory must exist in the
+                    installer database at creation time.  This attribute cannot be specified in conjunction with the Property attribute.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Property" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    Overrides the directory of the parent component with the value of the specified property.  The property
+                    should have a value that resolves to the full path of the source directory.  The property does not have
+                    to exist in the installer database at creation time; it could be created at installation time by a custom
+                    action, on the command line, etc.  This attribute cannot be specified in conjunction with the Directory attribute.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Name" type="WildCardLongFileNameType" use="required">
+                <xs:annotation><xs:documentation>
+                    This value should be set to the localizable name of the file(s) to be removed.  All of the files that
+                    match the wild card will be removed from the specified directory.  The value is a filename that may also
+                    contain the wild card characters "?" for any single character or "*" for zero or more occurrences of any character.
+                    In prior versions of the WiX toolset, this attribute specified the short file name.
+                    This attribute's value may now be either a short or long file name.
+                    If a short file name is specified, the ShortName attribute may not be specified.
+                    If a long file name is specified, the LongName attribute may not be specified.
+                    Also, if this value is a long file name, the ShortName attribute may be omitted to
+                    allow WiX to attempt to generate a unique short file name.
+                    However, if you wish to manually specify the short file name, then the ShortName attribute may be specified.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="LongName" type="WildCardLongFileNameType">
+                <xs:annotation>
+                    <xs:documentation>
+                        This attribute has been deprecated. Use the Name attribute instead.
+                    </xs:documentation>
+                    <xs:appinfo>
+                        <xse:deprecated ref="Name" />
+                    </xs:appinfo>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ShortName" type="WildCardShortFileNameType">
+                <xs:annotation>
+                    <xs:documentation>
+                        The short file name of the file in 8.3 format.
+                        This attribute should only be set if you want to manually specify the short file name.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="On" type="InstallUninstallType" use="required">
+                <xs:annotation>
+                    <xs:documentation>
+                        This value determines the time at which the file(s) may be removed. For 'install', the file will
+                        be removed only when the parent component is being installed (msiInstallStateLocal or
+                        msiInstallStateSource); for 'uninstall', the file will be removed only when the parent component
+                        is being removed (msiInstallStateAbsent); for 'both', the file will be removed in both cases.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+    
+    <xs:element name="RemoveFolder">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="CreateFolder" />
+                <xse:msiRef table="RemoveFile" href="http://msdn.microsoft.com/library/aa371201.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>
+                Remove an empty folder if the parent component is selected for installation or removal.  By default, the folder
+                is the directory of the parent component.  This can be overridden by specifying the Directory attribute
+                with a value corresponding to the Id of the directory, or by specifying the Property attribute with a value
+                corresponding to a property that will have a value that resolves to the full path of the folder.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Primary key used to identify this particular entry.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Directory" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    Overrides the directory of the parent component with a specific Directory.  This Directory must exist in the
+                    installer database at creation time.  This attribute cannot be specified in conjunction with the Property attribute.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Property" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    Overrides the directory of the parent component with the value of the specified property.  The property
+                    should have a value that resolves to the full path of the source directory.  The property does not have
+                    to exist in the installer database at creation time; it could be created at installation time by a custom
+                    action, on the command line, etc.  This attribute cannot be specified in conjunction with the Directory attribute.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="On" type="InstallUninstallType" use="required">
+                <xs:annotation>
+                    <xs:documentation>
+                        This value determines the time at which the folder may be removed, based on the install/uninstall of the parent component.
+                        For 'install', the folder will be removed only when the parent component is being installed (msiInstallStateLocal or
+                        msiInstallStateSource); for 'uninstall', the folder will be removed only when the parent component
+                        is being removed (msiInstallStateAbsent); for 'both', the folder will be removed in both cases.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="CreateFolder">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="RemoveFolder" />
+                <xse:msiRef table="CreateFolder" href="http://msdn.microsoft.com/library/aa368053.aspx" />
+            </xs:appinfo>
+            <xs:documentation>Create folder as part of parent Component.</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="Shortcut" minOccurs="0" maxOccurs="unbounded">
+                    <xs:annotation><xs:documentation>Non-advertised shortcut to this folder, Shortcut Target is preset to the folder</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="Permission" minOccurs="0" maxOccurs="unbounded">
+                    <xs:annotation><xs:documentation>ACL permission</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="PermissionEx">
+                    <xs:annotation><xs:documentation>Can also configure the ACLs for this folder.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:any namespace="##other" processContents="lax">
+                    <xs:annotation>
+                        <xs:documentation>
+                            Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                            elements at this point in the schema.
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:any>
+            </xs:choice>
+            <xs:attribute name="Directory" type="xs:string">
+                <xs:annotation><xs:documentation>Identifier of Directory to create.  Defaults to Directory of parent Component.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="AppData" type="xs:string">
+        <xs:annotation><xs:documentation>Optional way for defining AppData, generally used for complex CDATA.</xs:documentation></xs:annotation>
+    </xs:element>
+
+    <xs:element name="Category">
+        <xs:annotation>
+            <xs:documentation>
+                Qualified published component for parent Component
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="PublishComponent" href="http://msdn.microsoft.com/library/aa370921.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:sequence minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="AppData" />
+            </xs:sequence>
+            <xs:attribute name="Id" use="required" type="Guid">
+                <xs:annotation><xs:documentation>A string GUID that represents the category of components being grouped together.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Qualifier" use="required" type="xs:string">
+                <xs:annotation><xs:documentation>A text string that qualifies the value in the Id attribute.  A qualifier is used to distinguish multiple forms of the same Component, such as a Component that is implemented in multiple languages.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="AppData" type="xs:string">
+                <xs:annotation><xs:documentation>An optional localizable text describing the category.  The string is commonly parsed by the application and can be displayed to the user.  It should describe the category.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Feature" type="xs:string">
+                <xs:annotation><xs:documentation>Feature that controls the advertisement of the category.  Defaults to the primary Feature for the parent Component .</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="MIME">
+        <xs:annotation>
+            <xs:documentation>
+                MIME content-type for an Extension
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="MIME" href="http://msdn.microsoft.com/library/aa370035.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Advertise" type="YesNoType">
+                <xs:annotation><xs:documentation>Whether this MIME is to be advertised. The default is to match whatever the parent extension element uses.  If the parent element is not advertised, then this element cannot be advertised either.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ContentType" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>This is the identifier for the MIME content.  It is commonly written in the form of type/format.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Class" type="Guid">
+                <xs:annotation><xs:documentation>Class ID for the COM server that is to be associated with the MIME content.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Default" type="YesNoType">
+                <xs:annotation><xs:documentation>If 'yes', become the content type for the parent Extension.  The default value is 'no'.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Verb">
+        <xs:annotation>
+            <xs:documentation>
+            Verb definition for an Extension.  When advertised, this element creates a row in the 
+            <html:a href='http://msdn.microsoft.com/library/aa372487.aspx' target='_blank'>Verb table</html:a>.
+            When not advertised, this element creates the appropriate rows in <html:a href='http://msdn.microsoft.com/library/aa371168.aspx' target='_blank'>Registry table</html:a>.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="Verb" href="http://msdn.microsoft.com/library/aa372487.aspx"/>
+                <xse:msiRef table="Registry" href="http://msdn.microsoft.com/library/aa371168.aspx" />
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>The verb for the command.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Command" type="xs:string">
+                <xs:annotation><xs:documentation>The localized text displayed on the context menu.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Argument" type="xs:string">
+                <xs:annotation><xs:documentation>Value for the command arguments.  Note that the resolution of properties in the 
+                Argument field is limited. A property formatted as [Property] in this field can only be resolved if the property 
+                already has the intended value when the component owning the verb is installed. For example, for the argument 
+                "[#MyDoc.doc]" to resolve to the correct value, the same process must be installing the file MyDoc.doc and the 
+                component that owns the verb.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Sequence" type="xs:integer">
+                <xs:annotation><xs:documentation>The sequence of the commands. Only verbs for which the Sequence is specified
+                are used to prepare an ordered list for the default value of the shell key. The Verb with the lowest value in this 
+                column becomes the default verb. Used only for Advertised verbs.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Target" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        This attribute has been deprecated. Use the TargetFile attribute instead.
+                    </xs:documentation>
+                    <xs:appinfo>
+                        <xse:deprecated ref="TargetFile" />
+                    </xs:appinfo>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="TargetFile" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Either this attribute or the TargetProperty attribute must be specified for a non-advertised verb.
+                        The value should be the identifier of the target file to be executed for the verb.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="TargetProperty" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Either this attribute or the TargetFile attribute must be specified for a non-advertised verb.
+                        The value should be the identifier of the property which will resolve to the path to the target file to be executed for the verb.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Extension">
+        <xs:annotation>
+            <xs:documentation>
+                Extension for a Component
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="MIME" href="http://msdn.microsoft.com/library/aa370035.aspx"/>
+                <xse:msiRef table="Verb" href="http://msdn.microsoft.com/library/aa372487.aspx"/>
+                <xse:msiRef table="Registry" href="http://msdn.microsoft.com/library/aa371168.aspx" />
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:annotation><xs:documentation>MIME and Verbs can be associated with Extensions</xs:documentation></xs:annotation>
+                <xs:element ref="MIME"/>
+                <xs:element ref="Verb"/>
+            </xs:choice>
+
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>This is simply the file extension, like "doc" or "xml".  Do not include the preceding period.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ContentType" type="xs:string">
+                <xs:annotation><xs:documentation>The MIME type that is to be written.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Advertise" type="YesNoType">
+                <xs:annotation><xs:documentation>Whether this extension is to be advertised. The default is "no".</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:anyAttribute namespace="##other" processContents="lax">
+                <xs:annotation><xs:documentation>
+                    Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                    attributes at this point in the schema.
+                </xs:documentation></xs:annotation>
+            </xs:anyAttribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="TypeLib">
+        <xs:annotation>
+            <xs:documentation>
+                Register a type library (TypeLib).  Please note that in order to properly use this
+                non-advertised, you will need use this element with Advertise='no' and also author the
+                appropriate child Interface elements by extracting them from the type library itself.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="TypeLib" href="http://msdn.microsoft.com/library/aa372092.aspx"/>
+                <xse:msiRef table="Registry" href="http://msdn.microsoft.com/library/aa371168.aspx" />
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="AppId"/>
+                <xs:element ref="Class"/>
+                <xs:element ref="Interface"/>
+            </xs:choice>
+
+            <xs:attribute name="Id" type="Guid" use="required">
+                <xs:annotation><xs:documentation>The GUID that identifes the type library.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Advertise" type="YesNoType">
+                <xs:annotation><xs:documentation>
+                    Value of 'yes' will create a row in the TypeLib table.
+                    Value of 'no' will create rows in the Registry table.
+                    The default value is 'no'.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Control" type="YesNoType">
+                <xs:annotation><xs:documentation>
+                    Value of 'yes' means the type library describes controls, and should not be displayed in type browsers intended for nonvisual objects.
+                    This attribute can only be set if Advertise='no'.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Cost" type="xs:int">
+                <xs:annotation><xs:documentation>
+                    The cost associated with the registration of the type library in bytes.  This attribute cannot be set if Advertise='no'.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Description" type="xs:string">
+                <xs:annotation><xs:documentation>The localizable description of the type library.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="HasDiskImage" type="YesNoType">
+                <xs:annotation><xs:documentation>
+                    Value of 'yes' means the type library exists in a persisted form on disk.  This attribute can only be set if Advertise='no'.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="HelpDirectory" type="xs:string">
+                <xs:annotation><xs:documentation>The identifier of the Directory element for the help directory.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Hidden" type="YesNoType">
+                <xs:annotation><xs:documentation>
+                    Value of 'yes' means the type library should not be displayed to users, although its use is not restricted.
+                    Should be used by controls.  Hosts should create a new type library that wraps the control with extended properties.
+                    This attribute can only be set if Advertise='no'.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Language" use="required" type="xs:integer">
+                <xs:annotation><xs:documentation>The language of the type library.  This must be a non-negative integer.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="MajorVersion" type="xs:integer">
+                <xs:annotation><xs:documentation>The major version of the type library.  The value should be an integer from 0 - 255.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="MinorVersion" type="xs:integer">
+                <xs:annotation><xs:documentation>The minor version of the type library.  The value should be an integer from 0 - 255.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ResourceId" type="xs:integer">
+                <xs:annotation><xs:documentation>The resource id of a typelib.  The value is appended to the end of the typelib path in the registry.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Restricted" type="YesNoType">
+                <xs:annotation><xs:documentation>
+                    Value of 'yes' means the type library is restricted, and should not be displayed to users.  This attribute can only be set if Advertise='no'.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="ProgId">
+        <xs:annotation>
+            <xs:documentation>
+                ProgId registration for parent Component.  If ProgId has an associated Class, it must be a child of that element.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="ProgId" href="http://msdn.microsoft.com/library/aa370879.aspx"/>
+                <xse:msiRef table="Class" href="http://msdn.microsoft.com/library/aa367861.aspx"/>
+                <xse:msiRef table="Registry" href="http://msdn.microsoft.com/library/aa371168.aspx" />
+                <xse:msiRef table="Icon" href="http://msdn.microsoft.com/library/aa369210.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element ref="ProgId" minOccurs="0" maxOccurs="unbounded">
+                    <xs:annotation><xs:documentation>The version-independent ProgId must be the first child element of actual ProgId.  Nesting other ProgId elements within the Version-independent ProgId will create COM+ aliases, see <html:a href="http://support.microsoft.com/kb/305745">http://support.microsoft.com/kb/305745</html:a> for more information.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded">
+                    <xs:annotation><xs:documentation>Extensions that refer to this ProgId</xs:documentation></xs:annotation>
+                </xs:element>
+            </xs:sequence>
+
+            <xs:attribute name="Id" type="xs:string" use="required"/>
+            <xs:attribute name="Description" type="xs:string"/>
+            <xs:attribute name="Icon" type="xs:string">
+                <xs:annotation><xs:documentation>For an advertised ProgId, the Id of an Icon element. For a non-advertised ProgId, this is the Id of a file containing an icon resource.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IconIndex" type="xs:integer"/>
+            <xs:attribute name="Advertise" type="YesNoType"/>
+            <xs:attribute name="NoOpen" type="xs:string">
+                <xs:annotation><xs:documentation>Specifies that the associated ProgId should not be opened by users. The value is presented as a warning to users. An empty string is also valid for this attribute.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="AppId">
+        <xs:annotation>
+            <xs:documentation>
+                Application ID containing DCOM information for the associated application GUID.  
+                If this element is nested under a Fragment, Module, or Product element, it must be
+                advertised.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="AppId" href="http://msdn.microsoft.com/library/aa367566.aspx"/>
+                <xse:msiRef table="Registry" href="http://msdn.microsoft.com/library/aa371168.aspx" />
+                <xse:remarks>
+                    When being used in unadvertised mode, the attributes in the AppId element correspond to registry keys
+                    as follows (values that can be specified in authoring are in bold):
+                    <html:dl>
+                        <html:dt>Id</html:dt>
+                        <html:dd>
+                            <html:dl>
+                                <html:dt>In General</html:dt>
+                                <html:dd>
+                                    [HKCR\AppID\{<html:b>Id</html:b>}]<html:br/>
+                                </html:dd>
+                                <html:dt>Specific Example</html:dt>
+                                <html:dd>
+                                    [HKCR\AppID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}]<html:br/>
+                                </html:dd>
+                            </html:dl>
+                        </html:dd>
+                        <html:dt>ActivateAtStorage</html:dt>
+                        <html:dd>
+                            <html:dl>
+                                <html:dt>In General</html:dt>
+                                <html:dd>
+                                    [HKCR\AppID\{<html:b>Id</html:b>}]<html:br/>
+                                    ActivateAtStorage="<html:b>ActivateAtStorage</html:b>"
+                                </html:dd>
+                                <html:dt>Specific Example</html:dt>
+                                <html:dd>
+                                    [HKCR\AppID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}]<html:br/>
+                                    ActivateAtStorage="<html:b>Y</html:b>"
+                                </html:dd>
+                            </html:dl>
+                        </html:dd>
+                        <html:dt>Description</html:dt>
+                        <html:dd>
+                            <html:dl>
+                                <html:dt>In General</html:dt>
+                                <html:dd>
+                                    [HKCR\AppID\{<html:b>Id</html:b>}]<html:br/>
+                                    @="<html:b>Description</html:b>"
+                                </html:dd>
+                                <html:dt>Specific Example</html:dt>
+                                <html:dd>
+                                    [HKCR\AppID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}]<html:br/>
+                                    @="<html:b>My AppId Description</html:b>"
+                                </html:dd>
+                            </html:dl>
+                        </html:dd>
+                        <html:dt>DllSurrogate</html:dt>
+                        <html:dd>
+                            <html:dl>
+                                <html:dt>In General</html:dt>
+                                <html:dd>
+                                    [HKCR\AppID\{<html:b>Id</html:b>}]<html:br/>
+                                    DllSurrogate="<html:b>DllSurrogate</html:b>"
+                                </html:dd>
+                                <html:dt>Specific Example</html:dt>
+                                <html:dd>
+                                    [HKCR\AppID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}]<html:br/>
+                                    DllSurrogate="<html:b>C:\surrogate.exe</html:b>"
+                                </html:dd>
+                            </html:dl>
+                        </html:dd>
+                        <html:dt>LocalService</html:dt>
+                        <html:dd>
+                            <html:dl>
+                                <html:dt>In General</html:dt>
+                                <html:dd>
+                                    [HKCR\AppID\{<html:b>Id</html:b>}]<html:br/>
+                                    LocalService="<html:b>LocalService</html:b>"
+                                </html:dd>
+                                <html:dt>Specific Example</html:dt>
+                                <html:dd>
+                                    [HKCR\AppID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}]<html:br/>
+                                    LocalService="<html:b>MyServiceName</html:b>"
+                                </html:dd>
+                            </html:dl>
+                        </html:dd>
+                        <html:dt>RemoteServerName</html:dt>
+                        <html:dd>
+                            <html:dl>
+                                <html:dt>In General</html:dt>
+                                <html:dd>
+                                    [HKCR\AppID\{<html:b>Id</html:b>}]<html:br/>
+                                    RemoteServerName="<html:b>RemoteServerName</html:b>"
+                                </html:dd>
+                                <html:dt>Specific Example</html:dt>
+                                <html:dd>
+                                    [HKCR\AppID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}]<html:br/>
+                                    RemoteServerName="<html:b>MyRemoteServer</html:b>"
+                                </html:dd>
+                            </html:dl>
+                        </html:dd>
+                        <html:dt>RunAsInteractiveUser</html:dt>
+                        <html:dd>
+                            <html:dl>
+                                <html:dt>In General</html:dt>
+                                <html:dd>
+                                    [HKCR\AppID\{<html:b>Id</html:b>}]<html:br/>
+                                    RunAs="<html:b>RunAsInteractiveUser</html:b>"
+                                </html:dd>
+                                <html:dt>Specific Example</html:dt>
+                                <html:dd>
+                                    [HKCR\AppID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}]<html:br/>
+                                    RunAs="<html:b>Interactive User</html:b>"
+                                </html:dd>
+                            </html:dl>
+                        </html:dd>
+                        <html:dt>ServiceParameters</html:dt>
+                        <html:dd>
+                            <html:dl>
+                                <html:dt>In General</html:dt>
+                                <html:dd>
+                                    [HKCR\AppID\{<html:b>Id</html:b>}]<html:br/>
+                                    ServiceParameters="<html:b>ServiceParameters</html:b>"
+                                </html:dd>
+                                <html:dt>Specific Example</html:dt>
+                                <html:dd>
+                                    [HKCR\AppID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}]<html:br/>
+                                    ServiceParameters="<html:b>-param</html:b>"
+                                </html:dd>
+                            </html:dl>
+                        </html:dd>
+                    </html:dl>
+                </xse:remarks>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="Class"/>
+            </xs:choice>
+
+            <xs:attribute name="ActivateAtStorage" type="YesNoType">
+                <xs:annotation><xs:documentation>
+                    Set this value to 'yes' to configure the client to activate on the same system as persistent storage.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Advertise" type="YesNoType">
+                <xs:annotation><xs:documentation>
+                    Set this value to 'yes' in order to create a normal AppId table row.  Set this value to 'no' in order to
+                    generate Registry rows that perform similar registration (without the often problematic Windows Installer
+                    advertising behavior).
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Description" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    Set this value to the description of the AppId.  It can only be specified when the AppId is not being advertised.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DllSurrogate" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    Set this value to specify that the class is a DLL that is to be activated in a surrogate EXE 
+                    process, and the surrogate process to be used is the path of a surrogate EXE file specified by the value.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Id" type="Guid" use="required">
+                <xs:annotation><xs:documentation>
+                    Set this value to the AppID GUID that corresponds to the named executable.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="LocalService" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    Set this value to the name of a service to allow the object to be installed as a Win32 service.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="RemoteServerName" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    Set this value to the name of the remote server to configure the client to request the object
+                    be run at a particular machine whenever an activation function is called for which a COSERVERINFO
+                    structure is not specified.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="RunAsInteractiveUser" type="YesNoType">
+                <xs:annotation><xs:documentation>
+                    Set this value to 'yes' to configure a class to run under the identity of the user currently
+                    logged on and connected to the interactive desktop when activated by a remote client without
+                    being written as a Win32 service.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ServiceParameters" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    Set this value to the parameters to be passed to a LocalService on invocation.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Class">
+        <xs:annotation>
+            <xs:documentation>COM Class registration for parent Component.</xs:documentation>
+            <xs:appinfo>
+                <xse:seeAlso ref="AppId"/>
+                <xse:msiRef table="Class" href="http://msdn.microsoft.com/library/aa367861.aspx"/>
+                <xse:msiRef table="ProgId" href="http://msdn.microsoft.com/library/aa370879.aspx"/>
+                <xse:msiRef table="Registry" href="http://msdn.microsoft.com/library/aa371168.aspx" />
+                <xse:msiRef table="AppId" href="http://msdn.microsoft.com/library/aa367566.aspx"/>
+                <xse:remarks>
+                    When being used in unadvertised mode, the attributes in the Class element correspond to registry keys
+                    as follows (values that can be specified in authoring are in bold):
+                    <html:dl>
+                        <html:dt>Id/Context/Server</html:dt>
+                        <html:dd>
+                            <html:dl>
+                                <html:dt>In General</html:dt>
+                                <html:dd>
+                                    [HKCR\CLSID\{<html:b>Id</html:b>}\<html:b>Context1</html:b>]<html:br/>
+                                    @="[!<html:b>Server</html:b>]"<html:br/>
+                                    [HKCR\CLSID\{<html:b>Id</html:b>}\<html:b>Context2</html:b>]<html:br/>
+                                    @="[!<html:b>Server</html:b>]"
+                                </html:dd>
+                                <html:dt>Specific Example</html:dt>
+                                <html:dd>
+                                    [HKCR\CLSID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}\<html:b>LocalServer</html:b>]<html:br/>
+                                    @="[!<html:b>comserv.dll</html:b>]"<html:br/>
+                                    [HKCR\CLSID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}\<html:b>LocalServer32</html:b>]<html:br/>
+                                    @="[!<html:b>comserv.dll</html:b>]"
+                                </html:dd>
+                            </html:dl>
+                        </html:dd>
+                        <html:dt>Id/Context/ForeignServer</html:dt>
+                        <html:dd>
+                            <html:dl>
+                                <html:dt>In General</html:dt>
+                                <html:dd>
+                                  [HKCR\CLSID\{<html:b>Id</html:b>}\<html:b>Context1</html:b>]<html:br/>
+                                  @="<html:b>ForeignServer</html:b>"<html:br/>
+                                  [HKCR\CLSID\{<html:b>Id</html:b>}\<html:b>Context2</html:b>]<html:br/>
+                                  @="<html:b>ForeignServer</html:b>"
+                                </html:dd>
+                                <html:dt>Specific Example</html:dt>
+                                <html:dd>
+                                  [HKCR\CLSID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}\<html:b>LocalServer</html:b>]<html:br/>
+                                  @="<html:b>mscoree.dll</html:b>"<html:br/>
+                                  [HKCR\CLSID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}\<html:b>LocalServer32</html:b>]<html:br/>
+                                  @="<html:b>mscoree.dll</html:b>"
+                                </html:dd>
+                            </html:dl>
+                        </html:dd>
+                        <html:dt>AppId</html:dt>
+                        <html:dd>
+                            <html:dl>
+                                <html:dt>In General</html:dt>
+                                <html:dd>
+                                    [HKCR\CLSID\{<html:b>Id</html:b>}]<html:br/>
+                                    AppId="{<html:b>AppId</html:b>}"
+                                </html:dd>
+                                <html:dt>Specific Example</html:dt>
+                                <html:dd>
+                                    [HKCR\CLSID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}]<html:br/>
+                                    AppId="{<html:b>00000000-89AB-0000-0123-000000000000</html:b>}"
+                                </html:dd>
+                            </html:dl>
+                        </html:dd>
+                        <html:dt>Argument</html:dt>
+                        <html:dd>
+                            <html:dl>
+                                <html:dt>In General</html:dt>
+                                <html:dd>
+                                    [HKCR\CLSID\{<html:b>Id</html:b>}\<html:b>Context</html:b>]<html:br/>
+                                    @="[!<html:b>Server</html:b>] <html:b>Argument</html:b>"
+                                </html:dd>
+                                <html:dt>Specific Example</html:dt>
+                                <html:dd>
+                                    [HKCR\CLSID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}\<html:b>LocalServer32</html:b>]<html:br/>
+                                    @="[!<html:b>comserv.dll</html:b>] <html:b>/arg1 /arg2 /arg3</html:b>"<html:br/>
+                                </html:dd>
+                            </html:dl>
+                        </html:dd>
+                        <html:dt>Control</html:dt>
+                        <html:dd>
+                            <html:dl>
+                                <html:dt>In General</html:dt>
+                                <html:dd>
+                                    Value "yes" specified:<html:br/>
+                                    [HKCR\CLSID\{<html:b>Id</html:b>}\Control]
+                                </html:dd>
+                                <html:dt>Specific Example</html:dt>
+                                <html:dd>
+                                    [HKCR\CLSID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}\Control]
+                                </html:dd>
+                            </html:dl>
+                        </html:dd>
+                        <html:dt>Description</html:dt>
+                        <html:dd>
+                            <html:dl>
+                                <html:dt>In General</html:dt>
+                                <html:dd>
+                                    [HKCR\CLSID\{<html:b>Id</html:b>}]<html:br/>
+                                    @="<html:b>Description</html:b>"
+                                </html:dd>
+                                <html:dt>Specific Example</html:dt>
+                                <html:dd>
+                                    [HKCR\CLSID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}]<html:br/>
+                                    @="<html:b>Description of Example COM Component</html:b>"
+                                </html:dd>
+                            </html:dl>
+                        </html:dd>
+                        <html:dt>Handler</html:dt>
+                        <html:dd>
+                            <html:dl>
+                                <html:dt>In General</html:dt>
+                                <html:dd>
+                                    Value "1" specified:<html:br/>
+                                    [HKCR\CLSID\{<html:b>Id</html:b>}\InprocHandler]<html:br/>
+                                    @="ole.dll"<html:br/>
+                                    Value "2" specified:<html:br/>
+                                    [HKCR\CLSID\{<html:b>Id</html:b>}\InprocHandler32]<html:br/>
+                                    @="ole32.dll"<html:br/>
+                                    Value "3" specified:<html:br/>
+                                    [HKCR\CLSID\{<html:b>Id</html:b>}\InprocHandler]<html:br/>
+                                    @="ole.dll"<html:br/>
+                                    [HKCR\CLSID\{<html:b>Id</html:b>}\InprocHandler32]<html:br/>
+                                    @="ole32.dll"<html:br/>
+                                    Other value specified:<html:br/>
+                                    [HKCR\CLSID\{<html:b>Id</html:b>}\InprocHandler32]<html:br/>
+                                    @="<html:b>Handler</html:b>"
+                                </html:dd>
+                                <html:dt>Specific Example (for other value)</html:dt>
+                                <html:dd>
+                                    [HKCR\CLSID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}\InprocHandler32]<html:br/>
+                                    @="<html:b>handler.dll</html:b>"
+                                </html:dd>
+                            </html:dl>
+                        </html:dd>
+                        <html:dt>Icon/IconIndex</html:dt>
+                        <html:dd>This is not currently handled properly.</html:dd>
+                        <html:dt>Insertable</html:dt>
+                        <html:dd>
+                            <html:dl>
+                                <html:dt>In General</html:dt>
+                                <html:dd>
+                                    Value "no" specified:<html:br/>
+                                    [HKCR\CLSID\{<html:b>Id</html:b>}\NotInsertable]<html:br/>
+                                    Value "yes" specified:<html:br/>
+                                    [HKCR\CLSID\{<html:b>Id</html:b>}\Insertable]
+                                </html:dd>
+                                <html:dt>Specific Example</html:dt>
+                                <html:dd>
+                                    [HKCR\CLSID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}\Insertable]
+                                </html:dd>
+                            </html:dl>
+                        </html:dd>
+                        <html:dt>Programmable</html:dt>
+                        <html:dd>
+                            <html:dl>
+                                <html:dt>In General</html:dt>
+                                <html:dd>
+                                    Value "yes" specified:<html:br/>
+                                    [HKCR\CLSID\{<html:b>Id</html:b>}\Programmable]
+                                </html:dd>
+                                <html:dt>Specific Example</html:dt>
+                                <html:dd>
+                                    [HKCR\CLSID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}\Programmable]
+                                </html:dd>
+                            </html:dl>
+                        </html:dd>
+                        <html:dt>RelativePath</html:dt>
+                        <html:dd>Unsupported.  Please contribute this back to WiX if you know.</html:dd>
+                        <html:dt>SafeForInitializing</html:dt>
+                        <html:dd>
+                            <html:dl>
+                                <html:dt>In General</html:dt>
+                                <html:dd>
+                                    Value "yes" specified:<html:br/>
+                                    [HKCR\CLSID\{<html:b>Id</html:b>}\Implemented Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}]
+                                </html:dd>
+                                <html:dt>Specific Example</html:dt>
+                                <html:dd>
+                                    [HKCR\CLSID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}\Implemented Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}]
+                                </html:dd>
+                            </html:dl>
+                        </html:dd>
+                        <html:dt>SafeForScripting</html:dt>
+                        <html:dd>
+                            <html:dl>
+                                <html:dt>In General</html:dt>
+                                <html:dd>
+                                    Value "yes" specified:<html:br/>
+                                    [HKCR\CLSID\{<html:b>Id</html:b>}\Implemented Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}]
+                                </html:dd>
+                                <html:dt>Specific Example</html:dt>
+                                <html:dd>
+                                    [HKCR\CLSID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}\Implemented Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}]
+                                </html:dd>
+                            </html:dl>
+                        </html:dd>
+                        <html:dt>ThreadingModel</html:dt>
+                        <html:dd>
+                            <html:dl>
+                                <html:dt>In General</html:dt>
+                                <html:dd>
+                                    [HKCR\CLSID\{<html:b>Id</html:b>}\<html:b>Context</html:b>]<html:br/>
+                                    ThreadingModel="<html:b>ThreadingModel</html:b>"
+                                </html:dd>
+                                <html:dt>Specific Example</html:dt>
+                                <html:dd>
+                                    [HKCR\CLSID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}\<html:b>LocalServer32</html:b>]<html:br/>
+                                    ThreadingModel="<html:b>Apartment</html:b>"
+                                </html:dd>
+                            </html:dl>
+                        </html:dd>
+                        <html:dt>TypeLibId (from parent TypeLib/@Id)</html:dt>
+                        <html:dd>
+                            <html:dl>
+                                <html:dt>In General</html:dt>
+                                <html:dd>
+                                    [HKCR\CLSID\{<html:b>Id</html:b>}\TypeLib]<html:br/>
+                                    @="{<html:b>TypeLibId</html:b>}"
+                                </html:dd>
+                                <html:dt>Specific Example</html:dt>
+                                <html:dd>
+                                    [HKCR\CLSID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}\TypeLib]<html:br/>
+                                    @="{<html:b>11111111-89AB-1111-0123-111111111111</html:b>}"
+                                </html:dd>
+                            </html:dl>
+                        </html:dd>
+                        <html:dt>Version</html:dt>
+                        <html:dd>
+                            <html:dl>
+                                <html:dt>In General</html:dt>
+                                <html:dd>
+                                    [HKCR\CLSID\{<html:b>Id</html:b>}\Version]<html:br/>
+                                    @="<html:b>Version</html:b>"
+                                </html:dd>
+                                <html:dt>Specific Example</html:dt>
+                                <html:dd>
+                                    [HKCR\CLSID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}\Version]<html:br/>
+                                    @="<html:b>1.0.0.0</html:b>"
+                                </html:dd>
+                            </html:dl>
+                        </html:dd>
+                    </html:dl>
+                </xse:remarks>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="ProgId">
+                    <xs:annotation><xs:documentation>A ProgId associated with Class must be a child element of the Class element</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="FileTypeMask"/>
+                <xs:element ref="Interface">
+                    <xs:annotation><xs:documentation>These Interfaces will be registered with the parent Class and TypeLib (if present).</xs:documentation></xs:annotation>
+                </xs:element>
+            </xs:choice>
+
+            <xs:attribute name="Id" type="Guid" use="required">
+                <xs:annotation><xs:documentation>The Class identifier (CLSID) of a COM server.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Context">
+                <xs:annotation><xs:documentation>
+                  The server context(s) for this COM server. This attribute is optional for VB6 libraries that are marked "PublicNotCreateable".
+                  Class elements marked Advertised must specify at least one server context. It is most common for there to be a single value
+                  for the Context attribute.
+                </xs:documentation></xs:annotation>
+                <xs:simpleType>
+                    <xs:list>
+                        <xs:simpleType>
+                            <xs:restriction base="xs:NMTOKEN">
+                                <xs:enumeration value="LocalServer">
+                                    <xs:annotation>
+                                        <xs:documentation>
+                                            A 16-bit local server application.
+                                        </xs:documentation>
+                                    </xs:annotation>
+                                </xs:enumeration>
+                                <xs:enumeration value="LocalServer32">
+                                    <xs:annotation>
+                                        <xs:documentation>
+                                            A 32-bit local server application.
+                                        </xs:documentation>
+                                    </xs:annotation>
+                                </xs:enumeration>
+                                <xs:enumeration value="InprocServer">
+                                    <xs:annotation>
+                                        <xs:documentation>
+                                            A 16-bit in-process server DLL.
+                                        </xs:documentation>
+                                    </xs:annotation>
+                                </xs:enumeration>
+                                <xs:enumeration value="InprocServer32">
+                                    <xs:annotation>
+                                        <xs:documentation>
+                                            A 32-bit in-process server DLL.
+                                        </xs:documentation>
+                                    </xs:annotation>
+                                </xs:enumeration>
+                            </xs:restriction>
+                        </xs:simpleType>
+                    </xs:list>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="Description" type="xs:string">
+                <xs:annotation><xs:documentation>Localized description associated with the Class ID and Program ID.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="AppId" type="Guid">
+                <xs:annotation><xs:documentation>
+                    This attribute is only allowed when a Class is advertised.  Using this attribute will reference an Application ID
+                    containing DCOM information for the associated application GUID.  The value must correspond to an AppId/@Id of an
+                    AppId element nested under a Fragment, Module, or Product element.  To associate an AppId with a non-advertised
+                    class, nest the class within a parent AppId element.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Icon" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    The file providing the icon associated with this CLSID.  Reference to an Icon element
+                    (should match the Id attribute of an Icon element).  This is currently not supported if the
+                    value of the Advertise attribute is "no".
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IconIndex" type="xs:integer">
+                <xs:annotation><xs:documentation>Icon index into the icon file.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Handler" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    The default inproc handler.  May be optionally provided only for Context = LocalServer or
+                    LocalServer32.  Value of "1" creates a 16-bit InprocHandler (appearing as the InprocHandler
+                    value).  Value of "2" creates a 32-bit InprocHandler (appearing as the InprocHandler32 value).
+                    Value of "3" creates 16-bit as well as 32-bit InprocHandlers.  A non-numeric value is treated
+                    as a system file that serves as the 32-bit InprocHandler (appearing as the InprocHandler32 value).
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Argument" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    This column is optional only when the Context column is set to "LocalServer"
+                    or "LocalServer32" server context. The text is registered as the argument against
+                    the OLE server and is used by OLE for invoking the server.  Note that the resolution
+                    of properties in the Argument field is limited. A property formatted as [Property] in
+                    this field can only be resolved if the property already has the intended value when
+                    the component owning the class is installed.  For example, for the argument "[#MyDoc.doc]"
+                    to resolve to the correct value, the same process must be installing the file MyDoc.doc and the
+                    component that owns the class.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="RelativePath" type="YesNoType">
+                <xs:annotation><xs:documentation>
+                    When the value is "yes", the bare file name can be used for COM servers. The installer
+                    registers the file name only instead of the complete path.  This enables the server in
+                    the current directory to take precedence and allows multiple copies of the same component.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Advertise" type="YesNoType">
+                <xs:annotation><xs:documentation>
+                    Set this value to "yes" in order to create a normal Class table row.  Set this value to
+                    "no" in order to generate Registry rows that perform similar registration (without the
+                    often problematic Windows Installer advertising behavior).
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+
+            <!-- Following attributes are not advertised, but add the appropriate rows to the Registry table -->
+            <xs:attribute name="ThreadingModel">
+                <xs:annotation><xs:documentation>
+                    Threading model for the CLSID.
+                </xs:documentation></xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="apartment"/>
+                        <xs:enumeration value="free"/>
+                        <xs:enumeration value="both"/>
+                        <xs:enumeration value="neutral"/>
+                        <xs:enumeration value="single"/>
+                        <xs:enumeration value="rental"/>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="Version" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    Version for the CLSID.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Insertable" type="YesNoType">
+                <xs:annotation><xs:documentation>
+                    Specifies the CLSID may be insertable.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Programmable" type="YesNoType">
+                <xs:annotation><xs:documentation>
+                    Specifies the CLSID may be programmable.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ForeignServer" type="xs:string">
+                <xs:annotation><xs:documentation>
+                  May only be specified if the value of the Advertise attribute is "no" and Server has not been specified. In addition, it may only
+                  be used when the Class element is directly under the Component element. The value can be
+                  that of an registry type (REG_SZ). This attribute should be used to specify foreign servers, such as mscoree.dll if needed.
+                </xs:documentation></xs:annotation>
+          </xs:attribute>
+            <xs:attribute name="Server" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    May only be specified if the value of the Advertise attribute is "no" and the ForeignServer attribute is not specified.  File Id of the
+                    COM server file.  If this element is nested under a File element, this value defaults to
+                    the value of the parent File/@Id.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ShortPath" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>
+                        Specifies whether or not to use the short path for the COM server.  This can only apply when Advertise is set to 'no'.  The default is 'no' meaning that it will use the long file name for the COM server.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SafeForScripting" type="YesNoType">
+                <xs:annotation><xs:documentation>
+                    May only be specified if the value of the Advertise attribute is "no".
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SafeForInitializing" type="YesNoType">
+                <xs:annotation><xs:documentation>
+                    May only be specified if the value of the Advertise attribute is "no".
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Control" type="YesNoType">
+                <xs:annotation><xs:documentation>
+                    Set this attribute's value to 'yes' to identify an object as an ActiveX Control.  The default value is 'no'.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Interface">
+        <xs:annotation>
+            <xs:documentation>COM Interface registration for parent TypeLib.</xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="Registry" href="http://msdn.microsoft.com/library/aa371168.aspx" />
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="Guid" use="required">
+                <xs:annotation><xs:documentation>GUID identifier for COM Interface.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Name" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Name for COM Interface.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="BaseInterface" type="Guid">
+                <xs:annotation><xs:documentation>Identifies the interface from which the current interface is derived.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ProxyStubClassId" type="Guid">
+                <xs:annotation><xs:documentation>GUID CLSID for proxy stub to COM Interface.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ProxyStubClassId32" type="Guid">
+                <xs:annotation><xs:documentation>GUID CLSID for 32-bit proxy stub to COM Interface.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="NumMethods" type="xs:integer">
+                <xs:annotation><xs:documentation>Number of methods implemented on COM Interface.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Versioned" type="YesNoType">
+                <xs:annotation><xs:documentation>Determines whether a Typelib version entry should be created with the other COM Interface registry keys.  Default is 'yes'.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="FileTypeMask">
+        <xs:annotation><xs:documentation>FileType data for class Id registration.</xs:documentation></xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Offset" type="xs:integer" use="required">
+                <xs:annotation><xs:documentation>Offset into file. If positive, offset is from the beginning; if negative, offset is from the end.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Mask" type="HexType" use="required">
+                <xs:annotation><xs:documentation>Hex value that is AND'd against the bytes in the file at Offset.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Value" type="HexType" use="required">
+                <xs:annotation><xs:documentation>If the result of the AND'ing of Mask with the bytes in the file is Value, the file is a match for this File Type.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="ServiceDependency">
+        <xs:annotation>
+            <xs:documentation>
+                Service or group of services that must start before the parent service.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="ServiceInstall" href="http://msdn.microsoft.com/library/aa371637.aspx" />
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>
+                        The value of this attribute should be one of the following:
+                        <html:ol>
+                            <html:li>The name (not the display name) of a previously installed service.</html:li>
+                            <html:li>A foreign key referring to another ServiceInstall/@Id.</html:li>
+                            <html:li>A group of services (in which case the Group attribute should be set to 'yes').</html:li>
+                        </html:ol>
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Group" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>
+                        Set to 'yes' to indicate that the value in the Id attribute is the name of a group of services.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="ServiceInstall">
+        <xs:annotation>
+            <xs:documentation>
+                Adds and removes services for parent Component.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="ServiceInstall" href="http://msdn.microsoft.com/library/aa371637.aspx"/>
+                <xse:remarks>
+                    The service executable installed will point to the KeyPath for the Component.
+                    Therefore, you must ensure that the correct executable is either the first child
+                    File element under this Component or explicitly mark the appropriate File element
+                    as KeyPath='yes'.
+                </xse:remarks>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="PermissionEx">
+                    <xs:annotation><xs:documentation>Configures the ACLs for this service.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="ServiceDependency">
+                    <xs:annotation><xs:documentation>ordered list of dependencies when installing services</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="ServiceConfig"/>
+                <xs:element ref="ServiceConfigFailureActions"/>
+                <xs:any namespace="##other" processContents="lax">
+                    <xs:annotation>
+                        <xs:documentation>
+                            Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                            elements at this point in the schema.
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:any>
+            </xs:choice>
+            <xs:attribute name="Id" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    Unique identifier for this service configuration. This value will default to the Name attribute if not
+                    specified.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Name" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>This column is the string that gives the service name to install.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DisplayName" type="xs:string">
+                <xs:annotation><xs:documentation>This column is the localizable string that user interface programs use to identify the service.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Type" use="required">
+                <xs:annotation><xs:documentation>The Windows Installer does not currently support kernelDriver or systemDriver</xs:documentation></xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="ownProcess">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    A Win32 service that runs its own process.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="shareProcess">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    A Win32 service that shares a process.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="kernelDriver">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    A kernel driver service. This value is not currently supported by the Windows Installer.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="systemDriver">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    A file system driver service. This value is not currently supported by the Windows Installer.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="Interactive" type="YesNoType">
+                <xs:annotation><xs:documentation>Whether or not the service interacts with the desktop.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Start" use="required">
+                <xs:annotation><xs:documentation>Determines when the service should be started. The Windows Installer does not support boot or system.</xs:documentation></xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="auto">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    The service will start during startup of the system.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="demand">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    The service will start when the service control manager calls the StartService function.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="disabled">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    The service can no longer be started.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="boot">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    The service is a device driver that will be started by the operating system boot loader. This value is not currently supported by the Windows Installer.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="system">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    The service is a device driver that will be started by the IoInitSystem function. This value is not currently supported by the Windows Installer.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="ErrorControl" use="required">
+                <xs:annotation><xs:documentation>Determines what action should be taken on an error.</xs:documentation></xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="ignore">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Logs the error and continues with the startup operation.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="normal">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Logs the error, displays a message box and continues the startup operation.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="critical">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Logs the error if it is possible and the system is restarted with the last configuration known to be good. If the last-known-good configuration is being started, the startup operation fails.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="Vital" type="YesNoType">
+                <xs:annotation><xs:documentation>The overall install should fail if this service fails to install.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="LoadOrderGroup" type="xs:string">
+                <xs:annotation><xs:documentation>The load ordering group that this service should be a part of.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Account" type="xs:string">
+                <xs:annotation><xs:documentation>The account under which to start the service. Valid only when ServiceType is ownProcess.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Password" type="xs:string">
+                <xs:annotation><xs:documentation>The password for the account. Valid only when the account has a password.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Arguments" type="xs:string">
+                <xs:annotation><xs:documentation>Contains any command line arguments or properties required to run the service.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Description" type="xs:string">
+                <xs:annotation><xs:documentation>Sets the description of the service.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="EraseDescription" type="YesNoType">
+                <xs:annotation><xs:documentation>Determines whether the existing service description will be ignored. If 'yes', the service description will be null, even if the Description attribute is set.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="ServiceArgument" type="xs:string">
+        <xs:annotation>
+            <xs:documentation>
+                Argument used in ServiceControl parent
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="ServiceControl" href="http://msdn.microsoft.com/library/aa371634.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+    </xs:element>
+
+    <xs:element name="ServiceControl">
+        <xs:annotation>
+            <xs:documentation>
+                Starts, stops, and removes services for parent Component. This element is used to control the state 
+                of a service installed by the MSI or MSM file by using the start, stop and remove attributes.
+                For example, Start='install' Stop='both' Remove='uninstall' would mean: start the service on install, 
+                remove the service when the product is uninstalled, and stop the service both on install and uninstall.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="ServiceControl" href="http://msdn.microsoft.com/library/aa371634.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element ref="ServiceArgument" minOccurs="0" maxOccurs="unbounded">
+                    <xs:annotation><xs:documentation>Ordered list of arguments used when modifying services.</xs:documentation></xs:annotation>
+                </xs:element>
+            </xs:sequence>
+
+            <xs:attribute name="Id" type="xs:string" use="required"/>
+            <xs:attribute name="Name" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Name of the service.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Start" type="InstallUninstallType">
+                <xs:annotation><xs:documentation>
+                    Specifies whether the service should be started by the StartServices action on install, uninstall or both.
+                    For 'install', the service will be started only when the parent component is being installed (msiInstallStateLocal or
+                    msiInstallStateSource); for 'uninstall', the service will be started only when the parent component
+                    is being removed (msiInstallStateAbsent); for 'both', the service will be started in both cases.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Stop" type="InstallUninstallType">
+                <xs:annotation><xs:documentation>
+                    Specifies whether the service should be stopped by the StopServices action on install, uninstall or both.
+                    For 'install', the service will be stopped only when the parent component is being installed (msiInstallStateLocal or
+                    msiInstallStateSource); for 'uninstall', the service will be stopped only when the parent component
+                    is being removed (msiInstallStateAbsent); for 'both', the service will be stopped in both cases.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Remove" type="InstallUninstallType">
+                <xs:annotation><xs:documentation>
+                    Specifies whether the service should be removed by the DeleteServices action on install, uninstall or both.
+                    For 'install', the service will be removed only when the parent component is being installed (msiInstallStateLocal or
+                    msiInstallStateSource); for 'uninstall', the service will be removed only when the parent component
+                    is being removed (msiInstallStateAbsent); for 'both', the service will be removed in both cases.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Wait" type="YesNoType">
+                <xs:annotation><xs:documentation>Specifies whether or not to wait for the service to complete before continuing. The default is 'yes'.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="RequiredPrivilege" type="xs:string">
+        <xs:annotation>
+            <xs:documentation>
+                Privilege required by service configured by ServiceConfig parent. Valid values are a <html:a href="http://msdn.microsoft.com/en-us/library/bb530716.aspx">privilege constant</html:a> or a
+                Formatted property that resolves to a privilege constant.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="MsiServiceConfig" href="http://msdn.microsoft.com/library/aa371634.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+    </xs:element>
+
+    <xs:element name="ServiceConfig">
+        <xs:annotation>
+            <xs:documentation>
+                Configures a service being installed or one that already exists. This element's functionality is available starting with MSI 5.0.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="MsiServiceConfig" href="http://msdn.microsoft.com/library/aa371637.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="RequiredPrivilege">
+                    <xs:annotation><xs:documentation>List of privileges to apply to service.</xs:documentation></xs:annotation>
+                </xs:element>
+            </xs:choice>
+
+            <xs:attribute name="Id" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    Unique identifier for this service configuration. This value will default to the ServiceName attribute if not
+                    specified.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DelayedAutoStart" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    This attribute specifies whether an auto-start service should delay its start until after all other auto-start
+                    services. This attribute only affects auto-start services. Allowed values are "yes", "no" or a Formatted property that
+                    resolves to "1" (for "yes") or "0" (for "no"). If this attribute is not present the setting is not configured.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="FailureActionsWhen" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    This attribute specifies when failure actions should be applied. Allowed values are "failedToStop", "failedToStopOrReturnedError"
+                    or a Formatted property that resolves to "1" (for "failedToStopOrReturnedError") or "0" (for "failedToStop").  If this attribute
+                    is not present the setting is not configured.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="PreShutdownDelay" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    This attribute specifies time in milliseconds that the Service Control Manager (SCM) waits after notifying the service of a system
+                    shutdown.  If this attribute is not present the default value, 3 minutes, is used.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="OnInstall" type="YesNoType">
+                <xs:annotation><xs:documentation>
+                    Specifies whether to configure the service when the parent Component is installed. This attribute may be combined with OnReinstall
+                    and OnUninstall.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="OnReinstall" type="YesNoType">
+                <xs:annotation><xs:documentation>
+                    Specifies whether to configure the service when the parent Component is reinstalled. This attribute may be combined with OnInstall
+                    and OnUninstall.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="OnUninstall" type="YesNoType">
+                <xs:annotation><xs:documentation>
+                    Specifies whether to configure the service when the parent Component is uninstalled. This attribute may be combined with OnInstall
+                    and OnReinstall.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ServiceName" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    Specifies the name of the service to configure. This value will default to the ServiceInstall/@Name attribute when nested under
+                    a ServiceInstall element.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ServiceSid" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    Specifies the service SID to apply to the service. Valid values are "none", "restricted", "unrestricted" or a Formatted property
+                    that resolves to "0" (for "none"), "3" (for "restricted") or "1" (for "unrestricted"). If this attribute is not present the
+                    setting is not configured.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Failure">
+        <xs:annotation><xs:documentation>Failure action for a ServiceConfigFailureActions element.</xs:documentation></xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Action" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>
+                    Specifies the action to take when the service fails. Valid values are "none", "restartComputer", "restartService", "runCommand" or a Formatted property
+                    that resolves to "0" (for "none"), "1" (for "restartService"), "2" (for "restartComputer") or "3" (for "runCommand").
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Delay" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>
+                    Specifies the time in milliseconds to wait before performing the value from the Action attribute.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="ServiceConfigFailureActions">
+        <xs:annotation>
+            <xs:documentation>
+                Configures the failure actions for a service being installed or one that already exists. This element's functionality is available starting with MSI 5.0.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="MsiServiceConfigFailureActions" href="http://msdn.microsoft.com/library/aa371637.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="Failure">
+                    <xs:annotation><xs:documentation>Ordered list of failure actions to apply to service.</xs:documentation></xs:annotation>
+                </xs:element>
+            </xs:choice>
+
+            <xs:attribute name="Id" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    Unique identifier for this service configuration. This value will default to the ServiceName attribute if not
+                    specified.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Command" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    This attribute specifies command to execute when a "runCommand" failure action hit.  If an empty string is provided it clears
+                    the existing command. If this attribute is not present the setting is not changed.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="OnInstall" type="YesNoType">
+                <xs:annotation><xs:documentation>
+                    Specifies whether to configure the service when the parent Component is installed. This attribute may be combined with OnReinstall
+                    and OnUninstall.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="OnReinstall" type="YesNoType">
+                <xs:annotation><xs:documentation>
+                    Specifies whether to configure the service when the parent Component is reinstalled. This attribute may be combined with OnInstall
+                    and OnUninstall.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="OnUninstall" type="YesNoType">
+                <xs:annotation><xs:documentation>
+                    Specifies whether to configure the service when the parent Component is uninstalled. This attribute may be combined with OnInstall
+                    and OnReinstall.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="RebootMessage" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    Specifies the message to show for a reboot failure action. If an empty string is provided it clears any existing reboot message. If this
+                    attribute is not present the setting is not changed.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ResetPeriod" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    Specifies the time in seconds to reset the failure count. If this attribute is not present the failure count will not be reset.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ServiceName" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    Specifies the name of the service to configure. This value will default to the ServiceInstall/@Name attribute when nested under
+                    a ServiceInstall element.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Environment">
+        <xs:annotation>
+            <xs:documentation>
+                Environment variables added or removed for the parent component.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="Environment" href="http://msdn.microsoft.com/library/aa368369.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Unique identifier for environment entry.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Name" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Name of the environment variable.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Value" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        The value to set into the environment variable.
+                        If this attribute is not set, the environment variable is removed during installation if it exists on the machine.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Separator" type="xs:string">
+                <xs:annotation><xs:documentation>Optional attribute to change the separator used between values.  By default a semicolon is used.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Action">
+                <xs:annotation><xs:documentation>Specfies whether the environmental variable should be created, set or removed when the parent component is installed.</xs:documentation></xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="create">
+                            <xs:annotation><xs:documentation>Creates the environment variable if it does not exist, then set it during installation. This has no effect on the value of the environment variable if it already exists.</xs:documentation></xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="set">
+                            <xs:annotation><xs:documentation>Creates the environment variable if it does not exist, and then set it during installation. If the environment variable exists, set it during the installation.</xs:documentation></xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="remove">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Removes the environment variable during an installation.
+                                    The installer only removes an environment variable during an installation if the name and value
+                                    of the variable match the entries in the Name and Value attributes.
+                                    If you want to remove an environment variable, regardless of its value, do not set the Value attribute.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="Part">
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="all">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    This value is the entire environmental variable.  This is the default.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="first">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    This value is prefixed.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="last">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    This value is appended.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="Permanent" type="YesNoType">
+                <xs:annotation><xs:documentation>Specifies that the environment variable should not be removed on uninstall.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="System" type="YesNoType">
+                <xs:annotation><xs:documentation>
+                    Specifies that the environment variable should be added to the system environment space.  The default
+                    is 'no' which indicates the environment variable is added to the user environment space.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Condition">
+        <xs:annotation>
+            <xs:documentation>
+                Conditions for components, controls, features, and products. The condition is specified in the inner text of the element.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="Component" href="http://msdn.microsoft.com/library/aa368007.aspx"/>
+                <xse:msiRef table="ControlCondition" href="http://msdn.microsoft.com/library/aa368035.aspx"/>
+                <xse:msiRef table="Condition" href="http://msdn.microsoft.com/library/aa368014.aspx"/>
+                <xse:msiRef table="LaunchCondition" href="http://msdn.microsoft.com/library/aa369752.aspx"/>
+                <xse:howtoRef href="block_install_on_os.htm">How To: Block installation based on OS version</xse:howtoRef>
+                <xse:howtoRef href="check_the_version_number.htm">How To: Check the version number of a file during installation</xse:howtoRef>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:simpleContent>
+                <xs:extension base="xs:string">
+                    <xs:annotation><xs:documentation>
+                        Under a Component element, the condition becomes the condition of the component.  Under a Control element, 
+                        the condition becomes a ControlCondition entry.  Under a Feature element, the condition becomes a Condition
+                        entry.  Under a Fragment or Product element, the condition becomes a LaunchCondition entry.
+                    </xs:documentation></xs:annotation>
+                    <xs:attribute name="Action">
+                        <xs:annotation><xs:documentation>
+                            Used only under Control elements and is required.  Allows specific actions to be applied to a control based
+                            on the result of this condition.
+                        </xs:documentation></xs:annotation>
+                        <xs:simpleType>
+                            <xs:restriction base="xs:NMTOKEN">
+                                <xs:enumeration value="default">
+                                    <xs:annotation>
+                                        <xs:documentation>
+                                            Set the Control as the default. Only used under Control elements.
+                                        </xs:documentation>
+                                    </xs:annotation>
+                                </xs:enumeration>
+                                <xs:enumeration value="enable">
+                                    <xs:annotation>
+                                        <xs:documentation>
+                                            Enable the Control. Only used under Control elements.
+                                        </xs:documentation>
+                                    </xs:annotation>
+                                </xs:enumeration>
+                                <xs:enumeration value="disable">
+                                    <xs:annotation>
+                                        <xs:documentation>
+                                            Disable the Control. Only used under Control elements.
+                                        </xs:documentation>
+                                    </xs:annotation>
+                                </xs:enumeration>
+                                <xs:enumeration value="hide">
+                                    <xs:annotation>
+                                        <xs:documentation>
+                                            Hide the Control. Only used under Control elements.
+                                        </xs:documentation>
+                                    </xs:annotation>
+                                </xs:enumeration>
+                                <xs:enumeration value="show">
+                                    <xs:annotation>
+                                        <xs:documentation>
+                                            Display the Control. Only used under Control elements.
+                                        </xs:documentation>
+                                    </xs:annotation>
+                                </xs:enumeration>
+                            </xs:restriction>
+                        </xs:simpleType>
+                    </xs:attribute>
+                    <xs:attribute name="Level" type="xs:integer">
+                        <xs:annotation><xs:documentation>
+                            Used only under Feature elements and is required.  Allows modifying the level of a Feature based on the
+                            result of this condition.
+                        </xs:documentation></xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="Message" type="xs:string">
+                        <xs:annotation><xs:documentation>
+                            Used only under Fragment or Product elements and is required.  Set the value to the text to display when the
+                            condition fails and the installation must be terminated.
+                        </xs:documentation></xs:annotation>
+                    </xs:attribute>
+                </xs:extension>
+            </xs:simpleContent>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="IsolateComponent">
+        <xs:annotation>
+            <xs:documentation>
+                Shared Component to be privately replicated in folder of parent Component
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="IsolateComponent" href="http://msdn.microsoft.com/library/aa369730.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Shared" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>Shared Component for this application Component.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="ReserveCost">
+        <xs:annotation>
+            <xs:documentation>
+                Disk cost to reserve in a folder for running locally and/or from source.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="ReserveCost" href="http://msdn.microsoft.com/library/aa371226.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>A primary key that uniquely identifies this ReserveCost entry.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Directory" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Adds the amount of disk space specified in RunFromSource or RunLocal to the volume cost of the device containing the directory.
+                        If this attribute is not set, it will default to the directory of parent component.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="RunFromSource" type="xs:integer" use="required">
+                <xs:annotation>
+                    <xs:documentation>The number of bytes of disk space to reserve if the component is installed to run from source.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="RunLocal" type="xs:integer" use="required">
+                <xs:annotation>
+                    <xs:documentation>The number of bytes of disk space to reserve if the component is installed to run locally.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Component">
+        <xs:annotation>
+            <xs:documentation>Component for parent Directory</xs:documentation>
+            <xs:appinfo>
+                <xse:seeAlso ref="ComponentRef"/>
+                <xse:seeAlso ref="Media"/>
+                <xse:msiRef table="Component" href="http://msdn.microsoft.com/library/aa368007.aspx"/>
+                <xse:msiRef table="Condition" href="http://msdn.microsoft.com/library/aa368014.aspx"/>
+                <xse:msiRef table="Directory" href="http://msdn.microsoft.com/library/aa368295.aspx"/>
+                <xse:howtoRef href="add_a_file.htm">How To: Add a file to your installer</xse:howtoRef>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="AppId"/>
+                <xs:element ref="Category"/>
+                <xs:element ref="Class"/>
+                <xs:element ref="Condition"/>
+                <xs:element ref="CopyFile"/>
+                <xs:element ref="CreateFolder"/>
+                <xs:element ref="Environment"/>
+                <xs:element ref="Extension"/>
+                <xs:element ref="File"/>
+                <xs:element ref="IniFile"/>
+                <xs:element ref="Interface"/>
+                <xs:element ref="IsolateComponent"/>
+                <xs:element ref="ODBCDataSource"/>
+                <xs:element ref="ODBCDriver"/>
+                <xs:element ref="ODBCTranslator"/>
+                <xs:element ref="ProgId"/>
+                <xs:element ref="Registry"/>
+                <xs:element ref="RegistryKey"/>
+                <xs:element ref="RegistryValue"/>
+                <xs:element ref="RemoveFile"/>
+                <xs:element ref="RemoveFolder"/>
+                <xs:element ref="RemoveRegistryKey"/>
+                <xs:element ref="RemoveRegistryValue"/>
+                <xs:element ref="ReserveCost"/>
+                <xs:element ref="ServiceControl"/>
+                <xs:element ref="ServiceConfig"/>
+                <xs:element ref="ServiceConfigFailureActions"/>
+                <xs:element ref="ServiceInstall"/>
+                <xs:element ref="Shortcut"/>
+                <xs:element ref="SymbolPath"/>
+                <xs:element ref="TypeLib"/>
+                <xs:any namespace="##other" processContents="lax">
+                    <xs:annotation><xs:documentation>
+                        Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                        elements at this point in the schema.
+                    </xs:documentation></xs:annotation>
+                </xs:any>
+            </xs:choice>
+
+            <xs:attribute name="Id" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Component identifier; this is the primary key for identifying components. If omitted,
+                        the compiler defaults the identifier to the identifier of the resource that is the
+                        explicit keypath of the component (for example, a child File element with KeyPath
+                        attribute with value 'yes'.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ComPlusFlags" type="xs:integer">
+                <xs:annotation>
+                    <xs:documentation>
+                        Set this attribute to create a ComPlus entry.  The value should be the export flags used
+                        during the generation of the .msi file.  For more information see the COM+ documentation
+                        in the Platform SDK.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DisableRegistryReflection" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>
+                        Set this attribute to 'yes' in order to disable registry reflection on all existing and
+                        new registry keys affected by this component.
+                        When set to 'yes', the Windows Installer calls the RegDisableReflectionKey on each key
+                        being accessed by the component.
+                        This bit is available with Windows Installer version 4.0 and is ignored on 32-bit systems.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Directory" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Sets the Directory of the Component.  If this element is nested under a Directory element,
+                        this value defaults to the value of the parent Directory/@Id.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DiskId" type="xs:integer">
+                <xs:annotation>
+                    <xs:documentation>
+                        This attribute provides a default DiskId attribute for all child File elements. Specifying
+                        the DiskId on a Component element will override any DiskId attributes set by parent Directory
+                        or DirectoryRef elements. See the File element's DiskId attribute for more information about
+                        the purpose of the DiskId.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Feature" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Identifies a feature to which this component belongs, as a shorthand for a child
+                        ComponentRef element of the Feature element. The value of this attribute should 
+                        correspond to the Id attribute of a Feature element authored elsewhere. Note that 
+                        a single component can belong to multiple features but this attribute allows you 
+                        to specify only a single feature.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Guid" type="ComponentGuid">
+                <xs:annotation>
+                    <xs:documentation>
+                        This value should be a guid that uniquely identifies this component's contents, language, platform, and version.
+                        If omitted, the default value is '*' which indicates that the linker should generate a stable guid.
+                        Generatable guids are supported only for components with a single file as the component's keypath 
+                        or no files and a registry value as the keypath.
+                        It's also possible to set the value to an empty string to specify an unmanaged component.
+                        Unmanaged components are a security vulnerability because the component cannot be removed or repaired
+                        by Windows Installer (it is essentially an unpatchable, permanent component).  Therefore, a guid should
+                        always be specified for any component which contains resources that may need to be patched in the future.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="KeyPath" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>
+                        If this attribute's value is set to 'yes', then the Directory of this Component is used
+                        as the KeyPath. To set a Registry value or File as the KeyPath of a component, set the
+                        KeyPath attribute to 'yes' on one of those child elements. If KeyPath is not set to 'yes' for the
+                        Component or for a child Registry value or File, WiX will look at the child elements under the
+                        Component in sequential order and try to automatically select one of them as a key path. Allowing
+                        WiX to automatically select a key path can be dangerous because adding or removing child elements
+                        under the Component can inadvertantly cause the key path to change, which can lead to
+                        installation problems.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Location">
+                <xs:annotation>
+                    <xs:documentation>
+                        Optional value that specifies the location that the component can be run from.
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="local">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Prevents the component from running from the source or the network (this is the default behavior if this attribute is not set).
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="source">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Enforces that the component can only be run from the source (it cannot be run from the user's computer).
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="either">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Allows the component to run from source or locally.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="NeverOverwrite" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>
+                        If this attribute is set to 'yes', the installer does not install or reinstall the
+                        component if a key path file or a key path registry entry for the component already
+                        exists.  The application does register itself as a client of the component.  Use this
+                        flag only for components that are being registered by the Registry table.  Do not use
+                        this flag for components registered by the AppId, Class, Extension, ProgId, MIME, and
+                        Verb tables.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Permanent" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>
+                        If this attribute is set to 'yes', the installer does not remove the component during
+                        an uninstall. The installer registers an extra system client for the component in
+                        the Windows Installer registry settings (which basically just means that at least one
+                        product is always referencing this component).  Note that this option differs from the
+                        behavior of not setting a guid because although the component is permanent, it is still
+                        patchable (because Windows Installer still tracks it), it's just not uninstallable.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Shared" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>
+                        If this attribute's value is set to 'yes', enables advanced patching semantics for
+                        Components that are shared across multiple Products.  Specifically, the Windows Installer
+                        will cache the shared files to improve patch uninstall.  This functionality is available
+                        in Windows Installer 4.5 and later.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SharedDllRefCount" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>
+                        If this attribute's value is set to 'yes', the installer increments the reference count
+                        in the shared DLL registry of the component's key file.  If this bit is not set, the
+                        installer increments the reference count only if the reference count already exists.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Transitive" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>
+                        If this attribute is set to 'yes', the installer reevaluates the value of the statement
+                        in the Condition upon a reinstall.  If the value was previously False and has changed to
+                        True, the installer installs the component.  If the value was previously True and has
+                        changed to False, the installer removes the component even if the component has other
+                        products as clients.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="UninstallWhenSuperseded" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>
+                        If this attribute is set to 'yes', the installer will uninstall the Component's files
+                        and registry keys when it is superseded by a patch.  This functionality is available in
+                        Windows Installer 4.5 and later.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Win64" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>
+                        Set this attribute to 'yes' to mark this as a 64-bit component. This attribute facilitates
+                        the installation of packages that include both 32-bit and 64-bit components.  If this bit
+                        is not set, the component is registered as a 32-bit component.  If this is a 64-bit
+                        component replacing a 32-bit component, set this bit and assign a new GUID in the Guid attribute.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:anyAttribute namespace="##other" processContents="lax">
+                <xs:annotation><xs:documentation>
+                    Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                    attributes at this point in the schema.
+                </xs:documentation></xs:annotation>
+            </xs:anyAttribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="ComponentGroup">
+        <xs:annotation>
+            <xs:documentation>
+                Groups together multiple components to be used in other locations.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:seeAlso ref="ComponentGroupRef"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="Component"/>
+                <xs:element ref="ComponentGroupRef"/>
+                <xs:element ref="ComponentRef"/>
+                <xs:any namespace="##other" processContents="lax">
+                    <xs:annotation><xs:documentation>
+                        Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                        elements at this point in the schema.
+                    </xs:documentation></xs:annotation>
+                </xs:any>
+            </xs:choice>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Identifier for the ComponentGroup.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:anyAttribute namespace="##other" processContents="lax">
+                <xs:annotation><xs:documentation>
+                    Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                    attributes at this point in the schema.
+                </xs:documentation></xs:annotation>
+            </xs:anyAttribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="ComponentGroupRef">
+        <xs:annotation>
+            <xs:documentation>Create a reference to a ComponentGroup in another Fragment.</xs:documentation>
+            <xs:appinfo>
+                <xse:seeAlso ref="ComponentGroup"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>The identifier of the ComponentGroup to reference.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Primary" type="YesNoType">
+                <xs:annotation><xs:documentation>
+                    Set this attribute to 'yes' in order to make the parent feature of this component
+                    the primary feature for this component.  Components may belong to multiple features.
+                    By designating a feature as the primary feature of a component, you ensure that
+                    whenever a component is selected for install-on-demand (IOD), the primary feature
+                    will be the one to install it.  This attribute should only be set if a component
+                    actually nests under multiple features.  If a component nests under only one feature,
+                    that feature is the primary feature for the component.  You cannot set more than one
+                    feature as the primary feature of a given component.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:anyAttribute namespace="##other" processContents="lax">
+                <xs:annotation><xs:documentation>
+                    Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                    attributes at this point in the schema.
+                </xs:documentation></xs:annotation>
+            </xs:anyAttribute>
+        </xs:complexType>
+    </xs:element>
+
+      <xs:element name="BinaryRef">
+        <xs:annotation>
+            <xs:documentation>Used only for PatchFamilies to include only a binary table entry in a patch.</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>The identifier of the Binary element to reference.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:anyAttribute namespace="##other" processContents="lax">
+                <xs:annotation><xs:documentation>
+                    Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                    attributes at this point in the schema.
+                </xs:documentation></xs:annotation>
+            </xs:anyAttribute>
+        </xs:complexType>
+    </xs:element>
+  
+      <xs:element name="IconRef">
+        <xs:annotation>
+            <xs:documentation>Used only for PatchFamilies to include only a icon table entry in a patch.</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>The identifier of the Icon element to reference.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:anyAttribute namespace="##other" processContents="lax">
+                <xs:annotation><xs:documentation>
+                    Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                    attributes at this point in the schema.
+                </xs:documentation></xs:annotation>
+            </xs:anyAttribute>
+        </xs:complexType>
+    </xs:element>
+  
+    <xs:element name="ComponentRef">
+        <xs:annotation>
+            <xs:documentation>Create a reference to a Feature element in another Fragment.</xs:documentation>
+            <xs:appinfo>
+                <xse:seeAlso ref="Component"/>
+                <xse:howtoRef href="add_a_file.htm">How To: Add a file to your installer</xse:howtoRef>               
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>The identifier of the Component element to reference.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Primary" type="YesNoType">
+                <xs:annotation><xs:documentation>
+                    Set this attribute to 'yes' in order to make the parent feature of this component
+                    the primary feature for this component.  Components may belong to multiple features.
+                    By designating a feature as the primary feature of a component, you ensure that
+                    whenever a component is selected for install-on-demand (IOD), the primary feature
+                    will be the one to install it.  This attribute should only be set if a component
+                    actually nests under multiple features.  If a component nests under only one feature,
+                    that feature is the primary feature for the component.  You cannot set more than one
+                    feature as the primary feature of a given component.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:anyAttribute namespace="##other" processContents="lax">
+                <xs:annotation><xs:documentation>
+                    Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                    attributes at this point in the schema.
+                </xs:documentation></xs:annotation>
+            </xs:anyAttribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Merge">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="MergeRef"/>
+                <xse:howtoRef href="install_vcredist.htm">How To: Install the Visual C++ Redistributable with your installer</xse:howtoRef>
+            </xs:appinfo>
+            <xs:documentation>Merge directive to bring in a merge module that will be redirected to the parent directory.</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="ConfigurationData">
+                    <xs:annotation><xs:documentation>Data to use as input to a configurable merge module.</xs:documentation></xs:annotation>
+                </xs:element>
+            </xs:choice>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>The unique identifier for the Merge element in the source code.  Referenced by the MergeRef/@Id.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DiskId" type="xs:string">
+                <xs:annotation><xs:documentation>The value of this attribute should correspond to the Id attribute of a
+                    Media element authored elsewhere.  By creating this connection between the merge module and Media
+                    element, you set the packaging options to the values specified in the Media
+                    element (values such as compression level, cab embedding, etc...).</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="FileCompression" type="YesNoType">
+                <xs:annotation><xs:documentation>Specifies if the files in the merge module should be compressed.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Language" type="LocalizableInteger" use="required">
+                <xs:annotation><xs:documentation>Specifies the decimal LCID or localization token for the language to merge the Module in as.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SourceFile" type="xs:string">
+                <xs:annotation><xs:documentation>Path to the source location of the merge module.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="src" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        This attribute has been deprecated. Use the SourceFile attribute instead.
+                    </xs:documentation>
+                    <xs:appinfo>
+                        <xse:deprecated ref="SourceFile" />
+                    </xs:appinfo>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="MergeRef">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="Merge"/>
+                <xse:howtoRef href="install_vcredist.htm">How To: Install the Visual C++ Redistributable with your installer</xse:howtoRef>                
+            </xs:appinfo>
+            <xs:documentation>Merge reference to connect a Merge Module to parent Feature</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>The unique identifier for the Merge element to be referenced.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Primary" type="YesNoType">
+                <xs:annotation><xs:documentation>Specifies whether the feature containing this MergeRef is the primary feature for advertising the merge module's components.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:anyAttribute namespace="##other" processContents="lax">
+                <xs:annotation><xs:documentation>
+                    Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                    attributes at this point in the schema.
+                </xs:documentation></xs:annotation>
+            </xs:anyAttribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="ConfigurationData">
+        <xs:annotation><xs:documentation>Data to use as input to a configurable merge module.</xs:documentation></xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Name" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Key into the ModuleConfiguration table.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Value" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Value to be passed to configurable merge module.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Directory">
+        <xs:annotation>
+            <xs:documentation>Directory layout for the product.  Also specifies the mappings between source and target directories.</xs:documentation>
+            <xs:appinfo>
+                <xse:seeAlso ref="DirectoryRef"/>
+                <xse:msiRef table="Directory" href="http://msdn.microsoft.com/library/aa368295.aspx" />
+                <xse:howtoRef href="add_a_file.htm">How To: Add a file to your installer</xse:howtoRef>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="Component"/>
+                <xs:element ref="Directory"/>
+                <xs:element ref="Merge"/>
+                <xs:element ref="SymbolPath"/>
+                <xs:any namespace="##other" processContents="lax">
+                    <xs:annotation><xs:documentation>
+                        Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                        elements at this point in the schema.
+                    </xs:documentation></xs:annotation>
+                </xs:any>
+            </xs:choice>
+
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>This value is the unique identifier of the directory entry.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ComponentGuidGenerationSeed" type="Guid">
+                <xs:annotation>
+                    <xs:documentation>
+                        The Component Guid Generation Seed is a guid that must be used when a Component with the generate guid directive ("*")
+                        is not rooted in a standard Windows Installer directory (for example, ProgramFilesFolder or CommonFilesFolder, etc).
+                        It is recommended that this attribute be avoided and that developers install their Components under standard 
+                        directories with unique names instead (for example, "ProgramFilesFolder\Company Name Product Name Version"). It is
+                        important to note that once a directory is assigned a Component Guid Generation Seed the value must not change until
+                        the directory name changes.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DiskId" type="xs:integer">
+                <xs:annotation>
+                    <xs:documentation>
+                        Sets the default disk identifier for the files contained in this directory.
+                        This attribute's value may be overridden by a child Component, Directory,
+                        Merge or File element. See the File or Merge elements' DiskId attribute for
+                        more information.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="FileSource" type="xs:string">
+                <xs:annotation><xs:documentation>Used to set the file system source for this directory's child elements. For more information, see <html:a href="specifying_source_files.htm">Specifying source files</html:a>.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="LongName" type="LongFileNameType">
+                <xs:annotation>
+                    <xs:documentation>
+                        This attribute has been deprecated. Use the Name attribute instead.
+                    </xs:documentation>
+                    <xs:appinfo>
+                        <xse:deprecated ref="Name" />
+                    </xs:appinfo>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="LongSource" type="LongFileNameType">
+                <xs:annotation>
+                    <xs:documentation>
+                        This attribute has been deprecated. Use the SourceName attribute instead.
+                    </xs:documentation>
+                    <xs:appinfo>
+                        <xse:deprecated ref="SourceName" />
+                    </xs:appinfo>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Name" type="LongFileNameType">
+                <xs:annotation>
+                    <xs:documentation>
+                        The name of the directory.
+
+                        Do not specify this attribute (or the LongName attribute) if this directory represents
+                        the same directory as the parent (see the Windows Installer SDK's
+                        <html:a href='http://msdn2.microsoft.com/library/Aa368295.aspx' target='_blank'>Directory table</html:a>
+                        topic for more information about the "." operator).
+
+                        In prior versions of the WiX toolset, this attribute specified the short directory name.
+                        This attribute's value may now be either a short or long directory name.
+                        If a short directory name is specified, the ShortName attribute may not be specified.
+                        If a long directory name is specified, the LongName attribute may not be specified.
+                        Also, if this value is a long directory name, the ShortName attribute may be omitted to
+                        allow WiX to attempt to generate a unique short directory name.
+                        However, if this name collides with another directory or you wish to manually specify
+                        the short directory name, then the ShortName attribute may be specified.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ShortName" type="ShortFileNameType">
+                <xs:annotation>
+                    <xs:documentation>
+                        The short name of the directory in 8.3 format.
+                        This attribute should only be set if there is a conflict between generated short directory names
+                        or the user wants to manually specify the short directory name.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ShortSourceName" type="ShortFileNameType">
+                <xs:annotation>
+                    <xs:documentation>
+                        The short name of the directory on the source media in 8.3 format.
+                        This attribute should only be set if there is a conflict between generated short directory names
+                        or the user wants to manually specify the short source directory name.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SourceName" type="LongFileNameType">
+                <xs:annotation>
+                    <xs:documentation>
+                        The name of the directory on the source media.
+                        If this attribute is not specified, Windows Installer will default to the Name attribute.
+
+                        In prior versions of the WiX toolset, this attribute specified the short source directory name.
+                        This attribute's value may now be either a short or long directory name.
+                        If a short directory name is specified, the ShortSourceName attribute may not be specified.
+                        If a long directory name is specified, the LongSource attribute may not be specified.
+                        Also, if this value is a long directory name, the ShortSourceName attribute may be omitted to
+                        allow WiX to attempt to generate a unique short directory name.
+                        However, if this name collides with another directory or you wish to manually specify
+                        the short directory name, then the ShortSourceName attribute may be specified.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="src" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        This attribute has been deprecated. Use the FileSource attribute instead.
+                    </xs:documentation>
+                    <xs:appinfo>
+                        <xse:deprecated ref="FileSource" />
+                    </xs:appinfo>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="DirectoryRef">
+        <xs:annotation>
+            <xs:documentation>Create a reference to a Directory element in another Fragment.</xs:documentation>
+            <xs:appinfo>
+                <xse:seeAlso ref="Directory"/>
+                <xse:howtoRef href="add_a_file.htm">How To: Add a file to your installer</xse:howtoRef>                
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="Component"/>
+                <xs:element ref="Directory"/>
+                <xs:element ref="Merge"/>
+                <xs:any namespace="##other" processContents="lax">
+                    <xs:annotation><xs:documentation>
+                        Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                        elements at this point in the schema.
+                    </xs:documentation></xs:annotation>
+                </xs:any>
+            </xs:choice>
+
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>The identifier of the Directory element to reference.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DiskId" type="xs:integer">
+                <xs:annotation>
+                    <xs:documentation>
+                        Sets the default disk identifier for the files contained in this directory.
+                        This attribute's value may be overridden by a child Component, Directory,
+                        Merge or File element. See the File or Merge elements' DiskId attribute for
+                        more information.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="FileSource" type="xs:string">
+                <xs:annotation><xs:documentation>Used to set the file system source for this DirectoryRef's child elements. For more information, see <html:a href="specifying_source_files.htm">Specifying source files</html:a>.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="src" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        This attribute has been deprecated. Use the FileSource attribute instead.
+                    </xs:documentation>
+                    <xs:appinfo>
+                        <xse:deprecated ref="FileSource" />
+                    </xs:appinfo>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:anyAttribute namespace="##other" processContents="lax">
+                <xs:annotation><xs:documentation>
+                    Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                    attributes at this point in the schema.
+                </xs:documentation></xs:annotation>
+            </xs:anyAttribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="UpgradeVersion">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef table="Upgrade" href="http://msdn.microsoft.com/library/aa372379.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:simpleContent>
+                <xs:extension base="xs:string">
+                    <xs:attribute name="Minimum" type="xs:string">
+                        <xs:annotation><xs:documentation>Specifies the lower bound on the range of product versions to be detected by FindRelatedProducts.</xs:documentation></xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="Maximum" type="xs:string">
+                        <xs:annotation><xs:documentation>Specifies the upper boundary of the range of product versions detected by FindRelatedProducts.</xs:documentation></xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="Language" type="xs:string">
+                        <xs:annotation><xs:documentation>Specifies the set of languages detected by FindRelatedProducts.  Enter a list of numeric language identifiers (LANGID) separated by commas (,).  Leave this value null to specify all languages.  Set ExcludeLanguages to "yes" in order detect all languages, excluding the languages listed in this value.</xs:documentation></xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="RemoveFeatures" type="xs:string">
+                        <xs:annotation><xs:documentation>The installer sets the REMOVE property to features specified in this column.  The features to be removed can be determined at run time.  The Formatted string entered in this field must evaluate to a comma-delimited list of feature names.  For example: [Feature1],[Feature2],[Feature3].  No features are removed if the field contains formatted text that evaluates to an empty string.  The installer sets REMOVE=ALL only if the Remove field is empty.</xs:documentation></xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="Property" type="xs:string" use="required">
+                        <xs:annotation><xs:documentation>When the FindRelatedProducts action detects a related product installed on the system, it appends the product code to the property specified in this field.  Windows Installer documentation for the <html:a href="http://msdn2.microsoft.com/library/aa372379.aspx" target="_blank">Upgrade table</html:a> states that the property specified in this field must be a public property and must be added to the <html:a href="http://msdn2.microsoft.com/library/aa371571.aspx" target="_blank">SecureCustomProperties</html:a> property.  WiX automatically appends the property specified in this field to the SecureCustomProperties property when creating an MSI.  Each UpgradeVersion must have a unique Property value.  After the FindRelatedProducts action is run, the value of this property is a list of product codes, separated by semicolons (;), detected on the system.</xs:documentation></xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="MigrateFeatures" type="YesNoType">
+                        <xs:annotation><xs:documentation>Set to "yes" to migrate feature states from upgraded products by enabling the logic in the MigrateFeatureStates action.</xs:documentation></xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="OnlyDetect" type="YesNoType">
+                        <xs:annotation><xs:documentation>Set to "yes" to detect products and applications but do not uninstall.</xs:documentation></xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="IgnoreRemoveFailure" type="YesNoType">
+                        <xs:annotation><xs:documentation>Set to "yes" to continue installation upon failure to remove a product or application.</xs:documentation></xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="IncludeMinimum" type="YesNoType">
+                        <xs:annotation><xs:documentation>Set to "no" to make the range of versions detected exclude the value specified in Minimum.  This attribute is "yes" by default.</xs:documentation></xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="IncludeMaximum" type="YesNoType">
+                        <xs:annotation><xs:documentation>Set to "yes" to make the range of versions detected include the value specified in Maximum.</xs:documentation></xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="ExcludeLanguages" type="YesNoType">
+                        <xs:annotation><xs:documentation>Set to "yes" to detect all languages, excluding the languages listed in the Language attribute.</xs:documentation></xs:annotation>
+                    </xs:attribute>
+                    <xs:anyAttribute namespace="##other" processContents="lax">
+                        <xs:annotation><xs:documentation>
+                            Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                            attributes at this point in the schema.
+                        </xs:documentation></xs:annotation>
+                    </xs:anyAttribute>
+                </xs:extension>
+            </xs:simpleContent>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Upgrade">
+        <xs:annotation>
+            <xs:documentation>
+                Upgrade info for a particular UpgradeCode
+          </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="Upgrade" href="http://msdn.microsoft.com/library/aa372379.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="UpgradeVersion"/>
+                <xs:element ref="Property">
+                    <xs:annotation>
+                        <xs:documentation>
+                            Nesting a Property element under an Upgrade element has been deprecated.
+                            Please nest Property elements in any of the other supported locations.
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:element>
+            </xs:choice>
+
+            <xs:attribute name="Id" type="Guid" use="required">
+                <xs:annotation><xs:documentation>This value specifies the upgrade code for the products that are to be detected by the FindRelatedProducts action.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Feature">
+        <xs:annotation>
+            <xs:documentation>
+                A feature for the Feature table.  Features are the smallest installable unit.  See msi.chm for more
+                detailed information on the myriad installation options for a feature.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:seeAlso ref="FeatureRef"/>
+                <xse:msiRef table="Feature" href="http://msdn.microsoft.com/library/aa368585.aspx"/>
+                <xse:howtoRef href="add_a_file.htm">How To: Add a file to your installer</xse:howtoRef>                
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="Component"/>
+                <xs:element ref="ComponentGroupRef"/>
+                <xs:element ref="ComponentRef"/>
+                <xs:element ref="Condition"/>
+                <xs:element ref="Feature"/>
+                <xs:element ref="FeatureGroupRef"/>
+                <xs:element ref="FeatureRef"/>
+                <xs:element ref="MergeRef"/>
+                <xs:any namespace="##other" processContents="lax">
+                    <xs:annotation><xs:documentation>
+                        Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                        elements at this point in the schema.
+                    </xs:documentation></xs:annotation>
+                </xs:any>
+            </xs:choice>
+
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Unique identifier of the feature.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Absent">
+                <xs:annotation>
+                    <xs:documentation>
+                        This attribute determines if a user will have the option to set a feature to absent in the user interface.
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="allow">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Allows the user interface to display an option to change the feature state to Absent.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="disallow">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Prevents the user interface from displaying an option to change the feature state
+                                    to Absent by setting the msidbFeatureAttributesUIDisallowAbsent attribute.  This will force the feature
+                                    to the installation state, whether or not the feature is visible in the UI.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="AllowAdvertise">
+                <xs:annotation>
+                    <xs:documentation>
+                        This attribute determines the possible advertise states for this feature.
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="no">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Prevents this feature from being advertised by setting the msidbFeatureAttributesDisallowAdvertise attribute.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="system">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Prevents advertising for this feature if the operating system shell does not support Windows Installer
+                                    descriptors by setting the msidbFeatureAttributesNoUnsupportedAdvertise attribute.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="yes">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Allows the feature to be advertised.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="ConfigurableDirectory" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    Specify the Id of a Directory that can be configured by the user at installation time.  This identifier
+                    must be a public property and therefore completely uppercase.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Description" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    Longer string of text describing the feature.  This localizable string is displayed by the
+                    Text Control of the Selection Dialog.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Display" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Determines the initial display of this feature in the feature tree.
+                        This attribute's value should be one of the following:
+                        <html:dl>
+                            <html:dt class="enumerationValue">
+                                <html:dfn>collapse</html:dfn>
+                            </html:dt>
+                            <html:dd>Initially shows the feature collapsed.  This is the default value.</html:dd>
+                            <html:dt class="enumerationValue">
+                                <html:dfn>expand</html:dfn>
+                            </html:dt>
+                            <html:dd>Initially shows the feature expanded.</html:dd>
+                            <html:dt class="enumerationValue">
+                                <html:dfn>hidden</html:dfn>
+                            </html:dt>
+                            <html:dd>Prevents the feature from displaying in the user interface.</html:dd>
+                            <html:dt class="enumerationValue">
+                                <html:dfn>&lt;an explicit integer value&gt;</html:dfn>
+                            </html:dt>
+                            <html:dd>
+                                For advanced users only, it is possible to directly set the integer value
+                                of the display value that will appear in the Feature row.
+                            </html:dd>
+                        </html:dl>
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="InstallDefault">
+                <xs:annotation>
+                    <xs:documentation>
+                        This attribute determines the default install/run location of a feature.  This attribute cannot be specified
+                        if the value of the FollowParent attribute is 'yes' since that would ask the installer to force this feature
+                        to follow the parent installation state and simultaneously favor a particular installation state just for this feature.
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="followParent">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Forces the feature to follow the same installation state as its parent feature.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="local">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Favors installing this feature locally by setting the msidbFeatureAttributesFavorLocal attribute.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="source">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Favors running this feature from source by setting the msidbFeatureAttributesFavorSource attribute.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="Level" type="xs:integer" use="required">
+                <xs:annotation><xs:documentation>
+                    Sets the install level of this feature.  A value of 0 will disable the feature.  Processing the
+                    Condition Table can modify the level value (this is set via the Condition child element).
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Title" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    Short string of text identifying the feature.  This string is listed as an item by the
+                    SelectionTree control of the Selection Dialog.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="TypicalDefault">
+                <xs:annotation><xs:documentation>
+                    This attribute determines the default advertise state of the feature.
+                </xs:documentation></xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="advertise">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Sets the feature to be advertised by setting the msidbFeatureAttributesFavorAdvertise attribute.
+                                    This value cannot be set if the value of the AllowAdvertise attribute is 'no' since that would ask the installer to
+                                    disallow the advertised state for this feature while at the same time favoring it.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="install">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Sets the feature to the default non-advertised installation option.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:anyAttribute namespace="##other" processContents="lax">
+                <xs:annotation><xs:documentation>
+                    Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                    attributes at this point in the schema.
+                </xs:documentation></xs:annotation>
+            </xs:anyAttribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="FeatureGroup">
+        <xs:annotation>
+            <xs:documentation>
+                Groups together multiple components, features, and merges to be used in other locations.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:seeAlso ref="FeatureGroupRef"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="Component"/>
+                <xs:element ref="ComponentGroupRef"/>
+                <xs:element ref="ComponentRef"/>
+                <xs:element ref="Feature"/>
+                <xs:element ref="FeatureGroupRef"/>
+                <xs:element ref="FeatureRef"/>
+                <xs:element ref="MergeRef"/>
+                <xs:any namespace="##other" processContents="lax">
+                    <xs:annotation>
+                        <xs:documentation>
+                            Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                            elements at this point in the schema.
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:any>
+            </xs:choice>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>Identifier for the FeatureGroup.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:anyAttribute namespace="##other" processContents="lax">
+                <xs:annotation>
+                    <xs:documentation>
+                        Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                        attributes at this point in the schema.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:anyAttribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="FeatureGroupRef">
+        <xs:annotation>
+            <xs:documentation>Create a reference to a FeatureGroup in another Fragment.</xs:documentation>
+            <xs:appinfo>
+                <xse:seeAlso ref="FeatureGroup"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>The identifier of the FeatureGroup to reference.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IgnoreParent" type="YesNoType">
+                <xs:annotation><xs:documentation>
+                    Normally feature group references that end up nested under a parent element create a 
+                    connection to that parent. This behavior is undesirable when trying to simply reference
+                    to a FeatureGroup in a different Fragment.  Specify 'yes' to have this feature group
+                    reference not create a connection to its parent. The default is 'no'.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Primary" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>
+                        Set this attribute to 'yes' in order to make the parent feature of this group
+                        the primary feature for any components and merges contained in the group. 
+                        Features may belong to multiple features.  By designating a feature as the 
+                        primary feature of a component or merge, you ensure that whenever a component is 
+                        selected for install-on-demand (IOD), the primary feature will be the one to install 
+                        it.  This attribute should only be set if a component actually nests under multiple 
+                        features.  If a component nests under only one feature, that feature is the primary 
+                        feature for the component.  You cannot set more than one feature as the primary 
+                        feature of a given component.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:anyAttribute namespace="##other" processContents="lax">
+                <xs:annotation>
+                    <xs:documentation>
+                        Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                        attributes at this point in the schema.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:anyAttribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="FeatureRef">
+        <xs:annotation>
+            <xs:documentation>Create a reference to a Feature element in another Fragment.</xs:documentation>
+            <xs:appinfo>
+                <xse:seeAlso ref="Feature"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="Component"/>
+                <xs:element ref="ComponentGroupRef"/>
+                <xs:element ref="ComponentRef"/>
+                <xs:element ref="Feature"/>
+                <xs:element ref="FeatureRef"/>
+                <xs:element ref="FeatureGroup"/>
+                <xs:element ref="FeatureGroupRef"/>
+                <xs:element ref="MergeRef"/>
+                <xs:any namespace="##other" processContents="lax">
+                    <xs:annotation><xs:documentation>
+                        Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                        elements at this point in the schema.
+                    </xs:documentation></xs:annotation>
+                </xs:any>
+            </xs:choice>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>The identifier of the Feature element to reference.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IgnoreParent" type="YesNoType">
+                <xs:annotation><xs:documentation>
+                    Normally feature references that are nested under a parent element create a connection to that
+                    parent. This behavior is undesirable when trying to simply reference a Feature in a different
+                    Fragment.  Specify 'yes' to have this feature reference not create a connection to its parent.
+                    The default is 'no'.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:anyAttribute namespace="##other" processContents="lax">
+                <xs:annotation><xs:documentation>
+                    Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                    attributes at this point in the schema.
+                </xs:documentation></xs:annotation>
+            </xs:anyAttribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Media">
+        <xs:annotation>
+            <xs:documentation>Media element describes a disk that makes up the source media for the installation.</xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="Media" href="http://msdn.microsoft.com/library/aa369801.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:sequence>
+                <xs:choice minOccurs="0" maxOccurs="unbounded">
+                    <xs:element ref="DigitalSignature" minOccurs="0" />
+                    <xs:element ref="PatchBaseline" minOccurs="0" maxOccurs="unbounded"/>
+                    <xs:element ref="SymbolPath"/>
+                </xs:choice>
+            </xs:sequence>
+            <xs:attribute name="Id" type="xs:integer" use="required">
+                <xs:annotation><xs:documentation>Disk identifier for Media table. This number must be equal to or greater than 1.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Cabinet" type="xs:string">
+                <xs:annotation><xs:documentation>The name of the cabinet if some or all of the files stored on the media are in a cabinet file.  If no cabinets are used, this attribute must not be set.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="CompressionLevel">
+                <xs:annotation>
+                    <xs:documentation>
+                        Indicates the compression level for the Media's cabinet.  This attribute can 
+                        only be used in conjunction with the Cabinet attribute.  The default is 'mszip'.
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="high"/>
+                        <xs:enumeration value="low"/>
+                        <xs:enumeration value="medium"/>
+                        <xs:enumeration value="mszip"/>
+                        <xs:enumeration value="none"/>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="DiskPrompt" type="xs:string">
+                <xs:annotation><xs:documentation>The disk name, which is usually the visible text printed on the disk. This localizable text is used to prompt the user when this disk needs to be inserted. This value will be used in the "[1]" of the DiskPrompt Property. Using this attribute will require you to define a DiskPrompt Property.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="EmbedCab" type="YesNoType">
+                <xs:annotation><xs:documentation>Instructs the binder to embed the cabinet in the product if 'yes'.  This attribute can only be specified in conjunction with the Cabinet attribute.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Layout" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        This attribute specifies the root directory for the uncompressed files that
+                        are a part of this Media element.  By default, the src will be the output
+                        directory for the final image.  The default value ensures the binder generates
+                        an installable image.  If a relative path is specified in the src attribute,
+                        the value will be appended to the image's output directory.  If an absolute
+                        path is provided, that path will be used without modification.  The latter two
+                        options are provided to ease the layout of an image onto multiple medias (CDs/DVDs).
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="src" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        This attribute has been deprecated. Use the Layout attribute instead.
+                    </xs:documentation>
+                    <xs:appinfo>
+                        <xse:deprecated ref="Layout" />
+                    </xs:appinfo>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="VolumeLabel" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        The label attributed to the volume. This is the volume label returned 
+                        by the GetVolumeInformation function. If the SourceDir property refers 
+                        to a removable (floppy or CD-ROM) volume, then this volume label is 
+                        used to verify that the proper disk is in the drive before attempting 
+                        to install files. The entry in this column must match the volume label 
+                        of the physical media. 
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Source" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Optional property that identifies the source of the embedded cabinet.
+                        If a cabinet is specified for a patch, this property should be defined
+                        and unique to each patch so that the embedded cabinet containing patched
+                        and new files can be located in the patch package. If the cabinet is not
+                        embedded - this is not typical - the cabinet can be found in the directory
+                        referenced in this column. If empty, the external cabinet must be located
+                        in the SourceDir directory.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="IgnoreModularization">
+        <xs:annotation>
+            <xs:documentation>
+                This element has been deprecated.
+                Use the Binary/@SuppressModularization, CustomAction/@SuppressModularization, or Property/@SuppressModularization attributes instead.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Name" use="required" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        The name of the item to ignore modularization for.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Type">
+                <xs:annotation>
+                    <xs:documentation>
+                        The type of the item to ignore modularization for.
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="Action" />
+                        <xs:enumeration value="Property" />
+                        <xs:enumeration value="Directory" />
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="CustomAction">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="Custom"/>
+                <xse:seeAlso ref="CustomActionRef"/>
+                <xse:msiRef table="CustomAction" href="http://msdn.microsoft.com/library/aa368062.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>
+                Specifies a custom action to be added to the MSI CustomAction table. Various combinations of the attributes for this element
+                correspond to different custom action types. For more information about custom actions see the
+                <html:a href="http://msdn.microsoft.com/library/aa372048.aspx" target="_blank">
+                Custom Action Types</html:a> topic on MSDN.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:simpleContent>
+                <xs:extension base="xs:string">
+                    <xs:annotation><xs:documentation>
+                        The text node is only valid if the Script attribute is specified.  In that case, the text node contains the script to embed.
+                    </xs:documentation></xs:annotation>
+
+                    <xs:attribute name="Id" type="xs:string" use="required">
+                        <xs:annotation><xs:documentation>
+                            The identifier of the custom action.
+                        </xs:documentation></xs:annotation>
+                    </xs:attribute>
+                    <!-- CustomAction Source specification, sets source Attribute bits -->
+                    <xs:attribute name="BinaryKey" type="xs:string">
+                        <xs:annotation>
+                            <xs:documentation>
+                                This attribute is a reference to a Binary element with matching Id attribute.  That binary stream contains
+                                the custom action for use during install.  The custom action will not be installed into a target directory.  This attribute is
+                                typically used with the DllEntry attribute to specify the custom action DLL to use for a type 1 custom action, with the ExeCommand
+                                attribute to specify a type 17 custom action that runs an embedded executable, or with the VBScriptCall or JScriptCall attributes 
+                                to specify a type 5 or 6 custom action.
+                            </xs:documentation>
+                        </xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="FileKey" type="xs:string">
+                        <xs:annotation>
+                            <xs:documentation>
+                                This attribute specifies a reference to a File element with matching Id attribute that
+                                will execute the custom action code in the file after the file is installed.  This 
+                                attribute is typically used with the ExeCommand attribute to specify a type 18 custom action
+                                that runs an installed executable, with the DllEntry attribute to specify an installed custom
+                                action DLL to use for a type 17 custom action, or with the VBScriptCall or JScriptCall 
+                                attributes to specify a type 21 or 22 custom action.
+                            </xs:documentation>
+                        </xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="Property" type="xs:string">
+                        <xs:annotation>
+                            <xs:documentation>
+                                This attribute specifies a reference to a Property element with matching Id attribute that specifies the Property
+                                to be used or updated on execution of this custom action. This attribute is 
+                                typically used with the Value attribute to create a type 51 custom action that parses 
+                                the text in Value and places it into the specified Property.  This attribute is also used with 
+                                the ExeCommand attribute to create a type 50 custom action that uses the value of the 
+                                given property to specify the path to the executable. Type 51 custom actions are often useful to
+                                pass values to a deferred custom action.
+                                See <html:a href="http://msdn.microsoft.com/library/aa370543.aspx" target="_blank">
+                                http://msdn.microsoft.com/library/aa370543.aspx</html:a>
+                                for more information.
+                            </xs:documentation>
+                        </xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="Directory" type="xs:string">
+                        <xs:annotation>
+                            <xs:documentation>
+                                This attribute specifies a reference to a Directory element with matching Id attribute containing a directory path. 
+                                This attribute is typically used with the ExeCommand attribute to specify the source executable for a type 34 
+                                custom action, or with the Value attribute to specify a formatted string to place in the specified Directory 
+                                table entry in a type 35 custom action.
+                            </xs:documentation>
+                        </xs:annotation>
+                    </xs:attribute>
+                    <!-- CustomAction Target specification, sets target Attribute bits -->
+                    <xs:attribute name="DllEntry" type="xs:string">
+                        <xs:annotation>
+                            <xs:documentation>
+                                This attribute specifies the name of a function in a custom action to execute.
+                                This attribute is used with the BinaryKey attribute to create a type 1 custom 
+                                action, or with the FileKey attribute to create a type 17 custom action.
+                            </xs:documentation>
+                        </xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="ExeCommand" type="xs:string">
+                        <xs:annotation>
+                            <xs:documentation>
+                                This attribute specifies the command line parameters to supply to an externally 
+                                run executable. This attribute is typically used with the BinaryKey attribute for a type 2 custom action, 
+                                the FileKey attribute for a type 18 custom action, the Property attribute for a type 50 custom action,
+                                or the Directory attribute for a type 34 custom action that specify the executable to run. 
+                            </xs:documentation>
+                        </xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="JScriptCall" type="xs:string">
+                        <xs:annotation><xs:documentation>
+                            This attribute specifies the name of the JScript function to execute in a script. The script must be
+                            provided in a Binary element identified by the BinaryKey attribute described above. In other words, this
+                            attribute must be specified in conjunction with the BinaryKey attribute.
+                        </xs:documentation></xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="VBScriptCall" type="xs:string">
+                        <xs:annotation><xs:documentation>
+                            This attribute specifies the name of the VBScript Subroutine to execute in a script. The script must be
+                            provided in a Binary element identified by the BinaryKey attribute described above. In other words, this
+                            attribute must be specified in conjunction with the BinaryKey attribute.
+                        </xs:documentation></xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="Script">
+                        <xs:annotation><xs:documentation>
+                            Creates a type 37 or 38 custom action.  The text of the element should contain the script to be embedded in the package.
+                        </xs:documentation></xs:annotation>
+                        <xs:simpleType>
+                            <xs:restriction base="xs:NMTOKEN">
+                                <xs:enumeration value="jscript"/>
+                                <xs:enumeration value="vbscript"/>
+                            </xs:restriction>
+                        </xs:simpleType>
+                    </xs:attribute>
+                    <xs:attribute name="SuppressModularization" type="YesNoType">
+                        <xs:annotation>
+                            <xs:documentation>
+                                Use to suppress modularization of this custom action name in merge modules.
+                                This should only be necessary for table-driven custom actions because the
+                                table name which they interact with cannot be modularized, so there can only
+                                be one instance of the table.
+                            </xs:documentation>
+                        </xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="Value" type="xs:string">
+                        <xs:annotation>
+                            <xs:documentation>
+                                This attribute specifies a string value to use in the custom action. This attribute
+                                must be used with the Property attribute to set the property as part of a
+                                type 51 custom action or with the Directory attribute to set a directory path in that
+                                table in a type 35 custom action. The value can be a literal value or derived from a
+                                Property element using the <html:a href='http://msdn.microsoft.com/library/aa368609.aspx' target='_blank'>Formatted</html:a>
+                                syntax. 
+                            </xs:documentation>
+                        </xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="Error" type="xs:string">
+                        <xs:annotation>
+                            <xs:documentation>
+                                This attribute specifies an index in the MSI Error table to use as an error message for a 
+                                type 19 custom action that displays the error message and aborts a product's installation.
+                            </xs:documentation>
+                        </xs:annotation>
+                    </xs:attribute>
+                    <!-- Other CustomAction type attributes -->
+                    <xs:attribute name="Return">
+                        <xs:annotation>
+                            <xs:documentation>
+                                Set this attribute to set the return behavior of the custom action.
+                            </xs:documentation>
+                        </xs:annotation>
+                        <xs:simpleType>
+                            <xs:restriction base="xs:NMTOKEN">
+                                <xs:enumeration value="asyncNoWait">
+                                    <xs:annotation>
+                                        <xs:documentation>
+                                            Indicates that the custom action will run asyncronously and execution may continue after the installer terminates.
+                                        </xs:documentation>
+                                    </xs:annotation>
+                                </xs:enumeration>
+                                <xs:enumeration value="asyncWait">
+                                    <xs:annotation>
+                                        <xs:documentation>
+                                            Indicates that the custom action will run asynchronously but the installer will wait for the return code at sequence end.
+                                        </xs:documentation>
+                                    </xs:annotation>
+                                </xs:enumeration>
+                                <xs:enumeration value="check">
+                                    <xs:annotation>
+                                        <xs:documentation>
+                                            Indicates that the custom action will run synchronously and the return code will be checked for success.  This is the default.
+                                        </xs:documentation>
+                                    </xs:annotation>
+                                </xs:enumeration>
+                                <xs:enumeration value="ignore">
+                                    <xs:annotation>
+                                        <xs:documentation>
+                                            Indicates that the custom action will run synchronously and the return code will not be checked.
+                                        </xs:documentation>
+                                    </xs:annotation>
+                                </xs:enumeration>
+                            </xs:restriction>
+                        </xs:simpleType>
+                    </xs:attribute>
+                    <xs:attribute name="Execute">
+                        <xs:annotation>
+                            <xs:documentation>
+                                This attribute indicates the scheduling of the custom action.
+                            </xs:documentation>
+                        </xs:annotation>
+                        <xs:simpleType>
+                            <xs:restriction base="xs:NMTOKEN">
+                                <xs:enumeration value="commit">
+                                    <xs:annotation>
+                                        <xs:documentation>
+                                            Indicates that the custom action will run after successful completion of the installation script (at the end of the installation).
+                                        </xs:documentation>
+                                    </xs:annotation>
+                                </xs:enumeration>
+                                <xs:enumeration value="deferred">
+                                    <xs:annotation>
+                                        <xs:documentation>
+                                            Indicates that the custom action runs in-script (possibly with elevated privileges).
+                                        </xs:documentation>
+                                    </xs:annotation>
+                                </xs:enumeration>
+                                <xs:enumeration value="firstSequence">
+                                    <xs:annotation>
+                                        <xs:documentation>
+                                            Indicates that the custom action will only run in the first sequence that runs it.
+                                        </xs:documentation>
+                                    </xs:annotation>
+                                </xs:enumeration>
+                                <xs:enumeration value="immediate">
+                                    <xs:annotation>
+                                        <xs:documentation>
+                                            Indicates that the custom action will run during normal processing time with user privileges.  This is the default.
+                                        </xs:documentation>
+                                    </xs:annotation>
+                                </xs:enumeration>
+                                <xs:enumeration value="oncePerProcess">
+                                    <xs:annotation>
+                                        <xs:documentation>
+                                            Indicates that the custom action will only run in the first sequence that runs it in the same process.
+                                        </xs:documentation>
+                                    </xs:annotation>
+                                </xs:enumeration>
+                                <xs:enumeration value="rollback">
+                                    <xs:annotation>
+                                        <xs:documentation>
+                                            Indicates that a custom action will run in the rollback sequence when a failure
+                                            occurs during installation, usually to undo changes made by a deferred custom action.
+                                        </xs:documentation>
+                                    </xs:annotation>
+                                </xs:enumeration>
+                                <xs:enumeration value="secondSequence">
+                                    <xs:annotation>
+                                        <xs:documentation>
+                                            Indicates that a custom action should be run a second time if it was previously run in an earlier sequence.
+                                        </xs:documentation>
+                                    </xs:annotation>
+                                </xs:enumeration>
+                            </xs:restriction>
+                        </xs:simpleType>
+                    </xs:attribute>
+                    <xs:attribute name="Impersonate" type="YesNoType">
+                        <xs:annotation>
+                            <xs:documentation>
+                                This attribute specifies whether the Windows Installer, which executes as LocalSystem, 
+                                should impersonate the user context of the installing user when executing this custom action. 
+                                Typically the value should be 'yes', except when the custom action needs elevated privileges
+                                to apply changes to the machine.
+                            </xs:documentation>
+                        </xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="PatchUninstall" type="YesNoType">
+                        <xs:annotation>
+                            <xs:documentation>
+                                This attribute specifies that the Windows Installer, execute the custom action only when
+                                a patch is being uninstalled.  These custom actions should also be conditioned using the
+                                MSIPATCHREMOVE property to ensure proper down level (less than Windows Installer 4.5)
+                                behavior.
+                            </xs:documentation>
+                        </xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="Win64" type="YesNoType">
+                        <xs:annotation>
+                            <xs:documentation>
+                                Specifies that a script custom action targets a 64-bit platform. Valid only when used with
+                                the Script, VBScriptCall, and JScriptCall attributes.
+                            </xs:documentation>
+                        </xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="TerminalServerAware" type="YesNoType">
+                        <xs:annotation>
+                            <xs:documentation>
+                                This attribute specifies controls whether the custom action will impersonate the 
+                                installing user during per-machine installs on Terminal Server machines.
+                                Deferred execution custom actions that do not specify this attribute, or explicitly set it 'no',
+                                will run with no user impersonation on Terminal Server machines during 
+                                per-machine installations.  This attribute is only applicable when installing on the 
+                                Windows Server 2003 family.
+                            </xs:documentation>
+                        </xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="HideTarget" type="YesNoType">
+                        <xs:annotation><xs:documentation>Ensures the installer does not log the CustomActionData for the deferred custom action.</xs:documentation></xs:annotation>
+                    </xs:attribute>
+                    <xs:anyAttribute namespace="##other" processContents="lax">
+                        <xs:annotation><xs:documentation>
+                            Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                            attributes at this point in the schema.
+                        </xs:documentation></xs:annotation>
+                    </xs:anyAttribute>
+                </xs:extension>
+            </xs:simpleContent>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="CustomActionRef">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="CustomAction"/>
+            </xs:appinfo>
+            <xs:documentation>
+                This will cause the entire contents of the Fragment containing the referenced CustomAction to be 
+                included in the installer database.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>The identifier of the CustomAction to reference.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:anyAttribute namespace="##other" processContents="lax">
+                <xs:annotation><xs:documentation>
+                    Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                    attributes at this point in the schema.
+                </xs:documentation></xs:annotation>
+            </xs:anyAttribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="SetDirectory">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="Custom"/>
+                <xse:seeAlso ref="CustomActionRef"/>
+                <xse:seeAlso ref="InstallUISequence"/>
+                <xse:seeAlso ref="InstallExecuteSequence"/>
+                <xse:msiRef table="CustomAction" href="http://msdn.microsoft.com/library/aa368062.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>
+                Sets a Directory to a particular value. This is accomplished by creating a Type 51 custom action that is appropriately scheduled in
+                the InstallUISequence and InstallExecuteSequence.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:simpleContent>
+                <xs:extension base="xs:string">
+                    <xs:annotation><xs:documentation>
+                        The condition that determines whether the Directory is set. If the condition evaluates to false, the SetDirectory is skipped.
+                    </xs:documentation></xs:annotation>
+
+                    <xs:attribute name="Id" type="xs:string">
+                        <xs:annotation>
+                            <xs:documentation>
+                                This attribute specifies a reference to a Directory element with matching Id attribute. The path of the Directory will be set to
+                                the Value attribute.
+                            </xs:documentation>
+                        </xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="Sequence" type="SequenceType">
+                        <xs:annotation>
+                            <xs:documentation>
+                                Controls which sequences the Directory assignment is sequenced in.
+                                For 'execute', the assignment is scheduled in the InstallExecuteSequence. For 'ui', the
+                                assignment is scheduled in the InstallUISequence.  For 'both', the assignment is scheduled
+                                in both the InstallUISequence and the InstallExecuteSequence. The default is both.
+                            </xs:documentation>
+                        </xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="Value" type="xs:string">
+                        <xs:annotation>
+                            <xs:documentation>
+                                This attribute specifies a string value to assign to the Directory. The value can be a literal value or derived from a
+                                Property element using the <html:a href='http://msdn.microsoft.com/library/aa368609.aspx' target='_blank'>Formatted</html:a>
+                                syntax.
+                            </xs:documentation>
+                        </xs:annotation>
+                    </xs:attribute>
+                    <xs:anyAttribute namespace="##other" processContents="lax">
+                        <xs:annotation><xs:documentation>
+                            Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                            attributes at this point in the schema.
+                        </xs:documentation></xs:annotation>
+                    </xs:anyAttribute>
+                </xs:extension>
+            </xs:simpleContent>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="SetProperty">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="Custom"/>
+                <xse:seeAlso ref="CustomActionRef"/>
+                <xse:seeAlso ref="InstallUISequence"/>
+                <xse:seeAlso ref="InstallExecuteSequence"/>
+                <xse:msiRef table="CustomAction" href="http://msdn.microsoft.com/library/aa368062.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>
+                Sets a Property to a particular value. This is accomplished by creating a Type 51 custom action that is appropriately scheduled in
+                the InstallUISequence and InstallExecuteSequence.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:simpleContent>
+                <xs:extension base="xs:string">
+                    <xs:annotation><xs:documentation>
+                        The condition that determines whether the Property is set. If the condition evaluates to false, the Set is skipped.
+                    </xs:documentation></xs:annotation>
+
+                    <xs:attribute name="After" type="xs:string">
+                        <xs:annotation><xs:documentation>The name of the standard or custom action after which this action should be performed. Mutually exclusive with the Before attribute. A Before or After attribute is required when setting a Property.</xs:documentation></xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="Before" type="xs:string">
+                        <xs:annotation><xs:documentation>The name of the standard or custom action before which this action should be performed. Mutually exclusive with the After attribute. A Before or After attribute is required when setting a Property.</xs:documentation></xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="Id" type="xs:string">
+                        <xs:annotation>
+                            <xs:documentation>
+                                This attribute specifies the Property to set to the Value.
+                            </xs:documentation>
+                        </xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="Sequence" type="SequenceType">
+                        <xs:annotation>
+                            <xs:documentation>
+                                Controls which sequences the Property assignment is sequenced in.
+                                For 'execute', the assignment is scheduled in the InstallExecuteSequence. For 'ui', the
+                                assignment is scheduled in the InstallUISequence.  For 'both', the assignment is scheduled
+                                in both the InstallUISequence and the InstallExecuteSequence. The default is both.
+                            </xs:documentation>
+                        </xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="Value" type="xs:string">
+                        <xs:annotation>
+                            <xs:documentation>
+                                This attribute specifies a string value to assign to the Property. The value can be a literal value or derived from a
+                                Property element using the <html:a href='http://msdn.microsoft.com/library/aa368609.aspx' target='_blank'>Formatted</html:a>
+                                syntax.
+                            </xs:documentation>
+                        </xs:annotation>
+                    </xs:attribute>
+                    <xs:anyAttribute namespace="##other" processContents="lax">
+                        <xs:annotation><xs:documentation>
+                            Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                            attributes at this point in the schema.
+                        </xs:documentation></xs:annotation>
+                    </xs:anyAttribute>
+                </xs:extension>
+            </xs:simpleContent>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="PatchFamilyRef">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="PatchFamily"/>
+            </xs:appinfo>
+            <xs:documentation>
+                This will cause the entire contents of the Fragment containing the referenced PatchFamily to be 
+                used in the process of creating a patch.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>The identifier of the CustomAction to reference.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:anyAttribute namespace="##other" processContents="lax">
+                <xs:annotation><xs:documentation>
+                    Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                    attributes at this point in the schema.
+                </xs:documentation></xs:annotation>
+            </xs:anyAttribute>
+        </xs:complexType>
+    </xs:element>
+
+    <!-- - - - - - - - - - - Sequence Table Definitions - - - - - - - - - - - - - - -->
+    <xs:element name="ValidateProductID" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="ValidateProductID" href="http://msdn.microsoft.com/library/aa372475.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Sets the ProductID property to the full product identifier.  This action must be sequenced before the user interface wizard in the InstallUISequence table and before the RegisterUser action in the InstallExecuteSequence table.  If the product identifier has already been validated successfully, the ValidateProductID action does nothing.  The ValidateProductID action always returns a success, whether or not the product identifier is valid, so that the product identifier can be entered on the command line the first time the product is run.  The product identifier can be validated without having the user reenter this information by setting the PIDKEY property on the command line or by using a transform.  The display of the dialog box requesting the user to enter the product identifier can then be made conditional upon the presence of the ProductID property, which is set when the PIDKEY property is validated.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="CostInitialize" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="FileCost"/>
+                <xse:seeAlso ref="CostFinalize"/>
+                <xse:msiRef action="CostInitialize" href="http://msdn.microsoft.com/library/aa368048.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Initiates the internal installation costing process.  Any standard or custom actions that affect costing should be sequenced before the CostInitialize action.  Call the FileCost action immediately following the CostInitialize action.  Then call the CostFinalize action following the CostInitialize action to make all final cost calculations available to the installer through the Component table.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="FileCost" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="CostInitialize"/>
+                <xse:seeAlso ref="CostFinalize"/>
+                <xse:msiRef action="FileCost" href="http://msdn.microsoft.com/library/aa368589.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Initiates dynamic costing of standard installation actions.  Any standard or custom actions that affect costing should sequenced before the CostInitialize action.  Call the FileCost action immediately following the CostInitialize action.  Then call the CostFinalize action following the FileCost action to make all final cost calculations available to the installer through the Component table.  The CostInitialize action must be executed before the FileCost action.  The installer then determines the disk-space cost of every file in the File table, on a per-component basis, taking both volume clustering and the presence of existing files that may need to be overwritten into account.  All actions that consume or release disk space are also considered.  If an existing file is found, a file version check is performed to determine whether the new file actually needs to be installed or not.  If the existing file is of an equal or greater version number, the existing file is not overwritten and no disk-space cost is incurred.  In all cases, the installer uses the results of version number checking to set the installation state of each file.  The FileCost action initializes cost calculation with the installer.  Actual dynamic costing does not occur until the CostFinalize action is executed.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="IsolateComponents" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="IsolateComponent"/>
+                <xse:msiRef action="IsolateComponents" href="http://msdn.microsoft.com/library/aa369561.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Installs a copy of a component (commonly a shared DLL) into a private location for use by a specific application (typically an .exe).  This isolates the application from other copies of the component that may be installed to a shared location on the computer.  The action refers to each record of the IsolatedComponent table and associates the files of the component listed in the Component_Shared field with the component listed in the Component_Application field.  The installer installs the files of Component_Shared into the same directory as Component_Application.  The installer generates a file in this directory, zero bytes in length, having the short filename name of the key file for Component_Application (typically this is the same file name as the .exe) appended with .local.  The IsolatedComponent action does not affect the installation of Component_Application.  Uninstalling Component_Application also removes the Component_Shared files and the .local file from the directory.  The IsolateComponents action can be used only in the InstallUISequence table and the InstallExecuteSequence table.  This action must come after the CostInitialize action and before the CostFinalize action.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="CostFinalize" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="CostInitialize"/>
+                <xse:seeAlso ref="FileCost"/>
+                <xse:msiRef action="CostFinalize" href="http://msdn.microsoft.com/library/aa368048.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Ends the internal installation costing process begun by the CostInitialize action.  Any standard or custom actions that affect costing should be sequenced before the CostInitialize action.  Call the FileCost action immediately following the CostInitialize action and then call the CostFinalize action to make all final cost calculations available to the installer through the Component table.  The CostFinalize action must be executed before starting any user interface sequence which allows the user to view or modify Feature table selections or directories.  The CostFinalize action queries the Condition table to determine which features are scheduled to be installed.  Costing is done for each component in the Component table.  The CostFinalize action also verifies that all the target directories are writable before allowing the installation to continue.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="SetODBCFolders" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="SetODBCFolders" href="http://msdn.microsoft.com/library/aa371691.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Checks for existing ODBC drivers and sets the target directory for each new driver to the location of an existing driver.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="MigrateFeatureStates" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="MigrateFeatureStates" href="http://msdn.microsoft.com/library/aa370034.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Used for upgrading or installing over an existing application.  Reads feature states from existing application and sets these feature states for the pending installation.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="ExecuteAction" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="ExecuteAction" href="http://msdn.microsoft.com/library/aa368565.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Initiates the execution sequence.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="InstallValidate" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="InstallValidate" href="http://msdn.microsoft.com/library/aa369546.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Verifies that all costed volumes have enough space for the installation.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="InstallInitialize" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="InstallFinalize"/>
+                <xse:msiRef action="InstallInitialize" href="http://msdn.microsoft.com/library/aa369535.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Marks the beginning of a sequence of actions that change the system.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="AllocateRegistrySpace" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="AllocateRegistrySpace" href="http://msdn.microsoft.com/library/aa367554.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Ensures the needed amount of space exists in the registry.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="ProcessComponents" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="ProcessComponents" href="http://msdn.microsoft.com/library/aa370853.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Registers and unregisters components, their key paths, and the component clients.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="UnpublishComponents" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="UnpublishComponents" href="http://msdn.microsoft.com/library/aa372106.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Manages the unadvertisement of components listed in the PublishComponent table.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="MsiUnpublishAssemblies" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="MsiUnpublishAssemblies" href="http://msdn.microsoft.com/library/aa370500.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Manages the unadvertisement of CLR and Win32 assemblies that are being removed.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="UnpublishFeatures" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="UnpublishFeatures" href="http://msdn.microsoft.com/library/aa372107.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Removes selection-state and feature-component mapping information from the registry.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="StopServices" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="StopServices" href="http://msdn.microsoft.com/library/aa372028.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Stops system services.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="DeleteServices" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="DeleteServices" href="http://msdn.microsoft.com/library/aa368270.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Stops a service and removes its registration from the system.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="UnregisterComPlus" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="UnregisterComPlus" href="http://msdn.microsoft.com/library/aa372109.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Removes COM+ applications from the registry.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="SelfUnregModules" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="SelfUnregModules" href="http://msdn.microsoft.com/library/aa371610.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Unregisters all modules listed in the SelfReg table that are scheduled to be uninstalled.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="UnregisterTypeLibraries" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="UnregisterTypeLibraries" href="http://msdn.microsoft.com/library/aa372357.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Unregisters type libraries from the system.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="RemoveODBC" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="RemoveODBC" href="http://msdn.microsoft.com/library/aa371206.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Removes the data sources, translators, and drivers listed for removal during the installation.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="UnregisterFonts" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="UnregisterFonts" href="http://msdn.microsoft.com/library/aa372112.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Removes registration information about installed fonts from the system.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="RemoveRegistryValues" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="RemoveRegistryValues" href="http://msdn.microsoft.com/library/aa371207.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Removes a registry value that has been authored into the registry table if the associated component was installed locally or as run from source, and is now set to be uninstalled.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="UnregisterClassInfo" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="UnregisterClassInfo" href="http://msdn.microsoft.com/library/aa372108.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Manages the removal of COM class information from the system registry.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="UnregisterExtensionInfo" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="UnregisterExtensionInfo" href="http://msdn.microsoft.com/library/aa372110.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Manages the removal of extension-related information from the system registry.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="UnregisterProgIdInfo" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="UnregisterProgIdInfo" href="http://msdn.microsoft.com/library/aa372114.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Manages the unregistration of OLE ProgId information with the system.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="UnregisterMIMEInfo" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="UnregisterMIMEInfo" href="http://msdn.microsoft.com/library/aa372113.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Unregisters MIME-related registry information from the system.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="RemoveIniValues" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="RemoveIniValues" href="http://msdn.microsoft.com/library/aa371205.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Removes .ini file information specified for removal in the RemoveIniFile table if the component is set to be installed locally or run from source.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="RemoveShortcuts" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="RemoveShortcuts" href="http://msdn.microsoft.com/library/aa371209.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Manages the removal of an advertised shortcut whose feature is selected for uninstallation or a nonadvertised shortcut whose component is selected for uninstallation.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="RemoveEnvironmentStrings" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="RemoveEnvironmentStrings" href="http://msdn.microsoft.com/library/aa371196.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Modifies the values of environment variables.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="RemoveDuplicateFiles" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="RemoveDuplicateFiles" href="http://msdn.microsoft.com/library/aa371195.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Deletes files installed by the DuplicateFiles action.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="RemoveFiles" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="RemoveFiles" href="http://msdn.microsoft.com/library/aa371199.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Removes files previously installed by the InstallFiles action.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="RemoveFolders" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="RemoveFolders" href="http://msdn.microsoft.com/library/aa371202.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Removes any folders linked to components set to be removed or run from source.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="CreateFolders" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="CreateFolders" href="http://msdn.microsoft.com/library/aa368052.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Creates empty folders for components that are set to be installed.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="MoveFiles" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef table="MoveFile" href="http://msdn.microsoft.com/library/aa370055.aspx"/>
+                <xse:msiRef action="MoveFiles" href="http://msdn.microsoft.com/library/aa370054.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Locates existing files on the system and moves or copies those files to a new location.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="InstallAdminPackage" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="InstallAdminPackage" href="http://msdn.microsoft.com/library/aa369287.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Copies the product database to the administrative installation point.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="InstallFiles" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="InstallFiles" href="http://msdn.microsoft.com/library/aa369503.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Copies files specified in the File table from the source directory to the destination directory.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="DuplicateFiles" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="DuplicateFiles" href="http://msdn.microsoft.com/library/aa368334.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Duplicates files installed by the InstallFiles action.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="PatchFiles" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="PatchFiles" href="http://msdn.microsoft.com/library/aa370577.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Queries the Patch table to determine which patches are to be applied.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="BindImage" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef table="BindImage" href="http://msdn.microsoft.com/library/aa367828.aspx"/>
+                <xse:msiRef action="BindImage" href="http://msdn.microsoft.com/library/aa367827.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Binds each executable or DLL that must be bound to the DLLs imported by it.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="CreateShortcuts" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="CreateShortcuts" href="http://msdn.microsoft.com/library/aa368054.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Manages the creation of shortcuts.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="RegisterClassInfo" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="RegisterClassInfo" href="http://msdn.microsoft.com/library/aa371154.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Manages the registration of COM class information with the system.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="RegisterExtensionInfo" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="RegisterExtensionInfo" href="http://msdn.microsoft.com/library/aa371156.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Manages the registration of extension related information with the system.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="RegisterProgIdInfo" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="RegisterProgIdInfo" href="http://msdn.microsoft.com/library/aa371164.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Manages the registration of OLE ProgId information with the system.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="RegisterMIMEInfo" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="RegisterMIMEInfo" href="http://msdn.microsoft.com/library/aa371160.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Registers MIME-related registry information with the system.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="WriteRegistryValues" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="WriteRegistryValues" href="http://msdn.microsoft.com/library/aa372891.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Sets up an application's registry information.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="WriteIniValues" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="WriteIniValues" href="http://msdn.microsoft.com/library/aa372884.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Writes the .ini file information that the application needs written to its .ini files.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="WriteEnvironmentStrings" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="WriteEnvironmentStrings" href="http://msdn.microsoft.com/library/aa372883.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Modifies the values of environment variables.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="RegisterFonts" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="RegisterFonts" href="http://msdn.microsoft.com/library/aa371158.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Registers installed fonts with the system.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="InstallODBC" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="InstallODBC" href="http://msdn.microsoft.com/library/aa369538.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Installs the drivers, translators, and data sources in the ODBCDriver table, ODBCTranslator table, and ODBCDataSource table.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="RegisterTypeLibraries" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="RegisterTypeLibraries" href="http://msdn.microsoft.com/library/aa371165.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Registers type libraries with the system.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="SelfRegModules" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="SelfRegModules" href="http://msdn.microsoft.com/library/aa371607.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Processes all modules listed in the SelfReg table and registers all installed modules with the system.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="RegisterComPlus" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="RegisterComPlus" href="http://msdn.microsoft.com/library/aa371155.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Registers COM+ applications.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="InstallServices" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="InstallServices" href="http://msdn.microsoft.com/library/aa369540.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Registers a service for the system.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="StartServices" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="StartServices" href="http://msdn.microsoft.com/library/aa372026.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Starts system services.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="RegisterUser" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="RegisterUser" href="http://msdn.microsoft.com/library/aa371166.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Registers the user information with the installer to identify the user of a product.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="RegisterProduct" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="RegisterProduct" href="http://msdn.microsoft.com/library/aa371162.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Registers the product information with the installer.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="PublishComponents" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="PublishComponents" href="http://msdn.microsoft.com/library/aa370918.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Manages the advertisement of the components from the PublishComponent table.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="MsiPublishAssemblies" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="MsiPublishAssemblies" href="http://msdn.microsoft.com/library/aa370359.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Manages the advertisement of CLR and Win32 assemblies.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="PublishFeatures" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="PublishFeatures" href="http://msdn.microsoft.com/library/aa370923.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Writes each feature's state into the system registry.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="PublishProduct" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="PublishProduct" href="http://msdn.microsoft.com/library/aa370932.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Manages the advertisement of the product information with the system.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="InstallFinalize" type="ActionSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="InstallInitialize"/>
+                <xse:msiRef action="InstallFinalize" href="http://msdn.microsoft.com/library/aa369505.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Marks the end of a sequence of actions that change the system.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+
+    <xs:element name="AppSearch" type="ActionModuleSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="ComponentSearch"/>
+                <xse:seeAlso ref="FileSearch"/>
+                <xse:seeAlso ref="IniFileSearch"/>
+                <xse:seeAlso ref="RegistrySearch"/>
+                <xse:msiRef table="AppSearch" href="http://msdn.microsoft.com/library/aa367579.aspx"/>
+                <xse:msiRef action="AppSearch" href="http://msdn.microsoft.com/library/aa367578.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Uses file signatures to search for existing versions of products.  The AppSearch action may use this information to determine where upgrades are to be installed.  The AppSearch action can also be used to set a property to the existing value of an registry or .ini file entry.  AppSearch should be authored into the InstallUISequence table and InstallExecuteSequence table.  The installer prevents The AppSearch action from running in the InstallExecuteSequence sequence if the action has already run in InstallUISequence sequence.  The AppSearch action searches for file signatures using the CompLocator table first, the RegLocator table next, then the IniLocator table, and finally the DrLocator table.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="CCPSearch" type="ActionModuleSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="RMCCPSearch"/>
+                <xse:seeAlso ref="ComplianceCheck"/>
+                <xse:msiRef action="CCPSearch" href="http://msdn.microsoft.com/library/aa367845.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Uses file signatures to validate that qualifying products are installed on a system before an upgrade installation is performed.  The CCPSearch action should be authored into the InstallUISequence table and InstallExecuteSequence table.  The installer prevents the CCPSearch action from running in the InstallExecuteSequence sequence if the action has already run in InstallUISequence sequence.  The CCPSearch action must come before the RMCCPSearch action.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="RMCCPSearch" type="ActionModuleSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="CCPSearch"/>
+                <xse:seeAlso ref="ComplianceCheck"/>
+                <xse:msiRef action="RMCCPSearch" href="http://msdn.microsoft.com/library/aa371364.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Uses file signatures to validate that qualifying products are installed on a system before an upgrade installation is performed.  The RMCCPSearch action should be authored into the InstallUISequence table and InstallExecuteSequence table.  The installer prevents RMCCPSearch from running in the InstallExecuteSequence sequence if the action has already run in InstallUISequence sequence.  The RMCCPSearch action requires the CCP_DRIVE property to be set to the root path on the removable volume that has the installation for any of the qualifying products.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="LaunchConditions" type="ActionModuleSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="Condition"/>
+                <xse:msiRef action="LaunchConditions" href="http://msdn.microsoft.com/library/aa369751.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Queries the LaunchCondition table and evaluates each conditional statement recorded there.  If any of these conditional statements fail, an error message is displayed to the user and the installation is terminated.  The LaunchConditions action is optional.  This action is normally the first in the sequence, but the AppSearch Action may be sequenced before the LaunchConditions action.  If there are launch conditions that do not apply to all installation modes, the appropriate installation mode property should be used in a conditional expression in the appropriate sequence table.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="FindRelatedProducts" type="ActionModuleSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="Upgrade"/>
+                <xse:msiRef action="FindRelatedProducts" href="http://msdn.microsoft.com/library/aa368600.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Runs through each record of the Upgrade table in sequence and compares the upgrade code, product version, and language in each row to products installed on the system.  When FindRelatedProducts detects a correspondence between the upgrade information and an installed product, it appends the product code to the property specified in the ActionProperty column of the UpgradeTable.  The FindRelatedProducts action only runs the first time the product is installed.  The FindRelatedProducts action does not run during maintenance mode or uninstallation.  FindRelatedProducts should be authored into the InstallUISequence table and InstallExecuteSequence tables.  The installer prevents FindRelatedProducts from running in InstallExecuteSequence if the action has already run in InstallUISequence.  The FindRelatedProducts action must come before the MigrateFeatureStates action and the RemoveExistingProducts action.  The condition for this action may be specified in the element's inner text.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="InstallExecute" type="ActionModuleSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="InstallExecute" href="http://msdn.microsoft.com/library/aa369502.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Runs a script containing all operations spooled since either the start of the installation or the last InstallExecute action, or InstallExecuteAgain action.  Special actions don't have a built-in sequence number and thus must appear relative to another action.  The suggested way to do this is by using the Before or After attribute.  InstallExecute and InstallExecuteAgain can optionally appear anywhere between InstallInitialize and InstallFinalize.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="InstallExecuteAgain" type="ActionModuleSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="InstallExecuteAgain" href="http://msdn.microsoft.com/library/aa369497.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Runs a script containing all operations spooled since either the start of the installation or the last InstallExecute action, or InstallExecuteAgain action.  Should only be used after InstallExecute.  Special actions don't have a built-in sequence number and thus must appear relative to another action.  The suggested way to do this is by using the Before or After attribute.  InstallExecute and InstallExecuteAgain can optionally appear anywhere between InstallInitialize and InstallFinalize.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="DisableRollback" type="ActionModuleSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="DisableRollback" href="http://msdn.microsoft.com/library/aa368308.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Disables rollback for the remainder of the installation.  Special actions don't have a built-in sequence number and thus must appear relative to another action.  The suggested way to do this is by using the Before or After attribute.  InstallExecute and InstallExecuteAgain can optionally appear anywhere between InstallInitialize and InstallFinalize.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="RemoveExistingProducts" type="ActionModuleSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="RemoveExistingProducts" href="http://msdn.microsoft.com/library/aa371197.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Goes through the product codes listed in the ActionProperty column of the Upgrade table and removes the products in sequence.  Special actions don't have a built-in sequence number and thus must appear relative to another action.  The suggested way to do this is by using the Before or After attribute.  InstallExecute and InstallExecuteAgain can optionally appear anywhere between InstallInitialize and InstallFinalize.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="ScheduleReboot" type="ActionModuleSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="ScheduleReboot" href="http://msdn.microsoft.com/library/aa371527.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Prompts the user to restart the system at the end of installation.  Special actions don't have a built-in sequence number and thus must appear relative to another action.  The suggested way to do this is by using the Before or After attribute.  InstallExecute and InstallExecuteAgain can optionally appear anywhere between InstallInitialize and InstallFinalize.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="ForceReboot" type="ActionModuleSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="ForceReboot" href="http://msdn.microsoft.com/library/aa368607.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Prompts the user for a restart of the system during the installation.  Special actions don't have a built-in sequence number and thus must appear relative to another action.  The suggested way to do this is by using the Before or After attribute.  InstallExecute and InstallExecuteAgain can optionally appear anywhere between InstallInitialize and InstallFinalize.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="ResolveSource" type="ActionModuleSequenceType">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef action="ResolveSource" href="http://msdn.microsoft.com/library/aa371232.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Determines the location of the source and sets the SourceDir property if the source has not been resolved yet.  Special actions don't have a built-in sequence number and thus must appear relative to another action.  The suggested way to do this is by using the Before or After attribute.  InstallExecute and InstallExecuteAgain can optionally appear anywhere between InstallInitialize and InstallFinalize.</xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <!-- CustomActions and Dialogs of course aren't built in and must be specified relative to another action -->
+    <xs:element name="Custom">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="CustomAction"/> 
+            </xs:appinfo>
+            <xs:documentation>Use to sequence a custom action.</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:simpleContent>
+                <xs:extension base="xs:string">
+                    <xs:annotation><xs:documentation>Text node specifies the condition of the action.</xs:documentation></xs:annotation>
+                    <xs:attribute name="Action" type="xs:string" use="required">
+                        <xs:annotation><xs:documentation>The action to which the Custom element applies.</xs:documentation></xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="OnExit" type="ExitType">
+                        <xs:annotation><xs:documentation>Mutually exclusive with Before, After, and Sequence attributes</xs:documentation></xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="Before" type="xs:string">
+                        <xs:annotation><xs:documentation>The name of the standard or custom action before which this action should be performed. Mutually exclusive with OnExit, After, and Sequence attributes</xs:documentation></xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="After" type="xs:string">
+                        <xs:annotation><xs:documentation>The name of the standard or custom action after which this action should be performed. Mutually exclusive with Before, OnExit, and Sequence attributes</xs:documentation></xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="Overridable" type="YesNoType">
+                        <xs:annotation>
+                            <xs:documentation>
+                                If "yes", the sequencing of this action may be overridden by sequencing elsewhere.
+                            </xs:documentation>
+                        </xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="Sequence" type="xs:integer">
+                        <xs:annotation><xs:documentation>The sequence number for this action. Mutually exclusive with Before, After, and OnExit attributes</xs:documentation></xs:annotation>
+                    </xs:attribute>
+                </xs:extension>
+            </xs:simpleContent>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="Show">
+        <xs:complexType>
+            <xs:simpleContent>
+                <xs:extension base="xs:string">
+                    <xs:attribute name="Dialog" type="xs:string" use="required"/>
+                    <xs:attribute name="OnExit" type="ExitType">
+                        <xs:annotation><xs:documentation>mutually exclusive with Before, After, and Sequence attributes</xs:documentation></xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="Before" type="xs:string"/>
+                    <xs:attribute name="After" type="xs:string"/>
+                    <xs:attribute name="Overridable" type="YesNoType">
+                        <xs:annotation>
+                            <xs:documentation>
+                                If "yes", the sequencing of this dialog may be overridden by sequencing elsewhere.
+                            </xs:documentation>
+                        </xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="Sequence" type="xs:integer"/>
+                </xs:extension>
+            </xs:simpleContent>
+        </xs:complexType>
+    </xs:element>
+
+    <!-- standard sequence table compositions -->
+
+    <xs:element name="InstallUISequence">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef table="InstallUISequence" href="http://msdn.microsoft.com/library/aa369543.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="Custom" minOccurs="0" maxOccurs="unbounded">
+                    <xs:annotation><xs:documentation>Use to sequence a custom action.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="Show" minOccurs="0" maxOccurs="unbounded">
+                    <xs:annotation><xs:documentation>Displays a Dialog.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="ScheduleReboot" minOccurs="0">
+                    <xs:annotation><xs:documentation>Prompts the user to restart the system at the end of installation. Not fixed sequence.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="LaunchConditions" minOccurs="0">
+                    <xs:annotation><xs:documentation>Queries the LaunchCondition table and evaluates each conditional statement recorded there.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="FindRelatedProducts" minOccurs="0">
+                    <xs:annotation><xs:documentation>Runs through each record of the Upgrade table in sequence and compares the upgrade code, product version, and language in each row to products installed on the system.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="AppSearch" minOccurs="0">
+                    <xs:annotation><xs:documentation>Uses file signatures to search for existing versions of products.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="CCPSearch" minOccurs="0">
+                    <xs:annotation><xs:documentation>Uses file signatures to validate that qualifying products are installed on a system before an upgrade installation is performed.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="RMCCPSearch" minOccurs="0">
+                    <xs:annotation><xs:documentation>Uses file signatures to validate that qualifying products are installed on a system before an upgrade installation is performed.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="ValidateProductID">
+                    <xs:annotation><xs:documentation>Sets the ProductID property to the full product identifier.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="CostInitialize">
+                    <xs:annotation><xs:documentation>Initiates the internal installation costing process.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="FileCost">
+                    <xs:annotation><xs:documentation>Initiates dynamic costing of standard installation actions.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="IsolateComponents">
+                    <xs:annotation><xs:documentation>Installs a copy of a component (commonly a shared DLL) into a private location for use by a specific application (typically an .exe).</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="ResolveSource" minOccurs="0">
+                    <xs:annotation><xs:documentation>Determines the location of the source and sets the SourceDir property if the source has not been resolved yet.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="CostFinalize">
+                    <xs:annotation><xs:documentation>Ends the internal installation costing process begun by the CostInitialize action.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="MigrateFeatureStates">
+                    <xs:annotation><xs:documentation>Used for upgrading or installing over an existing application.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="ExecuteAction" minOccurs="0">
+                    <xs:annotation><xs:documentation>Initiates the execution sequence.</xs:documentation></xs:annotation>
+                </xs:element>
+            </xs:choice>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="InstallExecuteSequence">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef table="InstallExecuteSequence" href="http://msdn.microsoft.com/library/aa369500.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <!-- used only to supply default op for child action elements -->
+                <xs:element ref="Custom" minOccurs="0" maxOccurs="unbounded">
+                    <xs:annotation><xs:documentation>Use to sequence a custom action.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="ScheduleReboot" minOccurs="0">
+                    <xs:annotation><xs:documentation>Prompts the user to restart the system at the end of installation. Not fixed sequence.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="ForceReboot" minOccurs="0">
+                    <xs:annotation><xs:documentation>Prompts the user for a restart of the system during the installation. Not fixed sequence.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="ResolveSource" minOccurs="0">
+                    <xs:annotation><xs:documentation>Determines the location of the source and sets the SourceDir property if the source has not been resolved yet. Not fixed sequence.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="LaunchConditions" minOccurs="0">
+                    <xs:annotation><xs:documentation>Queries the LaunchCondition table and evaluates each conditional statement recorded there.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="FindRelatedProducts" minOccurs="0">
+                    <xs:annotation><xs:documentation>Runs through each record of the Upgrade table in sequence and compares the upgrade code, product version, and language in each row to products installed on the system.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="AppSearch" minOccurs="0">
+                    <xs:annotation><xs:documentation>Uses file signatures to search for existing versions of products.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="CCPSearch">
+                    <xs:annotation><xs:documentation>Uses file signatures to validate that qualifying products are installed on a system before an upgrade installation is performed.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="RMCCPSearch">
+                    <xs:annotation><xs:documentation>Uses file signatures to validate that qualifying products are installed on a system before an upgrade installation is performed.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="ValidateProductID">
+                    <xs:annotation><xs:documentation>Sets the ProductID property to the full product identifier.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="CostInitialize">
+                    <xs:annotation><xs:documentation>Initiates the internal installation costing process.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="FileCost">
+                    <xs:annotation><xs:documentation>Initiates dynamic costing of standard installation actions.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="IsolateComponents">
+                    <xs:annotation><xs:documentation>Installs a copy of a component (commonly a shared DLL) into a private location for use by a specific application (typically an .exe).</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="CostFinalize">
+                    <xs:annotation><xs:documentation>Ends the internal installation costing process begun by the CostInitialize action.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="SetODBCFolders">
+                    <xs:annotation><xs:documentation>Checks for existing ODBC drivers and sets the target directory for each new driver to the location of an existing driver.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="MigrateFeatureStates">
+                    <xs:annotation><xs:documentation>Used for upgrading or installing over an existing application.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="InstallValidate">
+                    <xs:annotation><xs:documentation>Verifies that all costed volumes have enough space for the installation.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="InstallInitialize">
+                    <xs:annotation><xs:documentation>Marks the beginning of a sequence of actions that change the system.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="AllocateRegistrySpace" minOccurs="0">
+                    <xs:annotation><xs:documentation>Ensures the needed amount of space exists in the registry.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="ProcessComponents">
+                    <xs:annotation><xs:documentation>Registers and unregisters components, their key paths, and the component clients.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="UnpublishComponents" minOccurs="0">
+                    <xs:annotation><xs:documentation>Manages the unadvertisement of components listed in the PublishComponent table.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="UnpublishFeatures" minOccurs="0">
+                    <xs:annotation><xs:documentation>Removes selection-state and feature-component mapping information from the registry.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="StopServices">
+                    <xs:annotation><xs:documentation>Stops system services.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="DeleteServices">
+                    <xs:annotation><xs:documentation>Stops a service and removes its registration from the system.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="UnregisterComPlus">
+                    <xs:annotation><xs:documentation>Removes COM+ applications from the registry.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="SelfUnregModules" minOccurs="0">
+                    <xs:annotation><xs:documentation>Unregisters all modules listed in the SelfReg table that are scheduled to be uninstalled.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="UnregisterTypeLibraries" minOccurs="0">
+                    <xs:annotation><xs:documentation>Unregisters type libraries from the system.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="RemoveODBC">
+                    <xs:annotation><xs:documentation>Removes the data sources, translators, and drivers listed for removal during the installation.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="UnregisterFonts">
+                    <xs:annotation><xs:documentation>Removes registration information about installed fonts from the system.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="RemoveRegistryValues" minOccurs="0">
+                    <xs:annotation><xs:documentation>Removes a registry value that has been authored into the registry table if the associated component was installed locally or as run from source, and is now set to be uninstalled.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="UnregisterClassInfo" minOccurs="0">
+                    <xs:annotation><xs:documentation>Manages the removal of COM class information from the system registry.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="UnregisterExtensionInfo">
+                    <xs:annotation><xs:documentation>Manages the removal of extension-related information from the system registry.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="UnregisterProgIdInfo" minOccurs="0">
+                    <xs:annotation><xs:documentation>Manages the unregistration of OLE ProgId information with the system.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="UnregisterMIMEInfo">
+                    <xs:annotation><xs:documentation>Unregisters MIME-related registry information from the system.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="RemoveIniValues">
+                    <xs:annotation><xs:documentation>Removes .ini file information specified for removal in the RemoveIniFile table if the component is set to be installed locally or run from source.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="RemoveShortcuts" minOccurs="0">
+                    <xs:annotation><xs:documentation>Manages the removal of an advertised shortcut whose feature is selected for uninstallation or a nonadvertised shortcut whose component is selected for uninstallation.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="RemoveEnvironmentStrings">
+                    <xs:annotation><xs:documentation>Modifies the values of environment variables.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="RemoveDuplicateFiles">
+                    <xs:annotation><xs:documentation>Deletes files installed by the DuplicateFiles action.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="RemoveFiles" minOccurs="0">
+                    <xs:annotation><xs:documentation>Removes files previously installed by the InstallFiles action.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="RemoveFolders" minOccurs="0">
+                    <xs:annotation><xs:documentation>Removes any folders linked to components set to be removed or run from source.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="CreateFolders" minOccurs="0">
+                    <xs:annotation><xs:documentation>Creates empty folders for components that are set to be installed.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="MoveFiles">
+                    <xs:annotation><xs:documentation>Locates existing files on the system and moves or copies those files to a new location.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="InstallFiles" minOccurs="0">
+                    <xs:annotation><xs:documentation>Copies files specified in the File table from the source directory to the destination directory.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="DuplicateFiles">
+                    <xs:annotation><xs:documentation>Duplicates files installed by the InstallFiles action.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="PatchFiles">
+                    <xs:annotation><xs:documentation>Queries the Patch table to determine which patches are to be applied.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="BindImage" minOccurs="0">
+                    <xs:annotation><xs:documentation>Binds each executable or DLL that must be bound to the DLLs imported by it.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="CreateShortcuts" minOccurs="0">
+                    <xs:annotation><xs:documentation>Manages the creation of shortcuts.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="RegisterClassInfo" minOccurs="0">
+                    <xs:annotation><xs:documentation>Manages the registration of COM class information with the system.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="RegisterExtensionInfo">
+                    <xs:annotation><xs:documentation>Manages the registration of extension related information with the system.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="RegisterProgIdInfo" minOccurs="0">
+                    <xs:annotation><xs:documentation>Manages the registration of OLE ProgId information with the system.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="RegisterMIMEInfo">
+                    <xs:annotation><xs:documentation>Registers MIME-related registry information with the system.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="WriteRegistryValues" minOccurs="0">
+                    <xs:annotation><xs:documentation>Sets up an application's registry information.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="WriteIniValues">
+                    <xs:annotation><xs:documentation>Writes the .ini file information that the application needs written to its .ini files.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="WriteEnvironmentStrings">
+                    <xs:annotation><xs:documentation>Modifies the values of environment variables.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="RegisterFonts">
+                    <xs:annotation><xs:documentation>Registers installed fonts with the system.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="InstallODBC">
+                    <xs:annotation><xs:documentation>Installs the drivers, translators, and data sources in the ODBCDriver table, ODBCTranslator table, and ODBCDataSource table.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="RegisterTypeLibraries" minOccurs="0">
+                    <xs:annotation><xs:documentation>Registers type libraries with the system.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="SelfRegModules" minOccurs="0">
+                    <xs:annotation><xs:documentation>Processes all modules listed in the SelfReg table and registers all installed modules with the system.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="RegisterComPlus">
+                    <xs:annotation><xs:documentation>Registers COM+ applications.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="InstallServices">
+                    <xs:annotation><xs:documentation>Registers a service for the system.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="StartServices">
+                    <xs:annotation><xs:documentation>Starts system services.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="RegisterUser" minOccurs="0">
+                    <xs:annotation><xs:documentation>Registers the user information with the installer to identify the user of a product.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="RegisterProduct" minOccurs="0">
+                    <xs:annotation><xs:documentation>Registers the product information with the installer.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="PublishComponents" minOccurs="0">
+                    <xs:annotation><xs:documentation>Manages the advertisement of the components from the PublishComponent table.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="PublishFeatures" minOccurs="0">
+                    <xs:annotation><xs:documentation>Writes each feature's state into the system registry.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="PublishProduct" minOccurs="0">
+                    <xs:annotation><xs:documentation>Manages the advertisement of the product information with the system.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="InstallFinalize">
+                    <xs:annotation><xs:documentation>Marks the end of a sequence of actions that change the system.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="RemoveExistingProducts">
+                    <xs:annotation><xs:documentation>Goes through the product codes listed in the ActionProperty column of the Upgrade table and removes the products in sequence.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="DisableRollback" minOccurs="0">
+                    <xs:annotation><xs:documentation>Disables rollback for the remainder of the installation.</xs:documentation></xs:annotation>
+                </xs:element>
+                <!-- InstallExecute and InstallExecuteAgain can optionally appear anywhere between InstallInitialize and InstallFinalize -->
+                <xs:element ref="InstallExecute" minOccurs="0">
+                    <xs:annotation><xs:documentation>Runs a script containing all operations spooled since either the start of the installation or the last InstallExecute action, or InstallExecuteAgain action.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="InstallExecuteAgain" minOccurs="0">
+                    <xs:annotation><xs:documentation>Runs a script containing all operations spooled since either the start of the installation or the last InstallExecute action, or InstallExecuteAgain action.</xs:documentation></xs:annotation>
+                </xs:element>
+                <!-- Windows Installer 1.5 actions -->
+                <xs:element ref="MsiPublishAssemblies">
+                    <xs:annotation><xs:documentation>Manages the advertisement of CLR and Win32 assemblies.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="MsiUnpublishAssemblies">
+                    <xs:annotation><xs:documentation>Manages the unadvertisement of CLR and Win32 assemblies that are being removed.</xs:documentation></xs:annotation>
+                </xs:element>
+            </xs:choice>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="AdminUISequence">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef table="AdminUISequence" href="http://msdn.microsoft.com/library/aa367544.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="Custom" minOccurs="0" maxOccurs="unbounded">
+                    <xs:annotation><xs:documentation>Use to sequence a custom action.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="Show" minOccurs="0" maxOccurs="unbounded"/>
+                <xs:element ref="CostInitialize">
+                    <xs:annotation><xs:documentation>Initiates the internal installation costing process.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="FileCost">
+                    <xs:annotation><xs:documentation>Initiates dynamic costing of standard installation actions.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="CostFinalize">
+                    <xs:annotation><xs:documentation>Ends the internal installation costing process begun by the CostInitialize action.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="ExecuteAction">
+                    <xs:annotation><xs:documentation>Initiates the execution sequence.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="InstallValidate">
+                    <xs:annotation><xs:documentation>Verifies that all costed volumes have enough space for the installation.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="InstallInitialize">
+                    <xs:annotation><xs:documentation>Marks the beginning of a sequence of actions that change the system.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="InstallAdminPackage">
+                    <xs:annotation><xs:documentation>Copies the product database to the administrative installation point.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="InstallFiles">
+                    <xs:annotation><xs:documentation>Copies files specified in the File table from the source directory to the destination directory.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="InstallFinalize">
+                    <xs:annotation><xs:documentation>Marks the end of a sequence of actions that change the system.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="LaunchConditions">
+                    <xs:annotation><xs:documentation>Queries the LaunchCondition table and evaluates each conditional statement recorded there.</xs:documentation></xs:annotation>
+                </xs:element>
+            </xs:choice>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="AdminExecuteSequence">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef table="AdminExecuteSequence" href="http://msdn.microsoft.com/library/aa367540.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="Custom" minOccurs="0" maxOccurs="unbounded">
+                    <xs:annotation><xs:documentation>Use to sequence a custom action.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="CostInitialize">
+                    <xs:annotation><xs:documentation>Initiates the internal installation costing process.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="FileCost">
+                    <xs:annotation><xs:documentation>Initiates dynamic costing of standard installation actions.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="CostFinalize">
+                    <xs:annotation><xs:documentation>Ends the internal installation costing process begun by the CostInitialize action.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="InstallValidate">
+                    <xs:annotation><xs:documentation>Verifies that all costed volumes have enough space for the installation.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="InstallInitialize">
+                    <xs:annotation><xs:documentation>Marks the beginning of a sequence of actions that change the system.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="InstallAdminPackage">
+                    <xs:annotation><xs:documentation>Copies the product database to the administrative installation point.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="InstallFiles">
+                    <xs:annotation><xs:documentation>Copies files specified in the File table from the source directory to the destination directory.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="PatchFiles">
+                    <xs:annotation><xs:documentation>Queries the Patch table to determine which patches are to be applied.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="InstallFinalize">
+                    <xs:annotation><xs:documentation>Marks the end of a sequence of actions that change the system.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="LaunchConditions">
+                    <xs:annotation><xs:documentation>Queries the LaunchCondition table and evaluates each conditional statement recorded there.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="ResolveSource" minOccurs="0">
+                    <xs:annotation><xs:documentation>Determines the location of the source and sets the SourceDir property if the source has not been resolved yet.</xs:documentation></xs:annotation>
+                </xs:element>
+            </xs:choice>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="AdvertiseExecuteSequence">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef table="AdvtExecuteSequence" href="http://msdn.microsoft.com/library/aa367551.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="CostInitialize">
+                    <xs:annotation><xs:documentation>Initiates the internal installation costing process.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="CostFinalize">
+                    <xs:annotation><xs:documentation>Ends the internal installation costing process begun by the CostInitialize action.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="Custom" minOccurs="0" maxOccurs="unbounded">
+                    <xs:annotation><xs:documentation>Use to sequence a custom action.  The only custom actions that are allowed in the AdvtExecuteSequence are type 19 (0x013) type 35 (0x023) and type 51 (0x033).</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="InstallValidate">
+                    <xs:annotation><xs:documentation>Verifies that all costed volumes have enough space for the installation.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="InstallInitialize">
+                    <xs:annotation><xs:documentation>Marks the beginning of a sequence of actions that change the system.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="CreateShortcuts">
+                    <xs:annotation><xs:documentation>Manages the creation of shortcuts.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="RegisterClassInfo">
+                    <xs:annotation><xs:documentation>Manages the registration of COM class information with the system.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="RegisterExtensionInfo">
+                    <xs:annotation><xs:documentation>Manages the registration of extension related information with the system.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="RegisterMIMEInfo">
+                    <xs:annotation><xs:documentation>Registers MIME-related registry information with the system.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="RegisterProgIdInfo">
+                    <xs:annotation><xs:documentation>Manages the registration of OLE ProgId information with the system.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="PublishComponents">
+                    <xs:annotation><xs:documentation>Manages the advertisement of the components from the PublishComponent table.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="PublishFeatures">
+                    <xs:annotation><xs:documentation>Writes each feature's state into the system registry.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="PublishProduct">
+                    <xs:annotation><xs:documentation>Manages the advertisement of the product information with the system.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="InstallFinalize">
+                    <xs:annotation><xs:documentation>Marks the end of a sequence of actions that change the system.</xs:documentation></xs:annotation>
+                </xs:element>
+                <!-- Windows Installer 1.5 actions -->
+                <xs:element ref="MsiPublishAssemblies">
+                    <xs:annotation><xs:documentation>Manages the advertisement of CLR and Win32 assemblies.</xs:documentation></xs:annotation>
+                </xs:element>
+            </xs:choice>
+        </xs:complexType>
+    </xs:element>
+    <!-- - - - - - - - - - - Binary tables - - - - - - - - - - - - - -->
+    <xs:element name="Binary">
+        <xs:annotation>
+            <xs:documentation>
+                Binary data used for CustomAction elements and UI controls.
+            </xs:documentation>
+        <xs:appinfo>
+                <xse:msiRef table="Binary" href="http://msdn.microsoft.com/library/aa367825.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:any namespace="##other" processContents="lax">
+                    <xs:annotation>
+                        <xs:documentation>
+                        Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                        elements at this point in the schema.
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:any>
+            </xs:choice>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>The Id cannot by longer than 55 characters.  In order to prevent errors in cases where the Id is modularized, it should not be longer than 18 characters.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SourceFile" type="xs:string">
+                <xs:annotation><xs:documentation>Path to the binary file.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="src" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        This attribute has been deprecated. Use the SourceFile attribute instead.
+                    </xs:documentation>
+                    <xs:appinfo>
+                        <xse:deprecated ref="SourceFile" />
+                    </xs:appinfo>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SuppressModularization" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>
+                        Use to suppress modularization of this Binary identifier in merge modules.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:anyAttribute namespace="##other" processContents="lax">
+                <xs:annotation><xs:documentation>
+                    Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                    attributes at this point in the schema.
+                </xs:documentation></xs:annotation>
+            </xs:anyAttribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Icon">
+        <xs:annotation>
+            <xs:documentation>
+                Icon used for Shortcut, ProgId, or Class elements (but not UI controls)
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="Icon" href="http://msdn.microsoft.com/library/aa369210.aspx"/>
+                <xse:howtoRef href="configure_arp_appearance.htm">How To: Set your installer's icon in Add/Remove Programs</xse:howtoRef>                
+                <xse:howtoRef href="create_start_menu_shortcut.htm">How To: Create a shortcut on the Start Menu</xse:howtoRef>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>The Id cannot by longer than 55 characters.  In order to prevent errors in cases where the Id is modularized, it should not be longer than 18 characters.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SourceFile" type="xs:string">
+                <xs:annotation><xs:documentation>Path to the icon file.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="src" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        This attribute has been deprecated. Use the SourceFile attribute instead.
+                    </xs:documentation>
+                    <xs:appinfo>
+                        <xse:deprecated ref="SourceFile" />
+                    </xs:appinfo>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="EmbeddedChainer">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef table="MsiEmbeddedChainer " href="http://msdn.microsoft.com/library/bb736316.aspx"/>
+                <xse:seeAlso ref="Binary" />
+                <xse:seeAlso ref="File" />
+                <xse:seeAlso ref="Property" />
+                <xse:seeAlso ref="EmbeddedChainerRef" />
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:simpleContent>
+                <xs:extension base="xs:string">
+                    <xs:annotation>
+                        <xs:documentation>
+                            Element value is the condition.  CDATA may be used to when a condition contains many XML characters
+                            that must be escaped.  It is important to note that each EmbeddedChainer element must have a mutually exclusive condition
+                            to ensure that only one embedded chainer will execute at a time. If the conditions are not mutually exclusive the chainer
+                            that executes is undeterministic.
+                        </xs:documentation>
+                    </xs:annotation>
+                    <xs:attribute name="Id" type="xs:string" use="required">
+                        <xs:annotation>
+                            <xs:documentation>Unique identifier for embedded chainer.</xs:documentation>
+                        </xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="CommandLine" type="xs:string">
+                        <xs:annotation>
+                            <xs:documentation>Value to append to the transaction handle and passed to the chainer executable.</xs:documentation>
+                        </xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="BinarySource" type="xs:string">
+                        <xs:annotation>
+                            <xs:documentation>
+                                Reference to the Binary element that contains the chainer executable. Mutually exclusive with
+                                the FileSource and PropertySource attributes.
+                            </xs:documentation>
+                        </xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="FileSource" type="xs:string">
+                        <xs:annotation>
+                            <xs:documentation>
+                                Reference to the File element that is the chainer executable. Mutually exclusive with
+                                the BinarySource and PropertySource attributes.
+                            </xs:documentation>
+                        </xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="PropertySource" type="xs:string">
+                        <xs:annotation>
+                            <xs:documentation>
+                                Reference to a Property that resolves to the full path to the chainer executable. Mutually exclusive with
+                                the BinarySource and FileSource attributes.
+                            </xs:documentation>
+                        </xs:annotation>
+                    </xs:attribute>
+                </xs:extension>
+            </xs:simpleContent>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="EmbeddedChainerRef">
+        <xs:annotation>
+            <xs:documentation>
+                Reference to an EmbeddedChainer element.  This will force the entire referenced Fragment's contents
+                to be included in the installer database.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:seeAlso ref="EmbeddedChainer" />
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string" use="required" />
+            <xs:anyAttribute namespace="##other" processContents="lax">
+                <xs:annotation>
+                    <xs:documentation>
+                        Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                        attributes at this point in the schema.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:anyAttribute>
+        </xs:complexType>
+    </xs:element>
+
+    <!-- - - - - - - - - - - UI Definitions - - - - - - - - - - - - - -->
+
+    <xs:element name="EmbeddedUI">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef table="MsiEmbeddedUI" href="http://msdn.microsoft.com/library/bb736317.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Element value is the condition. Use CDATA if message contains delimiter characters.</xs:documentation>
+        </xs:annotation>
+        <xs:complexType mixed="true">
+            <xs:sequence>
+                <xs:element ref="EmbeddedUIResource" minOccurs="0" maxOccurs="unbounded">
+                    <xs:annotation>
+                        <xs:documentation>Specifies extra files to be extracted for use by the embedded UI, such as language resources.</xs:documentation>
+                    </xs:annotation>
+                </xs:element>
+            </xs:sequence>
+            <xs:attribute name="Id" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Unique identifier for embedded UI.If this attribute is not specified the Name attribute or the file name 
+                        portion of the SourceFile attribute will be used.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IgnoreFatalExit" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Embedded UI will not recieve any INSTALLLOGMODE_FATALEXIT messages.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IgnoreError" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Embedded UI will not recieve any INSTALLLOGMODE_ERROR messages.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IgnoreWarning" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Embedded UI will not recieve any INSTALLLOGMODE_WARNING messages.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IgnoreUser" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Embedded UI will not recieve any INSTALLLOGMODE_USER messages.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IgnoreInfo" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Embedded UI will not recieve any INSTALLLOGMODE_INFO messages.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IgnoreFilesInUse" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Embedded UI will not recieve any INSTALLLOGMODE_FILESINUSE messages.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IgnoreResolveSource" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Embedded UI will not recieve any INSTALLLOGMODE_RESOLVESOURCE messages.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IgnoreOutOfDiskSpace" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Embedded UI will not recieve any INSTALLLOGMODE_OUTOFDISKSPACE messages.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IgnoreActionStart" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Embedded UI will not recieve any INSTALLLOGMODE_ACTIONSTART messages.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IgnoreActionData" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Embedded UI will not recieve any INSTALLLOGMODE_ACTIONDATA messages.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IgnoreProgress" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Embedded UI will not recieve any INSTALLLOGMODE_PROGRESS messages.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IgnoreCommonData" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Embedded UI will not recieve any INSTALLLOGMODE_COMMONDATA messages.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IgnoreInitialize" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Embedded UI will not recieve any INSTALLLOGMODE_INITIALIZE messages.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IgnoreTerminate" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Embedded UI will not recieve any INSTALLLOGMODE_TERMINATE messages.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IgnoreShowDialog" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Embedded UI will not recieve any INSTALLLOGMODE_SHOWDIALOG messages.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IgnoreRMFilesInUse" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Embedded UI will not recieve any INSTALLLOGMODE_RMFILESINUSE messages.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IgnoreInstallStart" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Embedded UI will not recieve any INSTALLLOGMODE_INSTALLSTART messages.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IgnoreInstallEnd" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Embedded UI will not recieve any INSTALLLOGMODE_INSTALLEND messages.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Name" type="LongFileNameType">
+                <xs:annotation>
+                    <xs:documentation>
+                        The name for the embedded UI DLL when it is extracted from the Product and executed. (Windows Installer 
+                        does not support the typical short filename and long filename combination for embedded UI files as it 
+                        does for other kinds of files.) If this attribute is not specified the file name portion of the SourceFile 
+                        attribute will be used.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SourceFile" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>
+                        Path to the binary file that is the embedded UI. This must be a DLL that exports the following
+                        three entry points: InitializeEmbeddedUI, EmbeddedUIHandler and ShutdownEmbeddedUI.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SupportBasicUI" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>Set yes to allow the Windows Installer to display the embedded UI during basic UI level installation.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="EmbeddedUIResource">
+        <xs:annotation>
+            <xs:documentation>
+                Defines a resource for use by the embedded UI.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:seeAlso ref="EmbeddedUI"/>
+                <xse:msiRef table="MsiEmbeddedUI" href="http://msdn.microsoft.com/library/bb736317.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>Identifier for the embedded UI resource.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Name" type="LongFileNameType" use="required">
+                <xs:annotation>
+                    <xs:documentation>
+                        The name for the resource when it is extracted from the Product for use by the embedded UI DLL. (Windows 
+                        Installer does not support the typical short filename and long filename combination for embedded UI files 
+                        as it does for other kinds of files.) If this attribute is not specified the Id attribute will be used.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SourceFile" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>Path to the binary file that is the embedded UI resource.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Error">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef table="Error" href="http://msdn.microsoft.com/library/aa368554.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:simpleContent>
+                <xs:extension base="xs:string">
+                    <xs:annotation><xs:documentation>Element value is Message, use CDATA if message contains delimiter characters</xs:documentation></xs:annotation>
+                    <xs:attribute name="Id" type="xs:integer">
+                        <xs:annotation><xs:documentation>Number of the error for which a message is being provided. See MSI SDK for error definitions.</xs:documentation></xs:annotation>
+                    </xs:attribute>
+                </xs:extension>
+            </xs:simpleContent>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Publish">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef table="ControlEvent" href="http://msdn.microsoft.com/library/aa368037.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:simpleContent>
+                <xs:extension base="xs:string">
+                    <xs:annotation><xs:documentation>The element value is the optional Condition expression.</xs:documentation></xs:annotation>
+                    <xs:attribute name="Control" type="xs:string">
+                        <xs:annotation>
+                            <xs:documentation>
+                                The parent Control for this Publish element, should only be specified when this element is a child of the UI element.
+                            </xs:documentation>
+                        </xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="Dialog" type="xs:string">
+                        <xs:annotation>
+                            <xs:documentation>
+                                The parent Dialog for this Publish element, should only be specified when this element is a child of the UI element.
+                                This attribute will create a reference to the specified Dialog, so an additional DialogRef is not necessary.
+                            </xs:documentation>
+                        </xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="Event" type="xs:string">
+                        <xs:annotation>
+                            <xs:documentation>
+                                Set this attribute's value to one of the standard control events to trigger that event.
+                                Either this attribute or the Property attribute must be set, but not both at the same time.
+                            </xs:documentation>
+                        </xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="Order" type="xs:string">
+                        <xs:annotation>
+                            <xs:documentation>
+                                This attribute should only need to be set if this element is nested under a UI element in order to
+                                control the order in which this publish event will be started.
+                                If this element is nested under a Control element, the default value will be one greater than any
+                                previous Publish element's order (the first element's default value is 1).
+                                If this element is nested under a UI element, the default value is always 1 (it does not get a
+                                default value based on any previous Publish elements).
+                            </xs:documentation>
+                        </xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="Property" type="xs:string">
+                        <xs:annotation>
+                            <xs:documentation>
+                                Set this attribute's value to a property name to set that property.
+                                Either this attribute or the Event attribute must be set, but not both at the same time.
+                            </xs:documentation>
+                        </xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="Value" type="xs:string">
+                        <xs:annotation>
+                            <xs:documentation>
+                                If the Property attribute is specified, set the value of this attribute to the new value for the property.
+                                To set a property to null, do not set this attribute (the ControlEvent Argument column will be set to '{}').
+                                Otherwise, this attribute's value should be the argument for the event specified in the Event attribute.
+                                If the event doesn't take an attribute, a common value to use is "0".
+                            </xs:documentation>
+                        </xs:annotation>
+                    </xs:attribute>
+                </xs:extension>
+            </xs:simpleContent>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Subscribe">
+        <xs:annotation>
+            <xs:documentation>
+                Sets attributes for events in the EventMapping table
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="EventMapping" href="http://msdn.microsoft.com/library/aa368559.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Event" type="xs:string">
+                <xs:annotation><xs:documentation>must be one of the standard control events'</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Attribute" type="xs:string">
+                <xs:annotation><xs:documentation>if not present can only handle enable, disable, hide, unhide events</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Text">
+        <xs:annotation>
+            <xs:documentation>
+                An alternative to using the Text attribute when the value contains special XML characters like &lt;, &gt;, or &amp;.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:simpleContent>
+                <xs:extension base="xs:string">
+                    <xs:attribute name="SourceFile" type="xs:string">
+                        <xs:annotation><xs:documentation>Instructs the text to be imported from a file instead of the element value during the binding process.</xs:documentation></xs:annotation>
+                    </xs:attribute>
+                    <xs:attribute name="src" type="xs:string">
+                        <xs:annotation>
+                            <xs:documentation>
+                                This attribute has been deprecated. Use the SourceFile attribute instead.
+                            </xs:documentation>
+                            <xs:appinfo>
+                                <xse:deprecated ref="SourceFile" />
+                            </xs:appinfo>
+                        </xs:annotation>
+                    </xs:attribute>
+                </xs:extension>
+            </xs:simpleContent>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Control">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef table="Control" href="http://msdn.microsoft.com/library/aa368044.aspx"/>
+                <xse:msiRef table="ComboBox" href="http://msdn.microsoft.com/library/aa367872.aspx"/>
+                <xse:msiRef table="Dialog" href="http://msdn.microsoft.com/library/aa368286.aspx"/>
+                <xse:msiRef table="ListBox" href="http://msdn.microsoft.com/library/aa369762.aspx"/>
+                <xse:msiRef table="ListView" href="http://msdn.microsoft.com/library/aa369764.aspx"/>
+                <xse:msiRef table="RadioButton" href="http://msdn.microsoft.com/library/aa370962.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Contains the controls that appear on each dialog.</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element ref="Text" minOccurs="0">
+                    <xs:annotation><xs:documentation>alternative to Text attribute when CDATA is needed to escape XML delimiters</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="ComboBox" minOccurs="0">
+                    <xs:annotation><xs:documentation>ComboBox table with ListItem children</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="ListBox" minOccurs="0">
+                    <xs:annotation><xs:documentation>ListBox table with ListItem children</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="ListView" minOccurs="0">
+                    <xs:annotation><xs:documentation>ListView table with ListItem children</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="RadioButtonGroup" minOccurs="0">
+                    <xs:annotation><xs:documentation>RadioButton table with RadioButton children</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="Property" minOccurs="0">
+                    <xs:annotation><xs:documentation>Property table entry for the Property table column associated with this control</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="Binary" minOccurs="0">
+                    <xs:annotation><xs:documentation>Icon referenced in icon column of row</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:choice minOccurs="0" maxOccurs="unbounded">
+                    <xs:annotation><xs:documentation>child elements affecting operation of this control</xs:documentation></xs:annotation>
+                    <xs:element ref="Condition">
+                        <xs:annotation><xs:documentation>Condition to specify actions for this control based on the outcome of the condition.</xs:documentation></xs:annotation>
+                    </xs:element>
+                    <xs:element ref="Publish"/>
+                    <xs:element ref="Subscribe"/>
+                </xs:choice>
+            </xs:sequence>
+            <xs:attribute name="Id" use="required" type="xs:string">
+                <xs:annotation><xs:documentation>Combined with the Dialog Id to make up the primary key of the Control table.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Type" use="required" type="xs:string">
+                <xs:annotation><xs:documentation>The type of the control. Could be one of the following: Billboard, Bitmap, CheckBox, ComboBox, DirectoryCombo, DirectoryList, Edit, GroupBox, Hyperlink, Icon, Line, ListBox, ListView, MaskedEdit, PathEdit, ProgressBar, PushButton, RadioButtonGroup, ScrollableText, SelectionTree, Text, VolumeCostList, VolumeSelectCombo</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="X" use="required" type="LocalizableInteger">
+                <xs:annotation><xs:documentation>Horizontal coordinate of the upper-left corner of the rectangular boundary of the control. This must be a non-negative number.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Y" use="required" type="LocalizableInteger">
+                <xs:annotation><xs:documentation>Vertical coordinate of the upper-left corner of the rectangular boundary of the control. This must be a non-negative number.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Width" use="required" type="LocalizableInteger">
+                <xs:annotation><xs:documentation>Width of the rectangular boundary of the control. This must be a non-negative number.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Height" use="required" type="LocalizableInteger">
+                <xs:annotation><xs:documentation>Height of the rectangular boundary of the control. This must be a non-negative number.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Property" type="xs:string">
+                <xs:annotation><xs:documentation>The name of a defined property to be linked to this control. This column is required for active controls.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Text" type="xs:string">
+                <xs:annotation><xs:documentation>A localizable string used to set the initial text contained in a control. This attribute can contain a formatted string that is processed at install time to insert the values of properties using [PropertyName] syntax. Also supported are environment variables, file installation paths, and component installation directories; see <html:a href="http://msdn2.microsoft.com/library/aa368609.aspx" target="_blank">Formatted</html:a> for details.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Help" type="xs:string">
+                <xs:annotation><xs:documentation>This attribute is reserved for future use. There is no need to use this until Windows Installer uses it for something.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ToolTip" type="xs:string">
+                <xs:annotation><xs:documentation>The string used for the Tooltip.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="CheckBoxValue" type="xs:string">
+                <xs:annotation><xs:documentation>This attribute is only valid for CheckBox Controls. When set, the linked Property will be set to this value when the check box is checked.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="CheckBoxPropertyRef" type="xs:string">
+                <xs:annotation><xs:documentation>This attribute is only valid for CheckBox controls. The value is the name of a Property that was already used as the Property for another CheckBox control. The Property attribute cannot be specified. The attribute exists to support multiple checkboxes on different dialogs being tied to the same property.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <!-- Control ordering - order of declaration in Dialog determines tab ordering -->
+            <xs:attribute name="TabSkip" type="YesNoType">
+                <xs:annotation><xs:documentation>Set this attribute to "yes" to cause this Control to be skipped in the tab sequence.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Default" type="YesNoType">
+                <xs:annotation><xs:documentation>Set this attribute to "yes" to cause this Control to be invoked by the return key.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Cancel" type="YesNoType">
+                <xs:annotation><xs:documentation>Set this attribute to "yes" to cause this Control to be invoked by the escape key.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <!-- common Control attributes -->
+            <xs:attribute name="Hidden" type="YesNoType">
+                <xs:annotation><xs:documentation>Set this attribute to "yes" to cause the Control to be hidden.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Disabled" type="YesNoType">
+                <xs:annotation><xs:documentation>Set this attribute to "yes" to cause the Control to be disabled.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Sunken" type="YesNoType">
+                <xs:annotation><xs:documentation>Set this attribute to "yes" to cause the Control to be sunken.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Indirect" type="YesNoType">
+                <xs:annotation><xs:documentation>Specifies whether the value displayed or changed by this control is referenced indirectly. If this bit is set, the control displays or changes the value of the property that has the identifier listed in the Property column of the Control table.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Integer" type="YesNoType">
+                <xs:annotation><xs:documentation>Set this attribute to "yes" to cause the linked Property value for the Control to be treated as an integer. Otherwise, the Property will be treated as a string.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="RightToLeft" type="YesNoType">
+                <xs:annotation><xs:documentation>Set this attribute to "yes" to cause the Control to display from right to left.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="RightAligned" type="YesNoType">
+                <xs:annotation><xs:documentation>Set this attribute to "yes" to cause the Control to be right aligned.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="LeftScroll" type="YesNoType">
+                <xs:annotation><xs:documentation>Set this attribute to "yes" to cause the scroll bar to display on the left side of the Control.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <!-- attributes applied to specific Controls -->
+            <xs:attribute name="Transparent" type="YesNoType">
+                <xs:annotation><xs:documentation>This attribute is only valid for Text Controls.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="NoPrefix" type="YesNoType">
+                <xs:annotation><xs:documentation>This attribute is only valid for Text Controls.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="NoWrap" type="YesNoType">
+                <xs:annotation><xs:documentation>This attribute is only valid for Text Controls.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="FormatSize" type="YesNoType">
+                <xs:annotation><xs:documentation>This attribute is only valid for Text Controls.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="UserLanguage" type="YesNoType">
+                <xs:annotation><xs:documentation>This attribute is only valid for Text Controls.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Multiline" type="YesNoType">
+                <xs:annotation><xs:documentation>This attribute is only valid for Edit Controls.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Password" type="YesNoType">
+                <xs:annotation><xs:documentation>This attribute is only valid for Edit Controls.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ProgressBlocks" type="YesNoType">
+                <xs:annotation><xs:documentation>This attribute is only valid for ProgressBar Controls.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Removable" type="YesNoType">
+                <xs:annotation><xs:documentation>This attribute is only valid for Volume and Directory Controls.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Fixed" type="YesNoType">
+                <xs:annotation><xs:documentation>This attribute is only valid for Volume and Directory Controls.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Remote" type="YesNoType">
+                <xs:annotation><xs:documentation>This attribute is only valid for Volume and Directory Controls.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="CDROM" type="YesNoType">
+                <xs:annotation><xs:documentation>This attribute is only valid for Volume and Directory Controls.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="RAMDisk" type="YesNoType">
+                <xs:annotation><xs:documentation>This attribute is only valid for Volume and Directory Controls.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Floppy" type="YesNoType">
+                <xs:annotation><xs:documentation>This attribute is only valid for Volume and Directory Controls.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ShowRollbackCost" type="YesNoType">
+                <xs:annotation><xs:documentation>This attribute is only valid for VolumeCostList Controls.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Sorted" type="YesNoType">
+                <xs:annotation><xs:documentation>This attribute is only valid for ListBox, ListView, and ComboBox Controls. Set 
+                the value of this attribute to "yes" to have entries appear in the order specified under the Control.
+                If the attribute value is "no" or absent the entries in the control will appear in alphabetical order.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ComboList" type="YesNoType">
+                <xs:annotation><xs:documentation>This attribute is only valid for ComboBox Controls.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Image" type="YesNoType">
+                <xs:annotation><xs:documentation>This attribute is only valid for RadioButton, PushButton, and Icon Controls.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IconSize">
+                <xs:annotation><xs:documentation>This attribute is only valid for RadioButton, PushButton, and Icon Controls.</xs:documentation></xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="16"/>
+                        <xs:enumeration value="32"/>
+                        <xs:enumeration value="48"/>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="FixedSize" type="YesNoType">
+                <xs:annotation><xs:documentation>This attribute is only valid for RadioButton, PushButton, and Icon Controls.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Icon" type="YesNoType">
+                <xs:annotation><xs:documentation>This attribute is only valid for RadioButton and PushButton Controls.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Bitmap" type="YesNoType">
+                <xs:annotation><xs:documentation>This attribute is only valid for RadioButton and PushButton Controls.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="PushLike" type="YesNoType">
+                <xs:annotation><xs:documentation>This attribute is only valid for RadioButton and Checkbox Controls.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="HasBorder" type="YesNoType">
+                <xs:annotation><xs:documentation>This attribute is only valid for RadioButton Controls.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ElevationShield" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>
+                        This attribute is only valid for PushButton controls.
+                        Set this attribute to "yes" to add the User Account Control (UAC) elevation icon (shield icon) to the PushButton control.
+                        If this attribute's value is "yes" and the installation is not yet running with elevated privileges,
+                        the pushbutton control is created using the User Account Control (UAC) elevation icon (shield icon).
+                        If this attribute's value is "yes" and the installation is already running with elevated privileges,
+                        the pushbutton control is created using the other icon attributes.
+                        Otherwise, the pushbutton control is created using the other icon attributes.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Billboard">
+        <xs:annotation>
+            <xs:documentation>
+                Billboard to display during install of a Feature
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="Billboard" href="http://msdn.microsoft.com/library/aa367823.aspx"/>
+                <xse:msiRef table="BBControl" href="http://msdn.microsoft.com/library/aa367818.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element ref="Control" minOccurs='0' maxOccurs='unbounded'>
+                    <xs:annotation><xs:documentation>Only controls of static type such as: Text, Bitmap, Icon, or custom control can be placed on a billboard.</xs:documentation></xs:annotation>
+                </xs:element>
+            </xs:sequence>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Unique identifier for the Billboard.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Feature" type="xs:string">
+                <xs:annotation><xs:documentation>Feature whose state determines if the Billboard is shown.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="BillboardAction">
+        <xs:annotation>
+            <xs:documentation>
+                Billboard action during which child Billboards are displayed
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="Billboard" href="http://msdn.microsoft.com/library/aa367823.aspx"/>
+                <xse:msiRef table="BBControl" href="http://msdn.microsoft.com/library/aa367818.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element ref="Billboard" maxOccurs="unbounded">
+                    <xs:annotation><xs:documentation>Order of Billboard elements determines order of display</xs:documentation></xs:annotation>
+                </xs:element>
+            </xs:sequence>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Action name that determines when the Billboard should be shown.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Dialog">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef table="Control" href="http://msdn.microsoft.com/library/aa368044.aspx"/>
+                <xse:msiRef table="ComboBox" href="http://msdn.microsoft.com/library/aa367872.aspx"/>
+                <xse:msiRef table="Dialog" href="http://msdn.microsoft.com/library/aa368286.aspx"/>
+                <xse:msiRef table="ListBox" href="http://msdn.microsoft.com/library/aa369762.aspx"/>
+                <xse:msiRef table="ListView" href="http://msdn.microsoft.com/library/aa369764.aspx"/>
+                <xse:msiRef table="RadioButton" href="http://msdn.microsoft.com/library/aa370962.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>
+                Defines a dialog box in the Dialog Table.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element ref="Control" minOccurs="0" maxOccurs="unbounded">
+                    <xs:annotation><xs:documentation>Control elements belonging to this dialog.</xs:documentation></xs:annotation>
+                </xs:element>
+            </xs:sequence>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Unique identifier for the dialog.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="X" type="xs:integer">
+                <xs:annotation><xs:documentation>Horizontal placement of the dialog box as a percentage of screen width. The default value is 50.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Y" type="xs:integer">
+                <xs:annotation><xs:documentation>Vertical placement of the dialog box as a percentage of screen height. The default value is 50.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Width" use="required" type="xs:integer">
+                <xs:annotation><xs:documentation>The width of the dialog box in dialog units.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Height" use="required" type="xs:integer">
+                <xs:annotation><xs:documentation>The height of the dialog box in dialog units.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Title" type="xs:string">
+                <xs:annotation><xs:documentation>The title of the dialog box.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <!-- 'Attributes' column integer value generated from XML attributes below -->
+            <xs:attribute name="Hidden" type="YesNoType">
+                <xs:annotation><xs:documentation>Used to hide the dialog.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Modeless" type="YesNoType">
+                <xs:annotation><xs:documentation>Used to set the dialog as modeless.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="NoMinimize" type="YesNoType">
+                <xs:annotation><xs:documentation>Used to specify if the dialog can be minimized.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="SystemModal" type="YesNoType">
+                <xs:annotation><xs:documentation>Used to set the dialog as system modal.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="KeepModeless" type="YesNoType">
+                <xs:annotation><xs:documentation>Keep modeless dialogs alive when this dialog is created through DoAction.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="TrackDiskSpace" type="YesNoType">
+                <xs:annotation><xs:documentation>Have the dialog periodically call the installer to check if available disk space has changed.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="CustomPalette" type="YesNoType">
+                <xs:annotation><xs:documentation>Used to specify if pictures in the dialog box are rendered with a custom palette.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="RightToLeft" type="YesNoType">
+                <xs:annotation><xs:documentation>Used to specify if the text in the dialog should be displayed in right to left reading order.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="RightAligned" type="YesNoType">
+                <xs:annotation><xs:documentation>Align text on the right.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="LeftScroll" type="YesNoType">
+                <xs:annotation><xs:documentation>Used to align the scroll bar on the left.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ErrorDialog" type="YesNoType">
+                <xs:annotation><xs:documentation>Specifies this dialog as an error dialog.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="DialogRef">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="Dialog"/>
+            </xs:appinfo>
+            <xs:documentation>
+                Reference to a Dialog.  This will cause the entire referenced section's contents
+                to be included in the installer database.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>The identifier of the Dialog to reference.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="ProgressText">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef table="ActionText" href="http://msdn.microsoft.com/library/aa367516.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:simpleContent>
+                <xs:extension base="xs:string">
+                    <xs:annotation><xs:documentation>Element value is progress message text for action</xs:documentation></xs:annotation>
+                    <xs:attribute name="Action" type="xs:string" use="required"/>
+                    <xs:attribute name="Template" type="xs:string">
+                        <xs:annotation><xs:documentation>used to format ActionData messages from action processing</xs:documentation></xs:annotation>
+                    </xs:attribute>
+                </xs:extension>
+            </xs:simpleContent>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="TextStyle">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:msiRef table="TextStyle" href="http://msdn.microsoft.com/library/aa372074.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string" use="required"/>
+            <xs:attribute name="FaceName" use="required" type="xs:string"/>
+            <xs:attribute name="Size" use="required" type="xs:string"/>
+            <xs:attribute name="Red" type="xs:integer">
+                <xs:annotation><xs:documentation>0 to 255</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Green" type="xs:integer">
+                <xs:annotation><xs:documentation>0 to 255</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Blue" type="xs:integer">
+                <xs:annotation><xs:documentation>0 to 255</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Bold" type="YesNoType"/>
+            <xs:attribute name="Italic" type="YesNoType"/>
+            <xs:attribute name="Underline" type="YesNoType"/>
+            <xs:attribute name="Strike" type="YesNoType"/>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="ListItem">
+        <xs:annotation>
+            <xs:documentation>
+                The value (and optional text) associated with an item in a ComboBox, ListBox, or ListView.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="ComboBox" href="http://msdn.microsoft.com/library/aa367872.aspx"/>
+                <xse:msiRef table="ListBox" href="http://msdn.microsoft.com/library/aa369762.aspx"/>
+                <xse:msiRef table="ListView" href="http://msdn.microsoft.com/library/aa369764.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Value" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>
+                        The value assigned to the associated ComboBox, ListBox, or ListView property if this item is selected.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Text" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        The localizable, visible text to be assigned to the item.
+                        If not specified, this will default to the value of the Value attribute.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Icon" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        The identifier of the Binary (not Icon) element containing the icon to associate with this item.
+                        This value is only valid when nested under a ListView element.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="ListBox">
+        <xs:annotation>
+            <xs:documentation>
+                Set of items for a particular ListBox control tied to an install Property
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="Control" href="http://msdn.microsoft.com/library/aa368044.aspx"/>
+                <xse:msiRef table="Dialog" href="http://msdn.microsoft.com/library/aa368286.aspx"/>
+                <xse:msiRef table="ListView" href="http://msdn.microsoft.com/library/aa369764.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element ref="ListItem" minOccurs="0" maxOccurs="unbounded">
+                    <xs:annotation><xs:documentation>entry for ListBox table</xs:documentation></xs:annotation>
+                </xs:element>
+            </xs:sequence>
+            <xs:attribute name="Property" use="required" type="xs:string">
+                <xs:annotation><xs:documentation>Property tied to this group</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="ComboBox">
+        <xs:annotation>
+            <xs:documentation>
+                Set of items for a particular ComboBox control tied to an install Property
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="ComboBox" href="http://msdn.microsoft.com/library/aa367872.aspx"/>
+                <xse:msiRef table="Control" href="http://msdn.microsoft.com/library/aa368044.aspx"/>
+                <xse:msiRef table="Dialog" href="http://msdn.microsoft.com/library/aa368286.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element ref="ListItem" minOccurs="0" maxOccurs="unbounded">
+                    <xs:annotation><xs:documentation>entry for ComboBox table</xs:documentation></xs:annotation>
+                </xs:element>
+            </xs:sequence>
+            <xs:attribute name="Property" use="required" type="xs:string">
+                <xs:annotation><xs:documentation>Property tied to this group</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="ListView">
+        <xs:annotation>
+            <xs:documentation>
+                Set of items for a particular ListView control tied to an install Property
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="ListView" href="http://msdn.microsoft.com/library/aa369764.aspx"/>
+                <xse:msiRef table="Control" href="http://msdn.microsoft.com/library/aa368044.aspx"/>
+                <xse:msiRef table="Dialog" href="http://msdn.microsoft.com/library/aa368286.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element ref="ListItem" minOccurs="0" maxOccurs="unbounded">
+                    <xs:annotation><xs:documentation>entry for ListView table</xs:documentation></xs:annotation>
+                </xs:element>
+            </xs:sequence>
+            <xs:attribute name="Property" use="required" type="xs:string">
+                <xs:annotation><xs:documentation>Property tied to this group</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="RadioButton">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:seeAlso ref="RadioButtonGroup"/>
+                <xse:msiRef table="RadioButton" href="http://msdn.microsoft.com/library/aa370962.aspx"/>
+                <xse:msiRef table="Control" href="http://msdn.microsoft.com/library/aa368044.aspx"/>
+                <xse:msiRef table="Dialog" href="http://msdn.microsoft.com/library/aa368286.aspx"/>
+            </xs:appinfo>
+            <xs:documentation>Text or Icon plus Value that is assigned to the Property of the parent Control (RadioButtonGroup).</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Bitmap" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    This attribute defines the bitmap displayed with the radio button.  The value of the attribute creates a reference
+                    to a Binary element that represents the bitmap.  This attribute is mutually exclusive with the Icon and Text 
+                    attributes.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Height" use="required" type="LocalizableInteger"/>
+            <xs:attribute name="Help" type="xs:string"/>
+            <xs:attribute name="Icon" type="xs:string">
+                <xs:annotation><xs:documentation>
+                    This attribute defines the icon displayed with the radio button.  The value of the attribute creates a reference
+                    to a Binary element that represents the icon.  This attribute is mutually exclusive with the Bitmap and Text 
+                    attributes.
+                </xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Text" type="xs:string">
+                <xs:annotation><xs:documentation>Text displayed with the radio button.  This attribute is mutually exclusive with the Bitmap and Icon attributes.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ToolTip" type="xs:string"/>
+            <xs:attribute name="Value" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Value assigned to the associated control Property when this radio button is selected.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Width" use="required" type="LocalizableInteger"/>
+            <xs:attribute name="X" use="required" type="LocalizableInteger"/>
+            <xs:attribute name="Y" use="required" type="LocalizableInteger"/>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="RadioButtonGroup">
+        <xs:annotation>
+            <xs:documentation>
+                Set of radio buttons tied to the specified Property
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="RadioButton" href="http://msdn.microsoft.com/library/aa370962.aspx"/>
+                <xse:msiRef table="Control" href="http://msdn.microsoft.com/library/aa368044.aspx"/>
+                <xse:msiRef table="Dialog" href="http://msdn.microsoft.com/library/aa368286.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element ref="RadioButton" maxOccurs="unbounded"/>
+            </xs:sequence>
+            <xs:attribute name="Property" use="required" type="xs:string">
+                <xs:annotation><xs:documentation>Property tied to this group.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="UIText">
+        <xs:annotation>
+            <xs:documentation>
+                Text associated with certain controls
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:msiRef table="UIText" href="http://msdn.microsoft.com/library/aa372101.aspx"/>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:simpleContent>
+                <xs:extension base="xs:string">
+                    <xs:annotation><xs:documentation>Element value is text, may use CDATA if needed to escape XML delimiters</xs:documentation></xs:annotation>
+                    <xs:attribute name="Id" use="required" type="xs:string"/>
+                </xs:extension>
+            </xs:simpleContent>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="UIRef">
+        <xs:annotation>
+            <xs:documentation>
+                Reference to a UI element.  This will force the entire referenced Fragment's contents
+                to be included in the installer database.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:seeAlso ref="UI" />
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string" use="required" />
+            <xs:anyAttribute namespace="##other" processContents="lax">
+                <xs:annotation><xs:documentation>
+                    Extensibility point in the WiX XML Schema.  Schema extensions can register additional
+                    attributes at this point in the schema.
+                </xs:documentation></xs:annotation>
+            </xs:anyAttribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="UI">
+        <xs:annotation>
+            <xs:documentation>
+                Enclosing element to compartmentalize UI specifications.
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:seeAlso ref="UIRef" />
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="EmbeddedUI">
+                    <xs:annotation><xs:documentation>Embedded UI definition with EmbeddedResource children.</xs:documentation>
+                    </xs:annotation>
+                </xs:element>
+                <xs:element ref="Error">
+                    <xs:annotation><xs:documentation>Error text associated with install error</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="ProgressText">
+                    <xs:annotation><xs:documentation>ActionText entry associated with an action</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="BillboardAction">
+                    <xs:annotation><xs:documentation>Billboard table item with child Controls</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="ComboBox">
+                    <xs:annotation><xs:documentation>ComboBox table with ListItem children</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="ListBox">
+                    <xs:annotation><xs:documentation>ListBox table with ListItem children</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="ListView">
+                    <xs:annotation><xs:documentation>ListView table with ListItem children</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="RadioButtonGroup">
+                    <xs:annotation><xs:documentation>RadioButton table with RadioButton children</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="TextStyle">
+                    <xs:annotation><xs:documentation>TextStyle entry for use in control text</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="UIText">
+                    <xs:annotation><xs:documentation>values for UIText property, not installer Property</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="Dialog">
+                    <xs:annotation><xs:documentation>Dialog specification, called from Sequence</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="DialogRef">
+                    <xs:annotation><xs:documentation>Reference to a Dialog specification.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="Publish"/>
+                <!-- elements with identical behavior as under Product key, solely to allow grouping with other UI elements -->
+                <xs:element ref="PropertyRef"/>
+                <xs:element ref="Property"/>
+                <xs:element ref="Binary"/>
+                <xs:sequence>
+                    <xs:element ref="AdminUISequence" minOccurs="0"/>
+                    <xs:element ref="InstallUISequence" minOccurs="0"/>
+                </xs:sequence>
+                <xs:element ref="UIRef"/>
+            </xs:choice>
+            <xs:attribute name="Id" type="xs:string" />
+        </xs:complexType>
+    </xs:element>
+
+    <!-- custom table elements -->
+
+    <xs:element name="CustomTable">
+        <xs:annotation><xs:documentation>Defines a custom table for use from a custom action.</xs:documentation></xs:annotation>
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element ref="Column" minOccurs="0" maxOccurs="unbounded">
+                    <xs:annotation><xs:documentation>Column definition for the custom table.</xs:documentation></xs:annotation>
+                </xs:element>
+                <xs:element ref="Row" minOccurs="0" maxOccurs="unbounded">
+                    <xs:annotation><xs:documentation>Row definition for the custom table.</xs:documentation></xs:annotation>
+                </xs:element>
+            </xs:sequence>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Identifier for the custom table.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Column">
+        <xs:annotation><xs:documentation>Column definition for a Custom Table</xs:documentation></xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation><xs:documentation>Identifier for the column.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="PrimaryKey" type="YesNoType">
+                <xs:annotation><xs:documentation>Whether this column is a primary key.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Type" use="required">
+                <xs:annotation><xs:documentation>The type of this column.</xs:documentation></xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="binary">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Column contains a path to a file that will be inserted into the column as a binary object.
+                                    If this value is set, the Category attribute must also be set with a value of 'Binary' to pass ICE validation.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="int">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Column contains an integer or datetime value (the MinValue and MaxValue attributes should also be set).
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="string">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Column contains a non-localizable string value.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="Width" type="xs:integer">
+                <xs:annotation><xs:documentation>Width of this column.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Nullable" type="YesNoType">
+                <xs:annotation><xs:documentation>Whether this column can be left null.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Localizable" type="YesNoType">
+                <xs:annotation><xs:documentation>Whether this column can be localized.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="MinValue" type="xs:integer">
+                <xs:annotation><xs:documentation>Minimum value for a numeric value, date or version in this column.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="MaxValue" type="xs:integer">
+                <xs:annotation><xs:documentation>Maximum value for a numeric value, date or version in this column.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="KeyTable" type="xs:string">
+                <xs:annotation><xs:documentation>Table in which this column is an external key. Can be semicolon delimited.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="KeyColumn" type="xs:integer">
+                <xs:annotation><xs:documentation>Column in the table in KeyTable attribute.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Category">
+                <xs:annotation>
+                    <xs:documentation>
+                        Category of this column.
+                        This attribute must be specified with a value of 'Binary' if the Type attribute's value is 'binary'.
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="Text"/>
+                        <xs:enumeration value="UpperCase"/>
+                        <xs:enumeration value="LowerCase"/>
+                        <xs:enumeration value="Integer"/>
+                        <xs:enumeration value="DoubleInteger"/>
+                        <xs:enumeration value="TimeDate"/>
+                        <xs:enumeration value="Identifier"/>
+                        <xs:enumeration value="Property"/>
+                        <xs:enumeration value="Filename"/>
+                        <xs:enumeration value="WildCardFilename"/>
+                        <xs:enumeration value="Path"/>
+                        <xs:enumeration value="Paths"/>
+                        <xs:enumeration value="AnyPath"/>
+                        <xs:enumeration value="DefaultDir"/>
+                        <xs:enumeration value="RegPath"/>
+                        <xs:enumeration value="Formatted"/>
+                        <xs:enumeration value="FormattedSddl"/>
+                        <xs:enumeration value="Template"/>
+                        <xs:enumeration value="Condition"/>
+                        <xs:enumeration value="Guid"/>
+                        <xs:enumeration value="Version"/>
+                        <xs:enumeration value="Language"/>
+                        <xs:enumeration value="Binary"/>
+                        <xs:enumeration value="CustomSource"/>
+                        <xs:enumeration value="Cabinet"/>
+                        <xs:enumeration value="Shortcut"/>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="Set" type="xs:string">
+                <xs:annotation><xs:documentation>Semicolon delimited list of permissible values.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Description" type="xs:string">
+                <xs:annotation><xs:documentation>Description of this column.</xs:documentation></xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Modularize">
+                <xs:annotation><xs:documentation>How this column should be modularized, if at all.</xs:documentation></xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:NMTOKEN">
+                        <xs:enumeration value="None">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Column should not be modularized.  This is the default value.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="Column">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Column should be modularized.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="Condition">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Column is a condition and should be modularized.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="Icon">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    When the column is an primary or foreign key to the Icon table it should be modularized special.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="Property">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Any Properties in the column should be modularized.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                        <xs:enumeration value="SemicolonDelimited">
+                            <xs:annotation>
+                                <xs:documentation>
+                                    Semi-colon list of keys, all of which need to be modularized.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:enumeration>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Row">
+        <xs:annotation><xs:documentation>Row data for a Custom Table</xs:documentation></xs:annotation>
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element ref="Data" maxOccurs="unbounded"/>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Data">
+        <xs:annotation><xs:documentation>Used for a Custom Table. Specifies the data for the parent Row and specified Column.</xs:documentation></xs:annotation>
+        <xs:complexType>
+            <xs:simpleContent>
+                <xs:extension base="xs:string">
+                    <xs:annotation><xs:documentation>A data value</xs:documentation></xs:annotation>
+                    <xs:attribute name="Column" use="required" type="xs:string">
+                        <xs:annotation><xs:documentation>Specifies in which column to insert this data.</xs:documentation></xs:annotation>
+                    </xs:attribute>
+                </xs:extension>
+            </xs:simpleContent>
+        </xs:complexType>
+    </xs:element>
+    
+    <!-- EnsureTable element, for preserving empty tables -->
+
+    <xs:element name="EnsureTable">
+        <xs:annotation>
+            <xs:documentation>
+                Use this element to ensure that a table appears in the installer database, even if its empty.  
+            </xs:documentation>
+            <xs:appinfo>
+                <xse:remarks>
+                    This element is particularly useful for two problems that may occur while merging merge modules:
+                    <html:ol>
+                        <html:li>
+                            The first likely problem is that in order to properly merge you need to have certain
+                            tables present prior to merging.  Using this element is one way to ensure those tables
+                            are present prior to the merging.
+                        </html:li>
+                        <html:li>
+                            The other common problem is that a merge module has incorrect validation information
+                            about some tables.  By ensuring these tables prior to merging, you can avoid this
+                            problem because the correct validation information will go into the installer database
+                            before the merge module has a chance to set it incorrectly.
+                        </html:li>
+                    </html:ol>
+                </xse:remarks>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" use="required" type="xs:string">
+                <xs:annotation><xs:documentation>The name of the table.</xs:documentation></xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="WixVariable">
+        <xs:annotation>
+            <xs:documentation>
+                This element exposes advanced WiX functionality.  Use this element to declare WiX variables
+                from directly within your authoring.  WiX variables are not resolved until the final msi/msm/pcp
+                file is actually generated.  WiX variables do not persist into the msi/msm/pcp file, so they cannot
+                be used when an MSI file is being installed; it's a WiX-only concept.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>The name of the variable.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Overridable" type="YesNoType">
+                <xs:annotation>
+                    <xs:documentation>
+                        Set this value to 'yes' in order to make the variable's value overridable either by
+                        another WixVariable entry or via the command-line option -d&lt;name&gt;=&lt;value&gt;
+                        for light.exe.  If the same variable is declared overridable in multiple places it
+                        will cause an error (since WiX won't know which value is correct).  The default value
+                        is 'no'.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Value" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>
+                        The value of the variable.  The value cannot be an empty string because that would
+                        make it possible to accidentally set a column to null.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="InstanceTransforms">
+        <xs:annotation>
+            <xs:documentation>
+                Use this element to contain definitions for instance transforms.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="Instance"/>
+            </xs:choice>
+            <xs:attribute name="Property" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>The Id of the Property who's value should change for each instance.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="Instance">
+        <xs:annotation>
+            <xs:documentation>
+                Defines an instance transform for your product.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>
+                        The identity of the instance transform. This value will define the name by which the instance
+                        should be referred to on the command line. In addition, the value of the this attribute will
+                        determine what the value of the property specified in Property attribute on InstanceTransforms
+                        will change to for each instance.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ProductCode" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>The ProductCode for this instance.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ProductName" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>The ProductName for this instance.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+  <xs:element name="MajorUpgrade">
+    <xs:annotation>
+      <xs:documentation>
+                Simplifies authoring for major upgrades, including support for preventing downgrades.
+
+                The parent Product element must have valid UpgradeCode and Version attributes.
+
+                When the FindRelatedProducts action detects a related product installed on the system, 
+                it appends the product code to the property named WIX_UPGRADE_DETECTED. After the 
+                FindRelatedProducts action is run, the value of the WIX_UPGRADE_DETECTED property is a 
+                list of product codes, separated by semicolons (;), detected on the system.
+            </xs:documentation>
+      <xs:appinfo>
+        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Product" />
+      </xs:appinfo>
+    </xs:annotation>
+    <xs:complexType>
+        <xs:attribute name="AllowDowngrades" type="YesNoType">
+            <xs:annotation>
+                <xs:documentation>
+                    When set to no (the default), products with lower version numbers are blocked from
+                    installing when a product with a higher version is installed; the DowngradeErrorMessage
+                    attribute must also be specified.
+
+                    When set to yes, any version can be installed over any other version.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="AllowSameVersionUpgrades" type="YesNoType">
+            <xs:annotation>
+                <xs:documentation>
+                    When set to no (the default), installing a product with the same version and upgrade code
+                    (but different product code) is allowed and treated by MSI as two products. When set to yes,
+                    WiX sets the msidbUpgradeAttributesVersionMaxInclusive attribute, which tells MSI to treat
+                    a product with the same version as a major upgrade.
+
+                    This is useful when two product versions differ only in the fourth version field. MSI
+                    specifically ignores that field when comparing product versions, so two products that
+                    differ only in the fourth version field are the same product and need this attribute set to
+                    yes to be detected.
+
+                    Note that because MSI ignores the fourth product version field, setting this attribute to
+                    yes also allows downgrades when the first three product version fields are identical. 
+                    For example, product version 1.0.0.1 will "upgrade" 1.0.0.2998 because they're seen as the
+                    same version (1.0.0). That could reintroduce serious bugs so the safest choice is to change 
+                    the first three version fields and omit this attribute to get the default of no.
+
+                    This attribute cannot be "yes" when AllowDowngrades is also "yes" -- AllowDowngrades
+                    already allows two products with the same version number to upgrade each other.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="Disallow" type="YesNoType">
+              <xs:annotation>
+                  <xs:documentation>
+                      When set to yes, products with higer version numbers are blocked from
+                      installing when a product with a lower version is installed; the UpgradeErrorMessage
+                      attribute must also be specified.
+
+                      When set to no (the default), any version can be installed over any lower version.
+                  </xs:documentation>
+              </xs:annotation>
+          </xs:attribute>
+      <xs:attribute name="DowngradeErrorMessage" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>
+                        The message displayed if users try to install a product with a lower version number
+                        when a product with a higher version is installed. Used only when AllowDowngrades
+                        is no (the default).
+          </xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="DisallowUpgradeErrorMessage" type="xs:string">
+          <xs:annotation>
+              <xs:documentation>
+                  The message displayed if users try to install a product with a higer version number
+                  when a product with a lower version is installed. Used only when Disallow
+                  is yes.
+              </xs:documentation>
+          </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="MigrateFeatures" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>
+                        When set to yes (the default), the MigrateFeatureStates standard action will set the
+                        feature states of the upgrade product to those of the installed product.
+
+                        When set to no, the installed features have no effect on the upgrade installation.
+                    </xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="IgnoreRemoveFailure" type="YesNoType">
+        <xs:annotation>
+          <xs:documentation>
+                        When set to yes, failures removing the installed product during the upgrade will be
+                        ignored.
+
+                        When set to no (the default), failures removing the installed product during the upgrade
+                        will be considered a failure and, depending on the scheduling, roll back the upgrade.
+                    </xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="RemoveFeatures" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>
+                        A formatted string that contains the list of features to remove from the installed
+                        product. The default is to remove all features. Note that if you use formatted property
+                        values that evaluate to an empty string, no features will be removed; only omitting
+                        this attribute defaults to removing all features.
+                    </xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="Schedule" default="afterInstallValidate">
+        <xs:annotation>
+          <xs:documentation>
+                        Determines the scheduling of the RemoveExistingProducts standard action, which is when
+                        the installed product is removed. The default is "afterInstallValidate" which removes
+                        the installed product entirely before installing the upgrade product. It's slowest but
+                        gives the most flexibility in changing components and features in the upgrade product.
+
+                        For more information, see <html:a href="http://msdn.microsoft.com/en-us/library/aa371197.aspx" target="_blank">RemoveExistingProducts</html:a>.
+                    </xs:documentation>
+        </xs:annotation>
+        <xs:simpleType>
+          <xs:restriction base="xs:NMTOKEN">
+            <xs:enumeration value="afterInstallValidate">
+              <xs:annotation>
+                <xs:documentation>
+                                    (Default) Schedules RemoveExistingProducts after the InstallValidate standard
+                                    action. This scheduling removes the installed product entirely before installing
+                                    the upgrade product. It's slowest but gives the most flexibility in changing
+                                    components and features in the upgrade product. Note that if the installation
+                                    of the upgrade product fails, the machine will have neither version installed.
+                                </xs:documentation>
+              </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="afterInstallInitialize">
+              <xs:annotation>
+                <xs:documentation>
+                                    Schedules RemoveExistingProducts after the InstallInitialize standard action.
+                                    This is similar to the afterInstallValidate scheduling, but if the installation
+                                    of the upgrade product fails, Windows Installer also rolls back the removal of
+                                    the installed product -- in other words, reinstalls it.
+                                </xs:documentation>
+              </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="afterInstallExecute">
+              <xs:annotation>
+                <xs:documentation>
+                                    Schedules RemoveExistingProducts between the InstallExecute and InstallFinalize standard actions.
+                                    This scheduling installs the upgrade product "on top of" the installed product then lets
+                                    RemoveExistingProducts uninstall any components that don't also exist in the upgrade product.
+                                    Note that this scheduling requires strict adherence to the component rules because it relies
+                                    on component reference counts to be accurate during installation of the upgrade product and
+                                    removal of the installed product. For more information, see
+                                    <html:a href="http://www.joyofsetup.com/2008/12/30/paying-for-upgrades/" target="_blank">
+                                        Bob Arnson's blog post "Paying for Upgrades"
+                                    </html:a> for details. If installation of the upgrade product fails, Windows Installer
+                                    also rolls back the removal of the installed product -- in other words, reinstalls it.
+                                </xs:documentation>
+              </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="afterInstallExecuteAgain">
+              <xs:annotation>
+                <xs:documentation>
+                                    Schedules RemoveExistingProducts between the InstallExecuteAgain and InstallFinalize standard actions.
+                                    This is identical to the afterInstallExecute scheduling but after the InstallExecuteAgain standard
+                                    action instead of InstallExecute.
+                                </xs:documentation>
+              </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="afterInstallFinalize">
+              <xs:annotation>
+                <xs:documentation>
+                                    Schedules RemoveExistingProducts after the InstallFinalize standard action. This is similar to the
+                                    afterInstallExecute and afterInstallExecuteAgain schedulings but takes place outside the
+                                    installation transaction so if installation of the upgrade product fails, Windows Installer does
+                                    not roll back the removal of the installed product, so the machine will have both versions
+                                    installed.
+                                </xs:documentation>
+              </xs:annotation>
+            </xs:enumeration>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+    <!-- - - - - - - - - - - Complex Type Definitions  - - - - - - - - - - - -->
+
+    <xs:complexType name="ActionModuleSequenceType">
+        <xs:simpleContent>
+            <xs:extension base="xs:string">
+                <xs:annotation><xs:documentation>Text node specifies the condition of the action.</xs:documentation></xs:annotation>
+                <xs:attribute name="After" type="xs:string">
+                    <xs:annotation><xs:documentation>The name of an action that this action should come after.</xs:documentation></xs:annotation>
+                </xs:attribute>
+                <xs:attribute name="Before" type="xs:string">
+                    <xs:annotation><xs:documentation>The name of an action that this action should come before.</xs:documentation></xs:annotation>
+                </xs:attribute>
+                <xs:attribute name="Overridable" type="YesNoType">
+                    <xs:annotation>
+                        <xs:documentation>
+                            If "yes", the sequencing of this action may be overridden by sequencing elsewhere.
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:attribute>
+                <xs:attribute name="Sequence" type="xs:integer">
+                    <xs:annotation><xs:documentation>A value used to indicate the position of this action in a sequence.</xs:documentation></xs:annotation>
+                </xs:attribute>
+                <xs:attribute name="Suppress" type="YesNoType">
+                    <xs:annotation><xs:documentation>If yes, this action will not occur.</xs:documentation></xs:annotation>
+                </xs:attribute>
+            </xs:extension>
+        </xs:simpleContent>
+    </xs:complexType>
+
+    <xs:complexType name="ActionSequenceType">
+        <xs:simpleContent>
+            <xs:extension base="xs:string">
+                <xs:attribute name="Sequence" type="xs:integer">
+                    <xs:annotation><xs:documentation>A value used to indicate the position of this action in a sequence.</xs:documentation></xs:annotation>
+                </xs:attribute>
+                <xs:attribute name="Suppress" type="YesNoType">
+                    <xs:annotation><xs:documentation>If yes, this action will not occur.</xs:documentation></xs:annotation>
+                </xs:attribute>
+            </xs:extension>
+        </xs:simpleContent>
+    </xs:complexType>
+
+    <!-- - - - - - - - - - - Simple Type Definitions - - - - - - - - - - - - -->
+
+    <xs:simpleType name="Guid">
+        <xs:annotation><xs:documentation>Values of this type will look like: "01234567-89AB-CDEF-0123-456789ABCDEF" or "{01234567-89AB-CDEF-0123-456789ABCDEF}". Also allows "PUT-GUID-HERE" for use in examples.</xs:documentation></xs:annotation>
+        <xs:restriction base="xs:string">
+            <xs:pattern value="[{(]?[0-9A-Fa-f]{8}\-?[0-9A-Fa-f]{4}\-?[0-9A-Fa-f]{4}\-?[0-9A-Fa-f]{4}\-?[0-9A-Fa-f]{12}[})]?|PUT\-GUID\-(?:\d+\-)?HERE|([!$])(\(var|\(loc|\(wix)\.[_A-Za-z][0-9A-Za-z_.]*\)"/>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:simpleType name="AutogenGuid">
+        <xs:annotation><xs:documentation>Values of this type will look like: "01234567-89AB-CDEF-0123-456789ABCDEF" or "{01234567-89AB-CDEF-0123-456789ABCDEF}". A GUID can be auto-generated by setting the value to "*". Also allows "PUT-GUID-HERE" for use in examples.</xs:documentation></xs:annotation>
+        <xs:restriction base="xs:string">
+            <xs:pattern value="[{(]?[0-9A-Fa-f]{8}\-?[0-9A-Fa-f]{4}\-?[0-9A-Fa-f]{4}\-?[0-9A-Fa-f]{4}\-?[0-9A-Fa-f]{12}[})]?|[{(]?\?{8}\-\?{4}\-\?{4}\-\?{4}\-\?{12}[})]?|PUT\-GUID\-(?:\d+\-)?HERE|([!$])(\(var|\(loc|\(wix)\.[_A-Za-z][0-9A-Za-z_.]*\)|\*"/>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:simpleType name="ComponentGuid">
+        <xs:annotation><xs:documentation>Values of this type will look like: "01234567-89AB-CDEF-0123-456789ABCDEF" or "{01234567-89AB-CDEF-0123-456789ABCDEF}", but also allows "PUT-GUID-HERE" for use in examples.  It's also possible to have an empty value "".</xs:documentation></xs:annotation>
+        <xs:restriction base="xs:string">
+            <xs:pattern value="[{(]?[0-9A-Fa-f]{8}\-?[0-9A-Fa-f]{4}\-?[0-9A-Fa-f]{4}\-?[0-9A-Fa-f]{4}\-?[0-9A-Fa-f]{12}[})]?|PUT\-GUID\-(?:\d+\-)?HERE|([!$])(\(var|\(loc|\(wix)\.[_A-Za-z][0-9A-Za-z_.]*\)|\*|^$"/>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:simpleType name="LocalizableInteger">
+        <xs:annotation><xs:documentation>Values of this type must be an integer or the value can be a localization variable with the format !(loc.Variable) where "Variable" is the name of the variable.</xs:documentation></xs:annotation>
+        <xs:restriction base="xs:string">
+            <xs:pattern value="[0-9][0-9]*|([!$])\((?:loc|bind)\.[_A-Za-z][0-9A-Za-z_.]+\)"/>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:simpleType name="ShortFileNameType">
+        <xs:annotation><xs:documentation>Values of this type will look like: "FileName.ext".  Only one period is allowed.  The following characters are not allowed: \ ? | > : / * " + , ; = [ ] less-than, or whitespace.  The name cannot be longer than 8 characters and the extension cannot exceed 3 characters.  The value could also be a localization variable with the format !(loc.VARIABLE).</xs:documentation></xs:annotation>
+        <xs:restriction base="xs:string">
+            <xs:pattern value="[^\\\?|&gt;&lt;:/\*&quot;\+,;=\[\]\. ]{1,8}(\.[^\\\?|&gt;&lt;:/\*&quot;\+,;=\[\]\. ]{0,3})?|([!$])\(loc\.[_A-Za-z][0-9A-Za-z_.]*\)"/>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:simpleType name="LongFileNameType">
+        <xs:annotation><xs:documentation>Values of this type will look like: "Long File Name.extension".  Legal long names contain no more than 260 characters and must contain at least one non-period character.  The following characters are not allowed: \ ? | > : / * " or less-than.  The name must be shorter than 260 characters.  The value could also be a localization variable with the format !(loc.VARIABLE).</xs:documentation></xs:annotation>
+        <xs:restriction base="xs:string">
+            <xs:pattern value="[^\\\?|&gt;&lt;:/\*&quot;]{1,259}|([!$])\(loc\.[_A-Za-z][0-9A-Za-z_.]*\)"/>
+        </xs:restriction>
+    </xs:simpleType>
+    
+    <xs:simpleType name="VersionType">
+        <xs:annotation><xs:documentation>Values of this type will look like: "x.x.x.x" where x is an integer from 0 to 65534.</xs:documentation></xs:annotation>
+        <xs:restriction base="xs:string">
+            <xs:pattern value="(\d{1,5}\.){3}\d{1,5}"/>
+        </xs:restriction>
+    </xs:simpleType>
+    
+    <xs:simpleType name="WildCardShortFileNameType">
+        <xs:annotation><xs:documentation>Values of this type will look like: "File?.*".  Only one period is allowed.  The following characters are not allowed: \ | > : / " + , ; = [ ] less-than, or whitespace.  The name cannot be longer than 8 characters and the extension cannot exceed 3 characters.  The value could also be a localization variable with the format !(loc.VARIABLE).</xs:documentation></xs:annotation>
+        <xs:restriction base="xs:string">
+            <xs:pattern value="[^\\\|&gt;&lt;:/&quot;\+,;=\[\]\. ]{1,16}(\.[^\\\|&gt;&lt;:/&quot;\+,;=\[\]\. ]{0,6})?|([!$])\(loc\.[_A-Za-z][0-9A-Za-z_.]*\)"/>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:simpleType name="WildCardLongFileNameType">
+        <xs:annotation><xs:documentation>Values of this type will look like: "Long File N?me.extension*".  Legal long names contain no more than 260 characters and must contain at least one non-period character.  The following characters are not allowed: \ | > : / " or less-than.  The name must be shorter than 260 characters.  The value could also be a localization variable with the format !(loc.VARIABLE).</xs:documentation></xs:annotation>
+        <xs:restriction base="xs:string">
+            <xs:pattern value="[^\\\|&gt;&lt;:/&quot;]{1,259}|([!$])\(loc\.[_A-Za-z][0-9A-Za-z_.]*\)"/>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:simpleType name="HexType">
+        <xs:annotation><xs:documentation>This type supports any hexadecimal number.  Both upper and lower case is acceptable for letters appearing in the number.  This type also includes the empty string: "".</xs:documentation></xs:annotation>
+        <xs:restriction base="xs:string">
+            <xs:pattern value="[0-9A-Fa-f]*"/>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:simpleType name="YesNoType">
+        <xs:annotation><xs:documentation>Values of this type will either be "yes" or "no".</xs:documentation></xs:annotation>
+        <xs:restriction base='xs:NMTOKEN'>
+            <xs:enumeration value="no"/>
+            <xs:enumeration value="yes"/>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:simpleType name="YesNoDefaultType">
+        <xs:annotation><xs:documentation>Values of this type will either be "default", "yes", or "no".</xs:documentation></xs:annotation>
+        <xs:restriction base='xs:NMTOKEN'>
+            <xs:enumeration value="default"/>
+            <xs:enumeration value="no"/>
+            <xs:enumeration value="yes"/>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:simpleType name="RegistryRootType">
+        <xs:annotation>
+            <xs:documentation>Values of this type represent possible registry roots.</xs:documentation>
+        </xs:annotation>
+        <xs:restriction base="xs:NMTOKEN">
+            <xs:enumeration value="HKMU">
+                <xs:annotation>
+                    <xs:documentation>
+                        A per-user installation will make the operation occur under HKEY_CURRENT_USER.
+                        A per-machine installation will make the operation occur under HKEY_LOCAL_MACHINE.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="HKCR">
+                <xs:annotation>
+                    <xs:documentation>
+                        Operation occurs under HKEY_CLASSES_ROOT.  When using Windows 2000 or later, the installer writes or removes the value
+                        from the HKCU\Software\Classes hive during per-user installations.  When using Windows 2000 or later operating systems,
+                        the installer writes or removes the value from the HKLM\Software\Classes hive during per-machine installations.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="HKCU">
+                <xs:annotation>
+                    <xs:documentation>
+                        Operation occurs under HKEY_CURRENT_USER.  It is recommended to set the KeyPath='yes' attribute when setting this value for writing values
+                        in order to ensure that the installer writes the necessary registry entries when there are multiple users on the same computer.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="HKLM">
+                <xs:annotation>
+                    <xs:documentation>
+                        Operation occurs under HKEY_LOCAL_MACHINE.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="HKU">
+                <xs:annotation>
+                    <xs:documentation>
+                        Operation occurs under HKEY_USERS.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:simpleType name="ExitType">
+        <xs:annotation>
+            <xs:documentation>TODO: What does this type mean?</xs:documentation>
+        </xs:annotation>
+        <xs:restriction base="xs:NMTOKEN">
+            <xs:enumeration value="success"/>
+            <xs:enumeration value="cancel"/>
+            <xs:enumeration value="error"/>
+            <xs:enumeration value="suspend"/>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:simpleType name="InstallUninstallType">
+        <xs:annotation>
+            <xs:documentation>Specifies whether an action occur on install, uninstall or both.</xs:documentation>
+        </xs:annotation>
+        <xs:restriction base="xs:NMTOKEN">
+            <xs:enumeration value="install">
+                <xs:annotation>
+                    <xs:documentation>
+                        The action should happen during install (msiInstallStateLocal or msiInstallStateSource).
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="uninstall">
+                <xs:annotation>
+                    <xs:documentation>
+                        The action should happen during uninstall (msiInstallStateAbsent).
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="both">
+                <xs:annotation>
+                    <xs:documentation>
+                        The action should happen during both install and uninstall.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:simpleType name="SequenceType">
+        <xs:annotation>
+            <xs:documentation>
+                Controls which sequences the item assignment is sequenced in.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:restriction base="xs:NMTOKEN">
+            <xs:enumeration value="both">
+                <xs:annotation>
+                    <xs:documentation>
+                        Schedules the assignment in the InstallUISequence and the InstallExecuteSequence.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="execute">
+                <xs:annotation>
+                    <xs:documentation>
+                        Schedules the assignment only in the the InstallExecuteSequence.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="ui">
+                <xs:annotation>
+                    <xs:documentation>
+                        Schedules the assignment only in the the InstallUISequence.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+        </xs:restriction>
+    </xs:simpleType>
+
+</xs:schema>
diff --git a/doc/wixloc.xsd b/doc/wixloc.xsd
new file mode 100644
index 0000000..6cb1529
--- /dev/null
+++ b/doc/wixloc.xsd
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+          xmlns:xse="http://schemas.microsoft.com/wix/2005/XmlSchemaExtension"
+         xmlns:html="http://www.w3.org/1999/xhtml"
+    targetNamespace="http://schemas.microsoft.com/wix/2006/localization"
+              xmlns="http://schemas.microsoft.com/wix/2006/localization">
+    <xs:annotation>
+        <xs:documentation>
+            Copyright (c) Microsoft Corporation.  All rights reserved.
+            
+            The use and distribution terms for this software are covered by the
+            Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+            which can be found in the file CPL.TXT at the root of this distribution.
+            By using this software in any fashion, you are agreeing to be bound by
+            the terms of this license.
+            
+            You must not remove this notice, or any other, from this software.
+
+            Schema for describing Windows Installer Xml Localization files (.wxl).
+        </xs:documentation>
+    </xs:annotation>
+
+    <xs:element name="WixLocalization">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:remarks>
+                    <html:p>You can specify any valid Windows code by integer like 1252, or by web name like Windows-1252 or iso-8859-1. See <a href="/html/codepage.htm">Code Pages</a> for more information.</html:p>
+                </xse:remarks>
+                <xse:howtoRef href="build_a_localized_version.htm">How To: Build a localized version of your installer</xse:howtoRef>
+                <xse:howtoRef href="make_installer_localizable.htm">How To: Make your installer localizable</xse:howtoRef>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:sequence minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="String" />
+            </xs:sequence>
+            <xs:attribute name="Codepage" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>The code page integer value or web name for the resulting database. You can also specify -1 which will not reset the database code page. See remarks for more information.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Culture" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>Culture of the localization strings.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="String">
+        <xs:annotation>
+            <xs:appinfo>
+                <xse:howtoRef href="build_a_localized_version.htm">How To: Build a localized version of your installer</xse:howtoRef>
+                <xse:howtoRef href="make_installer_localizable.htm">How To: Make your installer localizable</xse:howtoRef>
+            </xs:appinfo>
+        </xs:annotation>
+        <xs:complexType mixed="true">
+            <xs:attribute name="Id" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>Identity of the resource.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Overridable" type="LocalizationYesNoType">
+                <xs:annotation>
+                    <xs:documentation>Determines if the localized string may be overridden.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Localizable" type="LocalizationYesNoType">
+                <xs:annotation>
+                    <xs:documentation>Indicates whether the string is localizable text or a non-localizable string that must be unique per locale. No WiX tools are affected by the value of this attribute; it used as documentation for localizers to ignore things like GUIDs or identifiers that look like text.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:simpleType name="LocalizationYesNoType">
+        <xs:restriction base="xs:NMTOKEN">
+            <xs:enumeration value="no" />
+            <xs:enumeration value="yes" />
+        </xs:restriction>
+    </xs:simpleType>
+</xs:schema>
diff --git a/heat.exe b/heat.exe
new file mode 100755
index 0000000..749d393
--- /dev/null
+++ b/heat.exe
Binary files differ
diff --git a/heat.exe.config b/heat.exe.config
new file mode 100644
index 0000000..5d5aa30
--- /dev/null
+++ b/heat.exe.config
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (c) Microsoft Corporation.  All rights reserved.
+-->
+<configuration>
+    <appSettings>
+        <add key="extensions" value="WixIIsExtension;WixUtilExtension;WixVSExtension"/>
+    </appSettings>
+    <startup useLegacyV2RuntimeActivationPolicy="true">
+        <supportedRuntime version="v4.0" />
+        <supportedRuntime version="v2.0.50727" />
+    </startup>
+</configuration>
diff --git a/insignia.exe b/insignia.exe
new file mode 100755
index 0000000..f9e3a31
--- /dev/null
+++ b/insignia.exe
Binary files differ
diff --git a/insignia.exe.config b/insignia.exe.config
new file mode 100644
index 0000000..bed32a7
--- /dev/null
+++ b/insignia.exe.config
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (c) Microsoft Corporation.  All rights reserved.
+-->
+<configuration>
+    <startup useLegacyV2RuntimeActivationPolicy="true">
+        <supportedRuntime version="v4.0" />
+        <supportedRuntime version="v2.0.50727" />
+    </startup>
+</configuration>
diff --git a/light.exe b/light.exe
new file mode 100755
index 0000000..dfb7866
--- /dev/null
+++ b/light.exe
Binary files differ
diff --git a/light.exe.config b/light.exe.config
new file mode 100644
index 0000000..bed32a7
--- /dev/null
+++ b/light.exe.config
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (c) Microsoft Corporation.  All rights reserved.
+-->
+<configuration>
+    <startup useLegacyV2RuntimeActivationPolicy="true">
+        <supportedRuntime version="v4.0" />
+        <supportedRuntime version="v2.0.50727" />
+    </startup>
+</configuration>
diff --git a/lit.exe b/lit.exe
new file mode 100755
index 0000000..1000d48
--- /dev/null
+++ b/lit.exe
Binary files differ
diff --git a/lit.exe.config b/lit.exe.config
new file mode 100644
index 0000000..bed32a7
--- /dev/null
+++ b/lit.exe.config
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (c) Microsoft Corporation.  All rights reserved.
+-->
+<configuration>
+    <startup useLegacyV2RuntimeActivationPolicy="true">
+        <supportedRuntime version="v4.0" />
+        <supportedRuntime version="v2.0.50727" />
+    </startup>
+</configuration>
diff --git a/lux.exe b/lux.exe
new file mode 100755
index 0000000..1966b5c
--- /dev/null
+++ b/lux.exe
Binary files differ
diff --git a/lux.exe.config b/lux.exe.config
new file mode 100644
index 0000000..a6f6211
--- /dev/null
+++ b/lux.exe.config
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (c) Microsoft Corporation.  All rights reserved.
+-->
+<configuration>
+    <appSettings>
+        <add key="extensions" value="WixDifxAppExtension;WixDirectXExtension;WixFirewallExtension;WixGamingExtension;WixIIsExtension;WixLuxExtension;WixNetFxExtension;WixSqlExtension;WixUIExtension;WixUtilExtension;WixVSExtension" />
+    </appSettings>
+    <startup>
+        <supportedRuntime version="v2.0.50727" />
+    </startup>
+</configuration>
diff --git a/lux.targets b/lux.targets
new file mode 100644
index 0000000..e1c0ff5
--- /dev/null
+++ b/lux.targets
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+****************************************************************************************************
+lux.targets
+****************************************************************************************************
+-->
+
+<Project
+  xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
+  ToolsVersion="3.5">
+
+  <UsingTask TaskName="GenerateTestConsumer" AssemblyFile="$(LuxTasksPath)" />
+  <UsingTask TaskName="Nit" AssemblyFile="$(LuxTasksPath)" />
+  
+  <PropertyGroup>
+    <BuildTestPackageDependsOn>Compile;_ScanForUnitTests;_GenerateTestConsumer;Link</BuildTestPackageDependsOn>
+    <TestDependsOn>$(BuildTestPackageDependsOn)</TestDependsOn>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <GeneratedTestConsumer Include="$(OutputName)_test.wxs" />
+  </ItemGroup>
+
+  <Target
+    Name="_ScanForUnitTests">
+
+    <!--
+    So the Link target can do proper up-to-date checking, we need to give it the right list of 
+    .wixobj inputs, which we get by scanning for unit tests and not generating a test consumer.
+    -->
+    
+    <GenerateTestConsumer
+      InputFiles="@(CompileObjOutput);@(WixObject);@(WixLibProjects);@(_ResolvedWixLibraryPaths)"
+      Extensions="@(_ResolvedWixExtensionPaths)">
+        <Output TaskParameter="InputFragments" ItemName="FilesThatAreFragments" />
+    </GenerateTestConsumer>
+    
+    <ItemGroup>
+      <CompileObjOutput
+        Remove="@(CompileObjOutput)" />
+      <CompileObjOutput
+        Include="
+          @(GeneratedTestConsumer -> '$(IntermediateOutputPath)%(Filename)$(IntermediateExt)');
+          @(FilesThatAreFragments);
+        " />
+    </ItemGroup>
+
+    <PropertyGroup>
+      <TargetName>$(OutputName)_test</TargetName>
+      <SuppressIces>ICE71;$(SuppressIces)</SuppressIces>
+      <SuppressValidation>true</SuppressValidation>
+    </PropertyGroup>
+
+  </Target>
+
+  <Target
+    Name="_GenerateTestConsumer"
+    Inputs="@(Compile);
+            @(Content);
+            @(_ResolvedWixExtensionPaths);
+            @(_ResolvedProjectReferencePaths);
+            $(MSBuildAllProjects)"
+    Outputs="@(GeneratedTestConsumer -> '$(IntermediateOutputPath)%(Filename)$(IntermediateExt)')">
+
+    <GenerateTestConsumer
+      InputFiles="@(CompileObjOutput);@(WixObject);@(WixLibProjects);@(_ResolvedWixLibraryPaths)"
+      Extensions="@(_ResolvedWixExtensionPaths)"
+      OutputFile="@(GeneratedTestConsumer)">
+        <Output TaskParameter="InputFragments" ItemName="FilesThatAreFragments" />
+    </GenerateTestConsumer>
+
+    <Candle
+      SourceFiles="@(GeneratedTestConsumer)"
+      AdditionalOptions="$(CompilerAdditionalOptions)"
+      DefineConstants="$(DefineConstants);$(SolutionDefineConstants);$(ProjectDefineConstants);$(ProjectReferenceDefineConstants)"
+      ExtensionDirectory="$(WixExtDir)"
+      Extensions="@(_ResolvedWixExtensionPaths)"
+      FipsCompliant="$(FipsCompliant)"
+      IncludeSearchPaths="$(IncludeSearchPaths)"
+      InstallerPlatform="$(InstallerPlatform)"
+      NoLogo="$(CompilerNoLogo)"
+      OutputFile="$(IntermediateOutputPath)"
+      Pedantic="$(Pedantic)"
+      ReferencePaths="$(ReferencePaths)"
+      RunAsSeparateProcess="$(RunWixToolsOutOfProc)"
+      ShowSourceTrace="$(ShowSourceTrace)"
+      SuppressAllWarnings="$(CompilerSuppressAllWarnings)"
+      SuppressSchemaValidation="$(CompilerSuppressSchemaValidation)"
+      SuppressSpecificWarnings="$(CompilerSuppressSpecificWarnings)"
+      ToolPath="$(WixToolPath)"
+      TreatWarningsAsErrors="$(CompilerTreatWarningsAsErrors)"
+      TreatSpecificWarningsAsErrors="$(CompilerTreatSpecificWarningsAsErrors)"
+      VerboseOutput="$(CompilerVerboseOutput)" />
+  </Target>
+
+  <Target
+    Name="BuildTestPackage"
+    Inputs="@(CompileObjOutput);
+      @(WixObject);
+      @(_ResolvedProjectReferencePaths);
+      @(_ResolvedWixLibraryPaths);
+      @(_ResolvedWixExtensionPaths);
+      $(MSBuildAllProjects)"
+    Outputs="$(TargetPath)"
+    DependsOnTargets="$(BuildTestPackageDependsOn)" />
+
+  <Target
+    Name="Test"
+    DependsOnTargets="$(BuildTestPackageDependsOn)">
+
+    <Nit 
+      TestPackages="$(TargetPath)" 
+      ToolPath="$(WixToolPath)" />
+  </Target>
+</Project>
diff --git a/melt.exe b/melt.exe
new file mode 100755
index 0000000..8ad0b3d
--- /dev/null
+++ b/melt.exe
Binary files differ
diff --git a/melt.exe.config b/melt.exe.config
new file mode 100644
index 0000000..807cf2c
--- /dev/null
+++ b/melt.exe.config
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (c) Microsoft Corporation.  All rights reserved.
+-->
+<configuration>
+    <appSettings>
+    </appSettings>
+    <startup useLegacyV2RuntimeActivationPolicy="true">
+        <supportedRuntime version="v4.0" />
+        <supportedRuntime version="v2.0.50727" />
+    </startup>
+</configuration>
diff --git a/mergemod.cub b/mergemod.cub
new file mode 100644
index 0000000..2042a99
--- /dev/null
+++ b/mergemod.cub
Binary files differ
diff --git a/mergemod.dll b/mergemod.dll
new file mode 100755
index 0000000..cc53b1c
--- /dev/null
+++ b/mergemod.dll
Binary files differ
diff --git a/mspatchc.dll b/mspatchc.dll
new file mode 100755
index 0000000..4720f1a
--- /dev/null
+++ b/mspatchc.dll
Binary files differ
diff --git a/nit.exe b/nit.exe
new file mode 100755
index 0000000..231f967
--- /dev/null
+++ b/nit.exe
Binary files differ
diff --git a/nit.exe.config b/nit.exe.config
new file mode 100644
index 0000000..cae9da7
--- /dev/null
+++ b/nit.exe.config
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (c) Microsoft Corporation.  All rights reserved.
+-->
+<configuration>
+    <startup>
+        <supportedRuntime version="v2.0.50727" />
+    </startup>
+</configuration>
diff --git a/pyro.exe b/pyro.exe
new file mode 100755
index 0000000..6f26266
--- /dev/null
+++ b/pyro.exe
Binary files differ
diff --git a/pyro.exe.config b/pyro.exe.config
new file mode 100644
index 0000000..bed32a7
--- /dev/null
+++ b/pyro.exe.config
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (c) Microsoft Corporation.  All rights reserved.
+-->
+<configuration>
+    <startup useLegacyV2RuntimeActivationPolicy="true">
+        <supportedRuntime version="v4.0" />
+        <supportedRuntime version="v2.0.50727" />
+    </startup>
+</configuration>
diff --git a/sconce2005.dll b/sconce2005.dll
new file mode 100755
index 0000000..e1c4eb6
--- /dev/null
+++ b/sconce2005.dll
Binary files differ
diff --git a/sconce2008.dll b/sconce2008.dll
new file mode 100755
index 0000000..3be814b
--- /dev/null
+++ b/sconce2008.dll
Binary files differ
diff --git a/sconce2010.dll b/sconce2010.dll
new file mode 100755
index 0000000..468fbde
--- /dev/null
+++ b/sconce2010.dll
Binary files differ
diff --git a/sdk/DocCompiler.exe b/sdk/DocCompiler.exe
new file mode 100755
index 0000000..32d6eaa
--- /dev/null
+++ b/sdk/DocCompiler.exe
Binary files differ
diff --git a/sdk/MakeSfxCA.exe b/sdk/MakeSfxCA.exe
new file mode 100755
index 0000000..3eb6dbb
--- /dev/null
+++ b/sdk/MakeSfxCA.exe
Binary files differ
diff --git a/sdk/MakeSfxCA.exe.config b/sdk/MakeSfxCA.exe.config
new file mode 100644
index 0000000..bed32a7
--- /dev/null
+++ b/sdk/MakeSfxCA.exe.config
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (c) Microsoft Corporation.  All rights reserved.
+-->
+<configuration>
+    <startup useLegacyV2RuntimeActivationPolicy="true">
+        <supportedRuntime version="v4.0" />
+        <supportedRuntime version="v2.0.50727" />
+    </startup>
+</configuration>
diff --git a/sdk/Microsoft.Deployment.Compression.Cab.dll b/sdk/Microsoft.Deployment.Compression.Cab.dll
new file mode 100755
index 0000000..a4a4e31
--- /dev/null
+++ b/sdk/Microsoft.Deployment.Compression.Cab.dll
Binary files differ
diff --git a/sdk/Microsoft.Deployment.Compression.Cab.xml b/sdk/Microsoft.Deployment.Compression.Cab.xml
new file mode 100644
index 0000000..2fbcdb2
--- /dev/null
+++ b/sdk/Microsoft.Deployment.Compression.Cab.xml
@@ -0,0 +1,465 @@
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>Microsoft.Deployment.Compression.Cab</name>
+    </assembly>
+    <members>
+        <member name="M:Microsoft.Deployment.Compression.Cab.CabWorker.Dispose(System.Boolean)">
+            <summary>
+            Disposes of resources allocated by the cabinet engine.
+            </summary>
+            <param name="disposing">If true, the method has been called directly or indirectly by a user's code,
+            so managed and unmanaged resources will be disposed. If false, the method has been called by the 
+            runtime from inside the finalizer, and only unmanaged resources will be disposed.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Cab.CabPacker.Dispose(System.Boolean)">
+            <summary>
+            Disposes of resources allocated by the cabinet engine.
+            </summary>
+            <param name="disposing">If true, the method has been called directly or indirectly by a user's code,
+            so managed and unmanaged resources will be disposed. If false, the method has been called by the 
+            runtime from inside the finalizer, and only unmanaged resources will be disposed.</param>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.Cab.CabEngine">
+            <summary>
+            Engine capable of packing and unpacking archives in the cabinet format.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Cab.CabEngine.#ctor">
+            <summary>
+            Creates a new instance of the cabinet engine.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Cab.CabEngine.Dispose(System.Boolean)">
+            <summary>
+            Disposes of resources allocated by the cabinet engine.
+            </summary>
+            <param name="disposing">If true, the method has been called directly
+            or indirectly by a user's code, so managed and unmanaged resources
+            will be disposed. If false, the method has been called by the runtime
+            from inside the finalizer, and only unmanaged resources will be
+            disposed.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Cab.CabEngine.Pack(Microsoft.Deployment.Compression.IPackStreamContext,System.Collections.Generic.IEnumerable{System.String},System.Int64)">
+            <summary>
+            Creates a cabinet or chain of cabinets.
+            </summary>
+            <param name="streamContext">A context interface to handle opening
+            and closing of cabinet and file streams.</param>
+            <param name="files">The paths of the files in the archive (not
+            external file paths).</param>
+            <param name="maxArchiveSize">The maximum number of bytes for one
+            cabinet before the contents are chained to the next cabinet, or zero
+            for unlimited cabinet size.</param>
+            <exception cref="T:Microsoft.Deployment.Compression.ArchiveException">The cabinet could not be
+            created.</exception>
+            <remarks>
+            The stream context implementation may provide a mapping from the
+            file paths within the cabinet to the external file paths.
+            <para>Smaller folder sizes can make it more efficient to extract
+            individual files out of large cabinet packages.</para>
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Cab.CabEngine.IsArchive(System.IO.Stream)">
+            <summary>
+            Checks whether a Stream begins with a header that indicates
+            it is a valid cabinet file.
+            </summary>
+            <param name="stream">Stream for reading the cabinet file.</param>
+            <returns>True if the stream is a valid cabinet file
+            (with no offset); false otherwise.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Cab.CabEngine.GetFileInfo(Microsoft.Deployment.Compression.IUnpackStreamContext,System.Predicate{System.String})">
+            <summary>
+            Gets information about files in a cabinet or cabinet chain.
+            </summary>
+            <param name="streamContext">A context interface to handle opening
+            and closing of cabinet and file streams.</param>
+            <param name="fileFilter">A predicate that can determine
+            which files to process, optional.</param>
+            <returns>Information about files in the cabinet stream.</returns>
+            <exception cref="T:Microsoft.Deployment.Compression.ArchiveException">The cabinet provided
+            by the stream context is not valid.</exception>
+            <remarks>
+            The <paramref name="fileFilter"/> predicate takes an internal file
+            path and returns true to include the file or false to exclude it.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Cab.CabEngine.Unpack(Microsoft.Deployment.Compression.IUnpackStreamContext,System.Predicate{System.String})">
+            <summary>
+            Extracts files from a cabinet or cabinet chain.
+            </summary>
+            <param name="streamContext">A context interface to handle opening
+            and closing of cabinet and file streams.</param>
+            <param name="fileFilter">An optional predicate that can determine
+            which files to process.</param>
+            <exception cref="T:Microsoft.Deployment.Compression.ArchiveException">The cabinet provided
+            by the stream context is not valid.</exception>
+            <remarks>
+            The <paramref name="fileFilter"/> predicate takes an internal file
+            path and returns true to include the file or false to exclude it.
+            </remarks>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.Cab.CabException">
+            <summary>
+            Exception class for cabinet operations.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Cab.CabException.#ctor(System.String,System.Exception)">
+            <summary>
+            Creates a new CabException with a specified error message and a reference to the
+            inner exception that is the cause of this exception.
+            </summary>
+            <param name="message">The message that describes the error.</param>
+            <param name="innerException">The exception that is the cause of the current exception. If the
+            innerException parameter is not a null reference (Nothing in Visual Basic), the current exception
+            is raised in a catch block that handles the inner exception.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Cab.CabException.#ctor(System.String)">
+            <summary>
+            Creates a new CabException with a specified error message.
+            </summary>
+            <param name="message">The message that describes the error.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Cab.CabException.#ctor">
+            <summary>
+            Creates a new CabException.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Cab.CabException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Initializes a new instance of the CabException class with serialized data.
+            </summary>
+            <param name="info">The SerializationInfo that holds the serialized object data about the exception being thrown.</param>
+            <param name="context">The StreamingContext that contains contextual information about the source or destination.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Cab.CabException.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Sets the SerializationInfo with information about the exception.
+            </summary>
+            <param name="info">The SerializationInfo that holds the serialized object data about the exception being thrown.</param>
+            <param name="context">The StreamingContext that contains contextual information about the source or destination.</param>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.Cab.CabException.Error">
+            <summary>
+            Gets the FCI or FDI cabinet engine error number.
+            </summary>
+            <value>A cabinet engine error number, or 0 if the exception was
+            not related to a cabinet engine error number.</value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.Cab.CabException.ErrorCode">
+            <summary>
+            Gets the Win32 error code.
+            </summary>
+            <value>A Win32 error code, or 0 if the exception was
+            not related to a Win32 error.</value>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Cab.CabUnpacker.Dispose(System.Boolean)">
+            <summary>
+            Disposes of resources allocated by the cabinet engine.
+            </summary>
+            <param name="disposing">If true, the method has been called directly or indirectly by a user's code,
+            so managed and unmanaged resources will be disposed. If false, the method has been called by the 
+            runtime from inside the finalizer, and only unmanaged resources will be disposed.</param>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.Cab.CabFileInfo">
+            <summary>
+            Object representing a compressed file within a cabinet package; provides operations for getting
+            the file properties and extracting the file.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Cab.CabFileInfo.#ctor(Microsoft.Deployment.Compression.Cab.CabInfo,System.String)">
+            <summary>
+            Creates a new CabinetFileInfo object representing a file within a cabinet in a specified path.
+            </summary>
+            <param name="cabinetInfo">An object representing the cabinet containing the file.</param>
+            <param name="filePath">The path to the file within the cabinet. Usually, this is a simple file
+            name, but if the cabinet contains a directory structure this may include the directory.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Cab.CabFileInfo.#ctor(System.String,System.Int32,System.Int32,System.IO.FileAttributes,System.DateTime,System.Int64)">
+            <summary>
+            Creates a new CabinetFileInfo object with all parameters specified,
+            used internally when reading the metadata out of a cab.
+            </summary>
+            <param name="filePath">The internal path and name of the file in the cab.</param>
+            <param name="cabFolder">The folder number containing the file.</param>
+            <param name="cabNumber">The cabinet number where the file starts.</param>
+            <param name="attributes">The stored attributes of the file.</param>
+            <param name="lastWriteTime">The stored last write time of the file.</param>
+            <param name="length">The uncompressed size of the file.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Cab.CabFileInfo.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Initializes a new instance of the CabinetFileInfo class with serialized data.
+            </summary>
+            <param name="info">The SerializationInfo that holds the serialized object data about the exception being thrown.</param>
+            <param name="context">The StreamingContext that contains contextual information about the source or destination.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Cab.CabFileInfo.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Sets the SerializationInfo with information about the archive.
+            </summary>
+            <param name="info">The SerializationInfo that holds the serialized object data.</param>
+            <param name="context">The StreamingContext that contains contextual information
+            about the source or destination.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Cab.CabFileInfo.Refresh(Microsoft.Deployment.Compression.ArchiveFileInfo)">
+            <summary>
+            Refreshes the information in this object with new data retrieved
+            from an archive.
+            </summary>
+            <param name="newFileInfo">Fresh instance for the same file just
+            read from the archive.</param>
+            <remarks>
+            This implementation refreshes the <see cref="P:Microsoft.Deployment.Compression.Cab.CabFileInfo.CabinetFolderNumber"/>.
+            </remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.Cab.CabFileInfo.Cabinet">
+            <summary>
+            Gets or sets the cabinet that contains this file.
+            </summary>
+            <value>
+            The CabinetInfo instance that retrieved this file information -- this
+            may be null if the CabinetFileInfo object was returned directly from a
+            stream.
+            </value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.Cab.CabFileInfo.CabinetName">
+            <summary>
+            Gets the full path of the cabinet that contains this file.
+            </summary>
+            <value>The full path of the cabinet that contains this file.</value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.Cab.CabFileInfo.CabinetFolderNumber">
+            <summary>
+            Gets the number of the folder containing this file.
+            </summary>
+            <value>The number of the cabinet folder containing this file.</value>
+            <remarks>A single folder or the first folder of a cabinet
+            (or chain of cabinets) is numbered 0.</remarks>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.Cab.CabInfo">
+            <summary>
+            Object representing a cabinet file on disk; provides access to
+            file-based operations on the cabinet file.
+            </summary>
+            <remarks>
+            Generally, the methods on this class are much easier to use than the
+            stream-based interfaces provided by the <see cref="T:Microsoft.Deployment.Compression.Cab.CabEngine"/> class.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Cab.CabInfo.#ctor(System.String)">
+            <summary>
+            Creates a new CabinetInfo object representing a cabinet file in a specified path.
+            </summary>
+            <param name="path">The path to the cabinet file. When creating a cabinet file, this file does not
+            necessarily exist yet.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Cab.CabInfo.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Initializes a new instance of the CabinetInfo class with serialized data.
+            </summary>
+            <param name="info">The SerializationInfo that holds the serialized object data about the exception being thrown.</param>
+            <param name="context">The StreamingContext that contains contextual information about the source or destination.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Cab.CabInfo.CreateCompressionEngine">
+            <summary>
+            Creates a compression engine that does the low-level work for
+            this object.
+            </summary>
+            <returns>A new <see cref="T:Microsoft.Deployment.Compression.Cab.CabEngine"/> instance.</returns>
+            <remarks>
+            Each instance will be <see cref="M:Microsoft.Deployment.Compression.CompressionEngine.Dispose"/>d
+            immediately after use.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Cab.CabInfo.GetFiles">
+            <summary>
+            Gets information about the files contained in the archive.
+            </summary>
+            <returns>A list of <see cref="T:Microsoft.Deployment.Compression.Cab.CabFileInfo"/> objects, each
+            containing information about a file in the archive.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Cab.CabInfo.GetFiles(System.String)">
+            <summary>
+            Gets information about the certain files contained in the archive file.
+            </summary>
+            <param name="searchPattern">The search string, such as
+            "*.txt".</param>
+            <returns>A list of <see cref="T:Microsoft.Deployment.Compression.Cab.CabFileInfo"/> objects, each containing
+            information about a file in the archive.</returns>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.Cab.HandleManager`1">
+            <summary>
+            Generic class for managing allocations of integer handles
+            for objects of a certain type.
+            </summary>
+            <typeparam name="T">The type of objects the handles refer to.</typeparam>
+        </member>
+        <member name="F:Microsoft.Deployment.Compression.Cab.HandleManager`1.handles">
+            <summary>
+            Auto-resizing list of objects for which handles have been allocated.
+            Each handle is just an index into this list. When a handle is freed,
+            the list item at that index is set to null.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Cab.HandleManager`1.#ctor">
+            <summary>
+            Creates a new HandleManager instance.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Cab.HandleManager`1.AllocHandle(`0)">
+            <summary>
+            Allocates a new handle for an object.
+            </summary>
+            <param name="obj">Object that the handle will refer to.</param>
+            <returns>New handle that can be later used to retrieve the object.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Cab.HandleManager`1.FreeHandle(System.Int32)">
+            <summary>
+            Frees a handle that was previously allocated. Afterward the handle
+            will be invalid and the object it referred to can no longer retrieved.
+            </summary>
+            <param name="handle">Handle to be freed.</param>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.Cab.HandleManager`1.Item(System.Int32)">
+            <summary>
+            Gets the object of a handle, or null if the handle is invalid.
+            </summary>
+            <param name="handle">The integer handle previously allocated
+            for the desired object.</param>
+            <returns>The object for which the handle was allocated.</returns>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.Cab.NativeMethods">
+            <summary>
+            Native DllImport methods and related structures and constants used for
+            cabinet creation and extraction via cabinet.dll.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.Cab.NativeMethods.FCI">
+            <summary>
+            A direct import of constants, enums, structures, delegates, and functions from fci.h.
+            Refer to comments in fci.h for documentation.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.Cab.NativeMethods.FCI.ERROR">
+            <summary>
+            Error codes that can be returned by FCI.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.Cab.NativeMethods.FCI.TCOMP">
+            <summary>
+            FCI compression algorithm types and parameters.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.Cab.NativeMethods.FCI.STATUS">
+            <summary>
+            Reason for FCI status callback.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.Cab.NativeMethods.FCI.CCAB">
+            <summary>
+            Cabinet information structure used for FCI initialization and GetNextCabinet callback.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.Cab.NativeMethods.FCI.Handle">
+            <summary>
+            Ensures that the FCI handle is safely released.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Cab.NativeMethods.FCI.Handle.#ctor">
+            <summary>
+            Creates a new unintialized handle. The handle will be initialized
+            when it is marshalled back from native code.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Cab.NativeMethods.FCI.Handle.ReleaseHandle">
+            <summary>
+            Releases the handle by calling FDIDestroy().
+            </summary>
+            <returns>True if the release succeeded.</returns>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.Cab.NativeMethods.FCI.Handle.IsInvalid">
+            <summary>
+            Checks if the handle is invalid. An FCI handle is invalid when it is zero.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.Cab.NativeMethods.FDI">
+            <summary>
+            A direct import of constants, enums, structures, delegates, and functions from fdi.h.
+            Refer to comments in fdi.h for documentation.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.Cab.NativeMethods.FDI.ERROR">
+            <summary>
+            Error codes that can be returned by FDI.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.Cab.NativeMethods.FDI.NOTIFICATIONTYPE">
+            <summary>
+            Type of notification message for the FDI Notify callback.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.Cab.NativeMethods.FDI.CABINFO">
+            <summary>
+            Cabinet information structure filled in by FDI IsCabinet.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.Cab.NativeMethods.FDI.NOTIFICATION">
+            <summary>
+            Cabinet notification details passed to the FDI Notify callback.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.Cab.NativeMethods.FDI.Handle">
+            <summary>
+            Ensures that the FDI handle is safely released.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Cab.NativeMethods.FDI.Handle.#ctor">
+            <summary>
+            Creates a new unintialized handle. The handle will be initialized
+            when it is marshalled back from native code.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Cab.NativeMethods.FDI.Handle.ReleaseHandle">
+            <summary>
+            Releases the handle by calling FDIDestroy().
+            </summary>
+            <returns>True if the release succeeded.</returns>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.Cab.NativeMethods.FDI.Handle.IsInvalid">
+            <summary>
+            Checks if the handle is invalid. An FDI handle is invalid when it is zero.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.Cab.NativeMethods.ERF">
+            <summary>
+            Error info structure for FCI and FDI.
+            </summary>
+            <remarks>Before being passed to FCI or FDI, this structure is
+            pinned in memory via a GCHandle. The pinning is necessary
+            to be able to read the results, since the ERF structure doesn't
+            get marshalled back out after an error.</remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Cab.NativeMethods.ERF.Clear">
+            <summary>
+            Clears the error information.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.Cab.NativeMethods.ERF.Oper">
+            <summary>
+            Gets or sets the cabinet error code.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.Cab.NativeMethods.ERF.Type">
+            <summary>
+            Gets or sets the Win32 error code.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.Cab.NativeMethods.ERF.Error">
+            <summary>
+            GCHandle doesn't like the bool type, so use an int underneath.
+            </summary>
+        </member>
+    </members>
+</doc>
diff --git a/sdk/Microsoft.Deployment.Compression.Zip.dll b/sdk/Microsoft.Deployment.Compression.Zip.dll
new file mode 100755
index 0000000..98f3c44
--- /dev/null
+++ b/sdk/Microsoft.Deployment.Compression.Zip.dll
Binary files differ
diff --git a/sdk/Microsoft.Deployment.Compression.Zip.xml b/sdk/Microsoft.Deployment.Compression.Zip.xml
new file mode 100644
index 0000000..214d229
--- /dev/null
+++ b/sdk/Microsoft.Deployment.Compression.Zip.xml
@@ -0,0 +1,514 @@
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>Microsoft.Deployment.Compression.Zip</name>
+    </assembly>
+    <members>
+        <member name="T:Microsoft.Deployment.Compression.Zip.ConcatStream">
+            <summary>
+            Used to trick a DeflateStream into reading from or writing to
+            a series of (chunked) streams instead of a single steream.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.Zip.CrcStream">
+            <summary>
+            Wraps a source stream and calcaluates a CRC over all bytes that are read or written.
+            </summary>
+            <remarks>
+            The CRC algorithm matches that used in the standard ZIP file format.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.CrcStream.#ctor(System.IO.Stream)">
+            <summary>
+            Creates a new CrcStream instance from a source stream.
+            </summary>
+            <param name="source">Underlying stream where bytes will be read from or written to.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.CrcStream.Seek(System.Int64,System.IO.SeekOrigin)">
+            <summary>
+            Sets the position within the source stream.
+            </summary>
+            <param name="offset">A byte offset relative to the origin parameter.</param>
+            <param name="origin">A value of type SeekOrigin indicating
+            the reference point used to obtain the new position.</param>
+            <returns>The new position within the source stream.</returns>
+            <remarks>
+            Note the CRC is only calculated over bytes that are actually read or
+            written, so any bytes skipped by seeking will not contribute to the CRC.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.CrcStream.SetLength(System.Int64)">
+            <summary>
+            Sets the length of the source stream.
+            </summary>
+            <param name="value">The desired length of the
+            stream in bytes.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.CrcStream.Read(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Reads a sequence of bytes from the source stream and advances
+            the position within the stream by the number of bytes read.
+            </summary>
+            <param name="buffer">An array of bytes. When this method returns, the buffer
+            contains the specified byte array with the values between offset and
+            (offset + count - 1) replaced by the bytes read from the current source.</param>
+            <param name="offset">The zero-based byte offset in buffer at which to begin
+            storing the data read from the current stream.</param>
+            <param name="count">The maximum number of bytes to be read from the current stream.</param>
+            <returns>The total number of bytes read into the buffer. This can be less
+            than the number of bytes requested if that many bytes are not currently available,
+            or zero (0) if the end of the stream has been reached.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.CrcStream.Write(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Writes a sequence of bytes to the source stream and advances the
+            current position within this stream by the number of bytes written.
+            </summary>
+            <param name="buffer">An array of bytes. This method copies count
+            bytes from buffer to the current stream.</param>
+            <param name="offset">The zero-based byte offset in buffer at which
+            to begin copying bytes to the current stream.</param>
+            <param name="count">The number of bytes to be written to the
+            current stream.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.CrcStream.Flush">
+            <summary>
+            Flushes the source stream.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.CrcStream.Close">
+            <summary>
+            Closes the underlying stream.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.CrcStream.UpdateCrc(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Updates the CRC with a range of bytes that were read or written.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.CrcStream.MakeCrcTable">
+            <summary>
+            Computes a table that speeds up calculation of the CRC.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.CrcStream.Reflect(System.UInt32,System.Int32)">
+            <summary>
+            Reflects the ordering of certain number of bits. For exmample when reflecting
+            one byte, bit one is swapped with bit eight, bit two with bit seven, etc.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.Zip.CrcStream.Crc">
+            <summary>
+            Gets the current CRC over all bytes that have been read or written
+            since this instance was created.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.Zip.CrcStream.Source">
+            <summary>
+            Gets the underlying stream that this stream reads from or writes to.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.Zip.CrcStream.CanRead">
+            <summary>
+            Gets a value indicating whether the source stream supports reading.
+            </summary>
+            <value>true if the stream supports reading; otherwise, false.</value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.Zip.CrcStream.CanWrite">
+            <summary>
+            Gets a value indicating whether the source stream supports writing.
+            </summary>
+            <value>true if the stream supports writing; otherwise, false.</value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.Zip.CrcStream.CanSeek">
+            <summary>
+            Gets a value indicating whether the source stream supports seeking.
+            </summary>
+            <value>true if the stream supports seeking; otherwise, false.</value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.Zip.CrcStream.Length">
+            <summary>
+            Gets the length of the source stream.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.Zip.CrcStream.Position">
+            <summary>
+            Gets or sets the position of the source stream.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.Zip.ZipCompressionMethod">
+            <summary>
+            Identifies the compression method or &quot;algorithm&quot;
+            used for a single file within a zip archive.
+            </summary>
+            <remarks>
+            Proprietary zip implementations may define additional compression
+            methods outside of those included here.
+            </remarks>
+        </member>
+        <member name="F:Microsoft.Deployment.Compression.Zip.ZipCompressionMethod.Store">
+            <summary>
+            The file is stored (no compression)
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.Compression.Zip.ZipCompressionMethod.Shrink">
+            <summary>
+            The file is Shrunk
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.Compression.Zip.ZipCompressionMethod.Reduce1">
+            <summary>
+            The file is Reduced with compression factor 1
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.Compression.Zip.ZipCompressionMethod.Reduce2">
+            <summary>
+            The file is Reduced with compression factor 2
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.Compression.Zip.ZipCompressionMethod.Reduce3">
+            <summary>
+            The file is Reduced with compression factor 3
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.Compression.Zip.ZipCompressionMethod.Reduce4">
+            <summary>
+            The file is Reduced with compression factor 4
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.Compression.Zip.ZipCompressionMethod.Implode">
+            <summary>
+            The file is Imploded
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.Compression.Zip.ZipCompressionMethod.Deflate">
+            <summary>
+            The file is Deflated;
+            the most common and widely-compatible form of zip compression.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.Compression.Zip.ZipCompressionMethod.Deflate64">
+            <summary>
+            The file is Deflated using the enhanced Deflate64 method.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.Compression.Zip.ZipCompressionMethod.BZip2">
+            <summary>
+            The file is compressed using the BZIP2 algorithm.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.Compression.Zip.ZipCompressionMethod.Lzma">
+            <summary>
+            The file is compressed using the LZMA algorithm.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.Compression.Zip.ZipCompressionMethod.Ppmd">
+            <summary>
+            The file is compressed using the PPMd algorithm.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.Zip.ZipException">
+            <summary>
+            Exception class for zip operations.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.ZipException.#ctor(System.String,System.Exception)">
+            <summary>
+            Creates a new ZipException with a specified error message and a reference to the
+            inner exception that is the cause of this exception.
+            </summary>
+            <param name="message">The message that describes the error.</param>
+            <param name="innerException">The exception that is the cause of the current exception. If the
+            innerException parameter is not a null reference (Nothing in Visual Basic), the current exception
+            is raised in a catch block that handles the inner exception.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.ZipException.#ctor(System.String)">
+            <summary>
+            Creates a new ZipException with a specified error message.
+            </summary>
+            <param name="message">The message that describes the error.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.ZipException.#ctor">
+            <summary>
+            Creates a new ZipException.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.ZipException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Initializes a new instance of the ZipException class with serialized data.
+            </summary>
+            <param name="info">The SerializationInfo that holds the serialized object data about the exception being thrown.</param>
+            <param name="context">The StreamingContext that contains contextual information about the source or destination.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.ZipException.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Sets the SerializationInfo with information about the exception.
+            </summary>
+            <param name="info">The SerializationInfo that holds the serialized object data about the exception being thrown.</param>
+            <param name="context">The StreamingContext that contains contextual information about the source or destination.</param>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.Zip.ZipEngine">
+            <summary>
+            Engine capable of packing and unpacking archives in the zip format.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.ZipEngine.RegisterCompressionStreamCreator(Microsoft.Deployment.Compression.Zip.ZipCompressionMethod,System.IO.Compression.CompressionMode,System.Converter{System.IO.Stream,System.IO.Stream})">
+            <summary>
+            Registers a delegate that can create a warpper stream for
+            compressing or uncompressing the data of a source stream.
+            </summary>
+            <param name="compressionMethod">Compression method being registered.</param>
+            <param name="compressionMode">Indicates registration for ether
+            compress or decompress mode.</param>
+            <param name="creator">Delegate being registered.</param>
+            <remarks>
+            For compression, the delegate accepts a stream that writes to the archive
+            and returns a wrapper stream that compresses bytes as they are written.
+            For decompression, the delegate accepts a stream that reads from the archive
+            and returns a wrapper stream that decompresses bytes as they are read.
+            This wrapper stream model follows the design used by
+            System.IO.Compression.DeflateStream, and indeed that class is used
+            to implement the Deflate compression method by default.
+            <para>To unregister a delegate, call this method again and pass
+            null for the delegate parameter.</para>
+            </remarks>
+            <example>
+            When the ZipEngine class is initialized, the Deflate compression method
+            is automatically registered like this:
+            <code>
+                   ZipEngine.RegisterCompressionStreamCreator(
+                       ZipCompressionMethod.Deflate,
+                       CompressionMode.Compress,
+                       delegate(Stream stream) {
+                           return new DeflateStream(stream, CompressionMode.Compress, true);
+                       });
+                   ZipEngine.RegisterCompressionStreamCreator(
+                       ZipCompressionMethod.Deflate,
+                       CompressionMode.Decompress,
+                       delegate(Stream stream) {
+                           return new DeflateStream(stream, CompressionMode.Decompress, true);
+                       });
+            </code></example>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.ZipEngine.#ctor">
+            <summary>
+            Creates a new instance of the zip engine.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.ZipEngine.IsArchive(System.IO.Stream)">
+            <summary>
+            Checks whether a Stream begins with a header that indicates
+            it is a valid archive file.
+            </summary>
+            <param name="stream">Stream for reading the archive file.</param>
+            <returns>True if the stream is a valid zip archive
+            (with no offset); false otherwise.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.ZipEngine.FindArchiveOffset(System.IO.Stream)">
+            <summary>
+            Gets the offset of an archive that is positioned 0 or more bytes
+            from the start of the Stream.
+            </summary>
+            <param name="stream">A stream for reading the archive.</param>
+            <returns>The offset in bytes of the archive,
+            or -1 if no archive is found in the Stream.</returns>
+            <remarks>The archive must begin on a 4-byte boundary.</remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.ZipEngine.GetFileInfo(Microsoft.Deployment.Compression.IUnpackStreamContext,System.Predicate{System.String})">
+            <summary>
+            Gets information about files in a zip archive or archive chain.
+            </summary>
+            <param name="streamContext">A context interface to handle opening
+            and closing of archive and file streams.</param>
+            <param name="fileFilter">A predicate that can determine
+            which files to process, optional.</param>
+            <returns>Information about files in the archive stream.</returns>
+            <exception cref="T:Microsoft.Deployment.Compression.ArchiveException">The archive provided
+            by the stream context is not valid.</exception>
+            <remarks>
+            The <paramref name="fileFilter"/> predicate takes an internal file
+            path and returns true to include the file or false to exclude it.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.ZipEngine.GetCentralDirectory(Microsoft.Deployment.Compression.IUnpackStreamContext)">
+            <summary>
+            Reads all the file headers from the central directory in the main archive.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.ZipEngine.GetEOCD(Microsoft.Deployment.Compression.IUnpackStreamContext,System.IO.Stream)">
+            <summary>
+            Locates and reads the end of central directory record near the
+            end of the archive.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.ZipEngine.Pack(Microsoft.Deployment.Compression.IPackStreamContext,System.Collections.Generic.IEnumerable{System.String},System.Int64)">
+            <summary>
+            Creates a zip archive or chain of zip archives.
+            </summary>
+            <param name="streamContext">A context interface to handle opening
+            and closing of archive and file streams.</param>
+            <param name="files">An array of file lists.  Each list is
+            compressed into one stream in the archive.</param>
+            <param name="maxArchiveSize">The maximum number of bytes for one archive
+            before the contents are chained to the next archive, or zero for unlimited
+            archive size.</param>
+            <exception cref="T:Microsoft.Deployment.Compression.ArchiveException">The archive could not be
+            created.</exception>
+            <remarks>
+            The stream context implementation may provide a mapping from the file
+            paths within the archive to the external file paths.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.ZipEngine.CheckArchiveWriteStream(Microsoft.Deployment.Compression.IPackStreamContext,System.Int64,System.Int64,System.IO.Stream@)">
+            <summary>
+            Moves to the next archive in the sequence if necessary.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.ZipEngine.PackOneFile(Microsoft.Deployment.Compression.IPackStreamContext,System.String,System.Int64,System.Boolean,System.IO.Stream@)">
+            <summary>
+            Adds one file to a zip archive in the process of being created.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.ZipEngine.PackFileBytes(Microsoft.Deployment.Compression.IPackStreamContext,System.IO.Stream,System.Int64,System.Converter{System.IO.Stream,System.IO.Stream},System.IO.Stream@,System.UInt32@)">
+            <summary>
+            Writes compressed bytes of one file to the archive,
+            keeping track of the CRC and number of bytes written.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.ZipEngine.Unpack(Microsoft.Deployment.Compression.IUnpackStreamContext,System.Predicate{System.String})">
+            <summary>
+            Extracts files from a zip archive or archive chain.
+            </summary>
+            <param name="streamContext">A context interface to handle opening
+            and closing of archive and file streams.</param>
+            <param name="fileFilter">An optional predicate that can determine
+            which files to process.</param>
+            <exception cref="T:Microsoft.Deployment.Compression.ArchiveException">The archive provided
+            by the stream context is not valid.</exception>
+            <remarks>
+            The <paramref name="fileFilter"/> predicate takes an internal file
+            path and returns true to include the file or false to exclude it.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.ZipEngine.UnpackOneFile(Microsoft.Deployment.Compression.IUnpackStreamContext,Microsoft.Deployment.Compression.Zip.ZipFileHeader,System.IO.Stream@)">
+            <summary>
+            Unpacks a single file from an archive or archive chain.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.ZipEngine.UnpackFileBytes(Microsoft.Deployment.Compression.IUnpackStreamContext,System.String,System.Int64,System.Int64,System.UInt32,System.IO.Stream,System.Converter{System.IO.Stream,System.IO.Stream},System.IO.Stream@)">
+            <summary>
+            Decompresses bytes for one file from an archive or archive chain,
+            checking the crc at the end.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.Zip.ZipEngine.ArchiveComment">
+            <summary>
+            Gets the comment from the last-examined archive,
+            or sets the comment to be added to any created archives.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.Zip.ZipFileInfo">
+            <summary>
+            Object representing a compressed file within a zip package; provides operations for getting
+            the file properties and extracting the file.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.ZipFileInfo.#ctor(Microsoft.Deployment.Compression.Zip.ZipInfo,System.String)">
+            <summary>
+            Creates a new ZipFileInfo object representing a file within a zip in a specified path.
+            </summary>
+            <param name="zipInfo">An object representing the zip archive containing the file.</param>
+            <param name="filePath">The path to the file within the zip archive. Usually, this is a simple file
+            name, but if the zip archive contains a directory structure this may include the directory.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.ZipFileInfo.#ctor(System.String,System.Int32,System.IO.FileAttributes,System.DateTime,System.Int64,System.Int64,Microsoft.Deployment.Compression.Zip.ZipCompressionMethod)">
+            <summary>
+            Creates a new ZipFileInfo object with all parameters specified,
+            used internally when reading the metadata out of a zip archive.
+            </summary>
+            <param name="filePath">The internal path and name of the file in the zip archive.</param>
+            <param name="zipNumber">The zip archive number where the file starts.</param>
+            <param name="attributes">The stored attributes of the file.</param>
+            <param name="lastWriteTime">The stored last write time of the file.</param>
+            <param name="length">The uncompressed size of the file.</param>
+            <param name="compressedLength">The compressed size of the file.</param>
+            <param name="compressionMethod">Compression algorithm used for this file.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.ZipFileInfo.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Initializes a new instance of the ZipFileInfo class with serialized data.
+            </summary>
+            <param name="info">The SerializationInfo that holds the serialized object data about the exception being thrown.</param>
+            <param name="context">The StreamingContext that contains contextual information about the source or destination.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.ZipFileInfo.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Sets the SerializationInfo with information about the archive.
+            </summary>
+            <param name="info">The SerializationInfo that holds the serialized object data.</param>
+            <param name="context">The StreamingContext that contains contextual information
+            about the source or destination.</param>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.Zip.ZipFileInfo.CompressedLength">
+            <summary>
+            Gets the compressed size of the file in bytes.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.Zip.ZipFileInfo.CompressionMethod">
+            <summary>
+            Gets the method used to compress this file.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.Zip.ZipInfo">
+            <summary>
+            Object representing a zip file on disk; provides access to
+            file-based operations on the zip file.
+            </summary>
+            <remarks>
+            Generally, the methods on this class are much easier to use than the
+            stream-based interfaces provided by the <see cref="T:Microsoft.Deployment.Compression.Zip.ZipEngine"/> class.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.ZipInfo.#ctor(System.String)">
+            <summary>
+            Creates a new CabinetInfo object representing a zip file in a specified path.
+            </summary>
+            <param name="path">The path to the zip file. When creating a zip file, this file does not
+            necessarily exist yet.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.ZipInfo.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Initializes a new instance of the CabinetInfo class with serialized data.
+            </summary>
+            <param name="info">The SerializationInfo that holds the serialized object data about the exception being thrown.</param>
+            <param name="context">The StreamingContext that contains contextual information about the source or destination.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.ZipInfo.CreateCompressionEngine">
+            <summary>
+            Creates a compression engine that does the low-level work for
+            this object.
+            </summary>
+            <returns>A new <see cref="T:Microsoft.Deployment.Compression.Zip.ZipEngine"/> instance.</returns>
+            <remarks>
+            Each instance will be <see cref="M:Microsoft.Deployment.Compression.CompressionEngine.Dispose"/>d
+            immediately after use.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.ZipInfo.GetFiles">
+            <summary>
+            Gets information about the files contained in the archive.
+            </summary>
+            <returns>A list of <see cref="T:Microsoft.Deployment.Compression.Zip.ZipFileInfo"/> objects, each
+            containing information about a file in the archive.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.Zip.ZipInfo.GetFiles(System.String)">
+            <summary>
+            Gets information about the certain files contained in the archive file.
+            </summary>
+            <param name="searchPattern">The search string, such as
+            "*.txt".</param>
+            <returns>A list of <see cref="T:Microsoft.Deployment.Compression.Zip.ZipFileInfo"/> objects, each containing
+            information about a file in the archive.</returns>
+        </member>
+    </members>
+</doc>
diff --git a/sdk/Microsoft.Deployment.Compression.dll b/sdk/Microsoft.Deployment.Compression.dll
new file mode 100755
index 0000000..2eb5e3c
--- /dev/null
+++ b/sdk/Microsoft.Deployment.Compression.dll
Binary files differ
diff --git a/sdk/Microsoft.Deployment.Compression.xml b/sdk/Microsoft.Deployment.Compression.xml
new file mode 100644
index 0000000..259a9a5
--- /dev/null
+++ b/sdk/Microsoft.Deployment.Compression.xml
@@ -0,0 +1,1936 @@
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>Microsoft.Deployment.Compression</name>
+    </assembly>
+    <members>
+        <member name="T:Microsoft.Deployment.Compression.ArchiveException">
+            <summary>
+            Base exception class for compression operations. Compression libraries should
+            derive subclass exceptions with more specific error information relevent to the
+            file format.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveException.#ctor(System.String,System.Exception)">
+            <summary>
+            Creates a new ArchiveException with a specified error message and a reference to the
+            inner exception that is the cause of this exception.
+            </summary>
+            <param name="message">The message that describes the error.</param>
+            <param name="innerException">The exception that is the cause of the current exception. If the
+            innerException parameter is not a null reference (Nothing in Visual Basic), the current exception
+            is raised in a catch block that handles the inner exception.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveException.#ctor(System.String)">
+            <summary>
+            Creates a new ArchiveException with a specified error message.
+            </summary>
+            <param name="message">The message that describes the error.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveException.#ctor">
+            <summary>
+            Creates a new ArchiveException.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Initializes a new instance of the ArchiveException class with serialized data.
+            </summary>
+            <param name="info">The SerializationInfo that holds the serialized object data about the exception being thrown.</param>
+            <param name="context">The StreamingContext that contains contextual information about the source or destination.</param>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.ArchiveFileInfo">
+            <summary>
+            Abstract object representing a compressed file within an archive;
+            provides operations for getting the file properties and unpacking
+            the file.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveFileInfo.#ctor(Microsoft.Deployment.Compression.ArchiveInfo,System.String)">
+            <summary>
+            Creates a new ArchiveFileInfo object representing a file within
+            an archive in a specified path.
+            </summary>
+            <param name="archiveInfo">An object representing the archive
+            containing the file.</param>
+            <param name="filePath">The path to the file within the archive.
+            Usually, this is a simple file name, but if the archive contains
+            a directory structure this may include the directory.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveFileInfo.#ctor(System.String,System.Int32,System.IO.FileAttributes,System.DateTime,System.Int64)">
+            <summary>
+            Creates a new ArchiveFileInfo object with all parameters specified;
+            used by subclasses when reading the metadata out of an archive.
+            </summary>
+            <param name="filePath">The internal path and name of the file in
+            the archive.</param>
+            <param name="archiveNumber">The archive number where the file
+            starts.</param>
+            <param name="attributes">The stored attributes of the file.</param>
+            <param name="lastWriteTime">The stored last write time of the
+            file.</param>
+            <param name="length">The uncompressed size of the file.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveFileInfo.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Initializes a new instance of the ArchiveFileInfo class with
+            serialized data.
+            </summary>
+            <param name="info">The SerializationInfo that holds the serialized
+            object data about the exception being thrown.</param>
+            <param name="context">The StreamingContext that contains contextual
+            information about the source or destination.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveFileInfo.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Sets the SerializationInfo with information about the archive.
+            </summary>
+            <param name="info">The SerializationInfo that holds the serialized
+            object data.</param>
+            <param name="context">The StreamingContext that contains contextual
+            information about the source or destination.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveFileInfo.ToString">
+            <summary>
+            Gets the full path to the file.
+            </summary>
+            <returns>The same as <see cref="P:Microsoft.Deployment.Compression.ArchiveFileInfo.FullName"/></returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveFileInfo.Delete">
+            <summary>
+            Deletes the file. NOT SUPPORTED.
+            </summary>
+            <exception cref="T:System.NotSupportedException">Files cannot be deleted
+            from an existing archive.</exception>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveFileInfo.Refresh">
+            <summary>
+            Refreshes the attributes and other cached information about the file,
+            by re-reading the information from the archive.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveFileInfo.CopyTo(System.String)">
+            <summary>
+            Extracts the file.
+            </summary>
+            <param name="destFileName">The destination path where the file
+            will be extracted.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveFileInfo.CopyTo(System.String,System.Boolean)">
+            <summary>
+            Extracts the file, optionally overwriting any existing file.
+            </summary>
+            <param name="destFileName">The destination path where the file
+            will be extracted.</param>
+            <param name="overwrite">If true, <paramref name="destFileName"/>
+            will be overwritten if it exists.</param>
+            <exception cref="T:System.IO.IOException"><paramref name="overwrite"/> is false
+            and <paramref name="destFileName"/> exists.</exception>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveFileInfo.OpenRead">
+            <summary>
+            Opens the archive file for reading without actually extracting the
+            file to disk.
+            </summary>
+            <returns>
+            A stream for reading directly from the packed file. Like any stream
+            this should be closed/disposed as soon as it is no longer needed.
+            </returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveFileInfo.OpenText">
+            <summary>
+            Opens the archive file reading text with UTF-8 encoding without
+            actually extracting the file to disk.
+            </summary>
+            <returns>
+            A reader for reading text directly from the packed file. Like any reader
+            this should be closed/disposed as soon as it is no longer needed.
+            </returns>
+            <remarks>
+            To open an archived text file with different encoding, use the
+            <see cref="M:Microsoft.Deployment.Compression.ArchiveFileInfo.OpenRead"/> method and pass the returned stream to one of
+            the <see cref="T:System.IO.StreamReader"/> constructor overloads.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveFileInfo.Refresh(Microsoft.Deployment.Compression.ArchiveFileInfo)">
+            <summary>
+            Refreshes the information in this object with new data retrieved
+            from an archive.
+            </summary>
+            <param name="newFileInfo">Fresh instance for the same file just
+            read from the archive.</param>
+            <remarks>
+            Subclasses may override this method to refresh sublcass fields.
+            However they should always call the base implementation first.
+            </remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.ArchiveFileInfo.Name">
+            <summary>
+            Gets the name of the file.
+            </summary>
+            <value>The name of the file, not including any path.</value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.ArchiveFileInfo.Path">
+            <summary>
+            Gets the internal path of the file in the archive.
+            </summary>
+            <value>The internal path of the file in the archive, not including
+            the file name.</value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.ArchiveFileInfo.FullName">
+            <summary>
+            Gets the full path to the file.
+            </summary>
+            <value>The full path to the file, including the full path to the
+            archive, the internal path in the archive, and the file name.</value>
+            <remarks>
+            For example, the path <c>"C:\archive.cab\file.txt"</c> refers to
+            a file "file.txt" inside the archive "archive.cab".
+            </remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.ArchiveFileInfo.Archive">
+            <summary>
+            Gets or sets the archive that contains this file.
+            </summary>
+            <value>
+            The ArchiveInfo instance that retrieved this file information -- this
+            may be null if the ArchiveFileInfo object was returned directly from
+            a stream.
+            </value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.ArchiveFileInfo.ArchiveName">
+            <summary>
+            Gets the full path of the archive that contains this file.
+            </summary>
+            <value>The full path of the archive that contains this file.</value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.ArchiveFileInfo.ArchiveNumber">
+            <summary>
+            Gets the number of the archive where this file starts.
+            </summary>
+            <value>The number of the archive where this file starts.</value>
+            <remarks>A single archive or the first archive in a chain is
+            numbered 0.</remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.ArchiveFileInfo.Exists">
+            <summary>
+            Checks if the file exists within the archive.
+            </summary>
+            <value>True if the file exists, false otherwise.</value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.ArchiveFileInfo.Length">
+            <summary>
+            Gets the uncompressed size of the file.
+            </summary>
+            <value>The uncompressed size of the file in bytes.</value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.ArchiveFileInfo.Attributes">
+            <summary>
+            Gets the attributes of the file.
+            </summary>
+            <value>The attributes of the file as stored in the archive.</value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.ArchiveFileInfo.LastWriteTime">
+            <summary>
+            Gets the last modification time of the file.
+            </summary>
+            <value>The last modification time of the file as stored in the
+            archive.</value>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.ArchiveInfo">
+            <summary>
+            Abstract object representing a compressed archive on disk;
+            provides access to file-based operations on the archive.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveInfo.#ctor(System.String)">
+            <summary>
+            Creates a new ArchiveInfo object representing an archive in a
+            specified path.
+            </summary>
+            <param name="path">The path to the archive. When creating an archive,
+            this file does not necessarily exist yet.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveInfo.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Initializes a new instance of the ArchiveInfo class with serialized data.
+            </summary>
+            <param name="info">The SerializationInfo that holds the serialized object
+            data about the exception being thrown.</param>
+            <param name="context">The StreamingContext that contains contextual
+            information about the source or destination.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveInfo.ToString">
+            <summary>
+            Gets the full path of the archive.
+            </summary>
+            <returns>The full path of the archive.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveInfo.Delete">
+            <summary>
+            Deletes the archive.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveInfo.CopyTo(System.String)">
+            <summary>
+            Copies an existing archive to another location.
+            </summary>
+            <param name="destFileName">The destination file path.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveInfo.CopyTo(System.String,System.Boolean)">
+            <summary>
+            Copies an existing archive to another location, optionally
+            overwriting the destination file.
+            </summary>
+            <param name="destFileName">The destination file path.</param>
+            <param name="overwrite">If true, the destination file will be
+            overwritten if it exists.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveInfo.MoveTo(System.String)">
+            <summary>
+            Moves an existing archive to another location.
+            </summary>
+            <param name="destFileName">The destination file path.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveInfo.IsValid">
+            <summary>
+            Checks if the archive contains a valid archive header.
+            </summary>
+            <returns>True if the file is a valid archive; false otherwise.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveInfo.GetFiles">
+            <summary>
+            Gets information about the files contained in the archive.
+            </summary>
+            <returns>A list of <see cref="T:Microsoft.Deployment.Compression.ArchiveFileInfo"/> objects, each
+            containing information about a file in the archive.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveInfo.GetFiles(System.String)">
+            <summary>
+            Gets information about the certain files contained in the archive file.
+            </summary>
+            <param name="searchPattern">The search string, such as
+            "*.txt".</param>
+            <returns>A list of <see cref="T:Microsoft.Deployment.Compression.ArchiveFileInfo"/> objects, each containing
+            information about a file in the archive.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveInfo.Unpack(System.String)">
+            <summary>
+            Extracts all files from an archive to a destination directory.
+            </summary>
+            <param name="destDirectory">Directory where the files are to be
+            extracted.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveInfo.Unpack(System.String,System.EventHandler{Microsoft.Deployment.Compression.ArchiveProgressEventArgs})">
+            <summary>
+            Extracts all files from an archive to a destination directory,
+            optionally extracting only newer files.
+            </summary>
+            <param name="destDirectory">Directory where the files are to be
+            extracted.</param>
+            <param name="progressHandler">Handler for receiving progress
+            information; this may be null if progress is not desired.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveInfo.UnpackFile(System.String,System.String)">
+            <summary>
+            Extracts a single file from the archive.
+            </summary>
+            <param name="fileName">The name of the file in the archive. Also
+            includes the internal path of the file, if any. File name matching
+            is case-insensitive.</param>
+            <param name="destFileName">The path where the file is to be
+            extracted on disk.</param>
+            <remarks>If <paramref name="destFileName"/> already exists,
+            it will be overwritten.</remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveInfo.UnpackFiles(System.Collections.Generic.IList{System.String},System.String,System.Collections.Generic.IList{System.String})">
+            <summary>
+            Extracts multiple files from the archive.
+            </summary>
+            <param name="fileNames">The names of the files in the archive.
+            Each name includes the internal path of the file, if any. File name
+            matching is case-insensitive.</param>
+            <param name="destDirectory">This parameter may be null, but if
+            specified it is the root directory for any relative paths in
+            <paramref name="destFileNames"/>.</param>
+            <param name="destFileNames">The paths where the files are to be
+            extracted on disk. If this parameter is null, the files will be
+            extracted with the names from the archive.</param>
+            <remarks>
+            If any extracted files already exist on disk, they will be overwritten.
+            <p>The <paramref name="destDirectory"/> and
+            <paramref name="destFileNames"/> parameters cannot both be null.</p>
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveInfo.UnpackFiles(System.Collections.Generic.IList{System.String},System.String,System.Collections.Generic.IList{System.String},System.EventHandler{Microsoft.Deployment.Compression.ArchiveProgressEventArgs})">
+            <summary>
+            Extracts multiple files from the archive, optionally extracting
+            only newer files.
+            </summary>
+            <param name="fileNames">The names of the files in the archive.
+            Each name includes the internal path of the file, if any. File name
+            matching is case-insensitive.</param>
+            <param name="destDirectory">This parameter may be null, but if
+            specified it is the root directory for any relative paths in
+            <paramref name="destFileNames"/>.</param>
+            <param name="destFileNames">The paths where the files are to be
+            extracted on disk. If this parameter is null, the files will be
+            extracted with the names from the archive.</param>
+            <param name="progressHandler">Handler for receiving progress information;
+            this may be null if progress is not desired.</param>
+            <remarks>
+            If any extracted files already exist on disk, they will be overwritten.
+            <p>The <paramref name="destDirectory"/> and
+            <paramref name="destFileNames"/> parameters cannot both be null.</p>
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveInfo.UnpackFileSet(System.Collections.Generic.IDictionary{System.String,System.String},System.String)">
+            <summary>
+            Extracts multiple files from the archive.
+            </summary>
+            <param name="fileNames">A mapping from internal file paths to
+            external file paths. Case-senstivity when matching internal paths
+            depends on the IDictionary implementation.</param>
+            <param name="destDirectory">This parameter may be null, but if
+            specified it is the root directory for any relative external paths
+            in <paramref name="fileNameMap"/>.</param>
+            <remarks>
+            If any extracted files already exist on disk, they will be overwritten.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveInfo.UnpackFileSet(System.Collections.Generic.IDictionary{System.String,System.String},System.String,System.EventHandler{Microsoft.Deployment.Compression.ArchiveProgressEventArgs})">
+            <summary>
+            Extracts multiple files from the archive.
+            </summary>
+            <param name="fileNames">A mapping from internal file paths to
+            external file paths. Case-senstivity when matching internal
+            paths depends on the IDictionary implementation.</param>
+            <param name="destDirectory">This parameter may be null, but if
+            specified it is the root directory for any relative external
+            paths in <paramref name="fileNameMap"/>.</param>
+            <param name="progressHandler">Handler for receiving progress
+            information; this may be null if progress is not desired.</param>
+            <remarks>
+            If any extracted files already exist on disk, they will be overwritten.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveInfo.OpenRead(System.String)">
+            <summary>
+            Opens a file inside the archive for reading without actually
+            extracting the file to disk.
+            </summary>
+            <param name="fileName">The name of the file in the archive. Also
+            includes the internal path of the file, if any. File name matching
+            is case-insensitive.</param>
+            <returns>
+            A stream for reading directly from the packed file. Like any stream
+            this should be closed/disposed as soon as it is no longer needed.
+            </returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveInfo.OpenText(System.String)">
+            <summary>
+            Opens a file inside the archive for reading text with UTF-8 encoding
+            without actually extracting the file to disk.
+            </summary>
+            <param name="fileName">The name of the file in the archive. Also
+            includes the internal path of the file, if any. File name matching
+            is case-insensitive.</param>
+            <returns>
+            A reader for reading text directly from the packed file. Like any reader
+            this should be closed/disposed as soon as it is no longer needed.
+            </returns>
+            <remarks>
+            To open an archived text file with different encoding, use the
+            <see cref="M:Microsoft.Deployment.Compression.ArchiveInfo.OpenRead(System.String)"/> method and pass the returned stream to one of
+            the <see cref="T:System.IO.StreamReader"/> constructor overloads.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveInfo.Pack(System.String)">
+            <summary>
+            Compresses all files in a directory into the archive.
+            Does not include subdirectories.
+            </summary>
+            <param name="sourceDirectory">The directory containing the
+            files to be included.</param>
+            <remarks>
+            Uses maximum compression level.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveInfo.Pack(System.String,System.Boolean,Microsoft.Deployment.Compression.CompressionLevel,System.EventHandler{Microsoft.Deployment.Compression.ArchiveProgressEventArgs})">
+            <summary>
+            Compresses all files in a directory into the archive, optionally
+            including subdirectories.
+            </summary>
+            <param name="sourceDirectory">This parameter may be null, but
+            if specified it is the root directory
+            for any relative paths in <paramref name="sourceFileNames"/>.</param>
+            <param name="includeSubdirectories">If true, recursively include
+            files in subdirectories.</param>
+            <param name="compLevel">The compression level used when creating
+            the archive.</param>
+            <param name="progressHandler">Handler for receiving progress information;
+            this may be null if progress is not desired.</param>
+            <remarks>
+            The files are stored in the archive using their relative file paths in
+            the directory tree, if supported by the archive file format.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveInfo.PackFiles(System.String,System.Collections.Generic.IList{System.String},System.Collections.Generic.IList{System.String})">
+            <summary>
+            Compresses files into the archive, specifying the names used to
+            store the files in the archive.
+            </summary>
+            <param name="sourceDirectory">This parameter may be null, but
+            if specified it is the root directory
+            for any relative paths in <paramref name="sourceFileNames"/>.</param>
+            <param name="sourceFileNames">The list of files to be included in
+            the archive.</param>
+            <param name="fileNames">The names of the files as they are stored
+            in the archive. Each name
+            includes the internal path of the file, if any. This parameter may
+            be null, in which case the files are stored in the archive with their
+            source file names and no path information.</param>
+            <remarks>
+            Uses maximum compression level.
+            <p>Duplicate items in the <paramref name="fileNames"/> array will cause
+            an <see cref="T:Microsoft.Deployment.Compression.ArchiveException"/>.</p>
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveInfo.PackFiles(System.String,System.Collections.Generic.IList{System.String},System.Collections.Generic.IList{System.String},Microsoft.Deployment.Compression.CompressionLevel,System.EventHandler{Microsoft.Deployment.Compression.ArchiveProgressEventArgs})">
+            <summary>
+            Compresses files into the archive, specifying the names used to
+            store the files in the archive.
+            </summary>
+            <param name="sourceDirectory">This parameter may be null, but if
+            specified it is the root directory
+            for any relative paths in <paramref name="sourceFileNames"/>.</param>
+            <param name="sourceFileNames">The list of files to be included in
+            the archive.</param>
+            <param name="fileNames">The names of the files as they are stored in
+            the archive. Each name includes the internal path of the file, if any.
+            This parameter may be null, in which case the files are stored in the
+            archive with their source file names and no path information.</param>
+            <param name="compLevel">The compression level used when creating the
+            archive.</param>
+            <param name="progressHandler">Handler for receiving progress information;
+            this may be null if progress is not desired.</param>
+            <remarks>
+            Duplicate items in the <paramref name="fileNames"/> array will cause
+            an <see cref="T:Microsoft.Deployment.Compression.ArchiveException"/>.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveInfo.PackFileSet(System.String,System.Collections.Generic.IDictionary{System.String,System.String})">
+            <summary>
+            Compresses files into the archive, specifying the names used
+            to store the files in the archive.
+            </summary>
+            <param name="sourceDirectory">This parameter may be null, but if
+            specified it is the root directory
+            for any relative paths in <paramref name="fileNames"/>.</param>
+            <param name="fileNames">A mapping from internal file paths to
+            external file paths.</param>
+            <remarks>
+            Uses maximum compression level.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveInfo.PackFileSet(System.String,System.Collections.Generic.IDictionary{System.String,System.String},Microsoft.Deployment.Compression.CompressionLevel,System.EventHandler{Microsoft.Deployment.Compression.ArchiveProgressEventArgs})">
+            <summary>
+            Compresses files into the archive, specifying the names used to
+            store the files in the archive.
+            </summary>
+            <param name="sourceDirectory">This parameter may be null, but if
+            specified it is the root directory
+            for any relative paths in <paramref name="fileNames"/>.</param>
+            <param name="fileNames">A mapping from internal file paths to
+            external file paths.</param>
+            <param name="compLevel">The compression level used when creating
+            the archive.</param>
+            <param name="progressHandler">Handler for receiving progress information;
+            this may be null if progress is not desired.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveInfo.GetRelativeFilePathsInDirectoryTree(System.String,System.Boolean)">
+            <summary>
+            Given a directory, gets the relative paths of all files in the
+            directory, optionally including all subdirectories.
+            </summary>
+            <param name="dir">The directory to search.</param>
+            <param name="includeSubdirectories">True to include subdirectories
+            in the search.</param>
+            <returns>A list of file paths relative to the directory.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveInfo.GetFile(System.String)">
+            <summary>
+            Retrieves information about one file from this archive.
+            </summary>
+            <param name="path">Path of the file in the archive.</param>
+            <returns>File information, or null if the file was not found
+            in the archive.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveInfo.CreateCompressionEngine">
+            <summary>
+            Creates a compression engine that does the low-level work for
+            this object.
+            </summary>
+            <returns>A new compression engine instance that matches the specific
+            subclass of archive.</returns>
+            <remarks>
+            Each instance will be <see cref="M:Microsoft.Deployment.Compression.CompressionEngine.Dispose"/>d
+            immediately after use.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveInfo.CreateStringDictionary(System.Collections.Generic.IList{System.String},System.Collections.Generic.IList{System.String})">
+            <summary>
+            Creates a case-insensitive dictionary mapping from one list of
+            strings to the other.
+            </summary>
+            <param name="keys">List of keys.</param>
+            <param name="values">List of values that are mapped 1-to-1 to
+            the keys.</param>
+            <returns>A filled dictionary of the strings.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveInfo.RecursiveGetRelativeFilePathsInDirectoryTree(System.String,System.String,System.Boolean,System.Collections.Generic.IList{System.String})">
+            <summary>
+            Recursive-descent helper function for
+            GetRelativeFilePathsInDirectoryTree.
+            </summary>
+            <param name="dir">The root directory of the search.</param>
+            <param name="relativeDir">The relative directory to be
+            processed now.</param>
+            <param name="includeSubdirectories">True to descend into
+            subdirectories.</param>
+            <param name="fileList">List of files found so far.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveInfo.InternalGetFiles(System.Predicate{System.String})">
+            <summary>
+            Uses a CompressionEngine to get ArchiveFileInfo objects from this
+            archive, and then associates them with this ArchiveInfo instance.
+            </summary>
+            <param name="fileFilter">Optional predicate that can determine
+            which files to process.</param>
+            <returns>A list of <see cref="T:Microsoft.Deployment.Compression.ArchiveFileInfo"/> objects, each
+            containing information about a file in the archive.</returns>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.ArchiveInfo.Directory">
+            <summary>
+            Gets the directory that contains the archive.
+            </summary>
+            <value>A DirectoryInfo object representing the parent directory of the
+            archive.</value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.ArchiveInfo.DirectoryName">
+            <summary>
+            Gets the full path of the directory that contains the archive.
+            </summary>
+            <value>The full path of the directory that contains the archive.</value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.ArchiveInfo.Length">
+            <summary>
+            Gets the size of the archive.
+            </summary>
+            <value>The size of the archive in bytes.</value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.ArchiveInfo.Name">
+            <summary>
+            Gets the file name of the archive.
+            </summary>
+            <value>The file name of the archive, not including any path.</value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.ArchiveInfo.Exists">
+            <summary>
+            Checks if the archive exists.
+            </summary>
+            <value>True if the archive exists; else false.</value>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.ArchiveProgressEventArgs">
+            <summary>
+            Contains the data reported in an archive progress event.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveProgressEventArgs.#ctor(Microsoft.Deployment.Compression.ArchiveProgressType,System.String,System.Int32,System.Int32,System.Int64,System.Int64,System.String,System.Int32,System.Int32,System.Int64,System.Int64,System.Int64,System.Int64)">
+            <summary>
+            Creates a new ArchiveProgressEventArgs object from specified event parameters.
+            </summary>
+            <param name="progressType">type of status message</param>
+            <param name="currentFileName">name of the file being processed</param>
+            <param name="currentFileNumber">number of the current file being processed</param>
+            <param name="totalFiles">total number of files to be processed</param>
+            <param name="currentFileBytesProcessed">number of bytes processed so far when compressing or extracting a file</param>
+            <param name="currentFileTotalBytes">total number of bytes in the current file</param>
+            <param name="currentArchiveName">name of the current Archive</param>
+            <param name="currentArchiveNumber">current Archive number, when processing a chained set of Archives</param>
+            <param name="totalArchives">total number of Archives in a chained set</param>
+            <param name="currentArchiveBytesProcessed">number of compressed bytes processed so far during an extraction</param>
+            <param name="currentArchiveTotalBytes">total number of compressed bytes to be processed during an extraction</param>
+            <param name="fileBytesProcessed">number of uncompressed file bytes processed so far</param>
+            <param name="totalFileBytes">total number of uncompressed file bytes to be processed</param>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.ArchiveProgressEventArgs.ProgressType">
+            <summary>
+            Gets the type of status message.
+            </summary>
+            <value>A <see cref="T:Microsoft.Deployment.Compression.ArchiveProgressType"/> value indicating what type of progress event occurred.</value>
+            <remarks>
+            The handler may choose to ignore some types of progress events.
+            For example, if the handler will only list each file as it is
+            compressed/extracted, it can ignore events that
+            are not of type <see cref="F:Microsoft.Deployment.Compression.ArchiveProgressType.FinishFile"/>.
+            </remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.ArchiveProgressEventArgs.CurrentFileName">
+            <summary>
+            Gets the name of the file being processed. (The name of the file within the Archive; not the external
+            file path.) Also includes the internal path of the file, if any.  Valid for
+            <see cref="F:Microsoft.Deployment.Compression.ArchiveProgressType.StartFile"/>, <see cref="F:Microsoft.Deployment.Compression.ArchiveProgressType.PartialFile"/>,
+            and <see cref="F:Microsoft.Deployment.Compression.ArchiveProgressType.FinishFile"/> messages.
+            </summary>
+            <value>The name of the file currently being processed, or null if processing
+            is currently at the stream or archive level.</value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.ArchiveProgressEventArgs.CurrentFileNumber">
+            <summary>
+            Gets the number of the current file being processed. The first file is number 0, and the last file
+            is <see cref="P:Microsoft.Deployment.Compression.ArchiveProgressEventArgs.TotalFiles"/>-1. Valid for <see cref="F:Microsoft.Deployment.Compression.ArchiveProgressType.StartFile"/>,
+            <see cref="F:Microsoft.Deployment.Compression.ArchiveProgressType.PartialFile"/>, and <see cref="F:Microsoft.Deployment.Compression.ArchiveProgressType.FinishFile"/> messages.
+            </summary>
+            <value>The number of the file currently being processed, or the most recent
+            file processed if processing is currently at the stream or archive level.</value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.ArchiveProgressEventArgs.TotalFiles">
+            <summary>
+            Gets the total number of files to be processed.  Valid for all message types.
+            </summary>
+            <value>The total number of files to be processed that are known so far.</value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.ArchiveProgressEventArgs.CurrentFileBytesProcessed">
+            <summary>
+            Gets the number of bytes processed so far when compressing or extracting a file.  Valid for
+            <see cref="F:Microsoft.Deployment.Compression.ArchiveProgressType.StartFile"/>, <see cref="F:Microsoft.Deployment.Compression.ArchiveProgressType.PartialFile"/>,
+            and <see cref="F:Microsoft.Deployment.Compression.ArchiveProgressType.FinishFile"/> messages.
+            </summary>
+            <value>The number of uncompressed bytes processed so far for the current file,
+            or 0 if processing is currently at the stream or archive level.</value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.ArchiveProgressEventArgs.CurrentFileTotalBytes">
+            <summary>
+            Gets the total number of bytes in the current file.  Valid for <see cref="F:Microsoft.Deployment.Compression.ArchiveProgressType.StartFile"/>,
+            <see cref="F:Microsoft.Deployment.Compression.ArchiveProgressType.PartialFile"/>, and <see cref="F:Microsoft.Deployment.Compression.ArchiveProgressType.FinishFile"/> messages.
+            </summary>
+            <value>The uncompressed size of the current file being processed,
+            or 0 if processing is currently at the stream or archive level.</value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.ArchiveProgressEventArgs.CurrentArchiveName">
+            <summary>
+            Gets the name of the current archive.  Not necessarily the name of the archive on disk.
+            Valid for all message types.
+            </summary>
+            <value>The name of the current archive, or an empty string if no name was specified.</value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.ArchiveProgressEventArgs.CurrentArchiveNumber">
+            <summary>
+            Gets the current archive number, when processing a chained set of archives. Valid for all message types.
+            </summary>
+            <value>The number of the current archive.</value>
+            <remarks>The first archive is number 0, and the last archive is
+            <see cref="P:Microsoft.Deployment.Compression.ArchiveProgressEventArgs.TotalArchives"/>-1.</remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.ArchiveProgressEventArgs.TotalArchives">
+            <summary>
+            Gets the total number of known archives in a chained set. Valid for all message types.
+            </summary>
+            <value>The total number of known archives in a chained set.</value>
+            <remarks>
+            When using the compression option to auto-split into multiple archives based on data size,
+            this value will not be accurate until the end.
+            </remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.ArchiveProgressEventArgs.CurrentArchiveBytesProcessed">
+            <summary>
+            Gets the number of compressed bytes processed so far during extraction
+            of the current archive. Valid for all extraction messages.
+            </summary>
+            <value>The number of compressed bytes processed so far during extraction
+            of the current archive.</value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.ArchiveProgressEventArgs.CurrentArchiveTotalBytes">
+            <summary>
+            Gets the total number of compressed bytes to be processed during extraction
+            of the current archive. Valid for all extraction messages.
+            </summary>
+            <value>The total number of compressed bytes to be processed during extraction
+            of the current archive.</value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.ArchiveProgressEventArgs.FileBytesProcessed">
+            <summary>
+            Gets the number of uncompressed bytes processed so far among all files. Valid for all message types.  
+            </summary>
+            <value>The number of uncompressed file bytes processed so far among all files.</value>
+            <remarks>
+            When compared to <see cref="P:Microsoft.Deployment.Compression.ArchiveProgressEventArgs.TotalFileBytes"/>, this can be used as a measure of overall progress.
+            </remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.ArchiveProgressEventArgs.TotalFileBytes">
+            <summary>
+            Gets the total number of uncompressed file bytes to be processed.  Valid for all message types.
+            </summary>
+            <value>The total number of uncompressed bytes to be processed among all files.</value>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.ArchiveProgressType">
+            <summary>
+            The type of progress event.
+            </summary>
+            <remarks>
+            <p>PACKING EXAMPLE: The following sequence of events might be received when
+            extracting a simple archive file with 2 files.</p>
+            <list type="table">
+            <listheader><term>Message Type</term><description>Description</description></listheader>
+            <item><term>StartArchive</term> <description>Begin extracting archive</description></item>
+            <item><term>StartFile</term>    <description>Begin extracting first file</description></item>
+            <item><term>PartialFile</term>  <description>Extracting first file</description></item>
+            <item><term>PartialFile</term>  <description>Extracting first file</description></item>
+            <item><term>FinishFile</term>   <description>Finished extracting first file</description></item>
+            <item><term>StartFile</term>    <description>Begin extracting second file</description></item>
+            <item><term>PartialFile</term>  <description>Extracting second file</description></item>
+            <item><term>FinishFile</term>   <description>Finished extracting second file</description></item>
+            <item><term>FinishArchive</term><description>Finished extracting archive</description></item>
+            </list>
+            <p></p>
+            <p>UNPACKING EXAMPLE:  Packing 3 files into 2 archive chunks, where the second file is
+            continued to the second archive chunk.</p>
+            <list type="table">
+            <listheader><term>Message Type</term><description>Description</description></listheader>
+            <item><term>StartFile</term>     <description>Begin compressing first file</description></item>
+            <item><term>FinishFile</term>    <description>Finished compressing first file</description></item>
+            <item><term>StartFile</term>     <description>Begin compressing second file</description></item>
+            <item><term>PartialFile</term>   <description>Compressing second file</description></item>
+            <item><term>PartialFile</term>   <description>Compressing second file</description></item>
+            <item><term>FinishFile</term>    <description>Finished compressing second file</description></item>
+            <item><term>StartArchive</term>  <description>Begin writing first archive</description></item>
+            <item><term>PartialArchive</term><description>Writing first archive</description></item>
+            <item><term>FinishArchive</term> <description>Finished writing first archive</description></item>
+            <item><term>StartFile</term>     <description>Begin compressing third file</description></item>
+            <item><term>PartialFile</term>   <description>Compressing third file</description></item>
+            <item><term>FinishFile</term>    <description>Finished compressing third file</description></item>
+            <item><term>StartArchive</term>  <description>Begin writing second archive</description></item>
+            <item><term>PartialArchive</term><description>Writing second archive</description></item>
+            <item><term>FinishArchive</term> <description>Finished writing second archive</description></item>
+            </list>
+            </remarks>
+        </member>
+        <member name="F:Microsoft.Deployment.Compression.ArchiveProgressType.StartFile">
+            <summary>Status message before beginning the packing or unpacking an individual file.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.Compression.ArchiveProgressType.PartialFile">
+            <summary>Status message (possibly reported multiple times) during the process of packing or unpacking a file.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.Compression.ArchiveProgressType.FinishFile">
+            <summary>Status message after completion of the packing or unpacking an individual file.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.Compression.ArchiveProgressType.StartArchive">
+            <summary>Status message before beginning the packing or unpacking an archive.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.Compression.ArchiveProgressType.PartialArchive">
+            <summary>Status message (possibly reported multiple times) during the process of packing or unpacking an archiv.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.Compression.ArchiveProgressType.FinishArchive">
+            <summary>Status message after completion of the packing or unpacking of an archive.</summary>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.ArchiveFileStreamContext">
+            <summary>
+            Provides a basic implementation of the archive pack and unpack stream context
+            interfaces, based on a list of archive files, a default directory, and an
+            optional mapping from internal to external file paths.
+            </summary>
+            <remarks>
+            This class can also handle creating or extracting chained archive packages.
+            </remarks>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.IPackStreamContext">
+            <summary>
+            This interface provides the methods necessary for the
+            <see cref="T:Microsoft.Deployment.Compression.CompressionEngine"/> to open and close streams for archives
+            and files. The implementor of this interface can use any kind of logic
+            to determine what kind of streams to open and where.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.IPackStreamContext.GetArchiveName(System.Int32)">
+            <summary>
+            Gets the name of the archive with a specified number.
+            </summary>
+            <param name="archiveNumber">The 0-based index of the archive
+            within the chain.</param>
+            <returns>The name of the requested archive. May be an empty string
+            for non-chained archives, but may never be null.</returns>
+            <remarks>The archive name is the name stored within the archive, used for
+            identification of the archive especially among archive chains. That
+            name is often, but not necessarily the same as the filename of the
+            archive package.</remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.IPackStreamContext.OpenArchiveWriteStream(System.Int32,System.String,System.Boolean,Microsoft.Deployment.Compression.CompressionEngine)">
+            <summary>
+            Opens a stream for writing an archive package.
+            </summary>
+            <param name="archiveNumber">The 0-based index of the archive within
+            the chain.</param>
+            <param name="archiveName">The name of the archive that was returned
+            by <see cref="M:Microsoft.Deployment.Compression.IPackStreamContext.GetArchiveName(System.Int32)"/>.</param>
+            <param name="truncate">True if the stream should be truncated when
+            opened (if it already exists); false if an existing stream is being
+            re-opened for writing additional data.</param>
+            <param name="compressionEngine">Instance of the compression engine
+            doing the operations.</param>
+            <returns>A writable Stream where the compressed archive bytes will be
+            written, or null to cancel the archive creation.</returns>
+            <remarks>
+            If this method returns null, the archive engine will throw a
+            FileNotFoundException.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.IPackStreamContext.CloseArchiveWriteStream(System.Int32,System.String,System.IO.Stream)">
+            <summary>
+            Closes a stream where an archive package was written.
+            </summary>
+            <param name="archiveNumber">The 0-based index of the archive within
+            the chain.</param>
+            <param name="archiveName">The name of the archive that was previously
+            returned by
+            <see cref="M:Microsoft.Deployment.Compression.IPackStreamContext.GetArchiveName(System.Int32)"/>.</param>
+            <param name="stream">A stream that was previously returned by
+            <see cref="M:Microsoft.Deployment.Compression.IPackStreamContext.OpenArchiveWriteStream(System.Int32,System.String,System.Boolean,Microsoft.Deployment.Compression.CompressionEngine)"/> and is now ready to be closed.</param>
+            <remarks>
+            If there is another archive package in the chain, then after this stream
+            is closed a new stream will be opened.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.IPackStreamContext.OpenFileReadStream(System.String,System.IO.FileAttributes@,System.DateTime@)">
+            <summary>
+            Opens a stream to read a file that is to be included in an archive.
+            </summary>
+            <param name="path">The path of the file within the archive. This is often,
+            but not necessarily, the same as the relative path of the file outside
+            the archive.</param>
+            <param name="attributes">Returned attributes of the opened file, to be
+            stored in the archive.</param>
+            <param name="lastWriteTime">Returned last-modified time of the opened file,
+            to be stored in the archive.</param>
+            <returns>A readable Stream where the file bytes will be read from before
+            they are compressed, or null to skip inclusion of the file and continue to
+            the next file.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.IPackStreamContext.CloseFileReadStream(System.String,System.IO.Stream)">
+            <summary>
+            Closes a stream that has been used to read a file.
+            </summary>
+            <param name="path">The path of the file within the archive; the same as
+            the path provided
+            when the stream was opened.</param>
+            <param name="stream">A stream that was previously returned by
+            <see cref="M:Microsoft.Deployment.Compression.IPackStreamContext.OpenFileReadStream(System.String,System.IO.FileAttributes@,System.DateTime@)"/> and is now ready to be closed.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.IPackStreamContext.GetOption(System.String,System.Object[])">
+            <summary>
+            Gets extended parameter information specific to the compression
+            format being used.
+            </summary>
+            <param name="optionName">Name of the option being requested.</param>
+            <param name="parameters">Parameters for the option; for per-file options,
+            the first parameter is typically the internal file path.</param>
+            <returns>Option value, or null to use the default behavior.</returns>
+            <remarks>
+            This method provides a way to set uncommon options during packaging, or a
+            way to handle aspects of compression formats not supported by the base library.
+            <para>For example, this may be used by the zip compression library to
+            specify different compression methods/levels on a per-file basis.</para>
+            <para>The available option names, parameters, and expected return values
+            should be documented by each compression library.</para>
+            </remarks>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.IUnpackStreamContext">
+            <summary>
+            This interface provides the methods necessary for the <see cref="T:Microsoft.Deployment.Compression.CompressionEngine"/> to open
+            and close streams for archives and files. The implementor of this interface can use any
+            kind of logic to determine what kind of streams to open and where 
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.IUnpackStreamContext.OpenArchiveReadStream(System.Int32,System.String,Microsoft.Deployment.Compression.CompressionEngine)">
+            <summary>
+            Opens the archive stream for reading.
+            </summary>
+            <param name="archiveNumber">The zero-based index of the archive to open.</param>
+            <param name="archiveName">The name of the archive being opened.</param>
+            <param name="compressionEngine">Instance of the compression engine doing the operations.</param>
+            <returns>A stream from which archive bytes are read, or null to cancel extraction
+            of the archive.</returns>
+            <remarks>
+            When the first archive in a chain is opened, the name is not yet known, so the
+            provided value will be an empty string. When opening further archives, the
+            provided value is the next-archive name stored in the previous archive. This
+            name is often, but not necessarily, the same as the filename of the archive
+            package to be opened.
+            <para>If this method returns null, the archive engine will throw a
+            FileNotFoundException.</para>
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.IUnpackStreamContext.CloseArchiveReadStream(System.Int32,System.String,System.IO.Stream)">
+            <summary>
+            Closes a stream where an archive package was read.
+            </summary>
+            <param name="archiveNumber">The archive number of the stream to close.</param>
+            <param name="archiveName">The name of the archive being closed.</param>
+            <param name="stream">The stream that was previously returned by
+            <see cref="M:Microsoft.Deployment.Compression.IUnpackStreamContext.OpenArchiveReadStream(System.Int32,System.String,Microsoft.Deployment.Compression.CompressionEngine)"/> and is now ready to be closed.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.IUnpackStreamContext.OpenFileWriteStream(System.String,System.Int64,System.DateTime)">
+            <summary>
+            Opens a stream for writing extracted file bytes.
+            </summary>
+            <param name="path">The path of the file within the archive. This is often, but
+            not necessarily, the same as the relative path of the file outside the archive.</param>
+            <param name="fileSize">The uncompressed size of the file to be extracted.</param>
+            <param name="lastWriteTime">The last write time of the file to be extracted.</param>
+            <returns>A stream where extracted file bytes are to be written, or null to skip
+            extraction of the file and continue to the next file.</returns>
+            <remarks>
+            The implementor may use the path, size and date information to dynamically
+            decide whether or not the file should be extracted.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.IUnpackStreamContext.CloseFileWriteStream(System.String,System.IO.Stream,System.IO.FileAttributes,System.DateTime)">
+            <summary>
+            Closes a stream where an extracted file was written.
+            </summary>
+            <param name="path">The path of the file within the archive.</param>
+            <param name="stream">The stream that was previously returned by <see cref="M:Microsoft.Deployment.Compression.IUnpackStreamContext.OpenFileWriteStream(System.String,System.Int64,System.DateTime)"/>
+            and is now ready to be closed.</param>
+            <param name="attributes">The attributes of the extracted file.</param>
+            <param name="lastWriteTime">The last write time of the file.</param>
+            <remarks>
+            The implementor may wish to apply the attributes and date to the newly-extracted file.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveFileStreamContext.#ctor(System.String)">
+            <summary>
+            Creates a new ArchiveFileStreamContext with a archive file and
+            no default directory or file mapping.
+            </summary>
+            <param name="archiveFile">The path to a archive file that will be
+            created or extracted.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveFileStreamContext.#ctor(System.String,System.String,System.Collections.Generic.IDictionary{System.String,System.String})">
+            <summary>
+            Creates a new ArchiveFileStreamContext with a archive file, default
+            directory and mapping from internal to external file paths.
+            </summary>
+            <param name="archiveFile">The path to a archive file that will be
+            created or extracted.</param>
+            <param name="directory">The default root directory where files will be
+            located, optional.</param>
+            <param name="files">A mapping from internal file paths to external file
+            paths, optional.</param>
+            <remarks>
+            If the mapping is not null and a file is not included in the mapping,
+            the file will be skipped.
+            <para>If the external path in the mapping is a simple file name or
+            relative file path, it will be concatenated onto the default directory,
+            if one was specified.</para>
+            <para>For more about how the default directory and files mapping are
+            used, see <see cref="M:Microsoft.Deployment.Compression.ArchiveFileStreamContext.OpenFileReadStream(System.String,System.IO.FileAttributes@,System.DateTime@)"/> and
+            <see cref="M:Microsoft.Deployment.Compression.ArchiveFileStreamContext.OpenFileWriteStream(System.String,System.Int64,System.DateTime)"/>.</para>
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveFileStreamContext.#ctor(System.Collections.Generic.IList{System.String},System.String,System.Collections.Generic.IDictionary{System.String,System.String})">
+            <summary>
+            Creates a new ArchiveFileStreamContext with a list of archive files,
+            a default directory and a mapping from internal to external file paths.
+            </summary>
+            <param name="archiveFiles">A list of paths to archive files that will be
+            created or extracted.</param>
+            <param name="directory">The default root directory where files will be
+            located, optional.</param>
+            <param name="files">A mapping from internal file paths to external file
+            paths, optional.</param>
+            <remarks>
+            When creating chained archives, the <paramref name="archiveFiles"/> list
+            should include at least enough archives to handle the entire set of
+            input files, based on the maximum archive size that is passed to the
+            <see cref="T:Microsoft.Deployment.Compression.CompressionEngine"/>.<see cref="M:Microsoft.Deployment.Compression.CompressionEngine.Pack(Microsoft.Deployment.Compression.IPackStreamContext,System.Collections.Generic.IEnumerable{System.String},System.Int64)"/>.
+            <para>If the mapping is not null and a file is not included in the mapping,
+            the file will be skipped.</para>
+            <para>If the external path in the mapping is a simple file name or
+            relative file path, it will be concatenated onto the default directory,
+            if one was specified.</para>
+            <para>For more about how the default directory and files mapping are used,
+            see <see cref="M:Microsoft.Deployment.Compression.ArchiveFileStreamContext.OpenFileReadStream(System.String,System.IO.FileAttributes@,System.DateTime@)"/> and
+            <see cref="M:Microsoft.Deployment.Compression.ArchiveFileStreamContext.OpenFileWriteStream(System.String,System.Int64,System.DateTime)"/>.</para>
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveFileStreamContext.GetArchiveName(System.Int32)">
+            <summary>
+            Gets the name of the archive with a specified number.
+            </summary>
+            <param name="archiveNumber">The 0-based index of the archive within
+            the chain.</param>
+            <returns>The name of the requested archive. May be an empty string
+            for non-chained archives, but may never be null.</returns>
+            <remarks>This method returns the file name of the archive from the
+            <see cref="F:Microsoft.Deployment.Compression.ArchiveFileStreamContext.archiveFiles"/> list with the specified index, or an empty
+            string if the archive number is outside the bounds of the list. The
+            file name should not include any directory path.</remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveFileStreamContext.OpenArchiveWriteStream(System.Int32,System.String,System.Boolean,Microsoft.Deployment.Compression.CompressionEngine)">
+            <summary>
+            Opens a stream for writing an archive.
+            </summary>
+            <param name="archiveNumber">The 0-based index of the archive within
+            the chain.</param>
+            <param name="archiveName">The name of the archive that was returned
+            by <see cref="M:Microsoft.Deployment.Compression.ArchiveFileStreamContext.GetArchiveName(System.Int32)"/>.</param>
+            <param name="truncate">True if the stream should be truncated when
+            opened (if it already exists); false if an existing stream is being
+            re-opened for writing additional data.</param>
+            <param name="compressionEngine">Instance of the compression engine
+            doing the operations.</param>
+            <returns>A writable Stream where the compressed archive bytes will be
+            written, or null to cancel the archive creation.</returns>
+            <remarks>
+            This method opens the file from the <see cref="P:Microsoft.Deployment.Compression.ArchiveFileStreamContext.ArchiveFiles"/> list
+            with the specified index. If the archive number is outside the bounds
+            of the list, this method returns null.
+            <para>If the <see cref="P:Microsoft.Deployment.Compression.ArchiveFileStreamContext.EnableOffsetOpen"/> flag is set, this method
+            will seek to the start of any existing archive in the file, or to the
+            end of the file if the existing file is not an archive.</para>
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveFileStreamContext.CloseArchiveWriteStream(System.Int32,System.String,System.IO.Stream)">
+            <summary>
+            Closes a stream where an archive package was written.
+            </summary>
+            <param name="archiveNumber">The 0-based index of the archive within
+            the chain.</param>
+            <param name="archiveName">The name of the archive that was previously
+            returned by <see cref="M:Microsoft.Deployment.Compression.ArchiveFileStreamContext.GetArchiveName(System.Int32)"/>.</param>
+            <param name="stream">A stream that was previously returned by
+            <see cref="M:Microsoft.Deployment.Compression.ArchiveFileStreamContext.OpenArchiveWriteStream(System.Int32,System.String,System.Boolean,Microsoft.Deployment.Compression.CompressionEngine)"/> and is now ready to be closed.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveFileStreamContext.OpenFileReadStream(System.String,System.IO.FileAttributes@,System.DateTime@)">
+            <summary>
+            Opens a stream to read a file that is to be included in an archive.
+            </summary>
+            <param name="path">The path of the file within the archive.</param>
+            <param name="attributes">The returned attributes of the opened file,
+            to be stored in the archive.</param>
+            <param name="lastWriteTime">The returned last-modified time of the
+            opened file, to be stored in the archive.</param>
+            <returns>A readable Stream where the file bytes will be read from
+            before they are compressed, or null to skip inclusion of the file and
+            continue to the next file.</returns>
+            <remarks>
+            This method opens a file using the following logic:
+            <list>
+            <item>If the <see cref="P:Microsoft.Deployment.Compression.ArchiveFileStreamContext.Directory"/> and the <see cref="P:Microsoft.Deployment.Compression.ArchiveFileStreamContext.Files"/> mapping
+            are both null, the path is treated as relative to the current directory,
+            and that file is opened.</item>
+            <item>If the <see cref="P:Microsoft.Deployment.Compression.ArchiveFileStreamContext.Directory"/> is not null but the <see cref="P:Microsoft.Deployment.Compression.ArchiveFileStreamContext.Files"/>
+            mapping is null, the path is treated as relative to that directory, and
+            that file is opened.</item>
+            <item>If the <see cref="P:Microsoft.Deployment.Compression.ArchiveFileStreamContext.Directory"/> is null but the <see cref="P:Microsoft.Deployment.Compression.ArchiveFileStreamContext.Files"/>
+            mapping is not null, the path parameter is used as a key into the mapping,
+            and the resulting value is the file path that is opened, relative to the
+            current directory (or it may be an absolute path). If no mapping exists,
+            the file is skipped.</item>
+            <item>If both the <see cref="P:Microsoft.Deployment.Compression.ArchiveFileStreamContext.Directory"/> and the <see cref="P:Microsoft.Deployment.Compression.ArchiveFileStreamContext.Files"/>
+            mapping are specified, the path parameter is used as a key into the
+            mapping, and the resulting value is the file path that is opened, relative
+            to the specified directory (or it may be an absolute path). If no mapping
+            exists, the file is skipped.</item>
+            </list>
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveFileStreamContext.CloseFileReadStream(System.String,System.IO.Stream)">
+            <summary>
+            Closes a stream that has been used to read a file.
+            </summary>
+            <param name="path">The path of the file within the archive; the same as
+            the path provided when the stream was opened.</param>
+            <param name="stream">A stream that was previously returned by
+            <see cref="M:Microsoft.Deployment.Compression.ArchiveFileStreamContext.OpenFileReadStream(System.String,System.IO.FileAttributes@,System.DateTime@)"/> and is now ready to be closed.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveFileStreamContext.GetOption(System.String,System.Object[])">
+            <summary>
+            Gets extended parameter information specific to the compression format
+            being used.
+            </summary>
+            <param name="optionName">Name of the option being requested.</param>
+            <param name="parameters">Parameters for the option; for per-file options,
+            the first parameter is typically the internal file path.</param>
+            <returns>Option value, or null to use the default behavior.</returns>
+            <remarks>
+            This implementation does not handle any options. Subclasses may override
+            this method to allow for non-default behavior.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveFileStreamContext.OpenArchiveReadStream(System.Int32,System.String,Microsoft.Deployment.Compression.CompressionEngine)">
+            <summary>
+            Opens the archive stream for reading.
+            </summary>
+            <param name="archiveNumber">The zero-based index of the archive to
+            open.</param>
+            <param name="archiveName">The name of the archive being opened.</param>
+            <param name="compressionEngine">Instance of the compression engine
+            doing the operations.</param>
+            <returns>A stream from which archive bytes are read, or null to cancel
+            extraction of the archive.</returns>
+            <remarks>
+            This method opens the file from the <see cref="P:Microsoft.Deployment.Compression.ArchiveFileStreamContext.ArchiveFiles"/> list with
+            the specified index. If the archive number is outside the bounds of the
+            list, this method returns null.
+            <para>If the <see cref="P:Microsoft.Deployment.Compression.ArchiveFileStreamContext.EnableOffsetOpen"/> flag is set, this method will
+            seek to the start of any existing archive in the file, or to the end of
+            the file if the existing file is not an archive.</para>
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveFileStreamContext.CloseArchiveReadStream(System.Int32,System.String,System.IO.Stream)">
+            <summary>
+            Closes a stream where an archive was read.
+            </summary>
+            <param name="archiveNumber">The archive number of the stream
+            to close.</param>
+            <param name="archiveName">The name of the archive being closed.</param>
+            <param name="stream">The stream that was previously returned by
+            <see cref="M:Microsoft.Deployment.Compression.ArchiveFileStreamContext.OpenArchiveReadStream(System.Int32,System.String,Microsoft.Deployment.Compression.CompressionEngine)"/> and is now ready to be closed.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveFileStreamContext.OpenFileWriteStream(System.String,System.Int64,System.DateTime)">
+            <summary>
+            Opens a stream for writing extracted file bytes.
+            </summary>
+            <param name="path">The path of the file within the archive.</param>
+            <param name="fileSize">The uncompressed size of the file to be
+            extracted.</param>
+            <param name="lastWriteTime">The last write time of the file to be
+            extracted.</param>
+            <returns>A stream where extracted file bytes are to be written, or null
+            to skip extraction of the file and continue to the next file.</returns>
+            <remarks>
+            This method opens a file using the following logic:
+            <list>
+            <item>If the <see cref="P:Microsoft.Deployment.Compression.ArchiveFileStreamContext.Directory"/> and the <see cref="P:Microsoft.Deployment.Compression.ArchiveFileStreamContext.Files"/> mapping
+            are both null, the path is treated as relative to the current directory,
+            and that file is opened.</item>
+            <item>If the <see cref="P:Microsoft.Deployment.Compression.ArchiveFileStreamContext.Directory"/> is not null but the <see cref="P:Microsoft.Deployment.Compression.ArchiveFileStreamContext.Files"/>
+            mapping is null, the path is treated as relative to that directory, and
+            that file is opened.</item>
+            <item>If the <see cref="P:Microsoft.Deployment.Compression.ArchiveFileStreamContext.Directory"/> is null but the <see cref="P:Microsoft.Deployment.Compression.ArchiveFileStreamContext.Files"/>
+            mapping is not null, the path parameter is used as a key into the mapping,
+            and the resulting value is the file path that is opened, relative to the
+            current directory (or it may be an absolute path). If no mapping exists,
+            the file is skipped.</item>
+            <item>If both the <see cref="P:Microsoft.Deployment.Compression.ArchiveFileStreamContext.Directory"/> and the <see cref="P:Microsoft.Deployment.Compression.ArchiveFileStreamContext.Files"/>
+            mapping are specified, the path parameter is used as a key into the
+            mapping, and the resulting value is the file path that is opened,
+            relative to the specified directory (or it may be an absolute path).
+            If no mapping exists, the file is skipped.</item>
+            </list>
+            <para>If the <see cref="P:Microsoft.Deployment.Compression.ArchiveFileStreamContext.ExtractOnlyNewerFiles"/> flag is set, the file
+            is skipped if a file currently exists in the same path with an equal
+            or newer write time.</para>
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveFileStreamContext.CloseFileWriteStream(System.String,System.IO.Stream,System.IO.FileAttributes,System.DateTime)">
+            <summary>
+            Closes a stream where an extracted file was written.
+            </summary>
+            <param name="path">The path of the file within the archive.</param>
+            <param name="stream">The stream that was previously returned by
+            <see cref="M:Microsoft.Deployment.Compression.ArchiveFileStreamContext.OpenFileWriteStream(System.String,System.Int64,System.DateTime)"/> and is now ready to be closed.</param>
+            <param name="attributes">The attributes of the extracted file.</param>
+            <param name="lastWriteTime">The last write time of the file.</param>
+            <remarks>
+            After closing the extracted file stream, this method applies the date
+            and attributes to that file.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.ArchiveFileStreamContext.TranslateFilePath(System.String)">
+            <summary>
+            Translates an internal file path to an external file path using the
+            <see cref="P:Microsoft.Deployment.Compression.ArchiveFileStreamContext.Directory"/> and the <see cref="P:Microsoft.Deployment.Compression.ArchiveFileStreamContext.Files"/> mapping, according to
+            rules documented in <see cref="M:Microsoft.Deployment.Compression.ArchiveFileStreamContext.OpenFileReadStream(System.String,System.IO.FileAttributes@,System.DateTime@)"/> and
+            <see cref="M:Microsoft.Deployment.Compression.ArchiveFileStreamContext.OpenFileWriteStream(System.String,System.Int64,System.DateTime)"/>.
+            </summary>
+            <param name="path">The path of the file with the archive.</param>
+            <returns>The external path of the file, or null if there is no
+            valid translation.</returns>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.ArchiveFileStreamContext.ArchiveFiles">
+            <summary>
+            Gets or sets the list of archive files that are created or extracted.
+            </summary>
+            <value>The list of archive files that are created or extracted.</value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.ArchiveFileStreamContext.Directory">
+            <summary>
+            Gets or sets the default root directory where files are located.
+            </summary>
+            <value>The default root directory where files are located.</value>
+            <remarks>
+            For details about how the default directory is used,
+            see <see cref="M:Microsoft.Deployment.Compression.ArchiveFileStreamContext.OpenFileReadStream(System.String,System.IO.FileAttributes@,System.DateTime@)"/> and <see cref="M:Microsoft.Deployment.Compression.ArchiveFileStreamContext.OpenFileWriteStream(System.String,System.Int64,System.DateTime)"/>.
+            </remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.ArchiveFileStreamContext.Files">
+            <summary>
+            Gets or sets the mapping from internal file paths to external file paths.
+            </summary>
+            <value>A mapping from internal file paths to external file paths.</value>
+            <remarks>
+            For details about how the files mapping is used,
+            see <see cref="M:Microsoft.Deployment.Compression.ArchiveFileStreamContext.OpenFileReadStream(System.String,System.IO.FileAttributes@,System.DateTime@)"/> and <see cref="M:Microsoft.Deployment.Compression.ArchiveFileStreamContext.OpenFileWriteStream(System.String,System.Int64,System.DateTime)"/>.
+            </remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.ArchiveFileStreamContext.ExtractOnlyNewerFiles">
+            <summary>
+            Gets or sets a flag that can prevent extracted files from overwriting
+            newer files that already exist.
+            </summary>
+            <value>True to prevent overwriting newer files that already exist
+            during extraction; false to always extract from the archive regardless
+            of existing files.</value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.ArchiveFileStreamContext.EnableOffsetOpen">
+            <summary>
+            Gets or sets a flag that enables creating or extracting an archive
+            at an offset within an existing file. (This is typically used to open
+            archive-based self-extracting packages.)
+            </summary>
+            <value>True to search an existing package file for an archive offset
+            or the end of the file;/ false to always create or open a plain
+            archive file.</value>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.BasicUnpackStreamContext">
+            <summary>
+            Stream context used to extract a single file from an archive into a memory stream.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.BasicUnpackStreamContext.#ctor(System.IO.Stream)">
+            <summary>
+            Creates a new BasicExtractStreamContext that reads from the specified archive stream.
+            </summary>
+            <param name="archiveStream">Archive stream to read from.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.BasicUnpackStreamContext.OpenArchiveReadStream(System.Int32,System.String,Microsoft.Deployment.Compression.CompressionEngine)">
+            <summary>
+            Opens the archive stream for reading. Returns a DuplicateStream instance,
+            so the stream may be virtually opened multiple times.
+            </summary>
+            <param name="archiveNumber">The archive number to open (ignored; 0 is assumed).</param>
+            <param name="archiveName">The name of the archive being opened.</param>
+            <param name="compressionEngine">Instance of the compression engine doing the operations.</param>
+            <returns>A stream from which archive bytes are read.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.BasicUnpackStreamContext.CloseArchiveReadStream(System.Int32,System.String,System.IO.Stream)">
+            <summary>
+            Does *not* close the stream. The archive stream should be managed by
+            the code that invokes the archive extraction.
+            </summary>
+            <param name="archiveNumber">The archive number of the stream to close.</param>
+            <param name="archiveName">The name of the archive being closed.</param>
+            <param name="stream">The stream being closed.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.BasicUnpackStreamContext.OpenFileWriteStream(System.String,System.Int64,System.DateTime)">
+            <summary>
+            Opens a stream for writing extracted file bytes. The returned stream is a MemoryStream
+            instance, so the file is extracted straight into memory.
+            </summary>
+            <param name="path">Path of the file within the archive.</param>
+            <param name="fileSize">The uncompressed size of the file to be extracted.</param>
+            <param name="lastWriteTime">The last write time of the file.</param>
+            <returns>A stream where extracted file bytes are to be written.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.BasicUnpackStreamContext.CloseFileWriteStream(System.String,System.IO.Stream,System.IO.FileAttributes,System.DateTime)">
+            <summary>
+            Does *not* close the file stream. The file stream is saved in memory so it can
+            be read later.
+            </summary>
+            <param name="path">Path of the file within the archive.</param>
+            <param name="stream">The file stream to be closed.</param>
+            <param name="attributes">The attributes of the extracted file.</param>
+            <param name="lastWriteTime">The last write time of the file.</param>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.BasicUnpackStreamContext.FileStream">
+            <summary>
+            Gets the stream for the extracted file, or null if no file was extracted.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.CompressionEngine">
+            <summary>
+            Base class for an engine capable of packing and unpacking a particular
+            compressed file format.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.CompressionEngine.#ctor">
+            <summary>
+            Creates a new instance of the compression engine base class.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.CompressionEngine.Finalize">
+            <summary>
+            Disposes the compression engine.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.CompressionEngine.Dispose">
+            <summary>
+            Disposes of resources allocated by the compression engine.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.CompressionEngine.Pack(Microsoft.Deployment.Compression.IPackStreamContext,System.Collections.Generic.IEnumerable{System.String})">
+            <summary>
+            Creates an archive.
+            </summary>
+            <param name="streamContext">A context interface to handle opening
+            and closing of archive and file streams.</param>
+            <param name="files">The paths of the files in the archive
+            (not external file paths).</param>
+            <exception cref="T:Microsoft.Deployment.Compression.ArchiveException">The archive could not be
+            created.</exception>
+            <remarks>
+            The stream context implementation may provide a mapping from the
+            file paths within the archive to the external file paths.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.CompressionEngine.Pack(Microsoft.Deployment.Compression.IPackStreamContext,System.Collections.Generic.IEnumerable{System.String},System.Int64)">
+            <summary>
+            Creates an archive or chain of archives.
+            </summary>
+            <param name="streamContext">A context interface to handle opening
+            and closing of archive and file streams.</param>
+            <param name="files">The paths of the files in the archive (not
+            external file paths).</param>
+            <param name="maxArchiveSize">The maximum number of bytes for one
+            archive before the contents are chained to the next archive, or zero
+            for unlimited archive size.</param>
+            <exception cref="T:Microsoft.Deployment.Compression.ArchiveException">The archive could not be
+            created.</exception>
+            <remarks>
+            The stream context implementation may provide a mapping from the file
+            paths within the archive to the external file paths.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.CompressionEngine.IsArchive(System.IO.Stream)">
+            <summary>
+            Checks whether a Stream begins with a header that indicates
+            it is a valid archive.
+            </summary>
+            <param name="stream">Stream for reading the archive file.</param>
+            <returns>True if the stream is a valid archive
+            (with no offset); false otherwise.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.CompressionEngine.FindArchiveOffset(System.IO.Stream)">
+            <summary>
+            Gets the offset of an archive that is positioned 0 or more bytes
+            from the start of the Stream.
+            </summary>
+            <param name="stream">A stream for reading the archive.</param>
+            <returns>The offset in bytes of the archive,
+            or -1 if no archive is found in the Stream.</returns>
+            <remarks>The archive must begin on a 4-byte boundary.</remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.CompressionEngine.GetFileInfo(System.IO.Stream)">
+            <summary>
+            Gets information about all files in an archive stream.
+            </summary>
+            <param name="stream">A stream for reading the archive.</param>
+            <returns>Information about all files in the archive stream.</returns>
+            <exception cref="T:Microsoft.Deployment.Compression.ArchiveException">The stream is not a valid
+            archive.</exception>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.CompressionEngine.GetFileInfo(Microsoft.Deployment.Compression.IUnpackStreamContext,System.Predicate{System.String})">
+            <summary>
+            Gets information about files in an archive or archive chain.
+            </summary>
+            <param name="streamContext">A context interface to handle opening
+            and closing of archive and file streams.</param>
+            <param name="fileFilter">A predicate that can determine
+            which files to process, optional.</param>
+            <returns>Information about files in the archive stream.</returns>
+            <exception cref="T:Microsoft.Deployment.Compression.ArchiveException">The archive provided
+            by the stream context is not valid.</exception>
+            <remarks>
+            The <paramref name="fileFilter"/> predicate takes an internal file
+            path and returns true to include the file or false to exclude it.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.CompressionEngine.GetFiles(System.IO.Stream)">
+            <summary>
+            Gets the list of files in an archive Stream.
+            </summary>
+            <param name="stream">A stream for reading the archive.</param>
+            <returns>A list of the paths of all files contained in the
+            archive.</returns>
+            <exception cref="T:Microsoft.Deployment.Compression.ArchiveException">The stream is not a valid
+            archive.</exception>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.CompressionEngine.GetFiles(Microsoft.Deployment.Compression.IUnpackStreamContext,System.Predicate{System.String})">
+            <summary>
+            Gets the list of files in an archive or archive chain.
+            </summary>
+            <param name="streamContext">A context interface to handle opening
+            and closing of archive and file streams.</param>
+            <param name="fileFilter">A predicate that can determine
+            which files to process, optional.</param>
+            <returns>An array containing the names of all files contained in
+            the archive or archive chain.</returns>
+            <exception cref="T:Microsoft.Deployment.Compression.ArchiveException">The archive provided
+            by the stream context is not valid.</exception>
+            <remarks>
+            The <paramref name="fileFilter"/> predicate takes an internal file
+            path and returns true to include the file or false to exclude it.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.CompressionEngine.Unpack(System.IO.Stream,System.String)">
+            <summary>
+            Reads a single file from an archive stream.
+            </summary>
+            <param name="stream">A stream for reading the archive.</param>
+            <param name="path">The path of the file within the archive
+            (not the external file path).</param>
+            <returns>A stream for reading the extracted file, or null
+            if the file does not exist in the archive.</returns>
+            <exception cref="T:Microsoft.Deployment.Compression.ArchiveException">The stream is not a valid
+            archive.</exception>
+            <remarks>The entire extracted file is cached in memory, so this
+            method requires enough free memory to hold the file.</remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.CompressionEngine.Unpack(Microsoft.Deployment.Compression.IUnpackStreamContext,System.Predicate{System.String})">
+            <summary>
+            Extracts files from an archive or archive chain.
+            </summary>
+            <param name="streamContext">A context interface to handle opening
+            and closing of archive and file streams.</param>
+            <param name="fileFilter">An optional predicate that can determine
+            which files to process.</param>
+            <exception cref="T:Microsoft.Deployment.Compression.ArchiveException">The archive provided
+            by the stream context is not valid.</exception>
+            <remarks>
+            The <paramref name="fileFilter"/> predicate takes an internal file
+            path and returns true to include the file or false to exclude it.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.CompressionEngine.OnProgress(Microsoft.Deployment.Compression.ArchiveProgressEventArgs)">
+            <summary>
+            Called by sublcasses to distribute a packing or unpacking progress
+            event to listeners.
+            </summary>
+            <param name="e">Event details.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.CompressionEngine.Dispose(System.Boolean)">
+            <summary>
+            Disposes of resources allocated by the compression engine.
+            </summary>
+            <param name="disposing">If true, the method has been called
+            directly or indirectly by a user's code, so managed and unmanaged
+            resources will be disposed. If false, the method has been called by
+            the runtime from inside the finalizer, and only unmanaged resources
+            will be disposed.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.CompressionEngine.DosDateAndTimeToDateTime(System.Int16,System.Int16,System.DateTime@)">
+            <summary>
+            Compresion utility function for converting old-style
+            date and time values to a DateTime structure.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.CompressionEngine.DateTimeToDosDateAndTime(System.DateTime,System.Int16@,System.Int16@)">
+            <summary>
+            Compresion utility function for converting a DateTime structure
+            to old-style date and time values.
+            </summary>
+        </member>
+        <member name="E:Microsoft.Deployment.Compression.CompressionEngine.Progress">
+            <summary>
+            Occurs when the compression engine reports progress in packing
+            or unpacking an archive.
+            </summary>
+            <seealso cref="T:Microsoft.Deployment.Compression.ArchiveProgressType"/>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.CompressionEngine.UseTempFiles">
+            <summary>
+            Gets or sets a flag indicating whether temporary files are created
+            and used during compression.
+            </summary>
+            <value>True if temporary files are used; false if compression is done
+            entirely in-memory.</value>
+            <remarks>The value of this property is true by default. Using temporary
+            files can greatly reduce the memory requirement of compression,
+            especially when compressing large archives. However, setting this property
+            to false may yield slightly better performance when creating small
+            archives. Or it may be necessary if the process does not have sufficient
+            privileges to create temporary files.</remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.CompressionEngine.CompressionLevel">
+            <summary>
+            Compression level to use when compressing files.
+            </summary>
+            <value>A compression level ranging from minimum to maximum compression,
+            or no compression.</value>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.CompressionLevel">
+            <summary>
+            Specifies the compression level ranging from minimum compresion to
+            maximum compression, or no compression at all.
+            </summary>
+            <remarks>
+            Although only four values are enumerated, any integral value between
+            <see cref="F:Microsoft.Deployment.Compression.CompressionLevel.Min"/> and <see cref="F:Microsoft.Deployment.Compression.CompressionLevel.Max"/> can also be used.
+            </remarks>
+        </member>
+        <member name="F:Microsoft.Deployment.Compression.CompressionLevel.None">
+            <summary>Do not compress files, only store.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.Compression.CompressionLevel.Min">
+            <summary>Minimum compression; fastest.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.Compression.CompressionLevel.Normal">
+            <summary>A compromize between speed and compression efficiency.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.Compression.CompressionLevel.Max">
+            <summary>Maximum compression; slowest.</summary>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.CargoStream">
+            <summary>
+            Wraps a source stream and carries additional items that are disposed when the stream is closed.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.CargoStream.#ctor(System.IO.Stream,System.IDisposable[])">
+            <summary>
+            Creates a new a cargo stream.
+            </summary>
+            <param name="source">source of the stream</param>
+            <param name="cargo">List of additional items that are disposed when the stream is closed.
+            The order of the list is the order in which the items are disposed.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.CargoStream.Flush">
+            <summary>
+            Flushes the source stream.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.CargoStream.SetLength(System.Int64)">
+            <summary>
+            Sets the length of the source stream.
+            </summary>
+            <param name="value">The desired length of the stream in bytes.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.CargoStream.Close">
+            <summary>
+            Closes the source stream and also closes the additional objects that are carried.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.CargoStream.Read(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Reads from the source stream.
+            </summary>
+            <param name="buffer">An array of bytes. When this method returns, the buffer
+            contains the specified byte array with the values between offset and
+            (offset + count - 1) replaced by the bytes read from the source.</param>
+            <param name="offset">The zero-based byte offset in buffer at which to begin
+            storing the data read from the stream.</param>
+            <param name="count">The maximum number of bytes to be read from the stream.</param>
+            <returns>The total number of bytes read into the buffer. This can be less
+            than the number of bytes requested if that many bytes are not currently available,
+            or zero (0) if the end of the stream has been reached.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.CargoStream.Write(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Writes to the source stream.
+            </summary>
+            <param name="buffer">An array of bytes. This method copies count
+            bytes from buffer to the stream.</param>
+            <param name="offset">The zero-based byte offset in buffer at which
+            to begin copying bytes to the stream.</param>
+            <param name="count">The number of bytes to be written to the stream.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.CargoStream.Seek(System.Int64,System.IO.SeekOrigin)">
+            <summary>
+            Changes the position of the source stream.
+            </summary>
+            <param name="offset">A byte offset relative to the origin parameter.</param>
+            <param name="origin">A value of type SeekOrigin indicating the reference
+            point used to obtain the new position.</param>
+            <returns>The new position within the stream.</returns>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.CargoStream.Source">
+            <summary>
+            Gets the source stream of the cargo stream.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.CargoStream.Cargo">
+            <summary>
+            Gets the list of additional items that are disposed when the stream is closed.
+            The order of the list is the order in which the items are disposed. The contents can be modified any time.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.CargoStream.CanRead">
+            <summary>
+            Gets a value indicating whether the source stream supports reading.
+            </summary>
+            <value>true if the stream supports reading; otherwise, false.</value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.CargoStream.CanWrite">
+            <summary>
+            Gets a value indicating whether the source stream supports writing.
+            </summary>
+            <value>true if the stream supports writing; otherwise, false.</value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.CargoStream.CanSeek">
+            <summary>
+            Gets a value indicating whether the source stream supports seeking.
+            </summary>
+            <value>true if the stream supports seeking; otherwise, false.</value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.CargoStream.Length">
+            <summary>
+            Gets the length of the source stream.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.CargoStream.Position">
+            <summary>
+            Gets or sets the position of the source stream.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.DuplicateStream">
+            <summary>
+            Duplicates a source stream by maintaining a separate position.
+            </summary>
+            <remarks>
+            WARNING: duplicate streams are not thread-safe with respect to each other or the original stream.
+            If multiple threads use duplicate copies of the same stream, they must synchronize for any operations.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.DuplicateStream.#ctor(System.IO.Stream)">
+            <summary>
+            Creates a new duplicate of a stream.
+            </summary>
+            <param name="source">source of the duplicate</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.DuplicateStream.OriginalStream(System.IO.Stream)">
+            <summary>
+            Retrieves the original stream from a possible duplicate stream.
+            </summary>
+            <param name="stream">Possible duplicate stream.</param>
+            <returns>If the stream is a DuplicateStream, returns
+            the duplicate's source; otherwise returns the same stream.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.DuplicateStream.Flush">
+            <summary>
+            Flushes the source stream.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.DuplicateStream.SetLength(System.Int64)">
+            <summary>
+            Sets the length of the source stream.
+            </summary>
+            <param name="value">The desired length of the stream in bytes.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.DuplicateStream.Close">
+            <summary>
+            Closes the underlying stream, effectively closing ALL duplicates.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.DuplicateStream.Read(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Reads from the source stream while maintaining a separate position
+            and not impacting the source stream's position.
+            </summary>
+            <param name="buffer">An array of bytes. When this method returns, the buffer
+            contains the specified byte array with the values between offset and
+            (offset + count - 1) replaced by the bytes read from the current source.</param>
+            <param name="offset">The zero-based byte offset in buffer at which to begin
+            storing the data read from the current stream.</param>
+            <param name="count">The maximum number of bytes to be read from the current stream.</param>
+            <returns>The total number of bytes read into the buffer. This can be less
+            than the number of bytes requested if that many bytes are not currently available,
+            or zero (0) if the end of the stream has been reached.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.DuplicateStream.Write(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Writes to the source stream while maintaining a separate position
+            and not impacting the source stream's position.
+            </summary>
+            <param name="buffer">An array of bytes. This method copies count
+            bytes from buffer to the current stream.</param>
+            <param name="offset">The zero-based byte offset in buffer at which
+            to begin copying bytes to the current stream.</param>
+            <param name="count">The number of bytes to be written to the
+            current stream.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.DuplicateStream.Seek(System.Int64,System.IO.SeekOrigin)">
+            <summary>
+            Changes the position of this stream without impacting the
+            source stream's position.
+            </summary>
+            <param name="offset">A byte offset relative to the origin parameter.</param>
+            <param name="origin">A value of type SeekOrigin indicating the reference
+            point used to obtain the new position.</param>
+            <returns>The new position within the current stream.</returns>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.DuplicateStream.Source">
+            <summary>
+            Gets the original stream that was used to create the duplicate.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.DuplicateStream.CanRead">
+            <summary>
+            Gets a value indicating whether the source stream supports reading.
+            </summary>
+            <value>true if the stream supports reading; otherwise, false.</value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.DuplicateStream.CanWrite">
+            <summary>
+            Gets a value indicating whether the source stream supports writing.
+            </summary>
+            <value>true if the stream supports writing; otherwise, false.</value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.DuplicateStream.CanSeek">
+            <summary>
+            Gets a value indicating whether the source stream supports seeking.
+            </summary>
+            <value>true if the stream supports seeking; otherwise, false.</value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.DuplicateStream.Length">
+            <summary>
+            Gets the length of the source stream.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.DuplicateStream.Position">
+            <summary>
+            Gets or sets the position of the current stream,
+            ignoring the position of the source stream.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.Compression.OffsetStream">
+            <summary>
+            Wraps a source stream and offsets all read/write/seek calls by a given value.
+            </summary>
+            <remarks>
+            This class is used to trick archive an packing or unpacking process
+            into reading or writing at an offset into a file, primarily for
+            self-extracting packages.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.OffsetStream.#ctor(System.IO.Stream,System.Int64)">
+            <summary>
+            Creates a new OffsetStream instance from a source stream
+            and using a specified offset.
+            </summary>
+            <param name="source">Underlying stream for which all calls will be offset.</param>
+            <param name="offset">Positive or negative number of bytes to offset.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.OffsetStream.Read(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Reads a sequence of bytes from the source stream and advances
+            the position within the stream by the number of bytes read.
+            </summary>
+            <param name="buffer">An array of bytes. When this method returns, the buffer
+            contains the specified byte array with the values between offset and
+            (offset + count - 1) replaced by the bytes read from the current source.</param>
+            <param name="offset">The zero-based byte offset in buffer at which to begin
+            storing the data read from the current stream.</param>
+            <param name="count">The maximum number of bytes to be read from the current stream.</param>
+            <returns>The total number of bytes read into the buffer. This can be less
+            than the number of bytes requested if that many bytes are not currently available,
+            or zero (0) if the end of the stream has been reached.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.OffsetStream.Write(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Writes a sequence of bytes to the source stream and advances the
+            current position within this stream by the number of bytes written.
+            </summary>
+            <param name="buffer">An array of bytes. This method copies count
+            bytes from buffer to the current stream.</param>
+            <param name="offset">The zero-based byte offset in buffer at which
+            to begin copying bytes to the current stream.</param>
+            <param name="count">The number of bytes to be written to the
+            current stream.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.OffsetStream.ReadByte">
+            <summary>
+            Reads a byte from the stream and advances the position within the
+            source stream by one byte, or returns -1 if at the end of the stream.
+            </summary>
+            <returns>The unsigned byte cast to an Int32, or -1 if at the
+            end of the stream.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.OffsetStream.WriteByte(System.Byte)">
+            <summary>
+            Writes a byte to the current position in the source stream and
+            advances the position within the stream by one byte.
+            </summary>
+            <param name="value">The byte to write to the stream.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.OffsetStream.Flush">
+            <summary>
+            Flushes the source stream.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.OffsetStream.Seek(System.Int64,System.IO.SeekOrigin)">
+            <summary>
+            Sets the position within the current stream, which is
+            equal to the position within the source stream minus the offset.
+            </summary>
+            <param name="offset">A byte offset relative to the origin parameter.</param>
+            <param name="origin">A value of type SeekOrigin indicating
+            the reference point used to obtain the new position.</param>
+            <returns>The new position within the current stream.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.OffsetStream.SetLength(System.Int64)">
+            <summary>
+            Sets the effective length of the stream, which is equal to
+            the length of the source stream minus the offset.
+            </summary>
+            <param name="value">The desired length of the
+            current stream in bytes.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Compression.OffsetStream.Close">
+            <summary>
+            Closes the underlying stream.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.OffsetStream.Source">
+            <summary>
+            Gets the underlying stream that this OffsetStream calls into.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.OffsetStream.Offset">
+            <summary>
+            Gets the number of bytes to offset all calls before
+            redirecting to the underlying stream.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.OffsetStream.CanRead">
+            <summary>
+            Gets a value indicating whether the source stream supports reading.
+            </summary>
+            <value>true if the stream supports reading; otherwise, false.</value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.OffsetStream.CanWrite">
+            <summary>
+            Gets a value indicating whether the source stream supports writing.
+            </summary>
+            <value>true if the stream supports writing; otherwise, false.</value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.OffsetStream.CanSeek">
+            <summary>
+            Gets a value indicating whether the source stream supports seeking.
+            </summary>
+            <value>true if the stream supports seeking; otherwise, false.</value>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.OffsetStream.Length">
+            <summary>
+            Gets the effective length of the stream, which is equal to
+            the length of the source stream minus the offset.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.Compression.OffsetStream.Position">
+            <summary>
+            Gets or sets the effective position of the stream, which
+            is equal to the position of the source stream minus the offset.
+            </summary>
+        </member>
+    </members>
+</doc>
diff --git a/sdk/Microsoft.Deployment.Resources.dll b/sdk/Microsoft.Deployment.Resources.dll
new file mode 100755
index 0000000..789ab38
--- /dev/null
+++ b/sdk/Microsoft.Deployment.Resources.dll
Binary files differ
diff --git a/sdk/Microsoft.Deployment.Resources.xml b/sdk/Microsoft.Deployment.Resources.xml
new file mode 100644
index 0000000..3d4b628
--- /dev/null
+++ b/sdk/Microsoft.Deployment.Resources.xml
@@ -0,0 +1,443 @@
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>Microsoft.Deployment.Resources</name>
+    </assembly>
+    <members>
+        <member name="T:Microsoft.Deployment.Resources.Resource">
+            <summary>
+            Represents a Win32 resource which can be loaded from and saved to a PE file.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.Resource.#ctor(Microsoft.Deployment.Resources.ResourceType,System.String,System.Int32)">
+            <summary>
+            Creates a new Resource object without any data. The data can be later loaded from a file.
+            </summary>
+            <param name="type">Type of the resource; may be one of the ResourceType constants or a user-defined type.</param>
+            <param name="name">Name of the resource. For a numeric resource identifier, prefix the decimal number with a "#".</param>
+            <param name="locale">Locale of the resource</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.Resource.#ctor(Microsoft.Deployment.Resources.ResourceType,System.String,System.Int32,System.Byte[])">
+            <summary>
+            Creates a new Resource object with data. The data can be later saved to a file.
+            </summary>
+            <param name="type">Type of the resource; may be one of the ResourceType constants or a user-defined type.</param>
+            <param name="name">Name of the resource. For a numeric resource identifier, prefix the decimal number with a "#".</param>
+            <param name="locale">Locale of the resource</param>
+            <param name="data">Raw resource data</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.Resource.Load(System.String)">
+            <summary>
+            Loads the resource data from a file.  The file is searched for a resource with matching type, name, and locale.
+            </summary>
+            <param name="file">Win32 PE file containing the resource</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.Resource.Save(System.String)">
+            <summary>
+            Saves the resource to a file.  Any existing resource data with matching type, name, and locale is overwritten.
+            </summary>
+            <param name="file">Win32 PE file to contain the resource</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.Resource.Equals(System.Object)">
+            <summary>
+            Tests if type, name, and locale of this Resource object match another Resource object.
+            </summary>
+            <param name="obj">Resource object to be compared</param>
+            <returns>True if the objects represent the same resource; false otherwise.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.Resource.GetHashCode">
+            <summary>
+            Gets a hash code for this Resource object.
+            </summary>
+            <returns>Hash code generated from the resource type, name, and locale.</returns>
+        </member>
+        <member name="P:Microsoft.Deployment.Resources.Resource.ResourceType">
+            <summary>
+            Gets or sets the type of the resource.  This may be one of the ResourceType constants
+            or a user-defined type name.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.Resources.Resource.Name">
+            <summary>
+            Gets or sets the name of the resource.  For a numeric resource identifier, the decimal number is prefixed with a "#".
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.Resources.Resource.Locale">
+            <summary>
+            Gets or sets the locale of the resource.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.Resources.Resource.Data">
+            <summary>
+            Gets or sets the raw data of the resource.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.Resources.ResourceCollection">
+            <summary>
+            Allows reading and editing of resource data in a Win32 PE file.
+            </summary>
+            <remarks>
+            To use this class:<list type="number">
+            <item>Create a new ResourceCollection</item>
+            <item>Locate resources for the collection by calling one of the <see cref="M:Microsoft.Deployment.Resources.ResourceCollection.Find(System.String)"/> methods</item>
+            <item>Load data of one or more <see cref="T:Microsoft.Deployment.Resources.Resource"/>s from a file by calling the <see cref="M:Microsoft.Deployment.Resources.ResourceCollection.Load(System.String)"/> method of the
+            Resource class, or load them all at once (more efficient) with the <see cref="M:Microsoft.Deployment.Resources.ResourceCollection.Load(System.String)"/> method of the ResourceCollection.</item>
+            <item>Read and/or edit data of the individual Resource objects using the methods on that class.</item>
+            <item>Save data of one or more <see cref="T:Microsoft.Deployment.Resources.Resource"/>s to a file by calling the <see cref="M:Microsoft.Deployment.Resources.ResourceCollection.Save(System.String)"/> method of the
+            Resource class, or save them all at once (more efficient) with the <see cref="M:Microsoft.Deployment.Resources.ResourceCollection.Save(System.String)"/> method of the ResourceCollection.</item>
+            </list>
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.ResourceCollection.#ctor">
+            <summary>
+            Creates a new, empty ResourceCollection.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.ResourceCollection.Find(System.String)">
+            <summary>
+            Locates all resources in a file, including all resource types and languages.  For each located resource,
+            a <see cref="T:Microsoft.Deployment.Resources.Resource"/> instance (or subclass) is added to the collection.
+            </summary>
+            <param name="resFile">The file to be searched for resources.</param>
+            <exception cref="T:System.IO.IOException">resources could not be read from the file</exception>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.ResourceCollection.Find(System.String,Microsoft.Deployment.Resources.ResourceType)">
+            <summary>
+            Locates all resources in a file of a given type, including all languages.  For each located resource,
+            a <see cref="T:Microsoft.Deployment.Resources.Resource"/> instance (or subclass) is added to the collection.
+            </summary>
+            <param name="resFile">The file to be searched for resources.</param>
+            <param name="type">The type of resource to search for; may be one of the ResourceType constants or a user-defined type.</param>
+            <exception cref="T:System.IO.IOException">resources could not be read from the file</exception>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.ResourceCollection.Find(System.String,Microsoft.Deployment.Resources.ResourceType,System.String)">
+            <summary>
+            Locates all resources in a file of a given type and language.  For each located resource,
+            a <see cref="T:Microsoft.Deployment.Resources.Resource"/> instance (or subclass) is added to the collection.
+            </summary>
+            <param name="resFile">The file to be searched for resources.</param>
+            <param name="type">The type of resource to search for; may be one of the ResourceType constants or a user-defined type.</param>
+            <param name="name">The name of the resource to search for.</param>
+            <exception cref="T:System.IO.IOException">resources could not be read from the file</exception>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.ResourceCollection.Load(System.String)">
+            <summary>
+            For all resources in the collection, loads their data from a resource file.
+            </summary>
+            <param name="file">The file from which resources are loaded.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.ResourceCollection.Save(System.String)">
+            <summary>
+            For all resources in the collection, saves their data to a resource file.
+            </summary>
+            <param name="file">The file to which resources are saved.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.ResourceCollection.Add(Microsoft.Deployment.Resources.Resource)">
+            <summary>
+            Adds a new item to the collection.
+            </summary>
+            <param name="item">The Resource to add.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.ResourceCollection.Remove(Microsoft.Deployment.Resources.Resource)">
+            <summary>
+            Removes an item to the collection.
+            </summary>
+            <param name="item">The Resource to remove.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.ResourceCollection.IndexOf(Microsoft.Deployment.Resources.Resource)">
+            <summary>
+            Gets the index of an item in the collection.
+            </summary>
+            <param name="item">The Resource to search for.</param>
+            <returns>The index of the item, or -1 if not found.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.ResourceCollection.Insert(System.Int32,Microsoft.Deployment.Resources.Resource)">
+            <summary>
+            Inserts a item into the collection.
+            </summary>
+            <param name="index">The insertion index.</param>
+            <param name="item">The Resource to insert.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.ResourceCollection.Contains(Microsoft.Deployment.Resources.Resource)">
+            <summary>
+            Tests if the collection contains an item.
+            </summary>
+            <param name="item">The Resource to search for.</param>
+            <returns>true if the item is found; false otherwise</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.ResourceCollection.CopyTo(Microsoft.Deployment.Resources.Resource[],System.Int32)">
+            <summary>
+            Copies the collection into an array.
+            </summary>
+            <param name="array">The array to copy into.</param>
+            <param name="arrayIndex">The starting index in the destination array.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.ResourceCollection.Clear">
+            <summary>
+            Removes all resources from the collection.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.ResourceCollection.GetEnumerator">
+            <summary>
+            Gets an enumerator over all resources in the collection.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="P:Microsoft.Deployment.Resources.ResourceCollection.Item(System.Int32)">
+            <summary>
+            Gets or sets the element at the specified index.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.Resources.ResourceCollection.Count">
+            <summary>
+            Gets the number of resources in the collection.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.Resources.ResourceType">
+            <summary>
+            Represents either a standard integer resource type or a custom resource type name.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.ResourceType.#ctor(System.String)">
+            <summary>
+            Creates a new resource type from a string resource name.
+            </summary>
+            <param name="resourceType">String resource name,
+            or an integer resource type prefixed by a #.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.ResourceType.#ctor(System.Int32)">
+            <summary>
+            Creates a new integer resource type.
+            </summary>
+            <param name="resourceType">Integer value of a well-known resource type.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.ResourceType.ToString">
+            <summary>
+            Gets a string representation of the resource type.
+            </summary>
+            <returns>The custom resource name, or the name of a well-known resource type.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.ResourceType.Equals(System.Object)">
+            <summary>
+            Tests whether one resource type equals another object.
+            </summary>
+            <param name="obj">Other object.</param>
+            <returns>True if equal, else false.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.ResourceType.Equals(Microsoft.Deployment.Resources.ResourceType)">
+            <summary>
+            Tests whether one resource type equals another.
+            </summary>
+            <param name="otherType">Other resource type.</param>
+            <returns>True if equal, else false.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.ResourceType.GetHashCode">
+            <summary>
+            Gets a hash code suitable for using the resource type as a dictionary key.
+            </summary>
+            <returns>Hash code based on the resource type string.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.ResourceType.op_Implicit(System.String)~Microsoft.Deployment.Resources.ResourceType">
+            <summary>
+            Implicitly converts a string to a ResourceType.
+            </summary>
+            <param name="resourceType">String resource type to convert.</param>
+            <returns>ResourceType object.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.ResourceType.op_Explicit(Microsoft.Deployment.Resources.ResourceType)~System.String">
+            <summary>
+            Explicitly converts a ResourceType to a string.
+            </summary>
+            <param name="resourceType">ResourceType object to convert.</param>
+            <returns>The resource type string.</returns>
+            <remarks>
+            Unlike <see cref="M:Microsoft.Deployment.Resources.ResourceType.ToString"/>, this conversion does not return
+            the common name of well-known integer resource types. Therefore,
+            the returned string is suitable for passing directly to Win32
+            resource APIs that accept resource type strings.
+            </remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.Resources.ResourceType.IsInteger">
+            <summary>
+            Gets a flag indicating whether the resource type is an integer type.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.Resources.ResourceType.IntegerValue">
+            <summary>
+            Gets the integer value of the resource type, or -1 if the resource type is not an integer.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.Resources.VersionBuildTypes">
+            <summary>
+            Identifies build types of a versioned file.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.Resources.VersionFileType">
+            <summary>
+            Identifies the type of a versioned file.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.Resources.VersionFileSubtype">
+            <summary>
+            Identifies the sub-type of a versioned file.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.Resources.VersionResource">
+            <summary>
+            A subclass of Resource which provides specific methods for manipulating the resource data.
+            </summary>
+            <remarks>
+            The resource is of type <see cref="P:Microsoft.Deployment.Resources.ResourceType.Version"/> (RT_VERSION).
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.VersionResource.#ctor(System.String,System.Int32)">
+            <summary>
+            Creates a new VersionResource object without any data. The data can be later loaded from a file.
+            </summary>
+            <param name="name">Name of the resource. For a numeric resource identifier, prefix the decimal number with a "#".</param>
+            <param name="locale">Locale of the resource</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.VersionResource.#ctor(System.String,System.Int32,System.Byte[])">
+            <summary>
+            Creates a new VersionResource object with data. The data can be later saved to a file.
+            </summary>
+            <param name="name">Name of the resource. For a numeric resource identifier, prefix the decimal number with a "#".</param>
+            <param name="locale">Locale of the resource</param>
+            <param name="data">Raw resource data</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.VersionResource.Add(System.Int32)">
+            <summary>
+            Adds a new version string table for a locale.
+            </summary>
+            <param name="locale">Locale of the table</param>
+            <returns>The new string table, or the existing table if the locale already existed.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.VersionResource.Remove(System.Int32)">
+            <summary>
+            Removes a version string table for a locale.
+            </summary>
+            <param name="locale">Locale of the table</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.VersionResource.Contains(System.Int32)">
+            <summary>
+            Checks if a version string table exists for a given locale.
+            </summary>
+            <param name="locale">Locale to search for</param>
+            <returns>True if a string table was found for the locale; false otherwise.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.VersionResource.Clear">
+            <summary>
+            Removes all string tables from the version resource.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.VersionResource.CopyTo(Microsoft.Deployment.Resources.VersionStringTable[],System.Int32)">
+            <summary>
+            Copies the version string tables to an array, starting at a particular array index.
+            </summary>
+            <param name="array">The one-dimensional Array that is the destination of the elements copied
+            from the collection. The Array must have zero-based indexing.</param>
+            <param name="arrayIndex">The zero-based index in array at which copying begins.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.VersionResource.GetEnumerator">
+            <summary>
+            Gets an enumerator that can iterate over the version string tables in the collection.
+            </summary>
+            <returns>An enumerator that returns <see cref="T:Microsoft.Deployment.Resources.VersionStringTable"/> objects.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.VersionResource.System#Collections#IEnumerable#GetEnumerator">
+            <summary>
+            Gets an enumerator that can iterate over the version string tables in the collection.
+            </summary>
+            <returns>An enumerator that returns <see cref="T:Microsoft.Deployment.Resources.VersionStringTable"/> objects.</returns>
+        </member>
+        <member name="P:Microsoft.Deployment.Resources.VersionResource.Data">
+            <summary>
+            Gets or sets the raw data of the resource.  The data is in the format of the VS_VERSIONINFO structure.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.Resources.VersionResource.FileVersion">
+            <summary>
+            Gets or sets the binary locale-independent file version of the version resource.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.Resources.VersionResource.ProductVersion">
+            <summary>
+            Gets or sets the binary locale-independent product version of the version resource.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.Resources.VersionResource.BuildTypes">
+            <summary>
+            Gets or sets a bitmask that specifies the build types of the file.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.Resources.VersionResource.FileType">
+            <summary>
+            Gets or sets the general type of the file.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.Resources.VersionResource.FileSubtype">
+            <summary>
+            Gets or sets the specific type of the file.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.Resources.VersionResource.Timestamp">
+            <summary>
+            Gets or sets the binary creation date and time.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.Resources.VersionResource.Item(System.Int32)">
+            <summary>
+            Gets the string table for a specific locale, or null if there is no table for that locale.
+            </summary>
+            <seealso cref="M:Microsoft.Deployment.Resources.VersionResource.Add(System.Int32)"/>
+            <seealso cref="M:Microsoft.Deployment.Resources.VersionResource.Remove(System.Int32)"/>
+        </member>
+        <member name="P:Microsoft.Deployment.Resources.VersionResource.Count">
+            <summary>
+            Gets the number string tables in the version resource.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.Resources.VersionStringTable">
+            <summary>
+            Represents a string table of a file version resource.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.VersionStringTable.Clear">
+            <summary>
+            Removes all strings from the string table.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.Resources.VersionStringTable.GetEnumerator">
+            <summary>
+            Gets an enumeration over all strings in the table.
+            </summary>
+            <returns>Enumeration of string name and value pairs</returns>
+        </member>
+        <member name="P:Microsoft.Deployment.Resources.VersionStringTable.Locale">
+            <summary>
+            Gets the locale (LCID) of the string table.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.Resources.VersionStringTable.Item(System.String)">
+            <summary>
+            Gets or sets a string value.
+            </summary>
+            <param name="key">Name of the string.</param>
+        </member>
+        <member name="P:Microsoft.Deployment.Resources.VersionStringTable.Keys">
+            <summary>
+            Gets a collection of all the names of the strings in the table.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.Resources.VersionStringTable.Values">
+            <summary>
+            Gets a collection of all the values in the table.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.Resources.VersionStringTable.Count">
+            <summary>
+            Gets the number of strings in the table.
+            </summary>
+        </member>
+    </members>
+</doc>
diff --git a/sdk/Microsoft.Deployment.WindowsInstaller.Linq.dll b/sdk/Microsoft.Deployment.WindowsInstaller.Linq.dll
new file mode 100755
index 0000000..ce9fbc9
--- /dev/null
+++ b/sdk/Microsoft.Deployment.WindowsInstaller.Linq.dll
Binary files differ
diff --git a/sdk/Microsoft.Deployment.WindowsInstaller.Linq.xml b/sdk/Microsoft.Deployment.WindowsInstaller.Linq.xml
new file mode 100644
index 0000000..428fb76
--- /dev/null
+++ b/sdk/Microsoft.Deployment.WindowsInstaller.Linq.xml
@@ -0,0 +1,434 @@
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>Microsoft.Deployment.WindowsInstaller.Linq</name>
+    </assembly>
+    <members>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.Linq.DatabaseTableAttribute">
+            <summary>
+            Apply to a subclass of QRecord to indicate the name of
+            the table the record type is to be used with.
+            </summary>
+            <remarks>
+            If this attribute is not used on a record type, the default
+            table name will be derived from the record type name. (An
+            optional underscore suffix is stripped.)
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Linq.DatabaseTableAttribute.#ctor(System.String)">
+            <summary>
+            Creates a new DatabaseTableAttribute for the specified table.
+            </summary>
+            <param name="table">name of the table associated with the record type</param>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Linq.DatabaseTableAttribute.Table">
+            <summary>
+            Gets or sets the table associated with the record type.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.Linq.DatabaseColumnAttribute">
+            <summary>
+            Apply to a property on a subclass of QRecord to indicate
+            the name of the column the property is to be associated with.
+            </summary>
+            <remarks>
+            If this attribute is not used on a property, the default
+            column name will be the same as the property name.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Linq.DatabaseColumnAttribute.#ctor(System.String)">
+            <summary>
+            Creates a new DatabaseColumnAttribute which maps a
+            record property to a column.
+            </summary>
+            <param name="column">name of the column associated with the property</param>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Linq.DatabaseColumnAttribute.Column">
+            <summary>
+            Gets or sets the column associated with the record property.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.Linq.QRecord">
+            <summary>
+            Generic record entity for queryable databases,
+            and base for strongly-typed entity subclasses.
+            </summary>
+            <remarks>
+            Several predefined specialized subclasses are provided for common
+            standard tables. Subclasses for additional standard tables
+            or custom tables are not necessary, but they are easy to create
+            and make the coding experience much nicer.
+            <para>When creating subclasses, the following attributes may be
+            useful: <see cref="T:Microsoft.Deployment.WindowsInstaller.Linq.DatabaseTableAttribute"/>,
+            <see cref="T:Microsoft.Deployment.WindowsInstaller.Linq.DatabaseColumnAttribute"/></para>
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Linq.QRecord.#ctor">
+            <summary>
+            Do not call. Use QTable.NewRecord() instead.
+            </summary>
+            <remarks>
+            Subclasses must also provide a public parameterless constructor.
+            <para>QRecord constructors are only public due to implementation
+            reasons (to satisfy the new() constraint on the QTable generic
+            class). They are not intended to be called by user code other than
+            a subclass constructor. If the constructor is invoked directly,
+            the record instance will not be properly initialized (associated
+            with a database table) and calls to methods on the instance
+            will throw a NullReferenceException.</para>
+            </remarks>
+            <seealso cref="M:Microsoft.Deployment.WindowsInstaller.Linq.QTable`1.NewRecord"/>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Linq.QRecord.I(System.Int32)">
+            <summary>
+            Used by subclasses to get a field as an integer.
+            </summary>
+            <param name="index">zero-based column index of the field</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Linq.QRecord.NI(System.Int32)">
+            <summary>
+            Used by subclasses to get a field as a nullable integer.
+            </summary>
+            <param name="index">zero-based column index of the field</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Linq.QRecord.ToString">
+            <summary>
+            Dumps all record fields to a string.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Linq.QRecord.Update(System.Collections.Generic.IList{System.String},System.Collections.Generic.IList{System.String})">
+            <summary>
+            Update multiple fields in the record (and the database).
+            </summary>
+            <param name="fields">column names of fields to update</param>
+            <param name="values">new values for each field being updated</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Linq.QRecord.Update(System.Collections.Generic.IList{System.Int32},System.Collections.Generic.IList{System.String})">
+            <summary>
+            Update multiple fields in the record (and the database).
+            </summary>
+            <param name="indexes">column indexes of fields to update</param>
+            <param name="values">new values for each field being updated</param>
+            <remarks>
+            The record (primary keys) must already exist in the table.
+            <para>Updating primary key fields is not yet implemented; use Delete()
+            and Insert() instead.</para>
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Linq.QRecord.Insert">
+            <summary>
+            Inserts the record in the database.
+            </summary>
+            <remarks>
+            The record (primary keys) may not already exist in the table.
+            <para>Use <see cref="M:Microsoft.Deployment.WindowsInstaller.Linq.QTable`1.NewRecord"/> to get a new 
+            record. Prmary keys and all required fields
+            must be filled in before insertion.</para>
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Linq.QRecord.Insert(System.Boolean)">
+            <summary>
+            Inserts the record into the table.
+            </summary>
+            <param name="temporary">true if the record is temporarily
+            inserted, to be visible only as long as the database is open</param>
+            <remarks>
+            The record (primary keys) may not already exist in the table.
+            <para>Use <see cref="M:Microsoft.Deployment.WindowsInstaller.Linq.QTable`1.NewRecord"/> to get a new 
+            record. Prmary keys and all required fields
+            must be filled in before insertion.</para>
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Linq.QRecord.Delete">
+            <summary>
+            Deletes the record from the table if it exists.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Linq.QRecord.Refresh">
+            <summary>
+            Not yet implemented.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Linq.QRecord.Assign">
+            <summary>
+            Not yet implemented.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Linq.QRecord.Merge">
+            <summary>
+            Not yet implemented.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Linq.QRecord.Validate">
+            <summary>
+            Not yet implemented.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Linq.QRecord.ValidateNew">
+            <summary>
+            Not yet implemented.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Linq.QRecord.ValidateFields">
+            <summary>
+            Not yet implemented.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Linq.QRecord.ValidateDelete">
+            <summary>
+            Not yet implemented.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Linq.QRecord.FieldCount">
+            <summary>
+            Gets the number of fields in the record.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Linq.QRecord.Item(System.String)">
+            <summary>
+            Gets or sets a record field.
+            </summary>
+            <param name="field">column name of the field</param>
+            <remarks>
+            Setting a field value will automatically update the database.
+            </remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Linq.QRecord.Item(System.Int32)">
+            <summary>
+            Gets or sets a record field.
+            </summary>
+            <param name="index">zero-based column index of the field</param>
+            <remarks>
+            Setting a field value will automatically update the database.
+            </remarks>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.Linq.Queryable">
+            <summary>
+            Allows any Database instance to be converted into a queryable database.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Linq.Queryable.AsQueryable(Microsoft.Deployment.WindowsInstaller.Database)">
+            <summary>
+            Converts any Database instance into a queryable database.
+            </summary>
+            <param name="db"></param>
+            <returns>Queryable database instance that operates on the same
+            MSI handle.</returns>
+            <remarks>
+            This extension method is meant for convenient on-the-fly conversion.
+            If the existing database instance already happens to be a QDatabase,
+            then it is returned unchanged. Otherwise since the new database
+            carries the same MSI handle, only one of the instances needs to be
+            closed, not both.
+            </remarks>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.Linq.QDatabase">
+            <summary>
+            Queryable MSI database - extends the base Database class with
+            LINQ query functionality along with predefined entity types
+            for common tables.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Linq.QDatabase.#ctor(System.String)">
+            <summary>
+            Opens an existing database in read-only mode.
+            </summary>
+            <param name="filePath">Path to the database file.</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the database could not be created/opened</exception>
+            <remarks>
+            Because this constructor initiates database access, it cannot be used with a
+            running installation.
+            <para>The Database object should be <see cref="M:Microsoft.Deployment.WindowsInstaller.InstallerHandle.Close"/>d after use.
+            The finalizer will close the handle if it is still open, however due to the nondeterministic
+            nature of finalization it is best that the handle be closed manually as soon as it is no
+            longer needed, as leaving lots of unused handles open can degrade performance.</para>
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Linq.QDatabase.#ctor(System.String,System.String)">
+            <summary>
+            Opens an existing database with another database as output.
+            </summary>
+            <param name="filePath">Path to the database to be read.</param>
+            <param name="outputPath">Open mode for the database</param>
+            <returns>Database object representing the created or opened database</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the database could not be created/opened</exception>
+            <remarks>
+            When a database is opened as the output of another database, the summary information stream
+            of the output database is actually a read-only mirror of the original database and thus cannot
+            be changed. Additionally, it is not persisted with the database. To create or modify the
+            summary information for the output database it must be closed and re-opened.
+            <para>The returned Database object should be <see cref="M:Microsoft.Deployment.WindowsInstaller.InstallerHandle.Close"/>d after use.
+            The finalizer will close the handle if it is still open, however due to the nondeterministic
+            nature of finalization it is best that the handle be closed manually as soon as it is no
+            longer needed, as leaving lots of unused handles open can degrade performance.</para>
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Linq.QDatabase.#ctor(System.String,Microsoft.Deployment.WindowsInstaller.DatabaseOpenMode)">
+            <summary>
+            Opens an existing database or creates a new one.
+            </summary>
+            <param name="filePath">Path to the database file. If an empty string
+            is supplied, a temporary database is created that is not persisted.</param>
+            <param name="mode">Open mode for the database</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the database could not be created/opened</exception>
+            <remarks>
+            To make and save changes to a database first open the database in transaction,
+            create or, or direct mode. After making the changes, always call the Commit method
+            before closing the database handle. The Commit method flushes all buffers.
+            <para>Always call the Commit method on a database that has been opened in direct
+            mode before closing the database. Failure to do this may corrupt the database.</para>
+            <para>Because this constructor initiates database access, it cannot be used with a
+            running installation.</para>
+            <para>The Database object should be <see cref="M:Microsoft.Deployment.WindowsInstaller.InstallerHandle.Close"/>d after use.
+            The finalizer will close the handle if it is still open, however due to the nondeterministic
+            nature of finalization it is best that the handle be closed manually as soon as it is no
+            longer needed, as leaving lots of unused handles open can degrade performance.</para>
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Linq.QDatabase.#ctor(System.IntPtr,System.Boolean,System.String,Microsoft.Deployment.WindowsInstaller.DatabaseOpenMode)">
+            <summary>
+            Creates a new database from an MSI handle.
+            </summary>
+            <param name="handle">Native MSI database handle.</param>
+            <param name="ownsHandle">True if the handle should be closed
+            when the database object is disposed</param>
+            <param name="filePath">Path of the database file, if known</param>
+            <param name="openMode">Mode the handle was originally opened in</param>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Linq.QDatabase.Log">
+            <summary>
+            Gets or sets a log where all MSI SQL queries are written.
+            </summary>
+            <remarks>
+            The log can be useful for debugging, or simply to watch the LINQ magic in action.
+            </remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Linq.QDatabase.Item(System.String)">
+            <summary>
+            Gets a queryable table from the datbaase.
+            </summary>
+            <param name="table">name of the table</param>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Linq.QDatabase.Components">
+            <summary>Queryable standard table with predefined specialized record type.</summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Linq.QDatabase.CreateFolders">
+            <summary>Queryable standard table with predefined specialized record type.</summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Linq.QDatabase.CustomActions">
+            <summary>Queryable standard table with predefined specialized record type.</summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Linq.QDatabase.Directories">
+            <summary>Queryable standard table with predefined specialized record type.</summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Linq.QDatabase.DuplicateFiles">
+            <summary>Queryable standard table with predefined specialized record type.</summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Linq.QDatabase.Features">
+            <summary>Queryable standard table with predefined specialized record type.</summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Linq.QDatabase.FeatureComponents">
+            <summary>Queryable standard table with predefined specialized record type.</summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Linq.QDatabase.Files">
+            <summary>Queryable standard table with predefined specialized record type.</summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Linq.QDatabase.FileHashes">
+            <summary>Queryable standard table with predefined specialized record type.</summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Linq.QDatabase.InstallExecuteSequences">
+            <summary>Queryable standard table with predefined specialized record type.</summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Linq.QDatabase.InstallUISequences">
+            <summary>Queryable standard table with predefined specialized record type.</summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Linq.QDatabase.LaunchConditions">
+            <summary>Queryable standard table with predefined specialized record type.</summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Linq.QDatabase.Medias">
+            <summary>Queryable standard table with predefined specialized record type.</summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Linq.QDatabase.Properties">
+            <summary>Queryable standard table with predefined specialized record type.</summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Linq.QDatabase.Registries">
+            <summary>Queryable standard table with predefined specialized record type.</summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Linq.QDatabase.RemoveFiles">
+            <summary>Queryable standard table with predefined specialized record type.</summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.Linq.QTable`1">
+            <summary>
+            Represents one table in a LINQ-queryable Database.
+            </summary>
+            <typeparam name="TRecord">type that represents one record in the table</typeparam>
+            <remarks>
+            This class is the primary gateway to all LINQ to MSI query functionality.
+            <para>The TRecord generic parameter may be the general <see cref="T:Microsoft.Deployment.WindowsInstaller.Linq.QRecord"/>
+            class, or a specialized subclass of QRecord.</para>
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Linq.QTable`1.InferTableName">
+            <summary>
+            Infers the name of the table this instance will be
+            associated with.
+            </summary>
+            <returns>table name</returns>
+            <remarks>
+            The table name is retrieved from a DatabaseTableAttribute
+            on the record type if it exists; otherwise the name is
+            derived from the name of the record type itself.
+            (An optional underscore suffix on the record type name is dropped.)
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Linq.QTable`1.#ctor(Microsoft.Deployment.WindowsInstaller.Linq.QDatabase)">
+            <summary>
+            Creates a new QTable, inferring the table name
+            from the name of the record type parameter.
+            </summary>
+            <param name="db">database that contains the table</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Linq.QTable`1.#ctor(Microsoft.Deployment.WindowsInstaller.Linq.QDatabase,System.String)">
+            <summary>
+            Creates a new QTable with an explicit table name.
+            </summary>
+            <param name="db">database that contains the table</param>
+            <param name="table">name of the table</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Linq.QTable`1.GetEnumerator">
+            <summary>
+            Enumerates over all records in the table.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Linq.QTable`1.NewRecord">
+            <summary>
+            Creates a new record that can be inserted into this table.
+            </summary>
+            <returns>a record with all fields initialized to null</returns>
+            <remarks>
+            Primary keys and required fields must be filled in with
+            non-null values before the record can be inserted.
+            <para>The record is tied to this table in this database;
+            it cannot be inserted into another table or database.</para>
+            </remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Linq.QTable`1.TableInfo">
+            <summary>
+            Gets schema information about the table.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Linq.QTable`1.Database">
+            <summary>
+            Gets the database this table is associated with.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.Linq.Query`1">
+            <summary>
+            Implements the LINQ to MSI query functionality.
+            </summary>
+            <typeparam name="T">the result type of the current query --
+            either some kind of QRecord, or some projection of record data</typeparam>
+        </member>
+    </members>
+</doc>
diff --git a/sdk/Microsoft.Deployment.WindowsInstaller.Package.dll b/sdk/Microsoft.Deployment.WindowsInstaller.Package.dll
new file mode 100755
index 0000000..de79caf
--- /dev/null
+++ b/sdk/Microsoft.Deployment.WindowsInstaller.Package.dll
Binary files differ
diff --git a/sdk/Microsoft.Deployment.WindowsInstaller.Package.xml b/sdk/Microsoft.Deployment.WindowsInstaller.Package.xml
new file mode 100644
index 0000000..f42c60b
--- /dev/null
+++ b/sdk/Microsoft.Deployment.WindowsInstaller.Package.xml
@@ -0,0 +1,679 @@
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>Microsoft.Deployment.WindowsInstaller.Package</name>
+    </assembly>
+    <members>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.Package.InstallPackageMessageHandler">
+            <summary>
+            Handles status messages generated when operations are performed on an
+            <see cref="T:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage"/> or <see cref="T:Microsoft.Deployment.WindowsInstaller.Package.PatchPackage"/>.
+            </summary>
+            <example>
+            <c>installPackage.Message += new InstallPackageMessageHandler(Console.WriteLine);</c>
+            </example>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage">
+            <summary>
+            Provides access to powerful build, maintenance, and analysis operations on an
+            installation package (.MSI or .MSM).
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.#ctor(System.String,Microsoft.Deployment.WindowsInstaller.DatabaseOpenMode)">
+            <summary>
+            Creates a new InstallPackage object.  The file source directory and working
+            directory are the same as the location as the package file.
+            </summary>
+            <param name="packagePath">Path to the install package to be created or opened</param>
+            <param name="openMode">Open mode for the database</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.#ctor(System.String,Microsoft.Deployment.WindowsInstaller.DatabaseOpenMode,System.String,System.String)">
+            <summary>
+            Creates a new InstallPackage object, specifying an alternate file source
+            directory and/or working directory.
+            </summary>
+            <param name="packagePath">Path to the install package to be created or opened</param>
+            <param name="openMode">Open mode for the database</param>
+            <param name="sourceDir">Location to obtain source files and cabinets when extracting
+            or updating files in the working directory. This is often the location of an original
+            copy of the package that is not meant to be modified. If this parameter is null, it
+            defaults to the directory of <paramref name="packagePath"/>.</param>
+            <param name="workingDir">Location where files will be extracted to/updated from. Also
+            the location where a temporary folder is created during some operations. If this
+            parameter is null, it defaults to the directory of <paramref name="packagePath"/>.</param>
+            <remarks>If the source location is different than the working directory, then
+            no files will be modified at the source location.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.LogMessage(System.String,System.Object[])">
+            <summary>
+            Sends a message to the <see cref="E:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.Message"/> event-handler.
+            </summary>
+            <param name="format">Message string, containing 0 or more format items</param>
+            <param name="args">Items to be formatted</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.FindFiles(System.String)">
+            <summary>
+            Gets the list of file keys that have the specified long file name.
+            </summary>
+            <param name="longFileName">File name to search for (case-insensitive)</param>
+            <returns>Array of file keys, or a 0-length array if none are found</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.FindFiles(System.Text.RegularExpressions.Regex)">
+            <summary>
+            Gets the list of file keys whose long file names match a specified
+            regular-expression search pattern.
+            </summary>
+            <param name="pattern">Regular expression search pattern</param>
+            <returns>Array of file keys, or a 0-length array if none are found</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.ExtractFiles">
+            <summary>
+            Extracts all files to the <see cref="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.WorkingDirectory"/>. The files are extracted
+            to the relative directory matching their <see cref="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPath.SourcePath"/>.
+            </summary>
+            <remarks>If any files have the uncompressed attribute, they will be copied
+            from the <see cref="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.SourceDirectory"/>.</remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.ExtractFiles(System.Collections.Generic.ICollection{System.String})">
+            <summary>
+            Extracts a specified list of files to the <see cref="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.WorkingDirectory"/>. The files
+            are extracted to the relative directory matching their <see cref="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPath.SourcePath"/>.
+            </summary>
+            <param name="fileKeys">List of file key strings to extract</param>
+            <remarks>If any files have the uncompressed attribute, they will be copied
+            from the <see cref="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.SourceDirectory"/>.</remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.UpdateFiles">
+            <summary>
+            Updates the install package with new files from the <see cref="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.WorkingDirectory"/>.  The
+            files must be in the relative directory matching their <see cref="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPath.SourcePath"/>.
+            This method re-compresses and packages the files if necessary, and also updates the
+            following data: File.FileSize, File.Version, File.Language, MsiFileHash.HashPart*
+            </summary>
+            <remarks>
+            The cabinet compression level used during re-cabbing can be configured with the
+            <see cref="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.CompressionLevel"/> property.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.UpdateFiles(System.Collections.Generic.ICollection{System.String})">
+            <summary>
+            Updates the install package with new files from the <see cref="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.WorkingDirectory"/>.  The
+            files must be in the relative directory matching their <see cref="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPath.SourcePath"/>.
+            This method re-compresses and packages the files if necessary, and also updates the
+            following data: File.FileSize, File.Version, File.Language, MsiFileHash.HashPart?.
+            </summary>
+            <param name="fileKeys">List of file key strings to update</param>
+            <remarks>
+            This method does not change the media structure of the package, so it may require extracting
+            and re-compressing a large cabinet just to update one file.
+            <p>The cabinet compression level used during re-cabbing can be configured with the
+            <see cref="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.CompressionLevel"/> property.</p>
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.Consolidate(System.String)">
+            <summary>
+            Consolidates a package by combining and re-compressing all files into a single
+            internal or external cabinet.
+            </summary>
+            <param name="mediaCabinet"></param>
+            <remarks>If an installation package was built from many merge modules, this
+            method can somewhat decrease package size, complexity, and installation time.
+            <p>This method will also convert a package with all or mostly uncompressed
+            files into a package where all files are compressed.</p>
+            <p>If the package contains any not-yet-applied binary file patches (for
+            example, a package generated by a call to <see cref="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.ApplyPatch(Microsoft.Deployment.WindowsInstaller.Package.PatchPackage,System.String)"/>) then
+            this method will apply the patches before compressing the updated files.</p>
+            <p>This method edits the database summary information and the File, Media
+            and Patch tables as necessary to maintain a valid installation package.</p>
+            <p>The cabinet compression level used during re-cabbing can be configured with the
+            <see cref="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.CompressionLevel"/> property.</p>
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.UpdateDirectories">
+            <summary>
+            Rebuilds the cached directory structure information accessed by the
+            <see cref="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.Directories"/> and <see cref="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.Files"/> properties. This
+            should be done after modifying the File, Component, or Directory
+            tables, or else the cached information may no longer be accurate.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.ApplyPatch(Microsoft.Deployment.WindowsInstaller.Package.PatchPackage,System.String)">
+            <summary>
+            Applies a patch package to the database, resulting in an installation package that
+            has the patch built-in.
+            </summary>
+            <param name="patchPackage">The patch package to be applied</param>
+            <param name="transform">Optional name of the specific transform to apply.
+            This parameter is usually left null, which causes the patch to be searched for
+            a transform that is valid to apply to this database.</param>
+            <remarks>
+            If the patch contains any binary file patches, they will not immediately be applied
+            to the target files, though they will at installation time.
+            <p>After calling this method you can use <see cref="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.Consolidate(System.String)"/> to apply
+            the file patches immediately and also discard any outdated files from the package.</p>
+            </remarks>
+        </member>
+        <member name="E:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.Message">
+            <summary>
+            Handle this event to receive status messages when operations are performed
+            on the install package.
+            </summary>
+            <example>
+            <c>installPackage.Message += new InstallPackageMessageHandler(Console.WriteLine);</c>
+            </example>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.SourceDirectory">
+            <summary>
+            Gets or sets the location to obtain source files and cabinets when
+            extracting or updating files in the working directory. This is often
+            the location of an original copy of the package that is not meant
+            to be modified.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.WorkingDirectory">
+            <summary>
+            Gets or sets the location where files will be extracted to/updated from. Also
+            the location where a temporary folder is created during some operations.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.Directories">
+            <summary>
+            Gets a mapping from Directory keys to source/target paths.
+            </summary>
+            <remarks>
+            If the Directory table is modified, this mapping
+            will be outdated until you call <see cref="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.UpdateDirectories"/>.
+            </remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.Files">
+            <summary>
+            Gets a mapping from File keys to source/target paths.
+            </summary>
+            <remarks>
+            If the File, Component, or Directory tables are modified, this mapping
+            may be outdated until you call <see cref="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.UpdateDirectories"/>.
+            </remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.CompressionLevel">
+            <summary>
+            Gets or sets the compression level used by <see cref="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.UpdateFiles"/>
+            and <see cref="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.Consolidate(System.String)"/>.
+            </summary>
+            <remarks>
+            If the Directory table is modified, this mapping will be outdated
+            until you close and reopen the install package.
+            </remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage.Property">
+            <summary>
+            Accessor for getting and setting properties of the InstallPackage database.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.Package.InstallPackageProperties">
+            <summary>
+            Accessor for getting and setting properties of the <see cref="T:Microsoft.Deployment.WindowsInstaller.Package.InstallPackage"/> database.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPackageProperties.Item(System.String)">
+            <summary>
+            Gets or sets a property in the database. When getting a property
+            that does not exist in the database, an empty string is returned.
+            To remove a property from the database, set it to an empty string.
+            </summary>
+            <remarks>
+            This has the same results as direct SQL queries on the Property table; it's only
+            meant to be a more convenient way of access.
+            </remarks>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.Package.InstallPath">
+            <summary>
+            Represents the installation path of a file or directory from an installer product database.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPath.#ctor(System.String)">
+            <summary>
+            Creates a new InstallPath, specifying a filename.
+            </summary>
+            <param name="name">The name of the file or directory.  Not a full path.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPath.#ctor(System.String,System.Boolean)">
+            <summary>
+            Creates a new InstallPath, parsing out either the short or long filename.
+            </summary>
+            <param name="name">The name of the file or directory, in short|long syntax for a filename
+            or targetshort|targetlong:sourceshort|sourcelong syntax for a directory.</param>
+            <param name="useShortNames">true to parse the short part of the combined filename; false to parse the long part</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPath.ToString">
+            <summary>
+            Gets the full source path.
+            </summary>
+            <returns><see cref="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPath.SourcePath"/></returns>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPath.ParentPath">
+            <summary>
+            Gets the path of the parent directory.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPath.ChildPaths">
+            <summary>
+            Gets the set of child paths if this InstallPath object represents a a directory.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPath.SourceName">
+            <summary>
+            Gets or sets the source name of the InstallPath.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPath.TargetName">
+            <summary>
+            Gets or sets the target name of the install path.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPath.SourcePath">
+            <summary>
+            Gets the full source path.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPath.TargetPath">
+            <summary>
+            Gets the full target path.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.Package.InstallPathCollection">
+            <summary>
+            Represents a collection of InstallPaths that are the child paths of the same parent directory.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPathCollection.Add(Microsoft.Deployment.WindowsInstaller.Package.InstallPath)">
+            <summary>
+            Adds a new child path to the collection.
+            </summary>
+            <param name="item">The InstallPath to add.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPathCollection.Remove(Microsoft.Deployment.WindowsInstaller.Package.InstallPath)">
+            <summary>
+            Removes a child path to the collection.
+            </summary>
+            <param name="item">The InstallPath to remove.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPathCollection.IndexOf(Microsoft.Deployment.WindowsInstaller.Package.InstallPath)">
+            <summary>
+            Gets the index of a child path in the collection.
+            </summary>
+            <param name="item">The InstallPath to search for.</param>
+            <returns>The index of the item, or -1 if not found.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPathCollection.Insert(System.Int32,Microsoft.Deployment.WindowsInstaller.Package.InstallPath)">
+            <summary>
+            Inserts a child path into the collection.
+            </summary>
+            <param name="index">The insertion index.</param>
+            <param name="item">The InstallPath to insert.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPathCollection.Contains(Microsoft.Deployment.WindowsInstaller.Package.InstallPath)">
+            <summary>
+            Tests if the collection contains a child path.
+            </summary>
+            <param name="item">The InstallPath to search for.</param>
+            <returns>true if the item is found; false otherwise</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPathCollection.CopyTo(Microsoft.Deployment.WindowsInstaller.Package.InstallPath[],System.Int32)">
+            <summary>
+            Copies the collection into an array.
+            </summary>
+            <param name="array">The array to copy into.</param>
+            <param name="index">The starting index in the destination array.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPathCollection.RemoveAt(System.Int32)">
+            <summary>
+            Removes an item from the collection.
+            </summary>
+            <param name="index">The index of the item to remove.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPathCollection.Clear">
+            <summary>
+            Removes all items from the collection.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPathCollection.GetEnumerator">
+            <summary>
+            Gets an enumerator over all items in the collection.
+            </summary>
+            <returns>An enumerator for the collection.</returns>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPathCollection.Item(System.Int32)">
+            <summary>
+            Gets or sets the element at the specified index.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPathCollection.Count">
+            <summary>
+            Gets the number of items in the collection.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.Package.InstallPathMap">
+            <summary>
+            Represents a mapping of install paths for all directories, components, or files in
+            an installation database.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPathMap.BuildFilePathMap(Microsoft.Deployment.WindowsInstaller.Database,Microsoft.Deployment.WindowsInstaller.Package.InstallPathMap,System.Boolean)">
+            <summary>
+            Builds a mapping from File keys to installation paths.
+            </summary>
+            <param name="db">Installation database.</param>
+            <param name="componentPathMap">Component mapping returned by <see cref="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPathMap.BuildComponentPathMap(Microsoft.Deployment.WindowsInstaller.Database,Microsoft.Deployment.WindowsInstaller.Package.InstallPathMap)"/>.</param>
+            <param name="useShortNames">true to use short file names; false to use long names</param>
+            <returns>An InstallPathMap with the described mapping.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPathMap.BuildComponentPathMap(Microsoft.Deployment.WindowsInstaller.Database,Microsoft.Deployment.WindowsInstaller.Package.InstallPathMap)">
+            <summary>
+            Builds a mapping from Component keys to installation paths.
+            </summary>
+            <param name="db">Installation database.</param>
+            <param name="directoryPathMap">Directory mapping returned by
+            <see cref="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPathMap.BuildDirectoryPathMap(Microsoft.Deployment.WindowsInstaller.Database,System.Boolean)"/>.</param>
+            <returns>An InstallPathMap with the described mapping.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPathMap.BuildDirectoryPathMap(Microsoft.Deployment.WindowsInstaller.Database,System.Boolean)">
+            <summary>
+            Builds a mapping from Directory keys to installation paths.
+            </summary>
+            <param name="db">Installation database.</param>
+            <param name="useShortNames">true to use short directory names; false to use long names</param>
+            <returns>An InstallPathMap with the described mapping.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPathMap.BuildDirectoryPathMap(Microsoft.Deployment.WindowsInstaller.Database,System.Boolean,System.String,System.String)">
+            <summary>
+            Builds a mapping of Directory keys to directory paths, specifying root directories
+            for the source and target paths.
+            </summary>
+            <param name="db">Database containing the Directory table.</param>
+            <param name="useShortNames">true to use short directory names; false to use long names</param>
+            <param name="sourceRootDir">The root directory path of all source paths, or null to leave them relative.</param>
+            <param name="targetRootDir">The root directory path of all source paths, or null to leave them relative.</param>
+            <returns>An InstallPathMap with the described mapping.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPathMap.#ctor">
+            <summary>
+            Creates a new empty InstallPathMap.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPathMap.Add(System.String,Microsoft.Deployment.WindowsInstaller.Package.InstallPath)">
+            <summary>
+            Sets an install path for a direcotry, component, or file key.
+            </summary>
+            <param name="key">Depending on the type of InstallPathMap, this is the primary key from the
+            either the Directory, Component, or File table.</param>
+            <param name="installPath">The install path of the key item.</param>
+            <remarks>
+            Changing an install path does not modify the Database used to generate this InstallPathMap.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPathMap.Remove(System.String)">
+            <summary>
+            Removes an install path from the map.
+            </summary>
+            <param name="key">Depending on the type of InstallPathMap, this is the primary key from the
+            either the Directory, Component, or File table.</param>
+            <returns>true if the item was removed, false if it did not exist</returns>
+            <remarks>
+            Changing an install path does not modify the Database used to generate this InstallPathMap.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPathMap.ContainsKey(System.String)">
+            <summary>
+            Tests whether a direcotry, component, or file key exists in the map.
+            </summary>
+            <param name="key">Depending on the type of InstallPathMap, this is the primary key from the
+            either the Directory, Component, or File table.</param>
+            <returns>true if the key is found; false otherwise</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPathMap.TryGetValue(System.String,Microsoft.Deployment.WindowsInstaller.Package.InstallPath@)">
+            <summary>
+            Attempts to get a value from the dictionary.
+            </summary>
+            <param name="key">The key to lookup.</param>
+            <param name="value">Receives the value, or null if they key was not found.</param>
+            <returns>True if the value was found, else false.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPathMap.Clear">
+            <summary>
+            Removes all entries from the dictionary.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.InstallPathMap.GetEnumerator">
+            <summary>
+            Gets an enumerator over all entries in the dictionary.
+            </summary>
+            <returns>An enumerator for the dictionary.</returns>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPathMap.SourcePaths">
+            <summary>
+            Gets a mapping from keys to source paths.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPathMap.TargetPaths">
+            <summary>
+            Gets a mapping from keys to target paths.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPathMap.Item(System.String)">
+            <summary>
+            Gets or sets an install path for a direcotry, component, or file key.
+            </summary>
+            <param name="key">Depending on the type of InstallPathMap, this is the primary key from the
+            either the Directory, Component, or File table.</param>
+            <remarks>
+            Changing an install path does not modify the Database used to generate this InstallPathMap.
+            </remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPathMap.Keys">
+            <summary>
+            Gets the collection of keys in the InstallPathMap. Depending on the type of InstallPathMap,
+            they are all directory, component, or file key strings.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPathMap.Values">
+            <summary>
+            Gets the collection of InstallPath values in the InstallPathMap.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Package.InstallPathMap.Count">
+            <summary>
+            Gets the number of entries in the dictionary.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.Package.PatchPackage">
+            <summary>
+            Provides access to convenient properties and operations on a patch package (.MSP).
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.PatchPackage.#ctor(System.String)">
+            <summary>
+            Creates a new patch package object; opening the patch database in read-only mode.
+            </summary>
+            <param name="packagePath">Path to the patch package (.MSP)</param>
+            <remarks>The PatchPackage object only opens the patch database in read-only mode, because
+            transforms (sub-storages) cannot be read if the database is open in read-write mode.</remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.PatchPackage.LogMessage(System.String,System.Object[])">
+            <summary>
+            Sends a message to the <see cref="E:Microsoft.Deployment.WindowsInstaller.Package.PatchPackage.Message"/> event-handler.
+            </summary>
+            <param name="format">Message string, containing 0 or more format items</param>
+            <param name="args">Items to be formatted</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.PatchPackage.GetReplacedPatchCodes">
+            <summary>
+            Gets the list of patch codes that are replaced by this patch package.
+            </summary>
+            <returns>Array of replaced patch codes (GUIDs)</returns>
+            <remarks>
+            The list of replaced patch codes is stored in the RevisionNumber field of the patch summary information.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.PatchPackage.GetTargetProductCodes">
+            <summary>
+            Gets the list of product codes of products targeted by this patch package.
+            </summary>
+            <returns>Array of product codes (GUIDs)</returns>
+            <remarks>
+            The list of target product codes is stored in the Template field of the patch summary information.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.PatchPackage.GetTransforms">
+            <summary>
+            Gets the names of the transforms included in the patch package.
+            </summary>
+            <returns>Array of transform names</returns>
+            <remarks>
+            The returned list does not include the &quot;patch special transforms&quot; that are prefixed with &quot;#&quot;
+            <p>The list of transform names is stored in the LastSavedBy field of the patch summary information.</p>
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.PatchPackage.GetTransforms(System.Boolean)">
+            <summary>
+            Gets the names of the transforms included in the patch package.
+            </summary>
+            <param name="includeSpecialTransforms">Specifies whether to include the
+            &quot;patch special transforms&quot; that are prefixed with &quot;#&quot;</param>
+            <returns>Array of transform names</returns>
+            <remarks>
+            The list of transform names is stored in the LastSavedBy field of the patch summary information.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.PatchPackage.GetTransformsInfo">
+            <summary>
+            Gets information about the transforms included in the patch package.
+            </summary>
+            <returns>Array containing information about each transform</returns>
+            <remarks>
+            The returned info does not include the &quot;patch special transforms&quot; that are prefixed with &quot;#&quot;
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.PatchPackage.GetTransformsInfo(System.Boolean)">
+            <summary>
+            Gets information about the transforms included in the patch package.
+            </summary>
+            <param name="includeSpecialTransforms">Specifies whether to include the
+            &quot;patch special transforms&quot; that are prefixed with &quot;#&quot;</param>
+            <returns>Array containing information about each transform</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.PatchPackage.GetTransformInfo(System.String)">
+            <summary>
+            Gets information about a transforms included in the patch package.
+            </summary>
+            <param name="transform">Name of the transform to extract; this may optionally be a
+            special transform prefixed by &quot;#&quot;</param>
+            <returns>Information about the transform</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.PatchPackage.GetValidTransforms(Microsoft.Deployment.WindowsInstaller.Package.InstallPackage)">
+            <summary>
+            Analyzes the transforms included in the patch package to find the ones that
+            are applicable to an install package.
+            </summary>
+            <param name="installPackage">The install package to validate the transforms against</param>
+            <returns>Array of valid transform names</returns>
+            <remarks>
+            The returned list does not include the &quot;patch special transforms&quot; that
+            are prefixed with &quot;#&quot; If a transform is valid, then its corresponding
+            special transform is assumed to be valid as well.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.PatchPackage.ExtractTransform(System.String,System.String)">
+            <summary>
+            Extracts a transform (.MST) from a patch package.
+            </summary>
+            <param name="transform">Name of the transform to extract; this may optionally be a
+            special transform prefixed by &quot;#&quot;</param>
+            <param name="extractFile">Location where the transform will be extracted</param>
+        </member>
+        <member name="E:Microsoft.Deployment.WindowsInstaller.Package.PatchPackage.Message">
+            <summary>
+            Handle this event to receive status messages when operations are performed on the patch package.
+            </summary>
+            <example>
+            <c>patchPackage.Message += new InstallPackageMessageHandler(Console.WriteLine);</c>
+            </example>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Package.PatchPackage.PatchCode">
+            <summary>
+            Gets the patch code (GUID) of the patch package.
+            </summary>
+            <remarks>
+            The patch code is stored in the RevisionNumber field of the patch summary information.
+            </remarks>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.Package.TransformInfo">
+            <summary>
+            Contains properties of a transform package (.MST).
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.TransformInfo.#ctor(System.String)">
+            <summary>
+            Reads transform information from a transform package.
+            </summary>
+            <param name="mstFile">Path to a transform package (.MST file).</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.TransformInfo.#ctor(System.String,Microsoft.Deployment.WindowsInstaller.SummaryInfo)">
+            <summary>
+            Reads transform information from the summary information of a transform package.
+            </summary>
+            <param name="name">Filename of the transform (optional).</param>
+            <param name="transformSummaryInfo">Handle to the summary information of a transform package (.MST file).</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Package.TransformInfo.ToString">
+            <summary>
+            Returns the name of the transform.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Package.TransformInfo.Name">
+            <summary>
+            Gets the filename of the transform.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Package.TransformInfo.TargetProductCode">
+            <summary>
+            Gets the target product code of the transform.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Package.TransformInfo.TargetProductVersion">
+            <summary>
+            Gets the target product version of the transform.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Package.TransformInfo.UpgradeProductCode">
+            <summary>
+            Gets the upgrade product code of the transform.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Package.TransformInfo.UpgradeProductVersion">
+            <summary>
+            Gets the upgrade product version of the transform.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Package.TransformInfo.UpgradeCode">
+            <summary>
+            Gets the upgrade code of the transform.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Package.TransformInfo.TargetPlatform">
+            <summary>
+            Gets the target platform of the transform.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Package.TransformInfo.TargetLanguage">
+            <summary>
+            Gets the target language of the transform, or 0 if the transform is language-neutral.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Package.TransformInfo.Validations">
+            <summary>
+            Gets the validation flags specified when the transform was generated.
+            </summary>
+        </member>
+    </members>
+</doc>
diff --git a/sdk/Microsoft.Deployment.WindowsInstaller.dll b/sdk/Microsoft.Deployment.WindowsInstaller.dll
new file mode 100755
index 0000000..bf179ae
--- /dev/null
+++ b/sdk/Microsoft.Deployment.WindowsInstaller.dll
Binary files differ
diff --git a/sdk/Microsoft.Deployment.WindowsInstaller.xml b/sdk/Microsoft.Deployment.WindowsInstaller.xml
new file mode 100644
index 0000000..c7ed5b6
--- /dev/null
+++ b/sdk/Microsoft.Deployment.WindowsInstaller.xml
@@ -0,0 +1,7334 @@
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>Microsoft.Deployment.WindowsInstaller</name>
+    </assembly>
+    <members>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.ColumnCollection">
+            <summary>
+            Collection of column information related to a <see cref="T:Microsoft.Deployment.WindowsInstaller.TableInfo"/> or
+            <see cref="T:Microsoft.Deployment.WindowsInstaller.View"/>.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.ColumnCollection.#ctor(System.Collections.Generic.ICollection{Microsoft.Deployment.WindowsInstaller.ColumnInfo})">
+            <summary>
+            Creates a new ColumnCollection based on a specified list of columns.
+            </summary>
+            <param name="columns">columns to be added to the new collection</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.ColumnCollection.#ctor(Microsoft.Deployment.WindowsInstaller.View)">
+            <summary>
+            Creates a new ColumnCollection that is associated with a database table.
+            </summary>
+            <param name="view">view that contains the columns</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.ColumnCollection.Add(Microsoft.Deployment.WindowsInstaller.ColumnInfo)">
+            <summary>
+            Not supported because the collection is read-only.
+            </summary>
+            <param name="item">information about the column being added</param>
+            <exception cref="T:System.InvalidOperationException">the collection is read-only</exception>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.ColumnCollection.Clear">
+            <summary>
+            Not supported because the collection is read-only.
+            </summary>
+            <exception cref="T:System.InvalidOperationException">the collection is read-only</exception>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.ColumnCollection.Contains(System.String)">
+            <summary>
+            Checks if a column with a given name exists in the collection.
+            </summary>
+            <param name="columnName">case-sensitive name of the column to look for</param>
+            <returns>true if the column exists in the collection, false otherwise</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.ColumnCollection.System#Collections#Generic#ICollection{Microsoft#Deployment#WindowsInstaller#ColumnInfo}#Contains(Microsoft.Deployment.WindowsInstaller.ColumnInfo)">
+            <summary>
+            Checks if a column with a given name exists in the collection.
+            </summary>
+            <param name="column">column to look for, with case-sensitive name</param>
+            <returns>true if the column exists in the collection, false otherwise</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.ColumnCollection.IndexOf(System.String)">
+            <summary>
+            Gets the index of a column within the collection.
+            </summary>
+            <param name="columnName">case-sensitive name of the column to look for</param>
+            <returns>0-based index of the column, or -1 if not found</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.ColumnCollection.CopyTo(Microsoft.Deployment.WindowsInstaller.ColumnInfo[],System.Int32)">
+            <summary>
+            Copies the columns from this collection into an array.
+            </summary>
+            <param name="array">destination array to be filed</param>
+            <param name="arrayIndex">offset into the destination array where copying begins</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.ColumnCollection.System#Collections#Generic#ICollection{Microsoft#Deployment#WindowsInstaller#ColumnInfo}#Remove(Microsoft.Deployment.WindowsInstaller.ColumnInfo)">
+            <summary>
+            Not supported because the collection is read-only.
+            </summary>
+            <param name="column">column to remove</param>
+            <returns>true if the column was removed, false if it was not found</returns>
+            <exception cref="T:System.InvalidOperationException">the collection is read-only</exception>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.ColumnCollection.GetEnumerator">
+            <summary>
+            Gets an enumerator over the columns in the collection.
+            </summary>
+            <returns>An enumerator of ColumnInfo objects.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.ColumnCollection.System#Collections#IEnumerable#GetEnumerator">
+            <summary>
+            Gets an enumerator over the columns in the collection.
+            </summary>
+            <returns>An enumerator of ColumnInfo objects.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.ColumnCollection.GetViewColumns(Microsoft.Deployment.WindowsInstaller.View)">
+            <summary>
+            Creates ColumnInfo objects for the associated view.
+            </summary>
+            <returns>dynamically-generated list of columns</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.ColumnCollection.GetViewColumns(Microsoft.Deployment.WindowsInstaller.View,System.Boolean)">
+            <summary>
+            Gets a list of column names or column-definition-strings for the
+            associated view.
+            </summary>
+            <param name="view">the view to that defines the columns</param>
+            <param name="types">true to return types (column definition strings),
+            false to return names</param>
+            <returns>list of column names or types</returns>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ColumnCollection.Count">
+            <summary>
+            Gets the number of columns in the collection.
+            </summary>
+            <value>number of columns in the collection</value>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ColumnCollection.IsReadOnly">
+            <summary>
+            Gets a boolean value indicating whether the collection is read-only.
+            A ColumnCollection is read-only if it is associated with a <see cref="T:Microsoft.Deployment.WindowsInstaller.View"/>
+            or a read-only <see cref="T:Microsoft.Deployment.WindowsInstaller.Database"/>.
+            </summary>
+            <value>read-only status of the collection</value>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ColumnCollection.Item(System.Int32)">
+            <summary>
+            Gets information about a specific column in the collection.
+            </summary>
+            <param name="columnIndex">1-based index into the column collection</param>
+            <exception cref="T:System.ArgumentOutOfRangeException"><paramref name="columnIndex"/> is less
+            than 1 or greater than the number of columns in the collection</exception>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ColumnCollection.Item(System.String)">
+            <summary>
+            Gets information about a specific column in the collection.
+            </summary>
+            <param name="columnName">case-sensitive name of a column collection</param>
+            <exception cref="T:System.ArgumentOutOfRangeException"><paramref name="columnName"/> does
+            not exist in the collection</exception>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ColumnCollection.FormatString">
+            <summary>
+            Gets a string suitable for printing all the values of a record containing these columns.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.ComponentAttributes">
+            <summary>
+            Available values for the Attributes column of the Component table.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ComponentAttributes.None">
+            <summary>
+            Local only - Component cannot be run from source. 
+            </summary>
+            <remarks><p>
+            Set this value for all components belonging to a feature to prevent the feature from being run-from-network or
+            run-from-source. Note that if a feature has no components, the feature always shows run-from-source and
+            run-from-my-computer as valid options.
+            </p></remarks>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ComponentAttributes.SourceOnly">
+            <summary>
+            Component can only be run from source.
+            </summary>
+            <remarks><p>
+            Set this bit for all components belonging to a feature to prevent the feature from being run-from-my-computer.
+            Note that if a feature has no components, the feature always shows run-from-source and run-from-my-computer
+            as valid options.
+            </p></remarks>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ComponentAttributes.Optional">
+            <summary>
+            Component can run locally or from source.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ComponentAttributes.RegistryKeyPath">
+            <summary>
+            If this bit is set, the value in the KeyPath column is used as a key into the Registry table.
+            </summary>
+            <remarks><p>
+            If the Value field of the corresponding record in the Registry table is null, the Name field in that record
+            must not contain "+", "-", or "*". For more information, see the description of the Name field in Registry
+            table.
+            <p>Setting this bit is recommended for registry entries written to the HKCU hive. This ensures the installer
+            writes the necessary HKCU registry entries when there are multiple users on the same machine.</p>
+            </p></remarks>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ComponentAttributes.SharedDllRefCount">
+            <summary>
+            If this bit is set, the installer increments the reference count in the shared DLL registry of the component's
+            key file. If this bit is not set, the installer increments the reference count only if the reference count
+            already exists.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ComponentAttributes.Permanent">
+            <summary>
+            If this bit is set, the installer does not remove the component during an uninstall. The installer registers
+            an extra system client for the component in the Windows Installer registry settings.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ComponentAttributes.OdbcDataSource">
+            <summary>
+            If this bit is set, the value in the KeyPath column is a key into the ODBCDataSource table.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ComponentAttributes.Transitive">
+            <summary>
+            If this bit is set, the installer reevaluates the value of the statement in the Condition column upon a reinstall.
+            If the value was previously False and has changed to true, the installer installs the component. If the value
+            was previously true and has changed to false, the installer removes the component even if the component has
+            other products as clients.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ComponentAttributes.NeverOverwrite">
+            <summary>
+            If this bit is set, the installer does not install or reinstall the component if a key path file or a key path
+            registry entry for the component already exists. The application does register itself as a client of the component.
+            </summary>
+            <remarks><p>
+            Use this flag only for components that are being registered by the Registry table. Do not use this flag for
+            components registered by the AppId, Class, Extension, ProgId, MIME, and Verb tables.
+            </p></remarks>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ComponentAttributes.SixtyFourBit">
+            <summary>
+            Set this bit to mark this as a 64-bit component. This attribute facilitates the installation of packages that
+            include both 32-bit and 64-bit components. If this bit is not set, the component is registered as a 32-bit component.
+            </summary>
+            <remarks><p>
+            If this is a 64-bit component replacing a 32-bit component, set this bit and assign a new GUID in the
+            ComponentId column.
+            </p></remarks>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ComponentAttributes.DisableRegistryReflection">
+            <summary>
+            Set this bit to disable registry reflection on all existing and new registry keys affected by this component.
+            </summary>
+            <remarks><p>
+            If this bit is set, the Windows Installer calls the RegDisableReflectionKey on each key being accessed by the component.
+            This bit is available with Windows Installer version 4.0 and is ignored on 32-bit systems.
+            </p></remarks>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ComponentAttributes.UninstallOnSupersedence">
+            <summary>
+            [MSI 4.5] Set this bit for a component in a patch package to prevent leaving orphan components on the computer.
+            </summary>
+            <remarks><p>
+            If a subsequent patch is installed, marked with the SupersedeEarlier flag in its MsiPatchSequence
+            table to supersede the first patch, Windows Installer 4.5 can unregister and uninstall components marked with the
+            UninstallOnSupersedence value. If the component is not marked with this bit, installation of a superseding patch can leave
+            behind an unused component on the computer.
+            </p></remarks>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ComponentAttributes.Shared">
+            <summary>
+            [MSI 4.5] If a component is marked with this attribute value in at least one package installed on the system,
+            the installer treats the component as marked in all packages. If a package that shares the marked component
+            is uninstalled, Windows Installer 4.5 can continue to share the highest version of the component on the system,
+            even if that highest version was installed by the package that is being uninstalled.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.ControlAttributes">
+            <summary>
+            Defines flags for the Attributes column of the Control table.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ControlAttributes.Visible">
+            <summary>If this bit is set, the control is visible on the dialog box.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ControlAttributes.Enabled">
+            <summary>specifies if the given control is enabled or disabled. Most controls appear gray when disabled.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ControlAttributes.Sunken">
+            <summary>If this bit is set, the control is displayed with a sunken, three dimensional look.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ControlAttributes.Indirect">
+            <summary>The Indirect control attribute specifies whether the value displayed or changed by this control is referenced indirectly.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ControlAttributes.Integer">
+            <summary>If this bit is set on a control, the associated property specified in the Property column of the Control table is an integer.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ControlAttributes.RightToLeftReadingOrder">
+            <summary>If this bit is set the text in the control is displayed in a right-to-left reading order.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ControlAttributes.RightAligned">
+            <summary>If this style bit is set, text in the control is aligned to the right.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ControlAttributes.LeftScroll">
+            <summary>If this bit is set, the scroll bar is located on the left side of the control, otherwise it is on the right.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ControlAttributes.Bidirectional">
+            <summary>This is a combination of the RightToLeftReadingOrder, RightAligned, and LeftScroll attributes.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ControlAttributes.Transparent">
+            <summary>If this bit is set on a text control, the control is displayed transparently with the background showing through the control where there are no characters.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ControlAttributes.NoPrefix">
+            <summary>If this bit is set on a text control, the occurrence of the character "&amp;" in a text string is displayed as itself.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ControlAttributes.NoWrap">
+            <summary>If this bit is set the text in the control is displayed on a single line.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ControlAttributes.FormatSize">
+            <summary>If this bit is set for a text control, the control will automatically attempt to format the displayed text as a number representing a count of bytes.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ControlAttributes.UsersLanguage">
+            <summary>If this bit is set, fonts are created using the user's default UI code page. Otherwise it is created using the database code page.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ControlAttributes.Multiline">
+            <summary>If this bit is set on an Edit control, the installer creates a multiple line edit control with a vertical scroll bar.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ControlAttributes.PasswordInput">
+            <summary>This attribute creates an edit control for entering passwords. The control displays each character as an asterisk (*) as they are typed into the control.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ControlAttributes.Progress95">
+            <summary>If this bit is set on a ProgressBar control, the bar is drawn as a series of small rectangles in Microsoft Windows 95-style. Otherwise it is drawn as a single continuous rectangle.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ControlAttributes.RemovableVolume">
+            <summary>If this bit is set, the control shows removable volumes.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ControlAttributes.FixedVolume">
+            <summary>If this bit is set, the control shows fixed internal hard drives.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ControlAttributes.RemoteVolume">
+            <summary>If this bit is set, the control shows remote volumes.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ControlAttributes.CdromVolume">
+            <summary>If this bit is set, the control shows CD-ROM volumes.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ControlAttributes.RamDiskVolume">
+            <summary>If this bit is set, the control shows RAM disk volumes.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ControlAttributes.FloppyVolume">
+            <summary>If this bit is set, the control shows floppy volumes.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ControlAttributes.ShowRollbackCost">
+            <summary>Specifies whether or not the rollback backup files are included in the costs displayed by the VolumeCostList control.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ControlAttributes.Sorted">
+            <summary>If this bit is set, the items listed in the control are displayed in a specified order. Otherwise, items are displayed in alphabetical order.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ControlAttributes.ComboList">
+            <summary>If this bit is set on a combo box, the edit field is replaced by a static text field. This prevents a user from entering a new value and requires the user to choose only one of the predefined values.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ControlAttributes.PushLike">
+            <summary>If this bit is set on a check box or a radio button group, the button is drawn with the appearance of a push button, but its logic stays the same.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ControlAttributes.Bitmap">
+            <summary>If this bit is set, the text in the control is replaced by a bitmap image. The Text column in the Control table is a foreign key into the Binary table.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ControlAttributes.Icon">
+            <summary>If this bit is set, text is replaced by an icon image and the Text column in the Control table is a foreign key into the Binary table.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ControlAttributes.FixedSize">
+            <summary>If this bit is set, the picture is cropped or centered in the control without changing its shape or size.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ControlAttributes.IconSize16">
+            <summary>Specifies which size of the icon image to load. If none of the bits are set, the first image is loaded.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ControlAttributes.IconSize32">
+            <summary>Specifies which size of the icon image to load. If none of the bits are set, the first image is loaded.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ControlAttributes.IconSize48">
+            <summary>Specifies which size of the icon image to load. If none of the bits are set, the first image is loaded.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ControlAttributes.ElevationShield">
+            <summary>If this bit is set, and the installation is not yet running with elevated privileges, the control is created with a UAC icon.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ControlAttributes.HasBorder">
+            <summary>If this bit is set, the RadioButtonGroup has text and a border displayed around it.</summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.CustomActionTypes">
+            <summary>
+            Defines flags for the Type column of the CustomAction table.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.CustomActionTypes.None">
+            <summary>Unspecified custom action type.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.CustomActionTypes.Dll">
+            <summary>Target = entry point name</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.CustomActionTypes.Exe">
+            <summary>Target = command line args</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.CustomActionTypes.TextData">
+            <summary>Target = text string to be formatted and set into property</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.CustomActionTypes.JScript">
+            <summary>Target = entry point name, null if none to call</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.CustomActionTypes.VBScript">
+            <summary>Target = entry point name, null if none to call</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.CustomActionTypes.Install">
+            <summary>Target = property list for nested engine initialization</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.CustomActionTypes.SourceFile">
+            <summary>Source = File.File, file part of installation</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.CustomActionTypes.Directory">
+            <summary>Source = Directory.Directory, folder containing existing file</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.CustomActionTypes.Property">
+            <summary>Source = Property.Property, full path to executable</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.CustomActionTypes.Continue">
+            <summary>Ignore action return status, continue running</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.CustomActionTypes.Async">
+            <summary>Run asynchronously</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.CustomActionTypes.FirstSequence">
+            <summary>Skip if UI sequence already run</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.CustomActionTypes.OncePerProcess">
+            <summary>Skip if UI sequence already run in same process</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.CustomActionTypes.ClientRepeat">
+            <summary>Run on client only if UI already run on client</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.CustomActionTypes.InScript">
+            <summary>Queue for execution within script</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.CustomActionTypes.Rollback">
+            <summary>In conjunction with InScript: queue in Rollback script</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.CustomActionTypes.Commit">
+            <summary>In conjunction with InScript: run Commit ops from script on success</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.CustomActionTypes.NoImpersonate">
+            <summary>No impersonation, run in system context</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.CustomActionTypes.TSAware">
+            <summary>Impersonate for per-machine installs on TS machines</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.CustomActionTypes.SixtyFourBitScript">
+            <summary>Script requires 64bit process</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.CustomActionTypes.HideTarget">
+            <summary>Don't record the contents of the Target field in the log file</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.CustomActionTypes.PatchUninstall">
+            <summary>The custom action runs only when a patch is being uninstalled</summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.DialogAttributes">
+            <summary>
+            Defines flags for the Attributes column of the Dialog table.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.DialogAttributes.Visible">
+            <summary>If this bit is set, the dialog is originally created as visible, otherwise it is hidden.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.DialogAttributes.Modal">
+            <summary>If this bit is set, the dialog box is modal, other dialogs of the same application cannot be put on top of it, and the dialog keeps the control while it is running.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.DialogAttributes.Minimize">
+            <summary>If this bit is set, the dialog box can be minimized. This bit is ignored for modal dialog boxes, which cannot be minimized.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.DialogAttributes.SysModal">
+            <summary>If this style bit is set, the dialog box will stop all other applications and no other applications can take the focus.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.DialogAttributes.KeepModeless">
+            <summary>If this bit is set, the other dialogs stay alive when this dialog box is created.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.DialogAttributes.TrackDiskSpace">
+            <summary>If this bit is set, the dialog box periodically calls the installer. If the property changes, it notifies the controls on the dialog.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.DialogAttributes.UseCustomPalette">
+            <summary>If this bit is set, the pictures on the dialog box are created with the custom palette (one per dialog received from the first control created).</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.DialogAttributes.RightToLeftReadingOrder">
+            <summary>If this style bit is set the text in the dialog box is displayed in right-to-left-reading order.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.DialogAttributes.RightAligned">
+            <summary>If this style bit is set, the text is aligned on the right side of the dialog box.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.DialogAttributes.LeftScroll">
+            <summary>If this style bit is set, the scroll bar is located on the left side of the dialog box.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.DialogAttributes.Bidirectional">
+            <summary>This is a combination of the RightToLeftReadingOrder, RightAligned, and the LeftScroll dialog style bits.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.DialogAttributes.Error">
+            <summary>If this bit is set, the dialog box is an error dialog.</summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.FeatureAttributes">
+            <summary>
+            Available values for the Attributes column of the Feature table.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.FeatureAttributes.None">
+            <summary>
+            Favor local - Components of this feature that are not marked for installation from source are installed locally.
+            </summary>
+            <remarks><p>
+            A component shared by two or more features, some of which are set to FavorLocal and some to FavorSource,
+            is installed locally. Components marked <see cref="F:Microsoft.Deployment.WindowsInstaller.ComponentAttributes.SourceOnly"/> in the Component
+            table are always run from the source CD/server. The bits FavorLocal and FavorSource work with features not
+            listed by the ADVERTISE property.
+            </p></remarks>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.FeatureAttributes.FavorSource">
+            <summary>
+            Components of this feature not marked for local installation are installed to run from the source
+            CD-ROM or server.
+            </summary>
+            <remarks><p>
+            A component shared by two or more features, some of which are set to FavorLocal and some to FavorSource,
+            is installed to run locally. Components marked <see cref="F:Microsoft.Deployment.WindowsInstaller.ComponentAttributes.None"/> (local-only) in the
+            Component table are always installed locally. The bits FavorLocal and FavorSource work with features
+            not listed by the ADVERTISE property.
+            </p></remarks>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.FeatureAttributes.FollowParent">
+            <summary>
+            Set this attribute and the state of the feature is the same as the state of the feature's parent.
+            You cannot use this option if the feature is located at the root of a feature tree.
+            </summary>
+            <remarks><p>
+            Omit this attribute and the feature state is determined according to DisallowAdvertise and
+            FavorLocal and FavorSource.
+            <p>To guarantee that the child feature's state always follows the state of its parent, even when the
+            child and parent are initially set to absent in the SelectionTree control, you must include both
+            FollowParent and UIDisallowAbsent in the attributes of the child feature.</p>
+            <p>Note that if you set FollowParent without setting UIDisallowAbsent, the installer cannot force
+            the child feature out of the absent state. In this case, the child feature matches the parent's
+            installation state only if the child is set to something other than absent.</p>
+            <p>Set FollowParent and UIDisallowAbsent to ensure a child feature follows the state of the parent feature.</p>
+            </p></remarks>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.FeatureAttributes.FavorAdvertise">
+            <summary>
+            Set this attribute and the feature state is Advertise.
+            </summary>
+            <remarks><p>
+            If the feature is listed by the ADDDEFAULT property this bit is ignored and the feature state is determined
+            according to FavorLocal and FavorSource.
+            <p>Omit this attribute and the feature state is determined according to DisallowAdvertise and FavorLocal
+            and FavorSource.</p>
+            </p></remarks>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.FeatureAttributes.DisallowAdvertise">
+            <summary>
+            Set this attribute to prevent the feature from being advertised.
+            </summary>
+            <remarks><p>
+            Note that this bit works only with features that are listed by the ADVERTISE property.
+            <p>Set this attribute and if the listed feature is not a parent or child, the feature is installed according to
+            FavorLocal and FavorSource.</p>
+            <p>Set this attribute for the parent of a listed feature and the parent is installed.</p>
+            <p>Set this attribute for the child of a listed feature and the state of the child is Absent.</p>
+            <p>Omit this attribute and if the listed feature is not a parent or child, the feature state is Advertise.</p>
+            <p>Omit this attribute and if the listed feature is a parent or child, the state of both features is Advertise.</p>
+            </p></remarks>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.FeatureAttributes.UIDisallowAbsent">
+            <summary>
+            Set this attribute and the user interface does not display an option to change the feature state
+            to Absent. Setting this attribute forces the feature to the installation state, whether or not the
+            feature is visible in the UI.
+            </summary>
+            <remarks><p>
+            Omit this attribute and the user interface displays an option to change the feature state to Absent.
+            <p>Set FollowParent and UIDisallowAbsent to ensure a child feature follows the state of the parent feature.</p>
+            <p>Setting this attribute not only affects the UI, but also forces the feature to the install state whether
+            the feature is visible in the UI or not.</p>
+            </p></remarks>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.FeatureAttributes.NoUnsupportedAdvertise">
+            <summary>
+            Set this attribute and advertising is disabled for the feature if the operating system shell does not
+            support Windows Installer descriptors. 
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.FileAttributes">
+            <summary>
+            Available values for the Attributes column of the File table.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.FileAttributes.None">
+            <summary>No attributes.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.FileAttributes.ReadOnly">
+            <summary>Read-only.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.FileAttributes.Hidden">
+            <summary>Hidden.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.FileAttributes.System">
+            <summary>System.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.FileAttributes.Vital">
+            <summary>The file is vital for the proper operation of the component to which it belongs.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.FileAttributes.Checksum">
+            <summary>The file contains a valid checksum. A checksum is required to repair a file that has become corrupted.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.FileAttributes.PatchAdded">
+            <summary>This bit must only be added by a patch and if the file is being added by the patch.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.FileAttributes.NonCompressed">
+            <summary>
+            The file's source type is uncompressed. If set, ignore the WordCount summary information property. If neither
+            Noncompressed nor Compressed are set, the compression state of the file is specified by the WordCount summary
+            information property. Do not set both Noncompressed and Compressed.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.FileAttributes.Compressed">
+            <summary>
+            The file's source type is compressed. If set, ignore the WordCount summary information property. If neither
+            Noncompressed or Compressed are set, the compression state of the file is specified by the WordCount summary
+            information property. Do not set both Noncompressed and Compressed.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.IniFileAction">
+            <summary>
+            Defines values for the Action column of the IniFile and RemoveIniFile tables.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.IniFileAction.AddLine">
+            <summary>Creates or updates a .ini entry.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.IniFileAction.CreateLine">
+            <summary>Creates a .ini entry only if the entry does not already exist.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.IniFileAction.RemoveLine">
+            <summary>Deletes .ini entry.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.IniFileAction.AddTag">
+            <summary>Creates a new entry or appends a new comma-separated value to an existing entry.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.IniFileAction.RemoveTag">
+            <summary>Deletes a tag from a .ini entry.</summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.LocatorTypes">
+            <summary>
+            Defines values for the Type column of the CompLocator, IniLocator, and RegLocator tables.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.LocatorTypes.Directory">
+            <summary>Key path is a directory.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.LocatorTypes.FileName">
+            <summary>Key path is a file name.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.LocatorTypes.RawValue">
+            <summary>Key path is a registry value.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.LocatorTypes.SixtyFourBit">
+            <summary>Set this bit to have the installer search the 64-bit portion of the registry.</summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.RegistryRoot">
+            <summary>
+            Defines values for the Root column of the Registry, RemoveRegistry, and RegLocator tables.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.RegistryRoot.UserOrMachine">
+            <summary>HKEY_CURRENT_USER for a per-user installation,
+            or HKEY_LOCAL_MACHINE for a per-machine installation.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.RegistryRoot.ClassesRoot">
+            <summary>HKEY_CLASSES_ROOT</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.RegistryRoot.CurrentUser">
+            <summary>HKEY_CURRENT_USER</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.RegistryRoot.LocalMachine">
+            <summary>HKEY_LOCAL_MACHINE</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.RegistryRoot.Users">
+            <summary>HKEY_USERS</summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.RemoveFileModes">
+            <summary>
+            Defines values for the InstallMode column of the RemoveFile table.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.RemoveFileModes.None">
+            <summary>Never remove.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.RemoveFileModes.OnInstall">
+            <summary>Remove when the associated component is being installed (install state = local or source).</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.RemoveFileModes.OnRemove">
+            <summary>Remove when the associated component is being removed (install state = absent).</summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.ServiceAttributes">
+            <summary>
+            Defines values for the ServiceType, StartType, and ErrorControl columns of the ServiceInstall table.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ServiceAttributes.None">
+            <summary>No flags.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ServiceAttributes.OwnProcess">
+            <summary>A Win32 service that runs its own process.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ServiceAttributes.ShareProcess">
+            <summary>A Win32 service that shares a process.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ServiceAttributes.Interactive">
+            <summary>A Win32 service that interacts with the desktop.
+            This value cannot be used alone and must be added to either
+            <see cref="F:Microsoft.Deployment.WindowsInstaller.ServiceAttributes.OwnProcess"/> or <see cref="F:Microsoft.Deployment.WindowsInstaller.ServiceAttributes.ShareProcess"/>.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ServiceAttributes.AutoStart">
+            <summary>Service starts during startup of the system.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ServiceAttributes.DemandStart">
+            <summary>Service starts when the service control manager calls the StartService function.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ServiceAttributes.Disabled">
+            <summary>Specifies a service that can no longer be started.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ServiceAttributes.ErrorMessage">
+            <summary>Logs the error, displays a message box and continues the startup operation.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ServiceAttributes.ErrorCritical">
+            <summary>Logs the error if it is possible and the system is restarted with the last configuration
+            known to be good. If the last-known-good configuration is being started, the startup operation fails.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ServiceAttributes.ErrorControlVital">
+            <summary>When combined with other error flags, specifies that the overall install should fail if
+            the service cannot be installed into the system.</summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.ServiceControlEvents">
+            <summary>
+            Defines values for the Event column of the ServiceControl table.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ServiceControlEvents.None">
+            <summary>No control events.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ServiceControlEvents.Start">
+            <summary>During an install, starts the service during the StartServices action.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ServiceControlEvents.Stop">
+            <summary>During an install, stops the service during the StopServices action.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ServiceControlEvents.Delete">
+            <summary>During an install, deletes the service during the DeleteServices action.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ServiceControlEvents.UninstallStart">
+            <summary>During an uninstall, starts the service during the StartServices action.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ServiceControlEvents.UninstallStop">
+            <summary>During an uninstall, stops the service during the StopServices action.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ServiceControlEvents.UninstallDelete">
+            <summary>During an uninstall, deletes the service during the DeleteServices action.</summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.TextStyles">
+            <summary>
+            Defines values for the StyleBits column of the TextStyle table.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.TextStyles.Bold">
+            <summary>Bold</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.TextStyles.Italic">
+            <summary>Italic</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.TextStyles.Underline">
+            <summary>Underline</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.TextStyles.Strike">
+            <summary>Strike out</summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.UpgradeAttributes">
+            <summary>
+            Defines values for the Attributes column of the Upgrade table.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.UpgradeAttributes.MigrateFeatures">
+            <summary>Migrates feature states by enabling the logic in the MigrateFeatureStates action.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.UpgradeAttributes.OnlyDetect">
+            <summary>Detects products and applications but does not remove.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.UpgradeAttributes.IgnoreRemoveFailure">
+            <summary>Continues installation upon failure to remove a product or application.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.UpgradeAttributes.VersionMinInclusive">
+            <summary>Detects the range of versions including the value in VersionMin.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.UpgradeAttributes.VersionMaxInclusive">
+            <summary>Dectects the range of versions including the value in VersionMax.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.UpgradeAttributes.LanguagesExclusive">
+            <summary>Detects all languages, excluding the languages listed in the Language column.</summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.ColumnInfo">
+            <summary>
+            Defines a single column of a table in an installer database.
+            </summary>
+            <remarks>Once created, a ColumnInfo object is immutable.</remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.ColumnInfo.#ctor(System.String,System.String)">
+            <summary>
+            Creates a new ColumnInfo object from a column definition.
+            </summary>
+            <param name="name">name of the column</param>
+            <param name="columnDefinition">column definition string</param>
+            <seealso cref="P:Microsoft.Deployment.WindowsInstaller.ColumnInfo.ColumnDefinitionString"/>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.ColumnInfo.#ctor(System.String,System.Type,System.Int32,System.Boolean)">
+            <summary>
+            Creates a new ColumnInfo object from a list of parameters.
+            </summary>
+            <param name="name">name of the column</param>
+            <param name="type">type of the column; must be one of the following:
+            Int16, Int32, String, or Stream</param>
+            <param name="size">the maximum number of characters for String columns;
+            ignored for other column types</param>
+            <param name="isRequired">true if the column is required to have a non-null value</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.ColumnInfo.#ctor(System.String,System.Type,System.Int32,System.Boolean,System.Boolean,System.Boolean)">
+            <summary>
+            Creates a new ColumnInfo object from a list of parameters.
+            </summary>
+            <param name="name">name of the column</param>
+            <param name="type">type of the column; must be one of the following:
+            Int16, Int32, String, or Stream</param>
+            <param name="size">the maximum number of characters for String columns;
+            ignored for other column types</param>
+            <param name="isRequired">true if the column is required to have a non-null value</param>
+            <param name="isTemporary">true to if the column is only in-memory and
+            not persisted with the database</param>
+            <param name="isLocalizable">for String columns, indicates the column
+            is localizable; ignored for other column types</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.ColumnInfo.ToString">
+            <summary>
+            Gets the name of the column.
+            </summary>
+            <returns>Name of the column.</returns>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ColumnInfo.Name">
+            <summary>
+            Gets the name of the column.
+            </summary>
+            <value>name of the column</value>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ColumnInfo.Type">
+            <summary>
+            Gets the type of the column as a System.Type.  This is one of the following: Int16, Int32, String, or Stream
+            </summary>
+            <value>type of the column</value>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ColumnInfo.DBType">
+            <summary>
+            Gets the type of the column as an integer that can be cast to a System.Data.DbType.  This is one of the following: Int16, Int32, String, or Binary
+            </summary>
+            <value>equivalent DbType of the column as an integer</value>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ColumnInfo.Size">
+            <summary>
+            Gets the size of the column.
+            </summary>
+            <value>The size of integer columns this is either 2 or 4.  For string columns this is the maximum
+            recommended length of the string, or 0 for unlimited length.  For stream columns, 0 is returned.</value>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ColumnInfo.IsRequired">
+            <summary>
+            Gets a value indicating whether the column must be non-null when inserting a record.
+            </summary>
+            <value>required status of the column</value>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ColumnInfo.IsTemporary">
+            <summary>
+            Gets a value indicating whether the column is temporary. Temporary columns are not persisted
+            when the database is saved to disk.
+            </summary>
+            <value>temporary status of the column</value>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ColumnInfo.IsLocalizable">
+            <summary>
+            Gets a value indicating whether the column is a string column that is localizable.
+            </summary>
+            <value>localizable status of the column</value>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ColumnInfo.SqlCreateString">
+            <summary>
+            Gets an SQL fragment that can be used to create this column within a CREATE TABLE statement.
+            </summary>
+            <value>SQL fragment to be used for creating the column</value>
+            <remarks><p>
+            Examples:
+            <list type="bullet">
+            <item>LONG</item>
+            <item>SHORT TEMPORARY</item>
+            <item>CHAR(0) LOCALIZABLE</item>
+            <item>CHAR(72) NOT NULL LOCALIZABLE</item>
+            <item>OBJECT</item>
+            </list>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ColumnInfo.ColumnDefinitionString">
+            <summary>
+            Gets a short string defining the type and size of the column. 
+            </summary>
+            <value>
+            The definition string consists
+            of a single letter representing the data type followed by the width of the column (in characters
+            when applicable, bytes otherwise). A width of zero designates an unbounded width (for example,
+            long text fields and streams). An uppercase letter indicates that null values are allowed in
+            the column.
+            </value>
+            <remarks><p>
+            <list>
+            <item>s? - String, variable length (?=1-255)</item>
+            <item>s0 - String, variable length</item>
+            <item>i2 - Short integer</item>
+            <item>i4 - Long integer</item>
+            <item>v0 - Binary Stream</item>
+            <item>g? - Temporary string (?=0-255)</item>
+            <item>j? - Temporary integer (?=0,1,2,4)</item>
+            <item>l? - Localizable string, variable length (?=1-255)</item>
+            <item>l0 - Localizable string, variable length</item>
+            </list>
+            </p></remarks>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.ComponentInfoCollection">
+            <summary>
+            Accessor for information about components within the context of an installation session.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.ComponentInfoCollection.Contains(System.String)">
+            <summary>
+            Checks if the collection contains a component.
+            </summary>
+            <param name="component">name of the component</param>
+            <returns>true if the component is in the collection, else false</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.ComponentInfoCollection.CopyTo(Microsoft.Deployment.WindowsInstaller.ComponentInfo[],System.Int32)">
+            <summary>
+            Copies the features into an array.
+            </summary>
+            <param name="array">array that receives the features</param>
+            <param name="arrayIndex">offset into the array</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.ComponentInfoCollection.GetEnumerator">
+            <summary>
+            Enumerates the components in the collection.
+            </summary>
+            <returns>an enumerator over all features in the collection</returns>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ComponentInfoCollection.Item(System.String)">
+            <summary>
+            Gets information about a component within the context of an installation session.
+            </summary>
+            <param name="component">name of the component</param>
+            <returns>component object</returns>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ComponentInfoCollection.Count">
+            <summary>
+            Gets the number of components defined for the product.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.ComponentInfo">
+            <summary>
+            Provides access to information about a component within the context of an installation session.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.ComponentInfo.GetCost(Microsoft.Deployment.WindowsInstaller.InstallState)">
+            <summary>
+            Gets disk space per drive required to install a component.
+            </summary>
+            <param name="installState">Requested component state</param>
+            <returns>A list of InstallCost structures, specifying the cost for each drive for the component</returns>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msienumcomponentcosts.asp">MsiEnumComponentCosts</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ComponentInfo.Name">
+            <summary>
+            Gets the name of the component (primary key in the Component table).
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ComponentInfo.CurrentState">
+            <summary>
+            Gets the current install state of the designated Component.
+            </summary>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Session handle is invalid</exception>
+            <exception cref="T:System.ArgumentException">an unknown Component was requested</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigetcomponentstate.asp">MsiGetComponentState</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ComponentInfo.RequestState">
+            <summary>
+            Gets or sets the action state of the designated Component.
+            </summary>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Session handle is invalid</exception>
+            <exception cref="T:System.ArgumentException">an unknown Component was requested</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallCanceledException">the user exited the installation</exception>
+            <remarks><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigetcomponentstate.asp">MsiGetComponentState</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisetcomponentstate.asp">MsiSetComponentState</a>
+            </p></remarks>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.ComponentInstallation">
+            <summary>
+            Represents an instance of a registered component.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.InstallationPart">
+            <summary>
+            Subclasses of this abstract class represent an instance
+            of a registered feature or component.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.InstallationPart.Product">
+            <summary>
+            Gets the product that this item is a part of.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.InstallationPart.State">
+            <summary>
+            Gets the current installation state of the item.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.ComponentInstallation.#ctor(System.String)">
+            <summary>
+            Creates a new ComponentInstallation, automatically detecting the
+            product that the component is a part of.
+            </summary>
+            <param name="componentCode">component GUID</param>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigetproductcode.asp">MsiGetProductCode</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.ComponentInstallation.#ctor(System.String,System.String)">
+            <summary>
+            Creates a new ComponentInstallation for a component installed by a
+            specific product.
+            </summary>
+            <param name="componentCode">component GUID</param>
+            <param name="productCode">ProductCode GUID</param>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ComponentInstallation.AllComponents">
+            <summary>
+            Gets the set of installed components for all products.
+            </summary>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">The installer configuration data is corrupt</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msienumcomponents.asp">MsiEnumComponents</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ComponentInstallation.ComponentCode">
+            <summary>
+            Gets the component code (GUID) of the component.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ComponentInstallation.ClientProducts">
+            <summary>
+            Gets all client products of a specified component.
+            </summary>
+            <returns>enumeration over all client products of the component</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">The installer configuration data is corrupt</exception>
+            <remarks><p>
+            Because clients are not ordered, any new component has an arbitrary index.
+            This means that the property may return clients in any order.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msienumclients.asp">MsiEnumClients</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ComponentInstallation.State">
+            <summary>
+            Gets the installed state of a component.
+            </summary>
+            <returns>the installed state of the component, or InstallState.Unknown
+            if this component is not part of a product</returns>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigetcomponentpath.asp">MsiGetComponentPath</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ComponentInstallation.Path">
+            <summary>
+            Gets the full path to an installed component. If the key path for the component is a
+            registry key then the registry key is returned.
+            </summary>
+            <returns>The file or registry keypath to the component, or null if the component is not available.</returns>
+            <exception cref="T:System.ArgumentException">An unknown product or component was specified</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">The installer configuration data is corrupt</exception>
+            <remarks><p>
+            If the component is a registry key, the registry roots are represented numerically.
+            For example, a registry path of "HKEY_CURRENT_USER\SOFTWARE\Microsoft" would be returned
+            as "01:\SOFTWARE\Microsoft". The registry roots returned are defined as follows:
+            HKEY_CLASSES_ROOT=00, HKEY_CURRENT_USER=01, HKEY_LOCAL_MACHINE=02, HKEY_USERS=03,
+            HKEY_PERFORMANCE_DATA=04
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigetcomponentpath.asp">MsiGetComponentPath</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msilocatecomponent.asp">MsiLocateComponent</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ComponentInstallation.Qualifiers">
+            <summary>
+            Gets the set of registered qualifiers for the component.
+            </summary>
+            <returns>Enumeration of the qulifiers for the component.</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">The installer configuration data is corrupt</exception>
+            <remarks><p>
+            Because qualifiers are not ordered, any new qualifier has an arbitrary index,
+            meaning the function can return qualifiers in any order.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msienumcomponentqualifiers.asp">MsiEnumComponentQualifiers</a>
+            </p></remarks>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.ComponentInstallation.Qualifier">
+            <summary>
+            Holds data about a component qualifier.
+            </summary>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msienumcomponentqualifiers.asp">MsiEnumComponentQualifiers</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ComponentInstallation.Qualifier.QualifierCode">
+            <summary>
+            Gets the qualifier code.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ComponentInstallation.Qualifier.Data">
+            <summary>
+            Gets the qualifier data.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.CustomActionAttribute">
+            <summary>
+            Marks a method as a custom action entry point.
+            </summary>
+            <remarks><p>
+            A custom action method must be defined as public and static,
+            take a single <see cref="T:Microsoft.Deployment.WindowsInstaller.Session"/> object as a parameter,
+            and return an <see cref="T:Microsoft.Deployment.WindowsInstaller.ActionResult"/> enumeration value.
+            </p></remarks>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.CustomActionAttribute.name">
+            <summary>
+            Name of the custom action entrypoint, or null if the same as the method name.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.CustomActionAttribute.#ctor">
+            <summary>
+            Marks a method as a custom action entry point.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.CustomActionAttribute.#ctor(System.String)">
+            <summary>
+            Marks a method as a custom action entry point.
+            </summary>
+            <param name="name">Name of the function to be exported,
+            defaults to the name of this method</param>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.CustomActionAttribute.Name">
+            <summary>
+            Gets or sets the name of the custom action entrypoint. A null
+            value defaults to the name of the method.
+            </summary>
+            <value>name of the custom action entrypoint, or null if none was specified</value>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.CustomActionData">
+            <summary>
+            Contains a collection of key-value pairs suitable for passing between
+            immediate and deferred/rollback/commit custom actions.
+            </summary>
+            <remarks>
+            Call the <see cref="M:Microsoft.Deployment.WindowsInstaller.CustomActionData.ToString"/> method to get a string
+            suitable for storing in a property and reconstructing the custom action data later.
+            </remarks>
+            <seealso cref="P:Microsoft.Deployment.WindowsInstaller.Session.CustomActionData"/>
+            <seealso cref="M:Microsoft.Deployment.WindowsInstaller.Session.DoAction(System.String,Microsoft.Deployment.WindowsInstaller.CustomActionData)"/>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.CustomActionData.PropertyName">
+            <summary>
+            "CustomActionData" literal property name.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.CustomActionData.#ctor">
+            <summary>
+            Creates a new empty custom action data object.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.CustomActionData.#ctor(System.String)">
+            <summary>
+            Reconstructs a custom action data object from data that was previously
+            persisted in a string.
+            </summary>
+            <param name="keyValueList">Previous output from <see cref="M:Microsoft.Deployment.WindowsInstaller.CustomActionData.ToString"/>.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.CustomActionData.Add(System.String,System.String)">
+            <summary>
+            Adds a key and value to the data collection.
+            </summary>
+            <param name="key">Case-sensitive data key.</param>
+            <param name="value">Data value (may be null).</param>
+            <exception cref="T:System.ArgumentException">the key does not consist solely of letters,
+            numbers, and the period, underscore, and space characters.</exception>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.CustomActionData.AddObject``1(System.String,``0)">
+            <summary>
+            Adds a value to the data collection, using XML serialization to persist the object as a string.
+            </summary>
+            <param name="key">Case-sensitive data key.</param>
+            <param name="value">Data value (may be null).</param>
+            <exception cref="T:System.ArgumentException">the key does not consist solely of letters,
+            numbers, and the period, underscore, and space characters.</exception>
+            <exception cref="T:System.NotSupportedException">The value type does not support XML serialization.</exception>
+            <exception cref="T:System.InvalidOperationException">The value could not be serialized.</exception>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.CustomActionData.GetObject``1(System.String)">
+            <summary>
+            Gets a value from the data collection, using XML serialization to load the object from a string.
+            </summary>
+            <param name="key">Case-sensitive data key.</param>
+            <exception cref="T:System.InvalidOperationException">The value could not be deserialized.</exception>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.CustomActionData.ContainsKey(System.String)">
+            <summary>
+            Determines whether the data contains an item with the specified key.
+            </summary>
+            <param name="key">Case-sensitive data key.</param>
+            <returns>true if the data contains an item with the key; otherwise, false</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.CustomActionData.Remove(System.String)">
+            <summary>
+            Removes the item with the specified key from the data.
+            </summary>
+            <param name="key">Case-sensitive data key.</param>
+            <returns>true if the item was successfully removed from the data;
+            false if an item with the specified key was not found</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.CustomActionData.TryGetValue(System.String,System.String@)">
+            <summary>
+            Gets the value with the specified key.
+            </summary>
+            <param name="key">Case-sensitive data key.</param>
+            <param name="value">Value associated with the specified key, or
+            null if an item with the specified key was not found</param>
+            <returns>true if the data contains an item with the specified key; otherwise, false.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.CustomActionData.Add(System.Collections.Generic.KeyValuePair{System.String,System.String})">
+            <summary>
+            Adds an item with key and value to the data collection.
+            </summary>
+            <param name="item">Case-sensitive data key, with a data value that may be null.</param>
+            <exception cref="T:System.ArgumentException">the key does not consist solely of letters,
+            numbers, and the period, underscore, and space characters.</exception>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.CustomActionData.Clear">
+            <summary>
+            Removes all items from the data.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.CustomActionData.Contains(System.Collections.Generic.KeyValuePair{System.String,System.String})">
+            <summary>
+            Determines whether the data contains a specified item.
+            </summary>
+            <param name="item">The data item to locate.</param>
+            <returns>true if the data contains the item; otherwise, false</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.CustomActionData.CopyTo(System.Collections.Generic.KeyValuePair{System.String,System.String}[],System.Int32)">
+            <summary>
+            Copies the data to an array, starting at a particular array index.
+            </summary>
+            <param name="array">Destination array.</param>
+            <param name="arrayIndex">Index in the array at which copying begins.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.CustomActionData.Remove(System.Collections.Generic.KeyValuePair{System.String,System.String})">
+            <summary>
+            Removes an item from the data.
+            </summary>
+            <param name="item">The item to remove.</param>
+            <returns>true if the item was successfully removed from the data;
+            false if the item was not found</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.CustomActionData.GetEnumerator">
+            <summary>
+            Returns an enumerator that iterates through the collection.
+            </summary>
+            <returns>An enumerator that can be used to iterate through the collection.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.CustomActionData.System#Collections#IEnumerable#GetEnumerator">
+            <summary>
+            Returns an enumerator that iterates through the collection.
+            </summary>
+            <returns>An enumerator that can be used to iterate through the collection.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.CustomActionData.ToString">
+            <summary>
+            Gets a string representation of the data suitable for persisting in a property.
+            </summary>
+            <returns>Data string in the form "Key1=Value1;Key2=Value2"</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.CustomActionData.ValidateKey(System.String)">
+            <summary>
+            Ensures that a key contains valid characters.
+            </summary>
+            <param name="key">key to be validated</param>
+            <exception cref="T:System.ArgumentException">the key does not consist solely of letters,
+            numbers, and the period, underscore, and space characters.</exception>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.CustomActionData.Serialize``1(``0)">
+            <summary>
+            Serializes a value into an XML string.
+            </summary>
+            <typeparam name="T">Type of the value.</typeparam>
+            <param name="value">Value to be serialized.</param>
+            <returns>Serialized value data as a string.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.CustomActionData.Deserialize``1(System.String)">
+            <summary>
+            Deserializes a value from an XML string.
+            </summary>
+            <typeparam name="T">Expected type of the value.</typeparam>
+            <param name="value">Serialized value data.</param>
+            <returns>Deserialized value object.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.CustomActionData.Escape(System.String)">
+            <summary>
+            Escapes a value string by doubling any data-separator (semicolon) characters.
+            </summary>
+            <param name="value"></param>
+            <returns>Escaped value string</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.CustomActionData.Unescape(System.String)">
+            <summary>
+            Unescapes a value string by undoubling any doubled data-separator (semicolon) characters.
+            </summary>
+            <param name="value"></param>
+            <returns>Unescaped value string</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.CustomActionData.Parse(System.String)">
+            <summary>
+            Loads key-value pairs from a string into the data collection.
+            </summary>
+            <param name="keyValueList">key-value pair list of the form returned by <see cref="M:Microsoft.Deployment.WindowsInstaller.CustomActionData.ToString"/></param>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.CustomActionData.Keys">
+            <summary>
+            Gets a collection object containing all the keys of the data.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.CustomActionData.Values">
+            <summary>
+            Gets a collection containing all the values of the data.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.CustomActionData.Item(System.String)">
+            <summary>
+            Gets or sets a data value with a specified key.
+            </summary>
+            <param name="key">Case-sensitive data key.</param>
+            <exception cref="T:System.ArgumentException">the key does not consist solely of letters,
+            numbers, and the period, underscore, and space characters.</exception>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.CustomActionData.Count">
+            <summary>
+            Gets the number of items in the data.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.CustomActionData.IsReadOnly">
+            <summary>
+            Gets a value indicating whether the data is read-only.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.CustomActionProxy">
+            <summary>
+            Managed-code portion of the custom action proxy.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.CustomActionProxy.InvokeCustomAction(System.Int32,System.String,System.IntPtr)">
+            <summary>
+            Invokes a managed custom action method.
+            </summary>
+            <param name="sessionHandle">Integer handle to the installer session.</param>
+            <param name="entryPoint">Name of the custom action entrypoint. This must
+            either map to an entrypoint definition in the <c>customActions</c>
+            config section, or be an explicit entrypoint of the form:
+            &quot;AssemblyName!Namespace.Class.Method&quot;</param>
+            <param name="remotingDelegatePtr">Pointer to a delegate used to
+            make remote API calls, if this custom action is running out-of-proc.</param>
+            <returns>The value returned by the custom action method,
+            or ERROR_INSTALL_FAILURE if the custom action could not be invoked.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.CustomActionProxy.DebugBreakEnabled(System.String[])">
+            <summary>
+            Checks the "MMsiBreak" environment variable for any matching custom action names.
+            </summary>
+            <param name="names">List of names to search for in the environment
+            variable string.</param>
+            <returns>True if a match was found, else false.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.CustomActionProxy.FindEntryPoint(Microsoft.Deployment.WindowsInstaller.Session,System.String,System.String@,System.String@,System.String@)">
+            <summary>
+            Locates and parses an entrypoint mapping in CustomAction.config.
+            </summary>
+            <param name="session">Installer session handle, just used for logging.</param>
+            <param name="entryPoint">Custom action entrypoint name: the key value
+            in an item in the <c>customActions</c> section of the config file.</param>
+            <param name="assemblyName">Returned display name of the assembly from
+            the entrypoint mapping.</param>
+            <param name="className">Returned class name of the entrypoint mapping.</param>
+            <param name="methodName">Returned method name of the entrypoint mapping.</param>
+            <returns>True if the entrypoint was found, false if not or if some error
+            occurred.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.CustomActionProxy.GetCustomActionMethod(Microsoft.Deployment.WindowsInstaller.Session,System.String,System.String,System.String)">
+            <summary>
+            Uses reflection to load the assembly and class and find the method.
+            </summary>
+            <param name="session">Installer session handle, just used for logging.</param>
+            <param name="assemblyName">Display name of the assembly containing the
+            custom action method.</param>
+            <param name="className">Fully-qualified name of the class containing the
+            custom action method.</param>
+            <param name="methodName">Name of the custom action method.</param>
+            <returns>The method, or null if not found.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.CustomActionProxy.MethodHasCustomActionSignature(System.Reflection.MethodInfo)">
+            <summary>
+            Checks if a method has the right return and paramater types
+            for a custom action, and that it is marked by a CustomActionAttribute.
+            </summary>
+            <param name="method">Method to be checked.</param>
+            <returns>True if the method is a valid custom action, else false.</returns>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.Database">
+            <summary>
+            Accesses a Windows Installer database.
+            </summary>
+            <remarks><p>
+            The <see cref="M:Microsoft.Deployment.WindowsInstaller.Database.Commit"/> method must be called before the Database is closed to write out all
+            persistent changes. If the Commit method is not called, the installer performs an implicit
+            rollback upon object destruction.
+            </p><p>
+            The client can use the following procedure for data access:<list type="number">
+            <item><description>Obtain a Database object using one of the Database constructors.</description></item> 
+            <item><description>Initiate a query using a SQL string by calling the <see cref="M:Microsoft.Deployment.WindowsInstaller.Database.OpenView(System.String,System.Object[])"/>
+            	method of the Database.</description></item> 
+            <item><description>Set query parameters in a <see cref="T:Microsoft.Deployment.WindowsInstaller.Record"/> and execute the database
+            	query by calling the <see cref="M:Microsoft.Deployment.WindowsInstaller.View.Execute(Microsoft.Deployment.WindowsInstaller.Record)"/> method of the <see cref="T:Microsoft.Deployment.WindowsInstaller.View"/>. This
+            	produces a result that can be fetched or updated.</description></item> 
+            <item><description>Call the <see cref="M:Microsoft.Deployment.WindowsInstaller.View.Fetch"/> method of the View repeatedly to return
+            	Records.</description></item> 
+            <item><description>Update database rows of a Record object obtained by the Fetch method using
+            	one of the <see cref="M:Microsoft.Deployment.WindowsInstaller.View.Modify(Microsoft.Deployment.WindowsInstaller.ViewModifyMode,Microsoft.Deployment.WindowsInstaller.Record)"/> methods of the View.</description></item> 
+            <item><description>Release the query and any unfetched records by calling the <see cref="M:Microsoft.Deployment.WindowsInstaller.InstallerHandle.Close"/>
+            	method of the View.</description></item> 
+            <item><description>Persist any database updates by calling the Commit method of the Database.
+            	</description></item> 
+            </list>
+            </p></remarks>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.InstallerHandle">
+            <summary>
+            Base class for Windows Installer handle types (Database, View, Record, SummaryInfo).
+            </summary>
+            <remarks><p>
+            These classes implement the <see cref="T:System.IDisposable"/> interface, because they
+            hold unmanaged resources (MSI handles) that should be properly disposed
+            when no longer needed.
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.InstallerHandle.#ctor(System.IntPtr,System.Boolean)">
+            <summary>
+            Constructs a handle object from a native integer handle.
+            </summary>
+            <param name="handle">Native integer handle.</param>
+            <param name="ownsHandle">true to close the handle when this object is disposed or finalized</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.InstallerHandle.Dispose">
+            <summary>
+            Closes the handle.  After closing a handle, further method calls may throw an <see cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException"/>.
+            </summary>
+            <remarks><p>
+            The finalizer of this class will NOT close the handle if it is still open,
+            because finalization can run on a separate thread from the application,
+            resulting in potential problems if handles are closed from that thread.
+            It is best that the handle be closed manually as soon as it is no longer needed,
+            as leaving lots of unused handles open can degrade performance.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiclosehandle.asp">MsiCloseHandle</a>
+            </p></remarks>
+            <seealso cref="M:Microsoft.Deployment.WindowsInstaller.InstallerHandle.Close"/>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.InstallerHandle.Close">
+            <summary>
+            Closes the handle.  After closing a handle, further method calls may throw an <see cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException"/>.
+            </summary>
+            <remarks><p>
+            The finalizer of this class will NOT close the handle if it is still open,
+            because finalization can run on a separate thread from the application,
+            resulting in potential problems if handles are closed from that thread.
+            It is best that the handle be closed manually as soon as it is no longer needed,
+            as leaving lots of unused handles open can degrade performance.
+            </p><p>
+            This method is merely an alias for the <see cref="M:Microsoft.Deployment.WindowsInstaller.InstallerHandle.Dispose"/> method.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiclosehandle.asp">MsiCloseHandle</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.InstallerHandle.Equals(System.Object)">
+            <summary>
+            Tests whether this handle object is equal to another handle object.  Two handle objects are equal
+            if their types are the same and their native integer handles are the same.
+            </summary>
+            <param name="obj">The handle object to compare with the current handle object.</param>
+            <returns>true if the specified handle object is equal to the current handle object; otherwise false</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.InstallerHandle.GetHashCode">
+            <summary>
+            Gets a hash value for the handle object.
+            </summary>
+            <returns>A hash code for the handle object.</returns>
+            <remarks><p>
+            The hash code is derived from the native integer handle.
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.InstallerHandle.Dispose(System.Boolean)">
+            <summary>
+            Closes the handle.  After closing a handle, further method calls may throw an <see cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException"/>.
+            </summary>
+            <param name="disposing">If true, the method has been called directly or indirectly by a user's code,
+            so managed and unmanaged resources will be disposed. If false, the method has been called by the 
+            runtime from inside the finalizer, and only unmanaged resources will be disposed.</param>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.InstallerHandle.Handle">
+            <summary>
+            Gets the native integer handle.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.InstallerHandle.IsClosed">
+            <summary>
+            Checks if the handle is closed. When closed, method calls on the handle object may throw an <see cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException"/>.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.InstallerHandle.Sync">
+            <summary>
+            Gets an object that can be used internally for safe syncronization.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.#ctor(System.String)">
+            <summary>
+            Opens an existing database in read-only mode.
+            </summary>
+            <param name="filePath">Path to the database file.</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the database could not be created/opened</exception>
+            <remarks><p>
+            Because this constructor initiates database access, it cannot be used with a
+            running installation.
+            </p><p>
+            The Database object should be <see cref="M:Microsoft.Deployment.WindowsInstaller.InstallerHandle.Close"/>d after use.
+            It is best that the handle be closed manually as soon as it is no longer
+            needed, as leaving lots of unused handles open can degrade performance.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiopendatabase.asp">MsiOpenDatabase</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.#ctor(System.String,System.String)">
+            <summary>
+            Opens an existing database with another database as output.
+            </summary>
+            <param name="filePath">Path to the database to be read.</param>
+            <param name="outputPath">Open mode for the database</param>
+            <returns>Database object representing the created or opened database</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the database could not be created/opened</exception>
+            <remarks><p>
+            When a database is opened as the output of another database, the summary information stream
+            of the output database is actually a read-only mirror of the original database and thus cannot
+            be changed. Additionally, it is not persisted with the database. To create or modify the
+            summary information for the output database it must be closed and re-opened.
+            </p><p>
+            The Database object should be <see cref="M:Microsoft.Deployment.WindowsInstaller.InstallerHandle.Close"/>d after use.
+            It is best that the handle be closed manually as soon as it is no longer
+            needed, as leaving lots of unused handles open can degrade performance.
+            </p><p>
+            The database is opened in <see cref="F:Microsoft.Deployment.WindowsInstaller.DatabaseOpenMode.CreateDirect"/> mode, and will be
+            automatically commited when it is closed.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiopendatabase.asp">MsiOpenDatabase</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.#ctor(System.String,Microsoft.Deployment.WindowsInstaller.DatabaseOpenMode)">
+            <summary>
+            Opens an existing database or creates a new one.
+            </summary>
+            <param name="filePath">Path to the database file. If an empty string
+            is supplied, a temporary database is created that is not persisted.</param>
+            <param name="mode">Open mode for the database</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the database could not be created/opened</exception>
+            <remarks><p>
+            Because this constructor initiates database access, it cannot be used with a
+            running installation.
+            </p><p>
+            The database object should be <see cref="M:Microsoft.Deployment.WindowsInstaller.InstallerHandle.Close"/>d after use.
+            The finalizer will close the handle if it is still open, however due to the nondeterministic
+            nature of finalization it is best that the handle be closed manually as soon as it is no
+            longer needed, as leaving lots of unused handles open can degrade performance.
+            </p><p>
+            A database opened in <see cref="F:Microsoft.Deployment.WindowsInstaller.DatabaseOpenMode.CreateDirect"/> or
+            <see cref="F:Microsoft.Deployment.WindowsInstaller.DatabaseOpenMode.Direct"/> mode will be automatically commited when it is
+            closed. However a database opened in <see cref="F:Microsoft.Deployment.WindowsInstaller.DatabaseOpenMode.Create"/> or
+            <see cref="F:Microsoft.Deployment.WindowsInstaller.DatabaseOpenMode.Transact"/> mode must have the <see cref="M:Microsoft.Deployment.WindowsInstaller.Database.Commit"/> method
+            called before it is closed, otherwise no changes will be persisted.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiopendatabase.asp">MsiOpenDatabase</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.#ctor(System.IntPtr,System.Boolean,System.String,Microsoft.Deployment.WindowsInstaller.DatabaseOpenMode)">
+            <summary>
+            Creates a new database from an MSI handle.
+            </summary>
+            <param name="handle">Native MSI database handle.</param>
+            <param name="ownsHandle">True if the handle should be closed
+            when the database object is disposed</param>
+            <param name="filePath">Path of the database file, if known</param>
+            <param name="openMode">Mode the handle was originally opened in</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.FromHandle(System.IntPtr,System.Boolean)">
+            <summary>
+            Creates a new Database object from an integer database handle.
+            </summary>
+            <remarks><p>
+            This method is only provided for interop purposes.  A Database object
+            should normally be obtained from <see cref="P:Microsoft.Deployment.WindowsInstaller.Session.Database"/> or
+            a public Database constructor.
+            </p></remarks>
+            <param name="handle">Integer database handle</param>
+            <param name="ownsHandle">true to close the handle when this object is disposed</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.DeleteOnClose(System.String)">
+            <summary>
+            Schedules a file or directory for deletion after the database handle is closed.
+            </summary>
+            <param name="path">File or directory path to be deleted. All files and subdirectories
+            under a directory are deleted.</param>
+            <remarks><p>
+            Once an item is scheduled, it cannot be unscheduled.
+            </p><p>
+            The items cannot be deleted if the Database object is auto-disposed by the
+            garbage collector; the handle must be explicitly closed.
+            </p><p>
+            Files which are read-only or otherwise locked cannot be deleted,
+            but they will not cause an exception to be thrown.
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.Merge(Microsoft.Deployment.WindowsInstaller.Database,System.String)">
+            <summary>
+            Merges another database with this database.
+            </summary>
+            <param name="otherDatabase">The database to be merged into this database</param>
+            <param name="errorTable">Optional name of table to contain the names of the tables containing
+            merge conflicts, the number of conflicting rows within the table, and a reference to the table
+            with the merge conflict.</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.MergeException">merge failed due to a schema difference or data conflict</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Database handle is invalid</exception>
+            <remarks><p>
+            Merge does not copy over embedded cabinet files or embedded transforms from the
+            reference database into the target database. Embedded data streams that are listed in the
+            Binary table or Icon table are copied from the reference database to the target database.
+            Storage embedded in the reference database are not copied to the target database.
+            </p><p>
+            The Merge method merges the data of two databases. These databases must have the same
+            codepage. The merge fails if any tables or rows in the databases conflict. A conflict exists
+            if the data in any row in the first database differs from the data in the corresponding row
+            of the second database. Corresponding rows are in the same table of both databases and have
+            the same primary key in both databases. The tables of non-conflicting databases must have
+            the same number of primary keys, same number of columns, same column types, same column names,
+            and the same data in rows with identical primary keys. Temporary columns however don't matter
+            in the column count and corresponding tables can have a different number of temporary columns
+            without creating conflict as long as the persistent columns match.
+            </p><p>
+            If the number, type, or name of columns in corresponding tables are different, the
+            schema of the two databases are incompatible and the installer will stop processing tables
+            and the merge fails. The installer checks that the two databases have the same schema before
+            checking for row merge conflicts. If the schemas are incompatible, the databases have be
+            modified.
+            </p><p>
+            If the data in particular rows differ, this is a row merge conflict, the merge fails
+            and creates a new table with the specified name. The first column of this table is the name
+            of the table having the conflict. The second column gives the number of rows in the table
+            having the conflict.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msidatabasemerge.asp">MsiDatabaseMerge</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.Merge(Microsoft.Deployment.WindowsInstaller.Database)">
+            <summary>
+            Merges another database with this database.
+            </summary>
+            <param name="otherDatabase">The database to be merged into this database</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.MergeException">merge failed due to a schema difference or data conflict</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Database handle is invalid</exception>
+            <remarks><p>
+            MsiDatabaseMerge does not copy over embedded cabinet files or embedded transforms from
+            the reference database into the target database. Embedded data streams that are listed in
+            the Binary table or Icon table are copied from the reference database to the target database.
+            Storage embedded in the reference database are not copied to the target database.
+            </p><p>
+            The Merge method merges the data of two databases. These databases must have the same
+            codepage. The merge fails if any tables or rows in the databases conflict. A conflict exists
+            if the data in any row in the first database differs from the data in the corresponding row
+            of the second database. Corresponding rows are in the same table of both databases and have
+            the same primary key in both databases. The tables of non-conflicting databases must have
+            the same number of primary keys, same number of columns, same column types, same column names,
+            and the same data in rows with identical primary keys. Temporary columns however don't matter
+            in the column count and corresponding tables can have a different number of temporary columns
+            without creating conflict as long as the persistent columns match.
+            </p><p>
+            If the number, type, or name of columns in corresponding tables are different, the
+            schema of the two databases are incompatible and the installer will stop processing tables
+            and the merge fails. The installer checks that the two databases have the same schema before
+            checking for row merge conflicts. If the schemas are incompatible, the databases have be
+            modified.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msidatabasemerge.asp">MsiDatabaseMerge</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.IsTablePersistent(System.String)">
+            <summary>
+            Checks whether a table exists and is persistent in the database.
+            </summary>
+            <param name="table">The table to the checked</param>
+            <returns>true if the table exists and is persistent in the database; false otherwise</returns>
+            <exception cref="T:System.ArgumentException">the table is unknown</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Database handle is invalid</exception>
+            <remarks><p>
+            To check whether a table exists regardless of persistence,
+            use <see cref="M:Microsoft.Deployment.WindowsInstaller.TableCollection.Contains(System.String)"/>.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msidatabaseistablepersistent.asp">MsiDatabaseIsTablePersistent</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.IsColumnPersistent(System.String,System.String)">
+            <summary>
+            Checks whether a table contains a persistent column with a given name.
+            </summary>
+            <param name="table">The table to the checked</param>
+            <param name="column">The name of the column to be checked</param>
+            <returns>true if the column exists in the table; false if the column is temporary or does not exist.</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the View could not be executed</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Database handle is invalid</exception>
+            <remarks><p>
+            To check whether a column exists regardless of persistence,
+            use <see cref="M:Microsoft.Deployment.WindowsInstaller.ColumnCollection.Contains(System.String)"/>.
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.CountRows(System.String)">
+            <summary>
+            Gets the count of all rows in the table.
+            </summary>
+            <param name="table">Name of the table whose rows are to be counted</param>
+            <returns>The count of all rows in the table</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the View could not be executed</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Database handle is invalid</exception>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.CountRows(System.String,System.String)">
+            <summary>
+            Gets the count of all rows in the table that satisfy a given condition.
+            </summary>
+            <param name="table">Name of the table whose rows are to be counted</param>
+            <param name="where">Conditional expression, such as could be placed on the end of a SQL WHERE clause</param>
+            <returns>The count of all rows in the table satisfying the condition</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.BadQuerySyntaxException">the SQL WHERE syntax is invalid</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the View could not be executed</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Database handle is invalid</exception>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.Commit">
+            <summary>
+            Finalizes the persistent form of the database. All persistent data is written
+            to the writeable database, and no temporary columns or rows are written.
+            </summary>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Database handle is invalid</exception>
+            <remarks><p>
+            For a database open in <see cref="F:Microsoft.Deployment.WindowsInstaller.DatabaseOpenMode.ReadOnly"/> mode, this method has no effect.
+            </p><p>
+            For a database open in <see cref="F:Microsoft.Deployment.WindowsInstaller.DatabaseOpenMode.CreateDirect"/> or <see cref="F:Microsoft.Deployment.WindowsInstaller.DatabaseOpenMode.Direct"/>
+            mode, it is not necessary to call this method because the database will be automatically committed
+            when it is closed. However this method may be called at any time to persist the current state of tables
+            loaded into memory.
+            </p><p>
+            For a database open in <see cref="F:Microsoft.Deployment.WindowsInstaller.DatabaseOpenMode.Create"/> or <see cref="F:Microsoft.Deployment.WindowsInstaller.DatabaseOpenMode.Transact"/>
+            mode, no changes will be persisted until this method is called. If the database object is closed without
+            calling this method, the database file remains unmodified.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msidatabasecommit.asp">MsiDatabaseCommit</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.Export(System.String,System.String)">
+            <summary>
+            Copies the structure and data from a specified table to a text archive file.
+            </summary>
+            <param name="table">Name of the table to be exported</param>
+            <param name="exportFilePath">Path to the file to be created</param>
+            <exception cref="T:System.IO.FileNotFoundException">the file path is invalid</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Database handle is invalid</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msidatabaseexport.asp">MsiDatabaseExport</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.Import(System.String)">
+            <summary>
+            Imports a database table from a text archive file, dropping any existing table.
+            </summary>
+            <param name="importFilePath">Path to the file to be imported. 
+            The table name is specified within the file.</param>
+            <exception cref="T:System.IO.FileNotFoundException">the file path is invalid</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Database handle is invalid</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msidatabaseimport.asp">MsiDatabaseImport</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.ExportAll(System.String)">
+            <summary>
+            Exports all database tables, streams, and summary information to archive files.
+            </summary>
+            <param name="directoryPath">Path to the directory where archive files will be created</param>
+            <exception cref="T:System.IO.FileNotFoundException">the directory path is invalid</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Database handle is invalid</exception>
+            <remarks><p>
+            The directory will be created if it does not already exist.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msidatabaseexport.asp">MsiDatabaseExport</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.ImportAll(System.String)">
+            <summary>
+            Imports all database tables, streams, and summary information from archive files.
+            </summary>
+            <param name="directoryPath">Path to the directory from which archive files will be imported</param>
+            <exception cref="T:System.IO.FileNotFoundException">the directory path is invalid</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Database handle is invalid</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msidatabaseimport.asp">MsiDatabaseImport</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.CreateRecord(System.Int32)">
+            <summary>
+            Creates a new record object with the requested number of fields.
+            </summary>
+            <param name="fieldCount">Required number of fields, which may be 0.
+            The maximum number of fields in a record is limited to 65535.</param>
+            <returns>A new record object that can be used with the database.</returns>
+            <remarks><p>
+            This method is equivalent to directly calling the <see cref="T:Microsoft.Deployment.WindowsInstaller.Record"/>
+            constructor in all cases outside of a custom action context. When in a
+            custom action session, this method allows creation of a record that can
+            work with a database other than the session database.
+            </p><p>
+            The Record object should be <see cref="M:Microsoft.Deployment.WindowsInstaller.InstallerHandle.Close"/>d after use.
+            It is best that the handle be closed manually as soon as it is no longer
+            needed, as leaving lots of unused handles open can degrade performance.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msicreaterecord.asp">MsiCreateRecord</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.ToString">
+            <summary>
+            Returns the file path of this database, or the handle value if a file path was not specified.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.Dispose(System.Boolean)">
+            <summary>
+            Closes the database handle.  After closing a handle, further method calls may throw <see cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException"/>.
+            </summary>
+            <param name="disposing">If true, the method has been called directly or
+            indirectly by a user's code, so managed and unmanaged resources will be
+            disposed. If false, only unmanaged resources will be disposed.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.OpenView(System.String,System.Object[])">
+            <summary>
+            Gets a View object representing the query specified by a SQL string.
+            </summary>
+            <param name="sqlFormat">SQL query string, which may contain format items</param>
+            <param name="args">Zero or more objects to format</param>
+            <returns>A View object representing the query specified by a SQL string</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.BadQuerySyntaxException">the SQL syntax is invalid</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Database handle is invalid</exception>
+            <remarks><p>
+            The <paramref name="sqlFormat"/> parameter is formatted using <see cref="M:System.String.Format(System.String,System.Object[])"/>.
+            </p><p>
+            The View object should be <see cref="M:Microsoft.Deployment.WindowsInstaller.InstallerHandle.Close"/>d after use.
+            It is best that the handle be closed manually as soon as it is no longer
+            needed, as leaving lots of unused handles open can degrade performance.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msidatabaseopenview.asp">MsiDatabaseOpenView</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.Execute(System.String,System.Object[])">
+            <summary>
+            Executes the query specified by a SQL string.  The query may not be a SELECT statement.
+            </summary>
+            <param name="sqlFormat">SQL query string, which may contain format items</param>
+            <param name="args">Zero or more objects to format</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.BadQuerySyntaxException">the SQL syntax is invalid</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the View could not be executed</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Database handle is invalid</exception>
+            <remarks><p>
+            The <paramref name="sqlFormat"/> parameter is formatted using
+            <see cref="M:System.String.Format(System.String,System.Object[])"/>.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msidatabaseopenview.asp">MsiDatabaseOpenView</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewexecute.asp">MsiViewExecute</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.Execute(System.String,Microsoft.Deployment.WindowsInstaller.Record)">
+            <summary>
+            Executes the query specified by a SQL string.  The query may not be a SELECT statement.
+            </summary>
+            <param name="sql">SQL query string</param>
+            <param name="record">Optional Record object containing the values that replace
+            the parameter tokens (?) in the SQL query.</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.BadQuerySyntaxException">the SQL syntax is invalid</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the View could not be executed</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Database handle is invalid</exception>
+            <remarks><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msidatabaseopenview.asp">MsiDatabaseOpenView</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewexecute.asp">MsiViewExecute</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.ExecuteQuery(System.String,System.Object[])">
+            <summary>
+            Executes the specified SQL SELECT query and returns all results.
+            </summary>
+            <param name="sqlFormat">SQL query string, which may contain format items</param>
+            <param name="args">Zero or more objects to format</param>
+            <returns>All results combined into an array</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.BadQuerySyntaxException">the SQL syntax is invalid</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the View could not be executed</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Database handle is invalid</exception>
+            <remarks><p>
+            The <paramref name="sqlFormat"/> parameter is formatted using
+            <see cref="M:System.String.Format(System.String,System.Object[])"/>.
+            </p><p>
+            Multiple rows columns will be collapsed into a single one-dimensional list.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msidatabaseopenview.asp">MsiDatabaseOpenView</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewexecute.asp">MsiViewExecute</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewfetch.asp">MsiViewFetch</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.ExecuteQuery(System.String,Microsoft.Deployment.WindowsInstaller.Record)">
+            <summary>
+            Executes the specified SQL SELECT query and returns all results.
+            </summary>
+            <param name="sql">SQL SELECT query string</param>
+            <param name="record">Optional Record object containing the values that replace
+            the parameter tokens (?) in the SQL query.</param>
+            <returns>All results combined into an array</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.BadQuerySyntaxException">the SQL syntax is invalid</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the View could not be executed</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Database handle is invalid</exception>
+            <remarks><p>
+            Multiple rows columns will be collapsed into a single one-dimensional list.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msidatabaseopenview.asp">MsiDatabaseOpenView</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewexecute.asp">MsiViewExecute</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewfetch.asp">MsiViewFetch</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.ExecuteIntegerQuery(System.String,System.Object[])">
+            <summary>
+            Executes the specified SQL SELECT query and returns all results as integers.
+            </summary>
+            <param name="sqlFormat">SQL query string, which may contain format items</param>
+            <param name="args">Zero or more objects to format</param>
+            <returns>All results combined into an array</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.BadQuerySyntaxException">the SQL syntax is invalid</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the View could not be executed</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Database handle is invalid</exception>
+            <remarks><p>
+            The <paramref name="sqlFormat"/> parameter is formatted using
+            <see cref="M:System.String.Format(System.String,System.Object[])"/>.
+            </p><p>
+            Multiple rows columns will be collapsed into a single one-dimensional list.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msidatabaseopenview.asp">MsiDatabaseOpenView</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewexecute.asp">MsiViewExecute</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewfetch.asp">MsiViewFetch</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.ExecuteIntegerQuery(System.String,Microsoft.Deployment.WindowsInstaller.Record)">
+            <summary>
+            Executes the specified SQL SELECT query and returns all results as integers.
+            </summary>
+            <param name="sql">SQL SELECT query string</param>
+            <param name="record">Optional Record object containing the values that replace
+            the parameter tokens (?) in the SQL query.</param>
+            <returns>All results combined into an array</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.BadQuerySyntaxException">the SQL syntax is invalid</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the View could not be executed</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Database handle is invalid</exception>
+            <remarks><p>
+            Multiple rows columns will be collapsed into a single one-dimensional list.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msidatabaseopenview.asp">MsiDatabaseOpenView</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewexecute.asp">MsiViewExecute</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewfetch.asp">MsiViewFetch</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.ExecuteStringQuery(System.String,System.Object[])">
+            <summary>
+            Executes the specified SQL SELECT query and returns all results as strings.
+            </summary>
+            <param name="sqlFormat">SQL query string, which may contain format items</param>
+            <param name="args">Zero or more objects to format</param>
+            <returns>All results combined into an array</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.BadQuerySyntaxException">the SQL syntax is invalid</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the View could not be executed</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Database handle is invalid</exception>
+            <remarks><p>
+            The <paramref name="sqlFormat"/> parameter is formatted using
+            <see cref="M:System.String.Format(System.String,System.Object[])"/>.
+            </p><p>
+            Multiple rows columns will be collapsed into a single on-dimensional list.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msidatabaseopenview.asp">MsiDatabaseOpenView</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewexecute.asp">MsiViewExecute</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewfetch.asp">MsiViewFetch</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.ExecuteStringQuery(System.String,Microsoft.Deployment.WindowsInstaller.Record)">
+            <summary>
+            Executes the specified SQL SELECT query and returns all results as strings.
+            </summary>
+            <param name="sql">SQL SELECT query string</param>
+            <param name="record">Optional Record object containing the values that replace
+            the parameter tokens (?) in the SQL query.</param>
+            <returns>All results combined into an array</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.BadQuerySyntaxException">the SQL syntax is invalid</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the View could not be executed</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Database handle is invalid</exception>
+            <remarks><p>
+            Multiple rows columns will be collapsed into a single on-dimensional list.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msidatabaseopenview.asp">MsiDatabaseOpenView</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewexecute.asp">MsiViewExecute</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewfetch.asp">MsiViewFetch</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.ExecuteScalar(System.String,System.Object[])">
+            <summary>
+            Executes the specified SQL SELECT query and returns a single result.
+            </summary>
+            <param name="sqlFormat">SQL query string, which may contain format items</param>
+            <param name="args">Zero or more objects to format</param>
+            <returns>First field of the first result</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.BadQuerySyntaxException">the SQL syntax is invalid</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the View could not be executed
+            or the query returned 0 results</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Database handle is invalid</exception>
+            <remarks><p>
+            The <paramref name="sqlFormat"/> parameter is formatted using
+            <see cref="M:System.String.Format(System.String,System.Object[])"/>.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msidatabaseopenview.asp">MsiDatabaseOpenView</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewexecute.asp">MsiViewExecute</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewfetch.asp">MsiViewFetch</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.ExecuteScalar(System.String,Microsoft.Deployment.WindowsInstaller.Record)">
+            <summary>
+            Executes the specified SQL SELECT query and returns a single result.
+            </summary>
+            <param name="sql">SQL SELECT query string</param>
+            <param name="record">Optional Record object containing the values that replace
+            the parameter tokens (?) in the SQL query.</param>
+            <returns>First field of the first result</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.BadQuerySyntaxException">the SQL syntax is invalid</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the View could not be executed
+            or the query returned 0 results</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Database handle is invalid</exception>
+            <remarks><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msidatabaseopenview.asp">MsiDatabaseOpenView</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewexecute.asp">MsiViewExecute</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewfetch.asp">MsiViewFetch</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.GenerateTransform(Microsoft.Deployment.WindowsInstaller.Database,System.String)">
+            <summary>
+            Creates a transform that, when applied to the object database, results in the reference database.
+            </summary>
+            <param name="referenceDatabase">Database that does not include the changes</param>
+            <param name="transformFile">Name of the generated transform file, or null to only
+            check whether or not the two database are identical</param>
+            <returns>true if a transform is generated, or false if a transform is not generated
+            because there are no differences between the two databases.</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the transform could not be generated</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">a Database handle is invalid</exception>
+            <remarks><p>
+            A transform can add non-primary key columns to the end of a table. A transform cannot
+            be created that adds primary key columns to a table. A transform cannot be created that
+            changes the order, names, or definitions of columns.
+            </p><p>
+            If the transform is to be applied during an installation you must use the
+            <see cref="M:Microsoft.Deployment.WindowsInstaller.Database.CreateTransformSummaryInfo(Microsoft.Deployment.WindowsInstaller.Database,System.String,Microsoft.Deployment.WindowsInstaller.TransformErrors,Microsoft.Deployment.WindowsInstaller.TransformValidations)"/> method to populate the
+            summary information stream.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msidatabasegeneratetransform.asp">MsiDatabaseGenerateTransform</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.CreateTransformSummaryInfo(Microsoft.Deployment.WindowsInstaller.Database,System.String,Microsoft.Deployment.WindowsInstaller.TransformErrors,Microsoft.Deployment.WindowsInstaller.TransformValidations)">
+            <summary>
+            Creates and populates the summary information stream of an existing transform file, and
+            fills in the properties with the base and reference ProductCode and ProductVersion.
+            </summary>
+            <param name="referenceDatabase">Database that does not include the changes</param>
+            <param name="transformFile">Name of the generated transform file</param>
+            <param name="errors">Error conditions that should be suppressed
+            when the transform is applied</param>
+            <param name="validations">Defines which properties should be validated
+            to verify that this transform can be applied to a database.</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the transform summary info could not be
+            generated</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">a Database handle is invalid</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msicreatetransformsummaryinfo.asp">MsiCreateTransformSummaryInfo</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.ViewTransform(System.String)">
+            <summary>
+            Apply a transform to the database, recording the changes in the "_TransformView" table.
+            </summary>
+            <param name="transformFile">Path to the transform file</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the transform could not be applied</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Database handle is invalid</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msidatabaseapplytransform.asp">MsiDatabaseApplyTransform</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.ApplyTransform(System.String)">
+            <summary>
+            Apply a transform to the database, suppressing any error conditions
+            specified by the transform's summary information.
+            </summary>
+            <param name="transformFile">Path to the transform file</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the transform could not be applied</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Database handle is invalid</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msidatabaseapplytransform.asp">MsiDatabaseApplyTransform</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.ApplyTransform(System.String,Microsoft.Deployment.WindowsInstaller.TransformErrors)">
+            <summary>
+            Apply a transform to the database, specifying error conditions to suppress.
+            </summary>
+            <param name="transformFile">Path to the transform file</param>
+            <param name="errorConditionsToSuppress">Error conditions that are to be suppressed</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the transform could not be applied</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Database handle is invalid</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msidatabaseapplytransform.asp">MsiDatabaseApplyTransform</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.IsTransformValid(System.String)">
+            <summary>
+            Checks whether a transform is valid for this Database, according to its validation data and flags.
+            </summary>
+            <param name="transformFile">Path to the transform file</param>
+            <returns>true if the transform can be validly applied to this Database; false otherwise</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the transform could not be applied</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Database handle is invalid</exception>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Database.IsTransformValid(Microsoft.Deployment.WindowsInstaller.SummaryInfo)">
+            <summary>
+            Checks whether a transform is valid for this Database, according to its SummaryInfo data.
+            </summary>
+            <param name="transformSummaryInfo">SummaryInfo data of a transform file</param>
+            <returns>true if the transform can be validly applied to this Database; false otherwise</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">error processing summary info</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Database or SummaryInfo handle is invalid</exception>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Database.FilePath">
+            <summary>
+            Gets the file path the Database was originally opened from, or null if not known.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Database.OpenMode">
+            <summary>
+            Gets the open mode for the database.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Database.IsReadOnly">
+            <summary>
+            Gets a boolean value indicating whether this database was opened in read-only mode.
+            </summary>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigetdatabasestate.asp">MsiGetDatabaseState</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Database.Tables">
+            <summary>
+            Gets the collection of tables in the Database.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Database.CodePage">
+            <summary>
+            Gets or sets the code page of the Database.
+            </summary>
+            <exception cref="T:System.IO.IOException">error exporting/importing the codepage data</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Database handle is invalid</exception>
+            <remarks><p>
+            Getting or setting the code page is a slow operation because it involves an export or import
+            of the codepage data to/from a temporary file.
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Database.SummaryInfo">
+            <summary>
+            Gets the SummaryInfo object for this database that can be used to examine and modify properties
+            to the summary information stream.
+            </summary>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Database handle is invalid</exception>
+            <remarks><p>
+            The object returned from this property does not need to be explicitly persisted or closed.
+            Any modifications will be automatically saved when the database is committed.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigetsummaryinformation.asp">MsiGetSummaryInformation</a>
+            </p></remarks>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.EmbeddedUIProxy">
+            <summary>
+            Managed-code portion of the embedded UI proxy.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.EmbeddedUIProxy.Initialize(System.Int32,System.String,System.Int32)">
+            <summary>
+            Initializes managed embedded UI by loading the UI class and invoking its Initialize method.
+            </summary>
+            <param name="sessionHandle">Integer handle to the installer session.</param>
+            <param name="uiClass">Name of the class that implements the embedded UI. This must
+            be of the form: &quot;AssemblyName!Namespace.Class&quot;</param>
+            <param name="internalUILevel">On entry, contains the current UI level for the installation. After this
+            method returns, the installer resets the UI level to the returned value of this parameter.</param>
+            <returns>0 if the embedded UI was successfully loaded and initialized,
+            ERROR_INSTALL_USEREXIT if the user canceled the installation during initialization,
+            or ERROR_INSTALL_FAILURE if the embedded UI could not be initialized.</returns>
+            <remarks>
+            Due to interop limitations, the successful resulting UILevel is actually returned
+            as the high-word of the return value instead of via a ref parameter.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.EmbeddedUIProxy.ProcessMessage(System.Int32,System.Int32)">
+            <summary>
+            Passes a progress message to the UI class.
+            </summary>
+            <param name="messageType">Installer message type and message box options.</param>
+            <param name="recordHandle">Handle to a record containing message data.</param>
+            <returns>Return value returned by the UI class.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.EmbeddedUIProxy.Shutdown">
+            <summary>
+            Passes a shutdown message to the UI class.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.EmbeddedUIProxy.InstantiateUI(Microsoft.Deployment.WindowsInstaller.Session,System.String)">
+            <summary>
+            Instantiates a UI class from a given assembly and class name.
+            </summary>
+            <param name="session">Installer session, for logging.</param>
+            <param name="uiClass">Name of the class that implements the embedded UI. This must
+            be of the form: &quot;AssemblyName!Namespace.Class&quot;</param>
+            <returns>Interface on the UI class for handling UI messages.</returns>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.ActionResult">
+            <summary>
+            Specifies a return status value for custom actions.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ActionResult.Success">
+            <summary>Action completed successfully.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ActionResult.SkipRemainingActions">
+            <summary>Skip remaining actions, not an error.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ActionResult.UserExit">
+            <summary>User terminated prematurely.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ActionResult.Failure">
+            <summary>Unrecoverable error or unhandled exception occurred.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ActionResult.NotExecuted">
+            <summary>Action not executed.</summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.DatabaseOpenMode">
+            <summary>
+            Specifies the open mode for a <see cref="T:Microsoft.Deployment.WindowsInstaller.Database"/>.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.DatabaseOpenMode.ReadOnly">
+            <summary>Open a database read-only, no persistent changes.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.DatabaseOpenMode.Transact">
+            <summary>Open a database read/write in transaction mode.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.DatabaseOpenMode.Direct">
+            <summary>Open a database direct read/write without transaction.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.DatabaseOpenMode.Create">
+            <summary>Create a new database, transact mode read/write.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.DatabaseOpenMode.CreateDirect">
+            <summary>Create a new database, direct mode read/write.</summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.InstallLogModes">
+            <summary>
+            Log modes available for <see cref="M:Microsoft.Deployment.WindowsInstaller.Installer.EnableLog(Microsoft.Deployment.WindowsInstaller.InstallLogModes,System.String)"/>
+            and <see cref="M:Microsoft.Deployment.WindowsInstaller.Installer.SetExternalUI(Microsoft.Deployment.WindowsInstaller.ExternalUIHandler,Microsoft.Deployment.WindowsInstaller.InstallLogModes)"/>.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallLogModes.None">
+            <summary>Disable logging.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallLogModes.FatalExit">
+            <summary>Log out of memory or fatal exit information.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallLogModes.Error">
+            <summary>Log error messages.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallLogModes.Warning">
+            <summary>Log warning messages.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallLogModes.User">
+            <summary>Log user requests.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallLogModes.Info">
+            <summary>Log status messages that are not displayed.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallLogModes.ResolveSource">
+            <summary>Log request to determine a valid source location.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallLogModes.OutOfDiskSpace">
+            <summary>Log insufficient disk space error.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallLogModes.ActionStart">
+            <summary>Log the start of installation actions.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallLogModes.ActionData">
+            <summary>Log the data record for installation actions.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallLogModes.CommonData">
+            <summary>Log parameters for user-interface initialization.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallLogModes.PropertyDump">
+            <summary>Log the property values at termination.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallLogModes.Verbose">
+            <summary>
+            Sends large amounts of information to log file not generally useful to users.
+            May be used for support.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallLogModes.ExtraDebug">
+            <summary>
+            Log extra debugging information.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallLogModes.LogOnlyOnError">
+            <summary>
+            Log only on error.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallLogModes.Progress">
+            <summary>
+            Log progress bar information. This message includes information on units so far and total number
+            of units. See <see cref="M:Microsoft.Deployment.WindowsInstaller.Session.Message(Microsoft.Deployment.WindowsInstaller.InstallMessage,Microsoft.Deployment.WindowsInstaller.Record)"/> for an explanation of the message format. This message
+            is only sent to an external user interface and is not logged.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallLogModes.Initialize">
+            <summary>
+            If this is not a quiet installation, then the basic UI has been initialized. If this is a full
+            UI installation, the Full UI is not yet initialized. This message is only sent to an external
+            user interface and is not logged.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallLogModes.Terminate">
+            <summary>
+            If a full UI is being used, the full UI has ended. If this is not a quiet installation, the basic
+            UI has not yet ended. This message is only sent to an external user interface and is not logged.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallLogModes.ShowDialog">
+            <summary>
+            Sent prior to display of the Full UI dialog. This message is only sent to an external user
+            interface and is not logged.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallLogModes.FilesInUse">
+            <summary>
+            List of files in use that need to be replaced.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallLogModes.RMFilesInUse">
+            <summary>
+            [MSI 4.0] List of apps that the user can request Restart Manager to shut down and restart.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.InstallMessage">
+            <summary>
+            Type of message to be processed by <see cref="M:Microsoft.Deployment.WindowsInstaller.Session.Message(Microsoft.Deployment.WindowsInstaller.InstallMessage,Microsoft.Deployment.WindowsInstaller.Record)"/>,
+            <see cref="T:Microsoft.Deployment.WindowsInstaller.ExternalUIHandler"/>, or <see cref="T:Microsoft.Deployment.WindowsInstaller.ExternalUIRecordHandler"/>.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallMessage.FatalExit">
+            <summary>Premature termination, possibly fatal OOM.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallMessage.Error">
+            <summary>Formatted error message.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallMessage.Warning">
+            <summary>Formatted warning message.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallMessage.User">
+            <summary>User request message.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallMessage.Info">
+            <summary>Informative message for log.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallMessage.FilesInUse">
+            <summary>List of files in use that need to be replaced.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallMessage.ResolveSource">
+            <summary>Request to determine a valid source location.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallMessage.OutOfDiskSpace">
+            <summary>Insufficient disk space message.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallMessage.ActionStart">
+            <summary>Start of action: action name &amp; description.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallMessage.ActionData">
+            <summary>Formatted data associated with individual action item.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallMessage.Progress">
+            <summary>Progress gauge info: units so far, total.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallMessage.CommonData">
+            <summary>Product info for dialog: language Id, dialog caption.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallMessage.Initialize">
+            <summary>Sent prior to UI initialization, no string data.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallMessage.Terminate">
+            <summary>Sent after UI termination, no string data.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallMessage.ShowDialog">
+            <summary>Sent prior to display or authored dialog or wizard.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallMessage.RMFilesInUse">
+            <summary>[MSI 4.0] List of apps that the user can request Restart Manager to shut down and restart.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallMessage.InstallStart">
+            <summary>[MSI 4.5] Sent prior to install of a product.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallMessage.InstallEnd">
+            <summary>[MSI 4.5] Sent after install of a product.</summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.InstallMode">
+            <summary>
+            Specifies the install mode for <see cref="M:Microsoft.Deployment.WindowsInstaller.Installer.ProvideComponent(System.String,System.String,System.String,Microsoft.Deployment.WindowsInstaller.InstallMode)"/> or <see cref="M:Microsoft.Deployment.WindowsInstaller.Installer.ProvideQualifiedComponent(System.String,System.String,Microsoft.Deployment.WindowsInstaller.InstallMode,System.String)"/>.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallMode.NoSourceResolution">
+            <summary>Provide the component only if the feature's installation state is <see cref="F:Microsoft.Deployment.WindowsInstaller.InstallState.Local"/>.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallMode.NoDetection">
+            <summary>Only check that the component is registered, without verifying that the key file of the component exists.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallMode.Existing">
+            <summary>Provide the component only if the feature exists.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallMode.Default">
+            <summary>Provide the component and perform any installation necessary to provide the component.</summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.InstallRunMode">
+            <summary>
+            Specifies the run mode for <see cref="M:Microsoft.Deployment.WindowsInstaller.Session.GetMode(Microsoft.Deployment.WindowsInstaller.InstallRunMode)"/>.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallRunMode.Admin">
+            <summary>The administrative mode is installing, or the product is installing.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallRunMode.Advertise">
+            <summary>The advertisements are installing or the product is installing or updating.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallRunMode.Maintenance">
+            <summary>An existing installation is being modified or there is a new installation.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallRunMode.RollbackEnabled">
+            <summary>Rollback is enabled.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallRunMode.LogEnabled">
+            <summary>The log file is active. It was enabled prior to the installation session.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallRunMode.Operations">
+            <summary>Execute operations are spooling or they are in the determination phase.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallRunMode.RebootAtEnd">
+            <summary>A reboot is necessary after a successful installation (settable).</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallRunMode.RebootNow">
+            <summary>A reboot is necessary to continue the installation (settable).</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallRunMode.Cabinet">
+            <summary>Files from cabinets and Media table files are installing.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallRunMode.SourceShortNames">
+            <summary>The source LongFileNames is suppressed through the PID_MSISOURCE summary property.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallRunMode.TargetShortNames">
+            <summary>The target LongFileNames is suppressed through the SHORTFILENAMES property.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallRunMode.Windows9x">
+            <summary>The operating system is Windows 95, Windows 98, or Windows ME.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallRunMode.ZawEnabled">
+            <summary>The operating system supports demand installation.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallRunMode.Scheduled">
+            <summary>A custom action called from install script execution.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallRunMode.Rollback">
+            <summary>A custom action called from rollback execution script.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallRunMode.Commit">
+            <summary>A custom action called from commit execution script.</summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.InstallState">
+            <summary>
+            Installed state of a Component or Feature.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallState.NotUsed">
+            <summary>The component is disabled.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallState.BadConfig">
+            <summary>The installation configuration data is corrupt.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallState.Incomplete">
+            <summary>The installation is suspended or in progress.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallState.SourceAbsent">
+            <summary>Component is set to run from source, but source is unavailable.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallState.MoreData">
+            <summary>The buffer overflow is returned.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallState.InvalidArgument">
+            <summary>An invalid parameter was passed to the function.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallState.Unknown">
+            <summary>An unrecognized product or feature name was passed to the function.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallState.Broken">
+            <summary>The component is broken.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallState.Advertised">
+            <summary>The feature is advertised.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallState.Removed">
+            <summary>The component is being removed. In action state and not settable.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallState.Absent">
+            <summary>The component is not installed, or action state is absent but clients remain.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallState.Local">
+            <summary>The component is installed on the local drive.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallState.Source">
+            <summary>The component will run from the source, CD, or network.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallState.Default">
+            <summary>The component will be installed in the default location: local or source.</summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.InstallType">
+            <summary>
+            Specifies the type of installation for <see cref="M:Microsoft.Deployment.WindowsInstaller.Installer.ApplyPatch(System.String,System.String,Microsoft.Deployment.WindowsInstaller.InstallType,System.String)"/>.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallType.Default">
+            <summary>Searches system for products to patch.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallType.NetworkImage">
+            <summary>Indicates a administrative installation.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallType.SingleInstance">
+            <summary>Indicates a particular instance.</summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.InstallUIOptions">
+            <summary>
+            Level of the installation user interface, specified with
+            <see cref="M:Microsoft.Deployment.WindowsInstaller.Installer.SetInternalUI(Microsoft.Deployment.WindowsInstaller.InstallUIOptions)"/>.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallUIOptions.NoChange">
+            <summary>Does not change UI level.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallUIOptions.Default">
+            <summary>Uses Default UI level.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallUIOptions.Silent">
+            <summary>Silent installation.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallUIOptions.Basic">
+            <summary>Simple progress and error handling.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallUIOptions.Reduced">
+            <summary>Authored UI, wizard dialogs suppressed.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallUIOptions.Full">
+            <summary>Authored UI with wizards, progress, and errors.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallUIOptions.HideCancel">
+            <summary>
+            When combined with the <see cref="F:Microsoft.Deployment.WindowsInstaller.InstallUIOptions.Basic"/> value, the installer does not display
+            the cancel button in the progress dialog.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallUIOptions.ProgressOnly">
+            <summary>
+            When combined with the <see cref="F:Microsoft.Deployment.WindowsInstaller.InstallUIOptions.Basic"/> value, the installer displays progress
+            dialog boxes but does not display any modal dialog boxes or error dialog boxes.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallUIOptions.EndDialog">
+            <summary>
+            When combined with another value, the installer displays a modal dialog
+            box at the end of a successful installation or if there has been an error.
+            No dialog box is displayed if the user cancels.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.InstallUIOptions.SourceResolutionOnly">
+            <summary>
+            Forces display of the source resolution dialog even if the UI is otherwise silent.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.MessageResult">
+            <summary>
+            Specifies a return status value for message handlers.  These values are returned by
+            <see cref="M:Microsoft.Deployment.WindowsInstaller.Session.Message(Microsoft.Deployment.WindowsInstaller.InstallMessage,Microsoft.Deployment.WindowsInstaller.Record)"/>, <see cref="T:Microsoft.Deployment.WindowsInstaller.ExternalUIHandler"/>, and <see cref="M:Microsoft.Deployment.WindowsInstaller.IEmbeddedUI.ProcessMessage(Microsoft.Deployment.WindowsInstaller.InstallMessage,Microsoft.Deployment.WindowsInstaller.Record,Microsoft.Deployment.WindowsInstaller.MessageButtons,Microsoft.Deployment.WindowsInstaller.MessageIcon,Microsoft.Deployment.WindowsInstaller.MessageDefaultButton)"/>.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.MessageResult.Error">
+            <summary>An error was found in the message handler.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.MessageResult.None">
+            <summary>No action was taken.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.MessageResult.OK">
+            <summary>IDOK</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.MessageResult.Cancel">
+            <summary>IDCANCEL</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.MessageResult.Abort">
+            <summary>IDABORT</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.MessageResult.Retry">
+            <summary>IDRETRY</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.MessageResult.Ignore">
+            <summary>IDIGNORE</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.MessageResult.Yes">
+            <summary>IDYES</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.MessageResult.No">
+            <summary>IDNO</summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.MessageButtons">
+            <summary>
+            Specifies constants defining which buttons to display for a message. This can be cast to
+            the MessageBoxButtons enum in System.Windows.Forms and System.Windows.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.MessageButtons.OK">
+            <summary>
+            The message contains an OK button.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.MessageButtons.OKCancel">
+            <summary>
+            The message contains OK and Cancel buttons.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.MessageButtons.AbortRetryIgnore">
+            <summary>
+            The message contains Abort, Retry, and Ignore buttons.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.MessageButtons.YesNoCancel">
+            <summary>
+            The message contains Yes, No, and Cancel buttons.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.MessageButtons.YesNo">
+            <summary>
+            The message contains Yes and No buttons.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.MessageButtons.RetryCancel">
+            <summary>
+            The message contains Retry and Cancel buttons.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.MessageIcon">
+            <summary>
+            Specifies constants defining which information to display. This can be cast to
+            the MessageBoxIcon enum in System.Windows.Forms and System.Windows.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.MessageIcon.None">
+            <summary>
+            The message contain no symbols.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.MessageIcon.Error">
+            <summary>
+            The message contains a symbol consisting of white X in a circle with a red background.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.MessageIcon.Hand">
+            <summary>
+            The message contains a symbol consisting of a white X in a circle with a red background.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.MessageIcon.Stop">
+            <summary>
+            The message contains a symbol consisting of white X in a circle with a red background.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.MessageIcon.Question">
+            <summary>
+            The message contains a symbol consisting of a question mark in a circle.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.MessageIcon.Exclamation">
+            <summary>
+            The message contains a symbol consisting of an exclamation point in a triangle with a yellow background.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.MessageIcon.Warning">
+            <summary>
+            The message contains a symbol consisting of an exclamation point in a triangle with a yellow background.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.MessageIcon.Information">
+            <summary>
+            The message contains a symbol consisting of a lowercase letter i in a circle.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.MessageIcon.Asterisk">
+            <summary>
+            The message contains a symbol consisting of a lowercase letter i in a circle.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.MessageDefaultButton">
+            <summary>
+            Specifies constants defining the default button on a message. This can be cast to
+            the MessageBoxDefaultButton enum in System.Windows.Forms and System.Windows.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.MessageDefaultButton.Button1">
+            <summary>
+            The first button on the message is the default button.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.MessageDefaultButton.Button2">
+            <summary>
+            The second button on the message is the default button.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.MessageDefaultButton.Button3">
+            <summary>
+            The third button on the message is the default button.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.PatchStates">
+            <summary>
+            Specifies the different patch states for <see cref="M:Microsoft.Deployment.WindowsInstaller.PatchInstallation.GetPatches(System.String,System.String,System.String,Microsoft.Deployment.WindowsInstaller.UserContexts,Microsoft.Deployment.WindowsInstaller.PatchStates)"/>.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.PatchStates.None">
+            <summary>Invalid value.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.PatchStates.Applied">
+            <summary>Patches applied to a product.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.PatchStates.Superseded">
+            <summary>Patches that are superseded by other patches.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.PatchStates.Obsoleted">
+            <summary>Patches that are obsolesced by other patches.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.PatchStates.Registered">
+            <summary>Patches that are registered to a product but not applied.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.PatchStates.All">
+            <summary>All valid patch states.</summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.ReinstallModes">
+            <summary>
+            Specifies the reinstall mode for <see cref="M:Microsoft.Deployment.WindowsInstaller.Installer.ReinstallFeature(System.String,System.String,Microsoft.Deployment.WindowsInstaller.ReinstallModes)"/> or <see cref="M:Microsoft.Deployment.WindowsInstaller.Installer.ReinstallProduct(System.String,Microsoft.Deployment.WindowsInstaller.ReinstallModes)"/>.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ReinstallModes.FileMissing">
+            <summary>Reinstall only if file is missing.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ReinstallModes.FileOlderVersion">
+            <summary>Reinstall if file is missing, or older version.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ReinstallModes.FileEqualVersion">
+            <summary>Reinstall if file is missing, or equal or older version.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ReinstallModes.FileExact">
+            <summary>Reinstall if file is missing, or not exact version.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ReinstallModes.FileVerify">
+            <summary>Checksum executables, reinstall if missing or corrupt.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ReinstallModes.FileReplace">
+            <summary>Reinstall all files, regardless of version.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ReinstallModes.MachineData">
+            <summary>Insure required machine reg entries.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ReinstallModes.UserData">
+            <summary>Insure required user reg entries.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ReinstallModes.Shortcut">
+            <summary>Validate shortcuts items.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ReinstallModes.Package">
+            <summary>Use re-cache source install package.</summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.TransactionAttributes">
+            <summary>
+            Attributes for <see cref="T:Microsoft.Deployment.WindowsInstaller.Transaction"/> methods.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.TransactionAttributes.None">
+            <summary>No attributes.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.TransactionAttributes.ChainEmbeddedUI">
+            <summary>Request that the Windows Installer not shutdown the embedded UI until the transaction is complete.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.TransactionAttributes.JoinExistingEmbeddedUI">
+            <summary>Request that the Windows Installer transfer the embedded UI from the original installation.</summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.TransformErrors">
+            <summary>
+            Transform error conditions available for <see cref="M:Microsoft.Deployment.WindowsInstaller.Database.CreateTransformSummaryInfo(Microsoft.Deployment.WindowsInstaller.Database,System.String,Microsoft.Deployment.WindowsInstaller.TransformErrors,Microsoft.Deployment.WindowsInstaller.TransformValidations)"/> or
+            <see cref="M:Microsoft.Deployment.WindowsInstaller.Database.ApplyTransform(System.String,Microsoft.Deployment.WindowsInstaller.TransformErrors)"/>.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.TransformErrors.None">
+            <summary>No error conditions.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.TransformErrors.AddExistingRow">
+            <summary>Adding a row that already exists.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.TransformErrors.DelMissingRow">
+            <summary>Deleting a row that doesn't exist.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.TransformErrors.AddExistingTable">
+            <summary>Adding a table that already exists.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.TransformErrors.DelMissingTable">
+            <summary>Deleting a table that doesn't exist.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.TransformErrors.UpdateMissingRow">
+            <summary>Updating a row that doesn't exist.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.TransformErrors.ChangeCodePage">
+            <summary>Transform and database code pages do not match and neither code page is neutral.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.TransformErrors.ViewTransform">
+            <summary>Create the temporary _TransformView table when applying the transform.</summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.TransformValidations">
+            <summary>
+            Transform validation flags available for <see cref="M:Microsoft.Deployment.WindowsInstaller.Database.CreateTransformSummaryInfo(Microsoft.Deployment.WindowsInstaller.Database,System.String,Microsoft.Deployment.WindowsInstaller.TransformErrors,Microsoft.Deployment.WindowsInstaller.TransformValidations)"/>.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.TransformValidations.None">
+            <summary>Validate no properties.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.TransformValidations.Language">
+            <summary>Default language must match base database.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.TransformValidations.Product">
+            <summary>Product must match base database.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.TransformValidations.MajorVersion">
+            <summary>Check major version only.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.TransformValidations.MinorVersion">
+            <summary>Check major and minor versions only.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.TransformValidations.UpdateVersion">
+            <summary>Check major, minor, and update versions.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.TransformValidations.NewLessBaseVersion">
+            <summary>Installed version &lt; base version.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.TransformValidations.NewLessEqualBaseVersion">
+            <summary>Installed version &lt;= base version.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.TransformValidations.NewEqualBaseVersion">
+            <summary>Installed version = base version.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.TransformValidations.NewGreaterEqualBaseVersion">
+            <summary>Installed version &gt;= base version.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.TransformValidations.NewGreaterBaseVersion">
+            <summary>Installed version &gt; base version.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.TransformValidations.UpgradeCode">
+            <summary>UpgradeCode must match base database.</summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.UserContexts">
+            <summary>
+            Specifies the installation context for <see cref="T:Microsoft.Deployment.WindowsInstaller.ProductInstallation"/>s,
+            <see cref="T:Microsoft.Deployment.WindowsInstaller.PatchInstallation"/>es, and
+            <see cref="M:Microsoft.Deployment.WindowsInstaller.Installer.DetermineApplicablePatches(System.String,System.String[],Microsoft.Deployment.WindowsInstaller.InapplicablePatchHandler,System.String,Microsoft.Deployment.WindowsInstaller.UserContexts)"/>
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.UserContexts.None">
+            <summary>Not installed.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.UserContexts.UserManaged">
+            <summary>User managed install context.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.UserContexts.UserUnmanaged">
+            <summary>User non-managed context.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.UserContexts.Machine">
+            <summary>Per-machine context.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.UserContexts.All">
+            <summary>All contexts, or all valid values.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.UserContexts.AllUserManaged">
+            <summary>All user-managed contexts.</summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.ValidationError">
+            <summary>
+            Defines the type of error encountered by the <see cref="M:Microsoft.Deployment.WindowsInstaller.View.Validate(Microsoft.Deployment.WindowsInstaller.Record)"/>, <see cref="M:Microsoft.Deployment.WindowsInstaller.View.ValidateNew(Microsoft.Deployment.WindowsInstaller.Record)"/>,
+            or <see cref="M:Microsoft.Deployment.WindowsInstaller.View.ValidateFields(Microsoft.Deployment.WindowsInstaller.Record)"/> methods of the <see cref="T:Microsoft.Deployment.WindowsInstaller.View"/> class.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ValidationError.None">
+            <summary>No error.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ValidationError.DuplicateKey">
+            <summary>The new record duplicates primary keys of the existing record in a table.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ValidationError.Required">
+            <summary>There are no null values allowed, or the column is about to be deleted but is referenced by another row.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ValidationError.BadLink">
+            <summary>The corresponding record in a foreign table was not found.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ValidationError.Overflow">
+            <summary>The data is greater than the maximum value allowed.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ValidationError.Underflow">
+            <summary>The data is less than the minimum value allowed.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ValidationError.NotInSet">
+            <summary>The data is not a member of the values permitted in the set.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ValidationError.BadVersion">
+            <summary>An invalid version string was supplied.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ValidationError.BadCase">
+            <summary>The case was invalid. The case must be all uppercase or all lowercase.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ValidationError.BadGuid">
+            <summary>An invalid GUID was supplied.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ValidationError.BadWildcard">
+            <summary>An invalid wildcard file name was supplied, or the use of wildcards was invalid.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ValidationError.BadIdentifier">
+            <summary>An invalid identifier was supplied.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ValidationError.BadLanguage">
+            <summary>Invalid language IDs were supplied.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ValidationError.BadFileName">
+            <summary>An invalid file name was supplied.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ValidationError.BadPath">
+            <summary>An invalid path was supplied.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ValidationError.BadCondition">
+            <summary>An invalid conditional statement was supplied.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ValidationError.BadFormatted">
+            <summary>An invalid format string was supplied.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ValidationError.BadTemplate">
+            <summary>An invalid template string was supplied.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ValidationError.BadDefaultDir">
+            <summary>An invalid string was supplied in the DefaultDir column of the Directory table.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ValidationError.BadRegPath">
+            <summary>An invalid registry path string was supplied.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ValidationError.BadCustomSource">
+            <summary>An invalid string was supplied in the CustomSource column of the CustomAction table.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ValidationError.BadProperty">
+            <summary>An invalid property string was supplied.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ValidationError.MissingData">
+            <summary>The _Validation table is missing a reference to a column.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ValidationError.BadCategory">
+            <summary>The category column of the _Validation table for the column is invalid.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ValidationError.BadKeyTable">
+            <summary>The table in the Keytable column of the _Validation table was not found or loaded.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ValidationError.BadMaxMinValues">
+            <summary>The value in the MaxValue column of the _Validation table is less than the value in the MinValue column.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ValidationError.BadCabinet">
+            <summary>An invalid cabinet name was supplied.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ValidationError.BadShortcut">
+            <summary>An invalid shortcut target name was supplied.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ValidationError.StringOverflow">
+            <summary>The string is too long for the length specified by the column definition.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ValidationError.BadLocalizeAttrib">
+            <summary>An invalid localization attribute was supplied. (Primary keys cannot be localized.)</summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.ViewModifyMode">
+            <summary>
+            Specifies the modify mode for <see cref="M:Microsoft.Deployment.WindowsInstaller.View.Modify(Microsoft.Deployment.WindowsInstaller.ViewModifyMode,Microsoft.Deployment.WindowsInstaller.Record)"/>.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ViewModifyMode.Seek">
+            <summary>
+            Refreshes the information in the supplied record without changing the position
+            in the result set and without affecting subsequent fetch operations.
+            </summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ViewModifyMode.Refresh">
+            <summary>Refreshes the data in a Record.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ViewModifyMode.Insert">
+            <summary>Inserts a Record into the view.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ViewModifyMode.Update">
+            <summary>Updates the View with new data from the Record.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ViewModifyMode.Assign">
+            <summary>Updates or inserts a Record into the View.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ViewModifyMode.Replace">
+            <summary>Updates or deletes and inserts a Record into the View.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ViewModifyMode.Merge">
+            <summary>Inserts or validates a record.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ViewModifyMode.Delete">
+            <summary>Deletes a Record from the View.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ViewModifyMode.InsertTemporary">
+            <summary>Inserts a Record into the View.  The inserted data is not persistent.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ViewModifyMode.Validate">
+            <summary>Validates a record.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ViewModifyMode.ValidateNew">
+            <summary>Validates a new record.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ViewModifyMode.ValidateField">
+            <summary>Validates fields of a fetched or new record. Can validate one or more fields of an incomplete record.</summary>
+        </member>
+        <member name="F:Microsoft.Deployment.WindowsInstaller.ViewModifyMode.ValidateDelete">
+            <summary>Validates a record that will be deleted later.</summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.InstallerException">
+            <summary>
+            Base class for Windows Installer exceptions.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.InstallerException.#ctor(System.String,System.Exception)">
+            <summary>
+            Creates a new InstallerException with a specified error message and a reference to the
+            inner exception that is the cause of this exception.
+            </summary>
+            <param name="msg">The message that describes the error.</param>
+            <param name="innerException">The exception that is the cause of the current exception. If the
+            innerException parameter is not a null reference (Nothing in Visual Basic), the current exception
+            is raised in a catch block that handles the inner exception.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.InstallerException.#ctor(System.String)">
+            <summary>
+            Creates a new InstallerException with a specified error message.
+            </summary>
+            <param name="msg">The message that describes the error.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.InstallerException.#ctor">
+            <summary>
+            Creates a new InstallerException.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.InstallerException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Initializes a new instance of the InstallerException class with serialized data.
+            </summary>
+            <param name="info">The SerializationInfo that holds the serialized object data about the exception being thrown.</param>
+            <param name="context">The StreamingContext that contains contextual information about the source or destination.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.InstallerException.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Sets the SerializationInfo with information about the exception.
+            </summary>
+            <param name="info">The SerializationInfo that holds the serialized object data about the exception being thrown.</param>
+            <param name="context">The StreamingContext that contains contextual information about the source or destination.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.InstallerException.GetErrorRecord">
+            <summary>
+            Gets extended information about the error, or null if no further information
+            is available.
+            </summary>
+            <returns>A Record object. Field 1 of the Record contains the installer
+            message code. Other fields contain data specific to the particular error.</returns>
+            <remarks><p>
+            If the record is passed to <see cref="M:Microsoft.Deployment.WindowsInstaller.Session.Message(Microsoft.Deployment.WindowsInstaller.InstallMessage,Microsoft.Deployment.WindowsInstaller.Record)"/>, it is formatted
+            by looking up the string in the current database. If there is no installation
+            session, the formatted error message may be obtained by a query on the Error table using
+            the error code, followed by a call to <see cref="M:Microsoft.Deployment.WindowsInstaller.Record.ToString"/>.
+            Alternatively, the standard MSI message can by retrieved by calling the
+            <see cref="M:Microsoft.Deployment.WindowsInstaller.Installer.GetErrorMessage(Microsoft.Deployment.WindowsInstaller.Record,System.Globalization.CultureInfo)"/> method.
+            </p><p>
+            The following methods and properties may report extended error data:
+            <list type="bullet">
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.Database"/> (constructor)</item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.Database"/>.<see cref="M:Microsoft.Deployment.WindowsInstaller.Database.ApplyTransform(System.String,Microsoft.Deployment.WindowsInstaller.TransformErrors)"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.Database"/>.<see cref="M:Microsoft.Deployment.WindowsInstaller.Database.Commit"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.Database"/>.<see cref="M:Microsoft.Deployment.WindowsInstaller.Database.Execute(System.String,System.Object[])"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.Database"/>.<see cref="M:Microsoft.Deployment.WindowsInstaller.Database.ExecuteQuery(System.String,System.Object[])"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.Database"/>.<see cref="M:Microsoft.Deployment.WindowsInstaller.Database.ExecuteIntegerQuery(System.String,System.Object[])"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.Database"/>.<see cref="M:Microsoft.Deployment.WindowsInstaller.Database.ExecuteStringQuery(System.String,System.Object[])"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.Database"/>.<see cref="M:Microsoft.Deployment.WindowsInstaller.Database.Export(System.String,System.String)"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.Database"/>.<see cref="M:Microsoft.Deployment.WindowsInstaller.Database.ExportAll(System.String)"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.Database"/>.<see cref="M:Microsoft.Deployment.WindowsInstaller.Database.GenerateTransform(Microsoft.Deployment.WindowsInstaller.Database,System.String)"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.Database"/>.<see cref="M:Microsoft.Deployment.WindowsInstaller.Database.Import(System.String)"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.Database"/>.<see cref="M:Microsoft.Deployment.WindowsInstaller.Database.ImportAll(System.String)"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.Database"/>.<see cref="M:Microsoft.Deployment.WindowsInstaller.Database.Merge(Microsoft.Deployment.WindowsInstaller.Database,System.String)"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.Database"/>.<see cref="M:Microsoft.Deployment.WindowsInstaller.Database.OpenView(System.String,System.Object[])"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.Database"/>.<see cref="P:Microsoft.Deployment.WindowsInstaller.Database.SummaryInfo"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.Database"/>.<see cref="M:Microsoft.Deployment.WindowsInstaller.Database.ViewTransform(System.String)"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.View"/>.<see cref="M:Microsoft.Deployment.WindowsInstaller.View.Assign(Microsoft.Deployment.WindowsInstaller.Record)"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.View"/>.<see cref="M:Microsoft.Deployment.WindowsInstaller.View.Delete(Microsoft.Deployment.WindowsInstaller.Record)"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.View"/>.<see cref="M:Microsoft.Deployment.WindowsInstaller.View.Execute(Microsoft.Deployment.WindowsInstaller.Record)"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.View"/>.<see cref="M:Microsoft.Deployment.WindowsInstaller.View.Insert(Microsoft.Deployment.WindowsInstaller.Record)"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.View"/>.<see cref="M:Microsoft.Deployment.WindowsInstaller.View.InsertTemporary(Microsoft.Deployment.WindowsInstaller.Record)"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.View"/>.<see cref="M:Microsoft.Deployment.WindowsInstaller.View.Merge(Microsoft.Deployment.WindowsInstaller.Record)"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.View"/>.<see cref="M:Microsoft.Deployment.WindowsInstaller.View.Modify(Microsoft.Deployment.WindowsInstaller.ViewModifyMode,Microsoft.Deployment.WindowsInstaller.Record)"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.View"/>.<see cref="M:Microsoft.Deployment.WindowsInstaller.View.Refresh(Microsoft.Deployment.WindowsInstaller.Record)"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.View"/>.<see cref="M:Microsoft.Deployment.WindowsInstaller.View.Replace(Microsoft.Deployment.WindowsInstaller.Record)"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.View"/>.<see cref="M:Microsoft.Deployment.WindowsInstaller.View.Seek(Microsoft.Deployment.WindowsInstaller.Record)"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.View"/>.<see cref="M:Microsoft.Deployment.WindowsInstaller.View.Update(Microsoft.Deployment.WindowsInstaller.Record)"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.View"/>.<see cref="M:Microsoft.Deployment.WindowsInstaller.View.Validate(Microsoft.Deployment.WindowsInstaller.Record)"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.View"/>.<see cref="M:Microsoft.Deployment.WindowsInstaller.View.ValidateFields(Microsoft.Deployment.WindowsInstaller.Record)"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.View"/>.<see cref="M:Microsoft.Deployment.WindowsInstaller.View.ValidateDelete(Microsoft.Deployment.WindowsInstaller.Record)"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.View"/>.<see cref="M:Microsoft.Deployment.WindowsInstaller.View.ValidateNew(Microsoft.Deployment.WindowsInstaller.Record)"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.SummaryInfo"/> (constructor)</item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.Record"/>.<see cref="M:Microsoft.Deployment.WindowsInstaller.Record.SetStream(System.Int32,System.String)"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.Session"/>.<see cref="M:Microsoft.Deployment.WindowsInstaller.Session.SetInstallLevel(System.Int32)"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.Session"/>.<see cref="M:Microsoft.Deployment.WindowsInstaller.Session.GetSourcePath(System.String)"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.Session"/>.<see cref="M:Microsoft.Deployment.WindowsInstaller.Session.GetTargetPath(System.String)"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.Session"/>.<see cref="M:Microsoft.Deployment.WindowsInstaller.Session.SetTargetPath(System.String,System.String)"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.ComponentInfo"/>.<see cref="P:Microsoft.Deployment.WindowsInstaller.ComponentInfo.CurrentState"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.FeatureInfo"/>.<see cref="P:Microsoft.Deployment.WindowsInstaller.FeatureInfo.CurrentState"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.FeatureInfo"/>.<see cref="P:Microsoft.Deployment.WindowsInstaller.FeatureInfo.ValidStates"/></item>
+            <item><see cref="T:Microsoft.Deployment.WindowsInstaller.FeatureInfo"/>.<see cref="M:Microsoft.Deployment.WindowsInstaller.FeatureInfo.GetCost(System.Boolean,System.Boolean,Microsoft.Deployment.WindowsInstaller.InstallState)"/></item>
+            </list>
+            </p><p>
+            The Record object should be <see cref="M:Microsoft.Deployment.WindowsInstaller.InstallerHandle.Close"/>d after use.
+            It is best that the handle be closed manually as soon as it is no longer
+            needed, as leaving lots of unused handles open can degrade performance.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigetlasterrorrecord.asp">MsiGetLastErrorRecord</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.InstallerException.ErrorCode">
+            <summary>
+            Gets the system error code that resulted in this exception, or 0 if not applicable.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.InstallerException.Message">
+            <summary>
+            Gets a message that describes the exception.  This message may contain detailed
+            formatted error data if it was available.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.InstallCanceledException">
+            <summary>
+            User Canceled the installation.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.InstallCanceledException.#ctor(System.String,System.Exception)">
+            <summary>
+            Creates a new InstallCanceledException with a specified error message and a reference to the
+            inner exception that is the cause of this exception.
+            </summary>
+            <param name="msg">The message that describes the error.</param>
+            <param name="innerException">The exception that is the cause of the current exception. If the
+            innerException parameter is not a null reference (Nothing in Visual Basic), the current exception
+            is raised in a catch block that handles the inner exception.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.InstallCanceledException.#ctor(System.String)">
+            <summary>
+            Creates a new InstallCanceledException with a specified error message.
+            </summary>
+            <param name="msg">The message that describes the error.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.InstallCanceledException.#ctor">
+            <summary>
+            Creates a new InstallCanceledException.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.InstallCanceledException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Initializes a new instance of the InstallCanceledException class with serialized data.
+            </summary>
+            <param name="info">The SerializationInfo that holds the serialized object data about the exception being thrown.</param>
+            <param name="context">The StreamingContext that contains contextual information about the source or destination.</param>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.BadQuerySyntaxException">
+            <summary>
+            A bad SQL query string was passed to <see cref="M:Microsoft.Deployment.WindowsInstaller.Database.OpenView(System.String,System.Object[])"/> or <see cref="M:Microsoft.Deployment.WindowsInstaller.Database.Execute(System.String,System.Object[])"/>.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.BadQuerySyntaxException.#ctor(System.String,System.Exception)">
+            <summary>
+            Creates a new BadQuerySyntaxException with a specified error message and a reference to the
+            inner exception that is the cause of this exception.
+            </summary>
+            <param name="msg">The message that describes the error.</param>
+            <param name="innerException">The exception that is the cause of the current exception. If the
+            innerException parameter is not a null reference (Nothing in Visual Basic), the current exception
+            is raised in a catch block that handles the inner exception.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.BadQuerySyntaxException.#ctor(System.String)">
+            <summary>
+            Creates a new BadQuerySyntaxException with a specified error message.
+            </summary>
+            <param name="msg">The message that describes the error.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.BadQuerySyntaxException.#ctor">
+            <summary>
+            Creates a new BadQuerySyntaxException.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.BadQuerySyntaxException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Initializes a new instance of the BadQuerySyntaxException class with serialized data.
+            </summary>
+            <param name="info">The SerializationInfo that holds the serialized object data about the exception being thrown.</param>
+            <param name="context">The StreamingContext that contains contextual information about the source or destination.</param>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">
+            <summary>
+            A method was called on an invalid installer handle.  The handle may have been already closed.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.InvalidHandleException.#ctor(System.String,System.Exception)">
+            <summary>
+            Creates a new InvalidHandleException with a specified error message and a reference to the
+            inner exception that is the cause of this exception.
+            </summary>
+            <param name="msg">The message that describes the error.</param>
+            <param name="innerException">The exception that is the cause of the current exception. If the
+            innerException parameter is not a null reference (Nothing in Visual Basic), the current exception
+            is raised in a catch block that handles the inner exception.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.InvalidHandleException.#ctor(System.String)">
+            <summary>
+            Creates a new InvalidHandleException with a specified error message.
+            </summary>
+            <param name="msg">The message that describes the error.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.InvalidHandleException.#ctor">
+            <summary>
+            Creates a new InvalidHandleException.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.InvalidHandleException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Initializes a new instance of the InvalidHandleException class with serialized data.
+            </summary>
+            <param name="info">The SerializationInfo that holds the serialized object data about the exception being thrown.</param>
+            <param name="context">The StreamingContext that contains contextual information about the source or destination.</param>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.MergeException">
+            <summary>
+            A failure occurred when executing <see cref="M:Microsoft.Deployment.WindowsInstaller.Database.Merge(Microsoft.Deployment.WindowsInstaller.Database,System.String)"/>.  The exception may contain
+            details about the merge conflict.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.MergeException.#ctor(System.String,System.Exception)">
+            <summary>
+            Creates a new MergeException with a specified error message and a reference to the
+            inner exception that is the cause of this exception.
+            </summary>
+            <param name="msg">The message that describes the error.</param>
+            <param name="innerException">The exception that is the cause of the current exception. If the
+            innerException parameter is not a null reference (Nothing in Visual Basic), the current exception
+            is raised in a catch block that handles the inner exception.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.MergeException.#ctor(System.String)">
+            <summary>
+            Creates a new MergeException with a specified error message.
+            </summary>
+            <param name="msg">The message that describes the error.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.MergeException.#ctor">
+            <summary>
+            Creates a new MergeException.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.MergeException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Initializes a new instance of the MergeException class with serialized data.
+            </summary>
+            <param name="info">The SerializationInfo that holds the serialized object data about the exception being thrown.</param>
+            <param name="context">The StreamingContext that contains contextual information about the source or destination.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.MergeException.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Sets the SerializationInfo with information about the exception.
+            </summary>
+            <param name="info">The SerializationInfo that holds the serialized object data about the exception being thrown.</param>
+            <param name="context">The StreamingContext that contains contextual information about the source or destination.</param>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.MergeException.ConflictCounts">
+            <summary>
+            Gets the number of merge conflicts in each table, corresponding to the tables returned by
+            <see cref="P:Microsoft.Deployment.WindowsInstaller.MergeException.ConflictTables"/>.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.MergeException.ConflictTables">
+            <summary>
+            Gets the list of tables containing merge conflicts.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.MergeException.Message">
+            <summary>
+            Gets a message that describes the merge conflits.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.ExternalUIHandler">
+            <summary>
+            Defines a callback function that the installer calls for progress notification and error messages.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.ExternalUIRecordHandler">
+            <summary>
+            [MSI 3.1] Defines a callback function that the installer calls for record-based progress notification and error messages.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.Installer">
+            <summary>
+            Provides static methods for installing and configuring products and patches.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.SetExternalUI(Microsoft.Deployment.WindowsInstaller.ExternalUIHandler,Microsoft.Deployment.WindowsInstaller.InstallLogModes)">
+            <summary>
+            Enables an external user-interface handler. This external UI handler is called before the
+            normal internal user-interface handler. The external UI handler has the option to suppress
+            the internal UI by returning a non-zero value to indicate that it has handled the messages.
+            </summary>
+            <param name="uiHandler">A callback delegate that handles the UI messages</param>
+            <param name="messageFilter">Specifies which messages to handle using the external message handler.
+            If the external handler returns a non-zero result, then that message will not be sent to the UI,
+            instead the message will be logged if logging has been enabled.</param>
+            <returns>The previously set external handler, or null if there was no previously set handler</returns>
+            <remarks><p>
+            To restore the previous UI handler, a second call is made to SetExternalUI using the
+            ExternalUIHandler returned by the first call to SetExternalUI and specifying
+            <see cref="F:Microsoft.Deployment.WindowsInstaller.InstallLogModes.None"/> as the message filter.
+            </p><p>
+            The external user interface handler does not have full control over the external user
+            interface unless <see cref="M:Microsoft.Deployment.WindowsInstaller.Installer.SetInternalUI(Microsoft.Deployment.WindowsInstaller.InstallUIOptions)"/> is called with the uiLevel parameter set to
+            <see cref="F:Microsoft.Deployment.WindowsInstaller.InstallUIOptions.Silent"/>. If SetInternalUI is not called, the internal user
+            interface level defaults to <see cref="F:Microsoft.Deployment.WindowsInstaller.InstallUIOptions.Basic"/>. As a result, any message not
+            handled by the external user interface handler is handled by Windows Installer. The initial
+            "Preparing to install..." dialog always appears even if the external user interface
+            handler handles all messages.
+            </p><p>
+            SetExternalUI should only be called from a bootstrapping application. You cannot call
+            it from a custom action
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisetexternalui.asp">MsiSetExternalUI</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.SetExternalUI(Microsoft.Deployment.WindowsInstaller.ExternalUIRecordHandler,Microsoft.Deployment.WindowsInstaller.InstallLogModes)">
+            <summary>
+            [MSI 3.1] Enables a record-based external user-interface handler. This external UI handler is called
+            before the normal internal user-interface handler. The external UI handler has the option to suppress
+            the internal UI by returning a non-zero value to indicate that it has handled the messages.
+            </summary>
+            <param name="uiHandler">A callback delegate that handles the UI messages</param>
+            <param name="messageFilter">Specifies which messages to handle using the external message handler.
+            If the external handler returns a non-zero result, then that message will not be sent to the UI,
+            instead the message will be logged if logging has been enabled.</param>
+            <returns>The previously set external handler, or null if there was no previously set handler</returns>
+            <remarks><p>
+            To restore the previous UI handler, a second call is made to SetExternalUI using the
+            ExternalUIHandler returned by the first call to SetExternalUI and specifying
+            <see cref="F:Microsoft.Deployment.WindowsInstaller.InstallLogModes.None"/> as the message filter.
+            </p><p>
+            The external user interface handler does not have full control over the external user
+            interface unless <see cref="M:Microsoft.Deployment.WindowsInstaller.Installer.SetInternalUI(Microsoft.Deployment.WindowsInstaller.InstallUIOptions)"/> is called with the uiLevel parameter set to
+            <see cref="F:Microsoft.Deployment.WindowsInstaller.InstallUIOptions.Silent"/>. If SetInternalUI is not called, the internal user
+            interface level defaults to <see cref="F:Microsoft.Deployment.WindowsInstaller.InstallUIOptions.Basic"/>. As a result, any message not
+            handled by the external user interface handler is handled by Windows Installer. The initial
+            "Preparing to install..." dialog always appears even if the external user interface
+            handler handles all messages.
+            </p><p>
+            SetExternalUI should only be called from a bootstrapping application. You cannot call
+            it from a custom action
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisetexternaluirecord.asp">MsiSetExternalUIRecord</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.SetInternalUI(Microsoft.Deployment.WindowsInstaller.InstallUIOptions,System.IntPtr@)">
+            <summary>
+            Enables the installer's internal user interface. Then this user interface is used
+            for all subsequent calls to user-interface-generating installer functions in this process.
+            </summary>
+            <param name="uiOptions">Specifies the level of complexity of the user interface</param>
+            <param name="windowHandle">Handle to a window, which becomes the owner of any user interface created.
+            A pointer to the previous owner of the user interface is returned.</param>
+            <returns>The previous user interface level</returns>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisetinternalui.asp">MsiSetInternalUI</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.SetInternalUI(Microsoft.Deployment.WindowsInstaller.InstallUIOptions)">
+            <summary>
+            Enables the installer's internal user interface. Then this user interface is used
+            for all subsequent calls to user-interface-generating installer functions in this process.
+            The owner of the user interface does not change.
+            </summary>
+            <param name="uiOptions">Specifies the level of complexity of the user interface</param>
+            <returns>The previous user interface level</returns>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisetinternalui.asp">MsiSetInternalUI</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.EnableLog(Microsoft.Deployment.WindowsInstaller.InstallLogModes,System.String)">
+            <summary>
+            Enables logging of the selected message type for all subsequent install sessions in
+            the current process space.
+            </summary>
+            <param name="logModes">One or more mode flags specifying the type of messages to log</param>
+            <param name="logFile">Full path to the log file.  A null path disables logging,
+            in which case the logModes paraneter is ignored.</param>
+            <exception cref="T:System.ArgumentException">an invalid log mode was specified</exception>
+            <remarks>This method takes effect on any new installation processes.  Calling this
+            method from within a custom action will not start logging for that installation.</remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.EnableLog(Microsoft.Deployment.WindowsInstaller.InstallLogModes,System.String,System.Boolean,System.Boolean)">
+            <summary>
+            Enables logging of the selected message type for all subsequent install sessions in
+            the current process space.
+            </summary>
+            <param name="logModes">One or more mode flags specifying the type of messages to log</param>
+            <param name="logFile">Full path to the log file.  A null path disables logging,
+            in which case the logModes paraneter is ignored.</param>
+            <param name="append">If true, the log lines will be appended to any existing file content.
+            If false, the log file will be truncated if it exists.  The default is false.</param>
+            <param name="flushEveryLine">If true, the log will be flushed after every line.
+            If false, the log will be flushed every 20 lines.  The default is true.</param>
+            <exception cref="T:System.ArgumentException">an invalid log mode was specified</exception>
+            <remarks><p>
+            This method takes effect on any new installation processes.  Calling this
+            method from within a custom action will not start logging for that installation.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msienablelog.asp">MsiEnableLog</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.UseFeature(System.String,System.String,Microsoft.Deployment.WindowsInstaller.InstallMode)">
+            <summary>
+            increments the usage count for a particular feature and returns the installation state for
+            that feature. This method should be used to indicate an application's intent to use a feature.
+            </summary>
+            <param name="productCode">The product code of the product.</param>
+            <param name="feature">The feature to be used.</param>
+            <param name="installMode">Must have the value <see cref="F:Microsoft.Deployment.WindowsInstaller.InstallMode.NoDetection"/>.</param>
+            <returns>The installed state of the feature.</returns>
+            <remarks><p>
+            The UseFeature method should only be used on features known to be published. The application
+            should determine the status of the feature by calling either the FeatureState method or
+            Features method.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiusefeature.asp">MsiUseFeature</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiusefeatureex.asp">MsiUseFeatureEx</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.OpenPackage(System.String,System.Boolean)">
+            <summary>
+            Opens an installer package for use with functions that access the product database and install engine,
+            returning an Session object.
+            </summary>
+            <param name="packagePath">Path to the package</param>
+            <param name="ignoreMachineState">Specifies whether or not the create a Session object that ignores the
+            computer state and that is incapable of changing the current computer state. A value of false yields
+            the normal behavior.  A value of true creates a "safe" Session object that cannot change of the current
+            machine state.</param>
+            <returns>A Session object allowing access to the product database and install engine</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">The product could not be opened</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">The installer configuration data is corrupt</exception>
+            <remarks><p>
+            Note that only one Session object can be opened by a single process. OpenPackage cannot be used in a
+            custom action because the active installation is the only session allowed.
+            </p><p>
+            A "safe" Session object ignores the current computer state when opening the package and prevents
+            changes to the current computer state.
+            </p><p>
+            The Session object should be <see cref="M:Microsoft.Deployment.WindowsInstaller.InstallerHandle.Close"/>d after use.
+            It is best that the handle be closed manually as soon as it is no longer
+            needed, as leaving lots of unused handles open can degrade performance.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiopenpackage.asp">MsiOpenPackage</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiopenpackageex.asp">MsiOpenPackageEx</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.OpenPackage(Microsoft.Deployment.WindowsInstaller.Database,System.Boolean)">
+            <summary>
+            Opens an installer package for use with functions that access the product database and install engine,
+            returning an Session object.
+            </summary>
+            <param name="database">Database used to create the session</param>
+            <param name="ignoreMachineState">Specifies whether or not the create a Session object that ignores the
+            computer state and that is incapable of changing the current computer state. A value of false yields
+            the normal behavior.  A value of true creates a "safe" Session object that cannot change of the current
+            machine state.</param>
+            <returns>A Session object allowing access to the product database and install engine</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">The product could not be opened</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">The installer configuration data is corrupt</exception>
+            <remarks><p>
+            Note that only one Session object can be opened by a single process. OpenPackage cannot be used in a
+            custom action because the active installation is the only session allowed.
+            </p><p>
+            A "safe" Session object ignores the current computer state when opening the package and prevents
+            changes to the current computer state.
+            </p><p>
+            The Session object should be <see cref="M:Microsoft.Deployment.WindowsInstaller.InstallerHandle.Close"/>d after use.
+            It is best that the handle be closed manually as soon as it is no longer
+            needed, as leaving lots of unused handles open can degrade performance.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiopenpackage.asp">MsiOpenPackage</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiopenpackageex.asp">MsiOpenPackageEx</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.OpenProduct(System.String)">
+            <summary>
+            Opens an installer package for an installed product using the product code.
+            </summary>
+            <param name="productCode">Product code of the installed product</param>
+            <returns>A Session object allowing access to the product database and install engine,
+            or null if the specified product is not installed.</returns>
+            <exception cref="T:System.ArgumentException">An unknown product was requested</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">The product could not be opened</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">The installer configuration data is corrupt</exception>
+            <remarks><p>
+            Note that only one Session object can be opened by a single process. OpenProduct cannot be
+            used in a custom action because the active installation is the only session allowed.
+            </p><p>
+            The Session object should be <see cref="M:Microsoft.Deployment.WindowsInstaller.InstallerHandle.Close"/>d after use.
+            It is best that the handle be closed manually as soon as it is no longer
+            needed, as leaving lots of unused handles open can degrade performance.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiopenproduct.asp">MsiOpenProduct</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.ProvideComponent(System.String,System.String,System.String,Microsoft.Deployment.WindowsInstaller.InstallMode)">
+            <summary>
+            Gets the full component path, performing any necessary installation. This method prompts for source if
+            necessary and increments the usage count for the feature.
+            </summary>
+            <param name="product">Product code for the product that contains the feature with the necessary component</param>
+            <param name="feature">Feature ID of the feature with the necessary component</param>
+            <param name="component">Component code of the necessary component</param>
+            <param name="installMode">Installation mode; this can also include bits from <see cref="T:Microsoft.Deployment.WindowsInstaller.ReinstallModes"/></param>
+            <returns>Path to the component</returns>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiprovidecomponent.asp">MsiProvideComponent</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.ProvideQualifiedComponent(System.String,System.String,Microsoft.Deployment.WindowsInstaller.InstallMode,System.String)">
+            <summary>
+            Gets the full component path for a qualified component that is published by a product and
+            performs any necessary installation. This method prompts for source if necessary and increments
+            the usage count for the feature.
+            </summary>
+            <param name="component">Specifies the component ID for the requested component. This may not be the
+            GUID for the component itself but rather a server that provides the correct functionality, as in the
+            ComponentId column of the PublishComponent table.</param>
+            <param name="qualifier">Specifies a qualifier into a list of advertising components (from PublishComponent Table).</param>
+            <param name="installMode">Installation mode; this can also include bits from <see cref="T:Microsoft.Deployment.WindowsInstaller.ReinstallModes"/></param>
+            <param name="product">Optional; specifies the product to match that has published the qualified component.</param>
+            <returns>Path to the component</returns>
+            <remarks><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiprovidequalifiedcomponent.asp">MsiProvideQualifiedComponent</a>
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiprovidequalifiedcomponentex.asp">MsiProvideQualifiedComponentEx</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.ProvideAssembly(System.String,System.String,Microsoft.Deployment.WindowsInstaller.InstallMode,System.Boolean)">
+            <summary>
+            Gets the full path to a Windows Installer component containing an assembly. This method prompts for a source and
+            increments the usage count for the feature.
+            </summary>
+            <param name="assemblyName">Assembly name</param>
+            <param name="appContext">Set to null for global assemblies. For private assemblies, set to the full path of the
+            application configuration file (.cfg file) or executable file (.exe) of the application to which the assembly
+            has been made private.</param>
+            <param name="installMode">Installation mode; this can also include bits from <see cref="T:Microsoft.Deployment.WindowsInstaller.ReinstallModes"/></param>
+            <param name="isWin32Assembly">True if this is a Win32 assembly, false if it is a .NET assembly</param>
+            <returns>Path to the assembly</returns>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiprovideassembly.asp">MsiProvideAssembly</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.InstallMissingComponent(System.String,System.String,Microsoft.Deployment.WindowsInstaller.InstallState)">
+            <summary>
+            Installs files that are unexpectedly missing.
+            </summary>
+            <param name="product">Product code for the product that owns the component to be installed</param>
+            <param name="component">Component to be installed</param>
+            <param name="installState">Specifies the way the component should be installed.</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallCanceledException">the user exited the installation</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiinstallmissingcomponent.asp">MsiInstallMissingComponent</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.InstallMissingFile(System.String,System.String)">
+            <summary>
+            Installs files that are unexpectedly missing.
+            </summary>
+            <param name="product">Product code for the product that owns the file to be installed</param>
+            <param name="file">File to be installed</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallCanceledException">the user exited the installation</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiinstallmissingfile.asp">MsiInstallMissingFile</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.ReinstallFeature(System.String,System.String,Microsoft.Deployment.WindowsInstaller.ReinstallModes)">
+            <summary>
+            Reinstalls a feature.
+            </summary>
+            <param name="product">Product code for the product containing the feature to be reinstalled</param>
+            <param name="feature">Feature to be reinstalled</param>
+            <param name="reinstallModes">Reinstall modes</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallCanceledException">the user exited the installation</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msireinstallfeature.asp">MsiReinstallFeature</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.ReinstallProduct(System.String,Microsoft.Deployment.WindowsInstaller.ReinstallModes)">
+            <summary>
+            Reinstalls a product.
+            </summary>
+            <param name="product">Product code for the product to be reinstalled</param>
+            <param name="reinstallModes">Reinstall modes</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallCanceledException">the user exited the installation</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msireinstallproduct.asp">MsiReinstallProduct</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.InstallProduct(System.String,System.String)">
+            <summary>
+            Opens an installer package and initializes an install session.
+            </summary>
+            <param name="packagePath">path to the patch package</param>
+            <param name="commandLine">command line property settings</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">There was an error installing the product</exception>
+            <remarks><p>
+            To completely remove a product, set REMOVE=ALL in <paramRef name="commandLine"/>.
+            </p><p>
+            This method displays the user interface with the current settings and
+            log mode. You can change user interface settings with the <see cref="M:Microsoft.Deployment.WindowsInstaller.Installer.SetInternalUI(Microsoft.Deployment.WindowsInstaller.InstallUIOptions)"/>
+            and <see cref="M:Microsoft.Deployment.WindowsInstaller.Installer.SetExternalUI(Microsoft.Deployment.WindowsInstaller.ExternalUIHandler,Microsoft.Deployment.WindowsInstaller.InstallLogModes)"/> functions. You can set the log mode with the
+            <see cref="M:Microsoft.Deployment.WindowsInstaller.Installer.EnableLog(Microsoft.Deployment.WindowsInstaller.InstallLogModes,System.String)"/> function.
+            </p><p>
+            The <see cref="P:Microsoft.Deployment.WindowsInstaller.Installer.RebootRequired"/> and <see cref="P:Microsoft.Deployment.WindowsInstaller.Installer.RebootInitiated"/> properties should be
+            tested after calling this method.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiinstallproduct.asp">MsiInstallProduct</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.ConfigureProduct(System.String,System.Int32,Microsoft.Deployment.WindowsInstaller.InstallState,System.String)">
+            <summary>
+            Installs or uninstalls a product.
+            </summary>
+            <param name="productCode">Product code of the product to be configured.</param>
+            <param name="installLevel">Specifies the default installation configuration of the
+            product. The <paramref name="installLevel"/> parameter is ignored and all features
+            are installed if the <paramref name="installState"/> parameter is set to any other
+            value than <see cref="F:Microsoft.Deployment.WindowsInstaller.InstallState.Default"/>. This parameter must be either 0
+            (install using authored feature levels), 65535 (install all features), or a value
+            between 0 and 65535 to install a subset of available features.																																											   </param>
+            <param name="installState">Specifies the installation state for the product.</param>
+            <param name="commandLine">Specifies the command line property settings. This should
+            be a list of the format Property=Setting Property=Setting.</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">There was an error configuring the product</exception>
+            <remarks><p>
+            This method displays the user interface with the current settings and
+            log mode. You can change user interface settings with the <see cref="M:Microsoft.Deployment.WindowsInstaller.Installer.SetInternalUI(Microsoft.Deployment.WindowsInstaller.InstallUIOptions)"/>
+            and <see cref="M:Microsoft.Deployment.WindowsInstaller.Installer.SetExternalUI(Microsoft.Deployment.WindowsInstaller.ExternalUIHandler,Microsoft.Deployment.WindowsInstaller.InstallLogModes)"/> functions. You can set the log mode with the
+            <see cref="M:Microsoft.Deployment.WindowsInstaller.Installer.EnableLog(Microsoft.Deployment.WindowsInstaller.InstallLogModes,System.String)"/> function.
+            </p><p>
+            The <see cref="P:Microsoft.Deployment.WindowsInstaller.Installer.RebootRequired"/> and <see cref="P:Microsoft.Deployment.WindowsInstaller.Installer.RebootInitiated"/> properties should be
+            tested after calling this method.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiconfigureproduct.asp">MsiConfigureProduct</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiconfigureproductex.asp">MsiConfigureProductEx</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.ConfigureFeature(System.String,System.String,Microsoft.Deployment.WindowsInstaller.InstallState)">
+            <summary>
+            Configures the installed state for a product feature.
+            </summary>
+            <param name="productCode">Product code of the product to be configured.</param>
+            <param name="feature">Specifies the feature ID for the feature to be configured.</param>
+            <param name="installState">Specifies the installation state for the feature.</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">There was an error configuring the feature</exception>
+            <remarks><p>
+            The <see cref="P:Microsoft.Deployment.WindowsInstaller.Installer.RebootRequired"/> and <see cref="P:Microsoft.Deployment.WindowsInstaller.Installer.RebootInitiated"/> properties should be
+            tested after calling this method.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiconfigurefeature.asp">MsiConfigureFeature</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.ApplyPatch(System.String,System.String)">
+            <summary>
+            For each product listed by the patch package as eligible to receive the patch, ApplyPatch invokes
+            an installation and sets the PATCH property to the path of the patch package.
+            </summary>
+            <param name="patchPackage">path to the patch package</param>
+            <param name="commandLine">optional command line property settings</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">There was an error applying the patch</exception>
+            <remarks><p>
+            The <see cref="P:Microsoft.Deployment.WindowsInstaller.Installer.RebootRequired"/> and <see cref="P:Microsoft.Deployment.WindowsInstaller.Installer.RebootInitiated"/> properties should be
+            tested after calling this method.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiapplypatch.asp">MsiApplyPatch</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.ApplyPatch(System.String,System.String,Microsoft.Deployment.WindowsInstaller.InstallType,System.String)">
+            <summary>
+            For each product listed by the patch package as eligible to receive the patch, ApplyPatch invokes
+            an installation and sets the PATCH property to the path of the patch package.
+            </summary>
+            <param name="patchPackage">path to the patch package</param>
+            <param name="installPackage">path to the product to be patched, if installType
+            is set to <see cref="F:Microsoft.Deployment.WindowsInstaller.InstallType.NetworkImage"/></param>
+            <param name="installType">type of installation to patch</param>
+            <param name="commandLine">optional command line property settings</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">There was an error applying the patch</exception>
+            <remarks><p>
+            The <see cref="P:Microsoft.Deployment.WindowsInstaller.Installer.RebootRequired"/> and <see cref="P:Microsoft.Deployment.WindowsInstaller.Installer.RebootInitiated"/> properties should be
+            tested after calling this method.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiapplypatch.asp">MsiApplyPatch</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.RemovePatches(System.Collections.Generic.IList{System.String},System.String,System.String)">
+            <summary>
+            Removes one or more patches from a single product. To remove a patch from
+            multiple products, RemovePatches must be called for each product.
+            </summary>
+            <param name="patches">List of patches to remove. Each patch can be specified by the GUID
+            of the patch or the full path to the patch package.</param>
+            <param name="productCode">The ProductCode (GUID) of the product from which the patches
+            are removed.  This parameter cannot be null.</param>
+            <param name="commandLine">optional command line property settings</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">There was an error removing the patches</exception>
+            <remarks><p>
+            The <see cref="P:Microsoft.Deployment.WindowsInstaller.Installer.RebootRequired"/> and <see cref="P:Microsoft.Deployment.WindowsInstaller.Installer.RebootInitiated"/> properties should be
+            tested after calling this method.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiremovepatches.asp">MsiRemovePatches</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.DetermineApplicablePatches(System.String,System.String[],Microsoft.Deployment.WindowsInstaller.InapplicablePatchHandler)">
+            <summary>
+            Determines which patches apply to a specified product MSI and in what sequence.
+            </summary>
+            <param name="productPackage">Full path to an MSI file that is the target product
+            for the set of patches.</param>
+            <param name="patches">An array of strings specifying the patches to be checked.  Each item
+            may be the path to an MSP file, the path an XML file, or just an XML blob.</param>
+            <param name="errorHandler">Callback to be invoked for each inapplicable patch, reporting the
+            reason the patch is not applicable.  This value may be left null if that information is not
+            desired.</param>
+            <returns>An array of selected patch strings from <paramref name="patches"/>, indicating
+            the set of applicable patches.  The items are re-ordered to be in the best sequence.</returns>
+            <remarks><p>
+            If an item in <paramref name="patches"/> is a file path but does not end in .MSP or .XML,
+            it is assumed to be an MSP file.
+            </p><p>
+            As this overload uses InstallContext.None, it does not consider the current state of
+            the system.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msidetermineapplicablepatches.asp">MsiDetermineApplicablePatches</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.DetermineApplicablePatches(System.String,System.String[],Microsoft.Deployment.WindowsInstaller.InapplicablePatchHandler,System.String,Microsoft.Deployment.WindowsInstaller.UserContexts)">
+            <summary>
+            Determines which patches apply to a specified product and in what sequence.  If
+            the product is installed, this method accounts for patches that have already been applied to
+            the product and accounts for obsolete and superceded patches.
+            </summary>
+            <param name="product">The product that is the target for the set of patches.  This may be
+            either a ProductCode (GUID) of a product that is currently installed, or the path to a an
+            MSI file.</param>
+            <param name="patches">An array of strings specifying the patches to be checked.  Each item
+            may be the path to an MSP file, the path an XML file, or just an XML blob.</param>
+            <param name="errorHandler">Callback to be invoked for each inapplicable patch, reporting the
+            reason the patch is not applicable.  This value may be left null if that information is not
+            desired.</param>
+            <param name="userSid">Specifies a security identifier (SID) of a user. This parameter restricts
+            the context of enumeration for this user account. This parameter cannot be the special SID
+            strings s-1-1-0 (everyone) or s-1-5-18 (local system). If <paramref name="context"/> is set to
+            <see cref="F:Microsoft.Deployment.WindowsInstaller.UserContexts.None"/> or <see cref="F:Microsoft.Deployment.WindowsInstaller.UserContexts.Machine"/>, then
+            <paramref name="userSid"/> must be null. For the current user context, <paramref name="userSid"/>
+            can be null and <paramref name="context"/> can be set to <see cref="F:Microsoft.Deployment.WindowsInstaller.UserContexts.UserManaged"/>
+            or <see cref="F:Microsoft.Deployment.WindowsInstaller.UserContexts.UserUnmanaged"/>.</param>
+            <param name="context">Restricts the enumeration to per-user-unmanaged, per-user-managed,
+            or per-machine context, or (if referring to an MSI) to no system context at all.  This
+            parameter can be <see cref="F:Microsoft.Deployment.WindowsInstaller.UserContexts.Machine"/>, <see cref="F:Microsoft.Deployment.WindowsInstaller.UserContexts.UserManaged"/>,
+            <see cref="F:Microsoft.Deployment.WindowsInstaller.UserContexts.UserUnmanaged"/>, or <see cref="F:Microsoft.Deployment.WindowsInstaller.UserContexts.None"/>.</param>
+            <returns>An array of selected patch strings from <paramref name="patches"/>, indicating
+            the set of applicable patches.  The items are re-ordered to be in the best sequence.</returns>
+            <remarks><p>
+            If an item in <paramref name="patches"/> is a file path but does not end in .MSP or .XML,
+            it is assumed to be an MSP file.
+            </p><p>
+            Passing an InstallContext of None only analyzes the MSI file; it does not consider the
+            current state of the system. You cannot use InstallContext.None with a ProductCode GUID.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msidetermineapplicablepatches.asp">MsiDetermineApplicablePatches</a>
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msideterminepatchsequence.asp">MsiDeterminePatchSequence</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.ApplyMultiplePatches(System.Collections.Generic.IList{System.String},System.String,System.String)">
+            <summary>
+            Applies one or more patches to products that are eligible to receive the patch.
+            For each product listed by the patch package as eligible to receive the patch, ApplyPatch invokes
+            an installation and sets the PATCH property to the path of the patch package.
+            </summary>
+            <param name="patchPackages">The set of patch packages to be applied.
+            Each item is the full path to an MSP file.</param>
+            <param name="productCode">Provides the ProductCode of the product being patched. If this parameter
+            is null, the patches are applied to all products that are eligible to receive these patches.</param>
+            <param name="commandLine">optional command line property settings</param>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiapplymultiplepatches.asp">MsiApplyMultiplePatches</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.ExtractPatchXmlData(System.String)">
+            <summary>
+            Extracts information from a patch that can be used to determine whether the patch
+            applies on a target system. The method returns an XML string that can be provided to
+            <see cref="M:Microsoft.Deployment.WindowsInstaller.Installer.DetermineApplicablePatches(System.String,System.String[],Microsoft.Deployment.WindowsInstaller.InapplicablePatchHandler,System.String,Microsoft.Deployment.WindowsInstaller.UserContexts)"/>
+            instead of the full patch file.
+            </summary>
+            <param name="patchPath">Full path to the patch being queried.</param>
+            <returns>XML string containing patch data.</returns>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiextractpatchxmldata.asp">MsiExtractPatchXMLData</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.NotifySidChange(System.String,System.String)">
+            <summary>
+            [MSI 3.1] Migrates a user's application configuration data to a new SID.
+            </summary>
+            <param name="oldSid">Previous user SID that data is to be migrated from</param>
+            <param name="newSid">New user SID that data is to be migrated to</param>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msinotifysidchange.asp">MsiNotifySidChange</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.AdvertiseProduct(System.String,System.Boolean,System.String,System.Int32)">
+            <summary>
+            Advertises a product to the local computer.
+            </summary>
+            <param name="packagePath">Path to the package of the product being advertised</param>
+            <param name="perUser">True if the product is user-assigned; false if it is machine-assigned.</param>
+            <param name="transforms">Semi-colon delimited list of transforms to be applied. This parameter may be null.</param>
+            <param name="locale">The language to use if the source supports multiple languages</param>
+            <exception cref="T:System.IO.FileNotFoundException">the specified package file does not exist</exception>
+            <seealso cref="M:Microsoft.Deployment.WindowsInstaller.Installer.GenerateAdvertiseScript(System.String,System.String,System.String,System.Int32,System.Reflection.ProcessorArchitecture,System.Boolean)"/>
+            <remarks><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiadvertiseproduct.asp">MsiAdvertiseProduct</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiadvertiseproductex.asp">MsiAdvertiseProductEx</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.GenerateAdvertiseScript(System.String,System.String,System.String,System.Int32)">
+            <summary>
+            Generates an advertise script. The method enables the installer to write to a 
+            script the registry and shortcut information used to assign or publish a product.
+            </summary>
+            <param name="packagePath">Path to the package of the product being advertised</param>
+            <param name="scriptFilePath">path to script file to be created with the advertise information</param>
+            <param name="transforms">Semi-colon delimited list of transforms to be applied. This parameter may be null.</param>
+            <param name="locale">The language to use if the source supports multiple languages</param>
+            <exception cref="T:System.IO.FileNotFoundException">the specified package file does not exist</exception>
+            <seealso cref="M:Microsoft.Deployment.WindowsInstaller.Installer.AdvertiseProduct(System.String,System.Boolean,System.String,System.Int32)"/>
+            <remarks><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiadvertiseproduct.asp">MsiAdvertiseProduct</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiadvertiseproductex.asp">MsiAdvertiseProductEx</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.GenerateAdvertiseScript(System.String,System.String,System.String,System.Int32,System.Reflection.ProcessorArchitecture,System.Boolean)">
+            <summary>
+            Generates an advertise script. The method enables the installer to write to a 
+            script the registry and shortcut information used to assign or publish a product.
+            </summary>
+            <param name="packagePath">Path to the package of the product being advertised</param>
+            <param name="scriptFilePath">path to script file to be created with the advertise information</param>
+            <param name="transforms">Semi-colon delimited list of transforms to be applied. This parameter may be null.</param>
+            <param name="locale">The language to use if the source supports multiple languages</param>
+            <param name="processor">Targeted processor architecture.</param>
+            <param name="instance">True to install multiple instances through product code changing transform.
+            Advertises a new instance of the product. Requires that the <paramref name="transforms"/> parameter
+            includes the instance transform that changes the product code.</param>
+            <seealso cref="M:Microsoft.Deployment.WindowsInstaller.Installer.AdvertiseProduct(System.String,System.Boolean,System.String,System.Int32)"/>
+            <remarks><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiadvertiseproduct.asp">MsiAdvertiseProduct</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiadvertiseproductex.asp">MsiAdvertiseProductEx</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.AdvertiseScript(System.String,System.Int32,System.Boolean)">
+            <summary>
+            Copies an advertise script file to the local computer.
+            </summary>
+            <param name="scriptFile">Path to a script file generated by
+            <see cref="M:Microsoft.Deployment.WindowsInstaller.Installer.GenerateAdvertiseScript(System.String,System.String,System.String,System.Int32,System.Reflection.ProcessorArchitecture,System.Boolean)"/></param>
+            <param name="flags">Flags controlling advertisement</param>
+            <param name="removeItems">True if specified items are to be removed instead of being created</param>
+            <remarks><p>
+            The process calling this function must be running under the LocalSystem account. To advertise an
+            application for per-user installation to a targeted user, the thread that calls this function must
+            impersonate the targeted user. If the thread calling this function is not impersonating a targeted
+            user, the application is advertised to all users for installation with elevated privileges.
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.ProcessAdvertiseScript(System.String,System.String,System.Boolean,System.Boolean)">
+            <summary>
+            Processes an advertise script file into the specified locations.
+            </summary>
+            <param name="scriptFile">Path to a script file generated by
+            <see cref="M:Microsoft.Deployment.WindowsInstaller.Installer.GenerateAdvertiseScript(System.String,System.String,System.String,System.Int32,System.Reflection.ProcessorArchitecture,System.Boolean)"/></param>
+            <param name="iconFolder">An optional path to a folder in which advertised icon files and transform
+            files are located. If this parameter is null, no icon or transform files are written.</param>
+            <param name="shortcuts">True if shortcuts should be created</param>
+            <param name="removeItems">True if specified items are to be removed instead of created</param>
+            <remarks><p>
+            The process calling this function must be running under the LocalSystem account. To advertise an
+            application for per-user installation to a targeted user, the thread that calls this function must
+            impersonate the targeted user. If the thread calling this function is not impersonating a targeted
+            user, the application is advertised to all users for installation with elevated privileges.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiprocessadvertisescript.asp">MsiProcessAdvertiseScript</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.GetProductInfoFromScript(System.String)">
+            <summary>
+            Gets product information for an installer script file.
+            </summary>
+            <param name="scriptFile">Path to a script file generated by
+            <see cref="M:Microsoft.Deployment.WindowsInstaller.Installer.GenerateAdvertiseScript(System.String,System.String,System.String,System.Int32,System.Reflection.ProcessorArchitecture,System.Boolean)"/></param>
+            <returns>ProductInstallation stub with advertise-related properties filled in.</returns>
+            <exception cref="T:System.ArgumentOutOfRangeException">An invalid product property was requested</exception>
+            <remarks><p>
+            Only the following properties will be filled in in the returned object:<ul>
+            <li><see cref="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.ProductCode"/></li>
+            <li><see cref="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.AdvertisedLanguage"/></li>
+            <li><see cref="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.AdvertisedVersion"/></li>
+            <li><see cref="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.AdvertisedProductName"/></li>
+            <li><see cref="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.AdvertisedPackageName"/></li>
+            </ul>Other properties will be null.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigetproductinfofromscript.asp">MsiGetProductInfoFromScript</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.GetErrorMessage(System.Int32)">
+            <summary>
+            Gets a Windows Installer error message in the system default language.
+            </summary>
+            <param name="errorNumber">The error number.</param>
+            <returns>The message string, or null if the error message is not found.</returns>
+            <remarks><p>
+            The returned string may have tokens such as [2] and [3] that are meant to be substituted
+            with context-specific values.
+            </p><p>
+            Error numbers greater than 2000 refer to MSI "internal" errors, and are always
+            returned in English.
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.GetErrorMessage(System.Int32,System.Globalization.CultureInfo)">
+            <summary>
+            Gets a Windows Installer error message in a specified language.
+            </summary>
+            <param name="errorNumber">The error number.</param>
+            <param name="culture">The locale for the message.</param>
+            <returns>The message string, or null if the error message or locale is not found.</returns>
+            <remarks><p>
+            The returned string may have tokens such as [2] and [3] that are meant to be substituted
+            with context-specific values.
+            </p><p>
+            Error numbers greater than 2000 refer to MSI "internal" errors, and are always
+            returned in English.
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.GetErrorMessage(Microsoft.Deployment.WindowsInstaller.Record)">
+            <summary>
+            Gets a formatted Windows Installer error message in the system default language.
+            </summary>
+            <param name="errorRecord">Error record containing the error number in the first field, and
+            error-specific parameters in the other fields.</param>
+            <returns>The message string, or null if the error message is not found.</returns>
+            <remarks><p>
+            Error numbers greater than 2000 refer to MSI "internal" errors, and are always
+            returned in English.
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.GetErrorMessage(Microsoft.Deployment.WindowsInstaller.Record,System.Globalization.CultureInfo)">
+            <summary>
+            Gets a formatted Windows Installer error message in a specified language.
+            </summary>
+            <param name="errorRecord">Error record containing the error number in the first field, and
+            error-specific parameters in the other fields.</param>
+            <param name="culture">The locale for the message.</param>
+            <returns>The message string, or null if the error message or locale is not found.</returns>
+            <remarks><p>
+            Error numbers greater than 2000 refer to MSI "internal" errors, and are always
+            returned in English.
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.GetFileVersion(System.String)">
+            <summary>
+            Gets the version string of the path specified using the format that the installer
+            expects to find it in in the database.
+            </summary>
+            <param name="path">Path to the file</param>
+            <returns>Version string in the "#.#.#.#" format, or an empty string if the file
+            does not contain version information</returns>
+            <exception cref="T:System.IO.FileNotFoundException">the file does not exist or could not be read</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigetfileversion.asp">MsiGetFileVersion</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.GetFileLanguage(System.String)">
+            <summary>
+            Gets the language string of the path specified using the format that the installer
+            expects to find them in in the database.
+            </summary>
+            <param name="path">Path to the file</param>
+            <returns>Language string in the form of a decimal language ID, or an empty string if the file
+            does not contain a language ID</returns>
+            <exception cref="T:System.IO.FileNotFoundException">the file does not exist or could not be read</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigetfileversion.asp">MsiGetFileVersion</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.GetFileHash(System.String,System.Int32[])">
+            <summary>
+            Gets a 128-bit hash of the specified file.
+            </summary>
+            <param name="path">Path to the file</param>
+            <param name="hash">Integer array of length 4 which receives the
+            four 32-bit parts of the hash value.</param>
+            <exception cref="T:System.IO.FileNotFoundException">the file does not exist or
+            could not be read</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigetfilehash.asp">MsiGetFileHash</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.GetShortcutTarget(System.String)">
+            <summary>
+            Examines a shortcut and returns its product, feature name, and component if available.
+            </summary>
+            <param name="shortcut">Full path to a shortcut</param>
+            <returns>ShortcutTarget structure containing target product code, feature, and component code</returns>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigetshortcuttarget.asp">MsiGetShortcutTarget</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.VerifyPackage(System.String)">
+            <summary>
+            Verifies that the given file is an installation package.
+            </summary>
+            <param name="packagePath">Path to the package</param>
+            <returns>True if the file is an installation package; false otherwise.</returns>
+            <exception cref="T:System.IO.FileNotFoundException">the specified package file does not exist</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the package file could not be opened</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiverifypackage.asp">MsiVerifyPackage</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Installer.GetPatchFileList(System.String,System.Collections.Generic.IList{System.String})">
+            <summary>
+            [MSI 4.0] Gets the list of files that can be updated by one or more patches.
+            </summary>
+            <param name="productCode">ProductCode (GUID) of the product which is
+            the target of the patches</param>
+            <param name="patches">list of file paths of one or more patches to be
+            analyzed</param>
+            <returns>List of absolute paths of files that can be updated when the
+            patches are applied on this system.</returns>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigetpatchfilelist.asp">MsiGetPatchFileList</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Installer.RebootRequired">
+            <summary>
+            Indicates whether a system reboot is required after running an installation or configuration operation.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Installer.RebootInitiated">
+            <summary>
+            Indicates whether a system reboot has been initiated after running an installation or configuration operation.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Installer.Version">
+            <summary>
+            Gets the current version of the installer.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.FeatureInfoCollection">
+            <summary>
+            Accessor for information about features within the context of an installation session.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.FeatureInfoCollection.Contains(System.String)">
+            <summary>
+            Checks if the collection contains a feature.
+            </summary>
+            <param name="feature">name of the feature</param>
+            <returns>true if the feature is in the collection, else false</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.FeatureInfoCollection.CopyTo(Microsoft.Deployment.WindowsInstaller.FeatureInfo[],System.Int32)">
+            <summary>
+            Copies the features into an array.
+            </summary>
+            <param name="array">array that receives the features</param>
+            <param name="arrayIndex">offset into the array</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.FeatureInfoCollection.GetEnumerator">
+            <summary>
+            Enumerates the features in the collection.
+            </summary>
+            <returns>an enumerator over all features in the collection</returns>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.FeatureInfoCollection.Item(System.String)">
+            <summary>
+            Gets information about a feature within the context of an installation session.
+            </summary>
+            <param name="feature">name of the feature</param>
+            <returns>feature object</returns>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.FeatureInfoCollection.Count">
+            <summary>
+            Gets the number of features defined for the product.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.FeatureInfo">
+            <summary>
+            Provides access to information about a feature within the context of an installation session.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.FeatureInfo.GetCost(System.Boolean,System.Boolean,Microsoft.Deployment.WindowsInstaller.InstallState)">
+            <summary>
+            Calculates the disk space required by the feature and its selected children and parent features.
+            </summary>
+            <param name="includeParents">If true, the parent features are included in the cost.</param>
+            <param name="includeChildren">If true, the child features are included in the cost.</param>
+            <param name="installState">Specifies the installation state.</param>
+            <returns>The disk space requirement in bytes.</returns>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigetfeaturecost.asp">MsiGetFeatureCost</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.FeatureInfo.Name">
+            <summary>
+            Gets the name of the feature (primary key in the Feature table).
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.FeatureInfo.CurrentState">
+            <summary>
+            Gets the current install state of the feature.
+            </summary>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Session handle is invalid</exception>
+            <exception cref="T:System.ArgumentException">an unknown feature was requested</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigetfeaturestate.asp">MsiGetFeatureState</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.FeatureInfo.RequestState">
+            <summary>
+            Gets or sets the action state of the feature.
+            </summary>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Session handle is invalid</exception>
+            <exception cref="T:System.ArgumentException">an unknown feature was requested</exception>
+            <remarks><p>
+            When changing the feature action, the action state of all the Components linked to the changed
+            Feature records are also updated appropriately, based on the new feature Select state.
+            All Features can be configured at once by specifying the keyword ALL instead of a specific feature name.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigetfeaturestate.asp">MsiGetFeatureState</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisetfeaturestate.asp">MsiSetFeatureState</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.FeatureInfo.ValidStates">
+            <summary>
+            Gets a list of valid installation states for the feature.
+            </summary>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Session handle is invalid</exception>
+            <exception cref="T:System.ArgumentException">an unknown feature was requested</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigetfeaturevalidstates.asp">MsiGetFeatureValidStates</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.FeatureInfo.Attributes">
+            <summary>
+            Gets or sets the attributes of the feature.
+            </summary>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Session handle is invalid</exception>
+            <exception cref="T:System.ArgumentException">an unknown feature was requested</exception>
+            <remarks><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigetfeatureinfo.asp">MsiGetFeatureInfo</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisetfeatureattributes.asp">MsiSetFeatureAttributes</a>
+            </p><p>
+            Since the lpAttributes paramter of
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigetfeatureinfo.asp">MsiGetFeatureInfo</a>
+            does not contain an equivalent flag for <see cref="F:Microsoft.Deployment.WindowsInstaller.FeatureAttributes.UIDisallowAbsent"/>, this flag will
+            not be retrieved.
+            </p><p>
+            Since the dwAttributes parameter of 
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisetfeatureattributes.asp">MsiSetFeatureAttributes</a>
+            does not contain an equivalent flag for <see cref="F:Microsoft.Deployment.WindowsInstaller.FeatureAttributes.UIDisallowAbsent"/>, the presence
+            of this flag will be ignored.
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.FeatureInfo.Title">
+            <summary>
+            Gets the title of the feature.
+            </summary>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Session handle is invalid</exception>
+            <exception cref="T:System.ArgumentException">an unknown feature was requested</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigetfeatureinfo.asp">MsiGetFeatureInfo</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.FeatureInfo.Description">
+            <summary>
+            Gets the description of the feature.
+            </summary>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Session handle is invalid</exception>
+            <exception cref="T:System.ArgumentException">an unknown feature was requested</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigetfeatureinfo.asp">MsiGetFeatureInfo</a>
+            </p></remarks>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.FeatureInstallation">
+            <summary>
+            Represents an instance of a feature of an installed product.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.FeatureInstallation.#ctor(System.String,System.String)">
+            <summary>
+            Creates a new FeatureInstallation instance for a feature of a product.
+            </summary>
+            <param name="featureName">feature name</param>
+            <param name="productCode">ProductCode GUID</param>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.FeatureInstallation.FeatureName">
+            <summary>
+            Gets the name of the feature.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.FeatureInstallation.State">
+            <summary>
+            Gets the installed state of the feature.
+            </summary>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiqueryfeaturestate.asp">MsiQueryFeatureState</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.FeatureInstallation.Parent">
+            <summary>
+            Gets the parent of the feature, or null if the feature has no parent (it is a root feature).
+            </summary>
+            <remarks>
+            Invocation of this property may be slightly costly for products with many features,
+            because it involves an enumeration of all the features in the product.
+            </remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.FeatureInstallation.Usage">
+            <summary>
+            Gets the usage metrics for the feature.
+            </summary>
+            <remarks><p>
+            If no usage metrics are recorded, the <see cref="P:Microsoft.Deployment.WindowsInstaller.FeatureInstallation.UsageData.UseCount"/> value is 0.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigetfeatureusage.asp">MsiGetFeatureUsage</a>
+            </p></remarks>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.FeatureInstallation.UsageData">
+            <summary>
+            Holds data about the usage of a feature.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.FeatureInstallation.UsageData.UseCount">
+            <summary>
+            Gets count of the number of times the feature has been used.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.FeatureInstallation.UsageData.LastUsedDate">
+            <summary>
+            Gets the date the feature was last used.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.IEmbeddedUI">
+            <summary>
+            [MSI 4.5] Interface for an embedded external user interface for an installation.
+            </summary>
+            <remarks>
+            Classes which implement this interface must have a public constructor that takes no parameters.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.IEmbeddedUI.Initialize(Microsoft.Deployment.WindowsInstaller.Session,System.String,Microsoft.Deployment.WindowsInstaller.InstallUIOptions@)">
+            <summary>
+            Initializes the embedded UI.
+            </summary>
+            <param name="session">Handle to the installer which can be used to get and set properties.
+            The handle is only valid for the duration of this method call.</param>
+            <param name="resourcePath">Path to the directory that contains all the files from the MsiEmbeddedUI table.</param>
+            <param name="internalUILevel">On entry, contains the current UI level for the installation. After this
+            method returns, the installer resets the UI level to the returned value of this parameter.</param>
+            <returns>True if the embedded UI was successfully initialized; false if the installation
+            should continue without the embedded UI.</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallCanceledException">The installation was canceled by the user.</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">The embedded UI failed to initialize and
+            causes the installation to fail.</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/initializeembeddedui.asp">InitializeEmbeddedUI</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.IEmbeddedUI.ProcessMessage(Microsoft.Deployment.WindowsInstaller.InstallMessage,Microsoft.Deployment.WindowsInstaller.Record,Microsoft.Deployment.WindowsInstaller.MessageButtons,Microsoft.Deployment.WindowsInstaller.MessageIcon,Microsoft.Deployment.WindowsInstaller.MessageDefaultButton)">
+            <summary>
+            Processes information and progress messages sent to the user interface.
+            </summary>
+            <param name="messageType">Message type.</param>
+            <param name="messageRecord">Record that contains message data.</param>
+            <param name="buttons">Message buttons.</param>
+            <param name="icon">Message box icon.</param>
+            <param name="defaultButton">Message box default button.</param>
+            <returns>Result of processing the message.</returns>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/embeddeduihandler.asp">EmbeddedUIHandler</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.IEmbeddedUI.Shutdown">
+            <summary>
+            Shuts down the embedded UI at the end of the installation.
+            </summary>
+            <remarks>
+            If the installation was canceled during initialization, this method will not be called.
+            If the installation was canceled or failed at any later point, this method will be called at the end.
+            <p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/shutdownembeddedui.asp">ShutdownEmbeddedUI</a>
+            </p></remarks>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.Installation">
+            <summary>
+            Subclasses of this abstract class represent a unique instance of a
+            registered product or patch installation.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Installation.UserSid">
+            <summary>
+            Gets the user security identifier (SID) under which this product or patch
+            installation is available.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Installation.Context">
+            <summary>
+            Gets the user context of this product or patch installation.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Installation.SourceList">
+            <summary>
+            Gets the source list of this product or patch installation.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Installation.IsInstalled">
+            <summary>
+            Gets a value indicating whether this product or patch is installed on the current system.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Installation.Item(System.String)">
+            <summary>
+            Gets a property about the product or patch installation.
+            </summary>
+            <param name="propertyName">Name of the property being retrieved.</param>
+            <returns></returns>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.InstallCost">
+            <summary>
+            Represents a per-drive disk space cost for an installation.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.InstallCost.#ctor(System.String,System.Int64,System.Int64)">
+            <summary>
+            Creates a new InstallCost object.
+            </summary>
+            <param name="driveName">name of the drive this cost data applies to</param>
+            <param name="cost">installation cost on this drive, as a number of bytes</param>
+            <param name="tempCost">temporary disk space required on this drive, as a number of bytes</param>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.InstallCost.DriveName">
+            <summary>
+            The name of the drive this cost data applies to.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.InstallCost.Cost">
+            <summary>
+            The installation cost on this drive, as a number of bytes.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.InstallCost.TempCost">
+            <summary>
+            The temporary disk space required on this drive, as a number of bytes.
+            </summary>
+            <remarks><p>
+            This temporary space requirement is space needed only for the duration
+            of the installation, over the final footprint on disk.
+            </p></remarks>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.InapplicablePatchHandler">
+            <summary>
+            Receives an exception from
+            <see cref="M:Microsoft.Deployment.WindowsInstaller.Installer.DetermineApplicablePatches(System.String,System.String[],Microsoft.Deployment.WindowsInstaller.InapplicablePatchHandler,System.String,Microsoft.Deployment.WindowsInstaller.UserContexts)"/>
+            indicating the reason a particular patch is not applicable to a product.
+            </summary>
+            <param name="patch">MSP file path, XML file path, or XML blob that was passed to 
+            <see cref="M:Microsoft.Deployment.WindowsInstaller.Installer.DetermineApplicablePatches(System.String,System.String[],Microsoft.Deployment.WindowsInstaller.InapplicablePatchHandler,System.String,Microsoft.Deployment.WindowsInstaller.UserContexts)"/></param>
+            <param name="exception">exception indicating the reason the patch is not applicable</param>
+            <remarks><p>
+            If <paramref name="exception"/> is an <see cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException"/> or subclass, then
+            its <see cref="P:Microsoft.Deployment.WindowsInstaller.InstallerException.ErrorCode"/> and <see cref="P:Microsoft.Deployment.WindowsInstaller.InstallerException.Message"/>
+            properties will indicate a more specific reason the patch was not applicable.
+            </p><p>
+            The <paramref name="exception"/> could also be a FileNotFoundException if the
+            patch string was a file path.
+            </p></remarks>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.Transaction">
+            <summary>
+            [MSI 4.5] Handle to a multi-session install transaction.
+            </summary>
+            <remarks><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msibegintransaction.asp">MsiBeginTransaction</a>
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msijointransaction.asp">MsiJoinTransaction</a>
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiendtransaction.asp">MsiEndTransaction</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Transaction.#ctor(System.String,Microsoft.Deployment.WindowsInstaller.TransactionAttributes)">
+            <summary>
+            [MSI 4.5] Begins transaction processing of a multi-package installation.
+            </summary>
+            <param name="name">Name of the multi-package installation.</param>
+            <param name="attributes">Select optional behavior when beginning the transaction.</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">The transaction could not be initialized.</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msibegintransaction.asp">MsiBeginTransaction</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Transaction.#ctor(System.String,System.IntPtr[],System.Boolean)">
+            <summary>
+            Internal constructor.
+            </summary>
+            <remarks>
+            The second parameter is an array in order to receive multiple values from the initialization method.
+            </remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Transaction.FromHandle(System.IntPtr,System.Boolean)">
+            <summary>
+            Creates a new Transaction object from an integer handle.
+            </summary>
+            <param name="handle">Integer transaction handle</param>
+            <param name="ownsHandle">true to close the handle when this object is disposed</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Transaction.Join(Microsoft.Deployment.WindowsInstaller.TransactionAttributes)">
+            <summary>
+            Makes the current process the owner of the multi-package installation transaction.
+            </summary>
+            <param name="attributes">Select optional behavior when joining the transaction.</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">The transaction handle is not valid.</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">The transaction could not be joined.</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msijointransaction.asp">MsiJoinTransaction</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Transaction.Commit">
+            <summary>
+            Ends the install transaction and commits all changes to the system belonging to the transaction.
+            </summary>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">The transaction could not be committed.</exception>
+            <remarks><p>
+            Runs any Commit Custom Actions and commits to the system any changes to Win32 or common language
+            runtime assemblies. Deletes the rollback script, and after using this option, the transaction's
+            changes can no longer be undone with a Rollback Installation.
+            </p><p>
+            This method can only be called by the current owner of the transaction.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiendtransaction.asp">MsiEndTransaction</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Transaction.Rollback">
+            <summary>
+            Ends the install transaction and undoes changes to the system belonging to the transaction.
+            </summary>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">The transaction could not be rolled back.</exception>
+            <remarks><p>
+            This method can only be called by the current owner of the transaction.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiendtransaction.asp">MsiEndTransaction</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Transaction.Name">
+            <summary>
+            Gets the name of the transaction.
+            </summary>
+        </member>
+        <member name="E:Microsoft.Deployment.WindowsInstaller.Transaction.OwnerChanged">
+            <summary>
+            Notifies listeners when the process that owns the transaction changed.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.MediaDisk">
+            <summary>
+            Represents a media disk source of a product or a patch.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.MediaDisk.#ctor(System.Int32,System.String,System.String)">
+            <summary>
+            Creates a new media disk.
+            </summary>
+            <param name="diskId"></param>
+            <param name="volumeLabel"></param>
+            <param name="diskPrompt"></param>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.MediaDisk.DiskId">
+            <summary>
+            Gets or sets the disk id of the media disk.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.MediaDisk.VolumeLabel">
+            <summary>
+            Gets or sets the volume label of the media disk.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.MediaDisk.DiskPrompt">
+            <summary>
+            Gets or sets the disk prompt of the media disk.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.PatchInstallation">
+            <summary>
+            The Patch object represents a unique instance of a patch that has been
+            registered or applied.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.PatchInstallation.GetPatches(System.String,System.String,System.String,Microsoft.Deployment.WindowsInstaller.UserContexts,Microsoft.Deployment.WindowsInstaller.PatchStates)">
+            <summary>
+            Enumerates patch installations based on certain criteria.
+            </summary>
+            <param name="patchCode">PatchCode (GUID) of the patch to be enumerated. Only
+            instances of patches within the scope of the context specified by the
+            <paramref name="userSid"/> and <paramref name="context"/> parameters will be
+            enumerated. This parameter may be set to null to enumerate all patches in the specified
+            context.</param>
+            <param name="targetProductCode">ProductCode (GUID) product whose patches are to be
+            enumerated. If non-null, patch enumeration is restricted to instances of this product
+            within the specified context. If null, the patches for all products under the specified
+            context are enumerated.</param>
+            <param name="userSid">Specifies a security identifier (SID) that restricts the context
+            of enumeration. A SID value other than s-1-1-0 is considered a user SID and restricts
+            enumeration to the current user or any user in the system. The special SID string
+            s-1-1-0 (Everyone) specifies enumeration across all users in the system. This parameter
+            can be set to null to restrict the enumeration scope to the current user. When
+            <paramref name="installContext"/> is set to the machine context only,
+            <paramref name="userSid"/> must be null.</param>
+            <param name="context">Specifies the user context.</param>
+            <param name="states">The <see cref="T:Microsoft.Deployment.WindowsInstaller.PatchStates"/> of patches to return.</param>
+            <remarks><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msienumpatchesex.asp">MsiEnumPatchesEx</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.PatchInstallation.#ctor(System.String,System.String)">
+            <summary>
+            Creates a new object for accessing information about a patch installation on the current system.
+            </summary>
+            <param name="patchCode">Patch code (GUID) of the patch.</param>
+            <param name="productCode">ProductCode (GUID) the patch has been applied to.
+            This parameter may be null for patches that are registered only and not yet
+            applied to any product.</param>
+            <remarks><p>
+            All available user contexts will be queried.
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.PatchInstallation.#ctor(System.String,System.String,System.String,Microsoft.Deployment.WindowsInstaller.UserContexts)">
+            <summary>
+            Creates a new object for accessing information about a patch installation on the current system.
+            </summary>
+            <param name="patchCode">Registered patch code (GUID) of the patch.</param>
+            <param name="productCode">ProductCode (GUID) the patch has been applied to.
+            This parameter may be null for patches that are registered only and not yet
+            applied to any product.</param>
+            <param name="userSid">The specific user, when working in a user context.  This
+            parameter may be null to indicate the current user.  The parameter must be null
+            when working in a machine context.</param>
+            <param name="context">The user context. The calling process must have administrative
+            privileges to get information for a product installed for a user other than the
+            current user.</param>
+            <remarks><p>
+            If the <paramref name="productCode"/> is null, the Patch object may
+            only be used to read and update the patch's SourceList information.
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.PatchInstallation.AllPatches">
+            <summary>
+            Enumerates all patch installations on the system.
+            </summary>
+            <returns>Enumeration of patch objects.</returns>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msienumpatches.asp">MsiEnumPatches</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.PatchInstallation.PatchCode">
+            <summary>
+            Gets the patch code (GUID) of the patch.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.PatchInstallation.ProductCode">
+            <summary>
+            Gets the ProductCode (GUID) of the product.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.PatchInstallation.IsInstalled">
+            <summary>
+            Gets a value indicating whether this patch is currently installed.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.PatchInstallation.IsObsoleted">
+            <summary>
+            Gets a value indicating whether this patch is marked as obsolte.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.PatchInstallation.IsSuperseded">
+            <summary>
+            Gets a value indicating whether this patch is present but has been
+            superseded by a more recent installed patch.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.PatchInstallation.State">
+            <summary>
+            Gets the installation state of this instance of the patch.
+            </summary>
+            <exception cref="T:System.ArgumentException">An unknown patch was requested</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">The installer configuration data is corrupt</exception>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.PatchInstallation.LocalPackage">
+            <summary>
+            Gets the cached patch file that the product uses.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.PatchInstallation.Transforms">
+            <summary>
+            Gets the set of patch transforms that the last patch
+            installation applied to the product.
+            </summary>
+            <remarks><p>
+            This value may not be available for per-user, non-managed applications
+            if the user is not logged on.
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.PatchInstallation.InstallDate">
+            <summary>
+            Gets the date and time when the patch is applied to the product.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.PatchInstallation.Uninstallable">
+            <summary>
+            True patch is marked as possible to uninstall from the product.
+            </summary>
+            <remarks><p>
+            Even if this property is true, the installer can still block the
+            uninstallation if this patch is required by another patch that
+            cannot be uninstalled.
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.PatchInstallation.DisplayName">
+            <summary>
+            Get the registered display name for the patch.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.PatchInstallation.MoreInfoUrl">
+            <summary>
+            Gets the registered support information URL for the patch.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.PatchInstallation.Item(System.String)">
+            <summary>
+            Gets information about a specific patch installation. 
+            </summary>
+            <param name="propertyName">The property being retrieved; see remarks for valid properties.</param>
+            <returns>The property value, or an empty string if the property is not set for the patch.</returns>
+            <exception cref="T:System.ArgumentOutOfRangeException">An unknown patch or property was requested</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">The installer configuration data is corrupt</exception>
+            <remarks><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigetpatchinfo.asp">MsiGetPatchInfo</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigetpatchinfoex.asp">MsiGetPatchInfoEx</a>
+            </p></remarks>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.ProductInstallation">
+            <summary>
+            Represents a unique instance of a product that
+            is either advertised, installed or unknown.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.ProductInstallation.GetRelatedProducts(System.String)">
+            <summary>
+            Gets the set of all products with a specified upgrade code. This method lists the
+            currently installed and advertised products that have the specified UpgradeCode
+            property in their Property table.
+            </summary>
+            <param name="upgradeCode">Upgrade code of related products</param>
+            <returns>Enumeration of product codes</returns>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msienumrelatedproducts.asp">MsiEnumRelatedProducts</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.ProductInstallation.GetProducts(System.String,System.String,Microsoft.Deployment.WindowsInstaller.UserContexts)">
+            <summary>
+            Enumerates product installations based on certain criteria.
+            </summary>
+            <param name="productCode">ProductCode (GUID) of the product instances to be enumerated. Only
+            instances of products within the scope of the context specified by the
+            <paramref name="userSid"/> and <paramref name="installContext"/> parameters will be
+            enumerated. This parameter may be set to null to enumerate all products in the specified
+            context.</param>
+            <param name="userSid">Specifies a security identifier (SID) that restricts the context
+            of enumeration. A SID value other than s-1-1-0 is considered a user SID and restricts
+            enumeration to the current user or any user in the system. The special SID string
+            s-1-1-0 (Everyone) specifies enumeration across all users in the system. This parameter
+            can be set to null to restrict the enumeration scope to the current user. When
+            <paramref name="context"/> is set to the machine context only,
+            <paramref name="userSid"/> must be null.</param>
+            <param name="context">Specifies the user context.</param>
+            <returns>An enumeration of product objects for enumerated product instances.</returns>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msienumproductsex.asp">MsiEnumProductsEx</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.ProductInstallation.#ctor(System.String)">
+            <summary>
+            Creates a new object for accessing information about a product installation on the current system.
+            </summary>
+            <param name="productCode">ProductCode (GUID) of the product.</param>
+            <remarks><p>
+            All available user contexts will be queried.
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.ProductInstallation.#ctor(System.String,System.String,Microsoft.Deployment.WindowsInstaller.UserContexts)">
+            <summary>
+            Creates a new object for accessing information about a product installation on the current system.
+            </summary>
+            <param name="productCode">ProductCode (GUID) of the product.</param>
+            <param name="userSid">The specific user, when working in a user context.  This
+            parameter may be null to indicate the current user.  The parameter must be null
+            when working in a machine context.</param>
+            <param name="context">The user context. The calling process must have administrative
+            privileges to get information for a product installed for a user other than the
+            current user.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.ProductInstallation.GetFeatureState(System.String)">
+            <summary>
+            Gets the installed state for a product feature.
+            </summary>
+            <param name="feature">The feature being queried; identifier from the
+            Feature table</param>
+            <returns>Installation state of the feature for the product instance: either
+            <see cref="F:Microsoft.Deployment.WindowsInstaller.InstallState.Local"/>, <see cref="F:Microsoft.Deployment.WindowsInstaller.InstallState.Source"/>,
+            or <see cref="F:Microsoft.Deployment.WindowsInstaller.InstallState.Advertised"/>.</returns>
+            <remarks><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiqueryfeaturestate.asp">MsiQueryFeatureState</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiqueryfeaturestateex.asp">MsiQueryFeatureStateEx</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.ProductInstallation.GetComponentState(System.String)">
+            <summary>
+            Gets the installed state for a product component.
+            </summary>
+            <param name="component">The component being queried; GUID of the component
+            as found in the ComponentId column of the Component table.</param>
+            <returns>Installation state of the component for the product instance: either
+            <see cref="F:Microsoft.Deployment.WindowsInstaller.InstallState.Local"/> or <see cref="F:Microsoft.Deployment.WindowsInstaller.InstallState.Source"/>.</returns>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiquerycomponnetstate.asp">MsiQueryComponentState</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.ProductInstallation.CollectUserInfo">
+            <summary>
+            Obtains and stores the user information and product ID from an installation wizard.
+            </summary>
+            <remarks><p>
+            This method is typically called by an application during the first run of the application. The application
+            first gets the <see cref="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.ProductId"/> or <see cref="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.RegOwner"/>.
+            If those properties are missing, the application calls CollectUserInfo.
+            CollectUserInfo opens the product's installation package and invokes a wizard sequence that collects
+            user information. Upon completion of the sequence, user information is registered. Since this API requires
+            an authored user interface, the user interface level should be set to full by calling
+            <see cref="M:Microsoft.Deployment.WindowsInstaller.Installer.SetInternalUI(Microsoft.Deployment.WindowsInstaller.InstallUIOptions)"/> as <see cref="F:Microsoft.Deployment.WindowsInstaller.InstallUIOptions.Full"/>.
+            </p><p>
+            The CollectUserInfo method invokes a FirstRun dialog from the product installation database.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msicollectuserinfo.asp">MsiCollectUserInfo</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.ProductInstallation.ParseVersion(System.String)">
+            <summary>
+            Some products might write some invalid/nonstandard version strings to the registry.
+            This method tries to get the best data it can.
+            </summary>
+            <param name="ver">Version string retrieved from the registry.</param>
+            <returns>Version object, or null if the version string is completely invalid.</returns>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.AllProducts">
+            <summary>
+            Enumerates all product installations on the system.
+            </summary>
+            <returns>An enumeration of product objects.</returns>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msienumproducts.asp">MsiEnumProducts</a>,
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.Features">
+            <summary>
+            Gets the set of published features for the product.
+            </summary>
+            <returns>Enumeration of published features for the product.</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">The installer configuration data is corrupt</exception>
+            <remarks><p>
+            Because features are not ordered, any new feature has an arbitrary index, meaning
+            this property can return features in any order.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msienumfeatures.asp">MsiEnumFeatures</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.ProductCode">
+            <summary>
+            Gets the ProductCode (GUID) of the product.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.IsInstalled">
+            <summary>
+            Gets a value indicating whether this product is installed on the current system.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.IsAdvertised">
+            <summary>
+            Gets a value indicating whether this product is advertised on the current system.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.IsElevated">
+            <summary>
+            Checks whether the product is installed with elevated privileges. An application is called
+            a "managed application" if elevated (system) privileges are used to install the application.
+            </summary>
+            <returns>True if the product is elevated; false otherwise</returns>
+            <remarks><p>
+            Note that this property does not take into account policies such as AlwaysInstallElevated,
+            but verifies that the local system owns the product's registry data.
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.SourceList">
+            <summary>
+            Gets the source list of this product installation.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.HelpLink">
+            <summary>
+            The support link.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.HelpTelephone">
+            <summary>
+            The support telephone.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.InstallDate">
+            <summary>
+            Date and time the product was installed.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.ProductName">
+            <summary>
+            The installed product name.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.InstallLocation">
+            <summary>
+            The installation location.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.InstallSource">
+            <summary>
+            The installation source.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.LocalPackage">
+            <summary>
+            The local cached package.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.Publisher">
+            <summary>
+            The publisher.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.UrlInfoAbout">
+            <summary>
+            URL about information.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.UrlUpdateInfo">
+            <summary>
+            The URL update information.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.ProductVersion">
+            <summary>
+            The product version.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.ProductId">
+            <summary>
+            The product identifier.
+            </summary>
+            <remarks><p>
+            For more information, see
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/productid.asp">ProductID</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.RegCompany">
+            <summary>
+            The company that is registered to use the product.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.RegOwner">
+            <summary>
+            The owner who is registered to use the product.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.AdvertisedTransforms">
+            <summary>
+            Transforms.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.AdvertisedLanguage">
+            <summary>
+            Product language.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.AdvertisedProductName">
+            <summary>
+            Human readable product name.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.AdvertisedPerMachine">
+            <summary>
+            True if the product is advertised per-machine;
+            false if it is per-user or not advertised.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.AdvertisedPackageCode">
+            <summary>
+            Identifier of the package that a product is installed from.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.AdvertisedVersion">
+            <summary>
+            Version of the advertised product.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.AdvertisedProductIcon">
+            <summary>
+            Primary icon for the package.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.AdvertisedPackageName">
+            <summary>
+            Name of the installation package for the advertised product.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.PrivilegedPatchingAuthorized">
+            <summary>
+            True if the advertised product can be serviced by
+            non-administrators without elevation.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ProductInstallation.Item(System.String)">
+            <summary>
+            Gets information about an installation of a product. 
+            </summary>
+            <param name="propertyName">Name of the property being retrieved.</param>
+            <exception cref="T:System.ArgumentOutOfRangeException">An unknown product or property was requested</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">The installer configuration data is corrupt</exception>
+            <remarks><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigetproductinfo.asp">MsiGetProductInfo</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigetproductinfoex.asp">MsiGetProductInfoEx</a>
+            </p></remarks>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.Record">
+            <summary>
+            The Record object is a container for holding and transferring a variable number of values.
+            Fields within the record are numerically indexed and can contain strings, integers, streams,
+            and null values. Record fields are indexed starting with 1.  Field 0 is a special format field.
+            </summary>
+            <remarks><p>
+            Most methods on the Record class have overloads that allow using either a number
+            or a name to designate a field. However note that field names only exist when the
+            Record is directly returned from a query on a database. For other records, attempting
+            to access a field by name will result in an InvalidOperationException.
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Record.#ctor(System.Int32)">
+            <summary>
+            Creates a new record object with the requested number of fields.
+            </summary>
+            <param name="fieldCount">Required number of fields, which may be 0.
+            The maximum number of fields in a record is limited to 65535.</param>
+            <remarks><p>
+            The Record object should be <see cref="M:Microsoft.Deployment.WindowsInstaller.InstallerHandle.Close"/>d after use.
+            It is best that the handle be closed manually as soon as it is no longer
+            needed, as leaving lots of unused handles open can degrade performance.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msicreaterecord.asp">MsiCreateRecord</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Record.#ctor(System.Object[])">
+            <summary>
+            Creates a new record object, providing values for an arbitrary number of fields.
+            </summary>
+            <param name="fields">The values of the record fields.  The parameters should be of type Int16, Int32 or String</param>
+            <remarks><p>
+            The Record object should be <see cref="M:Microsoft.Deployment.WindowsInstaller.InstallerHandle.Close"/>d after use.
+            It is best that the handle be closed manually as soon as it is no longer
+            needed, as leaving lots of unused handles open can degrade performance.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msicreaterecord.asp">MsiCreateRecord</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Record.FromHandle(System.IntPtr,System.Boolean)">
+            <summary>
+            Creates a new Record object from an integer record handle.
+            </summary>
+            <remarks><p>
+            This method is only provided for interop purposes.  A Record object
+            should normally be obtained by calling <see cref="M:Microsoft.Deployment.WindowsInstaller.View.Fetch"/>
+            other methods.
+            <p>The handle will be closed when this object is disposed or finalized.</p>
+            </p></remarks>
+            <param name="handle">Integer record handle</param>
+            <param name="ownsHandle">true to close the handle when this object is disposed or finalized</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Record.Clear">
+            <summary>
+            Sets all fields in a record to null.
+            </summary>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msirecordcleardata.asp">MsiRecordClearData</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Record.IsNull(System.Int32)">
+            <summary>
+            Reports whether a record field is null.
+            </summary>
+            <param name="field">Specifies the field to check.</param>
+            <returns>True if the field is null, false otherwise.</returns>
+            <exception cref="T:System.ArgumentOutOfRangeException">The field is less than 0 or greater than the
+            number of fields in the Record.</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msirecordisnull.asp">MsiRecordIsNull</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Record.IsNull(System.String)">
+            <summary>
+            Reports whether a record field is null.
+            </summary>
+            <param name="fieldName">Specifies the field to check.</param>
+            <returns>True if the field is null, false otherwise.</returns>
+            <exception cref="T:System.ArgumentOutOfRangeException">The field name does not match any
+            of the named fields in the Record.</exception>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Record.GetDataSize(System.Int32)">
+            <summary>
+            Gets the length of a record field. The count does not include the terminating null.
+            </summary>
+            <exception cref="T:System.ArgumentOutOfRangeException">The field is less than 0 or greater than the
+            number of fields in the Record.</exception>
+            <remarks><p>
+            The returned data size is 0 if the field is null, non-existent,
+            or an internal object pointer. The method also returns 0 if the handle is not a valid
+            Record handle.
+            </p><p>
+            If the data is in integer format, the property returns 2 or 4.
+            </p><p>
+            If the data is in string format, the property returns the character count
+            (not including the NULL terminator).
+            </p><p>
+            If the data is in stream format, the property returns the byte count.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msirecorddatasize.asp">MsiRecordDataSize</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Record.GetDataSize(System.String)">
+            <summary>
+            Gets the length of a record field. The count does not include the terminating null.
+            </summary>
+            <param name="fieldName">Specifies the field to check.</param>
+            <exception cref="T:System.ArgumentOutOfRangeException">The field name does not match any
+            of the named fields in the Record.</exception>
+            <remarks><p>The returned data size is 0 if the field is null, non-existent,
+            or an internal object pointer. The method also returns 0 if the handle is not a valid
+            Record handle.
+            </p><p>
+            If the data is in integer format, the property returns 2 or 4.
+            </p><p>
+            If the data is in string format, the property returns the character count
+            (not including the NULL terminator).
+            </p><p>
+            If the data is in stream format, the property returns the byte count.
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Record.GetInteger(System.Int32)">
+            <summary>
+            Gets a field value as an integer.
+            </summary>
+            <param name="field">Specifies the field to retrieve.</param>
+            <returns>Integer value of the field, or 0 if the field is null.</returns>
+            <exception cref="T:System.ArgumentOutOfRangeException">The field is less than 0 or greater than the
+            number of fields in the Record.</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msirecordgetinteger.asp">MsiRecordGetInteger</a>
+            </p></remarks>
+            <seealso cref="M:Microsoft.Deployment.WindowsInstaller.Record.GetNullableInteger(System.Int32)"/>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Record.GetInteger(System.String)">
+            <summary>
+            Gets a field value as an integer.
+            </summary>
+            <param name="fieldName">Specifies the field to retrieve.</param>
+            <returns>Integer value of the field, or 0 if the field is null.</returns>
+            <exception cref="T:System.ArgumentOutOfRangeException">The field name does not match any
+            of the named fields in the Record.</exception>
+            <seealso cref="M:Microsoft.Deployment.WindowsInstaller.Record.GetNullableInteger(System.String)"/>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Record.GetNullableInteger(System.Int32)">
+            <summary>
+            Gets a field value as an integer.
+            </summary>
+            <param name="field">Specifies the field to retrieve.</param>
+            <returns>Integer value of the field, or null if the field is null.</returns>
+            <exception cref="T:System.ArgumentOutOfRangeException">The field is less than 0 or greater than the
+            number of fields in the Record.</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msirecordgetinteger.asp">MsiRecordGetInteger</a>
+            </p></remarks>
+            <seealso cref="M:Microsoft.Deployment.WindowsInstaller.Record.GetInteger(System.Int32)"/>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Record.GetNullableInteger(System.String)">
+            <summary>
+            Gets a field value as an integer.
+            </summary>
+            <param name="fieldName">Specifies the field to retrieve.</param>
+            <returns>Integer value of the field, or null if the field is null.</returns>
+            <exception cref="T:System.ArgumentOutOfRangeException">The field name does not match any
+            of the named fields in the Record.</exception>
+            <seealso cref="M:Microsoft.Deployment.WindowsInstaller.Record.GetInteger(System.String)"/>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Record.SetInteger(System.Int32,System.Int32)">
+            <summary>
+            Sets the value of a field to an integer.
+            </summary>
+            <param name="field">Specifies the field to set.</param>
+            <param name="value">new value of the field</param>
+            <exception cref="T:System.ArgumentOutOfRangeException">The field is less than 0 or greater than the
+            number of fields in the Record.</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msirecordsetinteger.asp">MsiRecordSetInteger</a>
+            </p></remarks>
+            <seealso cref="M:Microsoft.Deployment.WindowsInstaller.Record.SetNullableInteger(System.Int32,System.Nullable{System.Int32})"/>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Record.SetInteger(System.String,System.Int32)">
+            <summary>
+            Sets the value of a field to an integer.
+            </summary>
+            <param name="fieldName">Specifies the field to set.</param>
+            <param name="value">new value of the field</param>
+            <exception cref="T:System.ArgumentOutOfRangeException">The field name does not match any
+            of the named fields in the Record.</exception>
+            <seealso cref="M:Microsoft.Deployment.WindowsInstaller.Record.SetNullableInteger(System.String,System.Nullable{System.Int32})"/>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Record.SetNullableInteger(System.Int32,System.Nullable{System.Int32})">
+            <summary>
+            Sets the value of a field to a nullable integer.
+            </summary>
+            <param name="field">Specifies the field to set.</param>
+            <param name="value">new value of the field</param>
+            <exception cref="T:System.ArgumentOutOfRangeException">The field is less than 0 or greater than the
+            number of fields in the Record.</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msirecordsetinteger.asp">MsiRecordSetInteger</a>
+            </p></remarks>
+            <seealso cref="M:Microsoft.Deployment.WindowsInstaller.Record.SetInteger(System.Int32,System.Int32)"/>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Record.SetNullableInteger(System.String,System.Nullable{System.Int32})">
+            <summary>
+            Sets the value of a field to a nullable integer.
+            </summary>
+            <param name="fieldName">Specifies the field to set.</param>
+            <param name="value">new value of the field</param>
+            <exception cref="T:System.ArgumentOutOfRangeException">The field name does not match any
+            of the named fields in the Record.</exception>
+            <seealso cref="M:Microsoft.Deployment.WindowsInstaller.Record.SetInteger(System.String,System.Int32)"/>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Record.GetString(System.Int32)">
+            <summary>
+            Gets a field value as a string.
+            </summary>
+            <param name="field">Specifies the field to retrieve.</param>
+            <returns>String value of the field, or an empty string if the field is null.</returns>
+            <exception cref="T:System.ArgumentOutOfRangeException">The field is less than 0 or greater than the
+            number of fields in the Record.</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msirecordgetstring.asp">MsiRecordGetString</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Record.GetString(System.String)">
+            <summary>
+            Gets a field value as a string.
+            </summary>
+            <param name="fieldName">Specifies the field to retrieve.</param>
+            <returns>String value of the field, or an empty string if the field is null.</returns>
+            <exception cref="T:System.ArgumentOutOfRangeException">The field name does not match any
+            of the named fields in the Record.</exception>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Record.SetString(System.Int32,System.String)">
+            <summary>
+            Sets the value of a field to a string.
+            </summary>
+            <param name="field">Specifies the field to set.</param>
+            <param name="value">new value of the field</param>
+            <exception cref="T:System.ArgumentOutOfRangeException">The field is less than 0 or greater than the
+            number of fields in the Record.</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msirecordsetstring.asp">MsiRecordSetString</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Record.SetString(System.String,System.String)">
+            <summary>
+            Sets the value of a field to a string.
+            </summary>
+            <param name="fieldName">Specifies the field to set.</param>
+            <param name="value">new value of the field</param>
+            <exception cref="T:System.ArgumentOutOfRangeException">The field name does not match any
+            of the named fields in the Record.</exception>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Record.GetStream(System.Int32,System.String)">
+            <summary>
+            Reads a record stream field into a file.
+            </summary>
+            <param name="field">Specifies the field of the Record to get.</param>
+            <param name="filePath">Specifies the path to the file to contain the stream.</param>
+            <exception cref="T:System.ArgumentOutOfRangeException">The field is less than 0 or greater than the
+            number of fields in the Record.</exception>
+            <exception cref="T:System.NotSupportedException">Attempt to extract a storage from a database open
+            in read-write mode, or from a database without an associated file path</exception>
+            <remarks><p>
+            This method is capable of directly extracting substorages. To do so, first select both the
+            `Name` and `Data` column of the `_Storages` table, then get the stream of the `Data` field.
+            However, substorages may only be extracted from a database that is open in read-only mode.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msirecordreadstream.asp">MsiRecordReadStream</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Record.GetStream(System.String,System.String)">
+            <summary>
+            Reads a record stream field into a file.
+            </summary>
+            <param name="fieldName">Specifies the field of the Record to get.</param>
+            <param name="filePath">Specifies the path to the file to contain the stream.</param>
+            <exception cref="T:System.ArgumentOutOfRangeException">The field name does not match any
+            of the named fields in the Record.</exception>
+            <exception cref="T:System.NotSupportedException">Attempt to extract a storage from a database open
+            in read-write mode, or from a database without an associated file path</exception>
+            <remarks><p>
+            This method is capable of directly extracting substorages. To do so, first select both the
+            `Name` and `Data` column of the `_Storages` table, then get the stream of the `Data` field.
+            However, substorages may only be extracted from a database that is open in read-only mode.
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Record.GetStream(System.Int32)">
+            <summary>
+            Gets a record stream field.
+            </summary>
+            <param name="field">Specifies the field of the Record to get.</param>
+            <returns>A Stream that reads the field data.</returns>
+            <exception cref="T:System.ArgumentOutOfRangeException">The field is less than 0 or greater than the
+            number of fields in the Record.</exception>
+            <remarks><p>
+            This method is not capable of reading substorages. To extract a substorage,
+            use <see cref="M:Microsoft.Deployment.WindowsInstaller.Record.GetStream(System.Int32,System.String)"/>.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msirecordreadstream.asp">MsiRecordReadStream</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Record.GetStream(System.String)">
+            <summary>
+            Gets a record stream field.
+            </summary>
+            <param name="fieldName">Specifies the field of the Record to get.</param>
+            <returns>A Stream that reads the field data.</returns>
+            <exception cref="T:System.ArgumentOutOfRangeException">The field name does not match any
+            of the named fields in the Record.</exception>
+            <remarks><p>
+            This method is not capable of reading substorages. To extract a substorage,
+            use <see cref="M:Microsoft.Deployment.WindowsInstaller.Record.GetStream(System.String,System.String)"/>.
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Record.SetStream(System.Int32,System.String)">
+            <summary>
+            Sets a record stream field from a file. Stream data cannot be inserted into temporary fields.
+            </summary>
+            <param name="field">Specifies the field of the Record to set.</param>
+            <param name="filePath">Specifies the path to the file containing the stream.</param>
+            <exception cref="T:System.ArgumentOutOfRangeException">The field is less than 0 or greater than the
+            number of fields in the Record.</exception>
+            <remarks><p>
+            The contents of the specified file are read into a stream object. The stream persists if
+            the Record is inserted into the Database and the Database is committed.
+            </p><p>
+            To reset the stream to its beginning you must pass in null for filePath.
+            Do not pass an empty string, "", to reset the stream.
+            </p><p>
+            Setting a stream with this method is more efficient than setting a field to a
+            FileStream object.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msirecordsetstream.asp">MsiRecordsetStream</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Record.SetStream(System.String,System.String)">
+            <summary>
+            Sets a record stream field from a file. Stream data cannot be inserted into temporary fields.
+            </summary>
+            <param name="fieldName">Specifies the field name of the Record to set.</param>
+            <param name="filePath">Specifies the path to the file containing the stream.</param>
+            <exception cref="T:System.ArgumentOutOfRangeException">The field name does not match any
+            of the named fields in the Record.</exception>
+            <remarks><p>
+            The contents of the specified file are read into a stream object. The stream persists if
+            the Record is inserted into the Database and the Database is committed.
+            To reset the stream to its beginning you must pass in null for filePath.
+            Do not pass an empty string, "", to reset the stream.
+            </p><p>
+            Setting a stream with this method is more efficient than setting a field to a
+            FileStream object.
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Record.SetStream(System.Int32,System.IO.Stream)">
+            <summary>
+            Sets a record stream field from a Stream object. Stream data cannot be inserted into temporary fields.
+            </summary>
+            <param name="field">Specifies the field of the Record to set.</param>
+            <param name="stream">Specifies the stream data.</param>
+            <exception cref="T:System.ArgumentOutOfRangeException">The field is less than 0 or greater than the
+            number of fields in the Record.</exception>
+            <remarks><p>
+            The stream persists if the Record is inserted into the Database and the Database is committed.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msirecordsetstream.asp">MsiRecordsetStream</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Record.SetStream(System.String,System.IO.Stream)">
+            <summary>
+            Sets a record stream field from a Stream object. Stream data cannot be inserted into temporary fields.
+            </summary>
+            <param name="fieldName">Specifies the field name of the Record to set.</param>
+            <param name="stream">Specifies the stream data.</param>
+            <exception cref="T:System.ArgumentOutOfRangeException">The field name does not match any
+            of the named fields in the Record.</exception>
+            <remarks><p>
+            The stream persists if the Record is inserted into the Database and the Database is committed.
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Record.ToString">
+            <summary>
+            Gets a formatted string representation of the Record.
+            </summary>
+            <returns>A formatted string representation of the Record.</returns>
+            <remarks><p>
+            If field 0 of the Record is set to a nonempty string, it is used to format the data in the Record.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiformatrecord.asp">MsiFormatRecord</a>
+            </p></remarks>
+            <seealso cref="P:Microsoft.Deployment.WindowsInstaller.Record.FormatString"/>
+            <seealso cref="M:Microsoft.Deployment.WindowsInstaller.Session.FormatRecord(Microsoft.Deployment.WindowsInstaller.Record)"/>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Record.ToString(System.IFormatProvider)">
+            <summary>
+            Gets a formatted string representation of the Record, optionally using a Session to format properties.
+            </summary>
+            <param name="provider">an optional Session instance that will be used to lookup any
+            properties in the Record's format string</param>
+            <returns>A formatted string representation of the Record.</returns>
+            <remarks><p>
+            If field 0 of the Record is set to a nonempty string, it is used to format the data in the Record.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiformatrecord.asp">MsiFormatRecord</a>
+            </p></remarks>
+            <seealso cref="P:Microsoft.Deployment.WindowsInstaller.Record.FormatString"/>
+            <seealso cref="M:Microsoft.Deployment.WindowsInstaller.Session.FormatRecord(Microsoft.Deployment.WindowsInstaller.Record)"/>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Record.ToString(System.String)">
+            <summary>
+            Gets a formatted string representation of the Record.
+            </summary>
+            <param name="format">String to be used to format the data in the Record,
+            instead of the Record's format string.</param>
+            <returns>A formatted string representation of the Record.</returns>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiformatrecord.asp">MsiFormatRecord</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Record.ToString(System.String,System.IFormatProvider)">
+            <summary>
+            Gets a formatted string representation of the Record, optionally using a Session to format properties.
+            </summary>
+            <param name="format">String to be used to format the data in the Record,
+            instead of the Record's format string.</param>
+            <param name="provider">an optional Session instance that will be used to lookup any
+            properties in the Record's format string</param>
+            <returns>A formatted string representation of the Record.</returns>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiformatrecord.asp">MsiFormatRecord</a>
+            </p></remarks>
+            <seealso cref="P:Microsoft.Deployment.WindowsInstaller.Record.FormatString"/>
+            <seealso cref="M:Microsoft.Deployment.WindowsInstaller.Session.FormatRecord(Microsoft.Deployment.WindowsInstaller.Record)"/>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Record.IsFormatStringInvalid">
+            <summary>
+            IsFormatStringInvalid is set from several View methods that invalidate the FormatString
+            and used to determine behavior during Record.ToString().
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Record.FieldCount">
+            <summary>
+            Gets the number of fields in a record.
+            </summary>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msirecordgetfieldcount.asp">MsiRecordGetFieldCount</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Record.FormatString">
+            <summary>
+            Gets or sets field 0 of the Record, which is the format string.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Record.Item(System.String)">
+            <summary>
+            Gets or sets a record field value.
+            </summary>
+            <param name="fieldName">Specifies the name of the field of the Record to get or set.</param>
+            <exception cref="T:System.ArgumentOutOfRangeException">The name does not match any known field of the Record.</exception>
+            <remarks><p>
+            When getting a field, the type of the object returned depends on the type of the Record field.
+            The object will be one of: Int16, Int32, String, Stream, or null.
+            </p><p>
+            When setting a field, the type of the object provided will be converted to match the View
+            query that returned the record, or if Record was not returned from a view then the type of
+            the object provided will determine the type of the Record field. The object should be one of:
+            Int16, Int32, String, Stream, or null.
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Record.Item(System.Int32)">
+            <summary>
+            Gets or sets a record field value.
+            </summary>
+            <param name="field">Specifies the field of the Record to get or set.</param>
+            <exception cref="T:System.ArgumentOutOfRangeException">The field is less than 0 or greater than the
+            number of fields in the Record.</exception>
+            <remarks><p>
+            Record fields are indexed starting with 1.  Field 0 is a special format field.
+            </p><p>
+            When getting a field, the type of the object returned depends on the type of the Record field.
+            The object will be one of: Int16, Int32, String, Stream, or null.  If the Record was returned
+            from a View, the type will match that of the field from the View query.  Otherwise, the type
+            will match the type of the last value set for the field.
+            </p><p>
+            When setting a field, the type of the object provided will be converted to match the View
+            query that returned the Record, or if Record was not returned from a View then the type of
+            the object provided will determine the type of the Record field. The object should be one of:
+            Int16, Int32, String, Stream, or null.
+            </p><p>
+            The type-specific getters and setters are slightly more efficient than this property, since
+            they don't have to do the extra work to infer the value's type every time.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msirecordgetinteger.asp">MsiRecordGetInteger</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msirecordgetstring.asp">MsiRecordGetString</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msirecordsetinteger.asp">MsiRecordSetInteger</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msirecordsetstring.asp">MsiRecordSetString</a>
+            </p></remarks>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.RemoteMsiFunctionId">
+            <summary>
+            Assigns ID numbers to the MSI APIs that are remotable.
+            </summary>
+            <remarks><p>
+            This enumeration MUST stay in sync with the
+            unmanaged equivalent in RemoteMsiSession.h!
+            </p></remarks>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.MsiRemoteInvoke">
+            <summary>
+            Defines the signature of the native function
+            in SfxCA.dll that implements the remoting call.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.RemotableNativeMethods">
+            <summary>
+            Redirects native API calls to either the normal NativeMethods class
+            or to out-of-proc calls via the remoting channel.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.RemotableNativeMethods.RemotingEnabled">
+            <summary>
+            Checks if the current process is using remoting to access the
+            MSI session and database APIs.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.RemotableNativeMethods.RemotingDelegate">
+            <summary>
+            Sets a delegate that is used to make remote API calls.
+            </summary>
+            <remarks><p>
+            The implementation of this delegate is provided by the
+            custom action host DLL.
+            </p></remarks>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.Session">
+            <summary>
+            The Session object controls the installation process. It opens the
+            install database, which contains the installation tables and data.
+            </summary>
+            <remarks><p>
+            This object is associated with a standard set of action functions,
+            each performing particular operations on data from one or more tables. Additional
+            custom actions may be added for particular product installations. The basic engine
+            function is a sequencer that fetches sequential records from a designated sequence
+            table, evaluates any specified condition expression, and executes the designated
+            action. Actions not recognized by the engine are deferred to the UI handler object
+            for processing, usually dialog box sequences.
+            </p><p>
+            Note that only one Session object can be opened by a single process.
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Session.FromHandle(System.IntPtr,System.Boolean)">
+            <summary>
+            Creates a new Session object from an integer session handle.
+            </summary>
+            <param name="handle">Integer session handle</param>
+            <param name="ownsHandle">true to close the handle when this object is disposed or finalized</param>
+            <remarks><p>
+            This method is only provided for interop purposes.  A Session object
+            should normally be obtained by calling <see cref="M:Microsoft.Deployment.WindowsInstaller.Installer.OpenPackage(Microsoft.Deployment.WindowsInstaller.Database,System.Boolean)"/>
+            or <see cref="M:Microsoft.Deployment.WindowsInstaller.Installer.OpenProduct(System.String)"/>.
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Session.Message(Microsoft.Deployment.WindowsInstaller.InstallMessage,Microsoft.Deployment.WindowsInstaller.Record)">
+            <summary>
+            Performs any enabled logging operations and defers execution to the UI handler
+            object associated with the engine.
+            </summary>
+            <param name="messageType">Type of message to be processed</param>
+            <param name="record">Contains message-specific fields</param>
+            <returns>A message-dependent return value</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Session or Record handle is invalid</exception>
+            <exception cref="T:System.ArgumentOutOfRangeException">an invalid message kind is specified</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallCanceledException">the user exited the installation</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the message-handler failed for an unknown reason</exception>
+            <remarks><p>
+            Logging may be selectively enabled for the various message types.
+            See the <see cref="M:Microsoft.Deployment.WindowsInstaller.Installer.EnableLog(Microsoft.Deployment.WindowsInstaller.InstallLogModes,System.String)"/> method.
+            </p><p>
+            If record field 0 contains a formatting string, it is used to format the data in
+            the other fields. Else if the message is an error, warning, or user message, an attempt
+            is made to find a message template in the Error table for the current database using the
+            error number found in field 1 of the record for message types and return values.
+            </p><p>
+            The <paramref name="messageType"/> parameter may also include message-box flags from
+            the following enumerations: System.Windows.Forms.MessageBoxButtons,
+            System.Windows.Forms.MessageBoxDefaultButton, System.Windows.Forms.MessageBoxIcon.  These
+            flags can be combined with the InstallMessage with a bitwise OR.
+            </p><p>
+            Note, this method never returns Cancel or Error values.  Instead, appropriate
+            exceptions are thrown in those cases.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiprocessmessage.asp">MsiProcessMessage</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Session.Log(System.String)">
+            <summary>
+            Writes a message to the log, if logging is enabled.
+            </summary>
+            <param name="msg">The line to be written to the log</param>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiprocessmessage.asp">MsiProcessMessage</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Session.Log(System.String,System.Object[])">
+            <summary>
+            Writes a formatted message to the log, if logging is enabled.
+            </summary>
+            <param name="format">The line to be written to the log, containing 0 or more format specifiers</param>
+            <param name="args">An array containing 0 or more objects to be formatted</param>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiprocessmessage.asp">MsiProcessMessage</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Session.EvaluateCondition(System.String)">
+            <summary>
+            Evaluates a logical expression containing symbols and values.
+            </summary>
+            <param name="condition">conditional expression</param>
+            <returns>The result of the condition evaluation</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Session handle is invalid</exception>
+            <exception cref="T:System.ArgumentNullException">the condition is null or empty</exception>
+            <exception cref="T:System.InvalidOperationException">the conditional expression is invalid</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msievaluatecondition.asp">MsiEvaluateCondition</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Session.EvaluateCondition(System.String,System.Boolean)">
+            <summary>
+            Evaluates a logical expression containing symbols and values, specifying a default
+            value to be returned in case the condition is empty.
+            </summary>
+            <param name="condition">conditional expression</param>
+            <param name="defaultValue">value to return if the condition is empty</param>
+            <returns>The result of the condition evaluation</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Session handle is invalid</exception>
+            <exception cref="T:System.InvalidOperationException">the conditional expression is invalid</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msievaluatecondition.asp">MsiEvaluateCondition</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Session.Format(System.String)">
+            <summary>
+            Formats a string containing installer properties.
+            </summary>
+            <param name="format">A format string containing property tokens</param>
+            <returns>A formatted string containing property data</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Record handle is invalid</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiformatrecord.asp">MsiFormatRecord</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Session.FormatRecord(Microsoft.Deployment.WindowsInstaller.Record)">
+            <summary>
+            Returns a formatted string from record data.
+            </summary>
+            <param name="record">Record object containing a template and data to be formatted.
+            The template string must be set in field 0 followed by any referenced data parameters.</param>
+            <returns>A formatted string containing the record data</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Record handle is invalid</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiformatrecord.asp">MsiFormatRecord</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Session.FormatRecord(Microsoft.Deployment.WindowsInstaller.Record,System.String)">
+            <summary>
+            Returns a formatted string from record data using a specified format.
+            </summary>
+            <param name="record">Record object containing a template and data to be formatted</param>
+            <param name="format">Format string to be used instead of field 0 of the Record</param>
+            <returns>A formatted string containing the record data</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Record handle is invalid</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiformatrecord.asp">MsiFormatRecord</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Session.GetProductProperty(System.String)">
+            <summary>
+            Retrieves product properties (not session properties) from the product database.
+            </summary>
+            <returns>Value of the property, or an empty string if the property is not set.</returns>
+            <remarks><p>
+            Note this is not the correct method for getting ordinary session properties. For that,
+            see the indexer on the Session class.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigetproductproperty.asp">MsiGetProductProperty</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Session.VerifyDiskSpace">
+            <summary>
+            Checks to see if sufficient disk space is present for the current installation.
+            </summary>
+            <returns>True if there is sufficient disk space; false otherwise.</returns>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiverifydiskspace.asp">MsiVerifyDiskSpace</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Session.GetTotalCost">
+            <summary>
+            Gets the total disk space per drive required for the installation.
+            </summary>
+            <returns>A list of InstallCost structures, specifying the cost for each drive</returns>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msienumcomponentcosts.asp">MsiEnumComponentCosts</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Session.GetMode(Microsoft.Deployment.WindowsInstaller.InstallRunMode)">
+            <summary>
+            Gets the designated mode flag for the current install session.
+            </summary>
+            <param name="mode">The type of mode to be checked.</param>
+            <returns>The value of the designated mode flag.</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Session handle is invalid</exception>
+            <exception cref="T:System.ArgumentOutOfRangeException">an invalid mode flag was specified</exception>
+            <remarks><p>
+            Note that only the following run modes are available to read from
+            a deferred custom action:<list type="bullet">
+            <item><description><see cref="F:Microsoft.Deployment.WindowsInstaller.InstallRunMode.Scheduled"/></description></item>
+            <item><description><see cref="F:Microsoft.Deployment.WindowsInstaller.InstallRunMode.Rollback"/></description></item>
+            <item><description><see cref="F:Microsoft.Deployment.WindowsInstaller.InstallRunMode.Commit"/></description></item>
+            </list>
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigetmode.asp">MsiGetMode</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Session.SetMode(Microsoft.Deployment.WindowsInstaller.InstallRunMode,System.Boolean)">
+            <summary>
+            Sets the designated mode flag for the current install session.
+            </summary>
+            <param name="mode">The type of mode to be set.</param>
+            <param name="value">The desired value of the mode.</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Session handle is invalid</exception>
+            <exception cref="T:System.ArgumentOutOfRangeException">an invalid mode flag was specified</exception>
+            <exception cref="T:System.InvalidOperationException">the mode cannot not be set</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisetmode.asp">MsiSetMode</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Session.GetSourcePath(System.String)">
+            <summary>
+            Gets the full path to the designated folder on the source media or server image.
+            </summary>
+            <exception cref="T:System.ArgumentException">the folder was not found in the Directory table</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Session handle is invalid</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigetsourcepath.asp">MsiGetSourcePath</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Session.GetTargetPath(System.String)">
+            <summary>
+            Gets the full path to the designated folder on the installation target drive.
+            </summary>
+            <exception cref="T:System.ArgumentException">the folder was not found in the Directory table</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Session handle is invalid</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigettargetpath.asp">MsiGetTargetPath</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Session.SetTargetPath(System.String,System.String)">
+            <summary>
+            Sets the full path to the designated folder on the installation target drive.
+            </summary>
+            <exception cref="T:System.ArgumentException">the folder was not found in the Directory table</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Session handle is invalid</exception>
+            <remarks><p>
+            Setting the target path of a directory changes the path specification for the directory
+            in the in-memory Directory table. Also, the path specifications of all other path objects
+            in the table that are either subordinate or equivalent to the changed path are updated
+            to reflect the change. The properties for each affected path are also updated.
+            </p><p>
+            If an error occurs in this function, all updated paths and properties revert to
+            their previous values. Therefore, it is safe to treat errors returned by this function
+            as non-fatal.
+            </p><p>
+            Do not attempt to configure the target path if the components using those paths
+            are already installed for the current user or for a different user. Check the
+            ProductState property before setting the target path to determine if the product
+            containing this component is installed.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisettargetpath.asp">MsiSetTargetPath</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Session.SetInstallLevel(System.Int32)">
+            <summary>
+            Sets the install level for the current installation to a specified value and
+            recalculates the Select and Installed states for all features in the Feature
+            table. Also sets the Action state of each component in the Component table based
+            on the new level.
+            </summary>
+            <param name="installLevel">New install level</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Session handle is invalid</exception>
+            <remarks><p>
+            The SetInstallLevel method sets the following:<list type="bullet">
+            <item><description>The installation level for the current installation to a specified value</description></item>
+            <item><description>The Select and Installed states for all features in the Feature table</description></item>
+            <item><description>The Action state of each component in the Component table, based on the new level</description></item>
+            </list>
+            If 0 or a negative number is passed in the ilnstallLevel parameter,
+            the current installation level does not change, but all features are still
+            updated based on the current installation level.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisetinstalllevel.asp">MsiSetInstallLevel</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Session.DoAction(System.String)">
+            <summary>
+            Executes a built-in action, custom action, or user-interface wizard action.
+            </summary>
+            <param name="action">Name of the action to execute.  Case-sensitive.</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Session handle is invalid</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallCanceledException">the user exited the installation</exception>
+            <remarks><p>
+            The DoAction method executes the action that corresponds to the name supplied. If the
+            name is not recognized by the installer as a built-in action or as a custom action in
+            the CustomAction table, the name is passed to the user-interface handler object, which
+            can invoke a function or a dialog box. If a null action name is supplied, the installer
+            uses the upper-case value of the ACTION property as the action to perform. If no property
+            value is defined, the default action is performed, defined as "INSTALL".
+            </p><p>
+            Actions that update the system, such as the InstallFiles and WriteRegistryValues
+            actions, cannot be run by calling MsiDoAction. The exception to this rule is if DoAction
+            is called from a custom action that is scheduled in the InstallExecuteSequence table
+            between the InstallInitialize and InstallFinalize actions. Actions that do not update the
+            system, such as AppSearch or CostInitialize, can be called.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msidoaction.asp">MsiDoAction</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Session.DoAction(System.String,Microsoft.Deployment.WindowsInstaller.CustomActionData)">
+            <summary>
+            Executes a built-in action, custom action, or user-interface wizard action.
+            </summary>
+            <param name="action">Name of the action to execute.  Case-sensitive.</param>
+            <param name="actionData">Optional data to be passed to a deferred custom action.</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Session handle is invalid</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallCanceledException">the user exited the installation</exception>
+            <remarks><p>
+            The DoAction method executes the action that corresponds to the name supplied. If the
+            name is not recognized by the installer as a built-in action or as a custom action in
+            the CustomAction table, the name is passed to the user-interface handler object, which
+            can invoke a function or a dialog box. If a null action name is supplied, the installer
+            uses the upper-case value of the ACTION property as the action to perform. If no property
+            value is defined, the default action is performed, defined as "INSTALL".
+            </p><p>
+            Actions that update the system, such as the InstallFiles and WriteRegistryValues
+            actions, cannot be run by calling MsiDoAction. The exception to this rule is if DoAction
+            is called from a custom action that is scheduled in the InstallExecuteSequence table
+            between the InstallInitialize and InstallFinalize actions. Actions that do not update the
+            system, such as AppSearch or CostInitialize, can be called.
+            </p><p>
+            If the called action is a deferred, rollback, or commit custom action, then the supplied
+            <paramref name="actionData"/> will be available via the <see cref="P:Microsoft.Deployment.WindowsInstaller.Session.CustomActionData"/>
+            property of that custom action's session.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msidoaction.asp">MsiDoAction</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Session.DoActionSequence(System.String)">
+            <summary>
+            Executes an action sequence described in the specified table.
+            </summary>
+            <param name="sequenceTable">Name of the table containing the action sequence.</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Session handle is invalid</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallCanceledException">the user exited the installation</exception>
+            <remarks><p>
+            This method queries the specified table, ordering the actions by the numbers in the Sequence column.
+            For each row retrieved, an action is executed, provided that any supplied condition expression does
+            not evaluate to FALSE.
+            </p><p>
+            An action sequence containing any actions that update the system, such as the InstallFiles and
+            WriteRegistryValues actions, cannot be run by calling DoActionSequence. The exception to this rule is if
+            DoActionSequence is called from a custom action that is scheduled in the InstallExecuteSequence table
+            between the InstallInitialize and InstallFinalize actions. Actions that do not update the system, such
+            as AppSearch or CostInitialize, can be called.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisequence.asp">MsiSequence</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Session.System#IFormatProvider#GetFormat(System.Type)">
+            <summary>
+            Implements formatting for <see cref="T:Microsoft.Deployment.WindowsInstaller.Record"/> data.
+            </summary>
+            <param name="formatType">Type of format object to get.</param>
+            <returns>The the current instance, if <paramref name="formatType"/> is the same type
+            as the current instance; otherwise, null.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Session.Dispose(System.Boolean)">
+            <summary>
+            Closes the session handle.  Also closes the active database handle, if it is open.
+            After closing a handle, further method calls may throw an <see cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException"/>.
+            </summary>
+            <param name="disposing">If true, the method has been called directly
+            or indirectly by a user's code, so managed and unmanaged resources will
+            be disposed. If false, only unmanaged resources will be disposed.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.Session.ValidateSessionAccess">
+            <summary>
+            Throws an exception if the custom action is not able to access immedate session details.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Session.Database">
+            <summary>
+            Gets the Database for the install session.
+            </summary>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Session handle is invalid</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the Database cannot be accessed</exception>
+            <remarks><p>
+            Normally there is no need to close this Database object.  The same object can be
+            used throughout the lifetime of the Session, and it will be closed when the Session
+            is closed.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigetactivedatabase.asp">MsiGetActiveDatabase</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Session.Language">
+            <summary>
+            Gets the numeric language ID used by the current install session.
+            </summary>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigetlanguage.asp">MsiGetLanguage</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Session.Item(System.String)">
+            <summary>
+            Gets or sets the string value of a named installer property, as maintained by the
+            Session object in the in-memory Property table, or, if it is prefixed with a percent
+            sign (%), the value of a system environment variable for the current process.
+            </summary>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the Session handle is invalid</exception>
+            <remarks><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigetproperty.asp">MsiGetProperty</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisetproperty.asp">MsiSetProperty</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Session.Components">
+            <summary>
+            Gets an accessor for components in the current session.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Session.Features">
+            <summary>
+            Gets an accessor for features in the current session.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Session.CustomActionData">
+            <summary>
+            Gets custom action data for the session that was supplied by the caller.
+            </summary>
+            <seealso cref="M:Microsoft.Deployment.WindowsInstaller.Session.DoAction(System.String,Microsoft.Deployment.WindowsInstaller.CustomActionData)"/>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.Session.NonImmediatePropertyNames">
+            <summary>
+            Gets the (short) list of properties that are available from non-immediate custom actions.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.ShortcutTarget">
+            <summary>
+            Holds information about the target of a shortcut file.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.ShortcutTarget.op_Equality(Microsoft.Deployment.WindowsInstaller.ShortcutTarget,Microsoft.Deployment.WindowsInstaller.ShortcutTarget)">
+            <summary>
+            Tests whether two shortcut targets have the same product code, feature, and/or component code.
+            </summary>
+            <param name="st1">The first shortcut target to compare.</param>
+            <param name="st2">The second shortcut target to compare.</param>
+            <returns>True if all parts of the targets are the same, else false.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.ShortcutTarget.op_Inequality(Microsoft.Deployment.WindowsInstaller.ShortcutTarget,Microsoft.Deployment.WindowsInstaller.ShortcutTarget)">
+            <summary>
+            Tests whether two shortcut targets have the same product code, feature, and/or component code.
+            </summary>
+            <param name="st1">The first shortcut target to compare.</param>
+            <param name="st2">The second shortcut target to compare.</param>
+            <returns>True if any parts of the targets are different, else false.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.ShortcutTarget.Equals(System.Object)">
+            <summary>
+            Tests whether two shortcut targets have the same product code, feature, and/or component code.
+            </summary>
+            <param name="obj">The shortcut target to compare to the current object.</param>
+            <returns>True if <paramref name="obj"/> is a shortcut target and all parts of the targets are the same, else false.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.ShortcutTarget.GetHashCode">
+            <summary>
+            Generates a hash code using all parts of the shortcut target.
+            </summary>
+            <returns>An integer suitable for hashing the shortcut target.</returns>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ShortcutTarget.ProductCode">
+            <summary>
+            Gets the target product code of the shortcut, or null if not available.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ShortcutTarget.Feature">
+            <summary>
+            Gets the name of the target feature of the shortcut, or null if not available.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ShortcutTarget.ComponentCode">
+            <summary>
+            Gets the target component code of the shortcut, or null if not available.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.SourceList">
+            <summary>
+            A list of sources for an installed product or patch.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.SourceList.Add(System.String)">
+            <summary>
+            Adds a network or URL source to the source list of the installed product.
+            </summary>
+            <param name="item">Path to the source to be added. This parameter is
+            expected to contain only the path without the filename.</param>
+            <remarks><p>
+            If this method is called with a new source, the installer adds the source
+            to the end of the source list. 
+            </p><p>
+            If this method is called with a source already existing in the source
+            list, it has no effect.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisourcelistaddsource.asp">MsiSourceListAddSource</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisourcelistaddsourceex.asp">MsiSourceListAddSourceEx</a>
+            </p></remarks>
+            <seealso cref="M:Microsoft.Deployment.WindowsInstaller.SourceList.Insert(System.String,System.Int32)"/>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.SourceList.Insert(System.String,System.Int32)">
+            <summary>
+            Adds or reorders a network or URL source for the product or patch.
+            </summary>
+            <param name="item">Path to the source to be added. This parameter is
+            expected to contain only the path without the filename.</param>
+            <param name="index">Specifies the priority order in which the source
+            will be inserted</param>
+            <remarks><p>
+            If this method is called with a new source and <paramref name="index"/>
+            is set to 0, the installer adds the source to the end of the source list. 
+            </p><p>
+            If this method is called with a source already existing in the source
+            list and <paramref name="index"/> is set to 0, the installer retains the
+            source's existing index.
+            </p><p>
+            If the method is called with an existing source in the source list
+            and <paramref name="index"/> is set to a non-zero value, the source is
+            removed from its current location in the list and inserted at the position
+            specified by Index, before any source that already exists at that position.
+            </p><p>
+            If the method is called with a new source and Index is set to a
+            non-zero value, the source is inserted at the position specified by
+            <paramref name="index"/>, before any source that already exists at
+            that position. The index value for all sources in the list after the
+            index specified by Index are updated to ensure unique index values and
+            the pre-existing order is guaranteed to remain unchanged.
+            </p><p>
+            If <paramref name="index"/> is greater than the number of sources
+            in the list, the source is placed at the end of the list with an index
+            value one larger than any existing source.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisourcelistaddsourceex.asp">MsiSourceListAddSourceEx</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.SourceList.Clear">
+            <summary>
+            Clears sources of all types: network, url, and media.
+            </summary>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisourcelistclearall.asp">MsiSourceListClearAll</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.SourceList.ClearNetworkSources">
+            <summary>
+            Removes all network sources from the list. URL sources are not affected.
+            </summary>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisourcelistclearallex.asp">MsiSourceListClearAllEx</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.SourceList.ClearUrlSources">
+            <summary>
+            Removes all URL sources from the list. Network sources are not affected.
+            </summary>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisourcelistclearallex.asp">MsiSourceListClearAllEx</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.SourceList.Contains(System.String)">
+            <summary>
+            Checks if the specified source exists in the list.
+            </summary>
+            <param name="item">case-insensitive source to look for</param>
+            <returns>true if the source exists in the list, false otherwise</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.SourceList.CopyTo(System.String[],System.Int32)">
+            <summary>
+            Copies the network and URL sources from this list into an array.
+            </summary>
+            <param name="array">destination array to be filed</param>
+            <param name="arrayIndex">offset into the destination array where copying begins</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.SourceList.Remove(System.String)">
+            <summary>
+            Removes a network or URL source.
+            </summary>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisourcelistclearsource.asp">MsiSourceListClearSource</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.SourceList.GetEnumerator">
+            <summary>
+            Enumerates the network and URL sources in the source list of the patch or product installation.
+            </summary>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisourcelistenumsources.asp">MsiSourceListEnumSources</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.SourceList.ForceResolution">
+            <summary>
+            Forces the installer to search the source list for a valid
+            source the next time a source is required. For example, when the
+            installer performs an installation or reinstallation, or when it
+            requires the path for a component that is set to run from source.
+            </summary>
+            <remarks><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisourcelistforceresolution.asp">MsiSourceListForceResolution</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisourcelistforceresolutionex.asp">MsiSourceListForceResolutionEx</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.SourceList.MediaList">
+            <summary>
+            Gets the list of disks registered for the media source of
+            the patch or product installation.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.SourceList.Count">
+            <summary>
+            Gets the number of network and URL sources in the list.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.SourceList.IsReadOnly">
+            <summary>
+            Gets a boolean value indicating whether the list is read-only.
+            A SourceList is never read-only.
+            </summary>
+            <value>read-only status of the list</value>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.SourceList.MediaPackagePath">
+            <summary>
+            Gets or sets the path relative to the root of the installation media.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.SourceList.DiskPrompt">
+            <summary>
+            Gets or sets the prompt template that is used when prompting the user
+            for installation media.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.SourceList.LastUsedSource">
+            <summary>
+            Gets or sets the most recently used source location for the product.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.SourceList.PackageName">
+            <summary>
+            Gets or sets the name of the Windows Installer package or patch package
+            on the source.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.SourceList.LastUsedType">
+            <summary>
+            Gets the type of the last-used source.
+            </summary>
+            <remarks><p>
+            <ul>
+            <li>&quot;n&quot; = network location</li>
+            <li>&quot;u&quot; = URL location</li>
+            <li>&quot;m&quot; = media location</li>
+            <li>(empty string) = no last used source</li>
+            </ul>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.SourceList.Item(System.String)">
+            <summary>
+            Gets or sets source list information properties of a product or patch installation.
+            </summary>
+            <param name="property">The source list information property name.</param>
+            <exception cref="T:System.ArgumentOutOfRangeException">An unknown product, patch, or property was requested</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisourcelistgetinfo.asp">MsiSourceListGetInfo</a>
+            </p></remarks>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.SourceMediaList">
+            <summary>
+            A list of source media for an installed product or patch.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.SourceMediaList.Add(Microsoft.Deployment.WindowsInstaller.MediaDisk)">
+            <summary>
+            Adds or updates a disk of the media source for the product or patch.
+            </summary>
+            <remarks><p>
+            To change the disk prompt only, get the existing volume label from the
+            registry and provide it in this call along with the new disk prompt.
+            Passing a null or empty string for <paramref name="volumeLabel"/>
+            registers an empty string as the volume label.
+            <p>To change the volume label only, get the existing disk prompt
+            that is registered and provide it when calling SourceListAddMediaDisk
+            along with the new volume label. Passing null or an empty string
+            registers an empty string as the disk prompt.</p>
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisourcelistaddmediadisk.asp">MsiSourceListAddMediaDisk</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.SourceMediaList.Clear">
+            <summary>
+            Removes all source media from the list.
+            </summary>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisourcelistclearallex.asp">MsiSourceListClearAllEx</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.SourceMediaList.Contains(System.Int32)">
+            <summary>
+            Checks if the specified media disk id exists in the list.
+            </summary>
+            <param name="diskId">disk id of the media to look for</param>
+            <returns>true if the media exists in the list, false otherwise</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.SourceMediaList.CopyTo(Microsoft.Deployment.WindowsInstaller.MediaDisk[],System.Int32)">
+            <summary>
+            Copies the source media info from this list into an array.
+            </summary>
+            <param name="array">destination array to be filed</param>
+            <param name="arrayIndex">offset into the destination array where copying begins</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.SourceMediaList.Remove(System.Int32)">
+            <summary>
+            Removes a specified disk from the set of registered disks.
+            </summary>
+            <param name="diskId">ID of the disk to remove</param>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisourcelistclearmediadisk.asp">MsiSourceListClearMediaDisk</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.SourceMediaList.GetEnumerator">
+            <summary>
+            Enumerates the source media in the source list of the patch or product installation.
+            </summary>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisourcelistenummediadisks.asp">MsiSourceListEnumMediaDisks</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.SourceMediaList.Count">
+            <summary>
+            Gets the number of source media in the list.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.SourceMediaList.IsReadOnly">
+            <summary>
+            Gets a boolean value indicating whether the list is read-only.
+            A SourceMediaList is never read-only.
+            </summary>
+            <value>read-only status of the list</value>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.SummaryInfo">
+            <summary>
+            Provides access to summary information of a Windows Installer database.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.SummaryInfo.#ctor(System.String,System.Boolean)">
+            <summary>
+            Gets a SummaryInfo object that can be used to examine, update, and add
+            properties to the summary information stream of a package or transform.
+            </summary>
+            <param name="packagePath">Path to the package (database) or transform</param>
+            <param name="enableWrite">True to reserve resources for writing summary information properties.</param>
+            <exception cref="T:System.IO.FileNotFoundException">the package does not exist or could not be read</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the package is an invalid format</exception>
+            <remarks><p>
+            The SummaryInfo object should be <see cref="M:Microsoft.Deployment.WindowsInstaller.InstallerHandle.Close"/>d after use.
+            It is best that the handle be closed manually as soon as it is no longer
+            needed, as leaving lots of unused handles open can degrade performance.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msigetsummaryinformation.asp">MsiGetSummaryInformation</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.SummaryInfo.Persist">
+            <summary>
+            Formats and writes the previously stored properties into the standard summary information stream.
+            </summary>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">The stream cannot be successfully written.</exception>
+            <remarks><p>
+            This method may only be called once after all the property values have been set. Properties may
+            still be read after the stream is written.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisummaryinfopersist.asp">MsiSummaryInfoPersist</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.SummaryInfo.Title">
+            <summary>Gets or sets the Title summary information property.</summary>
+            <remarks><p>
+            The Title summary information property briefly describes the type of installer package. Phrases
+            such as "Installation Database" or "Transform" or "Patch" may be used for this property.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisummaryinfogetproperty.asp">MsiSummaryInfoGetProperty</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisummaryinfosetproperty.asp">MsiSummaryInfoSetProperty</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.SummaryInfo.Subject">
+            <summary>Gets or sets the Subject summary information property.</summary>
+            <remarks><p>
+            The Subject summary information property conveys to a file browser the product that can be installed using
+            the logic and data in this installer database. For example, the value of the summary property for
+            Microsoft Office 97 would be "Microsoft Office 97 Professional". This value is typically set from the
+            installer property ProductName.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisummaryinfogetproperty.asp">MsiSummaryInfoGetProperty</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisummaryinfosetproperty.asp">MsiSummaryInfoSetProperty</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.SummaryInfo.Author">
+            <summary>Gets or sets the Author summary information property.</summary>
+            <remarks><p>
+            The Author summary information property conveys to a file browser the manufacturer of the installation
+            database. This value is typically set from the installer property Manufacturer.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisummaryinfogetproperty.asp">MsiSummaryInfoGetProperty</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisummaryinfosetproperty.asp">MsiSummaryInfoSetProperty</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.SummaryInfo.Keywords">
+            <summary>Gets or sets the Keywords summary information property.</summary>
+            <remarks><p>
+            The Keywords summary information property is used by file browsers to hold keywords that permit the
+            database file to be found in a keyword search. The set of keywords typically includes "Installer" as
+            well as product-specific keywords, and may be localized.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisummaryinfogetproperty.asp">MsiSummaryInfoGetProperty</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisummaryinfosetproperty.asp">MsiSummaryInfoSetProperty</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.SummaryInfo.Comments">
+            <summary>Gets or sets the Comments summary information property.</summary>
+            <remarks><p>
+            The Comments summary information property conveys the general purpose of the installer database. By convention,
+            the value for this summary property is set to the following:
+            </p><p>
+            "This installer database contains the logic and data required to install &lt;product name&gt;."
+            </p><p>
+            where &lt;product name&gt; is the name of the product being installed. In general the value for this summary
+            property only changes in the product name, nothing else.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisummaryinfogetproperty.asp">MsiSummaryInfoGetProperty</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisummaryinfosetproperty.asp">MsiSummaryInfoSetProperty</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.SummaryInfo.Template">
+            <summary>Gets or sets the Template summary information property.</summary>
+            <remarks><p>
+            The Template summary information propery indicates the platform and language versions supported by the database.
+            </p><p>
+            The syntax of the Template Summary property information is:
+            [platform property][,platform property][,...];[language id][,language id][,...]
+            </p><p>
+            For example, the following are all valid values for the Template Summary property:
+            <list type="bullet">
+            <item>Intel;1033</item>
+            <item>Intel64;1033</item>
+            <item>;1033</item>
+            <item>;</item>
+            <item>Intel ;1033,2046</item>
+            <item>Intel64;1033,2046</item>
+            <item>Intel;0</item>
+            </list>
+            </p><p>
+            If this is a 64-bit Windows Installer, enter Intel64 in the Template summary information property. Note that an
+            installation package cannot have both the Intel and Intel64 properties set.
+            </p><p>
+            If the current platform does not match one of the platforms specified then the installer will not process the
+            package. Not specifying a platform implies that the package is platform-independent.
+            </p><p>
+            Entering 0 in the language ID field of the Template summary information property, or leaving this field empty,
+            indicates that the package is language neutral.
+            </p><p>
+            There are variations of this property depending on whether it is in a source installer database or a transform.
+            </p><p>
+            Source Installer Database - Only one language can be specified in a source installer database. Merge Modules are
+            the only packages that may have multiple languages. For more information, see Multiple Language Merge Modules.
+            </p><p>
+            Transform - In a transform file, only one language may be specified. The specified platform and language determine
+            whether a transform can be applied to a particular database. The platform property and the language property can
+            be left blank if no transform restriction relies on them to validate the transform.
+            </p><p>
+            This summary property is REQUIRED.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisummaryinfogetproperty.asp">MsiSummaryInfoGetProperty</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisummaryinfosetproperty.asp">MsiSummaryInfoSetProperty</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.SummaryInfo.LastSavedBy">
+            <summary>Gets or sets the LastSavedBy summary information property.</summary>
+            <remarks><p>
+            The installer sets the Last Saved By summary information property to the value of the LogonUser property during
+            an administrative installation. The installer never uses this property and a user never needs to modify it.
+            Developers of a database editing tool may use this property to track the last person to modify the database.
+            This property should be left set to null in a final shipping database.
+            </p><p>
+            In a transform, this summary property contains the platform and language ID(s) that a database should have
+            after it has been transformed. The property specifies to what the Template should be set in the new database.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisummaryinfogetproperty.asp">MsiSummaryInfoGetProperty</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisummaryinfosetproperty.asp">MsiSummaryInfoSetProperty</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.SummaryInfo.RevisionNumber">
+            <summary>Gets or sets the RevisionNumber summary information property.</summary>
+            <remarks><p>
+            The Revision Number summary information property contains the package code for the installer package. The
+            package code is a unique identifier of the installer package. 
+            </p><p>
+            The Revision Number summary information  property of a patch package specifies the GUID patch code for
+            the patch. This is followed by a list of patch code GUIDs for obsolete patches that are removed when this
+            patch is applied. The patch codes are concatenated with no delimiters separating GUIDs in the list.
+            </p><p>
+            The Revision Number summary information  property of a transform package lists the product code GUIDs
+            and version of the new and original products and the upgrade code GUID. The list is separated with
+            semicolons as follows.
+            </p><p>
+            Original-Product-Code Original-Product-Version ; New-Product Code New-Product-Version; Upgrade-Code
+            </p><p>
+            This summary property is REQUIRED.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisummaryinfogetproperty.asp">MsiSummaryInfoGetProperty</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisummaryinfosetproperty.asp">MsiSummaryInfoSetProperty</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.SummaryInfo.CreatingApp">
+            <summary>Gets or sets the CreatingApp summary information property.</summary>
+            <remarks><p>
+            The CreatingApp summary information property conveys which application created the installer database.
+            In general the value for this summary property is the name of the software used to author this database.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisummaryinfogetproperty.asp">MsiSummaryInfoGetProperty</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisummaryinfosetproperty.asp">MsiSummaryInfoSetProperty</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.SummaryInfo.LastPrintTime">
+            <summary>Gets or sets the LastPrintTime summary information property.</summary>
+            <remarks><p>
+            The LastPrintTime summary information property can be set to the date and time during an administrative
+            installation to record when the administrative image was created. For non-administrative installations
+            this property is the same as the CreateTime summary information property.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisummaryinfogetproperty.asp">MsiSummaryInfoGetProperty</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisummaryinfosetproperty.asp">MsiSummaryInfoSetProperty</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.SummaryInfo.CreateTime">
+            <summary>Gets or sets the CreateTime summary information property.</summary>
+            <remarks><p>
+            The CreateTime summary information property conveys when the installer database was created.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisummaryinfogetproperty.asp">MsiSummaryInfoGetProperty</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisummaryinfosetproperty.asp">MsiSummaryInfoSetProperty</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.SummaryInfo.LastSaveTime">
+            <summary>Gets or sets the LastSaveTime summary information property.</summary>
+            <remarks><p>
+            The LastSaveTime summary information property conveys when the last time the installer database was
+            modified. Each time a user changes an installation the value for this summary property is updated to
+            the current system time/date at the time the installer database was saved. Initially the value for
+            this summary property is set to null to indicate that no changes have yet been made.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisummaryinfogetproperty.asp">MsiSummaryInfoGetProperty</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisummaryinfosetproperty.asp">MsiSummaryInfoSetProperty</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.SummaryInfo.CodePage">
+            <summary>Gets or sets the CodePage summary information property.</summary>
+            <remarks><p>
+            The Codepage summary information property is the numeric value of the ANSI code page used for any
+            strings that are stored in the summary information. Note that this is not the same code page for
+            strings in the installation database. The Codepage summary information property is used to translate
+            the strings in the summary information into Unicode when calling the Unicode API functions. The
+            Codepage summary information property must be set before any string properties are set in the
+            summary information.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisummaryinfogetproperty.asp">MsiSummaryInfoGetProperty</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisummaryinfosetproperty.asp">MsiSummaryInfoSetProperty</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.SummaryInfo.PageCount">
+            <summary>Gets or sets the PageCount summary information property.</summary>
+            <remarks><p>
+            For an installation package, the PageCount summary information property contains the minimum
+            installer version required. For Windows Installer version 1.0, this property must be set to the
+            integer 100. For 64-bit Windows Installer Packages, this property must be set to the integer 200.
+            </p><p>
+            For a transform package, the PageCount summary information property contains minimum installer
+            version required to process the transform. Set to the greater of the two PageCount summary information
+            property values belonging to the databases used to generate the transform.
+            </p><p>
+            The PageCount summary information property is set to null in patch packages.
+            </p><p>
+            This summary property is REQUIRED.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisummaryinfogetproperty.asp">MsiSummaryInfoGetProperty</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisummaryinfosetproperty.asp">MsiSummaryInfoSetProperty</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.SummaryInfo.WordCount">
+            <summary>Gets or sets the WordCount summary information property.</summary>
+            <remarks><p>
+            The WordCount summary information property indicates the type of source file image. If this property is
+            not present, it defaults to 0. Note that this property is stored in place of the standard Count property.
+            </p><p>
+            This property is a bit field. New bits may be added in the future. At present the following bits are
+            available:
+            <list type="bullet">
+            <item>Bit 0: 0 = long file names, 1 = short file names</item>
+            <item>Bit 1: 0 = source is uncompressed, 1 = source is compressed</item>
+            <item>Bit 2: 0 = source is original media, 1 = source is administrative installation</item>
+            <item>[MSI 4.0] Bit 3: 0 = elevated privileges can be required to install, 1 = elevated privileges are not required to install</item>
+            </list>
+            </p><p>
+            These are combined to give the WordCount summary information property one of the following values
+            indicating a type of source file image:
+            <list type="bullet">
+            <item>0 - Original source using long file names. Matches tree in Directory table.</item>
+            <item>1 - Original source using short file names. Matches tree in Directory table.</item>
+            <item>2 - Compressed source files using long file names. Matches cabinets and files in the Media table.</item>
+            <item>3 - Compressed source files using short file names. Matches cabinets and files in the Media table.</item>
+            <item>4 - Administrative image using long file names. Matches tree in Directory table.</item>
+            <item>5 - Administrative image using short file names. Matches tree in Directory table.</item>
+            </list>
+            </p><p>
+            Note that if the package is marked as compressed (bit 1 is set), the installer only installs files
+            located at the root of the source. In this case, even files marked as uncompressed in the File table must
+            be located at the root to be installed. To specify a source image that has both a cabinet file (compressed
+            files) and uncompressed files that match the tree in the Directory table, mark the package as uncompressed
+            by leaving bit 1 unset (value=0) in the WordCount summary information property and set
+            <see cref="F:Microsoft.Deployment.WindowsInstaller.FileAttributes.Compressed"/> (value=16384) in the Attributes column of the File table
+            for each file in the cabinet.
+            </p><p>
+            For a patch package, the WordCount summary information property specifies the patch engine that was used
+            to create the patch files. The default value is 1 and indicates that MSPATCH was used to create the patch
+            A value of "2" means that the patch is using smaller, optimized, files available only with Windows Installer
+            version 1.2 or later. A patch with a WordCount of "2" fails immediately if used with a Windows Installer
+            version earlier than 1.2. A patch with a WordCount of "3" fails immediately if used with a Windows Installer
+            version earlier than 2.0.
+            </p><p>
+            This summary property is REQUIRED.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisummaryinfogetproperty.asp">MsiSummaryInfoGetProperty</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisummaryinfosetproperty.asp">MsiSummaryInfoSetProperty</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.SummaryInfo.CharacterCount">
+            <summary>Gets or sets the CharacterCount summary information property.</summary>
+            <remarks><p>
+            The CharacterCount summary information property is only used in transforms. This part of the summary
+            information stream is divided into two 16-bit words. The upper word contains the transform validation
+            flags. The lower word contains the transform error condition flags.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisummaryinfogetproperty.asp">MsiSummaryInfoGetProperty</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisummaryinfosetproperty.asp">MsiSummaryInfoSetProperty</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.SummaryInfo.Security">
+            <summary>Gets or sets the Security summary information property.</summary>
+            <remarks><p>
+            The Security summary information property conveys whether the package should be opened as read-only. The database
+            editing tool should not modify a read-only enforced database and should issue a warning at attempts to modify a
+            read-only recommended database. The following values of this property are applicable to Windows Installer files:
+            <list type="bullet">
+            <item>0 - no restriction</item>
+            <item>2 - read only recommended</item>
+            <item>4 - read only enforced</item>
+            </list>
+            </p><p>
+            This property should be set to read-only recommended (2) for an installation database and to read-only
+            enforced (4) for a transform or patch.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisummaryinfogetproperty.asp">MsiSummaryInfoGetProperty</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msisummaryinfosetproperty.asp">MsiSummaryInfoSetProperty</a>
+            </p></remarks>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.TableCollection">
+            <summary>
+            Contains information about all the tables in a Windows Installer database.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.TableCollection.Add(Microsoft.Deployment.WindowsInstaller.TableInfo)">
+            <summary>
+            Adds a new table to the database.
+            </summary>
+            <param name="item">information about the table to be added</param>
+            <exception cref="T:System.InvalidOperationException">a table with the same name already exists in the database</exception>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.TableCollection.Clear">
+            <summary>
+            Removes all tables (and all data) from the database.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.TableCollection.Contains(System.String)">
+            <summary>
+            Checks if the database contains a table with the given name.
+            </summary>
+            <param name="item">case-sensitive name of the table to search for</param>
+            <returns>True if the table exists, false otherwise.</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.TableCollection.CopyTo(Microsoft.Deployment.WindowsInstaller.TableInfo[],System.Int32)">
+            <summary>
+            Copies the table information from this collection into an array.
+            </summary>
+            <param name="array">destination array to be filed</param>
+            <param name="arrayIndex">offset into the destination array where copying begins</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.TableCollection.Remove(System.String)">
+            <summary>
+            Removes a table from the database.
+            </summary>
+            <param name="item">case-sensitive name of the table to be removed</param>
+            <returns>true if the table was removed, false if the table did not exist</returns>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.TableCollection.GetEnumerator">
+            <summary>
+            Enumerates the tables in the database.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.TableCollection.Count">
+            <summary>
+            Gets the number of tables in the database.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.TableCollection.IsReadOnly">
+            <summary>
+            Gets a boolean value indicating whether the collection is read-only.
+            A TableCollection is read-only when the database is read-only.
+            </summary>
+            <value>read-only status of the collection</value>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.TableCollection.Item(System.String)">
+            <summary>
+            Gets information about a given table.
+            </summary>
+            <param name="table">case-sensitive name of the table</param>
+            <returns>information about the requested table, or null if the table does not exist in the database</returns>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.TableInfo">
+            <summary>
+            Defines a table in an installation database.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.TableInfo.#ctor(System.String,System.Collections.Generic.ICollection{Microsoft.Deployment.WindowsInstaller.ColumnInfo},System.Collections.Generic.IList{System.String})">
+            <summary>
+            Creates a table definition.
+            </summary>
+            <param name="name">Name of the table.</param>
+            <param name="columns">Columns in the table.</param>
+            <param name="primaryKeys">The primary keys of the table.</param>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.TableInfo.ToString">
+            <summary>
+            Gets a string representation of the table.
+            </summary>
+            <returns>The name of the table.</returns>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.TableInfo.Name">
+            <summary>
+            Gets the name of the table.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.TableInfo.Columns">
+            <summary>
+            Gets information about the columns in this table.
+            </summary>
+            <remarks><p>
+            This property queries the database every time it is called,
+            to ensure the returned values are up-to-date. For best performance,
+            hold onto the returned collection if using it more than once.
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.TableInfo.PrimaryKeys">
+            <summary>
+            Gets the names of the columns that are primary keys of the table.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.TableInfo.SqlCreateString">
+            <summary>
+            Gets an SQL CREATE string that can be used to create the table.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.TableInfo.SqlInsertString">
+            <summary>
+            Gets an SQL INSERT string that can be used insert a new record into the table.
+            </summary>
+            <remarks><p>
+            The values are expressed as question-mark tokens, to be supplied by the record.
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.TableInfo.SqlSelectString">
+            <summary>
+            Gets an SQL SELECT string that can be used to select all columns of the table.
+            </summary>
+            <remarks><p>
+            The columns are listed explicitly in the SELECT string, as opposed to using "SELECT *".
+            </p></remarks>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.ValidationErrorInfo">
+            <summary>
+            Contains specific information about an error encountered by the <see cref="M:Microsoft.Deployment.WindowsInstaller.View.Validate(Microsoft.Deployment.WindowsInstaller.Record)"/>,
+            <see cref="M:Microsoft.Deployment.WindowsInstaller.View.ValidateNew(Microsoft.Deployment.WindowsInstaller.Record)"/>, or <see cref="M:Microsoft.Deployment.WindowsInstaller.View.ValidateFields(Microsoft.Deployment.WindowsInstaller.Record)"/> methods of the
+            <see cref="T:Microsoft.Deployment.WindowsInstaller.View"/> class.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ValidationErrorInfo.Error">
+            <summary>
+            Gets the type of validation error encountered.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.ValidationErrorInfo.Column">
+            <summary>
+            Gets the column containing the error, or null if the error applies to the whole row.
+            </summary>
+        </member>
+        <member name="T:Microsoft.Deployment.WindowsInstaller.View">
+            <summary>
+            A View represents a result set obtained when processing a query using the
+            <see cref="M:Microsoft.Deployment.WindowsInstaller.Database.OpenView(System.String,System.Object[])"/> method of a
+            <see cref="P:Microsoft.Deployment.WindowsInstaller.View.Database"/>. Before any data can be transferred,
+            the query must be executed using the <see cref="M:Microsoft.Deployment.WindowsInstaller.View.Execute(Microsoft.Deployment.WindowsInstaller.Record)"/> method, passing to
+            it all replaceable parameters designated within the SQL query string.
+            </summary>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.View.Execute(Microsoft.Deployment.WindowsInstaller.Record)">
+            <summary>
+            Executes a SQL View query and supplies any required parameters. The query uses the
+            question mark token to represent parameters as described in SQL Syntax. The values of
+            these parameters are passed in as the corresponding fields of a parameter record.
+            </summary>
+            <param name="executeParams">Optional Record that supplies the parameters. This
+            Record contains values to replace the parameter tokens in the SQL query.</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the View could not be executed</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the View handle is invalid</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewexecute.asp">MsiViewExecute</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.View.Execute">
+            <summary>
+            Executes a SQL View query.
+            </summary>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the View could not be executed</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the View handle is invalid</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewexecute.asp">MsiViewExecute</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.View.Fetch">
+            <summary>
+            Fetches the next sequential record from the view, or null if there are no more records.
+            </summary>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the View is not in an active state</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the View handle is invalid</exception>
+            <remarks><p>
+            The Record object should be <see cref="M:Microsoft.Deployment.WindowsInstaller.InstallerHandle.Close"/>d after use.
+            It is best that the handle be closed manually as soon as it is no longer
+            needed, as leaving lots of unused handles open can degrade performance.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewfetch.asp">MsiViewFetch</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.View.Modify(Microsoft.Deployment.WindowsInstaller.ViewModifyMode,Microsoft.Deployment.WindowsInstaller.Record)">
+            <summary>
+            Updates a fetched Record.
+            </summary>
+            <param name="mode">specifies the modify mode</param>
+            <param name="record">the Record to modify</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the modification failed,
+            or a validation was requested and the data did not pass</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the View handle is invalid</exception>
+            <remarks><p>
+            You can update or delete a record immediately after inserting, or seeking provided you
+            have NOT modified the 0th field of the inserted or sought record.
+            </p><p>
+            To execute any SQL statement, a View must be created. However, a View that does not
+            create a result set, such as CREATE TABLE, or INSERT INTO, cannot be used with any of
+            the Modify methods to update tables though the view.
+            </p><p>
+            You cannot fetch a record containing binary data from one database and then use
+            that record to insert the data into another database. To move binary data from one database
+            to another, you should export the data to a file and then import it into the new database
+            using a query and the <see cref="M:Microsoft.Deployment.WindowsInstaller.Record.SetStream(System.Int32,System.String)"/>. This ensures that each database has
+            its own copy of the binary data.
+            </p><p>
+            Note that custom actions can only add, modify, or remove temporary rows, columns,
+            or tables from a database. Custom actions cannot modify persistent data in a database,
+            such as data that is a part of the database stored on disk.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewmodify.asp">MsiViewModify</a>
+            </p></remarks>
+            <seealso cref="M:Microsoft.Deployment.WindowsInstaller.View.Refresh(Microsoft.Deployment.WindowsInstaller.Record)"/>
+            <seealso cref="M:Microsoft.Deployment.WindowsInstaller.View.Insert(Microsoft.Deployment.WindowsInstaller.Record)"/>
+            <seealso cref="M:Microsoft.Deployment.WindowsInstaller.View.Update(Microsoft.Deployment.WindowsInstaller.Record)"/>
+            <seealso cref="M:Microsoft.Deployment.WindowsInstaller.View.Assign(Microsoft.Deployment.WindowsInstaller.Record)"/>
+            <seealso cref="M:Microsoft.Deployment.WindowsInstaller.View.Replace(Microsoft.Deployment.WindowsInstaller.Record)"/>
+            <seealso cref="M:Microsoft.Deployment.WindowsInstaller.View.Delete(Microsoft.Deployment.WindowsInstaller.Record)"/>
+            <seealso cref="M:Microsoft.Deployment.WindowsInstaller.View.InsertTemporary(Microsoft.Deployment.WindowsInstaller.Record)"/>
+            <seealso cref="M:Microsoft.Deployment.WindowsInstaller.View.Seek(Microsoft.Deployment.WindowsInstaller.Record)"/>
+            <seealso cref="M:Microsoft.Deployment.WindowsInstaller.View.Merge(Microsoft.Deployment.WindowsInstaller.Record)"/>
+            <seealso cref="M:Microsoft.Deployment.WindowsInstaller.View.Validate(Microsoft.Deployment.WindowsInstaller.Record)"/>
+            <seealso cref="M:Microsoft.Deployment.WindowsInstaller.View.ValidateNew(Microsoft.Deployment.WindowsInstaller.Record)"/>
+            <seealso cref="M:Microsoft.Deployment.WindowsInstaller.View.ValidateFields(Microsoft.Deployment.WindowsInstaller.Record)"/>
+            <seealso cref="M:Microsoft.Deployment.WindowsInstaller.View.ValidateDelete(Microsoft.Deployment.WindowsInstaller.Record)"/>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.View.Refresh(Microsoft.Deployment.WindowsInstaller.Record)">
+            <summary>
+            Refreshes the data in a Record.
+            </summary>
+            <param name="record">the Record to be refreshed</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the refresh failed</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the View handle is invalid</exception>
+            <remarks><p>
+            The Record must have been obtained by calling <see cref="M:Microsoft.Deployment.WindowsInstaller.View.Fetch"/>. Fails with
+            a deleted Record. Works only with read-write Records.
+            </p><p>
+            See <see cref="M:Microsoft.Deployment.WindowsInstaller.View.Modify(Microsoft.Deployment.WindowsInstaller.ViewModifyMode,Microsoft.Deployment.WindowsInstaller.Record)"/> for more remarks.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewmodify.asp">MsiViewModify</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.View.Insert(Microsoft.Deployment.WindowsInstaller.Record)">
+            <summary>
+            Inserts a Record into the view.
+            </summary>
+            <param name="record">the Record to be inserted</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the insertion failed</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the View handle is invalid</exception>
+            <remarks><p>
+            Fails if a row with the same primary keys exists. Fails with a read-only database.
+            This method cannot be used with a View containing joins.
+            </p><p>
+            See <see cref="M:Microsoft.Deployment.WindowsInstaller.View.Modify(Microsoft.Deployment.WindowsInstaller.ViewModifyMode,Microsoft.Deployment.WindowsInstaller.Record)"/> for more remarks.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewmodify.asp">MsiViewModify</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.View.Update(Microsoft.Deployment.WindowsInstaller.Record)">
+            <summary>
+            Updates the View with new data from the Record.
+            </summary>
+            <param name="record">the new data</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the update failed</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the View handle is invalid</exception>
+            <remarks><p>
+            Only non-primary keys can be updated. The Record must have been obtained by calling
+            <see cref="M:Microsoft.Deployment.WindowsInstaller.View.Fetch"/>. Fails with a deleted Record. Works only with read-write Records.
+            </p><p>
+            See <see cref="M:Microsoft.Deployment.WindowsInstaller.View.Modify(Microsoft.Deployment.WindowsInstaller.ViewModifyMode,Microsoft.Deployment.WindowsInstaller.Record)"/> for more remarks.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewmodify.asp">MsiViewModify</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.View.Assign(Microsoft.Deployment.WindowsInstaller.Record)">
+            <summary>
+            Updates or inserts a Record into the View.
+            </summary>
+            <param name="record">the Record to be assigned</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the assignment failed</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the View handle is invalid</exception>
+            <remarks><p>
+            Updates record if the primary keys match an existing row and inserts if they do not match.
+            Fails with a read-only database. This method cannot be used with a View containing joins.
+            </p><p>
+            See <see cref="M:Microsoft.Deployment.WindowsInstaller.View.Modify(Microsoft.Deployment.WindowsInstaller.ViewModifyMode,Microsoft.Deployment.WindowsInstaller.Record)"/> for more remarks.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewmodify.asp">MsiViewModify</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.View.Replace(Microsoft.Deployment.WindowsInstaller.Record)">
+            <summary>
+            Updates or deletes and inserts a Record into the View.
+            </summary>
+            <param name="record">the Record to be replaced</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the replacement failed</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the View handle is invalid</exception>
+            <remarks><p>
+            The Record must have been obtained by calling <see cref="M:Microsoft.Deployment.WindowsInstaller.View.Fetch"/>. Updates record if the
+            primary keys are unchanged. Deletes old row and inserts new if primary keys have changed.
+            Fails with a read-only database. This method cannot be used with a View containing joins.
+            </p><p>
+            See <see cref="M:Microsoft.Deployment.WindowsInstaller.View.Modify(Microsoft.Deployment.WindowsInstaller.ViewModifyMode,Microsoft.Deployment.WindowsInstaller.Record)"/> for more remarks.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewmodify.asp">MsiViewModify</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.View.Delete(Microsoft.Deployment.WindowsInstaller.Record)">
+            <summary>
+            Deletes a Record from the View.
+            </summary>
+            <param name="record">the Record to be deleted</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the deletion failed</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the View handle is invalid</exception>
+            <remarks><p>
+            The Record must have been obtained by calling <see cref="M:Microsoft.Deployment.WindowsInstaller.View.Fetch"/>. Fails if the row has been
+            deleted. Works only with read-write records. This method cannot be used with a View containing joins.
+            </p><p>
+            See <see cref="M:Microsoft.Deployment.WindowsInstaller.View.Modify(Microsoft.Deployment.WindowsInstaller.ViewModifyMode,Microsoft.Deployment.WindowsInstaller.Record)"/> for more remarks.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewmodify.asp">MsiViewModify</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.View.InsertTemporary(Microsoft.Deployment.WindowsInstaller.Record)">
+            <summary>
+            Inserts a Record into the View.  The inserted data is not persistent.
+            </summary>
+            <param name="record">the Record to be inserted</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the insertion failed</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the View handle is invalid</exception>
+            <remarks><p>
+            Fails if a row with the same primary key exists. Works only with read-write records.
+            This method cannot be used with a View containing joins.
+            </p><p>
+            See <see cref="M:Microsoft.Deployment.WindowsInstaller.View.Modify(Microsoft.Deployment.WindowsInstaller.ViewModifyMode,Microsoft.Deployment.WindowsInstaller.Record)"/> for more remarks.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewmodify.asp">MsiViewModify</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.View.Seek(Microsoft.Deployment.WindowsInstaller.Record)">
+            <summary>
+            Refreshes the information in the supplied record without changing the position
+            in the result set and without affecting subsequent fetch operations.
+            </summary>
+            <param name="record">the Record to be filled with the result of the seek</param>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the seek failed</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the View handle is invalid</exception>
+            <remarks><p>
+            After seeking, the Record may then be used for subsequent Update, Delete, and Refresh
+            operations.  All primary key columns of the table must be in the query and the Record must
+            have at least as many fields as the query. Seek cannot be used with multi-table queries.
+            This method cannot be used with a View containing joins.
+            </p><p>
+            See <see cref="M:Microsoft.Deployment.WindowsInstaller.View.Modify(Microsoft.Deployment.WindowsInstaller.ViewModifyMode,Microsoft.Deployment.WindowsInstaller.Record)"/> for more remarks.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewmodify.asp">MsiViewModify</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.View.Merge(Microsoft.Deployment.WindowsInstaller.Record)">
+            <summary>
+            Inserts or validates a record.
+            </summary>
+            <param name="record">the Record to be merged</param>
+            <returns>true if the record was inserted or validated, false if there is an existing
+            record with the same primary keys that is not identical</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the merge failed (for a reason other than invalid data)</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the View handle is invalid</exception>
+            <remarks><p>
+            Works only with read-write records. This method cannot be used with a
+            View containing joins.
+            </p><p>
+            See <see cref="M:Microsoft.Deployment.WindowsInstaller.View.Modify(Microsoft.Deployment.WindowsInstaller.ViewModifyMode,Microsoft.Deployment.WindowsInstaller.Record)"/> for more remarks.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewmodify.asp">MsiViewModify</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.View.Validate(Microsoft.Deployment.WindowsInstaller.Record)">
+            <summary>
+            Validates a record, returning information about any errors.
+            </summary>
+            <param name="record">the Record to be validated</param>
+            <returns>null if the record was validated; if there is an existing record with
+            the same primary keys that has conflicting data then error information is returned</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the validation failed (for a reason other than invalid data)</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the View handle is invalid</exception>
+            <remarks><p>
+            The Record must have been obtained by calling <see cref="M:Microsoft.Deployment.WindowsInstaller.View.Fetch"/>.
+            Works with read-write and read-only records. This method cannot be used
+            with a View containing joins.
+            </p><p>
+            See <see cref="M:Microsoft.Deployment.WindowsInstaller.View.Modify(Microsoft.Deployment.WindowsInstaller.ViewModifyMode,Microsoft.Deployment.WindowsInstaller.Record)"/> for more remarks.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewmodify.asp">MsiViewModify</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewgeterror.asp">MsiViewGetError</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.View.ValidateNew(Microsoft.Deployment.WindowsInstaller.Record)">
+            <summary>
+            Validates a new record, returning information about any errors.
+            </summary>
+            <param name="record">the Record to be validated</param>
+            <returns>null if the record was validated; if there is an existing
+            record with the same primary keys then error information is returned</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the validation failed (for a reason other than invalid data)</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the View handle is invalid</exception>
+            <remarks><p>
+            Checks for duplicate keys. The Record must have been obtained by
+            calling <see cref="M:Microsoft.Deployment.WindowsInstaller.View.Fetch"/>. Works with read-write and read-only records.
+            This method cannot be used with a View containing joins.
+            </p><p>
+            See <see cref="M:Microsoft.Deployment.WindowsInstaller.View.Modify(Microsoft.Deployment.WindowsInstaller.ViewModifyMode,Microsoft.Deployment.WindowsInstaller.Record)"/> for more remarks.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewmodify.asp">MsiViewModify</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewgeterror.asp">MsiViewGetError</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.View.ValidateFields(Microsoft.Deployment.WindowsInstaller.Record)">
+            <summary>
+            Validates fields of a fetched or new record, returning information about any errors.
+            Can validate one or more fields of an incomplete record.
+            </summary>
+            <param name="record">the Record to be validated</param>
+            <returns>null if the record was validated; if there is an existing record with
+            the same primary keys that has conflicting data then error information is returned</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the validation failed (for a reason other than invalid data)</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the View handle is invalid</exception>
+            <remarks><p>
+            Works with read-write and read-only records. This method cannot be used with
+            a View containing joins.
+            </p><p>
+            See <see cref="M:Microsoft.Deployment.WindowsInstaller.View.Modify(Microsoft.Deployment.WindowsInstaller.ViewModifyMode,Microsoft.Deployment.WindowsInstaller.Record)"/> for more remarks.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewmodify.asp">MsiViewModify</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewgeterror.asp">MsiViewGetError</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.View.ValidateDelete(Microsoft.Deployment.WindowsInstaller.Record)">
+            <summary>
+            Validates a record that will be deleted later, returning information about any errors.
+            </summary>
+            <param name="record">the Record to be validated</param>
+            <returns>null if the record is safe to delete; if another row refers to
+            the primary keys of this row then error information is returned</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the validation failed (for a reason other than invalid data)</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the View handle is invalid</exception>
+            <remarks><p>
+            Validation does not check for the existence of the primary keys of this row in properties
+            or strings. Does not check if a column is a foreign key to multiple tables. Works with
+            read-write and read-only records. This method cannot be used with a View containing joins.
+            </p><p>
+            See <see cref="M:Microsoft.Deployment.WindowsInstaller.View.Modify(Microsoft.Deployment.WindowsInstaller.ViewModifyMode,Microsoft.Deployment.WindowsInstaller.Record)"/> for more remarks.
+            </p><p>
+            Win32 MSI APIs:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewmodify.asp">MsiViewModify</a>,
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewgeterror.asp">MsiViewGetError</a>
+            </p></remarks>
+        </member>
+        <member name="M:Microsoft.Deployment.WindowsInstaller.View.GetEnumerator">
+            <summary>
+            Enumerates over the Records retrieved by the View.
+            </summary>
+            <returns>An enumerator of Record objects.</returns>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">The View was not <see cref="M:Microsoft.Deployment.WindowsInstaller.View.Execute(Microsoft.Deployment.WindowsInstaller.Record)"/>d before attempting the enumeration.</exception>
+            <remarks><p>
+            Each Record object should be <see cref="M:Microsoft.Deployment.WindowsInstaller.InstallerHandle.Close"/>d after use.
+            It is best that the handle be closed manually as soon as it is no longer
+            needed, as leaving lots of unused handles open can degrade performance.
+            However, note that it is not necessary to complete the enumeration just
+            for the purpose of closing handles, because Records are fetched lazily
+            on each step of the enumeration.
+            </p><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewfetch.asp">MsiViewFetch</a>
+            </p></remarks>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.View.Database">
+            <summary>
+            Gets the Database on which this View was opened.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.View.QueryString">
+            <summary>
+            Gets the SQL query string used to open this View.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.View.Tables">
+            <summary>
+            Gets the set of tables that were included in the SQL query for this View.
+            </summary>
+        </member>
+        <member name="P:Microsoft.Deployment.WindowsInstaller.View.Columns">
+            <summary>
+            Gets the set of columns that were included in the query for this View,
+            or null if this view is not a SELECT query.
+            </summary>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InstallerException">the View is not in an active state</exception>
+            <exception cref="T:Microsoft.Deployment.WindowsInstaller.InvalidHandleException">the View handle is invalid</exception>
+            <remarks><p>
+            Win32 MSI API:
+            <a href="http://msdn.microsoft.com/library/en-us/msi/setup/msiviewgetcolumninfo.asp">MsiViewGetColumnInfo</a>
+            </p></remarks>
+        </member>
+    </members>
+</doc>
diff --git a/sdk/MsgGen.exe b/sdk/MsgGen.exe
new file mode 100755
index 0000000..8747f1c
--- /dev/null
+++ b/sdk/MsgGen.exe
Binary files differ
diff --git a/sdk/XsdGen.exe b/sdk/XsdGen.exe
new file mode 100755
index 0000000..4b8073f
--- /dev/null
+++ b/sdk/XsdGen.exe
Binary files differ
diff --git a/sdk/XsdStitch.exe b/sdk/XsdStitch.exe
new file mode 100755
index 0000000..ce23986
--- /dev/null
+++ b/sdk/XsdStitch.exe
Binary files differ
diff --git a/sdk/inc/aclutil.h b/sdk/inc/aclutil.h
new file mode 100644
index 0000000..c19e3ab
--- /dev/null
+++ b/sdk/inc/aclutil.h
@@ -0,0 +1,144 @@
+#pragma once
+//-------------------------------------------------------------------------------------------------
+// <copyright file="aclutil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    Access Control List helper functions.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#include <aclapi.h>
+#include <sddl.h>
+
+#define ReleaseSid(x) if (x) { AclFreeSid(x); }
+#define ReleaseNullSid(x) if (x) { AclFreeSid(x); x = NULL; }
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// structs
+struct ACL_ACCESS
+{
+    BOOL fDenyAccess;
+    DWORD dwAccessMask;
+
+    // TODO: consider using a union
+    LPCWSTR pwzAccountName;   // NOTE: the last three items in this structure are ignored if this is not NULL
+
+    SID_IDENTIFIER_AUTHORITY sia;  // used if pwzAccountName is NULL
+    BYTE nSubAuthorityCount;
+    DWORD nSubAuthority[8];
+};
+
+struct ACL_ACE
+{
+    DWORD dwFlags;
+    DWORD dwMask;
+    PSID psid;
+};
+
+
+// functions
+HRESULT DAPI AclCheckAccess(
+    __in HANDLE hToken, 
+    __in ACL_ACCESS* paa
+    );
+HRESULT DAPI AclCheckAdministratorAccess(
+    __in HANDLE hToken
+    );
+HRESULT DAPI AclCheckLocalSystemAccess(
+    __in HANDLE hToken
+    );
+
+HRESULT DAPI AclGetWellKnownSid(
+    __in WELL_KNOWN_SID_TYPE wkst,
+    __deref_out PSID* ppsid
+    );
+HRESULT DAPI AclGetAccountSid(
+    __in_opt LPCWSTR wzSystem,
+    __in_z LPCWSTR wzAccount,
+    __deref_out PSID* ppsid
+    );
+HRESULT DAPI AclGetAccountSidString(
+    __in_z LPCWSTR wzSystem,
+    __in_z LPCWSTR wzAccount,
+    __deref_out_z LPWSTR* ppwzSid
+    );
+
+HRESULT DAPI AclCreateDacl(
+    __in_ecount(cDeny) ACL_ACE rgaaDeny[],
+    __in DWORD cDeny,
+    __in_ecount(cAllow) ACL_ACE rgaaAllow[],
+    __in DWORD cAllow,
+    __deref_out ACL** ppAcl
+    );
+HRESULT DAPI AclAddToDacl(
+    __in ACL* pAcl,
+    __in_ecount_opt(cDeny) const ACL_ACE rgaaDeny[],
+    __in DWORD cDeny,
+    __in_ecount_opt(cAllow) const ACL_ACE rgaaAllow[],
+    __in DWORD cAllow,
+    __deref_out ACL** ppAclNew
+    );
+HRESULT DAPI AclMergeDacls(
+    __in const ACL* pAcl1,
+    __in const ACL* pAcl2,
+    __deref_out ACL** ppAclNew
+    );
+HRESULT DAPI AclCreateDaclOld(
+    __in_ecount(cAclAccesses) ACL_ACCESS* paa,
+    __in DWORD cAclAccesses,
+    __deref_out ACL** ppAcl
+    );
+HRESULT DAPI AclCreateSecurityDescriptor(
+    __in_ecount(cAclAccesses) ACL_ACCESS* paa,
+    __in DWORD cAclAccesses,
+    __deref_out SECURITY_DESCRIPTOR** ppsd
+    );
+HRESULT DAPI AclCreateSecurityDescriptorFromDacl(
+    __in ACL* pACL,
+    __deref_out SECURITY_DESCRIPTOR** ppsd
+    );
+HRESULT __cdecl AclCreateSecurityDescriptorFromString(
+    __deref_out SECURITY_DESCRIPTOR** ppsd,
+    __in_z __format_string LPCWSTR wzSddlFormat,
+    ...
+    );
+HRESULT DAPI AclDuplicateSecurityDescriptor(
+    __in SECURITY_DESCRIPTOR* psd,
+    __deref_out SECURITY_DESCRIPTOR** ppsd
+    );
+HRESULT DAPI AclGetSecurityDescriptor(
+    __in_z LPCWSTR wzObject,
+    __in SE_OBJECT_TYPE sot,
+    __deref_out SECURITY_DESCRIPTOR** ppsd
+    );
+
+HRESULT DAPI AclFreeSid(
+    __in PSID psid
+    );
+HRESULT DAPI AclFreeDacl(
+    __in ACL* pACL
+    );
+HRESULT DAPI AclFreeSecurityDescriptor(
+    __in SECURITY_DESCRIPTOR* psd
+    );
+
+HRESULT DAPI AclAddAdminToSecurityDescriptor(
+    __in SECURITY_DESCRIPTOR* pSecurity,
+    __deref_out SECURITY_DESCRIPTOR** ppSecurityNew
+    );
+#ifdef __cplusplus
+}
+#endif
diff --git a/sdk/inc/apuputil.h b/sdk/inc/apuputil.h
new file mode 100644
index 0000000..0bc870f
--- /dev/null
+++ b/sdk/inc/apuputil.h
@@ -0,0 +1,97 @@
+#pragma once
+//-------------------------------------------------------------------------------------------------
+// <copyright file="apuputil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    Header for Application Update helper functions.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ReleaseApupChain(p) if (p) { ApupFreeChain(p); p = NULL; }
+#define ReleaseNullApupChain(p) if (p) { ApupFreeChain(p); p = NULL; }
+
+
+const LPCWSTR APPLICATION_SYNDICATION_NAMESPACE = L"http://appsyndication.org/2006/appsyn";
+
+enum APUP_HASH_ALGORITHM
+{
+    APUP_HASH_ALGORITHM_UNKNOWN,
+    APUP_HASH_ALGORITHM_MD5,
+    APUP_HASH_ALGORITHM_SHA1,
+    APUP_HASH_ALGORITHM_SHA256,
+};
+
+
+struct APPLICATION_UPDATE_ENCLOSURE
+{
+    LPWSTR wzUrl;
+    LPWSTR wzLocalName;
+    DWORD64 dw64Size;
+
+    BYTE* rgbDigest;
+    DWORD cbDigest;
+    APUP_HASH_ALGORITHM digestAlgorithm;
+
+    BOOL fInstaller;
+};
+
+
+struct APPLICATION_UPDATE_ENTRY
+{
+    LPWSTR wzApplicationId;
+    LPWSTR wzApplicationType;
+
+    DWORD64 dw64Version;
+    LPWSTR wzUpgradeId;
+    DWORD64 dw64UpgradeVersion;
+    BOOL fUpgradeExclusive;
+
+    DWORD64 dw64TotalSize;
+
+    DWORD cEnclosures;
+    APPLICATION_UPDATE_ENCLOSURE* rgEnclosures;
+};
+
+
+struct APPLICATION_UPDATE_CHAIN
+{
+    LPWSTR wzDefaultApplicationId;
+    LPWSTR wzDefaultApplicationType;
+
+    DWORD cEntries;
+    APPLICATION_UPDATE_ENTRY* rgEntries;
+};
+
+
+HRESULT DAPI ApupAllocChainFromAtom(
+    __in ATOM_FEED* pFeed,
+    __out APPLICATION_UPDATE_CHAIN** ppChain
+    );
+
+HRESULT DAPI ApupFilterChain(
+    __in APPLICATION_UPDATE_CHAIN* pChain,
+    __in DWORD64 dw64Version,
+    __out APPLICATION_UPDATE_CHAIN** ppFilteredChain
+    );
+
+void DAPI ApupFreeChain(
+    __in APPLICATION_UPDATE_CHAIN* pChain
+    );
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/sdk/inc/atomutil.h b/sdk/inc/atomutil.h
new file mode 100644
index 0000000..e194a8f
--- /dev/null
+++ b/sdk/inc/atomutil.h
@@ -0,0 +1,163 @@
+//-------------------------------------------------------------------------------------------------
+// <copyright file="atomutil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    ATOM helper funtions.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#pragma once
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ReleaseAtomFeed(p) if (p) { AtomFreeFeed(p); }
+#define ReleaseNullAtomFeed(p) if (p) { AtomFreeFeed(p); p = NULL; }
+
+
+struct ATOM_UNKNOWN_ATTRIBUTE
+{
+    LPWSTR wzNamespace;
+    LPWSTR wzAttribute;
+    LPWSTR wzValue;
+
+    ATOM_UNKNOWN_ATTRIBUTE* pNext;
+};
+
+struct ATOM_UNKNOWN_ELEMENT
+{
+    LPWSTR wzNamespace;
+    LPWSTR wzElement;
+    LPWSTR wzValue;
+
+    ATOM_UNKNOWN_ATTRIBUTE* pAttributes;
+    ATOM_UNKNOWN_ELEMENT* pNext;
+};
+
+struct ATOM_LINK
+{
+    LPWSTR wzRel;
+    LPWSTR wzTitle;
+    LPWSTR wzType;
+    LPWSTR wzUrl;
+    LPWSTR wzValue;
+    DWORD64 dw64Length;
+
+    ATOM_UNKNOWN_ATTRIBUTE* pUnknownAttributes;
+    ATOM_UNKNOWN_ELEMENT* pUnknownElements;
+};
+
+struct ATOM_CONTENT
+{
+    LPWSTR wzType;
+    LPWSTR wzUrl;
+    LPWSTR wzValue;
+
+    ATOM_UNKNOWN_ELEMENT* pUnknownElements;
+};
+
+struct ATOM_AUTHOR
+{
+    LPWSTR wzName;
+    LPWSTR wzEmail;
+    LPWSTR wzUrl;
+};
+
+struct ATOM_CATEGORY
+{
+    LPWSTR wzLabel;
+    LPWSTR wzScheme;
+    LPWSTR wzTerm;
+
+    ATOM_UNKNOWN_ELEMENT* pUnknownElements;
+};
+
+struct ATOM_ENTRY
+{
+    LPWSTR wzId;
+    LPWSTR wzSummary;
+    LPWSTR wzTitle;
+    FILETIME ftPublished;
+    FILETIME ftUpdated;
+
+    ATOM_CONTENT* pContent;
+
+    DWORD cAuthors;
+    ATOM_AUTHOR* rgAuthors;
+
+    DWORD cCategories;
+    ATOM_CATEGORY* rgCategories;
+
+    DWORD cLinks;
+    ATOM_LINK* rgLinks;
+
+    IXMLDOMNode* pixn;
+    ATOM_UNKNOWN_ELEMENT* pUnknownElements;
+};
+
+struct ATOM_FEED
+{
+    LPWSTR wzGenerator;
+    LPWSTR wzIcon;
+    LPWSTR wzId;
+    LPWSTR wzLogo;
+    LPWSTR wzSubtitle;
+    LPWSTR wzTitle;
+    FILETIME ftUpdated;
+
+    DWORD cAuthors;
+    ATOM_AUTHOR* rgAuthors;
+
+    DWORD cCategories;
+    ATOM_CATEGORY* rgCategories;
+
+    DWORD cEntries;
+    ATOM_ENTRY* rgEntries;
+
+    DWORD cLinks;
+    ATOM_LINK* rgLinks;
+
+    IXMLDOMNode* pixn;
+    ATOM_UNKNOWN_ELEMENT* pUnknownElements;
+};
+
+HRESULT DAPI AtomInitialize(
+    );
+
+void DAPI AtomUninitialize(
+    );
+
+HRESULT DAPI AtomParseFromString(
+    __in_z LPCWSTR wzAtomString,
+    __out ATOM_FEED **ppFeed
+    );
+
+HRESULT DAPI AtomParseFromFile(
+    __in_z LPCWSTR wzAtomFile,
+    __out ATOM_FEED **ppFeed
+    );
+
+HRESULT DAPI AtomParseFromDocument(
+    __in IXMLDOMDocument* pixdDocument,
+    __out ATOM_FEED **ppFeed
+    );
+
+void DAPI AtomFreeFeed(
+    __in_xcount(pFeed->cItems) ATOM_FEED *pFEED
+    );
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/sdk/inc/buffutil.h b/sdk/inc/buffutil.h
new file mode 100644
index 0000000..a6d9109
--- /dev/null
+++ b/sdk/inc/buffutil.h
@@ -0,0 +1,86 @@
+//-------------------------------------------------------------------------------------------------
+// <copyright file="buffutil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+//
+// <summary>
+//    Binary serialization helper functions.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#pragma once
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+// macro definitions
+
+#define ReleaseBuffer ReleaseMem
+#define ReleaseNullBuffer ReleaseNullMem
+#define BuffFree MemFree
+
+
+// function declarations
+
+HRESULT BuffReadNumber(
+    __in_bcount(cbBuffer) const BYTE* pbBuffer,
+    __in SIZE_T cbBuffer,
+    __inout SIZE_T* piBuffer,
+    __out DWORD* pdw
+    );
+HRESULT BuffReadNumber64(
+    __in_bcount(cbBuffer) const BYTE* pbBuffer,
+    __in SIZE_T cbBuffer,
+    __inout SIZE_T* piBuffer,
+    __out DWORD64* pdw64
+    );
+HRESULT BuffReadString(
+    __in_bcount(cbBuffer) const BYTE* pbBuffer,
+    __in SIZE_T cbBuffer,
+    __inout SIZE_T* piBuffer,
+    __deref_out_z LPWSTR* pscz
+    );
+HRESULT BuffReadStream(
+    __in_bcount(cbBuffer) const BYTE* pbBuffer,
+    __in SIZE_T cbBuffer,
+    __inout SIZE_T* piBuffer,
+    __deref_out_bcount(*pcbStream) BYTE** ppbStream,
+    __out SIZE_T* pcbStream
+    );
+
+HRESULT BuffWriteNumber(
+    __deref_out_bcount(*piBuffer) BYTE** ppbBuffer,
+    __inout SIZE_T* piBuffer,
+    __in DWORD dw
+    );
+HRESULT BuffWriteNumber64(
+    __deref_out_bcount(*piBuffer) BYTE** ppbBuffer,
+    __inout SIZE_T* piBuffer,
+    __in DWORD64 dw64
+    );
+HRESULT BuffWriteString(
+    __deref_out_bcount(*piBuffer) BYTE** ppbBuffer,
+    __inout SIZE_T* piBuffer,
+    __in_z LPCWSTR scz
+    );
+HRESULT BuffWriteStream(
+    __deref_out_bcount(*piBuffer) BYTE** ppbBuffer,
+    __inout SIZE_T* piBuffer,
+    __in_bcount(cbStream) const BYTE* pbStream,
+    __in SIZE_T cbStream
+    );
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/sdk/inc/cabcutil.h b/sdk/inc/cabcutil.h
new file mode 100644
index 0000000..e6a9d74
--- /dev/null
+++ b/sdk/inc/cabcutil.h
@@ -0,0 +1,68 @@
+#pragma once
+//-------------------------------------------------------------------------------------------------
+// <copyright file="cabcutil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    Header for cabinet creation helper functions.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#include <fci.h>
+#include <fcntl.h>
+#include <msi.h>
+
+#define CAB_MAX_SIZE 0x7FFFFFFF   // (see KB: Q174866)
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// time vs. space trade-off
+enum COMPRESSION_TYPE 
+{ 
+    COMPRESSION_TYPE_NONE, // fastest
+    COMPRESSION_TYPE_LOW, 
+    COMPRESSION_TYPE_MEDIUM,
+    COMPRESSION_TYPE_HIGH, // smallest
+    COMPRESSION_TYPE_MSZIP
+};
+
+// functions
+HRESULT DAPI CabCBegin(
+    __in_z LPCWSTR wzCab,
+    __in_z LPCWSTR wzCabDir,
+    __in DWORD dwMaxFiles,
+    __in DWORD dwMaxSize,
+    __in DWORD dwMaxThresh,
+    __in COMPRESSION_TYPE ct,
+    __out HANDLE *phContext
+    );
+HRESULT DAPI CabCNextCab(
+    __in HANDLE hContext
+    );
+HRESULT DAPI CabCAddFile(
+    __in_z LPCWSTR wzFile,
+    __in_z_opt LPCWSTR wzToken,
+    __in_opt PMSIFILEHASHINFO pmfHash,
+    __in HANDLE hContext
+    );
+HRESULT DAPI CabCFinish(
+    __in HANDLE hContext
+    );
+void DAPI CabCCancel(
+    __in HANDLE hContext
+    );
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/sdk/inc/cabutil.h b/sdk/inc/cabutil.h
new file mode 100644
index 0000000..0ae23d5
--- /dev/null
+++ b/sdk/inc/cabutil.h
@@ -0,0 +1,71 @@
+#pragma once
+//-------------------------------------------------------------------------------------------------
+// <copyright file="cabutil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    Header for cabinet decompression helper functions
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#include <fdi.h>
+#include <sys\stat.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// structs
+
+
+// callback function prototypes
+typedef HRESULT (*CAB_CALLBACK_OPEN_FILE)(LPCWSTR wzFile, INT_PTR* ppFile);
+typedef HRESULT (*CAB_CALLBACK_READ_FILE)(INT_PTR pFile, LPVOID pvData, DWORD cbData, DWORD* pcbRead);
+typedef HRESULT (*CAB_CALLBACK_WRITE_FILE)(INT_PTR pFile, LPVOID pvData, DWORD cbData, DWORD* pcbRead);
+typedef LONG (*CAB_CALLBACK_SEEK_FILE)(INT_PTR pFile, DWORD dwMove, DWORD dwMoveMethod);
+typedef HRESULT (*CAB_CALLBACK_CLOSE_FILE)(INT_PTR pFile);
+
+typedef HRESULT (*CAB_CALLBACK_BEGIN_FILE)(LPCWSTR wzFileId, FILETIME* pftFileTime, DWORD cbFileSize, LPVOID pvContext, INT_PTR* ppFile);
+typedef HRESULT (*CAB_CALLBACK_END_FILE)(LPCWSTR wzFileId, LPVOID pvContext, INT_PTR pFile);
+typedef HRESULT (*CAB_CALLBACK_PROGRESS)(BOOL fBeginFile, LPCWSTR wzFileId, LPVOID pvContext);
+
+// function type with calling convention of __stdcall that .NET 1.1 understands only
+// .NET 2.0 will not need this
+typedef INT_PTR (FAR __stdcall *STDCALL_PFNFDINOTIFY)(FDINOTIFICATIONTYPE fdint, PFDINOTIFICATION pfdin);
+
+
+// functions
+HRESULT DAPI CabInitialize(
+    __in BOOL fDelayLoad
+    );
+void DAPI CabUninitialize(
+    );
+
+HRESULT DAPI CabExtract(
+    __in_z LPCWSTR wzCabinet,
+    __in_z LPCWSTR wzExtractFile,
+    __in_z LPCWSTR wzExtractDir,
+    __in_opt CAB_CALLBACK_PROGRESS pfnProgress,
+    __in_opt LPVOID pvContext,
+    __in DWORD64 dw64EmbeddedOffset
+    );
+
+HRESULT DAPI CabEnumerate(
+    __in_z LPCWSTR wzCabinet,
+    __in_z LPCWSTR wzEnumerateFile,
+    __in STDCALL_PFNFDINOTIFY pfnNotify,
+    __in DWORD64 dw64EmbeddedOffset
+    );
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/sdk/inc/certutil.h b/sdk/inc/certutil.h
new file mode 100644
index 0000000..dc07179
--- /dev/null
+++ b/sdk/inc/certutil.h
@@ -0,0 +1,71 @@
+#pragma once
+//-------------------------------------------------------------------------------------------------
+// <copyright file="certutil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    Certificate helper functions.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+HRESULT DAPI CertReadProperty(
+    __in PCCERT_CONTEXT pCertContext,
+    __in DWORD dwProperty,
+    __deref_out_bound LPVOID pvValue
+    );
+
+HRESULT DAPI GetCryptProvFromCert(
+      __in_opt HWND hwnd,
+      __in PCCERT_CONTEXT pCert,
+      __out HCRYPTPROV *phCryptProv,
+      __out DWORD *pdwKeySpec,
+      __in BOOL *pfDidCryptAcquire,
+      __deref_opt_out LPWSTR *ppwszTmpContainer,
+      __deref_opt_out LPWSTR *ppwszProviderName,
+      __out DWORD *pdwProviderType
+      );
+
+HRESULT DAPI FreeCryptProvFromCert(
+    __in BOOL fAcquired,
+    __in HCRYPTPROV hProv,
+    __in_opt LPWSTR pwszCapiProvider,
+    __in DWORD dwProviderType,
+    __in_opt LPWSTR pwszTmpContainer
+    );
+
+HRESULT DAPI GetProvSecurityDesc(
+      __in HCRYPTPROV hProv,
+      __deref_out SECURITY_DESCRIPTOR** pSecurity
+      );
+
+HRESULT DAPI SetProvSecurityDesc(
+    __in HCRYPTPROV hProv,
+    __in SECURITY_DESCRIPTOR* pSecurity
+    );
+
+BOOL DAPI CertHasPrivateKey(
+    __in PCCERT_CONTEXT pCertContext,
+    __out_opt DWORD* pdwKeySpec
+    );
+
+HRESULT DAPI CertInstallSingleCertificate(
+    __in HCERTSTORE hStore,
+    __in PCCERT_CONTEXT pCertContext,
+    __in LPCWSTR wzName
+    );
+#ifdef __cplusplus
+}
+#endif
diff --git a/sdk/inc/conutil.h b/sdk/inc/conutil.h
new file mode 100644
index 0000000..791a545
--- /dev/null
+++ b/sdk/inc/conutil.h
@@ -0,0 +1,115 @@
+#pragma once
+//-------------------------------------------------------------------------------------------------
+// <copyright file="conutil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    Console helper functions.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ConsoleExitOnFailure(x, c, f) if (FAILED(x)) { ConsoleWriteError(x, c, f); ExitTrace(x, f); goto LExit; }
+#define ConsoleExitOnFailure1(x, c, f, s) if (FAILED(x)) { ConsoleWriteError(x, c, f, s, NULL); ExitTrace1(x, f, s); goto LExit; }
+#define ConsoleExitOnFailure2(x, c, f, s, t) if (FAILED(x)) { ConsoleWriteError(x, c, f, s, t); ExitTrace2(x, f, s, t); goto LExit; }
+#define ConsoleExitOnFailure3(x, c, f, s, t, u) if (FAILED(x)) { ConsoleWriteError(x, c, f, s, t, u); ExitTrace3(x, f, s, t, u); goto LExit; }
+
+#define ConsoleExitOnLastError(x, c, f) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { ConsoleWriteError(x, c, f); ExitTrace(x, f); goto LExit; } }
+#define ConsoleExitOnLastError1(x, c, f, s) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { ConsoleWriteError(x, c, f, s, NULL); ExitTrace1(x, f, s); goto LExit; } }
+#define ConsoleExitOnLastError2(x, c, f, s, t) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { ConsoleWriteError(x, c, f, s, t); ExitTrace2(x, f, s, t); goto LExit; } }
+#define ConsoleExitOnLastError3(x, c, f, s, t, u) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { ConsoleWriteError(x, c, f, s, t, u); ExitTrace3(x, f, s, t, u); goto LExit; } }
+
+#define ConsoleExitOnNull(p, x, e, c, f) if (NULL == p) { x = e; ConsoleWriteError(x, c, f); ExitTrace(x, f); goto LExit; }
+#define ConsoleExitOnNull1(p, x, e, c, f, s) if (NULL == p) { x = e; ConsoleWriteError(x, c, f, s, NULL); ExitTrace1(x, f, s); goto LExit; }
+#define ConsoleExitOnNull2(p, x, e, c, f, s, t) if (NULL == p) { x = e; ConsoleWriteError(x, c, f, s, t); ExitTrace2(x, f, s, t); goto LExit; }
+#define ConsoleExitOnNull3(p, x, e, c, f, s, t, u) if (NULL == p) { x = e; ConsoleWriteError(x, c, f, s, t, u); ExitTrace2(x, f, s, t, u); goto LExit; }
+
+
+// the following macros need to go away
+#define ConsoleTrace(l, f) { ConsoleWriteLine(CONSOLE_COLOR_NORMAL, f); Trace(l, f); }
+#define ConsoleTrace1(l, f, s) { ConsoleWriteLine(CONSOLE_COLOR_NORMAL, f, s); Trace1(l, f, s); }
+#define ConsoleTrace2(l, f, s, t) { ConsoleWriteLine(CONSOLE_COLOR_NORMAL, f, s, t); Trace2(l, f, s, t); }
+#define ConsoleTrace3(l, f, s, t, u) { ConsoleWriteLine(CONSOLE_COLOR_NORMAL, f, s, t, u); Trace3(l, f, s, t, u); }
+
+#define ConsoleWarning(f) { ConsoleWriteLine(CONSOLE_COLOR_YELLOW, f); Trace(REPORT_STANDARD, f); }
+#define ConsoleWarning1(f, s) { ConsoleWriteLine(CONSOLE_COLOR_YELLOW, f, s); Trace1(REPORT_STANDARD, f, s); }
+#define ConsoleWarning2(f, s, t) { ConsoleWriteLine(CONSOLE_COLOR_YELLOW, f, s, t); Trace2(REPORT_STANDARD, f, s, t); }
+#define ConsoleWarning3(f, s, t, u) { ConsoleWriteLine(CONSOLE_COLOR_YELLOW, f, s, t, u); Trace3(REPORT_STANDARD, f, s, t, u); }
+
+#define ConsoleError(x, f) { ConsoleWriteError(x, CONSOLE_COLOR_RED, f); TraceError(x, f); }
+#define ConsoleError1(x, f, s) { ConsoleWriteError(x, CONSOLE_COLOR_RED, f, s); TraceError1(x, f, s); }
+#define ConsoleError2(x, f, s, t) { ConsoleWriteError(x, CONSOLE_COLOR_RED, f, s, t); TraceError2(x, f, s, t); }
+#define ConsoleError3(x, f, s, t, u) { ConsoleWriteError(x, CONSOLE_COLOR_RED, f, s, t, u); TraceError3(x, f, s, t, u); }
+
+
+// enums
+enum CONSOLE_COLOR { CONSOLE_COLOR_NORMAL, CONSOLE_COLOR_RED, CONSOLE_COLOR_YELLOW, CONSOLE_COLOR_GREEN };
+
+// structs
+
+// functions
+HRESULT DAPI ConsoleInitialize();
+void DAPI ConsoleUninitialize();
+
+void DAPI ConsoleGreen();
+void DAPI ConsoleRed();
+void DAPI ConsoleYellow();
+void DAPI ConsoleNormal();
+
+HRESULT DAPI ConsoleWrite(
+    CONSOLE_COLOR cc,
+    __in_z __format_string LPCSTR szFormat,
+    ...
+    );
+HRESULT DAPI ConsoleWriteLine(
+    CONSOLE_COLOR cc,
+    __in_z __format_string LPCSTR szFormat,
+    ...
+    );
+HRESULT DAPI ConsoleWriteError(
+    HRESULT hrError,
+    CONSOLE_COLOR cc,
+    __in_z __format_string LPCSTR szFormat,
+    ...
+    );
+
+HRESULT DAPI ConsoleReadW(
+    __deref_out_z LPWSTR* ppwzBuffer
+    );
+
+HRESULT DAPI ConsoleReadStringA(
+    __deref_out_ecount_part(cchCharBuffer,*pcchNumCharReturn) LPSTR* szCharBuffer,
+    CONST DWORD cchCharBuffer,
+    __out DWORD* pcchNumCharReturn
+    );
+HRESULT DAPI ConsoleReadStringW(
+    __deref_out_ecount_part(cchCharBuffer,*pcchNumCharReturn) LPWSTR* szCharBuffer,
+    CONST DWORD cchCharBuffer,
+    __out DWORD* pcchNumCharReturn
+    );
+
+HRESULT DAPI ConsoleReadNonBlockingW(
+    __deref_out_ecount_opt(*pcchSize) LPWSTR* ppwzBuffer,
+    __out DWORD* pcchSize,
+    BOOL fReadLine
+    );
+
+HRESULT ConsoleSetReadHidden(void);
+HRESULT ConsoleSetReadNormal(void);
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/sdk/inc/cryputil.h b/sdk/inc/cryputil.h
new file mode 100644
index 0000000..2009269
--- /dev/null
+++ b/sdk/inc/cryputil.h
@@ -0,0 +1,49 @@
+//-------------------------------------------------------------------------------------------------
+// <copyright file="cryputil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+//
+// <summary>
+//    Cryptography helper functions.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#pragma once
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+// function declarations
+
+HRESULT CrypHashFile(
+    __in_z LPCWSTR wzFilePath,
+    __in DWORD dwProvType,
+    __in ALG_ID algid,
+    __out_bcount(cbHash) BYTE* pbHash,
+    __in DWORD cbHash,
+    __out_opt DWORD64* pqwBytesHashed
+    );
+
+HRESULT CrypHashFileHandle(
+    __in HANDLE hFile,
+    __in DWORD dwProvType,
+    __in ALG_ID algid,
+    __out_bcount(cbHash) BYTE* pbHash,
+    __in DWORD cbHash,
+    __out_opt DWORD64* pqwBytesHashed
+    );
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/sdk/inc/dictutil.h b/sdk/inc/dictutil.h
new file mode 100644
index 0000000..ed54bb1
--- /dev/null
+++ b/sdk/inc/dictutil.h
@@ -0,0 +1,47 @@
+#pragma once
+//-------------------------------------------------------------------------------------------------
+// <copyright file="dictutil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    Header for string dict helper functions.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void* STRINGDICT_HANDLE;
+
+HRESULT DAPI DictCreate(
+    __out void **ppvHandle,
+    __in DWORD dwNumExpectedItems,
+    __in size_t cByteOffset
+    );
+HRESULT DAPI DictAdd(
+    __in void *pvHandle,
+    __in_z LPCWSTR szString,
+    __in void *pvValue
+    );
+HRESULT DAPI DictGet(
+    __in void *pvHandle,
+    __in_z LPCWSTR szString,
+    __out void **ppvValue
+    );
+void DAPI DictDestroy(
+    __in void *pvHandle
+    );
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/sdk/inc/dirutil.h b/sdk/inc/dirutil.h
new file mode 100644
index 0000000..4dc8ee7
--- /dev/null
+++ b/sdk/inc/dirutil.h
@@ -0,0 +1,58 @@
+//-------------------------------------------------------------------------------------------------
+// <copyright file="dirutil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    Directory helper funtions.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#pragma once
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+BOOL DAPI DirExists(
+    __in_z LPCWSTR wzPath, 
+    __out_opt DWORD *pdwAttributes
+    );
+
+HRESULT DAPI DirCreateTempPath(
+    __in_z LPCWSTR wzPrefix,
+    __out_ecount_z(cchPath) LPWSTR wzPath,
+    __in DWORD cchPath
+    );
+
+HRESULT DAPI DirEnsureExists(
+    __in_z LPCWSTR wzPath, 
+    __in_opt LPSECURITY_ATTRIBUTES psa
+    );
+
+HRESULT DAPI DirEnsureDelete(
+    __in_z LPCWSTR wzPath,
+    __in BOOL fDeleteFiles,
+    __in BOOL fRecurse
+    );
+
+HRESULT DAPI DirGetCurrent(
+    __deref_out_z LPWSTR* psczCurrentDirectory
+    );
+
+HRESULT DAPI DirSetCurrent(
+    __in_z LPCWSTR wzDirectory
+    );
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/sdk/inc/dutil.h b/sdk/inc/dutil.h
new file mode 100644
index 0000000..cc1b4db
--- /dev/null
+++ b/sdk/inc/dutil.h
@@ -0,0 +1,212 @@
+#pragma once
+//-------------------------------------------------------------------------------------------------
+// <copyright file="dutil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    Header for utility layer that provides standard support for asserts, exit macros
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#define DAPI __stdcall
+#define DAPIV __cdecl // used only for functions taking variable length arguments
+
+#define DAPI_(type) EXTERN_C type DAPI
+#define DAPIV_(type) EXTERN_C type DAPIV
+
+
+// enums
+enum REPORT_LEVEL
+{
+    REPORT_NONE,      // turns off report (only valid for XXXSetLevel())
+    REPORT_STANDARD,  // written if reporting is on
+    REPORT_VERBOSE,   // written only if verbose reporting is on
+    REPORT_DEBUG,     // reporting useful when debugging code
+    REPORT_ERROR,     // always gets reported, but can never be specified
+};
+
+// asserts and traces
+typedef BOOL (DAPI *DUTIL_ASSERTDISPLAYFUNCTION)(__in_z LPCSTR sz);
+
+extern "C" void DAPI Dutil_SetAssertModule(__in HMODULE hAssertModule);
+extern "C" void DAPI Dutil_SetAssertDisplayFunction(__in DUTIL_ASSERTDISPLAYFUNCTION pfn);
+extern "C" void DAPI Dutil_Assert(__in_z LPCSTR szFile, __in int iLine);
+extern "C" void DAPI Dutil_AssertSz(__in_z LPCSTR szFile, __in int iLine, __in_z LPCSTR szMsg);
+
+extern "C" void DAPI Dutil_TraceSetLevel(__in REPORT_LEVEL ll, __in BOOL fTraceFilenames);
+extern "C" REPORT_LEVEL DAPI Dutil_TraceGetLevel();
+extern "C" void __cdecl Dutil_Trace(__in_z LPCSTR szFile, __in int iLine, __in REPORT_LEVEL rl, __in_z __format_string LPCSTR szMessage, ...);
+extern "C" void __cdecl Dutil_TraceError(__in_z LPCSTR szFile, __in int iLine, __in REPORT_LEVEL rl, __in HRESULT hr, __in_z __format_string LPCSTR szMessage, ...);
+extern "C" void DAPI Dutil_RootFailure(__in_z LPCSTR szFile, __in int iLine, __in HRESULT hrError);
+
+#ifdef DEBUG
+
+#define AssertSetModule(m) (void)Dutil_SetAssertModule(m)
+#define AssertSetDisplayFunction(pfn) (void)Dutil_SetAssertDisplayFunction(pfn)
+#define Assert(f)          ((f)    ? (void)0 : (void)Dutil_Assert(__FILE__, __LINE__))
+#define AssertSz(f, sz)    ((f)    ? (void)0 : (void)Dutil_AssertSz(__FILE__, __LINE__, sz))
+
+#define TraceSetLevel(l, f) (void)Dutil_TraceSetLevel(l, f)
+#define TraceGetLevel() (REPORT_LEVEL)Dutil_TraceGetLevel()
+#define Trace(l, f) (void)Dutil_Trace(__FILE__, __LINE__, l, f, NULL)
+#define Trace1(l, f, s) (void)Dutil_Trace(__FILE__, __LINE__, l, f, s)
+#define Trace2(l, f, s, t) (void)Dutil_Trace(__FILE__, __LINE__, l, f, s, t)
+#define Trace3(l, f, s, t, u) (void)Dutil_Trace(__FILE__, __LINE__, l, f, s, t, u)
+
+#define TraceError(x, f) (void)Dutil_TraceError(__FILE__, __LINE__, REPORT_ERROR, x, f, NULL)
+#define TraceError1(x, f, s) (void)Dutil_TraceError(__FILE__, __LINE__, REPORT_ERROR, x, f, s)
+#define TraceError2(x, f, s, t) (void)Dutil_TraceError(__FILE__, __LINE__, REPORT_ERROR, x, f, s, t)
+#define TraceError3(x, f, s, t, u) (void)Dutil_TraceError(__FILE__, __LINE__, REPORT_ERROR, x, f, s, t, u)
+
+#define TraceErrorDebug(x, f) (void)Dutil_TraceError(__FILE__, __LINE__, REPORT_DEBUG, x, f, NULL)
+#define TraceErrorDebug1(x, f, s) (void)Dutil_TraceError(__FILE__, __LINE__, REPORT_DEBUG, x, f, s)
+#define TraceErrorDebug2(x, f, s, t) (void)Dutil_TraceError(__FILE__, __LINE__, REPORT_DEBUG, x, f, s, t)
+#define TraceErrorDebug3(x, f, s, t, u) (void)Dutil_TraceError(__FILE__, __LINE__, REPORT_DEBUG, x, f, s, t, u)
+
+#else // !DEBUG
+
+#define AssertSetModule(m)
+#define AssertSetDisplayFunction(pfn)
+#define Assert(f)
+#define AssertSz(f, sz)
+
+#define TraceSetLevel(l, f)
+#define Trace(l, f)
+#define Trace1(l, f, s)
+#define Trace2(l, f, s, t)
+#define Trace3(l, f, s, t, u)
+
+#define TraceError(x, f)
+#define TraceError1(x, f, s)
+#define TraceError2(x, f, s, t)
+#define TraceError3(x, f, s, t, u)
+
+#define TraceErrorDebug(x, f)
+#define TraceErrorDebug1(x, f, s)
+#define TraceErrorDebug2(x, f, s, t)
+#define TraceErrorDebug3(x, f, s, t, u)
+
+#endif // DEBUG
+
+
+// ExitTrace can be overriden
+#ifndef ExitTrace
+#define ExitTrace TraceError
+#endif
+#ifndef ExitTrace1
+#define ExitTrace1 TraceError1
+#endif
+#ifndef ExitTrace2
+#define ExitTrace2 TraceError2
+#endif
+#ifndef ExitTrace3
+#define ExitTrace3 TraceError3
+#endif
+
+// Exit macros
+#define ExitFunction()        { goto LExit; }
+#define ExitFunction1(x)          { x; goto LExit; }
+
+#define ExitOnLastError(x, s) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace(x, s); goto LExit; } }
+#define ExitOnLastError1(x, f, s) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace1(x, f, s); goto LExit; } }
+#define ExitOnLastError2(x, f, s, t) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace2(x, f, s, t); goto LExit; } }
+
+#define ExitOnLastErrorDebugTrace(x, s) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); TraceErrorDebug(x, s); goto LExit; } }
+#define ExitOnLastErrorDebugTrace1(x, f, s) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); TraceErrorDebug1(x, f, s); goto LExit; } }
+#define ExitOnLastErrorDebugTrace2(x, f, s, t) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); TraceErrorDebug2(x, f, s, t); goto LExit; } }
+
+#define ExitWithLastError(x, s) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace(x, s); goto LExit; }
+#define ExitWithLastError1(x, f, s) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace1(x, f, s); goto LExit; }
+#define ExitWithLastError2(x, f, s, t) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace2(x, f, s, t); goto LExit; }
+#define ExitWithLastError3(x, f, s, t, u) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace3(x, f, s, t, u); goto LExit; }
+
+#define ExitOnFailure(x, s)   if (FAILED(x)) { ExitTrace(x, s);  goto LExit; }
+#define ExitOnFailure1(x, f, s)   if (FAILED(x)) { ExitTrace1(x, f, s);  goto LExit; }
+#define ExitOnFailure2(x, f, s, t)   if (FAILED(x)) { ExitTrace2(x, f, s, t);  goto LExit; }
+#define ExitOnFailure3(x, f, s, t, u) if (FAILED(x)) { ExitTrace3(x, f, s, t, u);  goto LExit; }
+
+#define ExitOnRootFailure(x, s)   if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace(x, s);  goto LExit; }
+#define ExitOnRootFailure1(x, f, s)   if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace1(x, f, s);  goto LExit; }
+#define ExitOnRootFailure2(x, f, s, t)   if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace2(x, f, s, t);  goto LExit; }
+#define ExitOnRootFailure3(x, f, s, t, u) if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace3(x, f, s, t, u);  goto LExit; }
+
+#define ExitOnFailureDebugTrace(x, s)   if (FAILED(x)) { TraceErrorDebug(x, s);  goto LExit; }
+#define ExitOnFailureDebugTrace1(x, f, s)   if (FAILED(x)) { TraceErrorDebug1(x, f, s);  goto LExit; }
+#define ExitOnFailureDebugTrace2(x, f, s, t)   if (FAILED(x)) { TraceErrorDebug2(x, f, s, t);  goto LExit; }
+#define ExitOnFailureDebugTrace3(x, f, s, t, u) if (FAILED(x)) { TraceErrorDebug3(x, f, s, t, u);  goto LExit; }
+
+#define ExitOnNull(p, x, e, s)   if (NULL == p) { x = e; Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace(x, s);  goto LExit; }
+#define ExitOnNull1(p, x, e, f, s)   if (NULL == p) { x = e; Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace1(x, f, s);  goto LExit; }
+#define ExitOnNull2(p, x, e, f, s, t)   if (NULL == p) { x = e; Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace2(x, f, s, t);  goto LExit; }
+
+#define ExitOnNullWithLastError(p, x, s) if (NULL == p) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace(x, s); goto LExit; }
+#define ExitOnNullWithLastError1(p, x, f, s) if (NULL == p) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace1(x, f, s); goto LExit; }
+
+#define ExitOnNullDebugTrace(p, x, e, s)   if (NULL == p) { x = e; Dutil_RootFailure(__FILE__, __LINE__, x); TraceErrorDebug(x, s);  goto LExit; }
+#define ExitOnNullDebugTrace1(p, x, e, f, s)   if (NULL == p) { x = e; Dutil_RootFailure(__FILE__, __LINE__, x); TraceErrorDebug1(x, f, s);  goto LExit; }
+
+#define ExitOnInvalidHandleWithLastError(p, x, s) if (INVALID_HANDLE_VALUE == p) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace(x, s); goto LExit; }
+#define ExitOnInvalidHandleWithLastError1(p, x, f, s) if (INVALID_HANDLE_VALUE == p) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace1(x, f, s); goto LExit; }
+
+#define ExitOnWin32Error(e, x, s) if (ERROR_SUCCESS != e) { x = HRESULT_FROM_WIN32(e); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace(x, s); goto LExit; }
+#define ExitOnWin32Error1(e, x, f, s) if (ERROR_SUCCESS != e) { x = HRESULT_FROM_WIN32(e); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace1(x, f, s); goto LExit; }
+
+// release macros
+#define ReleaseObject(x) if (x) { x->Release(); }
+#define ReleaseObjectArray(prg, cel) if (prg) { for (DWORD Dutil_ReleaseObjectArrayIndex = 0; Dutil_ReleaseObjectArrayIndex < cel; ++Dutil_ReleaseObjectArrayIndex) { ReleaseObject(prg[Dutil_ReleaseObjectArrayIndex]); } ReleaseMem(prg); }
+#define ReleaseVariant(x) { ::VariantClear(&x); }
+#define ReleaseNullObject(x) if (x) { (x)->Release(); x = NULL; }
+#define ReleaseCertificate(x) if (x) { ::CertFreeCertificateContext(x); x=NULL; }
+#define ReleaseHandle(x) if (x) { ::CloseHandle(x); x = NULL; }
+
+
+// useful defines and macros
+#define Unused(x) ((void)x)
+
+#ifndef countof
+#if 1
+#define countof(ary) (sizeof(ary) / sizeof(ary[0]))
+#else
+#ifndef __cplusplus
+#define countof(ary) (sizeof(ary) / sizeof(ary[0]))
+#else
+template<typename T> static char countofVerify(void const *, T) throw() { return 0; }
+template<typename T> static void countofVerify(T *const, T *const *) throw() {};
+#define countof(arr) (sizeof(countofVerify(arr,&(arr))) * sizeof(arr)/sizeof(*(arr)))
+#endif
+#endif
+#endif
+
+#define roundup(x, n) roundup_typed(x, n, DWORD)
+#define roundup_typed(x, n, t) (((t)(x) + ((t)(n) - 1)) & ~((t)(n) - 1))
+
+#define HRESULT_FROM_RPC(x) ((HRESULT) ((x) | FACILITY_RPC))
+
+#ifndef MAXSIZE_T
+#define MAXSIZE_T ((SIZE_T)~((SIZE_T)0))
+#endif
+
+typedef const BYTE* LPCBYTE;
+
+#define E_FILENOTFOUND HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)
+#define E_INVALIDSTATE HRESULT_FROM_WIN32(ERROR_INVALID_STATE)
+#define E_MOREDATA HRESULT_FROM_WIN32(ERROR_MORE_DATA)
+#define E_NOMOREITEMS HRESULT_FROM_WIN32(ERROR_NO_MORE_ITEMS)
+#define E_NOTFOUND HRESULT_FROM_WIN32(ERROR_NOT_FOUND)
+#define E_MODNOTFOUND HRESULT_FROM_WIN32(ERROR_MOD_NOT_FOUND)
+
+#define AddRefAndRelease(x) { x->AddRef(); x->Release(); }
+
+#define MAKEQWORDVERSION(mj, mi, b, r) (((DWORD64)MAKELONG(r, b)) | (((DWORD64)MAKELONG(mi, mj)) << 32))
+
+// other functions
+extern "C" HRESULT DAPI LoadSystemLibrary(__in_z LPCWSTR wzModuleName, __out HMODULE *phModule);
diff --git a/sdk/inc/eseutil.h b/sdk/inc/eseutil.h
new file mode 100644
index 0000000..27ec027
--- /dev/null
+++ b/sdk/inc/eseutil.h
@@ -0,0 +1,212 @@
+#pragma once
+//-------------------------------------------------------------------------------------------------
+// <copyright file="eseutil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    Header for Extensible Storage Engine (Jetblue) helper functions.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct COLUMN_SCHEMA
+{
+    JET_COLUMNID jcColumn;
+    LPCWSTR pszName;
+    JET_COLTYP jcColumnType;
+    BOOL fKey; // If this column is part of the key of the table
+    BOOL fFixed;
+    BOOL fNullable;
+    BOOL fAutoIncrement;
+};
+
+struct TABLE_SCHEMA
+{
+    JET_TABLEID jtTable;
+    LPCWSTR pszName;
+    DWORD dwColumns;
+    COLUMN_SCHEMA *pcsColumns;
+};
+
+struct DATABASE_SCHEMA
+{
+    DWORD dwTables;
+    TABLE_SCHEMA *ptsTables;
+};
+
+typedef void* ESE_QUERY_HANDLE;
+
+HRESULT DAPI EseBeginSession(
+    __out JET_INSTANCE *pjiInstance,
+    __out JET_SESID *pjsSession,
+    __in_z LPCWSTR pszInstance,
+    __in_z LPCWSTR pszPath
+    );
+HRESULT DAPI EseEndSession(
+    __in JET_INSTANCE jiInstance,
+    __in JET_SESID jsSession
+    );
+HRESULT DAPI EseEnsureDatabase(
+    __in JET_SESID jsSession,
+    __in_z LPCWSTR pszFile,
+    __in DATABASE_SCHEMA *pdsSchema,
+    __out JET_DBID* pjdbDb,
+    __in BOOL fExclusive,
+    __in BOOL fReadonly
+    );
+HRESULT DAPI EseCloseDatabase(
+    __in JET_SESID jsSession,
+    __in JET_DBID jdbDb
+    );
+HRESULT DAPI EseCreateTable(
+    __in JET_SESID jsSession,
+    __in JET_DBID jdbDb,
+    __in_z LPCWSTR pszTable,
+    __out JET_TABLEID *pjtTable
+    );
+HRESULT DAPI EseOpenTable(
+    __in JET_SESID jsSession,
+    __in JET_DBID jdbDb,
+    __in_z LPCWSTR pszTable,
+    __out JET_TABLEID *pjtTable
+    );
+HRESULT DAPI EseCloseTable(
+    __in JET_SESID jsSession,
+    __in JET_TABLEID jtTable
+    );
+HRESULT DAPI EseEnsureColumn(
+    __in JET_SESID jsSession,
+    __in JET_TABLEID jtTable,
+    __in_z LPCWSTR pszColumnName,
+    __in JET_COLTYP jcColumnType,
+    __in ULONG ulColumnSize,
+    __in BOOL fFixed,
+    __in BOOL fNullable,
+    __out_opt JET_COLUMNID *pjcColumn
+    );
+HRESULT DAPI EseGetColumn(
+    __in JET_SESID jsSession,
+    __in JET_TABLEID jtTable,
+    __in_z LPCWSTR pszColumnName,
+    __out JET_COLUMNID *pjcColumn
+    );
+HRESULT DAPI EseMoveCursor(
+    __in JET_SESID jsSession,
+    __in JET_TABLEID jtTable,
+    __in LONG lRow
+    );
+HRESULT DAPI EseDeleteRow(
+    __in JET_SESID jsSession,
+    __in JET_TABLEID jtTable
+    );
+HRESULT DAPI EseBeginTransaction(
+    __in JET_SESID jsSession
+    );
+HRESULT DAPI EseCommitTransaction(
+    __in JET_SESID jsSession
+    );
+HRESULT DAPI EsePrepareUpdate(
+    __in JET_SESID jsSession,
+    __in JET_TABLEID jtTable,
+    __in ULONG ulPrep
+    );
+HRESULT DAPI EseFinishUpdate(
+    __in JET_SESID jsSession,
+    __in JET_TABLEID jtTable
+    );
+HRESULT DAPI EseSetColumnDword(
+    __in JET_SESID jsSession,
+    __in JET_TABLEID jtTable,
+    __in JET_COLUMNID jcColumn,
+    __in DWORD dwValue
+    );
+// Sets a column value without the need to call begintransaction, prepareupdate, finishupdate, or committransaction (all of these are called in sequence for you)
+HRESULT DAPI EseSetColumnDwordFull(
+    __in JET_SESID jsSession,
+    __in JET_TABLEID jtTable,
+    __in JET_COLUMNID jcColumn,
+    __in DWORD dwValue
+    );
+HRESULT DAPI EseSetColumnString(
+    __in JET_SESID jsSession,
+    __in JET_TABLEID jtTable,
+    __in JET_COLUMNID jcColumn,
+    __in_z LPCWSTR pszValue
+    );
+// Sets a column value without the need to call begintransaction, prepareupdate, finishupdate, or committransaction (all of these are called in sequence for you)
+HRESULT DAPI EseSetColumnStringFull(
+    __in JET_SESID jsSession,
+    __in JET_TABLEID jtTable,
+    __in JET_COLUMNID jcColumn,
+    __in_z LPCWSTR pszValue
+    );
+HRESULT DAPI EseSetColumnEmpty(
+    __in JET_SESID jsSession,
+    __in JET_TABLEID jtTable,
+    __in JET_COLUMNID jcColumn
+    );
+HRESULT DAPI EseSetColumnEmptyFull(
+    __in JET_SESID jsSession,
+    __in JET_TABLEID jtTable,
+    __in JET_COLUMNID jcColumn
+    );
+HRESULT DAPI EseGetColumnDword(
+    __in JET_SESID jsSession,
+    __in JET_TABLEID jtTable,
+    __in JET_COLUMNID jcColumn,
+    __out DWORD *pdwValue
+    );
+HRESULT DAPI EseGetColumnString(
+    __in JET_SESID jsSession,
+    __in JET_TABLEID jtTable,
+    __in JET_COLUMNID jcColumn,
+    __out LPWSTR *ppszValue
+    );
+
+// Call this once for each key column in the table
+HRESULT DAPI EseBeginQuery(
+    __in JET_SESID jsSession,
+    __in JET_TABLEID jtTable,
+    __in BOOL fExact,
+    __out ESE_QUERY_HANDLE *peqhHandle
+    );
+HRESULT DAPI EseSetQueryColumnDword(
+    __in JET_SESID jsSession,
+    __in JET_TABLEID jtTable,
+    __in ESE_QUERY_HANDLE eqhHandle,
+    __in DWORD dwData,
+    __in BOOL fFinal // If this is true, all other key columns in the query will be set to "*"
+    );
+HRESULT DAPI EseSetQueryColumnString(
+    __in JET_SESID jsSession,
+    __in JET_TABLEID jtTable,
+    __in ESE_QUERY_HANDLE eqhHandle,
+    __in_z LPCWSTR pszString,
+    __in BOOL fFinal // If this is true, all other key columns in the query will be set to "*"
+    );
+// This frees the query handle without actually running the query
+void DAPI EseFreeQuery(
+    __in ESE_QUERY_HANDLE eqhHandle
+    );
+// Once all columns have been set up, call this and read the result
+HRESULT DAPI EseRunQuery(
+    __in JET_SESID jsSession,
+    __in JET_TABLEID jtTable,
+    __in ESE_QUERY_HANDLE eqhHandle
+    );
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/sdk/inc/fileutil.h b/sdk/inc/fileutil.h
new file mode 100644
index 0000000..327a358
--- /dev/null
+++ b/sdk/inc/fileutil.h
@@ -0,0 +1,176 @@
+#pragma once
+//-------------------------------------------------------------------------------------------------
+// <copyright file="fileutil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    Header for file helper functions.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ReleaseFile(h) if (INVALID_HANDLE_VALUE != h) { ::CloseHandle(h); h = INVALID_HANDLE_VALUE; }
+#define ReleaseFileHandle(h) if (INVALID_HANDLE_VALUE != h) { ::CloseHandle(h); h = INVALID_HANDLE_VALUE; }
+#define ReleaseFileFindHandle(h) if (INVALID_HANDLE_VALUE != h) { ::FindClose(h); h = INVALID_HANDLE_VALUE; }
+
+enum FILE_ARCHITECTURE
+{
+    FILE_ARCHITECTURE_UNKNOWN,
+    FILE_ARCHITECTURE_X86,
+    FILE_ARCHITECTURE_X64,
+    FILE_ARCHITECTURE_IA64,
+};
+
+
+LPWSTR DAPI FileFromPath(
+    __in_z LPCWSTR wzPath
+    );
+HRESULT DAPI FileResolvePath(
+    __in_z LPCWSTR wzRelativePath,
+    __out LPWSTR *ppwzFullPath
+    );
+HRESULT DAPI FileStripExtension(
+    __in_z LPCWSTR wzFileName,
+    __out LPWSTR *ppwzFileNameNoExtension
+    );
+HRESULT DAPI FileChangeExtension(
+    __in_z LPCWSTR wzFileName,
+    __in_z LPCWSTR wzNewExtension,
+    __out LPWSTR *ppwzFileNameNewExtension
+    );
+HRESULT DAPI FileAddSuffixToBaseName(
+    __in_z LPCWSTR wzFileName,
+    __in_z LPCWSTR wzSuffix,
+    __out_z LPWSTR* psczNewFileName
+    );
+HRESULT DAPI FileVersionFromString(
+    __in_z LPCWSTR wzVersion, 
+    __out DWORD *pdwVerMajor, 
+    __out DWORD* pdwVerMinor
+    );
+HRESULT DAPI FileVersionFromStringEx(
+    __in_z LPCWSTR wzVersion,
+    __in DWORD cchVersion,
+    __out DWORD64* pqwVersion
+    );
+HRESULT DAPI FileSetPointer(
+    __in HANDLE hFile,
+    __in DWORD64 dw64Move,
+    __out_opt DWORD64* pdw64NewPosition,
+    __in DWORD dwMoveMethod
+    );
+HRESULT DAPI FileSize(
+    __in_z LPCWSTR pwzFileName,
+    __out LONGLONG* pllSize
+    );
+HRESULT DAPI FileSizeByHandle(
+    __in HANDLE hFile, 
+    __out LONGLONG* pllSize
+    );
+BOOL DAPI FileExistsEx(
+    __in_z LPCWSTR wzPath, 
+    __out_opt DWORD *pdwAttributes
+    );
+HRESULT DAPI FileRead(
+    __deref_out_bcount_full(*pcbDest) LPBYTE* ppbDest,
+    __out DWORD* pcbDest,
+    __in_z LPCWSTR wzSrcPath
+    );
+HRESULT DAPI FileReadUntil(
+    __deref_out_bcount_full(*pcbDest) LPBYTE* ppbDest,
+    __out_range(<=, cbMaxRead) DWORD* pcbDest,
+    __in_z LPCWSTR wzSrcPath,
+    __in DWORD cbMaxRead
+    );
+HRESULT DAPI FileReadPartial(
+    __deref_out_bcount_full(*pcbDest) LPBYTE* ppbDest,
+    __out_range(<=, cbMaxRead) DWORD* pcbDest,
+    __in_z LPCWSTR wzSrcPath,
+    __in BOOL fSeek,
+    __in DWORD cbStartPosition,
+    __in DWORD cbMaxRead,
+    __in BOOL fPartialOK
+    );
+HRESULT DAPI FileWrite(
+    __in_z LPCWSTR pwzFileName,
+    __in DWORD dwFlagsAndAttributes,
+    __in_bcount(cbData) LPCBYTE pbData,
+    __in DWORD cbData,
+    __out_opt HANDLE* pHandle
+    );
+HRESULT DAPI FileWriteHandle(
+    __in HANDLE hFile,
+    __in_bcount(cbData) LPCBYTE pbData,
+    __in DWORD cbData
+    );
+HRESULT DAPI FileEnsureCopy(
+    __in_z LPCWSTR wzSource,
+    __in_z LPCWSTR wzTarget,
+    __in BOOL fOverwrite
+    );
+HRESULT DAPI FileEnsureMove(
+    __in_z LPCWSTR wzSource, 
+    __in_z LPCWSTR wzTarget, 
+    __in BOOL fOverwrite,
+    __in BOOL fAllowCopy
+    );
+HRESULT DAPI FileCreateTemp(
+    __in_z LPCWSTR wzPrefix,
+    __in_z LPCWSTR wzExtension,
+    __deref_opt_out_z LPWSTR* ppwzTempFile,
+    __out_opt HANDLE* phTempFile
+    );
+HRESULT DAPI FileCreateTempW(
+    __in_z LPCWSTR wzPrefix,
+    __in_z LPCWSTR wzExtension,
+    __deref_opt_out_z LPWSTR* ppwzTempFile,
+    __out_opt HANDLE* phTempFile
+    );
+HRESULT DAPI FileVersion(
+    __in_z LPCWSTR wzFilename, 
+    __out DWORD *pdwVerMajor, 
+    __out DWORD* pdwVerMinor
+    );
+HRESULT DAPI FileIsSame(
+    __in_z LPCWSTR wzFile1,
+    __in_z LPCWSTR wzFile2,
+    __out LPBOOL lpfSameFile
+    );
+HRESULT DAPI FileEnsureDelete(
+    __in_z LPCWSTR wzFile
+    );
+HRESULT DAPI FileGetTime(
+    __in_z LPCWSTR wzFile,  
+    __out_opt  LPFILETIME lpCreationTime,
+    __out_opt  LPFILETIME lpLastAccessTime,
+    __out_opt  LPFILETIME lpLastWriteTime
+    );
+HRESULT DAPI FileSetTime(
+    __in_z LPCWSTR wzFile,
+    __in_opt  const FILETIME *lpCreationTime,
+    __in_opt  const FILETIME *lpLastAccessTime,
+    __in_opt  const FILETIME *lpLastWriteTime
+    );
+HRESULT DAPI FileResetTime(
+    __in_z LPCWSTR wzFile
+    );
+HRESULT FileExecutableArchitecture(
+    __in_z LPCWSTR wzFile,
+    __out FILE_ARCHITECTURE *pArchitecture
+    );
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/sdk/inc/gdiputil.h b/sdk/inc/gdiputil.h
new file mode 100644
index 0000000..c7b622e
--- /dev/null
+++ b/sdk/inc/gdiputil.h
@@ -0,0 +1,46 @@
+//-------------------------------------------------------------------------------------------------
+// <copyright file="gdiputil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    GDI+ helper functions.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#pragma once
+
+#define ExitOnGdipFailure(g, x, s) { x = GdipHresultFromStatus(g); if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace(x, s); goto LExit; } }
+#define ExitOnGdipFailure1(g, x, f, s) { x = GdipHresultFromStatus(g); if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace1(x, f, s); goto LExit; } }
+#define ExitOnGdipFailure2(g, x, f, s, t) { x = GdipHresultFromStatus(g); if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace2(x, f, s, t); goto LExit; } }
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+HRESULT DAPI GdipBitmapFromResource(
+    __in_opt HINSTANCE hinst,
+    __in_z LPCSTR szId,
+    __out Gdiplus::Bitmap **ppBitmap
+    );
+
+HRESULT DAPI GdipBitmapFromFile(
+    __in_z LPCWSTR wzFileName,
+    __out Gdiplus::Bitmap **ppBitmap
+    );
+
+HRESULT DAPI GdipHresultFromStatus(
+    __in Gdiplus::Status gs
+    );
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/sdk/inc/inetutil.h b/sdk/inc/inetutil.h
new file mode 100644
index 0000000..59836b5
--- /dev/null
+++ b/sdk/inc/inetutil.h
@@ -0,0 +1,54 @@
+#pragma once
+//-------------------------------------------------------------------------------------------------
+// <copyright file="inetutil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    Internet utilites.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ReleaseInternet(h) if (h) { ::InternetCloseHandle(h); h = NULL; }
+#define ReleaseNullInternet(h) if (h) { ::InternetCloseHandle(h); h = NULL; }
+
+
+// functions
+HRESULT DAPI InternetGetSizeByHandle(
+    __in HINTERNET hiFile,
+    __out LONGLONG* pllSize
+    );
+
+HRESULT DAPI InternetGetCreateTimeByHandle(
+    __in HINTERNET hiFile,
+    __out LPFILETIME pft
+    );
+
+HRESULT DAPI InternetQueryInfoString(
+    __in HINTERNET h,
+    __in DWORD dwInfo,
+    __deref_out_z LPWSTR* psczValue
+    );
+
+HRESULT DAPI InternetQueryInfoNumber(
+    __in HINTERNET h,
+    __in DWORD dwInfo,
+    __out LONG* plInfo
+    );
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/sdk/inc/jsonutil.h b/sdk/inc/jsonutil.h
new file mode 100644
index 0000000..2ce9c9f
--- /dev/null
+++ b/sdk/inc/jsonutil.h
@@ -0,0 +1,94 @@
+#pragma once
+//-------------------------------------------------------------------------------------------------
+// <copyright file="jsonutil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    JavaScript Object Notation (JSON) helper functions.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum JSON_WRITER_TOKEN
+{
+    JSON_WRITER_TOKEN_NONE,
+    JSON_WRITER_TOKEN_ARRAY_START,
+    JSON_WRITER_TOKEN_ARRAY_VALUE,
+    JSON_WRITER_TOKEN_ARRAY_END,
+    JSON_WRITER_TOKEN_OBJECT_START,
+    JSON_WRITER_TOKEN_OBJECT_KEY,
+    JSON_WRITER_TOKEN_OBJECT_VALUE,
+    JSON_WRITER_TOKEN_OBJECT_END,
+    JSON_WRITER_TOKEN_VALUE,
+};
+
+typedef struct _JSON_WRITER
+{
+    CRITICAL_SECTION cs;
+    LPWSTR sczJson;
+
+    JSON_WRITER_TOKEN* rgTokenStack;
+    DWORD cTokens;
+    DWORD cMaxTokens;
+} JSON_WRITER;
+
+
+DAPI_(HRESULT) JsonInitializeWriter(
+    __in JSON_WRITER* pWriter
+    );
+
+DAPI_(void) JsonUninitializeWriter(
+    __in JSON_WRITER* pWriter
+    );
+
+DAPI_(HRESULT) JsonWriteBool(
+    __in JSON_WRITER* pWriter,
+    __in BOOL fValue
+    );
+
+DAPI_(HRESULT) JsonWriteNumber(
+    __in JSON_WRITER* pWriter,
+    __in DWORD dwValue
+    );
+
+DAPI_(HRESULT) JsonWriteString(
+    __in JSON_WRITER* pWriter,
+    __in_z_opt LPCWSTR wzValue
+    );
+
+DAPI_(HRESULT) JsonWriteArrayStart(
+    __in JSON_WRITER* pWriter
+    );
+
+DAPI_(HRESULT) JsonWriteArrayEnd(
+    __in JSON_WRITER* pWriter
+    );
+
+DAPI_(HRESULT) JsonWriteObjectStart(
+    __in JSON_WRITER* pWriter
+    );
+
+DAPI_(HRESULT) JsonWriteObjectKey(
+    __in JSON_WRITER* pWriter,
+    __in_z LPCWSTR wzKey
+    );
+
+DAPI_(HRESULT) JsonWriteObjectEnd(
+    __in JSON_WRITER* pWriter
+    );
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/sdk/inc/locutil.h b/sdk/inc/locutil.h
new file mode 100644
index 0000000..d69f305
--- /dev/null
+++ b/sdk/inc/locutil.h
@@ -0,0 +1,53 @@
+//-------------------------------------------------------------------------------------------------
+// <copyright file="locutil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    Header for localization helper functions.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+#pragma once
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct LOC_STRING
+{
+    LPWSTR wzID;
+    LPWSTR wzText;
+    BOOL bOverridable;
+};
+
+struct LOC_STRINGSET
+{
+    DWORD cLocStrings;
+    LOC_STRING* rgLocStrings;
+};
+
+HRESULT DAPI LocLoadFromFile(
+    __in_z LPCWSTR wzWxlFile,
+    __out LOC_STRINGSET** ppLocStringSet
+    );
+
+HRESULT DAPI LocLocalizeString(
+    __in const LOC_STRINGSET* pLocStringSet,
+    __inout LPWSTR* ppInput
+    );
+
+void DAPI LocFree(
+    __in_opt LOC_STRINGSET* pLocStringSet
+    );
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/sdk/inc/logutil.h b/sdk/inc/logutil.h
new file mode 100644
index 0000000..bf5f15c
--- /dev/null
+++ b/sdk/inc/logutil.h
@@ -0,0 +1,182 @@
+#pragma once
+//-------------------------------------------------------------------------------------------------
+// <copyright file="logutil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    Header for string helper functions.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define LogExitOnFailure(x, i, f) if (FAILED(x)) { LogErrorId(x, i, NULL, NULL, NULL); ExitTrace(x, f); goto LExit; }
+#define LogExitOnFailure1(x, i, f, s) if (FAILED(x)) { LogErrorId(x, i, s, NULL, NULL); ExitTrace1(x, f, s); goto LExit; }
+#define LogExitOnFailure2(x, i, f, s, t) if (FAILED(x)) { LogErrorId(x, i, s, t, NULL); ExitTrace2(x, f, s, t); goto LExit; }
+#define LogExitOnFailure3(x, i, f, s, t, u) if (FAILED(x)) { LogErrorId(x, i, s, t, u); ExitTrace3(x, f, s, t, u); goto LExit; }
+
+// enums
+
+// structs
+
+// functions
+BOOL DAPI IsLogInitialized();
+
+HRESULT DAPI LogInitialize(
+    __in HMODULE hModule,
+    __in_z LPCWSTR wzLog,
+    __in_z_opt LPCWSTR wzExt,
+    __in BOOL fAppend,
+    __in BOOL fHeader
+    );
+
+HRESULT DAPI LogRename(
+    __in_z LPCWSTR wzNewPath
+    );
+
+void DAPI LogUninitialize(
+    __in BOOL fFooter
+    );
+
+BOOL DAPI LogIsOpen();
+
+HRESULT DAPI LogSetSpecialParams(
+    __in_z LPCSTR wzSpecialBeginLine,
+    __in_z LPCSTR wzSpecialAfterTimeStamp,
+    __in_z LPCSTR wzSpecialEndLine
+    );
+
+REPORT_LEVEL DAPI LogSetLevel(
+    __in REPORT_LEVEL rl,
+    __in BOOL fLogChange
+    );
+
+REPORT_LEVEL DAPI LogGetLevel();
+
+HRESULT DAPI LogGetPath(
+    __out_ecount_z(cchLogPath) LPWSTR pwzLogPath, 
+    __in DWORD cchLogPath
+    );
+
+HANDLE DAPI LogGetHandle();
+
+HRESULT DAPIV LogString(
+    __in REPORT_LEVEL rl,
+    __in_z __format_string LPCSTR szFormat,
+    ...
+    );
+
+HRESULT DAPI LogStringArgs(
+    __in REPORT_LEVEL rl,
+    __in_z __format_string LPCSTR szFormat,
+    __in va_list args
+    );
+
+HRESULT DAPIV LogStringLine(
+    __in REPORT_LEVEL rl,
+    __in_z __format_string LPCSTR szFormat,
+    ...
+    );
+
+HRESULT DAPI LogStringLineArgs(
+    __in REPORT_LEVEL rl,
+    __in_z __format_string LPCSTR szFormat,
+    __in va_list args
+    );
+
+HRESULT DAPI LogIdModuleArgs(
+    __in REPORT_LEVEL rl,
+    __in DWORD dwLogId,
+    __in_opt HMODULE hModule,
+    __in va_list args
+    );
+
+/* 
+ * Wraps LogIdModuleArgs, so inline to save the function call
+ */
+
+inline HRESULT LogId(
+    __in REPORT_LEVEL rl,
+    __in DWORD dwLogId,
+    ...
+    )
+{
+    HRESULT hr = S_OK;
+    va_list args;
+
+    va_start(args, dwLogId);
+    hr = LogIdModuleArgs(rl, dwLogId, NULL, args);
+    va_end(args);
+
+    return hr;
+}
+
+
+/* 
+ * Wraps LogIdModuleArgs, so inline to save the function call
+ */
+ 
+inline HRESULT LogIdArgs(
+    __in REPORT_LEVEL rl,
+    __in DWORD dwLogId,
+    __in va_list args
+    )
+{
+    return LogIdModuleArgs(rl, dwLogId, NULL, args);
+}
+
+HRESULT DAPIV LogErrorString(
+    __in HRESULT hrError,
+    __in_z __format_string LPCSTR szFormat,
+    ...
+    );
+
+HRESULT DAPI LogErrorStringArgs(
+    __in HRESULT hrError,
+    __in_z __format_string LPCSTR szFormat,
+    __in va_list args
+    );
+
+HRESULT DAPI LogErrorIdModule(
+    __in HRESULT hrError,
+    __in DWORD dwLogId,
+    __in_opt HMODULE hModule,
+    __in_z_opt LPCWSTR wzString1,
+    __in_z_opt LPCWSTR wzString2,
+    __in_z_opt LPCWSTR wzString3
+    );
+
+inline HRESULT LogErrorId(
+    __in HRESULT hrError,
+    __in DWORD dwLogId,
+    __in_z_opt LPCWSTR wzString1,
+    __in_z_opt LPCWSTR wzString2,
+    __in_z_opt LPCWSTR wzString3
+    )
+{
+    return LogErrorIdModule(hrError, dwLogId, NULL, wzString1, wzString2, wzString3);
+}
+
+HRESULT DAPI LogHeader();
+
+HRESULT DAPI LogFooter();
+
+// begin the switch of LogXXX to LogStringXXX
+#define Log LogString
+#define LogLine LogStringLine
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/sdk/inc/memutil.h b/sdk/inc/memutil.h
new file mode 100644
index 0000000..b41a07c
--- /dev/null
+++ b/sdk/inc/memutil.h
@@ -0,0 +1,65 @@
+#pragma once
+//-------------------------------------------------------------------------------------------------
+// <copyright file="memutil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    Header for memory helper functions.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ReleaseMem(p) if (p) { MemFree(p); }
+#define ReleaseNullMem(p) if (p) { MemFree(p); p = NULL; }
+
+#define MEM_ENSURE_ARRAY_SIZE(type, pointer, count, max, grow, hresult, errMsg) \
+    if (max <= count) { \
+        LPVOID pv = NULL; DWORD cNewMax = count + grow; \
+        if (0 == max) pv = MemAlloc(sizeof(type) * cNewMax, TRUE); else pv = MemReAlloc(pointer, sizeof(type) * cNewMax, TRUE); \
+        ExitOnNull(pv, hresult, E_OUTOFMEMORY, errMsg); \
+        max = cNewMax; pointer = static_cast<type*>(pv); \
+    }
+
+HRESULT DAPI MemInitialize();
+void DAPI MemUninitialize();
+
+LPVOID DAPI MemAlloc(
+    __in SIZE_T cbSize,
+    __in BOOL fZero
+    );
+LPVOID DAPI MemReAlloc(
+    __in LPVOID pv,
+    __in SIZE_T cbSize,
+    __in BOOL fZero
+    );
+
+HRESULT DAPI MemEnsureArraySize(
+    __inout_ecount(cArray) LPVOID* ppvArray,
+    __in DWORD cArray,
+    __in SIZE_T cbArrayType,
+    __in DWORD dwGrowthCount
+    );
+
+HRESULT DAPI MemFree(
+    __in LPVOID pv
+    );
+SIZE_T DAPI MemSize(
+    __in LPCVOID pv
+    );
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/sdk/inc/metautil.h b/sdk/inc/metautil.h
new file mode 100644
index 0000000..e594760
--- /dev/null
+++ b/sdk/inc/metautil.h
@@ -0,0 +1,67 @@
+#pragma once
+//-------------------------------------------------------------------------------------------------
+// <copyright file="metautil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    IIS Metabase helper functions.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#include <iadmw.h>
+#include <iiscnfg.h>
+#include <iwamreg.h>
+#include <mddefw.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// structs
+
+// prototypes
+HRESULT DAPI MetaFindWebBase(
+    __in IMSAdminBaseW* piMetabase, 
+    __in_z LPCWSTR wzIP, 
+    __in int iPort, 
+    __in_z LPCWSTR wzHeader,
+    __in BOOL fSecure,
+    __out_ecount(cchWebBase) LPWSTR wzWebBase, 
+    __in DWORD cchWebBase
+    );
+HRESULT DAPI MetaFindFreeWebBase(
+    __in IMSAdminBaseW* piMetabase, 
+    __out_ecount(cchWebBase) LPWSTR wzWebBase, 
+    __in DWORD cchWebBase
+    );
+
+HRESULT DAPI MetaOpenKey(
+    __in IMSAdminBaseW* piMetabase, 
+    __in METADATA_HANDLE mhKey, 
+    __in_z LPCWSTR wzKey,
+    __in DWORD dwAccess,
+    __in DWORD cRetries,
+    __out METADATA_HANDLE* pmh
+    );
+HRESULT DAPI MetaGetValue(
+    __in IMSAdminBaseW* piMetabase, 
+    __in METADATA_HANDLE mhKey, 
+    __in_z LPCWSTR wzKey, 
+    __inout METADATA_RECORD* pmr
+    );
+void DAPI MetaFreeValue(
+    __in METADATA_RECORD* pmr
+    );
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/sdk/inc/osutil.h b/sdk/inc/osutil.h
new file mode 100644
index 0000000..785e4ab
--- /dev/null
+++ b/sdk/inc/osutil.h
@@ -0,0 +1,48 @@
+#pragma once
+//-------------------------------------------------------------------------------------------------
+// <copyright file="osutil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    Operating system helper functions.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum OS_VERSION
+{
+    OS_VERSION_UNKNOWN,
+    OS_VERSION_WINNT,
+    OS_VERSION_WIN2000,
+    OS_VERSION_WINXP,
+    OS_VERSION_WIN2003,
+    OS_VERSION_VISTA,
+    OS_VERSION_WIN2008,
+    OS_VERSION_WIN7,
+    OS_VERSION_WIN2008_R2,
+    OS_VERSION_FUTURE
+};
+
+void DAPI OsGetVersion(
+    __out OS_VERSION* pVersion,
+    __out DWORD* pdwServicePack
+    );
+HRESULT OsIsRunningPrivileged(
+    __out BOOL* pfPrivileged
+    );
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/sdk/inc/pathutil.h b/sdk/inc/pathutil.h
new file mode 100644
index 0000000..f886c99
--- /dev/null
+++ b/sdk/inc/pathutil.h
@@ -0,0 +1,90 @@
+#pragma once
+//-------------------------------------------------------------------------------------------------
+// <copyright file="pathutil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    Header for path helper functions.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum PATH_EXPAND
+{
+    PATH_EXPAND_ENVIRONMENT = 0x0001,
+    PATH_EXPAND_FULLPATH    = 0x0002,
+};
+
+LPWSTR DAPI PathFile(
+    __in_z LPCWSTR wzPath
+    );
+HRESULT DAPI PathGetDirectory(
+    __in_z LPCWSTR wzPath,
+    __out LPWSTR *psczDirectory
+    );
+HRESULT DAPI PathExpand(
+    __out LPWSTR *psczFullPath,
+    __in_z LPCWSTR wzRelativePath,
+    __in DWORD dwResolveFlags
+    );
+HRESULT DAPI PathPrefix(
+    __inout LPWSTR *psczFullPath
+    );
+HRESULT DAPI PathBackslashTerminate(
+    __inout LPWSTR* psczPath
+    );
+HRESULT DAPI PathFixedBackslashTerminate(
+    __inout_ecount_z(cchPath) LPWSTR wzPath,
+    __in DWORD_PTR cchPath
+    );
+HRESULT DAPI PathForCurrentProcess(
+    __inout LPWSTR *psczFullPath,
+    __in_opt HMODULE hModule
+    );
+HRESULT DAPI PathRelativeToModule(
+    __inout LPWSTR *psczFullPath,
+    __in_opt LPCWSTR wzFileName,
+    __in_opt HMODULE hModule
+    );
+HRESULT DAPI PathCreateTempFile(
+    __in_opt LPCWSTR wzDirectory,
+    __in_opt __format_string LPCWSTR wzFileNameTemplate,
+    __in DWORD dwUniqueCount,
+    __in DWORD dwFileAttributes,
+    __out_opt LPWSTR* psczTempFile,
+    __out_opt HANDLE* phTempFile
+    );
+HRESULT DAPI PathCreateTempDirectory(
+    __in_opt LPCWSTR wzDirectory,
+    __in __format_string LPCWSTR wzDirectoryNameTemplate,
+    __in DWORD dwUniqueCount,
+    __out LPWSTR* psczTempDirectory
+    );
+HRESULT DAPI PathGetKnownFolder(
+    __in int csidl,
+    __out LPWSTR* psczKnownFolder
+    );
+BOOL DAPI PathIsAbsolute(
+    __in_z LPCWSTR wzPath
+    );
+HRESULT DAPI PathConcat(
+    __in_opt LPCWSTR wzPath1,
+    __in_opt LPCWSTR wzPath2,
+    __deref_out_z LPWSTR* psczCombined
+    );
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/sdk/inc/perfutil.h b/sdk/inc/perfutil.h
new file mode 100644
index 0000000..9c7c87a
--- /dev/null
+++ b/sdk/inc/perfutil.h
@@ -0,0 +1,39 @@
+#pragma once
+//-------------------------------------------------------------------------------------------------
+// <copyright file="perfutil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    Performance helper functions.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// structs
+
+
+// functions
+void DAPI PerfInitialize(
+    );
+void DAPI PerfClickTime(
+    __out_opt LARGE_INTEGER* pliElapsed
+    );
+double DAPI PerfConvertToSeconds(
+    __in const LARGE_INTEGER* pli
+    );
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/sdk/inc/procutil.h b/sdk/inc/procutil.h
new file mode 100644
index 0000000..007dd3e
--- /dev/null
+++ b/sdk/inc/procutil.h
@@ -0,0 +1,54 @@
+#pragma once
+//-------------------------------------------------------------------------------------------------
+// <copyright file="procutil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    Header for proces helper functions.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+HRESULT DAPI ProcExecute(
+    __in_z LPWSTR wzCommand,
+    __out HANDLE *phProcess,
+    __out_opt HANDLE *phChildStdIn,
+    __out_opt HANDLE *phChildStdOutErr
+    );
+HRESULT DAPI ProcWaitForCompletion(
+    __in HANDLE hProcess,
+    __in DWORD dwTimeout,
+    __out DWORD *pReturnCode
+    );
+HRESULT DAPI ProcWaitForIds(
+    __in_ecount(cProcessIds) const DWORD* pdwProcessIds,
+    __in DWORD cProcessIds,
+    __in DWORD dwMilliseconds
+    );
+HRESULT DAPI ProcCloseIds(
+    __in_ecount(cProcessIds) const DWORD* pdwProcessIds,
+    __in DWORD cProcessIds
+    );
+
+// following code in proc2utl.cpp due to dependency on PSAPI.DLL.
+HRESULT DAPI ProcFindAllIdsFromExeName(
+    __in_z LPCWSTR wzExeName,
+    __out DWORD** ppdwProcessIds,
+    __out DWORD* pcProcessIds
+    );
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/sdk/inc/regutil.h b/sdk/inc/regutil.h
new file mode 100644
index 0000000..65f8b1f
--- /dev/null
+++ b/sdk/inc/regutil.h
@@ -0,0 +1,32 @@
+//-------------------------------------------------------------------------------------------------
+// <copyright file="regutil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    Registry helper functions.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#pragma once
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ReleaseRegKey(h) if (h) { ::RegCloseKey(h); h = NULL; }
+
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/sdk/inc/resrutil.h b/sdk/inc/resrutil.h
new file mode 100644
index 0000000..1f13099
--- /dev/null
+++ b/sdk/inc/resrutil.h
@@ -0,0 +1,60 @@
+//-------------------------------------------------------------------------------------------------
+// <copyright file="resrutil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    Resource read helper functions.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#pragma once
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+HRESULT DAPI ResGetStringLangId(
+    __in_opt LPCWSTR wzPath,
+    __in UINT uID,
+    __out WORD *pwLangId
+    );
+
+HRESULT DAPI ResReadString(
+    __in HINSTANCE hinst,
+    __in UINT uID,
+    __deref_out_z LPWSTR* ppwzString
+    );
+
+HRESULT DAPI ResReadStringAnsi(
+    __in HINSTANCE hinst,
+    __in UINT uID,
+    __deref_out_z LPSTR* ppszString
+    );
+
+HRESULT DAPI ResReadData(
+    __in_opt HINSTANCE hinst,
+    __in_z LPCSTR szDataName,
+    __deref_out_bcount(*pcb) PVOID *ppv,
+    __out DWORD *pcb
+    );
+
+HRESULT DAPI ResExportDataToFile(
+    __in_z LPCSTR szDataName,
+    __in_z LPCWSTR wzTargetFile,
+    __in DWORD dwCreationDisposition
+    );
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/sdk/inc/reswutil.h b/sdk/inc/reswutil.h
new file mode 100644
index 0000000..746c949
--- /dev/null
+++ b/sdk/inc/reswutil.h
@@ -0,0 +1,48 @@
+//-------------------------------------------------------------------------------------------------
+// <copyright file="reswutil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    Resource writer helper functions.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#pragma once
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+HRESULT DAPI ResWriteString(
+    __in_z LPCWSTR wzResourceFile,
+    __in DWORD dwDataId,
+    __in_z LPCWSTR wzData,
+    __in WORD wLangId
+    );
+
+HRESULT DAPI ResWriteData(
+    __in_z LPCWSTR wzResourceFile,
+    __in_z LPCSTR szDataName,
+    __in PVOID pData,
+    __in DWORD cbData
+    );
+
+HRESULT DAPI ResImportDataFromFile(
+    __in_z LPCWSTR wzTargetFile,
+    __in_z LPCWSTR wzSourceFile,
+    __in_z LPCSTR szDataName
+    );
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/sdk/inc/rexutil.h b/sdk/inc/rexutil.h
new file mode 100644
index 0000000..503a3c9
--- /dev/null
+++ b/sdk/inc/rexutil.h
@@ -0,0 +1,69 @@
+#pragma once
+//-------------------------------------------------------------------------------------------------
+// <copyright file="rexutil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    Resource Cabinet Extract Utilities
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#include <sys\stat.h>
+#include <fdi.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// defines
+#define FILETABLESIZE 40
+
+// structs
+struct MEM_FILE 
+{
+    LPCBYTE vpStart;
+    UINT  uiCurrent;
+    UINT  uiLength;
+};
+
+enum FAKE_FILE_TYPE { NORMAL_FILE, MEMORY_FILE };
+
+typedef HRESULT (*REX_CALLBACK_PROGRESS)(BOOL fBeginFile, LPCWSTR wzFileId, LPVOID pvContext);
+typedef VOID (*REX_CALLBACK_WRITE)(UINT cb);
+
+
+struct FAKE_FILE // used __in internal file table
+{
+    BOOL fUsed;
+    FAKE_FILE_TYPE fftType;
+    MEM_FILE mfFile; // State for memory file
+    HANDLE hFile; // Handle for disk  file
+};
+
+// functions
+HRESULT RexInitialize();
+void RexUninitialize();
+
+HRESULT RexExtract(
+    __in_z LPCSTR szResource,
+    __in_z LPCWSTR wzExtractId,
+    __in_z LPCWSTR wzExtractDir,
+    __in_z LPCWSTR wzExtractName,
+    __in REX_CALLBACK_PROGRESS pfnProgress,
+    __in REX_CALLBACK_WRITE pfnWrite,
+    __in LPVOID pvContext
+    );
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/sdk/inc/rssutil.h b/sdk/inc/rssutil.h
new file mode 100644
index 0000000..e9ee4fe
--- /dev/null
+++ b/sdk/inc/rssutil.h
@@ -0,0 +1,106 @@
+//-------------------------------------------------------------------------------------------------
+// <copyright file="rssutil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    RSS helper funtions.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#pragma once
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ReleaseRssChannel(p) if (p) { RssFreeChannel(p); }
+#define ReleaseNullRssChannel(p) if (p) { RssFreeChannel(p); p = NULL; }
+
+
+struct RSS_UNKNOWN_ATTRIBUTE
+{
+    LPWSTR wzNamespace;
+    LPWSTR wzAttribute;
+    LPWSTR wzValue;
+
+    RSS_UNKNOWN_ATTRIBUTE* pNext;
+};
+
+struct RSS_UNKNOWN_ELEMENT
+{
+    LPWSTR wzNamespace;
+    LPWSTR wzElement;
+    LPWSTR wzValue;
+
+    RSS_UNKNOWN_ATTRIBUTE* pAttributes;
+    RSS_UNKNOWN_ELEMENT* pNext;
+};
+
+struct RSS_ITEM
+{
+    LPWSTR wzTitle;
+    LPWSTR wzLink;
+    LPWSTR wzDescription;
+
+    LPWSTR wzGuid;
+    FILETIME ftPublished;
+
+    LPWSTR wzEnclosureUrl;
+    DWORD dwEnclosureSize;
+    LPWSTR wzEnclosureType;
+
+    RSS_UNKNOWN_ELEMENT* pUnknownElements;
+};
+
+struct RSS_CHANNEL
+{
+    LPWSTR wzTitle;
+    LPWSTR wzLink;
+    LPWSTR wzDescription;
+    DWORD dwTimeToLive;
+
+    RSS_UNKNOWN_ELEMENT* pUnknownElements;
+
+    DWORD cItems;
+    RSS_ITEM rgItems[1];
+};
+
+HRESULT DAPI RssInitialize(
+    );
+
+void DAPI RssUninitialize(
+    );
+
+HRESULT DAPI RssParseFromString(
+    __in_z LPCWSTR wzRssString,
+    __out RSS_CHANNEL **ppChannel
+    );
+
+HRESULT DAPI RssParseFromFile(
+    __in_z LPCWSTR wzRssFile,
+    __out RSS_CHANNEL **ppChannel
+    );
+
+// Adding this until we have the updated specstrings.h
+#ifndef __in_xcount
+#define __in_xcount(size) 
+#endif
+
+void DAPI RssFreeChannel(
+    __in_xcount(pChannel->cItems) RSS_CHANNEL *pChannel
+    );
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/sdk/inc/shelutil.h b/sdk/inc/shelutil.h
new file mode 100644
index 0000000..2b24c73
--- /dev/null
+++ b/sdk/inc/shelutil.h
@@ -0,0 +1,58 @@
+#pragma once
+//-------------------------------------------------------------------------------------------------
+// <copyright file="shelutil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    Header for proces helper functions.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#ifndef REFKNOWNFOLDERID
+#define REFKNOWNFOLDERID REFGUID
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+HRESULT DAPI ShelExec(
+    __in_z LPCWSTR wzTargetPath,
+    __in_opt LPCWSTR wzParameters,
+    __in_opt LPCWSTR wzVerb,
+    __in_opt LPCWSTR wzWorkingDirectory,
+    __in int nShowCmd,
+    __out_opt HINSTANCE* phInstance
+    );
+
+HRESULT DAPI ShelExecEx(
+    __in_z LPCWSTR wzTargetPath,
+    __in_z_opt LPCWSTR wzParameters,
+    __in_z_opt LPCWSTR wzVerb,
+    __in_z_opt LPCWSTR wzWorkingDirectory,
+    __in int nShowCmd,
+    __out_opt HINSTANCE* phInstance
+    );
+
+HRESULT DAPI ShelGetFolder(
+    __out_z LPWSTR* psczFolderPath,
+    __in int csidlFolder
+    );
+
+HRESULT DAPI ShelGetKnownFolder(
+    __out_z LPWSTR* psczFolderPath,
+    __in REFKNOWNFOLDERID rfidFolder
+    );
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/sdk/inc/sqlutil.h b/sdk/inc/sqlutil.h
new file mode 100644
index 0000000..bfb04e1
--- /dev/null
+++ b/sdk/inc/sqlutil.h
@@ -0,0 +1,151 @@
+#pragma once
+//-------------------------------------------------------------------------------------------------
+// <copyright file="sqlutil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    SQL helper functions.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#include <cguid.h>
+#include <oledberr.h>
+#include <sqloledb.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Adding this until the SQL annotations are published to specstrings.h
+#ifndef __sql_command
+#define __sql_command
+#endif
+
+// structs
+struct SQL_FILESPEC
+{
+    WCHAR wzName[MAX_PATH];
+    WCHAR wzFilename[MAX_PATH];
+    WCHAR wzSize[MAX_PATH];
+    WCHAR wzMaxSize[MAX_PATH];
+    WCHAR wzGrow[MAX_PATH];
+};
+
+
+// functions
+HRESULT DAPI SqlConnectDatabase(
+    __in_z LPCWSTR wzServer, 
+    __in_z LPCWSTR wzInstance,
+    __in_z LPCWSTR wzDatabase, 
+    __in BOOL fIntegratedAuth, 
+    __in_z LPCWSTR wzUser, 
+    __in_z LPCWSTR wzPassword, 
+    __out IDBCreateSession** ppidbSession
+    );
+HRESULT DAPI SqlStartTransaction(
+    __in IDBCreateSession* pidbSession,
+    __out IDBCreateCommand** ppidbCommand,
+    __out ITransaction** ppit
+    );
+HRESULT DAPI SqlEndTransaction(
+    __in ITransaction* pit,
+    __in BOOL fCommit
+    );
+HRESULT DAPI SqlDatabaseExists(
+    __in_z LPCWSTR wzServer,
+    __in_z LPCWSTR wzInstance,
+    __in_z LPCWSTR wzDatabase,
+    __in BOOL fIntegratedAuth,
+    __in_z LPCWSTR wzUser,
+    __in_z LPCWSTR wzPassword,
+    __out_opt BSTR* pbstrErrorDescription
+    );
+HRESULT DAPI SqlSessionDatabaseExists(
+    __in IDBCreateSession* pidbSession,
+    __in_z LPCWSTR wzDatabase,
+    __out_opt BSTR* pbstrErrorDescription
+    );
+HRESULT DAPI SqlDatabaseEnsureExists(
+    __in_z LPCWSTR wzServer,
+    __in_z LPCWSTR wzInstance,
+    __in_z LPCWSTR wzDatabase,
+    __in BOOL fIntegratedAuth,
+    __in_z LPCWSTR wzUser,
+    __in_z LPCWSTR wzPassword,
+    __in_opt const SQL_FILESPEC* psfDatabase,
+    __in_opt const SQL_FILESPEC* psfLog,
+    __out_opt BSTR* pbstrErrorDescription
+    );
+HRESULT DAPI SqlSessionDatabaseEnsureExists(
+    __in IDBCreateSession* pidbSession,
+    __in_z LPCWSTR wzDatabase,
+    __in_opt const SQL_FILESPEC* psfDatabase,
+    __in_opt const SQL_FILESPEC* psfLog,
+    __out_opt BSTR* pbstrErrorDescription
+    );
+HRESULT DAPI SqlCreateDatabase(
+    __in_z LPCWSTR wzServer,
+    __in_z LPCWSTR wzInstance,
+    __in_z LPCWSTR wzDatabase,
+    __in BOOL fIntegratedAuth,
+    __in_z LPCWSTR wzUser,
+    __in_z LPCWSTR wzPassword,
+    __in_opt const SQL_FILESPEC* psfDatabase,
+    __in_opt const SQL_FILESPEC* psfLog,
+    __out_opt BSTR* pbstrErrorDescription
+    );
+HRESULT DAPI SqlSessionCreateDatabase(
+    __in IDBCreateSession* pidbSession,
+    __in_z LPCWSTR wzDatabase,
+    __in_opt const SQL_FILESPEC* psfDatabase,
+    __in_opt const SQL_FILESPEC* psfLog,
+    __out_opt BSTR* pbstrErrorDescription
+    );
+HRESULT DAPI SqlDropDatabase(
+    __in_z LPCWSTR wzServer,
+    __in_z LPCWSTR wzInstance,
+    __in_z LPCWSTR wzDatabase,
+    __in BOOL fIntegratedAuth,
+    __in_z LPCWSTR wzUser,
+    __in_z LPCWSTR wzPassword,
+    __out_opt BSTR* pbstrErrorDescription
+    );
+HRESULT DAPI SqlSessionDropDatabase(
+    __in IDBCreateSession* pidbSession,
+    __in_z LPCWSTR wzDatabase,
+    __out_opt BSTR* pbstrErrorDescription
+    );
+HRESULT DAPI SqlSessionExecuteQuery(
+    __in IDBCreateSession* pidbSession, 
+    __in __sql_command LPCWSTR wzSql, 
+    __out_opt IRowset** ppirs,
+    __out_opt DBROWCOUNT* pcRows,
+    __out_opt BSTR* pbstrErrorDescription
+    );
+HRESULT DAPI SqlCommandExecuteQuery(
+    __in IDBCreateCommand* pidbCommand, 
+    __in __sql_command LPCWSTR wzSql, 
+    __out IRowset** ppirs,
+    __out DBROWCOUNT* pcRows
+    );
+HRESULT DAPI SqlGetErrorInfo(
+    __in IUnknown* pObjectWithError,
+    __in REFIID IID_InterfaceWithError,
+    __in DWORD dwLocaleId,
+    __out_opt BSTR* pbstrErrorSource,
+    __out_opt BSTR* pbstrErrorDescription
+    );
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/sdk/inc/strutil.h b/sdk/inc/strutil.h
new file mode 100644
index 0000000..07b0f58
--- /dev/null
+++ b/sdk/inc/strutil.h
@@ -0,0 +1,256 @@
+#pragma once
+//-------------------------------------------------------------------------------------------------
+// <copyright file="strutil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    Header for string helper functions.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ReleaseStr(pwz) if (pwz) { StrFree(pwz); }
+#define ReleaseNullStr(pwz) if (pwz) { StrFree(pwz); pwz = NULL; }
+#define ReleaseBSTR(bstr) if (bstr) { ::SysFreeString(bstr); }
+#define ReleaseNullBSTR(bstr) if (bstr) { ::SysFreeString(bstr); bstr = NULL; }
+#define ReleaseNullStrArray(rg, c) { if (rg) { StrArrayFree(rg, c); c = 0; rg = NULL; } }
+
+#define DeclareConstBSTR(bstr_const, wz) const WCHAR bstr_const[] = { 0x00, 0x00, sizeof(wz)-sizeof(WCHAR), 0x00, wz }
+#define UseConstBSTR(bstr_const) const_cast<BSTR>(bstr_const + 4)
+
+HRESULT DAPI StrAlloc(
+    __deref_out_ecount_part(cch, 0) LPWSTR* ppwz,
+    __in DWORD_PTR cch
+    );
+HRESULT DAPI StrTrimCapacity(
+    __deref_out LPWSTR* ppwz
+    );
+HRESULT DAPI StrAnsiAlloc(
+    __deref_out_ecount_part(cch, 0) LPSTR* ppz,
+    __in DWORD_PTR cch
+    );
+HRESULT DAPI StrAnsiTrimCapacity(
+    __deref_out LPSTR* ppz
+    );
+HRESULT DAPI StrAllocString(
+    __deref_out_ecount_z(cchSource+1) LPWSTR* ppwz,
+    __in_z LPCWSTR wzSource,
+    __in DWORD_PTR cchSource
+    );
+HRESULT DAPI StrAnsiAllocString(
+    __deref_out_ecount_z(cchSource+1) LPSTR* ppsz,
+    __in_z LPCWSTR wzSource,
+    __in DWORD_PTR cchSource,
+    __in UINT uiCodepage
+    );
+HRESULT DAPI StrAllocStringAnsi(
+    __deref_out_ecount_z(cchSource+1) LPWSTR* ppwz,
+    __in_z LPCSTR szSource,
+    __in DWORD_PTR cchSource,
+    __in UINT uiCodepage
+    );
+HRESULT DAPI StrAllocPrefix(
+    __deref_out_z LPWSTR* ppwz,
+    __in_z LPCWSTR wzPrefix,
+    __in DWORD_PTR cchPrefix
+    );
+HRESULT DAPI StrAllocConcat(
+    __deref_out_z LPWSTR* ppwz,
+    __in_z LPCWSTR wzSource,
+    __in DWORD_PTR cchSource
+    );
+HRESULT DAPI StrAnsiAllocConcat(
+    __deref_out_z LPSTR* ppz,
+    __in_z LPCSTR pzSource,
+    __in DWORD_PTR cchSource
+    );
+HRESULT __cdecl StrAllocFormatted(
+    __deref_out_z LPWSTR* ppwz,
+    __in __format_string LPCWSTR wzFormat,
+    ...
+    );
+HRESULT __cdecl StrAnsiAllocFormatted(
+    __deref_out_z LPSTR* ppsz,
+    __in __format_string LPCSTR szFormat,
+    ...
+    );
+HRESULT DAPI StrAllocFormattedArgs(
+    __deref_out_z LPWSTR* ppwz,
+    __in __format_string LPCWSTR wzFormat,
+    __in va_list args
+    );
+HRESULT DAPI StrAnsiAllocFormattedArgs(
+    __deref_out_z LPSTR* ppsz,
+    __in __format_string LPCSTR szFormat,
+    __in va_list args
+    );
+HRESULT DAPI StrAllocFromError(
+    __inout LPWSTR *ppwzMessage,
+    __in HRESULT hrError,
+    __in_opt HMODULE hModule,
+    ...
+    );
+
+HRESULT DAPI StrMaxLength(
+    __in LPCVOID p,
+    __out DWORD_PTR* pcch
+    );
+HRESULT DAPI StrSize(
+    __in LPCVOID p,
+    __out DWORD_PTR* pcb
+    );
+
+HRESULT DAPI StrFree(
+    __in LPVOID p
+    );
+
+HRESULT DAPI StrCurrentTime(
+    __deref_out_z LPWSTR* ppwz,
+    __in BOOL fGMT
+    );
+HRESULT DAPI StrCurrentDateTime(
+    __deref_out_z LPWSTR* ppwz,
+    __in BOOL fGMT
+    );
+
+HRESULT DAPI StrReplaceStringAll(
+    __inout LPWSTR* ppwzOriginal,
+    __in_z LPCWSTR wzOldSubString,
+    __in_z LPCWSTR wzNewSubString
+    );
+HRESULT DAPI StrReplaceString(
+    __inout LPWSTR* ppwzOriginal,
+    __inout DWORD* pdwStartIndex,
+    __in_z LPCWSTR wzOldSubString,
+    __in_z LPCWSTR wzNewSubString
+    );
+
+HRESULT DAPI StrHexEncode(
+    __in_ecount(cbSource) const BYTE* pbSource,
+    __in DWORD_PTR cbSource,
+    __out_ecount(cchDest) LPWSTR wzDest,
+    __in DWORD_PTR cchDest
+    );
+HRESULT DAPI StrHexDecode(
+    __in_z LPCWSTR wzSource,
+    __out_bcount(cbDest) BYTE* pbDest,
+    __in DWORD_PTR cbDest
+    );
+
+HRESULT DAPI StrAllocBase85Encode(
+    __in_bcount(cbSource) const BYTE* pbSource,
+    __in DWORD_PTR cbSource,
+    __deref_out_z LPWSTR* pwzDest
+    );
+HRESULT DAPI StrAllocBase85Decode(
+    __in_z LPCWSTR wzSource,
+    __deref_out_bcount(*pcbDest) BYTE** hbDest,
+    __out DWORD_PTR* pcbDest
+    );
+
+HRESULT DAPI MultiSzLen(
+    __in_z LPCWSTR pwzMultiSz,
+    __out DWORD_PTR* pcch
+    );
+HRESULT DAPI MultiSzPrepend(
+    __deref_inout_z LPWSTR* ppwzMultiSz,
+    __inout_opt DWORD_PTR *pcchMultiSz,
+    __in_z LPCWSTR pwzInsert
+    );
+HRESULT DAPI MultiSzFindSubstring(
+    __in_z LPCWSTR pwzMultiSz,
+    __in_z LPCWSTR pwzSubstring,
+    __out_opt DWORD_PTR* pdwIndex,
+    __deref_opt_out_z LPCWSTR* ppwzFoundIn
+    );
+HRESULT DAPI MultiSzFindString(
+    __in_z LPCWSTR pwzMultiSz,
+    __in_z LPCWSTR pwzString,
+    __out_opt DWORD_PTR* pdwIndex,
+    __deref_opt_out_z LPCWSTR* ppwzFound
+    );
+HRESULT DAPI MultiSzRemoveString(
+    __deref_inout_z LPWSTR* ppwzMultiSz,
+    __in DWORD_PTR dwIndex
+    );
+HRESULT DAPI MultiSzInsertString(
+    __deref_inout_z LPWSTR* ppwzMultiSz,
+    __inout_opt DWORD_PTR *pcchMultiSz,
+    __in DWORD_PTR dwIndex,
+    __in_z LPCWSTR pwzInsert
+    );
+HRESULT DAPI MultiSzReplaceString(
+    __deref_inout_z LPWSTR* ppwzMultiSz,
+    __in DWORD_PTR dwIndex,
+    __in_z LPCWSTR pwzString
+    );
+
+LPCWSTR wcsistr(
+    __in_z LPCWSTR wzString,
+    __in_z LPCWSTR wzCharSet
+    );
+
+HRESULT DAPI StrStringToInt16(
+    __in_z LPCWSTR wzIn,
+    __in DWORD cchIn,
+    __out SHORT* psOut
+    );
+HRESULT DAPI StrStringToUInt16(
+    __in_z LPCWSTR wzIn,
+    __in DWORD cchIn,
+    __out USHORT* pusOut
+    );
+HRESULT DAPI StrStringToInt32(
+    __in_z LPCWSTR wzIn,
+    __in DWORD cchIn,
+    __out INT* piOut
+    );
+HRESULT DAPI StrStringToUInt32(
+    __in_z LPCWSTR wzIn,
+    __in DWORD cchIn,
+    __out UINT* puiOut
+    );
+HRESULT DAPI StrStringToInt64(
+    __in_z LPCWSTR wzIn,
+    __in DWORD cchIn,
+    __out LONGLONG* pllOut
+    );
+HRESULT DAPI StrStringToUInt64(
+    __in_z LPCWSTR wzIn,
+    __in DWORD cchIn,
+    __out ULONGLONG* pullOut
+    );
+void DAPI StrStringToUpper(
+    __inout_z LPWSTR wzIn
+    );
+void DAPI StrStringToLower(
+    __inout_z LPWSTR wzIn
+    );
+
+HRESULT DAPI StrArrayAllocString(
+    __deref_inout_ecount(*pcStrArray) LPWSTR **prgsczStrArray,
+    __inout LPUINT pcStrArray,
+    __in_z LPCWSTR wzSource,
+    __in DWORD_PTR cchSource
+    );
+
+HRESULT DAPI StrArrayFree(
+    __in_ecount(cStrArray) LPWSTR *rgsczStrArray,
+    __in UINT cStrArray
+    );
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/sdk/inc/thmutil.h b/sdk/inc/thmutil.h
new file mode 100644
index 0000000..6f1b310
--- /dev/null
+++ b/sdk/inc/thmutil.h
@@ -0,0 +1,191 @@
+#pragma once
+//-------------------------------------------------------------------------------------------------
+// <copyright file="thmutil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//  Theme helper functions.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum THEME_CONTROL_DATA
+{
+    THEME_CONTROL_DATA_HOVER = 1,
+};
+
+enum THEME_CONTROL_TYPE
+{
+    THEME_CONTROL_TYPE_UNKNOWN,
+    THEME_CONTROL_TYPE_BUTTON,
+    THEME_CONTROL_TYPE_CHECKBOX,
+    THEME_CONTROL_TYPE_EDITBOX,
+    THEME_CONTROL_TYPE_HYPERLINK,
+    THEME_CONTROL_TYPE_IMAGE,
+    THEME_CONTROL_TYPE_PROGRESSBAR,
+    THEME_CONTROL_TYPE_RICHEDIT,
+    THEME_CONTROL_TYPE_STATIC,
+    THEME_CONTROL_TYPE_TEXT,
+};
+
+struct THEME_CONTROL
+{
+    THEME_CONTROL_TYPE type;
+
+    LPWSTR wzText;
+    int nX;
+    int nY;
+    int nHeight;
+    int nWidth;
+    int nSourceX;
+    int nSourceY;
+
+    DWORD dwStyle;
+    DWORD dwFontId;
+    DWORD dwFontHoverId;
+    DWORD dwFontSelectedId;
+    HWND hWnd;
+};
+
+
+struct THEME_FONT
+{
+    HFONT hFont;
+    COLORREF crForeground;
+    HBRUSH hForeground;
+    COLORREF crBackground;
+    HBRUSH hBackground;
+};
+
+
+struct THEME
+{
+    DWORD dwStyle;
+    DWORD dwFontId;
+    HANDLE hIcon;
+    LPWSTR wzCaption;
+    int nHeight;
+    int nWidth;
+    int nSourceX;
+    int nSourceY;
+
+    HBITMAP hImage;
+
+    DWORD cFonts;
+    THEME_FONT* rgFonts;
+
+    DWORD cControls;
+    THEME_CONTROL* rgControls;
+
+    // state variables that should be ignored
+    HWND hwndHover; // currently 
+};
+
+
+HRESULT DAPI ThemeInitialize(
+    __in HMODULE hModule
+    );
+
+void DAPI ThemeUninitialize();
+
+HRESULT DAPI ThemeLoadFromFile(
+    __in_z LPCWSTR wzThemeFile,
+    __out THEME** ppTheme
+    );
+
+HRESULT DAPI ThemeLoadFromResource(
+    __in_opt HMODULE hModule,
+    __in_z LPCSTR szResource,
+    __out THEME** ppTheme
+    );
+
+void DAPI ThemeFree(
+    __in THEME* pTheme
+    );
+
+HRESULT DAPI ThemeLoadControls(
+    __in THEME* pTheme,
+    __in HWND hwndParent
+    );
+
+HRESULT DAPI ThemeDrawBackground(
+    __in THEME* pTheme,
+    __in PAINTSTRUCT* pps
+    );
+
+HRESULT DAPI ThemeDrawControl(
+    __in THEME* pTheme,
+    __in DRAWITEMSTRUCT* pdis
+    );
+
+void DAPI ThemeHoverControl(
+    __in THEME* pTheme,
+    __in HWND hwndParent,
+    __in HWND hwndControl
+    );
+
+BOOL DAPI ThemeIsControlChecked(
+    __in THEME* pTheme,
+    __in DWORD dwControl
+    );
+
+BOOL DAPI ThemeSetControlColor(
+    __in THEME* pTheme,
+    __in HDC hdc,
+    __in HWND hWnd,
+    __out HBRUSH* phBackgroundBrush
+    );
+
+HRESULT DAPI ThemeSetProgressControl(
+    __in THEME* pTheme,
+    __in DWORD dwControl,
+    __in DWORD dwProgressPercentage
+    );
+
+HRESULT DAPI ThemeSetProgressControlColor(
+    __in THEME* pTheme,
+    __in DWORD dwControl,
+    __in DWORD dwColorIndex
+    );
+
+HRESULT DAPI ThemeSetTextControl(
+    __in THEME* pTheme,
+    __in DWORD dwControl,
+    __in_z LPCWSTR wzText
+    );
+
+HRESULT DAPI ThemeGetTextControl(
+    __in const THEME* pTheme,
+    __in DWORD dwControl,
+    __out LPWSTR* psczText
+    );
+
+HRESULT DAPI ThemeLoadRichEditFromFile(
+    __in THEME* pTheme,
+    __in DWORD dwControl,
+    __in_z LPCWSTR wzFileName, 
+    __in HMODULE hModule
+    );
+
+HRESULT DAPI ThemeLoadLocFromFile(
+    __in THEME* pTheme,
+    __in_z LPCWSTR wzFileName,
+    __in HMODULE hModule
+    );
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/sdk/inc/timeutil.h b/sdk/inc/timeutil.h
new file mode 100644
index 0000000..cc92d17
--- /dev/null
+++ b/sdk/inc/timeutil.h
@@ -0,0 +1,33 @@
+#pragma once
+//-------------------------------------------------------------------------------------------------
+// <copyright file="timeutil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//  Time helper functions.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+HRESULT DAPI TimeFromString(
+    __in_z LPCWSTR wzTime,
+    __out FILETIME* pFileTime
+    );
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/sdk/inc/uriutil.h b/sdk/inc/uriutil.h
new file mode 100644
index 0000000..86ab80c
--- /dev/null
+++ b/sdk/inc/uriutil.h
@@ -0,0 +1,93 @@
+//-------------------------------------------------------------------------------------------------
+// <copyright file="uriutil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    URI helper funtions.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#pragma once
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum URI_PROTOCOL
+{
+    URI_PROTOCOL_UNKNOWN,
+    URI_PROTOCOL_FILE,
+    URI_PROTOCOL_FTP,
+    URI_PROTOCOL_HTTP,
+    URI_PROTOCOL_LOCAL,
+    URI_PROTOCOL_UNC
+};
+
+
+HRESULT DAPI UriCanonicalize(
+    __inout_z LPWSTR* psczUri
+    );
+
+HRESULT DAPI UriCrack(
+    __in_z LPCWSTR wzUri,
+    __out_opt INTERNET_SCHEME* pScheme,
+    __deref_opt_out_z LPWSTR* psczHostName,
+    __out_opt INTERNET_PORT* pPort,
+    __deref_opt_out_z LPWSTR* psczUser,
+    __deref_opt_out_z LPWSTR* psczPassword,
+    __deref_opt_out_z LPWSTR* psczPath,
+    __deref_opt_out_z LPWSTR* psczQueryString
+    );
+
+HRESULT DAPI UriCreate(
+    __inout_z LPWSTR* psczUri,
+    __in INTERNET_SCHEME scheme,
+    __in_z_opt LPWSTR wzHostName,
+    __in INTERNET_PORT port,
+    __in_z_opt LPWSTR wzUser,
+    __in_z_opt LPWSTR wzPassword,
+    __in_z_opt LPWSTR wzPath,
+    __in_z_opt LPWSTR wzQueryString
+    );
+
+HRESULT DAPI UriCanonicalize(
+    __inout_z LPWSTR* psczUri
+    );
+
+HRESULT DAPI UriFile(
+    __deref_out_z LPWSTR* psczFile,
+    __in_z LPCWSTR wzUri
+    );
+
+HRESULT DAPI UriProtocol(
+    __in_z LPCWSTR wzUri,
+    __out URI_PROTOCOL* pProtocol
+    );
+
+HRESULT DAPI UriRoot(
+    __in_z LPCWSTR wzUri,
+    __out LPWSTR* ppwzRoot,
+    __out_opt URI_PROTOCOL* pProtocol
+    );
+
+HRESULT DAPI UriResolve(
+    __in_z LPCWSTR wzUri,
+    __in_opt LPCWSTR wzBaseUri,
+    __out LPWSTR* ppwzResolvedUri,
+    __out_opt const URI_PROTOCOL* pResolvedProtocol
+    );
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/sdk/inc/userutil.h b/sdk/inc/userutil.h
new file mode 100644
index 0000000..05d2936
--- /dev/null
+++ b/sdk/inc/userutil.h
@@ -0,0 +1,47 @@
+#pragma once
+//-------------------------------------------------------------------------------------------------
+// <copyright file="userutil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    User helper funtions.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+HRESULT DAPI UserBuildDomainUserName(
+    __out_ecount_z(cchDest) LPWSTR wzDest,
+    __in int cchDest,
+    __in_z LPCWSTR pwzName,
+    __in_z LPCWSTR pwzDomain
+    );
+
+HRESULT DAPI UserCheckIsMember(
+    __in_z LPCWSTR pwzName,
+    __in_z LPCWSTR pwzDomain,
+    __in_z LPCWSTR pwzGroupName,
+    __in_z LPCWSTR pwzGroupDomain,
+    __out LPBOOL lpfMember
+    );
+
+HRESULT DAPI UserCreateADsPath(
+    __in_z LPCWSTR wzObjectDomain, 
+    __in_z LPCWSTR wzObjectName,
+    __out BSTR *pbstrAdsPath
+    );
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/sdk/inc/wcautil.h b/sdk/inc/wcautil.h
new file mode 100644
index 0000000..95e8cef
--- /dev/null
+++ b/sdk/inc/wcautil.h
@@ -0,0 +1,379 @@
+#pragma once
+//-------------------------------------------------------------------------------------------------
+// <copyright file="wcautil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    Windows Installer XML CustomAction utility library.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define WIXAPI __stdcall
+#define ExitTrace WcaLogError
+#define ExitTrace1 WcaLogError
+#define ExitTrace2 WcaLogError
+#define ExitTrace3 WcaLogError
+
+#include "dutil.h"
+
+#define MessageExitOnLastError(x, e, s)      { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { ExitTrace(x, "%s", s); WcaErrorMessage(e, x, MB_OK, 0);  goto LExit; } }
+#define MessageExitOnLastError1(x, e, f, s)  { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { ExitTrace1(x, f, s); WcaErrorMessage(e, x, MB_OK, 1, s);  goto LExit; } }
+
+#define MessageExitOnFailure(x, e, s)           if (FAILED(x)) { ExitTrace(x, "%s", s); WcaErrorMessage(e, x, INSTALLMESSAGE_ERROR | MB_OK, 0);  goto LExit; }
+#define MessageExitOnFailure1(x, e, f, s)       if (FAILED(x)) { ExitTrace1(x, f, s); WcaErrorMessage(e, x, INSTALLMESSAGE_ERROR | MB_OK, 1, s);  goto LExit; }
+#define MessageExitOnFailure2(x, e, f, s, t)    if (FAILED(x)) { ExitTrace2(x, f, s, t); WcaErrorMessage(e, x, INSTALLMESSAGE_ERROR | MB_OK, 2, s, t);  goto LExit; }
+#define MessageExitOnFailure3(x, e, f, s, t, u) if (FAILED(x)) { ExitTrace2(x, f, s, t, u); WcaErrorMessage(e, x, INSTALLMESSAGE_ERROR | MB_OK, 3, s, t, u);  goto LExit; }
+
+#define MessageExitOnNullWithLastError(p, x, e, s) if (NULL == p) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } ExitTrace(x, "%s", s); WcaErrorMessage(e, x, MB_OK, 0);  goto LExit; }
+#define MessageExitOnNullWithLastError1(p, x, e, f, s) if (NULL == p) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } ExitTrace(x, f, s); WcaErrorMessage(e, x, MB_OK, 1, s);  goto LExit; }
+#define MessageExitOnNullWithLastError2(p, x, e, f, s, t) if (NULL == p) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } ExitTrace(x, f, s, t); WcaErrorMessage(e, x, MB_OK, 2, s, t);  goto LExit; }
+
+// Generic action enum.
+enum WCA_ACTION
+{
+    WCA_ACTION_NONE,
+    WCA_ACTION_INSTALL,
+    WCA_ACTION_UNINSTALL,
+};
+
+enum WCA_CASCRIPT
+{
+    WCA_CASCRIPT_SCHEDULED,
+    WCA_CASCRIPT_ROLLBACK,
+};
+
+enum WCA_CASCRIPT_CLOSE
+{
+    WCA_CASCRIPT_CLOSE_PRESERVE,
+    WCA_CASCRIPT_CLOSE_DELETE,
+};
+
+enum WCA_TODO
+{
+    WCA_TODO_UNKNOWN,
+    WCA_TODO_INSTALL,
+    WCA_TODO_UNINSTALL,
+    WCA_TODO_REINSTALL,
+};
+
+typedef struct WCA_CASCRIPT_STRUCT
+{
+    LPWSTR pwzScriptPath;
+    HANDLE hScriptFile;
+} *WCA_CASCRIPT_HANDLE;
+
+void WIXAPI WcaGlobalInitialize(
+    __in HINSTANCE hInst
+    );
+void WIXAPI WcaGlobalFinalize();
+
+HRESULT WIXAPI WcaInitialize(
+    __in MSIHANDLE hInstall,
+    __in_z PCSTR szCustomActionLogName
+    );
+UINT WIXAPI WcaFinalize(
+    __in UINT iReturnValue
+    );
+BOOL WIXAPI WcaIsInitialized();
+
+MSIHANDLE WIXAPI WcaGetInstallHandle();
+MSIHANDLE WIXAPI WcaGetDatabaseHandle();
+
+const char* WIXAPI WcaGetLogName();
+
+void WIXAPI WcaSetReturnValue(
+    __in UINT iReturnValue
+    );
+BOOL WIXAPI WcaCancelDetected();
+
+const int LOG_BUFFER = 2048;
+enum LOGLEVEL
+{ 
+    LOGMSG_TRACEONLY,  // Never written to the log file (except in DEBUG builds)
+    LOGMSG_VERBOSE,    // Written to log when LOGVERBOSE
+    LOGMSG_STANDARD    // Written to log whenever informational logging is enabled
+};
+
+void __cdecl WcaLog(
+    __in LOGLEVEL llv,
+    __in_z __format_string PCSTR fmt, ...
+    );
+BOOL WIXAPI WcaDisplayAssert(
+    __in LPCSTR sz
+    );
+void __cdecl WcaLogError(
+    __in HRESULT hr,
+    __in LPCSTR szMessage,
+    ...
+    );
+
+UINT WIXAPI WcaProcessMessage(
+    __in INSTALLMESSAGE eMessageType,
+    __in MSIHANDLE hRecord
+    );
+UINT __cdecl WcaErrorMessage(
+    __in int iError, 
+    __in HRESULT hrError, 
+    __in UINT uiType, 
+    __in DWORD cArgs, 
+    ...
+    );
+HRESULT WIXAPI WcaProgressMessage(
+    __in UINT uiCost,
+    __in BOOL fExtendProgressBar
+    );
+
+BOOL WIXAPI WcaIsInstalling(
+    __in INSTALLSTATE isInstalled,
+    __in INSTALLSTATE isAction
+    );
+BOOL WIXAPI WcaIsReInstalling(
+    __in INSTALLSTATE isInstalled,
+    __in INSTALLSTATE isAction
+    );
+BOOL WIXAPI WcaIsUninstalling(
+    __in INSTALLSTATE isInstalled,
+    __in INSTALLSTATE isAction
+    );
+
+HRESULT WIXAPI WcaSetComponentState(
+    __in_z LPCWSTR wzComponent,
+    __in INSTALLSTATE isState
+    );
+
+HRESULT WIXAPI WcaTableExists(
+    __in_z LPCWSTR wzTable
+    );
+
+HRESULT WIXAPI WcaOpenView(
+    __in_z LPCWSTR wzSql,
+    __out MSIHANDLE* phView
+    );
+HRESULT WIXAPI WcaExecuteView(
+    __in MSIHANDLE hView,
+    __in MSIHANDLE hRec
+    );
+HRESULT WIXAPI WcaOpenExecuteView(
+    __in_z LPCWSTR wzSql,
+    __out MSIHANDLE* phView
+    );
+HRESULT WIXAPI WcaFetchRecord(
+    __in MSIHANDLE hView,
+    __out MSIHANDLE* phRec
+    );
+HRESULT WIXAPI WcaFetchSingleRecord(
+    __in MSIHANDLE hView,
+    __out MSIHANDLE* phRec
+    );
+
+HRESULT WIXAPI WcaGetProperty(
+    __in_z LPCWSTR wzProperty,
+    __inout LPWSTR* ppwzData
+    );
+HRESULT WIXAPI WcaGetFormattedProperty(
+    __in_z LPCWSTR wzProperty,
+    __out LPWSTR* ppwzData
+    );
+HRESULT WIXAPI WcaGetFormattedString(
+    __in_z LPCWSTR wzString,
+    __out LPWSTR* ppwzData
+    );
+HRESULT WIXAPI WcaGetIntProperty(
+    __in_z LPCWSTR wzProperty,
+    __inout int* piData
+    );
+HRESULT WIXAPI WcaGetTargetPath(
+    __in_z LPCWSTR wzFolder,
+    __out LPWSTR* ppwzData
+    );
+HRESULT WIXAPI WcaSetProperty(
+    __in_z LPCWSTR wzPropertyName,
+    __in_z LPCWSTR wzPropertyValue
+    );
+HRESULT WIXAPI WcaSetIntProperty(
+    __in_z LPCWSTR wzPropertyName,
+    __in int nPropertyValue
+    );
+BOOL WIXAPI WcaIsPropertySet(
+    __in LPCSTR szProperty
+    );
+
+HRESULT WIXAPI WcaGetRecordInteger(
+    __in MSIHANDLE hRec,
+    __in UINT uiField,
+    __inout int* piData
+    );
+HRESULT WIXAPI WcaGetRecordString(
+    __in MSIHANDLE hRec,
+    __in UINT uiField,
+    __inout LPWSTR* ppwzData
+    );
+HRESULT WIXAPI WcaGetRecordFormattedInteger(
+    __in MSIHANDLE hRec,
+    __in UINT uiField,
+    __out int* piData
+    );
+HRESULT WIXAPI WcaGetRecordFormattedString(
+    __in MSIHANDLE hRec,
+    __in UINT uiField,
+    __inout LPWSTR* ppwzData
+    );
+
+HRESULT WIXAPI WcaAllocStream(
+    __deref_out_bcount_part(cbData, 0) BYTE** ppbData,
+    __in DWORD cbData
+    );
+HRESULT WIXAPI WcaFreeStream(
+    __in BYTE* pbData
+    );
+
+HRESULT WIXAPI WcaGetRecordStream(
+    __in MSIHANDLE hRecBinary,
+    __in UINT uiField,
+    __deref_out_bcount_full(*pcbData) BYTE** ppbData,
+    __out DWORD* pcbData
+    );
+HRESULT WIXAPI WcaSetRecordString(
+    __in MSIHANDLE hRec,
+    __in UINT uiField,
+    __in_z LPCWSTR wzData
+    );
+HRESULT WIXAPI WcaSetRecordInteger(
+    __in MSIHANDLE hRec,
+    __in UINT uiField,
+    __in int iValue
+    );
+
+HRESULT WIXAPI WcaDoDeferredAction(
+    __in_z LPCWSTR wzAction,
+    __in_z LPCWSTR wzCustomActionData,
+    __in UINT uiCost
+    );
+DWORD WIXAPI WcaCountOfCustomActionDataRecords(
+    __in_z LPCWSTR wzData
+    );
+
+void WIXAPI RevertCustomActionData(
+    __in LPWSTR wzRevertTo,
+    __in LPCWSTR wzRevertFrom
+    );
+
+HRESULT WIXAPI WcaReadStringFromCaData(
+    __deref_in LPWSTR* ppwzCustomActionData,
+    __deref_out_z LPWSTR* ppwzString
+    );
+HRESULT WIXAPI WcaReadIntegerFromCaData(
+    __deref_in LPWSTR* ppwzCustomActionData,
+    __out int* piResult
+    );
+HRESULT WIXAPI WcaReadStreamFromCaData(
+    __deref_in LPWSTR* ppwzCustomActionData,
+    __deref_out_bcount(*pcbData) BYTE** ppbData,
+    __out DWORD_PTR* pcbData
+    );
+HRESULT WIXAPI WcaWriteStringToCaData(
+    __in_z LPCWSTR wzString,
+    __deref_inout_z LPWSTR* ppwzCustomActionData
+    );
+HRESULT WIXAPI WcaWriteIntegerToCaData(
+    __in int i, 
+    __deref_inout_z LPWSTR* ppwzCustomActionData
+    );
+HRESULT WIXAPI WcaWriteStreamToCaData(
+    __in_bcount(cbData) const BYTE* pbData,
+    __in DWORD cbData,
+    __deref_inout_z LPWSTR* ppwzCustomActionData
+    );
+
+HRESULT __cdecl WcaAddTempRecord(
+    __inout MSIHANDLE* phTableView,
+    __inout MSIHANDLE* phColumns,
+    __in_z LPCWSTR wzTable,
+    __out_opt MSIDBERROR* pdbError,
+    __in UINT uiUniquifyColumn,
+    __in UINT cColumns,
+    ...
+    );
+
+HRESULT WIXAPI WcaDumpTable(
+    __in_z LPCWSTR wzTable
+    );
+
+HRESULT WIXAPI WcaDeferredActionRequiresReboot();
+BOOL WIXAPI WcaDidDeferredActionRequireReboot();
+
+HRESULT WIXAPI WcaCaScriptCreateKey(
+    __out LPWSTR* ppwzScriptKey
+    );
+
+HRESULT WIXAPI WcaCaScriptCreate(
+    __in WCA_ACTION action,
+    __in WCA_CASCRIPT script,
+    __in BOOL fImpersonated,
+    __in_z LPCWSTR wzScriptKey,
+    __in BOOL fAppend,
+    __out WCA_CASCRIPT_HANDLE* phScript
+    );
+
+HRESULT WIXAPI WcaCaScriptOpen(
+    __in WCA_ACTION action,
+    __in WCA_CASCRIPT script,
+    __in BOOL fImpersonated,
+    __in_z LPCWSTR wzScriptKey,
+    __out WCA_CASCRIPT_HANDLE* phScript
+    );
+
+void WIXAPI WcaCaScriptClose(
+    __in_opt WCA_CASCRIPT_HANDLE hScript,
+    __in WCA_CASCRIPT_CLOSE closeOperation
+    );
+
+HRESULT WIXAPI WcaCaScriptReadAsCustomActionData(
+    __in WCA_CASCRIPT_HANDLE hScript,
+    __out LPWSTR* ppwzCustomActionData
+    );
+
+HRESULT WIXAPI WcaCaScriptWriteString(
+    __in WCA_CASCRIPT_HANDLE hScript,
+    __in_z LPCWSTR wzValue
+    );
+
+HRESULT WIXAPI WcaCaScriptWriteNumber(
+    __in WCA_CASCRIPT_HANDLE hScript,
+    __in DWORD dwValue
+    );
+
+void WIXAPI WcaCaScriptFlush(
+    __in WCA_CASCRIPT_HANDLE hScript
+    );
+
+void WIXAPI WcaCaScriptCleanup(
+    __in_z LPCWSTR wzProductCode,
+    __in BOOL fImpersonated
+    );
+
+HRESULT WIXAPI QuietExec(
+    __inout_z LPWSTR wzCommand,
+    __in DWORD dwTimeout
+    );
+
+WCA_TODO WIXAPI WcaGetComponentToDo(
+    __in_z LPCWSTR wzComponentId
+    );
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/sdk/inc/wcawow64.h b/sdk/inc/wcawow64.h
new file mode 100644
index 0000000..9cfc60a
--- /dev/null
+++ b/sdk/inc/wcawow64.h
@@ -0,0 +1,35 @@
+#pragma once
+//-------------------------------------------------------------------------------------------------
+// <copyright file="wcawow64.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    Windows Installer XML CustomAction utility library for Wow64 API-related functionality.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#include "wcautil.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+HRESULT WIXAPI WcaInitializeWow64();
+BOOL WIXAPI WcaIsWow64Process();
+BOOL WIXAPI WcaIsWow64Initialized();
+HRESULT WIXAPI WcaDisableWow64FSRedirection();
+HRESULT WIXAPI WcaRevertWow64FSRedirection();
+HRESULT WIXAPI WcaFinalizeWow64();
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/sdk/inc/wcawrapquery.h b/sdk/inc/wcawrapquery.h
new file mode 100644
index 0000000..b74f7d4
--- /dev/null
+++ b/sdk/inc/wcawrapquery.h
@@ -0,0 +1,146 @@
+#pragma once
+//-------------------------------------------------------------------------------------------------
+// <copyright file="wcawrapquery.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    Windows Installer XML CustomAction utility library wrappers meant to wrap an MSI view as
+//    opened by an immediate custom action and transmit it to a deferred custom action
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#include "wcautil.h"
+
+// Enumerations
+enum eWrapQueryAction
+{
+    wqaTableBegin = 1,
+    wqaTableFinish,
+    wqaRowBegin,
+    wqaRowFinish
+};
+
+enum eColumnDataType
+{
+    cdtString = 1,
+    cdtInt,
+    cdtStream,
+    cdtUnknown
+};
+
+enum eFormatMaskColumn
+{
+    efmcColumn1 = 1,
+    efmcColumn2 = 1 << 1,
+    efmcColumn3 = 1 << 2,
+    efmcColumn4 = 1 << 3,
+    efmcColumn5 = 1 << 4,
+    efmcColumn6 = 1 << 5,
+    efmcColumn7 = 1 << 6,
+    efmcColumn8 = 1 << 7,
+    efmcColumn9 = 1 << 8,
+    efmcColumn10 = 1 << 9,
+    efmcColumn11 = 1 << 10,
+    efmcColumn12 = 1 << 11,
+    efmcColumn13 = 1 << 12,
+    efmcColumn14 = 1 << 13,
+    efmcColumn15 = 1 << 14,
+    efmcColumn16 = 1 << 15,
+    efmcColumn17 = 1 << 16,
+    efmcColumn18 = 1 << 17,
+    efmcColumn19 = 1 << 18,
+    efmcColumn20 = 1 << 19,
+    efmcColumn21 = 1 << 20,
+    efmcColumn22 = 1 << 21,
+    efmcColumn23 = 1 << 22,
+    efmcColumn24 = 1 << 23,
+    efmcColumn25 = 1 << 24,
+    efmcColumn26 = 1 << 25,
+    efmcColumn27 = 1 << 26,
+    efmcColumn28 = 1 << 27,
+    efmcColumn29 = 1 << 28,
+    efmcColumn30 = 1 << 29,
+    efmcColumn31 = 1 << 30,
+    efmcColumn32 = 1 << 31,
+};
+
+// Keeps track of the query instance for the reading CA (deferred CA)
+typedef struct WCA_WRAPQUERY_STRUCT
+{
+    // These are used to size our dynamic arrays below
+    DWORD dwColumns, dwRows, dwNextIndex;
+
+    // Dynamic arrays of column schema information
+    eColumnDataType *pcdtColumnType;
+    LPWSTR *ppwzColumnNames;
+
+    // Dynamic array of raw record data
+    MSIHANDLE *phRecords;
+} *WCA_WRAPQUERY_HANDLE;
+
+// Wrap a query
+// Setting the pfFormatMask enables control over which fields will be formatted, and which will be left unchanged
+// Setting dwComponentColumn to something other than 0xFFFFFFFF tells WcaWrapQuery to add two additional columns to the right side of the table
+//      - ISInstalled and ISAction - which map to the ComponentState of the component (the component is found in the column specified)
+//      Note that if a component is NULL, the component state columns will also be left null, and it will be up to the deferred CA to fail or ignore the case appropriately
+// Setting dwDirectoryColumn to something other than 0xFFFFFFFF tells WcaWrapQuery to add two more additional columns to the right side of the table
+//      - SourcePath and TargetPath - which map to the Directory's Source and Target Path (the directory is found in the column specified)
+//      Note that if a directory is NULL, the directory source/target path columns will also be left null, and it will be up to the deferred CA to fail or ignore the case appropriately
+HRESULT WIXAPI WcaWrapQuery(
+    __in_z LPCWSTR pwzQuery,
+    __inout LPWSTR * ppwzCustomActionData,
+    __in_opt DWORD dwFormatMask,
+    __in_opt DWORD dwComponentColumn,
+    __in_opt DWORD dwDirectoryColumn
+    );
+// This wraps an empty table query into the custom action data - this is a way to indicate to the deferred custom action that a necessary table doesn't exist, or its query returned no results
+HRESULT WIXAPI WcaWrapEmptyQuery(
+    __inout LPWSTR * ppwzCustomActionData
+    );
+
+// Open a new unwrap query operation, with data from the ppwzCustomActionData string
+HRESULT WIXAPI WcaBeginUnwrapQuery(
+    __out WCA_WRAPQUERY_HANDLE * phWrapQuery,
+    __inout LPWSTR * ppwzCustomActionData
+    );
+
+// Get the number of records in a query being unwrapped
+DWORD WIXAPI WcaGetQueryRecords(
+    __in const WCA_WRAPQUERY_HANDLE hWrapQuery
+    );
+
+// This function resets a query back to its first row, so that the next fetch returns the first record
+void WIXAPI WcaFetchWrappedReset(
+    __in WCA_WRAPQUERY_HANDLE hWrapQuery
+    );
+// Fetch the next record in this query
+// NOTE: the MSIHANDLE returned by this function should not be released, as it is the same handle used by the query object to maintain the item.
+//       so, don't use this function with PMSIHANDLE objects!
+HRESULT WIXAPI WcaFetchWrappedRecord(
+    __in WCA_WRAPQUERY_HANDLE hWrapQuery,
+    __out MSIHANDLE* phRec
+    );
+
+// Fetch the next record in the query where the string value in column dwComparisonColumn equals the value pwzExpectedValue
+// NOTE: the MSIHANDLE returned by this function should not be released, as it is the same handle used by the query object to maintain the item.
+//       so, don't use this function with PMSIHANDLE objects!
+HRESULT WIXAPI WcaFetchWrappedRecordWhereString(
+    __in WCA_WRAPQUERY_HANDLE hWrapQuery,
+    __in DWORD dwComparisonColumn,
+    __in_z LPCWSTR pwzExpectedValue,
+    __out MSIHANDLE* phRec
+    );
+
+// Release a query ID (frees memory, and frees the ID for a new query)
+void WIXAPI WcaFinishUnwrapQuery(
+    __in_opt WCA_WRAPQUERY_HANDLE hWrapQuery
+    );
diff --git a/sdk/inc/wiutil.h b/sdk/inc/wiutil.h
new file mode 100644
index 0000000..0325a01
--- /dev/null
+++ b/sdk/inc/wiutil.h
@@ -0,0 +1,50 @@
+#pragma once
+//-------------------------------------------------------------------------------------------------
+// <copyright file="wiutil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    Header for Windows Installer helper functions.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define MAX_DARWIN_KEY 73
+#define MAX_DARWIN_COLUMN 255
+
+#define ReleaseMsi(h) if (h) { ::MsiCloseHandle(h); }
+#define ReleaseNullMsi(h) if (h) { ::MsiCloseHandle(h); h = NULL; }
+
+HRESULT DAPI WiuGetComponentPath(
+    __in_z LPCWSTR wzProductCode,
+    __in_z LPCWSTR wzComponentId,
+    __out LPWSTR* ppwzPath
+    );
+
+HRESULT DAPI WiuGetProductInfo(
+    __in_z LPCWSTR wzProductCode,
+    __in_z LPCWSTR wzProperty,
+    __out LPWSTR* ppwzValue
+    );
+
+HRESULT DAPI WiuGetProductProperty(
+    __in MSIHANDLE hProduct,
+    __in_z LPCWSTR wzProperty,
+    __out LPWSTR* ppwzValue
+    );
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/sdk/inc/xmlutil.h b/sdk/inc/xmlutil.h
new file mode 100644
index 0000000..dca3451
--- /dev/null
+++ b/sdk/inc/xmlutil.h
@@ -0,0 +1,183 @@
+#pragma once
+//-------------------------------------------------------------------------------------------------
+// <copyright file="xmlutil.h" company="Microsoft">
+//    Copyright (c) Microsoft Corporation.  All rights reserved.
+//    
+//    The use and distribution terms for this software are covered by the
+//    Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
+//    which can be found in the file CPL.TXT at the root of this distribution.
+//    By using this software in any fashion, you are agreeing to be bound by
+//    the terms of this license.
+//    
+//    You must not remove this notice, or any other, from this software.
+// </copyright>
+// 
+// <summary>
+//    XML helper funtions.
+// </summary>
+//-------------------------------------------------------------------------------------------------
+
+// constant XML CLSIDs and IIDs
+extern __declspec(selectany) const CLSID XmlUtil_CLSID_DOMDocument   = {0x2933BF90, 0x7B36, 0x11d2, {0xB2, 0x0E, 0x00, 0xC0, 0x4F, 0x98, 0x3E, 0x60}};
+extern __declspec(selectany) const CLSID XmlUtil_CLSID_DOMDocument20  = {0xF6D90F11, 0x9C73, 0x11D3, {0xB3, 0x2E, 0x00, 0xC0, 0x4F, 0x99, 0x0B, 0xB4}};
+extern __declspec(selectany) const CLSID XmlUtil_CLSID_DOMDocument26 = {0xf5078f1b, 0xc551, 0x11d3, {0x89, 0xb9, 0x00, 0x00, 0xf8, 0x1f, 0xe2, 0x21}};
+extern __declspec(selectany) const CLSID XmlUtil_CLSID_DOMDocument30 = {0xf5078f32, 0xc551, 0x11d3, {0x89, 0xb9, 0x00, 0x00, 0xf8, 0x1f, 0xe2, 0x21}};
+extern __declspec(selectany) const CLSID XmlUtil_CLSID_DOMDocument40 = {0x88d969c0, 0xf192, 0x11d4, {0xa6, 0x5f, 0x00, 0x40, 0x96, 0x32, 0x51, 0xe5}};
+extern __declspec(selectany) const CLSID XmlUtil_CLSID_DOMDocument50 = {0x88d969e5, 0xf192, 0x11d4, {0xa6, 0x5f, 0x00, 0x40, 0x96, 0x32, 0x51, 0xe5}};
+extern __declspec(selectany) const CLSID XmlUtil_CLSID_DOMDocument60 = {0x88d96a05, 0xf192, 0x11d4, {0xa6, 0x5f, 0x00, 0x40, 0x96, 0x32, 0x51, 0xe5}};
+extern __declspec(selectany) const CLSID XmlUtil_CLSID_XMLSchemaCache = {0x88d969c2, 0xf192, 0x11d4, {0xa6, 0x5f, 0x00, 0x40, 0x96, 0x32, 0x51, 0xe5}};
+
+extern __declspec(selectany) const IID XmlUtil_IID_IXMLDOMDocument =  {0x2933BF81, 0x7B36, 0x11D2, {0xB2, 0x0E, 0x00, 0xC0, 0x4F, 0x98, 0x3E, 0x60}};
+extern __declspec(selectany) const IID XmlUtil_IID_IXMLDOMDocument2 = {0x2933BF95, 0x7B36, 0x11D2, {0xB2, 0x0E, 0x00, 0xC0, 0x4F, 0x98, 0x3E, 0x60}};
+extern __declspec(selectany) const IID XmlUtil_IID_IXMLDOMSchemaCollection = {0x373984C8, 0xB845, 0x449B, {0x91, 0xE7, 0x45, 0xAC, 0x83, 0x03, 0x6A, 0xDE}};
+
+enum XML_LOAD_ATTRIBUTE
+{
+    XML_LOAD_PRESERVE_WHITESPACE = 1,
+};
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+HRESULT DAPI XmlInitialize();
+void DAPI XmlUninitialize();
+
+HRESULT DAPI XmlCreateElement(
+    __in IXMLDOMDocument *pixdDocument,
+    __in_z LPCWSTR wzElementName,
+    __out IXMLDOMElement **ppixnElement
+    );
+HRESULT DAPI XmlCreateDocument(
+    __in_opt LPCWSTR pwzElementName, 
+    __out IXMLDOMDocument** ppixdDocument,
+    __out_opt IXMLDOMElement** ppixeRootElement = NULL
+    );
+HRESULT DAPI XmlLoadDocument(
+    __in_z LPCWSTR wzDocument,
+    __out IXMLDOMDocument** ppixdDocument
+    );
+HRESULT DAPI XmlLoadDocumentEx(
+    __in_z LPCWSTR wzDocument,
+    __in DWORD dwAttributes,
+    __out IXMLDOMDocument** ppixdDocument
+    );
+HRESULT DAPI XmlLoadDocumentFromFile(
+    __in_z LPCWSTR wzPath,
+    __out IXMLDOMDocument** ppixdDocument
+    );
+HRESULT DAPI XmlLoadDocumentFromBuffer(
+    __in_bcount(cbSource) const BYTE* pbSource,
+    __in DWORD cbSource,
+    __out IXMLDOMDocument** ppixdDocument
+    );
+HRESULT DAPI XmlLoadDocumentFromFileEx(
+    __in_z LPCWSTR wzPath,
+    __in DWORD dwAttributes,
+    __out IXMLDOMDocument** ppixdDocument
+    );
+HRESULT DAPI XmlSelectSingleNode(
+    __in IXMLDOMNode* pixnParent,
+    __in_z LPCWSTR wzXPath,
+    __out IXMLDOMNode **ppixnChild
+    );
+HRESULT DAPI XmlSetAttribute(
+    __in IXMLDOMNode* pixnNode,
+    __in_z LPCWSTR pwzAttribute,
+    __in_z LPCWSTR pwzAttributeValue
+    );
+HRESULT DAPI XmlCreateTextNode(
+    __in IXMLDOMDocument *pixdDocument,
+    __in_z LPCWSTR wzText,
+    __out IXMLDOMText **ppixnTextNode
+    );
+HRESULT DAPI XmlGetText(
+    __in IXMLDOMNode* pixnNode,
+    __deref_out_z BSTR* pbstrText
+    );
+HRESULT DAPI XmlGetAttribute(
+    __in IXMLDOMNode* pixnNode,
+    __in_z LPCWSTR pwzAttribute,
+    __deref_out_z BSTR* pbstrAttributeValue
+    );
+HRESULT DAPI XmlGetAttributeEx(
+    __in IXMLDOMNode* pixnNode,
+    __in_z LPCWSTR wzAttribute,
+    __deref_out_z LPWSTR* psczAttributeValue
+    );
+HRESULT DAPI XmlGetYesNoAttribute(
+    __in IXMLDOMNode* pixnNode,
+    __in_z LPCWSTR wzAttribute,
+    __out BOOL* pfYes
+    );
+HRESULT DAPI XmlGetAttributeNumber(
+    __in IXMLDOMNode* pixnNode,
+    __in_z LPCWSTR pwzAttribute,
+    __out DWORD* pdwValue
+    );
+HRESULT DAPI XmlGetAttributeNumberBase(
+    __in IXMLDOMNode* pixnNode,
+    __in_z LPCWSTR pwzAttribute,
+    __in int nBase,
+    __out DWORD* pdwValue
+    );
+HRESULT DAPI XmlGetAttributeLargeNumber(
+    __in IXMLDOMNode* pixnNode,
+    __in_z LPCWSTR pwzAttribute,
+    __out DWORD64* pdw64Value
+    );
+HRESULT DAPI XmlGetNamedItem(
+    __in IXMLDOMNamedNodeMap *pixnmAttributes, 
+    __in_opt LPCWSTR wzName, 
+    __out IXMLDOMNode **ppixnNamedItem
+    );
+HRESULT DAPI XmlSetText(
+    __in IXMLDOMNode* pixnNode,
+    __in_z LPCWSTR pwzText
+    );
+HRESULT DAPI XmlSetTextNumber(
+    __in IXMLDOMNode *pixnNode,
+    __in DWORD dwValue
+    );
+HRESULT DAPI XmlCreateChild(
+    __in IXMLDOMNode* pixnParent,
+    __in_z LPCWSTR pwzElementType,
+    __out IXMLDOMNode** ppixnChild
+    );
+HRESULT DAPI XmlRemoveAttribute(
+    __in IXMLDOMNode* pixnNode,
+    __in_z LPCWSTR pwzAttribute
+    );
+HRESULT DAPI XmlSelectNodes(
+    __in IXMLDOMNode* pixnParent,
+    __in_z LPCWSTR wzXPath,
+    __out IXMLDOMNodeList **ppixnChild
+    );
+HRESULT DAPI XmlNextAttribute(
+    __in IXMLDOMNamedNodeMap* pixnnm,
+    __out IXMLDOMNode** pixnAttribute,
+    __deref_opt_out_z_opt BSTR* pbstrAttribute
+    );
+HRESULT DAPI XmlNextElement(
+    __in IXMLDOMNodeList* pixnl,
+    __out IXMLDOMNode** pixnElement,
+    __deref_opt_out_z_opt BSTR* pbstrElement
+    );
+HRESULT DAPI XmlRemoveChildren(
+    __in IXMLDOMNode* pixnSource,
+    __in_z LPCWSTR pwzXPath
+    );
+HRESULT DAPI XmlSaveDocument(
+    __in IXMLDOMDocument* pixdDocument, 
+    __inout LPCWSTR wzPath
+    );
+HRESULT DAPI XmlSaveDocumentToBuffer(
+    __in IXMLDOMDocument* pixdDocument,
+    __deref_out_bcount(*pcbDest) BYTE** ppbDest,
+    __out DWORD* pcbDest
+    );
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/sdk/lib/dutil_2005.lib b/sdk/lib/dutil_2005.lib
new file mode 100644
index 0000000..169c507
--- /dev/null
+++ b/sdk/lib/dutil_2005.lib
Binary files differ
diff --git a/sdk/lib/dutil_2005_ia64.lib b/sdk/lib/dutil_2005_ia64.lib
new file mode 100644
index 0000000..ef29c5d
--- /dev/null
+++ b/sdk/lib/dutil_2005_ia64.lib
Binary files differ
diff --git a/sdk/lib/dutil_2005_x64.lib b/sdk/lib/dutil_2005_x64.lib
new file mode 100644
index 0000000..f8be66c
--- /dev/null
+++ b/sdk/lib/dutil_2005_x64.lib
Binary files differ
diff --git a/sdk/lib/dutil_2008.lib b/sdk/lib/dutil_2008.lib
new file mode 100644
index 0000000..ebee484
--- /dev/null
+++ b/sdk/lib/dutil_2008.lib
Binary files differ
diff --git a/sdk/lib/dutil_2008_ia64.lib b/sdk/lib/dutil_2008_ia64.lib
new file mode 100644
index 0000000..8b33aef
--- /dev/null
+++ b/sdk/lib/dutil_2008_ia64.lib
Binary files differ
diff --git a/sdk/lib/dutil_2008_x64.lib b/sdk/lib/dutil_2008_x64.lib
new file mode 100644
index 0000000..34d4449
--- /dev/null
+++ b/sdk/lib/dutil_2008_x64.lib
Binary files differ
diff --git a/sdk/lib/dutil_2010.lib b/sdk/lib/dutil_2010.lib
new file mode 100644
index 0000000..1afa112
--- /dev/null
+++ b/sdk/lib/dutil_2010.lib
Binary files differ
diff --git a/sdk/lib/dutil_2010_ia64.lib b/sdk/lib/dutil_2010_ia64.lib
new file mode 100644
index 0000000..8537160
--- /dev/null
+++ b/sdk/lib/dutil_2010_ia64.lib
Binary files differ
diff --git a/sdk/lib/dutil_2010_x64.lib b/sdk/lib/dutil_2010_x64.lib
new file mode 100644
index 0000000..893f136
--- /dev/null
+++ b/sdk/lib/dutil_2010_x64.lib
Binary files differ
diff --git a/sdk/lib/wcautil_2005.lib b/sdk/lib/wcautil_2005.lib
new file mode 100644
index 0000000..3621897
--- /dev/null
+++ b/sdk/lib/wcautil_2005.lib
Binary files differ
diff --git a/sdk/lib/wcautil_2005_ia64.lib b/sdk/lib/wcautil_2005_ia64.lib
new file mode 100644
index 0000000..76d5649
--- /dev/null
+++ b/sdk/lib/wcautil_2005_ia64.lib
Binary files differ
diff --git a/sdk/lib/wcautil_2005_x64.lib b/sdk/lib/wcautil_2005_x64.lib
new file mode 100644
index 0000000..dd7eefc
--- /dev/null
+++ b/sdk/lib/wcautil_2005_x64.lib
Binary files differ
diff --git a/sdk/lib/wcautil_2008.lib b/sdk/lib/wcautil_2008.lib
new file mode 100644
index 0000000..bb44400
--- /dev/null
+++ b/sdk/lib/wcautil_2008.lib
Binary files differ
diff --git a/sdk/lib/wcautil_2008_ia64.lib b/sdk/lib/wcautil_2008_ia64.lib
new file mode 100644
index 0000000..2922092
--- /dev/null
+++ b/sdk/lib/wcautil_2008_ia64.lib
Binary files differ
diff --git a/sdk/lib/wcautil_2008_x64.lib b/sdk/lib/wcautil_2008_x64.lib
new file mode 100644
index 0000000..7e0ff82
--- /dev/null
+++ b/sdk/lib/wcautil_2008_x64.lib
Binary files differ
diff --git a/sdk/lib/wcautil_2010.lib b/sdk/lib/wcautil_2010.lib
new file mode 100644
index 0000000..7f151a7
--- /dev/null
+++ b/sdk/lib/wcautil_2010.lib
Binary files differ
diff --git a/sdk/lib/wcautil_2010_ia64.lib b/sdk/lib/wcautil_2010_ia64.lib
new file mode 100644
index 0000000..608f48f
--- /dev/null
+++ b/sdk/lib/wcautil_2010_ia64.lib
Binary files differ
diff --git a/sdk/lib/wcautil_2010_x64.lib b/sdk/lib/wcautil_2010_x64.lib
new file mode 100644
index 0000000..ea32cf1
--- /dev/null
+++ b/sdk/lib/wcautil_2010_x64.lib
Binary files differ
diff --git a/sdk/wix.ca.targets b/sdk/wix.ca.targets
new file mode 100644
index 0000000..703da1a
--- /dev/null
+++ b/sdk/wix.ca.targets
@@ -0,0 +1,188 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+****************************************************************************************************
+wix.ca.targets
+
+WARNING:  DO NOT MODIFY this file unless you are knowledgeable about MSBuild and have
+          created a backup copy.  Incorrect changes to this file will make it
+          impossible to load or build your projects from the command-line or the IDE.
+
+This file defines properties used in the post-build process for WiX/DTF managed custom action projects.
+
+Copyright (c) Microsoft Corporation. All rights reserved.
+****************************************************************************************************
+-->
+<Project
+  xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
+  InitialTargets="_SetDefaultPathValues">
+
+  <Import Project="$(CustomBeforeWixCATargets)" Condition=" '$(CustomBeforeWixCATargets)' != '' and Exists('$(CustomBeforeWixCATargets)')" />
+
+  <PropertyGroup>
+    <WixCATargetsPath Condition=" '$(WixCATargetsPath)' == '' AND '$(MSBuildExtensionsPath32)' != '' ">$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\wix.ca.targets</WixCATargetsPath>
+    <WixTasksPath Condition=" '$(WixTasksPath)' == '' AND '$(MSBuildExtensionsPath32)' != '' ">$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\WixTasks.dll</WixTasksPath>
+    <WixCATargetsPath Condition=" '$(WixCATargetsPath)' == '' ">$(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\wix.ca.targets</WixCATargetsPath>
+    <WixTasksPath Condition=" '$(WixTasksPath)' == '' ">$(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\WixTasks.dll</WixTasksPath>
+
+    <TargetCAFileName Condition=" '$(TargetCAFileName)' == '' ">$(TargetName).CA$(TargetExt)</TargetCAFileName>
+  </PropertyGroup>
+
+  <UsingTask TaskName="ReadRegistry" AssemblyFile="$(WixTasksPath)"/>
+
+  <!--
+  ==================================================================================================
+  _SetDefaultPathValues
+
+    Gets the default values of some paths from the registry.
+
+    [OUT]
+    $(WixExtDir) - Default Wix Extension Directory
+    $(WixToolPath) - Default Wix Tool install folder
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <WixInstallRegKey>SOFTWARE\Microsoft\Windows Installer XML\3.5</WixInstallRegKey>
+    <WixInstallRegKeyWow64>SOFTWARE\Wow6432Node\Microsoft\Windows Installer XML\3.5</WixInstallRegKeyWow64>
+  </PropertyGroup>
+  <Target
+    Name="_SetDefaultPathValues">
+
+    <ReadRegistry
+      Hive="LocalMachine"
+      Key="$(WixInstallRegKey)"
+      Name="InstallRoot"
+      FailIfMissing="false"
+      Condition=" '$(WixToolPath)' == '' ">
+
+      <Output TaskParameter="Value" PropertyName="WixToolPath" />
+    </ReadRegistry>
+
+    <!-- If we didn't find the first registry path, assume we're in a 64bit process. -->
+    <ReadRegistry
+      Hive="LocalMachine"
+      Key="$(WixInstallRegKeyWow64)"
+      Name="InstallRoot"
+      FailIfMissing="false"
+      Condition=" '$(WixToolPath)' == '' ">
+
+      <Output TaskParameter="Value" PropertyName="WixToolPath" />
+    </ReadRegistry>
+
+    <CreateProperty Value="$(WixToolPath)..\sdk\" Condition=" '$(WixSdkPath)' == '' ">
+      <Output TaskParameter="Value" PropertyName="WixSdkPath" />
+    </CreateProperty>
+    <CreateProperty Value="$(WixSdkPath)x86\" Condition=" '$(WixSdkX86Path)' == '' ">
+      <Output TaskParameter="Value" PropertyName="WixSdkX86Path" />
+    </CreateProperty>
+    <CreateProperty Value="$(WixSdkPath)x64\" Condition=" '$(WixSdkX64Path)' == '' ">
+      <Output TaskParameter="Value" PropertyName="WixSdkX64Path" />
+    </CreateProperty>
+
+    <CreateProperty Value="$(WixSdkPath)MakeSfxCA.exe" Condition=" '$(MakeSfxCA)' == '' ">
+      <Output TaskParameter="Value" PropertyName="MakeSfxCA" />
+    </CreateProperty>
+    <CreateProperty Value="$(WixSdkX86Path)SfxCA.dll" Condition=" '$(SfxCADll)' == '' and '$(Platform)' != 'x64'">
+      <Output TaskParameter="Value" PropertyName="SfxCADll" />
+    </CreateProperty>
+    <CreateProperty Value="$(WixSdkX64Path)SfxCA.dll" Condition=" '$(SfxCADll)' == '' and '$(Platform)' == 'x64'">
+      <Output TaskParameter="Value" PropertyName="SfxCADll" />
+    </CreateProperty>
+
+  </Target>
+  
+  <!--
+  ==================================================================================================
+  PackCustomAction
+
+    Creates an MSI managed custom action package that includes the custom action assembly,
+    local assembly dependencies, and project content files.
+
+    [IN]
+    @(IntermediateAssembly) - Managed custom action assembly.
+    @(Content) - Project items of type Content will be included in the package.
+    $(CustomActionContents) - Optional space-delimited list of additional files to include.
+    
+    [OUT]
+    $(IntermediateOutputPath)$(TargetCAFileName) - Managed custom action package with unmanaged stub.
+  ==================================================================================================
+  -->
+  <Target Name="PackCustomAction"
+   Inputs="@(IntermediateAssembly);@(Content);$(CustomActionContents)"
+   Outputs="$(IntermediateOutputPath)$(TargetCAFileName)">
+
+    <!-- Find all referenced items marked CopyLocal, but exclude non-binary files. -->
+    <CreateItem
+     Include="@(ReferenceCopyLocalPaths)"
+     Condition=" '%(ReferenceCopyLocalPaths.extension)' == '.dll' or '%(ReferenceCopyLocalPaths.extension)' == '.exe' ">
+      <Output TaskParameter="Include" ItemName="CustomActionReferenceContents"/>
+    </CreateItem>
+
+    <!--
+	Items to include in the CA package:
+	   - Reference assemblies marked CopyLocal
+	   - Project items of type Content
+	   - Additional items in the CustomActionContents property
+	-->
+    <CreateProperty Value="@(CustomActionReferenceContents);@(Content->'%(FullPath)');$(CustomActionContents)">
+      <Output TaskParameter="Value" PropertyName="CustomActionContents" />
+    </CreateProperty>
+
+    <CreateItem Include="@(IntermediateAssembly->'%(FullPath)')">
+      <Output TaskParameter="Include" ItemName="IntermediateCAAssembly" />
+    </CreateItem>
+
+	<CreateItem Include="@(IntermediateAssembly->'%(RootDir)%(Directory)$(TargetCAFileName)')">
+      <Output TaskParameter="Include" ItemName="IntermediateCAPackage" />
+    </CreateItem>
+
+    <!-- Run the MakeSfxCA.exe CA packaging tool. -->
+    <Exec Command='"$(MakeSfxCA)" "@(IntermediateCAPackage)" "$(SfxCADll)" "@(IntermediateCAAssembly)" "$(CustomActionContents)"'
+     WorkingDirectory="$(ProjectDir)" />
+  
+    <!-- Add modules to be copied to output dir. -->
+    <CreateItem Include="@(AddModules);@(IntermediateCAPackage)">
+		<Output TaskParameter="Include" ItemName="AddModules" />
+    </CreateItem>
+
+  </Target>
+
+  <!--
+  ==================================================================================================
+  CleanCustomAction
+
+    Cleans the .CA.dll binary created by the PackCustomAction target.
+
+  ==================================================================================================
+  -->
+  <Target Name="CleanCustomAction">
+    <Delete Files="$(IntermediateOutputPath)$(TargetCAFileName)"
+     TreatErrorsAsWarnings="true" />
+  </Target>
+
+  <!--
+  ==================================================================================================
+  AfterCompile (redefinition)
+
+    Calls the PackCustomAction target after compiling.
+    Overrides the empty AfterCompile target from Microsoft.Common.targets.
+
+  ==================================================================================================
+  -->
+  <Target Name="AfterCompile"
+   DependsOnTargets="PackCustomAction" />
+
+  <!--
+  ==================================================================================================
+  BeforeClean (redefinition)
+
+    Calls the CleanCustomAction target before cleaning.
+    Overrides the empty AfterCompile target from Microsoft.Common.targets.
+
+  ==================================================================================================
+  -->
+  <Target Name="BeforeClean"
+   DependsOnTargets="CleanCustomAction" />
+
+  <Import Project="$(CustomAfterWixCATargets)" Condition=" '$(CustomAfterWixCATargets)' != '' and Exists('$(CustomAfterWixCATargets)')" />
+
+</Project>
diff --git a/sdk/x64/sfxca.dll b/sdk/x64/sfxca.dll
new file mode 100755
index 0000000..a222b34
--- /dev/null
+++ b/sdk/x64/sfxca.dll
Binary files differ
diff --git a/sdk/x86/sfxca.dll b/sdk/x86/sfxca.dll
new file mode 100755
index 0000000..b743964
--- /dev/null
+++ b/sdk/x86/sfxca.dll
Binary files differ
diff --git a/setup.exe b/setup.exe
new file mode 100755
index 0000000..dfa28ec
--- /dev/null
+++ b/setup.exe
Binary files differ
diff --git a/setupbld.exe b/setupbld.exe
new file mode 100755
index 0000000..7acd269
--- /dev/null
+++ b/setupbld.exe
Binary files differ
diff --git a/smoke.exe b/smoke.exe
new file mode 100755
index 0000000..14219a7
--- /dev/null
+++ b/smoke.exe
Binary files differ
diff --git a/smoke.exe.config b/smoke.exe.config
new file mode 100644
index 0000000..bed32a7
--- /dev/null
+++ b/smoke.exe.config
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (c) Microsoft Corporation.  All rights reserved.
+-->
+<configuration>
+    <startup useLegacyV2RuntimeActivationPolicy="true">
+        <supportedRuntime version="v4.0" />
+        <supportedRuntime version="v2.0.50727" />
+    </startup>
+</configuration>
diff --git a/torch.exe b/torch.exe
new file mode 100755
index 0000000..89d2177
--- /dev/null
+++ b/torch.exe
Binary files differ
diff --git a/torch.exe.config b/torch.exe.config
new file mode 100644
index 0000000..bed32a7
--- /dev/null
+++ b/torch.exe.config
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (c) Microsoft Corporation.  All rights reserved.
+-->
+<configuration>
+    <startup useLegacyV2RuntimeActivationPolicy="true">
+        <supportedRuntime version="v4.0" />
+        <supportedRuntime version="v2.0.50727" />
+    </startup>
+</configuration>
diff --git a/votive2005.dll b/votive2005.dll
new file mode 100755
index 0000000..87aeb66
--- /dev/null
+++ b/votive2005.dll
Binary files differ
diff --git a/votive2008.dll b/votive2008.dll
new file mode 100755
index 0000000..cb02479
--- /dev/null
+++ b/votive2008.dll
Binary files differ
diff --git a/votive2010.dll b/votive2010.dll
new file mode 100755
index 0000000..1dca04b
--- /dev/null
+++ b/votive2010.dll
Binary files differ
diff --git a/wconsole.dll b/wconsole.dll
new file mode 100755
index 0000000..871febb
--- /dev/null
+++ b/wconsole.dll
Binary files differ
diff --git a/winterop.dll b/winterop.dll
new file mode 100755
index 0000000..3eeb9aa
--- /dev/null
+++ b/winterop.dll
Binary files differ
diff --git a/wix.dll b/wix.dll
new file mode 100755
index 0000000..ef9f2a0
--- /dev/null
+++ b/wix.dll
Binary files differ
diff --git a/wix.targets b/wix.targets
new file mode 100644
index 0000000..0b2e829
--- /dev/null
+++ b/wix.targets
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+****************************************************************************************************
+wix.targets
+
+WARNING:  DO NOT MODIFY this file unless you are knowledgeable about MSBuild and have
+          created a backup copy.  Incorrect changes to this file will make it
+          impossible to load or build your projects from the command-line or the IDE.
+
+This file defines the steps in the standard build process for WiX projects (.wixproj).
+
+Conventions:
+  * Targets and properties that start with an underscore (_) are considered private and should not
+    be used outside of this file.
+
+Coding Conventions:
+  * Two-space indentation of nested elements
+
+  * Self-closing elements should have a space before the /> ("<MyProperty />")
+
+  * Conditions should have a space before and after the "" and between any operators. For example:
+    <MyProperty Condition=" '$(MyProperty)' == '' ">Value</MyProperty>
+
+  * Targets should have each attribute on a single line and indented by two spaces. Also, there
+    should be a blank line between the Target and the beginning of the contents (a blank line is
+    optional before the closing </Target> tag).
+    For example:
+    <Target
+      Name="MyTarget"
+      DependsOnTargets="$(MyTargetDependsOn)">
+
+      <Message Importance="low" Text="MyTarget is doing something." />
+    </Target>
+
+Copyright (c) Microsoft Corporation. All rights reserved.
+****************************************************************************************************
+-->
+<Project
+  xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  
+  <!-- All common targets/items/properties -->
+
+  <!-- Version specific targets/items/properties -->
+  <PropertyGroup>
+    <!-- MSBuild 4.0 -->
+    <!-- MSBuild does not do short circuit evaluation of the AND operator, so we cannot have 
+         something like '$(MSBuildToolsVersion)' != '' AND '$(MSBuildToolsVersion)' &gt;= '4.0'
+         instead set as default and override -->
+    <WixVersionTargetsPath>wix2010.targets</WixVersionTargetsPath>
+    <!-- MSBuild 2.0 - 3.5 -->
+    <WixVersionTargetsPath Condition=" '$(MSBuildToolsVersion)' == '' OR '$(MSBuildToolsVersion)' &lt; '4.0' ">wix200x.targets</WixVersionTargetsPath>
+  </PropertyGroup>
+
+  <Import Project="$(WixVersionTargetsPath)" />
+</Project>
diff --git a/wix200x.targets b/wix200x.targets
new file mode 100644
index 0000000..63f4534
--- /dev/null
+++ b/wix200x.targets
@@ -0,0 +1,2709 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+****************************************************************************************************
+wix.targets
+
+WARNING:  DO NOT MODIFY this file unless you are knowledgeable about MSBuild and have
+          created a backup copy.  Incorrect changes to this file will make it
+          impossible to load or build your projects from the command-line or the IDE.
+
+This file defines the steps in the standard build process for WiX projects (.wixproj).
+
+Conventions:
+  * Targets and properties that start with an underscore (_) are considered private and should not
+    be used outside of this file.
+
+Coding Conventions:
+  * Two-space indentation of nested elements
+
+  * Self-closing elements should have a space before the /> ("<MyProperty />")
+
+  * Conditions should have a space before and after the "" and between any operators. For example:
+    <MyProperty Condition=" '$(MyProperty)' == '' ">Value</MyProperty>
+
+  * Targets should have each attribute on a single line and indented by two spaces. Also, there
+    should be a blank line between the Target and the beginning of the contents (a blank line is
+    optional before the closing </Target> tag).
+    For example:
+    <Target
+      Name="MyTarget"
+      DependsOnTargets="$(MyTargetDependsOn)">
+
+      <Message Importance="low" Text="MyTarget is doing something." />
+    </Target>
+
+Copyright (c) Microsoft Corporation. All rights reserved.
+****************************************************************************************************
+-->
+<Project
+  xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
+  InitialTargets="_CheckRequiredProperties;
+                  _SetDefaultPathValues">
+
+  <!--
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  Extension Points
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  -->
+
+  <!-- Allow a user-customized targets files to be used as part of the build. -->
+  <PropertyGroup>
+    <UserTargetsPath>$(MSBuildProjectFullPath).user</UserTargetsPath>
+  </PropertyGroup>
+  <Import Project="$(UserTargetsPath)" Condition="Exists('$(UserTargetsPath)')" />
+  <Import Project="$(CustomBeforeWixTargets)" Condition=" '$(CustomBeforeWixTargets)' != '' and Exists('$(CustomBeforeWixTargets)')" />
+
+  <!-- These properties can be overridden to support non-default installations. -->
+  <PropertyGroup>
+    <WixTargetsPath Condition=" '$(WixTargetsPath)' == '' AND '$(MSBuildExtensionsPath32)' != '' ">$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
+    <WixTasksPath Condition=" '$(WixTasksPath)' == '' AND '$(MSBuildExtensionsPath32)' != '' ">$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\WixTasks.dll</WixTasksPath>
+    <WixTargetsPath Condition=" '$(WixTargetsPath)' == '' ">$(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
+    <WixTasksPath Condition=" '$(WixTasksPath)' == '' ">$(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\WixTasks.dll</WixTasksPath>
+    <LuxTargetsPath Condition=" '$(LuxTargetsPath)' == '' AND '$(MSBuildExtensionsPath32)' != '' ">$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Lux.targets</LuxTargetsPath>
+    <LuxTasksPath Condition=" '$(LuxTasksPath)' == '' AND '$(MSBuildExtensionsPath32)' != '' ">$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\LuxTasks.dll</LuxTasksPath>
+    <LuxTargetsPath Condition=" '$(LuxTargetsPath)' == '' ">$(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Lux.targets</LuxTargetsPath>
+    <LuxTasksPath Condition=" '$(LuxTasksPath)' == '' ">$(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\LuxTasks.dll</LuxTasksPath>
+  </PropertyGroup>
+
+  <!-- This makes the project files a dependency of all targets so that things rebuild if they change -->
+  <PropertyGroup> 
+    <MSBuildAllProjects Condition="Exists('$(MSBuildProjectFullPath)')">$(MSBuildAllProjects);$(MSBuildProjectFullPath)</MSBuildAllProjects>
+    <MSBuildAllProjects Condition="Exists('$(WixTargetsPath)')">$(MSBuildAllProjects);$(WixTargetsPath)</MSBuildAllProjects>
+    <MSBuildAllProjects Condition="Exists('$(LuxTargetsPath)')">$(MSBuildAllProjects);$(LuxTargetsPath)</MSBuildAllProjects>
+    <MSBuildAllProjects Condition="Exists('$(UserTargetsPath)')">$(MSBuildAllProjects);$(UserTargetsPath)</MSBuildAllProjects>
+    <MSBuildAllProjects Condition="Exists('$(CustomBeforeWixTargets)')">$(MSBuildAllProjects);$(CustomBeforeWixTargets)</MSBuildAllProjects>
+    <MSBuildAllProjects Condition="Exists('$(CustomAfterWixTargets)')">$(MSBuildAllProjects);$(CustomAfterWixTargets)</MSBuildAllProjects>
+  </PropertyGroup>
+
+  <!--
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  Property Declarations
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  -->
+
+  <!-- These tasks can be used as general-purpose build tasks. -->
+  <UsingTask TaskName="Candle" AssemblyFile="$(WixTasksPath)" />
+  <UsingTask TaskName="Insignia" AssemblyFile="$(WixTasksPath)" />
+  <UsingTask TaskName="Lit" AssemblyFile="$(WixTasksPath)" />
+  <UsingTask TaskName="Light" AssemblyFile="$(WixTasksPath)" />
+  <UsingTask TaskName="Torch" AssemblyFile="$(WixTasksPath)" />
+  <UsingTask TaskName="ReadRegistry" AssemblyFile="$(WixTasksPath)" />
+
+  <!-- These tasks are extensions for harvesting WiX source code from other sources. -->
+  <UsingTask TaskName="HeatFile" AssemblyFile="$(WixTasksPath)" />
+  <UsingTask TaskName="HeatDirectory" AssemblyFile="$(WixTasksPath)" />
+  <UsingTask TaskName="HeatProject" AssemblyFile="$(WixTasksPath)" />
+
+  <!-- These tasks are specific to the build process defined in this file, and are not considered general-purpose build tasks. -->
+  <UsingTask TaskName="AssignProjectConfiguration" AssemblyName="Microsoft.Build.Tasks, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" Condition=" '$(MSBuildToolsVersion)' == '' or '$(MSBuildToolsVersion)' == '2.0' " />
+  <UsingTask TaskName="AssignTargetPath" AssemblyName="Microsoft.Build.Tasks, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" Condition=" '$(MSBuildToolsVersion)' == '' or '$(MSBuildToolsVersion)' == '2.0' " />
+  <UsingTask TaskName="ResolveNonMSBuildProjectOutput" AssemblyName="Microsoft.Build.Tasks, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" Condition=" '$(MSBuildToolsVersion)' == '' or '$(MSBuildToolsVersion)' == '2.0' " />
+  <UsingTask TaskName="ResolveVCProjectOutput" AssemblyName="Microsoft.Build.Tasks, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" Condition=" '$(MSBuildToolsVersion)' == '' or '$(MSBuildToolsVersion)' == '2.0' " />
+
+  <UsingTask TaskName="AssignProjectConfiguration" AssemblyName="Microsoft.Build.Tasks.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" Condition=" '$(MSBuildToolsVersion)' == '3.5' " />
+  <UsingTask TaskName="AssignTargetPath" AssemblyName="Microsoft.Build.Tasks.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" Condition=" '$(MSBuildToolsVersion)' == '3.5' " />
+  <UsingTask TaskName="ResolveNonMSBuildProjectOutput" AssemblyName="Microsoft.Build.Tasks.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" Condition=" '$(MSBuildToolsVersion)' == '3.5' " />
+  <UsingTask TaskName="ResolveVCProjectOutput" AssemblyName="Microsoft.Build.Tasks.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" Condition=" '$(MSBuildToolsVersion)' == '3.5' " />
+
+  <UsingTask TaskName="CreateProjectReferenceDefineConstants" AssemblyFile="$(WixTasksPath)" />
+  <UsingTask TaskName="WixAssignCulture" AssemblyFile="$(WixTasksPath)" />
+  <UsingTask TaskName="ResolveWixReferences" AssemblyFile="$(WixTasksPath)"/>
+  <UsingTask TaskName="ReplaceString" AssemblyFile="$(WixTasksPath)"/>
+  <UsingTask TaskName="GetCabList" AssemblyFile="$(WixTasksPath)" />
+  <UsingTask TaskName="GetLooseFileList" AssemblyFile="$(WixTasksPath)" />
+  <UsingTask TaskName="RefreshGeneratedFile" AssemblyFile="$(WixTasksPath)"/>
+  <UsingTask TaskName="RefreshBundleGeneratedFile" AssemblyFile="$(WixTasksPath)"/>
+
+  <!-- WiX tools are 32bit EXEs, so run them out-of-proc when MSBuild is not 32bit. -->
+  <PropertyGroup>
+    <RunWixToolsOutOfProc Condition=" '$(PROCESSOR_ARCHITECTURE)'!='x86' ">true</RunWixToolsOutOfProc>
+  </PropertyGroup>
+
+  <!--
+  Several properties must be set in the main project file, before using this .targets file.
+  However, if the properties are not set, we pick some defaults.
+  -->
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)'=='' ">AnyCPU</Platform>
+    <OutputPath Condition=" '$(OutputPath)' == '' ">bin\$(Configuration)\</OutputPath>
+    <!-- Ensure any OutputPath has a trailing slash, so it can be concatenated -->
+    <OutputPath Condition=" '$(OutputPath)' != '' and !HasTrailingSlash('$(OutputPath)') ">$(OutputPath)\</OutputPath>
+    <_OriginalOutputType>$(OutputType)</_OriginalOutputType>
+    <OutputType Condition=" '$(OutputType)' == '' ">Package</OutputType>
+    <BuildProjectReferences Condition="'$(BuildProjectReferences)' == ''">true</BuildProjectReferences>
+  </PropertyGroup>
+
+  <!-- Properties for the intermediate object output -->
+  <PropertyGroup>
+    <BaseIntermediateOutputPath Condition=" '$(BaseIntermediateOutputPath)' == '' ">obj\</BaseIntermediateOutputPath>
+    <IntermediateOutputPath Condition=" '$(IntermediateOutputPath)' != '' and !HasTrailingSlash('$(IntermediateOutputPath)') ">$(IntermediateOutputPath)\</IntermediateOutputPath>
+    <IntermediateOutputPath Condition=" '$(IntermediateOutputPath)' == '' and '$(Platform)' == 'AnyCPU' ">$(BaseIntermediateOutputPath)$(Configuration)\</IntermediateOutputPath>
+    <IntermediateOutputPath Condition=" '$(IntermediateOutputPath)' == '' and '$(Platform)' != 'AnyCPU' ">$(BaseIntermediateOutputPath)$(Platform)\$(Configuration)\</IntermediateOutputPath>
+    <IntermediateExt Condition=" '$(IntermediateExt)' == '' ">.wixobj</IntermediateExt>
+    <CleanFile Condition=" '$(CleanFile)' == '' ">$(MSBuildProjectFile).FileList.txt</CleanFile>
+  </PropertyGroup>
+
+  <!--
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  IDE Macro Property Declarations
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  -->
+
+  <!--
+  IDE Macros available from both integrated builds and from command line builds.
+  The following properties are 'macros' that are available via IDE for pre and post build steps.
+  All of them should be added to WixBuildMacroCollection to ensure that they are shown in the UI.
+  -->
+  <PropertyGroup>
+    <TargetExt Condition=" '$(OutputType)' == 'Package' ">.msi</TargetExt>
+    <TargetExt Condition=" '$(OutputType)' == 'Module' ">.msm</TargetExt>
+    <TargetExt Condition=" '$(OutputType)' == 'PatchCreation' ">.pcp</TargetExt>
+    <TargetExt Condition=" '$(OutputType)' == 'Library' ">.wixlib</TargetExt>
+    <TargetExt Condition=" '$(OutputType)' == 'Bundle' ">.exe</TargetExt>
+  </PropertyGroup>
+
+  <PropertyGroup>
+    <!-- Example, bin\Debug\ -->
+    <OutDir Condition=" '$(OutDir)' == '' ">$(OutputPath)</OutDir>
+    <!-- Ensure OutDir has a trailing slash, so it can be concatenated -->
+    <OutDir Condition=" '$(OutDir)' != '' and !HasTrailingSlash('$(OutDir)') ">$(OutDir)\</OutDir>
+
+    <!-- Example, MySetup -->
+    <ProjectName Condition=" '$(ProjectName)' == '' ">$(MSBuildProjectName)</ProjectName>
+
+    <!-- Example, MySetup.wixproj -->
+    <ProjectFileName Condition=" '$(ProjectFileName)' == '' ">$(MSBuildProjectFile)</ProjectFileName>
+
+    <!-- Example, .wixproj -->
+    <ProjectExt Condition=" '$(ProjectExt)' == '' ">$(MSBuildProjectExtension)</ProjectExt>
+
+    <!-- Example, c:\MyProjects\MySetup\ -->
+    <ProjectDir Condition=" '$(ProjectDir)' == '' ">$(MSBuildProjectDirectory)\</ProjectDir>
+
+    <!-- Example, c:\MyProjects\MySetup\MySetup.msi -->
+    <ProjectPath Condition=" '$(ProjectPath)' == '' ">$(ProjectDir)$(ProjectFileName)</ProjectPath>
+
+    <!-- Example, .wixpdb -->
+    <TargetPdbExt Condition=" '$(TargetPdbExt)' == '' ">.wixpdb</TargetPdbExt>
+
+    <!-- Example, MySetup -->
+    <TargetName Condition=" '$(TargetName)' == '' ">$(OutputName)</TargetName>
+
+    <!-- Example, MySetup.msi -->
+    <TargetFileName Condition=" '$(TargetFileName)' == '' ">$(TargetName)$(TargetExt)</TargetFileName>
+
+    <!-- Example, MySetup.wixpdb" -->
+    <TargetPdbName Condition=" '$(TargetPdbName)' == '' ">$(TargetName)$(TargetPdbExt)</TargetPdbName>
+
+    <!-- Example, Debug -->
+    <ConfigurationName Condition=" '$(ConfigurationName)' == '' ">$(Configuration)</ConfigurationName>
+
+    <!-- Example, AnyCPU -->
+    <PlatformName Condition=" '$(PlatformName)' == '' ">$(Platform)</PlatformName>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <!-- Create the output path as an item so that we can use %(FullPath) on it. -->
+    <_OutputPathItem Include="$(OutDir)" />
+    <_IntermediateOutputPathItem Include="$(IntermediateOutputPath)" />
+  </ItemGroup>
+
+  <PropertyGroup>
+    <!-- Example, c:\MyProjects\MySetup\bin\debug\ -->
+    <!--
+    Condition intentionally omitted on this one, because it causes problems
+    when we pick up the value of an environment variable named TargetDir
+    -->
+    <TargetDir>@(_OutputPathItem->'%(FullPath)')</TargetDir>
+
+    <!-- Example, C:\MyProjects\MySetup\bin\debug\MySetup.msi -->
+    <TargetPath Condition=" '$(TargetPath)' == '' ">@(_OutputPathItem->'%(FullPath)$(TargetFileName)')</TargetPath>
+
+    <TargetPdbPath Condition=" '$(TargetPdbPath)' == '' ">@(_OutputPathItem->'%(FullPath)$(TargetPdbName)')</TargetPdbPath>
+  </PropertyGroup>
+
+  <!--
+  IDE Macros available only from integrated builds. The following properties are 'macros' that are
+  available via IDE for pre and post build steps. However, they are not defined when directly
+  building a project from the command line, only when building a solution.
+  -->
+  <PropertyGroup>
+    <DevEnvDir Condition=" '$(DevEnvDir)' == '' ">*Undefined if not building from within Visual Studio*</DevEnvDir>
+
+    <!-- Example, MySolution -->
+    <SolutionName Condition=" '$(SolutionName)' == '' ">*Undefined if not building a solution or within Visual Studio*</SolutionName>
+
+    <!-- Example, MySolution.sln -->
+    <SolutionFileName Condition=" '$(SolutionFileName)' == '' ">*Undefined if not building a solution or within Visual Studio*</SolutionFileName>
+
+    <!-- Example, C:\MySolutions\MySolution\MySolution.sln -->
+    <SolutionPath Condition=" '$(SolutionPath)' == '' ">*Undefined if not building a solution or within Visual Studio*</SolutionPath>
+
+    <!-- Example, C:\MySolutions\MySolution\ -->
+    <SolutionDir Condition=" '$(SolutionDir)' == '' ">*Undefined if not building a solution or within Visual Studio*</SolutionDir>
+
+    <!-- Example, .sln -->
+    <SolutionExt Condition=" '$(SolutionExt)' == '' ">*Undefined if not building a solution or within Visual Studio*</SolutionExt>
+  </PropertyGroup>
+
+  <!--
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  Default Harvester, Compiler, Linker, and Librarian Property Declarations
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  -->
+
+  <!-- If WixExtension was passed in via the command line, then convert it to an ItemGroup -->
+  <ItemGroup>
+    <WixExtension Include="$(WixExtension)"  Condition=" '$(WixExtension)' != '' " />
+  </ItemGroup>
+
+  <!-- Default Harvester properties-->
+  <PropertyGroup>
+    <HarvestNoLogo Condition=" '$(HarvestNoLogo)' == '' ">$(NoLogo)</HarvestNoLogo>
+    <HarvestSuppressAllWarnings Condition=" '$(HarvestSuppressAllWarnings)' == '' ">$(SuppressAllWarnings)</HarvestSuppressAllWarnings>
+    <HarvestSuppressSpecificWarnings Condition=" '$(HarvestSuppressSpecificWarnings)' == '' ">$(SuppressSpecificWarnings)</HarvestSuppressSpecificWarnings>
+    <HarvestTreatWarningsAsErrors Condition=" '$(HarvestTreatWarningsAsErrors)' == '' ">$(TreatWarningsAsErrors)</HarvestTreatWarningsAsErrors>
+    <HarvestTreatSpecificWarningsAsErrors Condition=" '$(HarvestTreatSpecificWarningsAsErrors)' == '' ">$(TreatSpecificWarningsAsErrors)</HarvestTreatSpecificWarningsAsErrors>
+    <HarvestVerboseOutput Condition=" '$(HarvestVerboseOutput)' == '' ">$(VerboseOutput)</HarvestVerboseOutput>
+    <HarvestAutogenerateGuids Condition=" '$(HarvestAutogenerateGuids)' == '' ">true</HarvestAutogenerateGuids>
+    <HarvestGenerateGuidsNow Condition=" '$(HarvestGenerateGuidsNow)' == '' ">false</HarvestGenerateGuidsNow>
+    <HarvestSuppressFragments Condition=" '$(HarvestSuppressFragments)' == '' ">true</HarvestSuppressFragments>
+    <HarvestSuppressUniqueIds Condition=" '$(HarvestSuppressUniqueIds)' == '' ">false</HarvestSuppressUniqueIds>
+  </PropertyGroup>
+
+  <!-- Default HarvestProjects properties -->
+  <PropertyGroup>
+    <HarvestProjectsNoLogo Condition=" '$(HarvestProjectsNoLogo)' == '' ">$(HarvestNoLogo)</HarvestProjectsNoLogo>
+    <HarvestProjectsSuppressAllWarnings Condition=" '$(HarvestProjectsSuppressAllWarnings)' == '' ">$(HarvestSuppressAllWarnings)</HarvestProjectsSuppressAllWarnings>
+    <HarvestProjectsSuppressSpecificWarnings Condition=" '$(HarvestProjectsSuppressSpecificWarnings)' == '' ">$(HarvestSuppressSpecificWarnings)</HarvestProjectsSuppressSpecificWarnings>
+    <HarvestProjectsTreatWarningsAsErrors Condition=" '$(HarvestProjectsTreatWarningsAsErrors)' == '' ">$(HarvestTreatWarningsAsErrors)</HarvestProjectsTreatWarningsAsErrors>
+    <HarvestProjectsTreatSpecificWarningsAsErrors Condition=" '$(HarvestProjectsTreatSpecificWarningsAsErrors)' == '' ">$(HarvestTreatSpecificWarningsAsErrors)</HarvestProjectsTreatSpecificWarningsAsErrors>
+    <HarvestProjectsVerboseOutput Condition=" '$(HarvestProjectsVerboseOutput)' == '' ">$(HarvestVerboseOutput)</HarvestProjectsVerboseOutput>
+    <HarvestProjectsAutogenerateGuids Condition=" '$(HarvestProjectsAutogenerateGuids)' == '' ">$(HarvestAutogenerateGuids)</HarvestProjectsAutogenerateGuids>
+    <HarvestProjectsGenerateGuidsNow Condition=" '$(HarvestProjectsGenerateGuidsNow)' == '' ">$(HarvestGenerateGuidsNow)</HarvestProjectsGenerateGuidsNow>
+    <HarvestProjectsSuppressFragments Condition=" '$(HarvestProjectsSuppressFragments)' == '' ">$(HarvestSuppressFragments)</HarvestProjectsSuppressFragments>
+    <HarvestProjectsSuppressUniqueIds Condition=" '$(HarvestProjectsSuppressUniqueIds)' == '' ">$(HarvestSuppressUniqueIds)</HarvestProjectsSuppressUniqueIds>
+    <HarvestProjectsTransforms Condition=" '$(HarvestProjectsTransforms)' == '' ">$(HarvestTransforms)</HarvestProjectsTransforms>
+    <HarvestProjectsGeneratedFile Condition=" '$(HarvestProjectsGeneratedFile)' == '' and '$(OutputType)' != 'Bundle' ">$(IntermediateOutputPath)Product.Generated.wxs</HarvestProjectsGeneratedFile>
+    <HarvestProjectsGeneratedFile Condition=" '$(HarvestProjectsGeneratedFile)' == '' and '$(OutputType)' == 'Bundle' ">$(IntermediateOutputPath)Bundle.Generated.wxs</HarvestProjectsGeneratedFile>
+  </PropertyGroup>
+
+  <!-- Default HarvestDirectory properties -->
+  <PropertyGroup>
+    <HarvestDirectoryNoLogo Condition=" '$(HarvestDirectoryNoLogo)' == '' ">$(HarvestNoLogo)</HarvestDirectoryNoLogo>
+    <HarvestDirectorySuppressAllWarnings Condition=" '$(HarvestDirectorySuppressAllWarnings)' == '' ">$(HarvestSuppressAllWarnings)</HarvestDirectorySuppressAllWarnings>
+    <HarvestDirectorySuppressSpecificWarnings Condition=" '$(HarvestDirectorySuppressSpecificWarnings)' == '' ">$(HarvestSuppressSpecificWarnings)</HarvestDirectorySuppressSpecificWarnings>
+    <HarvestDirectoryTreatWarningsAsErrors Condition=" '$(HarvestDirectoryTreatWarningsAsErrors)' == '' ">$(HarvestTreatWarningsAsErrors)</HarvestDirectoryTreatWarningsAsErrors>
+    <HarvestDirectoryTreatSpecificWarningsAsErrors Condition=" '$(HarvestDirectoryTreatSpecificWarningsAsErrors)' == '' ">$(HarvestTreatSpecificWarningsAsErrors)</HarvestDirectoryTreatSpecificWarningsAsErrors>
+    <HarvestDirectoryVerboseOutput Condition=" '$(HarvestDirectoryVerboseOutput)' == '' ">$(HarvestVerboseOutput)</HarvestDirectoryVerboseOutput>
+    <HarvestDirectoryAutogenerateGuids Condition=" '$(HarvestDirectoryAutogenerateGuids)' == '' ">$(HarvestAutogenerateGuids)</HarvestDirectoryAutogenerateGuids>
+    <HarvestDirectoryGenerateGuidsNow Condition=" '$(HarvestDirectoryGenerateGuidsNow)' == '' ">$(HarvestGenerateGuidsNow)</HarvestDirectoryGenerateGuidsNow>
+    <HarvestDirectorySuppressFragments Condition=" '$(HarvestDirectorySuppressFragments)' == '' ">$(HarvestSuppressFragments)</HarvestDirectorySuppressFragments>
+    <HarvestDirectorySuppressUniqueIds Condition=" '$(HarvestDirectorySuppressUniqueIds)' == '' ">$(HarvestSuppressUniqueIds)</HarvestDirectorySuppressUniqueIds>
+    <HarvestDirectoryTransforms Condition=" '$(HarvestDirectoryTransforms)' == '' ">$(HarvestTransforms)</HarvestDirectoryTransforms>
+  </PropertyGroup>
+
+  <!-- Default HarvestFile properties -->
+  <PropertyGroup>
+    <HarvestFileNoLogo Condition=" '$(HarvestFileNoLogo)' == '' ">$(HarvestNoLogo)</HarvestFileNoLogo>
+    <HarvestFileSuppressAllWarnings Condition=" '$(HarvestFileSuppressAllWarnings)' == '' ">$(HarvestSuppressAllWarnings)</HarvestFileSuppressAllWarnings>
+    <HarvestFileSuppressSpecificWarnings Condition=" '$(HarvestFileSuppressSpecificWarnings)' == '' ">$(HarvestSuppressSpecificWarnings)</HarvestFileSuppressSpecificWarnings>
+    <HarvestFileTreatWarningsAsErrors Condition=" '$(HarvestFileTreatWarningsAsErrors)' == '' ">$(HarvestTreatWarningsAsErrors)</HarvestFileTreatWarningsAsErrors>
+    <HarvestFileTreatSpecificWarningsAsErrors Condition=" '$(HarvestFileTreatSpecificWarningsAsErrors)' == '' ">$(HarvestTreatSpecificWarningsAsErrors)</HarvestFileTreatSpecificWarningsAsErrors>
+    <HarvestFileVerboseOutput Condition=" '$(HarvestFileVerboseOutput)' == '' ">$(HarvestVerboseOutput)</HarvestFileVerboseOutput>
+    <HarvestFileAutogenerateGuids Condition=" '$(HarvestFileAutogenerateGuids)' == '' ">$(HarvestAutogenerateGuids)</HarvestFileAutogenerateGuids>
+    <HarvestFileGenerateGuidsNow Condition=" '$(HarvestFileGenerateGuidsNow)' == '' ">$(HarvestGenerateGuidsNow)</HarvestFileGenerateGuidsNow>
+    <HarvestFileSuppressFragments Condition=" '$(HarvestFileSuppressFragments)' == '' ">$(HarvestSuppressFragments)</HarvestFileSuppressFragments>
+    <HarvestFileSuppressUniqueIds Condition=" '$(HarvestFileSuppressUniqueIds)' == '' ">$(HarvestSuppressUniqueIds)</HarvestFileSuppressUniqueIds>
+    <HarvestFileTransforms Condition=" '$(HarvestFileTransforms)' == '' ">$(HarvestTransforms)</HarvestFileTransforms>
+  </PropertyGroup>
+
+  <!-- Defaut Compiler properties. -->
+  <PropertyGroup>
+    <CompilerNoLogo Condition=" '$(CompilerNoLogo)' == '' ">$(NoLogo)</CompilerNoLogo>
+    <CompilerSuppressAllWarnings Condition=" '$(CompilerSuppressAllWarnings)' == '' ">$(SuppressAllWarnings)</CompilerSuppressAllWarnings>
+    <CompilerSuppressSpecificWarnings Condition=" '$(CompilerSuppressSpecificWarnings)' == '' ">$(SuppressSpecificWarnings)</CompilerSuppressSpecificWarnings>
+    <CompilerSuppressSchemaValidation Condition=" '$(CompilerSuppressSchemaValidation)' == '' ">$(SuppressSchemaValidation)</CompilerSuppressSchemaValidation>
+    <CompilerTreatWarningsAsErrors Condition=" '$(CompilerTreatWarningsAsErrors)' == '' ">$(TreatWarningsAsErrors)</CompilerTreatWarningsAsErrors>
+    <CompilerTreatSpecificWarningsAsErrors Condition=" '$(CompilerTreatSpecificWarningsAsErrors)' == '' ">$(TreatSpecificWarningsAsErrors)</CompilerTreatSpecificWarningsAsErrors>
+    <CompilerVerboseOutput Condition=" '$(CompilerVerboseOutput)' == '' ">$(VerboseOutput)</CompilerVerboseOutput>
+    <InstallerPlatform Condition=" '$(InstallerPlatform)' == '' and '$(Platform)' != 'AnyCPU' and '$(Platform)' != 'Any CPU' ">$(Platform)</InstallerPlatform>
+  </PropertyGroup>
+  
+  <!-- Default Lib properties. -->
+  <PropertyGroup>
+    <LibNoLogo Condition=" '$(LibNoLogo)' == '' ">$(NoLogo)</LibNoLogo>
+    <LibBindFiles Condition=" '$(LibBindFiles)' == '' ">$(BindFiles)</LibBindFiles>
+    <LibPedantic Condition=" '$(LibPedantic)' == '' ">$(Pedantic)</LibPedantic>
+    <LibSuppressAllWarnings Condition=" '$(LibSuppressAllWarnings)' == '' ">$(SuppressAllWarnings)</LibSuppressAllWarnings>
+    <LibSuppressSpecificWarnings Condition=" '$(LibSuppressSpecificWarnings)' == '' ">$(SuppressSpecificWarnings)</LibSuppressSpecificWarnings>
+    <LibSuppressSchemaValidation Condition=" '$(LibSuppressSchemaValidation)' == '' ">$(SuppressSchemaValidation)</LibSuppressSchemaValidation>
+    <LibSuppressIntermediateFileVersionMatching Condition=" '$(LibSuppressIntermediateFileVersionMatching)' == '' ">$(SuppressIntermediateFileVersionMatching)</LibSuppressIntermediateFileVersionMatching>
+    <LibTreatWarningsAsErrors Condition=" '$(LibTreatWarningsAsErrors)' == '' ">$(TreatWarningsAsErrors)</LibTreatWarningsAsErrors>
+    <LibTreatSpecificWarningsAsErrors Condition=" '$(LibTreatSpecificWarningsAsErrors)' == '' ">$(TreatSpecificWarningsAsErrors)</LibTreatSpecificWarningsAsErrors>
+    <LibVerboseOutput Condition=" '$(LibVerboseOutput)' == '' ">$(VerboseOutput)</LibVerboseOutput>
+  </PropertyGroup>
+
+  <!-- Default Linker properties. -->
+  <PropertyGroup>
+    <LinkerNoLogo Condition=" '$(LinkerNoLogo)' == '' ">$(NoLogo)</LinkerNoLogo>
+    <LinkerBaseInputPaths Condition=" '$(LinkerBaseInputPaths)' == '' ">$(BaseInputPaths)</LinkerBaseInputPaths>
+    <LinkerBindFiles Condition=" '$(LinkerBindFiles)' == '' ">$(BindFiles)</LinkerBindFiles>
+    <LinkerPedantic Condition=" '$(LinkerPedantic)' == '' ">$(Pedantic)</LinkerPedantic>
+    <LinkerSuppressAllWarnings Condition=" '$(LinkerSuppressAllWarnings)' == '' ">$(SuppressAllWarnings)</LinkerSuppressAllWarnings>
+    <LinkerSuppressSpecificWarnings Condition=" '$(LinkerSuppressSpecificWarnings)' == '' ">$(SuppressSpecificWarnings)</LinkerSuppressSpecificWarnings>
+    <LinkerSuppressSchemaValidation Condition=" '$(LinkerSuppressSchemaValidation)' == '' ">$(SuppressSchemaValidation)</LinkerSuppressSchemaValidation>
+    <LinkerSuppressIntermediateFileVersionMatching Condition=" '$(LinkerSuppressIntermediateFileVersionMatching)' == '' ">$(SuppressIntermediateFileVersionMatching)</LinkerSuppressIntermediateFileVersionMatching>
+    <LinkerTreatWarningsAsErrors Condition=" '$(LinkerTreatWarningsAsErrors)' == '' ">$(TreatWarningsAsErrors)</LinkerTreatWarningsAsErrors>
+    <LinkerTreatSpecificWarningsAsErrors Condition=" '$(LinkerTreatSpecificWarningsAsErrors)' == '' ">$(TreatSpecificWarningsAsErrors)</LinkerTreatSpecificWarningsAsErrors>
+    <LinkerVerboseOutput Condition=" '$(LinkerVerboseOutput)' == '' ">$(VerboseOutput)</LinkerVerboseOutput>
+  </PropertyGroup>
+
+  <!-- Default Inscribe properties. -->
+  <PropertyGroup>
+    <InscribeNoLogo Condition=" '$(InscribeNoLogo)' == '' ">$(NoLogo)</InscribeNoLogo>
+    <InscribeSuppressAllWarnings Condition=" '$(InscribeSuppressAllWarnings)' == '' ">$(SuppressAllWarnings)</InscribeSuppressAllWarnings>
+    <InscribeSuppressSpecificWarnings Condition=" '$(InscribeSuppressSpecificWarnings)' == '' ">$(SuppressSpecificWarnings)</InscribeSuppressSpecificWarnings>
+    <InscribeTreatWarningsAsErrors Condition=" '$(InscribeTreatWarningsAsErrors)' == '' ">$(TreatWarningsAsErrors)</InscribeTreatWarningsAsErrors>
+    <InscribeTreatSpecificWarningsAsErrors Condition=" '$(InscribeTreatSpecificWarningsAsErrors)' == '' ">$(TreatSpecificWarningsAsErrors)</InscribeTreatSpecificWarningsAsErrors>
+    <InscribeVerboseOutput Condition=" '$(InscribeVerboseOutput)' == '' ">$(VerboseOutput)</InscribeVerboseOutput>
+  </PropertyGroup>
+  <!--
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  Initial Targets
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  -->
+
+  <!--
+  ==================================================================================================
+  _CheckRequiredProperties
+
+    Checks properties that must be set in the main project file or on the command line before
+    using this .TARGETS file.
+
+    [IN]
+    $(OutputName) - The name of the MSI/MSM/wixlib to build (without the extension)
+    $(OutputType) - Possible values are 'package', 'PatchCreation', 'module', 'library', 'bundle'
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <_PleaseSetThisInProjectFile>Please set this in the project file before the &lt;Import&gt; of the wix.targets file.</_PleaseSetThisInProjectFile>
+    <_OutputTypeDescription>The OutputType defines whether a Windows Installer package (.msi), PatchCreation (.pcp), merge module (.msm), wix library (.wixlib), or self-extracting executable (.exe) is being built. $(_PleaseSetThisInProjectFile) Possible values are 'Package', 'Module', 'Library', and 'Bundle'.</_OutputTypeDescription>
+  </PropertyGroup>
+  <Target Name="_CheckRequiredProperties">
+
+    <Error
+      Code="WIXTARGETS100"
+      Condition=" '$(OutputName)' == '' "
+      Text="The OutputName property is not set in project &quot;$(MSBuildProjectFile)&quot;. The OutputName defines the name of the output without a file extension. $(_PleaseSetThisInProjectFile)" />
+
+    <Warning
+      Code="WIXTARGETS101"
+      Condition=" '$(_OriginalOutputType)' == '' "
+      Text="The OutputType property is not set in project &quot;$(MSBuildProjectFile)&quot;. Defaulting to 'Package'. $(_OutputTypeDescription)" />
+
+    <Error
+      Code="WIXTARGETS102"
+      Condition=" '$(OutputType)' != 'Package' and '$(OutputType)' != 'PatchCreation' and '$(OutputType)' != 'Module' and '$(OutputType)' != 'Library' and '$(OutputType)' != 'Bundle' "
+      Text="The OutputType property '$(OutputType)' is not valid in project &quot;$(MSBuildProjectFile)&quot;. $(_OutputTypeDescription)" />
+
+    <!-- Although we try to ensure a trailing slash, it's possible to circumvent this if the property is set on the command line -->
+    <Error
+      Code="WIXTARGETS103"
+      Condition="'$(OutDir)' != '' and !HasTrailingSlash('$(OutDir)')"
+      Text="The OutDir property must end with a trailing slash." />
+
+  </Target>
+
+  <!--
+  ==================================================================================================
+  _SetDefaultPathValues
+
+    Gets the default values of some paths from the registry.
+
+    [OUT]
+    $(WixExtDir) - Default Wix Extension Directory
+    $(WixToolPath) - Default Wix Tool install folder
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <WixInstallRegKey>SOFTWARE\Microsoft\Windows Installer XML\3.5</WixInstallRegKey>
+    <WixInstallRegKeyWow64>SOFTWARE\Wow6432Node\Microsoft\Windows Installer XML\3.5</WixInstallRegKeyWow64>
+  </PropertyGroup>
+  <Target
+    Name="_SetDefaultPathValues">
+
+    <ReadRegistry
+      Hive="LocalMachine"
+      Key="$(WixInstallRegKey)"
+      Name="InstallRoot"
+      FailIfMissing="false"
+      Condition=" '$(WixExtDir)' == '' ">
+
+      <Output TaskParameter="Value" PropertyName="WixExtDir" />
+    </ReadRegistry>
+
+    <ReadRegistry
+      Hive="LocalMachine"
+      Key="$(WixInstallRegKey)"
+      Name="InstallRoot"
+      FailIfMissing="false"
+      Condition=" '$(WixToolPath)' == '' ">
+
+      <Output TaskParameter="Value" PropertyName="WixToolPath" />
+    </ReadRegistry>
+
+    <ReadRegistry
+      Hive="LocalMachine"
+      Key="$(WixInstallRegKeyWow64)"
+      Name="InstallRoot"
+      FailIfMissing="false"
+      Condition=" '$(WixExtDir)' == '' ">
+
+      <Output TaskParameter="Value" PropertyName="WixExtDir" />
+    </ReadRegistry>
+
+    <ReadRegistry
+      Hive="LocalMachine"
+      Key="$(WixInstallRegKeyWow64)"
+      Name="InstallRoot"
+      FailIfMissing="false"
+      Condition=" '$(WixToolPath)' == '' ">
+
+      <Output TaskParameter="Value" PropertyName="WixToolPath" />
+    </ReadRegistry>
+    
+    <CreateProperty Value="$(WixToolPath)" Condition=" '$(WixExtDir)' == '' ">
+      <Output TaskParameter="Value" PropertyName="WixExtDir" />
+    </CreateProperty>
+
+  </Target>
+
+  <!--
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  Build Targets
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  -->
+
+  <!--
+  ==================================================================================================
+  Build
+
+    The main build entry point.
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <BuildDependsOn>
+      BeforeBuild;
+      CoreBuild;
+      AfterBuild
+    </BuildDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="Build"
+    DependsOnTargets="$(BuildDependsOn)"
+    Outputs="$(TargetPath)">
+  </Target>
+
+  <!--
+  ==================================================================================================
+  BeforeBuild
+
+    Redefine this target in your project in order to run tasks just before Build.
+  ==================================================================================================
+  -->
+  <Target Name="BeforeBuild" />
+
+  <!--
+  ==================================================================================================
+  AfterBuild
+
+    Redefine this target in your project in order to run tasks just after Build.
+  ==================================================================================================
+  -->
+  <Target Name="AfterBuild" />
+
+  <!--
+  ==================================================================================================
+  CoreBuild
+
+    The core build step calls each of the build targets.
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <CoreBuildDependsOn>
+      BuildOnlySettings;
+      PrepareForBuild;
+      PreBuildEvent;
+      ResolveReferences;
+      AddCompilerDefineConstants;
+      CompileAndLink;
+      Signing;
+      GetTargetPath;
+      IncrementalClean;
+      PostBuildEvent
+    </CoreBuildDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="CoreBuild"
+    DependsOnTargets="$(CoreBuildDependsOn)">
+
+    <OnError
+      ExecuteTargets="_TimeStampAfterCompileAndLink;PostBuildEvent"
+      Condition=" '$(RunPostBuildEvent)' == 'Always' or '$(RunPostBuildEvent)' == 'OnOutputUpdated' " />
+
+    <OnError ExecuteTargets="_CleanRecordFileWrites" />
+
+  </Target>
+
+  <!--
+  ==================================================================================================
+  Rebuild
+
+    Delete all intermediate and final build outputs, and then build the project from scratch.
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <RebuildDependsOn>
+      BeforeRebuild;
+      Clean;
+      $(MSBuildProjectDefaultTargets);
+      AfterRebuild;
+    </RebuildDependsOn>
+
+    <RebuildDependsOn Condition=" '$(MSBuildProjectDefaultTargets)' == 'Rebuild' ">
+      BeforeRebuild;
+      Clean;
+      Build;
+      AfterRebuild;
+    </RebuildDependsOn>
+  </PropertyGroup>
+
+  <Target
+    Name="Rebuild"
+    DependsOnTargets="$(RebuildDependsOn)"
+    Outputs="$(TargetPath)" />
+
+  <!--
+  ==================================================================================================
+  BeforeRebuild
+
+    Redefine this target in your project in order to run tasks just before Rebuild.
+  ==================================================================================================
+  -->
+  <Target Name="BeforeRebuild" />
+
+  <!--
+  ==================================================================================================
+  AfterRebuild
+
+    Redefine this target in your project in order to run tasks just after Rebuild.
+  ==================================================================================================
+  -->
+  <Target Name="AfterRebuild" />
+
+  <!--
+  ==================================================================================================
+  BuildOnlySettings
+
+    This target is called only when doing a real build. It is not called during project load.
+  ==================================================================================================
+    -->
+  <PropertyGroup>
+    <BuildingProject>false</BuildingProject>
+  </PropertyGroup>
+  <Target Name="BuildOnlySettings">
+
+    <CreateProperty Value="true">
+      <Output TaskParameter="Value" PropertyName="BuildingProject" />
+    </CreateProperty>
+
+  </Target>
+
+  <!--
+  ==================================================================================================
+  PrepareForBuild
+
+    Prepare the prerequisites for building.
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <PrepareForBuildDependsOn></PrepareForBuildDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="PrepareForBuild" DependsOnTargets="$(PrepareForBuildDependsOn)">
+
+    <!--
+    These CreateProperty calls are required because TargetDir and TargetPath are defined
+    to contain an item list. We want that item list to be expanded so that it can be used
+    as a regular property value and not as an item-list-with-transform.
+    -->
+    <CreateProperty Value="$(TargetDir)">
+      <Output TaskParameter="Value" PropertyName="TargetDir" />
+    </CreateProperty>
+
+    <CreateProperty Value="$(TargetPath)">
+      <Output TaskParameter="Value" PropertyName="TargetPath" />
+    </CreateProperty>
+
+    <CreateProperty Value="$(TargetPdbPath)">
+      <Output TaskParameter="Value" PropertyName="TargetPdbPath" />
+    </CreateProperty>
+
+    <!-- Create the directories for intermediate and final build products. -->
+    <MakeDir Directories="$(IntermediateOutputPath);$(OutDir)" />
+  </Target>
+
+  <!--
+  ==================================================================================================
+  ResolveWixExtensionReferences
+
+    Resolves WiX extension references to full paths. Any properties you use
+    to resolve paths to extensions must be defined before importing this
+    file or the extensions will be automatically resolved to $(WixExtDir).
+
+    [IN]
+    @(WixExtension) - WixExtension item group
+
+    [OUT]
+    @(_ResolvedWixExtensionPaths) - Item group with full paths to extensions
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <ResolveWixExtensionReferencesDependsOn>
+      PrepareForBuild
+    </ResolveWixExtensionReferencesDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="ResolveWixExtensionReferences"
+    DependsOnTargets="$(ResolveWixExtensionReferencesDependsOn)"
+    Condition=" '@(WixExtension)' != ''">
+
+    <!--
+    The WixExtensionSearchPaths property is set to find assemblies in the following order:
+
+        (1) $(ReferencePaths) - the reference paths property, which comes from the .USER file.
+        (2) The hintpath from the referenced item itself, indicated by {HintPathFromItem}.
+        (3) Treat the reference's Include as if it were a real file name.
+        (4) Path specified by the WixExtDir property.
+    -->
+    <CreateProperty Condition=" '$(WixExtensionSearchPaths)' == '' " Value="
+      $(ReferencePaths);
+      {HintPathFromItem};
+      {RawFileName};
+      $(WixExtDir)
+      ">
+      <Output TaskParameter="Value" PropertyName="WixExtensionSearchPaths" />
+    </CreateProperty>
+
+    <ResolveWixReferences
+      WixReferences="@(WixExtension)"
+      SearchPaths="$(WixExtensionSearchPaths)"
+      SearchFilenameExtensions=".dll">
+      <Output TaskParameter="ResolvedWixReferences" ItemName="_AllResolvedWixExtensionPaths" />
+    </ResolveWixReferences>
+
+    <!-- Remove duplicate extension items that would cause build errors -->
+    <RemoveDuplicates Inputs="@(_AllResolvedWixExtensionPaths)">
+      <Output TaskParameter="Filtered" ItemName="_ResolvedWixExtensionPaths" />
+    </RemoveDuplicates>
+  </Target>
+
+  <!--
+  ==================================================================================================
+  PreBuildEvent
+
+    Run the pre-build event if there is one.
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <PreBuildEventDependsOn>GetTargetPath</PreBuildEventDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="PreBuildEvent"
+    DependsOnTargets="$(PreBuildEventDependsOn)"
+    Condition=" '$(PreBuildEvent)' != '' ">
+
+    <ReplaceString
+      Text="$(PreBuildEvent)"
+      OldValue="!(TargetPath)"
+      NewValue="$(TargetPath)">
+      
+      <Output TaskParameter="Text" PropertyName="ExpandedPreBuildEvent" />
+    </ReplaceString>
+    
+    <ReplaceString
+      Text="$(ExpandedPreBuildEvent)"
+      OldValue="!(TargetPdbPath)"
+      NewValue="$(TargetPdbPath)">
+      
+      <Output TaskParameter="Text" PropertyName="ExpandedPreBuildEvent" />
+    </ReplaceString>
+
+    <Exec WorkingDirectory="$(OutDir)" Command="$(ExpandedPreBuildEvent)" />
+  </Target>
+
+  <!--
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  Resolve References Targets
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  -->
+
+  <!--
+  ==================================================================================================
+  ResolveReferences
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <ResolveReferencesDependsOn>
+      BeforeResolveReferences;
+      SplitProjectReferencesByType;
+      ResolveProjectReferences;
+      ResolveVCProjectReferences;
+      ResolveWixLibraryReferences;
+      ResolveWixExtensionReferences;
+      AfterResolveReferences
+    </ResolveReferencesDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="ResolveReferences"
+    DependsOnTargets="$(ResolveReferencesDependsOn)" />
+
+  <!--
+  ==================================================================================================
+  BeforeResolveReferences
+
+    Redefine this target in your project in order to run tasks just before ResolveReferences.
+  ==================================================================================================
+  -->
+  <Target Name="BeforeResolveReferences" />
+
+  <!--
+  ==================================================================================================
+  AfterResolveReferences
+
+    Redefine this target in your project in order to run tasks just after ResolveReferences.
+  ==================================================================================================
+  -->
+  <Target Name="AfterResolveReferences" />
+
+  <!--
+  ==================================================================================================
+  SplitProjectReferencesByType
+
+    Split project references into two lists: VC project references and all others (handled by the
+    MSBuild engine)
+
+    [IN]
+    @(ProjectReference) - the list of all project references
+
+    [OUT]
+    @(VCProjectReference) - the list of VC (managed VC++ to be exact) project references
+    @(NonVCProjectReference) - the list of non-VC project references (MSBuild and potentially VSIP projects)
+  ==================================================================================================
+  -->
+  <Target
+    Name="SplitProjectReferencesByType"
+    Condition=" '@(ProjectReference)' != '' ">
+
+    <!-- Assign a project configuration to each project reference if we're building a solution file. -->
+    <AssignProjectConfiguration
+      ProjectReferences="@(ProjectReference)"
+      SolutionConfigurationContents="$(CurrentSolutionConfigurationContents)"
+      Condition=" '$(BuildingSolutionFile)' == 'true' ">
+
+      <Output TaskParameter="AssignedProjects" ItemName="_ProjectReferenceWithConfiguration" />
+    </AssignProjectConfiguration>
+
+    <!--
+    Otherwise (regular command line build or building inside the IDE) just copy the references
+    as we don't need their configurations.
+    -->
+    <CreateItem Include="@(ProjectReference)" Condition=" '$(BuildingSolutionFile)' != 'true' ">
+      <Output TaskParameter="Include" ItemName="_ProjectReferenceWithConfiguration" />
+    </CreateItem>
+
+    <!-- Copy all VC project references to the VCProjectReference item list (using the VC project extension) -->
+    <CreateItem
+      Include="@(_ProjectReferenceWithConfiguration)"
+      Condition=" '%(Extension)' == '.vcproj' "
+      AdditionalMetadata="MSBuildSourceProjectFileFullPath=%(FullPath)">
+
+      <Output TaskParameter="Include" ItemName="VCProjectReference" />
+    </CreateItem>
+
+    <!-- Copy the rest of the project references to the NonVCProjectReference item list -->
+    <CreateItem
+      Include="@(_ProjectReferenceWithConfiguration)"
+      Condition=" '%(Extension)' != '.vcproj' "
+      AdditionalMetadata="MSBuildSourceProjectFileFullPath=%(FullPath)">
+
+      <Output TaskParameter="Include" ItemName="NonVCProjectReference" />
+    </CreateItem>
+  </Target>
+
+
+  <!--
+  ==================================================================================================
+  _SplitProjectReferencesByFileExistence
+
+    Split referenced projects into two lists: those that exist on  disk and those that don't.
+
+    [IN]
+    @(NonVCProjectReference) - the list of non-VC project references (MSBuild and potentially VSIP projects)
+
+    [OUT]
+    @(_MSBuildProjectReferenceExistent) - the list of non-VC project references that exist on disk
+    @(_MSBuildProjectReferenceNonexistent) - the list of non-VC project references that don't exist on disk
+  ==================================================================================================
+  -->
+  <Target
+    Name="_SplitProjectReferencesByFileExistence"
+    DependsOnTargets="SplitProjectReferencesByType"
+    Condition=" '@(NonVCProjectReference)' != '' ">
+
+    <!--
+    Use this task for matching projects with pre-resolved project outputs set by the IDE if building
+    inside the IDE. The IDE only includes non-MSBuild projects in the output list. We'll use MSBuild
+    to resolve MSBuild projects. This task will resolve VSIP (3rd party) project references and
+    create a new item list with only project references to projects in the MSBuild format.
+    -->
+    <ResolveNonMSBuildProjectOutput
+      ProjectReferences="@(NonVCProjectReference)"
+      PreresolvedProjectOutputs="$(VSIDEResolvedNonMSBuildProjectOutputs)"
+      Condition=" '$(BuildingInsideVisualStudio)' == 'true' ">
+
+      <Output TaskParameter="ResolvedOutputPaths" ItemName="_ResolvedProjectReferencePaths" />
+      <Output TaskParameter="UnresolvedProjectReferences" ItemName="_MSBuildProjectReference" />
+
+    </ResolveNonMSBuildProjectOutput>
+
+    <!--
+    If building from the command line, simply copy the NonVCProjectReference item list to
+    _MSBuildProjectReference, since we have to assume all non-VC projects are in the MSBuild format.
+    We have no way of building VSIP (3rd party) projects from the command line.
+    -->
+    <CreateItem Include="@(NonVCProjectReference)" Condition=" '$(BuildingInsideVisualStudio)' != 'true' ">
+      <Output TaskParameter="Include" ItemName="_MSBuildProjectReference" />
+    </CreateItem>
+
+    <!-- Break the project list into two lists: those that exist on disk and those that don't. -->
+    <CreateItem Include="@(_MSBuildProjectReference)" Condition="Exists('%(Identity)')">
+      <Output TaskParameter="Include" ItemName="_MSBuildProjectReferenceExistent" />
+    </CreateItem>
+
+    <CreateItem Include="@(_MSBuildProjectReference)" Condition="!Exists('%(Identity)')">
+      <Output TaskParameter="Include" ItemName="_MSBuildProjectReferenceNonexistent" />
+    </CreateItem>
+
+  </Target>
+
+  <!--
+  ================================================================================================
+  ResolveProjectReferences
+
+    Builds all of the referenced projects to get their outputs.
+
+    [IN]
+    @(NonVCProjectReference) - The list of non-VC project references.
+
+    [OUT]
+    @(_ResolvedProjectReferencePaths) - Paths to referenced projects.
+  ================================================================================================
+  -->
+  <Target
+    Name="ResolveProjectReferences"
+    DependsOnTargets="_SplitProjectReferencesByFileExistence"
+    Condition=" '@(NonVCProjectReference)' != '' ">
+
+    <!--
+    When building this project from the IDE or when building a .sln from the command line, just
+    gather the referenced build outputs. The code that builds the .sln will already have built
+    the project, so there's no need to do it again here.
+    
+    The ContinueOnError setting is here so that, during project load, as much information as
+    possible will be passed to the compilers.
+    -->
+    <MSBuild
+      Projects="@(_MSBuildProjectReferenceExistent)"
+      Targets="%(_MSBuildProjectReferenceExistent.Targets);GetTargetPath"
+      Properties="%(_MSBuildProjectReferenceExistent.SetConfiguration); %(_MSBuildProjectReferenceExistent.SetPlatform)"
+      Condition="('$(BuildingSolutionFile)' == 'true' or '$(BuildingInsideVisualStudio)' == 'true' or '$(BuildProjectReferences)' != 'true') and '@(_MSBuildProjectReferenceExistent)' != '' "
+      ContinueOnError="!$(BuildingProject)">
+
+      <Output TaskParameter="TargetOutputs" ItemName="_ResolvedProjectReferencePaths" />
+      <Output TaskParameter="TargetOutputs" ItemName="_MSBuildResolvedProjectReferencePaths" />
+    </MSBuild>
+
+    <!--
+    Build referenced projects when building from the command line.
+    
+    The $(ProjectReferenceBuildTargets) will normally be blank so that the project's default target
+    is used during a P2P reference. However if a custom build process requires that the referenced
+    project has a different target to build it can be specified.
+    -->
+    <MSBuild
+      Projects="@(_MSBuildProjectReferenceExistent)"
+      Targets="$(ProjectReferenceBuildTargets)"
+      Properties="%(_MSBuildProjectReferenceExistent.SetConfiguration); %(_MSBuildProjectReferenceExistent.SetPlatform)"
+      Condition=" '$(BuildingInsideVisualStudio)' != 'true' and '$(BuildingSolutionFile)' != 'true' and '$(BuildProjectReferences)' == 'true' and '@(_MSBuildProjectReferenceExistent)' != '' ">
+
+      <Output TaskParameter="TargetOutputs" ItemName="_ResolvedProjectReferencePaths" />
+      <Output TaskParameter="TargetOutputs" ItemName="_MSBuildResolvedProjectReferencePaths" />
+    </MSBuild>
+
+    <!-- Issue a warning for each non-existent project. -->
+    <Warning
+      Text="The referenced project '%(_MSBuildProjectReferenceNonexistent.Identity)' does not exist."
+      Condition=" '@(_MSBuildProjectReferenceNonexistent)' != '' " />
+
+    <!-- Create list of all .wixlib project references-->
+    <CreateItem
+      Include="@(_ResolvedProjectReferencePaths)"
+      Condition=" '%(Extension)' == '.wixlib' ">
+
+      <Output TaskParameter="Include" ItemName="WixLibProjects" />
+    </CreateItem>
+
+  </Target>
+
+  <!--
+  ================================================================================================
+  GetTargetPath
+
+    This stand-alone target returns the name of the build product (i.e. MSI, MSM) that would be
+    produced if we built this project.
+  ================================================================================================
+  -->
+  <PropertyGroup>
+    <GetTargetPathDependsOn>
+      PrepareForBuild;
+      AssignCultures
+    </GetTargetPathDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="GetTargetPath"
+    DependsOnTargets="$(GetTargetPathDependsOn)"
+    Outputs="$(TargetPath)" />
+
+  <!--
+  ================================================================================================
+  ResolveVCProjectReferences
+
+    Find outputs of referenced VC projects (currently we never build VC projects ourselves).
+
+    [IN]
+    @(VCProjectReference) - the list of VC project references
+
+    [OUT]
+    @(_ResolvedProjectReferencePaths) - paths to projects' outputs
+  ================================================================================================
+  -->
+  <Target
+    Name="ResolveVCProjectReferences"
+    Condition=" '@(VCProjectReference)' != '' "
+    DependsOnTargets="SplitProjectReferencesByType">
+
+    <!--
+    Use the task for matching projects with pre-resolved project outputs set by the IDE
+    if building inside the IDE.
+    -->
+    <ResolveNonMSBuildProjectOutput
+      ProjectReferences="@(VCProjectReference)"
+      PreresolvedProjectOutputs="$(VSIDEResolvedNonMSBuildProjectOutputs)"
+      Condition=" '$(BuildingInsideVisualStudio)' == 'true' ">
+
+      <Output TaskParameter="ResolvedOutputPaths" ItemName="_ResolvedVCProjectReferencePaths" />
+    </ResolveNonMSBuildProjectOutput>
+
+    <!--
+    Use the task that uses VC project engine if building from the command line. Invoking this
+    task only makes sense for building solution files, otherwise we won't have the necessary
+    configuration information.
+    -->
+    <ResolveVCProjectOutput
+      ProjectReferences="@(VCProjectReference)"
+      Configuration="%(VCProjectReference.FullConfiguration)"
+      SolutionFile="$(SolutionPath)"
+      Override="$(VCBuildOverride)"
+      Condition=" '$(BuildingSolutionFile)' == 'true' ">
+
+      <Output TaskParameter="ResolvedOutputPaths" ItemName="_ResolvedVCProjectReferencePaths" />
+    </ResolveVCProjectOutput>
+
+    <Error
+      Code="WIXTARGETS104"
+      Text="MSBuild cannot resolve the reference to the Visual C++ project '%(VCProjectReference.Identity)' when building a stand-alone MSBuild project. To correctly resolve this reference, please build the solution file containing these projects."
+      Condition=" '$(BuildingSolutionFile)' != 'true' and '$(BuildingInsideVisualStudio)' != 'true' " />
+
+    <CreateItem Include="@(_ResolvedVCProjectReferencePaths)">
+      <Output TaskParameter="Include" ItemName="_ResolvedProjectReferencePaths" />
+    </CreateItem>
+
+  </Target>
+
+  <!--
+  ================================================================================================
+  ResolveWixLibraryReferences
+
+    Resolve the library references to full paths.
+
+    [IN]
+    @(WixLibrary) - The list of .wixlib files.
+    
+    [OUT]
+    @(_ResolvedWixLibraryPaths) - Item group with full paths to libraries
+  ================================================================================================
+  -->
+  <PropertyGroup>
+    <ResolveWixLibraryReferencesDependsOn>
+      PrepareForBuild;
+    </ResolveWixLibraryReferencesDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="ResolveWixLibraryReferences"
+    DependsOnTargets="$(ResolveWixLibraryReferencesDependsOn)"
+    Condition=" '@(WixLibrary)' != ''">
+
+    <!--
+    The WixLibrarySearchPaths property is set to find assemblies in the following order:
+
+        (1) $(ReferencePaths) - the reference paths property, which comes from the .USER file.
+        (2) The hintpath from the referenced item itself, indicated by {HintPathFromItem}.
+        (3) Treat the reference's Include as if it were a real file name.
+        (4) Path specified by the WixExtDir property.
+    -->
+    <CreateProperty Condition=" '$(WixLibrarySearchPaths)' == '' " Value="
+      $(ReferencePaths);
+      {HintPathFromItem};
+      {RawFileName};
+      $(WixExtDir)
+      ">
+      <Output TaskParameter="Value" PropertyName="WixLibrarySearchPaths" />
+    </CreateProperty>
+
+    <ResolveWixReferences
+      WixReferences="@(WixLibrary)"
+      SearchPaths="$(WixLibrarySearchPaths)"
+      SearchFilenameExtensions=".wixlib">
+      <Output TaskParameter="ResolvedWixReferences" ItemName="_AllResolvedWixLibraryPaths" />
+    </ResolveWixReferences>
+    
+    <!-- Remove duplicate library items that would cause build errors -->
+    <RemoveDuplicates Inputs="@(_AllResolvedWixLibraryPaths)">
+      <Output TaskParameter="Filtered" ItemName="_ResolvedWixLibraryPaths" />
+    </RemoveDuplicates>
+
+  </Target>
+
+  <!--
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  Compiler Define Targets
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  -->
+
+  <!--
+  ==================================================================================================
+  AddCompilerDefineConstants
+
+    Adds solution and project references to the constants passed into the compiler.
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <AddCompilerDefineConstantsDependsOn>
+      ResolveReferences;
+      AddSolutionDefineConstants;
+      AddProjectReferenceDefineConstants;
+    </AddCompilerDefineConstantsDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="AddCompilerDefineConstants"
+    DependsOnTargets="$(AddCompilerDefineConstantsDependsOn)">
+
+    <CreateProperty Value="
+      Configuration=$(ConfigurationName);
+      OutDir=$(OutDir);
+      Platform=$(PlatformName);
+      ProjectDir=$(ProjectDir);
+      ProjectExt=$(ProjectExt);
+      ProjectFileName=$(ProjectFileName);
+      ProjectName=$(ProjectName);
+      ProjectPath=$(ProjectPath);
+      TargetDir=$(TargetDir);
+      TargetExt=$(TargetExt);
+      TargetFileName=$(TargetFileName);
+      TargetName=$(TargetName);
+      TargetPath=$(TargetPath);
+      ">
+      <Output TaskParameter="Value" PropertyName="ProjectDefineConstants" />
+    </CreateProperty>
+    
+  </Target>
+
+  <!--
+  ==================================================================================================
+  AddSolutionDefineConstants
+
+    Adds solution references to the constants passed into the compiler, but only when building
+    from the Visual Studio IDE or when building a solution file via the command line.
+
+    [OUT]
+    $(SolutionDefineConstants) - the list of solution variables to be passed into the compiler
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <DefineSolutionProperties Condition=" '$(DefineSolutionProperties)' == '' ">true</DefineSolutionProperties>
+  </PropertyGroup>
+  <Target
+    Name="AddSolutionDefineConstants"
+    Condition=" '$(DefineSolutionProperties)' == 'true' ">
+
+    <Warning
+      Text="Solution properties are only available during IDE builds or when building the solution file from the command line. To turn off this warning set &lt;DefineSolutionProperties&gt;false&lt;/DefineSolutionProperties&gt; in your .wixproj file."
+      Condition=" '$(BuildingInsideVisualStudio)' != 'true' and '$(BuildingSolutionFile)' != 'true' " />
+
+    <CreateProperty Value="$(SolutionDefineConstants);DevEnvDir=$(DevEnvDir)" Condition=" '$(DevEnvDir)' != '' ">
+      <Output TaskParameter="Value" PropertyName="SolutionDefineConstants" />
+    </CreateProperty>
+    <CreateProperty Value="$(SolutionDefineConstants);SolutionDir=$(SolutionDir)" Condition=" '$(SolutionDir)' != '' ">
+      <Output TaskParameter="Value" PropertyName="SolutionDefineConstants" />
+    </CreateProperty>
+    <CreateProperty Value="$(SolutionDefineConstants);SolutionExt=$(SolutionExt)" Condition=" '$(SolutionExt)' != '' ">
+      <Output TaskParameter="Value" PropertyName="SolutionDefineConstants" />
+    </CreateProperty>
+    <CreateProperty Value="$(SolutionDefineConstants);SolutionFileName=$(SolutionFileName)" Condition=" '$(SolutionFileName)' != '' ">
+      <Output TaskParameter="Value" PropertyName="SolutionDefineConstants" />
+    </CreateProperty>
+    <CreateProperty Value="$(SolutionDefineConstants);SolutionName=$(SolutionName)" Condition=" '$(SolutionName)' != '' ">
+      <Output TaskParameter="Value" PropertyName="SolutionDefineConstants" />
+    </CreateProperty>
+    <CreateProperty Value="$(SolutionDefineConstants);SolutionPath=$(SolutionPath)" Condition=" '$(SolutionPath)' != '' ">
+      <Output TaskParameter="Value" PropertyName="SolutionDefineConstants" />
+    </CreateProperty>
+
+  </Target>
+
+  <!--
+  ==================================================================================================
+  AddProjectReferenceDefineConstants
+
+    Adds project references to the constants passed into the compiler.
+
+    [IN]
+    @(_ResolvedProjectReferencePaths) - paths to projects' outputs
+    $(VSProjectConfigurations) - map of project names to configurations, provided by VS when building in the IDE
+
+    [OUT]
+    $(ProjectReferenceDefineConstants) - the list of referenced project variables to be passed into the compiler
+  ==================================================================================================
+  -->
+  <Target
+    Name="AddProjectReferenceDefineConstants"
+    Condition=" '@(_ResolvedProjectReferencePaths)' != '' ">
+
+    <CreateProjectReferenceDefineConstants
+      ProjectReferencePaths="@(_ResolvedProjectReferencePaths)"
+      ProjectConfigurations="$(VSProjectConfigurations)">
+
+      <Output TaskParameter="DefineConstants" PropertyName="ProjectReferenceDefineConstants" />
+    </CreateProjectReferenceDefineConstants>
+  </Target>
+
+  <!--
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  CompileAndLink Targets
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  -->
+
+  <!--
+  ==================================================================================================
+  CompileAndLink
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <CompileAndLinkDependsOn>
+      ResolveReferences;
+      BeforeCompileAndLink;
+      _TimeStampBeforeCompileAndLink;
+      ConvertReferences;
+      ConvertBundleReferences;
+      Harvest;
+      GenerateCode;
+      Compile;
+      Lib;
+      Link;
+      _TimeStampAfterCompileAndLink;
+      AfterCompileAndLink
+    </CompileAndLinkDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="CompileAndLink"
+    DependsOnTargets="$(CompileAndLinkDependsOn)" />
+
+  <!--
+  ==================================================================================================
+  BeforeCompileAndLink
+
+    Redefine this target in your project in order to run tasks just before CompileAndLink.
+  ==================================================================================================
+  -->
+  <Target Name="BeforeCompileAndLink" />
+
+  <!--
+  ==================================================================================================
+  AfterCompileAndLink
+
+    Redefine this target in your project in order to run tasks just after CompileAndLink.
+  ==================================================================================================
+  -->
+  <Target Name="AfterCompileAndLink" />
+
+  <!--
+  ==================================================================================================
+  _TimeStampBeforeCompileAndLink
+
+    Record a timestamp so that we can compare it to a new timestamp during PostBuildEvent if
+    necessary.
+  ==================================================================================================
+  -->
+  <Target
+    Name="_TimeStampBeforeCompileAndLink" >
+
+    <CreateItem Include="$(TargetPath)">
+      <Output TaskParameter="Include" ItemName="TargetOutput" />
+    </CreateItem>
+    
+    <CreateItem Include="%(TargetOutput.ModifiedTime)">
+      <Output TaskParameter="Include" PropertyName="_TargetOutputTimestampBeforeCompileAndLink" />
+    </CreateItem>
+
+  </Target>
+
+  <!--
+  ==================================================================================================
+  _TimeStampAfterCompileAndLink
+
+    Take before and after timestamps so that we can compare them (used by post-build events that
+    are set to fire "OnOutputUpdated").
+  ==================================================================================================
+  -->
+  <Target
+    Name="_TimeStampAfterCompileAndLink">
+
+    <CreateItem Include="%(TargetOutput.ModifiedTime)">
+      <Output TaskParameter="Include" PropertyName="_TargetOutputTimestampAfterCompileAndLink" />
+    </CreateItem>
+
+    <!-- if our target path was updated by compile & link, and it's an "inscribe-able" output type,
+         then add it to the list of things to be inscribed -->
+    <CreateItem Include="$(TargetPath)"
+      Condition="'$(_TargetOutputTimestampBeforeCompileAndLink)' != '$(_TargetOutputTimestampAfterCompileAndLink)'
+      and ('$(OutputType)' == 'Package' or '$(OutputType)' == 'PatchCreation' or '$(OutputType)' == 'Module')
+      and '$(InscribeMainOutput)' == 'true'" >
+
+        <Output TaskParameter="Include" ItemName="Inscribe"/>
+    </CreateItem>
+
+  </Target>
+
+  <!--
+  ==================================================================================================
+  Harvest
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <HarvestDependsOn>
+      HarvestProjects;
+      HarvestDirectory;
+      HarvestFile;
+    </HarvestDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="Harvest"
+    DependsOnTargets="$(HarvestDependsOn)" />
+
+  <!--
+  ==================================================================================================
+  GenerateCode
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <GenerateCodeDependsOn>
+      RefreshGeneratedFile;
+      RefreshBundleGeneratedFile
+    </GenerateCodeDependsOn>
+  </PropertyGroup>
+  <Target Name="GenerateCode"
+    DependsOnTargets="$(GenerateCodeDependsOn)" />
+
+  <!--
+  ==================================================================================================
+  Signing
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <SigningDependsOn>
+      CompileAndLink;
+      BeforeSigning;
+      SignCabs;
+      Inscribe;
+      SignMsi;
+      AfterSigning
+    </SigningDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="Signing"
+    DependsOnTargets="$(SigningDependsOn)" />
+
+  <!--
+  ==================================================================================================
+  BeforeSigning
+
+    Redefine this target in your project in order to run tasks just before all signing tasks.
+  ==================================================================================================
+  -->
+  <Target Name="BeforeSigning" />
+
+  <!--
+  ==================================================================================================
+  SignCabs
+
+    Redefine this target in your project in order to sign the cabs of your database.
+  ==================================================================================================
+  -->
+  <Target Name="SignCabs" />
+
+  <!--
+  ==================================================================================================
+  SignMsi
+
+    Redefine this target in your project in order to sign your database, after it has been inscribed
+    with the signatures of your signed cabs
+  ==================================================================================================
+  -->
+  <Target Name="SignMsi" />
+
+  <!--
+  ==================================================================================================
+  AfterSigning
+
+    Redefine this target in your project in order to run tasks just after all signing tasks.
+  ==================================================================================================
+  -->
+  <Target Name="AfterSigning" />
+
+  <!--
+
+  ================================================================================================
+  ConvertReferences
+
+    Converts project references to HeatProject items to auto generate authoring.
+  ================================================================================================
+  -->
+  <Target
+    Name="ConvertReferences"
+    Condition=" ('$(OutputType)' == 'Package' or '$(OutputType)' == 'PatchCreation' or '$(OutputType)' == 'Module') ">
+
+    <CreateItem Include="@(_MSBuildProjectReferenceExistent)" Condition=" '%(_MSBuildProjectReferenceExistent.DoNotHarvest)' == '' " AdditionalMetadata="DirectoryIds=%(_MSBuildProjectReferenceExistent.RefTargetDir);ProjectOutputGroups=Binaries%3BSymbols%3BSources%3BContent%3BSatellites%3BDocuments;ProjectName=%(_MSBuildProjectReferenceExistent.Name);HeatOutput=$(IntermediateOutputPath)_%(_MSBuildProjectReferenceExistent.Filename).wxs">
+      <Output TaskParameter="Include" ItemName="HeatProject" />
+      <Output TaskParameter="Include" ItemName="_HeatProjectReference" />
+    </CreateItem>
+
+    <Error
+      Text="The following files are deprecated and should be removed from your project(s): @(Compile->'%(Identity)', ', ')"
+      Condition=" '%(Compile.GenerateComponentGroups)' != '' " />
+
+    <CreateItem Include="$(HarvestProjectsGeneratedFile)">
+      <!-- Unconditionally generate Compile items so they are always linked in. -->
+      <Output TaskParameter="Include" ItemName="Compile" />
+      <Output TaskParameter="Include" ItemName="_GeneratedFiles" />
+    </CreateItem>
+
+  </Target>
+
+  <!--
+  ================================================================================================
+  ConvertBundleReferences
+
+    Converts project references in Bundle projects to HeatProject items to auto generate authoring.
+  ================================================================================================
+  -->
+  <Target
+    Name="ConvertBundleReferences"
+    Condition=" ('$(OutputType)' == 'Bundle')">
+
+    <CreateItem Include="@(_MSBuildProjectReferenceExistent)" Condition=" '%(_MSBuildProjectReferenceExistent.DoNotHarvest)' == '' " AdditionalMetadata="ProjectOutputGroups=Binaries%3BSymbols%3BSources%3BContent%3BSatellites%3BDocuments;GenerateType=payloadgroup;HeatOutput=$(IntermediateOutputPath)_%(_MSBuildProjectReferenceExistent.Filename).wxs">
+      <Output TaskParameter="Include" ItemName="HeatProject" />
+      <Output TaskParameter="Include" ItemName="_HeatProjectReference" />
+    </CreateItem>
+
+    <Error
+      Text="The following files are deprecated and should be removed from your project(s): @(Compile->'%(Identity)', ', ')"
+      Condition=" '%(Compile.GenerateComponentGroups)' != '' " />
+
+    <CreateItem Include="$(HarvestProjectsGeneratedFile)">
+      <!-- Unconditionally generate Compile items so they are always linked in. -->
+      <Output TaskParameter="Include" ItemName="Compile" />
+      <Output TaskParameter="Include" ItemName="_GeneratedFiles" />
+    </CreateItem>
+
+  </Target>
+
+  <!--
+  ================================================================================================
+  CombineHarvestProjects
+
+    Combines HeatProject and HarvestProject items together and ensures each has HeatOutput metadata.
+  ================================================================================================
+  -->
+  <Target Name="CombineHarvestProjects"
+    Condition=" '@(HeatProject)' != '' or '@(HarvestProject)' != '' ">
+
+    <!-- Add default HeatOutputs for those without one specified -->
+    <CreateItem Include="@(HeatProject)" Condition= " '%(HeatProject.HeatOutput)' == '' "
+    AdditionalMetadata="HeatOutput=$(IntermediateOutputPath)_%(HeatProject.Filename).wxs">
+      <Output TaskParameter="Include" ItemName="_AllHeatProjects" />
+    </CreateItem>
+    <CreateItem Include="@(HarvestProject)" Condition= " '%(HarvestProject.HeatOutput)' == '' "
+    AdditionalMetadata="HeatOutput=$(IntermediateOutputPath)_%(HarvestProject.Filename).wxs">
+      <Output TaskParameter="Include" ItemName="_AllHeatProjects" />
+    </CreateItem>
+
+
+    <CreateItem Include="@(HeatProject)" Condition= " '%(HeatProject.HeatOutput)' != '' ">
+      <Output TaskParameter="Include" ItemName="_AllHeatProjects" />
+    </CreateItem>
+    <CreateItem Include="@(HarvestProject)" Condition= " '%(HarvestProject.HeatOutput)' != '' ">
+      <Output TaskParameter="Include" ItemName="_AllHeatProjects" />
+    </CreateItem>
+
+  </Target>
+
+  <!--
+  ================================================================================================
+  HarvestProjects
+
+    Harvests outputs of other MSBuild projects files using the VS project extension to heat.exe.
+
+    [IN]
+    @(HarvestProject)
+    @(HeatProject)
+        - The list of projects to harvest. HeatProject is provided for backward compatibility.
+          You should use HarvestProject instead.
+
+    %(HarvestProject.Transforms)
+    %(HeatProject.Transforms)
+        - XSL transforms to apply to the harvested WiX.
+
+    %(HarvestProject.ProjectOutputGroups)
+    %(HeatProjects.ProjectOutputGroups)
+        - The project output groups to harvest 
+
+    [OUT]
+    %(HeatOutput)
+        - The generated .wxs files which are added to the @(Compile) item list.
+  ================================================================================================
+  -->
+  <PropertyGroup>
+    <HarvestProjectsDependsOn>CombineHarvestProjects</HarvestProjectsDependsOn>
+  </PropertyGroup>
+  <Target Name="HarvestProjects"
+    DependsOnTargets="$(HarvestProjectsDependsOn)"
+    Inputs="@(_AllHeatProjects);%(_AllHeatProjects.Transforms);$(MSBuildAllProjects);$(ProjectPath)"
+    Outputs="@(_AllHeatProjects -> '%(HeatOutput)')"
+    Condition=" '@(HeatProject)' != '' or '@(HarvestProject)' != '' ">
+
+    <!--For HeatProject items supporting MSBuild 2.0-->
+    <HeatProject
+      NoLogo="$(HarvestProjectsNoLogo)"
+      SuppressAllWarnings="$(HarvestProjectsSuppressAllWarnings)"
+      SuppressSpecificWarnings="$(HarvestProjectsSuppressSpecificWarnings)"
+      ToolPath="$(WixToolPath)"
+      TreatWarningsAsErrors="$(HarvestProjectsTreatWarningsAsErrors)"
+      TreatSpecificWarningsAsErrors="$(HarvestProjectsTreatSpecificWarningsAsErrors)"
+      VerboseOutput="$(HarvestProjectsVerboseOutput)"
+      AutogenerateGuids="$(HarvestProjectsAutogenerateGuids)"
+      GenerateGuidsNow="$(HarvestProjectsGenerateGuidsNow)"
+      OutputFile="%(_AllHeatProjects.HeatOutput)"
+      SuppressFragments="$(HarvestProjectsSuppressFragments)"
+      SuppressUniqueIds="$(HarvestProjectsSuppressUniqueIds)"
+      Transforms="%(_AllHeatProjects.Transforms)"
+      Project="%(_AllHeatProjects.FullPath)"
+      ProjectOutputGroups="%(_AllHeatProjects.ProjectOutputGroups)"
+      GenerateType="%(_AllHeatProjects.GenerateType)"
+      DirectoryIds="%(_AllHeatProjects.DirectoryIds)"
+      ProjectName="%(_AllHeatProjects.ProjectName)"
+      Configuration="%(_AllHeatProjects.Configuration)"
+      Platform="%(_AllHeatProjects.Platform)"
+      RunAsSeparateProcess="$(RunWixToolsOutOfProc)"
+      GenerateWixVariables="$(HarvestProjectsGenerateWixVariables)"
+      AdditionalOptions="$(HarvestProjectsAdditionalOptions)">
+
+      <Output TaskParameter="OutputFile" ItemName="Compile" />
+      <Output TaskParameter="OutputFile" ItemName="FileWrites" />
+
+    </HeatProject>
+
+  </Target>
+
+  <!--
+  ================================================================================================
+  HarvestDirectory
+
+    Harvests directories using heat.exe.
+
+    [IN]
+    @(HarvestDirectory) - The list of directories to harvest.
+    %(HarvestDirectory.Transforms) - XSL transforms to apply to the harvested WiX.
+    %(HarvestDirectory.ComponentGroupName) -  The name of the ComponentGroup to create.
+    %(HarvestDirectory.DirectoryRefId) - The ID of the directory to reference instead of TARGETDIR.
+    %(HarvestDirectory.KeepEmptyDirectories) - Whether to create Directory entries for empty directories.
+    %(HarvestDirectory.PreprocessorVariable) - Substitute SourceDir for another variable name (ex: var.Dir).
+    %(HarvestDirectory.SuppressCom) - Suppress COM elements.
+    %(HarvestDirectory.SuppressRootDirectory) - Suppress a Directory element for the root directory.
+    $(HarvestDirectory.SuppressRegistry) - Suppress registry harvesting.
+
+    [OUT]
+    $(IntermediateOutputPath)_%(HarvestDirectory.ComponentGroupName)_dir.wxs
+        - The generated .wxs files which are added to the @(Compile) item list.
+  ================================================================================================
+  -->
+
+  <PropertyGroup>
+    <HarvestDirectoryDependsOn>
+      GetHarvestDirectoryContent
+    </HarvestDirectoryDependsOn>
+  </PropertyGroup>
+
+  <!-- Creates items to include content since wildcards will not work in Target/@Inputs. -->
+  <Target Name="GetHarvestDirectoryContent">
+    <CreateItem Include="@(HarvestDirectory->'%(FullPath)\**\*')">
+      <Output TaskParameter="Include" ItemName="_HarvestDirectoryContent" />
+    </CreateItem>
+  </Target>
+
+  <Target Name="HarvestDirectory"
+    DependsOnTargets="$(HarvestDirectoryDependsOn)"
+    Inputs="@(_HarvestDirectoryContent);%(HarvestDirectory.Transforms)"
+    Outputs="$(IntermediateOutputPath)_%(HarvestDirectory.ComponentGroupName)_dir.wxs"
+    Condition=" '@(HarvestDirectory)' != '' ">
+
+    <HeatDirectory
+      NoLogo="$(HarvestDirectoryNoLogo)"
+      SuppressAllWarnings="$(HarvestDirectorySuppressAllWarnings)"
+      SuppressSpecificWarnings="$(HarvestDirectorySuppressSpecificWarnings)"
+      ToolPath="$(WixToolPath)"
+      TreatWarningsAsErrors="$(HarvestDirectoryTreatWarningsAsErrors)"
+      TreatSpecificWarningsAsErrors="$(HarvestDirectoryTreatSpecificWarningsAsErrors)"
+      VerboseOutput="$(HarvestDirectoryVerboseOutput)"
+      AutogenerateGuids="$(HarvestDirectoryAutogenerateGuids)"
+      GenerateGuidsNow="$(HarvestDirectoryGenerateGuidsNow)"
+      OutputFile="$(IntermediateOutputPath)_%(HarvestDirectory.ComponentGroupName)_dir.wxs"
+      SuppressFragments="$(HarvestDirectorySuppressFragments)"
+      SuppressUniqueIds="$(HarvestDirectorySuppressUniqueIds)"
+      Transforms="%(HarvestDirectory.Transforms)"
+      Directory="@(HarvestDirectory)"
+      ComponentGroupName="%(HarvestDirectory.ComponentGroupName)"
+      DirectoryRefId="%(HarvestDirectory.DirectoryRefId)"
+      KeepEmptyDirectories="%(HarvestDirectory.KeepEmptyDirectories)"
+      PreprocessorVariable="%(HarvestDirectory.PreprocessorVariable)"
+      SuppressCom="%(HarvestDirectory.SuppressCom)"
+      SuppressRootDirectory="%(HarvestDirectory.SuppressRootDirectory)"
+      SuppressRegistry="%(HarvestDirectory.SuppressRegistry)"
+      RunAsSeparateProcess="$(RunWixToolsOutOfProc)"
+      AdditionalOptions="$(HarvestDirectoryAdditionalOptions)">
+
+      <Output TaskParameter="OutputFile" ItemName="Compile" />
+      <Output TaskParameter="OutputFile" ItemName="FileWrites" />
+
+    </HeatDirectory>
+
+  </Target>
+
+  <!--
+  ================================================================================================
+  HarvestFile
+
+    Harvests files of different types using heat.exe. This can harvest registry from
+    self-registering files, files with typelibs, and more.
+
+    [IN]
+    @(HarvestFile) - The list of files to harvest.
+    %(HarvestFile.Transforms) - XSL transforms to apply to the harvested WiX.
+    %(HarvestFile.ComponentGroupName) - The name of the ComponentGroup to create.
+    %(HarvestFile.DirectoryRefId) - The ID of the directory to reference instead of TARGETDIR.
+    %(HarvestFile.PreprocessorVariable) - Substitute SourceDir for another variable name (ex: var.Dir).
+    %(HarvestFile.SuppressCom) - Suppress COM elements.
+    %(HarvestFile.SuppressRootDirectory) - Suppress a Directory element for the root directory.
+    $(HarvestFile.SuppressRegistry) - Suppress registry harvesting.
+
+    [OUT]
+    $(IntermediateOutputPath)_%(HarvestFile.Filename)_file.wxs
+        - The generated .wxs files which are added to the @(Compile) item list.
+  ================================================================================================
+  -->
+
+  <PropertyGroup>
+    <HarvestFileDependsOn></HarvestFileDependsOn>
+  </PropertyGroup>
+  <Target Name="HarvestFile"
+    DependsOnTargets="$(HarvestFileDependsOn)"
+    Inputs="@(HarvestFile);%(HarvestFile.Transforms)"
+    Outputs="$(IntermediateOutputPath)_%(HarvestFile.Filename)_file.wxs"
+    Condition=" '@(HarvestFile)' != '' ">
+
+    <HeatFile
+      NoLogo="$(HarvestFileNoLogo)"
+      SuppressAllWarnings="$(HarvestFileSuppressAllWarnings)"
+      SuppressSpecificWarnings="$(HarvestFileSuppressSpecificWarnings)"
+      ToolPath="$(WixToolPath)"
+      TreatWarningsAsErrors="$(HarvestFileTreatWarningsAsErrors)"
+      TreatSpecificWarningsAsErrors="$(HarvestFileTreatSpecificWarningsAsErrors)"
+      VerboseOutput="$(HarvestFileVerboseOutput)"
+      AutogenerateGuids="$(HarvestFileAutogenerateGuids)"
+      GenerateGuidsNow="$(HarvestFileGenerateGuidsNow)"
+      OutputFile="$(IntermediateOutputPath)_%(HarvestFile.Filename)_file.wxs"
+      SuppressFragments="$(HarvestFileSuppressFragments)"
+      SuppressUniqueIds="$(HarvestFileSuppressUniqueIds)"
+      Transforms="%(HarvestFile.Transforms)"
+      File="@(HarvestFile)"
+      ComponentGroupName="%(HarvestFile.ComponentGroupName)"
+      DirectoryRefId="%(HarvestFile.DirectoryRefId)"
+      PreprocessorVariable="%(HarvestFile.PreprocessorVariable)"
+      RunAsSeparateProcess="$(RunWixToolsOutOfProc)" 
+      SuppressCom="%(HarvestFile.SuppressCom)"
+      SuppressRegistry="%(HarvestFile.SuppressRegistry)"
+      SuppressRootDirectory="%(HarvestFile.SuppressRootDirectory)"
+      AdditionalOptions="$(HarvestFileAdditionalOptions)">
+
+      <Output TaskParameter="OutputFile" ItemName="Compile" />
+      <Output TaskParameter="OutputFile" ItemName="FileWrites" />
+
+    </HeatFile>
+
+  </Target>
+
+  <!--
+  ================================================================================================
+  RefreshGeneratedFile
+
+    Generates code based on metadata defined in project references.
+
+    [IN]
+    @(_MSBuildResolvedProjectReferencePaths) - The list of MSBuildable project references.
+
+    [OUT]
+    @(_GeneratedFiles) - The generated source file.
+  ================================================================================================
+  -->
+  <PropertyGroup>
+    <RefreshGeneratedFileDependsOn></RefreshGeneratedFileDependsOn>
+  </PropertyGroup>
+  <Target Name="RefreshGeneratedFile"
+    DependsOnTargets="$(RefreshGeneratedFileDependsOn)"
+    Inputs="@(_MSBuildResolvedProjectReferencePaths);@(Compile);$(ProjectPath)"
+    Outputs="@(_GeneratedFiles)"
+    Condition=" ('$(OutputType)' == 'Package' or '$(OutputType)' == 'PatchCreation' or '$(OutputType)' == 'Module') and '@(_GeneratedFiles)' != '' ">
+
+    <RefreshGeneratedFile
+      GeneratedFiles="@(_GeneratedFiles)"
+      ProjectReferencePaths="@(_MSBuildResolvedProjectReferencePaths)" />
+
+  </Target>
+
+  <!--
+  ================================================================================================
+  RefreshBundleGeneratedFile
+
+    Generates code for bundle projects based on metadata defined in project references.
+
+    [IN]
+    @(_MSBuildResolvedProjectReferencePaths) - The list of MSBuildable project references.
+
+    [OUT]
+    @(_GeneratedFiles) - The generated source file.
+  ================================================================================================
+  -->
+  <PropertyGroup>
+    <RefreshBundleGeneratedFileDependsOn></RefreshBundleGeneratedFileDependsOn>
+  </PropertyGroup>
+  <Target Name="RefreshBundleGeneratedFile"
+    DependsOnTargets="$(RefreshBundleGeneratedFileDependsOn)"
+    Inputs="@(_MSBuildResolvedProjectReferencePaths);@(Compile);$(ProjectPath)"
+    Outputs="@(_GeneratedFiles)"
+    Condition=" '$(OutputType)' == 'Bundle' and '@(_GeneratedFiles)' != '' ">
+
+    <RefreshBundleGeneratedFile
+      GeneratedFiles="@(_GeneratedFiles)"
+      ProjectReferencePaths="@(_MSBuildResolvedProjectReferencePaths)" />
+
+  </Target>
+
+  <!--
+  ================================================================================================
+  GenerateCompileWithObjectPath
+
+    Generates metadata on the for compile output objects.
+
+  ================================================================================================
+  -->
+  <PropertyGroup>
+    <GenerateCompileWithObjectPathDependsOn></GenerateCompileWithObjectPathDependsOn>
+  </PropertyGroup>
+  <Target Name="GenerateCompileWithObjectPath"
+    Condition=" '@(Compile)' != '' ">
+    <!-- If ObjectPath is defined include directly -->
+    <CreateItem
+      Include="@(Compile)"
+      Condition=" '%(Compile.ObjectPath)' != '' ">
+      <Output TaskParameter="Include" ItemName="_CompileWithObjectPath" />
+    </CreateItem>
+
+    <!-- If RelativeDir is not rooted and not in IntermediateOutputPath, and ObjectPath is undefined use IntermediateOutputPath\RelativeDir -->
+    <CreateItem
+      Include="@(Compile)"
+      Condition=" '%(RelativeDir)%(FileName)%(Extension)' != '%(FullPath)' AND '%(RelativeDir)%(FileName)%(Extension)' != '$(IntermediateOutputPath)%(FileName)%(Extension)' AND '%(Compile.ObjectPath)' == '' "
+      AdditionalMetadata="ObjectPath=$(IntermediateOutputPath)%(RelativeDir)">
+      <Output TaskParameter="Include" ItemName="_CompileWithObjectPath" />
+    </CreateItem>
+
+    <!-- If RelativeDir is rooted or in IntermediateOutputPath, and ObjectPath is undefined use IntermediateOutputPath -->
+    <CreateItem
+      Include="@(Compile)"
+      Condition=" ('%(RelativeDir)%(FileName)%(Extension)' == '%(FullPath)' OR '%(RelativeDir)%(FileName)%(Extension)' == '$(IntermediateOutputPath)%(FileName)%(Extension)') AND '%(Compile.ObjectPath)' == '' "
+      AdditionalMetadata="ObjectPath=$(IntermediateOutputPath)">
+      <Output TaskParameter="Include" ItemName="_CompileWithObjectPath" />
+    </CreateItem>
+  </Target>
+
+  <!--
+  ================================================================================================
+  Compile
+
+    Compiles the wxs files into wixobj files using candle.exe.
+
+    [IN]
+    @(Compile) - The list of wxs files to compile.
+    @(Content) - Files that the project uses in the installer.
+    @(WixExtension) - The list of wixlib or wix dll extensions.
+
+    [OUT]
+    @(CompileObjOutput) - The compiled .wixobj files.
+  ================================================================================================
+  -->
+  <PropertyGroup>
+    <CompileDependsOn>
+      PrepareForBuild;
+      ResolveWixExtensionReferences;
+      GenerateCompileWithObjectPath
+    </CompileDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="Compile"
+    Inputs="@(Compile);
+            @(Content);
+            @(_ResolvedWixExtensionPaths);
+            @(_ResolvedProjectReferencePaths);
+            $(MSBuildAllProjects)"
+    Outputs="@(_CompileWithObjectPath -> '%(ObjectPath)%(Filename)$(IntermediateExt)')"
+    DependsOnTargets="$(CompileDependsOn)"
+    Condition=" '@(Compile)' != '' ">
+
+    <Candle
+      SourceFiles="@(_CompileWithObjectPath)"
+      AdditionalOptions="$(CompilerAdditionalOptions)" 
+      DefineConstants="$(DefineConstants);$(SolutionDefineConstants);$(ProjectDefineConstants);$(ProjectReferenceDefineConstants)"
+      ExtensionDirectory="$(WixExtDir)"
+      Extensions="@(_ResolvedWixExtensionPaths)"
+      FipsCompliant="$(FipsCompliant)"
+      SuppressFilesVitalByDefault="$(SuppressFilesVitalByDefault)"
+      PreprocessToStdOut="$(PreprocessToStdOut)"
+      PreprocessToFile="$(PreprocessToFile)"
+      IncludeSearchPaths="$(IncludeSearchPaths)"
+      InstallerPlatform="$(InstallerPlatform)"
+      NoLogo="$(CompilerNoLogo)"
+      OnlyValidateDocuments="$(OnlyValidateDocuments)" 
+      OutputFile="%(_CompileWithObjectPath.ObjectPath)"
+      Pedantic="$(Pedantic)"
+      ReferencePaths="$(ReferencePaths)"
+      RunAsSeparateProcess="$(RunWixToolsOutOfProc)"
+      ShowSourceTrace="$(ShowSourceTrace)"
+      SuppressAllWarnings="$(CompilerSuppressAllWarnings)"
+      SuppressSchemaValidation="$(CompilerSuppressSchemaValidation)"
+      SuppressSpecificWarnings="$(CompilerSuppressSpecificWarnings)"
+      ToolPath="$(WixToolPath)"
+      TreatWarningsAsErrors="$(CompilerTreatWarningsAsErrors)"
+      TreatSpecificWarningsAsErrors="$(CompilerTreatSpecificWarningsAsErrors)" 
+      VerboseOutput="$(CompilerVerboseOutput)">
+    </Candle>
+
+    <CreateItem Include="@(_CompileWithObjectPath -> '%(ObjectPath)%(Filename)$(IntermediateExt)')">
+      <Output TaskParameter="Include" ItemName="CompileObjOutput" />
+    </CreateItem>
+  </Target>
+
+  <!--
+  ================================================================================================
+  Inscribe
+
+    To be called after signing an MSI's cabs - inscribes an MSI with the digital signature of its
+      external cabs.
+
+    [IN/OUT]
+    @(Inscribe) - The list of database files to inscribe - database files will be modified in-place.
+
+  ================================================================================================
+  -->
+  <PropertyGroup>
+    <InscribeDependsOn>
+      PrepareForBuild;
+      ResolveWixExtensionReferences;
+      CompileAndLink;
+      SignCabs
+    </InscribeDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="Inscribe"
+    DependsOnTargets="$(InscribeDependsOn)"
+    Condition=" '@(Inscribe)' != '' and '$(OutputCabList)' != ''">
+
+    <Insignia
+      DatabaseFiles="@(Inscribe)"
+      ToolPath="$(WixToolPath)"
+      NoLogo="$(InscribeNoLogo)"
+      RunAsSeparateProcess="$(RunWixToolsOutOfProc)"
+      SuppressAllWarnings="$(InscribeSuppressAllWarnings)"
+      SuppressSpecificWarnings="$(InscribeSuppressSpecificWarnings)"
+      TreatWarningsAsErrors="$(InscribeTreatWarningsAsErrors)"
+      TreatSpecificWarningsAsErrors="$(InscribeTreatSpecificWarningsAsErrors)"
+      VerboseOutput="$(InscribeVerboseOutput)"
+      AdditionalOptions="$(InscribeAdditionalOptions)">
+    </Insignia>
+  </Target>
+
+  <!--
+  ================================================================================================
+  Lib
+
+    Links the .wixobj, .wxl, .wixlib, wix extensions into a .wixlib file using lit.exe.
+
+    [IN]
+    @(CompileObjOutput) - The compiled .wixobj file.
+    @(EmbeddedResource) - The list of wxl files to use for localization.
+    @(WixObject) - The list of .wixobj files.
+    @(WixLibrary) - The list of .wixlib files.
+    @(WixExtension) - The list of wix dll extension files.
+
+    [OUT]
+    $(TargetPath) - The compiled .wixlib file.
+  ================================================================================================
+  -->
+  <PropertyGroup>
+    <LibDependsOn>
+      PrepareForBuild;
+      ResolveWixExtensionReferences
+    </LibDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="Lib"
+    Inputs="@(CompileObjOutput);
+            @(EmbeddedResource);
+            @(WixObject);
+            @(WixLibrary);
+            @(_ResolvedWixExtensionPaths);
+            $(MSBuildAllProjects)"
+    Outputs="$(TargetPath)"
+    DependsOnTargets="$(LibDependsOn)"
+    Condition=" '$(OutputType)' == 'Library' ">
+
+    <Lit
+      ObjectFiles="@(CompileObjOutput);@(WixObject);@(WixLibProjects);@(WixLibrary)"
+      AdditionalOptions="$(LibAdditionalOptions)" 
+      BaseInputPaths="$(LinkerBaseInputPaths)"
+      BindFiles="$(LibBindFiles)"
+      ExtensionDirectory="$(WixExtDir)"
+      Extensions="@(_ResolvedWixExtensionPaths)"
+      LocalizationFiles="@(EmbeddedResource)"
+      NoLogo="$(LibNoLogo)"
+      OutputFile="$(TargetPath)"
+      Pedantic="$(LibPedantic)"
+      ReferencePaths="$(ReferencePaths)"
+      RunAsSeparateProcess="$(RunWixToolsOutOfProc)"
+      SuppressAllWarnings="$(LibSuppressAllWarnings)"
+      SuppressIntermediateFileVersionMatching="$(LibSuppressIntermediateFileVersionMatching)"
+      SuppressSchemaValidation="$(LibSuppressSchemaValidation)"
+      SuppressSpecificWarnings="$(LibSuppressSpecificWarnings)"
+      ToolPath="$(WixToolPath)"
+      TreatWarningsAsErrors="$(LibTreatWarningsAsErrors)"
+      VerboseOutput="$(LibVerboseOutput)" />
+  </Target>
+
+  <!--
+  ================================================================================================
+  AssignCultures
+
+    Determines the final list of culture groups to build based on either the Cultures property or
+    those specified in .wxl files. 
+    
+      Culture groups specified in the Cultures property must be specified as a semi-colon 
+      delimited  list of groups, with comma-delimited cultures within a group.  
+      For example:
+        <Cultures>en-US,en;en-GB,en</Cultures>
+      This will build 2 targets, outputing to en-US and en-GB sub-folders.  Light will first look
+      for strings in the first culture (en-US or en-GB) then the second (en).
+    
+      Cultures of .wxl files will be used when the Culture property is not set.  The culture of a 
+      .wxl file is determined by the Culture attribute in the WixLocalization element in the file
+
+    Sets the OutputFolder metadata on each culture group.  In most cases this is the same as the 
+    first culture in the culture group.  When the Culture's property is unspecified and no .wxl 
+    files are provided this is the same as the output directory.  When the Culture's property 
+    specifies a single culture group and no .wxl files are provided this is the same as the output
+    directory.
+
+    Updates the TargetPath and TargetPdbPath properties to be used in subsequent targets.
+    
+    [IN]
+    @(EmbeddedResource) - The list of wxl files to use for localization.
+    $(Cultures) - The list of culture groups to build.
+
+    [OUT]
+    @(CultureGroup) - The list of culture group strings with OutputFolder metadata
+    $(TargetPath) - Property list of target link output MSIs/MSMs
+    $(TargetPdbPath) - Property list of target output pdbs
+    
+  ================================================================================================
+  -->
+
+  <Target 
+    Name="AssignCultures"
+    Condition=" ('$(OutputType)' == 'Package' or '$(OutputType)' == 'PatchCreation' or '$(OutputType)' == 'Module')">
+    
+    <WixAssignCulture
+      Cultures="$(Cultures)"
+      Files="@(EmbeddedResource)"
+      >
+
+      <Output TaskParameter="CultureGroups" ItemName="CultureGroup" />
+    </WixAssignCulture>
+
+    <!-- Build an itemgroup of outputs -->
+    <CreateItem
+      Include="$(TargetDir)%(CultureGroup.OutputFolder)$(TargetName)$(TargetExt)">
+      <Output TaskParameter="Include"
+              ItemName="_TargetPathItems"/>
+    </CreateItem>
+    
+    <!-- Convert the itemgroup to a semicolon-delimited property -->
+    <CreateProperty
+      Value="@(_TargetPathItems)">
+      <Output TaskParameter="Value"
+              PropertyName="TargetPath"/>
+    </CreateProperty>
+
+    <!-- Build an itemgroup of PDB outputs -->
+    <CreateItem
+      Include="$(TargetDir)%(CultureGroup.OutputFolder)$(TargetName)$(TargetPdbExt)">
+      <Output TaskParameter="Include"
+              ItemName="_TargetPdbPathItems"/>
+    </CreateItem>
+
+    <!-- Convert the itemgroup to a semicolon-delimited property -->
+    <CreateProperty
+      Value="@(_TargetPdbPathItems)">
+      <Output TaskParameter="Value"
+              PropertyName="TargetPdbPath"/>
+    </CreateProperty>
+  </Target>
+
+  <!--
+  ================================================================================================
+  Link
+
+    Links the .wixobj, .wxl, .wixlib, wix extensions into an .msi or .msm file using light.exe,
+    once per culture group. All WXL files are passed into light and the culture switch determines
+    which are used
+
+    [IN]
+    @(CompileObjOutput) - The compiled .wixobj file.
+    @(CultureGroup) - The cultures to build
+    @(EmbeddedResource) - The list of wxl files to use for localization.
+    @(WixObject) - The list of .wixobj files.
+    @(WixLibrary) - The list of .wixlib files.
+    @(WixExtension) - The list of wix dll extension files.
+
+    [OUT]
+    $(TargetDir)\%(Culture)\$(TargetName)$(TargetExt) - The compiled .msi, .msm, or .exe files.
+  ================================================================================================
+  -->
+  <PropertyGroup>
+    <LinkDependsOn>
+      PrepareForBuild;
+      ResolveReferences;
+      AssignCultures;
+    </LinkDependsOn>
+  </PropertyGroup>
+  
+  <Target
+    Name="Link"
+    Inputs="@(CompileObjOutput);
+            @(EmbeddedResource);
+            @(WixObject);
+            @(_ResolvedProjectReferencePaths);
+            @(_ResolvedWixLibraryPaths);
+            @(_ResolvedWixExtensionPaths);
+            $(MSBuildAllProjects)"
+    Outputs="$(TargetDir)%(CultureGroup.OutputFolder)$(TargetName)$(TargetExt)"
+    DependsOnTargets="$(LinkDependsOn)"
+    Condition=" ('$(OutputType)' == 'Package' or '$(OutputType)' == 'PatchCreation' or '$(OutputType)' == 'Module' or '$(OutputType)' == 'Bundle')">
+
+    <CreateProperty Condition=" '$(OutputType)' != 'Bundle' " Value="$(TargetDir)%(CultureGroup.OutputFolder)$(TargetName)$(TargetPdbExt)">
+      <Output TaskParameter="Value" PropertyName="PdbOutputFile" />
+    </CreateProperty>
+
+    <!-- Call light using the culture subdirectory for output -->
+    <Light
+      ObjectFiles="@(CompileObjOutput);@(WixObject);@(WixLibProjects);@(_ResolvedWixLibraryPaths)"
+      AdditionalOptions="$(LinkerAdditionalOptions)" 
+      AllowIdenticalRows="$(AllowIdenticalRows)"
+      AllowUnresolvedReferences="$(AllowUnresolvedReferences)"
+      AdditionalCub="$(AdditionalCub)" 
+      BackwardsCompatibleGuidGeneration="$(BackwardsCompatibleGuidGeneration)" 
+      BaseInputPaths="$(LinkerBaseInputPaths)"
+      BindFiles="$(LinkerBindFiles)"
+      CabinetCachePath="$(CabinetCachePath)"
+      CabinetCreationThreadCount="$(CabinetCreationThreadCount)"
+      Cultures="%(CultureGroup.Identity)"
+      CustomBinder="$(CustomBinder)"
+      DefaultCompressionLevel="$(DefaultCompressionLevel)"
+      DropUnrealTables="$(DropUnrealTables)"
+      ExactAssemblyVersions="$(ExactAssemblyVersions)"
+      ExtensionDirectory="$(WixExtDir)"
+      Extensions="@(_ResolvedWixExtensionPaths)"
+      Ices="$(Ices)"
+      LeaveTemporaryFiles="$(LeaveTemporaryFiles)"
+      LocalizationFiles="@(EmbeddedResource)"
+      NoLogo="$(LinkerNoLogo)"
+      OutputAsXml="$(OutputAsXml)"
+      OutputFile="$(TargetDir)%(CultureGroup.OutputFolder)$(TargetName)$(TargetExt)"
+      PdbOutputFile="$(PdbOutputFile)"
+      Pedantic="$(LinkerPedantic)"
+      ReferencePaths="$(ReferencePaths)"
+      ReuseCabinetCache="$(ReuseCabinetCache)"
+      RunAsSeparateProcess="$(RunWixToolsOutOfProc)"
+      SetMsiAssemblyNameFileVersion="$(SetMsiAssemblyNameFileVersion)"
+      SuppressAclReset="$(SuppressAclReset)"
+      SuppressAllWarnings="$(LinkerSuppressAllWarnings)"
+      SuppressAssemblies="$(SuppressAssemblies)"
+      SuppressDefaultAdminSequenceActions="$(SuppressDefaultAdminSequenceActions)"
+      SuppressDefaultAdvSequenceActions="$(SuppressDefaultAdvSequenceActions)"
+      SuppressDefaultUISequenceActions="$(SuppressDefaultUISequenceActions)"
+      SuppressFileHashAndInfo="$(SuppressFileHashAndInfo)"
+      SuppressFiles="$(SuppressFiles)"
+      SuppressIntermediateFileVersionMatching="$(LinkerSuppressIntermediateFileVersionMatching)"
+      SuppressIces="$(SuppressIces)"
+      SuppressLayout="$(SuppressLayout)"
+      SuppressLocalization="$(SuppressLocalization)"
+      SuppressMsiAssemblyTableProcessing="$(SuppressMsiAssemblyTableProcessing)"
+      SuppressPdbOutput="$(SuppressPdbOutput)"
+      SuppressSchemaValidation="$(LinkerSuppressSchemaValidation)"
+      SuppressValidation="$(SuppressValidation)"
+      SuppressSpecificWarnings="$(LinkerSuppressSpecificWarnings)"
+      SuppressTagSectionIdAttributeOnTuples="$(SuppressTagSectionIdAttributeOnTuples)"
+      ToolPath="$(WixToolPath)"
+      TreatWarningsAsErrors="$(LinkerTreatWarningsAsErrors)"
+      UnreferencedSymbolsFile="$(UnreferencedSymbolsFile)"
+      VerboseOutput="$(LinkerVerboseOutput)"
+      WixVariables="$(WixVariables)" />
+
+    <GetCabList Database="$(TargetDir)%(CultureGroup.OutputFolder)$(TargetName)$(TargetExt)"
+        Condition="('$(OutputType)' == 'Package' or '$(OutputType)' == 'Module') and '$(OutputAsXml)' != 'true' " >
+      <Output TaskParameter="CabList" PropertyName="OutputCabs" />
+      <Output TaskParameter="CabList" ItemName="FileWrites" />
+    </GetCabList>
+
+    <GetLooseFileList Database="$(TargetDir)%(CultureGroup.OutputFolder)$(TargetName)$(TargetExt)"
+        Condition="('$(OutputType)' == 'Package' or '$(OutputType)' == 'Module') and '$(OutputAsXml)' != 'true' " >
+      <Output TaskParameter="LooseFileList" ItemName="FileWrites" />
+    </GetLooseFileList>
+
+    <CreateItem Include="$(OutputCabs)" >
+      <Output TaskParameter="Include" ItemName="OutputCabList" />
+    </CreateItem>
+   
+  </Target>
+
+  <!--
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  IncrementalClean Targets
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  -->
+
+  <!--
+  ==================================================================================================
+  IncrementalClean
+
+    Remove files that were produced in a prior build but weren't produced in the current build.
+    The reason is that if, for example, the name of the .msi/.msm has changed we want to delete the
+    old copy.
+
+    Leave the Clean cache file containing only the files produced in the current build.
+  ==================================================================================================
+  -->
+  <Target
+    Name="IncrementalClean"
+    DependsOnTargets="_CleanGetCurrentAndPriorFileWrites">
+
+    <!-- Subtract list of files produced in prior builds from list of files produced in this build. -->
+    <CreateItem Include="@(_CleanPriorFileWrites)" Exclude="@(_CleanCurrentFileWrites)">
+      <Output TaskParameter="Include" ItemName="_CleanOrphanFileWrites" />
+    </CreateItem>
+
+    <!-- Find all files in the final output directory. -->
+    <FindUnderPath Path="$(OutDir)" Files="@(_CleanOrphanFileWrites)">
+      <Output TaskParameter="InPath" ItemName="_CleanOrphanFileWritesInOutput" />
+    </FindUnderPath>
+
+    <!-- Find all files in the intermediate output directory. -->
+    <FindUnderPath Path="$(IntermediateOutputPath)" Files="@(_CleanOrphanFileWrites)">
+      <Output TaskParameter="InPath" ItemName="_CleanOrphanFileWritesInIntermediate" />
+    </FindUnderPath>
+
+    <!-- Delete the orphaned files. -->
+    <Delete
+      Files="@(_CleanOrphanFileWritesInIntermediate);@(_CleanOrphanFileWritesInOutput)"
+      TreatErrorsAsWarnings="true">
+
+      <Output TaskParameter="DeletedFiles" ItemName="_CleanOrphanFilesDeleted" />
+    </Delete>
+
+    <!-- Create a list of everything that wasn't deleted. -->
+    <CreateItem Include="@(_CleanPriorFileWrites);@(_CleanCurrentFileWrites)" Exclude="@(_CleanOrphanFilesDeleted)">
+      <Output TaskParameter="Include" ItemName="_CleanRemainingFileWritesAfterIncrementalClean" />
+    </CreateItem>
+
+    <!-- Remove duplicates. -->
+    <RemoveDuplicates Inputs="@(_CleanRemainingFileWritesAfterIncrementalClean)">
+      <Output TaskParameter="Filtered" ItemName="_CleanUniqueRemainingFileWritesAfterIncrementalClean" />
+    </RemoveDuplicates>
+
+    <!-- Make sure the directory exists. -->
+    <MakeDir Directories="$(IntermediateOutputPath)" />
+
+    <!-- Write new list of current files back to disk, replacing the existing list.-->
+    <WriteLinesToFile
+      File="$(IntermediateOutputPath)$(CleanFile)"
+      Lines="@(_CleanUniqueRemainingFileWritesAfterIncrementalClean)"
+      Overwrite="true" />
+
+  </Target>
+
+  <!--
+  ==================================================================================================
+  _CleanGetCurrentAndPriorFileWrites
+
+    Get the list of files built in the current build and in prior builds.
+  ==================================================================================================
+  -->
+  <Target
+    Name="_CleanGetCurrentAndPriorFileWrites"
+    DependsOnTargets="_CheckForCompileAndLinkOutputs">
+
+    <!-- Read the list of files produced by a prior builds from disk. -->
+    <ReadLinesFromFile File="$(IntermediateOutputPath)$(CleanFile)">
+      <Output TaskParameter="Lines" ItemName="_CleanPriorFileWrites" />
+    </ReadLinesFromFile>
+
+    <!-- Find all files in the final output directory. -->
+    <FindUnderPath Path="$(OutDir)" Files="@(FileWrites)">
+      <Output TaskParameter="InPath" ItemName="_CleanCurrentFileWritesInOutput" />
+    </FindUnderPath>
+
+    <!-- Find all files in the intermediate output directory. -->
+    <FindUnderPath Path="$(IntermediateOutputPath)" Files="@(FileWrites)">
+      <Output TaskParameter="InPath" ItemName="_CleanCurrentFileWritesInIntermediate" />
+    </FindUnderPath>
+
+    <!-- Remove duplicates from files produced in this build. -->
+    <RemoveDuplicates Inputs="@(_CleanCurrentFileWritesInOutput);@(_CleanCurrentFileWritesInIntermediate)">
+      <Output TaskParameter="Filtered" ItemName="_CleanCurrentFileWrites" />
+    </RemoveDuplicates>
+
+  </Target>
+
+  <!--
+  ==================================================================================================
+  _CheckForCompileAndLinkOutputs
+
+    Checks each file output from the main CompileAndLink target to make sure they really exist.
+    If they do, then record them in the clean cache.
+  ==================================================================================================
+  -->
+  <Target Name="_CheckForCompileAndLinkOutputs">
+
+    <!--Record the main compile outputs -->
+    <CreateItem Include="@(CompileObjOutput)" Condition="Exists('%(FullPath)')">
+      <Output TaskParameter="Include" ItemName="FileWrites" />
+    </CreateItem>
+
+    <!-- Record the link ouput(s) -->
+    <!-- Stuff into an itemgroup -->
+    <CreateItem Include="$(TargetPath);$(TargetPdbPath)">
+      <Output TaskParameter="Include" ItemName="_TempTargetOutputs" />
+    </CreateItem>
+
+    <CreateItem Include="@(_TempTargetOutputs)" Condition="Exists('%(FullPath)')">
+      <Output TaskParameter="Include" ItemName="FileWrites" />
+    </CreateItem>
+  </Target>
+
+  <!--
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  Clean Targets
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  -->
+
+  <!--
+  ==================================================================================================
+  Clean
+
+    Delete all intermediate and final build outputs.
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <CleanDependsOn>
+      BeforeClean;
+      CleanReferencedProjects;
+      CoreClean;
+      AfterClean
+    </CleanDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="Clean"
+    DependsOnTargets="$(CleanDependsOn)" />
+
+  <!--
+  ==================================================================================================
+  BeforeClean
+
+    Redefine this target in your project in order to run tasks just before Clean.
+  ==================================================================================================
+  -->
+  <Target Name="BeforeClean" />
+
+  <!--
+  ==================================================================================================
+  AfterClean
+
+    Redefine this target in your project in order to run tasks just after Clean.
+  ==================================================================================================
+  -->
+  <Target Name="AfterClean" />
+
+  <!--
+  ==================================================================================================
+  CleanReferencedProjects
+
+    Call Clean target on all Referenced Projects.
+  ==================================================================================================
+  -->
+  <Target
+    Name="CleanReferencedProjects">
+
+    <!-- TODO -->
+    <!--
+    When building the project directly from the command-line, clean those referenced projects that
+    exist on disk. For IDE builds and command-line .SLN builds, the solution build manager takes
+    care of this.
+    -->
+    <!--MSBuild
+      Projects="@(_MSBuildProjectReferenceExistent)"
+      Targets="Clean"
+      Condition=" '$(BuildingInsideVisualStudio)' != 'true' and '$(BuildingSolutionFile)' != 'true' and '@(_MSBuildProjectReferenceExistent)' != '' " /-->
+
+  </Target>
+
+  <!--
+  ==================================================================================================
+  CoreClean
+
+    Cleans all of the compile and link outputs as well as any intermediate files generated along
+    the way.
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <CoreCleanDependsOn></CoreCleanDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="CoreClean"
+    DependsOnTargets="$(CoreCleanDependsOn)">
+
+    <!-- Read in list of files that were written to disk in past builds. -->
+    <ReadLinesFromFile File="$(IntermediateOutputPath)$(CleanFile)">
+      <Output TaskParameter="Lines" ItemName="_CleanPriorFileWrites" />
+    </ReadLinesFromFile>
+
+    <!-- Find all files in the final output directory. -->
+    <FindUnderPath Path="$(OutDir)" Files="@(_CleanPriorFileWrites)">
+      <Output TaskParameter="InPath" ItemName="_CleanPriorFileWritesInOutput" />
+    </FindUnderPath>
+
+    <!-- Find all files in the intermediate output directory. -->
+    <FindUnderPath Path="$(IntermediateOutputPath)" Files="@(_CleanPriorFileWrites)">
+      <Output TaskParameter="InPath" ItemName="_CleanPriorFileWritesInIntermediate" />
+    </FindUnderPath>
+
+    <!-- Delete those files. -->
+    <Delete Files="@(_CleanPriorFileWritesInOutput);@(_CleanPriorFileWritesInIntermediate)" TreatErrorsAsWarnings="true">
+      <Output TaskParameter="DeletedFiles" ItemName="_CleanPriorFileWritesDeleted" />
+    </Delete>
+
+    <!-- Create a list of everything that wasn't deleted. -->
+    <CreateItem Include="@(_CleanPriorFileWrites)" Exclude="@(_CleanPriorFileWritesDeleted)">
+      <Output TaskParameter="Include" ItemName="_CleanRemainingFileWritesAfterClean" />
+    </CreateItem>
+
+    <!-- Remove duplicates. -->
+    <RemoveDuplicates Inputs="@(_CleanRemainingFileWritesAfterClean)">
+      <Output TaskParameter="Filtered" ItemName="_CleanUniqueRemainingFileWrites" />
+    </RemoveDuplicates>
+
+    <!-- Make sure the directory exists. -->
+    <MakeDir Directories="$(IntermediateOutputPath)" />
+
+    <!-- Write new list of current files back to disk. -->
+    <WriteLinesToFile File="$(IntermediateOutputPath)$(CleanFile)" Lines="@(_CleanUniqueRemainingFileWrites)" Overwrite="true" />
+
+  </Target>
+
+  <!--
+  ==================================================================================================
+  _CleanRecordFileWrites
+
+    Save the list of all files written to disk so that it can be used for "Clean" later.
+    Files written in prior builds are not removed from Clean cache.
+  ==================================================================================================
+  -->
+  <Target
+    Name="_CleanRecordFileWrites"
+    DependsOnTargets="_CleanGetCurrentAndPriorFileWrites">
+
+    <!-- Merge list of files from prior builds with the current build and then remove duplicates. -->
+    <RemoveDuplicates Inputs="@(_CleanPriorFileWrites);@(_CleanCurrentFileWrites)">
+      <Output TaskParameter="Filtered" ItemName="_CleanUniqueFileWrites" />
+    </RemoveDuplicates>
+
+    <!-- Make sure the directory exists. -->
+    <MakeDir Directories="$(IntermediateOutputPath)" />
+
+    <!-- Write merged file list back to disk, replacing existing contents. -->
+    <WriteLinesToFile
+        File="$(IntermediateOutputPath)$(CleanFile)"
+        Lines="@(_CleanUniqueFileWrites)"
+        Overwrite="true" />
+
+  </Target>
+
+  <!--
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  PostBuildEvent Targets
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  -->
+
+  <!--
+  ==================================================================================================
+  PostBuildEvent
+
+    Run the post-build event. This step is driven by two parameters:
+
+    1) $(RunPostBuildEvent) is set by the user through the IDE and can be one of four values:
+       1) OnBuildSuccess: In this case, every step of the build must succeed for the post-build
+          step to run.
+       2) <Blank>: This is the same as OnBuildSuccess.
+       3) OnOutputUpdated: In this case, the post-build step will run only if the main output was
+          actually updated.
+       4) Always: The post-build step is always run.
+
+    2) $(_TargetOutputTimestampBeforeCompileAndLink) and $(_TargetOutputTimestampAfterCompileAndLink)
+       are set by the _TimeStampBeforeCompileAndLink and _TimeStampAfterCompileAndLink targets. If
+       the output was actually rebuilt during this build, then the two values will be different.
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <PostBuildEventDependsOn>GetTargetPath</PostBuildEventDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="PostBuildEvent"
+    Condition=" '$(PostBuildEvent)' != '' and
+      ( '$(RunPostBuildEvent)' != 'OnOutputUpdated' or '$(_TargetOutputTimestampBeforeCompileAndLink)' != '$(_TargetOutputTimestampAfterCompileAndLink)' )"
+    DependsOnTargets="$(PostBuildEventDependsOn)">
+
+    <ReplaceString
+      Text="$(PostBuildEvent)"
+      OldValue="!(TargetPath)"
+      NewValue="$(TargetPath)">
+      
+      <Output TaskParameter="Text" PropertyName="ExpandedPostBuildEvent" />
+    </ReplaceString>
+
+    <ReplaceString
+      Text="$(ExpandedPostBuildEvent)"
+      OldValue="!(TargetPdbPath)"
+      NewValue="$(TargetPdbPath)">
+      
+      <Output TaskParameter="Text" PropertyName="ExpandedPostBuildEvent" />
+    </ReplaceString>
+
+    <Exec WorkingDirectory="$(OutDir)" Command="$(ExpandedPostBuildEvent)" />
+  </Target>
+
+  <!--
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  AllProjectOutputGroups Section
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  -->
+
+  <!--
+  ==================================================================================================
+  AllProjectOutputGroups
+
+    The targets below drive output groups, which provide generic information about a
+    project's inputs (e.g., content files, compilation sources, etc.) and built outputs
+    (e.g., built EXE/DLL, PDB, XML documentation files, etc.)
+
+    Each target may produce two kinds of items:  outputs and dependencies. Outputs are
+    items from the current project; dependencies are items that are brought into the
+    current project as a result of referencing other projects or components.
+
+    For both outputs and dependencies, the Include attribute
+    specifies the location of the output/dependency; it must be a full path. Any number
+    of additional attributes may be placed on an output/dependency item.
+  ==================================================================================================
+  -->
+  <Target
+    Name="AllProjectOutputGroups"
+    DependsOnTargets="
+      BuiltProjectOutputGroup;
+      DebugSymbolsProjectOutputGroup;
+      DocumentationProjectOutputGroup;
+      SatelliteDllsProjectOutputGroup;
+      SourceFilesProjectOutputGroup;
+      ContentFilesProjectOutputGroup;
+      SGenFilesOutputGroup" />
+
+  <!-- 
+  This is the key output for the BuiltProjectOutputGroup and is meant to be read directly from the IDE.
+  Reading an item is faster than invoking a target.
+  -->
+  <ItemGroup>
+    <BuiltProjectOutputGroupKeyOutput Include="$(TargetPath)">
+      <IsKeyOutput>true</IsKeyOutput>
+      <FinalOutputPath>$(TargetPath)</FinalOutputPath>
+      <TargetPath>$(TargetFileName)</TargetPath>
+    </BuiltProjectOutputGroupKeyOutput>
+  </ItemGroup>
+  
+  
+
+  <!--
+  ==================================================================================================
+  BuiltProjectOutputGroup
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <BuiltProjectOutputGroupDependsOn>PrepareForBuild;AssignCultures</BuiltProjectOutputGroupDependsOn>
+    <AddAppConfigToBuildOutputs Condition="('$(AddAppConfigToBuildOutputs)' == '') and ('$(OutputType)' != 'library')">true</AddAppConfigToBuildOutputs>
+  </PropertyGroup>
+  <Target
+    Name="BuiltProjectOutputGroup"
+    Outputs="@(BuiltProjectOutputGroupOutput)"
+    DependsOnTargets="$(BuiltProjectOutputGroupDependsOn)">
+
+    <!-- Don't add BuiltProjectOutputGroupKeyOutput - to avoid duplicates, we only want to get the updated list of TargetPaths from the TargetPath property below -->
+
+    <!-- Convert intermediate items into final items; this way we can get the full path for each item -->
+    <CreateItem Include="@(_BuiltProjectOutputGroupOutputIntermediate->'%(FullPath)')">
+      <Output TaskParameter="Include" ItemName="BuiltProjectOutputGroupOutput" />
+    </CreateItem>
+
+    <!-- Include build output(s).  Different than predefined itemgroup since AssignCultures target may change it -->
+    <CreateItem
+      Include="$(TargetPath)">
+      <Output TaskParameter="Include" ItemName="BuiltProjectOutputGroupOutput" />
+    </CreateItem>
+
+    <GetCabList Database="@(BuiltProjectOutputGroupKeyOutput)" Condition="('$(OutputType)' == 'Package' or '$(OutputType)' == 'Module')">
+      <Output TaskParameter="CabList" ItemName="BuiltProjectOutputGroupOutput" />
+    </GetCabList>
+
+    <GetLooseFileList Database="@(BuiltProjectOutputGroupKeyOutput)" Condition="('$(OutputType)' == 'Package' or '$(OutputType)' == 'Module')" >
+      <Output TaskParameter="LooseFileList" ItemName="BuiltProjectOutputGroupOutput" />
+    </GetLooseFileList>
+  </Target>
+
+  <!--
+  ==================================================================================================
+  DebugSymbolsProjectOutputGroup
+
+    Populates the Debug Symbols project output group.
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <DebugSymbolsProjectOutputGroupDependsOn>AssignCultures</DebugSymbolsProjectOutputGroupDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="DebugSymbolsProjectOutputGroup"
+    Outputs="@(DebugSymbolsProjectOutputGroupOutput)"
+    DependsOnTargets="$(DebugSymbolsProjectOutputGroupDependsOn)">
+
+    <!-- Include build output pdb(s).  Different than predefined itemgroup since AssignCultures target may change -->
+    <CreateItem
+      Include="$(TargetPdbPath)"
+      Condition=" '$(SuppressPdbOutput)' != 'true' ">
+      <Output TaskParameter="Include" ItemName="DebugSymbolsProjectOutputGroupOutput" />
+    </CreateItem>
+  </Target>
+
+  <!--
+  ==================================================================================================
+  DocumentationProjectOutputGroup
+
+    Populates the Documentation project output group.
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <DocumentationProjectOutputGroupDependsOn></DocumentationProjectOutputGroupDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="DocumentationProjectOutputGroup"
+    Outputs="@(DocumentationProjectOutputGroupOutput)"
+    DependsOnTargets="$(DocumentationProjectOutputGroupDependsOn)" />
+
+  <!--
+  ==================================================================================================
+  SatelliteDllsProjectOutputGroup
+
+    Populates the Satellite Files project output group.
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <SatelliteDllsProjectOutputGroupDependsOn>PrepareForBuild</SatelliteDllsProjectOutputGroupDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="SatelliteDllsProjectOutputGroup"
+    Outputs="@(SatelliteDllsProjectOutputGroupOutput)"
+    DependsOnTargets="$(SatelliteDllsProjectOutputGroupDependsOn)" />
+
+  <!--
+  ==================================================================================================
+  SourceFilesProjectOutputGroup
+
+    Populates the Source Files project output group.
+    Source files are items in the project whose type is "Compile" and "EmbeddedResource".
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <SourceFilesProjectOutputGroupDependsOn>PrepareForBuild</SourceFilesProjectOutputGroupDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="SourceFilesProjectOutputGroup"
+    Outputs="@(SourceFilesProjectOutputGroupOutput)"
+    DependsOnTargets="$(SourceFilesProjectOutputGroupDependsOn)">
+
+    <AssignTargetPath Files="@(Compile)" RootFolder="$(MSBuildProjectDirectory)">
+      <Output TaskParameter="AssignedFiles" ItemName="_CompileWithTargetPath"  />
+    </AssignTargetPath>
+
+    <AssignTargetPath Files="@(EmbeddedResource)" RootFolder="$(MSBuildProjectDirectory)">
+      <Output TaskParameter="AssignedFiles" ItemName="_EmbeddedResourceWithTargetPath" />
+    </AssignTargetPath>
+
+    <!-- First we deal with Compile and EmbeddedResource -->
+    <CreateItem Include="@(_CompileWithTargetPath->'%(FullPath)');@(_EmbeddedResourceWithTargetPath->'%(FullPath)')">
+      <Output TaskParameter="Include" ItemName="SourceFilesProjectOutputGroupOutput" />
+    </CreateItem>
+
+    <!-- Include the project file -->
+    <CreateItem Include="$(MSBuildProjectFullPath)" AdditionalMetadata="TargetPath=$(ProjectFileName)">
+      <Output TaskParameter="Include" ItemName="SourceFilesProjectOutputGroupOutput" />
+    </CreateItem>
+
+  </Target>
+
+  <!--
+  ==================================================================================================
+  ContentFilesProjectOutputGroup
+
+    Populates the Content Files project output group.
+    Content files are items in the project whose type is "Content".
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <ContentFilesProjectOutputGroupDependsOn>PrepareForBuild</ContentFilesProjectOutputGroupDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="ContentFilesProjectOutputGroup"
+    Outputs="@(ContentFilesProjectOutputGroupOutput)"
+    DependsOnTargets="$(ContentFilesProjectOutputGroupDependsOn)">
+
+    <AssignTargetPath Files="@(Content)" RootFolder="$(MSBuildProjectDirectory)">
+      <Output TaskParameter="AssignedFiles" ItemName="ContentWithTargetPath" />
+    </AssignTargetPath>
+
+    <!-- Convert items into final items; this way we can get the full path for each item. -->
+    <CreateItem Include="@(ContentWithTargetPath->'%(FullPath)')">
+      <Output TaskParameter="Include" ItemName="ContentFilesProjectOutputGroupOutput" />
+    </CreateItem>
+
+  </Target>
+
+  <!--
+  ==================================================================================================
+  SGenFilesOutputGroup
+
+    Populates the GenerateSerializationAssemblies Files project output group.
+    GenerateSerializationAssemblies files are those generated by the GenerateSerializationAssemblies
+    target and task.
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <SGenFilesOutputGroupDependsOn></SGenFilesOutputGroupDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="SGenFilesOutputGroup"
+    Outputs="@(SGenFilesOutputGroupOutput)"
+    DependsOnTargets="$(SGenFilesOutputGroupDependsOn)" />
+
+  <!-- Extension point: Define CustomAfterWixTargets to a .targets file that you want to include after this file. -->
+  <Import Project="$(CustomAfterWixTargets)" Condition=" '$(CustomAfterWixTargets)' != '' and Exists('$(CustomAfterWixTargets)')" />
+
+  <!-- MSBuildToolsVersion is set for MSBuild 3.5 and later, which is a requirement for lux.targets. -->
+  <Import Project="$(LuxTargetsPath)" Condition=" '$(MSBuildToolsVersion)' != '' and '$(LuxTargetsPath)' != '' and Exists('$(LuxTargetsPath)')" />
+</Project>
diff --git a/wix2010.targets b/wix2010.targets
new file mode 100644
index 0000000..883c91b
--- /dev/null
+++ b/wix2010.targets
@@ -0,0 +1,2692 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+****************************************************************************************************
+wix.targets
+
+WARNING:  DO NOT MODIFY this file unless you are knowledgeable about MSBuild and have
+          created a backup copy.  Incorrect changes to this file will make it
+          impossible to load or build your projects from the command-line or the IDE.
+
+This file defines the steps in the standard build process for WiX projects (.wixproj).
+
+Conventions:
+  * Targets and properties that start with an underscore (_) are considered private and should not
+    be used outside of this file.
+
+Coding Conventions:
+  * Two-space indentation of nested elements
+
+  * Self-closing elements should have a space before the /> ("<MyProperty />")
+
+  * Conditions should have a space before and after the "" and between any operators. For example:
+    <MyProperty Condition=" '$(MyProperty)' == '' ">Value</MyProperty>
+
+  * Targets should have each attribute on a single line and indented by two spaces. Also, there
+    should be a blank line between the Target and the beginning of the contents (a blank line is
+    optional before the closing </Target> tag).
+    For example:
+    <Target
+      Name="MyTarget"
+      DependsOnTargets="$(MyTargetDependsOn)">
+
+      <Message Importance="low" Text="MyTarget is doing something." />
+    </Target>
+
+Copyright (c) Microsoft Corporation. All rights reserved.
+****************************************************************************************************
+-->
+<Project
+  xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
+  InitialTargets="_CheckForInvalidConfigurationAndPlatform;
+                  _CheckRequiredProperties">
+  <!--
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  Extension Points
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  -->
+
+  <!-- Allow a user-customized targets files to be used as part of the build. -->
+  <PropertyGroup>
+    <UserTargetsPath>$(MSBuildProjectFullPath).user</UserTargetsPath>
+  </PropertyGroup>
+  <Import Project="$(UserTargetsPath)" Condition="Exists('$(UserTargetsPath)')" />
+  <Import Project="$(CustomBeforeWixTargets)" Condition=" '$(CustomBeforeWixTargets)' != '' and Exists('$(CustomBeforeWixTargets)')" />
+
+  <!-- These properties can be overridden to support non-default installations. -->
+  <PropertyGroup>
+    <WixTargetsPath Condition=" '$(WixTargetsPath)' == '' AND '$(MSBuildExtensionsPath32)' != '' ">$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
+    <WixTasksPath Condition=" '$(WixTasksPath)' == '' AND '$(MSBuildExtensionsPath32)' != '' ">$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\WixTasks.dll</WixTasksPath>
+    <WixTargetsPath Condition=" '$(WixTargetsPath)' == '' ">$(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
+    <WixTasksPath Condition=" '$(WixTasksPath)' == '' ">$(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\WixTasks.dll</WixTasksPath>
+    <LuxTargetsPath Condition=" '$(LuxTargetsPath)' == '' AND '$(MSBuildExtensionsPath32)' != '' ">$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Lux.targets</LuxTargetsPath>
+    <LuxTasksPath Condition=" '$(LuxTasksPath)' == '' AND '$(MSBuildExtensionsPath32)' != '' ">$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\LuxTasks.dll</LuxTasksPath>
+    <LuxTargetsPath Condition=" '$(LuxTargetsPath)' == '' ">$(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Lux.targets</LuxTargetsPath>
+    <LuxTasksPath Condition=" '$(LuxTasksPath)' == '' ">$(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\LuxTasks.dll</LuxTasksPath>
+  </PropertyGroup>
+
+  <!-- This makes the project files a dependency of all targets so that things rebuild if they change -->
+  <PropertyGroup> 
+    <MSBuildAllProjects Condition="Exists('$(MSBuildProjectFullPath)')">$(MSBuildAllProjects);$(MSBuildProjectFullPath)</MSBuildAllProjects>
+    <MSBuildAllProjects Condition="Exists('$(WixTargetsPath)')">$(MSBuildAllProjects);$(WixTargetsPath)</MSBuildAllProjects>
+    <MSBuildAllProjects Condition="Exists('$(LuxTargetsPath)')">$(MSBuildAllProjects);$(LuxTargetsPath)</MSBuildAllProjects>
+    <MSBuildAllProjects Condition="Exists('$(UserTargetsPath)')">$(MSBuildAllProjects);$(UserTargetsPath)</MSBuildAllProjects>
+    <MSBuildAllProjects Condition="Exists('$(CustomBeforeWixTargets)')">$(MSBuildAllProjects);$(CustomBeforeWixTargets)</MSBuildAllProjects>
+    <MSBuildAllProjects Condition="Exists('$(CustomAfterWixTargets)')">$(MSBuildAllProjects);$(CustomAfterWixTargets)</MSBuildAllProjects>
+  </PropertyGroup>
+
+  <!--
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  Property Declarations
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  -->
+
+  <!-- These tasks can be used as general-purpose build tasks. -->
+  <UsingTask TaskName="Candle" AssemblyFile="$(WixTasksPath)" />
+  <UsingTask TaskName="Insignia" AssemblyFile="$(WixTasksPath)" />
+  <UsingTask TaskName="Lit" AssemblyFile="$(WixTasksPath)" />
+  <UsingTask TaskName="Light" AssemblyFile="$(WixTasksPath)" />
+  <UsingTask TaskName="Torch" AssemblyFile="$(WixTasksPath)" />
+
+  <!-- These tasks are extensions for harvesting WiX source code from other sources. -->
+  <UsingTask TaskName="HeatFile" AssemblyFile="$(WixTasksPath)" />
+  <UsingTask TaskName="HeatDirectory" AssemblyFile="$(WixTasksPath)" />
+  <UsingTask TaskName="HeatProject" AssemblyFile="$(WixTasksPath)" />
+
+  <!-- These tasks are specific to the build process defined in this file, and are not considered general-purpose build tasks. -->
+  <UsingTask TaskName="AssignProjectConfiguration" AssemblyName="Microsoft.Build.Tasks.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <UsingTask TaskName="AssignTargetPath" AssemblyName="Microsoft.Build.Tasks.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <UsingTask TaskName="ResolveNonMSBuildProjectOutput" AssemblyName="Microsoft.Build.Tasks.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <UsingTask TaskName="ResolveVCProjectOutput" AssemblyName="Microsoft.Build.Tasks.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+
+  <UsingTask TaskName="CreateProjectReferenceDefineConstants" AssemblyFile="$(WixTasksPath)" />
+  <UsingTask TaskName="WixAssignCulture" AssemblyFile="$(WixTasksPath)" />
+  <UsingTask TaskName="ResolveWixReferences" AssemblyFile="$(WixTasksPath)"/>
+  <UsingTask TaskName="ReplaceString" AssemblyFile="$(WixTasksPath)"/>
+  <UsingTask TaskName="GetCabList" AssemblyFile="$(WixTasksPath)" />
+  <UsingTask TaskName="GetLooseFileList" AssemblyFile="$(WixTasksPath)" />
+  <UsingTask TaskName="RefreshGeneratedFile" AssemblyFile="$(WixTasksPath)"/>
+  <UsingTask TaskName="RefreshBundleGeneratedFile" AssemblyFile="$(WixTasksPath)"/>
+
+  <!-- WiX tools are 32bit EXEs, so run them out-of-proc when MSBuild is not 32bit. -->
+  <PropertyGroup>
+    <RunWixToolsOutOfProc Condition=" '$(PROCESSOR_ARCHITECTURE)'!='x86' ">true</RunWixToolsOutOfProc>
+  </PropertyGroup>
+
+  <!--
+  Several properties must be set in the main project file, before using this .targets file.
+  However, if the properties are not set, we pick some defaults.
+
+  OutDir:
+  Indicates the final output location for the project or solution. When building a solution,
+  OutDir can be used to gather multiple project outputs in one location. In addition,
+  OutDir is included in AssemblySearchPaths used for resolving references.
+
+  OutputPath:
+  This property is usually specified in the project file and is used to initialize OutDir.
+  OutDir and OutputPath are distinguished for legacy reasons, and OutDir should be used if at all possible.
+
+  BaseIntermediateOutputPath:
+  This is the top level folder where all configuration specific intermediate output folders will be created.
+  Default value is obj\
+
+  IntermediateOutputPath:
+  This is the full intermediate Output Path, and is derived from BaseIntermediateOutputPath, if none specified
+  (eg. obj\debug). If this property is overridden, then setting BaseIntermediateOutputPath has no effect.
+  -->
+
+  <PropertyGroup>
+    <!-- Ensure any OutputPath has a trailing slash, so it can be concatenated -->
+    <OutputPath Condition="'$(OutputPath)' != '' and !HasTrailingSlash('$(OutputPath)')">$(OutputPath)\</OutputPath>
+    <AssemblyName Condition=" '$(AssemblyName)'=='' ">$(MSBuildProjectName)</AssemblyName>
+    <!--
+    Be careful not to give OutputPath a default value in the case of an invalid Configuration/Platform.
+    We use OutputPath specifically to check for invalid configurations/platforms.
+    -->
+    <OutputPath Condition=" '$(Platform)'=='' and '$(Configuration)'=='' and '$(OutputPath)'=='' ">bin\Debug\</OutputPath>
+    <_OriginalConfiguration>$(Configuration)</_OriginalConfiguration>
+    <_OriginalPlatform>$(Platform)</_OriginalPlatform>
+    <Configuration Condition=" '$(Configuration)'=='' ">Debug</Configuration>
+    <ConfigurationName Condition=" '$(ConfigurationName)' == '' ">$(Configuration)</ConfigurationName>      <!-- Example, Debug -->
+    <Platform Condition=" '$(Platform)'=='' ">AnyCPU</Platform>
+    <_OriginalOutputType>$(OutputType)</_OriginalOutputType>
+    <OutputType Condition=" '$(OutputType)' == '' ">Package</OutputType>
+    <BuildProjectReferences Condition="'$(BuildProjectReferences)' == ''">true</BuildProjectReferences>
+  </PropertyGroup>
+
+  <PropertyGroup Condition=" '$(OutputPath)' == '' ">
+      <!--
+      A blank OutputPath at this point means that the user passed in an invalid Configuration/Platform
+      combination.  Whether this is considered an error or a warning depends on the value of
+      $(SkipInvalidConfigurations).
+      -->
+      <_InvalidConfigurationError Condition=" '$(SkipInvalidConfigurations)' != 'true' ">true</_InvalidConfigurationError>
+      <_InvalidConfigurationWarning Condition=" '$(SkipInvalidConfigurations)' == 'true' ">true</_InvalidConfigurationWarning>
+  </PropertyGroup>
+
+  <!-- Properties for the intermediate object output -->
+  <PropertyGroup>
+    <BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">obj\</BaseIntermediateOutputPath>
+    <BaseIntermediateOutputPath Condition="!HasTrailingSlash('$(BaseIntermediateOutputPath)')">$(BaseIntermediateOutputPath)\</BaseIntermediateOutputPath>
+    <IntermediateExt Condition=" '$(IntermediateExt)' == '' ">.wixobj</IntermediateExt>
+    <CleanFile Condition=" '$(CleanFile)' == '' ">$(MSBuildProjectFile).FileList.txt</CleanFile>
+  </PropertyGroup>
+
+  <PropertyGroup Condition=" $(IntermediateOutputPath) == '' ">
+      <IntermediateOutputPath Condition=" '$(PlatformName)' == 'AnyCPU' ">$(BaseIntermediateOutputPath)$(Configuration)\</IntermediateOutputPath>
+      <IntermediateOutputPath Condition=" '$(PlatformName)' != 'AnyCPU' ">$(BaseIntermediateOutputPath)$(PlatformName)\$(Configuration)\</IntermediateOutputPath>
+  </PropertyGroup>
+  <PropertyGroup>
+      <IntermediateOutputPath Condition="!HasTrailingSlash('$(IntermediateOutputPath)')">$(IntermediateOutputPath)\</IntermediateOutputPath>
+  </PropertyGroup>
+  <ItemGroup>
+      <IntermediateAssembly Include="$(IntermediateOutputPath)$(TargetName)$(TargetExt)"/>
+      <FinalDocFile Include="@(DocFileItem->'$(OutDir)%(Filename)%(Extension)')"/>
+  </ItemGroup>
+
+  <PropertyGroup>
+    <WixToolPath Condition=" '$(WixToolPath)' == ''">$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Installer XML\3.5@InstallRoot)</WixToolPath>
+    <WixToolPath Condition=" '$(WixToolPath)' == ''">$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows Installer XML\3.5@InstallRoot)</WixToolPath>
+    <WixExtDir Condition=" '$(WixExtDir)' == ''">$(WixToolPath)</WixExtDir>
+  </PropertyGroup>
+
+  <!--
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  IDE Macro Property Declarations
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  -->
+
+  <!--
+  IDE Macros available from both integrated builds and from command line builds.
+  The following properties are 'macros' that are available via IDE for pre and post build steps.
+  All of them should be added to WixBuildMacroCollection to ensure that they are shown in the UI.
+  -->
+  <PropertyGroup>
+    <TargetExt Condition=" '$(OutputType)' == 'Package' ">.msi</TargetExt>
+    <TargetExt Condition=" '$(OutputType)' == 'Module' ">.msm</TargetExt>
+    <TargetExt Condition=" '$(OutputType)' == 'PatchCreation' ">.pcp</TargetExt>
+    <TargetExt Condition=" '$(OutputType)' == 'Library' ">.wixlib</TargetExt>
+    <TargetExt Condition=" '$(OutputType)' == 'Bundle' ">.exe</TargetExt>
+  </PropertyGroup>
+
+  <PropertyGroup>
+    <!-- Example, bin\Debug\ -->
+    <OutDir Condition=" '$(OutDir)' == '' ">$(OutputPath)</OutDir>
+    <!-- Ensure OutDir has a trailing slash, so it can be concatenated -->
+    <OutDir Condition=" '$(OutDir)' != '' and !HasTrailingSlash('$(OutDir)') ">$(OutDir)\</OutDir>
+
+    <!-- Example, MySetup -->
+    <ProjectName Condition=" '$(ProjectName)' == '' ">$(MSBuildProjectName)</ProjectName>
+
+    <!-- Example, MySetup.wixproj -->
+    <ProjectFileName Condition=" '$(ProjectFileName)' == '' ">$(MSBuildProjectFile)</ProjectFileName>
+
+    <!-- Example, .wixproj -->
+    <ProjectExt Condition=" '$(ProjectExt)' == '' ">$(MSBuildProjectExtension)</ProjectExt>
+
+    <!-- Example, c:\MyProjects\MySetup\ -->
+    <ProjectDir Condition=" '$(ProjectDir)' == '' ">$(MSBuildProjectDirectory)\</ProjectDir>
+
+    <!-- Example, c:\MyProjects\MySetup\MySetup.msi -->
+    <ProjectPath Condition=" '$(ProjectPath)' == '' ">$(ProjectDir)$(ProjectFileName)</ProjectPath>
+
+    <!-- Example, .wixpdb -->
+    <TargetPdbExt Condition=" '$(TargetPdbExt)' == '' ">.wixpdb</TargetPdbExt>
+
+    <!-- Example, MySetup -->
+    <TargetName Condition=" '$(TargetName)' == '' ">$(OutputName)</TargetName>
+
+    <!-- Example, MySetup.msi -->
+    <TargetFileName Condition=" '$(TargetFileName)' == '' ">$(TargetName)$(TargetExt)</TargetFileName>
+
+    <!-- Example, MySetup.wixpdb" -->
+    <TargetPdbName Condition=" '$(TargetPdbName)' == '' ">$(TargetName)$(TargetPdbExt)</TargetPdbName>
+
+    <!-- Example, Debug -->
+    <ConfigurationName Condition=" '$(ConfigurationName)' == '' ">$(Configuration)</ConfigurationName>
+
+    <!-- Example, AnyCPU -->
+    <PlatformName Condition=" '$(PlatformName)' == '' ">$(Platform)</PlatformName>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <!-- Create the output path as an item so that we can use %(FullPath) on it. -->
+    <_OutputPathItem Include="$(OutDir)" />
+    <_IntermediateOutputPathItem Include="$(IntermediateOutputPath)" />
+  </ItemGroup>
+
+  <PropertyGroup>
+    <!-- Example, c:\MyProjects\MySetup\bin\debug\ -->
+    <!--
+    Condition intentionally omitted on this one, because it causes problems
+    when we pick up the value of an environment variable named TargetDir
+    -->
+    <TargetDir Condition="'$(OutDir)' != ''">$([System.IO.Path]::GetFullPath(`$([System.IO.Path]::Combine(`$(MSBuildProjectDirectory)`, `$(OutDir)`))`))</TargetDir>
+
+    <!-- Example, C:\MyProjects\MySetup\bin\debug\MySetup.msi -->
+    <TargetPath Condition=" '$(TargetPath)' == '' ">$(TargetDir)$(TargetFileName)</TargetPath>
+
+    <TargetPdbPath Condition=" '$(TargetPdbPath)' == '' ">$(TargetDir)$(TargetPdbName)</TargetPdbPath>
+  </PropertyGroup>
+
+  <!--
+  IDE Macros available only from integrated builds. The following properties are 'macros' that are
+  available via IDE for pre and post build steps. However, they are not defined when directly
+  building a project from the command line, only when building a solution.
+  -->
+  <PropertyGroup>
+    <DevEnvDir Condition=" '$(DevEnvDir)' == '' ">*Undefined if not building from within Visual Studio*</DevEnvDir>
+
+    <!-- Example, MySolution -->
+    <SolutionName Condition=" '$(SolutionName)' == '' ">*Undefined if not building a solution or within Visual Studio*</SolutionName>
+
+    <!-- Example, MySolution.sln -->
+    <SolutionFileName Condition=" '$(SolutionFileName)' == '' ">*Undefined if not building a solution or within Visual Studio*</SolutionFileName>
+
+    <!-- Example, C:\MySolutions\MySolution\MySolution.sln -->
+    <SolutionPath Condition=" '$(SolutionPath)' == '' ">*Undefined if not building a solution or within Visual Studio*</SolutionPath>
+
+    <!-- Example, C:\MySolutions\MySolution\ -->
+    <SolutionDir Condition=" '$(SolutionDir)' == '' ">*Undefined if not building a solution or within Visual Studio*</SolutionDir>
+
+    <!-- Example, .sln -->
+    <SolutionExt Condition=" '$(SolutionExt)' == '' ">*Undefined if not building a solution or within Visual Studio*</SolutionExt>
+  </PropertyGroup>
+
+  <!--
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  Default Harvester, Compiler, Linker, and Librarian Property Declarations
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  -->
+
+  <!-- If WixExtension was passed in via the command line, then convert it to an ItemGroup -->
+  <ItemGroup>
+    <WixExtension Include="$(WixExtension)"  Condition=" '$(WixExtension)' != '' " />
+  </ItemGroup>
+
+  <!-- Default Harvester properties-->
+  <PropertyGroup>
+    <HarvestNoLogo Condition=" '$(HarvestNoLogo)' == '' ">$(NoLogo)</HarvestNoLogo>
+    <HarvestSuppressAllWarnings Condition=" '$(HarvestSuppressAllWarnings)' == '' ">$(SuppressAllWarnings)</HarvestSuppressAllWarnings>
+    <HarvestSuppressSpecificWarnings Condition=" '$(HarvestSuppressSpecificWarnings)' == '' ">$(SuppressSpecificWarnings)</HarvestSuppressSpecificWarnings>
+    <HarvestTreatWarningsAsErrors Condition=" '$(HarvestTreatWarningsAsErrors)' == '' ">$(TreatWarningsAsErrors)</HarvestTreatWarningsAsErrors>
+    <HarvestTreatSpecificWarningsAsErrors Condition=" '$(HarvestTreatSpecificWarningsAsErrors)' == '' ">$(TreatSpecificWarningsAsErrors)</HarvestTreatSpecificWarningsAsErrors>
+    <HarvestVerboseOutput Condition=" '$(HarvestVerboseOutput)' == '' ">$(VerboseOutput)</HarvestVerboseOutput>
+    <HarvestAutogenerateGuids Condition=" '$(HarvestAutogenerateGuids)' == '' ">true</HarvestAutogenerateGuids>
+    <HarvestGenerateGuidsNow Condition=" '$(HarvestGenerateGuidsNow)' == '' ">false</HarvestGenerateGuidsNow>
+    <HarvestSuppressFragments Condition=" '$(HarvestSuppressFragments)' == '' ">true</HarvestSuppressFragments>
+    <HarvestSuppressUniqueIds Condition=" '$(HarvestSuppressUniqueIds)' == '' ">false</HarvestSuppressUniqueIds>
+  </PropertyGroup>
+
+  <!-- Default HarvestProjects properties -->
+  <PropertyGroup>
+    <HarvestProjectsNoLogo Condition=" '$(HarvestProjectsNoLogo)' == '' ">$(HarvestNoLogo)</HarvestProjectsNoLogo>
+    <HarvestProjectsSuppressAllWarnings Condition=" '$(HarvestProjectsSuppressAllWarnings)' == '' ">$(HarvestSuppressAllWarnings)</HarvestProjectsSuppressAllWarnings>
+    <HarvestProjectsSuppressSpecificWarnings Condition=" '$(HarvestProjectsSuppressSpecificWarnings)' == '' ">$(HarvestSuppressSpecificWarnings)</HarvestProjectsSuppressSpecificWarnings>
+    <HarvestProjectsTreatWarningsAsErrors Condition=" '$(HarvestProjectsTreatWarningsAsErrors)' == '' ">$(HarvestTreatWarningsAsErrors)</HarvestProjectsTreatWarningsAsErrors>
+    <HarvestProjectsTreatSpecificWarningsAsErrors Condition=" '$(HarvestProjectsTreatSpecificWarningsAsErrors)' == '' ">$(HarvestTreatSpecificWarningsAsErrors)</HarvestProjectsTreatSpecificWarningsAsErrors>
+    <HarvestProjectsVerboseOutput Condition=" '$(HarvestProjectsVerboseOutput)' == '' ">$(HarvestVerboseOutput)</HarvestProjectsVerboseOutput>
+    <HarvestProjectsAutogenerateGuids Condition=" '$(HarvestProjectsAutogenerateGuids)' == '' ">$(HarvestAutogenerateGuids)</HarvestProjectsAutogenerateGuids>
+    <HarvestProjectsGenerateGuidsNow Condition=" '$(HarvestProjectsGenerateGuidsNow)' == '' ">$(HarvestGenerateGuidsNow)</HarvestProjectsGenerateGuidsNow>
+    <HarvestProjectsSuppressFragments Condition=" '$(HarvestProjectsSuppressFragments)' == '' ">$(HarvestSuppressFragments)</HarvestProjectsSuppressFragments>
+    <HarvestProjectsSuppressUniqueIds Condition=" '$(HarvestProjectsSuppressUniqueIds)' == '' ">$(HarvestSuppressUniqueIds)</HarvestProjectsSuppressUniqueIds>
+    <HarvestProjectsTransforms Condition=" '$(HarvestProjectsTransforms)' == '' ">$(HarvestTransforms)</HarvestProjectsTransforms>
+    <HarvestProjectsGeneratedFile Condition=" '$(HarvestProjectsGeneratedFile)' == '' and '$(OutputType)' != 'Bundle' ">$(IntermediateOutputPath)Product.Generated.wxs</HarvestProjectsGeneratedFile>
+    <HarvestProjectsGeneratedFile Condition=" '$(HarvestProjectsGeneratedFile)' == '' and '$(OutputType)' == 'Bundle' ">$(IntermediateOutputPath)Bundle.Generated.wxs</HarvestProjectsGeneratedFile>
+  </PropertyGroup>
+
+  <!-- Default HarvestDirectory properties -->
+  <PropertyGroup>
+    <HarvestDirectoryNoLogo Condition=" '$(HarvestDirectoryNoLogo)' == '' ">$(HarvestNoLogo)</HarvestDirectoryNoLogo>
+    <HarvestDirectorySuppressAllWarnings Condition=" '$(HarvestDirectorySuppressAllWarnings)' == '' ">$(HarvestSuppressAllWarnings)</HarvestDirectorySuppressAllWarnings>
+    <HarvestDirectorySuppressSpecificWarnings Condition=" '$(HarvestDirectorySuppressSpecificWarnings)' == '' ">$(HarvestSuppressSpecificWarnings)</HarvestDirectorySuppressSpecificWarnings>
+    <HarvestDirectoryTreatWarningsAsErrors Condition=" '$(HarvestDirectoryTreatWarningsAsErrors)' == '' ">$(HarvestTreatWarningsAsErrors)</HarvestDirectoryTreatWarningsAsErrors>
+    <HarvestDirectoryTreatSpecificWarningsAsErrors Condition=" '$(HarvestDirectoryTreatSpecificWarningsAsErrors)' == '' ">$(HarvestTreatSpecificWarningsAsErrors)</HarvestDirectoryTreatSpecificWarningsAsErrors>
+    <HarvestDirectoryVerboseOutput Condition=" '$(HarvestDirectoryVerboseOutput)' == '' ">$(HarvestVerboseOutput)</HarvestDirectoryVerboseOutput>
+    <HarvestDirectoryAutogenerateGuids Condition=" '$(HarvestDirectoryAutogenerateGuids)' == '' ">$(HarvestAutogenerateGuids)</HarvestDirectoryAutogenerateGuids>
+    <HarvestDirectoryGenerateGuidsNow Condition=" '$(HarvestDirectoryGenerateGuidsNow)' == '' ">$(HarvestGenerateGuidsNow)</HarvestDirectoryGenerateGuidsNow>
+    <HarvestDirectorySuppressFragments Condition=" '$(HarvestDirectorySuppressFragments)' == '' ">$(HarvestSuppressFragments)</HarvestDirectorySuppressFragments>
+    <HarvestDirectorySuppressUniqueIds Condition=" '$(HarvestDirectorySuppressUniqueIds)' == '' ">$(HarvestSuppressUniqueIds)</HarvestDirectorySuppressUniqueIds>
+    <HarvestDirectoryTransforms Condition=" '$(HarvestDirectoryTransforms)' == '' ">$(HarvestTransforms)</HarvestDirectoryTransforms>
+  </PropertyGroup>
+
+  <!-- Default HarvestFile properties -->
+  <PropertyGroup>
+    <HarvestFileNoLogo Condition=" '$(HarvestFileNoLogo)' == '' ">$(HarvestNoLogo)</HarvestFileNoLogo>
+    <HarvestFileSuppressAllWarnings Condition=" '$(HarvestFileSuppressAllWarnings)' == '' ">$(HarvestSuppressAllWarnings)</HarvestFileSuppressAllWarnings>
+    <HarvestFileSuppressSpecificWarnings Condition=" '$(HarvestFileSuppressSpecificWarnings)' == '' ">$(HarvestSuppressSpecificWarnings)</HarvestFileSuppressSpecificWarnings>
+    <HarvestFileTreatWarningsAsErrors Condition=" '$(HarvestFileTreatWarningsAsErrors)' == '' ">$(HarvestTreatWarningsAsErrors)</HarvestFileTreatWarningsAsErrors>
+    <HarvestFileTreatSpecificWarningsAsErrors Condition=" '$(HarvestFileTreatSpecificWarningsAsErrors)' == '' ">$(HarvestTreatSpecificWarningsAsErrors)</HarvestFileTreatSpecificWarningsAsErrors>
+    <HarvestFileVerboseOutput Condition=" '$(HarvestFileVerboseOutput)' == '' ">$(HarvestVerboseOutput)</HarvestFileVerboseOutput>
+    <HarvestFileAutogenerateGuids Condition=" '$(HarvestFileAutogenerateGuids)' == '' ">$(HarvestAutogenerateGuids)</HarvestFileAutogenerateGuids>
+    <HarvestFileGenerateGuidsNow Condition=" '$(HarvestFileGenerateGuidsNow)' == '' ">$(HarvestGenerateGuidsNow)</HarvestFileGenerateGuidsNow>
+    <HarvestFileSuppressFragments Condition=" '$(HarvestFileSuppressFragments)' == '' ">$(HarvestSuppressFragments)</HarvestFileSuppressFragments>
+    <HarvestFileSuppressUniqueIds Condition=" '$(HarvestFileSuppressUniqueIds)' == '' ">$(HarvestSuppressUniqueIds)</HarvestFileSuppressUniqueIds>
+    <HarvestFileTransforms Condition=" '$(HarvestFileTransforms)' == '' ">$(HarvestTransforms)</HarvestFileTransforms>
+  </PropertyGroup>
+
+  <!-- Defaut Compiler properties. -->
+  <PropertyGroup>
+    <CompilerNoLogo Condition=" '$(CompilerNoLogo)' == '' ">$(NoLogo)</CompilerNoLogo>
+    <CompilerSuppressAllWarnings Condition=" '$(CompilerSuppressAllWarnings)' == '' ">$(SuppressAllWarnings)</CompilerSuppressAllWarnings>
+    <CompilerSuppressSpecificWarnings Condition=" '$(CompilerSuppressSpecificWarnings)' == '' ">$(SuppressSpecificWarnings)</CompilerSuppressSpecificWarnings>
+    <CompilerSuppressSchemaValidation Condition=" '$(CompilerSuppressSchemaValidation)' == '' ">$(SuppressSchemaValidation)</CompilerSuppressSchemaValidation>
+    <CompilerTreatWarningsAsErrors Condition=" '$(CompilerTreatWarningsAsErrors)' == '' ">$(TreatWarningsAsErrors)</CompilerTreatWarningsAsErrors>
+    <CompilerTreatSpecificWarningsAsErrors Condition=" '$(CompilerTreatSpecificWarningsAsErrors)' == '' ">$(TreatSpecificWarningsAsErrors)</CompilerTreatSpecificWarningsAsErrors>
+    <CompilerVerboseOutput Condition=" '$(CompilerVerboseOutput)' == '' ">$(VerboseOutput)</CompilerVerboseOutput>
+    <InstallerPlatform Condition=" '$(InstallerPlatform)' == '' and '$(Platform)' != 'AnyCPU' and '$(Platform)' != 'Any CPU' ">$(Platform)</InstallerPlatform>
+  </PropertyGroup>
+
+  <!-- Default Lib properties. -->
+  <PropertyGroup>
+    <LibNoLogo Condition=" '$(LibNoLogo)' == '' ">$(NoLogo)</LibNoLogo>
+    <LibBindFiles Condition=" '$(LibBindFiles)' == '' ">$(BindFiles)</LibBindFiles>
+    <LibPedantic Condition=" '$(LibPedantic)' == '' ">$(Pedantic)</LibPedantic>
+    <LibSuppressAllWarnings Condition=" '$(LibSuppressAllWarnings)' == '' ">$(SuppressAllWarnings)</LibSuppressAllWarnings>
+    <LibSuppressSpecificWarnings Condition=" '$(LibSuppressSpecificWarnings)' == '' ">$(SuppressSpecificWarnings)</LibSuppressSpecificWarnings>
+    <LibSuppressSchemaValidation Condition=" '$(LibSuppressSchemaValidation)' == '' ">$(SuppressSchemaValidation)</LibSuppressSchemaValidation>
+    <LibSuppressIntermediateFileVersionMatching Condition=" '$(LibSuppressIntermediateFileVersionMatching)' == '' ">$(SuppressIntermediateFileVersionMatching)</LibSuppressIntermediateFileVersionMatching>
+    <LibTreatWarningsAsErrors Condition=" '$(LibTreatWarningsAsErrors)' == '' ">$(TreatWarningsAsErrors)</LibTreatWarningsAsErrors>
+    <LibTreatSpecificWarningsAsErrors Condition=" '$(LibTreatSpecificWarningsAsErrors)' == '' ">$(TreatSpecificWarningsAsErrors)</LibTreatSpecificWarningsAsErrors>
+    <LibVerboseOutput Condition=" '$(LibVerboseOutput)' == '' ">$(VerboseOutput)</LibVerboseOutput>
+  </PropertyGroup>
+
+  <!-- Default Linker properties. -->
+  <PropertyGroup>
+    <LinkerNoLogo Condition=" '$(LinkerNoLogo)' == '' ">$(NoLogo)</LinkerNoLogo>
+    <LinkerBaseInputPaths Condition=" '$(LinkerBaseInputPaths)' == '' ">$(BaseInputPaths)</LinkerBaseInputPaths>
+    <LinkerBindFiles Condition=" '$(LinkerBindFiles)' == '' ">$(BindFiles)</LinkerBindFiles>
+    <LinkerPedantic Condition=" '$(LinkerPedantic)' == '' ">$(Pedantic)</LinkerPedantic>
+    <LinkerSuppressAllWarnings Condition=" '$(LinkerSuppressAllWarnings)' == '' ">$(SuppressAllWarnings)</LinkerSuppressAllWarnings>
+    <LinkerSuppressSpecificWarnings Condition=" '$(LinkerSuppressSpecificWarnings)' == '' ">$(SuppressSpecificWarnings)</LinkerSuppressSpecificWarnings>
+    <LinkerSuppressSchemaValidation Condition=" '$(LinkerSuppressSchemaValidation)' == '' ">$(SuppressSchemaValidation)</LinkerSuppressSchemaValidation>
+    <LinkerSuppressIntermediateFileVersionMatching Condition=" '$(LinkerSuppressIntermediateFileVersionMatching)' == '' ">$(SuppressIntermediateFileVersionMatching)</LinkerSuppressIntermediateFileVersionMatching>
+    <LinkerTreatWarningsAsErrors Condition=" '$(LinkerTreatWarningsAsErrors)' == '' ">$(TreatWarningsAsErrors)</LinkerTreatWarningsAsErrors>
+    <LinkerTreatSpecificWarningsAsErrors Condition=" '$(LinkerTreatSpecificWarningsAsErrors)' == '' ">$(TreatSpecificWarningsAsErrors)</LinkerTreatSpecificWarningsAsErrors>
+    <LinkerVerboseOutput Condition=" '$(LinkerVerboseOutput)' == '' ">$(VerboseOutput)</LinkerVerboseOutput>
+  </PropertyGroup>
+
+  <!-- Default Inscribe properties. -->
+  <PropertyGroup>
+    <InscribeNoLogo Condition=" '$(InscribeNoLogo)' == '' ">$(NoLogo)</InscribeNoLogo>
+    <InscribeSuppressAllWarnings Condition=" '$(InscribeSuppressAllWarnings)' == '' ">$(SuppressAllWarnings)</InscribeSuppressAllWarnings>
+    <InscribeSuppressSpecificWarnings Condition=" '$(InscribeSuppressSpecificWarnings)' == '' ">$(SuppressSpecificWarnings)</InscribeSuppressSpecificWarnings>
+    <InscribeTreatWarningsAsErrors Condition=" '$(InscribeTreatWarningsAsErrors)' == '' ">$(TreatWarningsAsErrors)</InscribeTreatWarningsAsErrors>
+    <InscribeTreatSpecificWarningsAsErrors Condition=" '$(InscribeTreatSpecificWarningsAsErrors)' == '' ">$(TreatSpecificWarningsAsErrors)</InscribeTreatSpecificWarningsAsErrors>
+    <InscribeVerboseOutput Condition=" '$(InscribeVerboseOutput)' == '' ">$(VerboseOutput)</InscribeVerboseOutput>
+  </PropertyGroup>
+  <!--
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  Initial Targets
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  -->
+
+  <!--
+  ============================================================
+                                      _CheckForInvalidConfigurationAndPlatform
+
+  This target checks for errors in statically defined properties.  It always
+  gets executed before any other target.
+  ============================================================
+  -->
+  <Target
+      Name="_CheckForInvalidConfigurationAndPlatform">
+
+      <Error Condition=" '$(_InvalidConfigurationError)' == 'true' " Text="The OutputPath property is not set for this project.  Please check to make sure that you have specified a valid Configuration/Platform combination.  Configuration='$(_OriginalConfiguration)'  Platform='$(_OriginalPlatform)'"/>
+      <Warning Condition=" '$(_InvalidConfigurationWarning)' == 'true' " Text="The OutputPath property is not set for this project.  Please check to make sure that you have specified a valid Configuration/Platform combination.  Configuration='$(_OriginalConfiguration)'  Platform='$(_OriginalPlatform)'"/>
+
+      <Message Text="Configuration=$(Configuration)" Importance="Low" />
+      <Message Text="Platform=$(Platform)" Importance="Low" />
+
+      <!-- Although we try to ensure a trailing slash, it's possible to circumvent this if the property is set on the command line -->
+      <Error Condition="'$(OutDir)' != '' and !HasTrailingSlash('$(OutDir)')" Text="The OutDir property must end with a trailing slash." />
+      <Error Condition="'$(BaseIntermediateOutputPath)' != '' and !HasTrailingSlash('$(BaseIntermediateOutputPath)')" Text="The BaseIntermediateOutputPath must end with a trailing slash." />
+      <Error Condition="'$(IntermediateOutputPath)' != '' and !HasTrailingSlash('$(IntermediateOutputPath)')" Text="The IntermediateOutputPath must end with a trailing slash." />
+  </Target>
+
+
+  <!--
+  ==================================================================================================
+  _CheckRequiredProperties
+
+    Checks properties that must be set in the main project file or on the command line before
+    using this .TARGETS file.
+
+    [IN]
+    $(OutputName) - The name of the MSI/MSM/wixlib to build (without the extension)
+    $(OutputType) - Possible values are 'package', 'PatchCreation', 'module', 'library', 'bundle'
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <_PleaseSetThisInProjectFile>Please set this in the project file before the &lt;Import&gt; of the wix.targets file.</_PleaseSetThisInProjectFile>
+    <_OutputTypeDescription>The OutputType defines whether a Windows Installer package (.msi), PatchCreation (.pcp), merge module (.msm), wix library (.wixlib), or self-extracting executable (.exe) is being built. $(_PleaseSetThisInProjectFile) Possible values are 'Package', 'Module', 'Library', and 'Bundle'.</_OutputTypeDescription>
+  </PropertyGroup>
+  <Target Name="_CheckRequiredProperties">
+
+    <Error
+      Code="WIXTARGETS100"
+      Condition=" '$(OutputName)' == '' "
+      Text="The OutputName property is not set in project &quot;$(MSBuildProjectFile)&quot;. The OutputName defines the name of the output without a file extension. $(_PleaseSetThisInProjectFile)" />
+
+    <Warning
+      Code="WIXTARGETS101"
+      Condition=" '$(_OriginalOutputType)' == '' "
+      Text="The OutputType property is not set in project &quot;$(MSBuildProjectFile)&quot;. Defaulting to 'Package'. $(_OutputTypeDescription)" />
+
+    <Error
+      Code="WIXTARGETS102"
+      Condition=" '$(OutputType)' != 'Package' and '$(OutputType)' != 'PatchCreation' and '$(OutputType)' != 'Module' and '$(OutputType)' != 'Library' and '$(OutputType)' != 'Bundle' "
+      Text="The OutputType property '$(OutputType)' is not valid in project &quot;$(MSBuildProjectFile)&quot;. $(_OutputTypeDescription)" />
+
+    <!-- Although we try to ensure a trailing slash, it's possible to circumvent this if the property is set on the command line -->
+    <Error
+      Code="WIXTARGETS103"
+      Condition="'$(OutDir)' != '' and !HasTrailingSlash('$(OutDir)')"
+      Text="The OutDir property must end with a trailing slash." />
+
+  </Target>
+
+  <!--
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  Build Targets
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  -->
+
+  <!--
+  ==================================================================================================
+  Build
+
+    The main build entry point.
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <BuildDependsOn>
+      BeforeBuild;
+      CoreBuild;
+      AfterBuild
+    </BuildDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="Build"
+    DependsOnTargets="$(BuildDependsOn)"
+    Outputs="$(TargetPath)">
+  </Target>
+
+  <!--
+  ==================================================================================================
+  BeforeBuild
+
+    Redefine this target in your project in order to run tasks just before Build.
+  ==================================================================================================
+  -->
+  <Target Name="BeforeBuild" />
+
+  <!--
+  ==================================================================================================
+  AfterBuild
+
+    Redefine this target in your project in order to run tasks just after Build.
+  ==================================================================================================
+  -->
+  <Target Name="AfterBuild" />
+
+  <!--
+  ==================================================================================================
+  CoreBuild
+
+    The core build step calls each of the build targets.
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <CoreBuildDependsOn>
+      BuildOnlySettings;
+      PrepareForBuild;
+      PreBuildEvent;
+      ResolveReferences;
+      AddCompilerDefineConstants;
+      CompileAndLink;
+      Signing;
+      GetTargetPath;
+      IncrementalClean;
+      PostBuildEvent
+    </CoreBuildDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="CoreBuild"
+    DependsOnTargets="$(CoreBuildDependsOn)">
+
+    <OnError
+      ExecuteTargets="_TimeStampAfterCompileAndLink;PostBuildEvent"
+      Condition=" '$(RunPostBuildEvent)' == 'Always' or '$(RunPostBuildEvent)' == 'OnOutputUpdated' " />
+
+    <OnError ExecuteTargets="_CleanRecordFileWrites" />
+
+  </Target>
+
+  <!--
+  ==================================================================================================
+  Rebuild
+
+    Delete all intermediate and final build outputs, and then build the project from scratch.
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <RebuildDependsOn>
+      BeforeRebuild;
+      Clean;
+      $(MSBuildProjectDefaultTargets);
+      AfterRebuild;
+    </RebuildDependsOn>
+
+    <RebuildDependsOn Condition=" '$(MSBuildProjectDefaultTargets)' == 'Rebuild' ">
+      BeforeRebuild;
+      Clean;
+      Build;
+      AfterRebuild;
+    </RebuildDependsOn>
+  </PropertyGroup>
+
+  <Target
+    Name="Rebuild"
+    DependsOnTargets="$(RebuildDependsOn)"
+    Outputs="$(TargetPath)" />
+
+  <!--
+  ==================================================================================================
+  BeforeRebuild
+
+    Redefine this target in your project in order to run tasks just before Rebuild.
+  ==================================================================================================
+  -->
+  <Target Name="BeforeRebuild" />
+
+  <!--
+  ==================================================================================================
+  AfterRebuild
+
+    Redefine this target in your project in order to run tasks just after Rebuild.
+  ==================================================================================================
+  -->
+  <Target Name="AfterRebuild" />
+
+  <!--
+  ==================================================================================================
+  BuildOnlySettings
+
+    This target is called only when doing a real build. It is not called during project load.
+  ==================================================================================================
+    -->
+  <PropertyGroup>
+    <BuildingProject>false</BuildingProject>
+  </PropertyGroup>
+  <Target Name="BuildOnlySettings">
+
+    <CreateProperty Value="true">
+      <Output TaskParameter="Value" PropertyName="BuildingProject" />
+    </CreateProperty>
+
+  </Target>
+
+  <!--
+  ==================================================================================================
+  PrepareForBuild
+
+    Prepare the prerequisites for building.
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <PrepareForBuildDependsOn></PrepareForBuildDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="PrepareForBuild" DependsOnTargets="$(PrepareForBuildDependsOn)">
+
+    <!--
+    These CreateProperty calls are required because TargetDir and TargetPath are defined
+    to contain an item list. We want that item list to be expanded so that it can be used
+    as a regular property value and not as an item-list-with-transform.
+    -->
+    <CreateProperty Value="$(TargetDir)">
+      <Output TaskParameter="Value" PropertyName="TargetDir" />
+    </CreateProperty>
+
+    <CreateProperty Value="$(TargetPath)">
+      <Output TaskParameter="Value" PropertyName="TargetPath" />
+    </CreateProperty>
+
+    <CreateProperty Value="$(TargetPdbPath)">
+      <Output TaskParameter="Value" PropertyName="TargetPdbPath" />
+    </CreateProperty>
+
+    <!-- Create the directories for intermediate and final build products. -->
+    <MakeDir Directories="$(IntermediateOutputPath);$(OutDir)" />
+  </Target>
+
+  <!--
+  ==================================================================================================
+  ResolveWixExtensionReferences
+
+    Resolves WiX extension references to full paths. Any properties you use
+    to resolve paths to extensions must be defined before importing this
+    file or the extensions will be automatically resolved to $(WixExtDir).
+
+    [IN]
+    @(WixExtension) - WixExtension item group
+
+    [OUT]
+    @(_ResolvedWixExtensionPaths) - Item group with full paths to extensions
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <ResolveWixExtensionReferencesDependsOn>
+      PrepareForBuild
+    </ResolveWixExtensionReferencesDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="ResolveWixExtensionReferences"
+    DependsOnTargets="$(ResolveWixExtensionReferencesDependsOn)"
+    Condition=" '@(WixExtension)' != ''">
+
+    <!--
+    The WixExtensionSearchPaths property is set to find assemblies in the following order:
+
+        (1) $(ReferencePaths) - the reference paths property, which comes from the .USER file.
+        (2) The hintpath from the referenced item itself, indicated by {HintPathFromItem}.
+        (3) Treat the reference's Include as if it were a real file name.
+        (4) Path specified by the WixExtDir property.
+    -->
+    <CreateProperty Condition=" '$(WixExtensionSearchPaths)' == '' " Value="
+      $(ReferencePaths);
+      {HintPathFromItem};
+      {RawFileName};
+      $(WixExtDir)
+      ">
+      <Output TaskParameter="Value" PropertyName="WixExtensionSearchPaths" />
+    </CreateProperty>
+
+    <ResolveWixReferences
+      WixReferences="@(WixExtension)"
+      SearchPaths="$(WixExtensionSearchPaths)"
+      SearchFilenameExtensions=".dll">
+      <Output TaskParameter="ResolvedWixReferences" ItemName="_AllResolvedWixExtensionPaths" />
+    </ResolveWixReferences>
+
+    <!-- Remove duplicate extension items that would cause build errors -->
+    <RemoveDuplicates Inputs="@(_AllResolvedWixExtensionPaths)">
+      <Output TaskParameter="Filtered" ItemName="_ResolvedWixExtensionPaths" />
+    </RemoveDuplicates>
+  </Target>
+
+  <!--
+  ==================================================================================================
+  PreBuildEvent
+
+    Run the pre-build event if there is one.
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <PreBuildEventDependsOn>GetTargetPath</PreBuildEventDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="PreBuildEvent"
+    DependsOnTargets="$(PreBuildEventDependsOn)"
+    Condition=" '$(PreBuildEvent)' != '' ">
+
+    <ReplaceString
+      Text="$(PreBuildEvent)"
+      OldValue="!(TargetPath)"
+      NewValue="$(TargetPath)">
+      
+      <Output TaskParameter="Text" PropertyName="ExpandedPreBuildEvent" />
+    </ReplaceString>
+    
+    <ReplaceString
+      Text="$(ExpandedPreBuildEvent)"
+      OldValue="!(TargetPdbPath)"
+      NewValue="$(TargetPdbPath)">
+      
+      <Output TaskParameter="Text" PropertyName="ExpandedPreBuildEvent" />
+    </ReplaceString>
+
+    <Exec WorkingDirectory="$(OutDir)" Command="$(ExpandedPreBuildEvent)" />
+  </Target>
+
+  <!--
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  Resolve References Targets
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  -->
+
+  <!--
+  ==================================================================================================
+  ResolveReferences
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <ResolveReferencesDependsOn>
+      BeforeResolveReferences;
+      AssignProjectConfiguration;
+      ResolveProjectReferences;
+      ResolveWixLibraryReferences;
+      ResolveWixExtensionReferences;
+      AfterResolveReferences
+    </ResolveReferencesDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="ResolveReferences"
+    DependsOnTargets="$(ResolveReferencesDependsOn)" />
+
+  <!--
+  ==================================================================================================
+  BeforeResolveReferences
+
+    Redefine this target in your project in order to run tasks just before ResolveReferences.
+  ==================================================================================================
+  -->
+  <Target Name="BeforeResolveReferences" />
+
+  <!--
+  ==================================================================================================
+  AfterResolveReferences
+
+    Redefine this target in your project in order to run tasks just after ResolveReferences.
+  ==================================================================================================
+  -->
+  <Target Name="AfterResolveReferences" />
+
+  <!--
+  ==================================================================================================
+  AssignProjectConfiguration
+
+    Assign the appropriate configuration to each project in the list of project references passed in.
+
+    [IN]
+    @(ProjectReference) - the list of all project references
+
+    [OUT]
+    @(_ProjectReferenceWithConfiguration) - the list of project references (MSBuild and potentially VSIP projects)
+  ==================================================================================================
+  -->
+  <Target
+    Name="AssignProjectConfiguration"
+    Condition=" '@(ProjectReference)' != '' ">
+
+    <!-- Assign a project configuration to each project reference if we're building a solution file. -->
+    <AssignProjectConfiguration
+      ProjectReferences="@(ProjectReference)"
+      CurrentProjectConfiguration="$(Configuration)"
+      CurrentProjectPlatform="$(Platform)"
+      SolutionConfigurationContents="$(CurrentSolutionConfigurationContents)">
+
+      <Output TaskParameter="AssignedProjects" ItemName="_ProjectReferenceWithConfiguration" />
+      <Output TaskParameter="UnassignedProjects" ItemName="_ProjectReferenceWithConfiguration"/>
+    </AssignProjectConfiguration>
+
+    <!-- Add in the source project path so that we can have access to it after resolving the output. -->
+    <ItemGroup>
+      <_ProjectReferenceWithConfiguration>
+        <MSBuildSourceProjectFileFullPath>%(FullPath)</MSBuildSourceProjectFileFullPath>
+      </_ProjectReferenceWithConfiguration>
+    </ItemGroup>
+  </Target>
+
+
+  <!--
+  ==================================================================================================
+  _SplitProjectReferencesByFileExistence
+
+    Split referenced projects into two lists: those that exist on  disk and those that don't.
+
+    [IN]
+    @(NonVCProjectReference) - the list of non-VC project references (MSBuild and potentially VSIP projects)
+
+    [OUT]
+    @(_MSBuildProjectReferenceExistent) - the list of non-VC project references that exist on disk
+    @(_MSBuildProjectReferenceNonexistent) - the list of non-VC project references that don't exist on disk
+  ==================================================================================================
+  -->
+  <Target
+    Name="_SplitProjectReferencesByFileExistence">
+
+    <!--
+    Use this task for matching projects with pre-resolved project outputs set by the IDE if building
+    inside the IDE. The IDE only includes non-MSBuild projects in the output list. We'll use MSBuild
+    to resolve MSBuild projects. This task will resolve VSIP (3rd party) project references and
+    create a new item list with only project references to projects in the MSBuild format.
+    -->
+    <ResolveNonMSBuildProjectOutput
+      ProjectReferences="@(_ProjectReferenceWithConfiguration)"
+      PreresolvedProjectOutputs="$(VSIDEResolvedNonMSBuildProjectOutputs)"
+      Condition=" '$(BuildingInsideVisualStudio)' == 'true' and '@(_ProjectReferenceWithConfiguration)'!=''">
+
+      <Output TaskParameter="ResolvedOutputPaths" ItemName="_ResolvedProjectReferencePaths" />
+      <Output TaskParameter="UnresolvedProjectReferences" ItemName="_MSBuildProjectReference" />
+
+    </ResolveNonMSBuildProjectOutput>
+
+    <!--
+    If building from the command line, simply copy the _ProjectReferenceWithConfiguration item list to
+    _MSBuildProjectReference, since we have to assume all non-VC projects are in the MSBuild format.
+    We have no way of building VSIP (3rd party) projects from the command line.
+    -->
+    <ItemGroup>
+      <_MSBuildProjectReference Include="@(_ProjectReferenceWithConfiguration)" Condition="'$(BuildingInsideVisualStudio)'!='true' and '@(_ProjectReferenceWithConfiguration)'!=''"/>
+    </ItemGroup>
+
+    <!-- Break the project list into two lists: those that exist on disk and those that don't. -->
+    <ItemGroup>
+      <_MSBuildProjectReferenceExistent Include="@(_MSBuildProjectReference)" Condition="Exists('%(Identity)')"/>
+      <_MSBuildProjectReferenceNonexistent Include="@(_MSBuildProjectReference)" Condition="!Exists('%(Identity)')"/>
+    </ItemGroup>
+
+  </Target>
+
+  <!--
+  ================================================================================================
+  ResolveProjectReferences
+
+    Builds all of the referenced projects to get their outputs.
+
+    [IN]
+    @(NonVCProjectReference) - The list of non-VC project references.
+
+    [OUT]
+    @(_ProjectReferenceWithConfiguration) - The list of non-VC project references.
+  ================================================================================================
+  -->
+  <Target
+    Name="ResolveProjectReferences"
+    DependsOnTargets="AssignProjectConfiguration;_SplitProjectReferencesByFileExistence"
+    Condition=" '@(_ProjectReferenceWithConfiguration)' != '' ">
+
+    <!--
+    When building this project from the IDE or when building a .sln from the command line, just
+    gather the referenced build outputs. The code that builds the .sln will already have built
+    the project, so there's no need to do it again here.
+    
+    The ContinueOnError setting is here so that, during project load, as much information as
+    possible will be passed to the compilers.
+    -->
+    <MSBuild
+      Projects="@(_MSBuildProjectReferenceExistent)"
+      Targets="GetTargetPath"
+      Properties="%(_MSBuildProjectReferenceExistent.SetConfiguration); %(_MSBuildProjectReferenceExistent.SetPlatform)"
+      Condition="'@(_ProjectReferenceWithConfiguration)'!='' and ('$(BuildingInsideVisualStudio)' == 'true' or '$(BuildProjectReferences)' != 'true') and '@(_MSBuildProjectReferenceExistent)' != ''"
+      ContinueOnError="!$(BuildingProject)">
+
+      <Output TaskParameter="TargetOutputs" ItemName="_ResolvedProjectReferencePaths" />
+      <Output TaskParameter="TargetOutputs" ItemName="_MSBuildResolvedProjectReferencePaths" />
+    </MSBuild>
+
+    <!--
+    Build referenced projects when building from the command line.
+    
+    The $(ProjectReferenceBuildTargets) will normally be blank so that the project's default target
+    is used during a P2P reference. However if a custom build process requires that the referenced
+    project has a different target to build it can be specified.
+    -->
+    <MSBuild
+      Projects="@(_MSBuildProjectReferenceExistent)"
+      Targets="$(ProjectReferenceBuildTargets)"
+      Properties="%(_MSBuildProjectReferenceExistent.SetConfiguration); %(_MSBuildProjectReferenceExistent.SetPlatform)"
+      Condition="'@(_ProjectReferenceWithConfiguration)'!='' and '$(BuildingInsideVisualStudio)' != 'true' and '$(BuildProjectReferences)' == 'true' and '@(_MSBuildProjectReferenceExistent)' != ''">
+
+      <Output TaskParameter="TargetOutputs" ItemName="_ResolvedProjectReferencePaths" />
+      <Output TaskParameter="TargetOutputs" ItemName="_MSBuildResolvedProjectReferencePaths" />
+    </MSBuild>
+
+    <!-- 
+    VC project references must build GetNativeTargetPath because neither GetTargetPath nor the return of the default build
+    target return the output for a native C++ project. 
+    This will not produce duplicate paths because GetNativeTargetPath is mutually exclusive with GetTargetPath & Build TargetOutputs. 
+    -->
+    <MSBuild
+      Projects="@(_MSBuildProjectReferenceExistent)"
+      Targets="GetNativeTargetPath"
+      Properties="%(_MSBuildProjectReferenceExistent.SetConfiguration); %(_MSBuildProjectReferenceExistent.SetPlatform)"
+      Condition="'@(_ProjectReferenceWithConfiguration)'!='' and '%(_MSBuildProjectReferenceExistent.Extension)' == '.vcxproj'">
+
+      <Output TaskParameter="TargetOutputs" ItemName="_ResolvedProjectReferencePaths" />
+      <Output TaskParameter="TargetOutputs" ItemName="_MSBuildResolvedProjectReferencePaths" />
+    </MSBuild>
+    
+    <!-- Issue a warning for each non-existent project. -->
+    <Warning
+      Text="The referenced project '%(_MSBuildProjectReferenceNonexistent.Identity)' does not exist."
+      Condition=" '@(_ProjectReferenceWithConfiguration)' != '' and '@(_MSBuildProjectReferenceNonexistent)'!=''"/>
+
+    <!-- Create list of all .wixlib project references-->
+    <CreateItem
+      Include="@(_ResolvedProjectReferencePaths)"
+      Condition=" '%(Extension)' == '.wixlib' ">
+
+      <Output TaskParameter="Include" ItemName="WixLibProjects" />
+    </CreateItem>
+
+  </Target>
+
+  <!--
+  ================================================================================================
+  GetTargetPath
+
+    This stand-alone target returns the name of the build product (i.e. MSI, MSM) that would be
+    produced if we built this project.
+  ================================================================================================
+  -->
+  <PropertyGroup>
+    <GetTargetPathDependsOn>
+      PrepareForBuild;
+      AssignCultures
+    </GetTargetPathDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="GetTargetPath"
+    DependsOnTargets="$(GetTargetPathDependsOn)"
+    Outputs="$(TargetPath)" />
+
+  <!--
+  ============================================================
+  GetResolvedReferencePaths
+  This allows the Referenced Projects to return more information than the build output.
+  ============================================================
+  -->
+  <Target
+    Name="GetResolvedReferencePaths"
+    Outputs="$(ResolvedTargetPath)" />
+
+  <!--
+  ================================================================================================
+  ResolveWixLibraryReferences
+
+    Resolve the library references to full paths.
+
+    [IN]
+    @(WixLibrary) - The list of .wixlib files.
+    
+    [OUT]
+    @(_ResolvedWixLibraryPaths) - Item group with full paths to libraries
+  ================================================================================================
+  -->
+  <PropertyGroup>
+    <ResolveWixLibraryReferencesDependsOn>
+      PrepareForBuild;
+    </ResolveWixLibraryReferencesDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="ResolveWixLibraryReferences"
+    DependsOnTargets="$(ResolveWixLibraryReferencesDependsOn)"
+    Condition=" '@(WixLibrary)' != ''">
+
+    <!--
+    The WixLibrarySearchPaths property is set to find assemblies in the following order:
+
+        (1) $(ReferencePaths) - the reference paths property, which comes from the .USER file.
+        (2) The hintpath from the referenced item itself, indicated by {HintPathFromItem}.
+        (3) Treat the reference's Include as if it were a real file name.
+        (4) Path specified by the WixExtDir property.
+    -->
+    <CreateProperty Condition=" '$(WixLibrarySearchPaths)' == '' " Value="
+      $(ReferencePaths);
+      {HintPathFromItem};
+      {RawFileName};
+      $(WixExtDir)
+      ">
+      <Output TaskParameter="Value" PropertyName="WixLibrarySearchPaths" />
+    </CreateProperty>
+
+    <ResolveWixReferences
+      WixReferences="@(WixLibrary)"
+      SearchPaths="$(WixLibrarySearchPaths)"
+      SearchFilenameExtensions=".wixlib">
+      <Output TaskParameter="ResolvedWixReferences" ItemName="_AllResolvedWixLibraryPaths" />
+    </ResolveWixReferences>
+    
+    <!-- Remove duplicate library items that would cause build errors -->
+    <RemoveDuplicates Inputs="@(_AllResolvedWixLibraryPaths)">
+      <Output TaskParameter="Filtered" ItemName="_ResolvedWixLibraryPaths" />
+    </RemoveDuplicates>
+
+  </Target>
+
+  <!--
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  Compiler Define Targets
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  -->
+
+  <!--
+  ==================================================================================================
+  AddCompilerDefineConstants
+
+    Adds solution and project references to the constants passed into the compiler.
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <AddCompilerDefineConstantsDependsOn>
+      ResolveReferences;
+      AddSolutionDefineConstants;
+      AddProjectReferenceDefineConstants;
+    </AddCompilerDefineConstantsDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="AddCompilerDefineConstants"
+    DependsOnTargets="$(AddCompilerDefineConstantsDependsOn)">
+
+    <CreateProperty Value="
+      Configuration=$(ConfigurationName);
+      OutDir=$(OutDir);
+      Platform=$(PlatformName);
+      ProjectDir=$(ProjectDir);
+      ProjectExt=$(ProjectExt);
+      ProjectFileName=$(ProjectFileName);
+      ProjectName=$(ProjectName);
+      ProjectPath=$(ProjectPath);
+      TargetDir=$(TargetDir);
+      TargetExt=$(TargetExt);
+      TargetFileName=$(TargetFileName);
+      TargetName=$(TargetName);
+      TargetPath=$(TargetPath);
+      ">
+      <Output TaskParameter="Value" PropertyName="ProjectDefineConstants" />
+    </CreateProperty>
+    
+  </Target>
+
+  <!--
+  ==================================================================================================
+  AddSolutionDefineConstants
+
+    Adds solution references to the constants passed into the compiler, but only when building
+    from the Visual Studio IDE or when building a solution file via the command line.
+
+    [OUT]
+    $(SolutionDefineConstants) - the list of solution variables to be passed into the compiler
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <DefineSolutionProperties Condition=" '$(DefineSolutionProperties)' == '' ">true</DefineSolutionProperties>
+  </PropertyGroup>
+  <Target
+    Name="AddSolutionDefineConstants"
+    Condition=" '$(DefineSolutionProperties)' == 'true' ">
+
+    <Warning
+      Text="Solution properties are only available during IDE builds or when building the solution file from the command line. To turn off this warning set &lt;DefineSolutionProperties&gt;false&lt;/DefineSolutionProperties&gt; in your .wixproj file."
+      Condition=" '$(BuildingInsideVisualStudio)' != 'true' and '$(BuildingSolutionFile)' != 'true' " />
+
+    <CreateProperty Value="$(SolutionDefineConstants);DevEnvDir=$(DevEnvDir)" Condition=" '$(DevEnvDir)' != '' ">
+      <Output TaskParameter="Value" PropertyName="SolutionDefineConstants" />
+    </CreateProperty>
+    <CreateProperty Value="$(SolutionDefineConstants);SolutionDir=$(SolutionDir)" Condition=" '$(SolutionDir)' != '' ">
+      <Output TaskParameter="Value" PropertyName="SolutionDefineConstants" />
+    </CreateProperty>
+    <CreateProperty Value="$(SolutionDefineConstants);SolutionExt=$(SolutionExt)" Condition=" '$(SolutionExt)' != '' ">
+      <Output TaskParameter="Value" PropertyName="SolutionDefineConstants" />
+    </CreateProperty>
+    <CreateProperty Value="$(SolutionDefineConstants);SolutionFileName=$(SolutionFileName)" Condition=" '$(SolutionFileName)' != '' ">
+      <Output TaskParameter="Value" PropertyName="SolutionDefineConstants" />
+    </CreateProperty>
+    <CreateProperty Value="$(SolutionDefineConstants);SolutionName=$(SolutionName)" Condition=" '$(SolutionName)' != '' ">
+      <Output TaskParameter="Value" PropertyName="SolutionDefineConstants" />
+    </CreateProperty>
+    <CreateProperty Value="$(SolutionDefineConstants);SolutionPath=$(SolutionPath)" Condition=" '$(SolutionPath)' != '' ">
+      <Output TaskParameter="Value" PropertyName="SolutionDefineConstants" />
+    </CreateProperty>
+
+  </Target>
+
+  <!--
+  ==================================================================================================
+  AddProjectReferenceDefineConstants
+
+    Adds project references to the constants passed into the compiler.
+
+    [IN]
+    @(_ResolvedProjectReferencePaths) - paths to projects' outputs
+    $(VSProjectConfigurations) - map of project names to configurations, provided by VS when building in the IDE
+
+    [OUT]
+    $(ProjectReferenceDefineConstants) - the list of referenced project variables to be passed into the compiler
+  ==================================================================================================
+  -->
+  <Target
+    Name="AddProjectReferenceDefineConstants"
+    Condition=" '@(_ResolvedProjectReferencePaths)' != '' ">
+
+    <CreateProjectReferenceDefineConstants
+      ProjectReferencePaths="@(_ResolvedProjectReferencePaths)"
+      ProjectConfigurations="$(VSProjectConfigurations)">
+
+      <Output TaskParameter="DefineConstants" PropertyName="ProjectReferenceDefineConstants" />
+    </CreateProjectReferenceDefineConstants>
+  </Target>
+
+  <!--
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  CompileAndLink Targets
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  -->
+
+  <!--
+  ==================================================================================================
+  CompileAndLink
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <CompileAndLinkDependsOn>
+      ResolveReferences;
+      BeforeCompileAndLink;
+      _TimeStampBeforeCompileAndLink;
+      ConvertReferences;
+      ConvertBundleReferences;
+      Harvest;
+      GenerateCode;
+      Compile;
+      Lib;
+      Link;
+      _TimeStampAfterCompileAndLink;
+      AfterCompileAndLink
+    </CompileAndLinkDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="CompileAndLink"
+    DependsOnTargets="$(CompileAndLinkDependsOn)" />
+
+  <!--
+  ==================================================================================================
+  BeforeCompileAndLink
+
+    Redefine this target in your project in order to run tasks just before CompileAndLink.
+  ==================================================================================================
+  -->
+  <Target Name="BeforeCompileAndLink" />
+
+  <!--
+  ==================================================================================================
+  AfterCompileAndLink
+
+    Redefine this target in your project in order to run tasks just after CompileAndLink.
+  ==================================================================================================
+  -->
+  <Target Name="AfterCompileAndLink" />
+
+  <!--
+  ==================================================================================================
+  _TimeStampBeforeCompileAndLink
+
+    Record a timestamp so that we can compare it to a new timestamp during PostBuildEvent if
+    necessary.
+  ==================================================================================================
+  -->
+  <Target
+    Name="_TimeStampBeforeCompileAndLink" >
+
+    <CreateItem Include="$(TargetPath)">
+      <Output TaskParameter="Include" ItemName="TargetOutput" />
+    </CreateItem>
+    
+    <CreateItem Include="%(TargetOutput.ModifiedTime)">
+      <Output TaskParameter="Include" PropertyName="_TargetOutputTimestampBeforeCompileAndLink" />
+    </CreateItem>
+
+  </Target>
+
+  <!--
+  ==================================================================================================
+  _TimeStampAfterCompileAndLink
+
+    Take before and after timestamps so that we can compare them (used by post-build events that
+    are set to fire "OnOutputUpdated").
+  ==================================================================================================
+  -->
+  <Target
+    Name="_TimeStampAfterCompileAndLink">
+
+    <CreateItem Include="%(TargetOutput.ModifiedTime)">
+      <Output TaskParameter="Include" PropertyName="_TargetOutputTimestampAfterCompileAndLink" />
+    </CreateItem>
+
+    <!-- if our target path was updated by compile & link, and it's an "inscribe-able" output type,
+         then add it to the list of things to be inscribed -->
+    <CreateItem Include="$(TargetPath)"
+      Condition="'$(_TargetOutputTimestampBeforeCompileAndLink)' != '$(_TargetOutputTimestampAfterCompileAndLink)'
+      and ('$(OutputType)' == 'Package' or '$(OutputType)' == 'PatchCreation' or '$(OutputType)' == 'Module')
+      and '$(InscribeMainOutput)' == 'true'" >
+
+        <Output TaskParameter="Include" ItemName="Inscribe"/>
+    </CreateItem>
+
+  </Target>
+
+  <!--
+  ==================================================================================================
+  Harvest
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <HarvestDependsOn>
+      HarvestProjects;
+      HarvestDirectory;
+      HarvestFile;
+    </HarvestDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="Harvest"
+    DependsOnTargets="$(HarvestDependsOn)" />
+
+  <!--
+  ==================================================================================================
+  GenerateCode
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <GenerateCodeDependsOn>
+      RefreshGeneratedFile;
+      RefreshBundleGeneratedFile
+    </GenerateCodeDependsOn>
+  </PropertyGroup>
+  <Target Name="GenerateCode"
+    DependsOnTargets="$(GenerateCodeDependsOn)" />
+
+  <!--
+  ==================================================================================================
+  Signing
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <SigningDependsOn>
+      CompileAndLink;
+      BeforeSigning;
+      SignCabs;
+      Inscribe;
+      SignMsi;
+      AfterSigning
+    </SigningDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="Signing"
+    DependsOnTargets="$(SigningDependsOn)" />
+
+  <!--
+  ==================================================================================================
+  BeforeSigning
+
+    Redefine this target in your project in order to run tasks just before all signing tasks.
+  ==================================================================================================
+  -->
+  <Target Name="BeforeSigning" />
+
+  <!--
+  ==================================================================================================
+  SignCabs
+
+    Redefine this target in your project in order to sign the cabs of your database.
+  ==================================================================================================
+  -->
+  <Target Name="SignCabs" />
+
+  <!--
+  ==================================================================================================
+  SignMsi
+
+    Redefine this target in your project in order to sign your database, after it has been inscribed
+    with the signatures of your signed cabs
+  ==================================================================================================
+  -->
+  <Target Name="SignMsi" />
+
+  <!--
+  ==================================================================================================
+  AfterSigning
+
+    Redefine this target in your project in order to run tasks just after all signing tasks.
+  ==================================================================================================
+  -->
+  <Target Name="AfterSigning" />
+
+  <!--
+  ================================================================================================
+  ConvertReferences
+
+    Converts project references to HeatProject items to auto generate authoring.
+  ================================================================================================
+  -->
+  <Target
+    Name="ConvertReferences"
+    Condition=" ('$(OutputType)' == 'Package' or '$(OutputType)' == 'PatchCreation' or '$(OutputType)' == 'Module' ) ">
+
+    <ItemGroup>
+      <_HeatProjectReference Include="@(_MSBuildProjectReferenceExistent)" Condition=" '%(_MSBuildProjectReferenceExistent.DoNotHarvest)' == '' ">
+        <DirectoryIds>%(_MSBuildProjectReferenceExistent.RefTargetDir)</DirectoryIds>
+        <ProjectOutputGroups>Binaries;Symbols;Sources;Content;Satellites;Documents</ProjectOutputGroups>
+        <ProjectName>%(_MSBuildProjectReferenceExistent.Name)</ProjectName>
+        <HeatOutput>$(IntermediateOutputPath)_%(_MSBuildProjectReferenceExistent.Filename).wxs</HeatOutput>
+      </_HeatProjectReference>
+      <HeatProject Include="@(_HeatProjectReference)" />
+    </ItemGroup>
+
+    <Error
+      Text="The following files are deprecated and should be removed from your project(s): @(Compile->'%(Identity)', ', ')"
+      Condition=" '%(Compile.GenerateComponentGroups)' != '' " />
+
+    <ItemGroup>
+      <!-- Unconditionally generate Compile items so they are always linked in. -->
+      <Compile Include="$(HarvestProjectsGeneratedFile)" />
+      <_GeneratedFiles Include="$(HarvestProjectsGeneratedFile)" />
+    </ItemGroup>
+
+  </Target>
+
+    <!--
+  ================================================================================================
+  ConvertBundleReferences
+
+    Converts project references in Bundle projects to HeatProject items to auto generate authoring.
+  ================================================================================================
+  -->
+  <Target
+    Name="ConvertBundleReferences"
+    Condition=" ('$(OutputType)' == 'Bundle')">
+
+    <ItemGroup>
+      <_HeatProjectReference Include="@(_MSBuildProjectReferenceExistent)" Condition=" '%(_MSBuildProjectReferenceExistent.DoNotHarvest)' == '' ">
+        <ProjectOutputGroups>Binaries;Symbols;Sources;Content;Satellites;Documents</ProjectOutputGroups>
+        <GenerateType>payloadgroup</GenerateType>
+        <HeatOutput>$(IntermediateOutputPath)_%(_MSBuildProjectReferenceExistent.Filename).wxs</HeatOutput>
+      </_HeatProjectReference>
+      <HeatProject Include="@(_HeatProjectReference)" />
+    </ItemGroup>
+
+    <Error
+      Text="The following files are deprecated and should be removed from your project(s): @(Compile->'%(Identity)', ', ')"
+      Condition=" '%(Compile.GenerateComponentGroups)' != '' " />
+
+    <ItemGroup>
+      <!-- Unconditionally generate Compile items so they are always linked in. -->
+      <Compile Include="$(HarvestProjectsGeneratedFile)" />
+      <_GeneratedFiles Include="$(HarvestProjectsGeneratedFile)" />
+    </ItemGroup>
+
+  </Target>
+
+  <!--
+  ================================================================================================
+  CombineHarvestProjects
+
+    Combines HeatProject and HarvestProject items together and ensures each has HeatOutput metadata.
+  ================================================================================================
+  -->
+  <Target Name="CombineHarvestProjects"
+    Condition=" '@(HeatProject)' != '' or '@(HarvestProject)' != '' ">
+
+    <!-- Add default HeatOutputs for those without one specified -->
+    <CreateItem Include="@(HeatProject)" Condition= " '%(HeatProject.HeatOutput)' == '' "
+    AdditionalMetadata="HeatOutput=$(IntermediateOutputPath)_%(HeatProject.Filename).wxs">
+      <Output TaskParameter="Include" ItemName="_AllHeatProjects" />
+    </CreateItem>
+    <CreateItem Include="@(HarvestProject)" Condition= " '%(HarvestProject.HeatOutput)' == '' "
+    AdditionalMetadata="HeatOutput=$(IntermediateOutputPath)_%(HarvestProject.Filename).wxs">
+      <Output TaskParameter="Include" ItemName="_AllHeatProjects" />
+    </CreateItem>
+
+
+    <CreateItem Include="@(HeatProject)" Condition= " '%(HeatProject.HeatOutput)' != '' ">
+      <Output TaskParameter="Include" ItemName="_AllHeatProjects" />
+    </CreateItem>
+    <CreateItem Include="@(HarvestProject)" Condition= " '%(HarvestProject.HeatOutput)' != '' ">
+      <Output TaskParameter="Include" ItemName="_AllHeatProjects" />
+    </CreateItem>
+
+  </Target>
+
+  <!--
+  ================================================================================================
+  HarvestProjects
+
+    Harvests outputs of other MSBuild projects files using the VS project extension to heat.exe.
+
+    [IN]
+    @(HarvestProject)
+    @(HeatProject)
+        - The list of projects to harvest. HeatProject is provided for backward compatibility.
+          You should use HarvestProject instead.
+
+    %(HarvestProject.Transforms)
+    %(HeatProject.Transforms)
+        - XSL transforms to apply to the harvested WiX.
+
+    %(HarvestProject.ProjectOutputGroups)
+    %(HeatProjects.ProjectOutputGroups)
+        - The project output groups to harvest 
+
+    [OUT]
+    %(HeatOutput)
+        - The generated .wxs files which are added to the @(Compile) item list.
+  ================================================================================================
+  -->
+  <ItemDefinitionGroup>
+    <HeatProject>
+      <Transforms>$(HarvestProjectsTransforms)</Transforms>
+      <ProjectOutputGroups>$(HarvestProjectsProjectOutputGroups)</ProjectOutputGroups>
+      <DirectoryIds>$(HarvestProjectsDirectoryIds)</DirectoryIds>
+    </HeatProject>
+    <HarvestProject>
+      <Transforms>$(HarvestProjectsTransforms)</Transforms>
+      <ProjectOutputGroups>$(HarvestProjectsProjectOutputGroups)</ProjectOutputGroups>
+      <DirectoryIds>$(HarvestProjectsDirectoryIds)</DirectoryIds>
+    </HarvestProject>
+  </ItemDefinitionGroup>
+
+  <PropertyGroup>
+    <HarvestProjectsDependsOn>CombineHarvestProjects</HarvestProjectsDependsOn>
+  </PropertyGroup>
+  <Target Name="HarvestProjects"
+    DependsOnTargets="$(HarvestProjectsDependsOn)"
+    Inputs="@(_AllHeatProjects);%(_AllHeatProjects.Transforms);$(MSBuildAllProjects);$(ProjectPath)"
+    Outputs="@(_AllHeatProjects -> '%(HeatOutput)')"
+    Condition=" '@(HeatProject)' != '' or '@(HarvestProject)' != '' ">
+
+    <HeatProject
+      NoLogo="$(HarvestProjectsNoLogo)"
+      SuppressAllWarnings="$(HarvestProjectsSuppressAllWarnings)"
+      SuppressSpecificWarnings="$(HarvestProjectsSuppressSpecificWarnings)"
+      ToolPath="$(WixToolPath)"
+      TreatWarningsAsErrors="$(HarvestProjectsTreatWarningsAsErrors)"
+      TreatSpecificWarningsAsErrors="$(HarvestProjectsTreatSpecificWarningsAsErrors)"
+      VerboseOutput="$(HarvestProjectsVerboseOutput)"
+      AutogenerateGuids="$(HarvestProjectsAutogenerateGuids)"
+      GenerateGuidsNow="$(HarvestProjectsGenerateGuidsNow)"
+      OutputFile="%(_AllHeatProjects.HeatOutput)"
+      SuppressFragments="$(HarvestProjectsSuppressFragments)"
+      SuppressUniqueIds="$(HarvestProjectsSuppressUniqueIds)"
+      Transforms="%(_AllHeatProjects.Transforms)"
+      Project="%(_AllHeatProjects.FullPath)"
+      ProjectOutputGroups="%(_AllHeatProjects.ProjectOutputGroups)"
+      GenerateType="%(_AllHeatProjects.GenerateType)"
+      DirectoryIds="%(_AllHeatProjects.DirectoryIds)"
+      ProjectName="%(_AllHeatProjects.ProjectName)"
+      Configuration="%(_AllHeatProjects.Configuration)"
+      Platform="%(_AllHeatProjects.Platform)"
+      RunAsSeparateProcess="$(RunWixToolsOutOfProc)"
+      GenerateWixVariables="$(HarvestProjectsGenerateWixVariables)"
+      AdditionalOptions="$(HarvestProjectsAdditionalOptions)">
+
+      <Output TaskParameter="OutputFile" ItemName="Compile" />
+      <Output TaskParameter="OutputFile" ItemName="FileWrites" />
+
+    </HeatProject>
+
+  </Target>
+
+  <!--
+  ================================================================================================
+  HarvestDirectory
+
+    Harvests directories using heat.exe.
+
+    [IN]
+    @(HarvestDirectory) - The list of directories to harvest.
+    %(HarvestDirectory.Transforms) - XSL transforms to apply to the harvested WiX.
+    %(HarvestDirectory.ComponentGroupName) -  The name of the ComponentGroup to create.
+    %(HarvestDirectory.DirectoryRefId) - The ID of the directory to reference instead of TARGETDIR.
+    %(HarvestDirectory.KeepEmptyDirectories) - Whether to create Directory entries for empty directories.
+    %(HarvestDirectory.PreprocessorVariable) - Substitute SourceDir for another variable name (ex: var.Dir).
+    %(HarvestDirectory.SuppressCom) - Suppress COM elements.
+    %(HarvestDirectory.SuppressRootDirectory) - Suppress a Directory element for the root directory.
+    $(HarvestDirectory.SuppressRegistry) - Suppress registry harvesting.
+
+    [OUT]
+    $(IntermediateOutputPath)_%(HarvestDirectory.ComponentGroupName)_dir.wxs
+        - The generated .wxs files which are added to the @(Compile) item list.
+  ================================================================================================
+  -->
+
+  <ItemDefinitionGroup>
+    <HarvestDirectory>
+      <Transforms>$(HarvestDirectoryTransforms)</Transforms>
+      <ComponentGroupName>$(HarvestDirectoryComponentGroupName)</ComponentGroupName>
+      <DirectoryRefId>$(HarvestDirectoryDirectoryRefId)</DirectoryRefId>
+      <KeepEmptyDirectories>$(HarvestDirectoryKeepEmptyDirectories)</KeepEmptyDirectories>
+      <PreprocessorVariable>$(HarvestDirectoryPreprocessorVariable)</PreprocessorVariable>
+      <SuppressCom>$(HarvestDirectorySuppressCom)</SuppressCom>
+      <SuppressRootDirectory>$(HarvestDirectorySuppressRootDirectory)</SuppressRootDirectory>
+      <SuppressRegistry>$(HarvestDirectorySuppressRegistry)</SuppressRegistry>
+    </HarvestDirectory>
+  </ItemDefinitionGroup>
+
+  <PropertyGroup>
+    <HarvestDirectoryDependsOn>
+      GetHarvestDirectoryContent
+    </HarvestDirectoryDependsOn>
+  </PropertyGroup>
+
+  <!-- Creates items to include content since wildcards will not work in Target/@Inputs. -->
+  <Target Name="GetHarvestDirectoryContent">
+    <CreateItem Include="@(HarvestDirectory->'%(FullPath)\**\*')">
+      <Output TaskParameter="Include" ItemName="_HarvestDirectoryContent" />
+    </CreateItem>
+  </Target>
+
+  <Target Name="HarvestDirectory"
+    DependsOnTargets="$(HarvestDirectoryDependsOn)"
+    Inputs="@(_HarvestDirectoryContent);%(HarvestDirectory.Transforms)"
+    Outputs="$(IntermediateOutputPath)_%(HarvestDirectory.ComponentGroupName)_dir.wxs"
+    Condition=" '@(HarvestDirectory)' != '' ">
+
+    <HeatDirectory
+      NoLogo="$(HarvestDirectoryNoLogo)"
+      SuppressAllWarnings="$(HarvestDirectorySuppressAllWarnings)"
+      SuppressSpecificWarnings="$(HarvestDirectorySuppressSpecificWarnings)"
+      ToolPath="$(WixToolPath)"
+      TreatWarningsAsErrors="$(HarvestDirectoryTreatWarningsAsErrors)"
+      TreatSpecificWarningsAsErrors="$(HarvestDirectoryTreatSpecificWarningsAsErrors)"
+      VerboseOutput="$(HarvestDirectoryVerboseOutput)"
+      AutogenerateGuids="$(HarvestDirectoryAutogenerateGuids)"
+      GenerateGuidsNow="$(HarvestDirectoryGenerateGuidsNow)"
+      OutputFile="$(IntermediateOutputPath)_%(HarvestDirectory.ComponentGroupName)_dir.wxs"
+      SuppressFragments="$(HarvestDirectorySuppressFragments)"
+      SuppressUniqueIds="$(HarvestDirectorySuppressUniqueIds)"
+      Transforms="%(HarvestDirectory.Transforms)"
+      Directory="@(HarvestDirectory)"
+      ComponentGroupName="%(HarvestDirectory.ComponentGroupName)"
+      DirectoryRefId="%(HarvestDirectory.DirectoryRefId)"
+      KeepEmptyDirectories="%(HarvestDirectory.KeepEmptyDirectories)"
+      PreprocessorVariable="%(HarvestDirectory.PreprocessorVariable)"
+      RunAsSeparateProcess="$(RunWixToolsOutOfProc)" 
+      SuppressCom="%(HarvestDirectory.SuppressCom)"
+      SuppressRootDirectory="%(HarvestDirectory.SuppressRootDirectory)"
+      SuppressRegistry="%(HarvestDirectory.SuppressRegistry)"
+      AdditionalOptions="$(HarvestDirectoryAdditionalOptions)">
+
+      <Output TaskParameter="OutputFile" ItemName="Compile" />
+      <Output TaskParameter="OutputFile" ItemName="FileWrites" />
+
+    </HeatDirectory>
+
+  </Target>
+
+  <!--
+  ================================================================================================
+  HarvestFile
+
+    Harvests files of different types using heat.exe. This can harvest registry from
+    self-registering files, files with typelibs, and more.
+
+    [IN]
+    @(HarvestFile) - The list of files to harvest.
+    %(HarvestFile.Transforms) - XSL transforms to apply to the harvested WiX.
+    %(HarvestFile.ComponentGroupName) - The name of the ComponentGroup to create.
+    %(HarvestFile.DirectoryRefId) - The ID of the directory to reference instead of TARGETDIR.
+    %(HarvestFile.PreprocessorVariable) - Substitute SourceDir for another variable name (ex: var.Dir).
+    %(HarvestFile.SuppressCom) - Suppress COM elements.
+    %(HarvestFile.SuppressRootDirectory) - Suppress a Directory element for the root directory.
+    $(HarvestFile.SuppressRegistry) - Suppress registry harvesting.
+
+    [OUT]
+    $(IntermediateOutputPath)_%(HarvestFile.Filename)_file.wxs
+        - The generated .wxs files which are added to the @(Compile) item list.
+  ================================================================================================
+  -->
+
+  <ItemDefinitionGroup>
+    <HarvestFile>
+      <Transforms>$(HarvestFileTransforms)</Transforms>
+      <ComponentGroupName>$(HarvestFileComponentGroupName)</ComponentGroupName>
+      <DirectoryRefId>$(HarvestFileDirectoryRefId)</DirectoryRefId>
+      <PreprocessorVariable>$(HarvestFilePreprocessorVariable)</PreprocessorVariable>
+      <SuppressCom>$(HarvestFileSuppressCom)</SuppressCom>
+      <SuppressRegistry>$(HarvestFileSuppressRegistry)</SuppressRegistry>
+      <SuppressRootDirectory>$(HarvestFileSuppressRootDirectory)</SuppressRootDirectory>
+    </HarvestFile>
+  </ItemDefinitionGroup>
+
+  <PropertyGroup>
+    <HarvestFileDependsOn></HarvestFileDependsOn>
+  </PropertyGroup>
+  <Target Name="HarvestFile"
+    DependsOnTargets="$(HarvestFileDependsOn)"
+    Inputs="@(HarvestFile);%(HarvestFile.Transforms)"
+    Outputs="$(IntermediateOutputPath)_%(HarvestFile.Filename)_file.wxs"
+    Condition=" '@(HarvestFile)' != '' ">
+
+    <HeatFile
+      NoLogo="$(HarvestFileNoLogo)"
+      SuppressAllWarnings="$(HarvestFileSuppressAllWarnings)"
+      SuppressSpecificWarnings="$(HarvestFileSuppressSpecificWarnings)"
+      ToolPath="$(WixToolPath)"
+      TreatWarningsAsErrors="$(HarvestFileTreatWarningsAsErrors)"
+      TreatSpecificWarningsAsErrors="$(HarvestFileTreatSpecificWarningsAsErrors)"
+      VerboseOutput="$(HarvestFileVerboseOutput)"
+      AutogenerateGuids="$(HarvestFileAutogenerateGuids)"
+      GenerateGuidsNow="$(HarvestFileGenerateGuidsNow)"
+      OutputFile="$(IntermediateOutputPath)_%(HarvestFile.Filename)_file.wxs"
+      SuppressFragments="$(HarvestFileSuppressFragments)"
+      SuppressUniqueIds="$(HarvestFileSuppressUniqueIds)"
+      Transforms="%(HarvestFile.Transforms)"
+      File="@(HarvestFile)"
+      ComponentGroupName="%(HarvestFile.ComponentGroupName)"
+      DirectoryRefId="%(HarvestFile.DirectoryRefId)"
+      PreprocessorVariable="%(HarvestFile.PreprocessorVariable)"
+      RunAsSeparateProcess="$(RunWixToolsOutOfProc)" 
+      SuppressCom="%(HarvestFile.SuppressCom)"
+      SuppressRegistry="%(HarvestFile.SuppressRegistry)"
+      SuppressRootDirectory="%(HarvestFile.SuppressRootDirectory)"
+      AdditionalOptions="$(HarvestFileAdditionalOptions)">
+
+      <Output TaskParameter="OutputFile" ItemName="Compile" />
+      <Output TaskParameter="OutputFile" ItemName="FileWrites" />
+
+    </HeatFile>
+
+  </Target>
+
+  <!--
+  ================================================================================================
+  RefreshGeneratedFile
+
+    Generates code based on metadata defined in project references.
+
+    [IN]
+    @(_MSBuildResolvedProjectReferencePaths) - The list of MSBuildable project references.
+
+    [OUT]
+    @(_GeneratedFiles) - The generated source file.
+  ================================================================================================
+  -->
+  <PropertyGroup>
+    <RefreshGeneratedFileDependsOn></RefreshGeneratedFileDependsOn>
+  </PropertyGroup>
+  <Target Name="RefreshGeneratedFile"
+    DependsOnTargets="$(RefreshGeneratedFileDependsOn)"
+    Inputs="@(_MSBuildResolvedProjectReferencePaths);@(Compile);$(ProjectPath)"
+    Outputs="@(_GeneratedFiles)"
+    Condition=" ('$(OutputType)' == 'Package' or '$(OutputType)' == 'PatchCreation' or '$(OutputType)' == 'Module') and '@(_GeneratedFiles)' != '' ">
+
+    <RefreshGeneratedFile
+      GeneratedFiles="@(_GeneratedFiles)"
+      ProjectReferencePaths="@(_MSBuildResolvedProjectReferencePaths)" />
+
+  </Target>
+
+  <!--
+  ================================================================================================
+  RefreshBundleGeneratedFile
+
+    Generates code for bundle projects based on metadata defined in project references.
+
+    [IN]
+    @(_MSBuildResolvedProjectReferencePaths) - The list of MSBuildable project references.
+
+    [OUT]
+    @(_GeneratedFiles) - The generated source file.
+  ================================================================================================
+  -->
+  <PropertyGroup>
+    <RefreshBundleGeneratedFileDependsOn></RefreshBundleGeneratedFileDependsOn>
+  </PropertyGroup>
+  <Target Name="RefreshBundleGeneratedFile"
+    DependsOnTargets="$(RefreshBundleGeneratedFileDependsOn)"
+    Inputs="@(_MSBuildResolvedProjectReferencePaths);@(Compile);$(ProjectPath)"
+    Outputs="@(_GeneratedFiles)"
+    Condition=" '$(OutputType)' == 'Bundle' and '@(_GeneratedFiles)' != '' ">
+
+    <RefreshBundleGeneratedFile
+      GeneratedFiles="@(_GeneratedFiles)"
+      ProjectReferencePaths="@(_MSBuildResolvedProjectReferencePaths)" />
+
+  </Target>
+
+  <!--
+  ================================================================================================
+  GenerateCompileWithObjectPath
+
+    Generates metadata on the for compile output objects.
+
+  ================================================================================================
+  -->
+  <PropertyGroup>
+    <GenerateCompileWithObjectPathDependsOn></GenerateCompileWithObjectPathDependsOn>
+  </PropertyGroup>
+  <Target Name="GenerateCompileWithObjectPath"
+    Condition=" '@(Compile)' != '' ">
+
+    <ItemGroup>
+      <_CompileWithObjectPath Include="@(Compile)">
+        <!-- If RelativeDir is not rooted and not in IntermediateOutputPath, and ObjectPath is undefined use IntermediateOutputPath\RelativeDir -->
+        <ObjectPath Condition=" '%(RelativeDir)%(FileName)%(Extension)' != '%(FullPath)' AND '%(RelativeDir)%(FileName)%(Extension)' != '$(IntermediateOutputPath)%(FileName)%(Extension)' AND '%(Compile.ObjectPath)' == '' " >$(IntermediateOutputPath)%(RelativeDir)</ObjectPath>
+        <!-- If RelativeDir is rooted or in IntermediateOutputPath, and ObjectPath is undefined use IntermediateOutputPath -->
+        <ObjectPath Condition=" ('%(RelativeDir)%(FileName)%(Extension)' == '%(FullPath)' OR '%(RelativeDir)%(FileName)%(Extension)' == '$(IntermediateOutputPath)%(FileName)%(Extension)') AND '%(Compile.ObjectPath)' == '' " >$(IntermediateOutputPath)</ObjectPath>
+      </_CompileWithObjectPath>
+    </ItemGroup>
+
+  </Target>
+
+  <!--
+  ================================================================================================
+  Compile
+
+    Compiles the wxs files into wixobj files using candle.exe.
+
+    [IN]
+    @(Compile) - The list of wxs files to compile.
+    @(Content) - Files that the project uses in the installer.
+    @(WixExtension) - The list of wixlib or wix dll extensions.
+
+    [OUT]
+    @(CompileObjOutput) - The compiled .wixobj files.
+  ================================================================================================
+  -->
+  <PropertyGroup>
+    <CompileDependsOn>
+      PrepareForBuild;
+      ResolveWixExtensionReferences;
+      GenerateCompileWithObjectPath
+    </CompileDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="Compile"
+    Inputs="@(Compile);
+            @(Content);
+            @(_ResolvedWixExtensionPaths);
+            @(_ResolvedProjectReferencePaths);
+            $(MSBuildAllProjects)"
+    Outputs="@(_CompileWithObjectPath  -> '%(ObjectPath)%(Filename)$(IntermediateExt)')"
+    DependsOnTargets="$(CompileDependsOn)"
+    Condition=" '@(Compile)' != '' ">
+
+    <Candle
+      SourceFiles="@(_CompileWithObjectPath)"
+      AdditionalOptions="$(CompilerAdditionalOptions)" 
+      DefineConstants="$(DefineConstants);$(SolutionDefineConstants);$(ProjectDefineConstants);$(ProjectReferenceDefineConstants)"
+      ExtensionDirectory="$(WixExtDir)"
+      Extensions="@(_ResolvedWixExtensionPaths)"
+      FipsCompliant="$(FipsCompliant)"
+      SuppressFilesVitalByDefault="$(SuppressFilesVitalByDefault)"
+      PreprocessToStdOut="$(PreprocessToStdOut)"
+      PreprocessToFile="$(PreprocessToFile)"
+      IncludeSearchPaths="$(IncludeSearchPaths)"
+      InstallerPlatform="$(InstallerPlatform)"
+      NoLogo="$(CompilerNoLogo)"
+      OnlyValidateDocuments="$(OnlyValidateDocuments)" 
+      OutputFile="%(_CompileWithObjectPath.ObjectPath)"
+      Pedantic="$(Pedantic)"
+      ReferencePaths="$(ReferencePaths)"
+      RunAsSeparateProcess="$(RunWixToolsOutOfProc)"
+      ShowSourceTrace="$(ShowSourceTrace)"
+      SuppressAllWarnings="$(CompilerSuppressAllWarnings)"
+      SuppressSchemaValidation="$(CompilerSuppressSchemaValidation)"
+      SuppressSpecificWarnings="$(CompilerSuppressSpecificWarnings)"
+      ToolPath="$(WixToolPath)"
+      TreatWarningsAsErrors="$(CompilerTreatWarningsAsErrors)"
+      TreatSpecificWarningsAsErrors="$(CompilerTreatSpecificWarningsAsErrors)" 
+      VerboseOutput="$(CompilerVerboseOutput)">
+    </Candle>
+
+    <ItemGroup>
+        <CompileObjOutput Include="@(_CompileWithObjectPath -> '%(ObjectPath)%(Filename)$(IntermediateExt)')" />
+    </ItemGroup>
+  </Target>
+
+  <!--
+  ================================================================================================
+  Inscribe
+
+    To be called after signing an MSI's cabs - inscribes an MSI with the digital signature of its
+      external cabs.
+
+    [IN/OUT]
+    @(Inscribe) - The list of database files to inscribe - database files will be modified in-place.
+
+  ================================================================================================
+  -->
+  <PropertyGroup>
+    <InscribeDependsOn>
+      PrepareForBuild;
+      ResolveWixExtensionReferences;
+      CompileAndLink;
+      SignCabs
+    </InscribeDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="Inscribe"
+    DependsOnTargets="$(InscribeDependsOn)"
+    Condition=" '@(Inscribe)' != '' and '$(OutputCabList)' != ''">
+
+    <Insignia
+      DatabaseFiles="@(Inscribe)"
+      ToolPath="$(WixToolPath)"
+      NoLogo="$(InscribeNoLogo)"
+      RunAsSeparateProcess="$(RunWixToolsOutOfProc)"
+      SuppressAllWarnings="$(InscribeSuppressAllWarnings)"
+      SuppressSpecificWarnings="$(InscribeSuppressSpecificWarnings)"
+      TreatWarningsAsErrors="$(InscribeTreatWarningsAsErrors)"
+      TreatSpecificWarningsAsErrors="$(InscribeTreatSpecificWarningsAsErrors)"
+      VerboseOutput="$(InscribeVerboseOutput)"
+      AdditionalOptions="$(InscribeAdditionalOptions)">
+    </Insignia>
+  </Target>
+
+  <!--
+  ================================================================================================
+  Lib
+
+    Links the .wixobj, .wxl, .wixlib, wix extensions into a .wixlib file using lit.exe.
+
+    [IN]
+    @(CompileObjOutput) - The compiled .wixobj file.
+    @(EmbeddedResource) - The list of wxl files to use for localization.
+    @(WixObject) - The list of .wixobj files.
+    @(WixLibrary) - The list of .wixlib files.
+    @(WixExtension) - The list of wix dll extension files.
+
+    [OUT]
+    $(TargetPath) - The compiled .wixlib file.
+  ================================================================================================
+  -->
+  <PropertyGroup>
+    <LibDependsOn>
+      PrepareForBuild;
+      ResolveWixExtensionReferences
+    </LibDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="Lib"
+    Inputs="@(CompileObjOutput);
+            @(EmbeddedResource);
+            @(WixObject);
+            @(WixLibrary);
+            @(_ResolvedWixExtensionPaths);
+            $(MSBuildAllProjects)"
+    Outputs="$(TargetPath)"
+    DependsOnTargets="$(LibDependsOn)"
+    Condition=" '$(OutputType)' == 'Library' ">
+
+    <Lit
+      ObjectFiles="@(CompileObjOutput);@(WixObject);@(WixLibProjects);@(WixLibrary)"
+      AdditionalOptions="$(LibAdditionalOptions)" 
+      BaseInputPaths="$(LinkerBaseInputPaths)"
+      BindFiles="$(LibBindFiles)"
+      ExtensionDirectory="$(WixExtDir)"
+      Extensions="@(_ResolvedWixExtensionPaths)"
+      LocalizationFiles="@(EmbeddedResource)"
+      NoLogo="$(LibNoLogo)"
+      OutputFile="$(TargetPath)"
+      Pedantic="$(LibPedantic)"
+      ReferencePaths="$(ReferencePaths)"
+      RunAsSeparateProcess="$(RunWixToolsOutOfProc)"
+      SuppressAllWarnings="$(LibSuppressAllWarnings)"
+      SuppressIntermediateFileVersionMatching="$(LibSuppressIntermediateFileVersionMatching)"
+      SuppressSchemaValidation="$(LibSuppressSchemaValidation)"
+      SuppressSpecificWarnings="$(LibSuppressSpecificWarnings)"
+      ToolPath="$(WixToolPath)"
+      TreatWarningsAsErrors="$(LibTreatWarningsAsErrors)"
+      VerboseOutput="$(LibVerboseOutput)" />
+  </Target>
+
+  <!--
+  ================================================================================================
+  AssignCultures
+
+    Determines the final list of culture groups to build based on either the Cultures property or
+    those specified in .wxl files. 
+    
+      Culture groups specified in the Cultures property must be specified as a semi-colon 
+      delimited  list of groups, with comma-delimited cultures within a group.  
+      For example:
+        <Cultures>en-US,en;en-GB,en</Cultures>
+      This will build 2 targets, outputing to en-US and en-GB sub-folders.  Light will first look
+      for strings in the first culture (en-US or en-GB) then the second (en).
+    
+      Cultures of .wxl files will be used when the Culture property is not set.  The culture of a 
+      .wxl file is determined by the Culture attribute in the WixLocalization element in the file
+
+    Sets the OutputFolder metadata on each culture group.  In most cases this is the same as the 
+    first culture in the culture group.  When the Culture's property is unspecified and no .wxl 
+    files are provided this is the same as the output directory.  When the Culture's property 
+    specifies a single culture group and no .wxl files are provided this is the same as the output
+    directory.
+
+    Updates the TargetPath and TargetPdbPath properties to be used in subsequent targets.
+    
+    [IN]
+    @(EmbeddedResource) - The list of wxl files to use for localization.
+    $(Cultures) - The list of culture groups to build.
+
+    [OUT]
+    @(CultureGroup) - The list of culture group strings with OutputFolder metadata
+    $(TargetPath) - Property list of target link output MSIs/MSMs
+    $(TargetPdbPath) - Property list of target output pdbs
+    
+  ================================================================================================
+  -->
+  <Target 
+    Name="AssignCultures"
+    Condition=" ('$(OutputType)' == 'Package' or '$(OutputType)' == 'PatchCreation' or '$(OutputType)' == 'Module')">
+    
+    <WixAssignCulture
+      Cultures="$(Cultures)"
+      Files="@(EmbeddedResource)"
+      >
+
+      <Output TaskParameter="CultureGroups" ItemName="CultureGroup" />
+    </WixAssignCulture>
+
+    <!-- Build an itemgroup of outputs -->
+    <CreateItem
+      Include="$(TargetDir)%(CultureGroup.OutputFolder)$(TargetName)$(TargetExt)">
+      <Output TaskParameter="Include"
+              ItemName="_TargetPathItems"/>
+    </CreateItem>
+    
+    <!-- Convert the itemgroup to a semicolon-delimited property -->
+    <CreateProperty
+      Value="@(_TargetPathItems)">
+      <Output TaskParameter="Value"
+              PropertyName="TargetPath"/>
+    </CreateProperty>
+
+    <!-- Build an itemgroup of PDB outputs -->
+    <CreateItem
+      Include="$(TargetDir)%(CultureGroup.OutputFolder)$(TargetName)$(TargetPdbExt)">
+      <Output TaskParameter="Include"
+              ItemName="_TargetPdbPathItems"/>
+    </CreateItem>
+
+    <!-- Convert the itemgroup to a semicolon-delimited property -->
+    <CreateProperty
+      Value="@(_TargetPdbPathItems)">
+      <Output TaskParameter="Value"
+              PropertyName="TargetPdbPath"/>
+    </CreateProperty>
+  </Target>
+
+  <!--
+  ================================================================================================
+  Link
+
+    Links the .wixobj, .wxl, .wixlib, wix extensions into an .msi or .msm file using light.exe,
+    once per culture group. All WXL files are passed into light and the culture switch determines
+    which are used
+
+    [IN]
+    @(CompileObjOutput) - The compiled .wixobj file.
+    @(CultureGroup) - The cultures to build
+    @(EmbeddedResource) - The list of wxl files to use for localization.
+    @(WixObject) - The list of .wixobj files.
+    @(WixLibrary) - The list of .wixlib files.
+    @(WixExtension) - The list of wix dll extension files.
+
+    [OUT]
+    $(TargetDir)\%(Culture)\$(TargetName)$(TargetExt) - The compiled .msi, .msm, or .exe files.
+  ================================================================================================
+  -->
+  <PropertyGroup>
+    <LinkDependsOn>
+      PrepareForBuild;
+      ResolveReferences;
+      AssignCultures;
+    </LinkDependsOn>
+  </PropertyGroup>
+  
+  <Target
+    Name="Link"
+    Inputs="@(CompileObjOutput);
+            @(EmbeddedResource);
+            @(WixObject);
+            @(_ResolvedProjectReferencePaths);
+            @(_ResolvedWixLibraryPaths);
+            @(_ResolvedWixExtensionPaths);
+            $(MSBuildAllProjects)"
+    Outputs="$(TargetDir)%(CultureGroup.OutputFolder)$(TargetName)$(TargetExt)"
+    DependsOnTargets="$(LinkDependsOn)"
+    Condition=" ('$(OutputType)' == 'Package' or '$(OutputType)' == 'PatchCreation' or '$(OutputType)' == 'Module' or '$(OutputType)' == 'Bundle')">
+
+    <CreateProperty Condition=" '$(OutputType)' != 'Bundle' " Value="$(TargetDir)%(CultureGroup.OutputFolder)$(TargetName)$(TargetPdbExt)">
+      <Output TaskParameter="Value" PropertyName="PdbOutputFile" />
+    </CreateProperty>
+
+    <!-- Call light using the culture subdirectory for output -->
+    <Light
+      ObjectFiles="@(CompileObjOutput);@(WixObject);@(WixLibProjects);@(_ResolvedWixLibraryPaths)"
+      AdditionalOptions="$(LinkerAdditionalOptions)" 
+      AllowIdenticalRows="$(AllowIdenticalRows)"
+      AllowUnresolvedReferences="$(AllowUnresolvedReferences)"
+      AdditionalCub="$(AdditionalCub)" 
+      BackwardsCompatibleGuidGeneration="$(BackwardsCompatibleGuidGeneration)" 
+      BaseInputPaths="$(LinkerBaseInputPaths)"
+      BindFiles="$(LinkerBindFiles)"
+      CabinetCachePath="$(CabinetCachePath)"
+      CabinetCreationThreadCount="$(CabinetCreationThreadCount)"
+      Cultures="%(CultureGroup.Identity)"
+      CustomBinder="$(CustomBinder)"
+      DefaultCompressionLevel="$(DefaultCompressionLevel)"
+      DropUnrealTables="$(DropUnrealTables)"
+      ExactAssemblyVersions="$(ExactAssemblyVersions)"
+      ExtensionDirectory="$(WixExtDir)"
+      Extensions="@(_ResolvedWixExtensionPaths)"
+      Ices="$(Ices)"
+      LeaveTemporaryFiles="$(LeaveTemporaryFiles)"
+      LocalizationFiles="@(EmbeddedResource)"
+      NoLogo="$(LinkerNoLogo)"
+      OutputAsXml="$(OutputAsXml)"
+      OutputFile="$(TargetDir)%(CultureGroup.OutputFolder)$(TargetName)$(TargetExt)"
+      PdbOutputFile="$(PdbOutputFile)"
+      Pedantic="$(LinkerPedantic)"
+      ReferencePaths="$(ReferencePaths)"
+      ReuseCabinetCache="$(ReuseCabinetCache)"
+      RunAsSeparateProcess="$(RunWixToolsOutOfProc)"
+      SetMsiAssemblyNameFileVersion="$(SetMsiAssemblyNameFileVersion)"
+      SuppressAclReset="$(SuppressAclReset)"
+      SuppressAllWarnings="$(LinkerSuppressAllWarnings)"
+      SuppressAssemblies="$(SuppressAssemblies)"
+      SuppressDefaultAdminSequenceActions="$(SuppressDefaultAdminSequenceActions)"
+      SuppressDefaultAdvSequenceActions="$(SuppressDefaultAdvSequenceActions)"
+      SuppressDefaultUISequenceActions="$(SuppressDefaultUISequenceActions)"
+      SuppressFileHashAndInfo="$(SuppressFileHashAndInfo)"
+      SuppressFiles="$(SuppressFiles)"
+      SuppressIntermediateFileVersionMatching="$(LinkerSuppressIntermediateFileVersionMatching)"
+      SuppressIces="$(SuppressIces)"
+      SuppressLayout="$(SuppressLayout)"
+      SuppressLocalization="$(SuppressLocalization)"
+      SuppressMsiAssemblyTableProcessing="$(SuppressMsiAssemblyTableProcessing)"
+      SuppressPdbOutput="$(SuppressPdbOutput)"
+      SuppressSchemaValidation="$(LinkerSuppressSchemaValidation)"
+      SuppressValidation="$(SuppressValidation)"
+      SuppressSpecificWarnings="$(LinkerSuppressSpecificWarnings)"
+      SuppressTagSectionIdAttributeOnTuples="$(SuppressTagSectionIdAttributeOnTuples)"
+      ToolPath="$(WixToolPath)"
+      TreatWarningsAsErrors="$(LinkerTreatWarningsAsErrors)"
+      UnreferencedSymbolsFile="$(UnreferencedSymbolsFile)"
+      VerboseOutput="$(LinkerVerboseOutput)"
+      WixVariables="$(WixVariables)" />
+
+    <GetCabList Database="$(TargetDir)%(CultureGroup.OutputFolder)$(TargetName)$(TargetExt)"
+        Condition="('$(OutputType)' == 'Package' or '$(OutputType)' == 'Module') and '$(OutputAsXml)' != 'true' " >
+      <Output TaskParameter="CabList" PropertyName="OutputCabs" />
+      <Output TaskParameter="CabList" ItemName="FileWrites" />
+    </GetCabList>
+
+    <GetLooseFileList Database="$(TargetDir)%(CultureGroup.OutputFolder)$(TargetName)$(TargetExt)"
+        Condition="('$(OutputType)' == 'Package' or '$(OutputType)' == 'Module') and '$(OutputAsXml)' != 'true' " >
+      <Output TaskParameter="LooseFileList" ItemName="FileWrites" />
+    </GetLooseFileList>
+
+    <CreateItem Include="$(OutputCabs)" >
+      <Output TaskParameter="Include" ItemName="OutputCabList" />
+    </CreateItem>
+    
+  </Target>
+
+  <!--
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  IncrementalClean Targets
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  -->
+
+  <!--
+  ==================================================================================================
+  IncrementalClean
+
+    Remove files that were produced in a prior build but weren't produced in the current build.
+    The reason is that if, for example, the name of the .msi/.msm has changed we want to delete the
+    old copy.
+
+    Leave the Clean cache file containing only the files produced in the current build.
+  ==================================================================================================
+  -->
+  <Target
+    Name="IncrementalClean"
+    DependsOnTargets="_CleanGetCurrentAndPriorFileWrites">
+
+    <!-- Subtract list of files produced in prior builds from list of files produced in this build. -->
+    <CreateItem Include="@(_CleanPriorFileWrites)" Exclude="@(_CleanCurrentFileWrites)">
+      <Output TaskParameter="Include" ItemName="_CleanOrphanFileWrites" />
+    </CreateItem>
+
+    <!-- Find all files in the final output directory. -->
+    <FindUnderPath Path="$(OutDir)" Files="@(_CleanOrphanFileWrites)">
+      <Output TaskParameter="InPath" ItemName="_CleanOrphanFileWritesInOutput" />
+    </FindUnderPath>
+
+    <!-- Find all files in the intermediate output directory. -->
+    <FindUnderPath Path="$(IntermediateOutputPath)" Files="@(_CleanOrphanFileWrites)">
+      <Output TaskParameter="InPath" ItemName="_CleanOrphanFileWritesInIntermediate" />
+    </FindUnderPath>
+
+    <!-- Delete the orphaned files. -->
+    <Delete
+      Files="@(_CleanOrphanFileWritesInIntermediate);@(_CleanOrphanFileWritesInOutput)"
+      TreatErrorsAsWarnings="true">
+
+      <Output TaskParameter="DeletedFiles" ItemName="_CleanOrphanFilesDeleted" />
+    </Delete>
+
+    <!-- Create a list of everything that wasn't deleted. -->
+    <CreateItem Include="@(_CleanPriorFileWrites);@(_CleanCurrentFileWrites)" Exclude="@(_CleanOrphanFilesDeleted)">
+      <Output TaskParameter="Include" ItemName="_CleanRemainingFileWritesAfterIncrementalClean" />
+    </CreateItem>
+
+    <!-- Remove duplicates. -->
+    <RemoveDuplicates Inputs="@(_CleanRemainingFileWritesAfterIncrementalClean)">
+      <Output TaskParameter="Filtered" ItemName="_CleanUniqueRemainingFileWritesAfterIncrementalClean" />
+    </RemoveDuplicates>
+
+    <!-- Make sure the directory exists. -->
+    <MakeDir Directories="$(IntermediateOutputPath)" />
+
+    <!-- Write new list of current files back to disk, replacing the existing list.-->
+    <WriteLinesToFile
+      File="$(IntermediateOutputPath)$(CleanFile)"
+      Lines="@(_CleanUniqueRemainingFileWritesAfterIncrementalClean)"
+      Overwrite="true" />
+
+  </Target>
+
+  <!--
+  ==================================================================================================
+  _CleanGetCurrentAndPriorFileWrites
+
+    Get the list of files built in the current build and in prior builds.
+  ==================================================================================================
+  -->
+  <Target
+    Name="_CleanGetCurrentAndPriorFileWrites"
+    DependsOnTargets="_CheckForCompileAndLinkOutputs">
+
+    <!-- Read the list of files produced by a prior builds from disk. -->
+    <ReadLinesFromFile File="$(IntermediateOutputPath)$(CleanFile)">
+      <Output TaskParameter="Lines" ItemName="_CleanPriorFileWrites" />
+    </ReadLinesFromFile>
+
+    <!-- Find all files in the final output directory. -->
+    <FindUnderPath Path="$(OutDir)" Files="@(FileWrites)">
+      <Output TaskParameter="InPath" ItemName="_CleanCurrentFileWritesInOutput" />
+    </FindUnderPath>
+
+    <!-- Find all files in the intermediate output directory. -->
+    <FindUnderPath Path="$(IntermediateOutputPath)" Files="@(FileWrites)">
+      <Output TaskParameter="InPath" ItemName="_CleanCurrentFileWritesInIntermediate" />
+    </FindUnderPath>
+
+    <!-- Remove duplicates from files produced in this build. -->
+    <RemoveDuplicates Inputs="@(_CleanCurrentFileWritesInOutput);@(_CleanCurrentFileWritesInIntermediate)">
+      <Output TaskParameter="Filtered" ItemName="_CleanCurrentFileWrites" />
+    </RemoveDuplicates>
+
+  </Target>
+
+  <!--
+  ==================================================================================================
+  _CheckForCompileAndLinkOutputs
+
+    Checks each file output from the main CompileAndLink target to make sure they really exist.
+    If they do, then record them in the clean cache.
+  ==================================================================================================
+  -->
+  <Target Name="_CheckForCompileAndLinkOutputs">
+
+    <!--Record the main compile outputs -->
+    <CreateItem Include="@(CompileObjOutput)" Condition="Exists('%(FullPath)')">
+      <Output TaskParameter="Include" ItemName="FileWrites" />
+    </CreateItem>
+
+    <!-- Record the link ouput(s) -->
+    <!-- Stuff into an itemgroup -->
+    <CreateItem Include="$(TargetPath);$(TargetPdbPath)">
+      <Output TaskParameter="Include" ItemName="_TempTargetOutputs" />
+    </CreateItem>
+
+    <CreateItem Include="@(_TempTargetOutputs)" Condition="Exists('%(FullPath)')">
+      <Output TaskParameter="Include" ItemName="FileWrites" />
+    </CreateItem>
+  </Target>
+
+  <!--
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  Clean Targets
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  -->
+
+  <!--
+  ==================================================================================================
+  Clean
+
+    Delete all intermediate and final build outputs.
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <CleanDependsOn>
+      BeforeClean;
+      CleanReferencedProjects;
+      CoreClean;
+      AfterClean
+    </CleanDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="Clean"
+    DependsOnTargets="$(CleanDependsOn)" />
+
+  <!--
+  ==================================================================================================
+  BeforeClean
+
+    Redefine this target in your project in order to run tasks just before Clean.
+  ==================================================================================================
+  -->
+  <Target Name="BeforeClean" />
+
+  <!--
+  ==================================================================================================
+  AfterClean
+
+    Redefine this target in your project in order to run tasks just after Clean.
+  ==================================================================================================
+  -->
+  <Target Name="AfterClean" />
+
+  <!--
+  ==================================================================================================
+  CleanReferencedProjects
+
+    Call Clean target on all Referenced Projects.
+  ==================================================================================================
+  -->
+  <Target
+    Name="CleanReferencedProjects">
+
+    <!-- TODO -->
+    <!--
+    When building the project directly from the command-line, clean those referenced projects that
+    exist on disk. For IDE builds and command-line .SLN builds, the solution build manager takes
+    care of this.
+    -->
+    <!--MSBuild
+      Projects="@(_MSBuildProjectReferenceExistent)"
+      Targets="Clean"
+      Condition=" '$(BuildingInsideVisualStudio)' != 'true' and '$(BuildingSolutionFile)' != 'true' and '@(_MSBuildProjectReferenceExistent)' != '' " /-->
+
+  </Target>
+
+  <!--
+  ==================================================================================================
+  CoreClean
+
+    Cleans all of the compile and link outputs as well as any intermediate files generated along
+    the way.
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <CoreCleanDependsOn></CoreCleanDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="CoreClean"
+    DependsOnTargets="$(CoreCleanDependsOn)">
+
+    <!-- Read in list of files that were written to disk in past builds. -->
+    <ReadLinesFromFile File="$(IntermediateOutputPath)$(CleanFile)">
+      <Output TaskParameter="Lines" ItemName="_CleanPriorFileWrites" />
+    </ReadLinesFromFile>
+
+    <!-- Find all files in the final output directory. -->
+    <FindUnderPath Path="$(OutDir)" Files="@(_CleanPriorFileWrites)">
+      <Output TaskParameter="InPath" ItemName="_CleanPriorFileWritesInOutput" />
+    </FindUnderPath>
+
+    <!-- Find all files in the intermediate output directory. -->
+    <FindUnderPath Path="$(IntermediateOutputPath)" Files="@(_CleanPriorFileWrites)">
+      <Output TaskParameter="InPath" ItemName="_CleanPriorFileWritesInIntermediate" />
+    </FindUnderPath>
+
+    <!-- Delete those files. -->
+    <Delete Files="@(_CleanPriorFileWritesInOutput);@(_CleanPriorFileWritesInIntermediate)" TreatErrorsAsWarnings="true">
+      <Output TaskParameter="DeletedFiles" ItemName="_CleanPriorFileWritesDeleted" />
+    </Delete>
+
+    <!-- Create a list of everything that wasn't deleted. -->
+    <CreateItem Include="@(_CleanPriorFileWrites)" Exclude="@(_CleanPriorFileWritesDeleted)">
+      <Output TaskParameter="Include" ItemName="_CleanRemainingFileWritesAfterClean" />
+    </CreateItem>
+
+    <!-- Remove duplicates. -->
+    <RemoveDuplicates Inputs="@(_CleanRemainingFileWritesAfterClean)">
+      <Output TaskParameter="Filtered" ItemName="_CleanUniqueRemainingFileWrites" />
+    </RemoveDuplicates>
+
+    <!-- Make sure the directory exists. -->
+    <MakeDir Directories="$(IntermediateOutputPath)" />
+
+    <!-- Write new list of current files back to disk. -->
+    <WriteLinesToFile File="$(IntermediateOutputPath)$(CleanFile)" Lines="@(_CleanUniqueRemainingFileWrites)" Overwrite="true" />
+
+  </Target>
+
+  <!--
+  ==================================================================================================
+  _CleanRecordFileWrites
+
+    Save the list of all files written to disk so that it can be used for "Clean" later.
+    Files written in prior builds are not removed from Clean cache.
+  ==================================================================================================
+  -->
+  <Target
+    Name="_CleanRecordFileWrites"
+    DependsOnTargets="_CleanGetCurrentAndPriorFileWrites">
+
+    <!-- Merge list of files from prior builds with the current build and then remove duplicates. -->
+    <RemoveDuplicates Inputs="@(_CleanPriorFileWrites);@(_CleanCurrentFileWrites)">
+      <Output TaskParameter="Filtered" ItemName="_CleanUniqueFileWrites" />
+    </RemoveDuplicates>
+
+    <!-- Make sure the directory exists. -->
+    <MakeDir Directories="$(IntermediateOutputPath)" />
+
+    <!-- Write merged file list back to disk, replacing existing contents. -->
+    <WriteLinesToFile
+        File="$(IntermediateOutputPath)$(CleanFile)"
+        Lines="@(_CleanUniqueFileWrites)"
+        Overwrite="true" />
+
+  </Target>
+
+  <!--
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  PostBuildEvent Targets
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  -->
+
+  <!--
+  ==================================================================================================
+  PostBuildEvent
+
+    Run the post-build event. This step is driven by two parameters:
+
+    1) $(RunPostBuildEvent) is set by the user through the IDE and can be one of four values:
+       1) OnBuildSuccess: In this case, every step of the build must succeed for the post-build
+          step to run.
+       2) <Blank>: This is the same as OnBuildSuccess.
+       3) OnOutputUpdated: In this case, the post-build step will run only if the main output was
+          actually updated.
+       4) Always: The post-build step is always run.
+
+    2) $(_TargetOutputTimestampBeforeCompileAndLink) and $(_TargetOutputTimestampAfterCompileAndLink)
+       are set by the _TimeStampBeforeCompileAndLink and _TimeStampAfterCompileAndLink targets. If
+       the output was actually rebuilt during this build, then the two values will be different.
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <PostBuildEventDependsOn>GetTargetPath</PostBuildEventDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="PostBuildEvent"
+    Condition=" '$(PostBuildEvent)' != '' and
+      ( '$(RunPostBuildEvent)' != 'OnOutputUpdated' or '$(_TargetOutputTimestampBeforeCompileAndLink)' != '$(_TargetOutputTimestampAfterCompileAndLink)' )"
+    DependsOnTargets="$(PostBuildEventDependsOn)">
+
+    <ReplaceString
+      Text="$(PostBuildEvent)"
+      OldValue="!(TargetPath)"
+      NewValue="$(TargetPath)">
+      
+      <Output TaskParameter="Text" PropertyName="ExpandedPostBuildEvent" />
+    </ReplaceString>
+
+    <ReplaceString
+      Text="$(ExpandedPostBuildEvent)"
+      OldValue="!(TargetPdbPath)"
+      NewValue="$(TargetPdbPath)">
+      
+      <Output TaskParameter="Text" PropertyName="ExpandedPostBuildEvent" />
+    </ReplaceString>
+
+    <Exec WorkingDirectory="$(OutDir)" Command="$(ExpandedPostBuildEvent)" />
+  </Target>
+
+  <!--
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  AllProjectOutputGroups Section
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////////////////////
+  -->
+
+  <!--
+  ==================================================================================================
+  AllProjectOutputGroups
+
+    The targets below drive output groups, which provide generic information about a
+    project's inputs (e.g., content files, compilation sources, etc.) and built outputs
+    (e.g., built EXE/DLL, PDB, XML documentation files, etc.)
+
+    Each target may produce two kinds of items:  outputs and dependencies. Outputs are
+    items from the current project; dependencies are items that are brought into the
+    current project as a result of referencing other projects or components.
+
+    For both outputs and dependencies, the Include attribute
+    specifies the location of the output/dependency; it must be a full path. Any number
+    of additional attributes may be placed on an output/dependency item.
+  ==================================================================================================
+  -->
+  <Target
+    Name="AllProjectOutputGroups"
+    DependsOnTargets="
+      BuiltProjectOutputGroup;
+      DebugSymbolsProjectOutputGroup;
+      DocumentationProjectOutputGroup;
+      SatelliteDllsProjectOutputGroup;
+      SourceFilesProjectOutputGroup;
+      ContentFilesProjectOutputGroup;
+      SGenFilesOutputGroup" />
+
+  <!-- 
+  This is the key output for the BuiltProjectOutputGroup and is meant to be read directly from the IDE.
+  Reading an item is faster than invoking a target.
+  -->
+  <ItemGroup>
+    <BuiltProjectOutputGroupKeyOutput Include="$(TargetPath)">
+      <IsKeyOutput>true</IsKeyOutput>
+      <FinalOutputPath>$(TargetPath)</FinalOutputPath>
+      <TargetPath>$(TargetFileName)</TargetPath>
+    </BuiltProjectOutputGroupKeyOutput>
+  </ItemGroup>
+
+  <!--
+  ==================================================================================================
+  BuiltProjectOutputGroup
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <BuiltProjectOutputGroupDependsOn>PrepareForBuild;AssignCultures</BuiltProjectOutputGroupDependsOn>
+    <AddAppConfigToBuildOutputs Condition="('$(AddAppConfigToBuildOutputs)' == '') and ('$(OutputType)' != 'library')">true</AddAppConfigToBuildOutputs>
+  </PropertyGroup>
+  <Target
+    Name="BuiltProjectOutputGroup"
+    Outputs="@(BuiltProjectOutputGroupOutput)"
+    DependsOnTargets="$(BuiltProjectOutputGroupDependsOn)">
+
+    <!-- Don't add BuiltProjectOutputGroupKeyOutput - to avoid duplicates, we only want to get the updated list of TargetPaths from the TargetPath property below -->
+
+    <!-- Convert intermediate items into final items; this way we can get the full path for each item -->
+    <ItemGroup>
+        <BuiltProjectOutputGroupOutput Include="@(_BuiltProjectOutputGroupOutputIntermediate->'%(FullPath)')">
+            <!-- For compatibility with 2.0 -->
+            <OriginalItemSpec Condition="'%(_BuiltProjectOutputGroupOutputIntermediate.OriginalItemSpec)' == ''">%(_BuiltProjectOutputGroupOutputIntermediate.FullPath)</OriginalItemSpec>
+        </BuiltProjectOutputGroupOutput>
+    </ItemGroup>
+
+    <!-- Include build output(s).  Different than predefined itemgroup since AssignCultures target may change it -->
+    <CreateItem
+      Include="$(TargetPath)">
+      <Output TaskParameter="Include" ItemName="BuiltProjectOutputGroupOutput" />
+    </CreateItem>
+
+    <GetCabList Database="@(BuiltProjectOutputGroupKeyOutput)" Condition="('$(OutputType)' == 'Package' or '$(OutputType)' == 'Module')">
+      <Output TaskParameter="CabList" ItemName="BuiltProjectOutputGroupOutput" />
+    </GetCabList>
+
+    <GetLooseFileList Database="@(BuiltProjectOutputGroupKeyOutput)" Condition="('$(OutputType)' == 'Package' or '$(OutputType)' == 'Module')" >
+      <Output TaskParameter="LooseFileList" ItemName="BuiltProjectOutputGroupOutput" />
+    </GetLooseFileList>
+
+  </Target>
+
+  <!--
+  ==================================================================================================
+  DebugSymbolsProjectOutputGroup
+
+    Populates the Debug Symbols project output group.
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <DebugSymbolsProjectOutputGroupDependsOn>AssignCultures</DebugSymbolsProjectOutputGroupDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="DebugSymbolsProjectOutputGroup"
+    Outputs="@(DebugSymbolsProjectOutputGroupOutput)"
+    DependsOnTargets="$(DebugSymbolsProjectOutputGroupDependsOn)">
+
+    <!-- Include build output pdb(s).  Different than predefined itemgroup since AssignCultures target may change -->
+    <CreateItem
+      Include="$(TargetPdbPath)"
+      Condition=" '$(SuppressPdbOutput)' != 'true' ">
+      <Output TaskParameter="Include" ItemName="DebugSymbolsProjectOutputGroupOutput" />
+    </CreateItem>
+  </Target>
+
+  <!--
+  ==================================================================================================
+  DocumentationProjectOutputGroup
+
+    Populates the Documentation project output group.
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <DocumentationProjectOutputGroupDependsOn></DocumentationProjectOutputGroupDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="DocumentationProjectOutputGroup"
+    Outputs="@(DocumentationProjectOutputGroupOutput)"
+    DependsOnTargets="$(DocumentationProjectOutputGroupDependsOn)" />
+
+  <!--
+  ==================================================================================================
+  SatelliteDllsProjectOutputGroup
+
+    Populates the Satellite Files project output group.
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <SatelliteDllsProjectOutputGroupDependsOn>PrepareForBuild</SatelliteDllsProjectOutputGroupDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="SatelliteDllsProjectOutputGroup"
+    Outputs="@(SatelliteDllsProjectOutputGroupOutput)"
+    DependsOnTargets="$(SatelliteDllsProjectOutputGroupDependsOn)" />
+
+  <!--
+  ==================================================================================================
+  SourceFilesProjectOutputGroup
+
+    Populates the Source Files project output group.
+    Source files are items in the project whose type is "Compile" and "EmbeddedResource".
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <SourceFilesProjectOutputGroupDependsOn>PrepareForBuild</SourceFilesProjectOutputGroupDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="SourceFilesProjectOutputGroup"
+    Outputs="@(SourceFilesProjectOutputGroupOutput)"
+    DependsOnTargets="$(SourceFilesProjectOutputGroupDependsOn)">
+
+    <AssignTargetPath Files="@(Compile)" RootFolder="$(MSBuildProjectDirectory)">
+      <Output TaskParameter="AssignedFiles" ItemName="_CompileWithTargetPath"  />
+    </AssignTargetPath>
+
+    <AssignTargetPath Files="@(EmbeddedResource)" RootFolder="$(MSBuildProjectDirectory)">
+      <Output TaskParameter="AssignedFiles" ItemName="_EmbeddedResourceWithTargetPath" />
+    </AssignTargetPath>
+
+    <!-- First we deal with Compile and EmbeddedResource -->
+    <CreateItem Include="@(_CompileWithTargetPath->'%(FullPath)');@(_EmbeddedResourceWithTargetPath->'%(FullPath)')">
+      <Output TaskParameter="Include" ItemName="SourceFilesProjectOutputGroupOutput" />
+    </CreateItem>
+
+    <!-- Include the project file -->
+    <CreateItem Include="$(MSBuildProjectFullPath)" AdditionalMetadata="TargetPath=$(ProjectFileName)">
+      <Output TaskParameter="Include" ItemName="SourceFilesProjectOutputGroupOutput" />
+    </CreateItem>
+
+  </Target>
+
+  <!--
+  ==================================================================================================
+  ContentFilesProjectOutputGroup
+
+    Populates the Content Files project output group.
+    Content files are items in the project whose type is "Content".
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <ContentFilesProjectOutputGroupDependsOn>PrepareForBuild</ContentFilesProjectOutputGroupDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="ContentFilesProjectOutputGroup"
+    Outputs="@(ContentFilesProjectOutputGroupOutput)"
+    DependsOnTargets="$(ContentFilesProjectOutputGroupDependsOn)">
+
+    <AssignTargetPath Files="@(Content)" RootFolder="$(MSBuildProjectDirectory)">
+      <Output TaskParameter="AssignedFiles" ItemName="ContentWithTargetPath" />
+    </AssignTargetPath>
+
+    <!-- Convert items into final items; this way we can get the full path for each item. -->
+    <CreateItem Include="@(ContentWithTargetPath->'%(FullPath)')">
+      <Output TaskParameter="Include" ItemName="ContentFilesProjectOutputGroupOutput" />
+    </CreateItem>
+
+  </Target>
+
+  <!--
+  ==================================================================================================
+  SGenFilesOutputGroup
+
+    Populates the GenerateSerializationAssemblies Files project output group.
+    GenerateSerializationAssemblies files are those generated by the GenerateSerializationAssemblies
+    target and task.
+  ==================================================================================================
+  -->
+  <PropertyGroup>
+    <SGenFilesOutputGroupDependsOn></SGenFilesOutputGroupDependsOn>
+  </PropertyGroup>
+  <Target
+    Name="SGenFilesOutputGroup"
+    Outputs="@(SGenFilesOutputGroupOutput)"
+    DependsOnTargets="$(SGenFilesOutputGroupDependsOn)" />
+
+  <!-- Extension point: Define CustomAfterWixTargets to a .targets file that you want to include after this file. -->
+  <Import Project="$(CustomAfterWixTargets)" Condition=" '$(CustomAfterWixTargets)' != '' and Exists('$(CustomAfterWixTargets)')" />
+
+  <!-- MSBuildToolsVersion is set for MSBuild 3.5 and later, which is a requirement for lux.targets. -->
+  <Import Project="$(LuxTargetsPath)" Condition=" '$(MSBuildToolsVersion)' != '' and '$(LuxTargetsPath)' != '' and Exists('$(LuxTargetsPath)')" />
+</Project>
diff --git a/wui.dll b/wui.dll
new file mode 100755
index 0000000..95b7aad
--- /dev/null
+++ b/wui.dll
Binary files differ