'----------------------------------------------------------------------
'
' Copyright (c) Microsoft Corporation. All rights reserved.
'
' Abstract:
' prnport.vbs - Port script for WMI on Windows 
'     used to add, delete and list ports
'     also for getting and setting the port configuration
'
' Usage:
' prnport [-adlgt?] [-r port] [-s server] [-u user name] [-w password]
'                   [-o raw|lpr] [-h host address] [-q queue] [-n number]
'                   [-me | -md ] [-i SNMP index] [-y community] [-2e | -2d]"
'
' Examples
' prnport -a -s server -r IP_1.2.3.4 -e 1.2.3.4 -o raw -n 9100
' prnport -d -s server -r c:\temp\foo.prn
' prnport -l -s server
' prnport -g -s server -r IP_1.2.3.4
' prnport -t -s server -r IP_1.2.3.4 -me -y public -i 1 -n 9100
'
'----------------------------------------------------------------------

option explicit

'
' Debugging trace flags, to enable debug output trace message
' change gDebugFlag to true.
'
dim   gDebugFlag
const kDebugTrace = 1
const kDebugError = 2

gDebugFlag = false

'
' Operation action values.
'
const kActionAdd          = 0
const kActionDelete       = 1
const kActionList         = 2
const kActionUnknown      = 3
const kActionGet          = 4
const kActionSet          = 5

const kErrorSuccess       = 0
const KErrorFailure       = 1

const kFlagCreateOrUpdate = 0

const kNameSpace          = "root\cimv2"


'
' Constants for the parameter dictionary
'
const kServerName      = 1
const kPortName        = 2
const kDoubleSpool     = 3
const kPortNumber      = 4
const kPortType        = 5
const kHostAddress     = 6
const kSNMPDeviceIndex = 7
const kCommunityName   = 8
const kSNMP            = 9
const kQueueName       = 10
const kUserName        = 11
const kPassword        = 12

'
' Generic strings
'
const L_Empty_Text                 = ""
const L_Space_Text                 = " "
const L_Colon_Text                 = ":"
const L_LPR_Queue                  = "LPR"
const L_Error_Text                 = "Error"
const L_Success_Text               = "Success"
const L_Failed_Text                = "Failed"
const L_Hex_Text                   = "0x"
const L_Printer_Text               = "Printer"
const L_Operation_Text             = "Operation"
const L_Provider_Text              = "Provider"
const L_Description_Text           = "Description"
const L_Debug_Text                 = "Debug:"

'
' General usage messages
'
const L_Help_Help_General01_Text   = "Usage: prnport [-adlgt?] [-r port][-s server][-u user name][-w password]"
const L_Help_Help_General02_Text   = "               [-o raw|lpr][-h host address][-q queue][-n number]"
const L_Help_Help_General03_Text   = "               [-me | -md ][-i SNMP index][-y community][-2e | -2d]"
const L_Help_Help_General04_Text   = "Arguments:"
const L_Help_Help_General05_Text   = "-a     - add a port"
const L_Help_Help_General06_Text   = "-d     - delete the specified port"
const L_Help_Help_General07_Text   = "-g     - get configuration for a TCP port"
const L_Help_Help_General08_Text   = "-h     - IP address of the device"
const L_Help_Help_General09_Text   = "-i     - SNMP index, if SNMP is enabled"
const L_Help_Help_General10_Text   = "-l     - list all TCP ports"
const L_Help_Help_General11_Text   = "-m     - SNMP type. [e] enable, [d] disable"
const L_Help_Help_General12_Text   = "-n     - port number, applies to TCP RAW ports"
const L_Help_Help_General13_Text   = "-o     - port type, raw or lpr"
const L_Help_Help_General14_Text   = "-q     - queue name, applies to TCP LPR ports only"
const L_Help_Help_General15_Text   = "-r     - port name"
const L_Help_Help_General16_Text   = "-s     - server name"
const L_Help_Help_General17_Text   = "-t     - set configuration for a TCP port"
const L_Help_Help_General18_Text   = "-u     - user name"
const L_Help_Help_General19_Text   = "-w     - password"
const L_Help_Help_General20_Text   = "-y     - community name, if SNMP is enabled"
const L_Help_Help_General21_Text   = "-2     - double spool, applies to TCP LPR ports. [e] enable, [d] disable"
const L_Help_Help_General22_Text   = "-?     - display command usage"
const L_Help_Help_General23_Text   = "Examples:"
const L_Help_Help_General24_Text   = "prnport -l -s server"
const L_Help_Help_General25_Text   = "prnport -d -s server -r IP_1.2.3.4"
const L_Help_Help_General26_Text   = "prnport -a -s server -r IP_1.2.3.4 -h 1.2.3.4 -o raw -n 9100"
const L_Help_Help_General27_Text   = "prnport -t -s server -r IP_1.2.3.4 -me -y public -i 1 -n 9100"
const L_Help_Help_General28_Text   = "prnport -g -s server -r IP_1.2.3.4"
const L_Help_Help_General29_Text   = "prnport -a -r IP_1.2.3.4 -h 1.2.3.4"
const L_Help_Help_General30_Text   = "Remark:"
const L_Help_Help_General31_Text   = "The last example will try to get the device settings at the specified IP address."
const L_Help_Help_General32_Text   = "If a device is detected, then a TCP port is added with the preferred settings for that device."

'
' Messages to be displayed if the scripting host is not cscript
'
const L_Help_Help_Host01_Text      = "This script should be executed from the Command Prompt using CScript.exe."
const L_Help_Help_Host02_Text      = "For example: CScript script.vbs arguments"
const L_Help_Help_Host03_Text      = ""
const L_Help_Help_Host04_Text      = "To set CScript as the default application to run .VBS files run the following:"
const L_Help_Help_Host05_Text      = "     CScript //H:CScript //S"
const L_Help_Help_Host06_Text      = "You can then run ""script.vbs arguments"" without preceding the script with CScript."

'
' General error messages
'
const L_Text_Error_General01_Text  = "The scripting host could not be determined."
const L_Text_Error_General02_Text  = "Unable to parse command line."
const L_Text_Error_General03_Text  = "Win32 error code"

'
' Miscellaneous messages
'
const L_Text_Msg_General01_Text    = "Added port"
const L_Text_Msg_General02_Text    = "Unable to delete port"
const L_Text_Msg_General03_Text    = "Unable to get port"
const L_Text_Msg_General04_Text    = "Created/updated port"
const L_Text_Msg_General05_Text    = "Unable to create/update port"
const L_Text_Msg_General06_Text    = "Unable to enumerate ports"
const L_Text_Msg_General07_Text    = "Number of ports enumerated"
const L_Text_Msg_General08_Text    = "Deleted port"
const L_Text_Msg_General09_Text    = "Unable to get SWbemLocator object"
const L_Text_Msg_General10_Text    = "Unable to connect to WMI service"


'
' Port properties
'
const L_Text_Msg_Port01_Text       = "Server name"
const L_Text_Msg_Port02_Text       = "Port name"
const L_Text_Msg_Port03_Text       = "Host address"
const L_Text_Msg_Port04_Text       = "Protocol RAW"
const L_Text_Msg_Port05_Text       = "Protocol LPR"
const L_Text_Msg_Port06_Text       = "Port number"
const L_Text_Msg_Port07_Text       = "Queue"
const L_Text_Msg_Port08_Text       = "Byte Count Enabled"
const L_Text_Msg_Port09_Text       = "Byte Count Disabled"
const L_Text_Msg_Port10_Text       = "SNMP Enabled"
const L_Text_Msg_Port11_Text       = "SNMP Disabled"
const L_Text_Msg_Port12_Text       = "Community"
const L_Text_Msg_Port13_Text       = "Device index"

