'==========================================================================
'
' NAME: Script-LADM-Compliance-M-R1.vbs
'
' AUTHOR:  Max Erenburg 
' DATE  : 4/10/2018
'
' COMMENT: This script will verify the local admin account (SID500) for compliancy
' 
'==========================================================================

Option Explicit

Dim vDate, vTime, altTime, altDate, vDateTime
vDateTime = Now

Dim oShell, oFSO, oProcessEnv, sScript, iErrCode, sMsg
Dim sDebug, sDebugBlat, sSuccess, sPilot
Dim sMailbox1, sMailbox2, sRelayHost, sCN, sFQDN, sTry
Dim sSystem32, sLogDir, sScriptsDir, sEmailDir, sDebugLog
Dim sDomFQDN, sLib, sBlat, sEngKey
Dim sCoreBlat, sCoreBlat2, sCoreWMI, sCoreInfo, sCoreInfo2, sCoreInfo3, DebugLog
Dim oWMI, sWMIFailed, sWMIMsgBody2
Dim ProductName, IsServer, CSDver, s64Bit, DC

Set oShell = CreateObject("WScript.Shell")
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oProcessEnv = oShell.Environment("PROCESS")

Const DEPLOYNAME = "LADM-Compliance"
Const SIDE = "-M"
Const RELEASE = "-R1"
sScript = "Script-" & DEPLOYNAME & SIDE & RELEASE

sDebug = "False" : sDebugBlat = "False"
sSuccess = "False" ' Set to False if you dont want success emails. ' For enterprise deployment set to false, for one off installations leave as True
sPilot = "False" ' Set to False if you dont want attachment of debug file to success emails. ' Use for QA/UAT, once ready for Production deployments set to false

sMailbox1 = "merenburg@theorchard.com" : sMailbox2 = ""
sRelayHost = "smtp-relay.gmail.com"
sCN = oProcessEnv("COMPUTERNAME")
sFQDN = "@TheOrchard.com"
sTry = "2"

sSystem32 = oProcessEnv("SYSTEMROOT") & "\system32\"
sLogDir = oProcessEnv("SYSTEMROOT") & "\EngLogs"
sScriptsDir = sLogDir & "\Scripts"
sEmailDir = sLogDir & "\Email"
sDebugLog = sScriptsDir & "\" & sScript & ".log"

sBlat = sSystem32 & "blat.exe"
sEngKey = "HKLM\SOFTWARE\ORCDENG\"

' Get Domain Name we are working with so we dont have to have additional copies of same script per AD Forest/Domain.
Call GetDomainName
sLib = "\\" & sDomFQDN & "\netlogon\lib\"

' Ensure email alerts are available
Call CopyBlat

' Initialize WMI connection to cimv2
On Error Resume Next 
Set oWMI = GetObject("winmgmts:\\.\root\cimv2")
If Err.Number <> 0 Then
	iErrCode = Err.Number
	sWMIFailed = "Failed"
	sWMIMsgBody2 = Now & "__ Script was unable to successfully connect to cimv2, Error code: " & iErrCode & ", installations are dependent on WMI being healthy, cannot proceed."
End If
On Error GoTo 0

sMsg = sMsg & "|ScriptPath: " & WScript.ScriptFullName

' Create directory(s) for local centralized logging
Call CreateLogDirs

' Create debug log or append to log if this script has been run before
Call CreateDebugLog("FirstCheck")

If sWMIFailed = "Failed" Then 'fail with hard error as we need WMI up and running (health to perform installs, etc..)
	If Not IsObject(DebugLog) Then Call CreateDebugLog("WriteLog")
	WSHLog "CriticalFailure", sWMIMsgBody2
End If

' Get what OS, CSD version are we working with
Call GetOSInfo

Dim SRVACCT, CLTACCT : SRVACCT = "elassard" :  CLTACCT = "ljones"

' Check Local Admin Account Status
Call CheckLADM


If IsObject(DebugLog) Then DebugLog.WriteLine(Now & "__ Wrapper execution complete, total execution time: " & DateDiffToWords(vDateTime,Now))
WSHLog "Information", "Wrapper execution complete, total execution time: " & DateDiffToWords(vDateTime,Now)

' Log/email exit code, cleanup and exit
If Not (IsNull(iErrCode) Or IsEmpty(iErrCode)) Then
	If Not IsObject(DebugLog) Then Call CreateDebugLog("WriteLog")
	DebugLog.WriteLine(Now & "__ Exiting... Wrapper exit code : " & iErrCode)
	If (sSuccess = "True") And (sPilot = "False") And (sCoreBlat = "") Then Email sScript & " Status", WScript.ScriptFullName & ", wrapper exit code : " & iErrCode & " " & sMsg
	Call Cleanup(sScript & " Status", WScript.ScriptFullName & ", wrapper exit code : " & iErrCode & " " & sMsg)
	WScript.Quit(iErrCode)
Else
	If IsObject(DebugLog) Then DebugLog.WriteLine(Now & "__ Exiting... Wrapper exit code  : " & Err.Number)
	If (sSuccess = "True") And (sPilot = "False") And (sCoreBlat = "") Then Email sScript & " Status", WScript.ScriptFullName & ", wrapper exit code  : " & Err.Number & " " & sMsg
	Call Cleanup(sScript & " Status", WScript.ScriptFullName & ", wrapper exit code  : " & Err.Number & " " & sMsg)
	WScript.Quit
End If

' ------   Packager's defined Functions/Subs section    -------

