Compare commits

...

39 Commits

Author SHA1 Message Date
Riley McArdle
0ff00e59ba Add setting for update channel. 2013-03-04 21:52:28 -06:00
Riley McArdle
850a342e38 Prepare CHANGELOG.TXT for release of 1.71 Beta 1. 2013-03-04 15:54:49 -06:00
Riley McArdle
1caba06aca Fix issue MR-362 - Rename 'Screenshot Manager' to 'Screenshots' on the View menu to match Panel name 2013-03-04 13:20:49 -06:00
Riley McArdle
a115196cee Disable Fullscreen item on tab context menu if redirect keys is enabled for RDP connection. Fix automatic RDP resize when redirect keys is enabled. Fix automatic RDP resize when SmartSize setting is changed. 2013-03-04 12:55:46 -06:00
Riley McArdle
5f451de94e Fix issue MR-352 - Passwords with " (quotation mark) and # (hash key) characters make mRemoteNG to open PuttyNG dialog 2013-03-02 01:41:00 -06:00
Riley McArdle
a4921fc564 Add automatic resizing of RDP connections when the window is resized or when toggling full screen mode. 2013-03-01 17:04:28 -06:00
Riley McArdle
7d1d03e8cd Fix connection bar being shown when connecting to an RDP connection with redirect key combinations enabled. 2013-02-28 22:46:07 -06:00
Riley McArdle
92c18a45ba Merge branch 'release/1.70' into develop 2013-02-28 14:57:41 -06:00
Riley McArdle
a61fb5c6d6 Fix issue MR-350 - VerifyDatabaseVersion (Config.Connections.Save) failed. Version string portion was too short or too long. 2013-02-28 14:56:51 -06:00
Riley McArdle
e1deaf73ea Fix issue MR-117 - Remote Session Info Window / Tab does not populate 2013-02-27 19:20:49 -06:00
Riley McArdle
7d6d602477 Merge branch 'release/1.70' into develop
Conflicts:
	CHANGELOG.TXT
2013-02-27 14:44:17 -06:00
Riley McArdle
b0439adee4 Fix issue MR-339 - Connection group collapses with just one click
(cherry picked from commit 0a7c88a853)

Conflicts:
	CHANGELOG.TXT
2013-02-27 14:41:53 -06:00
Riley McArdle
0a7c88a853 Fix issue MR-339 - Connection group collapses with just one click 2013-02-27 14:39:27 -06:00
Riley McArdle
b735e6d3e4 Fix tabs not closing on double-click when the active tab is a PuTTY connection.
(cherry picked from commit 960ecba12a)

Conflicts:
	CHANGELOG.TXT
2013-02-27 14:15:20 -06:00
Riley McArdle
960ecba12a Fix tabs not closing on double-click when the active tab is a PuTTY connection. 2013-02-27 14:12:49 -06:00
Riley McArdle
3988820db9 Fix issue MR-342 - Incorrect view in config pane of new connection after viewing default inheritance 2013-02-26 21:06:47 -06:00
Riley McArdle
22ea7055c9 Fix issue MR-142 - Start of mRemoteNG takes about one minute and consumes excessive CPU 2013-02-26 20:46:49 -06:00
Riley McArdle
edba3fbea0 Merge branch 'release/1.70' into develop
Conflicts:
	CHANGELOG.TXT
	mRemoteV1/Forms/frmOptions.resx
	mRemoteV1/Forms/frmOptions.vb
2013-02-26 20:02:18 -06:00
Riley McArdle
51e4bc7eae Move search prompt to resource string. 2013-02-26 16:19:06 -06:00
Riley McArdle
3e680235ee Improve appearance and discoverability of the connection search box. 2013-02-26 16:13:45 -06:00
Riley McArdle
d2459de700 Fix issue MR-344 - Move "Always show panel tabs" option 2013-02-26 15:16:00 -06:00
Riley McArdle
f9f265b409 Fix issue MR-340 - Object reference not set to an instance of an object. 2013-02-26 15:08:55 -06:00
Riley McArdle
c218f0362e Merge branch 'release/1.70' into develop
Conflicts:
	CHANGELOG.TXT
2013-02-25 18:47:20 -06:00
Riley McArdle
fb68ed099e Update CHANGELOG.TXT for release of 1.70 Release Candidate 2. 2013-02-25 18:33:34 -06:00
Riley McArdle
01133b3d9f Fix issue MR-338 - PuTTYNG crashing on fresh install of mRemoteNG 2013-02-25 18:32:54 -06:00
Riley McArdle
52461b758b Revert "Fixed issue MR-229 - Integrated PuTTY doesn't work in Windows 8 RP"
This reverts commit c29c5015d5.
2013-02-25 18:32:07 -06:00
Riley McArdle
3bc5ceede4 Fix issue MR-332 - Can't select different tab with one click after disconnecting existing tab
(cherry picked from commit 73f71050a0)

Conflicts:
	CHANGELOG.TXT
2013-02-25 18:16:22 -06:00
Riley McArdle
a3c9c667b4 Add detection of newer versions of connection files and database schemata and refuse to open them to avoid data loss. 2013-02-24 16:46:37 -06:00
Riley McArdle
73f71050a0 Fix issue MR-332 - Can't select different tab with one click after disconnecting existing tab 2013-02-24 16:02:04 -06:00
Riley McArdle
94d901ec4c Increment version to 1.71. 2013-02-24 15:40:19 -06:00
Riley McArdle
9e67f36615 Fix issue MR-330 - Portable version saves log to user's profile folder 2013-02-24 15:38:48 -06:00
Riley McArdle
bf6f166d8f Add feature MR-329 - Create Option to disable the "Quick: " prefix 2013-02-24 13:15:44 -06:00
Riley McArdle
1de5ab43d6 Fix issue MR-67 - Sort does not recursively sort 2013-02-24 12:49:38 -06:00
Riley McArdle
39dd75dbde Fix issue MR-121 - Config pane not sorting properties correctly when switching between alphabetical and categorized view 2013-02-24 00:04:45 -06:00
Riley McArdle
b509f75c17 Fix issue MR-130 - Issues duplicating folders 2013-02-23 23:38:16 -06:00
Riley McArdle
877649b80a Fix issue MR-158 - Password field not accepting Pipe 2013-02-23 22:14:48 -06:00
Riley McArdle
b5846f2286 Fix issue MR-333 - Unnecessary prompt for 'close all open connections?' 2013-02-23 21:34:48 -06:00
Riley McArdle
80dd98e7fb Merge branch 'release/1.70' into develop 2013-02-23 21:03:21 -06:00
Riley McArdle
80f35cea71 Refactor Security.Crypt.Decrypt(). 2013-02-21 21:08:19 -06:00
31 changed files with 922 additions and 497 deletions

View File

@@ -1,4 +1,34 @@
1.70 (2013-02-22):
1.71 Beta 1 (2013-03-04):
Added feature MR-329 - Create Option to disable the "Quick: " prefix
Fixed issue MR-67 - Sort does not recursively sort
Fixed issue MR-117 - Remote Session Info Window / Tab does not populate
Fixed issue MR-121 - Config pane not sorting properties correctly when switching between alphabetical and categorized view
Fixed issue MR-130 - Issues duplicating folders
Fixed issue MR-142 - Start of mRemoteNG takes about one minute and consumes excessive CPU
Fixed issue MR-158 - Password field not accepting Pipe
Fixed issue MR-330 - Portable version saves log to user's profile folder
Fixed issue MR-333 - Unnecessary prompt for 'close all open connections?'
Fixed issue MR-342 - Incorrect view in config pane of new connection after viewing default inheritance
Fixed issue MR-352 - Passwords with " (quotation mark) and # (hash key) characters make mRemoteNG to open PuttyNG dialog
Fixed issue MR-362 - Rename 'Screenshot Manager' to 'Screenshots' on the View menu to match Panel name
Added detection of newer versions of connection files and database schemata. mRemoteNG will now refuse to open them to avoid data loss.
Improved appearance and discoverability of the connection search box.
If RDC 7.0 or higher is installed, the connection bar is no longer briefly shown when connecting to an RDP connection with redirect key combinations enabled.
If RDC 8.0 or higher is installed, RDP connections automatically adjust their size when the window is resized or when toggling full screen mode.
1.70 Release Candidate 3 (XXXX-XX-XX):
Fixed issue MR-339 - Connection group collapses with just one click
Fixed issue MR-340 - Object reference not set to an instance of an object.
Fixed issue MR-344 - Move "Always show panel tabs" option
Fixed issue MR-350 - VerifyDatabaseVersion (Config.Connections.Save) failed. Version string portion was too short or too long.
Fixed tabs not closing on double-click when the active tab is a PuTTY connection.
1.70 Release Candidate 2 (2013-02-25):
Fixed issue MR-332 - Can't select different tab with one click after disconnecting existing tab
Fixed issue MR-338 - PuTTYNG crashing on fresh install of mRemoteNG
Re-enabled PuTTYNG integration enhancements on Windows 8
1.70 Release Candidate 1 (2013-02-22):
Fixed issue MR-183 - Error trying to save connections when using SQL - Invalid column name _parentConstantId
Fixed issue MR-225 - Tabs do not open in a panel until multiple panels are displayed.
Fixed issue MR-229 - Integrated PuTTY doesn't work in Windows 8 RP

Binary file not shown.

Binary file not shown.

View File

@@ -25,11 +25,18 @@ Namespace App
Public Class Update
Public Shared ReadOnly URL As String = "http://update.mremoteng.org/"
#If DEBUG Then
Public Shared ReadOnly File As String = "update-debug.txt"
#Else
Public Shared ReadOnly File As String = "update.txt"
#End If
Public Shared ReadOnly Property File As String
Get
Select Case My.Settings.UpdateChannel.ToLowerInvariant()
Case "beta"
Return "update-beta.txt"
Case "debug"
Return "update-debug.txt"
Case Else
Return "update.txt"
End Select
End Get
End Property
End Class
Public Class Connections

View File

@@ -1,7 +1,6 @@
Imports log4net
Imports mRemoteNG.Messages
Imports mRemoteNG.Connection
Imports mRemoteNG.Config.Settings
Imports mRemoteNG.Tools
Imports WeifenLuo.WinFormsUI.Docking
Imports System.IO
@@ -452,30 +451,55 @@ Namespace App
End Sub
Public Shared Sub CreateLogger()
log4net.Config.XmlConfigurator.Configure(New FileInfo("mRemoteNG.exe.config"))
Log = log4net.LogManager.GetLogger("mRemoteNG.Log")
Log.InfoFormat("{0} started.", My.Application.Info.ProductName)
Log.InfoFormat("Command Line: {0}", Environment.GetCommandLineArgs)
Try
Dim servicePack As Integer
For Each managementObject As ManagementObject In New ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem").Get()
servicePack = managementObject.GetPropertyValue("ServicePackMajorVersion")
If servicePack = 0 Then
Log.InfoFormat("{0} {1}", managementObject.GetPropertyValue("Caption").Trim, managementObject.GetPropertyValue("OSArchitecture"))
Else
Log.InfoFormat("{0} Service Pack {1} {2}", managementObject.GetPropertyValue("Caption").Trim, servicePack.ToString, managementObject.GetPropertyValue("OSArchitecture"))
End If
Next
Catch ex As Exception
Log.WarnFormat("Error retrieving operating system information from WMI. {0}", ex.Message)
End Try
Log.InfoFormat("Microsoft .NET Framework {0}", System.Environment.Version.ToString)
log4net.Config.XmlConfigurator.Configure()
Dim logFilePath As String
#If Not PORTABLE Then
Log.InfoFormat("{0} {1}", My.Application.Info.ProductName.ToString, My.Application.Info.Version.ToString)
logFilePath = Path.Combine(GetFolderPath(SpecialFolder.LocalApplicationData), Application.ProductName)
#Else
log.InfoFormat("{0} {1} {2}", My.Application.Info.ProductName.ToString, My.Application.Info.Version.ToString, My.Language.strLabelPortableEdition)
logFilePath = Application.StartupPath
#End If
Log.InfoFormat("System Culture: {0}/{1}", Threading.Thread.CurrentThread.CurrentUICulture.Name, Threading.Thread.CurrentThread.CurrentUICulture.NativeName)
Dim logFileName As String = Path.ChangeExtension(Application.ProductName, ".log")
Dim logFile As String = Path.Combine(logFilePath, logFileName)
Dim repository As Repository.ILoggerRepository = LogManager.GetRepository()
Dim appenders As Appender.IAppender() = repository.GetAppenders()
Dim fileAppender As Appender.FileAppender
For Each appender As Appender.IAppender In appenders
fileAppender = TryCast(appender, Appender.FileAppender)
If Not (fileAppender Is Nothing OrElse Not fileAppender.Name = "LogFileAppender") Then
fileAppender.File = logFile
fileAppender.ActivateOptions()
End If
Next
Log = LogManager.GetLogger("Logger")
If My.Settings.WriteLogFile Then
#If Not PORTABLE Then
Log.InfoFormat("{0} {1} starting.", Application.ProductName, Application.ProductVersion)
#Else
Log.InfoFormat("{0} {1} {2} starting.", Application.ProductName, Application.ProductVersion, My.Language.strLabelPortableEdition)
#End If
Log.InfoFormat("Command Line: {0}", Environment.GetCommandLineArgs)
Try
Dim servicePack As Integer
For Each managementObject As ManagementObject In New ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem").Get()
servicePack = managementObject.GetPropertyValue("ServicePackMajorVersion")
If servicePack = 0 Then
Log.InfoFormat("{0} {1}", managementObject.GetPropertyValue("Caption").Trim, managementObject.GetPropertyValue("OSArchitecture"))
Else
Log.InfoFormat("{0} Service Pack {1} {2}", managementObject.GetPropertyValue("Caption").Trim, servicePack.ToString, managementObject.GetPropertyValue("OSArchitecture"))
End If
Next
Catch ex As Exception
Log.WarnFormat("Error retrieving operating system information from WMI. {0}", ex.Message)
End Try
Log.InfoFormat("Microsoft .NET CLR {0}", Version.ToString)
Log.InfoFormat("System Culture: {0}/{1}", Thread.CurrentThread.CurrentUICulture.Name, Thread.CurrentThread.CurrentUICulture.NativeName)
End If
End Sub
Public Shared Sub UpdateCheck()
@@ -1482,7 +1506,12 @@ Namespace App
If Not String.IsNullOrEmpty(Uri.Host) Then
Dim newConnectionInfo As New Connection.Info
newConnectionInfo.Name = String.Format(My.Language.strQuick, Uri.Host)
If My.Settings.IdentifyQuickConnectTabs Then
newConnectionInfo.Name = String.Format(My.Language.strQuick, Uri.Host)
Else
newConnectionInfo.Name = Uri.Host
End If
newConnectionInfo.Protocol = Protocol
newConnectionInfo.Hostname = Uri.Host
If Uri.Port = -1 Then

View File

@@ -5,6 +5,7 @@ Imports mRemoteNG.App.Runtime
Imports System.Data
Imports System.Data.SqlClient
Imports System.IO
Imports PSTaskDialog
Namespace Config
Namespace Connections
@@ -206,7 +207,12 @@ Namespace Config
sqlRd.Read()
End If
Me.confVersion = Convert.ToDouble(sqlRd.Item("confVersion"), CultureInfo.InvariantCulture)
confVersion = Convert.ToDouble(sqlRd.Item("confVersion"), CultureInfo.InvariantCulture)
Const maxSupportedSchemaVersion As Double = 2.4
If confVersion > maxSupportedSchemaVersion Then
cTaskDialog.ShowTaskDialogBox(frmMain, Application.ProductName, "Incompatible database schema", String.Format("The database schema on the server is not supported. Please upgrade to a newer version of {0}.", Application.ProductName), String.Format("Schema Version: {1}{0}Highest Supported Version: {2}", vbNewLine, confVersion.ToString(), maxSupportedSchemaVersion.ToString()), "", "", "", "", eTaskDialogButtons.OK, eSysIcons.Error, Nothing)
Throw New Exception(String.Format("Incompatible database schema (schema version {0}).", confVersion))
End If
Dim rootNode As TreeNode
rootNode = New TreeNode(sqlRd.Item("Name"))
@@ -235,6 +241,8 @@ Namespace Config
sqlRd.Close()
Windows.treeForm.tvConnections.BeginUpdate()
' SECTION 3. Populate the TreeView with the DOM nodes.
AddNodesFromSQL(rootNode)
'AddNodeFromXml(xDom.DocumentElement, Me._RootTreeNode)
@@ -248,6 +256,8 @@ Namespace Config
End If
Next
Windows.treeForm.tvConnections.EndUpdate()
'open connections from last mremote session
If My.Settings.OpenConsFromLastSession = True And My.Settings.NoReconnect = False Then
For Each conI As Connection.Info In Me._ConnectionList
@@ -265,10 +275,12 @@ Namespace Config
App.Runtime.IsConnectionsFileLoaded = True
'App.Runtime.Windows.treeForm.InitialRefresh()
sqlCon.Close()
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strLoadFromSqlFailed & vbNewLine & ex.Message, True)
Finally
If sqlCon IsNot Nothing Then
sqlCon.Close()
End If
End Try
End Sub
@@ -644,6 +656,12 @@ Namespace Config
MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, My.Language.strOldConffile)
End If
Const maxSupportedConfVersion As Double = 2.4
If confVersion > maxSupportedConfVersion Then
cTaskDialog.ShowTaskDialogBox(frmMain, Application.ProductName, "Incompatible connection file format", String.Format("The format of this connection file is not supported. Please upgrade to a newer version of {0}.", Application.ProductName), String.Format("{1}{0}File Format Version: {2}{0}Highest Supported Version: {3}", vbNewLine, ConnectionFileName, confVersion.ToString(), maxSupportedConfVersion.ToString()), "", "", "", "", eTaskDialogButtons.OK, eSysIcons.Error, Nothing)
Throw New Exception(String.Format("Incompatible connection file format (file format version {0}).", confVersion))
End If
' SECTION 2. Initialize the treeview control.
Dim rootNode As TreeNode
@@ -693,6 +711,8 @@ Namespace Config
Me._RootTreeNode.SelectedImageIndex = Images.Enums.TreeImage.Root
End If
Windows.treeForm.tvConnections.BeginUpdate()
' SECTION 3. Populate the TreeView with the DOM nodes.
AddNodeFromXML(xDom.DocumentElement, Me._RootTreeNode)
@@ -705,6 +725,8 @@ Namespace Config
End If
Next
Windows.treeForm.tvConnections.EndUpdate()
'open connections from last mremote session
If My.Settings.OpenConsFromLastSession = True And My.Settings.NoReconnect = False Then
For Each conI As Connection.Info In Me._ConnectionList

View File

@@ -80,7 +80,7 @@ Namespace Config
If (Not sqlDataReader.HasRows) Then Return True ' assume new empty database
sqlDataReader.Read()
databaseVersion = New System.Version(Convert.ToDouble(sqlDataReader.Item("confVersion"), CultureInfo.InvariantCulture))
databaseVersion = New Version(Convert.ToString(sqlDataReader.Item("confVersion"), CultureInfo.InvariantCulture))
sqlDataReader.Close()

View File