'
' Debug messages
'
const L_Text_Dbg_Msg01_Text        = "In function DelPort"
const L_Text_Dbg_Msg02_Text        = "In function CreateOrSetPort"
const L_Text_Dbg_Msg03_Text        = "In function ListPorts"
const L_Text_Dbg_Msg04_Text        = "In function GetPort"
const L_Text_Dbg_Msg05_Text        = "In function ParseCommandLine"

main

'
' Main execution starts here
'
sub main

    on error resume next

    dim iAction
    dim iRetval
    dim oParamDict

    '
    ' Abort if the host is not cscript
    '
    if not IsHostCscript() then

        call wscript.echo(L_Help_Help_Host01_Text & vbCRLF & L_Help_Help_Host02_Text & vbCRLF & _
                          L_Help_Help_Host03_Text & vbCRLF & L_Help_Help_Host04_Text & vbCRLF & _
                          L_Help_Help_Host05_Text & vbCRLF & L_Help_Help_Host06_Text & vbCRLF)

        wscript.quit

    end if

    set oParamDict = CreateObject("Scripting.Dictionary")

    iRetval = ParseCommandLine(iAction, oParamDict)

    if iRetval = 0 then

        select case iAction

            case kActionAdd
                iRetval = CreateOrSetPort(oParamDict)

            case kActionDelete
                iRetval = DelPort(oParamDict)

            case kActionList
                iRetval = ListPorts(oParamDict)

            case kActionGet
                iRetVal = GetPort(oParamDict)

            case kActionSet
                iRetVal = CreateOrSetPort(oParamDict)

            case else
                Usage(true)
                exit sub

        end select

    end if

end sub

'
' Delete a port
'
function DelPort(oParamDict)

    on error resume next

    DebugPrint kDebugTrace, L_Text_Dbg_Msg01_Text
    DebugPrint kDebugTrace, L_Text_Msg_Port01_Text & L_Space_Text & oParamDict(kServerName)
    DebugPrint kDebugTrace, L_Text_Msg_Port02_Text & L_Space_Text & oParamDict(kPortName)

    dim oService
    dim oPort
    dim iResult
    dim strServer
    dim strPort
    dim strUser
    dim strPassword

    iResult = kErrorFailure

    strServer   = oParamDict(kServerName)
    strPort     = oParamDict(kPortName)
    strUser     = oParamDict(kUserName)
    strPassword = oParamDict(kPassword)

    if WmiConnect(strServer, kNameSpace, strUser, strPassword, oService) then

        set oPort = oService.Get("Win32_TCPIPPrinterPort='" & strPort & "'")

    else

        DelPort = kErrorFailure

        exit function

    end if

    '
    ' Check if Get succeeded
    '
    if Err.Number = kErrorSuccess then

        '
        ' Try deleting the instance
        '
        oPort.Delete_

        if Err.Number = kErrorSuccess then

            wscript.echo L_Text_Msg_General08_Text & L_Space_Text & strPort

        else

            wscript.echo L_Text_Msg_General02_Text & L_Space_Text & L_Error_Text & L_Space_Text _
                         & L_Hex_Text & hex(Err.Number) & L_Space_Text & Err.Description

            '
            ' Try getting extended error information
            '
            call LastError()

        end if

    else

        wscript.echo L_Text_Msg_General02_Text & L_Space_Text & L_Error_Text & L_Space_Text _
                     & L_Hex_Text & hex(Err.Number) & L_Space_Text & Err.Description

        '
        ' Try getting extended error information
        '
        call LastError()

    end if

    DelPort = iResult

end function

'
' Add or update a port
'
function CreateOrSetPort(oParamDict)

    on error resume next

    dim oPort
    dim oService
    dim iResult
    dim PortType
    dim strServer
    dim strPort
    dim strUser
    dim strPassword

    DebugPrint kDebugTrace, L_Text_Dbg_Msg02_Text
    DebugPrint kDebugTrace, L_Text_Msg_Port01_Text & L_Space_Text & oParamDict.Item(kServerName)
    DebugPrint kDebugTrace, L_Text_Msg_Port02_Text & L_Space_Text & oParamDict.Item(kPortName)
    DebugPrint kDebugTrace, L_Text_Msg_Port06_Text & L_Space_Text & oParamDict.Item(kPortNumber)
    DebugPrint kDebugTrace, L_Text_Msg_Port07_Text & L_Space_Text & oParamDict.Item(kQueueName)
    DebugPrint kDebugTrace, L_Text_Msg_Port13_Text & L_Space_Text & oParamDict.Item(kSNMPDeviceIndex)
    DebugPrint kDebugTrace, L_Text_Msg_Port12_Text & L_Space_Text & oParamDict.Item(kCommunityName)
    DebugPrint kDebugTrace, L_Text_Msg_Port03_Text & L_Space_Text & oParamDict.Item(kHostAddress)

    strServer   = oParamDict(kServerName)
    strPort     = oParamDict(kPortName)
    strUser     = oParamDict(kUserName)
    strPassword = oParamDict(kPassword)

    '
    ' If the port exists, then get the settings. Later PutInstance will do an update
    '
    if WmiConnect(strServer, kNameSpace, strUser, strPassword, oService) then

        set oPort = oService.Get("Win32_TCPIPPrinterPort.Name='" & strPort & "'")

        '
        ' If get was unsuccessful then spawn a new port instance. Later PutInstance will do a create
        '
        if Err.Number <> kErrorSuccess then

            '
            ' Clear the previous error
            '
            Err.Clear

            set oPort = oService.Get("Win32_TCPIPPrinterPort").SpawnInstance_

        end if

    else

        CreateOrSetPort = kErrorFailure

        exit function

    end if

    if Err.Number <> kErrorSuccess then

        wscript.echo L_Text_Msg_General03_Text & L_Space_Text & L_Error_Text & L_Space_Text _
                     & L_Hex_Text & hex(Err.Number) & L_Space_Text & Err.Description

        CreateOrSetPort = kErrorFailure

        exit function

    end if

    oPort.Name          = oParamDict.Item(kPortName)
    oPort.HostAddress   = oParamDict.Item(kHostAddress)
    oPort.PortNumber    = oParamDict.Item(kPortNumber)
    oPort.SNMPEnabled   = oParamDict.Item(kSNMP)
    oPort.SNMPDevIndex  = oParamDict.Item(kSNMPDeviceIndex)
    oPort.SNMPCommunity = oParamDict.Item(kCommunityName)
    oPort.Queue         = oParamDict.Item(kQueueName)
    oPort.ByteCount     = oParamDict.Item(kDoubleSpool)

    PortType     = oParamDict.Item(kPortType)

    '
    ' Update the port object with the settings corresponding
    ' to the port type of the port to be added
    '
    select case lcase(PortType)

            case "raw"

                 oPort.Protocol      = 1

                 if Not IsNull(oPort.Queue) then

                     wscript.echo L_Error_Text & L_Colon_Text & L_Space_Text _
                     & L_Help_Help_General14_Text

                     CreateOrSetPort = kErrorFailure

                     exit function

                 end if

            case "lpr"

                 oPort.Protocol      = 2

                 if IsNull(oPort.Queue) then

                     oPort.Queue = L_LPR_Queue

                 end if

            case else

                 '
                 ' PutInstance will attempt to get the configuration of
                 ' the device based on its IP address. Those settings
                 ' will be used to add a new port
                 '
    end select

    '
    ' Try creating or updating the port
    '
    oPort.Put_(kFlagCreateOrUpdate)

    if Err.Number = kErrorSuccess then

        wscript.echo L_Text_Msg_General04_Text & L_Space_Text & oPort.Name

        iResult = kErrorSuccess

    else

        wscript.echo L_Text_Msg_General05_Text & L_Space_Text & oPort.Name & L_Space_Text _
                     & L_Error_Text & L_Space_Text & L_Hex_Text & hex(Err.Number) _
                     & L_Space_Text & Err.Description

        '
        ' Try getting extended error information
        '
        call LastError()

        iResult = kErrorFailure

    end if

    CreateOrSetPort = iResult

