Browse Source

调整

pull/2833/head
MysticBoy 4 years ago
parent
commit
4490594358
15 changed files with 459 additions and 583 deletions
  1. +3
    -3
      shadowsocks-csharp/Controller/I18N.cs
  2. +2
    -2
      shadowsocks-csharp/Controller/Service/PACServer.cs
  3. +144
    -0
      shadowsocks-csharp/HttpServerUtilityUrlToken.cs
  4. +0
    -37
      shadowsocks-csharp/Properties/AssemblyInfo.cs
  5. +17
    -0
      shadowsocks-csharp/Properties/PublishProfiles/FolderProfile.pubxml
  6. +6
    -0
      shadowsocks-csharp/Properties/PublishProfiles/FolderProfile.pubxml.user
  7. +5
    -5
      shadowsocks-csharp/Properties/Settings.Designer.cs
  8. +16
    -6
      shadowsocks-csharp/Util/ViewUtils.cs
  9. +63
    -73
      shadowsocks-csharp/View/LogForm.Designer.cs
  10. +13
    -13
      shadowsocks-csharp/View/LogForm.cs
  11. +91
    -89
      shadowsocks-csharp/View/MenuViewController.cs
  12. +1
    -15
      shadowsocks-csharp/app.config
  13. +0
    -11
      shadowsocks-csharp/packages.config
  14. +89
    -321
      shadowsocks-csharp/shadowsocks-csharp.csproj
  15. +9
    -8
      shadowsocks-windows.sln

+ 3
- 3
shadowsocks-csharp/Controller/I18N.cs View File