' Check Local admin account status / SID-500
Function CheckLADM
	Dim oCmp, iErrDesc, oLA, sHexSID, sLADM, IsAcctDisabled, sStatus, NewPassword, sRNDPWD
	On Error Resume Next 	
	Set oCmp = GetObject("WinNT://.")
	If Err.Number = 0 Then
		oCmp.Filter = Array("user")
		For Each oLA In oCmp
			sHexSID = OctetToHexStr(oLA.objectSID) ' Retrieve SID and convert to hex string.
			If (Right(sHexSID, 8) = "F4010000") Then ' Check SID = "500" decimal, "F4010000" hex.
				sLADM = oLA.Name
				Exit For
			End If
		Next
		If IsNull(sLADM) Or IsEmpty(sLADM) Then
			If Not IsObject(DebugLog) Then Call CreateDebugLog("WriteLog")
			iErrCode = "999"
			DebugLog.WriteLine(Now & "__ Failed to obtain SID500 user account. Unable to parse Admin account status.")
			WSHLog "CriticalFailure", "Failed to obtain SID500 user account. Unable to parse Admin account status."
		End If
		If IsServer = "True" Then
			If Not (oLA.Name = SRVACCT) Then
				If Not IsObject(DebugLog) Then Call CreateDebugLog("WriteLog")
				DebugLog.WriteLine(Now & "__ Found local SID500 account name to be: " & oLA.Name & ", instead of " & SRVACCT & ". This should be looked into.")
				WSHLog "Warning", "Found local SID500 account name to be: " & oLA.Name & ", instead of " & SRVACCT & ". This should be looked into."
			End If
		Else
			If Not (oLA.Name = CLTACCT) Then
				If Not IsObject(DebugLog) Then Call CreateDebugLog("WriteLog")
				DebugLog.WriteLine(Now & "__ Found local SID500 account name to be: " & oLA.Name & ", instead of " & CLTACCT & ". This should be looked into.")
				WSHLog "Warning", "Found local SID500 account name to be: " & oLA.Name & ", instead of " & CLTACCT & ". This should be looked into."
			End If
		End If
		IsAcctDisabled = oLA.AccountDisabled
		If Not (IsAcctDisabled = True) Then
			oLA.PasswordExpired = 0
            oLA.AccountDisabled = True
            sStatus = "Enabled"
			Dim sPCD, PCDKey
			sPCD = sEngKey & "Scripts\LADM\CountDisablement"
			PCDKey = GetRegData(sPCD, "{default}")
            If Not IsObject(DebugLog) Then Call CreateDebugLog("WriteLog")
		End If
		Dim sPCR, PCRKey
		sPCR = sEngKey & "Scripts\LADM\Randomized"
		PCRKey = GetRegData(sPCR, "{default}")
		If PCRKey = "{default}" Then 'password has never been randomized.
			If Not IsObject(DebugLog) Then Call CreateDebugLog("WriteLog")
			NewPassword = RndPassword(20)
			oLA.SetPassword NewPassword
			sRNDPWD = "NeedToChange"
		Else
			sRNDPWD = "FoundChanged"
		End If
		If (sStatus = "Enabled") Or (sRNDPWD = "NeedToChange") Then
			oLA.SetInfo
			'MsgBox Err.Number 'debug
			If Err.Number = 0 Then
				Call Stamp
				Dim sSetDate, sSetTime, sPSD, sPST
				sSetDate = vDate
				sSetTime = vTime		
				sPSD = sEngKey & "Scripts\LADM\SetDate"
				sPST = sEngKey & "Scripts\LADM\SetTime"
				If sStatus = "Enabled" And sRNDPWD = "NeedToChange" Then
					If PCDKey = "{default}" Then
						sPilot = "True"
						DebugLog.WriteLine(Now & "__ Found local SID500 account: " & oLA.Name & " enabled and password was never found to be randomized. Succeeded disabling the account and randomizing its password.")
						'WSHLog "Warning", "Found local SID500 account: " & oLA.Name & " enabled and password was never found to be randomized. Succeeded disabling the account and randomizing its password."
						oShell.RegWrite sPSD, sSetDate, "REG_SZ"
						If Err.Number = 0 Then
							DebugLog.WriteLine(Now & "__ Created reg key " & sPSD & " with value of " & sSetDate)
						Else
							iErrCode = Err.Number
							iErrDesc = CStr(Err.Number) & " " & Err.Description & "."
							Call RegAlert(sPSD, sSetDate, iErrDesc)
						End If
						oShell.RegWrite sPST, sSetTime, "REG_SZ"
						If Err.Number = 0 Then
							DebugLog.WriteLine(Now & "__ Created reg key " & sPST & " with value of " & sSetTime)
						Else
							iErrCode = Err.Number
							iErrDesc = CStr(Err.Number) & " " & Err.Description & "."
							Call RegAlert(sPST, sSetTime, iErrDesc)
						End If
						oShell.RegWrite sPCR, "Yes", "REG_SZ"
						If Err.Number = 0 Then
							DebugLog.WriteLine(Now & "__ Created reg key " & sPCR & " with value of Yes")
						Else
							iErrCode = Err.Number
							iErrDesc = CStr(Err.Number) & " " & Err.Description & "."
							Call RegAlert(sPCR, "Yes", iErrDesc)
						End If
						oShell.RegWrite sPCD, "1", "REG_SZ"
						If Err.Number = 0 Then
							DebugLog.WriteLine(Now & "__ Created reg key " & sPCD & " with value of 1")
						Else
							iErrCode = Err.Number
							iErrDesc = CStr(Err.Number) & " " & Err.Description & "."
							Call RegAlert(sPCD, "1", iErrDesc)
						End If						
					Else
						sPilot = "True"
						DebugLog.WriteLine(Now & "__ Found local SID500 account: " & oLA.Name & " enabled and password was never found to be randomized. Succeeded disabling the account and randomizing its password. NOTE: It was found to be previous disabled " & PCDKey & " time(s).")
						'WSHLog "Warning", "Found local SID500 account: " & oLA.Name & " enabled and password was never found to be randomized. Succeeded disabling the account and randomizing its password. NOTE: It was found to be previous disabled " & PCDKey & " time(s)."
						oShell.RegWrite sPSD, sSetDate, "REG_SZ"
						If Err.Number = 0 Then
							DebugLog.WriteLine(Now & "__ Created reg key " & sPSD & " with value of " & sSetDate)
						Else
							iErrCode = Err.Number
							iErrDesc = CStr(Err.Number) & " " & Err.Description & "."
							Call RegAlert(sPSD, sSetDate, iErrDesc)
						End If
						oShell.RegWrite sPST, sSetTime, "REG_SZ"
						If Err.Number = 0 Then
							DebugLog.WriteLine(Now & "__ Created reg key " & sPST & " with value of " & sSetTime)
						Else
							iErrCode = Err.Number
							iErrDesc = CStr(Err.Number) & " " & Err.Description & "."
							Call RegAlert(sPST, sSetTime, iErrDesc)
						End If
						oShell.RegWrite sPCR, "Yes", "REG_SZ"
						If Err.Number = 0 Then
							DebugLog.WriteLine(Now & "__ Created reg key " & sPCR & " with value of Yes")
						Else
							iErrCode = Err.Number
							iErrDesc = CStr(Err.Number) & " " & Err.Description & "."
							Call RegAlert(sPCR, "Yes", iErrDesc)
						End If
						oShell.RegWrite sPCD, PCDKey + 1, "REG_SZ"
						If Err.Number = 0 Then
							DebugLog.WriteLine(Now & "__ Created reg key " & sPCD & " with value of " & PCDKey + 1)
						Else
							iErrCode = Err.Number
							iErrDesc = CStr(Err.Number) & " " & Err.Description & "."
							Call RegAlert(sPCD, PCDKey + 1, iErrDesc)
						End If						
					End If
				ElseIf sStatus = "Enabled" Then
					If PCDKey = "{default}" Then
						DebugLog.WriteLine(Now & "__ Found local SID500 account: " & oLA.Name & " enabled. Succeeded disabling the account.")
						WSHLog "Warning", "Found local SID500 account: " & oLA.Name & " enabled. Succeeded disabling the account."
						oShell.RegWrite sPCD, "1", "REG_SZ"
						If Err.Number = 0 Then
							DebugLog.WriteLine(Now & "__ Created reg key " & sPCD & " with value of 1")
						Else
							iErrCode = Err.Number
							iErrDesc = CStr(Err.Number) & " " & Err.Description & "."
							Call RegAlert(sPCD, "1", iErrDesc)
						End If						
					Else
						DebugLog.WriteLine(Now & "__ Found local SID500 account: " & oLA.Name & " enabled. Succeeded disabling the account. NOTE: It was found to be previous disabled " & PCDKey & " time(s).")
						WSHLog "Warning", "Found local SID500 account: " & oLA.Name & " enabled. Succeeded disabling the account. NOTE: It was found to be previous disabled " & PCDKey & " time(s)."
						oShell.RegWrite sPCD, PCDKey + 1, "REG_SZ"
						If Err.Number = 0 Then
							DebugLog.WriteLine(Now & "__ Created reg key " & sPCD & " with value of " & PCDKey + 1)
						Else
							iErrCode = Err.Number
							iErrDesc = CStr(Err.Number) & " " & Err.Description & "."
							Call RegAlert(sPCD, PCDKey + 1, iErrDesc)
						End If						
					End If
				ElseIf sRNDPWD = "NeedToChange" Then
					If PCRKey = "{default}" Then
						DebugLog.WriteLine(Now & "__ Found local SID500 account: " & oLA.Name & " password was never found to be randomized. Succeeded randomizing its password.")
						WSHLog "Warning", "Found local SID500 account: " & oLA.Name & " password was never found to be randomized. Succeeded randomizing its password."
						oShell.RegWrite sPSD, sSetDate, "REG_SZ"
						If Err.Number = 0 Then
							DebugLog.WriteLine(Now & "__ Created reg key " & sPSD & " with value of " & sSetDate)
						Else
							iErrCode = Err.Number
							iErrDesc = CStr(Err.Number) & " " & Err.Description & "."
							Call RegAlert(sPSD, sSetDate, iErrDesc)
						End If
						oShell.RegWrite sPST, sSetTime, "REG_SZ"
						If Err.Number = 0 Then
							DebugLog.WriteLine(Now & "__ Created reg key " & sPST & " with value of " & sSetTime)
						Else
							iErrCode = Err.Number
							iErrDesc = CStr(Err.Number) & " " & Err.Description & "."
							Call RegAlert(sPST, sSetTime, iErrDesc)
						End If
						oShell.RegWrite sPCR, "Yes", "REG_SZ"
						If Err.Number = 0 Then
							DebugLog.WriteLine(Now & "__ Created reg key " & sPCR & " with value of Yes")
						Else
							iErrCode = Err.Number
							iErrDesc = CStr(Err.Number) & " " & Err.Description & "."
							Call RegAlert(sPCR, "Yes", iErrDesc)
						End If
					End If
				End If
			Else
				iErrCode = Err.Number
				iErrDesc = CStr(Err.Number) & " " & Err.Description & "."
				If sStatus = "Enabled" And sRNDPWD = "NeedToChange" Then
					DebugLog.WriteLine(Now & "__ Failed to disable SID 500 account: " & oLA.Name & ", and randomize its password. Error: " & iErrDesc)
					WSHLog "CriticalFailure", "Failed to disable SID 500 account: " & oLA.Name & ", and randomize its password. Error: " & iErrDesc
				ElseIf sStatus = "Enabled" Then
					DebugLog.WriteLine(Now & "__ Failed to disable SID 500 account: " & oLA.Name & ", error: " & iErrDesc)
					WSHLog "CriticalFailure", "Failed to disable SID 500 account: " & oLA.Name & ", error: " & iErrDesc
				ElseIf sRNDPWD = "NeedToChange" Then
					DebugLog.WriteLine(Now & "__ Failed to randomize the password on the SID 500 account: " & oLA.Name & ", error: " & iErrDesc)
					WSHLog "CriticalFailure", "Failed to randomize the password on the SID 500 account: " & oLA.Name & ", error: " & iErrDesc
				End If
			End If
		End If
	Else
		iErrCode = Err.Number
		iErrDesc = CStr(Err.Number) & " " & Err.Description & "."
		If Not IsObject(DebugLog) Then Call CreateDebugLog("WriteLog")
		DebugLog.WriteLine(Now & "__ Failed to bind to localhost to obtain user accounts. Unable to parse Admin account status. Error Code:" & iErrDesc)
		WSHLog "CriticalFailure", "Failed to bind to localhost to obtain user accounts. Unable to parse Admin account status. Error Code:" & iErrDesc
	End If
	On Error GoTo 0