end function

'
' List ports on a machine.
'
function ListPorts(oParamDict)

    on error resume next

    DebugPrint kDebugTrace, L_Text_Dbg_Msg03_Text

    dim Ports
    dim oPort
    dim oService
    dim iRetval
    dim iTotal
    dim strServer
    dim strUser
    dim strPassword

    iResult = kErrorFailure

    strServer   = oParamDict(kServerName)
    strUser     = oParamDict(kUserName)
    strPassword = oParamDict(kPassword)

    if WmiConnect(strServer, kNameSpace, strUser, strPassword, oService) then

        set Ports = oService.InstancesOf("Win32_TCPIPPrinterPort")

    else

        ListPorts = kErrorFailure

        exit function

    end if

    if Err.Number <> kErrorSuccess then

        wscript.echo L_Text_Msg_General06_Text & L_Space_Text & L_Error_Text & L_Space_Text _
                     & L_Hex_Text & hex(Err.Number) & L_Space_Text & Err.Description

        ListPrinters = kErrorFailure

        exit function

    end if

    iTotal = 0

    for each oPort in Ports

        iTotal = iTotal + 1

        wscript.echo L_Empty_Text
        wscript.echo L_Text_Msg_Port01_Text & L_Space_Text & strServer
        wscript.echo L_Text_Msg_Port02_Text & L_Space_Text & oPort.Name
        wscript.echo L_Text_Msg_Port03_Text & L_Space_Text & oPort.HostAddress

        if oPort.Protocol = 1 then

            wscript.echo L_Text_Msg_Port04_Text
            wscript.echo L_Text_Msg_Port06_Text & L_Space_Text & oPort.PortNumber

        else

            wscript.echo L_Text_Msg_Port05_Text
            wscript.echo L_Text_Msg_Port07_Text & L_Space_Text & oPort.Queue

            if oPort.ByteCount then

                wscript.echo L_Text_Msg_Port08_Text

            else

                wscript.echo L_Text_Msg_Port09_Text

            end if

        end if

        if oPort.SNMPEnabled then

            wscript.echo L_Text_Msg_Port10_Text
            wscript.echo L_Text_Msg_Port12_Text & L_Space_Text & oPort.SNMPCommunity
            wscript.echo L_Text_Msg_Port13_Text & L_Space_Text & oPort.SNMPDevIndex

        else

            wscript.echo L_Text_Msg_Port11_Text

        end if

        Err.Clear

    next

    wscript.echo L_Empty_Text
    wscript.echo L_Text_Msg_General07_Text & L_Space_Text & iTotal

    ListPorts = kErrorSuccess

end function

'
' Gets the configuration of a port
'
function GetPort(oParamDict)

    on error resume next

    DebugPrint kDebugTrace, L_Text_Dbg_Msg04_Text
    DebugPrint kDebugTrace, L_Text_Msg_Port01_Text & L_Space_Text & oParamDict(kServerName)
    DebugPrint kDebugTrace, L_Text_Msg_Port02_Text & L_Space_Text & oParamDict(kPortName)

    dim oService
    dim oPort
    dim iResult
    dim strServer
    dim strPort
    dim strUser
    dim strPassword

    iResult = kErrorFailure

    strServer   = oParamDict(kServerName)
    strPort     = oParamDict(kPortName)
    strUser     = oParamDict(kUserName)
    strPassword = oParamDict(kPassword)

    if WmiConnect(strServer, kNameSpace, strUser, strPassword, oService) then

        set oPort = oService.Get("Win32_TCPIPPrinterPort.Name='" & strPort & "'")

    else

        GetPort = kErrorFailure

        exit function

    end if

    if Err.Number = kErrorSuccess then

        wscript.echo L_Empty_Text
        wscript.echo L_Text_Msg_Port01_Text & L_Space_Text & strServer
        wscript.echo L_Text_Msg_Port02_Text & L_Space_Text & oPort.Name
        wscript.echo L_Text_Msg_Port03_Text & L_Space_Text & oPort.HostAddress

        if oPort.Protocol = 1 then

            wscript.echo L_Text_Msg_Port04_Text
            wscript.echo L_Text_Msg_Port06_Text & L_Space_Text & oPort.PortNumber

        else

            wscript.echo L_Text_Msg_Port05_Text
            wscript.echo L_Text_Msg_Port07_Text & L_Space_Text & oPort.Queue

            if oPort.ByteCount then

                wscript.echo L_Text_Msg_Port08_Text

            else

                wscript.echo L_Text_Msg_Port09_Text

            end if

        end if

        if oPort.SNMPEnabled then

            wscript.echo L_Text_Msg_Port10_Text
            wscript.echo L_Text_Msg_Port12_Text & L_Space_Text & oPort.SNMPCommunity
            wscript.echo L_Text_Msg_Port13_Text & L_Space_Text & oPort.SNMPDevIndex

        else

            wscript.echo L_Text_Msg_Port11_Text

        end if

        iResult = kErrorSuccess

    else

        wscript.echo L_Text_Msg_General03_Text & L_Space_Text & L_Error_Text & L_Space_Text _
                     & L_Hex_Text & hex(Err.Number) & L_Space_Text & Err.Description

        '
        ' Try getting extended error information
        '
        call LastError()

    end if

    GetPort = iResult

end function

'
' Debug display helper function
'
sub DebugPrint(uFlags, strString)

    if gDebugFlag = true then

        if uFlags = kDebugTrace then

            wscript.echo L_Debug_Text & L_Space_Text & strString

        end if

        if uFlags = kDebugError then

            if Err <> 0 then

                wscript.echo L_Debug_Text & L_Space_Text & strString & L_Space_Text _
                             & L_Error_Text & L_Space_Text & L_Hex_Text & hex(Err.Number) _
                             & L_Space_Text & Err.Description

            end if

        end if

    end if

end sub