@@ -17,14 +17,24 @@ Namespace Connection
End Set
End Property
Private _InterfaceControl As Connection.InterfaceControl
Public Property InterfaceControl() As Connection.InterfaceControl
Private WithEvents _connectionWindow As UI.Window.Connection
Public Property ConnectionWindow As UI.Window.Connection
Get
Return Me._InterfaceControl
Return _connectionWindow
End Get
Set(ByVal value As Connection.InterfaceControl)
Me._InterfaceControl = value
Set(value As UI.Window.Connection)
_connectionWindow = value
End Set
End Property
Private _interfaceControl As InterfaceControl
Public Property InterfaceControl() As InterfaceControl
Get
Return _interfaceControl
End Get
Set(ByVal value As InterfaceControl)
_interfaceControl = value
ConnectionWindow = TryCast(_interfaceControl.GetContainerControl(), UI.Window.Connection)
End Set
End Property
@@ -62,17 +72,29 @@ Namespace Connection
End Try
End Sub
Public Overridable Sub ResizeBegin(ByVal sender As System.Object, ByVal e As EventArgs) Handles _connectionWindow.ResizeBegin
End Sub
Public Overridable Sub Resize(ByVal sender As System.Object, ByVal e As EventArgs) Handles _connectionWindow.Resize
End Sub
Public Overridable Sub ResizeEnd(ByVal sender As System.Object, ByVal e As EventArgs) Handles _connectionWindow.ResizeEnd
End Sub
Public Overridable Function SetProps() As Boolean
Try
Me._InterfaceControl.Parent.Tag = Me._InterfaceControl
Me._InterfaceControl.Show()
Me._interfaceControl.Parent.Tag = Me._interfaceControl
Me._interfaceControl.Show()
If Me._Control IsNot Nothing Then
Me._Control.Name = Me._Name
Me._Control.Parent = Me._InterfaceControl
Me._Control.Location = Me._InterfaceControl.Location
Me._Control.Parent = Me._interfaceControl
Me._Control.Location = Me._interfaceControl.Location
Me._Control.Size = Me.InterfaceControl.Size
Me._Control.Anchor = Me._InterfaceControl.Anchor
Me._Control.Anchor = Me._interfaceControl.Anchor
End If
Return True
@@ -92,10 +114,6 @@ Namespace Connection
Me.Close()
End Sub
Public Overridable Sub Resize()
End Sub
Public Overridable Sub Close()
Dim t As New Thread(AddressOf CloseBG)
t.SetApartmentState(Threading.ApartmentState.STA)

View File

@@ -1,6 +1,7 @@
Imports mRemoteNG.App.Native
Imports System.Threading
Imports mRemoteNG.App.Runtime
Imports mRemoteNG.Tools
Namespace Connection
Namespace Protocol
@@ -86,8 +87,9 @@ Namespace Connection
Return Nothing
End If
IntAppProcessStartInfo.UseShellExecute = False
IntAppProcessStartInfo.FileName = _IntAppPath
IntAppProcessStartInfo.Arguments = Arguments
IntAppProcessStartInfo.Arguments = CommandLineArguments.EscapeBackslashes(Arguments)
IntAppProcess = Process.Start(IntAppProcessStartInfo)
IntAppProcess.EnableRaisingEvents = True
@@ -120,7 +122,7 @@ Namespace Connection
SetWindowLong(Me.IntAppHandle, 0, WS_VISIBLE)
ShowWindow(Me.IntAppHandle, SW_SHOWMAXIMIZED)
Resize()
Resize(Me, New EventArgs)
MyBase.Connect()
Return True
@@ -139,8 +141,9 @@ Namespace Connection
End Try
End Sub
Public Overrides Sub Resize()
Public Overrides Sub Resize(ByVal sender As Object, ByVal e As EventArgs)
Try
If InterfaceControl.Size = Size.Empty Then Return
MoveWindow(IntAppHandle, -SystemInformation.FrameBorderSize.Width, -(SystemInformation.CaptionHeight + SystemInformation.FrameBorderSize.Height), Me.InterfaceControl.Width + (SystemInformation.FrameBorderSize.Width * 2), Me.InterfaceControl.Height + SystemInformation.CaptionHeight + (SystemInformation.FrameBorderSize.Height * 2), True)
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strIntAppResizeFailed & vbNewLine & ex.Message, True)

View File

