<component id="13" name="Table Update Destination" componentClassID="{2E42D45B-F83C-400F-8D77-61DDE6A7DF29}" description="Executes a custom script." localeId="1033" usesDispositions="false" validateExternalMetadata="True" version="4" pipelineVersion="0" contactInfo="Executes a custom script.;Microsoft Corporation;Microsoft SqlServer v9; © 2004 Microsoft Corporation; All Rights Reserved; http://www.microsoft.com/sql/support;0">
<properties>
<property id="14" name="SourceCode" dataType="System.String" state="cdata" isArray="true" description="Stores the source code of the component" typeConverter="NOTBROWSABLE" UITypeEditor="" containsID="false" expressionType="None"><arrayElements arrayElementCount="18"><arrayElement dataType="System.String"><![CDATA[\my project\settings.designer.vb]]></arrayElement><arrayElement dataType="System.String"><![CDATA['------------------------------------------------------------------------------
' <autogenerated>
'     This code was generated by a tool.
'
'     Changes to this file may cause incorrect behavior and will be lost if
'     the code is regenerated.
' </autogenerated>
'------------------------------------------------------------------------------

Option Strict Off
Option Explicit On



Partial Friend NotInheritable Class MySettings
    Inherits System.Configuration.ApplicationSettingsBase

    Private Shared m_Value As MySettings

    Private Shared m_SyncObject As Object = New Object

    <System.Diagnostics.DebuggerNonUserCode()> _
    Public Shared ReadOnly Property Value() As MySettings
        Get
            If (MySettings.m_Value Is Nothing) Then
                System.Threading.Monitor.Enter(MySettings.m_SyncObject)
                If (MySettings.m_Value Is Nothing) Then
                    Try
                        MySettings.m_Value = New MySettings
                    Finally
                        System.Threading.Monitor.Exit(MySettings.m_SyncObject)
                    End Try
                End If
            End If
            Return MySettings.m_Value
        End Get
    End Property
End Class
]]></arrayElement><arrayElement dataType="System.String"><![CDATA[\my project\assemblyinfo.vb]]></arrayElement><arrayElement dataType="System.String"><![CDATA[Imports System
Imports System.Reflection
Imports System.Runtime.InteropServices

' 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.

' Review the values of the assembly attributes

<Assembly: AssemblyTitle("ScriptComponent_2e3d4c56d0694f9bbd032f1e0950bec1.vbproj")> 
<Assembly: AssemblyDescription("")> 
<Assembly: AssemblyCompany("Microsoft")> 
<Assembly: AssemblyProduct("ScriptComponent_2e3d4c56d0694f9bbd032f1e0950bec1.vbproj")> 
<Assembly: AssemblyCopyright("Copyright @ Microsoft 2016")> 
<Assembly: AssemblyTrademark("")> 
<Assembly: CLSCompliant(True)> 

<Assembly: ComVisible(False)> 

'The following GUID is for the ID of the typelib if this project is exposed to COM
<Assembly: Guid("948b84eb-be33-4bb7-b58e-b80a708b73c1")> 

' 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")> 
]]></arrayElement><arrayElement dataType="System.String"><![CDATA[\my project\settings.settings]]></arrayElement><arrayElement dataType="System.String"><![CDATA[<?xml version='1.0' encoding='iso-8859-1'?>
<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)" GeneratedClassNamespace="" GeneratedClassName="MySettings">
  <Profiles>
    <Profile Name="(Default)" />
  </Profiles>
  <Settings />
</SettingsFile>]]></arrayElement><arrayElement dataType="System.String"><![CDATA[\bufferwrapper.vb]]></arrayElement><arrayElement dataType="System.String"><![CDATA[' THIS IS AUTO-GENERATED CODE THAT WILL BE OVERWRITTEN! DO NOT EDIT!
' This is CozyRoc Script Component Plus Extended Script
' Microsoft SQL Server Integration Services buffer wrappers
' This module defines classes for accessing data flow buffers
' THIS IS AUTO-GENERATED CODE THAT WILL BE OVERWRITTEN! DO NOT EDIT!


Option Strict Off   ' This allows usage of PipelineBuffer typed accessors.

Imports System
Imports System.Data
Imports Microsoft.SqlServer.Dts.Pipeline
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
Imports CozyRoc.SqlServer.SSIS

<CLSCompliant(False)> _
Public Class InputBuffer
    Inherits ScriptBufferPlus

    Dim ErrorOutputOutputID As Integer

    Public Sub New(ByVal Component As ScriptComponent, ByVal ObjectID As Integer, ByVal IsInput As Boolean, ByVal Buffer As PipelineBuffer)
        MyBase.New(Component, ObjectID, IsInput, Buffer)

        ErrorOutputOutputID = Component.ComponentMetaData.OutputCollection("Error Output").ID
    End Sub

    Public Overrides ReadOnly Property StaticInputColumns() As String()
        Get
            Return New String() {}
        End Get
    End Property

    Public WriteOnly Property [ErrorDescription]() As String
        Set
            Me(0) = Value
        End Set
    End Property
    Public WriteOnly Property [ErrorDescription_IsNull] As Boolean
        Set
            If (value)
                SetNull(0)
            Else
                Throw new InvalidOperationException("IsNull property cannot be set to False. Assign a value to the column instead.")
            End If
        End Set
    End Property

    Public Sub DirectRowToErrorOutput()
        MyBase.DirectRow(ErrorOutputOutputID)
    End Sub

    Public Overrides ReadOnly Property StaticOutputColumns() As String()
        Get
            Return New String() {"ErrorDescription"}
        End Get
    End Property

    Public Overloads Function NextRow() As Boolean
        NextRow = MyBase.NextRow()
    End Function

    Public Overloads Function EndOfRowset() As Boolean
        EndOfRowset = MyBase.EndOfRowset
    End Function

End Class
]]></arrayElement><arrayElement dataType="System.String"><![CDATA[\scriptcomponent_2e3d4c56d0694f9bbd032f1e0950bec1.vbproj]]></arrayElement><arrayElement dataType="System.String"><![CDATA[<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-- This section defines project-level properties.

       Configuration - Specifies whether the default configuration is Release or Debug.
       Platform - Specifies what CPU the output of this project can run on.
       OutputType - Must be "Library" for VSTA.
       NoStandardLibraries - Set to "false" for VSTA.
       RootNamespace - In C#, this specifies the namespace given to new files.
                       In Visual Basic, all objects are wrapped in this namespace at runtime.
       AssemblyName - Name of the output assembly.
  -->
  <PropertyGroup>
    <ProjectTypeGuids>{A860303F-1F3F-4691-B57E-529FC101A107};{F184B08F-C81C-45F6-A57F-5ABD9991F28F}</ProjectTypeGuids>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <OutputType>Library</OutputType>
    <RootNamespace>ScriptComponent_2e3d4c56d0694f9bbd032f1e0950bec1.vbproj</RootNamespace>
    <AssemblyName>ScriptComponent_2e3d4c56d0694f9bbd032f1e0950bec1.vbproj</AssemblyName>
    <StartupObject>
    </StartupObject>
    <OptionExplicit>On</OptionExplicit>
    <OptionCompare>Binary</OptionCompare>
    <OptionStrict>Off</OptionStrict>
    <OptionInfer>On</OptionInfer>
    <ProjectGuid>{0241DA19-8516-41A1-9BA8-F82E3331FF03}</ProjectGuid>
  </PropertyGroup>
  <!-- This section defines properties that are set when the "Debug" configuration is
       selected.

       DebugSymbols - If true, create symbols (.pdb). If false, do not create symbols.
       Optimize - If true, optimize the build output. If false, do not optimize.
       OutputPath - Output path of the project relative to the project file.
       EnableUnmanagedDebugging - If true, starting the debugger will attach both managed and unmanaged debuggers.
       DefineConstants - Constants defined for the preprocessor.
       Warning Level - Warning level for the compiler.
  -->
  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
    <DefineConstants>
    </DefineConstants>
    <DefineDebug>true</DefineDebug>
    <DefineTrace>true</DefineTrace>
    <DebugSymbols>true</DebugSymbols>
    <Optimize>false</Optimize>
    <OutputPath>bin\</OutputPath>
    <RegisterForComInterop>false</RegisterForComInterop>
    <RemoveIntegerChecks>false</RemoveIntegerChecks>
    <NoWarn>42016,42017,42018,42019,42032</NoWarn>
  </PropertyGroup>
  <!-- This section defines properties that are set when the "Release" configuration is
       selected.

       DebugSymbols - If true, create symbols (.pdb). If false, do not create symbols.
       Optimize - If true, optimize the build output. If false, do not optimize.
       OutputPath - Output path of the project relative to the project file.
       EnableUnmanagedDebugging - If true, starting the debugger will attach both managed and unmanaged debuggers.
       DefineConstants - Constants defined for the preprocessor.
       Warning Level - Warning level for the compiler.
  -->
  <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
    <DefineConstants>
    </DefineConstants>
    <DefineDebug>false</DefineDebug>
    <DefineTrace>true</DefineTrace>
    <DebugSymbols>false</DebugSymbols>
    <Optimize>true</Optimize>
    <OutputPath>bin\</OutputPath>
    <RegisterForComInterop>false</RegisterForComInterop>
    <RemoveIntegerChecks>false</RemoveIntegerChecks>
    <NoWarn>42016,42017,42018,42019,42032</NoWarn>
  </PropertyGroup>
  <!-- This section enables pre- and post-build steps. However,
       it is recommended that MSBuild tasks be used instead of these properties.
  -->
  <PropertyGroup>
    <PreBuildEvent>
    </PreBuildEvent>
    <PostBuildEvent>
    </PostBuildEvent>
  </PropertyGroup>
  <!-- This sections specifies references for the project. -->
  <ItemGroup>
    <Reference Include="CozyRoc.SSISPlus.2008, Version=1.0.0.0, Culture=neutral, PublicKeyToken=16cf490bb80c34ea, processorArchitecture=MSIL" />
    <Reference Include="Microsoft.SqlServer.ManagedDTS, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL" />
    <Reference Include="System" />
    <Reference Include="System.Data" />
    <Reference Include="System.Windows.Forms" />
    <Reference Include="System.Xml" />
    <Reference Include="Microsoft.SqlServer.TxScript, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
    <Reference Include="Microsoft.SqlServer.DTSRuntimeWrap, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
    <Reference Include="Microsoft.SqlServer.DTSPipelineWrap, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
    <Reference Include="Microsoft.SqlServer.PipelineHost, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
  </ItemGroup>
  <!-- Visual Basic supports Importing namespaces (equivalent to using statements in C#).-->
  <ItemGroup>
    <Import Include="Microsoft.VisualBasic" />
    <Import Include="System" />
    <Import Include="System.Collections" />
    <Import Include="System.Data" />
    <Import Include="System.Diagnostics" />
    <Import Include="System.Windows.Forms" />
  </ItemGroup>
  <!-- This section defines the user source files that are part of the
       project.

       Compile - Specifies a source file to compile.
       EmbeddedResource - Specifies a .resx file for embedded resources.
       None - Specifies a file that is not to be passed to the compiler (for instance,
              a text file or XML file).
       AppDesigner - Specifies the directory where the application properties files can
                     be found.
  -->
  <ItemGroup>
    <AppDesigner Include="My Project\" />
    <Compile Include="BufferWrapper.vb" />
    <Compile Include="ComponentWrapper.vb" />
    <Compile Include="main.vb" />
    <Compile Include="My Project\AssemblyInfo.vb">
      <SubType>Code</SubType>
    </Compile>
    <EmbeddedResource Include="My Project\Resources.resx">
      <Generator>VbMyResourcesResXFileCodeGenerator</Generator>
      <LastGenOutput>Resources.Designer.vb</LastGenOutput>
      <CustomToolNamespace>My.Resources</CustomToolNamespace>
    </EmbeddedResource>
    <Compile Include="My Project\Resources.Designer.vb">
      <AutoGen>True</AutoGen>
      <DesignTime>True</DesignTime>
      <DependentUpon>Resources.resx</DependentUpon>
      <SubType>Code</SubType>
    </Compile>
    <None Include="My Project\Settings.settings">
      <Generator>SettingsSingleFileGenerator</Generator>
      <LastGenOutput>Settings.Designer.vb</LastGenOutput>
    </None>
    <Compile Include="My Project\Settings.Designer.vb">
      <AutoGen>True</AutoGen>
      <DependentUpon>Settings.settings</DependentUpon>
      <SubType>Code</SubType>
    </Compile>
    <!-- Include the default configuration information and metadata files for the add-in.
         These files are copied to the build output directory when the project is
         built, and the path to the configuration file is passed to add-in on the command
         line when debugging.
    -->
  </ItemGroup>
  <!-- Include the build rules for a VB project.-->
  <Import Project="$(MSBuildBinPath)\Microsoft.VisualBasic.targets" />
  <!-- This section defines VSTA properties that describe the host-changable project properties. -->
  <ProjectExtensions>
    <VisualStudio>
      <FlavorProperties GUID="{A860303F-1F3F-4691-B57E-529FC101A107}">
        <ProjectProperties HostName="VSTAHostName" HostPackage="{C1B21C64-9E6F-4923-A89D-9F958503C1CE}" ApplicationType="usd" Language="vb" TemplatesPath="" />
        <Host Name="SSIS_ScriptComponent" />
        <ProjectClient>
          <HostIdentifier>SSIS_ScriptComponent</HostIdentifier>
        </ProjectClient>
      </FlavorProperties>
    </VisualStudio>
  </ProjectExtensions>
</Project>]]></arrayElement><arrayElement dataType="System.String"><![CDATA[\my project\resources.designer.vb]]></arrayElement><arrayElement dataType="System.String"><![CDATA['------------------------------------------------------------------------------
' <autogenerated>
'     This code was generated by a tool.
'
'     Changes to this file may cause incorrect behavior and will be lost if
'     the code is regenerated.
' </autogenerated>
'------------------------------------------------------------------------------

Option Strict Off
Option Explicit On


Namespace My.Resources
    
    '''<summary>
    '''   A strongly-typed resource class, for looking up localized strings, etc.
    '''</summary>
    'This class was auto-generated by the Strongly Typed Resource Builder
    'class via a tool like ResGen or Visual Studio.NET.
    'To add or remove a member, edit your .ResX file then rerun ResGen
    'with the /str option, or rebuild your VS project.
    Class MyResources
        
        Private Shared _resMgr As System.Resources.ResourceManager
        
        Private Shared _resCulture As System.Globalization.CultureInfo
        
        Friend Sub New()
            MyBase.New
        End Sub
        
        '''<summary>
        '''   Returns the cached ResourceManager instance used by this class.
        '''</summary>
        <System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)>  _
        Public Shared ReadOnly Property ResourceManager() As System.Resources.ResourceManager
            Get
                If (_resMgr Is Nothing) Then
                    Dim temp As System.Resources.ResourceManager = New System.Resources.ResourceManager("My.Resources.MyResources", GetType(MyResources).Assembly)
                    _resMgr = temp
                End If
                Return _resMgr
            End Get
        End Property
        
        '''<summary>
        '''   Overrides the current thread's CurrentUICulture property for all
        '''   resource lookups using this strongly typed resource class.
        '''</summary>
        <System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)>  _
        Public Shared Property Culture() As System.Globalization.CultureInfo
            Get
                Return _resCulture
            End Get
            Set
                _resCulture = value
            End Set
        End Property
    End Class
End Namespace
]]></arrayElement><arrayElement dataType="System.String"><![CDATA[\componentwrapper.vb]]></arrayElement><arrayElement dataType="System.String"><![CDATA[' THIS IS AUTO-GENERATED CODE THAT WILL BE OVERWRITTEN! DO NOT EDIT!
' This is CozyRoc Script Component Plus Extended Script
' Microsoft SQL Server Integration Services component wrapper
' This module defines the base class for your component
' THIS IS AUTO-GENERATED CODE THAT WILL BE OVERWRITTEN! DO NOT EDIT!

Imports System
Imports System.Data
Imports Microsoft.SqlServer.Dts.Pipeline
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
Imports Microsoft.SqlServer.Dts.Runtime.Wrapper
Imports CozyRoc.SqlServer.SSIS

<CLSCompliant(False)> _
Public Class UserComponent
    Inherits ScriptComponentPlus

    Public Connections As New Connections(Me)
    Public Variables As New Variables(Me)

    Public Overrides Sub ProcessInput(ByVal InputID As Integer, ByVal Buffer As PipelineBuffer)

        If InputID = MyBase.ComponentMetaData.InputCollection("Input").ID Then
            Input_ProcessInput(New InputBuffer(Me, InputID, True, Buffer))
        End If

    End Sub

    Public Overridable Sub Input_ProcessInput(ByVal Buffer As InputBuffer)

        While Buffer.NextRow()
            Input_ProcessInputRow(Buffer)
        End While

    End Sub

    Public Overridable Sub Input_ProcessInputRow(ByVal Row As InputBuffer)

    End Sub

End Class

Public Class Connections

    Dim ParentComponent As ScriptComponent

    <CLSCompliant(False)> _
    Public Sub New(ByVal Component As ScriptComponent)
        ParentComponent = Component
    End Sub

    Public ReadOnly Property Connection() As IDTSConnectionManager100
        Get
            Return ParentComponent.ComponentMetaData.RuntimeConnectionCollection("Connection").ConnectionManager
        End Get
    End Property

End Class

Public Class Variables

    Dim ParentComponent As ScriptComponent

    <CLSCompliant(False)> _
    Public Sub New(ByVal Component As ScriptComponent)
        ParentComponent = Component
    End Sub

End Class
]]></arrayElement><arrayElement dataType="System.String"><![CDATA[\my project\resources.resx]]></arrayElement><arrayElement dataType="System.String"><![CDATA[<?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>]]></arrayElement><arrayElement dataType="System.String"><![CDATA[\main.vb]]></arrayElement><arrayElement dataType="System.String"><![CDATA[' CozyRoc SQL Server Integration Services user script component
'
' Copyright (c) 2006-2016 COZYROC LLC
' 
' Permission is hereby granted, free of charge, to any person
' obtaining a copy of this software and associated documentation
' files (the "Software"), to deal in the Software without
' restriction, including without limitation the rights to use,
' copy, modify, merge, publish, distribute, sublicense, and/or sell
' copies of the Software, and to permit persons to whom the
' Software is furnished to do so, subject to the following
' conditions:
' 
' The above copyright notice and this permission notice shall be
' included in all copies or substantial portions of the Software.
' 
' THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
' EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
' OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
' NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
' HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
' WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
' FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
' OTHER DEALINGS IN THE SOFTWARE.

Imports System
Imports System.ComponentModel
Imports System.Data
Imports System.Data.Common
Imports System.Data.SqlClient
Imports System.Collections
Imports System.Reflection
Imports System.Diagnostics

Imports Microsoft.SqlServer.Dts.Pipeline
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
Imports Microsoft.SqlServer.Dts.Runtime
Imports Microsoft.SqlServer.Dts.Runtime.Wrapper
Imports CozyRoc.SqlServer.SSIS.Attributes


'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
<ColumnMappings()> _
<SortProperties(New String() { _
    "ConnectionType", "Connection", "Table", "Action", "PrimaryKeys", _
    "ErrorRowDisposition", _
    "InsertedVariable", "UpdatedVariable", "DeletedVariable"})> _
<FilterProperties("GetProperties")> _
<ValidateProperties("Validate")> _
<Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute> _
<CLSCompliant(False)> _
Public Class ScriptMain
    Inherits UserComponent


    Private Const ColumnSeparator As String = "," + vbLf
    Private Const Parameter_1P As String = "p{0}"


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Supported destination table actions.
    Public Enum ActionTypes
        Insert
        InsertUpdate    ' try an insert first, if it fails based on PK defined in the destination then update
        UpdateInsert    ' try an update first based on the PK, if it fails then insert
        Update
        Delete
    End Enum    ' ActionTypes


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Public Overrides Sub Input_ProcessInputRow(ByVal Row As InputBuffer)
        ' Setup command parameters.
        Dim colsCount As Integer = m_inputIndexes.Length
        For colIndex As Integer = 0 To colsCount - 1
            Dim bufIndex As Integer = m_inputIndexes(colIndex)
            Debug.Assert(bufIndex <> 0)
            Dim parameter As DbParameter = m_command.Parameters(colIndex)

            Dim value As Object = Row.Buffer(bufIndex)
            If TypeOf value Is BlobColumn Then
                If parameter.DbType = DbType.Binary Then
                    value = Row.Buffer.GetBlobData(bufIndex, 0, parameter.Size)
                Else
                    ' This is long string.
                    value = Row.Buffer.GetString(bufIndex)
                End If
            End If

            parameter.Value = value
        Next

        Try
            Select Case Me.Action
                Case ActionTypes.Insert
                    m_command.CommandText = m_insertSql
                    Call m_command.ExecuteNonQuery()
                    m_insertedCount += 1

                Case ActionTypes.InsertUpdate
                    Try
                        m_command.CommandText = m_insertSql
                        Call m_command.ExecuteNonQuery()
                        m_insertedCount += 1
                    Catch ex As Exception
                        ' Insert failed. Try update.
                        m_command.CommandText = m_updateSql
                        Call m_command.ExecuteNonQuery()
                        m_updatedCount += 1
                    End Try

                Case ActionTypes.UpdateInsert
                    m_command.CommandText = m_selectSql
                    Dim hasRow As Object = m_command.ExecuteScalar()
                    If hasRow Is Nothing Then
                        ' Row doesn't exist. Insert new one.
                        m_command.CommandText = m_insertSql
                        Call m_command.ExecuteNonQuery()
                        m_insertedCount += 1
                    Else
                        m_command.CommandText = m_updateSql
                        Call m_command.ExecuteNonQuery()
                        m_updatedCount += 1
                    End If

                Case ActionTypes.Update
                    m_command.CommandText = m_updateSql
                    Call m_command.ExecuteNonQuery()
                    m_updatedCount += 1

                Case ActionTypes.Delete
                    m_command.CommandText = m_selectSql
                    Dim hasRow As Object = m_command.ExecuteScalar()
                    If Not hasRow Is Nothing Then
                        ' Row exists. Delete it.
                        m_command.CommandText = m_deleteSql
                        Call m_command.ExecuteNonQuery()
                        m_deletedCount += 1
                    End If
            End Select
        Catch ex As Exception
            Select Case Me.ErrorRowDisposition
                Case DTSRowDisposition.RD_IgnoreFailure
                    ' Do nothing.

                Case DTSRowDisposition.RD_RedirectRow
                    Row.ErrorDescription = ex.Message
                    Call Row.DirectRowToErrorOutput()

                Case DTSRowDisposition.RD_FailComponent, DTSRowDisposition.RD_NotUsed
                    Call FireError_(ex.Message)
            End Select
        End Try
    End Sub ' Input_ProcessInputRow


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Public Overrides Sub PreExecute()
        Call MyBase.PreExecute()

        Dim input As IDTSInput100 = MyBase.ComponentMetaData.InputCollection(0)

        ' Initialize command.
        Dim conn As DbConnection = GetConnection_(False)
        m_command = conn.CreateCommand()

        Dim primaryKeys As ArrayList = New ArrayList()
        If Not String.IsNullOrEmpty(Me.PrimaryKeys) Then
            primaryKeys = New ArrayList(Me.PrimaryKeys.Split( _
                New String() {ColumnSeparator}, _
                StringSplitOptions.None))
        End If
        Dim colsList As ArrayList = New ArrayList(primaryKeys)

        ' Include update columns (other than key).
        For Each inputCol As IDTSInputColumn100 In input.InputColumnCollection
            If inputCol.ExternalMetadataColumnID = 0 Then
                ' Column not selected. Skip it.
                Continue For
            End If

            Dim extCol As IDTSExternalMetadataColumn100 = input.ExternalMetadataColumnCollection.GetObjectByID( _
                inputCol.ExternalMetadataColumnID)

            If Not primaryKeys.Contains(extCol.Name) Then
                ' Key columns will be at the end.
                Call colsList.Insert(0, extCol.Name)
            End If
        Next

        ' Setup buffer indexes and command parameters.
        Dim colsCount As Integer = colsList.Count
        m_inputIndexes = New Integer(colsCount - 1) {}
        Dim parameters() As DbParameter = New DbParameter(colsCount - 1) {}
        For Each inputCol As IDTSInputColumn100 In input.InputColumnCollection
            If inputCol.ExternalMetadataColumnID = 0 Then
                ' Column not selected. Skip it.
                Continue For
            End If

            Dim extCol As IDTSExternalMetadataColumn100 = input.ExternalMetadataColumnCollection.GetObjectByID( _
                inputCol.ExternalMetadataColumnID)

            Dim colName As String = extCol.Name
            Dim paramIndex As Integer = colsList.IndexOf(colName)
            Call Debug.Assert(paramIndex <> -1)

            ' Setup parameter index.
            m_inputIndexes(paramIndex) = Me.HostComponent.BufferManager.FindColumnByLineageID( _
                input.Buffer, _
                inputCol.LineageID)

            ' Setup command parameter.
            Dim parameter As DbParameter = m_command.CreateParameter()
            parameter.ParameterName = String.Format(Parameter_1P, 1 + paramIndex)
            Call SetupParameter_(inputCol, parameter)
            parameters(paramIndex) = parameter
        Next

        ' Include parameters to command.
        For paramIndex As Integer = 0 To colsCount - 1
            Call m_command.Parameters.Add(parameters(paramIndex))
        Next

        ' Setup SQL statements.
        Dim valueList As ArrayList = New ArrayList()
        Dim whereList As ArrayList = New ArrayList()
        Dim setList As ArrayList = New ArrayList()
        Dim selList As ArrayList = New ArrayList()
        For colIndex As Integer = 0 To colsCount - 1
            Dim colName As String = CStr(colsList(colIndex))
            Dim paramName As String = GetParameterName_( _
                conn, _
                parameters(colIndex).ParameterName)

            Call valueList.Add(paramName)

            Dim keyValue As String = String.Format("{0} = {1}", colName, paramName)

            If primaryKeys.Contains(colName) Then
                ' Key column.
                Call whereList.Add(keyValue)
            Else
                Call setList.Add(keyValue)
                Call selList.Add(paramName)
            End If
        Next

        Dim whereClause As String = String.Join( _
            " AND ", _
            CType(whereList.ToArray(GetType(String)), String()))

        m_selectSql = String.Format( _
            "SELECT {0} FROM {1} WHERE {2}", _
            String.Join(",", CType(primaryKeys.ToArray(GetType(String)), String())), _
            Me.Table, _
            whereClause)
        m_insertSql = String.Format( _
            "INSERT INTO {0} ({1}) VALUES({2})", _
            Me.Table, _
            String.Join(",", CType(colsList.ToArray(GetType(String)), String())), _
            String.Join(",", CType(valueList.ToArray(GetType(String)), String())))
        m_updateSql = String.Format( _
            "UPDATE {0} SET {1} WHERE {2}", _
            Me.Table, _
            String.Join(",", CType(setList.ToArray(GetType(String)), String())), _
            whereClause)
        m_deleteSql = String.Format( _
            "DELETE FROM {0} WHERE {1}", _
            Me.Table, _
            whereClause)
    End Sub ' PreExecute


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Public Overrides Sub PostExecute()
        Call MyBase.PostExecute()

        If Not m_command Is Nothing Then
            Dim conn As DbConnection = m_command.Connection
            Call m_command.Dispose()
            m_command = Nothing
            Call conn.Dispose()
        End If

        ' Store diagnostics.
        Call SetVariable_(Me.InsertedVariable, m_insertedCount)
        Call SetVariable_(Me.UpdatedVariable, m_updatedCount)
        Call SetVariable_(Me.DeletedVariable, m_deletedCount)
    End Sub ' PostExecute


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Returns list of current properties based on current state.
    Public Function GetProperties() As String()
        Dim result As New ArrayList

        ' Setup base properties.
        Call result.Add("ConnectionType")
        Call result.Add("Connection")
        Call result.Add("Table")
        Call result.Add("Action")
        Call result.Add("ErrorRowDisposition")
        Call result.Add("InsertedVariable")
        Call result.Add("UpdatedVariable")
        Call result.Add("DeletedVariable")

        Select Case Me.Action
            Case ActionTypes.InsertUpdate, ActionTypes.UpdateInsert, ActionTypes.Update, ActionTypes.Delete
                Call result.Add("PrimaryKeys")
        End Select

        Return CType(result.ToArray(GetType(String)), String())
    End Function    ' GetProperties


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Public Function Validate(ByRef errMessage As String) As Boolean
        Dim result As Boolean

        Try
            If String.IsNullOrEmpty(Me.Connection) Then
                Throw New ApplicationException("Select connection.")
            End If

            If String.IsNullOrEmpty(Me.Table) Then
                Throw New ApplicationException("Select destination table.")
            End If

            If Me.Action <> ActionTypes.Insert AndAlso _
                String.IsNullOrEmpty(Me.PrimaryKeys) Then
                Throw New ApplicationException("Specify table primary keys.")
            End If

            Dim primaryKeys As String() = Me.PrimaryKeys.Split( _
                New String() {ColumnSeparator}, _
                StringSplitOptions.None)

            Dim input As IDTSInput100 = Me.ComponentMetaData.InputCollection(0)
            If input.IsAttached AndAlso _
                (input.InputColumnCollection.Count = 0 OrElse _
                input.InputColumnCollection.Count < primaryKeys.Length) Then
                Throw New Exception("Map input columns.")
            End If

            ' Store connection information in the runtime connection collection, too.
            ' Cannot directly use RuntimeConnectionCollection in the property get/set
            ' because of issues with multi-threading.
            Me.ComponentMetaData.RuntimeConnectionCollection("Connection").ConnectionManagerID = Me.Connection

            result = True
        Catch ex As Exception
            result = False
            errMessage = ex.Message
        End Try

        Validate = result
    End Function    'Validate


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Public Overrides Sub ReinitializeMetaData()
        Call MyBase.ReinitializeMetaData()

        If MyBase.ComponentMetaData.InputCollection.Count = 0 Then
            ' At least one input must exist.
            Throw New Exception("No inputs.")
        End If

        If String.IsNullOrEmpty(Me.Connection) Then
            Throw New Exception("Connection not selected.")
        End If

        If String.IsNullOrEmpty(Me.Table) Then
            Throw New Exception("Destination table not selected.")
        End If

        Dim input As IDTSInput100 = MyBase.ComponentMetaData.InputCollection(0)

        Dim tblCols As DataTable = GetColumns_()

        ' Cleanup.
        input.ExternalMetadataColumnCollection.IsUsed = True
        Call input.InputColumnCollection.RemoveAll()
        Call input.ExternalMetadataColumnCollection.RemoveAll()

        ' Setup column metadata.
        Dim colsCount As Integer = tblCols.Rows.Count
        For colIndex As Integer = 0 To colsCount - 1
            Dim columnRow As DataRow = tblCols.Rows(colIndex)

            If Me.Action = ActionTypes.Delete AndAlso _
                Not CBool(columnRow("IsKey")) Then
                ' Include only key columns for Delete action.
                Continue For
            End If

            Dim column As IDTSExternalMetadataColumn100 = input.ExternalMetadataColumnCollection.NewAt( _
                colIndex)
            column.Name = CStr(columnRow("ColumnName"))

            ' Get type.
            Dim rawType As Type = CType(columnRow("DataType"), Type)
            Dim columnType As DataType = DataRecordTypeToBufferType_(rawType)
            If CBool(columnRow("IsLong")) Then
                ' This is extended type. Have to modify the column type a bit.
                Select Case columnType
                    Case DataType.DT_WSTR
                        columnType = DataType.DT_NTEXT

                    Case DataType.DT_STR
                        columnType = DataType.DT_TEXT

                    Case DataType.DT_BYTES
                        columnType = DataType.DT_IMAGE
                End Select
            End If

            ' Get length.
            Dim length As Integer = 0
            Select Case columnType
                Case DataType.DT_WSTR, DataType.DT_STR, DataType.DT_BYTES, _
                    DataType.DT_IMAGE, DataType.DT_NTEXT, DataType.DT_TEXT
                    length = CInt(columnRow("ColumnSize"))
            End Select

            ' Get code page.
            Dim codepage As Integer = 0
            If columnType = DataType.DT_STR Then
                codepage = -1
            End If

            ' Get precision and scale.
            Dim precision As Integer = 0
            Dim scale As Integer = 0
            If columnType = DataType.DT_NUMERIC OrElse columnType = DataType.DT_BYREF_DECIMAL Then
                If columnRow.IsNull("NumericPrecision") Then
                    precision = 29
                Else
                    precision = CInt(columnRow("NumericPrecision"))
                End If

                If columnRow.IsNull("NumericScale") Then
                    scale = 0
                Else
                    scale = CInt(columnRow("NumericScale"))
                End If

                If scale = 255 Then
                    scale = 0
                End If
            End If

            column.DataType = columnType
            column.Length = length
            column.Precision = precision
            column.Scale = scale
            column.CodePage = codepage
        Next
    End Sub ' ReinitializeMetaData


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Returns list of tables.
    Public Function GetTables() As Object()
        Dim result As ArrayList = New ArrayList()

        Try
            If String.IsNullOrEmpty(Me.Connection) Then
                Throw New Exception("Select connection.")
            End If

            ' Get tables.
            Using conn As DbConnection = GetConnection_(True)
                Dim tableType As String = "TABLE"
                If TypeOf conn Is SqlConnection Then
                    ' SQL uses different table type identifier.
                    tableType = "BASE TABLE"
                End If

                Dim tblTables As DataTable = conn.GetSchema( _
                    "Tables", _
                    New String() {Nothing, Nothing, Nothing, tableType})

                ' Get table schema column name.
                Dim schemaCol As String = tblTables.Columns(1).ColumnName

                For Each tableRow As DataRow In tblTables.Rows
                    Dim tableSchema As String = CStr(tableRow(schemaCol))
                    Dim tableName As String = CStr(tableRow("table_name"))

                    Call result.Add(String.Format("[{0}].[{1}]", tableSchema, tableName))
                Next

                Call result.Sort()
            End Using
        Catch ex As Exception
            Call MsgBox(ex.Message, MsgBoxStyle.OkOnly Or MsgBoxStyle.Exclamation)
        End Try

        GetTables = result.ToArray()
    End Function    ' GetTables


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Returns selected destination table columns.
    Public Function GetColumns() As Object()
        Dim result As ArrayList = New ArrayList

        Try
            Dim tblCols As DataTable = GetColumns_()
            For Each columnRow As DataRow In tblCols.Rows
                Call result.Add(columnRow("ColumnName"))
            Next

            Call result.Sort()
        Catch ex As Exception
            Call MsgBox(ex.Message, MsgBoxStyle.OkOnly Or MsgBoxStyle.Exclamation)
        End Try

        GetColumns = result.ToArray()
    End Function    ' GetColumns


#Region "Properties"
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    <Description("Select connection type.")> _
    <Category("Destination")> _
    <List(New Object() {"ADO.NET", "OLEDB"})> _
    <DefaultValue("ADO.NET")> _
    <RefreshProperties(RefreshProperties.All)> _
    Public Property ConnectionType() As String
        Get
            ConnectionType = m_connectionType
        End Get
        Set(ByVal value As String)
            If m_connectionType <> value Then
                m_connectionType = value
                Me.Connection = String.Empty
            End If
        End Set
    End Property    ' ConnectionType


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    <Description("Select Connection Manager.")> _
    <Category("Destination")> _
    <Connection("ConnectionType")> _
    <RefreshProperties(RefreshProperties.All)> _
    Public Property Connection() As String
        Get
            Connection = m_connection
        End Get
        Set(ByVal value As String)
            If m_connection <> value Then
                m_connection = value
                Me.Table = String.Empty
            End If
        End Set
    End Property    ' Connection


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    <Description("Select destination table.")> _
    <Category("Destination")> _
    <List("GetTables", False, True)> _
    <RefreshProperties(RefreshProperties.All)> _
    Public Property Table() As String
        Get
            Table = m_table
        End Get
        Set(ByVal value As String)
            If m_table <> value Then
                m_table = value

                Me.PrimaryKeys = String.Empty
                If Me.Action <> ActionTypes.Insert Then
                    ' Initialize primary keys.
                    Me.PrimaryKeys = GetPrimaryKeys_()
                End If
            End If
        End Set
    End Property    ' Table


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    <Description("Select destination table action.")> _
    <Category("Destination")> _
    <DefaultValue(ActionTypes.InsertUpdate)> _
    <RefreshProperties(RefreshProperties.All)> _
    Public Property Action() As ActionTypes
        Get
            Action = m_action
        End Get
        Set(ByVal value As ActionTypes)
            If m_action <> value Then
                m_action = value

                Me.PrimaryKeys = String.Empty
                If Me.Action <> ActionTypes.Insert Then
                    ' Initialize primary keys.
                    Me.PrimaryKeys = GetPrimaryKeys_()
                End If
            End If
        End Set
    End Property    ' Action


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    <Description("Specify table primary keys.")> _
    <Category("Destination")> _
    <List("GetColumns", True, False)> _
    Public Property PrimaryKeys() As String
        Get
            PrimaryKeys = m_primaryKeys
        End Get
        Set(ByVal value As String)
            m_primaryKeys = value
        End Set
    End Property    ' PrimaryKeys


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    <Description("Specify how to handle error rows.")> _
    <Category("Error")> _
    <DefaultValue(DTSRowDisposition.RD_FailComponent)> _
    Public Property ErrorRowDisposition() As DTSRowDisposition
        Get
            ErrorRowDisposition = m_errorRowDisposition
        End Get
        Set(ByVal value As DTSRowDisposition)
            m_errorRowDisposition = value
        End Set
    End Property    ' ErrorRowDisposition


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    <Description("Select variable to store number of rows inserted (optional).")> _
    <Category("Diagnostics")> _
    <Variable()> _
    Public Property InsertedVariable() As String
        Get
            InsertedVariable = m_insertedVar
        End Get
        Set(ByVal value As String)
            m_insertedVar = value
        End Set
    End Property    ' InsertedVariable


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    <Description("Select variable to store number of rows updated (optional).")> _
    <Category("Diagnostics")> _
    <Variable()> _
    Public Property UpdatedVariable() As String
        Get
            UpdatedVariable = m_updatedVar
        End Get
        Set(ByVal value As String)
            m_updatedVar = value
        End Set
    End Property    ' UpdatedVariable


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    <Description("Select variable to store number of rows deleted (optional).")> _
    <Category("Diagnostics")> _
    <Variable()> _
    Public Property DeletedVariable() As String
        Get
            DeletedVariable = m_deletedVar
        End Get
        Set(ByVal value As String)
            m_deletedVar = value
        End Set
    End Property    ' DeletedVariable
#End Region ' Properties


#Region "Internals"
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Returns selected destination table primary keys.
    Private Function GetPrimaryKeys_() As String
        Dim result As ArrayList = New ArrayList

        Try
            Dim tblCols As DataTable = GetColumns_()
            For Each columnRow As DataRow In tblCols.Rows
                If CBool(columnRow("IsKey")) Then
                    ' Key column.
                    Call result.Add(columnRow("ColumnName"))
                End If
            Next
        Catch ex As Exception
            ' Silently catch the error.
        End Try

        GetPrimaryKeys_ = String.Join( _
            ColumnSeparator, _
            CType(result.ToArray(GetType(String)), String()))
    End Function    ' GetPrimaryKeys_


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Private Function GetColumns_() As DataTable
        Dim result As DataTable

        Using conn As DbConnection = GetConnection_(True)
            Using cmd As DbCommand = conn.CreateCommand()
                cmd.CommandText = String.Format("SELECT * FROM {0}", Me.Table)
                Dim reader As DbDataReader = cmd.ExecuteReader( _
                    CommandBehavior.SchemaOnly Or CommandBehavior.KeyInfo)
                result = reader.GetSchemaTable()
            End Using
        End Using

        GetColumns_ = result
    End Function    ' GetColumns_


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Returns SSIS data type from .NET type. Uses private PipelineComponent method.
    Private Function DataRecordTypeToBufferType_(ByVal type As Type) As DataType
        DataRecordTypeToBufferType_ = CType( _
            GetType(PipelineComponent).InvokeMember( _
                "DataRecordTypeToBufferType", _
                BindingFlags.InvokeMethod Or BindingFlags.NonPublic Or BindingFlags.Static, _
                Nothing, _
                Nothing, _
                New Object() {type}), _
            DataType)
    End Function    ' DataRecordTypeToBufferType_


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Setup parameter data type.
    Private Sub SetupParameter_( _
        ByVal inputCol As IDTSInputColumn100, _
        ByVal parameter As DbParameter)

        parameter.DbType = GetDbType_(inputCol.DataType)
        parameter.Size = inputCol.Length
        If parameter.Size = 0 AndAlso parameter.DbType = DbType.Binary Then
            parameter.Size = 8000
        End If

        ' Get precision.
        Dim precision As Byte = CByte(inputCol.Precision)
        If parameter.DbType = DbType.Decimal AndAlso precision = 0 Then
            ' Decimal type has precision 29.
            ' http://msdn.microsoft.com/en-us/library/ms141036.aspx
            precision = 29
        End If

        Dim scale As Byte = CByte(inputCol.Scale)
        If parameter.DbType = DbType.DateTime AndAlso scale = 0 Then
            ' DateTime has maximum scale of 3.
            ' http://msdn.microsoft.com/en-us/library/ms141036%28v=sql.100%29.aspx
            scale = 3
        End If

        ' Setup precision and scale.
        Dim iDbDataParameter As IDbDataParameter = parameter
        iDbDataParameter.Precision = precision
        iDbDataParameter.Scale = scale
    End Sub ' SetupParameter_


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Return ADO.NET data type from SSIS data type.
    Private Function GetDbType_(ByVal dt As DataType) As DbType
        Select Case dt
            Case DataType.DT_BOOL
                Return DbType.Boolean
            Case DataType.DT_STR, DataType.DT_WSTR, DataType.DT_TEXT, DataType.DT_NTEXT
                Return DbType.String
            Case DataType.DT_I1
                Return DbType.SByte
            Case DataType.DT_UI1
                Return DbType.Byte
            Case DataType.DT_I2
                Return DbType.Int16
            Case DataType.DT_UI2
                Return DbType.UInt16
            Case DataType.DT_I4
                Return DbType.Int32
            Case DataType.DT_UI4
                Return DbType.UInt32
            Case DataType.DT_I8
                Return DbType.Int64
            Case DataType.DT_UI8
                Return DbType.UInt64
            Case DataType.DT_R4
                Return DbType.Single
            Case DataType.DT_R8
                Return DbType.Double
            Case DataType.DT_NUMERIC, DataType.DT_DECIMAL
                Return DbType.Decimal
            Case DataType.DT_CY
                Return DbType.Currency
            Case DataType.DT_DBTIMESTAMP
                Return DbType.DateTime
            Case DataType.DT_DBDATE
                Return DbType.Date
            Case DataType.DT_DBTIME
                Return DbType.Time
            Case DataType.DT_BYTES, DataType.DT_IMAGE
                Return DbType.Binary
        End Select

        Throw New ArgumentException(String.Format("Unhandled type. {0}", dt))
    End Function    ' GetDbType_


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Returns parameter name for specified connection type.
    Private Function GetParameterName_(ByVal conn As DbConnection, ByVal parameter As String) As String
        Dim result As String = parameter

        If TypeOf conn Is SqlConnection Then
            result = "@" + parameter
        Else
            ' Most probably ODBC or OLEDB
            result = "?"
        End If

        GetParameterName_ = result
    End Function    ' GetParameterName_


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Private Sub FireError_(ByVal message As String)
        Dim cancel As Boolean = False
        Call MyBase.ComponentMetaData.FireError( _
            0, _
            "Table Update Destination", _
            message, _
            String.Empty, _
            0, _
            cancel)
    End Sub ' FireError_


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Get connection object.
    Private Function GetConnection_(ByVal design As Boolean) As DbConnection
        Dim result As DbConnection

        If design Then
            If Me.ConnectionType = "OLEDB" Then
                Dim manager As ConnectionManager = MyBase.DesignConnections(Me.Connection)
                Dim managerParams As IDTSConnectionManagerDatabaseParameters100 = CType( _
                    manager.InnerObject, _
                    IDTSConnectionManagerDatabaseParameters100)
                result = CType(managerParams.GetConnectionForSchema(), DbConnection)
            Else
                result = CType( _
                    MyBase.DesignConnections(Me.Connection).AcquireConnection(Nothing), _
                    DbConnection)
            End If
        Else
            If Me.ConnectionType = "OLEDB" Then
                Dim host As IDTSObjectHost100 = CType(MyBase.Connections.Connection, IDTSObjectHost100)
                Dim managerParams As IDTSConnectionManagerDatabaseParameters100 = CType( _
                    host.InnerObject, _
                    IDTSConnectionManagerDatabaseParameters100)
                result = CType(managerParams.GetConnectionForSchema(), DbConnection)
            Else
                result = CType( _
                    MyBase.Connections.Connection.AcquireConnection(Nothing), _
                    DbConnection)
            End If
        End If

        GetConnection_ = result
    End Function    ' GetConnection_


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Private Sub SetVariable_(ByVal varName As String, ByVal value As Object)
        If String.IsNullOrEmpty(varName) Then
            ' Variable not set.
            Exit Sub
        End If

        Dim vars As IDTSVariables100 = Nothing
        Call MyBase.VariableDispenser.LockOneForWrite(varName, vars)
        Try
            vars(varName).Value = value
        Finally
            Call vars.Unlock()
        End Try
    End Sub ' SetVariable_
#End Region ' Internals


#Region "Attributes"
    Private m_connectionType As String
    Private m_connection As String
    Private m_table As String
    Private m_primaryKeys As String
    Private m_action As ActionTypes
    Private m_errorRowDisposition As DTSRowDisposition
    Private m_insertedVar As String
    Private m_updatedVar As String
    Private m_deletedVar As String

    Private m_command As DbCommand
    Private m_inputIndexes() As Integer
    Private m_selectSql As String
    Private m_insertSql As String
    Private m_updateSql As String
    Private m_deleteSql As String
    Private m_insertedCount As Integer
    Private m_updatedCount As Integer
    Private m_deletedCount As Integer
#End Region ' Attributes
End Class   ' ScriptMain
]]></arrayElement></arrayElements></property>
<property id="15" name="BinaryCode" dataType="System.String" state="cdata" isArray="true" description="Stores the binary representation of the component" typeConverter="NOTBROWSABLE" UITypeEditor="" containsID="false" expressionType="None"><arrayElements arrayElementCount="2"><arrayElement dataType="System.String"><![CDATA[\bin\scriptcomponent_2e3d4c56d0694f9bbd032f1e0950bec1.vbproj.dll]]></arrayElement><arrayElement dataType="System.String"><![CDATA[TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAgAAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1v
ZGUuDQ0KJAAAAAAAAABQRQAATAEDAKXXMVcAAAAAAAAAAOAAAiELAQgAAFgAAAAMAAAAAAAAjnYA
AAAgAAAAgAAAAABAAAAgAAAAAgAABAAAAAAAAAAEAAAAAAAAAADAAAAAAgAAAAAAAAIAQIUAABAA
ABAAAAAAEAAAEAAAAAAAABAAAAAAAAAAAAAAAEB2AABLAAAAAIAAALgJAAAAAAAAAAAAAAAAAAAA
AAAAAKAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAIAAACAAAAAAAAAAAAAAACCAAAEgAAAAAAAAAAAAAAC50ZXh0AAAAlFYAAAAgAAAAWAAAAAIA
AAAAAAAAAAAAAAAAACAAAGAucnNyYwAAALgJAAAAgAAAAAoAAABaAAAAAAAAAAAAAAAAAABAAABA
LnJlbG9jAAAMAAAAAKAAAAACAAAAZAAAAAAAAAAAAAAAAAAAQAAAQgAAAAAAAAAAAAAAAAAAAABw
dgAAAAAAAEgAAAACAAUA1DgAAGw9AAABAAAAAAAAAFAgAAC4AAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAALQAAADOyu++AQAAAJEAAABsU3lzdGVtLlJlc291cmNlcy5S
ZXNvdXJjZVJlYWRlciwgbXNjb3JsaWIsIFZlcnNpb249Mi4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFs
LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5I1N5c3RlbS5SZXNvdXJjZXMuUnVudGlt
ZVJlc291cmNlU2V0AgAAAAAAAAAAAAAAUEFEUEFEULQAAAAeAigBAAAKKh4CKAQAAAoqpnMGAAAK
gAEAAARzBwAACoACAAAEcwgAAAqAAwAABHMJAAAKgAQAAAQqAAATMAEACwAAAAEAABF+AQAABG8K
AAAKKgATMAEACwAAAAIAABF+AgAABG8LAAAKKgATMAEACwAAAAMAABF+AwAABG8MAAAKKgATMAEA
CwAAAAQAABF+BAAABG8NAAAKKgATMAIADQAAAAUAABECAygRAAAKKBIAAAoqAAAAEzABAAcAAAAG
AAARAigTAAAKKgATMAEACwAAAAcAABHQBQAAAigUAAAKKgATMAEABwAAAAgAABECKBUAAAoqABMw
AQAQAAAACQAAEQKMAQAAGy0GKAEAACsqAioTMAIAEAAAAAoAABEDEgD+FQIAABsGgQIAABsqHgIo
FwAACioTMAIAKAAAAAsAABECexkAAApvGgAACgsHjAMAABstEigCAAArCwJ7GQAACgdvGwAACgcq
SgIoFwAACgJzHAAACn0ZAAAKKgCyAgMEBQ4EKB4AAAoCA28fAAAKbyAAAApyAQAAcG8hAAAKbyIA
AAp9BgAABCoAAAATMAEABwAAAAwAABEWjScAAAEqACYCFgNvIwAACioAAGIDLAkCFm8kAAAKKwty
GwAAcHMlAAAKeioAAAA2AgJ7BgAABCgmAAAKKgAAEzADABEAAAANAAARF40nAAABCwcWcrgAAHCi
ByoAAAATMAEACQAAAA4AABECKCcAAAoKBioAAAATMAEACQAAAA8AABECKCgAAAoKBioAAAB+Aigq
AAAKAgJzHQAABn0HAAAEAgJzHwAABn0IAAAEKrYDAigfAAAKbysAAApy2gAAcG8sAAAKby0AAAoz
DwICAxcEcxEAAAZvGwAABioAAEorBwIDbxwAAAYDbxcAAAYt8SoABioAADoCKBcAAAoCA30JAAAE
KgATMAIAIAAAABAAABECewkAAARvHwAACm8uAAAKcuYAAHBvLwAACm8wAAAKKjoCKBcAAAoCA30K
AAAEKgAeAigZAAAGKhswBACuAgAAEQAAEQJ7FwAABI63ChYGF9oTCQwrdgJ7FwAABAiUCwJ7FgAA
BG8xAAAKCG8yAAAKDQNvMwAACgdvNAAACigRAAAKEwQRBHUxAAABLC4JbzUAAAoXMxcDbzMAAAoH
FglvNgAACm83AAAKEwQrDgNvMwAACgdvOAAAChMECREEKBEAAApvOQAACggX1gwIEQkxhQJvLwAA
BkUFAAAABQAAADUAAACiAAAAKQEAAFkBAADd/AEAAAJ7FgAABAJ7GQAABG86AAAKAnsWAAAEbzsA
AAomAgJ7HAAABBfWfRwAAATdzAEAAAJ7FgAABAJ7GQAABG86AAAKAnsWAAAEbzsAAAomAgJ7HAAA
BBfWfRwAAATdnAEAACUoPAAAChMFAnsWAAAEAnsaAAAEbzoAAAoCexYAAARvOwAACiYCAnsdAAAE
F9Z9HQAABCg9AAAK3V8BAAACexYAAAQCexgAAARvOgAACgJ7FgAABG8+AAAKKBEAAAoTBhEGLTAC
exYAAAQCexkAAARvOgAACgJ7FgAABG87AAAKJgICexwAAAQX1n0cAAAE3QgBAAACexYAAAQCexoA
AARvOgAACgJ7FgAABG87AAAKJgICex0AAAQX1n0dAAAE3dgAAAACexYAAAQCexoAAARvOgAACgJ7
FgAABG87AAAKJgICex0AAAQX1n0dAAAE3agAAAACexYAAAQCexgAAARvOgAACgJ7FgAABG8+AAAK
KBEAAAoTBxEHLCsCexYAAAQCexsAAARvOgAACgJ7FgAABG87AAAKJgICex4AAAQX1n0eAAAE3lQl
KDwAAAoTCAJvMwAABkUFAAAAGQAAAAIAAAAEAAAAJgAAABkAAAArJCsiAxEIbz8AAApvEwAABgNv
FQAABisNAhEIbz8AAApvQQAABig9AAAK3gAqAABBMAAAAAAAAOEAAAAwAAAAEQEAAD0AAAAvAAAB
AAAAAI0AAADMAQAAWQIAAFQAAAAvAAABGzAHAKsDAAASAAARAihAAAAKAigfAAAKbysAAAoWjDYA
AAFvLAAACg0CFm9CAAAGDAIIb0EAAAp9FgAABHNCAAAKEwUCbzEAAAYoQwAACi0mAm8xAAAGF40n
AAABExcRFxZy/AAAcKIRFxZvRAAACnNFAAAKEwURBXNFAAAKCwlvRgAACm9HAAAKExgrShEYb0gA
AAp0DwAAARMMEQxvSQAAChYuMglvSgAAChEMb0kAAApvSwAAChMLEQURC29MAAAKb00AAAotDgcW
EQtvTAAACm9OAAAKERhvTwAACi2t3hYRGHU7AAABLAwRGHU7AAABb1AAAArcB29RAAAKCgIGF9oX
1o02AAABfRcAAAQGF9oX1o0QAAABEwQJb0YAAApvRwAAChMZOKAAAAARGW9IAAAKdA8AAAETDxEP
b0kAAAoWO4UAAAAJb0oAAAoRD29JAAAKb0sAAAoTDhEOb0wAAAoTDQcRDW9SAAAKExECexcAAAQR
EQJvUwAACm9UAAAKCW9VAAAKEQ9vVgAACm9XAAAKngJ7FgAABG9YAAAKExAREHICAQBwFxER1ow2
AAABKFkAAApvWgAACgIRDxEQbz4AAAYRBBERERCiERlvTwAACjpU////3hYRGXU7AAABLAwRGXU7
AAABb1AAAArcFgYX2hMaExIrHAJ7FgAABG8xAAAKEQQREppvWwAACiYREhfWExIREhEaMd5zQgAA
ChMIc0IAAAoTCnNCAAAKEwdzQgAAChMGFgYX2hMbExMrbQcRE29cAAAKKF0AAAoTFAIIEQQRE5pv
XgAACm9AAAAGExYRCBEWb18AAAomcgwBAHARFBEWKGAAAAoTFREFERRvTQAACiwMEQoRFW9fAAAK
JisUEQcRFW9fAAAKJhEGERZvXwAACiYRExfWExMRExEbMY1yIAEAcBEK0CcAAAEoFAAACm9hAAAK
dAoAABsoYgAAChMJAnIsAQBwcmgBAHARBdAnAAABKBQAAApvYQAACnQKAAAbKGIAAAoCby0AAAYR
CShjAAAKfRgAAAQCcmwBAHACby0AAAZyaAEAcAfQJwAAASgUAAAKb2EAAAp0CgAAGyhiAAAKcmgB
AHARCNAnAAABKBQAAApvYQAACnQKAAAbKGIAAAooYwAACn0ZAAAEAnKwAQBwAm8tAAAGcmgBAHAR
B9AnAAABKBQAAApvYQAACnQKAAAbKGIAAAoRCShjAAAKfRoAAAQCcuoBAHACby0AAAYRCShgAAAK
fRsAAAQqAAEYAAACAHMAZNcAFgAAAAECABABwNABFgAAAAETMAMAeAAAABMAABECKGQAAAoCexYA
AAQsJAJ7FgAABG9lAAAKCgJ7FgAABG9mAAAKAhR9FgAABAZvZgAACgICbzUAAAYCexwAAASMNgAA
AW9DAAAGAgJvNwAABgJ7HQAABIw2AAABb0MAAAYCAm85AAAGAnseAAAEjDYAAAFvQwAABioTMAIA
pwAAABQAABFzQgAACgsHch4CAHBvXwAACiYHcuYAAHBvXwAACiYHcjwCAHBvXwAACiYHckgCAHBv
XwAACiYHclYCAHBvXwAACiYHcn4CAHBvXwAACiYHcqACAHBvXwAACiYHcsACAHBvXwAACiYCby8A
AAYXWUUEAAAAAgAAAAIAAAACAAAAAgAAACsMB3LgAgBwb18AAAomB9AnAAABKBQAAApvYQAACnQK
AAAbKgAbMAQA+wAAABUAABECbysAAAYoQwAACiwLcvgCAHBzZwAACnoCby0AAAYoQwAACiwLch4D
AHBzZwAACnoCby8AAAYWLhgCbzEAAAYoQwAACiwLclIDAHBzZwAACnoCbzEAAAYXjScAAAETBREF
FnL8AABwohEFFm9EAAAKDQJvHwAACm8rAAAKFow2AAABbywAAAoMCG9oAAAKLCkIb0YAAApvaQAA
ChYuEAhvRgAACm9pAAAKCY63LwtyigMAcHNqAAAKegJvHwAACm8uAAAKcuYAAHBvLwAACgJvKwAA
Bm9rAAAKFwreGiUoPAAAChMEFgoDEQRvPwAAClEoPQAACt4ABgsHKgABDAAAAAAAAN3dABovAAAB
EzADAHICAAAWAAARAihsAAAKAigfAAAKbysAAApvbQAAChYzC3KwAwBwc2oAAAp6Am8rAAAGKEMA
AAosC3LGAwBwc2oAAAp6Am8tAAAGKEMAAAosC3L4AwBwc2oAAAp6AigfAAAKbysAAAoWjDYAAAFv
LAAACgsCbzwAAAYMB29KAAAKF29uAAAKB29GAAAKb28AAAoHb0oAAApvcAAACghvcQAACm9yAAAK
ChYGF9oTDBMEOLsBAAAIb3EAAAoRBG9zAAAKEwYCby8AAAYaMxgRBnI4BABwb3QAAAoodQAACi0F
OIUBAAAHb0oAAAoRBG92AAAKEwURBREGckQEAHBvdAAACihdAAAKb3cAAAoRBnJaBABwb3QAAAp0
BQAAARMKAhEKbz0AAAYTBxEGcmwEAHBvdAAACih1AAAKLDQRByCAAAAAWUUDAAAAFAAAAAsAAAAC
AAAAKxkgLwEAABMHKxAgLgEAABMHKwcgLQEAABMHFhMIEQcTDhEOIIIAAAAuLREOIIEAAAAuJBEO
IIAAAAAuGxEOIC0BAAAuEhEOIC8BAAAuCREOIC4BAAAzExEGcnoEAHBvdAAACih4AAAKEwgWDREH
IIEAAAAzAhUNFhMJFhMLEQcggwAAAC4JEQcgDkAAADNZEQZykAQAcG95AAAKLAYfHRMJKxMRBnKQ
BABwb3QAAAooeAAAChMJEQZysgQAcG95AAAKLAUWEwsrExEGcrIEAHBvdAAACih4AAAKEwsRCyD/
AAAAMwMWEwsRBREHb3oAAAoRBREIb3sAAAoRBREJb3wAAAoRBRELb30AAAoRBQlvfgAAChEEF9YT
BBEEEQw+PP7//yoAABswBQAtAQAAFwAAEXNCAAAKCwJvKwAABihDAAAKLAty+AIAcHNqAAAKegIX
b0IAAAYMcswEAHATBAh1RAAAASwHctgEAHATBAhy7gQAcBqNJwAAARMKEQoWFKIRChcUohEKGBSi
EQoZEQSiEQpvfwAAChMFEQVvgAAAChdvgQAACm+CAAAKDREFb3EAAApvgwAAChMLK0URC29IAAAK
dEIAAAETBxEHCW90AAAKKF0AAAoTCBEHcvwEAHBvdAAACihdAAAKEwYHchIFAHARCBEGKGAAAApv
XwAACiYRC29PAAAKLbLeFhELdTsAAAEsDBELdTsAAAFvUAAACtwHb4QAAAreKwgsBghvUAAACtze
HyUoPAAAChMJEQlvPwAACh8wFCiFAAAKJig9AAAK3gAHb4YAAAoKBioAAAABJAAAAgB7AGDbABYA
AAABAgAmANP5AAoAAAABAAAGAP8FAR8vAAABGzADAJEAAAAYAAARc0IAAAoLAm88AAAGDAhvcQAA
Cm+DAAAKEwUrJBEFb0gAAAp0QgAAAQ0HCXJEBABwb3QAAAooEQAACm9fAAAKJhEFb08AAAot094W
EQV1OwAAASwMEQV1OwAAAW9QAAAK3AdvhAAACt4fJSg8AAAKEwQRBG8/AAAKHzAUKIUAAAomKD0A
AAreAAdvhgAACgoGKgAAAAEYAAACAA0APksAFgAAAAEAAAYAY2kAHy8AAAETMAEACQAAABkAABEC
ew0AAAQKBioAAACOAnsNAAAEAxYohwAAChYuEgIDfQ0AAAQCfogAAApvLAAABioTMAEACQAAABoA
ABECew4AAAQKBioAAACOAnsOAAAEAxYohwAAChYuEgIDfQ4AAAQCfogAAApvLgAABioTMAEACQAA
ABsAABECew8AAAQKBioAAADiAnsPAAAEAxYohwAAChYuJwIDfQ8AAAQCfogAAApvMgAABgJvLwAA
BhYuDAICbzsAAAZvMgAABioAAAATMAEACQAAABwAABECexEAAAQKBioAAADGAnsRAAAEAy4nAgN9
EQAABAJ+iAAACm8yAAAGAm8vAAAGFi4MAgJvOwAABm8yAAAGKgAAEzABAAkAAAAdAAARAnsQAAAE
CgYqAAAAIgIDfRAAAAQqAAAAEzABAAkAAAAeAAARAnsSAAAECgYqAAAAIgIDfRIAAAQqAAAAEzAB
AAkAAAAfAAARAnsTAAAECgYqAAAAIgIDfRMAAAQqAAAAEzABAAkAAAAgAAARAnsUAAAECgYqAAAA
IgIDfRQAAAQqAAAAEzABAAkAAAAhAAARAnsVAAAECgYqAAAAIgIDfRUAAAQqAAAAGzADAKYAAAAi
AAARc0IAAAoLAm88AAAGDAhvcQAACm+DAAAKEwUrNhEFb0gAAAp0QgAAAQ0JcjgEAHBvdAAACih1
AAAKLBcHCXJEBABwb3QAAAooEQAACm9fAAAKJhEFb08AAAotwd4nEQV1OwAAASwMEQV1OwAAAW9Q
AAAK3N4PJSg8AAAKEwQoPQAACt4AcvwAAHAH0CcAAAEoFAAACm9hAAAKdAoAABsoYgAACgoGKgAA
ARgAAAIADQBQXQAWAAAAAQAABgBvdQAPLwAAARswAwBSAAAAIwAAEQIXb0IAAAYMCG9BAAAKDQly
KgUAcAJvLQAABihZAAAKbzoAAAoJHG+JAAAKEwQRBG+KAAAKC94WCSwGCW9QAAAK3N4KCCwGCG9Q
AAAK3AcKBioAAAEYAAACAA8AKTgACgAAAAECAAgAPEQACgAAAAETMAgALwAAACQAABHQPAAAASgU
AAAKck4FAHAgKAEAABQUF40DAAABCwcWA6IHb4sAAAooeAAACgoGKgATMAMAewAAACUAABEEAgNv
jAAACm8/AAAGb40AAAoEA2+OAAAKb48AAAoEbzYAAAoWMxQEbzUAAAoXMwsEIEAfAABvjwAACgNv
kAAACrQLBG81AAAKHTMHBxYzAx8dCwNvkQAACrQMBG81AAAKHDMGCBYzAhkMBAoGB2+SAAAKBghv
kwAACioAEzACANIAAAAmAAARAwsHHwszAhkqByCBAAAALhgHIIIAAAAuEAcgLgEAAC4IByAvAQAA
MwMfECoHHxAzAx8OKgcfETMCGCoHGDMDHwoqBx8SMwMfEioHGTMDHwsqBx8TMwMfEyoHHxQzAx8M
KgcfFTMDHxQqBxozAx8PKgcbMwIeKgcggwAAAC4FBx8OMwIdKgccMwIaKgcghwAAADMCHCoHIIUA
AAAzAhsqByCGAAAAMwMfESoHIIAAAAAuCAcgLQEAADMCFypyhAUAcAOMDgAAAShZAAAKc5QAAAp6
AAATMAIAIgAAACcAABEECwN1RAAAASwOcqwFAHAEKJUAAAoLKwZysAUAcAsHCgYqAAATMAcAHQAA
ACgAABEWCgIoHwAAChZytAUAcAN+iAAAChYSAG+WAAAKKgAAABMwAwDAAAAAKQAAEQMsXwJvKQAA
BnLmBQBwFiiHAAAKFjMsAiiXAAAKAm8rAAAGb5gAAAoMCG+ZAAAKdFIAAAENCW+aAAAKdBIAAAEL
K3kCKJcAAAoCbysAAAZvmAAAChRvmwAACnQSAAABCytaAm8pAAAGcuYFAHAWKIcAAAoWMy8CewcA
AARvHgAABnRTAAABEwQRBG+cAAAKdFIAAAETBREFb5oAAAp0EgAAAQsrFwJ7BwAABG8eAAAGFG+d
AAAKdBIAAAELBwoGKhswAwA1AAAAKgAAEQMoQwAACiwBKhQKAiieAAAKAxIAb58AAAoGA2+gAAAK
BCgRAAAKb6EAAAreBwZvogAACtwqAAAAAQwAAAIAGQAULQAHAAAAAR4CKBcAAAoqEzACAC0AAAAr
AAARfiUAAAQtIHLyBQBw0A0AAAIoFAAACm+xAAAKc7IAAAoLB4AlAAAEfiUAAAQqAAAAEzABAAYA
AAAsAAARfiYAAAQqAAAeAoAmAAAEKkJzFwAACigRAAAKgCgAAAQqAAAAHgIoswAACiobMAEAPwAA
AC0AABF+JwAABC0yfigAAAQoEQAACii0AAAKficAAAQtHHNJAAAGgCcAAATeEH4oAAAEKBEAAAoo
tQAACtx+JwAABCoAAQwAAAIAHQAMKQAQAAAAAUJTSkIBAAEAAAAAAAwAAAB2Mi4wLjUwNzI3AAAA
AAUAbAAAAHQTAAAjfgAA4BMAAIQZAAAjU3RyaW5ncwAAAABkLQAAJAYAACNVUwCIMwAAEAAAACNH
VUlEAAAAmDMAANQJAAAjQmxvYgAAAAAAAAACAAABVx2iCQkPAAAA+gEzABYAAAEAAABxAAAADgAA
ACgAAABKAAAAJQAAAMAAAAAHAAAAXQAAAC0AAAAHAAAAFgAAACAAAAAKAAAAAQAAAAoAAAABAAAA
AwAAAAMAAAACAAAAAABIGQEAAAAAAAoAtQGLAQoA6QHLAQYA+QHyAQoAUQKLAQYAzwLyAQoAUQMn
Aw4AowOMAxIABgTlAxYANwTlAw4ASQWMAxoA+gXSBR4AfwdWByIAVwhLCBoAbQjSBR4AlwhWByIA
vQiqCCIA7AhLCCIAAQmqCCIA3gmqCAYAzAryAQYAGQsICwYARgsxCyYApwuSCyYA9AveCyYADQze
CyYAOgwiDAYAZAxRDAoAowx8DAoAuwwTACYA8AzTDAYAJQ0FDQYAQw3yAQYAZw3yAQoAgA0TAAYA
xA2lDR4A2A1WBx4ABw5WBx4ANA5WBwYAUg7yAQYAag7yARIAhA7lAwYAmw7yAR4AsQ5WBx4A3A5W
Bx4A6Q5WBx4ALA9WBwYAWw/yASIAZQ+qCBYAlQ/lAwoA6g98DAYARRAyEB4ATxBWBwYAbRAyEAYA
eRDyAQYAmxDyAQYAtBAyEB4AwBBWBx4ALhFWBwYApBHyARYAyhHlAx4A7hFWBwoAZhJ8DAYAhBLy
ASYARgTeCwYAlxLyASIA0xJLCCIA8BJLCCIAiBNyEyIAoBNLCCIAwRNLCAoA4BMTAAoA7BMTAAoA
+RMTAAoADBR8DCIAKhSqCCIANxRLCAYAdhRkFAYAgxRkFCIAlxRLCAYA7BTyASoAThUuFRoAYBXS
BRoAixXSBSoAAgEuFRoA7BXSBRoA/RXSBRoAPBbSBRIAUxblAw4AnBZ6Fg4AuBZ6Fg4A0hZ6Fg4A
6hZ6FiYAAhfeCyYAHRfeCw4ALxd6FiYAPRfeCyYATxfeCw4AZBd6FiYAdhfeCw4AjBd6FgYAoBdk
FAYAxxe2FwYA2hdRDAYAQxgFDQYAYxgFDQYAgRhkFAYAnhilDQYArBhkFAYAxxhkFAYA4hhkFAYA
+xhkFAYAFBlkFAYAMRlkFAAAAAABAAAAAAABAAEAAAAAACkANwAFAAEAAQAAAAAAcgA3AAkAAQAC
AAABEAB9ADcADQABAAMABQEAAIcAAAANAAUACAAFAQAAlQAAAA0ABQAPAAEAAACwALwAHQAGABEA
AQAAAPQAvAApAAcAGQABAAAAAgG8AA0ACQAdAAEAAAAOAbwADQAKAB8AAQAAABgBvAAgAAsAIAAC
AQAAIwEAAFEAHwBEAAAAAAAvATsBDQAlAEQAAAEQAIABvABdACcASAAxABQCIAAxAD0CLQAxAF8C
OgAxAIQCRwAhAGADkAABALQDpgAGAAIB3AAGAA4B4AABAJ8F8QABAJ8F8QBRgC0GBQFRgD0GBQEB
AGMJBQEBAHQJBQEBAIEJBQEBAIkJBQEBAJcJZQEBAKAJaQEBALYJBQEBAMQJBQEBANEJBQEBAOgJ
bQEBAPIJcQEBAAEKBQEBAA0KBQEBABkKBQEBACUKBQEBADEKpgABAEEKpgABAFAKpgAGBtEKpgBW
gNkKZQFWgOAKZQFWgO0KZQFWgPoKZQFWgAELZQERACkLmAERAFILnAERAL8LugERAMcLvgEIIQAA
AAAGGMUBEwABABAhAAAAAAYYxQETAAEAGCEAAAAAERgAAhcAAQBEIQAAAAATCAcCGwABAFwhAAAA
ABMILQIoAAEAdCEAAAAAEwhWAjUAAQCMIQAAAAATCHQCQgABAKQhAAAAAEYCugJjAAEAwCEAAAAA
RgLDAmgAAgDUIQAAAACDANQCbAACAOwhAAAAAEYC3AJxAAIAACIAAAAAEQDlAngAAgAcIgAAAAAB
AAMDgAADADgiAAAAAAYYxQETAAQAQCIAAAAAAwgXA4sABAB0IgAAAAAGGMUBEwAEAIgiAAAAAAYY
xQGyAAQAuCIAAAAARgpoBLwACADMIgAAAAAGCH8EwQAIANgiAAAAAAYImgTGAAkA9CIAAAAABgC2
BBMACgAEIwAAAABGCs0EvAAKACQjAAAAAIYA5QTLAAoAPCMAAAAAhgDtBMsACgBUIwAAAAAGGMUB
EwAKAHQjAAAAAEYCXQXkAAoApCMAAAAARgNyBesADAC4IwAAAABGA4UF6wANALwjAAAAAAYYxQH1
AA4AzCMAAAAABggTBvsADwD4IwAAAAAGGMUB9QAPAAgkAAAAAAYYxQETABAAECQAAAAARgKFBesA
EAAAJwAAAABGAkoGEwARANQqAAAAAEYCVQYTABEAWCsAAAAABgBhBrwAEQAMLAAAAAAGAG8GFgER
ACQtAAAAAEYCgwYTABIApC8AAAAABgCYBhwBEgAIMQAAAAAGAKIGHAESAMQxAAAAAAYIrQZxABIA
3DEAAAAABgjABsEAEgAAMgAAAAAGCBMGcQATABgyAAAAAAYI2QbBABMAPDIAAAAABgjoBnEAFABU
MgAAAAAGCPIGwQAUAJAyAAAAAAYI/AYhARUAqDIAAAAABggHByYBFQDcMgAAAAAGCBIHcQAWAPQy
AAAAAAYIIgfBABYAADMAAAAABgiRBywBFwAYMwAAAAAGCKkHMQEXACQzAAAAAAYIwQdxABgAPDMA
AAAABgjWB8EAGABIMwAAAAAGCOsHcQAZAGAzAAAAAAYI/wfBABkAbDMAAAAABggTCHEAGgCEMwAA
AAAGCCcIwQAaAJAzAAAAAAEAOwhxABsAYDQAAAAAAQBhCDcBGwDcNAAAAAABAHYIPAEbABg1AAAA
AAEAyQhDARwAoDUAAAAAAQDzCEsBHgCANgAAAAABAA4JUgEfALA2AAAAAAEAJQnBACEA3DYAAAAA
AQA4CVkBIgCoNwAAAAABAE4JXwEjAPw3AAAAAAMYxQETACUABDgAAAAAFgheC6ABJQBAOAAAAAAW
CHILpQElAFQ4AAAAABYIfguqASUAXDgAAAAAERgAAhcAJgBwOAAAAAAGGMUBEwAmAHg4AAAAABYI
1AvBASYAAAABAMECAAABAPoCAAABAPoCAAABAEYEAAACAFAEAAADAFkEAAAEAGEEAAABAJQEAAAB
AJQEAAABAGoFAAACAGEEAAABAGEEAAABAJsFAAABAEYEAAABAEYEAAABAJsFAAABAHgGAAABANMG
AAABANMGAAABANMGAAABANMGAAABANMGAAABANMGAAABANMGAAABANMGAAABANMGAAABAJIIAAAB
ANkIAAACAOIIAAABAP4IAAABACAJAAACAOIIAAABADAJAAABAEcJAAABAFsJAAACANMGAAABAJQE
CQDFARMAwQDFAcsB0QDFAdoBEQDFARMA2QDFARMAJADFARMALADFARMANADFARMAPADFARMAJAAX
A4sALAAXA4sANAAXA4sAPAAXA4sA4QDFARMA6QDFARMA8QDFAcEA+QA0DW4CGQC6AmMAGQDDAmgA
KQBVDXsCGQDcAnEACQFxDYwCGQDFARMAEQHFAZwCRABgA5AATADUC4sATACbDRkDTADFARMAGQHF
AcYAOQDFAbIAQQDxDSwDIQEfDjIDKQFCDjgDMQFLDmgAOQBZDkQDOQBiDkoDQQHFAcEASQGRDkoD
SQHlBMsASQHtBMsAUQHFAcYAUQDFARMAIQHIDlYDWQFCDlwDYQFLDmgAIQEMD2MDaQFCDmkDcQFF
D/sAmQB7D3UDgQFCDnsDOQCKD4EDSQBCDoYDgQCgD4sDgQCrD2gASQC0D5ADSQDAD5gDgQCbDZ0D
mQDKD8EAmQDaD2gAkQH2D6IDkQEGEBcAmQAYEKkDeQEmEHEAQQBKBhMAkQB/EMMDmQHFARMAOQGN
EMgDOQGuEM0DmQHFAdcDYQHdEN4DyQH3EOQDqQEFEakDeQAREWgAYQFWEeoD0QF7EfADoQGJEXEA
mQGSEWMAmQHZCkQDqQGbEcsA2QGwERMAmQG4EWgAmQHCEfcDUQDcEfwD4QEDEgIEYQGKD2gAeQAV
EmgA6QEjEggEmQA5Eg4EOQFJEhMEgQBQEsEAgQFiEvcDmQFCDoYD8QHcAhkEgQByEnEAmQFiEvcD
OQFJEh4EmQGKEiUEOQGSEjAEOQFJEjcEQQBVBhMAmQATBnsEAQKwERMACQLFAcEAYQGsEssAyQG4
EWgAeQHFAcEAcQG7EsEAUQCDBhMAWQG4EWgA0QHbEsYAyQHmEhMA0QHmEhMAaQACE54EGQK4EWgA
GQJCDqQEEQJCDqsE8QELE7AE0QEVE/ADoQEbE8EA8QEkE7UEEQIuE7oEoQE1E78EoQFCE0oDoQFN
E0oDoQFbE0oDoQFlE0oDkQCWE+IEaQC1E+oEKQJCDvAEMQLME3EAGQL3EOQDmQHbExMAOQIFFPcE
mQGKEhwBUQIWFDAFOQEkFAUBmQBHFFMFWQJVFDcBKQCKFGoFeQCoFH8FgQC1FIQFeQDAFGgAgQDL
FEoDeQDUFGgAeQDiFGgAeQJNE4oFeQJbE4oFgQLFAcEAOQH+FJ4FIQEFFakFUQCdFbQFoQJCDroF
iQKzFakDkQLDFakDiQLaFcEFmQKzFakDWQDaFcEFQQAWFtkFsQIsFt8FqQJCDugFuQKbDZ0DqQJM
FhMAwQLFARMAyQLFAcEA0QLFAcEA2QLFARYG4QLFARMA6QLFAZ4G+QLFAaUGAQPFAcEACQPFAcEA
EQPFARMAGQPFAcEA+QLFAU0HGQPFAUoDIQPFAcEAKQCpF9MIqQDFAdkIuQDFARMAMQPPF/YIMQPV
F/YIOQPFARMAQQPFAUoDSQPFARMAUQPFAcEAWQPFAcEAYQPFAcEAaQPFAcEAcQPFAcEAeQPFAcEA
gQPFAcEAiQPFAcEADgAsAAgBDgAwAA0BCACAAH8BCACEAIQBCACIAIkBCACMAI4BCACQAJMBKQCD
AFACLgDzBcIJLgDrBYUJLgADBoUJLgDjBWUJLgDDBQkJLgD7BSYDLgDLBSgJLgC7BQAJLgDTBTUJ
LgDrACYDLgDbBSYDLgBLAV8JQAArAIQBQAATANEBQwATANEBQwAbAOABSQCDACgCYwATANEBYwAb
AOABaQCDAGECgAArAIQBgwAbAOABgwBzAIQBgwB7AIQBiQCDADwCoAArAIQBowATANEBowDDAKQC
wAArAIQBwwDrACYDwwATANEB4AArAIQB4wBLASYDAAETANEBAAErAIQBAwFLASYDIAETANEBIAEr
AIQBQAETANEBQAErAIQBYAErAIQBYAETANEBYwE7BYQBYwEzBRwGYwErBQMGYwFLASYDYwEbBYQB
YwEjBfUFaQFzBVMHaQFbBWwHaQFDBdEBaQFrBUAHaQFTBb0GgAErAIQBiQFDBdEBiQFbBbMIiQGD
BZ8IiQFTBb0GoAErAIQBqQFDBdEBqQFLBawGqQFTBb0GqQFbBc4GwAErAIQBwAETANEByQF7BdEB
yQFTBb0GyQFDBdEByQFbBYkH4AErAIQB6QFbBX4I6QFTBb0G6QFLBWwIAAITANEBAAIrAIQBCQJ7
BTEICQJbBUUICQJTBToIKQJjBYQBKQJbBf4GKQJTBe0GSQJTBe0GSQJjBYQBSQJbBa8HaQJjBYQB
aQJbBfAHaQJTBe0GiQITAO0IqQITAO0IyQKzBYQBoANLASYD4ANLASYDFAIZAh4CIwJzAncCgwKI
ApcClwIfAz8DTwNzAnMCcAOtAz8EgASFBI8ExQQCBR0FiAKIAogCNwWIAjwFiAKIAogCQQVcBXgF
jwWXBaQFcwLGBe8F4QjoCPsIBAABAAYABQAHAAYACQAKAAsACwANABQADgAWAAAA6QFPAAAAogJU
AAAAUQJZAAAArgJeAAAAagOYAAAA+QTPAAAADAXUAAAAHQXYAAAANQXPAAAAIgYAAQAAXwrUAAAA
IgbUAAAAbgrUAAAAdAp1AQAAewrUAAAAhwp6AQAAmwrUAAAArArUAAAAvArUAAAAGQuwAQAAigu1
AQAAlATGAQIABAADAAIABQAFAAIABgAHAAIABwAJAAIADwALAAIAEgANAAEAEwAPAAEAFAARAAIA
FgATAAIAHgAVAAIAKQAXAAEAKgAXAAIAKwAZAAEALAAZAAEALgAbAAIALQAbAAIALwAdAAEAMAAd
AAIAMQAfAAEAMgAfAAIAMwAhAAEANAAhAAEANgAjAAIANQAjAAIANwAlAAEAOAAlAAEAOgAnAAIA
OQAnAAIARQApAAIARgArAAEARwArAAIASgAtAHUAdQCIAPgB/wEGAg0CBgMNAy0EBIAAAAEAAAAA
AAAAAAAAAAAAvAAAAAIAAAAAAAAAAAAAAAEACgAAAAAACAAAAAAAAAAAAAAACgATAAAAAAABAAAA
AAAAAAAAAACdAHYDAAAAAAoAAAAAAAAAAAAAAKkAyAMAAAAACgAAAAAAAAAAAAAAqQAWBAAAAAAK
AAAAAAAAAAAAAACpAK8FAAAAAAoAAAAAAAAAAAAAAKkAMgcAAAAAAgAAAAAAAAAAAAAAAQBLCAAA
AAACAAAAAAAAAAAAAAABAPIBAAAAAAoAAAAAAAAAAAAAAKkADxUAAAAAAAAAAAEAAAD3FwAABQAE
AAYABAAMAAsAAAAQAAwA+AIAABAAGQD4AgAAAAAbAPgCLQCSAi0AFAMAAAA8TW9kdWxlPgBtc2Nv
cmxpYgBNaWNyb3NvZnQuVmlzdWFsQmFzaWMATXlBcHBsaWNhdGlvbgBTY3JpcHRDb21wb25lbnRf
MmUzZDRjNTZkMDY5NGY5YmJkMDMyZjFlMDk1MGJlYzEudmJwcm9qLk15AE15Q29tcHV0ZXIATXlQ
cm9qZWN0AE15V2ViU2VydmljZXMAVGhyZWFkU2FmZU9iamVjdFByb3ZpZGVyYDEASW5wdXRCdWZm
ZXIAU2NyaXB0Q29tcG9uZW50XzJlM2Q0YzU2ZDA2OTRmOWJiZDAzMmYxZTA5NTBiZWMxLnZicHJv
agBVc2VyQ29tcG9uZW50AENvbm5lY3Rpb25zAFZhcmlhYmxlcwBTY3JpcHRNYWluAEFjdGlvblR5
cGVzAE15UmVzb3VyY2VzAFNjcmlwdENvbXBvbmVudF8yZTNkNGM1NmQwNjk0ZjliYmQwMzJmMWUw
OTUwYmVjMS52YnByb2ouTXkuUmVzb3VyY2VzAE15U2V0dGluZ3MATWljcm9zb2Z0LlZpc3VhbEJh
c2ljLkFwcGxpY2F0aW9uU2VydmljZXMAQXBwbGljYXRpb25CYXNlAC5jdG9yAE1pY3Jvc29mdC5W
aXN1YWxCYXNpYy5EZXZpY2VzAENvbXB1dGVyAFN5c3RlbQBPYmplY3QALmNjdG9yAGdldF9Db21w
dXRlcgBtX0NvbXB1dGVyT2JqZWN0UHJvdmlkZXIAZ2V0X0FwcGxpY2F0aW9uAG1fQXBwT2JqZWN0
UHJvdmlkZXIAVXNlcgBnZXRfVXNlcgBtX1VzZXJPYmplY3RQcm92aWRlcgBnZXRfV2ViU2Vydmlj
ZXMAbV9NeVdlYlNlcnZpY2VzT2JqZWN0UHJvdmlkZXIAQXBwbGljYXRpb24AV2ViU2VydmljZXMA
RXF1YWxzAG8AR2V0SGFzaENvZGUAVHlwZQBHZXRUeXBlAFRvU3RyaW5nAENyZWF0ZV9fSW5zdGFu
Y2VfXwBUAGluc3RhbmNlAERpc3Bvc2VfX0luc3RhbmNlX18AZ2V0X0dldEluc3RhbmNlAE1pY3Jv
c29mdC5WaXN1YWxCYXNpYy5NeVNlcnZpY2VzLkludGVybmFsAENvbnRleHRWYWx1ZWAxAG1fQ29u
dGV4dABHZXRJbnN0YW5jZQBDb3p5Um9jLlNTSVNQbHVzLjIwMDgAQ296eVJvYy5TcWxTZXJ2ZXIu
U1NJUwBTY3JpcHRCdWZmZXJQbHVzAEVycm9yT3V0cHV0T3V0cHV0SUQATWljcm9zb2Z0LlNxbFNl
cnZlci5UeFNjcmlwdABNaWNyb3NvZnQuU3FsU2VydmVyLkR0cy5QaXBlbGluZQBTY3JpcHRDb21w
b25lbnQATWljcm9zb2Z0LlNxbFNlcnZlci5QaXBlbGluZUhvc3QAUGlwZWxpbmVCdWZmZXIAQ29t
cG9uZW50AE9iamVjdElEAElzSW5wdXQAQnVmZmVyAGdldF9TdGF0aWNJbnB1dENvbHVtbnMAc2V0
X0Vycm9yRGVzY3JpcHRpb24AVmFsdWUAc2V0X0Vycm9yRGVzY3JpcHRpb25fSXNOdWxsAERpcmVj
dFJvd1RvRXJyb3JPdXRwdXQAZ2V0X1N0YXRpY091dHB1dENvbHVtbnMATmV4dFJvdwBFbmRPZlJv
d3NldABTdGF0aWNJbnB1dENvbHVtbnMARXJyb3JEZXNjcmlwdGlvbgBFcnJvckRlc2NyaXB0aW9u
X0lzTnVsbABTdGF0aWNPdXRwdXRDb2x1bW5zAFNjcmlwdENvbXBvbmVudFBsdXMAUHJvY2Vzc0lu
cHV0AElucHV0SUQASW5wdXRfUHJvY2Vzc0lucHV0AElucHV0X1Byb2Nlc3NJbnB1dFJvdwBSb3cA
UGFyZW50Q29tcG9uZW50AE1pY3Jvc29mdC5TcWxTZXJ2ZXIuRFRTUnVudGltZVdyYXAATWljcm9z
b2Z0LlNxbFNlcnZlci5EdHMuUnVudGltZS5XcmFwcGVyAElEVFNDb25uZWN0aW9uTWFuYWdlcjEw
MABnZXRfQ29ubmVjdGlvbgBDb25uZWN0aW9uAENvbHVtblNlcGFyYXRvcgBQYXJhbWV0ZXJfMVAA
UHJlRXhlY3V0ZQBQb3N0RXhlY3V0ZQBHZXRQcm9wZXJ0aWVzAFZhbGlkYXRlAGVyck1lc3NhZ2UA
UmVpbml0aWFsaXplTWV0YURhdGEAR2V0VGFibGVzAEdldENvbHVtbnMAZ2V0X0Nvbm5lY3Rpb25U
eXBlAHNldF9Db25uZWN0aW9uVHlwZQB2YWx1ZQBzZXRfQ29ubmVjdGlvbgBnZXRfVGFibGUAc2V0
X1RhYmxlAGdldF9BY3Rpb24Ac2V0X0FjdGlvbgBnZXRfUHJpbWFyeUtleXMAc2V0X1ByaW1hcnlL
ZXlzAE1pY3Jvc29mdC5TcWxTZXJ2ZXIuRFRTUGlwZWxpbmVXcmFwAE1pY3Jvc29mdC5TcWxTZXJ2
ZXIuRHRzLlBpcGVsaW5lLldyYXBwZXIARFRTUm93RGlzcG9zaXRpb24AZ2V0X0Vycm9yUm93RGlz
cG9zaXRpb24Ac2V0X0Vycm9yUm93RGlzcG9zaXRpb24AZ2V0X0luc2VydGVkVmFyaWFibGUAc2V0
X0luc2VydGVkVmFyaWFibGUAZ2V0X1VwZGF0ZWRWYXJpYWJsZQBzZXRfVXBkYXRlZFZhcmlhYmxl
AGdldF9EZWxldGVkVmFyaWFibGUAc2V0X0RlbGV0ZWRWYXJpYWJsZQBHZXRQcmltYXJ5S2V5c18A
U3lzdGVtLkRhdGEARGF0YVRhYmxlAEdldENvbHVtbnNfAERhdGFUeXBlAERhdGFSZWNvcmRUeXBl
VG9CdWZmZXJUeXBlXwB0eXBlAElEVFNJbnB1dENvbHVtbjEwMABTeXN0ZW0uRGF0YS5Db21tb24A
RGJQYXJhbWV0ZXIAU2V0dXBQYXJhbWV0ZXJfAGlucHV0Q29sAHBhcmFtZXRlcgBEYlR5cGUAR2V0
RGJUeXBlXwBkdABEYkNvbm5lY3Rpb24AR2V0UGFyYW1ldGVyTmFtZV8AY29ubgBGaXJlRXJyb3Jf
AG1lc3NhZ2UAR2V0Q29ubmVjdGlvbl8AZGVzaWduAFNldFZhcmlhYmxlXwB2YXJOYW1lAG1fY29u
bmVjdGlvblR5cGUAbV9jb25uZWN0aW9uAG1fdGFibGUAbV9wcmltYXJ5S2V5cwBtX2FjdGlvbgBt
X2Vycm9yUm93RGlzcG9zaXRpb24AbV9pbnNlcnRlZFZhcgBtX3VwZGF0ZWRWYXIAbV9kZWxldGVk
VmFyAERiQ29tbWFuZABtX2NvbW1hbmQAbV9pbnB1dEluZGV4ZXMAbV9zZWxlY3RTcWwAbV9pbnNl
cnRTcWwAbV91cGRhdGVTcWwAbV9kZWxldGVTcWwAbV9pbnNlcnRlZENvdW50AG1fdXBkYXRlZENv
dW50AG1fZGVsZXRlZENvdW50AENvbm5lY3Rpb25UeXBlAFRhYmxlAEFjdGlvbgBQcmltYXJ5S2V5
cwBFcnJvclJvd0Rpc3Bvc2l0aW9uAEluc2VydGVkVmFyaWFibGUAVXBkYXRlZFZhcmlhYmxlAERl
bGV0ZWRWYXJpYWJsZQBFbnVtAHZhbHVlX18ASW5zZXJ0AEluc2VydFVwZGF0ZQBVcGRhdGVJbnNl
cnQAVXBkYXRlAERlbGV0ZQBTeXN0ZW0uUmVzb3VyY2VzAFJlc291cmNlTWFuYWdlcgBfcmVzTWdy
AFN5c3RlbS5HbG9iYWxpemF0aW9uAEN1bHR1cmVJbmZvAF9yZXNDdWx0dXJlAGdldF9SZXNvdXJj
ZU1hbmFnZXIAZ2V0X0N1bHR1cmUAc2V0X0N1bHR1cmUAQ3VsdHVyZQBTeXN0ZW0uQ29uZmlndXJh
dGlvbgBBcHBsaWNhdGlvblNldHRpbmdzQmFzZQBtX1ZhbHVlAG1fU3luY09iamVjdABnZXRfVmFs
dWUAU3lzdGVtLkNvbXBvbmVudE1vZGVsAEVkaXRvckJyb3dzYWJsZUF0dHJpYnV0ZQBFZGl0b3JC
cm93c2FibGVTdGF0ZQBTeXN0ZW0uQ29kZURvbS5Db21waWxlcgBHZW5lcmF0ZWRDb2RlQXR0cmli
dXRlAFN5c3RlbS5EaWFnbm9zdGljcwBEZWJ1Z2dlckhpZGRlbkF0dHJpYnV0ZQBNaWNyb3NvZnQu
VmlzdWFsQmFzaWMuQ29tcGlsZXJTZXJ2aWNlcwBTdGFuZGFyZE1vZHVsZUF0dHJpYnV0ZQBIaWRl
TW9kdWxlTmFtZUF0dHJpYnV0ZQBTeXN0ZW0uQ29tcG9uZW50TW9kZWwuRGVzaWduAEhlbHBLZXl3
b3JkQXR0cmlidXRlAFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXMAUnVudGltZUhlbHBl
cnMAR2V0T2JqZWN0VmFsdWUAUnVudGltZVR5cGVIYW5kbGUAR2V0VHlwZUZyb21IYW5kbGUAQWN0
aXZhdG9yAENyZWF0ZUluc3RhbmNlAE15R3JvdXBDb2xsZWN0aW9uQXR0cmlidXRlAHNldF9WYWx1
ZQBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXMAQ29tVmlzaWJsZUF0dHJpYnV0ZQBJRFRT
Q29tcG9uZW50TWV0YURhdGExMDAAZ2V0X0NvbXBvbmVudE1ldGFEYXRhAElEVFNPdXRwdXRDb2xs
ZWN0aW9uMTAwAGdldF9PdXRwdXRDb2xsZWN0aW9uAElEVFNPdXRwdXQxMDAAZ2V0X0l0ZW0AZ2V0
X0lEAFN0cmluZwBzZXRfSXRlbQBTZXROdWxsAEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24AU2Ny
aXB0QnVmZmVyAERpcmVjdFJvdwBDTFNDb21wbGlhbnRBdHRyaWJ1dGUASURUU0lucHV0Q29sbGVj
dGlvbjEwMABnZXRfSW5wdXRDb2xsZWN0aW9uAElEVFNJbnB1dDEwMABJRFRTUnVudGltZUNvbm5l
Y3Rpb25Db2xsZWN0aW9uMTAwAGdldF9SdW50aW1lQ29ubmVjdGlvbkNvbGxlY3Rpb24ASURUU1J1
bnRpbWVDb25uZWN0aW9uMTAwAGdldF9Db25uZWN0aW9uTWFuYWdlcgBFeGNlcHRpb24ARGJQYXJh
bWV0ZXJDb2xsZWN0aW9uAGdldF9QYXJhbWV0ZXJzAGdldF9CdWZmZXIAQmxvYkNvbHVtbgBnZXRf
RGJUeXBlAGdldF9TaXplAEdldEJsb2JEYXRhAEdldFN0cmluZwBzZXRfQ29tbWFuZFRleHQARXhl
Y3V0ZU5vblF1ZXJ5AFByb2plY3REYXRhAFNldFByb2plY3RFcnJvcgBDbGVhclByb2plY3RFcnJv
cgBFeGVjdXRlU2NhbGFyAGdldF9NZXNzYWdlAFN5c3RlbS5Db2xsZWN0aW9ucwBBcnJheUxpc3QA
SURUU0V4dGVybmFsTWV0YWRhdGFDb2x1bW4xMDAASUVudW1lcmF0b3IASW50MzIAQ3JlYXRlQ29t
bWFuZABJc051bGxPckVtcHR5AFN0cmluZ1NwbGl0T3B0aW9ucwBTcGxpdABJQ29sbGVjdGlvbgBJ
RFRTSW5wdXRDb2x1bW5Db2xsZWN0aW9uMTAwAGdldF9JbnB1dENvbHVtbkNvbGxlY3Rpb24AR2V0
RW51bWVyYXRvcgBnZXRfQ3VycmVudABnZXRfRXh0ZXJuYWxNZXRhZGF0YUNvbHVtbklEAElEVFNF
eHRlcm5hbE1ldGFkYXRhQ29sdW1uQ29sbGVjdGlvbjEwMABnZXRfRXh0ZXJuYWxNZXRhZGF0YUNv
bHVtbkNvbGxlY3Rpb24AR2V0T2JqZWN0QnlJRABnZXRfTmFtZQBDb250YWlucwBNb3ZlTmV4dABJ
RGlzcG9zYWJsZQBEaXNwb3NlAGdldF9Db3VudABJbmRleE9mAFBpcGVsaW5lQ29tcG9uZW50AGdl
dF9Ib3N0Q29tcG9uZW50AElEVFNCdWZmZXJNYW5hZ2VyMTAwAGdldF9CdWZmZXJNYW5hZ2VyAGdl
dF9MaW5lYWdlSUQARmluZENvbHVtbkJ5TGluZWFnZUlEAENyZWF0ZVBhcmFtZXRlcgBGb3JtYXQA
c2V0X1BhcmFtZXRlck5hbWUAQWRkAENvbnZlcnNpb25zAGdldF9QYXJhbWV0ZXJOYW1lAEFycmF5
AFRvQXJyYXkASm9pbgBBcHBsaWNhdGlvbkV4Y2VwdGlvbgBnZXRfSXNBdHRhY2hlZABzZXRfQ29u
bmVjdGlvbk1hbmFnZXJJRABEYXRhUm93AHNldF9Jc1VzZWQAUmVtb3ZlQWxsAERhdGFSb3dDb2xs
ZWN0aW9uAGdldF9Sb3dzAFRvQm9vbGVhbgBOZXdBdABzZXRfTmFtZQBUb0ludGVnZXIASXNOdWxs
AHNldF9EYXRhVHlwZQBzZXRfTGVuZ3RoAHNldF9QcmVjaXNpb24Ac2V0X1NjYWxlAHNldF9Db2Rl
UGFnZQBTeXN0ZW0uRGF0YS5TcWxDbGllbnQAU3FsQ29ubmVjdGlvbgBHZXRTY2hlbWEARGF0YUNv
bHVtbkNvbGxlY3Rpb24AZ2V0X0NvbHVtbnMARGF0YUNvbHVtbgBnZXRfQ29sdW1uTmFtZQBTb3J0
AEludGVyYWN0aW9uAE1zZ0JveFJlc3VsdABNc2dCb3hTdHlsZQBNc2dCb3gAT3BlcmF0b3JzAENv
bXBhcmVTdHJpbmcARW1wdHkARGJEYXRhUmVhZGVyAENvbW1hbmRCZWhhdmlvcgBFeGVjdXRlUmVh
ZGVyAEdldFNjaGVtYVRhYmxlAFN5c3RlbS5SZWZsZWN0aW9uAEJpbmRpbmdGbGFncwBCaW5kZXIA
SW52b2tlTWVtYmVyAElEYkRhdGFQYXJhbWV0ZXIAZ2V0X0RhdGFUeXBlAHNldF9EYlR5cGUAZ2V0
X0xlbmd0aABzZXRfU2l6ZQBnZXRfUHJlY2lzaW9uAGdldF9TY2FsZQBBcmd1bWVudEV4Y2VwdGlv
bgBDb25jYXQARmlyZUVycm9yAE1pY3Jvc29mdC5TcWxTZXJ2ZXIuTWFuYWdlZERUUwBNaWNyb3Nv
ZnQuU3FsU2VydmVyLkR0cy5SdW50aW1lAENvbm5lY3Rpb25NYW5hZ2VyAElEVFNDb25uZWN0aW9u
TWFuYWdlckRhdGFiYXNlUGFyYW1ldGVyczEwMABJRFRTT2JqZWN0SG9zdDEwMABnZXRfRGVzaWdu
Q29ubmVjdGlvbnMAZ2V0X0lubmVyT2JqZWN0AEdldENvbm5lY3Rpb25Gb3JTY2hlbWEAQWNxdWly
ZUNvbm5lY3Rpb24ASURUU1ZhcmlhYmxlczEwMABJRFRTVmFyaWFibGVEaXNwZW5zZXIxMDAAZ2V0
X1ZhcmlhYmxlRGlzcGVuc2VyAExvY2tPbmVGb3JXcml0ZQBJRFRTVmFyaWFibGUxMDAAVW5sb2Nr
AFNTSVNTY3JpcHRDb21wb25lbnRFbnRyeVBvaW50QXR0cmlidXRlAENvenlSb2MuU3FsU2VydmVy
LlNTSVMuQXR0cmlidXRlcwBWYWxpZGF0ZVByb3BlcnRpZXNBdHRyaWJ1dGUARmlsdGVyUHJvcGVy
dGllc0F0dHJpYnV0ZQBTb3J0UHJvcGVydGllc0F0dHJpYnV0ZQBDb2x1bW5NYXBwaW5nc0F0dHJp
YnV0ZQBSZWZyZXNoUHJvcGVydGllc0F0dHJpYnV0ZQBSZWZyZXNoUHJvcGVydGllcwBMaXN0QXR0
cmlidXRlAENhdGVnb3J5QXR0cmlidXRlAERlc2NyaXB0aW9uQXR0cmlidXRlAFZhcmlhYmxlQXR0
cmlidXRlAERlZmF1bHRWYWx1ZUF0dHJpYnV0ZQBDb25uZWN0aW9uQXR0cmlidXRlAEFzc2VtYmx5
AGdldF9Bc3NlbWJseQBTeXN0ZW0uVGhyZWFkaW5nAE1vbml0b3IARW50ZXIARXhpdABEZWJ1Z2dl
ck5vblVzZXJDb2RlQXR0cmlidXRlAFNjcmlwdENvbXBvbmVudF8yZTNkNGM1NmQwNjk0ZjliYmQw
MzJmMWUwOTUwYmVjMS52YnByb2ouUmVzb3VyY2VzLnJlc291cmNlcwBDb21waWxhdGlvblJlbGF4
YXRpb25zQXR0cmlidXRlAFJ1bnRpbWVDb21wYXRpYmlsaXR5QXR0cmlidXRlAEFzc2VtYmx5Rmls
ZVZlcnNpb25BdHRyaWJ1dGUAR3VpZEF0dHJpYnV0ZQBBc3NlbWJseVRyYWRlbWFya0F0dHJpYnV0
ZQBBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZQBBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGUAQXNz
ZW1ibHlDb21wYW55QXR0cmlidXRlAEFzc2VtYmx5RGVzY3JpcHRpb25BdHRyaWJ1dGUAQXNzZW1i
bHlUaXRsZUF0dHJpYnV0ZQBTY3JpcHRDb21wb25lbnRfMmUzZDRjNTZkMDY5NGY5YmJkMDMyZjFl
MDk1MGJlYzEudmJwcm9qLmRsbAAAGUUAcgByAG8AcgAgAE8AdQB0AHAAdQB0AACAm0kAcwBOAHUA
bABsACAAcAByAG8AcABlAHIAdAB5ACAAYwBhAG4AbgBvAHQAIABiAGUAIABzAGUAdAAgAHQAbwAg
AEYAYQBsAHMAZQAuACAAQQBzAHMAaQBnAG4AIABhACAAdgBhAGwAdQBlACAAdABvACAAdABoAGUA
IABjAG8AbAB1AG0AbgAgAGkAbgBzAHQAZQBhAGQALgAAIUUAcgByAG8AcgBEAGUAcwBjAHIAaQBw
AHQAaQBvAG4AAAtJAG4AcAB1AHQAABVDAG8AbgBuAGUAYwB0AGkAbwBuAAAFLAAKAAAJcAB7ADAA
fQAAE3sAMAB9ACAAPQAgAHsAMQB9AAALIABBAE4ARAAgAAA7UwBFAEwARQBDAFQAIAB7ADAAfQAg
AEYAUgBPAE0AIAB7ADEAfQAgAFcASABFAFIARQAgAHsAMgB9AAADLAAAQ0kATgBTAEUAUgBUACAA
SQBOAFQATwAgAHsAMAB9ACAAKAB7ADEAfQApACAAVgBBAEwAVQBFAFMAKAB7ADIAfQApAAA5VQBQ
AEQAQQBUAEUAIAB7ADAAfQAgAFMARQBUACAAewAxAH0AIABXAEgARQBSAEUAIAB7ADIAfQAAM0QA
RQBMAEUAVABFACAARgBSAE8ATQAgAHsAMAB9ACAAVwBIAEUAUgBFACAAewAxAH0AAB1DAG8AbgBu
AGUAYwB0AGkAbwBuAFQAeQBwAGUAAAtUAGEAYgBsAGUAAA1BAGMAdABpAG8AbgAAJ0UAcgByAG8A
cgBSAG8AdwBEAGkAcwBwAG8AcwBpAHQAaQBvAG4AACFJAG4AcwBlAHIAdABlAGQAVgBhAHIAaQBh
AGIAbABlAAAfVQBwAGQAYQB0AGUAZABWAGEAcgBpAGEAYgBsAGUAAB9EAGUAbABlAHQAZQBkAFYA
YQByAGkAYQBiAGwAZQAAF1AAcgBpAG0AYQByAHkASwBlAHkAcwAAJVMAZQBsAGUAYwB0ACAAYwBv
AG4AbgBlAGMAdABpAG8AbgAuAAAzUwBlAGwAZQBjAHQAIABkAGUAcwB0AGkAbgBhAHQAaQBvAG4A
IAB0AGEAYgBsAGUALgAAN1MAcABlAGMAaQBmAHkAIAB0AGEAYgBsAGUAIABwAHIAaQBtAGEAcgB5
ACAAawBlAHkAcwAuAAAlTQBhAHAAIABpAG4AcAB1AHQAIABjAG8AbAB1AG0AbgBzAC4AABVOAG8A
IABpAG4AcAB1AHQAcwAuAAAxQwBvAG4AbgBlAGMAdABpAG8AbgAgAG4AbwB0ACAAcwBlAGwAZQBj
AHQAZQBkAC4AAD9EAGUAcwB0AGkAbgBhAHQAaQBvAG4AIAB0AGEAYgBsAGUAIABuAG8AdAAgAHMA
ZQBsAGUAYwB0AGUAZAAuAAALSQBzAEsAZQB5AAAVQwBvAGwAdQBtAG4ATgBhAG0AZQAAEUQAYQB0
AGEAVAB5AHAAZQAADUkAcwBMAG8AbgBnAAAVQwBvAGwAdQBtAG4AUwBpAHoAZQAAIU4AdQBtAGUA
cgBpAGMAUAByAGUAYwBpAHMAaQBvAG4AABlOAHUAbQBlAHIAaQBjAFMAYwBhAGwAZQAAC1QAQQBC
AEwARQAAFUIAQQBTAEUAIABUAEEAQgBMAEUAAA1UAGEAYgBsAGUAcwAAFXQAYQBiAGwAZQBfAG4A
YQBtAGUAABdbAHsAMAB9AF0ALgBbAHsAMQB9AF0AACNTAEUATABFAEMAVAAgACoAIABGAFIATwBN
ACAAewAwAH0AADVEAGEAdABhAFIAZQBjAG8AcgBkAFQAeQBwAGUAVABvAEIAdQBmAGYAZQByAFQA
eQBwAGUAACdVAG4AaABhAG4AZABsAGUAZAAgAHQAeQBwAGUALgAgAHsAMAB9AAADQAAAAz8AADFU
AGEAYgBsAGUAIABVAHAAZABhAHQAZQAgAEQAZQBzAHQAaQBuAGEAdABpAG8AbgAAC08ATABFAEQA
QgAAMU0AeQAuAFIAZQBzAG8AdQByAGMAZQBzAC4ATQB5AFIAZQBzAG8AdQByAGMAZQBzAACI0KJW
GZAzQbzjEWEPsWNuAAi3elxWGTTgiQiwP19/EdUKOgMgAAEDAAABBAAAEgwHBhUSGAESDAQAABII
BwYVEhgBEggEAAASEQcGFRIYARIRBAAAEhQHBhUSGAESFAQIABIMBAgAEggECAASEQQIABIUBCAB
AhwDIAAIBCAAEhUDIAAOAh4ABxABAR4AHgAHMAEBARAeAAITAAQgABMABwYVEhkBEwAEKAATAAgW
z0kLuAw06gIGCAiJhF3NgIDMkQkgBAESIQgCEiUEIAAdDgQgAQEOBCABAQIDIAACBCgAHQ4DKAAO
AygAAgMGEiQDBhIoBiACAQgSJQUgAQESHAMGEiEFIAEBEiEEIAASLQQoABItAgYOBCwACgAIcAB7
ADAAfQAFIAECEA4EIAAdHAQgABEwBSABAREwBCAAETEFIAEBETEEIAASNQYgARE5EhUHIAIBEj0S
QQYgARFFETkGIAIOEkkOBSABEkkCBSACAQ4cAwYRMAMGETEDBhJNAwYdCAQoABEwBCgAETEEAAAA
AAQBAAAABAIAAAAEAwAAAAQEAAAAAwYSVQMGElkEAAASVQQAABJZBQABARJZBAgAElUECAASWQMG
EjgCBhwEAAASOAQIABI4BSABARFlCAEAAQAAAAAABSACAQ4OFwEACk15VGVtcGxhdGUHOC4wLjAu
MAAABhUSGAESDAYVEhgBEggGFRIYARIRBhUSGAESFAQHARIMBAcBEggEBwESEQQHARIUEwEADk15
LkFwcGxpY2F0aW9uAAATAQAOTXkuV2ViU2VydmljZXMAABABAAtNeS5Db21wdXRlcgAADAEAB015
LlVzZXIAAAQAARwcAwcBAgMHAQgHAAESFRGAgQQHARIVAwcBDgUQAQAeAAQKAR4ABAcBHgAHIAQB
Dg4ODmEBADRTeXN0ZW0uV2ViLlNlcnZpY2VzLlByb3RvY29scy5Tb2FwSHR0cENsaWVudFByb3Rv
Y29sEkNyZWF0ZV9fSW5zdGFuY2VfXxNEaXNwb3NlX19JbnN0YW5jZV9fAAAABhUSGAETAAYVEhkB
EwAECgETAAUgAQETAAYHAhMAEwAFAQAAAAAFIAASgJEFIAASgJUGIAESgJkcBAcBHQ4FIAIBCBwE
IAEBCAYHAh0OHQ4FIAASgK0GIAESgLEcBSAAEoC1BiABEoC5HAQHARItBSAAEoDBBSABEkEIBCAA
EiUEIAEcCAQgABFFByADHQUICAgEIAEOCAQgAQEcBgABARKAvQMgABwVBwwICAgSQRwSgL0cHBKA
vQgRMBExBCAAEk0EAAECDgkgAh0OHQ4RgN0GIAEBEoDhBSAAEoDlBSAAEoDVBSAAEoDpBiABEoDR
CAQgAQgcBSAAEoDxBSAAEoD1BSACCAgIBCAAEkEFAAIODhwEAAEOHAYAAw4OHBwHIAESgP0SFQId
DgYAAg4OHQ4HAAQODhwcHDsHHAgSgM0SSRKAsR0SQRKAzRKAzRKAzRKAzQ4SgM0SgNESPQ4SgNES
PRJBCAgIDg4OHQ4SgNUSgNUICAQgABJJBAcBEkkJBwMdDhKAzREwDgcGAgISgLEdDhKAvR0OBSAA
EoENBiABEoEJCAQgARwOBAABAhwEAAEIHAQgAQIOBSABARE5HAcPCBKAsRI1CAgSgNESgQkROQgI
EhUICBE5ETkHIAISNQ4dDgUgABKBFQYgARKBGQgKAAMRgSEcEYElHBoHDB0cEoDNEkkODhI1DhKB
CQ4SgL0dDhKA1RIHBh0cEoDNEjUSgQkSgL0SgNUGAAMIDg4CBAcBETAEBwERMREHBg4SgM0SNRKB
CRKAvRKA1QggARKBLRGBMQ0HBRI1EjUSSRJNEoEtDSAFHA4RgTUSgTkcHRwGBwIROR0cBCAAETkF
IAEBEUUEIAEBBQcHAxKBPQUFBgcCEUUROQUAAg4ODgQHAg4OCiAGAQgODg4IEAIFIAASgVEGIAES
gUUcBCABHBwSBwYSSRJJEoFFEoFJEoFNEoFJBSAAEoFZCCACAQ4QEoFVBiABEoFdHAUHARKBVQ0B
AAhWYWxpZGF0ZQAAEgEADUdldFByb3BlcnRpZXMAAAUgAQEdDoCAAQAJAAAADkNvbm5lY3Rpb25U
eXBlCkNvbm5lY3Rpb24FVGFibGUGQWN0aW9uC1ByaW1hcnlLZXlzE0Vycm9yUm93RGlzcG9zaXRp
b24QSW5zZXJ0ZWRWYXJpYWJsZQ9VcGRhdGVkVmFyaWFibGUPRGVsZXRlZFZhcmlhYmxlAAAGIAEB
EYF5BiADAQ4CAhABAAlHZXRUYWJsZXMAAQAAEAEAC0Rlc3RpbmF0aW9uAAAeAQAZU2VsZWN0IGRl
c3RpbmF0aW9uIHRhYmxlLgAAEAEAC0RpYWdub3N0aWNzAABBAQA8U2VsZWN0IHZhcmlhYmxlIHRv
IHN0b3JlIG51bWJlciBvZiByb3dzIGluc2VydGVkIChvcHRpb25hbCkuAAAMAQAHQURPLk5FVAAA
BSABAR0cGAEAAgAAAA4HQURPLk5FVA4FT0xFREIAABwBABdTZWxlY3QgY29ubmVjdGlvbiB0eXBl
LgAAJQEAIFNlbGVjdCBkZXN0aW5hdGlvbiB0YWJsZSBhY3Rpb24uAABAAQA7U2VsZWN0IHZhcmlh
YmxlIHRvIHN0b3JlIG51bWJlciBvZiByb3dzIHVwZGF0ZWQgKG9wdGlvbmFsKS4AAEABADtTZWxl
Y3QgdmFyaWFibGUgdG8gc3RvcmUgbnVtYmVyIG9mIHJvd3MgZGVsZXRlZCAob3B0aW9uYWwpLgAA
CAEABAAAAAAACgEABUVycm9yAAAmAQAhU3BlY2lmeSBob3cgdG8gaGFuZGxlIGVycm9yIHJvd3Mu
AAARAQAKR2V0Q29sdW1ucwEAAAAgAQAbU3BlY2lmeSB0YWJsZSBwcmltYXJ5IGtleXMuAAATAQAO
Q29ubmVjdGlvblR5cGUAAB8BABpTZWxlY3QgQ29ubmVjdGlvbiBNYW5hZ2VyLgAABSAAEoGVByAC
AQ4SgZUGBwISVRJVBAcBElkIAQACAAAAAAAEAAEBHAQHARI4CAEACAAAAAAAHgEAAQBUAhZXcmFw
Tm9uRXhjZXB0aW9uVGhyb3dzAQwBAAcxLjAuMC4wAAApAQAkOTQ4Yjg0ZWItYmUzMy00YmI3LWI1
OGUtYjgwYTcwOGI3M2MxAAAFAQABAAAfAQAaQ29weXJpZ2h0IEAgTWljcm9zb2Z0IDIwMTYAADwB
ADdTY3JpcHRDb21wb25lbnRfMmUzZDRjNTZkMDY5NGY5YmJkMDMyZjFlMDk1MGJlYzEudmJwcm9q
AAAOAQAJTWljcm9zb2Z0AAAAAABodgAAAAAAAAAAAAB+dgAAACAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAcHYAAAAAAAAAAF9Db3JEbGxNYWluAG1zY29yZWUuZGxsAAAAAAD/JQAgQAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAMAAAAoAACADgAAAEgAAIAQAAAAYAAAgAAAAAAA
AAAAAAAAAAAAAgACAAAAeAAAgAMAAACQAACAAAAAAAAAAAAAAAAAAAABAAB/AACoAACAAAAAAAAA
AAAAAAAAAAABAAEAAADAAACAAAAAAAAAAAAAAAAAAAABAAAAAADYAAAAAAAAAAAAAAAAAAAAAAAB
AAAAAADoAAAAAAAAAAAAAAAAAAAAAAABAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAABAAAAAAAIAQAA
gIUAAOgCAAAAAAAAAAAAAGiIAAAoAQAAAAAAAAAAAACQiQAAIgAAAAAAAAAAAAAAGIEAAGgEAAAA
AAAAAAAAAGgENAAAAFYAUwBfAFYARQBSAFMASQBPAE4AXwBJAE4ARgBPAAAAAAC9BO/+AAABAAAA
AQAAAAAAAAABAAAAAAA/AAAAAAAAAAQAAAACAAAAAAAAAAAAAAAAAAAARAAAAAEAVgBhAHIARgBp
AGwAZQBJAG4AZgBvAAAAAAAkAAQAAABUAHIAYQBuAHMAbABhAHQAaQBvAG4AAAAAAAAAsATIAwAA
AQBTAHQAcgBpAG4AZwBGAGkAbABlAEkAbgBmAG8AAACkAwAAAQAwADAAMAAwADAANABiADAAAAA0
AAoAAQBDAG8AbQBwAGEAbgB5AE4AYQBtAGUAAAAAAE0AaQBjAHIAbwBzAG8AZgB0AAAAmAA4AAEA
RgBpAGwAZQBEAGUAcwBjAHIAaQBwAHQAaQBvAG4AAAAAAFMAYwByAGkAcAB0AEMAbwBtAHAAbwBu
AGUAbgB0AF8AMgBlADMAZAA0AGMANQA2AGQAMAA2ADkANABmADkAYgBiAGQAMAAzADIAZgAxAGUA
MAA5ADUAMABiAGUAYwAxAC4AdgBiAHAAcgBvAGoAAAAwAAgAAQBGAGkAbABlAFYAZQByAHMAaQBv
AG4AAAAAADEALgAwAC4AMAAuADAAAACYADwAAQBJAG4AdABlAHIAbgBhAGwATgBhAG0AZQAAAFMA
YwByAGkAcAB0AEMAbwBtAHAAbwBuAGUAbgB0AF8AMgBlADMAZAA0AGMANQA2AGQAMAA2ADkANABm
ADkAYgBiAGQAMAAzADIAZgAxAGUAMAA5ADUAMABiAGUAYwAxAC4AdgBiAHAAcgBvAGoALgBkAGwA
bAAAAFwAGwABAEwAZQBnAGEAbABDAG8AcAB5AHIAaQBnAGgAdAAAAEMAbwBwAHkAcgBpAGcAaAB0
ACAAQAAgAE0AaQBjAHIAbwBzAG8AZgB0ACAAMgAwADEANgAAAAAAoAA8AAEATwByAGkAZwBpAG4A
YQBsAEYAaQBsAGUAbgBhAG0AZQAAAFMAYwByAGkAcAB0AEMAbwBtAHAAbwBuAGUAbgB0AF8AMgBl
ADMAZAA0AGMANQA2AGQAMAA2ADkANABmADkAYgBiAGQAMAAzADIAZgAxAGUAMAA5ADUAMABiAGUA
YwAxAC4AdgBiAHAAcgBvAGoALgBkAGwAbAAAAJAAOAABAFAAcgBvAGQAdQBjAHQATgBhAG0AZQAA
AAAAUwBjAHIAaQBwAHQAQwBvAG0AcABvAG4AZQBuAHQAXwAyAGUAMwBkADQAYwA1ADYAZAAwADYA
OQA0AGYAOQBiAGIAZAAwADMAMgBmADEAZQAwADkANQAwAGIAZQBjADEALgB2AGIAcAByAG8AagAA
ADQACAABAFAAcgBvAGQAdQBjAHQAVgBlAHIAcwBpAG8AbgAAADEALgAwAC4AMAAuADAAAAA4AAgA
AQBBAHMAcwBlAG0AYgBsAHkAIABWAGUAcgBzAGkAbwBuAAAAMQAuADAALgAwAC4AMAAAACgAAAAg
AAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAA
gACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3d3d3d3d3
d3d3d3d3d3AERERERERERERERERERERwBP/////////////////0cAT/////////////////9HAE
//////////////////RwBP/////////////////0cAT/////////////////9HAE////////////
//////RwBP/////////////////0cAT/////////////////9HAE//////////////////RwBP//
///////////////0cAT/////////////////9HAE//////////////////RwBP//////////////
///0cAT/////////////////9HAE//////////////////RwBP/////////////////0cAT/////
////////////9HAE//////////////////RwBIiIiIiIiIiIiIiIiIiEcARERERERERERERERERE
RHAETExMTExMTExMTs7OSXRwBMzMzMzMzMzMzMzMzMzEAABEREREREREREREREREQAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////
wAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGA
AAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAADwAAAB////////////////ygA
AAAQAAAAIAAAAAEABAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAA
AIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAHd3d3
d3d3d0RERERERERHT///////+EdP///////4R0////////hHT///////+EdP///////4R0//////
//hHT///////+EdP///////4R0iIiIiIiIhHTMzMzMzMzEfEREREREREwAAAAAAAAAAAAAAAAAAA
AAD//wAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEA
AP//AAD//wAAAAABAAIAICAQAAEABADoAgAAAgAQEBAAAQAEACgBAAADAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAABwAAAMAAAAkDYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA]]></arrayElement></arrayElements></property>
<property id="22" name="UserComponentTypeName" dataType="System.String" state="default" isArray="false" description="" typeConverter="" UITypeEditor="" containsID="false" expressionType="None">CozyRoc.SqlServer.SSIS.ScriptComponentHostPlus, CozyRoc.SSISPlus.2008, Version=1.0.0.0, Culture=neutral, PublicKeyToken=16cf490bb80c34ea</property>
<property id="1038" name="VSTAProjectName" dataType="System.String" state="default" isArray="false" description="Specifies the name of the Microsoft Visual Studio Tools for Applications project. Project names must be unique within a package." typeConverter="NOTBROWSABLE" UITypeEditor="" containsID="false" expressionType="None">ScriptComponent_2e3d4c56d0694f9bbd032f1e0950bec1</property>
<property id="1039" name="ScriptLanguage" dataType="System.String" state="default" isArray="false" description="Specifies the programming language used by the script." typeConverter="Microsoft.SqlServer.VSTAHosting.ScriptingLanguages, Microsoft.SqlServer.VSTAScriptingLib, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" UITypeEditor="" containsID="false" expressionType="None">VisualBasic</property></properties>
<connections>
<connection id="23" name="Connection" description="" connectionManagerID="{FFA3D2FB-9118-4BE8-B1A6-A061F9D22FC3}" /></connections>
<inputs>
<input id="24" name="Input" description="" hasSideEffects="true" dangling="false" errorOrTruncationOperation="" errorRowDisposition="NotUsed" truncationRowDisposition="NotUsed"><externalMetadataColumns isUsed="True">
<externalMetadataColumn id="1043" name="COL1" description="" precision="0" scale="0" length="0" dataType="i4" codePage="0" mappedColumnId="0" /></externalMetadataColumns></input>
</inputs>
<outputs>
<output id="34" name="Error Output" description="" exclusionGroup="1" synchronousInputId="24" deleteOutputOnPathDetached="false" hasSideEffects="false" dangling="false" isErrorOut="false" isSorted="false" errorOrTruncationOperation="" errorRowDisposition="NotUsed" truncationRowDisposition="NotUsed"><outputColumns>
<outputColumn id="35" name="ErrorDescription" description="" lineageId="35" precision="0" scale="0" length="250" dataType="wstr" codePage="0" sortKeyPosition="0" comparisonFlags="0" specialFlags="0" errorOrTruncationOperation="" errorRowDisposition="NotUsed" truncationRowDisposition="NotUsed" externalMetadataColumnId="0" mappedColumnId="0" /></outputColumns><externalMetadataColumns isUsed="False" /></output>
</outputs>
</component>