@@ -108,12 +108,12 @@ namespace Shadowsocks.Controller
if (item == null) continue;
item.Text = GetString(item.Text);
}
TranslateMenu(c.Menu);
TranslateMenu(c.MainMenuStrip);
}
public static void TranslateMenu(Menu m)
public static void TranslateMenu(MenuStrip m)
{
if (m == null) return;
foreach (var item in ViewUtils.GetMenuItems(m))
foreach (var item in ViewUtils.GetToolStripMenuItems(m))
{
if (item == null) continue;
item.Text = GetString(item.Text);


+ 2
- 2
shadowsocks-csharp/Controller/Service/PACServer.cs View File

@@ -24,7 +24,7 @@ namespace Shadowsocks.Controller
{
var rd = new byte[32];
RNG.GetBytes(rd);
_cachedPacSecret = HttpServerUtility.UrlTokenEncode(rd);
_cachedPacSecret = HttpServerUtilityUrlToken.Encode(rd);
}
return _cachedPacSecret;
}
@@ -51,7 +51,7 @@ namespace Shadowsocks.Controller
private static string GetHash(string content)
{
return HttpServerUtility.UrlTokenEncode(MbedTLS.MD5(Encoding.ASCII.GetBytes(content)));
return HttpServerUtilityUrlToken.Encode(MbedTLS.MD5(Encoding.ASCII.GetBytes(content)));
}
public override bool Handle(byte[] firstPacket, int length, Socket socket, object state)


+ 144
- 0
shadowsocks-csharp/HttpServerUtilityUrlToken.cs View File

@@ -0,0 +1,144 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Shadowsocks
{
/// <summary>
/// HttpServerUtility URL Token のエンコード及びデコードを行うクラス。
/// https://docs.microsoft.com/ja-jp/dotnet/api/system.web.httpserverutility.urltokenencode
/// https://docs.microsoft.com/ja-jp/dotnet/api/system.web.httpserverutility.urltokendecode
/// </summary>
/// <remarks>
/// HttpServerUtility URL Token 形式は、パディング無し base64url にパディング数を文字として追記した文字列です。
/// 例えば、<c>0x00</c> は <c>AA2</c> になります。
/// </remarks>
public static class HttpServerUtilityUrlToken
{
#if NETSTANDARD2_0
private static readonly byte[] EmptyBytes = Array.Empty<byte>();
#else
private static readonly byte[] EmptyBytes = new byte[0];
#endif
/// <summary>
/// <see cref="byte"/> 配列を HttpServerUtility URL Token にエンコードします。
/// </summary>
/// <param name="bytes">エンコード対象の <see cref="byte"/> 配列。</param>
/// <returns>HttpServerUtility URL Token エンコード文字列。<paramref name="bytes"/> の長さが <c>0</c> の場合は空文字列を返します。</returns>
/// <exception cref="ArgumentNullException"><paramref name="bytes"/> is <c>null</c>.</exception>
public static string Encode(byte[] bytes)
{
if (bytes == null) { throw new ArgumentNullException(nameof(bytes)); }
return Encode(bytes, 0, bytes.Length);
}
/// <summary>
/// <see cref="byte"/> 配列を HttpServerUtility URL Token にエンコードします。
/// </summary>
/// <param name="bytes">エンコード対象の <see cref="byte"/> 配列。</param>
/// <param name="offset">エンコードの開始位置を示すオフセット。</param>
/// <param name="length">エンコード対象の要素の数。</param>
/// <returns>HttpServerUtility URL Token エンコード文字列。<paramref name="length"/> が <c>0</c> の場合は空文字列を返します。</returns>
/// <exception cref="ArgumentNullException"><paramref name="bytes"/> is <c>null</c>.</exception>
/// <exception cref="ArgumentOutOfRangeException">
/// <paramref name="offset"/> または <paramref name="length"/> が負の値です。
/// または <paramref name="offset"/> と <paramref name="length"/> を加算した値が <paramref name="bytes"/> の長さを超えています。
/// </exception>
public static string Encode(byte[] bytes, int offset, int length)
{
if (bytes == null) { throw new ArgumentNullException(nameof(bytes)); }
var encoded = Encode(bytes, offset, length, padding: false);
if (encoded.Length == 0) { return ""; }
var paddingLen = unchecked(~encoded.Length + 1) & 0b11;
encoded += paddingLen;
return encoded;
}
/// <summary>
/// <see cref="byte"/> 配列を base64url にエンコードします。
/// </summary>
/// <param name="bytes">エンコード対象の <see cref="byte"/> 配列。</param>
/// <param name="offset">エンコードの開始位置を示すオフセット。</param>
/// <param name="length">エンコード対象の要素の数。</param>
/// <param name="padding">パディングをする場合は <c>true</c>、それ以外は <c>false</c>。既定値は <c>false</c>。</param>
/// <returns>base64url エンコード文字列。</returns>
/// <exception cref="ArgumentNullException"><paramref name="bytes"/> is <c>null</c>.</exception>
/// <exception cref="ArgumentOutOfRangeException">
/// <paramref name="offset"/> または <paramref name="length"/> が負の値です。
/// または <paramref name="offset"/> と <paramref name="length"/> を加算した値が <paramref name="bytes"/> の長さを超えています。
/// </exception>
public static string Encode(byte[] bytes, int offset, int length, bool padding = false)
{
var encoded = Convert.ToBase64String(bytes, offset, length);
if (!padding)
{
encoded = encoded.TrimEnd('=');
}
return encoded
.Replace('+', '-')
.Replace('/', '_')
;
}
/// <summary>
/// HttpServerUtility URL Token 文字列を <see cref="byte"/> 配列にデコードします。
/// </summary>
/// <param name="encoded">HttpServerUtility URL Token にエンコードされた文字列。</param>
/// <returns>デコード後の <see cref="byte"/> 配列。<paramref name="encoded"/> が空文字列の場合は <see cref="byte"/> の空配列を返します。</returns>
/// <exception cref="ArgumentNullException"><paramref name="encoded"/> is <c>null</c>.</exception>
/// <exception cref="FormatException"><paramref name="encoded"/> が HttpServerUtility URL Token 文字列ではありません。</exception>
public static byte[] Decode(string encoded)
{
if (encoded == null) { throw new ArgumentNullException(nameof(encoded)); }
if (!TryDecode(encoded, out var result)) { throw new FormatException("HttpServerUtility URL Token 文字列ではありません。"); }
return result;
}
/// <summary>
/// HttpServerUtility URL Token でエンコードされた文字列をデコードします。
/// </summary>
/// <param name="encoded">HttpServerUtility URL Token エンコードされた文字列。</param>
/// <param name="result">デコード後の <see cref="byte"/> 配列。<paramref name="encoded"/> が空文字列の場合は <see cref="byte"/> の空配列が設定されます。失敗した場合は <c>null</c>。</param>
/// <returns>デコードに成功した場合は <c>true</c>、それ以外は <c>false</c>。</returns>
public static bool TryDecode(string encoded, out byte[] result)
{
if (encoded == null) { goto Failure; }
if (encoded.Length == 0)
{
result = EmptyBytes;
return true;
}
var paddingLen = encoded[encoded.Length - 1] - '0';
if (paddingLen < 0 || paddingLen > 3) { goto Failure; }
var base64Str = encoded
.Substring(0, encoded.Length - 1)
.Replace('-', '+')
.Replace('_', '/');
if (paddingLen > 0)
{
base64Str += new string('=', paddingLen);
}
try
{
result = Convert.FromBase64String(base64Str);
return true;
}
catch (FormatException) { goto Failure; }
Failure:
result = null;
return false;
}
}
}

+ 0
- 37
shadowsocks-csharp/Properties/AssemblyInfo.cs View File

@@ -1,37 +0,0 @@
using Shadowsocks.Controller;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的常规信息通过下列属性集
// 控制。更改这些属性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("Shadowsocks")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Shadowsocks")]
[assembly: AssemblyCopyright("clowwindy & community 2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 使此程序集中的类型
// 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型,
// 则将该类型上的 ComVisible 属性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("f8334709-4309-436a-8bbd-6165dcf4a660")]
// 程序集的版本信息由下面四个值组成:
//
// 主版本
// 次版本
// 内部版本号
// 修订号
//
// 可以指定所有这些值,也可以使用“内部版本号”和“修订号”的默认值,
// 方法是按如下所示使用“*”:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion(UpdateChecker.Version)]
// [assembly: AssemblyFileVersion("2.0.0")]

+ 17
- 0
shadowsocks-csharp/Properties/PublishProfiles/FolderProfile.pubxml View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<PublishProtocol>FileSystem</PublishProtocol>
<Configuration>Release</Configuration>
<Platform>Any CPU</Platform>
<TargetFramework>netcoreapp3.1</TargetFramework>
<PublishDir>bin\Release\netcoreapp3.1\publish\</PublishDir>
<RuntimeIdentifier>win-x86</RuntimeIdentifier>
<SelfContained>false</SelfContained>
<PublishSingleFile>False</PublishSingleFile>
<PublishReadyToRun>False</PublishReadyToRun>
</PropertyGroup>
</Project>

+ 6
- 0
shadowsocks-csharp/Properties/PublishProfiles/FolderProfile.pubxml.user View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
</Project>

+ 5
- 5
shadowsocks-csharp/Properties/Settings.Designer.cs View File

@@ -1,10 +1,10 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
@@ -12,7 +12,7 @@ namespace Shadowsocks.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.1.0.0")]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.4.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));


+ 16
- 6
shadowsocks-csharp/Util/ViewUtils.cs View File

@@ -22,15 +22,25 @@ namespace Shadowsocks.Util
return children.SelectMany(GetChildControls<TControl>).Concat(children);
}
public static IEnumerable<MenuItem> GetMenuItems(Menu m)
public static IEnumerable<ToolStripMenuItem> GetToolStripMenuItems(MenuStrip m)
{
if (m?.MenuItems == null || m.MenuItems.Count == 0) return Enumerable.Empty<MenuItem>();
var children = new List<MenuItem>();
foreach (var item in m.MenuItems)
if (m?.Items == null || m.Items.Count == 0) return Enumerable.Empty<ToolStripMenuItem>();
var children = new List<ToolStripMenuItem>();
foreach (var item in m.Items)
{
children.Add((MenuItem)item);
children.Add((ToolStripMenuItem)item);
}
return children.SelectMany(GetMenuItems).Concat(children);
return children.SelectMany(GetToolStripMenuItems).Concat(children);
}
public static IEnumerable<ToolStripMenuItem> GetToolStripMenuItems(ToolStripMenuItem m)
{
if (m?.DropDownItems == null || m.DropDownItems.Count == 0) return Enumerable.Empty<ToolStripMenuItem>();
var children = new List<ToolStripMenuItem>();
foreach (var item in m.DropDownItems)
{
children.Add((ToolStripMenuItem)item);
}
return children.SelectMany(GetToolStripMenuItems).Concat(children);
}
// Workaround NotifyIcon's 63 chars limit


+ 63
- 73
shadowsocks-csharp/View/LogForm.Designer.cs View File

@@ -34,17 +34,17 @@
System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series();
System.Windows.Forms.DataVisualization.Charting.Series series2 = new System.Windows.Forms.DataVisualization.Charting.Series();
this.LogMessageTextBox = new System.Windows.Forms.TextBox();
this.MainMenu = new System.Windows.Forms.MainMenu(this.components);
this.FileMenuItem = new System.Windows.Forms.MenuItem();
this.OpenLocationMenuItem = new System.Windows.Forms.MenuItem();
this.ExitMenuItem = new System.Windows.Forms.MenuItem();
this.ViewMenuItem = new System.Windows.Forms.MenuItem();
this.ClearLogsMenuItem = new System.Windows.Forms.MenuItem();
this.ChangeFontMenuItem = new System.Windows.Forms.MenuItem();
this.WrapTextMenuItem = new System.Windows.Forms.MenuItem();
this.TopMostMenuItem = new System.Windows.Forms.MenuItem();
this.MenuItemSeparater = new System.Windows.Forms.MenuItem();
this.ShowToolbarMenuItem = new System.Windows.Forms.MenuItem();
this.MainMenu = new System.Windows.Forms.MenuStrip();
this.FileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.OpenLocationToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.ExitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.ViewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.ClearLogsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.ChangeFontToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.WrapTextToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.TopMostToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.ToolStripMenuItemSeparater = new System.Windows.Forms.ToolStripMenuItem();
this.ShowToolbarToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.TopMostCheckBox = new System.Windows.Forms.CheckBox();
this.ChangeFontButton = new System.Windows.Forms.Button();
this.ClearLogsButton = new System.Windows.Forms.Button();
@@ -79,76 +79,66 @@
//
// MainMenu
//
this.MainMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.FileMenuItem,
this.ViewMenuItem});
this.MainMenu.Items.AddRange(new System.Windows.Forms.ToolStripMenuItem[] {
this.FileToolStripMenuItem,
this.ViewToolStripMenuItem});
//
// FileMenuItem
// FileToolStripMenuItem
//
this.FileMenuItem.Index = 0;
this.FileMenuItem.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.OpenLocationMenuItem,
this.ExitMenuItem});
this.FileMenuItem.Text = "&File";
this.FileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripMenuItem[] {
this.OpenLocationToolStripMenuItem,
this.ExitToolStripMenuItem});
this.FileToolStripMenuItem.Text = "&File";
//
// OpenLocationMenuItem
// OpenLocationToolStripMenuItem
//
this.OpenLocationMenuItem.Index = 0;
this.OpenLocationMenuItem.Text = "&Open Location";
this.OpenLocationMenuItem.Click += new System.EventHandler(this.OpenLocationMenuItem_Click);
this.OpenLocationToolStripMenuItem.Text = "&Open Location";
this.OpenLocationToolStripMenuItem.Click += new System.EventHandler(this.OpenLocationToolStripMenuItem_Click);
//
// ExitMenuItem
// ExitToolStripMenuItem
//
this.ExitMenuItem.Index = 1;
this.ExitMenuItem.Text = "E&xit";
this.ExitMenuItem.Click += new System.EventHandler(this.ExitMenuItem_Click);
this.ExitToolStripMenuItem.Text = "E&xit";
this.ExitToolStripMenuItem.Click += new System.EventHandler(this.ExitToolStripMenuItem_Click);
//
// ViewMenuItem
// ViewToolStripMenuItem
//
this.ViewMenuItem.Index = 1;
this.ViewMenuItem.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.ClearLogsMenuItem,
this.ChangeFontMenuItem,
this.WrapTextMenuItem,
this.TopMostMenuItem,
this.MenuItemSeparater,
this.ShowToolbarMenuItem});
this.ViewMenuItem.Text = "&View";
this.ViewToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripMenuItem[] {
this.ClearLogsToolStripMenuItem,
this.ChangeFontToolStripMenuItem,
this.WrapTextToolStripMenuItem,
this.TopMostToolStripMenuItem,
this.ToolStripMenuItemSeparater,
this.ShowToolbarToolStripMenuItem});
this.ViewToolStripMenuItem.Text = "&View";
//
// ClearLogsMenuItem
// ClearLogsToolStripMenuItem
//
this.ClearLogsMenuItem.Index = 0;
this.ClearLogsMenuItem.Text = "&Clear Logs";
this.ClearLogsMenuItem.Click += new System.EventHandler(this.ClearLogsMenuItem_Click);
this.ClearLogsToolStripMenuItem.Text = "&Clear Logs";
this.ClearLogsToolStripMenuItem.Click += new System.EventHandler(this.ClearLogsToolStripMenuItem_Click);
//
// ChangeFontMenuItem
// ChangeFontToolStripMenuItem
//
this.ChangeFontMenuItem.Index = 1;
this.ChangeFontMenuItem.Text = "Change &Font";
this.ChangeFontMenuItem.Click += new System.EventHandler(this.ChangeFontMenuItem_Click);
this.ChangeFontToolStripMenuItem.Text = "Change &Font";
this.ChangeFontToolStripMenuItem.Click += new System.EventHandler(this.ChangeFontToolStripMenuItem_Click);
//
// WrapTextMenuItem
// WrapTextToolStripMenuItem
//
this.WrapTextMenuItem.Index = 2;
this.WrapTextMenuItem.Text = "&Wrap Text";
this.WrapTextMenuItem.Click += new System.EventHandler(this.WrapTextMenuItem_Click);
this.WrapTextToolStripMenuItem.Text = "&Wrap Text";
this.WrapTextToolStripMenuItem.Click += new System.EventHandler(this.WrapTextToolStripMenuItem_Click);
//
// TopMostMenuItem
// TopMostToolStripMenuItem
//
this.TopMostMenuItem.Index = 3;
this.TopMostMenuItem.Text = "&Top Most";
this.TopMostMenuItem.Click += new System.EventHandler(this.TopMostMenuItem_Click);
this.TopMostToolStripMenuItem.Text = "&Top Most";
this.TopMostToolStripMenuItem.Click += new System.EventHandler(this.TopMostToolStripMenuItem_Click);
//
// MenuItemSeparater
// ToolStripMenuItemSeparater
//
this.MenuItemSeparater.Index = 4;
this.MenuItemSeparater.Text = "-";
this.ToolStripMenuItemSeparater.Text = "-";
//
// ShowToolbarMenuItem
// ShowToolbarToolStripMenuItem
//
this.ShowToolbarMenuItem.Index = 5;
this.ShowToolbarMenuItem.Text = "&Show Toolbar";
this.ShowToolbarMenuItem.Click += new System.EventHandler(this.ShowToolbarMenuItem_Click);
this.ShowToolbarToolStripMenuItem.Text = "&Show Toolbar";
this.ShowToolbarToolStripMenuItem.Click += new System.EventHandler(this.ShowToolbarToolStripMenuItem_Click);
//
// TopMostCheckBox
//
@@ -294,7 +284,7 @@
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.ClientSize = new System.Drawing.Size(384, 161);
this.Controls.Add(this.tableLayoutPanel1);
this.Menu = this.MainMenu;
this.MainMenuStrip = this.MainMenu;
this.MinimumSize = new System.Drawing.Size(400, 200);
this.Name = "LogForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
@@ -319,23 +309,23 @@
#endregion
private System.Windows.Forms.TextBox LogMessageTextBox;
private System.Windows.Forms.MainMenu MainMenu;
private System.Windows.Forms.MenuItem FileMenuItem;
private System.Windows.Forms.MenuItem OpenLocationMenuItem;
private System.Windows.Forms.MenuItem ExitMenuItem;
private System.Windows.Forms.MenuStrip MainMenu;
private System.Windows.Forms.ToolStripMenuItem FileToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem OpenLocationToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem ExitToolStripMenuItem;
private System.Windows.Forms.CheckBox WrapTextCheckBox;
private System.Windows.Forms.Button ClearLogsButton;
private System.Windows.Forms.Button ChangeFontButton;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.CheckBox TopMostCheckBox;
private System.Windows.Forms.MenuItem ViewMenuItem;
private System.Windows.Forms.MenuItem ClearLogsMenuItem;
private System.Windows.Forms.MenuItem ChangeFontMenuItem;
private System.Windows.Forms.MenuItem WrapTextMenuItem;
private System.Windows.Forms.MenuItem TopMostMenuItem;
private System.Windows.Forms.ToolStripMenuItem ViewToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem ClearLogsToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem ChangeFontToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem WrapTextToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem TopMostToolStripMenuItem;
private System.Windows.Forms.FlowLayoutPanel ToolbarFlowLayoutPanel;
private System.Windows.Forms.MenuItem MenuItemSeparater;
private System.Windows.Forms.MenuItem ShowToolbarMenuItem;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItemSeparater;
private System.Windows.Forms.ToolStripMenuItem ShowToolbarToolStripMenuItem;
private System.Windows.Forms.SplitContainer splitContainer1;
private System.Windows.Forms.DataVisualization.Charting.Chart trafficChart;
}