@@ -6,6 +6,8 @@ Imports System.Threading
Imports Microsoft.Win32
Imports System.Drawing
Imports mRemoteNG.App.Runtime
Imports System.Text.RegularExpressions
Imports mRemoteNG.Tools
Namespace Connection
Namespace Protocol
@@ -111,45 +113,53 @@ Namespace Connection
PuttyProcess = New Process
With PuttyProcess.StartInfo
.UseShellExecute = False
.FileName = _PuttyPath
Select Case _PuttyProtocol
Case Putty_Protocol.raw
.Arguments = "-load " & """" & PuttyEscapeArgument(InterfaceControl.Info.PuttySession) & """" & " -" & _PuttyProtocol.ToString & " -P " & InterfaceControl.Info.Port & " """ & InterfaceControl.Info.Hostname & """"
Case Putty_Protocol.rlogin
.Arguments = "-load " & """" & PuttyEscapeArgument(InterfaceControl.Info.PuttySession) & """" & " -" & _PuttyProtocol.ToString & " -P " & InterfaceControl.Info.Port & " """ & InterfaceControl.Info.Hostname & """"
Case Putty_Protocol.ssh
Dim userArgument As String = ""
Dim passwordArgument As String = ""
Dim arguments As New CommandLineArguments
arguments.EscapeForShell = False
arguments.Add("-load", InterfaceControl.Info.PuttySession)
arguments.Add("-" & _PuttyProtocol.ToString)
If _PuttyProtocol = Putty_Protocol.ssh Then
Dim username As String = ""
Dim password As String = ""
If Not String.IsNullOrEmpty(InterfaceControl.Info.Username) Then
username = InterfaceControl.Info.Username
Else
If My.Settings.EmptyCredentials = "windows" Then
userArgument = " -l """ & Environment.UserName & """"
username = Environment.UserName
ElseIf My.Settings.EmptyCredentials = "custom" Then
userArgument = " -l """ & My.Settings.DefaultUsername & """"
passwordArgument = " -pw """ & PuttyEscapeArgument(Security.Crypt.Decrypt(My.Settings.DefaultPassword, App.Info.General.EncryptionKey)) & """"
username = My.Settings.DefaultUsername
End If
End If
If InterfaceControl.Info.Username <> "" Then
userArgument = " -l """ & InterfaceControl.Info.Username & """"
If Not String.IsNullOrEmpty(InterfaceControl.Info.Password) Then
password = InterfaceControl.Info.Password
Else
If My.Settings.EmptyCredentials = "custom" Then
password = Security.Crypt.Decrypt(My.Settings.DefaultPassword, App.Info.General.EncryptionKey)
End If
End If
If InterfaceControl.Info.Password <> "" Then
passwordArgument = " -pw """ & PuttyEscapeArgument(InterfaceControl.Info.Password) & """"
End If
.Arguments = "-load " & """" & PuttyEscapeArgument(InterfaceControl.Info.PuttySession) & """" & " -" & _PuttyProtocol.ToString & " -" & _PuttySSHVersion & userArgument & passwordArgument & " -P " & InterfaceControl.Info.Port & " """ & InterfaceControl.Info.Hostname & """"
Case Putty_Protocol.telnet
.Arguments = "-load " & """" & PuttyEscapeArgument(InterfaceControl.Info.PuttySession) & """" & " -" & _PuttyProtocol.ToString & " -P " & InterfaceControl.Info.Port & " """ & InterfaceControl.Info.Hostname & """"
Case Putty_Protocol.serial
.Arguments = "-load " & """" & PuttyEscapeArgument(InterfaceControl.Info.PuttySession) & """" & " -" & _PuttyProtocol.ToString & " -P " & InterfaceControl.Info.Port & " """ & InterfaceControl.Info.Hostname & """"
End Select
If _isPuttyNg Then
.Arguments = .Arguments & " -hwndparent " & InterfaceControl.Handle.ToString()
arguments.Add("-" & _PuttySSHVersion)
arguments.Add("-l", username)
arguments.Add("-pw", password)
End If
arguments.Add("-P", InterfaceControl.Info.Port.ToString)
arguments.Add(InterfaceControl.Info.Hostname)
If _isPuttyNg Then
arguments.Add("-hwndparent", InterfaceControl.Handle.ToString())
End If
.Arguments = arguments.ToString
'REMOVE IN RELEASE!
'MessageCollector.AddMessage(MessageClass.InformationMsg, "PuTTY Arguments: " & .Arguments, True)
MessageCollector.AddMessage(MessageClass.InformationMsg, "PuTTY Arguments: " & .Arguments, True)
End With
PuttyProcess.EnableRaisingEvents = True
@@ -179,7 +189,7 @@ Namespace Connection
MessageCollector.AddMessage(MessageClass.InformationMsg, String.Format(My.Language.strPuttyTitle, PuttyProcess.MainWindowTitle), True)
MessageCollector.AddMessage(MessageClass.InformationMsg, String.Format(My.Language.strPuttyParentHandle, InterfaceControl.Parent.Handle.ToString), True)
Resize()
Resize(Me, New EventArgs)
MyBase.Connect()
Return True
@@ -189,14 +199,6 @@ Namespace Connection
End Try
End Function
' Due to the way PuTTY handles command line arguments, backslashes followed by a quotation mark will be removed.
' Since all the strings we send to PuTTY are surrounded by quotation marks, we need to escape any trailing
' backslashes by adding another. See split_into_argv() in WINDOWS\WINUTILS.C of the PuTTY source for more info.
Private Shared Function PuttyEscapeArgument(ByVal argument As String) As String
If argument.EndsWith("\") Then argument = argument & "\"
Return argument
End Function
Public Overrides Sub Focus()
Try
SetForegroundWindow(PuttyHandle)
@@ -205,10 +207,9 @@ Namespace Connection
End Try
End Sub
Public Overrides Sub Resize()
Public Overrides Sub Resize(ByVal sender As Object, ByVal e As EventArgs)
Try
If frmMain.WindowState = FormWindowState.Minimized Then Return
If InterfaceControl.Size = Size.Empty Then Return
MoveWindow(PuttyHandle, -SystemInformation.FrameBorderSize.Width, -(SystemInformation.CaptionHeight + SystemInformation.FrameBorderSize.Height), InterfaceControl.Width + (SystemInformation.FrameBorderSize.Width * 2), InterfaceControl.Height + SystemInformation.CaptionHeight + (SystemInformation.FrameBorderSize.Height * 2), True)
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strPuttyResizeFailed & vbNewLine & ex.Message, True)
@@ -266,9 +267,6 @@ Namespace Connection
End Function
Public Shared Function IsFilePuttyNg(file As String) As Boolean
' PuTTYNG enhancements are not yet compatible with Windows 8
If Environment.OSVersion.Version.CompareTo(New Version(6, 2)) >= 0 Then Return False
Dim isPuttyNg As Boolean
Try
isPuttyNg = FileVersionInfo.GetVersionInfo(file).InternalName.Contains("PuTTYNG")

View File

@@ -12,23 +12,49 @@ Namespace Connection
Inherits Connection.Protocol.Base
#Region "Properties"
Private _SmartSize As Boolean
Public Property SmartSize() As Boolean
Get
Return Me.RDP.AdvancedSettings4.SmartSizing
Return RDP.AdvancedSettings4.SmartSizing
End Get
Set(ByVal value As Boolean)
Me.RDP.AdvancedSettings4.SmartSizing = value
RDP.AdvancedSettings4.SmartSizing = value
ReconnectForResize()
End Set
End Property
Private _Fullscreen As Boolean
Public Property Fullscreen() As Boolean
Get
Return Me.RDP.FullScreen
Return RDP.FullScreen
End Get
Set(ByVal value As Boolean)
Me.RDP.FullScreen = value
RDP.FullScreen = value
ReconnectForResize()
End Set
End Property
Private _redirectKeys As Boolean = False
Public Property RedirectKeys As Boolean
Get
Return _redirectKeys
End Get
Set(value As Boolean)
_redirectKeys = value
Try
If Not _redirectKeys Then Return
RDP.AdvancedSettings2.ContainerHandledFullScreen = 1
RDP.AdvancedSettings2.DisplayConnectionBar = False
RDP.AdvancedSettings2.PinConnectionBar = False
If RDPVersion >= Versions.RDC70 Then
Dim msRdpClientNonScriptable As MSTSCLib.IMsRdpClientNonScriptable5 = RDP.GetOcx()
msRdpClientNonScriptable.DisableConnectionBar = True
End If
RDP.FullScreen = True
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpSetRedirectKeysFailed & vbNewLine & ex.Message, True)
End Try
End Set
End Property
#End Region
@@ -87,7 +113,7 @@ Namespace Connection
Me.SetUseConsoleSession()
Me.SetPort()
Me.SetRedirectKeys()
RedirectKeys = Info.RedirectKeys
Me.SetRedirection()
Me.SetAuthenticationLevel()
Me.SetRDGateway()
@@ -156,14 +182,56 @@ Namespace Connection
End Try
End Sub
Public Overrides Sub Resize()
Control.Location = InterfaceControl.Location
Control.Size = InterfaceControl.Size
MyBase.Resize()
Private _controlBeginningSize As New Size
Public Overrides Sub ResizeBegin(ByVal sender As Object, ByVal e As EventArgs)
_controlBeginningSize = Control.Size
End Sub
Public Overrides Sub Resize(ByVal sender As Object, ByVal e As EventArgs)
If DoResize() And _controlBeginningSize.IsEmpty Then
ReconnectForResize()
End If
MyBase.Resize(sender, e)
End Sub
Public Overrides Sub ResizeEnd(ByVal sender As Object, ByVal e As EventArgs)
DoResize()
If Not Control.Size = _controlBeginningSize Then
ReconnectForResize()
End If
_controlBeginningSize = Size.Empty
End Sub
#End Region
#Region "Private Methods"
Private Function DoResize() As Boolean
Control.Location = InterfaceControl.Location
If Not Control.Size = InterfaceControl.Size And Not InterfaceControl.Size = Size.Empty Then
Control.Size = InterfaceControl.Size
Return True
Else
Return False
End If
End Function
Private Sub ReconnectForResize()
If RDPVersion < Versions.RDC80 Then Return
If Not (InterfaceControl.Info.Resolution = RDPResolutions.FitToWindow Or _
InterfaceControl.Info.Resolution = RDPResolutions.Fullscreen) Or _
SmartSize Then Return
Dim size As Size
If RedirectKeys Or Not Fullscreen Then
size = Control.Size
Else
size = Screen.FromControl(Control).Bounds.Size
End If
Dim msRdpClient8 As MSTSCLib.IMsRdpClient8 = RDP.GetOcx()
msRdpClient8.Reconnect(size.Width, size.Height)
End Sub
Private Sub SetRDGateway()
Try
If RDP.TransportSettings.GatewayIsSupported = 1 Then
@@ -310,19 +378,6 @@ Namespace Connection
End Try
End Sub
Private Sub SetRedirectKeys()
Try
If Me.Info.RedirectKeys Then
RDP.AdvancedSettings2.ContainerHandledFullScreen = 1
RDP.AdvancedSettings2.DisplayConnectionBar = False
RDP.AdvancedSettings2.PinConnectionBar = False
RDP.FullScreen = True
End If
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strRdpSetRedirectKeysFailed & vbNewLine & ex.Message, True)
End Try
End Sub
Private Sub SetRedirection()
Try
RDP.AdvancedSettings2.RedirectDrives = Me.Info.RedirectDiskDrives
@@ -414,6 +469,7 @@ Namespace Connection
End Sub
Private Sub RDPEvent_OnLeaveFullscreenMode(ByVal sender As Object, ByVal e As System.EventArgs)
Fullscreen = False
RaiseEvent LeaveFullscreen(Me, e)
End Sub
#End Region
@@ -626,6 +682,8 @@ Namespace Connection
Public Class Versions
Public Shared RDC60 As New Version(6, 0, 6000)
Public Shared RDC61 As New Version(6, 0, 6001)
Public Shared RDC70 As New Version(6, 1, 7600)
Public Shared RDC80 As New Version(6, 2, 9200)
End Class
#Region "Terminal Sessions"
@@ -818,7 +876,6 @@ Namespace Connection
End If
End Sub
#End Region
End Class
End Namespace
End Namespace

View File

@@ -689,6 +689,7 @@ Partial Class frmMain
Me.tsExternalTools.Location = New System.Drawing.Point(39, 49)
Me.tsExternalTools.Name = "tsExtAppsToolbar"
Me.tsExternalTools.Size = New System.Drawing.Size(111, 25)
Me.tsExternalTools.MaximumSize = New System.Drawing.Size(0, 25)
Me.tsExternalTools.TabIndex = 17
'
'cMenExtAppsToolbar
@@ -712,6 +713,7 @@ Partial Class frmMain
Me.tsQuickConnect.Location = New System.Drawing.Point(3, 24)
Me.tsQuickConnect.Name = "tsQuickConnect"
Me.tsQuickConnect.Size = New System.Drawing.Size(331, 25)
Me.tsQuickConnect.MaximumSize = New System.Drawing.Size(0, 25)
Me.tsQuickConnect.TabIndex = 18
'
'btnQuickyPlay
@@ -741,6 +743,7 @@ Partial Class frmMain
Me.ToolStrip1.Location = New System.Drawing.Point(3, 74)
Me.ToolStrip1.Name = "ToolStrip1"
Me.ToolStrip1.Size = New System.Drawing.Size(264, 25)
Me.ToolStrip1.MaximumSize = New System.Drawing.Size(0, 25)
Me.ToolStrip1.TabIndex = 19
Me.ToolStrip1.Visible = False
'

View File

@@ -124,7 +124,7 @@ Public Class frmMain
mMenViewConfig.Text = My.Language.strMenuConfig
mMenViewSessions.Text = My.Language.strMenuSessions
mMenViewErrorsAndInfos.Text = My.Language.strMenuNotifications
mMenViewScreenshotManager.Text = My.Language.strMenuScreenshotManager
mMenViewScreenshotManager.Text = My.Language.strScreenshots
mMenViewJumpTo.Text = My.Language.strMenuJumpTo
mMenViewJumpToConnectionsConfig.Text = My.Language.strMenuConnectionsAndConfig
mMenViewJumpToSessionsScreenshots.Text = My.Language.strMenuSessionsAndScreenshots
@@ -167,8 +167,17 @@ Public Class frmMain
End Sub
Private Sub frmMain_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
If WindowList IsNot Nothing Then
If My.Settings.ConfirmExit And WindowList.Count > 0 Then
If My.Settings.ConfirmExit And Not (WindowList Is Nothing OrElse WindowList.Count = 0) Then
Dim connectionWindow As UI.Window.Connection
Dim openConnections As Integer = 0
For Each window As UI.Window.Base In WindowList
connectionWindow = TryCast(window, UI.Window.Connection)
If connectionWindow IsNot Nothing Then
openConnections = openConnections + connectionWindow.TabController.TabPages.Count
End If
Next
If openConnections > 0 Then
Dim result As DialogResult = cTaskDialog.MessageBox(Me, My.Application.Info.ProductName, My.Language.strConfirmExitMainInstruction, "", "", "", My.Language.strCheckboxDoNotShowThisMessageAgain, eTaskDialogButtons.YesNo, eSysIcons.Question, Nothing)
If cTaskDialog.VerificationChecked Then
My.Settings.ConfirmExit = False
@@ -701,22 +710,32 @@ Public Class frmMain
#End Region
#Region "Window Overrides and DockPanel Stuff"
Private Sub frmMain_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize
If Me.WindowState = FormWindowState.Minimized Then
Private _inSizeMove As Boolean = False
Private Sub frmMain_ResizeBegin(ByVal sender As Object, ByVal e As EventArgs) Handles Me.ResizeBegin
_inSizeMove = True
End Sub
Private Sub frmMain_Resize(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Resize
If WindowState = FormWindowState.Minimized Then
If My.Settings.MinimizeToTray Then
If App.Runtime.NotificationAreaIcon Is Nothing Then
App.Runtime.NotificationAreaIcon = New Tools.Controls.NotificationAreaIcon()
If NotificationAreaIcon Is Nothing Then
NotificationAreaIcon = New Tools.Controls.NotificationAreaIcon()
End If
Me.Hide()
Hide()
End If
Else
PreviousWindowState = Me.WindowState
PreviousWindowState = WindowState
End If
End Sub
Private _inMouseActivate As Boolean = False
Private _inSizeMove As Boolean = False
Private Sub frmMain_ResizeEnd(ByVal sender As Object, ByVal e As EventArgs) Handles Me.ResizeEnd
_inSizeMove = False
' This handles activations from clicks that started a size/move operation
ActivateConnection()
End Sub
Private _inMouseActivate As Boolean = False
Protected Overloads Overrides Sub WndProc(ByRef m As Message)
Try
#If Config = "Debug" Then
@@ -734,8 +753,8 @@ Public Class frmMain
Dim control As Control = FromChildHandle(WindowFromPoint(MousePosition))
If Not IsNothing(control) Then
' Let ComboBoxes get focus but don't simulate a mouse event
If TypeOf control Is ComboBox Then Exit Select
' Let TreeViews and ComboBoxes get focus but don't simulate a mouse event
If TypeOf control Is TreeView Or TypeOf control Is ComboBox Then Exit Select
If control.CanSelect Or TypeOf control Is MenuStrip Or TypeOf control Is ToolStrip Or TypeOf control Is Magic.Controls.InertButton Then
' Simulate a mouse event since one wasn't generated by Windows
@@ -749,13 +768,6 @@ Public Class frmMain
' This handles activations from clicks that did not start a size/move operation
ActivateConnection()
Case WM_ENTERSIZEMOVE
_inSizeMove = True
Case WM_EXITSIZEMOVE
_inSizeMove = False
' This handles activations from clicks that started a size/move operation
ActivateConnection()
Case WM_WINDOWPOSCHANGED
' Ignore this message if the window wasn't activated
Dim windowPos As WINDOWPOS = Marshal.PtrToStructure(m.LParam, GetType(WINDOWPOS))

View File

@@ -124,154 +124,154 @@
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABk
IgAAAk1TRnQBSQFMAgEBBwEAARABAQEQAQEBEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
AwABIAMAAQEBAAEgBgABIB4AAeIB7wH0Af8BqAHJAdcB/wFvAaQBtgH/AVIBhgGcAf8BPQFkAYoB/wE4
AV8BhwH/ATgBaQGVAf8BSwGOAasB/wGPAbcBzQH/Ad0B6gHxAf8MAANXAbcDnwH/A5oB/wOWAf8DkQH/
A40B/wOJAf8DhAH/A4AB/wNaAf8DVgH/A1IB/wNPAf8DSwH/A0gB/wNXAbcYAAMNARIDVgG2A1YBtgMN
ARFgAAGtAc8B3wH/AUoBkQGtAf8BTwGjAb8B/wFrAcAB1AH/AZUB2QHmAf8BgQHbAfAB/wFDAcYB7AH/
ARcBqgHdAf8BCQGSAccB/wEVAYABrAH/ASwBZAGSAf8BnQG/AdEB/wgAA6gB/wPpAf8D0wH/A9IB/wPR
Af8D0AH/A84B/wPNAf8DzQH/A8sB/wPLAf8DygH/A8kB/wPIAf8D4gH/A0gB/xgAA14B2QPkAf8D4wH/
A1gBwWAAAU0BhAGbAf8BNwG9AecB/wFaAdMB8QH/AYwB4wH0Af8BogHrAfYB/wGDAd8B9AH/AUMBygHw
Af8BEQG2Ae0B/wEAAacB6AH/AQABoQHhAf8BAAGWAdIB/wEwAVEBbQH/CAADrQH/A9YB/wO6Af8DuAH/
A7UB/wOzAf8DsQH/A7AB/wOtAf8DqwH/A6oB/wOoAf8DpwH/A6YB/wPIAf8DTAH/CAADCwEPA1QBrQM6
AWEDPwFuA3MB+AHiAeEB3wH/AeEB4AHfAf8DXwHzAzwBZwM8AWYDUwGtAwsBD1AAAVABhwGeAf8BNgHE
AfAB/wFcAdQB8QH/AYwB4wH0Af8BogHrAfYB/wGDAd8B9AH/AUMBygHwAf8BEQG2Ae0B/wEAAagB6AH/
AQABoQHhAf8BAAGcAdoB/wExAVIBbwH/CAADsQH/A9kB/wO9Af8DugH/A7gB/wO2Af8DtQH/A7MB/wOw
Af8DrwH/A60B/wOrAf8DqQH/A6gB/wPKAf8DUAH/CAADWgHFBP8CnAGbAf4CmwGaAf4C5wHmAf8B1gHV
AdMB/wHXAdYB1AH/AeMB4gHgAf8BkAGPAY0B/gKpAagB/QHpAegB5gH/A1gBwVAAAVIBiQGgAf8BNgHE
Ae8B/wFbAdQB8QH/AY0B4wH0Af8BogHrAfYB/wGCAd8B8wH/AUQBygHwAf8BEQG2Ae0B/wEAAagB6AH/
AQABoQHhAf8BAAGcAdoB/wEzAVUBcQH/CAADtgH/A90B/wPBAf8DvQH/A7wB/wO6Af8DuAH/A7UB/wO0
Af8DsgH/A7AB/wOtAf8DrAH/A6wB/wPPAf8DVAH/CAADZAHnAvkB9wH/Au8B7gH/AtsB2gH/AcoCyQH/
AckByAHGAf8ByQHIAccB/wHJAcgBxwH/AssByQH/AeYB5QHkAf8B5QHkAeIB/wNlAeVQAAFUAYwBogH/
ATgBxgHwAf8BXQHUAfEB/wGMAeMB9AH/AaIB6wH2Af8BggHfAfQB/wFEAcoB8AH/AREBtgHtAf8BAAGo
AegB/wEAAaIB4gH/AQABmwHbAf8BNQFYAYAB/wgAA1oBvQPaAf8DyAH/A8AB/wO/Af8DvQH/A7oB/wO4
Af8DtwH/A7UB/wOzAf8DsAH/A68B/wOzAf8DwgH/A1oBvQgAA04BlQH2AfUB9AH/AeYB5QHkAf8BvwG+
Ab0B/wLrAeoB/wHUAdMB0gH/AdYB1QHUAf8B4gLhAf8CtAGzAf8B1wHWAdQB/wHiAeEB3wH/A0oBjVAA
AVcBjwGlAf8BOQHGAfAB/wFdAdQB8gH/AY0B4wH0Af8BogHrAfYB/wGDAd8B9AH/AUMBygHwAf8BEQG2
Ae0B/wEAAacB6AH/AQABoQHiAf8BAAGcAdsB/wE3AVsBgwH/CAADWgG9A+MB/wPnAf8D4QH/A+AB/wPg
Af8D3wH/A98B/wPeAf8D3QH/A90B/wPcAf8D2wH/A+AB/wPQAf8DWgG9AwsBDwNVAbUDZAHnAeQB4wHi
Af8B0QHQAc8B/wLwAe8B/wOuAf8DZAHxA2cB8gKsAasB/wLoAecB/wLLAcoB/wHgAd8B3QH/A2EB5ANV
AbUDCwEPSAABWAGSAagB/wE5AcUB8AH/AV4B1AHyAf8BjQHjAfQB/wGiAesB9gH/AYIB3wH0Af8BQwHK
AfAB/wERAbYB7QH/AQABpwHoAf8BAAGhAeEB/wEAAZwB2wH/ATkBXgGGAf8IAAMpAT8DzgH/A+wB/wPe
Af8D2AH/A9IB/wPMAf8DyAH/A8cB/wPIAf8DywH/A9AB/wPdAf8D6AH/A6QB/wMrAUIDPwFtAuQB4wH/
AdgB1gHVAf8B0gHRAdAB/wHFAcQBwwH/Ae0B7AHrAf8DVwG6CAADXAHNAegB5wHmAf8BtgG1AbQB/wHW
AdUB0wH/AeIB4QHgAf8C4AHfAf8DPAFmSAABWwGVAasB/wE5AcUB8AH/AV4B1AHyAf8BjQHjAfQB/wGi
AesB9gH/AYMB3wH0Af8BRAHLAfAB/wERAbUB7QH/AQABpwHoAf8BAAGhAeIB/wEAAZwB2gH/ATwBYQGI
Af8MAANaAb0D4wH/A9sB/wPiAf8BtwHQAbgB/wFCAa0BRgH/AVQBqgFCAf8BTgGvAUYB/wE0AaUBQAH/
AawBxQGsAf8DwgH/A9EB/wPTAf8DWgG9BAADQgF2AewB6wHoAf8B2gHZAdcB/wHUAdMB0QH/AcYBxQHE
Af8B3gLcAf8DRgF+CAADUAGaAd0B3AHbAf8ByAHGAcUB/wLiAeEB/wLhAd8B/wHuAe0B7AH/Az8Bb0gA
AV0BmAGuAf8BOQHFAfAB/wFeAdQB8QH/AY0B4wH0Af8BogHrAfYB/wGDAd8B9AH/AUQBygHwAf8BEQG2
Ae0B/wEAAagB6QH/AQABoQHhAf8BAAGcAdoB/wE+AWMBigH/DAADKQE/A9EB/wPzAf8BxwHeAcoB/wFC
AckBhQH/AbMB3AGkAf8B5wHHAVoB/wHcAb8BUQH/AVQBzAGPAf8BLQGtAUYB/wG4AdABuAH/A/EB/wOv
Af8DKwFCBAADLwFKA2AB6wN6AfwB3gHdAdwB/wHLAsoB/wHmAuUB/wNhAeEDMgFQAzgBXANgAesC7gHs
Af8BzALLAf8B5wHmAeUB/wN6AfwDYAHrAywBQ0gAAWABmwGwAf8BOAHGAfAB/wFeAdQB8gH/AY0B4wH0
Af8BogHrAfYB/wGDAd8B9AH/AUQBygHwAf8BEQG2Ae0B/wEAAagB6AH/AQABoQHhAf8BAAGcAdoB/wFB
AWcBjgH/EAADWgG9A8QB/wFUAc4BiwH/AZkB5AGrAf8BsAHFATsB/wHqAbUBJgH/AeEBogEXAf8BpQGd
AR4B/wGCAcUBjwH/AScBmgE0Af8DoAH/A1oBvRAAA14BzgHhAeAB3gH/AdkB1wHWAf8BuAK3Af8B4QHg
Ad8B/wOoAf0DqQH9AvYB9QH/AsABvwH/AeoB6QHoAf8C8wHyAf8DXAHJUAABYwGfAbMB/wE4AcYB8AH/
AVwB1AHxAf8BjAHjAfQB/wGiAesB9gH/AYMB3wH0Af8BRAHKAfAB/wERAbYB7QH/AQABpwHoAf8BAAGh
AeEB/wEAAZsB2gH/AUMBagGQAf8YAAFgAXwBawH8AaIB6QGVAf8B1gHPAUcB/wHiAbMBJQH/AdEBuwEt
Af8BwgGuASAB/wGCAb0BSgH/ASsBcQFWAfwYAANMAZEB4wHiAeAB/wLeAdwB/wHhAeAB3wH/AcwCywH/
AcQBwwHCAf8CzwHOAf8C3gHdAf8C8AHvAf8C8AHvAf8C9gH1Af8DSAGHUAABZAGhAbUB/wFeAdUB9AH/
AZoB6AH3Af8BtQHzAfoB/wHCAfgB/AH/AcMB+AH9Af8BwQH3Af0B/wGvAfAB+wH/AY8B4gH3Af8BXQHQ
AfAB/wExAbgB5QH/AUYBbQGTAf8YAAFiAXwBbAH8AaIB8AGfAf8B2AHtAa8B/wHeAcUBRgH/AbQB4gFD
Af8BPgHnARcB/wFJAdcBSQH/ATABcwFdAfwUAAMBAQIDXwHjAeUB5AHhAf8C7gHtAf8C7gHtAf8C6wHq
Af8B4wHiAeEB/wLoAecB/wLqAekB/wLzAfIB/wL1AfQB/wH6AfkB+AH/A1wB31AAAWcBowG4Af8BxQH5
Af0B/wHFAfkB/QH/AcUB+QH9Af8BxQH5Af0B/wHFAfkB/QH/AcUB+QH9Af8BxQH5Af0B/wHFAfkB/QH/
AcUB+QH9Af8BxQH5Af0B/wFIAXABlQH/GAADYQHcAcgB9wHUAf8B2AH2AcoB/wHnAeMBqQH/AdsBzwFK
Af8BrwHcAUYB/wGdAeoBqwH/A18B4BgAA0ABbwN/Af4DZAHnA18B8wHoAecB5gH/AecB5gHlAf8C7QHs
Af8C+wH6Af8DZwHyA2QB5wN/Af4DPQFoUAABtwHXAeEB/wGMAb0BzAH/AZ0BzwHbAf8BrQHfAegB/wG5
AewB8wH/AcIB9QH6Af8BwgH1AfoB/wG4AesB8QH/AakB2gHjAf8BlAHEAdEB/wFuAagBuAH/AakBxQHR
Af8YAAMtAUUBXQF4AW8B+gHbAfgB6QH/AecB8gHYAf8B7QHlAbMB/wHfAdkBpgH/AV8BhwFfAfsDMgFQ
IAADDwEUAwoBDgNTAaoB7wHuAe0B/wL0AfMB/wNSAaQDCAELAxEBF1gAAv4C/wHjAfEB9AH/AbkB1wHh
Af8BlQG+AcwB/wFuAagBuwH/AWEBmwGwAf8BXQGYAa0B/wFmAaEBswH/AYwBsgHCAf8BsQHNAdcB/wHf
AesB7wH/A/4B/xwAAy4BRwNeAdkBZgF8AWoB/AFmAXsBZgH8A14B3QMyAVAsAAMvAUoDXQHwA2IB7wMs
AUNkAAMRARcDVgGzAVMBVAFTAay0AAMEAQUDEAEVAx8BLQMpAT8DLwFJAy4BSAMoAT0DHgErAw8BFAMD
AQQQAAO3Af8BnAGoAZ4B/wEAAVUBMAH/ARoBkgFSAf8BAAFZATAB/wECAUYBoAH/AQABRAGeAf8BAAFB
AZsB/wEAAT8BmQH/AQABPQGXAf8BAAE6AZQB/wEAATkBkwH/A0oB/wNKAf8cAANBAXIBTAJfAfMBWQJc
Ac8BSwJMAZADIwEzXAADBQEHAx8BLAI+AT0BagJSAVABowFbAlkBxAFdAloB0wFdAloB0wFbAlkBwwFS
AlEBoQM8AWYDHAEoAwQBBgwAAxUBHQNRAaIBHwGVAVYB/wGCAb4BqgH/AS4BpQGCAf8BDwGXAUgB/wES
AZkBTQH/ARYBmQFRAf8BGgGdAVYB/wFUAaoB0gH/AVIBqAHRAf8BAAE7AZUB/yAAAyEBMAErATQBagH8
AYYBrQHhAf8BXAGoAdwB/wE9AZIByQH/AQ4BUAGrAf8BVQJWAbEDHwEtUwABAQMSARgDPgFrAV0CWQHX
AVgCKwH8AawBKwECAf8B4QFLAR8B/wHkAV0BMwH/AdMBSQEXAf8BowFAATgB/QFhAl4B2gI+AT0BagMP
ARQIAAMYASIBUAFSAVABpANWAbMBSwGsAZ8B/wFSAbcBngH/AVwBuwGsAf8BXAG7Aa4B/wFdAbsBsAH/
AYABvAGzAf8BFQGaAVkB/wEyAZUBxwH/AVUBqwHTAf8BAAE+AZgB/yAAAVQCVgGrAUsBnQHRAf8BmQG8
AesB/wFPAaAB4wH/AZYBuQHqAf8BlAG4AeoB/wE+AZMBygH/AisBZgH8A0MBeFAAAxsBJgNZAdIBGwEF
AQAB/wGKAToBIgH/AcoBhgFEAf8B9gG8AZwB/wH5AcwBtwH/AeMBoAFWAf8BsQFVATsB/wFXATEBEgH/
AV4CWAHdAxwBKAgAAVUBVgFVAbEDVgGzA1YBswE6AaQBkQH/AU0BtgGbAf8BRgGyAZsB/wFIAbIBngH/
AUoBswGhAf8BhQG/AbYB/wEcAZ4BggH/ATcBmQHJAf8BWQGtAdQB/wEAAUIBnAH/HAADHwEtASsBSQFu
AfwBnQG/AewB/wFHAZwB4gH/ATkBkwHfAf8BNgGRAd8B/wE9AZQB4AH/AZUBuAHqAf8BhgGtAeEB/wEn
AYMBuwH/AUsCTAGQBAADnQH/A50B/wOdAf8DnQH/A50B/wOdAf8DnQH/A50B/wOdAf8DnQH/A50B/wOd
Af8DnQH/A50B/wOdAf8DnQH/CAABUwJPAaUBMgEXAQAB/wFXAUIBLQH/AY8BVAE/Af8BrAGIAUkB/wHC
AaMBiAH/AcEBpQGOAf8BswGYAYEB/wGRAVQBPgH/AVIBOQEkAf8BQQEaAQAB/wFWAlUBsQgAAwgBCwNV
AbIDVgGzAVQBsgGoAf8BWwG9AacB/wGHAcEBtQH/AYYBwQG2Af8BhwHBAbcB/wGIAcEBuQH/ASIBogGI
Af8BPAGcAcsB/wFdAbAB1QH/AQEBRQGfAf8QAAMrAUIDSAGEAVUCVwG3AUwCXwHzAVQBpAHXAf8BoQHC
Ae0B/wGfAcAB7QH/AZ0BvwHtAf8BUgGjAeQB/wE4AZIB3wH/ATYBkAHeAf8BWQGnAeYB/wGSAbYB6AH/
ASEBXQG3Af8DNwFaA50B/wG6Ar0B/wHmAuwB/wHmAu0B/wHnAu0B/wHoAu4B/wHpAu8B/wHpAu8B/wHq
Au8B/wHqAvAB/wHrAvAB/wHrAvEB/wHsAvEB/wHsAvEB/wG9Ar8B/wOdAf8EAAM5AV8BUwEzARgB/wHD
AbEBogH/AbYBnAGDAf8BpgFXASoB/wGoAVUBJwH/AcMBpAGHAf8B2AHGAbAB/wG9AakBiwH/AV0BPQEd
Af8BOgEaAQAB/wEwAQwBAAH/ATcBEAEAAf8DMwFTCAADBgEIA1UBsgEtAaABigH/AZMByQG6Af8BPQGv
AZcB/wEiAaIBgwH/ASMBowGHAf8BJQGkAYsB/wEkAaoBkgH/ATIBwgHtAf8BgQG0AdcB/wEGAUkBowH/
DAADTAGTAUIBlwHPAf8BWQGoAdkB/wGNAbQB4gH/AaMBxAHtAf8BpwHHAe4B/wFCAZcBzQH/ARIBUwGy
Af8BPQGTAckB/wGfAcAB7QH/AVYBlgGjAf8BngGWASYB/wFaAZQBkQH/AY0BswHpAf8BVwGlAdgB/wFa
Al4B2AQAA1wB6gHbAuIB/wHNAs8B/wPLAf8DzAH/A84B/wPPAf8D0AH/A9IB/wPTAf8D1QH/AdcC2AH/
AecC7AH/A20B9wQAAyIBMQFWAlUBsQFFARkBAAH/AaoBhQE9Af8BsgFQAQ4B/wGtAS0BAAH/AboBSgEC
Af8B6gHVAb8B/wH9AfwB+gH/AdYBvgGmAf8BkAE9AQoB/wFAAQ4BAAH/AUEBHgEAAf8BOgEaAQAB/wNX
AcUDHAEnCAADBAEGARMBlAFVAf8BTAG5AZ4B/wEnAaYBiQH/AVcBsQHVAf8BUwGtAdQB/wFPAasB0gH/
AT0BugHkAf8BAAGZAUcB/wEFAY4BNgH/AQgBTgGaAf8MAAFIAmIB9gGuAc0B8AH/AbABzwHwAf8BmAG/
AewB/wFcAa4B5wH/AaoBygHvAf8BGwFZAbgB/wQAARMBVAGzAf8BogHDAe0B/wGoAZcBDwH/AcQBtQE4
Af8BrAGXAQQB/wE5AZMB3wH/AZgBuwHrAf8BAAFCAZ8B/wQAA1wB6gHZAuEB/wHLAswB/wPHAf8DyAH/
A8oB/wPLAf8DzQH/A84B/wPQAf8D0QH/AdMC1AH/AeUC6wH/A20B9wQAAy4BRwNZAewBQAEOAQAB/wGZ
AS0BAAH/AbgBRQEAAf8BwgFBAQAB/wHJAVMBAQH/AeYBvwGUAf8B7AHUAbYB/wHNAZwBQAH/AagBSgEK
Af8BmQFLAR8B/wGjAYwBUAH/AV0BRAEtAf8CUQE/AfcBNQI0AVUMAAE2AY4BxAH/ATABrAGLAf8BLQGq
AY8B/wFcAbUB2AH/AVgBsgHWAf8BVQGvAdUB/wFRAawB0wH/AQIBkAFAAf8BNwGoAYQB/wEAAVYBMQH/
AxQBGwgAAVoCYAHeAagByQHtAf8BhAGnAe0B/wE2AUgB7QH/AUgBjgHpAf8BrQHNAfAB/wFLAZ0B0gH/
ARwBWgG5Af8BRQGZAc4B/wGlAcUB7gH/AZUBmgFHAf8BrQGXAQQB/wGdAZcBKwH/AUQBmwHiAf8BmAG7
AeoB/wFIAmIB9gQAA1wB6gHXAt8B/wHHAskB/wPCAf8DxAH/A8UB/wPIAf8DyQH/A8oB/wPMAf8DzQH/
AdAC0QH/AeMC6gH/A20B9wQAAzkBXwJAASUB/QFSARkBAAH/Aa4BNwEAAf8BwAE/AQAB/wHnAZYBJAH/
AegBsgFYAf8B5AGxAVgB/wHSAYkBFwH/Ab0BRAEAAf8BqAEyAQAB/wG4AY0BOwH/AdQBwwGyAf8BmAGE
AUwB/wE5ARsBAAH/AT4CPQFqDAABPAGRAckB/wGkAcwB5AH/AYcBuwHbAf8BHQGhAVgB/wEXAZwBUgH/
ARIBmgFOAf8BDQGWAUgB/wEpAaMBgQH/AYQBwAGrAf8BIAGWAVcB/wNRAaIDFQEdBAADUQGcAZIBuQHl
Af8BTAFSAfYB/wGBAYQB9QH/Ah4B8AH/AZABuwHrAf8BrgHNAfAB/wGsAcwB8AH/AaoBygHwAf8BhQGy
AekB/wE8AakBwQH/ASIBswGNAf8BNAGoAbYB/wFOAaEB5AH/AZcBugHoAf8DXQHtBAADXAHqAdYC3wH/
AcMCxQH/A8AB/wPAAf8DwgH/A8MB/wPEAf8DxQH/A8gB/wPJAf8DzQH/AeAC6AH/A20B9wQAAzcBWgJN
ASgB+gGDASQBAAH/AcsBTgEAAf8B5QGLARsB/wH+AbYBUAL/AeMBwgH/AfQBvAGFAf8B1gFVAQcB/wHF
AUwBAAH/AboBQQEAAf8BrwFVARcB/wGuAYgBOwH/AZQBVAE7Af8BOgEcAQAB/wM8AWYMAAFBAZUBzQH/
AagBzwHlAf8BjAG/Ad0B/wEjAaUBgQH/AY0BxQG4Af8BiQHDAbQB/wGGAcEBsQH/AYQBvwGvAf8BVQG5
AZ8B/wFMAa0BoAH/A1YBswFQAVIBUAGkAxgBIgMjATMBKwFjAXkB/AGSAaQB9QH/ATcBOAH2Af8BLwGG
AfQB/wEZAaYB+wH/AToBqwHyAf8BXAGvAecB/wFZAa0B5wH/AVYBqgHmAf8BHQG2AYAB/wE+AcgBlwH/
ARkBtwFYAf8BWwGsAecB/wGPAbUB4wH/AVoCXgHVBAADYAHWAccCzQH/AdsC5AH/AdsC5AH/AdsC5QH/
AdwC5QH/AdwC5QH/Ad0C5gH/Ad0C5gH/Ad4C5wH/Ad8C6AH/AeAC6AH/Ac0C0wH/A18B4wQAAyYBOQFg
AloB3gGOASwBAAH/AewBngExAf8B/gG/AYUC/wHMAaEC/wHfAbsB/wH+AcIBXQH/AeIBjgEnAf8B0wGE
ARgB/wHKAVcBCgH/AbUBTgEIAf8BlwE/AQUB/wGBATwBFwH/A1kB7AMuAUgMAAFFAZgB0AH/AasB0QHn
Af8BkAHCAd8B/wEqAakBiAH/AZEByQG7Af8BVAG6AaUB/wFQAbgBoQH/AUwBtgGeAf8BUAG4AZ0B/wE7
AaUBkgH/A1YBswNWAbMBVQFWAVUBsQQAA0kBhwGGAa8B4QH/AbkB1wHzAf8BEAGmAf4B/wFKAb8C/wEJ
AaMC/wFEAb4B8AH/ARgBzgH7Af8BOAG+AfEB/wEwAbMBoAH/ARkBtwFXAf8BJQGzAZAB/wGnAcgB7gH/
AVUBpQHWAf8BTwJRAZwEAAMsAUMDWwHIA50B/wOdAf8DnQH/A50B/wOdAf8DnQH/A50B/wOdAf8DnQH/
A50B/wNeAd0DMQFOBAADCQEMA0sBjgHAAUwBCwL/AbwBXQH/AfoBzgGnAf8B+AHbAb4C/wHiAcYC/wG+
AYYB/wH0AawBUwH/AewBwgGaAf8B4gG1AYsB/wG4AVMBEQH/AZ0BQgEKAf8BiAFCAR4B/wNPAaUDEAEV
DAABSQGbAdMB/wGuAdQB6AH/AasB0wHoAf8BNwGxAZAB/wGbAc4BwAH/AZkBzQG9Af8BlgHLAbsB/wGV
AcoBuQH/AYABvwGoAf8BVQGzAakB/wNWAbMDVQGyAwgBCwQAAwQBBgNRAZ8BhQGuAeEB/wE4AbIB+QH/
AQkBowL/AR4BqQH7Af8BDgHTAf4B/wFKAeIC/wEJAdUC/wFdAbAB6AH/AVoBrQHnAf8BqQHKAe8B/wGl
AcUB7QH/ASsBVQFwAfwDIQEwRAADEwEaAmQBUwHxAdgBngFQAf8B5wHTAcAB/wH8AfUB7gL/AfgB6wL/
AeUBwgH/AfYBuQGCAf8B8gHSAbgB/wHuAdIBtgH/AcIBhgEsAf8BpwFUASUB/wJNASkB+gMdASkQAAFM
AZ0B1QH/AUoBmwHTAf8BRwGaAdIB/wEnAaEBjAH/ASIBnwGKAf8BHwGdAYUB/wEbAZkBgAH/ATQBpQGS
Af8BXQG4AbEB/wEuAaEBiwH/A1UBsgMGAQgQAANCAXUBXwJiAfYBjgG2AeMB/wG5AdcB8wH/ATsB1QH7
Af8BCAHVAv8BHwHRAfsB/wGzAdIB8gH/AbEB0AHxAf8BkgG4AeIB/wFAAZUBzAH/A0oBikwAAzUBVwGp
AUABEgH/AcoBuAGoBv8B/gH8Av8B9gHiAf8B+wHFAaAB/wHkAbkBlQH/AdsBrAFbAf8BwwGOAToB/wGT
AUIBFgH/AT4CPQFqMAABUwJUAawDVgGzA1YBswMEAQYYAAMWAR4DVAGuAVQBowHcAf8BkQG4AeQB/wGo
AcoB7AH/AaUBxwHsAf8BjQG1AeIB/wFGAZoB0gH/AVoCXwHbAzEBTlQAAzIBUQJkAVkB7AHQAbIBlQH/
AewB4AHZAf8B5gHVAcQB/wHTAbABlAH/AdMBpgFVAf8BywGPATMB/wFnAWUBWQHyAToCOQFgNAABUwJU
AawDVgGzAwQBBiQAAysBQgNMAZABWwJdAdIBWQJcAc8DTgGZAy0BRWAAAxEBFwNEAXoCWgFXAcUCZQFe
AeUCYQFYAeYCXAFZAckCSAFHAYMDFQEdEAABQgFNAT4HAAE+AwABKAMAAUADAAEgAwABAQEAAQEGAAEB
FgAD/wEAAeABBwIAAfwBPwIAAcABAwIAAfwBPwIAAcABAwIAAcABAwIAAcABAwIAAcABAwIAAcABAwIA
AcABAwIAAcABAwIAAcABAwIAAcABAwYAAcABAwIAAQEBgAIAAcABAwGAAgEBgAIAAcABAwGAAQEEAAHA
AQMBwAEDAcABAwIAAcABAwHwAQ8BwAEDAgABwAEDAfABDwGAAQMCAAHAAQMB8AEPAcABAwIAAcABAwHw
AQ8B8AEPAgABwAEDAfgBHwH8AT8CAAHjBf8B4AEHAYABAQH8AR8C/wHAAQMBgAEHAfgBBwL/AYABAwEA
AQcB+AEDAv8BwAEDAQABBwHwAQECAAHAAQMBAAEHAYADAAGAAQEBgAEHAgABgAEBAgABwAEHAQEBAAGA
AQECAAHgAQMCAAGAAQECAAHgAQECAAGAAQECAAHgAwABgAEBAgAB4AEAAYABAAGAAQECAAHgAQABgAEA
Av8BgAEBAeABAQHgAQEC/wHAAQMB/wHDAfABAwL/AeABBwH/AccB/AEPAv8B8AEPCw==
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABi
IgAAAk1TRnQBSQFMAgEBBwEAASABAQEgAQEBEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
AwABIAMAAQEBAAEgBgABIB4AAeIB7wH0Af8BqAHJAdcB/wFtAaQBtgH/AVABhgGcAf8BOwFiAYoB/wE2
AV0BhwH/ATYBZwGVAf8BSQGOAasB/wGPAbcBzQH/Ad0B6gHxAf8MAANXAbcDnwH/A5oB/wOWAf8DkQH/
A40B/wOJAf8DhAH/A4AB/wNYAf8DVAH/A1AB/wNNAf8DSQH/A0YB/wNXAbcYAAMNARIDVgG2A1YBtgMN
ARFgAAGtAc8B3wH/AUgBkQGtAf8BTQGjAb8B/wFpAcAB1AH/AZUB2QHmAf8BgQHbAfAB/wFBAcYB7AH/
ARUBqgHdAf8BBwGSAccB/wETAYABrAH/ASoBYgGSAf8BnQG/AdEB/wgAA6gB/wPpAf8D0wH/A9IB/wPR
Af8D0AH/A84B/wPNAf8DzQH/A8sB/wPLAf8DygH/A8kB/wPIAf8D4gH/A0YB/xgAA14B2QPkAf8D4wH/
A1gBwWAAAUsBhAGbAf8BNQG9AecB/wFYAdMB8QH/AYwB4wH0Af8BogHrAfYB/wGDAd8B9AH/AUEBygHw
Af8BDwG2Ae0B/wEAAacB6AH/AQABoQHhAf8BAAGWAdIB/wEuAU8BawH/CAADrQH/A9YB/wO6Af8DuAH/
A7UB/wOzAf8DsQH/A7AB/wOtAf8DqwH/A6oB/wOoAf8DpwH/A6YB/wPIAf8DSgH/CAADCwEPA1QBrQM6
AWEDPwFuA3EB+AHiAeEB3wH/AeEB4AHfAf8DXwHzAzwBZwM8AWYDUwGtAwsBD1AAAU4BhwGeAf8BNAHE
AfAB/wFaAdQB8QH/AYwB4wH0Af8BogHrAfYB/wGDAd8B9AH/AUEBygHwAf8BDwG2Ae0B/wEAAagB6AH/
AQABoQHhAf8BAAGcAdoB/wEvAVABbQH/CAADsQH/A9kB/wO9Af8DugH/A7gB/wO2Af8DtQH/A7MB/wOw
Af8DrwH/A60B/wOrAf8DqQH/A6gB/wPKAf8DTgH/CAADWgHFBP8ClgGVAf4ClQGUAf4C5wHmAf8B1gHV
AdMB/wHXAdYB1AH/AeMB4gHgAf8BigGJAYcB/gOoAf0B6QHoAeYB/wNYAcFQAAFQAYkBoAH/ATQBxAHv
Af8BWQHUAfEB/wGNAeMB9AH/AaIB6wH2Af8BggHfAfMB/wFCAcoB8AH/AQ8BtgHtAf8BAAGoAegB/wEA
AaEB4QH/AQABnAHaAf8BMQFTAW8B/wgAA7YB/wPdAf8DwQH/A70B/wO8Af8DugH/A7gB/wO1Af8DtAH/
A7IB/wOwAf8DrQH/A6wB/wOsAf8DzwH/A1IB/wgAA2QB5wL5AfcB/wLvAe4B/wLbAdoB/wHKAskB/wHJ
AcgBxgH/AckByAHHAf8ByQHIAccB/wLLAckB/wHmAeUB5AH/AeUB5AHiAf8DZQHlUAABUgGMAaIB/wE2
AcYB8AH/AVsB1AHxAf8BjAHjAfQB/wGiAesB9gH/AYIB3wH0Af8BQgHKAfAB/wEPAbYB7QH/AQABqAHo
Af8BAAGiAeIB/wEAAZsB2wH/ATMBVgGAAf8IAANaAb0D2gH/A8gB/wPAAf8DvwH/A70B/wO6Af8DuAH/
A7cB/wO1Af8DswH/A7AB/wOvAf8DswH/A8IB/wNaAb0IAANOAZUB9gH1AfQB/wHmAeUB5AH/Ab8BvgG9
Af8C6wHqAf8B1AHTAdIB/wHWAdUB1AH/AeIC4QH/ArQBswH/AdcB1gHUAf8B4gHhAd8B/wNKAY1QAAFV
AY8BpQH/ATcBxgHwAf8BWwHUAfIB/wGNAeMB9AH/AaIB6wH2Af8BgwHfAfQB/wFBAcoB8AH/AQ8BtgHt
Af8BAAGnAegB/wEAAaEB4gH/AQABnAHbAf8BNQFZAYMB/wgAA1oBvQPjAf8D5wH/A+EB/wPgAf8D4AH/
A98B/wPfAf8D3gH/A90B/wPdAf8D3AH/A9sB/wPgAf8D0AH/A1oBvQMLAQ8DVQG1A2QB5wHkAeMB4gH/
AdEB0AHPAf8C8AHvAf8DrgH/A2QB8QNnAfICrAGrAf8C6AHnAf8CywHKAf8B4AHfAd0B/wNhAeQDVQG1
AwsBD0gAAVYBkgGoAf8BNwHFAfAB/wFcAdQB8gH/AY0B4wH0Af8BogHrAfYB/wGCAd8B9AH/AUEBygHw
Af8BDwG2Ae0B/wEAAacB6AH/AQABoQHhAf8BAAGcAdsB/wE3AVwBhgH/CAADKQE/A84B/wPsAf8D3gH/
A9gB/wPSAf8DzAH/A8gB/wPHAf8DyAH/A8sB/wPQAf8D3QH/A+gB/wOkAf8DKwFCAz8BbQLkAeMB/wHY
AdYB1QH/AdIB0QHQAf8BxQHEAcMB/wHtAewB6wH/A1cBuggAA1wBzQHoAecB5gH/AbYBtQG0Af8B1gHV
AdMB/wHiAeEB4AH/AuAB3wH/AzwBZkgAAVkBlQGrAf8BNwHFAfAB/wFcAdQB8gH/AY0B4wH0Af8BogHr
AfYB/wGDAd8B9AH/AUIBywHwAf8BDwG1Ae0B/wEAAacB6AH/AQABoQHiAf8BAAGcAdoB/wE6AV8BiAH/
DAADWgG9A+MB/wPbAf8D4gH/AbcB0AG4Af8BQAGtAUQB/wFSAaoBQAH/AUwBrwFEAf8BMgGlAT4B/wGs
AcUBrAH/A8IB/wPRAf8D0wH/A1oBvQQAA0IBdgHsAesB6AH/AdoB2QHXAf8B1AHTAdEB/wHGAcUBxAH/
Ad4C3AH/A0YBfggAA1ABmgHdAdwB2wH/AcgBxgHFAf8C4gHhAf8C4QHfAf8B7gHtAewB/wM/AW9IAAFb
AZgBrgH/ATcBxQHwAf8BXAHUAfEB/wGNAeMB9AH/AaIB6wH2Af8BgwHfAfQB/wFCAcoB8AH/AQ8BtgHt
Af8BAAGoAekB/wEAAaEB4QH/AQABnAHaAf8BPAFhAYoB/wwAAykBPwPRAf8D8wH/AccB3gHKAf8BQAHJ
AYUB/wGzAdwBpAH/AecBxwFYAf8B3AG/AU8B/wFSAcwBjwH/ASsBrQFEAf8BuAHQAbgB/wPxAf8DrwH/
AysBQgQAAy8BSgNgAesDeAH8Ad4B3QHcAf8BywLKAf8B5gLlAf8DYQHhAzIBUAM4AVwDYAHrAu4B7AH/
AcwCywH/AecB5gHlAf8DeAH8A2AB6wMsAUNIAAFeAZsBsAH/ATYBxgHwAf8BXAHUAfIB/wGNAeMB9AH/
AaIB6wH2Af8BgwHfAfQB/wFCAcoB8AH/AQ8BtgHtAf8BAAGoAegB/wEAAaEB4QH/AQABnAHaAf8BPwFl
AY4B/xAAA1oBvQPEAf8BUgHOAYsB/wGZAeQBqwH/AbABxQE5Af8B6gG1ASQB/wHhAaIBFQH/AaUBnQEc
Af8BggHFAY8B/wElAZoBMgH/A6AB/wNaAb0QAANeAc4B4QHgAd4B/wHZAdcB1gH/AbgCtwH/AeEB4AHf
Af8DqAH9A6gB/QL2AfUB/wLAAb8B/wHqAekB6AH/AvMB8gH/A1wByVAAAWEBnwGzAf8BNgHGAfAB/wFa
AdQB8QH/AYwB4wH0Af8BogHrAfYB/wGDAd8B9AH/AUIBygHwAf8BDwG2Ae0B/wEAAacB6AH/AQABoQHh
Af8BAAGbAdoB/wFBAWgBkAH/GAABXgF6AWkB/AGiAekBlQH/AdYBzwFFAf8B4gGzASMB/wHRAbsBKwH/
AcIBrgEeAf8BggG9AUgB/wErAW8BUgH8GAADTAGRAeMB4gHgAf8C3gHcAf8B4QHgAd8B/wHMAssB/wHE
AcMBwgH/As8BzgH/At4B3QH/AvAB7wH/AvAB7wH/AvYB9QH/A0gBh1AAAWIBoQG1Af8BXAHVAfQB/wGa
AegB9wH/AbUB8wH6Af8BwgH4AfwB/wHDAfgB/QH/AcEB9wH9Af8BrwHwAfsB/wGPAeIB9wH/AVsB0AHw
Af8BLwG4AeUB/wFEAWsBkwH/GAABYAF6AWoB/AGiAfABnwH/AdgB7QGvAf8B3gHFAUQB/wG0AeIBQQH/
ATwB5wEVAf8BRwHXAUcB/wEsAXEBWwH8FAADAQECA18B4wHlAeQB4QH/Au4B7QH/Au4B7QH/AusB6gH/
AeMB4gHhAf8C6AHnAf8C6gHpAf8C8wHyAf8C9QH0Af8B+gH5AfgB/wNcAd9QAAFlAaMBuAH/AcUB+QH9
Af8BxQH5Af0B/wHFAfkB/QH/AcUB+QH9Af8BxQH5Af0B/wHFAfkB/QH/AcUB+QH9Af8BxQH5Af0B/wHF
AfkB/QH/AcUB+QH9Af8BRgFuAZUB/xgAA2EB3AHIAfcB1AH/AdgB9gHKAf8B5wHjAakB/wHbAc8BSAH/
Aa8B3AFEAf8BnQHqAasB/wNfAeAYAANAAW8DfwH+A2QB5wNfAfMB6AHnAeYB/wHnAeYB5QH/Au0B7AH/
AvsB+gH/A2cB8gNkAecDfwH+Az0BaFAAAbcB1wHhAf8BjAG9AcwB/wGdAc8B2wH/Aa0B3wHoAf8BuQHs
AfMB/wHCAfUB+gH/AcIB9QH6Af8BuAHrAfEB/wGpAdoB4wH/AZQBxAHRAf8BbAGoAbgB/wGpAcUB0QH/
GAADLQFFAVcBdgFtAfoB2wH4AekB/wHnAfIB2AH/Ae0B5QGzAf8B3wHZAaYB/wFfAYUBXwH7AzIBUCAA
Aw8BFAMKAQ4DUwGqAe8B7gHtAf8C9AHzAf8DUgGkAwgBCwMRARdYAAL+Av8B4wHxAfQB/wG5AdcB4QH/
AZUBvgHMAf8BbAGoAbsB/wFfAZsBsAH/AVsBmAGtAf8BZAGhAbMB/wGMAbIBwgH/AbEBzQHXAf8B3wHr
Ae8B/wP+Af8cAAMuAUcDXgHZAWQBegFoAfwBZAF5AWQB/ANeAd0DMgFQLAADLwFKA10B8ANiAe8DLAFD
ZAADEQEXA1YBswFTAVQBUwGstAADBAEFAxABFQMfAS0DKQE/Ay8BSQMuAUgDKAE9Ax4BKwMPARQDAwEE
EAADtwH/AZwBqAGeAf8BAAFTAS4B/wEYAZIBUAH/AQABVwEuAf8BAAFEAaAB/wEAAUIBngH/AQABPwGb
Af8BAAE9AZkB/wEAATsBlwH/AQABOAGUAf8BAAE3AZMB/wNIAf8DSAH/HAADQQFyAUwCXwHzAVkCXAHP
AUsCTAGQAyMBM1wAAwUBBwMfASwCPgE9AWoCUgFQAaMBWwJZAcQBXQJaAdMBXQJaAdMBWwJZAcMBUgJR
AaEDPAFmAxwBKAMEAQYMAAMVAR0DUQGiAR0BlQFUAf8BggG+AaoB/wEsAaUBggH/AQ0BlwFGAf8BEAGZ
AUsB/wEUAZkBTwH/ARgBnQFUAf8BUgGqAdIB/wFQAagB0QH/AQABOQGVAf8gAAMhATABKwEwAWgB/AGG
Aa0B4QH/AVoBqAHcAf8BOwGSAckB/wEMAU4BqwH/AVUCVgGxAx8BLVMAAQEDEgEYAz4BawFdAlkB1wFW
AisB/AGsASkBAAH/AeEBSQEdAf8B5AFbATEB/wHTAUcBFQH/AaMBQAE6Af0BYQJeAdoCPgE9AWoDDwEU
CAADGAEiAVABUgFQAaQDVgGzAUkBrAGfAf8BUAG3AZ4B/wFaAbsBrAH/AVoBuwGuAf8BWwG7AbAB/wGA
AbwBswH/ARMBmgFXAf8BMAGVAccB/wFTAasB0wH/AQABPAGYAf8gAAFUAlYBqwFJAZ0B0QH/AZkBvAHr
Af8BTQGgAeMB/wGWAbkB6gH/AZQBuAHqAf8BPAGTAcoB/wIrAWQB/ANDAXhQAAMbASYDWQHSARkBAwEA
Af8BigE4ASAB/wHKAYYBQgH/AfYBvAGcAf8B+QHMAbcB/wHjAaABVAH/AbEBUwE5Af8BVQEvARAB/wFe
AlgB3QMcASgIAAFVAVYBVQGxA1YBswNWAbMBOAGkAZEB/wFLAbYBmwH/AUQBsgGbAf8BRgGyAZ4B/wFI
AbMBoQH/AYUBvwG2Af8BGgGeAYIB/wE1AZkByQH/AVcBrQHUAf8BAAFAAZwB/xwAAx8BLQErAUMBbAH8
AZ0BvwHsAf8BRQGcAeIB/wE3AZMB3wH/ATQBkQHfAf8BOwGUAeAB/wGVAbgB6gH/AYYBrQHhAf8BJQGD
AbsB/wFLAkwBkAQAA50B/wOdAf8DnQH/A50B/wOdAf8DnQH/A50B/wOdAf8DnQH/A50B/wOdAf8DnQH/
A50B/wOdAf8DnQH/A50B/wgAAVMCTwGlATABFQEAAf8BVQFAASsB/wGPAVIBPQH/AawBiAFHAf8BwgGj
AYgB/wHBAaUBjgH/AbMBmAGBAf8BkQFSATwB/wFQATcBIgH/AT8BGAEAAf8BVgJVAbEIAAMIAQsDVQGy
A1YBswFSAbIBqAH/AVkBvQGnAf8BhwHBAbUB/wGGAcEBtgH/AYcBwQG3Af8BiAHBAbkB/wEgAaIBiAH/
AToBnAHLAf8BWwGwAdUB/wEAAUMBnwH/EAADKwFCA0gBhAFVAlcBtwFMAl8B8wFSAaQB1wH/AaEBwgHt
Af8BnwHAAe0B/wGdAb8B7QH/AVABowHkAf8BNgGSAd8B/wE0AZAB3gH/AVcBpwHmAf8BkgG2AegB/wEf
AVsBtwH/AzcBWgOdAf8BugK9Af8B5gLsAf8B5gLtAf8B5wLtAf8B6ALuAf8B6QLvAf8B6QLvAf8B6gLv
Af8B6gLwAf8B6wLwAf8B6wLxAf8B7ALxAf8B7ALxAf8BvQK/Af8DnQH/BAADOQFfAVEBMQEWAf8BwwGx
AaIB/wG2AZwBgwH/AaYBVQEoAf8BqAFTASUB/wHDAaQBhwH/AdgBxgGwAf8BvQGpAYsB/wFbATsBGwH/
ATgBGAEAAf8BLgEKAQAB/wE1AQ4BAAH/AzMBUwgAAwYBCANVAbIBKwGgAYoB/wGTAckBugH/ATsBrwGX
Af8BIAGiAYMB/wEhAaMBhwH/ASMBpAGLAf8BIgGqAZIB/wEwAcIB7QH/AYEBtAHXAf8BBAFHAaMB/wwA
A0wBkwFAAZcBzwH/AVcBqAHZAf8BjQG0AeIB/wGjAcQB7QH/AacBxwHuAf8BQAGXAc0B/wEQAVEBsgH/
ATsBkwHJAf8BnwHAAe0B/wFUAZYBowH/AZ4BlgEkAf8BWAGUAZEB/wGNAbMB6QH/AVUBpQHYAf8BWgJe
AdgEAANcAeoB2wLiAf8BzQLPAf8DywH/A8wB/wPOAf8DzwH/A9AB/wPSAf8D0wH/A9UB/wHXAtgB/wHn
AuwB/wNtAfcEAAMiATEBVgJVAbEBQwEXAQAB/wGqAYUBOwH/AbIBTgEMAf8BrQErAQAB/wG6AUgBAAH/
AeoB1QG/Af8B/QH8AfoB/wHWAb4BpgH/AZABOwEIAf8BPgEMAQAB/wE/ARwBAAH/ATgBGAEAAf8DVwHF
AxwBJwgAAwQBBgERAZQBUwH/AUoBuQGeAf8BJQGmAYkB/wFVAbEB1QH/AVEBrQHUAf8BTQGrAdIB/wE7
AboB5AH/AQABmQFFAf8BAwGOATQB/wEGAUwBmgH/DAABSAJiAfYBrgHNAfAB/wGwAc8B8AH/AZgBvwHs
Af8BWgGuAecB/wGqAcoB7wH/ARkBVwG4Af8EAAERAVIBswH/AaIBwwHtAf8BqAGXAQ0B/wHEAbUBNgH/
AawBlwECAf8BNwGTAd8B/wGYAbsB6wH/AQABQAGfAf8EAANcAeoB2QLhAf8BywLMAf8DxwH/A8gB/wPK
Af8DywH/A80B/wPOAf8D0AH/A9EB/wHTAtQB/wHlAusB/wNtAfcEAAMuAUcDWQHsAT4BDAEAAf8BmQEr
AQAB/wG4AUMBAAH/AcIBPwEAAf8ByQFRAQAB/wHmAb8BlAH/AewB1AG2Af8BzQGcAT4B/wGoAUgBCAH/
AZkBSQEdAf8BowGMAU4B/wFbAUIBKwH/AlEBPwH3ATUCNAFVDAABNAGOAcQB/wEuAawBiwH/ASsBqgGP
Af8BWgG1AdgB/wFWAbIB1gH/AVMBrwHVAf8BTwGsAdMB/wEAAZABPgH/ATUBqAGEAf8BAAFUAS8B/wMU
ARsIAAFaAmAB3gGoAckB7QH/AYQBpwHtAf8BNAFGAe0B/wFGAY4B6QH/Aa0BzQHwAf8BSQGdAdIB/wEa
AVgBuQH/AUMBmQHOAf8BpQHFAe4B/wGVAZoBRQH/Aa0BlwECAf8BnQGXASkB/wFCAZsB4gH/AZgBuwHq
Af8BSAJiAfYEAANcAeoB1wLfAf8BxwLJAf8DwgH/A8QB/wPFAf8DyAH/A8kB/wPKAf8DzAH/A80B/wHQ
AtEB/wHjAuoB/wNtAfcEAAM5AV8CQAEnAf0BUAEXAQAB/wGuATUBAAH/AcABPQEAAf8B5wGWASIB/wHo
AbIBVgH/AeQBsQFWAf8B0gGJARUB/wG9AUIBAAH/AagBMAEAAf8BuAGNATkB/wHUAcMBsgH/AZgBhAFK
Af8BNwEZAQAB/wE+Aj0BagwAAToBkQHJAf8BpAHMAeQB/wGHAbsB2wH/ARsBoQFWAf8BFQGcAVAB/wEQ
AZoBTAH/AQsBlgFGAf8BJwGjAYEB/wGEAcABqwH/AR4BlgFVAf8DUQGiAxUBHQQAA1EBnAGSAbkB5QH/
AUoBUAH2Af8BgQGEAfUB/wIcAfAB/wGQAbsB6wH/Aa4BzQHwAf8BrAHMAfAB/wGqAcoB8AH/AYUBsgHp
Af8BOgGpAcEB/wEgAbMBjQH/ATIBqAG2Af8BTAGhAeQB/wGXAboB6AH/A10B7QQAA1wB6gHWAt8B/wHD
AsUB/wPAAf8DwAH/A8IB/wPDAf8DxAH/A8UB/wPIAf8DyQH/A80B/wHgAugB/wNtAfcEAAM3AVoCTQEo
AfoBgwEiAQAB/wHLAUwBAAH/AeUBiwEZAf8B/gG2AU4C/wHjAcIB/wH0AbwBhQH/AdYBUwEFAf8BxQFK
AQAB/wG6AT8BAAH/Aa8BUwEVAf8BrgGIATkB/wGUAVIBOQH/ATgBGgEAAf8DPAFmDAABPwGVAc0B/wGo
Ac8B5QH/AYwBvwHdAf8BIQGlAYEB/wGNAcUBuAH/AYkBwwG0Af8BhgHBAbEB/wGEAb8BrwH/AVMBuQGf
Af8BSgGtAaAB/wNWAbMBUAFSAVABpAMYASIDIwEzASsBYQF3AfwBkgGkAfUB/wE1ATYB9gH/AS0BhgH0
Af8BFwGmAfsB/wE4AasB8gH/AVoBrwHnAf8BVwGtAecB/wFUAaoB5gH/ARsBtgGAAf8BPAHIAZcB/wEX
AbcBVgH/AVkBrAHnAf8BjwG1AeMB/wFaAl4B1QQAA2AB1gHHAs0B/wHbAuQB/wHbAuQB/wHbAuUB/wHc
AuUB/wHcAuUB/wHdAuYB/wHdAuYB/wHeAucB/wHfAugB/wHgAugB/wHNAtMB/wNfAeMEAAMmATkBYAJa
Ad4BjgEqAQAB/wHsAZ4BLwH/Af4BvwGFAv8BzAGhAv8B3wG7Af8B/gHCAVsB/wHiAY4BJQH/AdMBhAEW
Af8BygFVAQgB/wG1AUwBBgH/AZcBPQEDAf8BgQE6ARUB/wNZAewDLgFIDAABQwGYAdAB/wGrAdEB5wH/
AZABwgHfAf8BKAGpAYgB/wGRAckBuwH/AVIBugGlAf8BTgG4AaEB/wFKAbYBngH/AU4BuAGdAf8BOQGl
AZIB/wNWAbMDVgGzAVUBVgFVAbEEAANJAYcBhgGvAeEB/wG5AdcB8wH/AQ4BpgH+Af8BSAG/Av8BBwGj
Av8BQgG+AfAB/wEWAc4B+wH/ATYBvgHxAf8BLgGzAaAB/wEXAbcBVQH/ASMBswGQAf8BpwHIAe4B/wFT
AaUB1gH/AU8CUQGcBAADLAFDA1sByAOdAf8DnQH/A50B/wOdAf8DnQH/A50B/wOdAf8DnQH/A50B/wOd
Af8DXgHdAzEBTgQAAwkBDANLAY4BwAFKAQkC/wG8AVsB/wH6Ac4BpwH/AfgB2wG+Av8B4gHGAv8BvgGG
Af8B9AGsAVEB/wHsAcIBmgH/AeIBtQGLAf8BuAFRAQ8B/wGdAUABCAH/AYgBQAEcAf8DTwGlAxABFQwA
AUcBmwHTAf8BrgHUAegB/wGrAdMB6AH/ATUBsQGQAf8BmwHOAcAB/wGZAc0BvQH/AZYBywG7Af8BlQHK
AbkB/wGAAb8BqAH/AVMBswGpAf8DVgGzA1UBsgMIAQsEAAMEAQYDUQGfAYUBrgHhAf8BNgGyAfkB/wEH
AaMC/wEcAakB+wH/AQwB0wH+Af8BSAHiAv8BBwHVAv8BWwGwAegB/wFYAa0B5wH/AakBygHvAf8BpQHF
Ae0B/wErAU8BbgH8AyEBMEQAAxMBGgJkAVMB8QHYAZ4BTgH/AecB0wHAAf8B/AH1Ae4C/wH4AesC/wHl
AcIB/wH2AbkBggH/AfIB0gG4Af8B7gHSAbYB/wHCAYYBKgH/AacBUgEjAf8CTQEpAfoDHQEpEAABSgGd
AdUB/wFIAZsB0wH/AUUBmgHSAf8BJQGhAYwB/wEgAZ8BigH/AR0BnQGFAf8BGQGZAYAB/wEyAaUBkgH/
AVsBuAGxAf8BLAGhAYsB/wNVAbIDBgEIEAADQgF1AV8CYgH2AY4BtgHjAf8BuQHXAfMB/wE5AdUB+wH/
AQYB1QL/AR0B0QH7Af8BswHSAfIB/wGxAdAB8QH/AZIBuAHiAf8BPgGVAcwB/wNKAYpMAAM1AVcBqQE+
ARAB/wHKAbgBqAb/Af4B/AL/AfYB4gH/AfsBxQGgAf8B5AG5AZUB/wHbAawBWQH/AcMBjgE4Af8BkwFA
ARQB/wE+Aj0BajAAAVMCVAGsA1YBswNWAbMDBAEGGAADFgEeA1QBrgFSAaMB3AH/AZEBuAHkAf8BqAHK
AewB/wGlAccB7AH/AY0BtQHiAf8BRAGaAdIB/wFaAl8B2wMxAU5UAAMyAVECZAFZAewB0AGyAZUB/wHs
AeAB2QH/AeYB1QHEAf8B0wGwAZQB/wHTAaYBUwH/AcsBjwExAf8BZwFlAVkB8gE6AjkBYDQAAVMCVAGs
A1YBswMEAQYkAAMrAUIDTAGQAVsCXQHSAVkCXAHPA04BmQMtAUVgAAMRARcDRAF6AloBVwHFAmUBXgHl
AmEBWAHmAlwBWQHJAkgBRwGDAxUBHRAAAUIBTQE+BwABPgMAASgDAAFAAwABIAMAAQEBAAEBBgABARYA
A/8BAAHgAQcCAAH8AT8CAAHAAQMCAAH8AT8CAAHAAQMCAAHAAQMCAAHAAQMCAAHAAQMCAAHAAQMCAAHA
AQMCAAHAAQMCAAHAAQMCAAHAAQMGAAHAAQMCAAEBAYACAAHAAQMBgAIBAYACAAHAAQMBgAEBBAABwAED
AcABAwHAAQMCAAHAAQMB8AEPAcABAwIAAcABAwHwAQ8BgAEDAgABwAEDAfABDwHAAQMCAAHAAQMB8AEP
AfABDwIAAcABAwH4AR8B/AE/AgAB4wX/AeABBwGAAQEB/AEfAv8BwAEDAYABBwH4AQcC/wGAAQMBAAEH
AfgBAwL/AcABAwEAAQcB8AEBAgABwAEDAQABBwGAAwABgAEBAYABBwIAAYABAQIAAcABBwEBAQABgAEB
AgAB4AEDAgABgAEBAgAB4AEBAgABgAEBAgAB4AMAAYABAQIAAeABAAGAAQABgAEBAgAB4AEAAYABAAL/
AYABAQHgAQEB4AEBAv8BwAEDAf8BwwHwAQMC/wHgAQcB/wHHAfwBDwL/AfABDws=
</value>
</data>
</root>

View File

@@ -110,6 +110,7 @@ Public Class frmOptions
Friend WithEvents lblSQLDatabaseName As System.Windows.Forms.Label
Friend WithEvents txtSQLDatabaseName As System.Windows.Forms.TextBox
Friend WithEvents chkAlwaysShowPanelTabs As System.Windows.Forms.CheckBox
Friend WithEvents chkIdentifyQuickConnectTabs As System.Windows.Forms.CheckBox
Private components As System.ComponentModel.IContainer
Private Sub InitializeComponent()
@@ -198,7 +199,9 @@ Public Class frmOptions
Me.tcTabControl = New System.Windows.Forms.TabControl()
Me.tabStartupExit = New System.Windows.Forms.TabPage()
Me.tabAppearance = New System.Windows.Forms.TabPage()
Me.chkAlwaysShowPanelTabs = New System.Windows.Forms.CheckBox()
Me.tabTabsAndPanels = New System.Windows.Forms.TabPage()
Me.chkIdentifyQuickConnectTabs = New System.Windows.Forms.CheckBox()
Me.tabConnections = New System.Windows.Forms.TabPage()
Me.pnlDefaultCredentials = New System.Windows.Forms.Panel()
Me.radCredentialsCustom = New System.Windows.Forms.RadioButton()
@@ -225,7 +228,6 @@ Public Class frmOptions
Me.lblSQLPassword = New System.Windows.Forms.Label()
Me.tabUpdates = New System.Windows.Forms.TabPage()
Me.tabAdvanced = New System.Windows.Forms.TabPage()
Me.chkAlwaysShowPanelTabs = New System.Windows.Forms.CheckBox()
CType(Me.numPuttyWaitTime, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.numUVNCSCPort, System.ComponentModel.ISupportInitialize).BeginInit()
Me.pnlProxy.SuspendLayout()
@@ -746,7 +748,7 @@ Public Class frmOptions
'chkAlwaysShowPanelSelectionDlg
'
Me.chkAlwaysShowPanelSelectionDlg.AutoSize = True
Me.chkAlwaysShowPanelSelectionDlg.Location = New System.Drawing.Point(3, 95)
Me.chkAlwaysShowPanelSelectionDlg.Location = New System.Drawing.Point(3, 141)
Me.chkAlwaysShowPanelSelectionDlg.Name = "chkAlwaysShowPanelSelectionDlg"
Me.chkAlwaysShowPanelSelectionDlg.Size = New System.Drawing.Size(317, 17)
Me.chkAlwaysShowPanelSelectionDlg.TabIndex = 4
@@ -756,7 +758,7 @@ Public Class frmOptions
'chkShowLogonInfoOnTabs
'
Me.chkShowLogonInfoOnTabs.AutoSize = True
Me.chkShowLogonInfoOnTabs.Location = New System.Drawing.Point(3, 26)
Me.chkShowLogonInfoOnTabs.Location = New System.Drawing.Point(3, 49)
Me.chkShowLogonInfoOnTabs.Name = "chkShowLogonInfoOnTabs"
Me.chkShowLogonInfoOnTabs.Size = New System.Drawing.Size(203, 17)
Me.chkShowLogonInfoOnTabs.TabIndex = 1
@@ -766,7 +768,7 @@ Public Class frmOptions
'chkDoubleClickClosesTab
'
Me.chkDoubleClickClosesTab.AutoSize = True
Me.chkDoubleClickClosesTab.Location = New System.Drawing.Point(3, 72)
Me.chkDoubleClickClosesTab.Location = New System.Drawing.Point(3, 118)
Me.chkDoubleClickClosesTab.Name = "chkDoubleClickClosesTab"
Me.chkDoubleClickClosesTab.Size = New System.Drawing.Size(159, 17)
Me.chkDoubleClickClosesTab.TabIndex = 3
@@ -776,7 +778,7 @@ Public Class frmOptions
'chkShowProtocolOnTabs
'
Me.chkShowProtocolOnTabs.AutoSize = True
Me.chkShowProtocolOnTabs.Location = New System.Drawing.Point(3, 49)
Me.chkShowProtocolOnTabs.Location = New System.Drawing.Point(3, 72)
Me.chkShowProtocolOnTabs.Name = "chkShowProtocolOnTabs"
Me.chkShowProtocolOnTabs.Size = New System.Drawing.Size(166, 17)
Me.chkShowProtocolOnTabs.TabIndex = 2
@@ -786,7 +788,7 @@ Public Class frmOptions
'chkOpenNewTabRightOfSelected
'
Me.chkOpenNewTabRightOfSelected.AutoSize = True
Me.chkOpenNewTabRightOfSelected.Location = New System.Drawing.Point(3, 3)
Me.chkOpenNewTabRightOfSelected.Location = New System.Drawing.Point(3, 26)
Me.chkOpenNewTabRightOfSelected.Name = "chkOpenNewTabRightOfSelected"
Me.chkOpenNewTabRightOfSelected.Size = New System.Drawing.Size(280, 17)
Me.chkOpenNewTabRightOfSelected.TabIndex = 0
@@ -797,7 +799,7 @@ Public Class frmOptions
'
Me.chkMCWarnings.AutoSize = True
Me.chkMCWarnings.Enabled = False
Me.chkMCWarnings.Location = New System.Drawing.Point(19, 214)
Me.chkMCWarnings.Location = New System.Drawing.Point(19, 256)
Me.chkMCWarnings.Name = "chkMCWarnings"
Me.chkMCWarnings.Size = New System.Drawing.Size(71, 17)
Me.chkMCWarnings.TabIndex = 8
@@ -808,7 +810,7 @@ Public Class frmOptions
'
Me.chkMCErrors.AutoSize = True
Me.chkMCErrors.Enabled = False
Me.chkMCErrors.Location = New System.Drawing.Point(19, 237)
Me.chkMCErrors.Location = New System.Drawing.Point(19, 279)
Me.chkMCErrors.Name = "chkMCErrors"
Me.chkMCErrors.Size = New System.Drawing.Size(53, 17)
Me.chkMCErrors.TabIndex = 9
@@ -819,7 +821,7 @@ Public Class frmOptions
'
Me.chkMCInformation.AutoSize = True
Me.chkMCInformation.Enabled = False
Me.chkMCInformation.Location = New System.Drawing.Point(19, 191)
Me.chkMCInformation.Location = New System.Drawing.Point(19, 233)
Me.chkMCInformation.Name = "chkMCInformation"
Me.chkMCInformation.Size = New System.Drawing.Size(83, 17)
Me.chkMCInformation.TabIndex = 7
@@ -829,7 +831,7 @@ Public Class frmOptions
'lblSwitchToErrorsAndInfos
'
Me.lblSwitchToErrorsAndInfos.AutoSize = True
Me.lblSwitchToErrorsAndInfos.Location = New System.Drawing.Point(3, 171)
Me.lblSwitchToErrorsAndInfos.Location = New System.Drawing.Point(3, 213)
Me.lblSwitchToErrorsAndInfos.Name = "lblSwitchToErrorsAndInfos"
Me.lblSwitchToErrorsAndInfos.Size = New System.Drawing.Size(159, 13)
Me.lblSwitchToErrorsAndInfos.TabIndex = 6
@@ -838,7 +840,7 @@ Public Class frmOptions
'chkUseOnlyErrorsAndInfosPanel
'
Me.chkUseOnlyErrorsAndInfosPanel.AutoSize = True
Me.chkUseOnlyErrorsAndInfosPanel.Location = New System.Drawing.Point(3, 146)
Me.chkUseOnlyErrorsAndInfosPanel.Location = New System.Drawing.Point(3, 188)
Me.chkUseOnlyErrorsAndInfosPanel.Name = "chkUseOnlyErrorsAndInfosPanel"
Me.chkUseOnlyErrorsAndInfosPanel.Size = New System.Drawing.Size(278, 17)
Me.chkUseOnlyErrorsAndInfosPanel.TabIndex = 5
@@ -848,7 +850,7 @@ Public Class frmOptions
'chkShowFullConnectionsFilePathInTitle
'
Me.chkShowFullConnectionsFilePathInTitle.AutoSize = True
Me.chkShowFullConnectionsFilePathInTitle.Location = New System.Drawing.Point(3, 151)
Me.chkShowFullConnectionsFilePathInTitle.Location = New System.Drawing.Point(3, 141)
Me.chkShowFullConnectionsFilePathInTitle.Name = "chkShowFullConnectionsFilePathInTitle"
Me.chkShowFullConnectionsFilePathInTitle.Size = New System.Drawing.Size(239, 17)
Me.chkShowFullConnectionsFilePathInTitle.TabIndex = 4
@@ -858,7 +860,7 @@ Public Class frmOptions
'chkShowSystemTrayIcon
'
Me.chkShowSystemTrayIcon.AutoSize = True
Me.chkShowSystemTrayIcon.Location = New System.Drawing.Point(3, 199)
Me.chkShowSystemTrayIcon.Location = New System.Drawing.Point(3, 187)
Me.chkShowSystemTrayIcon.Name = "chkShowSystemTrayIcon"
Me.chkShowSystemTrayIcon.Size = New System.Drawing.Size(172, 17)
Me.chkShowSystemTrayIcon.TabIndex = 5
@@ -868,7 +870,7 @@ Public Class frmOptions
'chkMinimizeToSystemTray
'
Me.chkMinimizeToSystemTray.AutoSize = True
Me.chkMinimizeToSystemTray.Location = New System.Drawing.Point(3, 223)
Me.chkMinimizeToSystemTray.Location = New System.Drawing.Point(3, 210)
Me.chkMinimizeToSystemTray.Name = "chkMinimizeToSystemTray"
Me.chkMinimizeToSystemTray.Size = New System.Drawing.Size(139, 17)
Me.chkMinimizeToSystemTray.TabIndex = 6
@@ -878,7 +880,7 @@ Public Class frmOptions
'chkShowDescriptionTooltipsInTree
'
Me.chkShowDescriptionTooltipsInTree.AutoSize = True
Me.chkShowDescriptionTooltipsInTree.Location = New System.Drawing.Point(3, 127)
Me.chkShowDescriptionTooltipsInTree.Location = New System.Drawing.Point(3, 118)
Me.chkShowDescriptionTooltipsInTree.Name = "chkShowDescriptionTooltipsInTree"
Me.chkShowDescriptionTooltipsInTree.Size = New System.Drawing.Size(231, 17)
Me.chkShowDescriptionTooltipsInTree.TabIndex = 3
@@ -1007,7 +1009,6 @@ Public Class frmOptions
'
'tabAppearance
'
Me.tabAppearance.Controls.Add(Me.chkAlwaysShowPanelTabs)
Me.tabAppearance.Controls.Add(Me.lblLanguageRestartRequired)
Me.tabAppearance.Controls.Add(Me.cboLanguage)
Me.tabAppearance.Controls.Add(Me.lblLanguage)
@@ -1022,8 +1023,20 @@ Public Class frmOptions
Me.tabAppearance.Text = "Appearance"
Me.tabAppearance.UseVisualStyleBackColor = True
'
'chkAlwaysShowPanelTabs
'
Me.chkAlwaysShowPanelTabs.AutoSize = True
Me.chkAlwaysShowPanelTabs.Location = New System.Drawing.Point(3, 3)
Me.chkAlwaysShowPanelTabs.Name = "chkAlwaysShowPanelTabs"
Me.chkAlwaysShowPanelTabs.Size = New System.Drawing.Size(139, 17)
Me.chkAlwaysShowPanelTabs.TabIndex = 7
Me.chkAlwaysShowPanelTabs.Text = "Always show panel tabs"
Me.chkAlwaysShowPanelTabs.UseVisualStyleBackColor = True
'
'tabTabsAndPanels
'
Me.tabTabsAndPanels.Controls.Add(Me.chkAlwaysShowPanelTabs)
Me.tabTabsAndPanels.Controls.Add(Me.chkIdentifyQuickConnectTabs)
Me.tabTabsAndPanels.Controls.Add(Me.chkUseOnlyErrorsAndInfosPanel)
Me.tabTabsAndPanels.Controls.Add(Me.chkOpenNewTabRightOfSelected)
Me.tabTabsAndPanels.Controls.Add(Me.lblSwitchToErrorsAndInfos)
@@ -1041,6 +1054,16 @@ Public Class frmOptions
Me.tabTabsAndPanels.Text = "Tabs & Panels"
Me.tabTabsAndPanels.UseVisualStyleBackColor = True
'
'chkIdentifyQuickConnectTabs
'
Me.chkIdentifyQuickConnectTabs.AutoSize = True
Me.chkIdentifyQuickConnectTabs.Location = New System.Drawing.Point(3, 95)
Me.chkIdentifyQuickConnectTabs.Name = "chkIdentifyQuickConnectTabs"
Me.chkIdentifyQuickConnectTabs.Size = New System.Drawing.Size(293, 17)
Me.chkIdentifyQuickConnectTabs.TabIndex = 10
Me.chkIdentifyQuickConnectTabs.Text = Global.mRemoteNG.My.Language.strIdentifyQuickConnectTabs
Me.chkIdentifyQuickConnectTabs.UseVisualStyleBackColor = True
'
'tabConnections
'
Me.tabConnections.Controls.Add(Me.pnlRdpReconnectionCount)
@@ -1345,16 +1368,6 @@ Public Class frmOptions
Me.tabAdvanced.Text = "Advanced"
Me.tabAdvanced.UseVisualStyleBackColor = True
'
'chkAlwaysShowPanelTabs
'
Me.chkAlwaysShowPanelTabs.AutoSize = True
Me.chkAlwaysShowPanelTabs.Location = New System.Drawing.Point(3, 104)
Me.chkAlwaysShowPanelTabs.Name = "chkAlwaysShowPanelTabs"
Me.chkAlwaysShowPanelTabs.Size = New System.Drawing.Size(139, 17)
Me.chkAlwaysShowPanelTabs.TabIndex = 7
Me.chkAlwaysShowPanelTabs.Text = "Always show panel tabs"
Me.chkAlwaysShowPanelTabs.UseVisualStyleBackColor = True
'
'frmOptions
'
Me.CancelButton = Me.btnCancel
@@ -1439,6 +1452,7 @@ Public Class frmOptions
Me.chkOpenNewTabRightOfSelected.Checked = My.Settings.OpenTabsRightOfSelected
Me.chkShowLogonInfoOnTabs.Checked = My.Settings.ShowLogonInfoOnTabs
Me.chkShowProtocolOnTabs.Checked = My.Settings.ShowProtocolOnTabs
chkIdentifyQuickConnectTabs.Checked = Settings.IdentifyQuickConnectTabs
Me.chkShowFullConnectionsFilePathInTitle.Checked = My.Settings.ShowCompleteConsPathInTitle
Me.chkDoubleClickClosesTab.Checked = My.Settings.DoubleClickOnTabClosesIt
Me.chkAlwaysShowPanelSelectionDlg.Checked = My.Settings.AlwaysShowPanelSelectionDlg
@@ -1561,6 +1575,7 @@ Public Class frmOptions
My.Settings.OpenTabsRightOfSelected = Me.chkOpenNewTabRightOfSelected.Checked
My.Settings.ShowLogonInfoOnTabs = Me.chkShowLogonInfoOnTabs.Checked
My.Settings.ShowProtocolOnTabs = Me.chkShowProtocolOnTabs.Checked
Settings.IdentifyQuickConnectTabs = chkIdentifyQuickConnectTabs.Checked
My.Settings.DoubleClickOnTabClosesIt = Me.chkDoubleClickClosesTab.Checked
My.Settings.AlwaysShowPanelSelectionDlg = Me.chkAlwaysShowPanelSelectionDlg.Checked
@@ -1735,6 +1750,7 @@ Public Class frmOptions
chkAlwaysShowPanelTabs.Text = My.Language.strAlwaysShowPanelTabs
chkShowDescriptionTooltipsInTree.Text = My.Language.strShowDescriptionTooltips
chkShowProtocolOnTabs.Text = My.Language.strShowProtocolOnTabs
chkIdentifyQuickConnectTabs.Text = Language.strIdentifyQuickConnectTabs
chkShowLogonInfoOnTabs.Text = My.Language.strShowLogonInfoOnTabs
chkOpenNewTabRightOfSelected.Text = My.Language.strOpenNewTabRight
chkAlwaysShowPanelSelectionDlg.Text = My.Language.strAlwaysShowPanelSelection

View File

@@ -1951,6 +1951,15 @@ Namespace My
End Get
End Property
'''<summary>
''' Looks up a localized string similar to Identify quick connect tabs by adding the prefix &quot;Quick:&quot;.
'''</summary>
Friend Shared ReadOnly Property strIdentifyQuickConnectTabs() As String
Get
Return ResourceManager.GetString("strIdentifyQuickConnectTabs", resourceCulture)
End Get
End Property
'''<summary>
''' Looks up a localized string similar to Import from Active Directory.
'''</summary>
@@ -5024,6 +5033,15 @@ Namespace My
End Get
End Property
'''<summary>
''' Looks up a localized string similar to Search.
'''</summary>
Friend Shared ReadOnly Property strSearchPrompt() As String
Get
Return ResourceManager.GetString("strSearchPrompt", resourceCulture)
End Get
End Property
'''<summary>
''' Looks up a localized string similar to Send To....
'''</summary>

View File

@@ -2061,4 +2061,10 @@ mRemoteNG will now quit and begin with the installation.</value>
<data name="strAlwaysShowPanelTabs" xml:space="preserve">
<value>Always show panel tabs</value>
</data>
<data name="strIdentifyQuickConnectTabs" xml:space="preserve">
<value>Identify quick connect tabs by adding the prefix "Quick:"</value>
</data>
<data name="strSearchPrompt" xml:space="preserve">
<value>Search</value>
</data>
</root>

View File

@@ -32,6 +32,6 @@ Imports System.Runtime.InteropServices
' by using the '*' as shown below:
' <Assembly: AssemblyVersion("1.0.*")>
<Assembly: AssemblyVersion("1.70.*")>
<Assembly: AssemblyVersion("1.71.*")>
<Assembly: NeutralResourcesLanguageAttribute("en")>

View File

@@ -2321,6 +2321,30 @@ Namespace My
Me("AlwaysShowPanelTabs") = value
End Set
End Property
<Global.System.Configuration.UserScopedSettingAttribute(), _
Global.System.Configuration.SettingsProviderAttribute(GetType(mRemoteNG.Config.Settings.Providers.ChooseProvider)), _
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
Global.System.Configuration.DefaultSettingValueAttribute("False"), _
Global.System.Configuration.SettingsManageabilityAttribute(Global.System.Configuration.SettingsManageability.Roaming)> _
Public Property IdentifyQuickConnectTabs() As Boolean
Get
Return CType(Me("IdentifyQuickConnectTabs"),Boolean)
End Get
Set
Me("IdentifyQuickConnectTabs") = value
End Set
End Property
<Global.System.Configuration.ApplicationScopedSettingAttribute(), _
Global.System.Configuration.SettingsProviderAttribute(GetType(mRemoteNG.Config.Settings.Providers.ChooseProvider)), _
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
Global.System.Configuration.DefaultSettingValueAttribute("release")> _
Public ReadOnly Property UpdateChannel() As String
Get
Return CType(Me("UpdateChannel"),String)
End Get
End Property
End Class
End Namespace

View File

@@ -527,5 +527,11 @@
<Setting Name="AlwaysShowPanelTabs" Provider="mRemoteNG.Config.Settings.Providers.ChooseProvider" Roaming="true" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="IdentifyQuickConnectTabs" Provider="mRemoteNG.Config.Settings.Providers.ChooseProvider" Roaming="true" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="UpdateChannel" Provider="mRemoteNG.Config.Settings.Providers.ChooseProvider" Type="System.String" Scope="Application">
<Value Profile="(Default)">release</Value>
</Setting>
</Settings>
</SettingsFile>

View File

@@ -43,36 +43,38 @@ Namespace Security
Return StrToEncrypt
End Function
Public Shared Function Decrypt(ByVal StrToDecrypt As String, ByVal StrSecret As String) As String
If StrToDecrypt = "" Or StrSecret = "" Then
Return StrToDecrypt
Public Shared Function Decrypt(ByVal ciphertextBase64 As String, ByVal password As String) As String
If String.IsNullOrEmpty(ciphertextBase64) Or String.IsNullOrEmpty(password) Then
Return ciphertextBase64
End If
Try
Dim rd As New RijndaelManaged
Dim rijndaelIvLength As Integer = 16
Dim md5 As New MD5CryptoServiceProvider
Dim key() As Byte = md5.ComputeHash(Encoding.UTF8.GetBytes(StrSecret))
Dim plaintext As String
md5.Clear()
Using rijndaelManaged As New RijndaelManaged
Using md5 As New MD5CryptoServiceProvider
Dim key() As Byte = md5.ComputeHash(Encoding.UTF8.GetBytes(password))
rijndaelManaged.Key = key
End Using
Dim encdata() As Byte = Convert.FromBase64String(StrToDecrypt)
Dim ms As New MemoryStream(encdata)
Dim iv(15) As Byte
Dim ciphertext() As Byte = Convert.FromBase64String(ciphertextBase64)
ms.Read(iv, 0, rijndaelIvLength)
rd.IV = iv
rd.Key = key
Using memoryStream As New MemoryStream(ciphertext)
Const ivLength As Integer = 16
Dim iv(ivLength - 1) As Byte
memoryStream.Read(iv, 0, ivLength)
rijndaelManaged.IV = iv
Dim cs As New CryptoStream(ms, rd.CreateDecryptor, CryptoStreamMode.Read)
Using cryptoStream As New CryptoStream(memoryStream, rijndaelManaged.CreateDecryptor, CryptoStreamMode.Read)
Using streamReader As New StreamReader(cryptoStream, System.Text.Encoding.UTF8, True)
plaintext = streamReader.ReadToEnd()
End Using
rijndaelManaged.Clear()
End Using ' cryptoStream
End Using ' memoryStream
End Using ' rijndaelManaged
Dim data(ms.Length - rijndaelIvLength) As Byte
Dim i As Integer = cs.Read(data, 0, data.Length)
cs.Close()
rd.Clear()
Return System.Text.Encoding.UTF8.GetString(data, 0, i)
Return plaintext
Catch ex As Exception
' Ignore CryptographicException "Padding is invalid and cannot be removed." when password is incorrect.
If Not TypeOf ex Is CryptographicException Then
@@ -80,7 +82,7 @@ Namespace Security
End If
End Try
Return StrToDecrypt
Return ciphertextBase64
End Function
End Class
End Namespace

View File

@@ -10,7 +10,7 @@ Namespace Security
Public Class Impersonator
#Region "Logon API"
Private Const LOGON32_PROVIDER_DEFAULT As Integer = 0
Private Const LOGON32_LOGON_INTERACTIVE As Integer = 2 ' This parameter causes LogonUser to create a primary token.
Private Const LOGON32_LOGON_NEW_CREDENTIALS As Integer = 9
Private Const SecurityImpersonation As Integer = 2
@@ -37,7 +37,6 @@ Namespace Security
#End Region
Private tokenHandle As New IntPtr(0)
Private dupeTokenHandle As New IntPtr(0)
Private impersonatedUser As WindowsImpersonationContext = Nothing
' GetErrorMessage formats and returns an error message corresponding to the input errorCode.
@@ -59,9 +58,8 @@ Namespace Security
If Not (impersonatedUser Is Nothing) Then Throw New Exception("Already impersonating a user.")
tokenHandle = IntPtr.Zero
dupeTokenHandle = IntPtr.Zero
Dim returnValue As Integer = LogonUser(UserName, DomainName, Password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, tokenHandle)
Dim returnValue As Integer = LogonUser(UserName, DomainName, Password, LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_DEFAULT, tokenHandle)
If 0 = returnValue Then
Dim errCode As Integer = Marshal.GetLastWin32Error()
@@ -70,17 +68,8 @@ Namespace Security
Throw exLogon
End If
returnValue = DuplicateToken(tokenHandle, SecurityImpersonation, dupeTokenHandle)
If 0 = returnValue Then
CloseHandle(tokenHandle)
Throw New ApplicationException("Error trying to duplicate handle.")
End If
' The token that is passed to the following constructor must
' be a primary token in order to use it for impersonation.
Dim newId As New WindowsIdentity(dupeTokenHandle)
Dim newId As New WindowsIdentity(tokenHandle)
impersonatedUser = newId.Impersonate()
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, "Starting Impersonation failed (Sessions feature will not work)" & vbNewLine & ex.Message, True)
End Try
@@ -98,7 +87,6 @@ Namespace Security
Finally
If Not System.IntPtr.op_Equality(tokenHandle, IntPtr.Zero) Then CloseHandle(tokenHandle)
If Not System.IntPtr.op_Equality(dupeTokenHandle, IntPtr.Zero) Then CloseHandle(dupeTokenHandle)
impersonatedUser = Nothing
End Try

View File

@@ -0,0 +1,94 @@
Imports System.Text.RegularExpressions
Namespace Tools
' Adapted from http://qntm.org/cmd
Public Class CommandLineArguments
#Region "Protected Fields"
Protected Arguments As New List(Of Argument)
#End Region
#Region "Public Properties"
Public Property EscapeForShell As Boolean
#End Region
#Region "Public Methods"
Public Sub Add(ByVal argument As String, Optional ByVal forceQuotes As Boolean = False)
Arguments.Add(New Argument(argument, False, forceQuotes))
End Sub
Public Sub Add(ByVal ParamArray argumentArray As String())
For Each argument As String In argumentArray
Add(argument)
Next
End Sub
Public Sub AddFileName(ByVal fileName As String, Optional ByVal forceQuotes As Boolean = False)
Arguments.Add(New Argument(fileName, True, forceQuotes))
End Sub
Public Overrides Function ToString() As String
Dim processedArguments As New List(Of String)
For Each argument As Argument In Arguments
processedArguments.Add(ProcessArgument(argument, EscapeForShell))
Next
Return String.Join(" ", processedArguments.ToArray())
End Function
Public Shared Function PrefixFileName(ByVal argument As String) As String
If argument.StartsWith("-") Then argument = ".\" & argument
Return argument
End Function
Public Shared Function EscapeBackslashes(ByVal argument As String) As String
' Sequence of backslashes followed by a double quote:
' double up all the backslashes and escape the double quote
Return Regex.Replace(argument, "(\\*)""", "$1$1\""")
End Function
Public Shared Function QuoteArgument(ByVal argument As String, Optional ByVal forceQuotes As Boolean = False) As String
If Not forceQuotes And Not String.IsNullOrEmpty(argument) And Not argument.Contains(" ") Then Return argument
' Sequence of backslashes followed by the end of the string
' (which will become a double quote):
' double up all the backslashes
argument = Regex.Replace(argument, "(\\*)$", "$1$1")
Return """" & argument & """"
End Function
Public Shared Function EscapeShellMetacharacters(ByVal argument As String) As String
Return Regex.Replace(argument, "([()%!^""<>&|])", "^$1")
End Function
#End Region
#Region "Protected Methods"
Protected Shared Function ProcessArgument(ByVal argument As Argument, Optional ByVal escapeForShell As Boolean = False) As String
Dim text As String = argument.Text
If argument.IsFileName Then text = PrefixFileName(text)
text = EscapeBackslashes(text)
text = QuoteArgument(text, argument.ForceQuotes)
If escapeForShell Then text = EscapeShellMetacharacters(text)
Return text
End Function
#End Region
#Region "Protected Classes"
Protected Class Argument
Public Sub New(ByVal text As String, Optional ByVal isFileName As Boolean = False, Optional ByVal forceQuotes As Boolean = False)
Me.Text = text
Me.IsFileName = isFileName
Me.ForceQuotes = forceQuotes
End Sub
Public Property Text As String
Public Property IsFileName As Boolean
Public Property ForceQuotes As Boolean
End Class
#End Region
End Class
End Namespace

