Skip to content

Commit

Permalink
- removed default Steam Web API key (which was revoked)
Browse files Browse the repository at this point in the history
- added ability to enter personal Steam Web API key in the "Master Server" combo box
- fixes issues when DNS resolver returned IPv6 address instead v4
- per-monitor-v2 DPI awareness
- x64-build using steam_api64.dll
  • Loading branch information
PredatH0r committed Jan 27, 2024
1 parent 60320f2 commit 15c9923
Show file tree
Hide file tree
Showing 21 changed files with 912 additions and 784 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Expand Up @@ -28,3 +28,5 @@ SteamServerBrowser.sdf
SteamServerBrowser*.zip
.vs/config/applicationhost.config
/.vs/
/bin/
/QueryMaster/bin/
27 changes: 23 additions & 4 deletions CreateDistribZip.cmd
@@ -1,16 +1,34 @@
@echo off
setlocal
setlocal enabledelayedexpansion

cd /d %~dp0
set cwd=%cd%
set curdate=%date:~6,4%-%date:~3,2%-%date:~0,2%
set target=%cd%\SteamServerBrowser
mkdir "%target%" 2>nul
del /s /q "%target%\*"

cd "%cwd%\ServerBrowser\bin\x86\Release"
rem find signtool.exe
for /d %%f in ("C:\Program Files (x86)\Windows Kits\10\bin\10.*") do (
set nq=%%f
set nq=!nq:"=!
set signtool="!nq!\x86\signtool.exe"
if exist !signtool! goto foundSigntool
)

echo "can't find signtool.exe"
pause
goto :eof
:foundSigntool


cd "%cwd%\bin\Release"
copy ServerBrowser.exe "%target%"
copy QueryMaster.dll "%target%"
copy Ionic.BZip2.dll "%target%"
copy steam_api.dll "%target%"
copy steam_api64.dll "%target%"

rem del "DevExpress*Rich*"
rem del "DevExpress*Office*"
Expand All @@ -33,17 +51,18 @@ goto :eof

@echo off