'
' Parse the command line into its components
'
function ParseCommandLine(iAction, oParamDict)

    on error resume next

    DebugPrint kDebugTrace, L_Text_Dbg_Msg05_Text

    dim oArgs
    dim iIndex

    iAction = kActionUnknown

    set oArgs = Wscript.Arguments

    while iIndex < oArgs.Count

        select case oArgs(iIndex)

            case "-g"
                iAction = kActionGet

            case "-t"
                iAction = kActionSet

            case "-a"
                iAction = kActionAdd

            case "-d"
                iAction = kActionDelete

            case "-l"
                iAction = kActionList

            case "-2e"
                oParamDict.Add kDoubleSpool, true

            case "-2d"
                oParamDict.Add kDoubleSpool, false

            case "-s"
                iIndex = iIndex + 1
                oParamDict.Add kServerName, RemoveBackslashes(oArgs(iIndex))

            case "-u"
                iIndex = iIndex + 1
                oParamDict.Add kUserName, oArgs(iIndex)

            case "-w"
                iIndex = iIndex + 1
                oParamDict.Add kPassword, oArgs(iIndex)

            case "-n"
                iIndex = iIndex + 1
                oParamDict.Add kPortNumber, oArgs(iIndex)

            case "-r"
                iIndex = iIndex + 1
                oParamDict.Add kPortName, oArgs(iIndex)

            case "-o"
                iIndex = iIndex + 1
                oParamDict.Add kPortType, oArgs(iIndex)

            case "-h"
                iIndex = iIndex + 1
                oParamDict.Add kHostAddress, oArgs(iIndex)

            case "-q"
                iIndex = iIndex + 1
                oParamDict.Add kQueueName, oArgs(iIndex)

            case "-i"
                iIndex = iIndex + 1
                oParamDict.Add kSNMPDeviceIndex, oArgs(iIndex)

            case "-y"
                iIndex = iIndex + 1
                oParamDict.Add kCommunityName, oArgs(iIndex)

            case "-me"
                oParamDict.Add kSNMP, true

            case "-md"
                oParamDict.Add kSNMP, false

            case "-?"
                Usage(True)
                exit function

            case else
                Usage(True)
                exit function

        end select

        iIndex = iIndex + 1

    wend

    if Err = kErrorSuccess then

        ParseCommandLine = kErrorSuccess

    else

        wscript.echo L_Text_Error_General02_Text & L_Space_Text & L_Error_Text & L_Space_Text _
                     & L_Hex_Text & hex(Err.Number) & L_Space_text & Err.Description


        ParseCommandLine = kErrorFailure

    end if

end  function

'
' Display command usage.
'
sub Usage(bExit)

    wscript.echo L_Help_Help_General01_Text
    wscript.echo L_Help_Help_General02_Text
    wscript.echo L_Help_Help_General03_Text
    wscript.echo L_Help_Help_General04_Text
    wscript.echo L_Help_Help_General05_Text
    wscript.echo L_Help_Help_General06_Text
    wscript.echo L_Help_Help_General07_Text
    wscript.echo L_Help_Help_General08_Text
    wscript.echo L_Help_Help_General09_Text
    wscript.echo L_Help_Help_General10_Text
    wscript.echo L_Help_Help_General11_Text
    wscript.echo L_Help_Help_General12_Text
    wscript.echo L_Help_Help_General13_Text
    wscript.echo L_Help_Help_General14_Text
    wscript.echo L_Help_Help_General15_Text
    wscript.echo L_Help_Help_General16_Text
    wscript.echo L_Help_Help_General17_Text
    wscript.echo L_Help_Help_General18_Text
    wscript.echo L_Help_Help_General19_Text
    wscript.echo L_Help_Help_General20_Text
    wscript.echo L_Help_Help_General21_Text
    wscript.echo L_Help_Help_General22_Text
    wscript.echo L_Empty_Text
    wscript.echo L_Help_Help_General23_Text
    wscript.echo L_Help_Help_General24_Text
    wscript.echo L_Help_Help_General25_Text
    wscript.echo L_Help_Help_General26_Text
    wscript.echo L_Help_Help_General27_Text
    wscript.echo L_Help_Help_General28_Text
    wscript.echo L_Help_Help_General29_Text
    wscript.echo L_Empty_Text
    wscript.echo L_Help_Help_General30_Text
    wscript.echo L_Help_Help_General31_Text
    wscript.echo L_Help_Help_General32_Text

    if bExit then

        wscript.quit(1)

    end if

end sub