View File

@@ -223,39 +223,26 @@ Namespace Tools
Public Class TreeNodeSorter
Implements IComparer
Private _nodeToSort As TreeNode
Private _sortType As SortType
Public Property Sorting As System.Windows.Forms.SortOrder
Public Sub New(ByVal node As TreeNode, ByVal sortType As SortType)
Public Sub New(Optional ByVal sortOrder As SortOrder = SortOrder.None)
MyBase.New()
Me._nodeToSort = node
Me._sortType = sortType
Sorting = sortOrder
End Sub
Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare
Dim tx As TreeNode = CType(x, TreeNode)
Dim ty As TreeNode = CType(y, TreeNode)
If ((tx.Parent Is Me._nodeToSort) AndAlso (ty.Parent Is Me._nodeToSort)) Then
' Ascending
If (Me._sortType = SortType.Ascending) Then
Select Case Sorting
Case SortOrder.Ascending
Return String.Compare(tx.Text, ty.Text)
End If
' Descending
If (Me._sortType = SortType.Descending) Then
Case SortOrder.Descending
Return String.Compare(ty.Text, tx.Text)
End If
End If
Return 0
Case Else
Return 0
End Select
End Function
Public Enum SortType
Ascending = 0
Descending = 1
End Enum
End Class
End Class
End Namespace