:CodeSigning
rem -----------------------------
rem If you want to digitally sign the generated .exe and .dll files,
rem you need to have your code signing certificate installed in the Windows certificate storage
rem -----------------------------
set signtool="C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x86\signtool.exe"
set files=ServerBrowser.exe QueryMaster.dll
if not exist %signtool% (
echo %signtool% not found
pause
exit /b 1
)
%signtool% sign /a /t "http://timestamp.digicert.com" %files%
goto :eof
%signtool% sign /n "ABPro Entwicklungs-, Vertriebs- und Wartungs GmbH" /t "http://timestamp.digicert.com" %files%
goto :eof
5 changes: 3 additions & 2 deletions QueryMaster/QueryMaster/MasterQuery.cs
Expand Up @@ -3,6 +3,7 @@
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace QueryMaster
{
Expand All @@ -14,11 +15,11 @@ public class MasterQuery
/// <summary>
/// Master server for Gold Source games
/// </summary>
public static IPEndPoint GoldSrcServer = new IPEndPoint(Dns.GetHostAddresses("hl1master.steampowered.com")[0], 27011);
public static IPEndPoint GoldSrcServer = new IPEndPoint(Dns.GetHostAddresses("hl1master.steampowered.com").First(h => h.AddressFamily == AddressFamily.InterNetwork), 27011);
/// <summary>
/// Master server for Source games
/// </summary>
public static IPEndPoint SourceServer = new IPEndPoint(Dns.GetHostAddresses("hl2master.steampowered.com")[0], 27011);
public static IPEndPoint SourceServer = new IPEndPoint(Dns.GetHostAddresses("hl2master.steampowered.com").First(h => h.AddressFamily == AddressFamily.InterNetwork), 27011);
/// <summary>
/// Gets the appropriate masterserver query instance
/// </summary>
Expand Down
3 changes: 2 additions & 1 deletion QueryMaster/QueryMaster/MasterServerUdp.cs
Expand Up @@ -64,7 +64,8 @@ public override void GetAddresses(Region region, MasterIpCallback callback, IpFi
ThreadPool.QueueUserWorkItem(y => callback(new ReadOnlyCollection<Tuple<IPEndPoint, ServerInfo>>(serverList), null, !atEnd));
totalCount += endpoints.Count;
atEnd |= totalCount >= GetAddressesLimit;
if (GetAddressesLimit != 0)
atEnd |= totalCount >= GetAddressesLimit;
} //while (!nextSeed.Equals(SeedEndpoint) && totalCount < GetAddressesLimit);
}
catch (Exception ex)
Expand Down
32 changes: 21 additions & 11 deletions QueryMaster/QueryMaster/MasterServerWebApi.cs
Expand Up @@ -50,7 +50,12 @@ public class Response
/// </summary>
public class MasterServerWebApi : MasterServer
{
const string SteamWebApiKey = "B7D245299F6F990504A86FF91EC9D6BD"; // create an account and get a steam web api key at http://steamcommunity.com/dev/apikey
private readonly string steamWebApiKey = ""; // create an account and get a steam web api key at http://steamcommunity.com/dev/apikey

public MasterServerWebApi(string steamWebApiKey)
{
this.steamWebApiKey = steamWebApiKey;
}

/// <summary>
/// Gets a server list from the Steam master server.
Expand All @@ -68,7 +73,7 @@ public override void GetAddresses(Region region, MasterIpCallback callback, IpFi
using (var cli = new XWebClient())
{
var filters = MasterUtil.ProcessFilter(filter);
var url = $"https://api.steampowered.com/IGameServersService/GetServerList/v1/?key={SteamWebApiKey}&format=xml&filter={filters}&limit={GetAddressesLimit}";
var url = $"https://api.steampowered.com/IGameServersService/GetServerList/v1/?key={steamWebApiKey}&format=xml&filter={filters}&limit={GetAddressesLimit}";
var xml = cli.DownloadString(url);
var ser = new XmlSerializer(typeof (Response));
Expand All @@ -88,21 +93,26 @@ public override void GetAddresses(Region region, MasterIpCallback callback, IpFi
var resp = (Response) ser.Deserialize(new StringReader(xml));
var endpoints = new List<Tuple<IPEndPoint,ServerInfo>>();
foreach (var msg in resp.Servers)
if (resp.Servers != null)
{
try
foreach (var msg in resp.Servers)
{
int i = msg.addr.IndexOf(':');
if (i > 0)
try
{
var info = ConvertToServerInfo(msg);
endpoints.Add(new Tuple<IPEndPoint, ServerInfo>(info.EndPoint, info));
int i = msg.addr.IndexOf(':');
if (i > 0)
{
var info = ConvertToServerInfo(msg);
endpoints.Add(new Tuple<IPEndPoint, ServerInfo>(info.EndPoint, info));
}
}
catch
{
// ignore
}
}
catch
{
}
}
callback(new ReadOnlyCollection<Tuple<IPEndPoint,ServerInfo>>(endpoints), null, false);
}
}
Expand Down
6 changes: 3 additions & 3 deletions QueryMaster/QueryMaster/QueryMaster.csproj
Expand Up @@ -27,7 +27,7 @@
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<OutputPath>..\bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
Expand All @@ -38,8 +38,8 @@
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<OutputPath>..\bin\Release\</OutputPath>
<DefineConstants>TRACE;X64</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Release\QueryMaster.XML</DocumentationFile>
Expand Down
1 change: 1 addition & 0 deletions ServerBrowser/.vs/ServerBrowser.csproj.dtbcache.json
@@ -0,0 +1 @@
{"RootPath":"C:\\Sources\\SteamServerBrowser\\ServerBrowser","ProjectFileName":"ServerBrowser.csproj","Configuration":"Debug|AnyCPU","FrameworkPath":"","Sources":[{"SourceFile":"Games\\CounterStrikeGO.cs"},{"SourceFile":"Games\\QuakeLiveOptionsDialog.cs"},{"SourceFile":"Games\\QuakeLiveOptionsDialog.Designer.cs"},{"SourceFile":"Games\\ToxikkOptionsDialog.cs"},{"SourceFile":"Games\\ToxikkOptionsDialog.Designer.cs"},{"SourceFile":"GeoIpClient.cs"},{"SourceFile":"IniFile.cs"},{"SourceFile":"KeyBindForm.cs"},{"SourceFile":"KeyBindForm.Designer.cs"},{"SourceFile":"RenameTabForm.cs"},{"SourceFile":"RenameTabForm.Designer.cs"},{"SourceFile":"PasswordForm.cs"},{"SourceFile":"PasswordForm.Designer.cs"},{"SourceFile":"Games\\Reflex.cs"},{"SourceFile":"Games\\GameExtension.cs"},{"SourceFile":"PlayerCountInfo.cs"},{"SourceFile":"ServerBrowserForm.cs"},{"SourceFile":"ServerBrowserForm.Designer.cs"},{"SourceFile":"Program.cs"},{"SourceFile":"Properties\\AssemblyInfo.cs"},{"SourceFile":"ServerSources\\IServerSource.cs"},{"SourceFile":"ServerSources\\MasterServerClient.cs"},{"SourceFile":"ServerQueryLogic.cs"},{"SourceFile":"ServerRow.cs"},{"SourceFile":"ServerSources\\ServerListFromUrl.cs"},{"SourceFile":"SkinPicker.cs"},{"SourceFile":"SkinPicker.Designer.cs"},{"SourceFile":"Games\\QuakeLive.cs"},{"SourceFile":"Games\\Toxikk.cs"},{"SourceFile":"Ip4Utils.cs"},{"SourceFile":"Steamworks.cs"},{"SourceFile":"TabViewModel.cs"},{"SourceFile":"ConnectingWaitForm.cs"},{"SourceFile":"ConnectingWaitForm.Designer.cs"},{"SourceFile":"ThrottledThreadPool.cs"},{"SourceFile":"Win32.cs"},{"SourceFile":"XBarManager.cs"},{"SourceFile":"XWebClient.cs"},{"SourceFile":"Properties\\Resources.Designer.cs"},{"SourceFile":"obj\\Debug\\.NETFramework,Version=v4.8.AssemblyAttributes.cs"}],"References":[{"Reference":"C:\\Program Files\\DevExpress 23.2\\Components\\Bin\\Framework\\DevExpress.Data.Desktop.v23.2.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\DevExpress 23.2\\Components\\Bin\\Framework\\DevExpress.Data.v23.2.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\DevExpress 23.2\\Components\\Bin\\Framework\\DevExpress.Drawing.v23.2.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\DevExpress 23.2\\Components\\Bin\\Framework\\DevExpress.Images.v23.2.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\DevExpress 23.2\\Components\\Bin\\Framework\\DevExpress.Office.v23.2.Core.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\DevExpress 23.2\\Components\\Bin\\Framework\\DevExpress.Pdf.v23.2.Core.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\DevExpress 23.2\\Components\\Bin\\Framework\\DevExpress.Printing.v23.2.Core.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\DevExpress 23.2\\Components\\Bin\\Framework\\DevExpress.RichEdit.v23.2.Core.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\DevExpress 23.2\\Components\\Bin\\Framework\\DevExpress.RichEdit.v23.2.Export.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\DevExpress 23.2\\Components\\Bin\\Framework\\DevExpress.Utils.v23.2.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\DevExpress 23.2\\Components\\Bin\\Framework\\DevExpress.XtraBars.v23.2.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\DevExpress 23.2\\Components\\Bin\\Framework\\DevExpress.XtraEditors.v23.2.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\DevExpress 23.2\\Components\\Bin\\Framework\\DevExpress.XtraGrid.v23.2.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\DevExpress 23.2\\Components\\Bin\\Framework\\DevExpress.XtraLayout.v23.2.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\DevExpress 23.2\\Components\\Bin\\Framework\\DevExpress.XtraPrinting.v23.2.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\DevExpress 23.2\\Components\\Bin\\Framework\\DevExpress.XtraRichEdit.v23.2.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\Microsoft.CSharp.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\mscorlib.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Sources\\SteamServerBrowser\\QueryMaster\\QueryMaster\\bin\\Debug\\QueryMaster.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":true,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Core.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Data.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Data.Linq.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Drawing.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Runtime.Serialization.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Windows.Forms.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Xml.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""}],"Analyzers":[],"Outputs":[{"OutputItemFullPath":"C:\\Sources\\SteamServerBrowser\\ServerBrowser\\bin\\Debug\\ServerBrowser.exe","OutputItemRelativePath":"ServerBrowser.exe"},{"OutputItemFullPath":"C:\\Sources\\SteamServerBrowser\\ServerBrowser\\bin\\Debug\\ServerBrowser.pdb","OutputItemRelativePath":"ServerBrowser.pdb"}],"CopyToOutputEntries":[]}
Binary file removed ServerBrowser/DLL/DevExpress.BonusSkins.v20.1.dll
Binary file not shown.
8 changes: 5 additions & 3 deletions ServerBrowser/Ip4Utils.cs
@@ -1,5 +1,7 @@
using System;
using System.Linq;
using System.Net;
using System.Net.Sockets;

namespace ServerBrowser
{
Expand Down Expand Up @@ -33,9 +35,9 @@ public static IPEndPoint ParseEndpoint(string addressAndPort)

try
{
var ips = Dns.GetHostAddresses(parts[0]);
if (ips.Length > 0)
return new IPEndPoint(ips[0], port);
var ip = Dns.GetHostAddresses(parts[0]).FirstOrDefault(p => p.AddressFamily == AddressFamily.InterNetwork);
if (ip != null)
return new IPEndPoint(ip, port);
}
catch
{
Expand Down
8 changes: 5 additions & 3 deletions ServerBrowser/Program.cs
Expand Up @@ -8,6 +8,7 @@
using DevExpress.LookAndFeel;
using DevExpress.Skins;
using DevExpress.Utils;
using DevExpress.XtraEditors;

namespace ServerBrowser
{
Expand All @@ -27,22 +28,23 @@ public static void Main()

var baseFontSize = iniFile.GetSection("Options")?.GetDecimal("FontSize", 9) ?? 9m;
// change font before creating the main form to get correct auto-scaling
Init(new Font("Segoe UI", (float)baseFontSize), "Office 2010 Black");
Init("Segoe UI", (float)baseFontSize, "Office 2010 Black");

var mainForm = new ServerBrowserForm(iniFile);
Application.Run(mainForm);
}

public static void Init(Font uiFont, string skinName)
public static void Init(string fontName, float fontSize, string skinName)
{
InitExceptionHandling();
WindowsFormsSettings.SetPerMonitorDpiAware();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);

ThreadPool.SetMinThreads(50 + GeoIpClient.ThreadCount + 5, 100);
ThreadPool.SetMaxThreads(50 + GeoIpClient.ThreadCount + 5, 100);

AppearanceObject.DefaultFont = uiFont;
AppearanceObject.DefaultFont = new Font(fontName, fontSize); // must not create a Font instance before initializing GDI+
UserLookAndFeel.Default.SkinName = skinName;
SkinManager.EnableFormSkins();
}
Expand Down
16 changes: 8 additions & 8 deletions ServerBrowser/Properties/licenses.licx
@@ -1,8 +1,8 @@
DevExpress.XtraEditors.ButtonEdit, DevExpress.XtraEditors.v20.1, Version=20.1.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraEditors.Repository.RepositoryItemImageComboBox, DevExpress.XtraEditors.v20.1, Version=20.1.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraEditors.CheckEdit, DevExpress.XtraEditors.v20.1, Version=20.1.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraBars.Docking.DockManager, DevExpress.XtraBars.v20.1, Version=20.1.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraGrid.GridControl, DevExpress.XtraGrid.v20.1, Version=20.1.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraEditors.Repository.RepositoryItemComboBox, DevExpress.XtraEditors.v20.1, Version=20.1.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraEditors.ComboBoxEdit, DevExpress.XtraEditors.v20.1, Version=20.1.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraEditors.Repository.RepositoryItemCheckEdit, DevExpress.XtraEditors.v20.1, Version=20.1.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraEditors.Repository.RepositoryItemComboBox, DevExpress.XtraEditors.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraEditors.Repository.RepositoryItemCheckEdit, DevExpress.XtraEditors.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraEditors.ComboBoxEdit, DevExpress.XtraEditors.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraEditors.Repository.RepositoryItemImageComboBox, DevExpress.XtraEditors.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraEditors.ButtonEdit, DevExpress.XtraEditors.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraGrid.GridControl, DevExpress.XtraGrid.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraBars.Docking.DockManager, DevExpress.XtraBars.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraEditors.CheckEdit, DevExpress.XtraEditors.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a

0 comments on commit 15c9923

Please sign in to comment.