End Function

' Function to convert OctetString (Byte Array) to a hex string.
Function OctetToHexStr(ByVal arrbytOctet)
	Dim k
	OctetToHexStr = ""
	For k = 1 To Lenb(arrbytOctet)
		OctetToHexStr = OctetToHexStr & Right("0" & Hex(Ascb(Midb(arrbytOctet, k, 1))), 2)
	Next
End Function

Function RndPassword(vLength) 
  Dim x, vChar
  For x = 1 To vLength
    Randomize
    vChar = Int(89*Rnd) + 33
    If vChar = 34 Then 'this is quote character, replace it with a single quote
      vChar = 39
    End If
    RndPassword = RndPassword & Chr(vChar)
  Next
End Function

Sub RegAlert(sRegPath, sValue, iErrDesc)
	DebugLog.WriteLine(Now & "__ Failed to create reg key " & sRegPath & " with value of " & sValue & ", Error code: " & iErrDesc)
	WSHLog "CriticalFailure", "Failed to create reg key " & sRegPath & " with value of " & sValue & ", Error code: " & iErrDesc
End Sub 

' ------   Wrapper 3.0.5b Functions/Subs section    -------

' Read Registry Key/Values Function
Function GetRegData(sRegKey, vDefault)
	On Error Resume Next
	Dim vReturn
	vReturn = oShell.RegRead(sRegKey)
	If Err.Number <> 0 Then
		GetRegData = vDefault
		Err.Clear
	Else
		GetRegData = vReturn
	End If
	On Error GoTo 0
End Function