View File

@@ -117,21 +117,21 @@ Namespace Tools
_ConnectionInfo = ConnectionInfo
Dim p As New Process()
Dim pI As New ProcessStartInfo()
Dim process As New Process()
With process.StartInfo
.UseShellExecute = False
.FileName = ParseText(_FileName)
pI.FileName = ParseText(_FileName)
pI.Arguments = ParseText(_Arguments)
.Arguments = CommandLineArguments.EscapeBackslashes(_Arguments)
End With
p.StartInfo = pI
p.Start()
process.Start()
If _WaitForExit Then
p.WaitForExit()
process.WaitForExit()
End If
Return p
Return process
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn't start external application." & vbNewLine & ex.Message)
Return Nothing

View File

@@ -319,6 +319,10 @@ Namespace Tree
oldTreeNode.Parent.Nodes.Insert(oldTreeNode.Index + 1, newTreeNode)
TreeView.SelectedNode = newTreeNode
Else
Dim parentContainerInfo As Container.Info = TryCast(parentNode.Tag, Container.Info)
If parentContainerInfo IsNot Nothing Then
newConnectionInfo.Parent = parentContainerInfo
End If
parentNode.Nodes.Add(newTreeNode)
End If
ElseIf GetNodeType(oldTreeNode) = Type.Container Then
@@ -497,27 +501,52 @@ Namespace Tree
TreeView.EndUpdate()
End Sub
Public Shared Sub Sort(ByVal treeNode As TreeNode, ByVal sortType As Tools.Controls.TreeNodeSorter.SortType)
Try
TreeView.BeginUpdate()
If treeNode Is Nothing Then
Public Shared Sub Sort(ByVal treeNode As TreeNode, ByVal sorting As System.Windows.Forms.SortOrder)
If TreeView Is Nothing Then Return
TreeView.BeginUpdate()
If treeNode Is Nothing Then
If TreeView.Nodes.Count > 0 Then
treeNode = TreeView.Nodes.Item(0)
ElseIf Tree.Node.GetNodeType(treeNode) = Type.Connection Then
treeNode = treeNode.Parent
Else
Return
End If
ElseIf GetNodeType(treeNode) = Type.Connection Then
treeNode = treeNode.Parent
If treeNode Is Nothing Then Return
End If
Dim ns As New Tools.Controls.TreeNodeSorter(treeNode, sortType)
Sort(treeNode, New Tools.Controls.TreeNodeSorter(sorting))
TreeView.TreeViewNodeSorter = ns
TreeView.Sort()
TreeView.EndUpdate()
End Sub
For Each childNode As TreeNode In treeNode.Nodes
If GetNodeType(childNode) = Type.Container Then Sort(childNode, sortType)
' Adapted from http://www.codeproject.com/Tips/252234/ASP-NET-TreeView-Sort
Private Shared Sub Sort(ByVal treeNode As TreeNode, ByVal nodeSorter As Tools.Controls.TreeNodeSorter)
For Each childNode As TreeNode In treeNode.Nodes
Sort(childNode, nodeSorter)
Next
Try
Dim sortedNodes As New List(Of TreeNode)
Dim currentNode As TreeNode = Nothing
While (treeNode.Nodes.Count > 0)
For Each childNode As TreeNode In treeNode.Nodes
If (currentNode Is Nothing OrElse nodeSorter.Compare(childNode, currentNode) < 0) Then
currentNode = childNode
End If
Next
treeNode.Nodes.Remove(currentNode)
sortedNodes.Add(currentNode)
currentNode = Nothing
End While
For Each childNode As TreeNode In sortedNodes
treeNode.Nodes.Add(childNode)
Next
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Sort nodes failed" & vbNewLine & ex.Message, True)
Finally
TreeView.EndUpdate()
End Try
End Sub