'
' Determines which program is being used to run this script.
' Returns true if the script host is cscript.exe
'
function IsHostCscript()

    on error resume next

    dim strFullName
    dim strCommand
    dim i, j
    dim bReturn

    bReturn = false

    strFullName = WScript.FullName

    i = InStr(1, strFullName, ".exe", 1)

    if i <> 0 then

        j = InStrRev(strFullName, "\", i, 1)

        if j <> 0 then

            strCommand = Mid(strFullName, j+1, i-j-1)

            if LCase(strCommand) = "cscript" then

                bReturn = true

            end if

        end if

    end if

    if Err <> 0 then

        wscript.echo L_Text_Error_General01_Text & L_Space_Text & L_Error_Text & L_Space_Text _
                     & L_Hex_Text & hex(Err.Number) & L_Space_Text & Err.Description

    end if

    IsHostCscript = bReturn

end function

'
' Retrieves extended information about the last error that occurred
' during a WBEM operation. The methods that set an SWbemLastError
' object are GetObject, PutInstance, DeleteInstance
'
sub LastError()

    on error resume next

    dim oError

    set oError = CreateObject("WbemScripting.SWbemLastError")

    if Err = kErrorSuccess then

        wscript.echo L_Operation_Text            & L_Space_Text & oError.Operation
        wscript.echo L_Provider_Text             & L_Space_Text & oError.ProviderName
        wscript.echo L_Description_Text          & L_Space_Text & oError.Description
        wscript.echo L_Text_Error_General04_Text & L_Space_Text & oError.StatusCode

    end if

end sub

'
' Connects to the WMI service on a server. oService is returned as a service
' object (SWbemServices)
'
function WmiConnect(strServer, strNameSpace, strUser, strPassword, oService)

   on error resume next

   dim oLocator
   dim bResult

   oService = null

   bResult  = false

   set oLocator = CreateObject("WbemScripting.SWbemLocator")

   if Err = kErrorSuccess then

      set oService = oLocator.ConnectServer(strServer, strNameSpace, strUser, strPassword)

      if Err = kErrorSuccess then

          bResult = true

          oService.Security_.impersonationlevel = 3

          '
          ' Required to perform administrative tasks on the spooler service
          '
          oService.Security_.Privileges.AddAsString "SeLoadDriverPrivilege"

          Err.Clear

      else

          wscript.echo L_Text_Msg_General10_Text & L_Space_Text & L_Error_Text _
                       & L_Space_Text & L_Hex_Text & hex(Err.Number) & L_Space_Text _
                       & Err.Description

      end if

   else

       wscript.echo L_Text_Msg_General09_Text & L_Space_Text & L_Error_Text _
                    & L_Space_Text & L_Hex_Text & hex(Err.Number) & L_Space_Text _
                    & Err.Description

   end if

   WmiConnect = bResult

end function

'
' Remove leading "\\" from server name
'
function RemoveBackslashes(strServer)

    dim strRet

    strRet = strServer

    if Left(strServer, 2) = "\\" and Len(strServer) > 2 then

        strRet = Mid(strServer, 3)

    end if

    RemoveBackslashes = strRet

end function

'' SIG '' Begin signature block
'' SIG '' MIIl9wYJKoZIhvcNAQcCoIIl6DCCJeQCAQExDzANBglg
'' SIG '' hkgBZQMEAgEFADB3BgorBgEEAYI3AgEEoGkwZzAyBgor
'' SIG '' BgEEAYI3AgEeMCQCAQEEEE7wKRaZJ7VNj+Ws4Q8X66sC
'' SIG '' AQACAQACAQACAQACAQAwMTANBglghkgBZQMEAgEFAAQg
'' SIG '' JP2OI/dGh8Dr4i1IHJc1kEljUqgI55azox+O936+ZZqg
'' SIG '' ggrZMIIE+jCCA+KgAwIBAgITMwAABRna3aqL3ESykgAA
'' SIG '' AAAFGTANBgkqhkiG9w0BAQsFADCBhDELMAkGA1UEBhMC
'' SIG '' VVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcT
'' SIG '' B1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
'' SIG '' b3JhdGlvbjEuMCwGA1UEAxMlTWljcm9zb2Z0IFdpbmRv
'' SIG '' d3MgUHJvZHVjdGlvbiBQQ0EgMjAxMTAeFw0yNTA2MTkx
'' SIG '' ODExNDRaFw0yNjA2MTcxODExNDRaMHAxCzAJBgNVBAYT
'' SIG '' AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQH
'' SIG '' EwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y
'' SIG '' cG9yYXRpb24xGjAYBgNVBAMTEU1pY3Jvc29mdCBXaW5k
'' SIG '' b3dzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
'' SIG '' AQEAmQzKu3Q5hilDQNu4AEil9OMAlaGFhl4n/mJEo12w
'' SIG '' whow2MIDDc/LZHu0mhBRwMPkbBxS7tJLlyT5QlIvja1O
'' SIG '' hQtZsxq9AsLQwmp24rktGEUodI5OOhNMony4JVDjPMJT
'' SIG '' u7uOmgR2rXnpVtyHhlaLbxmHdJAutU4a1JpDaObKW23X
'' SIG '' 9oBTx6HFYS5sj025J2hHFnZQ4Ohok0y4fWrQTuAIADMG
'' SIG '' J9gu4J0r46mxQ96OY8TKrdhc6E/fHxFu+h+29q9o9ad8
'' SIG '' Z29WHxdjHU+GOiSdlrMqbssxSDoySm9Ustv6E2CIWTgh
'' SIG '' y/ekp9o9a8LIyTk4iGI1C1TU9+PLSLS+SNiEBQIDAQAB
'' SIG '' o4IBdjCCAXIwHwYDVR0lBBgwFgYKKwYBBAGCNwoDBgYI
'' SIG '' KwYBBQUHAwMwHQYDVR0OBBYEFBXgOQRa/Bun0KuS0QTm
'' SIG '' h145IbvNMEUGA1UdEQQ+MDykOjA4MR4wHAYDVQQLExVN
'' SIG '' aWNyb3NvZnQgQ29ycG9yYXRpb24xFjAUBgNVBAUTDTIy
'' SIG '' OTg3OSs1MDUzMjYwHwYDVR0jBBgwFoAUqSkCOY4WxJd4
'' SIG '' zZD5nk+a4XxVr1MwVwYDVR0fBFAwTjBMoEqgSIZGaHR0
'' SIG '' cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwv
'' SIG '' TWljV2luUHJvUENBMjAxMV8yMDExLTEwLTE5LmNybCUy
'' SIG '' MDBhBggrBgEFBQcBAQRVMFMwUQYIKwYBBQUHMAKGRWh0
'' SIG '' dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2Vy
'' SIG '' dHMvTWljV2luUHJvUENBMjAxMV8yMDExLTEwLTE5LmNy
'' SIG '' dDAMBgNVHRMBAf8EAjAAMA0GCSqGSIb3DQEBCwUAA4IB
'' SIG '' AQCXaHrueLhpWMezcagTCQAYTF2lSVni6Byzs1hxptJQ
'' SIG '' /ucPkkkBpQpnVn5xFF/iUjUH6dmzf84pO7IJoeMjgiBv
'' SIG '' LkqdQNMkodcaGzNviTgDD05uTWWWYsqNCd3EIEDAzAT2
'' SIG '' y0JWAEZMdJuAMfYG3dhNM8k0Ra9wpGIqqqZxCbK3XRDh
'' SIG '' kBNGZccOnV3xfcbjbrMBc2K76pkXSAQsC3rIrSvkafiU
'' SIG '' A54rUSKRVpR0faC12z8QE8Klh/6CyXJsFeie4BNe1fK+
'' SIG '' TqgMTRCcBCZzY+vJHRxuqWCi1JPNbIit9TlC81X8S8bB
'' SIG '' 6R/e8RfEF+4CjXM/j36og+by9RQBc856dythMIIF1zCC
'' SIG '' A7+gAwIBAgIKYQd2VgAAAAAACDANBgkqhkiG9w0BAQsF
'' SIG '' ADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp
'' SIG '' bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoT
'' SIG '' FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMp
'' SIG '' TWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9y
'' SIG '' aXR5IDIwMTAwHhcNMTExMDE5MTg0MTQyWhcNMjYxMDE5
'' SIG '' MTg1MTQyWjCBhDELMAkGA1UEBhMCVVMxEzARBgNVBAgT
'' SIG '' Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc
'' SIG '' BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEuMCwG
'' SIG '' A1UEAxMlTWljcm9zb2Z0IFdpbmRvd3MgUHJvZHVjdGlv
'' SIG '' biBQQ0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEP
'' SIG '' ADCCAQoCggEBAN0Mu6LkLgnj58X3lmm8ACG9aTMz760E
'' SIG '' y1SA7gaDu8UghNn30ovzOLCrpK0tfGJ5Bf/jSj8ENSBw
'' SIG '' 48Tna+CcwDZ16Yox3Y1w5dw3tXRGlihbh2AjLL/cR6Vn
'' SIG '' 91EnnnLrB6bJuR47UzV85dPsJ7mHHP65ySMJb6hGkcFu
'' SIG '' ljxB08ujP10Cak3saR8lKFw2//1DFQqU4Bm0z9/CEuLC
'' SIG '' WyfuJ3gwi1sqCWsiiVNgFizAaB1TuuxJ851hjIVoCXNE
'' SIG '' XX2iVCvdefcVzzVdbBwrXM68nCOLb261Jtk2E8NP1ieu
'' SIG '' uTI7QZIs4cfNd+iqVE73XAsEh2W0QxiosuBtGXfsWiT6
'' SIG '' SAMCAwEAAaOCAUMwggE/MBAGCSsGAQQBgjcVAQQDAgEA
'' SIG '' MB0GA1UdDgQWBBSpKQI5jhbEl3jNkPmeT5rhfFWvUzAZ
'' SIG '' BgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8E
'' SIG '' BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAW
'' SIG '' gBTV9lbLj+iiXGJo0T2UkFvXzpoYxDBWBgNVHR8ETzBN
'' SIG '' MEugSaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20v
'' SIG '' cGtpL2NybC9wcm9kdWN0cy9NaWNSb29DZXJBdXRfMjAx
'' SIG '' MC0wNi0yMy5jcmwwWgYIKwYBBQUHAQEETjBMMEoGCCsG
'' SIG '' AQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20v
'' SIG '' cGtpL2NlcnRzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIz
'' SIG '' LmNydDANBgkqhkiG9w0BAQsFAAOCAgEAFPx8cVGlecJu
'' SIG '' su85Prw8Ug9uKz8QE3P+qGjQSKY0TYqWBSbuMUaQYXnW
'' SIG '' /zguRWv0wOUouNodj4rbCdcax0wKNmZqjOwb1wSQqBgX
'' SIG '' pJu54kAyNnbEwVrGv+QEwOoW06zDaO9irN1UbFAwWKbr
'' SIG '' fP6Up06O9Ox8hnNXwlIhczRa86OKVsgE2gcJ7fiL4870
'' SIG '' fo6u8PYLigj7P8kdcn9TuOu+Y+DjPTFlsIHl8qzNFqSf
'' SIG '' Paixm8JC0JCEX1Qd/4nquh1HkG+wc05Bn0CfX+WhKrIR
'' SIG '' kXOKISjwzt5zOV8+q1xg7N8DEKjTCen09paFtn9RiGZH
'' SIG '' GY2isBI9gSpoBXe7kUxie7bBB8e6eoc0Aw5LYnqZ6cr8
'' SIG '' zko3yS2kV3wc/j3cuA9a+tbEswKFAjrqs9lu5GkhN96B
'' SIG '' 0fZ1GQVn05NXXikbOcjuLeHN5EVzW9DSznqrFhmCRljQ
'' SIG '' Xp2Bs2evbDXyvOU/JOI1ogp1BvYYVpnUeCzRBRvr0IgB
'' SIG '' naoQ8QXfun4sY7cGmyMhxPl4bOJYFwY2K5ESA8yk2fIt
'' SIG '' uvmUnUDtGEXxzopcaz6rA9NwGCoKauBfR9HVYwoy8q/X
'' SIG '' Nh8qcFrlQlkIcUtXun6DgfAhPPQcwcW5kJMOiEWThumx
'' SIG '' IJm+mMvFlaRdYtagYwggvXUQd30980W5n5efy1eAbzOp
'' SIG '' BM93pGIcWX4xghp2MIIacgIBATCBnDCBhDELMAkGA1UE
'' SIG '' BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNV
'' SIG '' BAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBD
'' SIG '' b3Jwb3JhdGlvbjEuMCwGA1UEAxMlTWljcm9zb2Z0IFdp
'' SIG '' bmRvd3MgUHJvZHVjdGlvbiBQQ0EgMjAxMQITMwAABRna
'' SIG '' 3aqL3ESykgAAAAAFGTANBglghkgBZQMEAgEFAKCB+jAZ
'' SIG '' BgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAvBgkqhkiG
'' SIG '' 9w0BCQQxIgQgoHcpO+Mc7CMnH+Gft3DbkYb1lVjfqUe4
'' SIG '' eHB2V3ES4jEwUAYKKwYBBAGCNwoDHDFCDEAwOUJENUEy
'' SIG '' NzU5QzQzQTlEQjA4QTA0QkVGRjU0NjI0QkQ0QkY0MjUz
'' SIG '' Q0Y3QTk2NDI5RjQ1MjJBNDY5RDZGOEY4MFoGCisGAQQB
'' SIG '' gjcCAQwxTDBKoCSAIgBNAGkAYwByAG8AcwBvAGYAdAAg
'' SIG '' AFcAaQBuAGQAbwB3AHOhIoAgaHR0cDovL3d3dy5taWNy
'' SIG '' b3NvZnQuY29tL3dpbmRvd3MwDQYJKoZIhvcNAQEBBQAE
'' SIG '' ggEAQvBZehEiQe4Xt6dKS5td9Sul6xzmjYjlxPoCMpVK
'' SIG '' aT/xOYBoQA/Y5J7vOn3kqpIZ20QAvGjbMv6/DwSHGr4z
'' SIG '' tnWtxRJzUYUVxRPsrLpzJuTGRlFIHLnCrZxY5T1NkyvT
'' SIG '' zslKEUeCmDWeUChZNwqNm4usEUJZyc+Trbveq4hFlvrZ
'' SIG '' y07NPR0tds7sIa9WE7tyU2lwyWiGLAAoyLmMnF9gdmhv
'' SIG '' xdwklqiQdOmg0/v2nUI0uooID+649n/hACoz3J7wCY3I
'' SIG '' 8mi/kv0EPThUSFd02h9OqAlL6w0a7HNhl17jo+QCw15N
'' SIG '' ic1YxbG8jiUnXbk938gfjsw2617q0MlpxtWtM6GCF60w
'' SIG '' ghepBgorBgEEAYI3AwMBMYIXmTCCF5UGCSqGSIb3DQEH
'' SIG '' AqCCF4YwgheCAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFa
'' SIG '' BgsqhkiG9w0BCRABBKCCAUkEggFFMIIBQQIBAQYKKwYB
'' SIG '' BAGEWQoDATAxMA0GCWCGSAFlAwQCAQUABCCA4kbt17Qy
'' SIG '' O8u41qwxGqqIBob1E022hXom5Km8DyHipgIGaevWwqc3
'' SIG '' GBMyMDI2MDUwNjEwNDEyNi4zNzJaMASAAgH0oIHZpIHW
'' SIG '' MIHTMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGlu
'' SIG '' Z3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMV
'' SIG '' TWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRN
'' SIG '' aWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0
'' SIG '' ZWQxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjo0QzFB
'' SIG '' LTA1RTAtRDk0NzElMCMGA1UEAxMcTWljcm9zb2Z0IFRp
'' SIG '' bWUtU3RhbXAgU2VydmljZaCCEfswggcoMIIFEKADAgEC
'' SIG '' AhMzAAACGCXZkgXi5+XkAAEAAAIYMA0GCSqGSIb3DQEB
'' SIG '' CwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNo
'' SIG '' aW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQK
'' SIG '' ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMT
'' SIG '' HU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMB4X
'' SIG '' DTI1MDgxNDE4NDgyNVoXDTI2MTExMzE4NDgyNVowgdMx
'' SIG '' CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u
'' SIG '' MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
'' SIG '' b3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1pY3Jv
'' SIG '' c29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEn
'' SIG '' MCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOjRDMUEtMDVF
'' SIG '' MC1EOTQ3MSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1T
'' SIG '' dGFtcCBTZXJ2aWNlMIICIjANBgkqhkiG9w0BAQEFAAOC
'' SIG '' Ag8AMIICCgKCAgEAsdzo6uuQJqAfxLnvEBfIvj6knK+p
'' SIG '' 6bnMXEFZ/QjPOFywlcjDfzI8Dg1nzDlxm7/pqbvjWhyv
'' SIG '' azKmFyO6qbPwClfRnI57h5OCixgpOOCGJJQIZSTiMgui
'' SIG '' 3B8DPiFtJPcfzRt3FsnxjLXwBIjGgnjGfmQl7zejA1Wo
'' SIG '' YL/qBmQhw/FDFTWebxfo4m0RCCOxf2qwj31aOjc2aYUe
'' SIG '' PtLMXHsXKPFH0tp5SKIF/9tJxRSg0NYEvQqVilje8aQk
'' SIG '' Pd3qzAux2Mc5HMSK4NMTtVVCYAWDUZ4p+6iDI9t5BNCB
'' SIG '' Isf5ooFNUWtxCqnpFYiLYkHfFfxhVUBZ8LGGxYsA36sn
'' SIG '' D65s2Hf4t86k0e8WelH/usfhYqOM3z2yaI8rg08631Ik
'' SIG '' wqUzyQoEPqMsHgBem1xpmOGSIUnVvTsAv+lmECL2Rqrc
'' SIG '' OZlZax8K0aiij8h6UkWBN2IA/ikackTSGVRBQmWWZuLF
'' SIG '' WV/T4xuNzscC0X7xo4fetgpsqaEA0jY/QevkTvLv4OlN
'' SIG '' N9eOL8LNh7Vm0R65P7oabOQDqtUFAwCgjgPJ0iV/jQCa
'' SIG '' MAcO3SYpG5wSAYiJkk4XLjNSlNxU2Idjs1sORhl7s7LC
'' SIG '' 6hOb7bVAHVwON74GxfFNiEIA6BfudANjpQJ0nUc/ppEX
'' SIG '' pT4pgDBHsYtV8OyKSjKsIxOdFR7fIJIjDc8DvUkCAwEA
'' SIG '' AaOCAUkwggFFMB0GA1UdDgQWBBQkLqHEXDobY7dHuoQC
'' SIG '' Ba4sX7aL0TAfBgNVHSMEGDAWgBSfpxVdAF5iXYP05dJl
'' SIG '' pxtTNRnpcjBfBgNVHR8EWDBWMFSgUqBQhk5odHRwOi8v
'' SIG '' d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNy
'' SIG '' b3NvZnQlMjBUaW1lLVN0YW1wJTIwUENBJTIwMjAxMCgx
'' SIG '' KS5jcmwwbAYIKwYBBQUHAQEEYDBeMFwGCCsGAQUFBzAC
'' SIG '' hlBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz
'' SIG '' L2NlcnRzL01pY3Jvc29mdCUyMFRpbWUtU3RhbXAlMjBQ
'' SIG '' Q0ElMjAyMDEwKDEpLmNydDAMBgNVHRMBAf8EAjAAMBYG
'' SIG '' A1UdJQEB/wQMMAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQE
'' SIG '' AwIHgDANBgkqhkiG9w0BAQsFAAOCAgEAnkjRhjwPgdoI
'' SIG '' pvt4YioT/j0LWuBxF3ARBKXDENggraKvC0oRPwbjAmsX
'' SIG '' nPEmtuo5MD8uJ9Xw9eYrxqqkK4DF9snZMrHMfooxCa++
'' SIG '' 1irLz8YoozC4tci+a4N37Sbke1pt1xs9qZtvkPgZGWn5
'' SIG '' BcwVfmAwSZLHi2CuZ06Y0/X+t6fNBnrbMVovNaDX4WPd
'' SIG '' yI9GEzxfIggDsck2Ipo4VXL/Arcz7p2F7bEZGRuyxjgM
'' SIG '' C+woCkDJaH/yk/wcZpAsixe4POdN0DW6Zb35O3Dg3+a6
'' SIG '' prANMc3WIdvfKDl75P0aqcQbQAR7b0f4gH4NMkUct0Wm
'' SIG '' 4GN5KhsE1YK7V/wAqDKmK4jx3zLz3a8Hsxa9HB3Gyitl
'' SIG '' mC5sDhOl4QTGN5kRi6oCoV4hK+kIFgnkWjHhSRNomz36
'' SIG '' QnbCSG/BHLEm2GRU9u3/I4zUd9E1AC97IJEGfwb+0NWb
'' SIG '' 3QEcrkypdGdWwl0LEObhrQR9B1V7+edcyNmsX0p2BX0r
'' SIG '' Fpd1PkXJSbxf8IcEiw/bkNgagZE+VlDtxXeruLdo5k3l
'' SIG '' GOv7rPYuOEaoZYxDvZtpHP9P36wmW4INjR6NInn2UM+k
'' SIG '' rP/xeLnRbDBkm9RslnoDhVraliKDH62BxhcgL9tiRgOH
'' SIG '' lcI0wqvVWLdv8yW8rxkawOlhCRqT3EKECW8ktUAPwNbB
'' SIG '' ULkT+oWcvBcwggdxMIIFWaADAgECAhMzAAAAFcXna54C
'' SIG '' m0mZAAAAAAAVMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYD
'' SIG '' VQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G
'' SIG '' A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0
'' SIG '' IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQg
'' SIG '' Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAxMDAe
'' SIG '' Fw0yMTA5MzAxODIyMjVaFw0zMDA5MzAxODMyMjVaMHwx
'' SIG '' CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u
'' SIG '' MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
'' SIG '' b3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jv
'' SIG '' c29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMIICIjANBgkq
'' SIG '' hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA5OGmTOe0ciEL
'' SIG '' eaLL1yR5vQ7VgtP97pwHB9KpbE51yMo1V/YBf2xK4OK9
'' SIG '' uT4XYDP/XE/HZveVU3Fa4n5KWv64NmeFRiMMtY0Tz3cy
'' SIG '' wBAY6GB9alKDRLemjkZrBxTzxXb1hlDcwUTIcVxRMTeg
'' SIG '' Cjhuje3XD9gmU3w5YQJ6xKr9cmmvHaus9ja+NSZk2pg7
'' SIG '' uhp7M62AW36MEBydUv626GIl3GoPz130/o5Tz9bshVZN
'' SIG '' 7928jaTjkY+yOSxRnOlwaQ3KNi1wjjHINSi947SHJMPg
'' SIG '' yY9+tVSP3PoFVZhtaDuaRr3tpK56KTesy+uDRedGbsoy
'' SIG '' 1cCGMFxPLOJiss254o2I5JasAUq7vnGpF1tnYN74kpEe
'' SIG '' HT39IM9zfUGaRnXNxF803RKJ1v2lIH1+/NmeRd+2ci/b
'' SIG '' fV+AutuqfjbsNkz2K26oElHovwUDo9Fzpk03dJQcNIIP
'' SIG '' 8BDyt0cY7afomXw/TNuvXsLz1dhzPUNOwTM5TI4CvEJo
'' SIG '' LhDqhFFG4tG9ahhaYQFzymeiXtcodgLiMxhy16cg8ML6
'' SIG '' EgrXY28MyTZki1ugpoMhXV8wdJGUlNi5UPkLiWHzNgY1
'' SIG '' GIRH29wb0f2y1BzFa/ZcUlFdEtsluq9QBXpsxREdcu+N
'' SIG '' +VLEhReTwDwV2xo3xwgVGD94q0W29R6HXtqPnhZyacau
'' SIG '' e7e3PmriLq0CAwEAAaOCAd0wggHZMBIGCSsGAQQBgjcV
'' SIG '' AQQFAgMBAAEwIwYJKwYBBAGCNxUCBBYEFCqnUv5kxJq+
'' SIG '' gpE8RjUpzxD/LwTuMB0GA1UdDgQWBBSfpxVdAF5iXYP0
'' SIG '' 5dJlpxtTNRnpcjBcBgNVHSAEVTBTMFEGDCsGAQQBgjdM
'' SIG '' g30BATBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1p
'' SIG '' Y3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9y
'' SIG '' eS5odG0wEwYDVR0lBAwwCgYIKwYBBQUHAwgwGQYJKwYB
'' SIG '' BAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGG
'' SIG '' MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU1fZW
'' SIG '' y4/oolxiaNE9lJBb186aGMQwVgYDVR0fBE8wTTBLoEmg
'' SIG '' R4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9j
'' SIG '' cmwvcHJvZHVjdHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYt
'' SIG '' MjMuY3JsMFoGCCsGAQUFBwEBBE4wTDBKBggrBgEFBQcw
'' SIG '' AoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9j
'' SIG '' ZXJ0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcnQw
'' SIG '' DQYJKoZIhvcNAQELBQADggIBAJ1VffwqreEsH2cBMSRb
'' SIG '' 4Z5yS/ypb+pcFLY+TkdkeLEGk5c9MTO1OdfCcTY/2mRs
'' SIG '' fNB1OW27DzHkwo/7bNGhlBgi7ulmZzpTTd2YurYeeNg2
'' SIG '' LpypglYAA7AFvonoaeC6Ce5732pvvinLbtg/SHUB2Rje
'' SIG '' bYIM9W0jVOR4U3UkV7ndn/OOPcbzaN9l9qRWqveVtihV
'' SIG '' J9AkvUCgvxm2EhIRXT0n4ECWOKz3+SmJw7wXsFSFQrP8
'' SIG '' DJ6LGYnn8AtqgcKBGUIZUnWKNsIdw2FzLixre24/LAl4
'' SIG '' FOmRsqlb30mjdAy87JGA0j3mSj5mO0+7hvoyGtmW9I/2
'' SIG '' kQH2zsZ0/fZMcm8Qq3UwxTSwethQ/gpY3UA8x1RtnWN0
'' SIG '' SCyxTkctwRQEcb9k+SS+c23Kjgm9swFXSVRk2XPXfx5b
'' SIG '' RAGOWhmRaw2fpCjcZxkoJLo4S5pu+yFUa2pFEUep8beu
'' SIG '' yOiJXk+d0tBMdrVXVAmxaQFEfnyhYWxz/gq77EFmPWn9
'' SIG '' y8FBSX5+k77L+DvktxW/tM4+pTFRhLy/AsGConsXHRWJ
'' SIG '' jXD+57XQKBqJC4822rpM+Zv/Cuk0+CQ1ZyvgDbjmjJnW
'' SIG '' 4SLq8CdCPSWU5nR0W2rRnj7tfqAxM328y+l7vzhwRNGQ
'' SIG '' 8cirOoo6CGJ/2XBjU02N7oJtpQUQwXEGahC0HVUzWLOh
'' SIG '' cGbyoYIDVjCCAj4CAQEwggEBoYHZpIHWMIHTMQswCQYD
'' SIG '' VQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G
'' SIG '' A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0
'' SIG '' IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQg
'' SIG '' SXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJzAlBgNV
'' SIG '' BAsTHm5TaGllbGQgVFNTIEVTTjo0QzFBLTA1RTAtRDk0
'' SIG '' NzElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAg
'' SIG '' U2VydmljZaIjCgEBMAcGBSsOAwIaAxUAnWtGrXWiuNE8
'' SIG '' QrKfm4CtGr57z+mggYMwgYCkfjB8MQswCQYDVQQGEwJV
'' SIG '' UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH
'' SIG '' UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv
'' SIG '' cmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1T
'' SIG '' dGFtcCBQQ0EgMjAxMDANBgkqhkiG9w0BAQsFAAIFAO2l
'' SIG '' fbkwIhgPMjAyNjA1MDYwODQzMzdaGA8yMDI2MDUwNzA4
'' SIG '' NDMzN1owdDA6BgorBgEEAYRZCgQBMSwwKjAKAgUA7aV9
'' SIG '' uQIBADAHAgEAAgIF5DAHAgEAAgITyDAKAgUA7abPOQIB
'' SIG '' ADA2BgorBgEEAYRZCgQCMSgwJjAMBgorBgEEAYRZCgMC
'' SIG '' oAowCAIBAAIDB6EgoQowCAIBAAIDAYagMA0GCSqGSIb3
'' SIG '' DQEBCwUAA4IBAQAzHXGVul7ImJBkzMJ2AfukolA3CPYx
'' SIG '' +X0/aqht3vlZ7TGR7dFT72vhVuqIc8Jm2SA8nlRMoY+J
'' SIG '' EjkV5EY4iSZVCfvdEzke1duqWTJovu5RL4NfAhGUb6Sq
'' SIG '' ZXvw7DNVTtaqPwF0OEurwZPL5yGN/nji3nZ/soAIRskx
'' SIG '' EQdtUVH/PpiYNvb+/Jsi0DA7ePgJoErRc0e1lp9GPFgL
'' SIG '' OWy0Y5s6k7PYb9Gbo/d15NyESZWRaISnS+Z1l4qy7u4h
'' SIG '' LMOyaoD7XZljqpFpR8zgXoJR2P/CpX3JciTtYxMwRe5o
'' SIG '' 8HfrZrtb49pPlEi/xV0WBpf4EtDO5aUCDY+sFSc5FQkU
'' SIG '' nvtAMYIEDTCCBAkCAQEwgZMwfDELMAkGA1UEBhMCVVMx
'' SIG '' EzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1Jl
'' SIG '' ZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh
'' SIG '' dGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3Rh
'' SIG '' bXAgUENBIDIwMTACEzMAAAIYJdmSBeLn5eQAAQAAAhgw
'' SIG '' DQYJYIZIAWUDBAIBBQCgggFKMBoGCSqGSIb3DQEJAzEN
'' SIG '' BgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQxIgQgM0qA
'' SIG '' v4TKhaBWhAz7sXHpionSXqtKpfLvqka9fPei8wYwgfoG
'' SIG '' CyqGSIb3DQEJEAIvMYHqMIHnMIHkMIG9BCCZE9yJuOTI
'' SIG '' tIwWaES6lzGKK1XcSoz1ynRzaOVzx9eFajCBmDCBgKR+
'' SIG '' MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5n
'' SIG '' dG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN
'' SIG '' aWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1p
'' SIG '' Y3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAAC
'' SIG '' GCXZkgXi5+XkAAEAAAIYMCIEIH5Z4i7TUiOK2yndp7hs
'' SIG '' K1rYmUHnQvTjBdQX5kOXMFKFMA0GCSqGSIb3DQEBCwUA
'' SIG '' BIICAFuuzAmZaRIzDfKDIODacCTSNT0pFaZ8SX5HH4/5
'' SIG '' L/AvaqHxYvXqAELkdNNpMgU+TqhoU/WYM/mtXRxKEzv5
'' SIG '' o7tBEtZNlp2YkE+GSbou6uIzt02qzuo7oDDXbR3jbg7k
'' SIG '' A4Z+d23uFWUhMECoD6/P+Bvlrc+shDOLP/BS87HcmHBu
'' SIG '' cpfl4aEfzDQzO4aO6C1Xr36P23uUSPa59aGjOZXRL3PO
'' SIG '' 4LLOoXmpJio0kGR/CT8q65xUj4138H4ewwt+qzPLelaN
'' SIG '' Rc3YXSNtVWuzCrxXUhjVlI40XG+P0ThIhd9sPA6loP0/
'' SIG '' j13qJL9mYDDmcWnNHv+yAo2nnrrlfcev7dk6ErZqN3pW
'' SIG '' 1oqyKvjyxE0Idc4FT1VhCXkc7Qti2Vi2eVOhokiJFILO
'' SIG '' +NxO5SbwroHErRhoxAoLJGeOCd4xul9FOgS6cmeVE+ag
'' SIG '' KY1fCtRjezaFxUtZqu0MM746U4DrwgxjPH7FqnPloVTy
'' SIG '' 5mPK04JqThhwLIjWkGhp/MVeu0jmaOGKdoA2LeX9DjU3
'' SIG '' ukia5XaktGiuKnULzxXMDTCIktlT+W4xiY0jBiFuwgn/
'' SIG '' 8Q3L9uiFH17DmDnhIKpSizs3f98TurgCyXwrx7wi56Th
'' SIG '' 3xP91EwKwt7Nc/iG3FClPgBZ7oJ6uRY5VVT6J791Ohhh
'' SIG '' BEp/KVC3WnubbG8qzSrUIRnh2RDG
'' SIG '' End signature block