' Get what OS, CSD version are we working with
Function GetOSInfo
	' Get what OS, CSD version are we working with
	On Error Resume Next
	Dim sPN, sCSDVer
	sPN = "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName"
	ProductName = GetRegData(sPN, "{default}")
	If ProductName = "{default}" Then
		iErrCode = "53"
		DebugLog.WriteLine(Now & "__ GetOSInfo function failed to read reg Key: " & sPN)
		WSHLog "CriticalFailure", "GetOSInfo function failed to read reg Key: " & sPN
	ElseIf ProductName = "" Then
		iErrCode = "53"
		DebugLog.WriteLine(Now & "__ GetOSInfo- function found a Null value in reg Value: " & sPN)
		WSHLog "CriticalFailure", "GetOSInfo- function found a Null value in reg Value: " & sPN
	End If
	If InStr(UCase(ProductName), "SERVER") Then
		IsServer = "True"	
	End If
	sCSDVer = "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CSDVersion"
	CSDver = GetRegData(sCSDVer, "{default}")
	If CSDver = "{default}" Then CSDver = "RTM"
	s64Bit = "0"
	If oFSO.FileExists(oProcessEnv("SYSTEMROOT") & "\SysWOW64\wscript.exe") Then
		s64Bit = "1"
	End If
	If s64Bit = "1" Then
		ProductName = ProductName & " x64"
	End If
	sMsg = " | |Scriptname: " & WScript.ScriptName & " |Hostname: " & sCN & "|OS: " & ProductName & ", " & CSDver & "." ' Do not remove this last & "." otherwise it wraps
	If s64Bit = "0" Then WSHLog "CriticalFailure", "This script does not support 32 bit OS."

	Dim DeviceInfo, oDomain
	Set DeviceInfo = oWMI.ExecQuery("SELECT DomainRole FROM Win32_ComputerSystem")
	If Err.Number = 0 Then
		For Each oDomain In DeviceInfo 
			If oDomain.DomainRole = 4 Or oDomain.DomainRole = 5 Then DC = "True"
		Next
	Else
		WSHLog "CriticalFailure", "Critical issue, could not connect to WMI, cimv2:Win32_ComputerSystem to obtain DomainRole information."
	End If
	Set DeviceInfo = Nothing
	On Error GoTo 0
End Function