View File

@@ -390,6 +390,8 @@ Namespace UI
Me.btnIcon.Enabled = True
Me.btnHostStatus.Enabled = True
ElseIf Me.DefaultInheritanceVisible Then 'Default Inhertiance selected
pGrid.SelectedObject = Obj
Me.btnShowProperties.Enabled = True
Me.btnShowInheritance.Enabled = True
Me.btnShowDefaultProperties.Enabled = False
@@ -607,6 +609,12 @@ Namespace UI
End Try
End Sub
Private Sub pGrid_PropertySortChanged(ByVal sender As Object, ByVal e As EventArgs) Handles pGrid.PropertySortChanged
If pGrid.PropertySort = PropertySort.CategorizedAlphabetical Then
pGrid.PropertySort = PropertySort.Categorized
End If
End Sub
Private Sub ShowHideGridItems()
Try
Dim strHide As New List(Of String)

View File

@@ -276,6 +276,7 @@ Namespace UI
End If
nTab.Selected = True
_ignoreChangeSelectedTabClick = False
Return nTab
Catch ex As Exception
@@ -291,6 +292,30 @@ Namespace UI
ApplyLanguage()
End Sub
Private _documentHandlersAdded As Boolean = False
Private _floatHandlersAdded As Boolean = False
Private Sub Connection_DockStateChanged(ByVal sender As System.Object, ByVal e As EventArgs) Handles Me.DockStateChanged
If DockState = DockState.Float Then
If _documentHandlersAdded Then
RemoveHandler frmMain.ResizeBegin, AddressOf Connection_ResizeBegin
RemoveHandler frmMain.ResizeEnd, AddressOf Connection_ResizeEnd
_documentHandlersAdded = False
End If
AddHandler DockHandler.FloatPane.FloatWindow.ResizeBegin, AddressOf Connection_ResizeBegin
AddHandler DockHandler.FloatPane.FloatWindow.ResizeEnd, AddressOf Connection_ResizeEnd
_floatHandlersAdded = True
ElseIf DockState = DockState.Document Then
If _floatHandlersAdded Then
RemoveHandler DockHandler.FloatPane.FloatWindow.ResizeBegin, AddressOf Connection_ResizeBegin
RemoveHandler DockHandler.FloatPane.FloatWindow.ResizeEnd, AddressOf Connection_ResizeEnd
_floatHandlersAdded = False
End If
AddHandler frmMain.ResizeBegin, AddressOf Connection_ResizeBegin
AddHandler frmMain.ResizeEnd, AddressOf Connection_ResizeEnd
_documentHandlersAdded = True
End If
End Sub
Private Sub ApplyLanguage()
cmenTabFullscreen.Text = My.Language.strMenuFullScreenRDP
cmenTabSmartSize.Text = My.Language.strMenuSmartSize
@@ -334,19 +359,14 @@ Namespace UI
End Try
End Sub
Private Sub Connection_Resize(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Resize
Try
For Each tabP As Magic.Controls.TabPage In Me.TabController.TabPages
If tabP.Tag IsNot Nothing Then
If TypeOf tabP.Tag Is mRemoteNG.Connection.InterfaceControl Then
Dim IC As mRemoteNG.Connection.InterfaceControl = tabP.Tag
IC.Protocol.Resize()
End If
End If
Next
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Connection_Resize (UI.Window.Connections) failed" & vbNewLine & ex.Message, True)
End Try
Public Shadows Event ResizeBegin As EventHandler
Private Sub Connection_ResizeBegin(ByVal sender As System.Object, ByVal e As EventArgs)
RaiseEvent ResizeBegin(Me, e)
End Sub
Public Shadows Event ResizeEnd As EventHandler
Public Sub Connection_ResizeEnd(ByVal sender As System.Object, ByVal e As EventArgs)
RaiseEvent ResizeEnd(sender, e)
End Sub
#End Region
@@ -384,6 +404,7 @@ Namespace UI
End Sub
Private Sub TabController_DoubleClickTab(ByVal sender As Crownwood.Magic.Controls.TabControl, ByVal page As Crownwood.Magic.Controls.TabPage) Handles TabController.DoubleClickTab
_lastMouseUp = 0
If My.Settings.DoubleClickOnTabClosesIt Then
Me.CloseConnectionTab()
End If
@@ -422,15 +443,20 @@ Namespace UI
End If
If IC.Info.Protocol = mRemoteNG.Connection.Protocol.Protocols.RDP Then
Me.cmenTabFullscreen.Enabled = True
Me.cmenTabSmartSize.Enabled = True
Dim rdp As mRemoteNG.Connection.Protocol.RDP = IC.Protocol
Me.cmenTabSmartSize.Checked = rdp.SmartSize
Me.cmenTabFullscreen.Checked = rdp.Fullscreen
If rdp.RedirectKeys Then
cmenTabFullscreen.Enabled = False
Else
cmenTabFullscreen.Enabled = True
cmenTabFullscreen.Checked = rdp.Fullscreen
End If
cmenTabSmartSize.Enabled = True
cmenTabSmartSize.Checked = rdp.SmartSize
Else
Me.cmenTabFullscreen.Enabled = False
Me.cmenTabSmartSize.Enabled = False
cmenTabFullscreen.Enabled = False
cmenTabSmartSize.Enabled = False
End If
If IC.Info.Protocol = mRemoteNG.Connection.Protocol.Protocols.VNC Then
@@ -762,6 +788,7 @@ Namespace UI
Dim IC As mRemoteNG.Connection.InterfaceControl = Me.TabController.SelectedTab.Tag
App.Runtime.OpenConnection(IC.Info, mRemoteNG.Connection.Info.Force.DoNotJump)
_ignoreChangeSelectedTabClick = False
End If
End If
Catch ex As Exception
@@ -822,6 +849,7 @@ Namespace UI
Else
Try
Me.TabController.TabPages.Remove(TabToBeClosed)
_ignoreChangeSelectedTabClick = False
Catch comEx As System.Runtime.InteropServices.COMException
CloseTab(TabToBeClosed)
Catch ex As Exception
@@ -834,27 +862,37 @@ Namespace UI
End If
End Sub
Private _selectedTabChanged As Boolean = False
Private _ignoreChangeSelectedTabClick As Boolean = False
Private Sub TabController_SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TabController.SelectionChanged
_selectedTabChanged = True
_ignoreChangeSelectedTabClick = True
FocusIC()
RefreshIC()
End Sub
Private _lastMouseUp As Integer = 0
Private Sub TabController_MouseUp(ByVal sender As Object, ByVal e As MouseEventArgs) Handles TabController.MouseUp
Debug.Print("TabController_MouseUp()")
Debug.Print("_ignoreChangeSelectedTabClick = {0}", _ignoreChangeSelectedTabClick)
Try
If Not Native.GetForegroundWindow() = frmMain.Handle And Not _selectedTabChanged Then
If Not Native.GetForegroundWindow() = frmMain.Handle And Not _ignoreChangeSelectedTabClick Then
Dim clickedTab As Magic.Controls.TabPage = TabController.TabPageFromPoint(e.Location)
If clickedTab IsNot Nothing And TabController.SelectedTab IsNot clickedTab Then
Native.SetForegroundWindow(Handle)
TabController.SelectedTab = clickedTab
End If
End If
_selectedTabChanged = False
_ignoreChangeSelectedTabClick = False
Select Case e.Button
Case MouseButtons.Left
FocusIC()
Dim currentTicks As Integer = Environment.TickCount
Dim elapsedTicks As Integer = currentTicks - _lastMouseUp
If elapsedTicks > SystemInformation.DoubleClickTime Then
_lastMouseUp = currentTicks
FocusIC()
Else
TabController.OnDoubleClickTab(TabController.SelectedTab)
End If
Case MouseButtons.Middle
CloseConnectionTab()
Case MouseButtons.Right

View File

@@ -1,4 +1,5 @@
Imports mRemoteNG.Connection
Imports mRemoteNG.My
Imports WeifenLuo.WinFormsUI.Docking
Imports mRemoteNG.App.Runtime
@@ -53,51 +54,51 @@ Namespace UI
Friend WithEvents mMenAddFolder As System.Windows.Forms.ToolStripMenuItem
Public WithEvents tvConnections As System.Windows.Forms.TreeView
Private Sub InitializeComponent()
Me.components = New System.ComponentModel.Container
Me.components = New System.ComponentModel.Container()
Dim TreeNode1 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Connections")
Me.tvConnections = New System.Windows.Forms.TreeView
Me.tvConnections = New System.Windows.Forms.TreeView()
Me.cMenTree = New System.Windows.Forms.ContextMenuStrip(Me.components)
Me.cMenTreeAddConnection = New System.Windows.Forms.ToolStripMenuItem
Me.cMenTreeAddFolder = New System.Windows.Forms.ToolStripMenuItem
Me.cMenTreeSep1 = New System.Windows.Forms.ToolStripSeparator
Me.cMenTreeConnect = New System.Windows.Forms.ToolStripMenuItem
Me.cMenTreeConnectWithOptions = New System.Windows.Forms.ToolStripMenuItem
Me.cMenTreeConnectWithOptionsConnectToConsoleSession = New System.Windows.Forms.ToolStripMenuItem
Me.cMenTreeConnectWithOptionsDontConnectToConsoleSession = New System.Windows.Forms.ToolStripMenuItem
Me.cMenTreeConnectWithOptionsConnectInFullscreen = New System.Windows.Forms.ToolStripMenuItem
Me.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting = New System.Windows.Forms.ToolStripMenuItem
Me.cMenTreeDisconnect = New System.Windows.Forms.ToolStripMenuItem
Me.cMenTreeSep2 = New System.Windows.Forms.ToolStripSeparator
Me.cMenTreeToolsTransferFile = New System.Windows.Forms.ToolStripMenuItem
Me.cMenTreeToolsImportExport = New System.Windows.Forms.ToolStripMenuItem
Me.cMenTreeToolsImportExportExportmRemoteXML = New System.Windows.Forms.ToolStripMenuItem
Me.cMenTreeToolsImportExportImportmRemoteXML = New System.Windows.Forms.ToolStripMenuItem
Me.cMenTreeToolsImportExportSep1 = New System.Windows.Forms.ToolStripSeparator
Me.cMenTreeToolsImportExportImportFromAD = New System.Windows.Forms.ToolStripMenuItem
Me.cMenTreeToolsImportExportImportFromRDPFiles = New System.Windows.Forms.ToolStripMenuItem
Me.cMenTreeToolsImportExportImportFromPortScan = New System.Windows.Forms.ToolStripMenuItem
Me.cMenTreeToolsSort = New System.Windows.Forms.ToolStripMenuItem
Me.cMenTreeToolsSortAscending = New System.Windows.Forms.ToolStripMenuItem
Me.cMenTreeToolsSortDescending = New System.Windows.Forms.ToolStripMenuItem
Me.cMenTreeToolsExternalApps = New System.Windows.Forms.ToolStripMenuItem
Me.cMenTreeSep3 = New System.Windows.Forms.ToolStripSeparator
Me.cMenTreeDuplicate = New System.Windows.Forms.ToolStripMenuItem
Me.cMenTreeRename = New System.Windows.Forms.ToolStripMenuItem
Me.cMenTreeDelete = New System.Windows.Forms.ToolStripMenuItem
Me.cMenTreeSep4 = New System.Windows.Forms.ToolStripSeparator
Me.cMenTreeMoveUp = New System.Windows.Forms.ToolStripMenuItem
Me.cMenTreeMoveDown = New System.Windows.Forms.ToolStripMenuItem
Me.cMenTreeAddConnection = New System.Windows.Forms.ToolStripMenuItem()
Me.cMenTreeAddFolder = New System.Windows.Forms.ToolStripMenuItem()
Me.cMenTreeSep1 = New System.Windows.Forms.ToolStripSeparator()
Me.cMenTreeConnect = New System.Windows.Forms.ToolStripMenuItem()
Me.cMenTreeConnectWithOptions = New System.Windows.Forms.ToolStripMenuItem()
Me.cMenTreeConnectWithOptionsConnectToConsoleSession = New System.Windows.Forms.ToolStripMenuItem()
Me.cMenTreeConnectWithOptionsDontConnectToConsoleSession = New System.Windows.Forms.ToolStripMenuItem()
Me.cMenTreeConnectWithOptionsConnectInFullscreen = New System.Windows.Forms.ToolStripMenuItem()
Me.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting = New System.Windows.Forms.ToolStripMenuItem()
Me.cMenTreeDisconnect = New System.Windows.Forms.ToolStripMenuItem()
Me.cMenTreeSep2 = New System.Windows.Forms.ToolStripSeparator()
Me.cMenTreeToolsTransferFile = New System.Windows.Forms.ToolStripMenuItem()
Me.cMenTreeToolsImportExport = New System.Windows.Forms.ToolStripMenuItem()
Me.cMenTreeToolsImportExportExportmRemoteXML = New System.Windows.Forms.ToolStripMenuItem()
Me.cMenTreeToolsImportExportImportmRemoteXML = New System.Windows.Forms.ToolStripMenuItem()
Me.cMenTreeToolsImportExportSep1 = New System.Windows.Forms.ToolStripSeparator()
Me.cMenTreeToolsImportExportImportFromAD = New System.Windows.Forms.ToolStripMenuItem()
Me.cMenTreeToolsImportExportImportFromRDPFiles = New System.Windows.Forms.ToolStripMenuItem()
Me.cMenTreeToolsImportExportImportFromPortScan = New System.Windows.Forms.ToolStripMenuItem()
Me.cMenTreeToolsSort = New System.Windows.Forms.ToolStripMenuItem()
Me.cMenTreeToolsSortAscending = New System.Windows.Forms.ToolStripMenuItem()
Me.cMenTreeToolsSortDescending = New System.Windows.Forms.ToolStripMenuItem()
Me.cMenTreeToolsExternalApps = New System.Windows.Forms.ToolStripMenuItem()
Me.cMenTreeSep3 = New System.Windows.Forms.ToolStripSeparator()
Me.cMenTreeDuplicate = New System.Windows.Forms.ToolStripMenuItem()
Me.cMenTreeRename = New System.Windows.Forms.ToolStripMenuItem()
Me.cMenTreeDelete = New System.Windows.Forms.ToolStripMenuItem()
Me.cMenTreeSep4 = New System.Windows.Forms.ToolStripSeparator()
Me.cMenTreeMoveUp = New System.Windows.Forms.ToolStripMenuItem()
Me.cMenTreeMoveDown = New System.Windows.Forms.ToolStripMenuItem()
Me.imgListTree = New System.Windows.Forms.ImageList(Me.components)
Me.pnlConnections = New System.Windows.Forms.Panel
Me.PictureBox1 = New System.Windows.Forms.PictureBox
Me.txtSearch = New System.Windows.Forms.TextBox
Me.msMain = New System.Windows.Forms.MenuStrip
Me.mMenAddConnection = New System.Windows.Forms.ToolStripMenuItem
Me.mMenAddFolder = New System.Windows.Forms.ToolStripMenuItem
Me.mMenView = New System.Windows.Forms.ToolStripMenuItem
Me.mMenViewExpandAllFolders = New System.Windows.Forms.ToolStripMenuItem
Me.mMenViewCollapseAllFolders = New System.Windows.Forms.ToolStripMenuItem
Me.mMenSortAscending = New System.Windows.Forms.ToolStripMenuItem
Me.pnlConnections = New System.Windows.Forms.Panel()
Me.PictureBox1 = New System.Windows.Forms.PictureBox()
Me.txtSearch = New System.Windows.Forms.TextBox()
Me.msMain = New System.Windows.Forms.MenuStrip()
Me.mMenAddConnection = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenAddFolder = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenView = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenViewExpandAllFolders = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenViewCollapseAllFolders = New System.Windows.Forms.ToolStripMenuItem()
Me.mMenSortAscending = New System.Windows.Forms.ToolStripMenuItem()
Me.cMenTree.SuspendLayout()
Me.pnlConnections.SuspendLayout()
CType(Me.PictureBox1, System.ComponentModel.ISupportInitialize).BeginInit()
@@ -108,8 +109,8 @@ Namespace UI
'
Me.tvConnections.AllowDrop = True
Me.tvConnections.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.tvConnections.BorderStyle = System.Windows.Forms.BorderStyle.None
Me.tvConnections.ContextMenuStrip = Me.cMenTree
Me.tvConnections.HideSelection = False
@@ -122,7 +123,7 @@ Namespace UI
TreeNode1.Text = "Connections"
Me.tvConnections.Nodes.AddRange(New System.Windows.Forms.TreeNode() {TreeNode1})
Me.tvConnections.SelectedImageIndex = 0
Me.tvConnections.Size = New System.Drawing.Size(192, 407)
Me.tvConnections.Size = New System.Drawing.Size(192, 410)
Me.tvConnections.TabIndex = 20
'
'cMenTree
@@ -157,7 +158,7 @@ Namespace UI
Me.cMenTreeConnect.Image = Global.mRemoteNG.My.Resources.Resources.Play
Me.cMenTreeConnect.Name = "cMenTreeConnect"
Me.cMenTreeConnect.ShortcutKeys = CType(((System.Windows.Forms.Keys.Control Or System.Windows.Forms.Keys.Shift) _
Or System.Windows.Forms.Keys.C), System.Windows.Forms.Keys)
Or System.Windows.Forms.Keys.C), System.Windows.Forms.Keys)
Me.cMenTreeConnect.Size = New System.Drawing.Size(186, 22)
Me.cMenTreeConnect.Text = "Connect"
'
@@ -348,8 +349,8 @@ Namespace UI
'pnlConnections
'
Me.pnlConnections.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.pnlConnections.Controls.Add(Me.PictureBox1)
Me.pnlConnections.Controls.Add(Me.txtSearch)
Me.pnlConnections.Controls.Add(Me.tvConnections)
@@ -362,7 +363,7 @@ Namespace UI
'
Me.PictureBox1.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left), System.Windows.Forms.AnchorStyles)
Me.PictureBox1.Image = Global.mRemoteNG.My.Resources.Resources.Search
Me.PictureBox1.Location = New System.Drawing.Point(0, 411)
Me.PictureBox1.Location = New System.Drawing.Point(2, 412)
Me.PictureBox1.Name = "PictureBox1"
Me.PictureBox1.Size = New System.Drawing.Size(16, 16)
Me.PictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize
@@ -372,13 +373,15 @@ Namespace UI
'txtSearch
'
Me.txtSearch.Anchor = CType(((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.txtSearch.BorderStyle = System.Windows.Forms.BorderStyle.None
Me.txtSearch.Location = New System.Drawing.Point(21, 412)
Me.txtSearch.ForeColor = System.Drawing.SystemColors.GrayText
Me.txtSearch.Location = New System.Drawing.Point(19, 413)
Me.txtSearch.Name = "txtSearch"
Me.txtSearch.Size = New System.Drawing.Size(169, 13)
Me.txtSearch.Size = New System.Drawing.Size(171, 13)
Me.txtSearch.TabIndex = 30
Me.txtSearch.TabStop = False
Me.txtSearch.Text = "Search"
'
'msMain
'
@@ -462,6 +465,10 @@ Namespace UI
#Region "Form Stuff"
Private Sub Tree_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
ApplyLanguage()
txtSearch.Multiline = True
txtSearch.MinimumSize = New Size(0, 14)
txtSearch.Size = New Size(txtSearch.Size.Width, 14)
txtSearch.Multiline = False
End Sub
Private Sub ApplyLanguage()
@@ -495,6 +502,7 @@ Namespace UI
mMenViewExpandAllFolders.Text = My.Language.strExpandAllFolders
mMenViewCollapseAllFolders.Text = My.Language.strCollapseAllFolders
mMenSortAscending.ToolTipText = My.Language.strSortAsc
txtSearch.Text = Language.strSearchPrompt
TabText = My.Language.strConnections
Text = My.Language.strConnections
End Sub
@@ -934,24 +942,24 @@ Namespace UI
Me.ImportFromPortScan()
End Sub
Private Sub mMenSortAscending_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mMenSortAscending.Click
Me.tvConnections.BeginUpdate()
mRemoteNG.Tree.Node.Sort(Me.tvConnections.Nodes.Item(0), Tools.Controls.TreeNodeSorter.SortType.Ascending)
Me.tvConnections.EndUpdate()
Private Sub mMenSortAscending_Click(ByVal sender As System.Object, ByVal e As EventArgs) Handles mMenSortAscending.Click
tvConnections.BeginUpdate()
mRemoteNG.Tree.Node.Sort(tvConnections.Nodes.Item(0), System.Windows.Forms.SortOrder.Ascending)
tvConnections.EndUpdate()
SaveConnectionsBG()
End Sub
Private Sub cMenTreeToolsSortAscending_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cMenTreeToolsSortAscending.Click
Me.tvConnections.BeginUpdate()
mRemoteNG.Tree.Node.Sort(Me.tvConnections.SelectedNode, Tools.Controls.TreeNodeSorter.SortType.Ascending)
Me.tvConnections.EndUpdate()
Private Sub cMenTreeToolsSortAscending_Click(ByVal sender As System.Object, ByVal e As EventArgs) Handles cMenTreeToolsSortAscending.Click
tvConnections.BeginUpdate()
mRemoteNG.Tree.Node.Sort(tvConnections.SelectedNode, System.Windows.Forms.SortOrder.Ascending)
tvConnections.EndUpdate()
SaveConnectionsBG()
End Sub
Private Sub cMenTreeToolsSortDescending_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cMenTreeToolsSortDescending.Click
Me.tvConnections.BeginUpdate()
mRemoteNG.Tree.Node.Sort(Me.tvConnections.SelectedNode, Tools.Controls.TreeNodeSorter.SortType.Descending)
Me.tvConnections.EndUpdate()
Private Sub cMenTreeToolsSortDescending_Click(ByVal sender As System.Object, ByVal e As EventArgs) Handles cMenTreeToolsSortDescending.Click
tvConnections.BeginUpdate()
mRemoteNG.Tree.Node.Sort(tvConnections.SelectedNode, System.Windows.Forms.SortOrder.Descending)
tvConnections.EndUpdate()
SaveConnectionsBG()
End Sub
@@ -1000,22 +1008,23 @@ Namespace UI
Return
End If
Dim newConnectionInfo As New mRemoteNG.Connection.Info()
If mRemoteNG.Tree.Node.GetNodeType(tvConnections.SelectedNode) = mRemoteNG.Tree.Node.Type.Connection Then
newConnectionInfo.Parent = tvConnections.SelectedNode.Parent.Tag
Dim containerNode As TreeNode = tvConnections.SelectedNode
If mRemoteNG.Tree.Node.GetNodeType(containerNode) = mRemoteNG.Tree.Node.Type.Connection Then
containerNode = containerNode.Parent
End If
Dim newConnectionInfo As New Info()
If mRemoteNG.Tree.Node.GetNodeType(containerNode) = mRemoteNG.Tree.Node.Type.Root Then
newConnectionInfo.Inherit.TurnOffInheritanceCompletely()
Else
newConnectionInfo.Parent = tvConnections.SelectedNode.Tag
newConnectionInfo.Parent = containerNode.Tag
End If
newConnectionInfo.TreeNode = newTreeNode
newTreeNode.Tag = newConnectionInfo
ConnectionList.Add(newConnectionInfo)
If mRemoteNG.Tree.Node.GetNodeType(tvConnections.SelectedNode) = mRemoteNG.Tree.Node.Type.Connection Then
tvConnections.SelectedNode.Parent.Nodes.Add(newTreeNode)
Else
tvConnections.SelectedNode.Nodes.Add(newTreeNode)
End If
containerNode.Nodes.Add(newTreeNode)
tvConnections.SelectedNode = newTreeNode
tvConnections.SelectedNode.BeginEdit()
@@ -1043,6 +1052,8 @@ Namespace UI
End If
End If
newContainerInfo.ConnectionInfo = New Info(newContainerInfo)
' We can only inherit from a container node, not the root node or connection nodes
If mRemoteNG.Tree.Node.GetNodeType(parentNode) = mRemoteNG.Tree.Node.Type.Container Then
newContainerInfo.Parent = parentNode.Tag
@@ -1050,8 +1061,6 @@ Namespace UI
newContainerInfo.ConnectionInfo.Inherit.TurnOffInheritanceCompletely()
End If
newContainerInfo.ConnectionInfo = New mRemoteNG.Connection.Info(newContainerInfo)
App.Runtime.ContainerList.Add(newContainerInfo)
parentNode.Nodes.Add(newNode)
@@ -1201,6 +1210,20 @@ Namespace UI
#End Region
#Region "Search"
Private Sub txtSearch_GotFocus(ByVal sender As Object, ByVal e As EventArgs) Handles txtSearch.GotFocus
txtSearch.ForeColor = SystemColors.WindowText
If txtSearch.Text = Language.strSearchPrompt Then
txtSearch.Text = ""
End If
End Sub
Private Sub txtSearch_LostFocus(ByVal sender As Object, ByVal e As EventArgs) Handles txtSearch.LostFocus
If txtSearch.Text = "" Then
txtSearch.ForeColor = SystemColors.GrayText
txtSearch.Text = Language.strSearchPrompt
End If
End Sub
Private Sub txtSearch_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtSearch.KeyDown
Try
If e.KeyCode = Keys.Escape Then

View File

@@ -1,7 +1,7 @@
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net-net-1.0"/>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="mRemoteNG.My.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false"/>
</sectionGroup>
@@ -10,7 +10,7 @@
</sectionGroup>
</configSections>
<log4net>
<logger name="mRemoteNG.Log">
<logger name="Logger">
<level value="INFO"/>
</logger>
@@ -565,6 +565,9 @@
<setting name="AlwaysShowPanelTabs" serializeAs="String">
<value>False</value>
</setting>
<setting name="IdentifyQuickConnectTabs" serializeAs="String">
<value>False</value>
</setting>
</mRemoteNG.My.MySettings>
</userSettings>
<applicationSettings>
@@ -572,6 +575,9 @@
<setting name="SupportedUICultures" serializeAs="String">
<value>de,en,en-US,es-AR,es,fr,it,nl,pt,pl,ru,uk,zh-CN</value>
</setting>
<setting name="UpdateChannel" serializeAs="String">
<value>release</value>
</setting>
</mRemoteNG.My.MySettings>
</applicationSettings>
<startup><supportedRuntime version="v2.0.50727"/></startup></configuration>

View File

@@ -213,6 +213,7 @@
<Compile Include="Connection\Connection.Protocol.VNC.vb" />
<Compile Include="Connection\Connection.PuttySession.vb" />
<Compile Include="Connection\Connection.QuickConnect.vb" />
<Compile Include="Tools\CommandLineArguments.vb" />
<Compile Include="Container\Container.Info.vb" />
<Compile Include="Container\Container.List.vb" />
<Compile Include="Credential\Credential.Info.vb" />