From: Owen Leonard <owen@balawis.leonard.fam>
Date: Mon, 6 Sep 2010 23:34:35 +0000 (-0600)
Subject: Updated "Phone 1" field to be "Household Phone" to match MLS
X-Git-Tag: release_0_4_0~3
X-Git-Url: http://git.pippins.net/%27%20%20%20%20.%20%24GLOBALS%5B%27phpgw%27%5D-%3Elink%28%27inc/jquery/images/static/%7Bupdate_month%7D?a=commitdiff_plain;h=fd3afb11f083a1d2610997ee85c550ff67586314;p=eq%2F.git

Updated "Phone 1" field to be "Household Phone" to match MLS
updated install instructions
added mls report file to create the home teaching stats csv file
adding C# windows program and python script for parsing mls data (c#-.net 3.5, python-2.6)
---

diff --git a/bin/import_ward_data b/bin/import_ward_data
index ef7eac4..b369661 100755
--- a/bin/import_ward_data
+++ b/bin/import_ward_data
@@ -54,6 +54,38 @@ sub csv_to_hash
     close(FILE);
 }
 
+sub optional_csv_to_hash
+{
+    my ($filename, $hashref) = @_;
+
+    my $opened = open(FILE,$filename);
+
+    if ($opened) {
+        my $found_header = 0; my $index = 0;
+        while(<FILE>)
+        {
+	    $line = $_;
+	    @data = split /\",/, $line;
+	    if(!$found_header) { @header = @data; $found_header = 1; }
+	    else {
+	        foreach $i (0..$#data-1) {
+		    $data[$i] =~ s/\"//g;
+		    $header[$i] =~ s/\"//g;
+	            $hashref->{$index}{$header[$i]} = $data[$i];
+		    #print "$index: $i: $header[$i]: $data[$i]\n";
+	        }
+	        $index++;
+	    }
+        }
+    
+    close(FILE);
+    }
+    else
+    {
+        print "-W- could not open optional csv file $filename\n";
+    }
+}
+
 ######################################################################
 sub print_hash
 {
@@ -96,7 +128,7 @@ sub update_eq_aaronic_table
 	        $membership_data{$index}{$key} =~ /^Teacher\s*$/i ||
 		$membership_data{$index}{$key} =~ /^Priest\s*$/i)) {
 		$aaronic_name = $membership_data{$index}{'Preferred Name'};
-		$phone = $membership_data{$index}{'Phone 1'};
+		$phone = $membership_data{$index}{'Household Phone'};
 		if($phone =~ /(\d\d\d-\d\d\d\d)/) { $phone = "$areacode-$1"; }
 		if($phone =~ /^\(\d\d\d\) (\d\d\d-\d\d\d\d)/) { $phone = "$1-$2"; }
 		$sth = $dbh->prepare("select * from eq_aaronic where name='$aaronic_name'");
@@ -157,7 +189,7 @@ sub update_eq_elder_table
 	    if($key =~ /Priesthood/i && $membership_data{$index}{$key} =~ /Elder/i) {
 		$id = $membership_data{$index}{'Indiv ID'};
 		$elder_name = $membership_data{$index}{'Preferred Name'};
-		$phone = $membership_data{$index}{'Phone 1'};
+		$phone = $membership_data{$index}{'Household Phone'};
 		$organization = $organization_by_id{$id};
 		$attending = 0;
 		if(($organization =~ /Elders/) ||
@@ -496,7 +528,7 @@ sub update_eq_parent_table
 		$birthday =~ /(\d+) (\S+) (\d+)/; $day=$1; $month=$monthname2num{$2}; $year=$3;
 		$hofh_id = $membership_data{$index}{'HofH ID'};
 		$id = $membership_data{$index}{'Indiv ID'};
-		$phone = $membership_data{$index}{'Phone 1'};
+		$phone = $membership_data{$index}{'Household Phone'};
 		if($phone =~ /(\d\d\d-\d\d\d\d)/) { $phone = "$areacode-$1"; }
 		if($phone =~ /^\(\d\d\d\) (\d\d\d-\d\d\d\d)/) { $phone = "$1-$2"; }
 		$address = $membership_data{$index}{'Street 1'};
@@ -625,6 +657,113 @@ sub update_eq_child_table
     }
 }
 
+# EQ_VISIT
+#+----------------+------------------+------+-----+---------+-------+
+#| Field          | Type             | Null | Key | Default | Extra |
+#+----------------+------------------+------+-----+---------+-------+
+#| visit          | int(16) unsigned |      | PRI | 0       |   A   |
+#| family         | int(16) unsigned | YES  | UNI | NULL    |       |
+#| companionship  | int(16) unsigned | YES  |     | NULL    |       |
+#| date           | date             | YES  |     | NULL    |       |
+#| notes          | varchar(128)     | YES  |     | NULL    |       |
+#| visited        | varchar(1)       | YES  |     | NULL    |       |
+#+----------------+------------------+------+-----+---------+-------+
+sub update_eq_visit_table
+{
+	print "\n-> updating eq_visit table\n";
+	
+	my $month_header_retrieved = 0;
+	my $month_header;
+	my @data_months;
+	my %months = ('Jan', 1, 'Feb', 2, 'Mar', 3, 'Apr', 4, 'May', 5, 'Jun', 6, 'Jul', 7, 'Aug', 8, 'Sep', 9, 'Oct', 10, 'Nov', 11, 'Dec', 12);
+	($second, $minute, $hour, $dayOfMonth, $month, $yearOffset, $dayOfWeek, $dayOfYear, $daylightSavings) = localtime();
+	my %visit_status = ('X', 'y', '-', 'n', '', '');
+	
+	foreach $index (keys %hometeaching_stats_data)
+	{
+		$hashref = $hometeaching_stats_data{$index};
+		#foreach $key (keys %$hashref) {print "$key\n";}
+		
+		$family_name = $hometeaching_stats_data{$index}{"Preferred Name"};
+		print "   Updating visit data: $family_name\n";
+
+		# get family id from eq_family
+		$sth = $dbh->prepare("select * from eq_family where name=\"$family_name\" and valid=1");
+		$sth->execute or die "-E- DB error: $DBI::errstr\n";
+		my @family_data = ();
+		while($sqlhashref = $sth->fetchrow_hashref) { push(@family_data, $sqlhashref); }
+		my $family_rows = scalar @family_data;
+		if($family_rows > 0) { 
+			$family_id = $family_data[0]->{'family'}; 
+			$comp_id = $family_data[0]->{'companionship'};
+		}
+		else { next; }
+		#print "family_id = $family_id\n";
+		#print "comp_id = $comp_id\n";
+		
+		# ignore visits that weren't done by the EQ
+		if ($comp_id == 0) { next; }
+		
+		# retrieve the month header if not already done
+		if ($month_header_retrieved == 0)
+		{
+			foreach $key (keys %$hashref) 
+			{
+				if (($key ne "Preferred Name") && ($key ne "Home Teachers"))
+				{
+					$month_header = $key;
+					@data_months = split /\t/, $key;
+				}
+			}
+			$month_header_retrieved = 1;
+		}
+		
+		# loop through history data
+		@history = split /\t/, $hometeaching_stats_data{$index}{$month_header};
+		my $data_year = 1900 + $yearOffset;
+		my $data_month = $months{$data_months[-1]};
+		#print "$month_header\n";
+		#print $hometeaching_stats_data{$index}{$month_header};
+		#print "\n";
+		foreach $i (reverse(0..$#history)) {
+			# went back a calendar year, decrement $data_year
+			if ($months{$data_months[$i]} > $data_month)
+			{
+				$data_year -= 1;
+			}
+			$data_month = $months{$data_months[$i]};
+			my $visit_date = sprintf("%4d-%02d-01\n", $data_year, $data_month);
+			#print "$visit_date\n";
+			my $importing_status = $visit_status{$history[$i]};
+			#print "importing_status = $importing_status\n";
+			#print "select * from eq_visit where family=$family_id and companionship=$comp_id and date='$visit_date'\n";
+			$sth = $dbh->prepare("select * from eq_visit where family=$family_id and companionship=$comp_id and date='$visit_date'");
+			$sth->execute or die "-E- DB error: $DBI::errstr\n";
+			my @visit_data = ();
+			while($sqlhashref = $sth->fetchrow_hashref) { push(@visit_data, $sqlhashref); }
+			my $visit_rows = scalar @visit_data;
+			if($visit_rows > 0) { 
+				my $visited = $visit_data[0]->{'visited'}; 
+				#print "visited = $visited\n";
+				# update visit if data is different in eq_visit
+				if ($visited ne $importing_status)
+				{
+					#print "importing_status = $importing_status\n";
+					$sth = $dbh->prepare("update eq_visit set visited='$importing_status' where family='$family_id' and date='$visit_date' and companionship='$comp_id'");
+					$sth->execute or die "-E- DB error: $DBI::errstr\n";
+				}
+			} else {
+				if ($importing_status ne '')
+				{
+					# add visit if it doesn't exist in eq_visit
+					$sth = $dbh->prepare("insert into eq_visit values (NULL, '$family_id', '$comp_id', '$visit_date', '', '$importing_status')");
+					$sth->execute or die "-E- DB error: $DBI::errstr\n";
+				}
+			}
+		}
+	}
+}
+
 ######################################################################
 sub check_for_changed_ids
 {
@@ -705,6 +844,7 @@ print "\n-> Processing all ward data files in $datadir\n";
 &csv_to_hash("$datadir/Membership.csv",\%membership_data);
 &csv_to_hash("$datadir/HomeTeaching.csv",\%hometeaching_data);
 &csv_to_hash("$datadir/Organization.csv",\%organization_data);
+&optional_csv_to_hash("$datadir/Home\ Teacher\ per\ Companionship.csv", \%hometeaching_stats_data);
 %organization_by_name = ();
 %organization_by_id = ();
 
@@ -715,6 +855,8 @@ if($opt_v) {
     &print_hash(\%hometeaching_data);
     print "-> Organization Data Dump\n\n";
     &print_hash(\%organization_data);
+    print "-> HomeTeaching Stats Data Dump\n\n";
+    &print_hash(\%hometeaching_stats_data);
 }
 
 if($opt_s) { $dbh->disconnect(); exit; }
@@ -728,6 +870,7 @@ if($opt_s) { $dbh->disconnect(); exit; }
 &update_eq_family_table();
 &update_eq_parent_table();
 &update_eq_child_table();
+&update_eq_visit_table();
 
 print "\n-> Import Successful! DONE...\n";
 
diff --git a/doc/install.txt b/doc/install.txt
index 4ae8d9c..114ebaa 100644
--- a/doc/install.txt
+++ b/doc/install.txt
@@ -64,13 +64,15 @@ Requirements
 
    Membership.csv:
      Preferred Name
-     Phone 1
+     Household Phone
      Indiv ID
      HofH ID
      Street 1
      Street 2
      Birth
      Full Name
+     Priesthood
+     HH Position
     
    Hometeaching.csv:
      Home Teacher 1
@@ -78,6 +80,8 @@ Requirements
      Comp ID
      HT District
      Household
+     Quorum
+     Supervisor
        
    Organization.csv:
      Indiv ID
@@ -87,3 +91,5 @@ Requirements
      Org Seq
      Sustained
    
+   Home Teacher per Companionship.csv  (optional file that lists home teaching stats - use all fields)
+     import mls/Home\ Teacher\ per\ Companionship.mls as a new report into MLS to create the csv file.
diff --git a/mls/Home Teacher per Companionship.mls b/mls/Home Teacher per Companionship.mls
new file mode 100644
index 0000000..007037c
--- /dev/null
+++ b/mls/Home Teacher per Companionship.mls	
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<customReport name="Home Teacher per Companionship" description="Bishop folder 12 month HT stats" isPortrait="false" groupOption="NONE" splitGroups="false">
+  <query string="28,0,0,true,-1" />
+  <query string="4,0,0,true,-1" />
+  <column typeID="31" width="19" />
+  <column typeID="49" width="33" />
+  <column typeID="55" width="40" />
+</customReport>
+
diff --git a/mls/mlstrimmer.py b/mls/mlstrimmer.py
new file mode 100755
index 0000000..ccd55e3
--- /dev/null
+++ b/mls/mlstrimmer.py
@@ -0,0 +1,116 @@
+#! /usr/bin/env python
+
+import os
+import sys
+import csv
+import zipfile
+import tempfile
+from optparse import OptionParser
+from xml.dom.minidom import parse, parseString
+
+def ParseFile(xmlNode, zipfile):
+	
+	filename = os.path.join(options.directory, xmlNode.getAttribute("Name"))
+	if options.verbose: print "Trimming %s" % (filename)
+	
+	#create dictionary of header locations
+	headers = xmlNode.getElementsByTagName("MLSField")
+	allColumns = False
+	headerMap = {}
+	for header in headers:
+		if header.firstChild.data == "*":
+			allColumns = True
+		else:
+			headerMap[header.firstChild.data] = -1
+	if options.verbose: print "xml file says to save: %s" % (headerMap)
+	
+	try:
+		f = csv.reader(open(filename))
+		firstLineRead = False
+		
+		tf = tempfile.NamedTemporaryFile()
+		
+		headersToSave = []
+		for line in f:
+			if not firstLineRead:
+				s1 = set(item for item in line if item != '')
+				s2 = set(headerMap.keys())
+				if allColumns:
+					s2 = s1
+				
+				s3 = s1.intersection(s2)
+				
+				headerMap.clear()
+				for i in s3:
+					headerMap[i] = line.index(i)
+				headersToSave = headerMap.keys()
+				if options.verbose: print "The columns that exist in both the xml and csv files are:" % (headersToSave)
+				firstLineRead = True
+			
+			lineToWrite = ""
+			for h in headersToSave:
+				lineToWrite = "%s\"%s\"," % (lineToWrite, line[headerMap[h]])
+			if options.verbose: print lineToWrite
+			tf.write(lineToWrite + "\n")
+			#if options.verbose: print line
+		zipfile.write(tf.name, xmlNode.getAttribute("Name"))
+		tf.close()
+		
+	except IOError, e:
+		print e
+		sys.exit()
+
+
+
+if __name__ == '__main__':
+	# read in command line arguments and parse them
+	parser = OptionParser()
+	parser.add_option("-c", dest="configFile", default="MLSRequiredFields.xml",
+		help="xml config file name")
+	parser.add_option("-d", "--directory", dest="directory", default=os.environ["PWD"],
+		help="directory where csv files are located")
+	parser.add_option("-v", "--verbose", dest="verbose", action="store_true",
+		help="show verbose messaging")
+	(options, args) = parser.parse_args()
+
+	# make sure xml file exists and we can read it
+	if not os.access(options.configFile, os.R_OK):
+		print "%s is not accessible" % (options.configFile)
+		sys.exit()
+	# make sure we have write perms on the directory
+	if not os.access(options.directory, os.W_OK):
+		print "%s is not accessible" % (options.directory)
+		sys.exit()
+	
+	# read in the xml
+	dom1 = parse(options.configFile)
+	mlsFiles = dom1.firstChild.childNodes[1].getElementsByTagName("MLSFile")
+	
+	# make sure all files are accessible (if they are not optional)
+	for csvFile in mlsFiles:
+		fullname = os.path.join(options.directory, csvFile.getAttribute("Name"))
+		if not os.access(fullname, os.W_OK):
+			print "%s does not exist, or has the wrong permissions" % (fullname)
+			sys.exit()
+		
+	
+	# create zip file
+	try:
+		zfile = zipfile.ZipFile(os.path.join(options.directory, "EQZipFile.zip"), "w")
+		for csvFile in mlsFiles:
+			ParseFile(csvFile, zfile)
+		zfile.close()
+	except IOError, e:
+		print e
+		sys.exit()
+	
+	# delete original files
+	for csvFile in mlsFiles:
+		fullname = os.path.join(options.directory, csvFile.getAttribute("Name"))
+		try:
+			os.remove(fullname)
+		except OSError, e:
+			print "could not delete %s, please delete it manually" % (fullname)
+	
+
+	if options.verbose: print "Finished!"
diff --git a/mls/windowsGUI/MLSFileTrimmer.sln b/mls/windowsGUI/MLSFileTrimmer.sln
new file mode 100644
index 0000000..6c54695
--- /dev/null
+++ b/mls/windowsGUI/MLSFileTrimmer.sln
@@ -0,0 +1,24 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MLSFileTrimmer", "MLSFileTrimmer\MLSFileTrimmer.csproj", "{FB8A0153-84AA-402E-A5F4-E790AFF2B261}"
+EndProject
+Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "MLSFileTrimmerInstaller", "MLSFileTrimmerInstaller\MLSFileTrimmerInstaller.vdproj", "{BB14AFD8-EE0B-4094-B69A-DBC2AA4F6554}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{FB8A0153-84AA-402E-A5F4-E790AFF2B261}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{FB8A0153-84AA-402E-A5F4-E790AFF2B261}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{FB8A0153-84AA-402E-A5F4-E790AFF2B261}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{FB8A0153-84AA-402E-A5F4-E790AFF2B261}.Release|Any CPU.Build.0 = Release|Any CPU
+		{BB14AFD8-EE0B-4094-B69A-DBC2AA4F6554}.Debug|Any CPU.ActiveCfg = Debug
+		{BB14AFD8-EE0B-4094-B69A-DBC2AA4F6554}.Release|Any CPU.ActiveCfg = Release
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
diff --git a/mls/windowsGUI/MLSFileTrimmer/App.xaml b/mls/windowsGUI/MLSFileTrimmer/App.xaml
new file mode 100644
index 0000000..9220222
--- /dev/null
+++ b/mls/windowsGUI/MLSFileTrimmer/App.xaml
@@ -0,0 +1,8 @@
+<Application x:Class="MLSFileTrimmer.App"
+    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+    StartupUri="Window1.xaml">
+    <Application.Resources>
+         
+    </Application.Resources>
+</Application>
diff --git a/mls/windowsGUI/MLSFileTrimmer/App.xaml.cs b/mls/windowsGUI/MLSFileTrimmer/App.xaml.cs
new file mode 100644
index 0000000..62de0bb
--- /dev/null
+++ b/mls/windowsGUI/MLSFileTrimmer/App.xaml.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Configuration;
+using System.Data;
+using System.Linq;
+using System.Windows;
+
+namespace MLSFileTrimmer
+{
+    /// <summary>
+    /// Interaction logic for App.xaml
+    /// </summary>
+    public partial class App : Application
+    {
+    }
+}
diff --git a/mls/windowsGUI/MLSFileTrimmer/CSVTrimmer.cs b/mls/windowsGUI/MLSFileTrimmer/CSVTrimmer.cs
new file mode 100644
index 0000000..9b39874
--- /dev/null
+++ b/mls/windowsGUI/MLSFileTrimmer/CSVTrimmer.cs
@@ -0,0 +1,82 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.IO;
+
+namespace MLSFileTrimmer
+{
+    public class CSVTrimmer
+    {
+        private String filename = String.Empty;
+        private Hashtable mlsFields = new Hashtable();
+
+        public CSVTrimmer(ThirdCouncelorMLSFilesMLSFile xmlData)
+        {
+            this.filename = xmlData.Name;
+
+            foreach (String s in xmlData.MLSField)
+            {
+                this.mlsFields.Add(s, -1);
+            }
+        }
+
+        public void ExtractData(StreamReader readFile, StreamWriter outFile)
+        {
+            string line;
+            string[] row;
+
+            // get headers and create mapping
+            if ((line = readFile.ReadLine()) != null)
+            {
+                row = line.Split('"');
+                for (int x = 0; x < row.Length; x++)
+                {
+                    if (!(row[x].Equals(",")) && !(row[x].Equals("")))
+                    {
+                        if (this.mlsFields.ContainsKey(row[x]) || this.mlsFields.ContainsKey("*"))
+                        {
+                            this.mlsFields[row[x]] = x;
+                        }
+                    }
+                }
+            }
+
+            // write headers in new file
+            ICollection headers = this.mlsFields.Keys;
+            StringBuilder sb = new StringBuilder();
+            foreach (string s in headers)
+            {
+                int index = Convert.ToInt32(this.mlsFields[s]);
+                if (index >= 0)
+                {
+                    sb.Append("\"");
+                    sb.Append(s);
+                    sb.Append("\",");
+                }
+            }
+            //sb.Remove(sb.Length - 1, 1);   // remove trailing comma
+            outFile.WriteLine(sb.ToString());
+
+            // only write specified fields in new file
+            while ((line = readFile.ReadLine()) != null)
+            {
+                sb.Remove(0, sb.Length);
+                row = line.Split('"');
+                foreach (string s in headers)
+                {
+                    int index = Convert.ToInt32(this.mlsFields[s]);
+                    if (index >= 0)
+                    {
+                        sb.Append("\"");
+                        sb.Append(row[index]);
+                        sb.Append("\",");
+                    }
+                }
+                //sb.Remove(sb.Length - 1, 1);   // remove trailing comma
+                outFile.WriteLine(sb.ToString());
+            }
+        }
+    }
+}
diff --git a/mls/windowsGUI/MLSFileTrimmer/Ionic.Zip.dll b/mls/windowsGUI/MLSFileTrimmer/Ionic.Zip.dll
new file mode 100644
index 0000000..7b11577
Binary files /dev/null and b/mls/windowsGUI/MLSFileTrimmer/Ionic.Zip.dll differ
diff --git a/mls/windowsGUI/MLSFileTrimmer/MLSFileTrimmer.csproj b/mls/windowsGUI/MLSFileTrimmer/MLSFileTrimmer.csproj
new file mode 100644
index 0000000..24b3d04
--- /dev/null
+++ b/mls/windowsGUI/MLSFileTrimmer/MLSFileTrimmer.csproj
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{FB8A0153-84AA-402E-A5F4-E790AFF2B261}</ProjectGuid>
+    <OutputType>WinExe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>MLSFileTrimmer</RootNamespace>
+    <AssemblyName>MLSFileTrimmer</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Ionic.Zip, Version=1.9.1.5, Culture=neutral, PublicKeyToken=edbe51ad942a3f5c, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>.\Ionic.Zip.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+    <Reference Include="WindowsBase" />
+    <Reference Include="PresentationCore" />
+    <Reference Include="PresentationFramework" />
+  </ItemGroup>
+  <ItemGroup>
+    <ApplicationDefinition Include="App.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </ApplicationDefinition>
+    <Page Include="Window1.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
+    <Compile Include="App.xaml.cs">
+      <DependentUpon>App.xaml</DependentUpon>
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Window1.xaml.cs">
+      <DependentUpon>Window1.xaml</DependentUpon>
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="CSVTrimmer.cs" />
+    <Compile Include="MLSRequiredFields.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\Settings.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
+    <None Include="Properties\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+    </None>
+    <AppDesigner Include="Properties\" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="MLSRequiredFields.xml">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
diff --git a/mls/windowsGUI/MLSFileTrimmer/MLSRequiredFields.cs b/mls/windowsGUI/MLSFileTrimmer/MLSRequiredFields.cs
new file mode 100644
index 0000000..0f00757
--- /dev/null
+++ b/mls/windowsGUI/MLSFileTrimmer/MLSRequiredFields.cs
@@ -0,0 +1,118 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:2.0.50727.4005
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+using System.Xml.Serialization;
+
+// 
+// This source code was auto-generated by xsd, Version=2.0.50727.3038.
+// 
+
+namespace MLSFileTrimmer
+{
+
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
+    [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
+    public partial class ThirdCouncelorMLSFiles
+    {
+
+        private ThirdCouncelorMLSFilesMLSFile[] cSVFilesField;
+
+        /// <remarks/>
+        [System.Xml.Serialization.XmlArrayItemAttribute("MLSFile", IsNullable = false)]
+        public ThirdCouncelorMLSFilesMLSFile[] CSVFiles
+        {
+            get
+            {
+                return this.cSVFilesField;
+            }
+            set
+            {
+                this.cSVFilesField = value;
+            }
+        }
+    }
+
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
+    public partial class ThirdCouncelorMLSFilesMLSFile
+    {
+
+        private string descriptionField;
+
+        private string extensionField;
+
+        private string[] mLSFieldField;
+
+        private string nameField;
+
+        /// <remarks/>
+        public string Description
+        {
+            get
+            {
+                return this.descriptionField;
+            }
+            set
+            {
+                this.descriptionField = value;
+            }
+        }
+
+        /// <remarks/>
+        public string Extension
+        {
+            get
+            {
+                return this.extensionField;
+            }
+            set
+            {
+                this.extensionField = value;
+            }
+        }
+
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("MLSField")]
+        public string[] MLSField
+        {
+            get
+            {
+                return this.mLSFieldField;
+            }
+            set
+            {
+                this.mLSFieldField = value;
+            }
+        }
+
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAttributeAttribute()]
+        public string Name
+        {
+            get
+            {
+                return this.nameField;
+            }
+            set
+            {
+                this.nameField = value;
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/mls/windowsGUI/MLSFileTrimmer/MLSRequiredFields.xml b/mls/windowsGUI/MLSFileTrimmer/MLSRequiredFields.xml
new file mode 100644
index 0000000..1c2ea73
--- /dev/null
+++ b/mls/windowsGUI/MLSFileTrimmer/MLSRequiredFields.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<ThirdCouncelorMLSFiles xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <CSVFiles>
+    <MLSFile Name="Membership.csv">
+      <Description>Membership file</Description>
+      <Extension>csv</Extension>
+      <MLSField>Preferred Name</MLSField>
+      <MLSField>Household Phone</MLSField>
+      <MLSField>Indiv ID</MLSField>
+      <MLSField>HofH ID</MLSField>
+      <MLSField>Street 1</MLSField>
+      <MLSField>Street 2</MLSField>
+      <MLSField>Birth</MLSField>
+      <MLSField>Full Name</MLSField>
+      <MLSField>Priesthood</MLSField>
+      <MLSField>HH Position</MLSField>
+    </MLSFile>
+
+    <MLSFile Name="HomeTeaching.csv">
+      <Description>Home Teaching file</Description>
+      <Extension>csv</Extension>
+      <MLSField>Home Teacher 1</MLSField>
+      <MLSField>Home Teacher 2</MLSField>
+      <MLSField>Comp ID</MLSField>
+      <MLSField>HT District</MLSField>
+      <MLSField>Household</MLSField>
+      <MLSField>Quorum</MLSField>
+      <MLSField>Supervisor</MLSField>
+    </MLSFile>
+
+    <MLSFile Name="Organization.csv">
+      <Description>Organization file</Description>
+      <Extension>csv</Extension>
+      <MLSField>Indiv ID</MLSField>
+      <MLSField>Indiv Name</MLSField>
+      <MLSField>Organization</MLSField>
+      <MLSField>Position</MLSField>
+      <MLSField>Org Seq</MLSField>
+      <MLSField>Sustained</MLSField>
+    </MLSFile>
+
+    <MLSFile Name="Home Teacher per Companionship.csv">
+      <Description>Home Teaching Statistics file</Description>
+      <Extension>csv</Extension>
+      <MLSField>*</MLSField>
+    </MLSFile>
+  </CSVFiles>
+</ThirdCouncelorMLSFiles>
diff --git a/mls/windowsGUI/MLSFileTrimmer/MLSRequiredFields.xsd b/mls/windowsGUI/MLSFileTrimmer/MLSRequiredFields.xsd
new file mode 100644
index 0000000..3e3a2f1
--- /dev/null
+++ b/mls/windowsGUI/MLSFileTrimmer/MLSRequiredFields.xsd
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xs:element name="ThirdCouncelorMLSFiles">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="CSVFiles">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:element maxOccurs="unbounded" name="MLSFile">
+                <xs:complexType>
+                  <xs:sequence>
+                    <xs:element name="Description" type="xs:string" />
+                    <xs:element name="Extension" type="xs:string" />
+                    <xs:element maxOccurs="unbounded" name="MLSField" type="xs:string" />
+                  </xs:sequence>
+                  <xs:attribute name="Name" type="xs:string" use="required" />
+                </xs:complexType>
+              </xs:element>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+</xs:schema>
\ No newline at end of file
diff --git a/mls/windowsGUI/MLSFileTrimmer/Properties/AssemblyInfo.cs b/mls/windowsGUI/MLSFileTrimmer/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..bcedbd1
--- /dev/null
+++ b/mls/windowsGUI/MLSFileTrimmer/Properties/AssemblyInfo.cs
@@ -0,0 +1,55 @@
+using System.Reflection;
+using System.Resources;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Windows;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("MLSFileTrimmer")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("HP")]
+[assembly: AssemblyProduct("MLSFileTrimmer")]
+[assembly: AssemblyCopyright("Copyright © HP 2010")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+//In order to begin building localizable applications, set 
+//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file
+//inside a <PropertyGroup>.  For example, if you are using US english
+//in your source files, set the <UICulture> to en-US.  Then uncomment
+//the NeutralResourceLanguage attribute below.  Update the "en-US" in
+//the line below to match the UICulture setting in the project file.
+
+//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
+
+
+[assembly: ThemeInfo(
+    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
+    //(used if a resource is not found in the page, 
+    // or application resource dictionaries)
+    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
+    //(used if a resource is not found in the page, 
+    // app, or any theme specific resource dictionaries)
+)]
+
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/mls/windowsGUI/MLSFileTrimmer/Properties/Resources.Designer.cs b/mls/windowsGUI/MLSFileTrimmer/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..00d8a15
--- /dev/null
+++ b/mls/windowsGUI/MLSFileTrimmer/Properties/Resources.Designer.cs
@@ -0,0 +1,71 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:2.0.50727.4005
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace MLSFileTrimmer.Properties
+{
+
+
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources
+    {
+
+        private static global::System.Resources.ResourceManager resourceMan;
+
+        private static global::System.Globalization.CultureInfo resourceCulture;
+
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources()
+        {
+        }
+
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager
+        {
+            get
+            {
+                if ((resourceMan == null))
+                {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MLSFileTrimmer.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture
+        {
+            get
+            {
+                return resourceCulture;
+            }
+            set
+            {
+                resourceCulture = value;
+            }
+        }
+    }
+}
diff --git a/mls/windowsGUI/MLSFileTrimmer/Properties/Resources.resx b/mls/windowsGUI/MLSFileTrimmer/Properties/Resources.resx
new file mode 100644
index 0000000..ffecec8
--- /dev/null
+++ b/mls/windowsGUI/MLSFileTrimmer/Properties/Resources.resx
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file
diff --git a/mls/windowsGUI/MLSFileTrimmer/Properties/Settings.Designer.cs b/mls/windowsGUI/MLSFileTrimmer/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..2b4bf23
--- /dev/null
+++ b/mls/windowsGUI/MLSFileTrimmer/Properties/Settings.Designer.cs
@@ -0,0 +1,30 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:2.0.50727.4005
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace MLSFileTrimmer.Properties
+{
+
+
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")]
+    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+    {
+
+        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+        public static Settings Default
+        {
+            get
+            {
+                return defaultInstance;
+            }
+        }
+    }
+}
diff --git a/mls/windowsGUI/MLSFileTrimmer/Properties/Settings.settings b/mls/windowsGUI/MLSFileTrimmer/Properties/Settings.settings
new file mode 100644
index 0000000..8f2fd95
--- /dev/null
+++ b/mls/windowsGUI/MLSFileTrimmer/Properties/Settings.settings
@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
+  <Profiles>
+    <Profile Name="(Default)" />
+  </Profiles>
+  <Settings />
+</SettingsFile>
\ No newline at end of file
diff --git a/mls/windowsGUI/MLSFileTrimmer/Window1.xaml b/mls/windowsGUI/MLSFileTrimmer/Window1.xaml
new file mode 100644
index 0000000..074a27e
--- /dev/null
+++ b/mls/windowsGUI/MLSFileTrimmer/Window1.xaml
@@ -0,0 +1,13 @@
+<Window x:Class="MLSFileTrimmer.Window1"
+    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+    Title="MLS File Trimmer" Height="200" Width="600" MaxHeight="Infinity" MaxWidth="Infinity" MinHeight="0" MinWidth="0" ResizeMode="CanMinimize">
+    <Grid Background="Silver">
+        <Label Margin="20,30,30,0" Name="label4" VerticalAlignment="Top" Height="30">Please specify the directory where the MLS csv files are.</Label>
+        <TextBox Margin="20,70,130,60" Name="outputDirtextBox" FlowDirection="LeftToRight" HorizontalContentAlignment="Left" VerticalContentAlignment="Center" TextWrapping="NoWrap" Height="30" />
+        <Button Margin="0,70,20,61" Name="outDirButton" HorizontalAlignment="Right" Width="100" Height="30" Click="outDirButton_Click">Browse</Button>
+        <Button Margin="0,0,20,20" Name="parseButton" HorizontalAlignment="Right" VerticalAlignment="Bottom" Width="100" Height="30" Click="parseButton_Click">OK</Button>
+        <Label Height="28" HorizontalAlignment="Right" Margin="0,27.233,20,0" Name="finishedLabel" VerticalAlignment="Top" Width="100" FontSize="16" Foreground="Red" HorizontalContentAlignment="Center" Visibility="Hidden">Finished!</Label>
+        <Label Height="28" HorizontalAlignment="Right" Margin="0,27.233,20,0" Name="trimmingLabel" VerticalAlignment="Top" Width="100" FontSize="16" Foreground="Green" HorizontalContentAlignment="Center" Visibility="Hidden" >Trimming...</Label>
+    </Grid>
+</Window>
diff --git a/mls/windowsGUI/MLSFileTrimmer/Window1.xaml.cs b/mls/windowsGUI/MLSFileTrimmer/Window1.xaml.cs
new file mode 100644
index 0000000..098aa47
--- /dev/null
+++ b/mls/windowsGUI/MLSFileTrimmer/Window1.xaml.cs
@@ -0,0 +1,151 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using Microsoft.Win32;
+using System.IO;
+using FolderBrowserDialog = System.Windows.Forms.FolderBrowserDialog;
+using System.Xml.Serialization;
+using System.Xml;
+using Ionic.Zip;
+using System.ComponentModel;
+using System.Threading;
+
+namespace MLSFileTrimmer
+{
+    /// <summary>
+    /// Interaction logic for Window1.xaml
+    /// </summary>
+    public partial class Window1 : Window
+    {
+        // default to My Documents
+        private String currentDirectory = String.Empty;
+        private ThirdCouncelorMLSFiles thirdCouncelorXml;
+        private BackgroundWorker worker;
+
+        public Window1()
+        {
+            InitializeComponent();
+            
+            // read in xml file
+            try
+            {
+                TextReader reader = new StreamReader("MLSRequiredFields.xml");
+                XmlSerializer serializer = new XmlSerializer(typeof(ThirdCouncelorMLSFiles));
+                this.thirdCouncelorXml = (ThirdCouncelorMLSFiles)serializer.Deserialize(reader);
+                reader.Close();
+            }
+            catch (XmlException ex)
+            {
+                MessageBox.Show(ex.Message, "XML Parse Error", MessageBoxButton.OK, MessageBoxImage.Error);
+            }
+            catch (InvalidOperationException ioe)
+            {
+                MessageBox.Show(ioe.InnerException.Message, "XML Serialization Error", MessageBoxButton.OK, MessageBoxImage.Error);
+            }
+        }
+
+
+        private void outDirButton_Click(object sender, RoutedEventArgs e)
+        {
+            FolderBrowserDialog openFolderDialog = new FolderBrowserDialog();
+
+            openFolderDialog.RootFolder = Environment.SpecialFolder.MyDocuments;
+            if (openFolderDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
+            {
+                outputDirtextBox.Text = openFolderDialog.SelectedPath;
+                currentDirectory = openFolderDialog.SelectedPath;
+            }
+        }
+
+        private void parseButton_Click(object sender, RoutedEventArgs e)
+        {
+            // make sure the directory exists
+            if (outputDirtextBox.Text.Equals(String.Empty))
+            {
+                MessageBox.Show("Please select the correct output directory.");
+                return;
+            }
+            else if (!Directory.Exists(outputDirtextBox.Text))
+            {
+                MessageBox.Show(outputDirtextBox.Text + " does not exist. Please select the correct output directory.");
+            }
+
+            // make sure the original files exist
+            foreach (ThirdCouncelorMLSFilesMLSFile csvFile in this.thirdCouncelorXml.CSVFiles)
+            {
+                if (!File.Exists(this.currentDirectory + "\\" + csvFile.Name))
+                {
+                    MessageBox.Show(csvFile.Name + " does not exist.  Are you sure you have the right directory?");
+                    return;
+                }
+            }
+
+            // TODO: move to new background thread, post progress dialog
+            this.worker = new BackgroundWorker();
+            this.worker.DoWork +=new DoWorkEventHandler(worker_DoWork);
+            this.worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
+            this.worker.RunWorkerAsync();
+
+            this.trimmingLabel.Visibility = Visibility.Visible;
+        }
+
+        private void worker_DoWork(object sender, DoWorkEventArgs e)
+        {
+            // create new zip file
+            using (ZipFile zip = new ZipFile())
+            {
+
+                // trim each csv file
+                foreach (ThirdCouncelorMLSFilesMLSFile csvFile in this.thirdCouncelorXml.CSVFiles)
+                {
+                    string newFilename = this.currentDirectory + "\\" + csvFile.Name;
+                    string origFilename = newFilename + ".orig";
+                    File.Move(newFilename, origFilename);
+
+                    using (StreamReader origFile = new StreamReader(origFilename))
+                    {
+                        using (StreamWriter newFile = new StreamWriter(newFilename))
+                        {
+                            CSVTrimmer csvTrimmer = new CSVTrimmer(csvFile);
+                            csvTrimmer.ExtractData(origFile, newFile);
+                        }
+                    }
+                    // add new to zip file
+                    zip.AddItem(newFilename, "");
+                }
+                zip.Save(this.currentDirectory + "\\" + "EQZipFile.zip");
+            }
+
+            Thread.Sleep(1000);
+
+            // delete csv files
+            StringBuilder sb = new StringBuilder();
+            foreach (ThirdCouncelorMLSFilesMLSFile csvFile in this.thirdCouncelorXml.CSVFiles)
+            {
+                sb.Remove(0, sb.Length);
+                sb.Append(this.currentDirectory);
+                sb.Append("\\");
+                sb.Append(csvFile.Name);
+                File.Delete(sb.ToString());
+                sb.Append(".orig");
+                File.Delete(sb.ToString());
+            }
+        }
+
+        private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
+        {
+            this.trimmingLabel.Visibility = Visibility.Hidden;
+            this.finishedLabel.Visibility = Visibility.Visible;
+        }
+    }
+}
diff --git a/mls/windowsGUI/MLSFileTrimmerInstaller/MLSFileTrimmerInstaller.vdproj b/mls/windowsGUI/MLSFileTrimmerInstaller/MLSFileTrimmerInstaller.vdproj
new file mode 100644
index 0000000..e45f9bb
--- /dev/null
+++ b/mls/windowsGUI/MLSFileTrimmerInstaller/MLSFileTrimmerInstaller.vdproj
@@ -0,0 +1,811 @@
+"DeployProject"
+{
+"VSVersion" = "3:800"
+"ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}"
+"IsWebType" = "8:FALSE"
+"ProjectName" = "8:MLSFileTrimmerInstaller"
+"LanguageId" = "3:1033"
+"CodePage" = "3:1252"
+"UILanguageId" = "3:1033"
+"SccProjectName" = "8:"
+"SccLocalPath" = "8:"
+"SccAuxPath" = "8:"
+"SccProvider" = "8:"
+    "Hierarchy"
+    {
+        "Entry"
+        {
+        "MsmKey" = "8:_23F1FB896E824A679B37949346C05547"
+        "OwnerKey" = "8:_UNDEFINED"
+        "MsmSig" = "8:_UNDEFINED"
+        }
+        "Entry"
+        {
+        "MsmKey" = "8:_5642279778584C4AB08E32A595FB6C82"
+        "OwnerKey" = "8:_UNDEFINED"
+        "MsmSig" = "8:_UNDEFINED"
+        }
+        "Entry"
+        {
+        "MsmKey" = "8:_AC035A5C33626ACA61BCD2318245A97A"
+        "OwnerKey" = "8:_5642279778584C4AB08E32A595FB6C82"
+        "MsmSig" = "8:_UNDEFINED"
+        }
+        "Entry"
+        {
+        "MsmKey" = "8:_UNDEFINED"
+        "OwnerKey" = "8:_5642279778584C4AB08E32A595FB6C82"
+        "MsmSig" = "8:_UNDEFINED"
+        }
+        "Entry"
+        {
+        "MsmKey" = "8:_UNDEFINED"
+        "OwnerKey" = "8:_AC035A5C33626ACA61BCD2318245A97A"
+        "MsmSig" = "8:_UNDEFINED"
+        }
+    }
+    "Configurations"
+    {
+        "Debug"
+        {
+        "DisplayName" = "8:Debug"
+        "IsDebugOnly" = "11:TRUE"
+        "IsReleaseOnly" = "11:FALSE"
+        "OutputFilename" = "8:Debug\\MLSFileTrimmerInstaller.msi"
+        "PackageFilesAs" = "3:2"
+        "PackageFileSize" = "3:-2147483648"
+        "CabType" = "3:1"
+        "Compression" = "3:2"
+        "SignOutput" = "11:FALSE"
+        "CertificateFile" = "8:"
+        "PrivateKeyFile" = "8:"
+        "TimeStampServer" = "8:"
+        "InstallerBootstrapper" = "3:2"
+            "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}"
+            {
+            "Enabled" = "11:TRUE"
+            "PromptEnabled" = "11:TRUE"
+            "PrerequisitesLocation" = "2:1"
+            "Url" = "8:"
+            "ComponentsUrl" = "8:"
+            }
+        }
+        "Release"
+        {
+        "DisplayName" = "8:Release"
+        "IsDebugOnly" = "11:FALSE"
+        "IsReleaseOnly" = "11:TRUE"
+        "OutputFilename" = "8:Release\\MLSFileTrimmerInstaller.msi"
+        "PackageFilesAs" = "3:2"
+        "PackageFileSize" = "3:-2147483648"
+        "CabType" = "3:1"
+        "Compression" = "3:2"
+        "SignOutput" = "11:FALSE"
+        "CertificateFile" = "8:"
+        "PrivateKeyFile" = "8:"
+        "TimeStampServer" = "8:"
+        "InstallerBootstrapper" = "3:2"
+            "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}"
+            {
+            "Enabled" = "11:TRUE"
+            "PromptEnabled" = "11:TRUE"
+            "PrerequisitesLocation" = "2:1"
+            "Url" = "8:"
+            "ComponentsUrl" = "8:"
+                "Items"
+                {
+                    "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Net.Framework.3.5.SP1"
+                    {
+                    "Name" = "8:.NET Framework 3.5 SP1"
+                    "ProductCode" = "8:Microsoft.Net.Framework.3.5.SP1"
+                    }
+                    "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Windows.Installer.3.1"
+                    {
+                    "Name" = "8:Windows Installer 3.1"
+                    "ProductCode" = "8:Microsoft.Windows.Installer.3.1"
+                    }
+                }
+            }
+        }
+    }
+    "Deployable"
+    {
+        "CustomAction"
+        {
+        }
+        "DefaultFeature"
+        {
+        "Name" = "8:DefaultFeature"
+        "Title" = "8:"
+        "Description" = "8:"
+        }
+        "ExternalPersistence"
+        {
+            "LaunchCondition"
+            {
+                "{A06ECF26-33A3-4562-8140-9B0E340D4F24}:_393CAD7244BD468193F0F118269A7C27"
+                {
+                "Name" = "8:.NET Framework"
+                "Message" = "8:[VSDNETMSG]"
+                "Version" = "8:3.5.30729"
+                "AllowLaterVersions" = "11:FALSE"
+                "InstallUrl" = "8:http://go.microsoft.com/fwlink/?LinkId=76617"
+                }
+            }
+        }
+        "File"
+        {
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_23F1FB896E824A679B37949346C05547"
+            {
+            "SourcePath" = "8:..\\MLSFileTrimmer\\bin\\Release\\MLSRequiredFields.xml"
+            "TargetName" = "8:MLSRequiredFields.xml"
+            "Tag" = "8:"
+            "Folder" = "8:_2B5E9E5E32C84619823E502184B2A72C"
+            "Condition" = "8:"
+            "Transitive" = "11:FALSE"
+            "Vital" = "11:TRUE"
+            "ReadOnly" = "11:FALSE"
+            "Hidden" = "11:FALSE"
+            "System" = "11:FALSE"
+            "Permanent" = "11:FALSE"
+            "SharedLegacy" = "11:FALSE"
+            "PackageAs" = "3:1"
+            "Register" = "3:1"
+            "Exclude" = "11:FALSE"
+            "IsDependency" = "11:FALSE"
+            "IsolateTo" = "8:"
+            }
+            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_5642279778584C4AB08E32A595FB6C82"
+            {
+            "AssemblyRegister" = "3:1"
+            "AssemblyIsInGAC" = "11:FALSE"
+            "AssemblyAsmDisplayName" = "8:MLSFileTrimmer, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"
+                "ScatterAssemblies"
+                {
+                    "_5642279778584C4AB08E32A595FB6C82"
+                    {
+                    "Name" = "8:MLSFileTrimmer.exe"
+                    "Attributes" = "3:512"
+                    }
+                }
+            "SourcePath" = "8:..\\MLSFileTrimmer\\bin\\Release\\MLSFileTrimmer.exe"
+            "TargetName" = "8:"
+            "Tag" = "8:"
+            "Folder" = "8:_2B5E9E5E32C84619823E502184B2A72C"
+            "Condition" = "8:"
+            "Transitive" = "11:FALSE"
+            "Vital" = "11:TRUE"
+            "ReadOnly" = "11:FALSE"
+            "Hidden" = "11:FALSE"
+            "System" = "11:FALSE"
+            "Permanent" = "11:FALSE"
+            "SharedLegacy" = "11:FALSE"
+            "PackageAs" = "3:1"
+            "Register" = "3:1"
+            "Exclude" = "11:FALSE"
+            "IsDependency" = "11:FALSE"
+            "IsolateTo" = "8:"
+            }
+            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_AC035A5C33626ACA61BCD2318245A97A"
+            {
+            "AssemblyRegister" = "3:1"
+            "AssemblyIsInGAC" = "11:FALSE"
+            "AssemblyAsmDisplayName" = "8:Ionic.Zip, Version=1.9.1.5, Culture=neutral, PublicKeyToken=edbe51ad942a3f5c, processorArchitecture=MSIL"
+                "ScatterAssemblies"
+                {
+                    "_AC035A5C33626ACA61BCD2318245A97A"
+                    {
+                    "Name" = "8:Ionic.Zip.DLL"
+                    "Attributes" = "3:512"
+                    }
+                }
+            "SourcePath" = "8:Ionic.Zip.DLL"
+            "TargetName" = "8:"
+            "Tag" = "8:"
+            "Folder" = "8:_2B5E9E5E32C84619823E502184B2A72C"
+            "Condition" = "8:"
+            "Transitive" = "11:FALSE"
+            "Vital" = "11:TRUE"
+            "ReadOnly" = "11:FALSE"
+            "Hidden" = "11:FALSE"
+            "System" = "11:FALSE"
+            "Permanent" = "11:FALSE"
+            "SharedLegacy" = "11:FALSE"
+            "PackageAs" = "3:1"
+            "Register" = "3:1"
+            "Exclude" = "11:FALSE"
+            "IsDependency" = "11:TRUE"
+            "IsolateTo" = "8:"
+            }
+        }
+        "FileType"
+        {
+        }
+        "Folder"
+        {
+            "{1525181F-901A-416C-8A58-119130FE478E}:_1277279AD8B443BCB64D19D1729C9E9D"
+            {
+            "Name" = "8:#1916"
+            "AlwaysCreate" = "11:FALSE"
+            "Condition" = "8:"
+            "Transitive" = "11:FALSE"
+            "Property" = "8:DesktopFolder"
+                "Folders"
+                {
+                }
+            }
+            "{3C67513D-01DD-4637-8A68-80971EB9504F}:_2B5E9E5E32C84619823E502184B2A72C"
+            {
+            "DefaultLocation" = "8:[ProgramFilesFolder]\\[ProductName]"
+            "Name" = "8:#1925"
+            "AlwaysCreate" = "11:FALSE"
+            "Condition" = "8:"
+            "Transitive" = "11:FALSE"
+            "Property" = "8:TARGETDIR"
+                "Folders"
+                {
+                }
+            }
+            "{1525181F-901A-416C-8A58-119130FE478E}:_A73814472A784ED28E52A258A1870893"
+            {
+            "Name" = "8:#1919"
+            "AlwaysCreate" = "11:TRUE"
+            "Condition" = "8:"
+            "Transitive" = "11:FALSE"
+            "Property" = "8:ProgramMenuFolder"
+                "Folders"
+                {
+                }
+            }
+        }
+        "LaunchCondition"
+        {
+        }
+        "Locator"
+        {
+        }
+        "MsiBootstrapper"
+        {
+        "LangId" = "3:1033"
+        "RequiresElevation" = "11:FALSE"
+        }
+        "Product"
+        {
+        "Name" = "8:Microsoft Visual Studio"
+        "ProductName" = "8:MLSFileTrimmer"
+        "ProductCode" = "8:{0207BA73-A23A-44DE-BFA8-E26EAD156468}"
+        "PackageCode" = "8:{7C3340C5-60EE-44E5-B6C0-E7D5B03C1F3C}"
+        "UpgradeCode" = "8:{493247E6-F4BC-4B0F-B241-951C27338FCF}"
+        "RestartWWWService" = "11:FALSE"
+        "RemovePreviousVersions" = "11:TRUE"
+        "DetectNewerInstalledVersion" = "11:TRUE"
+        "InstallAllUsers" = "11:FALSE"
+        "ProductVersion" = "8:1.0.0"
+        "Manufacturer" = "8:Owen Leonard"
+        "ARPHELPTELEPHONE" = "8:"
+        "ARPHELPLINK" = "8:"
+        "Title" = "8:MLSFileTrimmer"
+        "Subject" = "8:"
+        "ARPCONTACT" = "8:Owen Leonard"
+        "Keywords" = "8:"
+        "ARPCOMMENTS" = "8:"
+        "ARPURLINFOABOUT" = "8:"
+        "ARPPRODUCTICON" = "8:"
+        "ARPIconIndex" = "3:0"
+        "SearchPath" = "8:"
+        "UseSystemSearchPath" = "11:TRUE"
+        "TargetPlatform" = "3:0"
+        "PreBuildEvent" = "8:"
+        "PostBuildEvent" = "8:"
+        "RunPostBuildEvent" = "3:0"
+        }
+        "Registry"
+        {
+            "HKLM"
+            {
+                "Keys"
+                {
+                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_ACD8007A816B4D4C91918EE14CA9B8F7"
+                    {
+                    "Name" = "8:Software"
+                    "Condition" = "8:"
+                    "AlwaysCreate" = "11:FALSE"
+                    "DeleteAtUninstall" = "11:FALSE"
+                    "Transitive" = "11:FALSE"
+                        "Keys"
+                        {
+                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_45E06D48AA0A44D293EFBDF770570DEF"
+                            {
+                            "Name" = "8:[Manufacturer]"
+                            "Condition" = "8:"
+                            "AlwaysCreate" = "11:FALSE"
+                            "DeleteAtUninstall" = "11:FALSE"
+                            "Transitive" = "11:FALSE"
+                                "Keys"
+                                {
+                                }
+                                "Values"
+                                {
+                                }
+                            }
+                        }
+                        "Values"
+                        {
+                        }
+                    }
+                }
+            }
+            "HKCU"
+            {
+                "Keys"
+                {
+                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_007AC28067D54F69809DFCBC8131B338"
+                    {
+                    "Name" = "8:Software"
+                    "Condition" = "8:"
+                    "AlwaysCreate" = "11:FALSE"
+                    "DeleteAtUninstall" = "11:FALSE"
+                    "Transitive" = "11:FALSE"
+                        "Keys"
+                        {
+                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_CCA6900298CC4784ABCD44D1F2277D83"
+                            {
+                            "Name" = "8:[Manufacturer]"
+                            "Condition" = "8:"
+                            "AlwaysCreate" = "11:FALSE"
+                            "DeleteAtUninstall" = "11:FALSE"
+                            "Transitive" = "11:FALSE"
+                                "Keys"
+                                {
+                                }
+                                "Values"
+                                {
+                                }
+                            }
+                        }
+                        "Values"
+                        {
+                        }
+                    }
+                }
+            }
+            "HKCR"
+            {
+                "Keys"
+                {
+                }
+            }
+            "HKU"
+            {
+                "Keys"
+                {
+                }
+            }
+            "HKPU"
+            {
+                "Keys"
+                {
+                }
+            }
+        }
+        "Sequences"
+        {
+        }
+        "Shortcut"
+        {
+            "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_A775FA7558924A68983D469E818904C5"
+            {
+            "Name" = "8:MLSFileTrimmer"
+            "Arguments" = "8:"
+            "Description" = "8:"
+            "ShowCmd" = "3:1"
+            "IconIndex" = "3:0"
+            "Transitive" = "11:FALSE"
+            "Target" = "8:_5642279778584C4AB08E32A595FB6C82"
+            "Folder" = "8:_A73814472A784ED28E52A258A1870893"
+            "WorkingFolder" = "8:_2B5E9E5E32C84619823E502184B2A72C"
+            "Icon" = "8:"
+            "Feature" = "8:"
+            }
+        }
+        "UserInterface"
+        {
+            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_7275E1CC95234C428154441D4D82CE6B"
+            {
+            "Name" = "8:#1900"
+            "Sequence" = "3:2"
+            "Attributes" = "3:1"
+                "Dialogs"
+                {
+                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_C21B4F018FA548C681ABFDDAD0047CE5"
+                    {
+                    "Sequence" = "3:300"
+                    "DisplayName" = "8:Confirm Installation"
+                    "UseDynamicProperties" = "11:TRUE"
+                    "IsDependency" = "11:FALSE"
+                    "SourcePath" = "8:<VsdDialogDir>\\VsdAdminConfirmDlg.wid"
+                        "Properties"
+                        {
+                            "BannerBitmap"
+                            {
+                            "Name" = "8:BannerBitmap"
+                            "DisplayName" = "8:#1001"
+                            "Description" = "8:#1101"
+                            "Type" = "3:8"
+                            "ContextData" = "8:Bitmap"
+                            "Attributes" = "3:4"
+                            "Setting" = "3:1"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                        }
+                    }
+                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_DF8FBE40590F403CAB07FBAA539E298C"
+                    {
+                    "Sequence" = "3:100"
+                    "DisplayName" = "8:Welcome"
+                    "UseDynamicProperties" = "11:TRUE"
+                    "IsDependency" = "11:FALSE"
+                    "SourcePath" = "8:<VsdDialogDir>\\VsdAdminWelcomeDlg.wid"
+                        "Properties"
+                        {
+                            "BannerBitmap"
+                            {
+                            "Name" = "8:BannerBitmap"
+                            "DisplayName" = "8:#1001"
+                            "Description" = "8:#1101"
+                            "Type" = "3:8"
+                            "ContextData" = "8:Bitmap"
+                            "Attributes" = "3:4"
+                            "Setting" = "3:1"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                            "CopyrightWarning"
+                            {
+                            "Name" = "8:CopyrightWarning"
+                            "DisplayName" = "8:#1002"
+                            "Description" = "8:#1102"
+                            "Type" = "3:3"
+                            "ContextData" = "8:"
+                            "Attributes" = "3:0"
+                            "Setting" = "3:1"
+                            "Value" = "8:#1202"
+                            "DefaultValue" = "8:#1202"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                            "Welcome"
+                            {
+                            "Name" = "8:Welcome"
+                            "DisplayName" = "8:#1003"
+                            "Description" = "8:#1103"
+                            "Type" = "3:3"
+                            "ContextData" = "8:"
+                            "Attributes" = "3:0"
+                            "Setting" = "3:1"
+                            "Value" = "8:#1203"
+                            "DefaultValue" = "8:#1203"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                        }
+                    }
+                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_E54F333D647C4D0F96FB6D9AAB074BE7"
+                    {
+                    "Sequence" = "3:200"
+                    "DisplayName" = "8:Installation Folder"
+                    "UseDynamicProperties" = "11:TRUE"
+                    "IsDependency" = "11:FALSE"
+                    "SourcePath" = "8:<VsdDialogDir>\\VsdAdminFolderDlg.wid"
+                        "Properties"
+                        {
+                            "BannerBitmap"
+                            {
+                            "Name" = "8:BannerBitmap"
+                            "DisplayName" = "8:#1001"
+                            "Description" = "8:#1101"
+                            "Type" = "3:8"
+                            "ContextData" = "8:Bitmap"
+                            "Attributes" = "3:4"
+                            "Setting" = "3:1"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                        }
+                    }
+                }
+            }
+            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_8B27D79640844A679A724DB98E5536F6"
+            {
+            "Name" = "8:#1902"
+            "Sequence" = "3:1"
+            "Attributes" = "3:3"
+                "Dialogs"
+                {
+                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_653754B9A9C94196B3F025527677F7FA"
+                    {
+                    "Sequence" = "3:100"
+                    "DisplayName" = "8:Finished"
+                    "UseDynamicProperties" = "11:TRUE"
+                    "IsDependency" = "11:FALSE"
+                    "SourcePath" = "8:<VsdDialogDir>\\VsdFinishedDlg.wid"
+                        "Properties"
+                        {
+                            "BannerBitmap"
+                            {
+                            "Name" = "8:BannerBitmap"
+                            "DisplayName" = "8:#1001"
+                            "Description" = "8:#1101"
+                            "Type" = "3:8"
+                            "ContextData" = "8:Bitmap"
+                            "Attributes" = "3:4"
+                            "Setting" = "3:1"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                            "UpdateText"
+                            {
+                            "Name" = "8:UpdateText"
+                            "DisplayName" = "8:#1058"
+                            "Description" = "8:#1158"
+                            "Type" = "3:15"
+                            "ContextData" = "8:"
+                            "Attributes" = "3:0"
+                            "Setting" = "3:1"
+                            "Value" = "8:#1258"
+                            "DefaultValue" = "8:#1258"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                        }
+                    }
+                }
+            }
+            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_8B4BB69D9D7944EB966ED65EDA4E2238"
+            {
+            "Name" = "8:#1901"
+            "Sequence" = "3:1"
+            "Attributes" = "3:2"
+                "Dialogs"
+                {
+                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_F35596B57DAD42AE9C4E862A0BEB6DE8"
+                    {
+                    "Sequence" = "3:100"
+                    "DisplayName" = "8:Progress"
+                    "UseDynamicProperties" = "11:TRUE"
+                    "IsDependency" = "11:FALSE"
+                    "SourcePath" = "8:<VsdDialogDir>\\VsdProgressDlg.wid"
+                        "Properties"
+                        {
+                            "BannerBitmap"
+                            {
+                            "Name" = "8:BannerBitmap"
+                            "DisplayName" = "8:#1001"
+                            "Description" = "8:#1101"
+                            "Type" = "3:8"
+                            "ContextData" = "8:Bitmap"
+                            "Attributes" = "3:4"
+                            "Setting" = "3:1"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                            "ShowProgress"
+                            {
+                            "Name" = "8:ShowProgress"
+                            "DisplayName" = "8:#1009"
+                            "Description" = "8:#1109"
+                            "Type" = "3:5"
+                            "ContextData" = "8:1;True=1;False=0"
+                            "Attributes" = "3:0"
+                            "Setting" = "3:0"
+                            "Value" = "3:1"
+                            "DefaultValue" = "3:1"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                        }
+                    }
+                }
+            }
+            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_9F7B1005A1B84C43816B9A27A9752AA7"
+            {
+            "Name" = "8:#1900"
+            "Sequence" = "3:1"
+            "Attributes" = "3:1"
+                "Dialogs"
+                {
+                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_142F34D5A2D848EAB951813A2A3209AB"
+                    {
+                    "Sequence" = "3:100"
+                    "DisplayName" = "8:Welcome"
+                    "UseDynamicProperties" = "11:TRUE"
+                    "IsDependency" = "11:FALSE"
+                    "SourcePath" = "8:<VsdDialogDir>\\VsdWelcomeDlg.wid"
+                        "Properties"
+                        {
+                            "BannerBitmap"
+                            {
+                            "Name" = "8:BannerBitmap"
+                            "DisplayName" = "8:#1001"
+                            "Description" = "8:#1101"
+                            "Type" = "3:8"
+                            "ContextData" = "8:Bitmap"
+                            "Attributes" = "3:4"
+                            "Setting" = "3:1"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                            "CopyrightWarning"
+                            {
+                            "Name" = "8:CopyrightWarning"
+                            "DisplayName" = "8:#1002"
+                            "Description" = "8:#1102"
+                            "Type" = "3:3"
+                            "ContextData" = "8:"
+                            "Attributes" = "3:0"
+                            "Setting" = "3:1"
+                            "Value" = "8:#1202"
+                            "DefaultValue" = "8:#1202"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                            "Welcome"
+                            {
+                            "Name" = "8:Welcome"
+                            "DisplayName" = "8:#1003"
+                            "Description" = "8:#1103"
+                            "Type" = "3:3"
+                            "ContextData" = "8:"
+                            "Attributes" = "3:0"
+                            "Setting" = "3:1"
+                            "Value" = "8:#1203"
+                            "DefaultValue" = "8:#1203"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                        }
+                    }
+                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_83DE0F88871F454DB09CE854148D44CD"
+                    {
+                    "Sequence" = "3:200"
+                    "DisplayName" = "8:Installation Folder"
+                    "UseDynamicProperties" = "11:TRUE"
+                    "IsDependency" = "11:FALSE"
+                    "SourcePath" = "8:<VsdDialogDir>\\VsdFolderDlg.wid"
+                        "Properties"
+                        {
+                            "BannerBitmap"
+                            {
+                            "Name" = "8:BannerBitmap"
+                            "DisplayName" = "8:#1001"
+                            "Description" = "8:#1101"
+                            "Type" = "3:8"
+                            "ContextData" = "8:Bitmap"
+                            "Attributes" = "3:4"
+                            "Setting" = "3:1"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                            "InstallAllUsersVisible"
+                            {
+                            "Name" = "8:InstallAllUsersVisible"
+                            "DisplayName" = "8:#1059"
+                            "Description" = "8:#1159"
+                            "Type" = "3:5"
+                            "ContextData" = "8:1;True=1;False=0"
+                            "Attributes" = "3:0"
+                            "Setting" = "3:0"
+                            "Value" = "3:1"
+                            "DefaultValue" = "3:1"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                        }
+                    }
+                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_EFE7D61C687B461F83931BD482452DFE"
+                    {
+                    "Sequence" = "3:300"
+                    "DisplayName" = "8:Confirm Installation"
+                    "UseDynamicProperties" = "11:TRUE"
+                    "IsDependency" = "11:FALSE"
+                    "SourcePath" = "8:<VsdDialogDir>\\VsdConfirmDlg.wid"
+                        "Properties"
+                        {
+                            "BannerBitmap"
+                            {
+                            "Name" = "8:BannerBitmap"
+                            "DisplayName" = "8:#1001"
+                            "Description" = "8:#1101"
+                            "Type" = "3:8"
+                            "ContextData" = "8:Bitmap"
+                            "Attributes" = "3:4"
+                            "Setting" = "3:1"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                        }
+                    }
+                }
+            }
+            "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_A0398A9F28B045A5BD77D8E47C92155A"
+            {
+            "UseDynamicProperties" = "11:FALSE"
+            "IsDependency" = "11:FALSE"
+            "SourcePath" = "8:<VsdDialogDir>\\VsdUserInterface.wim"
+            }
+            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_B1884FE6070E459F9DAD5D8C512B2EA2"
+            {
+            "Name" = "8:#1902"
+            "Sequence" = "3:2"
+            "Attributes" = "3:3"
+                "Dialogs"
+                {
+                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_5E2A8698AC7D4706B2213230F6BE7E75"
+                    {
+                    "Sequence" = "3:100"
+                    "DisplayName" = "8:Finished"
+                    "UseDynamicProperties" = "11:TRUE"
+                    "IsDependency" = "11:FALSE"
+                    "SourcePath" = "8:<VsdDialogDir>\\VsdAdminFinishedDlg.wid"
+                        "Properties"
+                        {
+                            "BannerBitmap"
+                            {
+                            "Name" = "8:BannerBitmap"
+                            "DisplayName" = "8:#1001"
+                            "Description" = "8:#1101"
+                            "Type" = "3:8"
+                            "ContextData" = "8:Bitmap"
+                            "Attributes" = "3:4"
+                            "Setting" = "3:1"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                        }
+                    }
+                }
+            }
+            "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_D1F6D2A3B6BE4420B82B9E029943450A"
+            {
+            "UseDynamicProperties" = "11:FALSE"
+            "IsDependency" = "11:FALSE"
+            "SourcePath" = "8:<VsdDialogDir>\\VsdBasicDialogs.wim"
+            }
+            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_E58BCA2EAA1240B9B7E88354732AFBA4"
+            {
+            "Name" = "8:#1901"
+            "Sequence" = "3:2"
+            "Attributes" = "3:2"
+                "Dialogs"
+                {
+                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_6D6BC735065C4888BFAECC0D007494D7"
+                    {
+                    "Sequence" = "3:100"
+                    "DisplayName" = "8:Progress"
+                    "UseDynamicProperties" = "11:TRUE"
+                    "IsDependency" = "11:FALSE"
+                    "SourcePath" = "8:<VsdDialogDir>\\VsdAdminProgressDlg.wid"
+                        "Properties"
+                        {
+                            "BannerBitmap"
+                            {
+                            "Name" = "8:BannerBitmap"
+                            "DisplayName" = "8:#1001"
+                            "Description" = "8:#1101"
+                            "Type" = "3:8"
+                            "ContextData" = "8:Bitmap"
+                            "Attributes" = "3:4"
+                            "Setting" = "3:1"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                            "ShowProgress"
+                            {
+                            "Name" = "8:ShowProgress"
+                            "DisplayName" = "8:#1009"
+                            "Description" = "8:#1109"
+                            "Type" = "3:5"
+                            "ContextData" = "8:1;True=1;False=0"
+                            "Attributes" = "3:0"
+                            "Setting" = "3:0"
+                            "Value" = "3:1"
+                            "DefaultValue" = "3:1"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        "MergeModule"
+        {
+        }
+        "ProjectOutput"
+        {
+        }
+    }
+}