+ 13
- 13
shadowsocks-csharp/View/LogForm.cs View File

@@ -256,14 +256,14 @@ namespace Shadowsocks.View
}
topMostTriggerLock = true;
TopMost = TopMostMenuItem.Checked = TopMostCheckBox.Checked = topMostTrigger;
TopMost = TopMostToolStripMenuItem.Checked = TopMostCheckBox.Checked = topMostTrigger;
topMostTriggerLock = false;
wrapTextTriggerLock = true;
LogMessageTextBox.WordWrap = WrapTextMenuItem.Checked = WrapTextCheckBox.Checked = wrapTextTrigger;
LogMessageTextBox.WordWrap = WrapTextToolStripMenuItem.Checked = WrapTextCheckBox.Checked = wrapTextTrigger;
wrapTextTriggerLock = false;
ToolbarFlowLayoutPanel.Visible = ShowToolbarMenuItem.Checked = toolbarTrigger;
ToolbarFlowLayoutPanel.Visible = ShowToolbarToolStripMenuItem.Checked = toolbarTrigger;
}
private void LogForm_FormClosing(object sender, FormClosingEventArgs e)
@@ -288,14 +288,14 @@ namespace Shadowsocks.View
controller.SaveLogViewerConfig(config);
}
private void OpenLocationMenuItem_Click(object sender, EventArgs e)
private void OpenLocationToolStripMenuItem_Click(object sender, EventArgs e)
{
string argument = "/select, \"" + filename + "\"";
logger.Debug(argument);
System.Diagnostics.Process.Start("explorer.exe", argument);
}
private void ExitMenuItem_Click(object sender, EventArgs e)
private void ExitToolStripMenuItem_Click(object sender, EventArgs e)
{
Close();
}
@@ -317,7 +317,7 @@ namespace Shadowsocks.View
LogMessageTextBox.Clear();
}
private void ClearLogsMenuItem_Click(object sender, EventArgs e)
private void ClearLogsToolStripMenuItem_Click(object sender, EventArgs e)
{
DoClearLogs();
}
@@ -347,7 +347,7 @@ namespace Shadowsocks.View
}
}
private void ChangeFontMenuItem_Click(object sender, EventArgs e)
private void ChangeFontToolStripMenuItem_Click(object sender, EventArgs e)
{
DoChangeFont();
}
@@ -369,12 +369,12 @@ namespace Shadowsocks.View
wrapTextTrigger = !wrapTextTrigger;
LogMessageTextBox.WordWrap = wrapTextTrigger;
LogMessageTextBox.ScrollToCaret();
WrapTextMenuItem.Checked = WrapTextCheckBox.Checked = wrapTextTrigger;
WrapTextToolStripMenuItem.Checked = WrapTextCheckBox.Checked = wrapTextTrigger;
wrapTextTriggerLock = false;
}
private void WrapTextMenuItem_Click(object sender, EventArgs e)
private void WrapTextToolStripMenuItem_Click(object sender, EventArgs e)
{
if (!wrapTextTriggerLock)
{
@@ -401,7 +401,7 @@ namespace Shadowsocks.View
topMostTrigger = !topMostTrigger;
TopMost = topMostTrigger;
TopMostMenuItem.Checked = TopMostCheckBox.Checked = topMostTrigger;
TopMostToolStripMenuItem.Checked = TopMostCheckBox.Checked = topMostTrigger;
topMostTriggerLock = false;
}
@@ -414,7 +414,7 @@ namespace Shadowsocks.View
}
}
private void TopMostMenuItem_Click(object sender, EventArgs e)
private void TopMostToolStripMenuItem_Click(object sender, EventArgs e)
{
if (!topMostTriggerLock)
{
@@ -425,11 +425,11 @@ namespace Shadowsocks.View
private bool toolbarTrigger = false;
private void ShowToolbarMenuItem_Click(object sender, EventArgs e)
private void ShowToolbarToolStripMenuItem_Click(object sender, EventArgs e)
{
toolbarTrigger = !toolbarTrigger;
ToolbarFlowLayoutPanel.Visible = toolbarTrigger;
ShowToolbarMenuItem.Checked = toolbarTrigger;
ShowToolbarToolStripMenuItem.Checked = toolbarTrigger;
}
private class TrafficInfo


+ 91
- 89
shadowsocks-csharp/View/MenuViewController.cs View File

@@ -10,6 +10,7 @@ using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Windows.Media.Imaging;
using ZXing;
using ZXing.Common;
using ZXing.QrCode;
@@ -33,29 +34,29 @@ namespace Shadowsocks.View
private bool _isStartupChecking;
private string _urlToOpen;
private ContextMenu contextMenu1;
private MenuItem disableItem;
private MenuItem AutoStartupItem;
private MenuItem ShareOverLANItem;
private MenuItem SeperatorItem;
private MenuItem ConfigItem;
private MenuItem ServersItem;
private MenuItem globalModeItem;
private MenuItem PACModeItem;
private MenuItem localPACItem;
private MenuItem onlinePACItem;
private MenuItem editLocalPACItem;
private MenuItem updateFromGFWListItem;
private MenuItem editGFWUserRuleItem;
private MenuItem editOnlinePACItem;
private MenuItem secureLocalPacUrlToggleItem;
private MenuItem autoCheckUpdatesToggleItem;
private MenuItem checkPreReleaseToggleItem;
private MenuItem proxyItem;
private MenuItem hotKeyItem;
private MenuItem VerboseLoggingToggleItem;
private MenuItem ShowPluginOutputToggleItem;
private MenuItem WriteI18NFileItem;
private ContextMenuStrip contextMenu1;
private ToolStripMenuItem disableItem;
private ToolStripMenuItem AutoStartupItem;
private ToolStripMenuItem ShareOverLANItem;
private ToolStripMenuItem SeperatorItem;
private ToolStripMenuItem ConfigItem;
private ToolStripMenuItem ServersItem;
private ToolStripMenuItem globalModeItem;
private ToolStripMenuItem PACModeItem;
private ToolStripMenuItem localPACItem;
private ToolStripMenuItem onlinePACItem;
private ToolStripMenuItem editLocalPACItem;
private ToolStripMenuItem updateFromGFWListItem;
private ToolStripMenuItem editGFWUserRuleItem;
private ToolStripMenuItem editOnlinePACItem;
private ToolStripMenuItem secureLocalPacUrlToggleItem;
private ToolStripMenuItem autoCheckUpdatesToggleItem;
private ToolStripMenuItem checkPreReleaseToggleItem;
private ToolStripMenuItem proxyItem;
private ToolStripMenuItem hotKeyItem;
private ToolStripMenuItem VerboseLoggingToggleItem;
private ToolStripMenuItem ShowPluginOutputToggleItem;
private ToolStripMenuItem WriteI18NFileItem;
private ConfigForm configForm;
private ProxyForm proxyForm;
@@ -91,7 +92,7 @@ namespace Shadowsocks.View
_notifyIcon = new NotifyIcon();
UpdateTrayIconAndNotifyText();
_notifyIcon.Visible = true;
_notifyIcon.ContextMenu = contextMenu1;
_notifyIcon.ContextMenuStrip = contextMenu1;
_notifyIcon.BalloonTipClicked += notifyIcon1_BalloonTipClicked;
_notifyIcon.MouseClick += notifyIcon1_Click;
_notifyIcon.MouseDoubleClick += notifyIcon1_DoubleClick;
@@ -272,67 +273,68 @@ namespace Shadowsocks.View
#endregion
#region MenuItems and MenuGroups
#region ToolStripMenuItems and MenuGroups
private MenuItem CreateMenuItem(string text, EventHandler click)
private ToolStripMenuItem CreateToolStripMenuItem(string text, EventHandler click)
{
return new MenuItem(I18N.GetString(text), click);
return new ToolStripMenuItem(I18N.GetString(text),null, click);
}
private MenuItem CreateMenuGroup(string text, MenuItem[] items)
private ToolStripMenuItem CreateMenuGroup(string text, ToolStripMenuItem[] items)
{
return new MenuItem(I18N.GetString(text), items);
return new ToolStripMenuItem(I18N.GetString(text), null,items);
}
private void LoadMenu()
{
this.contextMenu1 = new ContextMenu(new MenuItem[] {
CreateMenuGroup("System Proxy", new MenuItem[] {
this.disableItem = CreateMenuItem("Disable", new EventHandler(this.EnableItem_Click)),
this.PACModeItem = CreateMenuItem("PAC", new EventHandler(this.PACModeItem_Click)),
this.globalModeItem = CreateMenuItem("Global", new EventHandler(this.GlobalModeItem_Click))
this.contextMenu1 = new ContextMenuStrip();
contextMenu1.Items.AddRange(new ToolStripItem[]{
CreateMenuGroup("System Proxy", new ToolStripMenuItem[] {
this.disableItem = CreateToolStripMenuItem("Disable", new EventHandler(this.EnableItem_Click)),
this.PACModeItem = CreateToolStripMenuItem("PAC", new EventHandler(this.PACModeItem_Click)),
this.globalModeItem = CreateToolStripMenuItem("Global", new EventHandler(this.GlobalModeItem_Click))
}),
this.ServersItem = CreateMenuGroup("Servers", new MenuItem[] {
this.SeperatorItem = new MenuItem("-"),
this.ConfigItem = CreateMenuItem("Edit Servers...", new EventHandler(this.Config_Click)),
CreateMenuItem("Statistics Config...", StatisticsConfigItem_Click),
new MenuItem("-"),
CreateMenuItem("Share Server Config...", new EventHandler(this.QRCodeItem_Click)),
CreateMenuItem("Scan QRCode from Screen...", new EventHandler(this.ScanQRCodeItem_Click)),
CreateMenuItem("Import URL from Clipboard...", new EventHandler(this.ImportURLItem_Click))
this.ServersItem = CreateMenuGroup("Servers", new ToolStripMenuItem[] {
this.SeperatorItem = new ToolStripMenuItem("-"),
this.ConfigItem = CreateToolStripMenuItem("Edit Servers...", new EventHandler(this.Config_Click)),
CreateToolStripMenuItem("Statistics Config...", StatisticsConfigItem_Click),
new ToolStripMenuItem("-"),
CreateToolStripMenuItem("Share Server Config...", new EventHandler(this.QRCodeItem_Click)),
CreateToolStripMenuItem("Scan QRCode from Screen...", new EventHandler(this.ScanQRCodeItem_Click)),
CreateToolStripMenuItem("Import URL from Clipboard...", new EventHandler(this.ImportURLItem_Click))
}),
CreateMenuGroup("PAC ", new MenuItem[] {
this.localPACItem = CreateMenuItem("Local PAC", new EventHandler(this.LocalPACItem_Click)),
this.onlinePACItem = CreateMenuItem("Online PAC", new EventHandler(this.OnlinePACItem_Click)),
new MenuItem("-"),
this.editLocalPACItem = CreateMenuItem("Edit Local PAC File...", new EventHandler(this.EditPACFileItem_Click)),
this.updateFromGFWListItem = CreateMenuItem("Update Local PAC from GFWList", new EventHandler(this.UpdatePACFromGFWListItem_Click)),
this.editGFWUserRuleItem = CreateMenuItem("Edit User Rule for GFWList...", new EventHandler(this.EditUserRuleFileForGFWListItem_Click)),
this.secureLocalPacUrlToggleItem = CreateMenuItem("Secure Local PAC", new EventHandler(this.SecureLocalPacUrlToggleItem_Click)),
CreateMenuItem("Copy Local PAC URL", new EventHandler(this.CopyLocalPacUrlItem_Click)),
this.editOnlinePACItem = CreateMenuItem("Edit Online PAC URL...", new EventHandler(this.UpdateOnlinePACURLItem_Click)),
CreateMenuGroup("PAC ", new ToolStripMenuItem[] {
this.localPACItem = CreateToolStripMenuItem("Local PAC", new EventHandler(this.LocalPACItem_Click)),
this.onlinePACItem = CreateToolStripMenuItem("Online PAC", new EventHandler(this.OnlinePACItem_Click)),
new ToolStripMenuItem("-"),
this.editLocalPACItem = CreateToolStripMenuItem("Edit Local PAC File...", new EventHandler(this.EditPACFileItem_Click)),
this.updateFromGFWListItem = CreateToolStripMenuItem("Update Local PAC from GFWList", new EventHandler(this.UpdatePACFromGFWListItem_Click)),
this.editGFWUserRuleItem = CreateToolStripMenuItem("Edit User Rule for GFWList...", new EventHandler(this.EditUserRuleFileForGFWListItem_Click)),
this.secureLocalPacUrlToggleItem = CreateToolStripMenuItem("Secure Local PAC", new EventHandler(this.SecureLocalPacUrlToggleItem_Click)),
CreateToolStripMenuItem("Copy Local PAC URL", new EventHandler(this.CopyLocalPacUrlItem_Click)),
this.editOnlinePACItem = CreateToolStripMenuItem("Edit Online PAC URL...", new EventHandler(this.UpdateOnlinePACURLItem_Click)),
}),
this.proxyItem = CreateMenuItem("Forward Proxy...", new EventHandler(this.proxyItem_Click)),
new MenuItem("-"),
this.AutoStartupItem = CreateMenuItem("Start on Boot", new EventHandler(this.AutoStartupItem_Click)),
this.ShareOverLANItem = CreateMenuItem("Allow other Devices to connect", new EventHandler(this.ShareOverLANItem_Click)),
new MenuItem("-"),
this.hotKeyItem = CreateMenuItem("Edit Hotkeys...", new EventHandler(this.hotKeyItem_Click)),
CreateMenuGroup("Help", new MenuItem[] {
CreateMenuItem("Show Logs...", new EventHandler(this.ShowLogItem_Click)),
this.VerboseLoggingToggleItem = CreateMenuItem( "Verbose Logging", new EventHandler(this.VerboseLoggingToggleItem_Click) ),
this.ShowPluginOutputToggleItem = CreateMenuItem("Show Plugin Output", new EventHandler(this.ShowPluginOutputToggleItem_Click)),
this.WriteI18NFileItem = CreateMenuItem("Write translation template",new EventHandler(WriteI18NFileItem_Click)),
CreateMenuGroup("Updates...", new MenuItem[] {
CreateMenuItem("Check for Updates...", new EventHandler(this.checkUpdatesItem_Click)),
new MenuItem("-"),
this.autoCheckUpdatesToggleItem = CreateMenuItem("Check for Updates at Startup", new EventHandler(this.autoCheckUpdatesToggleItem_Click)),
this.checkPreReleaseToggleItem = CreateMenuItem("Check Pre-release Version", new EventHandler(this.checkPreReleaseToggleItem_Click)),
this.proxyItem = CreateToolStripMenuItem("Forward Proxy...", new EventHandler(this.proxyItem_Click)),
new ToolStripMenuItem("-"),
this.AutoStartupItem = CreateToolStripMenuItem("Start on Boot", new EventHandler(this.AutoStartupItem_Click)),
this.ShareOverLANItem = CreateToolStripMenuItem("Allow other Devices to connect", new EventHandler(this.ShareOverLANItem_Click)),
new ToolStripMenuItem("-"),
this.hotKeyItem = CreateToolStripMenuItem("Edit Hotkeys...", new EventHandler(this.hotKeyItem_Click)),
CreateMenuGroup("Help", new ToolStripMenuItem[] {
CreateToolStripMenuItem("Show Logs...", new EventHandler(this.ShowLogItem_Click)),
this.VerboseLoggingToggleItem = CreateToolStripMenuItem( "Verbose Logging", new EventHandler(this.VerboseLoggingToggleItem_Click) ),
this.ShowPluginOutputToggleItem = CreateToolStripMenuItem("Show Plugin Output", new EventHandler(this.ShowPluginOutputToggleItem_Click)),
this.WriteI18NFileItem = CreateToolStripMenuItem("Write translation template",new EventHandler(WriteI18NFileItem_Click)),
CreateMenuGroup("Updates...", new ToolStripMenuItem[] {
CreateToolStripMenuItem("Check for Updates...", new EventHandler(this.checkUpdatesItem_Click)),
new ToolStripMenuItem("-"),
this.autoCheckUpdatesToggleItem = CreateToolStripMenuItem("Check for Updates at Startup", new EventHandler(this.autoCheckUpdatesToggleItem_Click)),
this.checkPreReleaseToggleItem = CreateToolStripMenuItem("Check Pre-release Version", new EventHandler(this.checkPreReleaseToggleItem_Click)),
}),
CreateMenuItem("About...", new EventHandler(this.AboutItem_Click)),
CreateToolStripMenuItem("About...", new EventHandler(this.AboutItem_Click)),
}),
new MenuItem("-"),
CreateMenuItem("Quit", new EventHandler(this.Quit_Click))
new ToolStripMenuItem("-"),
CreateToolStripMenuItem("Quit", new EventHandler(this.Quit_Click))
});
}
@@ -451,7 +453,7 @@ namespace Shadowsocks.View
private void UpdateServersMenu()
{
var items = ServersItem.MenuItems;
var items = ServersItem.DropDownItems;
while (items[0] != SeperatorItem)
{
items.RemoveAt(0);
@@ -459,15 +461,15 @@ namespace Shadowsocks.View
int strategyCount = 0;
foreach (var strategy in controller.GetStrategies())
{
MenuItem item = new MenuItem(strategy.Name);
ToolStripMenuItem item = new ToolStripMenuItem(strategy.Name);
item.Tag = strategy.ID;
item.Click += AStrategyItem_Click;
items.Add(strategyCount, item);
items.Add( item);
strategyCount++;
}
// user wants a seperator item between strategy and servers menugroup
items.Add(strategyCount++, new MenuItem("-"));
items.Add(new ToolStripMenuItem("-"));
int serverCount = 0;
Configuration configuration = controller.GetConfigurationCopy();
@@ -475,15 +477,15 @@ namespace Shadowsocks.View
{
if (Configuration.ChecksServer(server))
{
MenuItem item = new MenuItem(server.FriendlyName());
ToolStripMenuItem item = new ToolStripMenuItem(server.FriendlyName());
item.Tag = configuration.configs.FindIndex(s => s == server);
item.Click += AServerItem_Click;
items.Add(strategyCount + serverCount, item);
items.Add( item);
serverCount++;
}
}
foreach (MenuItem item in items)
foreach (ToolStripMenuItem item in items)
{
if (item.Tag != null && (item.Tag.ToString() == configuration.index.ToString() || item.Tag.ToString() == configuration.strategy))
{
@@ -694,13 +696,13 @@ namespace Shadowsocks.View
private void AServerItem_Click(object sender, EventArgs e)
{
MenuItem item = (MenuItem)sender;
ToolStripMenuItem item = (ToolStripMenuItem)sender;
controller.SelectServerIndex((int)item.Tag);
}
private void AStrategyItem_Click(object sender, EventArgs e)
{
MenuItem item = (MenuItem)sender;
ToolStripMenuItem item = (ToolStripMenuItem)sender;
controller.SelectStrategy((string)item.Tag);
}
@@ -765,7 +767,7 @@ namespace Shadowsocks.View
cropRect,
GraphicsUnit.Pixel);
}
var source = new BitmapLuminanceSource(target);
var source = new BitmapSourceLuminanceSource(null);
var bitmap = new BinaryBitmap(new HybridBinarizer(source));
QRCodeReader reader = new QRCodeReader();
var result = reader.decode(bitmap);
@@ -879,14 +881,14 @@ namespace Shadowsocks.View
private void UpdateOnlinePACURLItem_Click(object sender, EventArgs e)
{
string origPacUrl = controller.GetConfigurationCopy().pacUrl;
string pacUrl = Microsoft.VisualBasic.Interaction.InputBox(
I18N.GetString("Please input PAC Url"),
I18N.GetString("Edit Online PAC URL"),
origPacUrl, -1, -1);
if (!pacUrl.IsNullOrEmpty() && pacUrl != origPacUrl)
{
controller.SavePACUrl(pacUrl);
}
//string pacUrl = Microsoft.VisualBasic.Interaction.InputBox(
// I18N.GetString("Please input PAC Url"),
// I18N.GetString("Edit Online PAC URL"),
// origPacUrl, -1, -1);
//if (!pacUrl.IsNullOrEmpty() && pacUrl != origPacUrl)
//{
// controller.SavePACUrl(pacUrl);
//}
}
private void SecureLocalPacUrlToggleItem_Click(object sender, EventArgs e)


+ 1
- 15
shadowsocks-csharp/app.config View File

@@ -5,21 +5,7 @@
<section name="Shadowsocks.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false"/>
</sectionGroup>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/>
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-2.6.10.0" newVersion="2.6.10.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-2.6.10.0" newVersion="2.6.10.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
<userSettings>
<Shadowsocks.Properties.Settings>
<setting name="LogViewerWidth" serializeAs="String">


+ 0
- 11
shadowsocks-csharp/packages.config View File

@@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Caseless.Fody" version="1.8.3" targetFramework="net472" />
<package id="Costura.Fody" version="3.3.3" targetFramework="net472" />
<package id="Fody" version="4.2.1" targetFramework="net472" developmentDependency="true" />
<package id="GlobalHotKey" version="1.1.0" targetFramework="net472" />
<package id="Newtonsoft.Json" version="12.0.2" targetFramework="net472" />
<package id="NLog" version="4.6.8" targetFramework="net472" />
<package id="StringEx.CS" version="0.3.1" targetFramework="net472" developmentDependency="true" />
<package id="ZXing.Net" version="0.16.5" targetFramework="net472" />
</packages>

+ 89
- 321
shadowsocks-csharp/shadowsocks-csharp.csproj View File

@@ -1,340 +1,108 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\Costura.Fody.3.3.3\build\Costura.Fody.props" Condition="Exists('..\packages\Costura.Fody.3.3.3\build\Costura.Fody.props')" />
<Import Project="..\packages\Caseless.Fody.1.8.3\build\Caseless.Fody.props" Condition="Exists('..\packages\Caseless.Fody.1.8.3\build\Caseless.Fody.props')" />
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>9.0.21022</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<TargetFramework>netcoreapp3.1</TargetFramework>
<RootNamespace>Shadowsocks</RootNamespace>
<UseWindowsForms>true</UseWindowsForms>
<Authors>clowwindy &amp; community 2020</Authors>
<PackageId>Shadowsocks</PackageId>
<Product>Shadowsocks</Product>
<Version>4.1.9.2</Version>
<AssemblyName>Shadowsocks</AssemblyName>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<StartupObject>
</StartupObject>
<ApplicationIcon>shadowsocks.ico</ApplicationIcon>
<IsWebBootstrapper>false</IsWebBootstrapper>
<FileUpgradeFlags>
</FileUpgradeFlags>
<UpgradeBackupLocation>
</UpgradeBackupLocation>
<OldToolsVersion>3.5</OldToolsVersion>
<TargetFrameworkProfile>
</TargetFrameworkProfile>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
<PublishUrl>publish\</PublishUrl>
<Install>true</Install>
<InstallFrom>Disk</InstallFrom>
<UpdateEnabled>false</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>1</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>TRACE;DEBUG</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>ManagedMinimumRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>false</Prefer32Bit>
<Optimize>false</Optimize>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>ManagedMinimumRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>false</Prefer32Bit>
<DebugSymbols>true</DebugSymbols>
</PropertyGroup>
<PropertyGroup>
<ApplicationManifest>app.manifest</ApplicationManifest>
<ApplicationIcon />
<StartupObject />
</PropertyGroup>
<ItemGroup>
<Reference Include="Caseless, Version=1.8.3.0, Culture=neutral, PublicKeyToken=409b3227471b0f0d, processorArchitecture=MSIL">
<HintPath>..\packages\Caseless.Fody.1.8.3\lib\net452\Caseless.dll</HintPath>
</Reference>
<Reference Include="Costura, Version=3.3.3.0, Culture=neutral, PublicKeyToken=9919ef960d84173d, processorArchitecture=MSIL">
<HintPath>..\packages\Costura.Fody.3.3.3\lib\net40\Costura.dll</HintPath>
</Reference>
<Reference Include="GlobalHotKey, Version=1.1.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\GlobalHotKey.1.1.0\lib\GlobalHotKey.dll</HintPath>
</Reference>
<Reference Include="Microsoft.CSharp" />
<Reference Include="Microsoft.VisualBasic" />
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
<HintPath>..\packages\NLog.4.6.8\lib\net45\NLog.dll</HintPath>
</Reference>
<Reference Include="PresentationCore" />
<Reference Include="System" />
<Reference Include="System.Configuration" />
<Reference Include="System.Data" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Drawing" />
<Reference Include="System.IO.Compression" />
<Reference Include="System.Management" />
<Reference Include="System.Net" />
<Reference Include="System.Runtime.Serialization" />
<Reference Include="System.ServiceModel" />
<Reference Include="System.Transactions" />
<Reference Include="System.Web" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Windows.Forms.DataVisualization" />
<Reference Include="System.XML" />
<Reference Include="WindowsBase" />
<Reference Include="zxing, Version=0.16.5.0, Culture=neutral, PublicKeyToken=4e88037ac681fe60, processorArchitecture=MSIL">
<HintPath>..\packages\ZXing.Net.0.16.5\lib\net47\zxing.dll</HintPath>
</Reference>
<Reference Include="zxing.presentation, Version=0.16.5.0, Culture=neutral, PublicKeyToken=4e88037ac681fe60, processorArchitecture=MSIL">
<HintPath>..\packages\ZXing.Net.0.16.5\lib\net47\zxing.presentation.dll</HintPath>
<None Remove="app.config" />
<None Remove="app.manifest" />
<None Remove="Data\abp.js" />
<None Remove="Data\default-abp-rule.js" />
<None Remove="Data\i18n.csv" />
<None Remove="Data\libsscrypto.dll.gz" />
<None Remove="Data\NLog.config" />
<None Remove="Data\privoxy.exe.gz" />
<None Remove="Data\privoxy_conf.txt" />
<None Remove="Data\sysproxy.exe.gz" />
<None Remove="Data\sysproxy64.exe.gz" />
<None Remove="Data\user-rule.txt" />
<None Remove="Resources\ss128.pdn" />
<None Remove="Resources\ss32.pdn" />
<None Remove="Resources\ss32Fill.png" />
<None Remove="Resources\ss32In.png" />
<None Remove="Resources\ss32Out.png" />
<None Remove="Resources\ss32Outline.png" />
<None Remove="Resources\ssw128.png" />
<None Remove="shadowsocks.ico" />
</ItemGroup>
<ItemGroup>
<Content Include="app.manifest" />
<Content Include="app.config">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Caseless.Fody" Version="1.9.0" />
<PackageReference Include="Costura.Fody" Version="4.1.0" />
<PackageReference Include="Fody" Version="6.1.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="GlobalHotKeyCore" Version="1.2.0" />
<PackageReference Include="Microsoft.VisualBasic" Version="10.3.0" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
<PackageReference Include="NLog" Version="4.6.8" />
<PackageReference Include="StringEx.CS" Version="0.3.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="System.Management" Version="4.7.0" />
<PackageReference Include="ZXing.Net" Version="0.16.5" />
</ItemGroup>
<ItemGroup>
<Reference Include="System.Windows.Forms.DataVisualization">
<HintPath>C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Windows.Forms.DataVisualization.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Controller\HotkeyReg.cs" />
<Compile Include="Controller\LoggerExtension.cs" />
<Compile Include="Controller\Service\PACDaemon.cs" />
<Compile Include="Controller\System\Hotkeys\HotkeyCallbacks.cs" />
<Compile Include="Encryption\AEAD\AEADEncryptor.cs" />
<Compile Include="Encryption\AEAD\AEADMbedTLSEncryptor.cs" />
<Compile Include="Encryption\AEAD\AEADOpenSSLEncryptor.cs" />
<Compile Include="Encryption\AEAD\AEADSodiumEncryptor.cs" />
<Compile Include="Encryption\CircularBuffer\ByteCircularBuffer.cs" />
<Compile Include="Encryption\EncryptorBase.cs" />
<Compile Include="Encryption\EncryptorFactory.cs" />
<Compile Include="Encryption\Exception\CryptoException.cs" />
<Compile Include="Encryption\IEncryptor.cs" />
<Compile Include="Encryption\MbedTLS.cs" />
<Compile Include="Encryption\OpenSSL.cs" />
<Compile Include="Encryption\RNG.cs" />
<Compile Include="Encryption\Sodium.cs" />
<Compile Include="Encryption\Stream\StreamEncryptor.cs" />
<Compile Include="Encryption\Stream\StreamMbedTLSEncryptor.cs" />
<Compile Include="Encryption\Stream\StreamOpenSSLEncryptor.cs" />
<Compile Include="Encryption\Stream\StreamSodiumEncryptor.cs" />
<Compile Include="Model\HotKeyConfig.cs" />
<Compile Include="Model\NLogConfig.cs" />
<Compile Include="Model\ProxyConfig.cs" />
<Compile Include="Model\SysproxyConfig.cs" />
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<Resource Include="Data\abp.js" />
<Resource Include="Data\default-abp-rule.js" />
<Resource Include="Data\i18n.csv" />
<Resource Include="Data\libsscrypto.dll.gz" />
<Resource Include="Data\NLog.config" />
<Resource Include="Data\privoxy.exe.gz" />
<Resource Include="Data\privoxy_conf.txt" />
<Resource Include="Data\sysproxy.exe.gz" />
<Resource Include="Data\sysproxy64.exe.gz" />
<Resource Include="Data\user-rule.txt" />
<Resource Include="Resources\ss128.pdn" />
<Resource Include="Resources\ss32.pdn" />
<Resource Include="Resources\ss32Fill.png" />
<Resource Include="Resources\ss32In.png" />
<Resource Include="Resources\ss32Out.png" />
<Resource Include="Resources\ss32Outline.png" />
<Resource Include="Resources\ssw128.png" />
<Resource Include="shadowsocks.ico" />
</ItemGroup>
<ItemGroup>
<Compile Update="Properties\Settings.Designer.cs">
<DesignTimeSharedInput>True</DesignTimeSharedInput>
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
</Compile>
<Compile Include="Proxy\DirectConnect.cs" />
<Compile Include="Proxy\HttpProxy.cs" />
<Compile Include="Proxy\IProxy.cs" />
<Compile Include="Controller\Service\AvailabilityStatistics.cs" />
<Compile Include="Controller\Strategy\HighAvailabilityStrategy.cs" />
<Compile Include="Controller\Strategy\StatisticsStrategy.cs" />
<Compile Include="Controller\System\AutoStartup.cs" />
<Compile Include="Controller\FileManager.cs" />
<Compile Include="Controller\Service\GFWListUpdater.cs" />
<Compile Include="Controller\I18N.cs" />
<Compile Include="Controller\Service\Listener.cs" />
<Compile Include="Controller\Service\PortForwarder.cs" />
<Compile Include="Controller\Service\UDPRelay.cs" />
<Compile Include="Controller\Service\UpdateChecker.cs" />
<Compile Include="Controller\Service\PACServer.cs" />
<Compile Include="Model\LogViewerConfig.cs" />
<Compile Include="Model\Server.cs" />
<Compile Include="Model\Configuration.cs" />
<Compile Include="Model\StatisticsRecord.cs" />
<Compile Include="Model\StatisticsStrategyConfiguration.cs" />
<Compile Include="Controller\Strategy\BalancingStrategy.cs" />
<Compile Include="Controller\Strategy\StrategyManager.cs" />
<Compile Include="Controller\Strategy\IStrategy.cs" />
<Compile Include="Controller\Service\Sip003Plugin.cs" />
<Compile Include="Proxy\Socks5Proxy.cs" />
<Compile Include="Settings.cs" />
<Compile Include="Controller\System\Hotkeys\Hotkeys.cs" />
<Compile Include="StringEx.cs" />
<Compile Include="Util\ProcessManagement\Job.cs" />
<Compile Include="Util\ProcessManagement\ThreadUtil.cs" />
<Compile Include="Util\Sockets\LineReader.cs" />
<Compile Include="Util\Sockets\SocketUtil.cs" />
<Compile Include="Util\Sockets\WrappedSocket.cs" />
<Compile Include="Util\SystemProxy\ProxyException.cs" />
<Compile Include="Util\SystemProxy\Sysproxy.cs" />
<Compile Include="Util\Util.cs" />
<Compile Include="Util\ViewUtils.cs" />
<Compile Include="View\ConfigForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="View\ConfigForm.Designer.cs">
<DependentUpon>ConfigForm.cs</DependentUpon>
</Compile>
<Compile Include="Controller\Service\TCPRelay.cs" />
<Compile Include="Controller\Service\PrivoxyRunner.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Controller\ShadowsocksController.cs" />
<Compile Include="Controller\System\SystemProxy.cs" />
<Compile Include="View\CalculationControl.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="View\CalculationControl.Designer.cs">
<DependentUpon>CalculationControl.cs</DependentUpon>
</Compile>
<Compile Include="View\HotkeySettingsForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="View\HotkeySettingsForm.designer.cs">
<DependentUpon>HotkeySettingsForm.cs</DependentUpon>
</Compile>
<Compile Include="View\LogForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="View\LogForm.Designer.cs">
<DependentUpon>LogForm.cs</DependentUpon>
</Compile>
<Compile Include="View\MenuViewController.cs" />
<Compile Include="View\ProxyForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="View\ProxyForm.Designer.cs">
<DependentUpon>ProxyForm.cs</DependentUpon>
</Compile>
<Compile Include="View\QRCodeForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="View\QRCodeForm.Designer.cs">
<DependentUpon>QRCodeForm.cs</DependentUpon>
</Compile>
<Compile Include="View\QRCodeSplashForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="View\StatisticsStrategyConfigurationForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="View\StatisticsStrategyConfigurationForm.Designer.cs">
<DependentUpon>StatisticsStrategyConfigurationForm.cs</DependentUpon>
</Compile>
<EmbeddedResource Include="View\ConfigForm.resx">
<DependentUpon>ConfigForm.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<SubType>Designer</SubType>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<EmbeddedResource Include="View\CalculationControl.resx">
<DependentUpon>CalculationControl.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="View\HotkeySettingsForm.resx">
<DependentUpon>HotkeySettingsForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="View\LogForm.resx">
<DependentUpon>LogForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="View\ProxyForm.resx">
<DependentUpon>ProxyForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="View\QRCodeForm.resx">
<DependentUpon>QRCodeForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="View\StatisticsStrategyConfigurationForm.resx">
<DependentUpon>StatisticsStrategyConfigurationForm.cs</DependentUpon>
</EmbeddedResource>
<None Include="app.config" />
<None Include="app.manifest">
<SubType>Designer</SubType>
</None>
<None Include="Data\i18n.csv" />
<None Include="Data\libsscrypto.dll.gz" />
<None Include="Data\NLog.config" />
<None Include="Data\privoxy.exe.gz" />
</ItemGroup>
<ItemGroup>
<None Include="Data\sysproxy.exe.gz" />
<None Include="Data\sysproxy64.exe.gz" />
<None Include="packages.config" />
<None Include="Properties\DataSources\Shadowsocks.Model.StatisticsStrategyConfiguration.datasource" />
<None Include="Properties\Settings.settings">
<None Update="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<None Include="Resources\ssw128.png" />
<Content Include="Data\abp.js" />
<Content Include="Data\default-abp-rule.js" />
<Content Include="Data\privoxy_conf.txt" />
<Content Include="Data\user-rule.txt" />
<None Include="FodyWeavers.xml">
<SubType>Designer</SubType>
</None>
<Content Include="Resources\ss32Fill.png" />
<Content Include="Resources\ss32In.png" />
<Content Include="Resources\ss32Out.png" />
<Content Include="Resources\ss32Outline.png" />
<Content Include="shadowsocks.ico" />
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include="Microsoft.Net.Client.3.5">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
<Install>false</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
<Visible>False</Visible>
<ProductName>.NET Framework 3.0 %28x86%29</ProductName>
<Install>false</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5</ProductName>
<Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1</ProductName>
<Install>false</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
<Visible>False</Visible>
<ProductName>Windows Installer 3.1</ProductName>
<Install>true</Install>
</BootstrapperPackage>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="..\packages\Fody.4.2.1\build\Fody.targets" Condition="Exists('..\packages\Fody.4.2.1\build\Fody.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\Fody.4.2.1\build\Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Fody.4.2.1\build\Fody.targets'))" />
<Error Condition="!Exists('..\packages\Caseless.Fody.1.8.3\build\Caseless.Fody.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Caseless.Fody.1.8.3\build\Caseless.Fody.props'))" />
<Error Condition="!Exists('..\packages\Costura.Fody.3.3.3\build\Costura.Fody.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Costura.Fody.3.3.3\build\Costura.Fody.props'))" />
</Target>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

+ 9
- 8
shadowsocks-windows.sln View File

@@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.29709.97
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "shadowsocks-csharp", "shadowsocks-csharp\shadowsocks-csharp.csproj", "{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "shadowsocks-csharp", "shadowsocks-csharp\shadowsocks-csharp.csproj", "{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ShadowsocksTest", "test\ShadowsocksTest.csproj", "{45913187-0685-4903-B250-DCEF0479CD86}"
ProjectSection(ProjectDependencies) = postProject
@@ -18,13 +18,14 @@ Global
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Debug|Any CPU.ActiveCfg = Debug|x86
{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Debug|x86.ActiveCfg = Debug|x86
{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Debug|x86.Build.0 = Debug|x86
{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Debug|x86.Deploy.0 = Debug|x86
{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Release|Any CPU.ActiveCfg = Release|x86
{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Release|x86.ActiveCfg = Release|x86
{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Release|x86.Build.0 = Release|x86
{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Debug|x86.ActiveCfg = Debug|Any CPU
{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Debug|x86.Build.0 = Debug|Any CPU
{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Release|Any CPU.Build.0 = Release|Any CPU
{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Release|x86.ActiveCfg = Release|Any CPU
{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Release|x86.Build.0 = Release|Any CPU
{45913187-0685-4903-B250-DCEF0479CD86}.Debug|Any CPU.ActiveCfg = Debug|x86
{45913187-0685-4903-B250-DCEF0479CD86}.Debug|x86.ActiveCfg = Debug|x86
{45913187-0685-4903-B250-DCEF0479CD86}.Debug|x86.Build.0 = Debug|x86


Loading…
Cancel
Save