' Get ID of who is running the script, as well as who is logged on (if anyone) Function
Function GetWhoIsRunningScript
	On Error Resume Next
	If sWMIFailed = "Failed" Then
		sMsg = sMsg & "|Script was executed utilizing account: (WMI not available) "
		sMsg = sMsg & "|Following account(s) are logged on during execution of script: (WMI not available) "
	Else
		Dim cProcessList, oProcess, cProperties, sNameOfUser, sUserDomain
		Set cProcessList = oWMI.ExecQuery("SELECT CommandLine,Name FROM Win32_Process WHERE " & "Name = 'cscript.exe' or Name = 'wscript.exe'")
		For Each oProcess in cProcessList
			If InStr(oProcess.CommandLine, Wscript.ScriptFullName) Then
				cProperties = oProcess.GetOwner(sNameOfUser,sUserDomain)
			End If
		Next
		If IsObject(DebugLog) Then DebugLog.WriteLine(Now & "__ Script was executed utilizing account: " & sUserDomain & "\" & sNameOfUser)
		sMsg = sMsg & "|Script was executed utilizing account: " & sUserDomain & "\" & sNameOfUser & "."	
	
		Dim cCS, oCS, LoggedInUser
		Set cCS = oWMI.ExecQuery("SELECT UserName FROM Win32_ComputerSystem")
		LoggedInUser = "NOONE"
		For Each oCS in cCS
			LoggedInUser = oCS.UserName
		Next
		If IsNull(LoggedInUser) Then
			If IsObject(DebugLog) Then DebugLog.WriteLine(Now & "__ Script detected the following account(s) are logged on during start of installation: No Logon detected")
			sMsg = sMsg & "|Following account(s) are logged on during execution of script: No Logon detected"
		Else
			If IsObject(DebugLog) Then DebugLog.WriteLine(Now & "__ Script detected the following account(s) are logged on during start of installation: " & LoggedInUser)
			sMsg = sMsg & "|Following account(s) are logged on during execution of script: " & LoggedInUser
		End If
	End If
	On Error GoTo 0
End Function

' Creates Corporate Engineering debug log (or append to existing log if run before) Function
Function CreateDebugLog(sCondition)
	If sCondition = "WriteLog" Then
		Call CreateDebugLogNow
	Else
		If (sCoreBlat <> "" Or sCoreBlat2 <> "" Or sCoreWMI <> "" Or sCoreInfo <> "" Or sCoreInfo2 <> "" Or sCoreInfo3 <> "") Then
			Call CreateDebugLogNow
		End If
	End If
End Function

Sub CreateDebugLogNow
	On Error Resume Next
	Const ForReading = 1 : Const ForWriting = 2 : Const ForAppending = 8
	Dim iErrDesc
	If NOT oFSO.FileExists(sDebugLog) Then
		Set DebugLog = oFSO.OpenTextFile(sDebugLog, ForWriting, True)
		If Err.Number <> 0 Then
			iErrCode = Err.Number
			iErrDesc = CStr(Err.Number) & " " & Err.Description & "."
			Call GetWhoIsRunningScript
			WSHLog "CriticalFailure", "Attempt to create Debuglog: " &  sDebugLog & ", failed. Error code: " & iErrDesc
		End If
	Else ' Append to existing log
		Set DebugLog = oFSO.OpenTextFile(sDebugLog, ForAppending, True)
		If Err.Number <> 0 Then
			iErrCode = Err.Number
			iErrDesc = CStr(Err.Number) & " " & Err.Description & "."
			Call GetWhoIsRunningScript
			WSHLog "CriticalFailure", "Attempt to append to Debuglog: " &  sDebugLog & ", failed. Error code: " & iErrDesc
		Else
			DebugLog.WriteLine(" ")
		End If
	End If
	WSHLog "Information", "Commencing installation of " & DEPLOYNAME & SIDE & RELEASE
	DebugLog.WriteLine(Now & "__ Commencing installation of " & DEPLOYNAME & SIDE & RELEASE & " on " & oProcessEnv("COMPUTERNAME"))
	DebugLog.WriteLine(Now & "__ Script/Path utilized: " & Wscript.ScriptFullName)
	If sCoreBlat <> "" Then	DebugLog.WriteLine(sCoreBlat)
	If sCoreBlat2 <> "" Then DebugLog.WriteLine(sCoreBlat2)
	If sCoreWMI <> "" Then DebugLog.WriteLine(sCoreWMI)
	If sCoreInfo <> "" Then DebugLog.WriteLine(sCoreInfo)
	If sCoreInfo2 <> "" Then DebugLog.WriteLine(sCoreInfo2)
	If sCoreInfo3 <> "" Then DebugLog.WriteLine(sCoreInfo3)
	Call GetWhoIsRunningScript
	On Error GoTo 0
End Sub

' Creates Corporate Engineering Logs directory(s) for script, package installation, and custom logging if they do not exist
Function CreateLogDirs
	If Not oFSO.FolderExists(sLogDir) Then Call CreateLogDir(sLogDir)
	If Not oFSO.FolderExists(sScriptsDir) Then Call CreateLogDir(sScriptsDir)
	If Not oFSO.FolderExists(sEmailDir) Then Call CreateLogDir(sEmailDir)
End Function

' Create Log directory's requested 
Sub CreateLogDir(sDir)
	On Error Resume Next
	Dim iErrDesc
	oFSO.CreateFolder(sDir)
	If Err.Number = 0 Then
		WSHLog "Success", sDir & " directory Created."
		If sDir = sLogDir Then sCoreInfo = Now & "__ " & sLogDir & " directory Created."
		If sDir = sScriptsDir Then sCoreInfo2 = Now & "__ " & sScriptsDir & " directory Created."
		If sDir = sEmailDir Then sCoreInfo3 = Now & "__ " & sEmailDir & " directory Created."
	Else
		iErrCode = Err.Number
		iErrDesc = CStr(Err.Number) & " " & Err.Description & "."
		Call GetWhoIsRunningScript
		oProcessEnv("SEE_MASK_NOZONECHECKS") = 1
		WSHLog "CriticalFailure", "Could not create " & sDir & " directory, Error # " & iErrDesc
	End If
	On Error GoTo 0
End Sub

' Copy blat file to system to ensure email alerts are available
Function CopyBlat
	On Error Resume Next
	Dim fn, vTimeThis, sLenghtTM, iErrDesc : fn = "blat.exe"
	If Not oFSO.FileExists(sBlat) Then
		If oFSO.FileExists(sLib & fn) Then
			vTimeThis = Now
			oFSO.CopyFile sLib & fn, sSystem32 & fn, True
			If Err.Number = 0 Then
				sLenghtTM = DateDiffToWords(vTimeThis,Now)
				WSHLog "Success", "Copied " & fn & " successfully. Took: " & sLenghtTM & "."
				sCoreBlat2 = Now & "__ Copied " & fn & " successfully. Took: " & sLenghtTM & "."
				If sDebugBlat = "True" Then Email "Copied " & fn & " successfully", "Copied " & fn & " successfully. Took: " & sLenghtTM & "."
			Else
				iErrCode = Err.Number
				iErrDesc = CStr(Err.Number) & " " & Err.Description & "."
				sBlat = sLib & "blat.exe"
				oProcessEnv("SEE_MASK_NOZONECHECKS") = 1
				WSHLog "Failure", "Could not copy " & fn & " from " & sLib & " to: " & sSystem32 & ", Error # " & iErrDesc & ". Will continue with network copy..."
				oProcessEnv.Remove("SEE_MASK_NOZONECHECKS")
			End If
		Else
			sCoreBlat = Now & "__ Blat not found, not in: " & sSystem32 & ", nor in: " & sLib & " no email status will be available."
			WSHLog "Failure", "Blat not found, not in: " & sSystem32 & ", nor in: " & sLib & " no email status will be available."
		End If
	End If
	On Error GoTo 0
End Function

' Get AD domain Name
Function GetDomainName
	On Error Resume Next
	Dim Info
	Set Info = CreateObject("AdSystemInfo")
	If Err.Number <> 0 Then
		iErrCode = Err.Number	
		Call CreateLogDirs
		If Not IsObject(DebugLog) Then Call CreateDebugLog("WriteLog")
		WSHLog "CriticalFailure", "Failed to create object AdSystemInfo, error: " & iErrCode
	Else
		sDomFQDN = Info.DomainDNSName
	End If
	On Error GoTo 0
End Function

' WSH Application Event Log, logging Function
Function WSHLog(EventType, Desc)
	On Error Resume Next
	If EventType = "Information" Then oShell.LogEvent 4, sScript & Chr(13) & "------------------------------------------------------" & Chr(13) & Desc
	If EventType = "Success" Then oShell.LogEvent 0, sScript & Chr(13) & "------------------------------------------------------" & Chr(13) & Desc
	If EventType = "Warning" Then
		oShell.LogEvent 2, sScript & Chr(13) & "------------------------------------------------------" & Chr(13) & Desc
		WScript.Sleep 500
		If sCoreBlat = "" Then Email sScript & " - " & EventType, Desc & " " & sMsg
	End If
	If EventType = "Failure" Then
		oShell.LogEvent 1, sScript & Chr(13) & "------------------------------------------------------" & Chr(13) & Desc
		WScript.Sleep 500
		If sCoreBlat = "" Then Email sScript & " - " & EventType, Desc & " " & sMsg
	End If
	If EventType = "CriticalFailure" Then
		oShell.LogEvent 1, sScript & Chr(13) &	"------------------------------------------------------" & Chr(13) & Desc & " Script exiting..."
		WScript.Sleep 500
		If Not(IsNull(iErrCode) Or IsEmpty(iErrCode)) Then
			If IsObject(DebugLog) Then DebugLog.WriteLine(Now & "__ Critical failure, exiting... Wrapper exit code : " & iErrCode)
			sPilot = "True" ' Force attachment of debuglog since we have a critical failure
			Call Cleanup(sScript & " - " & EventType, Desc & " " & sMsg)
			WScript.Quit(iErrCode)
		Else
			If IsObject(DebugLog) Then DebugLog.WriteLine(Now & "__ Critical failure exiting... Wrapper exit code  : " & Err.Number)
			sPilot = "True" ' Force attachment of debuglog since we have a critical failure
			Call Cleanup(sScript & " - " & EventType, Desc & " " & sMsg)
			WScript.Quit
		End If
	End If
	On Error GoTo 0
End Function

' EMail Results Function
Function Email(Subject, Body)
	On Error Resume Next
	Dim sTmpFile, sP1, sP2, iMail
	If Not(IsNull(sMailbox2) Or IsEmpty(sMailbox2)) Then
		sP1 = sMailbox1 & "," & sMailbox2
	Else
		sP1 = sMailbox1
	End If
	sTmpFile = sEmailDir & "\" & oFSO.GetTempName
	oFSO.CreateTextFile sTmpFile
	If Err.Number <> 0 Then
		sP2 = "-log " & Chr(34) & oProcessEnv("TEMP") & "\"
	Else
		oFSO.DeleteFile sTmpFile
		sP2 = "-log " & Chr(34) & sEmailDir & "\"
	End If

	Call Stamp
	If (sPilot = "True") And (IsObject(DebugLog)) Then
		iMail = oShell.Run(sBlat & " -body " & Chr(34) &_
		Body & Chr(34) & " -to " & sP1 & " -subject " & Chr(34) & Subject &_
		Chr(34) & " -server " & sRelayHost & " -f " & sCN & sFQDN & " -attacht " & Chr(34) & sDebugLog & Chr(34) & " -debug " & sP2 & sScript & "_" & altDate & "-" & altTime & ".log" & Chr(34) & " -try " & sTry, 2, True)
	Else
		iMail = oShell.Run(sBlat & " -body " & Chr(34) &_
		Body & Chr(34) & " -to " & sP1 & " -subject " & Chr(34) & Subject &_
		Chr(34) & " -server " & sRelayHost & " -f " & sCN & sFQDN & " -debug " & sP2 & sScript & "_" & altDate & "-" & altTime & ".log" & Chr(34) & " -try " & sTry, 2, True)
	End If
	On Error Goto 0
End Function

' Date/Time Stamping Function
Function Stamp
	On Error Resume Next
	Dim oSplit
	vDate = FormatDateTime(Now(), vbShortDate)
	altDate = Replace(Date, "/", "_")
	vTime = FormatDateTime(Now(), vbLongTime)
	altTime = Replace(Time, ":", ".")
	oSplit = Split(altTime)
	altTime = oSplit(0) & "." & oSplit(1)
	On Error GoTo 0
End Function

' Time into words Function
Function DateDiffToWords(d1, d2)
	Dim report, seconds
	report = ""
	seconds = abs(datediff("S", d1, d2))
	If seconds <= 0 Then
		report = "0 seconds"
	Else
		seconds = seconds mod (24*60*60)
		'divide by 3600 to get hours
		If seconds >= 3600 Then
			report = report & seconds\(3600) & " hour(s), "
		End If
		'use mod to get remaining seconds and divide to get minutes
		seconds = seconds mod (60*60)
		If seconds >= 60 Then
			report = report & seconds\(60) & " minute(s), "
		End If
		'use mod to get remaining seconds
		seconds = seconds Mod (60)
		report = report & seconds & " second(s)"
	End If
	DateDiffToWords = report
End Function

' Close up logs, objects, etc...
Function Cleanup(Subject, Body)
	' Close log(s)
	If IsObject(DebugLog) Then DebugLog.Close
	If (sPilot = "True") And (sCoreBlat = "") Then Email Subject, Body
	If oProcessEnv("SEE_MASK_NOZONECHECKS") = "1" Then oProcessEnv.Remove("SEE_MASK_NOZONECHECKS")
	
	'Clean Up
	Set oWMI = Nothing
	Set oProcessEnv = Nothing
	Set oFSO = Nothing
	Set oShell = Nothing
End Function

'' SIG '' Begin signature block
'' SIG '' MIITbgYJKoZIhvcNAQcCoIITXzCCE1sCAQExCzAJBgUr
'' SIG '' DgMCGgUAMGcGCisGAQQBgjcCAQSgWTBXMDIGCisGAQQB
'' SIG '' gjcCAR4wJAIBAQQQTvApFpkntU2P5azhDxfrqwIBAAIB
'' SIG '' AAIBAAIBAAIBADAhMAkGBSsOAwIaBQAEFAf8DnszoGDJ
'' SIG '' OGDnOos3/MvX+cuzoIIODDCCBBQwggL8oAMCAQICCwQA
'' SIG '' AAAAAS9O4VLXMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV
'' SIG '' BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNh
'' SIG '' MRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9i
'' SIG '' YWxTaWduIFJvb3QgQ0EwHhcNMTEwNDEzMTAwMDAwWhcN
'' SIG '' MjgwMTI4MTIwMDAwWjBSMQswCQYDVQQGEwJCRTEZMBcG
'' SIG '' A1UEChMQR2xvYmFsU2lnbiBudi1zYTEoMCYGA1UEAxMf
'' SIG '' R2xvYmFsU2lnbiBUaW1lc3RhbXBpbmcgQ0EgLSBHMjCC
'' SIG '' ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJTv
'' SIG '' Zfi1V5+gUw00BusJH7dHGGrL8Fvk/yelNNH3iRq/nrHN
'' SIG '' EkFuZtSBoIWLZFpGL5mgjXex4rxc3SLXamfQu+jKdN6L
'' SIG '' Tw2wUuWQW+tHDvHnn5wLkGU+F5YwRXJtOaEXNsq5oIwb
'' SIG '' TwgZ9oExrWEWpGLmtECew/z7lfb7tS6VgZjg78Xr2AJZ
'' SIG '' eHf3quNSa1CRKcX8982TZdJgYSLyBvsy3RZR+g79ijDw
'' SIG '' Fwmnu/MErquQ52zfeqn078RiJ19vmW04dKoRi9rfxxRM
'' SIG '' 6YWy7MJ9SiaP51a6puDPklOAdPQD7GiyYLyEIACDG6Hu
'' SIG '' tHQFwSmOYtBHsfrwU8wY+S47+XB+tCUCAwEAAaOB5TCB
'' SIG '' 4jAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB
'' SIG '' /wIBADAdBgNVHQ4EFgQURtg+/9zjvv+D5vSFm7DdatYU
'' SIG '' qcEwRwYDVR0gBEAwPjA8BgRVHSAAMDQwMgYIKwYBBQUH
'' SIG '' AgEWJmh0dHBzOi8vd3d3Lmdsb2JhbHNpZ24uY29tL3Jl
'' SIG '' cG9zaXRvcnkvMDMGA1UdHwQsMCowKKAmoCSGImh0dHA6
'' SIG '' Ly9jcmwuZ2xvYmFsc2lnbi5uZXQvcm9vdC5jcmwwHwYD
'' SIG '' VR0jBBgwFoAUYHtmGkUNl8qJUC99BM00qP/8/UswDQYJ
'' SIG '' KoZIhvcNAQEFBQADggEBAE5eVpAeRrTZSTHzuxc5KBvC
'' SIG '' Ft39QdwJBQSbb7KimtaZLkCZAFW16j+lIHbThjTUF8xV
'' SIG '' OseC7u+ourzYBp8VUN/NFntSOgLXGRr9r/B4XOBLxRjf
'' SIG '' OiQe2qy4qVgEAgcw27ASXv4xvvAESPTwcPg6XlaDzz37
'' SIG '' Dbz0xe2XnbnU26UnhOM4m4unNYZEIKQ7baRqC6GD/Sjr
'' SIG '' 2u8o9syIXfsKOwCr4CHr4i81bA+ONEWX66L3mTM1fsua
'' SIG '' irtFTec/n8LZivplsm7HfmX/6JLhLDGi97AnNkiPJm87
'' SIG '' 7k12H3nD5X+WNbwtDswBsI5//1GAgKeS1LNERmSMh08W
'' SIG '' YwcxS2Ow3/MwggSfMIIDh6ADAgECAhIRIdaZp2SXPvH4
'' SIG '' Qn7pGcxTQRQwDQYJKoZIhvcNAQEFBQAwUjELMAkGA1UE
'' SIG '' BhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2Ex
'' SIG '' KDAmBgNVBAMTH0dsb2JhbFNpZ24gVGltZXN0YW1waW5n
'' SIG '' IENBIC0gRzIwHhcNMTYwNTI0MDAwMDAwWhcNMjcwNjI0
'' SIG '' MDAwMDAwWjBgMQswCQYDVQQGEwJTRzEfMB0GA1UEChMW
'' SIG '' R01PIEdsb2JhbFNpZ24gUHRlIEx0ZDEwMC4GA1UEAxMn
'' SIG '' R2xvYmFsU2lnbiBUU0EgZm9yIE1TIEF1dGhlbnRpY29k
'' SIG '' ZSAtIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
'' SIG '' CgKCAQEAsBeuotO2BDBWHlgPse1VpNZUy9j2czrsXV6r
'' SIG '' Jf02pfqEw2FAxUa1WVI7QqIuXxNiEKlb5nPWkiWxfSPj
'' SIG '' BrOHOg5D8NcAiVOiETFSKG5dQHI88gl3p0mSl9RskKB2
'' SIG '' p/243LOd8gdgLE9YmABr0xVU4Prd/4AsXximmP/Uq+yh
'' SIG '' RVmyLm9iXeDZGayLV5yoJivZF6UQ0kcIGnAsM4t/aIAq
'' SIG '' taFda92NAgIpA6p8N7u7KU49U5OzpvqP0liTFUy5LauA
'' SIG '' o6Ml+6/3CGSwekQPXBDXX2E3qk5r09JTJZ2Cc/os+XKw
'' SIG '' qRk5KlD6qdA8OsroW+/1X1H0+QrZlzXeaoXmIwRCrwID
'' SIG '' AQABo4IBXzCCAVswDgYDVR0PAQH/BAQDAgeAMEwGA1Ud
'' SIG '' IARFMEMwQQYJKwYBBAGgMgEeMDQwMgYIKwYBBQUHAgEW
'' SIG '' Jmh0dHBzOi8vd3d3Lmdsb2JhbHNpZ24uY29tL3JlcG9z
'' SIG '' aXRvcnkvMAkGA1UdEwQCMAAwFgYDVR0lAQH/BAwwCgYI
'' SIG '' KwYBBQUHAwgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDov
'' SIG '' L2NybC5nbG9iYWxzaWduLmNvbS9ncy9nc3RpbWVzdGFt
'' SIG '' cGluZ2cyLmNybDBUBggrBgEFBQcBAQRIMEYwRAYIKwYB
'' SIG '' BQUHMAKGOGh0dHA6Ly9zZWN1cmUuZ2xvYmFsc2lnbi5j
'' SIG '' b20vY2FjZXJ0L2dzdGltZXN0YW1waW5nZzIuY3J0MB0G
'' SIG '' A1UdDgQWBBTUooRKOFoYf7pPMFC9ndV6h9YJ9zAfBgNV
'' SIG '' HSMEGDAWgBRG2D7/3OO+/4Pm9IWbsN1q1hSpwTANBgkq
'' SIG '' hkiG9w0BAQUFAAOCAQEAj6kakW0EpjcgDoOW3iPTa24f
'' SIG '' bt1kPWghIrX4RzZpjuGlRcckoiK3KQnMVFquxrzNY46z
'' SIG '' PVBI5bTMrs2SjZ4oixNKEaq9o+/Tsjb8tKFyv22XY3mM
'' SIG '' RLxwL37zvN2CU6sa9uv6HJe8tjecpBwwvKu8LUc235Ig
'' SIG '' A+hxxlj2dQWaNPALWVqCRDSqgOQvhPZHXZbJtsrKnbem
'' SIG '' uuRQ09Q3uLogDtDTkipbxFm7oW3bPM5EncE4Kq3jjb3N
'' SIG '' CXcaEL5nCgI2ZIi5sxsm7ueeYMRGqLxhM2zPTrmcuWrw
'' SIG '' nzf+tT1PmtNN/94gjk6Xpv2fCbxNyhh2ybBNhVDygNId
'' SIG '' BvVYBAexGDCCBU0wggQ1oAMCAQICEAPq4x/DNeCiI9mC
'' SIG '' 5DlK/ZUwDQYJKoZIhvcNAQELBQAwcjELMAkGA1UEBhMC
'' SIG '' VVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UE
'' SIG '' CxMQd3d3LmRpZ2ljZXJ0LmNvbTExMC8GA1UEAxMoRGln
'' SIG '' aUNlcnQgU0hBMiBBc3N1cmVkIElEIENvZGUgU2lnbmlu
'' SIG '' ZyBDQTAeFw0xODAzMjIwMDAwMDBaFw0yMTAzMjUxMjAw
'' SIG '' MDBaMIGJMQswCQYDVQQGEwJVUzERMA8GA1UECBMITmV3
'' SIG '' IFlvcmsxETAPBgNVBAcTCE5ldyBZb3JrMSkwJwYDVQQK
'' SIG '' EyBUaGUgT3JjaGFyZCBFbnRlcnByaXNlcyBOWSwgSW5j
'' SIG '' LjEpMCcGA1UEAxMgVGhlIE9yY2hhcmQgRW50ZXJwcmlz
'' SIG '' ZXMgTlksIEluYy4wggEiMA0GCSqGSIb3DQEBAQUAA4IB
'' SIG '' DwAwggEKAoIBAQC+uBrLcB6HSH12Fw3iQk0wnrBMR/Xm
'' SIG '' yH+oInoXTnQhhGhTle6PWioUUp4b7K6v1o5t/7oqqeU1
'' SIG '' TlZhFrXw20wGa0X5B2U07eeRyB9jWMyeDalbWPazUlfo
'' SIG '' gmtiGnHUTbj1+MtjtnIb2eVv7umcNoi7qhPzJvVMDIyC
'' SIG '' J4OYi6pIfV+nVjuGizGK3Ep43fj8eM1rpvpF4qxsPt/8
'' SIG '' mGgcbZVKVPERkezu8PhnqsQq6BKp6ncq+BbKaolzwRcV
'' SIG '' i7ZZzmpsnRFKU6jE06s0ptBmUCl/7WY69qMdO0Tu4RNY
'' SIG '' ItuihrFaWL2WLdjPANvTFG2xL2DgIz4LEWgSUVOu4aSw
'' SIG '' g39XAgMBAAGjggHFMIIBwTAfBgNVHSMEGDAWgBRaxLl7
'' SIG '' KgqjpepxA8Bg+S32ZXUOWDAdBgNVHQ4EFgQUFWb1jhPM
'' SIG '' z9PmvFrOw3FSTHHXyswwDgYDVR0PAQH/BAQDAgeAMBMG
'' SIG '' A1UdJQQMMAoGCCsGAQUFBwMDMHcGA1UdHwRwMG4wNaAz
'' SIG '' oDGGL2h0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9zaGEy
'' SIG '' LWFzc3VyZWQtY3MtZzEuY3JsMDWgM6Axhi9odHRwOi8v
'' SIG '' Y3JsNC5kaWdpY2VydC5jb20vc2hhMi1hc3N1cmVkLWNz
'' SIG '' LWcxLmNybDBMBgNVHSAERTBDMDcGCWCGSAGG/WwDATAq
'' SIG '' MCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2Vy
'' SIG '' dC5jb20vQ1BTMAgGBmeBDAEEATCBhAYIKwYBBQUHAQEE
'' SIG '' eDB2MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp
'' SIG '' Y2VydC5jb20wTgYIKwYBBQUHMAKGQmh0dHA6Ly9jYWNl
'' SIG '' cnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFNIQTJBc3N1
'' SIG '' cmVkSURDb2RlU2lnbmluZ0NBLmNydDAMBgNVHRMBAf8E
'' SIG '' AjAAMA0GCSqGSIb3DQEBCwUAA4IBAQAgdQ4jSO4z+O79
'' SIG '' 4AlCpzGIOmn8XT2WTDPXg5b5lPg3Z22YMQ5JHmRzWXax
'' SIG '' mxFAhD8kCSPGhL+MfIJMZt9hTbdM8WUinqKLNvbVDiIK
'' SIG '' O1H9Vnwz5VJ03qGRExixZOiULeeNDmj6kh4KcqFtzio0
'' SIG '' M/4GARMYiwyBg1CNlD59Jvz3RzFZugm3K+yXU1JlznMJ
'' SIG '' 8QoY0MWHsiHV/nJssNnMWCpvR7S0wC5pSn3DXeS7XVma
'' SIG '' SAc3xavwCg5sJG3LS2LKwx12ksbj+mfz+t2RqQIE5iFz
'' SIG '' 81EVhK7qbF8cbRKhgtcqbCjqr3dsj4lfMpe/+OcXR7DI
'' SIG '' wWGGyquVUv0vqiaTph2zMYIEzjCCBMoCAQEwgYYwcjEL
'' SIG '' MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IElu
'' SIG '' YzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTExMC8G
'' SIG '' A1UEAxMoRGlnaUNlcnQgU0hBMiBBc3N1cmVkIElEIENv
'' SIG '' ZGUgU2lnbmluZyBDQQIQA+rjH8M14KIj2YLkOUr9lTAJ
'' SIG '' BgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIBDDEKMAigAoAA
'' SIG '' oQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAc
'' SIG '' BgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAjBgkq
'' SIG '' hkiG9w0BCQQxFgQUpcd1Lk0Ie1U3qgvgFlcfCP0Dz7Aw
'' SIG '' DQYJKoZIhvcNAQEBBQAEggEAM809vLKfyh/CqE/u6k6B
'' SIG '' guaaqhq7GfQsC1C2tkALgs7RRcVQsMGjJHIMhuuXyYxJ
'' SIG '' JG6BnOoeH5j/6XkYt1CpX09jVHq3k/CqFpSlIZ/9GT5B
'' SIG '' OmhEMUAe8KI0LO/rCvF4agofsSCZgSU4P6jE0KqujFoU
'' SIG '' jXn+tDK3AZsTPtPr/BpH4yPV15behomJefeUxtVDMTvP
'' SIG '' EO7RCL7LFpnaqzLWSuchTs+zgdbAkn0o1cKseHA3ZO+O
'' SIG '' jZLRY1FiwIe8jfJkJ19KE0+r8wwLorEtZrSsaU9A24sj
'' SIG '' ClR7xPw1XV7gh0Wl0XY5j9HcXkP9aAN2TQxUDHmY4xZb
'' SIG '' p+mOaEI15UbjC6GCAqIwggKeBgkqhkiG9w0BCQYxggKP
'' SIG '' MIICiwIBATBoMFIxCzAJBgNVBAYTAkJFMRkwFwYDVQQK
'' SIG '' ExBHbG9iYWxTaWduIG52LXNhMSgwJgYDVQQDEx9HbG9i
'' SIG '' YWxTaWduIFRpbWVzdGFtcGluZyBDQSAtIEcyAhIRIdaZ
'' SIG '' p2SXPvH4Qn7pGcxTQRQwCQYFKw4DAhoFAKCB/TAYBgkq
'' SIG '' hkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJ
'' SIG '' BTEPFw0xODA0MTIwMjA2MDhaMCMGCSqGSIb3DQEJBDEW
'' SIG '' BBQb9lO0+5UKCd0EDaDBN7N40RECKjCBnQYLKoZIhvcN
'' SIG '' AQkQAgwxgY0wgYowgYcwgYQEFGO4L6th9YOQlpUFCwAk
'' SIG '' nFApM+x5MGwwVqRUMFIxCzAJBgNVBAYTAkJFMRkwFwYD
'' SIG '' VQQKExBHbG9iYWxTaWduIG52LXNhMSgwJgYDVQQDEx9H
'' SIG '' bG9iYWxTaWduIFRpbWVzdGFtcGluZyBDQSAtIEcyAhIR
'' SIG '' IdaZp2SXPvH4Qn7pGcxTQRQwDQYJKoZIhvcNAQEBBQAE
'' SIG '' ggEAibrkw3GSWJvc0cdVwNQSKlsFgmHgMJx+1DBkGerd
'' SIG '' jgPU+8nvqIFtLi/VWK09VXpaG4qulYGRnv/RzthwGiqu
'' SIG '' VnQzVDXgkizO4s15sCi6qhabKyP5SWn6spU3izk7gtp/
'' SIG '' oNNOQECzDhlQfSzHrQAlV2OPt5I+pzL/yB1hglaAiKE/
'' SIG '' S1/qBdz1dmwU6gTtaYb+YTO9k0JCUkOJwkn3OYtnFvGi
'' SIG '' GS1Oxzr0P3W2NZbnwzh7IW6blrCI8YwZapMJYjU41aZU
'' SIG '' kIR2uNamAyDJVDe1YAjRIYMg/zYI3XFS3exMhTxfV8a3
'' SIG '' EMYhf4cgEqvrQc0gFPqyg5776OPyEHG46SSVyw==
'' SIG '' End signature block
